222
@ -5,8 +5,9 @@ import messages from './lang'
|
||||
|
||||
Vue.use(VueI18n)
|
||||
|
||||
const cookieLang = Cookies.get('language') || 'zh'
|
||||
const i18n = new VueI18n({
|
||||
locale: Cookies.get('language') || 'zh',
|
||||
locale: cookieLang === 'ko' ? 'zh' : cookieLang,
|
||||
messages
|
||||
})
|
||||
|
||||
|
||||
@ -1,13 +1,11 @@
|
||||
import zh from './zh'
|
||||
import en from './en'
|
||||
import ja from './ja'
|
||||
import ko from './ko'
|
||||
|
||||
const messages = {
|
||||
zh,
|
||||
en,
|
||||
ja,
|
||||
ko
|
||||
ja
|
||||
}
|
||||
|
||||
export default messages
|
||||
|
||||
@ -1,11 +0,0 @@
|
||||
export default {
|
||||
navbar: {
|
||||
language: '언어',
|
||||
switchLanguage: '언어 변경'
|
||||
},
|
||||
common: {
|
||||
confirm: '확인',
|
||||
cancel: '취소',
|
||||
close: '닫기'
|
||||
}
|
||||
}
|
||||
@ -37,9 +37,6 @@
|
||||
<el-dropdown-item @click.native="changeLanguage('ja')">
|
||||
<span :class="{ 'active-language': locale === 'ja' }">日本語</span>
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item @click.native="changeLanguage('ko')">
|
||||
<span :class="{ 'active-language': locale === 'ko' }">한국어</span>
|
||||
</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
|
||||
@ -99,8 +96,7 @@ export default {
|
||||
languageMap: {
|
||||
zh: '简体中文',
|
||||
en: 'English',
|
||||
ja: '日本語',
|
||||
ko: '한국어'
|
||||
ja: '日本語'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -105,8 +105,7 @@ export default {
|
||||
this.languageList = [
|
||||
{ langId: 1, langName: "简体中文", langCode: "zh_cn", status: "0", sortOrder: 1 },
|
||||
{ langId: 2, langName: "English", langCode: "en_us", status: "0", sortOrder: 2 },
|
||||
{ langId: 3, langName: "日本語", langCode: "ja_jp", status: "0", sortOrder: 3 },
|
||||
{ langId: 4, langName: "한국어", langCode: "ko_kr", status: "0", sortOrder: 4 }
|
||||
{ langId: 3, langName: "日本語", langCode: "ja_jp", status: "0", sortOrder: 3 }
|
||||
];
|
||||
this.loading = false;
|
||||
this.getI18nList();
|
||||
|
||||
@ -7,12 +7,16 @@
|
||||
:closable="false"
|
||||
show-icon
|
||||
class="mb12"
|
||||
title="此处设置官网「新闻动态」页面顶部通栏大图;保存后前台刷新页面即可生效。"
|
||||
title="下方第一项为「新闻动态」独立页顶通栏图;第二项为官网首页「华阳新闻」整屏区块背景。保存后前台强刷首页即可看到背景(接口为 no-store)。"
|
||||
/>
|
||||
<el-form label-width="120px">
|
||||
<el-form-item label="横幅图片">
|
||||
<el-form label-width="140px">
|
||||
<el-form-item label="新闻页横幅图">
|
||||
<image-upload v-model="form.backgroundImage" :limit="1" />
|
||||
<div class="field-tip">保存会同步更新首页顶部轮播第一张图</div>
|
||||
<div class="field-tip">与新闻动态页顶部通栏一致;保存时会同步更新首页顶部轮播第一张图</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="首页新闻区背景">
|
||||
<image-upload v-model="form.homeNewsBackgroundImage" :limit="1" />
|
||||
<div class="field-tip">仅影响首页「华阳新闻」所在整屏 slide 的 background(cover / center)</div>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="submit" v-hasPermi="['huayang:newsBanner:edit']">保存</el-button>
|
||||
@ -30,7 +34,8 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
form: {
|
||||
backgroundImage: ''
|
||||
backgroundImage: '',
|
||||
homeNewsBackgroundImage: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -38,7 +43,8 @@ export default {
|
||||
getNewsPageBanner().then((res) => {
|
||||
const d = res.data || {}
|
||||
this.form = {
|
||||
backgroundImage: d.backgroundImage || ''
|
||||
backgroundImage: d.backgroundImage || '',
|
||||
homeNewsBackgroundImage: d.homeNewsBackgroundImage || ''
|
||||
}
|
||||
})
|
||||
},
|
||||
@ -49,11 +55,14 @@ export default {
|
||||
},
|
||||
submit() {
|
||||
const bg = this.normalizeSingleImage(this.form.backgroundImage)
|
||||
const homeNewsBg = this.normalizeSingleImage(this.form.homeNewsBackgroundImage)
|
||||
updateNewsPageBanner({
|
||||
backgroundImage: bg
|
||||
backgroundImage: bg,
|
||||
homeNewsBackgroundImage: homeNewsBg
|
||||
}).then(() => {
|
||||
this.$modal.msgSuccess('保存成功')
|
||||
this.form.backgroundImage = bg
|
||||
this.form.homeNewsBackgroundImage = homeNewsBg
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package com.ruoyi.web.controller.site;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -78,6 +79,36 @@ public class SiteNewsController extends BaseController
|
||||
return success(news);
|
||||
}
|
||||
|
||||
/**
|
||||
* 对外公开:首页推荐新闻(与 /site/home/public 中 news 列表一致,供首页聚合接口失败时单独拉取)
|
||||
*/
|
||||
@Anonymous
|
||||
@GetMapping("/homeRecommend")
|
||||
public AjaxResult homeRecommend(@RequestParam(required = false) Integer limit)
|
||||
{
|
||||
if (limit == null || limit <= 0)
|
||||
{
|
||||
limit = 3;
|
||||
}
|
||||
if (limit > 20)
|
||||
{
|
||||
limit = 20;
|
||||
}
|
||||
HuayangNews query = new HuayangNews();
|
||||
query.setStatus("0");
|
||||
query.setIsHome("1");
|
||||
List<HuayangNews> list = newsService.selectHuayangNewsList(query);
|
||||
if (list == null)
|
||||
{
|
||||
list = List.of();
|
||||
}
|
||||
else if (list.size() > limit)
|
||||
{
|
||||
list = new ArrayList<>(list.subList(0, limit));
|
||||
}
|
||||
return success(list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 对外公开:获取最新新闻(用于首页展示)
|
||||
*/
|
||||
|
||||
@ -0,0 +1 @@
|
||||
restart.include.json=/com.alibaba.fastjson2.*.jar
|
||||
61
backend/ruoyi-admin/target/classes/application-druid.yml
Normal file
@ -0,0 +1,61 @@
|
||||
# 数据源配置
|
||||
spring:
|
||||
datasource:
|
||||
type: com.alibaba.druid.pool.DruidDataSource
|
||||
driverClassName: com.mysql.cj.jdbc.Driver
|
||||
druid:
|
||||
# 主库数据源
|
||||
master:
|
||||
url: jdbc:mysql://localhost:3306/hauyang?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||
username: root
|
||||
password: root
|
||||
# 从库数据源
|
||||
slave:
|
||||
# 从数据源开关/默认关闭
|
||||
enabled: false
|
||||
url:
|
||||
username:
|
||||
password:
|
||||
# 初始连接数
|
||||
initialSize: 5
|
||||
# 最小连接池数量
|
||||
minIdle: 10
|
||||
# 最大连接池数量
|
||||
maxActive: 20
|
||||
# 配置获取连接等待超时的时间
|
||||
maxWait: 60000
|
||||
# 配置连接超时时间
|
||||
connectTimeout: 30000
|
||||
# 配置网络超时时间
|
||||
socketTimeout: 60000
|
||||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
|
||||
timeBetweenEvictionRunsMillis: 60000
|
||||
# 配置一个连接在池中最小生存的时间,单位是毫秒
|
||||
minEvictableIdleTimeMillis: 300000
|
||||
# 配置一个连接在池中最大生存的时间,单位是毫秒
|
||||
maxEvictableIdleTimeMillis: 900000
|
||||
# 配置检测连接是否有效
|
||||
validationQuery: SELECT 1 FROM DUAL
|
||||
testWhileIdle: true
|
||||
testOnBorrow: false
|
||||
testOnReturn: false
|
||||
webStatFilter:
|
||||
enabled: true
|
||||
statViewServlet:
|
||||
enabled: true
|
||||
# 设置白名单,不填则允许所有访问
|
||||
allow:
|
||||
url-pattern: /druid/*
|
||||
# 控制台管理用户名和密码
|
||||
login-username: ruoyi
|
||||
login-password: 123456
|
||||
filter:
|
||||
stat:
|
||||
enabled: true
|
||||
# 慢SQL记录
|
||||
log-slow-sql: true
|
||||
slow-sql-millis: 1000
|
||||
merge-sql: true
|
||||
wall:
|
||||
config:
|
||||
multi-statement-allow: true
|
||||
147
backend/ruoyi-admin/target/classes/application.yml
Normal file
@ -0,0 +1,147 @@
|
||||
# 项目相关配置
|
||||
ruoyi:
|
||||
# 名称
|
||||
name: RuoYi
|
||||
# 版本
|
||||
version: 3.9.2
|
||||
# 版权年份
|
||||
copyrightYear: 2026
|
||||
# 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
|
||||
profile: D:/ruoyi/uploadPath
|
||||
# 获取ip地址开关
|
||||
addressEnabled: false
|
||||
# 验证码类型 math 数字计算 char 字符验证
|
||||
captchaType: math
|
||||
|
||||
# 开发环境配置
|
||||
server:
|
||||
# 服务器的HTTP端口,默认为8080
|
||||
port: 8080
|
||||
servlet:
|
||||
# 应用的访问路径
|
||||
context-path: /
|
||||
tomcat:
|
||||
# tomcat的URI编码
|
||||
uri-encoding: UTF-8
|
||||
# 连接数满后的排队数,默认为100
|
||||
accept-count: 1000
|
||||
threads:
|
||||
# tomcat最大线程数,默认为200
|
||||
max: 800
|
||||
# Tomcat启动初始化的线程数,默认值10
|
||||
min-spare: 100
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.ruoyi: debug
|
||||
org.springframework: warn
|
||||
|
||||
# 用户配置
|
||||
user:
|
||||
password:
|
||||
# 密码最大错误次数
|
||||
maxRetryCount: 5
|
||||
# 密码锁定时间(默认10分钟)
|
||||
lockTime: 10
|
||||
|
||||
# Spring配置
|
||||
spring:
|
||||
# 资源信息
|
||||
messages:
|
||||
# 国际化资源文件路径
|
||||
basename: i18n/messages
|
||||
profiles:
|
||||
active: druid
|
||||
# 文件上传
|
||||
servlet:
|
||||
multipart:
|
||||
# 单个文件大小
|
||||
max-file-size: 10MB
|
||||
# 设置总上传的文件大小
|
||||
max-request-size: 20MB
|
||||
jackson:
|
||||
time-zone: GMT+8
|
||||
date-format: yyyy-MM-dd HH:mm:ss
|
||||
# 服务模块
|
||||
devtools:
|
||||
restart:
|
||||
# 热部署开关
|
||||
enabled: true
|
||||
data:
|
||||
# redis 配置
|
||||
redis:
|
||||
# 地址
|
||||
host: localhost
|
||||
# 端口,默认为6379
|
||||
port: 6379
|
||||
# 数据库索引
|
||||
database: 0
|
||||
# 密码
|
||||
password:
|
||||
# 连接超时时间
|
||||
timeout: 10s
|
||||
lettuce:
|
||||
pool:
|
||||
# 连接池中的最小空闲连接
|
||||
min-idle: 0
|
||||
# 连接池中的最大空闲连接
|
||||
max-idle: 8
|
||||
# 连接池的最大数据库连接数
|
||||
max-active: 8
|
||||
# #连接池最大阻塞等待时间(使用负值表示没有限制)
|
||||
max-wait: -1ms
|
||||
|
||||
# token配置
|
||||
token:
|
||||
# 令牌自定义标识
|
||||
header: Authorization
|
||||
# 令牌密钥
|
||||
secret: abcdefghijklmnopqrstuvwxyz
|
||||
# 令牌有效期(默认30分钟)
|
||||
expireTime: 30
|
||||
|
||||
# MyBatis配置
|
||||
mybatis:
|
||||
# 搜索指定包别名
|
||||
typeAliasesPackage: com.ruoyi.**.domain
|
||||
# 配置mapper的扫描,找到所有的mapper.xml映射文件
|
||||
mapperLocations: classpath*:mapper/**/*Mapper.xml
|
||||
# 加载全局的配置文件
|
||||
configLocation: classpath:mybatis/mybatis-config.xml
|
||||
|
||||
# PageHelper分页插件
|
||||
pagehelper:
|
||||
helperDialect: mysql
|
||||
supportMethodsArguments: true
|
||||
params: count=countSql
|
||||
|
||||
# Springdoc配置
|
||||
springdoc:
|
||||
api-docs:
|
||||
path: /v3/api-docs
|
||||
swagger-ui:
|
||||
enabled: true
|
||||
path: /swagger-ui.html
|
||||
tags-sorter: alpha
|
||||
group-configs:
|
||||
- group: 'default'
|
||||
display-name: '测试模块'
|
||||
paths-to-match: '/**'
|
||||
packages-to-scan: com.ruoyi.web.controller.tool
|
||||
|
||||
# 防盗链配置
|
||||
referer:
|
||||
# 防盗链开关
|
||||
enabled: false
|
||||
# 允许的域名列表
|
||||
allowed-domains: localhost,127.0.0.1,ruoyi.vip,www.ruoyi.vip
|
||||
|
||||
# 防止XSS攻击
|
||||
xss:
|
||||
# 过滤开关
|
||||
enabled: true
|
||||
# 排除链接(多个用逗号分隔)
|
||||
excludes: /system/notice
|
||||
# 匹配链接
|
||||
urlPatterns: /system/*,/monitor/*,/tool/*
|
||||
24
backend/ruoyi-admin/target/classes/banner.txt
Normal file
@ -0,0 +1,24 @@
|
||||
Application Version: ${ruoyi.version}
|
||||
Spring Boot Version: ${spring-boot.version}
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// _ooOoo_ //
|
||||
// o8888888o //
|
||||
// 88" . "88 //
|
||||
// (| ^_^ |) //
|
||||
// O\ = /O //
|
||||
// ____/`---'\____ //
|
||||
// .' \\| |// `. //
|
||||
// / \\||| : |||// \ //
|
||||
// / _||||| -:- |||||- \ //
|
||||
// | | \\\ - /// | | //
|
||||
// | \_| ''\---/'' | | //
|
||||
// \ .-\__ `-` ___/-. / //
|
||||
// ___`. .' /--.--\ `. . ___ //
|
||||
// ."" '< `.___\_<|>_/___.' >'"". //
|
||||
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
|
||||
// \ \ `-. \_ __\ /__ _/ .-` / / //
|
||||
// ========`-.____`-.___\_____/___.-`____.-'======== //
|
||||
// `=---=' //
|
||||
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
|
||||
// 佛祖保佑 永不宕机 永无BUG //
|
||||
////////////////////////////////////////////////////////////////////
|
||||
38
backend/ruoyi-admin/target/classes/i18n/messages.properties
Normal file
@ -0,0 +1,38 @@
|
||||
#错误消息
|
||||
not.null=* 必须填写
|
||||
user.jcaptcha.error=验证码错误
|
||||
user.jcaptcha.expire=验证码已失效
|
||||
user.not.exists=用户不存在/密码错误
|
||||
user.password.not.match=用户不存在/密码错误
|
||||
user.password.retry.limit.count=密码输入错误{0}次
|
||||
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
|
||||
user.password.delete=对不起,您的账号已被删除
|
||||
user.blocked=用户已封禁,请联系管理员
|
||||
role.blocked=角色已封禁,请联系管理员
|
||||
login.blocked=很遗憾,访问IP已被列入系统黑名单
|
||||
user.logout.success=退出成功
|
||||
|
||||
length.not.valid=长度必须在{min}到{max}个字符之间
|
||||
|
||||
user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
|
||||
user.password.not.valid=* 5-50个字符
|
||||
|
||||
user.email.not.valid=邮箱格式错误
|
||||
user.mobile.phone.number.not.valid=手机号格式错误
|
||||
user.login.success=登录成功
|
||||
user.register.success=注册成功
|
||||
user.notfound=请重新登录
|
||||
user.forcelogout=管理员强制退出,请重新登录
|
||||
user.unknown.error=未知错误,请重新登录
|
||||
|
||||
##文件上传消息
|
||||
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
|
||||
upload.filename.exceed.length=上传的文件名最长{0}个字符
|
||||
|
||||
##权限
|
||||
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
|
||||
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
|
||||
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
|
||||
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
|
||||
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
|
||||
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
|
||||
93
backend/ruoyi-admin/target/classes/logback.xml
Normal file
@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!-- 日志存放路径 -->
|
||||
<property name="log.path" value="/home/ruoyi/logs" />
|
||||
<!-- 日志输出格式 -->
|
||||
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
|
||||
|
||||
<!-- 控制台输出 -->
|
||||
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- 系统日志输出 -->
|
||||
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/sys-info.log</file>
|
||||
<!-- 循环政策:基于时间创建日志文件 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 日志文件名格式 -->
|
||||
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<!-- 日志最大的历史 60天 -->
|
||||
<maxHistory>60</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<!-- 过滤的级别 -->
|
||||
<level>INFO</level>
|
||||
<!-- 匹配时的操作:接收(记录) -->
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/sys-error.log</file>
|
||||
<!-- 循环政策:基于时间创建日志文件 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 日志文件名格式 -->
|
||||
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<!-- 日志最大的历史 60天 -->
|
||||
<maxHistory>60</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<!-- 过滤的级别 -->
|
||||
<level>ERROR</level>
|
||||
<!-- 匹配时的操作:接收(记录) -->
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 用户访问日志输出 -->
|
||||
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/sys-user.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 按天回滚 daily -->
|
||||
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<!-- 日志最大的历史 60天 -->
|
||||
<maxHistory>60</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- 系统模块日志级别控制 -->
|
||||
<logger name="com.ruoyi" level="info" />
|
||||
<!-- Spring日志级别控制 -->
|
||||
<logger name="org.springframework" level="warn" />
|
||||
|
||||
<root level="info">
|
||||
<appender-ref ref="console" />
|
||||
</root>
|
||||
|
||||
<!--系统操作日志-->
|
||||
<root level="info">
|
||||
<appender-ref ref="file_info" />
|
||||
<appender-ref ref="file_error" />
|
||||
</root>
|
||||
|
||||
<!--系统用户操作日志-->
|
||||
<logger name="sys-user" level="info">
|
||||
<appender-ref ref="sys-user"/>
|
||||
</logger>
|
||||
</configuration>
|
||||
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE configuration
|
||||
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-config.dtd">
|
||||
<configuration>
|
||||
<!-- 全局参数 -->
|
||||
<settings>
|
||||
<!-- 使全局的映射器启用或禁用缓存 -->
|
||||
<setting name="cacheEnabled" value="true" />
|
||||
<!-- 允许JDBC 支持自动生成主键 -->
|
||||
<setting name="useGeneratedKeys" value="true" />
|
||||
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
|
||||
<setting name="defaultExecutorType" value="SIMPLE" />
|
||||
<!-- 指定 MyBatis 所用日志的具体实现 -->
|
||||
<setting name="logImpl" value="SLF4J" />
|
||||
<!-- 使用驼峰命名法转换字段 -->
|
||||
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
|
||||
</settings>
|
||||
|
||||
</configuration>
|
||||
BIN
backend/ruoyi-admin/target/classes/static/images/honor/brcgs.jpg
Normal file
|
After Width: | Height: | Size: 70 B |
BIN
backend/ruoyi-admin/target/classes/static/images/honor/haccp.jpg
Normal file
|
After Width: | Height: | Size: 70 B |
|
After Width: | Height: | Size: 70 B |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 224 KiB |
|
After Width: | Height: | Size: 224 KiB |
|
After Width: | Height: | Size: 537 KiB |
|
After Width: | Height: | Size: 537 KiB |
|
After Width: | Height: | Size: 537 KiB |
@ -0,0 +1,278 @@
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-anonymous-iconfont:before {
|
||||
content: "\e63b";
|
||||
}
|
||||
|
||||
.icon-globe:before {
|
||||
content: "\e74e";
|
||||
}
|
||||
|
||||
.icon-dabao:before {
|
||||
content: "\e8a6";
|
||||
}
|
||||
|
||||
.icon-weibo:before {
|
||||
content: "\e73c";
|
||||
}
|
||||
|
||||
.icon-jiantou:before {
|
||||
content: "\e73d";
|
||||
}
|
||||
|
||||
.icon-zhuanli:before {
|
||||
content: "\e71e";
|
||||
}
|
||||
|
||||
.icon-fuwu:before {
|
||||
content: "\e606";
|
||||
}
|
||||
|
||||
.icon-shenqing:before {
|
||||
content: "\e60a";
|
||||
}
|
||||
|
||||
.icon-anli:before {
|
||||
content: "\e830";
|
||||
}
|
||||
|
||||
.icon-sousuo:before {
|
||||
content: "\e60e";
|
||||
}
|
||||
|
||||
.icon-chanpin:before {
|
||||
content: "\e6cd";
|
||||
}
|
||||
|
||||
.icon-QQ:before {
|
||||
content: "\e66f";
|
||||
}
|
||||
|
||||
.icon-qingxi:before {
|
||||
content: "\e674";
|
||||
}
|
||||
|
||||
.icon-douyin:before {
|
||||
content: "\e656";
|
||||
}
|
||||
|
||||
.icon-beifen:before {
|
||||
content: "\e61a";
|
||||
}
|
||||
|
||||
.icon-dianhua:before {
|
||||
content: "\e6ac";
|
||||
}
|
||||
|
||||
.icon-weixin:before {
|
||||
content: "\e61b";
|
||||
}
|
||||
|
||||
.icon-dianhua1:before {
|
||||
content: "\e6b6";
|
||||
}
|
||||
|
||||
.icon-fangzi:before {
|
||||
content: "\e73e";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
a,a:hover,a:focus {text-decoration: none;}
|
||||
ul,li {margin: 0; padding: 0; list-style: none;}
|
||||
|
||||
.animationimg {position:relative;overflow:hidden;}
|
||||
.animationimg:before{ content: "";
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: #0559DB;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
transition: all .8s cubic-bezier(.77,0,.175,1);
|
||||
transition-timing-function: cubic-bezier(.77,0,.175,1);
|
||||
will-change: auto;
|
||||
z-index: 2;
|
||||
}
|
||||
.animationimg:after{ content: "";
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: #f8f8f8;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
transition: all .8s cubic-bezier(.77,0,.175,1);
|
||||
transition-timing-function: cubic-bezier(.77,0,.175,1);
|
||||
will-change: auto;
|
||||
transition-delay: 0.2s;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.animationimg.response-transition:before,.animationimg.response-transition:after{right:-100%;}
|
||||
|
||||
.app-main[data-v-0eb24b74] {width:100%; height:auto; padding:100px 0 0 100px; max-width:100%;overflow:visible;}
|
||||
.page-container {display:flex; flex-wrap:wrap;padding:100px;}
|
||||
.app-container .page-container{padding:20px 0;}
|
||||
.app-container[data-v-190e9f9e] {padding:100px;}
|
||||
.app-container[data-v-2427fea3]{padding:100px;}
|
||||
.app-container[data-v-5cb8dc2f]{padding:100px;}
|
||||
.app-container[data-v-7683765f]{padding:100px;}
|
||||
.sidebar[data-v-7f3da7f4]{padding:0;position: sticky;top: 120px;}
|
||||
.sidebar[data-v-7f3da7f4] .title[data-v-7f3da7f4]{background:#0559DB; color:#fff;padding:10px;font-family: "CaslonGraphiqueEF"; text-transform: capitalize;}
|
||||
.pagetitle[data-v-136c0774] {padding:10px 0;}
|
||||
.pagetitle[data-v-136c0774] span {font-family: "CaslonGraphiqueEF"; text-transform: capitalize;}
|
||||
.search[data-v-2febe0a6] {bottom:0;}
|
||||
div[data-v-190e9f9e] .app-container[data-v-190e9f9e]{padding:0 0 20px;}
|
||||
.order-title[data-v-190e9f9e] {margin:0; text-align:center;}
|
||||
.order-title .order-subtitle[data-v-190e9f9e] { font-family: "CaslonGraphiqueEF"; text-transform: capitalize; color:#0559DB;}
|
||||
.steps-wrapper[data-v-190e9f9e] {float:none;width:100%;}
|
||||
.el-textarea[data-v-190e9f9e] {width:100% !important;}
|
||||
|
||||
.el-card__body {padding:50px 20px; position:relative;overflow:hidden;}
|
||||
.address-item[data-v-190e9f9e] {padding:10px; border-radius:5px; margin:0;}
|
||||
.default-address-icon {margin:0; padding:4px 10px; border-radius:5px; height:auto;}
|
||||
.order-details[data-v-190e9f9e] {padding:20px;}
|
||||
.address-item .name[data-v-190e9f9e],.wrapper .el-radio {border-radius:5px;}
|
||||
.pl_toast span{width:100%;max-width:300px; padding:20px;}
|
||||
.order-details[data-v-190e9f9e] strong,strong.text-normal {font-family: "CaslonGraphiqueEF"; text-transform: capitalize;color:#333; }
|
||||
|
||||
.order-foot[data-v-190e9f9e] {padding:15px;background:#f8f8f8; border:1px #ddd solid; }
|
||||
|
||||
.address-container li .attrName[data-v-0b180e41] {width:200px;}
|
||||
.address-container li .default[data-v-0b180e41] {padding:3px 60px; background:#f93822; text-transform: capitalize; position:absolute; right:-65px; top:25px; transform:rotate(45deg);}
|
||||
.address-container li .reverseDiv[data-v-0b180e41] {display:flex; flex-wrap:wrap;padding:10px 0;}
|
||||
.address-container li .attrValue[data-v-0b180e41] {flex:1;}
|
||||
|
||||
.content[data-v-d98503f2] {width:100%; padding:20px; max-width:1000px;}
|
||||
.content[data-v-d98503f2] .item span[data-v-d98503f2] {width:auto;}
|
||||
.item > p[data-v-d98503f2] span[data-v-d98503f2]:first-child {width:100px;}
|
||||
/*购物车*/
|
||||
|
||||
.unvalide[data-v-7683765f] {background:none; position:absolute; left:50%; top:50%; transform:translate(0,-50%); z-index:4;padding:0;}
|
||||
.unvalide[data-v-7683765f] svg {fill:#f00; opacity:0.3;width:130px; height:auto;}
|
||||
.el-table .cell {overflow:visible;}
|
||||
.el-table th, .el-table tr {position:relative;}
|
||||
.el-table--enable-row-transition .el-table__body td {position:unset;}
|
||||
li.order[data-v-16816705] {padding-bottom:15px;}
|
||||
.order-id[data-v-16816705] {border:1px #ddd solid;}
|
||||
.item-card-title[data-v-16816705] {display:none;}
|
||||
.order-item[data-v-16816705]{display:flex;align-items: unset;}
|
||||
.order-item>div[data-v-16816705] {height:auto;flex: auto;
|
||||
border-bottom: none;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;}
|
||||
.order-item .goods-information[data-v-16816705]{display:flex;flex-wrap:wrap;}
|
||||
.order-item .goods-information[data-v-16816705]:last-child > div[data-v-16816705]{border-bottom:none;}
|
||||
.order-item .goods-information>div[data-v-16816705]:first-child {width:auto; flex:1;border-left:none;}
|
||||
.order-item .goods-information>div[data-v-16816705]{display:flex;height:auto;align-items:center; justify-content:center;}
|
||||
.order-item .goods-information .goods-title[data-v-16816705] {flex:1;}
|
||||
.order-item .goods-information .goods-img[data-v-16816705]{margin:0;padding:10px;}
|
||||
@media (max-width:798px) {
|
||||
.order-info[data-v-4ac65935],.el-collapse-item__header {flex-wrap:wrap;}
|
||||
.el-collapse-item__header {height:auto;}
|
||||
.text-blue[data-v-4ac65935]{flex:0 0 90% !important;text-align:left !important;}
|
||||
.pay-title[data-v-5cb8dc2f] {height:auto; line-height:1.6;}
|
||||
|
||||
.pay-title strong[data-v-5cb8dc2f] {display:block; margin:0 0 10px; padding-bottom:10px; border-bottom:1px #ddd solid;}
|
||||
.pay-title span[data-v-5cb8dc2f] {display:block; margin:0;}
|
||||
.el-card[data-v-5cb8dc2f]{margin:20px 0 !important;}
|
||||
.el-card[data-v-5cb8dc2f] .el-card__body{padding:20px;}
|
||||
.vchat-img[data-v-5cb8dc2f]{margin:0;}
|
||||
.vchat-img .code[data-v-5cb8dc2f] {width:100%;}
|
||||
.c-wrapper[data-v-5cb8dc2f] {width:100%;height:auto;}
|
||||
.c-wrapper[data-v-5cb8dc2f] img {width:100%;}
|
||||
.vchat-img .vchat-bg[data-v-5cb8dc2f] {width:100%;}
|
||||
|
||||
.vchat-img .guide[data-v-5cb8dc2f]{width:100%; margin:0; padding:20px;}
|
||||
.vchat-img .guide[data-v-5cb8dc2f] img {width:100%; height:auto;}
|
||||
|
||||
|
||||
.app-container[data-v-190e9f9e] {padding:50px 15px;}
|
||||
.app-container[data-v-2427fea3]{padding:50px 15px;}
|
||||
.app-container[data-v-5cb8dc2f]{padding:50px 15px;}
|
||||
.app-container[data-v-7683765f]{padding:50px 15px;}
|
||||
|
||||
.app-main[data-v-0eb24b74] {padding:100px 0 0;}
|
||||
.page-container {padding:20px;}
|
||||
.pagetitle[data-v-136c0774] {height:auto;}
|
||||
.slot[data-v-136c0774]{float:none; width:100%;}
|
||||
.search[data-v-2febe0a6] {width:100%;margin:0;}
|
||||
.leftMenu[data-v-ebcc9386] {width:100%; margin:0 0 20px;}
|
||||
.righCon[data-v-ebcc9386] {width:100%; padding:0 15px 15px;}
|
||||
|
||||
/*手机端我的资料*/
|
||||
.user[data-v-b7088b2a]{ background: linear-gradient(-45deg, #dedede, #f6f6f6); margin: 20px 0;border-radius: 5px;}
|
||||
.user[data-v-b7088b2a] > div[data-v-b7088b2a]{ display: flex;flex-direction: column-reverse;flex-wrap: wrap;}
|
||||
.user[data-v-b7088b2a] > div[data-v-b7088b2a] > p {width:100%;}
|
||||
.user[data-v-b7088b2a] > div[data-v-b7088b2a] > p:nth-child(1) {font-size:12px; color:#999;text-transform:uppercase;}
|
||||
.user[data-v-b7088b2a] > div[data-v-b7088b2a] > p:nth-child(2) {font-size:20px ; padding-bottom:10px; color:#1159DB;font-family: "CaslonGraphiqueEF";}
|
||||
.user[data-v-b7088b2a] > div[data-v-b7088b2a] > p:nth-child(2):before {content:"Hello, ";}
|
||||
.user[data-v-b7088b2a]:after {border-color:#fff;}
|
||||
.menu[data-v-b7088b2a] .van-cell--clickable, .order[data-v-b7088b2a] .van-cell--clickable { cursor: pointer;
|
||||
background: #1159DB;
|
||||
color: #fff;
|
||||
margin-bottom: 10px;
|
||||
border-radius: 5px; border:none !important;}
|
||||
.menu[data-v-b7088b2a] .van-cell__title, .order[data-v-b7088b2a] .van-cell__title{text-transform:capitalize;}
|
||||
.menu[data-v-b7088b2a] .van-cell__value, .order[data-v-b7088b2a] .van-cell__value{color:#fff;font-size: 12px; opacity: 0.5;}
|
||||
.menu[data-v-b7088b2a] .van-cell__right-icon, .order[data-v-b7088b2a] .van-cell__right-icon{color:#fff; opacity:0.3;}
|
||||
.van-cell:after {display:none;}
|
||||
.menu[data-v-b7088b2a], .order[data-v-b7088b2a] {box-shadow:none;}
|
||||
.order-link[data-v-b7088b2a]{flex-direction: row;justify-content: center;flex-wrap: wrap;margin: 0;padding: 0;align-items: unset; border:1px solid #ebedf0; border-radius:5px;}
|
||||
.link-item[data-v-b7088b2a] {flex:0 0 50%;padding:30px 15px;justify-content: center;flex-wrap:wrap;align-items: unset; border-right:1px solid #ebedf0;}
|
||||
.link-item[data-v-b7088b2a]:nth-child(2n) {border-right:none;}
|
||||
.van-badge[data-v-b7088b2a] {right:15px; top:20px;}
|
||||
.link-item p[data-v-b7088b2a] {text-align:center;margin:0;line-height:20px; font-size:14px;width:100%; color: #666; text-transform: capitalize;}
|
||||
|
||||
.search[data-v-1df2db2a] {margin:0; margin:15px;height:40px;}
|
||||
.van-tabs--line .van-tabs__wrap {}
|
||||
.van-tabs__nav--line.van-tabs__nav--complete {padding:0;}
|
||||
.van-tabs__wrap--scrollable .van-tab {padding:0 15px; border-top:1px #ddd solid; border-bottom:1px #ddd solid;}
|
||||
.van-tabs__wrap--scrollable .van-tab.van-tab--active {background:#1159DB; color:#fff; border-top:1px #1159DB solid; border-bottom:1px #1159DB solid;}
|
||||
.van-tabs__line{display:none;}
|
||||
|
||||
.van-pull-refresh {margin:0 !important; padding:15px 0;}
|
||||
.van-pull-refresh .orderNum[data-v-1df2db2a] {padding:10px;}
|
||||
.van-pull-refresh .orderNum[data-v-1df2db2a] p {margin:0; font-size:12px; text-transform: capitalize;}
|
||||
.van-pull-refresh .orderNum[data-v-1df2db2a] .van-cell__right-icon {color:#666;}
|
||||
|
||||
.van-pull-refresh ul.goods-list[data-v-1df2db2a]{padding:0px; }
|
||||
.van-pull-refresh ul.goods-list .goods-item[data-v-1df2db2a] {padding:10px;align-items: unset; border-bottom: 1px #eee solid;}
|
||||
.van-pull-refresh ul.goods-list .goods-item[data-v-1df2db2a] .cont-left[data-v-1df2db2a] {flex:1; padding-right:10px;}
|
||||
.van-pull-refresh ul.goods-list .goods-item[data-v-1df2db2a] .cont-right[data-v-1df2db2a] {width:auto;display:flex;flex-wrap:wrap;align-items:center;}
|
||||
.van-pull-refresh ul.goods-list .goods-item[data-v-1df2db2a] .cont-right[data-v-1df2db2a] p {margin:0; width:100%;}
|
||||
.van-pull-refresh ul.goods-list .goods-item[data-v-1df2db2a] .goods-img[data-v-1df2db2a] {margin:0; padding-right:5px;}
|
||||
.van-pull-refresh ul.goods-list .goods-item[data-v-1df2db2a] .goods-content[data-v-1df2db2a]{flex:1;}
|
||||
.van-pull-refresh ul.goods-list .goods-item[data-v-1df2db2a] .cont-left p[data-v-1df2db2a]{margin-bottom:5px; line-height:20px;font-size:13px;}
|
||||
.van-pull-refresh .operating[data-v-1df2db2a]{margin:0 !important;padding:10px;display:flex;justify-content:right;}
|
||||
.van-pull-refresh .operating[data-v-1df2db2a] button {border:1px #ddd solid; border-radius:20px; height:30px; padding:0 15px; line-height:28px;}
|
||||
.van-pull-refresh .operating[data-v-1df2db2a] button.btn-info {color:#666;}
|
||||
.van-pull-refresh .operating[data-v-1df2db2a] button.van-button--info.van-button--plain{border-color:#ddd;background:#fff; color:#666;}
|
||||
.van-pull-refresh .operating[data-v-1df2db2a] button.van-button--info{border-color:#f93822;background:#f93822; color:#fff;}
|
||||
|
||||
|
||||
.addressList[data-v-4bcb2d83] .title[data-v-4bcb2d83] {padding:20px 15px; line-height:20px; color:#666; font-size:13px; border-bottom:1px #eeee solid;}
|
||||
.addressList[data-v-4bcb2d83] .content[data-v-4bcb2d83] {padding:10px 10px 40px; margin:0;}
|
||||
.addressList[data-v-4bcb2d83] .content[data-v-4bcb2d83] .item[data-v-4bcb2d83] {border:1px #eee solid; border-radius:5px; box-shadow:0 0 15px rgb(0 0 0 / 10%); padding:15px; position:relative;overflow:hidden; margin:15px 0 0;}
|
||||
.addressList[data-v-4bcb2d83] .content[data-v-4bcb2d83] .item .isDefault[data-v-4bcb2d83] {position:absolute; right:0;top:0;padding: 0 5px; background: #f93822 !important; border-bottom-left-radius: 5px; text-transform: capitalize;}
|
||||
.addressList[data-v-4bcb2d83] .content[data-v-4bcb2d83] .item .info[data-v-4bcb2d83] {border-bottom:none;}
|
||||
.addressList[data-v-4bcb2d83] .content[data-v-4bcb2d83] .item .info[data-v-4bcb2d83] p {margin:0; padding: 10px 0; border-bottom: 1px #eee solid; line-height: 20px; font-size: 13px;}
|
||||
.addressList[data-v-4bcb2d83] .content[data-v-4bcb2d83] .item .btn-group[data-v-4bcb2d83] {margin:0; padding-top:15px;}
|
||||
|
||||
.addressList[data-v-4bcb2d83] .bottom-btn[data-v-4bcb2d83] {padding:10px;}
|
||||
.addressList[data-v-4bcb2d83] .bottom-btn[data-v-4bcb2d83] .addAddress {width:100%;height:40px;text-transform: capitalize; background: #065adb;border: 1px #065adb solid; border-radius: 30px;}
|
||||
}
|
||||
|
||||
@ -0,0 +1,524 @@
|
||||
! function (t) {
|
||||
if ("object" == typeof exports && "undefined" != typeof module) module.exports = t();
|
||||
else if ("function" == typeof define && define.amd) define([], t);
|
||||
else {
|
||||
("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).Parallax = t()
|
||||
}
|
||||
}(function () {
|
||||
return function t(e, i, n) {
|
||||
function o(r, a) {
|
||||
if (!i[r]) {
|
||||
if (!e[r]) {
|
||||
var l = "function" == typeof require && require;
|
||||
if (!a && l) return l(r, !0);
|
||||
if (s) return s(r, !0);
|
||||
var h = new Error("Cannot find module '" + r + "'");
|
||||
throw h.code = "MODULE_NOT_FOUND", h
|
||||
}
|
||||
var u = i[r] = {
|
||||
exports: {}
|
||||
};
|
||||
e[r][0].call(u.exports, function (t) {
|
||||
var i = e[r][1][t];
|
||||
return o(i || t)
|
||||
}, u, u.exports, t, e, i, n)
|
||||
}
|
||||
return i[r].exports
|
||||
}
|
||||
for (var s = "function" == typeof require && require, r = 0; r < n.length; r++) o(n[r]);
|
||||
return o
|
||||
}({
|
||||
1: [function (t, e, i) {
|
||||
"use strict";
|
||||
|
||||
function n(t) {
|
||||
if (null === t || void 0 === t) throw new TypeError("Object.assign cannot be called with null or undefined");
|
||||
return Object(t)
|
||||
}
|
||||
var o = Object.getOwnPropertySymbols,
|
||||
s = Object.prototype.hasOwnProperty,
|
||||
r = Object.prototype.propertyIsEnumerable;
|
||||
e.exports = function () {
|
||||
try {
|
||||
if (!Object.assign) return !1;
|
||||
var t = new String("abc");
|
||||
if (t[5] = "de", "5" === Object.getOwnPropertyNames(t)[0]) return !1;
|
||||
for (var e = {}, i = 0; i < 10; i++) e["_" + String.fromCharCode(i)] = i;
|
||||
if ("0123456789" !== Object.getOwnPropertyNames(e).map(function (t) {
|
||||
return e[t]
|
||||
}).join("")) return !1;
|
||||
var n = {};
|
||||
return "abcdefghijklmnopqrst".split("").forEach(function (t) {
|
||||
n[t] = t
|
||||
}), "abcdefghijklmnopqrst" === Object.keys(Object.assign({}, n)).join("")
|
||||
} catch (t) {
|
||||
return !1
|
||||
}
|
||||
}() ? Object.assign : function (t, e) {
|
||||
for (var i, a, l = n(t), h = 1; h < arguments.length; h++) {
|
||||
i = Object(arguments[h]);
|
||||
for (var u in i) s.call(i, u) && (l[u] = i[u]);
|
||||
if (o) {
|
||||
a = o(i);
|
||||
for (var c = 0; c < a.length; c++) r.call(i, a[c]) && (l[a[c]] = i[a[c]])
|
||||
}
|
||||
}
|
||||
return l
|
||||
}
|
||||
}, {}],
|
||||
2: [function (t, e, i) {
|
||||
(function (t) {
|
||||
(function () {
|
||||
var i, n, o, s, r, a;
|
||||
"undefined" != typeof performance && null !== performance && performance.now ? e.exports = function () {
|
||||
return performance.now()
|
||||
} : void 0 !== t && null !== t && t.hrtime ? (e.exports = function () {
|
||||
return (i() - r) / 1e6
|
||||
}, n = t.hrtime, s = (i = function () {
|
||||
var t;
|
||||
return 1e9 * (t = n())[0] + t[1]
|
||||
})(), a = 1e9 * t.uptime(), r = s - a) : Date.now ? (e.exports = function () {
|
||||
return Date.now() - o
|
||||
}, o = Date.now()) : (e.exports = function () {
|
||||
return (new Date).getTime() - o
|
||||
}, o = (new Date).getTime())
|
||||
}).call(this)
|
||||
}).call(this, t("_process"))
|
||||
}, {
|
||||
_process: 3
|
||||
}],
|
||||
3: [function (t, e, i) {
|
||||
function n() {
|
||||
throw new Error("setTimeout has not been defined")
|
||||
}
|
||||
|
||||
function o() {
|
||||
throw new Error("clearTimeout has not been defined")
|
||||
}
|
||||
|
||||
function s(t) {
|
||||
if (c === setTimeout) return setTimeout(t, 0);
|
||||
if ((c === n || !c) && setTimeout) return c = setTimeout, setTimeout(t, 0);
|
||||
try {
|
||||
return c(t, 0)
|
||||
} catch (e) {
|
||||
try {
|
||||
return c.call(null, t, 0)
|
||||
} catch (e) {
|
||||
return c.call(this, t, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function r(t) {
|
||||
if (d === clearTimeout) return clearTimeout(t);
|
||||
if ((d === o || !d) && clearTimeout) return d = clearTimeout, clearTimeout(t);
|
||||
try {
|
||||
return d(t)
|
||||
} catch (e) {
|
||||
try {
|
||||
return d.call(null, t)
|
||||
} catch (e) {
|
||||
return d.call(this, t)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function a() {
|
||||
v && p && (v = !1, p.length ? f = p.concat(f) : y = -1, f.length && l())
|
||||
}
|
||||
|
||||
function l() {
|
||||
if (!v) {
|
||||
var t = s(a);
|
||||
v = !0;
|
||||
for (var e = f.length; e;) {
|
||||
for (p = f, f = []; ++y < e;) p && p[y].run();
|
||||
y = -1, e = f.length
|
||||
}
|
||||
p = null, v = !1, r(t)
|
||||
}
|
||||
}
|
||||
|
||||
function h(t, e) {
|
||||
this.fun = t, this.array = e
|
||||
}
|
||||
|
||||
function u() {}
|
||||
var c, d, m = e.exports = {};
|
||||
! function () {
|
||||
try {
|
||||
c = "function" == typeof setTimeout ? setTimeout : n
|
||||
} catch (t) {
|
||||
c = n
|
||||
}
|
||||
try {
|
||||
d = "function" == typeof clearTimeout ? clearTimeout : o
|
||||
} catch (t) {
|
||||
d = o
|
||||
}
|
||||
}();
|
||||
var p, f = [],
|
||||
v = !1,
|
||||
y = -1;
|
||||
m.nextTick = function (t) {
|
||||
var e = new Array(arguments.length - 1);
|
||||
if (arguments.length > 1)
|
||||
for (var i = 1; i < arguments.length; i++) e[i - 1] = arguments[i];
|
||||
f.push(new h(t, e)), 1 !== f.length || v || s(l)
|
||||
}, h.prototype.run = function () {
|
||||
this.fun.apply(null, this.array)
|
||||
}, m.title = "browser", m.browser = !0, m.env = {}, m.argv = [], m.version = "", m.versions = {}, m.on = u, m.addListener = u, m.once = u, m.off = u, m.removeListener = u, m.removeAllListeners = u, m.emit = u, m.prependListener = u, m.prependOnceListener = u, m.listeners = function (t) {
|
||||
return []
|
||||
}, m.binding = function (t) {
|
||||
throw new Error("process.binding is not supported")
|
||||
}, m.cwd = function () {
|
||||
return "/"
|
||||
}, m.chdir = function (t) {
|
||||
throw new Error("process.chdir is not supported")
|
||||
}, m.umask = function () {
|
||||
return 0
|
||||
}
|
||||
}, {}],
|
||||
4: [function (t, e, i) {
|
||||
(function (i) {
|
||||
for (var n = t("performance-now"), o = "undefined" == typeof window ? i : window, s = ["moz", "webkit"], r = "AnimationFrame", a = o["request" + r], l = o["cancel" + r] || o["cancelRequest" + r], h = 0; !a && h < s.length; h++) a = o[s[h] + "Request" + r], l = o[s[h] + "Cancel" + r] || o[s[h] + "CancelRequest" + r];
|
||||
if (!a || !l) {
|
||||
var u = 0,
|
||||
c = 0,
|
||||
d = [];
|
||||
a = function (t) {
|
||||
if (0 === d.length) {
|
||||
var e = n(),
|
||||
i = Math.max(0, 1e3 / 60 - (e - u));
|
||||
u = i + e, setTimeout(function () {
|
||||
var t = d.slice(0);
|
||||
d.length = 0;
|
||||
for (var e = 0; e < t.length; e++)
|
||||
if (!t[e].cancelled) try {
|
||||
t[e].callback(u)
|
||||
} catch (t) {
|
||||
setTimeout(function () {
|
||||
throw t
|
||||
}, 0)
|
||||
}
|
||||
}, Math.round(i))
|
||||
}
|
||||
return d.push({
|
||||
handle: ++c,
|
||||
callback: t,
|
||||
cancelled: !1
|
||||
}), c
|
||||
}, l = function (t) {
|
||||
for (var e = 0; e < d.length; e++) d[e].handle === t && (d[e].cancelled = !0)
|
||||
}
|
||||
}
|
||||
e.exports = function (t) {
|
||||
return a.call(o, t)
|
||||
}, e.exports.cancel = function () {
|
||||
l.apply(o, arguments)
|
||||
}, e.exports.polyfill = function () {
|
||||
o.requestAnimationFrame = a, o.cancelAnimationFrame = l
|
||||
}
|
||||
}).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
|
||||
}, {
|
||||
"performance-now": 2
|
||||
}],
|
||||
5: [function (t, e, i) {
|
||||
"use strict";
|
||||
|
||||
function n(t, e) {
|
||||
if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function")
|
||||
}
|
||||
var o = function () {
|
||||
function t(t, e) {
|
||||
for (var i = 0; i < e.length; i++) {
|
||||
var n = e[i];
|
||||
n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(t, n.key, n)
|
||||
}
|
||||
}
|
||||
return function (e, i, n) {
|
||||
return i && t(e.prototype, i), n && t(e, n), e
|
||||
}
|
||||
}(),
|
||||
s = t("raf"),
|
||||
r = t("object-assign"),
|
||||
a = {
|
||||
propertyCache: {},
|
||||
vendors: [null, ["-webkit-", "webkit"], ["-moz-", "Moz"], ["-o-", "O"], ["-ms-", "ms"]],
|
||||
clamp: function (t, e, i) {
|
||||
return e < i ? t < e ? e : t > i ? i : t : t < i ? i : t > e ? e : t
|
||||
},
|
||||
data: function (t, e) {
|
||||
return a.deserialize(t.getAttribute("data-" + e))
|
||||
},
|
||||
deserialize: function (t) {
|
||||
return "true" === t || "false" !== t && ("null" === t ? null : !isNaN(parseFloat(t)) && isFinite(t) ? parseFloat(t) : t)
|
||||
},
|
||||
camelCase: function (t) {
|
||||
return t.replace(/-+(.)?/g, function (t, e) {
|
||||
return e ? e.toUpperCase() : ""
|
||||
})
|
||||
},
|
||||
accelerate: function (t) {
|
||||
a.css(t, "transform", "translate3d(0,0,0) rotate(0.0001deg)"), a.css(t, "transform-style", "preserve-3d"), a.css(t, "backface-visibility", "hidden")
|
||||
},
|
||||
transformSupport: function (t) {
|
||||
for (var e = document.createElement("div"), i = !1, n = null, o = !1, s = null, r = null, l = 0, h = a.vendors.length; l < h; l++)
|
||||
if (null !== a.vendors[l] ? (s = a.vendors[l][0] + "transform", r = a.vendors[l][1] + "Transform") : (s = "transform", r = "transform"), void 0 !== e.style[r]) {
|
||||
i = !0;
|
||||
break
|
||||
}
|
||||
switch (t) {
|
||||
case "2D":
|
||||
o = i;
|
||||
break;
|
||||
case "3D":
|
||||
if (i) {
|
||||
var u = document.body || document.createElement("body"),
|
||||
c = document.documentElement,
|
||||
d = c.style.overflow,
|
||||
m = !1;
|
||||
document.body || (m = !0, c.style.overflow = "hidden", c.appendChild(u), u.style.overflow = "hidden", u.style.background = ""), u.appendChild(e), e.style[r] = "translate3d(1px,1px,1px)", o = void 0 !== (n = window.getComputedStyle(e).getPropertyValue(s)) && n.length > 0 && "none" !== n, c.style.overflow = d, u.removeChild(e), m && (u.removeAttribute("style"), u.parentNode.removeChild(u))
|
||||
}
|
||||
}
|
||||
return o
|
||||
},
|
||||
css: function (t, e, i) {
|
||||
var n = a.propertyCache[e];
|
||||
if (!n)
|
||||
for (var o = 0, s = a.vendors.length; o < s; o++)
|
||||
if (n = null !== a.vendors[o] ? a.camelCase(a.vendors[o][1] + "-" + e) : e, void 0 !== t.style[n]) {
|
||||
a.propertyCache[e] = n;
|
||||
break
|
||||
}
|
||||
t.style[n] = i
|
||||
}
|
||||
},
|
||||
l = {
|
||||
relativeInput: !1,
|
||||
clipRelativeInput: !1,
|
||||
inputElement: null,
|
||||
hoverOnly: !1,
|
||||
calibrationThreshold: 100,
|
||||
calibrationDelay: 500,
|
||||
supportDelay: 500,
|
||||
calibrateX: !1,
|
||||
calibrateY: !0,
|
||||
invertX: !0,
|
||||
invertY: !0,
|
||||
limitX: !1,
|
||||
limitY: !1,
|
||||
scalarX: 10,
|
||||
scalarY: 10,
|
||||
frictionX: .1,
|
||||
frictionY: .1,
|
||||
originX: .5,
|
||||
originY: .5,
|
||||
pointerEvents: !1,
|
||||
precision: 1,
|
||||
onReady: null,
|
||||
selector: null
|
||||
},
|
||||
h = function () {
|
||||
function t(e, i) {
|
||||
n(this, t), this.element = e;
|
||||
var o = {
|
||||
calibrateX: a.data(this.element, "calibrate-x"),
|
||||
calibrateY: a.data(this.element, "calibrate-y"),
|
||||
invertX: a.data(this.element, "invert-x"),
|
||||
invertY: a.data(this.element, "invert-y"),
|
||||
limitX: a.data(this.element, "limit-x"),
|
||||
limitY: a.data(this.element, "limit-y"),
|
||||
scalarX: a.data(this.element, "scalar-x"),
|
||||
scalarY: a.data(this.element, "scalar-y"),
|
||||
frictionX: a.data(this.element, "friction-x"),
|
||||
frictionY: a.data(this.element, "friction-y"),
|
||||
originX: a.data(this.element, "origin-x"),
|
||||
originY: a.data(this.element, "origin-y"),
|
||||
pointerEvents: a.data(this.element, "pointer-events"),
|
||||
precision: a.data(this.element, "precision"),
|
||||
relativeInput: a.data(this.element, "relative-input"),
|
||||
clipRelativeInput: a.data(this.element, "clip-relative-input"),
|
||||
hoverOnly: a.data(this.element, "hover-only"),
|
||||
inputElement: document.querySelector(a.data(this.element, "input-element")),
|
||||
selector: a.data(this.element, "selector")
|
||||
};
|
||||
for (var s in o) null === o[s] && delete o[s];
|
||||
r(this, l, o, i), this.inputElement || (this.inputElement = this.element), this.calibrationTimer = null, this.calibrationFlag = !0, this.enabled = !1, this.depthsX = [], this.depthsY = [], this.raf = null, this.bounds = null, this.elementPositionX = 0, this.elementPositionY = 0, this.elementWidth = 0, this.elementHeight = 0, this.elementCenterX = 0, this.elementCenterY = 0, this.elementRangeX = 0, this.elementRangeY = 0, this.calibrationX = 0, this.calibrationY = 0, this.inputX = 0, this.inputY = 0, this.motionX = 0, this.motionY = 0, this.velocityX = 0, this.velocityY = 0, this.onMouseMove = this.onMouseMove.bind(this), this.onDeviceOrientation = this.onDeviceOrientation.bind(this), this.onDeviceMotion = this.onDeviceMotion.bind(this), this.onOrientationTimer = this.onOrientationTimer.bind(this), this.onMotionTimer = this.onMotionTimer.bind(this), this.onCalibrationTimer = this.onCalibrationTimer.bind(this), this.onAnimationFrame = this.onAnimationFrame.bind(this), this.onWindowResize = this.onWindowResize.bind(this), this.windowWidth = null, this.windowHeight = null, this.windowCenterX = null, this.windowCenterY = null, this.windowRadiusX = null, this.windowRadiusY = null, this.portrait = !1, this.desktop = !navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|BB10|mobi|tablet|opera mini|nexus 7)/i), this.motionSupport = !!window.DeviceMotionEvent && !this.desktop, this.orientationSupport = !!window.DeviceOrientationEvent && !this.desktop, this.orientationStatus = 0, this.motionStatus = 0, this.initialise()
|
||||
}
|
||||
return o(t, [{
|
||||
key: "initialise",
|
||||
value: function () {
|
||||
void 0 === this.transform2DSupport && (this.transform2DSupport = a.transformSupport("2D"), this.transform3DSupport = a.transformSupport("3D")), this.transform3DSupport && a.accelerate(this.element), "static" === window.getComputedStyle(this.element).getPropertyValue("position") && (this.element.style.position = "relative"), this.pointerEvents || (this.element.style.pointerEvents = "none"), this.updateLayers(), this.updateDimensions(), this.enable(), this.queueCalibration(this.calibrationDelay)
|
||||
}
|
||||
}, {
|
||||
key: "doReadyCallback",
|
||||
value: function () {
|
||||
this.onReady && this.onReady()
|
||||
}
|
||||
}, {
|
||||
key: "updateLayers",
|
||||
value: function () {
|
||||
this.selector ? this.layers = this.element.querySelectorAll(this.selector) : this.layers = this.element.children, this.layers.length || console.warn("ParallaxJS: Your scene does not have any layers."), this.depthsX = [], this.depthsY = [];
|
||||
for (var t = 0; t < this.layers.length; t++) {
|
||||
var e = this.layers[t];
|
||||
this.transform3DSupport && a.accelerate(e), e.style.position = t ? "absolute" : "relative", e.style.display = "block", e.style.left = 0, e.style.top = 0;
|
||||
var i = a.data(e, "depth") || 0;
|
||||
this.depthsX.push(a.data(e, "depth-x") || i), this.depthsY.push(a.data(e, "depth-y") || i)
|
||||
}
|
||||
}
|
||||
}, {
|
||||
key: "updateDimensions",
|
||||
value: function () {
|
||||
this.windowWidth = window.innerWidth, this.windowHeight = window.innerHeight, this.windowCenterX = this.windowWidth * this.originX, this.windowCenterY = this.windowHeight * this.originY, this.windowRadiusX = Math.max(this.windowCenterX, this.windowWidth - this.windowCenterX), this.windowRadiusY = Math.max(this.windowCenterY, this.windowHeight - this.windowCenterY)
|
||||
}
|
||||
}, {
|
||||
key: "updateBounds",
|
||||
value: function () {
|
||||
this.bounds = this.inputElement.getBoundingClientRect(), this.elementPositionX = this.bounds.left, this.elementPositionY = this.bounds.top, this.elementWidth = this.bounds.width, this.elementHeight = this.bounds.height, this.elementCenterX = this.elementWidth * this.originX, this.elementCenterY = this.elementHeight * this.originY, this.elementRangeX = Math.max(this.elementCenterX, this.elementWidth - this.elementCenterX), this.elementRangeY = Math.max(this.elementCenterY, this.elementHeight - this.elementCenterY)
|
||||
}
|
||||
}, {
|
||||
key: "queueCalibration",
|
||||
value: function (t) {
|
||||
clearTimeout(this.calibrationTimer), this.calibrationTimer = setTimeout(this.onCalibrationTimer, t)
|
||||
}
|
||||
}, {
|
||||
key: "enable",
|
||||
value: function () {
|
||||
this.enabled || (this.enabled = !0, this.orientationSupport ? (this.portrait = !1, window.addEventListener("deviceorientation", this.onDeviceOrientation), this.detectionTimer = setTimeout(this.onOrientationTimer, this.supportDelay)) : this.motionSupport ? (this.portrait = !1, window.addEventListener("devicemotion", this.onDeviceMotion), this.detectionTimer = setTimeout(this.onMotionTimer, this.supportDelay)) : (this.calibrationX = 0, this.calibrationY = 0, this.portrait = !1, window.addEventListener("mousemove", this.onMouseMove), this.doReadyCallback()), window.addEventListener("resize", this.onWindowResize), this.raf = s(this.onAnimationFrame))
|
||||
}
|
||||
}, {
|
||||
key: "disable",
|
||||
value: function () {
|
||||
this.enabled && (this.enabled = !1, this.orientationSupport ? window.removeEventListener("deviceorientation", this.onDeviceOrientation) : this.motionSupport ? window.removeEventListener("devicemotion", this.onDeviceMotion) : window.removeEventListener("mousemove", this.onMouseMove), window.removeEventListener("resize", this.onWindowResize), s.cancel(this.raf))
|
||||
}
|
||||
}, {
|
||||
key: "calibrate",
|
||||
value: function (t, e) {
|
||||
this.calibrateX = void 0 === t ? this.calibrateX : t, this.calibrateY = void 0 === e ? this.calibrateY : e
|
||||
}
|
||||
}, {
|
||||
key: "invert",
|
||||
value: function (t, e) {
|
||||
this.invertX = void 0 === t ? this.invertX : t, this.invertY = void 0 === e ? this.invertY : e
|
||||
}
|
||||
}, {
|
||||
key: "friction",
|
||||
value: function (t, e) {
|
||||
this.frictionX = void 0 === t ? this.frictionX : t, this.frictionY = void 0 === e ? this.frictionY : e
|
||||
}
|
||||
}, {
|
||||
key: "scalar",
|
||||
value: function (t, e) {
|
||||
this.scalarX = void 0 === t ? this.scalarX : t, this.scalarY = void 0 === e ? this.scalarY : e
|
||||
}
|
||||
}, {
|
||||
key: "limit",
|
||||
value: function (t, e) {
|
||||
this.limitX = void 0 === t ? this.limitX : t, this.limitY = void 0 === e ? this.limitY : e
|
||||
}
|
||||
}, {
|
||||
key: "origin",
|
||||
value: function (t, e) {
|
||||
this.originX = void 0 === t ? this.originX : t, this.originY = void 0 === e ? this.originY : e
|
||||
}
|
||||
}, {
|
||||
key: "setInputElement",
|
||||
value: function (t) {
|
||||
this.inputElement = t, this.updateDimensions()
|
||||
}
|
||||
}, {
|
||||
key: "setPosition",
|
||||
value: function (t, e, i) {
|
||||
e = e.toFixed(this.precision) + "px", i = i.toFixed(this.precision) + "px", this.transform3DSupport ? a.css(t, "transform", "translate3d(" + e + "," + i + ",0)") : this.transform2DSupport ? a.css(t, "transform", "translate(" + e + "," + i + ")") : (t.style.left = e, t.style.top = i)
|
||||
}
|
||||
}, {
|
||||
key: "onOrientationTimer",
|
||||
value: function () {
|
||||
this.orientationSupport && 0 === this.orientationStatus ? (this.disable(), this.orientationSupport = !1, this.enable()) : this.doReadyCallback()
|
||||
}
|
||||
}, {
|
||||
key: "onMotionTimer",
|
||||
value: function () {
|
||||
this.motionSupport && 0 === this.motionStatus ? (this.disable(), this.motionSupport = !1, this.enable()) : this.doReadyCallback()
|
||||
}
|
||||
}, {
|
||||
key: "onCalibrationTimer",
|
||||
value: function () {
|
||||
this.calibrationFlag = !0
|
||||
}
|
||||
}, {
|
||||
key: "onWindowResize",
|
||||
value: function () {
|
||||
this.updateDimensions()
|
||||
}
|
||||
}, {
|
||||
key: "onAnimationFrame",
|
||||
value: function () {
|
||||
this.updateBounds();
|
||||
var t = this.inputX - this.calibrationX,
|
||||
e = this.inputY - this.calibrationY;
|
||||
(Math.abs(t) > this.calibrationThreshold || Math.abs(e) > this.calibrationThreshold) && this.queueCalibration(0), this.portrait ? (this.motionX = this.calibrateX ? e : this.inputY, this.motionY = this.calibrateY ? t : this.inputX) : (this.motionX = this.calibrateX ? t : this.inputX, this.motionY = this.calibrateY ? e : this.inputY), this.motionX *= this.elementWidth * (this.scalarX / 100), this.motionY *= this.elementHeight * (this.scalarY / 100), isNaN(parseFloat(this.limitX)) || (this.motionX = a.clamp(this.motionX, -this.limitX, this.limitX)), isNaN(parseFloat(this.limitY)) || (this.motionY = a.clamp(this.motionY, -this.limitY, this.limitY)), this.velocityX += (this.motionX - this.velocityX) * this.frictionX, this.velocityY += (this.motionY - this.velocityY) * this.frictionY;
|
||||
for (var i = 0; i < this.layers.length; i++) {
|
||||
var n = this.layers[i],
|
||||
o = this.depthsX[i],
|
||||
r = this.depthsY[i],
|
||||
l = this.velocityX * (o * (this.invertX ? -1 : 1)),
|
||||
h = this.velocityY * (r * (this.invertY ? -1 : 1));
|
||||
this.setPosition(n, l, h)
|
||||
}
|
||||
this.raf = s(this.onAnimationFrame)
|
||||
}
|
||||
}, {
|
||||
key: "rotate",
|
||||
value: function (t, e) {
|
||||
var i = (t || 0) / 30,
|
||||
n = (e || 0) / 30,
|
||||
o = this.windowHeight > this.windowWidth;
|
||||
this.portrait !== o && (this.portrait = o, this.calibrationFlag = !0), this.calibrationFlag && (this.calibrationFlag = !1, this.calibrationX = i, this.calibrationY = n), this.inputX = i, this.inputY = n
|
||||
}
|
||||
}, {
|
||||
key: "onDeviceOrientation",
|
||||
value: function (t) {
|
||||
var e = t.beta,
|
||||
i = t.gamma;
|
||||
null !== e && null !== i && (this.orientationStatus = 1, this.rotate(e, i))
|
||||
}
|
||||
}, {
|
||||
key: "onDeviceMotion",
|
||||
value: function (t) {
|
||||
var e = t.rotationRate.beta,
|
||||
i = t.rotationRate.gamma;
|
||||
null !== e && null !== i && (this.motionStatus = 1, this.rotate(e, i))
|
||||
}
|
||||
}, {
|
||||
key: "onMouseMove",
|
||||
value: function (t) {
|
||||
var e = t.clientX,
|
||||
i = t.clientY;
|
||||
if (this.hoverOnly && (e < this.elementPositionX || e > this.elementPositionX + this.elementWidth || i < this.elementPositionY || i > this.elementPositionY + this.elementHeight)) return this.inputX = 0, void(this.inputY = 0);
|
||||
this.relativeInput ? (this.clipRelativeInput && (e = Math.max(e, this.elementPositionX), e = Math.min(e, this.elementPositionX + this.elementWidth), i = Math.max(i, this.elementPositionY), i = Math.min(i, this.elementPositionY + this.elementHeight)), this.elementRangeX && this.elementRangeY && (this.inputX = (e - this.elementPositionX - this.elementCenterX) / this.elementRangeX, this.inputY = (i - this.elementPositionY - this.elementCenterY) / this.elementRangeY)) : this.windowRadiusX && this.windowRadiusY && (this.inputX = (e - this.windowCenterX) / this.windowRadiusX, this.inputY = (i - this.windowCenterY) / this.windowRadiusY)
|
||||
}
|
||||
}, {
|
||||
key: "destroy",
|
||||
value: function () {
|
||||
this.disable(), clearTimeout(this.calibrationTimer), clearTimeout(this.detectionTimer), this.element.removeAttribute("style");
|
||||
for (var t = 0; t < this.layers.length; t++) this.layers[t].removeAttribute("style");
|
||||
delete this.element, delete this.layers
|
||||
}
|
||||
}, {
|
||||
key: "version",
|
||||
value: function () {
|
||||
return "3.1.0"
|
||||
}
|
||||
}]), t
|
||||
}();
|
||||
e.exports = h
|
||||
}, {
|
||||
"object-assign": 1,
|
||||
raf: 4
|
||||
}]
|
||||
}, {}, [5])(5)
|
||||
});
|
||||
//# sourceMappingURL=parallax.min.js.map
|
||||
|
After Width: | Height: | Size: 635 KiB |
|
After Width: | Height: | Size: 588 KiB |
|
After Width: | Height: | Size: 17 KiB |