2aa603f3 by simon

基础框架 带vant-ui

0 parents
1 > 1%
2 last 2 versions
1 NODE_ENV = 'production'
2 VUE_APP_TITLE = 'production'
...\ No newline at end of file ...\ No newline at end of file
1 NODE_ENV = 'production'
2 VUE_APP_TITLE = 'fev'
...\ No newline at end of file ...\ No newline at end of file
1 module.exports = {
2 root: true,
3 env: {
4 node: true
5 },
6 'extends': [
7 'plugin:vue/essential',
8 // 'eslint:recommended'
9 ],
10 rules: {
11 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
12 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
13 "no-unused-vars": 'off'
14 },
15 parserOptions: {
16 parser: 'babel-eslint'
17 }
18 }
1 .DS_Store
2 node_modules
3 /dist
4 /fev
5
6 # local env files
7 .env.local
8 .env.*.local
9
10 # Log files
11 npm-debug.log*
12 yarn-debug.log*
13 yarn-error.log*
14
15 # Editor directories and files
16 .idea
17 .vscode
18 *.suo
19 *.ntvs*
20 *.njsproj
21 *.sln
22 *.sw?
1 # vue-cli3-framework
2
3 ## Project setup
4 ```
5 npm install
6 ```
7
8 ### Compiles and hot-reloads for development
9 ```
10 npm run serve
11 ```
12
13 ### Compiles and minifies for production
14 ```
15 npm run build
16 ```
17
18 ### Run your tests
19 ```
20 npm run test
21 ```
22
23 ### Lints and fixes files
24 ```
25 npm run lint
26 ```
27
28 ### Customize configuration
29 See [Configuration Reference](https://cli.vuejs.org/config/).
1 module.exports = {
2 presets: [
3 '@vue/app'
4 ],
5 plugins: [
6 ['import', {
7 libraryName: 'vant',
8 libraryDirectory: 'es',
9 style: true
10 }, 'vant']
11 ]
12 }
...\ No newline at end of file ...\ No newline at end of file
1 /**
2 * Created by pc on 2018/5/11.
3 * 需要的库为(co, ali-oss, glob)
4 * npm i co ali-oss glob --save
5 * ossConfig.json格式如下
6 {
7 "region": "oss-cn-shanghai", //OSS region
8 "accessKeyId": "XXXXXXXX", //OSS accessKeyId
9 "accessKeySecret": "XXXXXXXX", //OSS accessKeySecret
10 "bucket": "ogo", //OSS bucket
11 "localPath": "./dist/**", //本地需要上传的文件目录,(/**)为遍历根号后所有目录
12 "ossPath": "/mobile/", //oss线上文件目录(不能为根目录,避免误操作,最后加上'/')
13 "callbackUrl": "http://nodejs.org/dist/index.json" //预留请求服务器更新缓存的API
14 }
15 *
16 *
17 */
18
19 let co = require('co')
20 let OSS = require('ali-oss')
21 let glob = require('glob')
22 let http = require('http')
23 let Config = require('./ossConfig.json')
24
25 // 配置oss信息
26 let client = new OSS({
27 region: Config.region,
28 accessKeyId: Config.accessKeyId,
29 accessKeySecret: Config.accessKeySecret,
30 bucket: Config.bucket
31 })
32
33 // 删除线上目录
34 function deleteFiles() {
35 if (Config.ossPath !== '' && Config.ossPath !== '/') {
36 co(function* () {
37 let result = yield client.list({
38 prefix: Config.ossPath.slice(1, -1),
39 marker: Config.ossPath.slice(0, -1)
40 })
41 let index = 0
42 if (result.objects !== undefined) {
43 yield result.objects.map(i => {
44 co(function* () {
45 yield client.delete(i.name)
46 index += 1
47 if (index === result.objects.length) {
48 console.log(`全部删除成功~,总共${result.objects.length}个文件`)
49 uploadFiles()
50 }
51 })
52 })
53 } else {
54 uploadFiles()
55 }
56 }).catch(function (err) {
57 console.log(err)
58 })
59 } else {
60 console.error('上传失败,线上路径为根目录~')
61 }
62 }
63
64 function uploadFiles() {
65 // 遍历目录树之后上传
66 glob(Config.localPath, {
67 nodir: true
68 }, (er, files) => {
69 let index = 0
70 files.map(i => {
71 co(function* () {
72 let ossPath = Config.ossPath.substr(Config.ossPath.length - 1, 1) === '/' ? Config.ossPath.slice(0, -1) : Config.ossPath
73 yield client.put(ossPath + i.slice(6), i)
74 index += 1
75 if (index === files.length) {
76 consoleStr(files.length)
77 }
78 }).catch(function (err) {
79 console.error(err.params.object)
80 })
81 })
82 })
83 }
84
85 function consoleStr(length) {
86 console.log(`全部上传成功~,总共${length}个文件`)
87 // http.get(Config.callbackUrl, () => {
88 // console.log('更新缓存成功~')
89 // }).on('error', (e) => {
90 // console.error(`错误: ${e.message}`)
91 // })
92 }
93
94 // 清空目录后上传
95 // deleteFiles()
96
97 // 增量上传
98 uploadFiles()
...\ No newline at end of file ...\ No newline at end of file
1
2 {
3 "region": "oss-cn-shenzhen",
4 "accessKeyId": "LTAIhDZsL5yCN90c",
5 "accessKeySecret": "LIj3OEJ8cMCQeRlUVVznJpMek2dPD2",
6 "bucket": "kdcdn",
7 "localPath": "./dist/**",
8 "ossPath": "/app/rtdn/",
9 "callbackUrl": "http://nodejs.org/dist/index.json"
10 }
11
...\ No newline at end of file ...\ No newline at end of file
1 # chmod u+x git.sh
2 unset msg
3
4 read -p "请输入commit提交的描述: " msg
5
6 if [[ $msg == "" ]]; then
7 msg="默认提交"
8 fi
9 git add -A
10 git commit -m $msg
11 git push
12 git status
...\ No newline at end of file ...\ No newline at end of file
This diff could not be displayed because it is too large.
1 {
2 "name": "vue-cli3-vant-framework",
3 "version": "0.1.0",
4 "private": true,
5 "scripts": {
6 "serve": "vue-cli-service serve",
7 "dev": "vue-cli-service serve",
8 "build": "vue-cli-service build",
9 "fev": "vue-cli-service build --mode fev",
10 "lint": "vue-cli-service lint",
11 "oss": "node build/oss-released.js"
12 },
13 "dependencies": {
14 "ali-oss": "^6.1.1",
15 "amfe-flexible": "^2.2.1",
16 "axios": "^0.19.0",
17 "axios-mock-adapter": "^1.16.0",
18 "co": "^4.6.0",
19 "core-js": "^2.6.5",
20 "glob": "^7.1.4",
21 "mockjs": "^1.0.1-beta3",
22 "postcss-px2rem": "^0.3.0",
23 "postcss-pxtorem": "^4.0.1",
24 "vant": "^1.6.21",
25 "vue": "^2.6.10",
26 "vue-router": "^3.0.3",
27 "vuex": "^3.0.1"
28 },
29 "devDependencies": {
30 "@vue/cli-plugin-babel": "^3.8.0",
31 "@vue/cli-plugin-eslint": "^3.8.0",
32 "@vue/cli-service": "^3.8.0",
33 "babel-eslint": "^10.0.1",
34 "babel-plugin-import": "^1.12.0",
35 "eslint": "^5.16.0",
36 "eslint-plugin-vue": "^5.0.0",
37 "node-sass": "^4.12.0",
38 "sass-loader": "^7.1.0",
39 "vue-template-compiler": "^2.6.10"
40 }
41 }
1 const AutoPrefixer = require("autoprefixer");
2 const px2rem = require("postcss-px2rem");
3 module.exports = ({
4 file
5 }) => {
6 let remUnit;
7 // file.dirname是绝对地址,所以项目名,文件目录不能带 'vant'
8 if (file && file.dirname && file.dirname.indexOf("vant") > -1) {
9 remUnit = 37.5;
10 } else {
11 remUnit = 75;
12 }
13 return {
14 plugins: [px2rem({
15 remUnit: remUnit,
16 }), AutoPrefixer({
17 browsers: ["last 20 versions", "android >= 4.0"]
18 })]
19 };
20 };
No preview for this file type
1 <!DOCTYPE html>
2 <html lang="en">
3
4 <head>
5 <meta charset="utf-8">
6 <meta http-equiv="X-UA-Compatible" content="IE=edge">
7 <!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> -->
8 <meta name="viewport"
9 content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
10 <link rel="icon" href="<%= BASE_URL %>favicon.ico">
11 <title>vue-cli3-framework</title>
12 </head>
13
14 <body>
15 <noscript>
16 <strong>We're sorry but vue-cli3-framework doesn't work properly without JavaScript enabled. Please enable it to
17 continue.</strong>
18 </noscript>
19 <div id="app"></div>
20 <!-- built files will be auto injected -->
21 </body>
22
23 </html>
...\ No newline at end of file ...\ No newline at end of file
1 <template>
2 <div id="app">
3 <!-- <div id="nav">
4 <router-link to="/">Home</router-link> |
5 <router-link to="/about">About</router-link>
6 </div>-->
7 <router-view/>
8 </div>
9 </template>
10
11 <style lang="scss">
12 @import './styles/support.scss';
13
14 #app {
15 /* font-family: 'Avenir', Helvetica, Arial, sans-serif;
16 -webkit-font-smoothing: antialiased;
17 -moz-osx-font-smoothing: grayscale;
18 text-align: center;
19 color: #2c3e50;
20 margin-top: 60px; */
21 border: 0;
22 margin: 0;
23 padding: 0;
24 }
25
26 body,
27 div {
28 border: 0;
29 margin: 0;
30 padding: 0;
31 }
32
33 .app__width {
34 width: 750px;
35 }
36
37 .app__width {
38 width: 750px;
39 }
40
41 .app__inner {
42 margin: 20px;
43 }
44
45 .app__title {
46 font-size: $fontSize;
47 line-height: $fontSize + 4px;
48 font-weight: bold;
49 padding-bottom: 10px;
50 margin-bottom: 20px;
51 border-bottom: 0.5px solid #eeeeee;
52 }
53
54 .app__desc {
55 font-size: $fontSizeSmaller;
56 line-height: $fontSizeSmaller + 2px;
57 margin-bottom: 20px;
58 color: $colorGray;
59 }
60
61 .app__bgc {
62 position: fixed;
63 background-color: #ffffff;
64 width: 100%;
65 height: 100%;
66 }
67
68 .app__bg {
69 position: absolute;
70 width: 100%;
71 height: 100%;
72 }
73
74 .app__top-shadow {
75 position: fixed;
76 width: 750px;
77 height: 1px;
78 box-shadow: 0px 4px 0.9px 0.1px rgba(6, 0, 1, 0.07);
79 background-color: #ffffff;
80 }
81
82 .app__content {
83 position: relative;
84 }
85
86
87 </style>
1 module.exports = {
2 testListGet: '/xxx/xxx/list'
3 }
...\ No newline at end of file ...\ No newline at end of file
1 import axios from 'axios';
2 // import {
3 // Toast
4 // } from 'vant';
5
6 function Toast(msg) {
7 console.log("msg:", msg);
8 }
9
10 // axios的默认url
11 // axios.defaults.baseURL = ""
12
13 // 服务器地址
14 let base = "https://ow.go.qudone.com";
15 if (location.href.indexOf("//k.wxpai.cn") > 0) {
16 base = "https://api.k.wxpai.cn/bizproxy"
17 }
18 // let base = COM.baseUrl;
19
20 // 请求拦截器
21 // axios.interceptors.request.use(
22 // config => {
23 // // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
24 // // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
25 // const token = "token"; //这里写入token
26 // token && (config.headers.Authorization = token);
27 // return config;
28 // },
29 // error => {
30 // return Promise.error(error);
31 // })
32
33 // 响应拦截器
34 axios.interceptors.response.use(
35 response => {
36 if (response.status === 200) {
37 if (response.data.code === 200) {
38 return Promise.resolve(response);
39 } else {
40 Toast(response.data.bizMsg);
41 return Promise.reject(response);
42 }
43 } else {
44 return Promise.reject(response);
45 }
46 },
47 // 服务器状态码不是200的情况
48 error => {
49 if (error.response.status) {
50 switch (error.response.status) {
51 // 401: 未登录
52 // 未登录则跳转登录页面,并携带当前页面的路径
53 // 在登录成功后返回当前页面,这一步需要在登录页操作。
54 case 401:
55 router.replace({
56 path: '/login',
57 query: {
58 redirect: router.currentRoute.fullPath
59 }
60 });
61 break;
62 // 403 token过期
63 // 登录过期对用户进行提示
64 // 清除本地token和清空vuex中token对象
65 // 跳转登录页面
66 case 403:
67 Toast({
68 message: '登录过期,请重新登录',
69 duration: 1000,
70 forbidClick: true
71 });
72 // 清除token
73 localStorage.removeItem('token');
74 store.commit('loginSuccess', null);
75 // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
76 setTimeout(() => {
77 router.replace({
78 path: '/login',
79 query: {
80 redirect: router.currentRoute.fullPath
81 }
82 });
83 }, 1000);
84 break;
85 // 404请求不存在
86 case 404:
87 Toast({
88 message: '网络请求不存在',
89 duration: 1500,
90 forbidClick: true
91 });
92 break;
93 // 其他错误,直接抛出错误提示
94 default:
95 Toast({
96 message: error.response.data.message,
97 duration: 1500,
98 forbidClick: true
99 });
100 }
101 return Promise.reject(error.response);
102 }
103 }
104 );
105
106 //formDataHeaders设置
107 let formDataHeaders = {
108 headers: {
109 "Content-Type": "multipart/form-data"
110 }
111 }
112
113 /**
114 * 封装get方法
115 * @param {*} params
116 */
117 export const httpGet = params => {
118 let {
119 url,
120 data
121 } = params;
122 return axios.get(`${base}${url}`, {
123 params: data
124 }).then(res => res.data.content);
125 }
126
127 /**
128 * 封装post方法
129 * @param {*} params
130 */
131 export const httpPost = params => {
132 let {
133 url,
134 data
135 } = params;
136 return axios.post(`${base}${url}`, data).then(res => res.data.content);
137 }
138
139
140 /**
141 * 封装post方法
142 * @param {*} params
143 * data数据是 formdata格式
144 * 例如:
145 * this.file = file
146 let data = new FormData() //使用formData对象
147 data.append('path', '/pro/mzczcradmin/')
148 data.append('file', file.file)
149 */
150 export const formdata = params => {
151 let {
152 url,
153 data
154 } = params;
155 return axios.post(`${base}${url}`, data, formDataHeaders).then(res => res.data);
156 }
...\ No newline at end of file ...\ No newline at end of file
1 import * as api from './api';
2
3 export default api;
1 // @font-face {
2 // font-family: 'vivo-BoldExtended';
3 // src: url('./vivo-BoldExtended.ttf');
4 // font-weight: normal;
5 // font-style: normal;
6 // }
7 // @font-face {
8 // font-family: 'vivo-Regular';
9 // src: url('./vivo-Regular.ttf');
10 // font-weight: normal;
11 // font-style: normal;
12 // }
13 // @font-face {
14 // font-family: 'regular2';
15 // src: url('./regular2.otf');
16 // font-weight: normal;
17 // font-style: normal;
18 // }
...\ No newline at end of file ...\ No newline at end of file
1 <template>
2 <div class="bottom-tips" v-if="visb">
3 <div class="line"></div>
4 <div class="tips-wrap">
5 <div class="tips">{{innerText ? innerText :'我是有底线的'}}</div>
6 </div>
7 </div>
8 </template>
9
10 <script>
11 export default {
12 props: ['visb', 'innerText'],
13 data() {
14 return {
15 key: 'value'
16 }
17 },
18 created() {
19 console.log('visb:', this.visb)
20 }
21 }
22 </script>
23
24 <style lang="less" scoped>
25 /// 底线
26 .bottom-tips {
27 position: relative;
28 padding: 40px 0;
29 width: 100%;
30 text-align: center;
31 color: #666666;
32
33 .line {
34 border-bottom: dashed 1px #cccccc;
35 width: 80%;
36 position: absolute;
37 top: 50%;
38 left: 0;
39 right: 0;
40 margin: 0 auto;
41 }
42
43 .tips-wrap {
44 font-size: 28px;
45 display: flex;
46 justify-content: center;
47 .tips {
48 position: relative;
49 padding: 0 20px;
50 background-color: #ffffff;
51 }
52 }
53 }
54 </style>
1 <template>
2 <div class="empty-tips" v-if="visb">
3 <div class="tips">
4 <span class="iconfont iconempty"></span>
5 <div class="tips">{{innerText ? innerText :'这里空空如也~'}}</div>
6 </div>
7 </div>
8 </template>
9
10 <script>
11 export default {
12 props: ['visb', 'innerText'],
13 data() {
14 return {
15 key: 'value'
16 }
17 }
18 }
19 </script>
20
21 <style lang="scss" scoped>
22 .empty-tips {
23 box-sizing: border-box;
24 position: fixed;
25 text-align: center;
26 color: #666666;
27 font-size: 32px;
28 width: 100%;
29 height: 100%;
30 display: flex;
31 justify-content: center;
32 top: 35%;
33
34 .iconfont {
35 font-size: 100px;
36 }
37
38 .tips {
39 position: relative;
40 padding: 20px;
41 }
42 }
43 </style>
1 // 全局事件
2 module.exports = {
3 NAV_FILTER: '_nav_filter', // 导航菜单过滤,触发请求
4 TAB_SELECT: '_tab_select', // 选择tab ,主题 classify
5 EVT_SET_TAB_INDEX: '_evt_set_tab_index', // 选择tab ,主题 classify
6 EVT_TAB_INDEX_CHANGE: '_evt_tab_index_change', // 从navbar发至index 点击头部导航 index
7 }
8
...\ No newline at end of file ...\ No newline at end of file
1 import Vue from 'vue'
2 import App from './App.vue'
3 import router from './router'
4 import store from './store'
5
6 import Mock from './mock'
7 Mock.bootstrap();
8
9 import 'amfe-flexible/index.js'
10
11 Vue.config.productionTip = false
12
13 new Vue({
14 router,
15 store,
16 data: {
17 isInit: false,
18 },
19 render: h => h(App)
20 }).$mount('#app')
1 import Mock from 'mockjs';
2 const LoginUsers = [
3 {
4 id: 1,
5 username: 'admin',
6 password: 'admin',
7 avatar: 'https://raw.githubusercontent.com/taylorchen709/markdown-images/master/vueadmin/user.png',
8 name: '张某某'
9 }
10 ];
11
12 const Users = [];
13
14 for (let i = 0; i < 5; i++) {
15 Users.push(Mock.mock({
16 id: Mock.Random.guid(),
17 province: Mock.Random.province(),
18 city: Mock.Random.city(),
19 fieldName: Mock.Random.cname(),
20 address: Mock.mock('@county(true)'),
21 'age|18-60': 1,
22 birth: Mock.Random.date(),
23 sex: Mock.Random.integer(0, 1)
24 }));
25 }
26
27 export { LoginUsers, Users };
1 import mock from './mock';
2
3 export default mock;
1 import axios from 'axios';
2 import MockAdapter from 'axios-mock-adapter';
3 import {
4 LoginUsers,
5 Users
6 } from './data/user';
7 let _Users = Users;
8
9 export default {
10 /**
11 * mock bootstrap
12 */
13 bootstrap() {
14 return;
15 // 紧在dev环境下使用
16 if (process.env.NODE_ENV !== "development") {
17 return;
18 }
19 let mock = new MockAdapter(axios);
20
21 // mock success request
22 mock.onGet('/success').reply(200, {
23 msg: 'success'
24 });
25
26 // mock error request
27 mock.onGet('/error').reply(500, {
28 msg: 'failure'
29 });
30
31 // 拦截 get方法demo
32 mock.onGet('/path1/path2/getdemo').reply(config => {
33 // 拦截参数
34 let {
35 params1,
36 params2
37 } = config.params;
38 return new Promise((resolve, reject) => {
39 let content = {};
40 let success = true;
41 resolve([200, {
42 code: 2000,
43 msg: '请求成功',
44 success,
45 content
46 }]);
47 });
48 });
49
50 // 拦截post方法demo
51 mock.onPost('/path1/path2/postdemo').reply(config => {
52 let {
53 params1,
54 params2
55 } = JSON.parse(config.data);
56 return new Promise((resolve, reject) => {
57 let content = {};
58 let success = true;
59 resolve([200, {
60 code: 2000,
61 msg: '请求成功',
62 success,
63 content
64 }]);
65 });
66 });
67
68 }
69 };
1 <template>
2 <div class="about">
3 <div>This is an about page</div>
4 <van-button type="default">默认按钮</van-button>
5 <div class="ccc"></div>
6 </div>
7 </template>
8
9 <script>
10 import { Button } from 'vant'
11 export default {
12 name: 'about',
13 components: {
14 [Button.name]: Button
15 }
16 }
17 </script>
18
19 <style lang="scss" scoped>
20 .about{
21 font-size: 32px;
22 }
23 .ccc{
24 width: 746px;
25 height: 300px;
26 background-color: wheat;
27 }
28 </style>
29
1 <template>
2 <div class="home">home</div>
3 </template>
4
5 <script>
6 export default {
7 name: 'home'
8 }
9 </script>
10
11 <style lang="scss" scoped>
12 .home {
13 text-align: center;
14 }
15 </style>
1 import api from '../../api/api'
2 import {
3 httpGet,
4 httpPost
5 } from '../../api/fetch-api.js'
6
7 export default {
8 data() {
9 return {
10 key: 'value'
11 }
12 },
13 components: {},
14 methods: {
15 initData() {}
16 },
17 mounted() {},
18 created() {
19 console.log("demo created");
20 }
21 }
...\ No newline at end of file ...\ No newline at end of file
1 @import './../../styles/support';
1
2 <template>
3 <div class="page">
4 <div class="app__bgc bgc"></div>
5 <div class="app__bg bg"></div>
6 <div class="app__content main">
7 <div class="top-space"></div>
8 <div class="content">
9 <span class="iconfont iconclose">demo</span>
10 </div>
11 </div>
12 </div>
13 </template>
14
15 <script src="./index.js"></script>
16 <style lang="scss" scoped>
17 // @import './index.scss';
18 </style>
...\ No newline at end of file ...\ No newline at end of file
1 import Vue from 'vue'
2 import Router from 'vue-router'
3 import Home from './pages/Home.vue'
4
5 Vue.use(Router)
6
7 const routes = [{
8 path: '/',
9 name: 'home',
10 component: Home,
11 meta: {
12 title: '首页'
13 }
14 },
15 {
16 path: '/demo',
17 name: 'demo',
18 component: () => import('./pages/demo/index.vue'),
19 meta: {
20 title: '模板'
21 }
22 },
23 {
24 path: '/about',
25 name: 'about',
26 component: () => import('./pages/About.vue'),
27 meta: {
28 title: '关于'
29 }
30 }
31 ]
32
33 // add route path
34 routes.forEach(route => {
35 route.path = route.path || '/' + (route.name || '');
36 });
37
38 const router = new Router({
39 routes
40 });
41
42 router.beforeEach((to, from, next) => {
43 const title = to.meta && to.meta.title;
44 if (title) {
45 document.title = title;
46 }
47 next();
48 });
49
50 export default router;
...\ No newline at end of file ...\ No newline at end of file
1 import Vue from 'vue'
2 import Vuex from 'vuex'
3
4 Vue.use(Vuex)
5
6 export default new Vuex.Store({
7 state: {
8
9 },
10 mutations: {
11
12 },
13 actions: {
14
15 }
16 })
1 /* 图片字体 */
2 @font-face {
3 font-family: 'iconfont';
4 src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==')
5 format('woff2');
6 }
7
8 .iconfont {
9 font-family: 'iconfont' !important;
10 font-size: 16px;
11 font-style: normal;
12 -webkit-font-smoothing: antialiased;
13 -moz-osx-font-smoothing: grayscale;
14 }
15
16 .iconrefresh:before {
17 content: '\e874';
18 }
19
20 .iconempty:before {
21 content: '\e6a6';
22 }
23 .iconclose:before {
24 content: '\e849';
25 }
...\ No newline at end of file ...\ No newline at end of file
1 /**
2 * ------------------------------------------------------------------
3 * Sass Minxins
4 *
5 * 参考收集:
6 * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins
7 * ------------------------------------------------------------------
8 *
9 */
10
11 // 文字截取
12 @mixin text-overflow() {
13 overflow: hidden;
14 white-space: normal;
15 text-overflow: ellipsis;
16 word-break: break-all;
17 word-wrap: normal;
18 }
19
20 @mixin word-break() {
21 word-break: break-all;
22 word-wrap: break-word;
23 white-space: normal;
24 }
25
26 // No wrap
27 @mixin no-wrap() {
28 word-break: normal;
29 word-wrap: normal;
30 white-space: nowrap;
31 }
32
33 // 清除浮动
34 @mixin clearfix() {
35 &:before,
36 &:after {
37 content: " "; // 1
38 display: table; // 2
39 }
40 &:after {
41 clear: both;
42 }
43 }
44
45 // Single side border-radius
46 @mixin border-top-radius($radius) {
47 border-top-right-radius: $radius;
48 border-top-left-radius: $radius;
49 }
50
51 @mixin border-right-radius($radius) {
52 border-bottom-right-radius: $radius;
53 border-top-right-radius: $radius;
54 }
55
56 @mixin border-bottom-radius($radius) {
57 border-bottom-right-radius: $radius;
58 border-bottom-left-radius: $radius;
59 }
60
61 @mixin border-left-radius($radius) {
62 border-bottom-left-radius: $radius;
63 border-top-left-radius: $radius;
64 }
65
66 // Center-align a block level element
67 @mixin center-block() {
68 display: block;
69 margin-left: auto;
70 margin-right: auto;
71 }
72
73 // CSS image replacement
74 // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
75 @mixin hide-text() {
76 font-size: 0;
77 line-height: 0;
78 color: transparent;
79 text-shadow: none;
80 background-color: transparent;
81 border: 0;
82 }
1 /**
2 * ------------------------------------------------------------------
3 * 支持文件
4 * 需要引用的地方均需要加上这个支持文件
5 *
6 * ------------------------------------------------------------------
7 *
8 */
9
10 @import "mixins";
11
12 @import "var";
13
14 // 图标字体
15 @import "fonticon";
16
17 // 字体引入
18 @import './../assets/fonts/font.scss'
...\ No newline at end of file ...\ No newline at end of file
1 /**
2 * ------------------------------------------------------------------
3 * 原子类
4 *
5 * ------------------------------------------------------------------
6 *
7 */
8 @import "support";
9
10 // Margin
11 .u-mt-smaller {
12 margin-top: $marginTopSmaller;
13 }
14
15 .u-mt-small {
16 margin-top: $marginTopSmall;
17 }
18
19 .u-mt-medium {
20 margin-top: $marginTopMedium;
21 }
22
23 .u-mt-large {
24 margin-top: $marginTopLarge;
25 }
26
27 .u-mt-larger {
28 margin-top: $marginTopLarger;
29 }
30
31 .u-mb-smaller {
32 margin-bottom: $marginTopSmaller;
33 }
34
35 .u-mb-small {
36 margin-bottom: $marginTopSmall;
37 }
38
39 .u-mb-medium {
40 margin-bottom: $marginTopMedium;
41 }
42
43 .u-mb-large {
44 margin-bottom: $marginTopLarge;
45 }
46
47 .u-mb-larger {
48 margin-bottom: $marginTopLarger;
49 }
50
51 // Padding
52 .u-pt-smaller {
53 padding-top: $paddingTopSmaller;
54 }
55
56 .u-pt-small {
57 padding-top: $paddingTopSmall;
58 }
59
60 .u-pt-medium {
61 padding-top: $paddingTopMedium;
62 }
63
64 .u-pt-large {
65 padding-top: $paddingTopLarge;
66 }
67
68 .u-pt-larger {
69 padding-top: $paddingTopLarger;
70 }
71
72 .u-pb-smaller {
73 padding-bottom: $paddingTopSmaller;
74 }
75
76 .u-pb-small {
77 padding-bottom: $paddingTopSmall;
78 }
79
80 .u-pb-medium {
81 padding-bottom: $paddingTopMedium;
82 }
83
84 .u-pb-large {
85 padding-bottom: $paddingTopLarge;
86 }
87
88 .u-pb-larger {
89 padding-bottom: $paddingTopLarger;
90 }
91
92 // 布局方位
93 .u-ta-c {
94 text-align: center !important;
95 }
96
97 .u-ta-l {
98 text-align: left !important;
99 }
100
101 .u-ta-r {
102 text-align: right !important;
103 }
104
105 .u-fl-l {
106 float: left;
107 }
108
109 .u-fl-n {
110 float: none;
111 }
112
113 .u-fl-r {
114 float: right;
115 }
116
117 .u-d-b {
118 display: block;
119 }
120
121 .u-d-i {
122 display: inline !important;
123 }
124
125 .u-d-ib {
126 display: inline-block !important;
127 }
128
129 .u-d-n {
130 display: none !important;
131 }
132
133 .u-d-t {
134 display: table;
135 table-layout: fixed;
136 }
137
138 .u-d-tc {
139 display: table-cell;
140 }
141
142 .u-va-b {
143 vertical-align: bottom;
144 }
145
146 .u-va-m {
147 vertical-align: middle;
148 }
149
150 .u-va-t {
151 vertical-align: top;
152 }
153
154 // clearfix
155 .u-clearfix {
156 @include clearfix;
157 }
158
159 // 虚拟格式
160 .u-cur-d {
161 cursor: default;
162 }
163
164 .u-cur-p {
165 cursor: pointer;
166 }
167
168 // flex
169 .u-flex {
170 display: -webkit-box;
171 display: -webkit-flex;
172 display: flex;
173 }
174
175 .u-flex-item {
176 -webkit-box-flex: 1;
177 -webkit-flex: 1;
178 flex: 1;
179 }
180
181 // 小程序中模拟ul、li
182 .u-ul {
183 padding-left: 30px;
184 text-align: left;
185 display: block;
186 }
187
188 .u-li {
189 position: relative;
190 font-size: $fontSizeSmall;
191 line-height: $fontSizeSmall + 4px;
192 margin-bottom: $marginTopSmall;
193
194 &:before {
195 position: absolute;
196 content: " ";
197 top: 14px;
198 left: -20px;
199 width: 8px;
200 height: 8px;
201 border-radius: 8px;
202 background-color: $colorBlack;
203 }
204 }
1 /**
2 * ------------------------------------------------------------------
3 * Sass 变量
4 *
5 * ------------------------------------------------------------------
6 *
7 */
8
9 // Margin
10 $marginTopSmaller: 20px;
11 $marginTopSmall: 30px;
12 $marginTopMedium: 40px;
13 $marginTopLarge: 60px;
14 $marginTopLarger: 80px;
15
16 // Padding
17 $paddingTopSmaller: 20px;
18 $paddingTopSmall: 30px;
19 $paddingTopMedium: 40px;
20 $paddingTopLarge: 60px;
21 $paddingTopLarger: 80px;
22
23 // Color
24 $colorBlue: #20A0FF;
25 $colorGreen: #13CE66;
26 $colorGray: #475669;
27 $colorBlack: #000;
28 $colorRed: #FF4949;
29 $colorYellow: #F7BA2A;
30
31 $color: #787878;
32 $colorLink: #1D8CE0;
33
34 $backGroundColor: #fff;
35
36 // Font
37 $fontSize: 32px;
38 $fontSizeSmall: 28px;
39 $fontSizeSmaller: 24px;
40 $fontSizeLarge: 36px;
41 $fontSizeLarger: 44px;
1 /**
2 * @version: 1.0 Alpha-1
3 * @author: Coolite Inc. http://www.coolite.com/
4 * @date: 2008-05-13
5 * @copyright: Copyright (c) 2006-2008, Coolite Inc. (http://www.coolite.com/). All rights reserved.
6 * @license: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/.
7 * @website: http://www.datejs.com/
8 */
9
10 Date.CultureInfo = {
11 name: "en-US",
12 englishName: "English (United States)",
13 nativeName: "English (United States)",
14 dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
15 abbreviatedDayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
16 shortestDayNames: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
17 firstLetterDayNames: ["S", "M", "T", "W", "T", "F", "S"],
18 monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
19 abbreviatedMonthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
20 amDesignator: "AM",
21 pmDesignator: "PM",
22 firstDayOfWeek: 0,
23 twoDigitYearMax: 2029,
24 dateElementOrder: "mdy",
25 formatPatterns: {
26 shortDate: "M/d/yyyy",
27 longDate: "dddd, MMMM dd, yyyy",
28 shortTime: "h:mm tt",
29 longTime: "h:mm:ss tt",
30 fullDateTime: "dddd, MMMM dd, yyyy h:mm:ss tt",
31 sortableDateTime: "yyyy-MM-ddTHH:mm:ss",
32 universalSortableDateTime: "yyyy-MM-dd HH:mm:ssZ",
33 rfc1123: "ddd, dd MMM yyyy HH:mm:ss GMT",
34 monthDay: "MMMM dd",
35 yearMonth: "MMMM, yyyy"
36 },
37 regexPatterns: {
38 jan: /^jan(uary)?/i,
39 feb: /^feb(ruary)?/i,
40 mar: /^mar(ch)?/i,
41 apr: /^apr(il)?/i,
42 may: /^may/i,
43 jun: /^jun(e)?/i,
44 jul: /^jul(y)?/i,
45 aug: /^aug(ust)?/i,
46 sep: /^sep(t(ember)?)?/i,
47 oct: /^oct(ober)?/i,
48 nov: /^nov(ember)?/i,
49 dec: /^dec(ember)?/i,
50 sun: /^su(n(day)?)?/i,
51 mon: /^mo(n(day)?)?/i,
52 tue: /^tu(e(s(day)?)?)?/i,
53 wed: /^we(d(nesday)?)?/i,
54 thu: /^th(u(r(s(day)?)?)?)?/i,
55 fri: /^fr(i(day)?)?/i,
56 sat: /^sa(t(urday)?)?/i,
57 future: /^next/i,
58 past: /^last|past|prev(ious)?/i,
59 add: /^(\+|aft(er)?|from|hence)/i,
60 subtract: /^(\-|bef(ore)?|ago)/i,
61 yesterday: /^yes(terday)?/i,
62 today: /^t(od(ay)?)?/i,
63 tomorrow: /^tom(orrow)?/i,
64 now: /^n(ow)?/i,
65 millisecond: /^ms|milli(second)?s?/i,
66 second: /^sec(ond)?s?/i,
67 minute: /^mn|min(ute)?s?/i,
68 hour: /^h(our)?s?/i,
69 week: /^w(eek)?s?/i,
70 month: /^m(onth)?s?/i,
71 day: /^d(ay)?s?/i,
72 year: /^y(ear)?s?/i,
73 shortMeridian: /^(a|p)/i,
74 longMeridian: /^(a\.?m?\.?|p\.?m?\.?)/i,
75 timezone: /^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt|utc)/i,
76 ordinalSuffix: /^\s*(st|nd|rd|th)/i,
77 timeContext: /^\s*(\:|a(?!u|p)|p)/i
78 },
79 timezones: [{
80 name: "UTC",
81 offset: "-000"
82 }, {
83 name: "GMT",
84 offset: "-000"
85 }, {
86 name: "EST",
87 offset: "-0500"
88 }, {
89 name: "EDT",
90 offset: "-0400"
91 }, {
92 name: "CST",
93 offset: "-0600"
94 }, {
95 name: "CDT",
96 offset: "-0500"
97 }, {
98 name: "MST",
99 offset: "-0700"
100 }, {
101 name: "MDT",
102 offset: "-0600"
103 }, {
104 name: "PST",
105 offset: "-0800"
106 }, {
107 name: "PDT",
108 offset: "-0700"
109 }]
110 };
111 (function () {
112 var $D = Date,
113 $P = $D.prototype,
114 $C = $D.CultureInfo,
115 p = function (s, l) {
116 if (!l) {
117 l = 2;
118 }
119 return ("000" + s).slice(l * -1);
120 };
121 $P.clearTime = function () {
122 this.setHours(0);
123 this.setMinutes(0);
124 this.setSeconds(0);
125 this.setMilliseconds(0);
126 return this;
127 };
128 $P.setTimeToNow = function () {
129 var n = new Date();
130 this.setHours(n.getHours());
131 this.setMinutes(n.getMinutes());
132 this.setSeconds(n.getSeconds());
133 this.setMilliseconds(n.getMilliseconds());
134 return this;
135 };
136 $D.today = function () {
137 return new Date().clearTime();
138 };
139 $D.compare = function (date1, date2) {
140 if (isNaN(date1) || isNaN(date2)) {
141 throw new Error(date1 + " - " + date2);
142 } else if (date1 instanceof Date && date2 instanceof Date) {
143 return (date1 < date2) ? -1 : (date1 > date2) ? 1 : 0;
144 } else {
145 throw new TypeError(date1 + " - " + date2);
146 }
147 };
148 $D.equals = function (date1, date2) {
149 return (date1.compareTo(date2) === 0);
150 };
151 $D.getDayNumberFromName = function (name) {
152 var n = $C.dayNames,
153 m = $C.abbreviatedDayNames,
154 o = $C.shortestDayNames,
155 s = name.toLowerCase();
156 for (var i = 0; i < n.length; i++) {
157 if (n[i].toLowerCase() == s || m[i].toLowerCase() == s || o[i].toLowerCase() == s) {
158 return i;
159 }
160 }
161 return -1;
162 };
163 $D.getMonthNumberFromName = function (name) {
164 var n = $C.monthNames,
165 m = $C.abbreviatedMonthNames,
166 s = name.toLowerCase();
167 for (var i = 0; i < n.length; i++) {
168 if (n[i].toLowerCase() == s || m[i].toLowerCase() == s) {
169 return i;
170 }
171 }
172 return -1;
173 };
174 $D.isLeapYear = function (year) {
175 return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);
176 };
177 $D.getDaysInMonth = function (year, month) {
178 return [31, ($D.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
179 };
180 $D.getTimezoneAbbreviation = function (offset) {
181 var z = $C.timezones,
182 p;
183 for (var i = 0; i < z.length; i++) {
184 if (z[i].offset === offset) {
185 return z[i].name;
186 }
187 }
188 return null;
189 };
190 $D.getTimezoneOffset = function (name) {
191 var z = $C.timezones,
192 p;
193 for (var i = 0; i < z.length; i++) {
194 if (z[i].name === name.toUpperCase()) {
195 return z[i].offset;
196 }
197 }
198 return null;
199 };
200 $P.clone = function () {
201 return new Date(this.getTime());
202 };
203 $P.compareTo = function (date) {
204 return Date.compare(this, date);
205 };
206 $P.equals = function (date) {
207 return Date.equals(this, date || new Date());
208 };
209 $P.between = function (start, end) {
210 return this.getTime() >= start.getTime() && this.getTime() <= end.getTime();
211 };
212 $P.isAfter = function (date) {
213 return this.compareTo(date || new Date()) === 1;
214 };
215 $P.isBefore = function (date) {
216 return (this.compareTo(date || new Date()) === -1);
217 };
218 $P.isToday = function () {
219 return this.isSameDay(new Date());
220 };
221 $P.isSameDay = function (date) {
222 return this.clone().clearTime().equals(date.clone().clearTime());
223 };
224 $P.addMilliseconds = function (value) {
225 this.setMilliseconds(this.getMilliseconds() + value);
226 return this;
227 };
228 $P.addSeconds = function (value) {
229 return this.addMilliseconds(value * 1000);
230 };
231 $P.addMinutes = function (value) {
232 return this.addMilliseconds(value * 60000);
233 };
234 $P.addHours = function (value) {
235 return this.addMilliseconds(value * 3600000);
236 };
237 $P.addDays = function (value) {
238 this.setDate(this.getDate() + value);
239 return this;
240 };
241 $P.addWeeks = function (value) {
242 return this.addDays(value * 7);
243 };
244 $P.addMonths = function (value) {
245 var n = this.getDate();
246 this.setDate(1);
247 this.setMonth(this.getMonth() + value);
248 this.setDate(Math.min(n, $D.getDaysInMonth(this.getFullYear(), this.getMonth())));
249 return this;
250 };
251 $P.addYears = function (value) {
252 return this.addMonths(value * 12);
253 };
254 $P.add = function (config) {
255 if (typeof config == "number") {
256 this._orient = config;
257 return this;
258 }
259 var x = config;
260 if (x.milliseconds) {
261 this.addMilliseconds(x.milliseconds);
262 }
263 if (x.seconds) {
264 this.addSeconds(x.seconds);
265 }
266 if (x.minutes) {
267 this.addMinutes(x.minutes);
268 }
269 if (x.hours) {
270 this.addHours(x.hours);
271 }
272 if (x.weeks) {
273 this.addWeeks(x.weeks);
274 }
275 if (x.months) {
276 this.addMonths(x.months);
277 }
278 if (x.years) {
279 this.addYears(x.years);
280 }
281 if (x.days) {
282 this.addDays(x.days);
283 }
284 return this;
285 };
286 var $y, $m, $d;
287 $P.getWeek = function () {
288 var a, b, c, d, e, f, g, n, s, w;
289 $y = (!$y) ? this.getFullYear() : $y;
290 $m = (!$m) ? this.getMonth() + 1 : $m;
291 $d = (!$d) ? this.getDate() : $d;
292 if ($m <= 2) {
293 a = $y - 1;
294 b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0);
295 c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0);
296 s = b - c;
297 e = 0;
298 f = $d - 1 + (31 * ($m - 1));
299 } else {
300 a = $y;
301 b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0);
302 c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0);
303 s = b - c;
304 e = s + 1;
305 f = $d + ((153 * ($m - 3) + 2) / 5) + 58 + s;
306 }
307 g = (a + b) % 7;
308 d = (f + g - e) % 7;
309 n = (f + 3 - d) | 0;
310 if (n < 0) {
311 w = 53 - ((g - s) / 5 | 0);
312 } else if (n > 364 + s) {
313 w = 1;
314 } else {
315 w = (n / 7 | 0) + 1;
316 }
317 $y = $m = $d = null;
318 return w;
319 };
320 $P.getISOWeek = function () {
321 $y = this.getUTCFullYear();
322 $m = this.getUTCMonth() + 1;
323 $d = this.getUTCDate();
324 return p(this.getWeek());
325 };
326 $P.setWeek = function (n) {
327 return this.moveToDayOfWeek(1).addWeeks(n - this.getWeek());
328 };
329 $D._validate = function (n, min, max, name) {
330 if (typeof n == "undefined") {
331 return false;
332 } else if (typeof n != "number") {
333 throw new TypeError(n + " is not a Number.");
334 } else if (n < min || n > max) {
335 throw new RangeError(n + " is not a valid value for " + name + ".");
336 }
337 return true;
338 };
339 $D.validateMillisecond = function (value) {
340 return $D._validate(value, 0, 999, "millisecond");
341 };
342 $D.validateSecond = function (value) {
343 return $D._validate(value, 0, 59, "second");
344 };
345 $D.validateMinute = function (value) {
346 return $D._validate(value, 0, 59, "minute");
347 };
348 $D.validateHour = function (value) {
349 return $D._validate(value, 0, 23, "hour");
350 };
351 $D.validateDay = function (value, year, month) {
352 return $D._validate(value, 1, $D.getDaysInMonth(year, month), "day");
353 };
354 $D.validateMonth = function (value) {
355 return $D._validate(value, 0, 11, "month");
356 };
357 $D.validateYear = function (value) {
358 return $D._validate(value, 0, 9999, "year");
359 };
360 $P.set = function (config) {
361 if ($D.validateMillisecond(config.millisecond)) {
362 this.addMilliseconds(config.millisecond - this.getMilliseconds());
363 }
364 if ($D.validateSecond(config.second)) {
365 this.addSeconds(config.second - this.getSeconds());
366 }
367 if ($D.validateMinute(config.minute)) {
368 this.addMinutes(config.minute - this.getMinutes());
369 }
370 if ($D.validateHour(config.hour)) {
371 this.addHours(config.hour - this.getHours());
372 }
373 if ($D.validateMonth(config.month)) {
374 this.addMonths(config.month - this.getMonth());
375 }
376 if ($D.validateYear(config.year)) {
377 this.addYears(config.year - this.getFullYear());
378 }
379 if ($D.validateDay(config.day, this.getFullYear(), this.getMonth())) {
380 this.addDays(config.day - this.getDate());
381 }
382 if (config.timezone) {
383 this.setTimezone(config.timezone);
384 }
385 if (config.timezoneOffset) {
386 this.setTimezoneOffset(config.timezoneOffset);
387 }
388 if (config.week && $D._validate(config.week, 0, 53, "week")) {
389 this.setWeek(config.week);
390 }
391 return this;
392 };
393 $P.moveToFirstDayOfMonth = function () {
394 return this.set({
395 day: 1
396 });
397 };
398 $P.moveToLastDayOfMonth = function () {
399 return this.set({
400 day: $D.getDaysInMonth(this.getFullYear(), this.getMonth())
401 });
402 };
403 $P.moveToNthOccurrence = function (dayOfWeek, occurrence) {
404 var shift = 0;
405 if (occurrence > 0) {
406 shift = occurrence - 1;
407 } else if (occurrence === -1) {
408 this.moveToLastDayOfMonth();
409 if (this.getDay() !== dayOfWeek) {
410 this.moveToDayOfWeek(dayOfWeek, -1);
411 }
412 return this;
413 }
414 return this.moveToFirstDayOfMonth().addDays(-1).moveToDayOfWeek(dayOfWeek, +1).addWeeks(shift);
415 };
416 $P.moveToDayOfWeek = function (dayOfWeek, orient) {
417 var diff = (dayOfWeek - this.getDay() + 7 * (orient || +1)) % 7;
418 return this.addDays((diff === 0) ? diff += 7 * (orient || +1) : diff);
419 };
420 $P.moveToMonth = function (month, orient) {
421 var diff = (month - this.getMonth() + 12 * (orient || +1)) % 12;
422 return this.addMonths((diff === 0) ? diff += 12 * (orient || +1) : diff);
423 };
424 $P.getOrdinalNumber = function () {
425 return Math.ceil((this.clone().clearTime() - new Date(this.getFullYear(), 0, 1)) / 86400000) + 1;
426 };
427 $P.getTimezone = function () {
428 return $D.getTimezoneAbbreviation(this.getUTCOffset());
429 };
430 $P.setTimezoneOffset = function (offset) {
431 var here = this.getTimezoneOffset(),
432 there = Number(offset) * -6 / 10;
433 return this.addMinutes(there - here);
434 };
435 $P.setTimezone = function (offset) {
436 return this.setTimezoneOffset($D.getTimezoneOffset(offset));
437 };
438 $P.hasDaylightSavingTime = function () {
439 return (Date.today().set({
440 month: 0,
441 day: 1
442 }).getTimezoneOffset() !== Date.today().set({
443 month: 6,
444 day: 1
445 }).getTimezoneOffset());
446 };
447 $P.isDaylightSavingTime = function () {
448 return (this.hasDaylightSavingTime() && new Date().getTimezoneOffset() === Date.today().set({
449 month: 6,
450 day: 1
451 }).getTimezoneOffset());
452 };
453 $P.getUTCOffset = function () {
454 var n = this.getTimezoneOffset() * -10 / 6,
455 r;
456 if (n < 0) {
457 r = (n - 10000).toString();
458 return r.charAt(0) + r.substr(2);
459 } else {
460 r = (n + 10000).toString();
461 return "+" + r.substr(1);
462 }
463 };
464 $P.getElapsed = function (date) {
465 return (date || new Date()) - this;
466 };
467 if (!$P.toISOString) {
468 $P.toISOString = function () {
469 function f(n) {
470 return n < 10 ? '0' + n : n;
471 }
472 return '"' + this.getUTCFullYear() + '-' +
473 f(this.getUTCMonth() + 1) + '-' +
474 f(this.getUTCDate()) + 'T' +
475 f(this.getUTCHours()) + ':' +
476 f(this.getUTCMinutes()) + ':' +
477 f(this.getUTCSeconds()) + 'Z"';
478 };
479 }
480 $P._toString = $P.toString;
481 $P.toString = function (format) {
482 var x = this;
483 if (format && format.length == 1) {
484 var c = $C.formatPatterns;
485 x.t = x.toString;
486 switch (format) {
487 case "d":
488 return x.t(c.shortDate);
489 case "D":
490 return x.t(c.longDate);
491 case "F":
492 return x.t(c.fullDateTime);
493 case "m":
494 return x.t(c.monthDay);
495 case "r":
496 return x.t(c.rfc1123);
497 case "s":
498 return x.t(c.sortableDateTime);
499 case "t":
500 return x.t(c.shortTime);
501 case "T":
502 return x.t(c.longTime);
503 case "u":
504 return x.t(c.universalSortableDateTime);
505 case "y":
506 return x.t(c.yearMonth);
507 }
508 }
509 var ord = function (n) {
510 switch (n * 1) {
511 case 1:
512 case 21:
513 case 31:
514 return "st";
515 case 2:
516 case 22:
517 return "nd";
518 case 3:
519 case 23:
520 return "rd";
521 default:
522 return "th";
523 }
524 };
525 return format ? format.replace(/(\\)?(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|S)/g, function (m) {
526 if (m.charAt(0) === "\\") {
527 return m.replace("\\", "");
528 }
529 x.h = x.getHours;
530 switch (m) {
531 case "hh":
532 return p(x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12));
533 case "h":
534 return x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12);
535 case "HH":
536 return p(x.h());
537 case "H":
538 return x.h();
539 case "mm":
540 return p(x.getMinutes());
541 case "m":
542 return x.getMinutes();
543 case "ss":
544 return p(x.getSeconds());
545 case "s":
546 return x.getSeconds();
547 case "yyyy":
548 return p(x.getFullYear(), 4);
549 case "yy":
550 return p(x.getFullYear());
551 case "dddd":
552 return $C.dayNames[x.getDay()];
553 case "ddd":
554 return $C.abbreviatedDayNames[x.getDay()];
555 case "dd":
556 return p(x.getDate());
557 case "d":
558 return x.getDate();
559 case "MMMM":
560 return $C.monthNames[x.getMonth()];
561 case "MMM":
562 return $C.abbreviatedMonthNames[x.getMonth()];
563 case "MM":
564 return p((x.getMonth() + 1));
565 case "M":
566 return x.getMonth() + 1;
567 case "t":
568 return x.h() < 12 ? $C.amDesignator.substring(0, 1) : $C.pmDesignator.substring(0, 1);
569 case "tt":
570 return x.h() < 12 ? $C.amDesignator : $C.pmDesignator;
571 case "S":
572 return ord(x.getDate());
573 default:
574 return m;
575 }
576 }) : this._toString();
577 };
578 }());
579 (function () {
580 var $D = Date,
581 $P = $D.prototype,
582 $C = $D.CultureInfo,
583 $N = Number.prototype;
584 $P._orient = +1;
585 $P._nth = null;
586 $P._is = false;
587 $P._same = false;
588 $P._isSecond = false;
589 $N._dateElement = "day";
590 $P.next = function () {
591 this._orient = +1;
592 return this;
593 };
594 $D.next = function () {
595 return $D.today().next();
596 };
597 $P.last = $P.prev = $P.previous = function () {
598 this._orient = -1;
599 return this;
600 };
601 $D.last = $D.prev = $D.previous = function () {
602 return $D.today().last();
603 };
604 $P.is = function () {
605 this._is = true;
606 return this;
607 };
608 $P.same = function () {
609 this._same = true;
610 this._isSecond = false;
611 return this;
612 };
613 $P.today = function () {
614 return this.same().day();
615 };
616 $P.weekday = function () {
617 if (this._is) {
618 this._is = false;
619 return (!this.is().sat() && !this.is().sun());
620 }
621 return false;
622 };
623 $P.at = function (time) {
624 return (typeof time === "string") ? $D.parse(this.toString("d") + " " + time) : this.set(time);
625 };
626 $N.fromNow = $N.after = function (date) {
627 var c = {};
628 c[this._dateElement] = this;
629 return ((!date) ? new Date() : date.clone()).add(c);
630 };
631 $N.ago = $N.before = function (date) {
632 var c = {};
633 c[this._dateElement] = this * -1;
634 return ((!date) ? new Date() : date.clone()).add(c);
635 };
636 var dx = ("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),
637 mx = ("january february march april may june july august september october november december").split(/\s/),
638 px = ("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),
639 pxf = ("Milliseconds Seconds Minutes Hours Date Week Month FullYear").split(/\s/),
640 nth = ("final first second third fourth fifth").split(/\s/),
641 de;
642 $P.toObject = function () {
643 var o = {};
644 for (var i = 0; i < px.length; i++) {
645 o[px[i].toLowerCase()] = this["get" + pxf[i]]();
646 }
647 return o;
648 };
649 $D.fromObject = function (config) {
650 config.week = null;
651 return Date.today().set(config);
652 };
653 var df = function (n) {
654 return function () {
655 if (this._is) {
656 this._is = false;
657 return this.getDay() == n;
658 }
659 if (this._nth !== null) {
660 if (this._isSecond) {
661 this.addSeconds(this._orient * -1);
662 }
663 this._isSecond = false;
664 var ntemp = this._nth;
665 this._nth = null;
666 var temp = this.clone().moveToLastDayOfMonth();
667 this.moveToNthOccurrence(n, ntemp);
668 if (this > temp) {
669 throw new RangeError($D.getDayName(n) + " does not occur " + ntemp + " times in the month of " + $D.getMonthName(temp.getMonth()) + " " + temp.getFullYear() + ".");
670 }
671 return this;
672 }
673 return this.moveToDayOfWeek(n, this._orient);
674 };
675 };
676 var sdf = function (n) {
677 return function () {
678 var t = $D.today(),
679 shift = n - t.getDay();
680 if (n === 0 && $C.firstDayOfWeek === 1 && t.getDay() !== 0) {
681 shift = shift + 7;
682 }
683 return t.addDays(shift);
684 };
685 };
686 for (var i = 0; i < dx.length; i++) {
687 $D[dx[i].toUpperCase()] = $D[dx[i].toUpperCase().substring(0, 3)] = i;
688 $D[dx[i]] = $D[dx[i].substring(0, 3)] = sdf(i);
689 $P[dx[i]] = $P[dx[i].substring(0, 3)] = df(i);
690 }
691 var mf = function (n) {
692 return function () {
693 if (this._is) {
694 this._is = false;
695 return this.getMonth() === n;
696 }
697 return this.moveToMonth(n, this._orient);
698 };
699 };
700 var smf = function (n) {
701 return function () {
702 return $D.today().set({
703 month: n,
704 day: 1
705 });
706 };
707 };
708 for (var j = 0; j < mx.length; j++) {
709 $D[mx[j].toUpperCase()] = $D[mx[j].toUpperCase().substring(0, 3)] = j;
710 $D[mx[j]] = $D[mx[j].substring(0, 3)] = smf(j);
711 $P[mx[j]] = $P[mx[j].substring(0, 3)] = mf(j);
712 }
713 var ef = function (j) {
714 return function () {
715 if (this._isSecond) {
716 this._isSecond = false;
717 return this;
718 }
719 if (this._same) {
720 this._same = this._is = false;
721 var o1 = this.toObject(),
722 o2 = (arguments[0] || new Date()).toObject(),
723 v = "",
724 k = j.toLowerCase();
725 for (var m = (px.length - 1); m > -1; m--) {
726 v = px[m].toLowerCase();
727 if (o1[v] != o2[v]) {
728 return false;
729 }
730 if (k == v) {
731 break;
732 }
733 }
734 return true;
735 }
736 if (j.substring(j.length - 1) != "s") {
737 j += "s";
738 }
739 return this["add" + j](this._orient);
740 };
741 };
742 var nf = function (n) {
743 return function () {
744 this._dateElement = n;
745 return this;
746 };
747 };
748 for (var k = 0; k < px.length; k++) {
749 de = px[k].toLowerCase();
750 $P[de] = $P[de + "s"] = ef(px[k]);
751 $N[de] = $N[de + "s"] = nf(de);
752 }
753 $P._ss = ef("Second");
754 var nthfn = function (n) {
755 return function (dayOfWeek) {
756 if (this._same) {
757 return this._ss(arguments[0]);
758 }
759 if (dayOfWeek || dayOfWeek === 0) {
760 return this.moveToNthOccurrence(dayOfWeek, n);
761 }
762 this._nth = n;
763 if (n === 2 && (dayOfWeek === undefined || dayOfWeek === null)) {
764 this._isSecond = true;
765 return this.addSeconds(this._orient);
766 }
767 return this;
768 };
769 };
770 for (var l = 0; l < nth.length; l++) {
771 $P[nth[l]] = (l === 0) ? nthfn(-1) : nthfn(l);
772 }
773 }());
774 (function () {
775 Date.Parsing = {
776 Exception: function (s) {
777 this.message = "Parse error at '" + s.substring(0, 10) + " ...'";
778 }
779 };
780 var $P = Date.Parsing;
781 var _ = $P.Operators = {
782 rtoken: function (r) {
783 return function (s) {
784 var mx = s.match(r);
785 if (mx) {
786 return ([mx[0], s.substring(mx[0].length)]);
787 } else {
788 throw new $P.Exception(s);
789 }
790 };
791 },
792 token: function (s) {
793 return function (s) {
794 return _.rtoken(new RegExp("^\s*" + s + "\s*"))(s);
795 };
796 },
797 stoken: function (s) {
798 return _.rtoken(new RegExp("^" + s));
799 },
800 until: function (p) {
801 return function (s) {
802 var qx = [],
803 rx = null;
804 while (s.length) {
805 try {
806 rx = p.call(this, s);
807 } catch (e) {
808 qx.push(rx[0]);
809 s = rx[1];
810 continue;
811 }
812 break;
813 }
814 return [qx, s];
815 };
816 },
817 many: function (p) {
818 return function (s) {
819 var rx = [],
820 r = null;
821 while (s.length) {
822 try {
823 r = p.call(this, s);
824 } catch (e) {
825 return [rx, s];
826 }
827 rx.push(r[0]);
828 s = r[1];
829 }
830 return [rx, s];
831 };
832 },
833 optional: function (p) {
834 return function (s) {
835 var r = null;
836 try {
837 r = p.call(this, s);
838 } catch (e) {
839 return [null, s];
840 }
841 return [r[0], r[1]];
842 };
843 },
844 not: function (p) {
845 return function (s) {
846 try {
847 p.call(this, s);
848 } catch (e) {
849 return [null, s];
850 }
851 throw new $P.Exception(s);
852 };
853 },
854 ignore: function (p) {
855 return p ? function (s) {
856 var r = null;
857 r = p.call(this, s);
858 return [null, r[1]];
859 } : null;
860 },
861 product: function () {
862 var px = arguments[0],
863 qx = Array.prototype.slice.call(arguments, 1),
864 rx = [];
865 for (var i = 0; i < px.length; i++) {
866 rx.push(_.each(px[i], qx));
867 }
868 return rx;
869 },
870 cache: function (rule) {
871 var cache = {},
872 r = null;
873 return function (s) {
874 try {
875 r = cache[s] = (cache[s] || rule.call(this, s));
876 } catch (e) {
877 r = cache[s] = e;
878 }
879 if (r instanceof $P.Exception) {
880 throw r;
881 } else {
882 return r;
883 }
884 };
885 },
886 any: function () {
887 var px = arguments;
888 return function (s) {
889 var r = null;
890 for (var i = 0; i < px.length; i++) {
891 if (px[i] == null) {
892 continue;
893 }
894 try {
895 r = (px[i].call(this, s));
896 } catch (e) {
897 r = null;
898 }
899 if (r) {
900 return r;
901 }
902 }
903 throw new $P.Exception(s);
904 };
905 },
906 each: function () {
907 var px = arguments;
908 return function (s) {
909 var rx = [],
910 r = null;
911 for (var i = 0; i < px.length; i++) {
912 if (px[i] == null) {
913 continue;
914 }
915 try {
916 r = (px[i].call(this, s));
917 } catch (e) {
918 throw new $P.Exception(s);
919 }
920 rx.push(r[0]);
921 s = r[1];
922 }
923 return [rx, s];
924 };
925 },
926 all: function () {
927 var px = arguments,
928 _ = _;
929 return _.each(_.optional(px));
930 },
931 sequence: function (px, d, c) {
932 d = d || _.rtoken(/^\s*/);
933 c = c || null;
934 if (px.length == 1) {
935 return px[0];
936 }
937 return function (s) {
938 var r = null,
939 q = null;
940 var rx = [];
941 for (var i = 0; i < px.length; i++) {
942 try {
943 r = px[i].call(this, s);
944 } catch (e) {
945 break;
946 }
947 rx.push(r[0]);
948 try {
949 q = d.call(this, r[1]);
950 } catch (ex) {
951 q = null;
952 break;
953 }
954 s = q[1];
955 }
956 if (!r) {
957 throw new $P.Exception(s);
958 }
959 if (q) {
960 throw new $P.Exception(q[1]);
961 }
962 if (c) {
963 try {
964 r = c.call(this, r[1]);
965 } catch (ey) {
966 throw new $P.Exception(r[1]);
967 }
968 }
969 return [rx, (r ? r[1] : s)];
970 };
971 },
972 between: function (d1, p, d2) {
973 d2 = d2 || d1;
974 var _fn = _.each(_.ignore(d1), p, _.ignore(d2));
975 return function (s) {
976 var rx = _fn.call(this, s);
977 return [
978 [rx[0][0], r[0][2]], rx[1]
979 ];
980 };
981 },
982 list: function (p, d, c) {
983 d = d || _.rtoken(/^\s*/);
984 c = c || null;
985 return (p instanceof Array ? _.each(_.product(p.slice(0, -1), _.ignore(d)), p.slice(-1), _.ignore(c)) : _.each(_.many(_.each(p, _.ignore(d))), px, _.ignore(c)));
986 },
987 set: function (px, d, c) {
988 d = d || _.rtoken(/^\s*/);
989 c = c || null;
990 return function (s) {
991 var r = null,
992 p = null,
993 q = null,
994 rx = null,
995 best = [
996 [], s
997 ],
998 last = false;
999 for (var i = 0; i < px.length; i++) {
1000 q = null;
1001 p = null;
1002 r = null;
1003 last = (px.length == 1);
1004 try {
1005 r = px[i].call(this, s);
1006 } catch (e) {
1007 continue;
1008 }
1009 rx = [
1010 [r[0]], r[1]
1011 ];
1012 if (r[1].length > 0 && !last) {
1013 try {
1014 q = d.call(this, r[1]);
1015 } catch (ex) {
1016 last = true;
1017 }
1018 } else {
1019 last = true;
1020 }
1021 if (!last && q[1].length === 0) {
1022 last = true;
1023 }
1024 if (!last) {
1025 var qx = [];
1026 for (var j = 0; j < px.length; j++) {
1027 if (i != j) {
1028 qx.push(px[j]);
1029 }
1030 }
1031 p = _.set(qx, d).call(this, q[1]);
1032 if (p[0].length > 0) {
1033 rx[0] = rx[0].concat(p[0]);
1034 rx[1] = p[1];
1035 }
1036 }
1037 if (rx[1].length < best[1].length) {
1038 best = rx;
1039 }
1040 if (best[1].length === 0) {
1041 break;
1042 }
1043 }
1044 if (best[0].length === 0) {
1045 return best;
1046 }
1047 if (c) {
1048 try {
1049 q = c.call(this, best[1]);
1050 } catch (ey) {
1051 throw new $P.Exception(best[1]);
1052 }
1053 best[1] = q[1];
1054 }
1055 return best;
1056 };
1057 },
1058 forward: function (gr, fname) {
1059 return function (s) {
1060 return gr[fname].call(this, s);
1061 };
1062 },
1063 replace: function (rule, repl) {
1064 return function (s) {
1065 var r = rule.call(this, s);
1066 return [repl, r[1]];
1067 };
1068 },
1069 process: function (rule, fn) {
1070 return function (s) {
1071 var r = rule.call(this, s);
1072 return [fn.call(this, r[0]), r[1]];
1073 };
1074 },
1075 min: function (min, rule) {
1076 return function (s) {
1077 var rx = rule.call(this, s);
1078 if (rx[0].length < min) {
1079 throw new $P.Exception(s);
1080 }
1081 return rx;
1082 };
1083 }
1084 };
1085 var _generator = function (op) {
1086 return function () {
1087 var args = null,
1088 rx = [];
1089 if (arguments.length > 1) {
1090 args = Array.prototype.slice.call(arguments);
1091 } else if (arguments[0] instanceof Array) {
1092 args = arguments[0];
1093 }
1094 if (args) {
1095 for (var i = 0, px = args.shift(); i < px.length; i++) {
1096 args.unshift(px[i]);
1097 rx.push(op.apply(null, args));
1098 args.shift();
1099 return rx;
1100 }
1101 } else {
1102 return op.apply(null, arguments);
1103 }
1104 };
1105 };
1106 var gx = "optional not ignore cache".split(/\s/);
1107 for (var i = 0; i < gx.length; i++) {
1108 _[gx[i]] = _generator(_[gx[i]]);
1109 }
1110 var _vector = function (op) {
1111 return function () {
1112 if (arguments[0] instanceof Array) {
1113 return op.apply(null, arguments[0]);
1114 } else {
1115 return op.apply(null, arguments);
1116 }
1117 };
1118 };
1119 var vx = "each any all".split(/\s/);
1120 for (var j = 0; j < vx.length; j++) {
1121 _[vx[j]] = _vector(_[vx[j]]);
1122 }
1123 }());
1124 (function () {
1125 var $D = Date,
1126 $P = $D.prototype,
1127 $C = $D.CultureInfo;
1128 var flattenAndCompact = function (ax) {
1129 var rx = [];
1130 for (var i = 0; i < ax.length; i++) {
1131 if (ax[i] instanceof Array) {
1132 rx = rx.concat(flattenAndCompact(ax[i]));
1133 } else {
1134 if (ax[i]) {
1135 rx.push(ax[i]);
1136 }
1137 }
1138 }
1139 return rx;
1140 };
1141 $D.Grammar = {};
1142 $D.Translator = {
1143 hour: function (s) {
1144 return function () {
1145 this.hour = Number(s);
1146 };
1147 },
1148 minute: function (s) {
1149 return function () {
1150 this.minute = Number(s);
1151 };
1152 },
1153 second: function (s) {
1154 return function () {
1155 this.second = Number(s);
1156 };
1157 },
1158 meridian: function (s) {
1159 return function () {
1160 this.meridian = s.slice(0, 1).toLowerCase();
1161 };
1162 },
1163 timezone: function (s) {
1164 return function () {
1165 var n = s.replace(/[^\d\+\-]/g, "");
1166 if (n.length) {
1167 this.timezoneOffset = Number(n);
1168 } else {
1169 this.timezone = s.toLowerCase();
1170 }
1171 };
1172 },
1173 day: function (x) {
1174 var s = x[0];
1175 return function () {
1176 this.day = Number(s.match(/\d+/)[0]);
1177 };
1178 },
1179 month: function (s) {
1180 return function () {
1181 this.month = (s.length == 3) ? "jan feb mar apr may jun jul aug sep oct nov dec".indexOf(s) / 4 : Number(s) - 1;
1182 };
1183 },
1184 year: function (s) {
1185 return function () {
1186 var n = Number(s);
1187 this.year = ((s.length > 2) ? n : (n + (((n + 2000) < $C.twoDigitYearMax) ? 2000 : 1900)));
1188 };
1189 },
1190 rday: function (s) {
1191 return function () {
1192 switch (s) {
1193 case "yesterday":
1194 this.days = -1;
1195 break;
1196 case "tomorrow":
1197 this.days = 1;
1198 break;
1199 case "today":
1200 this.days = 0;
1201 break;
1202 case "now":
1203 this.days = 0;
1204 this.now = true;
1205 break;
1206 }
1207 };
1208 },
1209 finishExact: function (x) {
1210 x = (x instanceof Array) ? x : [x];
1211 for (var i = 0; i < x.length; i++) {
1212 if (x[i]) {
1213 x[i].call(this);
1214 }
1215 }
1216 var now = new Date();
1217 if ((this.hour || this.minute) && (!this.month && !this.year && !this.day)) {
1218 this.day = now.getDate();
1219 }
1220 if (!this.year) {
1221 this.year = now.getFullYear();
1222 }
1223 if (!this.month && this.month !== 0) {
1224 this.month = now.getMonth();
1225 }
1226 if (!this.day) {
1227 this.day = 1;
1228 }
1229 if (!this.hour) {
1230 this.hour = 0;
1231 }
1232 if (!this.minute) {
1233 this.minute = 0;
1234 }
1235 if (!this.second) {
1236 this.second = 0;
1237 }
1238 if (this.meridian && this.hour) {
1239 if (this.meridian == "p" && this.hour < 12) {
1240 this.hour = this.hour + 12;
1241 } else if (this.meridian == "a" && this.hour == 12) {
1242 this.hour = 0;
1243 }
1244 }
1245 if (this.day > $D.getDaysInMonth(this.year, this.month)) {
1246 throw new RangeError(this.day + " is not a valid value for days.");
1247 }
1248 var r = new Date(this.year, this.month, this.day, this.hour, this.minute, this.second);
1249 if (this.timezone) {
1250 r.set({
1251 timezone: this.timezone
1252 });
1253 } else if (this.timezoneOffset) {
1254 r.set({
1255 timezoneOffset: this.timezoneOffset
1256 });
1257 }
1258 return r;
1259 },
1260 finish: function (x) {
1261 x = (x instanceof Array) ? flattenAndCompact(x) : [x];
1262 if (x.length === 0) {
1263 return null;
1264 }
1265 for (var i = 0; i < x.length; i++) {
1266 if (typeof x[i] == "function") {
1267 x[i].call(this);
1268 }
1269 }
1270 var today = $D.today();
1271 if (this.now && !this.unit && !this.operator) {
1272 return new Date();
1273 } else if (this.now) {
1274 today = new Date();
1275 }
1276 var expression = !!(this.days && this.days !== null || this.orient || this.operator);
1277 var gap, mod, orient;
1278 orient = ((this.orient == "past" || this.operator == "subtract") ? -1 : 1);
1279 if (!this.now && "hour minute second".indexOf(this.unit) != -1) {
1280 today.setTimeToNow();
1281 }
1282 if (this.month || this.month === 0) {
1283 if ("year day hour minute second".indexOf(this.unit) != -1) {
1284 this.value = this.month + 1;
1285 this.month = null;
1286 expression = true;
1287 }
1288 }
1289 if (!expression && this.weekday && !this.day && !this.days) {
1290 var temp = Date[this.weekday]();
1291 this.day = temp.getDate();
1292 if (!this.month) {
1293 this.month = temp.getMonth();
1294 }
1295 this.year = temp.getFullYear();
1296 }
1297 if (expression && this.weekday && this.unit != "month") {
1298 this.unit = "day";
1299 gap = ($D.getDayNumberFromName(this.weekday) - today.getDay());
1300 mod = 7;
1301 this.days = gap ? ((gap + (orient * mod)) % mod) : (orient * mod);
1302 }
1303 if (this.month && this.unit == "day" && this.operator) {
1304 this.value = (this.month + 1);
1305 this.month = null;
1306 }
1307 if (this.value != null && this.month != null && this.year != null) {
1308 this.day = this.value * 1;
1309 }
1310 if (this.month && !this.day && this.value) {
1311 today.set({
1312 day: this.value * 1
1313 });
1314 if (!expression) {
1315 this.day = this.value * 1;
1316 }
1317 }
1318 if (!this.month && this.value && this.unit == "month" && !this.now) {
1319 this.month = this.value;
1320 expression = true;
1321 }
1322 if (expression && (this.month || this.month === 0) && this.unit != "year") {
1323 this.unit = "month";
1324 gap = (this.month - today.getMonth());
1325 mod = 12;
1326 this.months = gap ? ((gap + (orient * mod)) % mod) : (orient * mod);
1327 this.month = null;
1328 }
1329 if (!this.unit) {
1330 this.unit = "day";
1331 }
1332 if (!this.value && this.operator && this.operator !== null && this[this.unit + "s"] && this[this.unit + "s"] !== null) {
1333 this[this.unit + "s"] = this[this.unit + "s"] + ((this.operator == "add") ? 1 : -1) + (this.value || 0) * orient;
1334 } else if (this[this.unit + "s"] == null || this.operator != null) {
1335 if (!this.value) {
1336 this.value = 1;
1337 }
1338 this[this.unit + "s"] = this.value * orient;
1339 }
1340 if (this.meridian && this.hour) {
1341 if (this.meridian == "p" && this.hour < 12) {
1342 this.hour = this.hour + 12;
1343 } else if (this.meridian == "a" && this.hour == 12) {
1344 this.hour = 0;
1345 }
1346 }
1347 if (this.weekday && !this.day && !this.days) {
1348 var temp = Date[this.weekday]();
1349 this.day = temp.getDate();
1350 if (temp.getMonth() !== today.getMonth()) {
1351 this.month = temp.getMonth();
1352 }
1353 }
1354 if ((this.month || this.month === 0) && !this.day) {
1355 this.day = 1;
1356 }
1357 if (!this.orient && !this.operator && this.unit == "week" && this.value && !this.day && !this.month) {
1358 return Date.today().setWeek(this.value);
1359 }
1360 if (expression && this.timezone && this.day && this.days) {
1361 this.day = this.days;
1362 }
1363 return (expression) ? today.add(this) : today.set(this);
1364 }
1365 };
1366 var _ = $D.Parsing.Operators,
1367 g = $D.Grammar,
1368 t = $D.Translator,
1369 _fn;
1370 g.datePartDelimiter = _.rtoken(/^([\s\-\.\,\/\x27]+)/);
1371 g.timePartDelimiter = _.stoken(":");
1372 g.whiteSpace = _.rtoken(/^\s*/);
1373 g.generalDelimiter = _.rtoken(/^(([\s\,]|at|@|on)+)/);
1374 var _C = {};
1375 g.ctoken = function (keys) {
1376 var fn = _C[keys];
1377 if (!fn) {
1378 var c = $C.regexPatterns;
1379 var kx = keys.split(/\s+/),
1380 px = [];
1381 for (var i = 0; i < kx.length; i++) {
1382 px.push(_.replace(_.rtoken(c[kx[i]]), kx[i]));
1383 }
1384 fn = _C[keys] = _.any.apply(null, px);
1385 }
1386 return fn;
1387 };
1388 g.ctoken2 = function (key) {
1389 return _.rtoken($C.regexPatterns[key]);
1390 };
1391 g.h = _.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2]|[1-9])/), t.hour));
1392 g.hh = _.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2])/), t.hour));
1393 g.H = _.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3]|[0-9])/), t.hour));
1394 g.HH = _.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3])/), t.hour));
1395 g.m = _.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/), t.minute));
1396 g.mm = _.cache(_.process(_.rtoken(/^[0-5][0-9]/), t.minute));
1397 g.s = _.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/), t.second));
1398 g.ss = _.cache(_.process(_.rtoken(/^[0-5][0-9]/), t.second));
1399 g.hms = _.cache(_.sequence([g.H, g.m, g.s], g.timePartDelimiter));
1400 g.t = _.cache(_.process(g.ctoken2("shortMeridian"), t.meridian));
1401 g.tt = _.cache(_.process(g.ctoken2("longMeridian"), t.meridian));
1402 g.z = _.cache(_.process(_.rtoken(/^((\+|\-)\s*\d\d\d\d)|((\+|\-)\d\d\:?\d\d)/), t.timezone));
1403 g.zz = _.cache(_.process(_.rtoken(/^((\+|\-)\s*\d\d\d\d)|((\+|\-)\d\d\:?\d\d)/), t.timezone));
1404 g.zzz = _.cache(_.process(g.ctoken2("timezone"), t.timezone));
1405 g.timeSuffix = _.each(_.ignore(g.whiteSpace), _.set([g.tt, g.zzz]));
1406 g.time = _.each(_.optional(_.ignore(_.stoken("T"))), g.hms, g.timeSuffix);
1407 g.d = _.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1]|\d)/), _.optional(g.ctoken2("ordinalSuffix"))), t.day));
1408 g.dd = _.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1])/), _.optional(g.ctoken2("ordinalSuffix"))), t.day));
1409 g.ddd = g.dddd = _.cache(_.process(g.ctoken("sun mon tue wed thu fri sat"), function (s) {
1410 return function () {
1411 this.weekday = s;
1412 };
1413 }));
1414 g.M = _.cache(_.process(_.rtoken(/^(1[0-2]|0\d|\d)/), t.month));
1415 g.MM = _.cache(_.process(_.rtoken(/^(1[0-2]|0\d)/), t.month));
1416 g.MMM = g.MMMM = _.cache(_.process(g.ctoken("jan feb mar apr may jun jul aug sep oct nov dec"), t.month));
1417 g.y = _.cache(_.process(_.rtoken(/^(\d\d?)/), t.year));
1418 g.yy = _.cache(_.process(_.rtoken(/^(\d\d)/), t.year));
1419 g.yyy = _.cache(_.process(_.rtoken(/^(\d\d?\d?\d?)/), t.year));
1420 g.yyyy = _.cache(_.process(_.rtoken(/^(\d\d\d\d)/), t.year));
1421 _fn = function () {
1422 return _.each(_.any.apply(null, arguments), _.not(g.ctoken2("timeContext")));
1423 };
1424 g.day = _fn(g.d, g.dd);
1425 g.month = _fn(g.M, g.MMM);
1426 g.year = _fn(g.yyyy, g.yy);
1427 g.orientation = _.process(g.ctoken("past future"), function (s) {
1428 return function () {
1429 this.orient = s;
1430 };
1431 });
1432 g.operator = _.process(g.ctoken("add subtract"), function (s) {
1433 return function () {
1434 this.operator = s;
1435 };
1436 });
1437 g.rday = _.process(g.ctoken("yesterday tomorrow today now"), t.rday);
1438 g.unit = _.process(g.ctoken("second minute hour day week month year"), function (s) {
1439 return function () {
1440 this.unit = s;
1441 };
1442 });
1443 g.value = _.process(_.rtoken(/^\d\d?(st|nd|rd|th)?/), function (s) {
1444 return function () {
1445 this.value = s.replace(/\D/g, "");
1446 };
1447 });
1448 g.expression = _.set([g.rday, g.operator, g.value, g.unit, g.orientation, g.ddd, g.MMM]);
1449 _fn = function () {
1450 return _.set(arguments, g.datePartDelimiter);
1451 };
1452 g.mdy = _fn(g.ddd, g.month, g.day, g.year);
1453 g.ymd = _fn(g.ddd, g.year, g.month, g.day);
1454 g.dmy = _fn(g.ddd, g.day, g.month, g.year);
1455 g.date = function (s) {
1456 return ((g[$C.dateElementOrder] || g.mdy).call(this, s));
1457 };
1458 g.format = _.process(_.many(_.any(_.process(_.rtoken(/^(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?)/), function (fmt) {
1459 if (g[fmt]) {
1460 return g[fmt];
1461 } else {
1462 throw $D.Parsing.Exception(fmt);
1463 }
1464 }), _.process(_.rtoken(/^[^dMyhHmstz]+/), function (s) {
1465 return _.ignore(_.stoken(s));
1466 }))), function (rules) {
1467 return _.process(_.each.apply(null, rules), t.finishExact);
1468 });
1469 var _F = {};
1470 var _get = function (f) {
1471 return _F[f] = (_F[f] || g.format(f)[0]);
1472 };
1473 g.formats = function (fx) {
1474 if (fx instanceof Array) {
1475 var rx = [];
1476 for (var i = 0; i < fx.length; i++) {
1477 rx.push(_get(fx[i]));
1478 }
1479 return _.any.apply(null, rx);
1480 } else {
1481 return _get(fx);
1482 }
1483 };
1484 g._formats = g.formats(["\"yyyy-MM-ddTHH:mm:ssZ\"", "yyyy-MM-ddTHH:mm:ssZ", "yyyy-MM-ddTHH:mm:ssz", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mmZ", "yyyy-MM-ddTHH:mmz", "yyyy-MM-ddTHH:mm", "ddd, MMM dd, yyyy H:mm:ss tt", "ddd MMM d yyyy HH:mm:ss zzz", "MMddyyyy", "ddMMyyyy", "Mddyyyy", "ddMyyyy", "Mdyyyy", "dMyyyy", "yyyy", "Mdyy", "dMyy", "d"]);
1485 g._start = _.process(_.set([g.date, g.time, g.expression], g.generalDelimiter, g.whiteSpace), t.finish);
1486 g.start = function (s) {
1487 try {
1488 var r = g._formats.call({}, s);
1489 if (r[1].length === 0) {
1490 return r;
1491 }
1492 } catch (e) {}
1493 return g._start.call({}, s);
1494 };
1495 $D._parse = $D.parse;
1496 $D.parse = function (s) {
1497 var r = null;
1498 if (!s) {
1499 return null;
1500 }
1501 if (s instanceof Date) {
1502 return s;
1503 }
1504 try {
1505 r = $D.Grammar.start.call({}, s.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1"));
1506 } catch (e) {
1507 return null;
1508 }
1509 return ((r[1].length === 0) ? r[0] : null);
1510 };
1511 $D.getParseFunction = function (fx) {
1512 var fn = $D.Grammar.formats(fx);
1513 return function (s) {
1514 var r = null;
1515 try {
1516 r = fn.call({}, s);
1517 } catch (e) {
1518 return null;
1519 }
1520 return ((r[1].length === 0) ? r[0] : null);
1521 };
1522 };
1523 $D.parseExact = function (s, fx) {
1524 return $D.getParseFunction(fx)(s);
1525 };
1526 }());
1527
1528 // module.exports = {
1529 // Date:Date
1530 // }
1531
1532 module.exports = Date;
...\ No newline at end of file ...\ No newline at end of file
1 // 正在表达式
2 export const REGEXPS = {
3 "mobile": /^1\d{10}$/
4 }
5
6 // 验证手机
7 export function checkMobile(str) {
8 return REGEXPS.mobile.test(str);
9 }
10
11 /**
12 * 链接参数转换为obj
13 * 入参 完整链接
14 * @param {*} url
15 */
16 export function param2Obj(url) {
17 const search = url.split('?')[1]
18 if (!search) {
19 return {}
20 }
21 return JSON.parse(
22 '{"' +
23 decodeURIComponent(search)
24 .replace(/"/g, '\\"')
25 .replace(/&/g, '","')
26 .replace(/=/g, '":"') +
27 '"}'
28 )
29 }
30
31
32
33 //获取cookie、
34 export function getCookie(name) {
35 var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
36 if (arr = document.cookie.match(reg))
37 return (arr[2]);
38 else
39 return null;
40 }
41
42 //设置cookie
43 export function setCookie(c_name, value, expiredays) {
44 var exdate = new Date();
45 exdate.setDate(exdate.getDate() + expiredays);
46 document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
47 };
48
49 //删除cookie
50 export function delCookie(name) {
51 var exp = new Date();
52 exp.setTime(exp.getTime() - 1);
53 var cval = getCookie(name);
54 if (cval != null)
55 document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
56 };
57
58
59 /**
60 * 获取环境信息
61 * @return {Object} 环境信息对象
62 */
63 export function getEnv() {
64 var nav = window.navigator;
65 var env = {
66 "iphone": false,
67 "ipad": false,
68 "android": false,
69 "pc": false,
70 "ios": false,
71 "ver": "0"
72 };
73
74 var ua = nav.userAgent;
75 var android = ua.match(/(Android)\s+([\d.]+)/);
76 var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
77 var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/);
78 if (ipad) {
79 env.ipad = ipad[1] && true || false;
80 env.ver = ipad[2] && ipad[2].replace(/-/g, ".") || "";
81 env.ios = true;
82 } else if (iphone) {
83 env.iphone = iphone[1] && true || false;
84 env.ver = iphone[2] && iphone[2].replace(/-/g, ".") || "";
85 env.ios = true;
86 } else if (android) {
87 env.android = android[1] && true || false;
88 env.ver = android[2];
89 } else {
90 env.pc = true;
91 }
92
93 return env;
94 }
95
96 /**
97 * 设定页面 title
98 * @param {[type]} title [description]
99 */
100 export function setTitle(title) {
101 if (!title) {
102 return;
103 }
104 document.title = title;
105 // if (ENV.ios && navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1) {
106 // 修复微信端IOS无法修改document.title的情况
107 if (getEnv().ios && (navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1 || navigator.userAgent.toLowerCase().indexOf("alipay") !== -1)) {
108 //修复IOS微信端和支付宝无法修改document.title的情况
109 var $iframe = document.createElement('iframe');
110 $iframe.className = "C-hiddenIframe";
111 $iframe.src = "/" + location.pathname.split('/')[1] + "/favicon.ico";
112 $iframe.style.visibility = 'hidden';
113 $iframe.style.width = '1px';
114 $iframe.style.height = '1px';
115 $iframe.onload = function onIframeLoad() {
116 setTimeout(function () {
117 $iframe.onload = null;
118 onIframeLoad = null;
119 document.body.removeChild($iframe);
120 $iframe = null;
121 }, 0);
122 };
123 document.body.appendChild($iframe);
124 }
125 }
126
127 // 为链接添加参数
128 export function addQuery(url, query) {
129 query = query || {}
130 query = (function (query) {
131 var q = []
132 Object.keys(query).forEach(function (_q) {
133 q.push(_q + '=' + query[_q])
134 })
135 return q.join('&')
136 })(query)
137 if (url.indexOf('?') !== -1) {
138 url += '&' + query
139 } else {
140 url += '?' + query
141 }
142 return url
143 }
144
145
146 /**
147 * 获得当前页面的path
148 * @return {String} 页面path
149 */
150 export function getPath() {
151 var path = window.location.hash;
152 path = path || "#/";
153 path = path === "#/" ? "#/index" : path;
154 path = path.split("?");
155 return path[0];
156 }
157
158 // 获取 url 参数
159 export function getQuery(name) {
160 return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ""])[1].replace(/\+/g, '%20')) || null;
161 }
162
163 /**
164 * 把 \n换行符转换成<br>
165 * 转换后需要用 v-html渲染
166 * 用{{}}会当成字符串把 html渲染出来
167 */
168 export function formatBr(str) {
169 str = str.replace(/\n/g, '<br/>')
170 return str
171 };
172
173
174 /**
175 * @desc 函数防抖
176 * @param func 函数
177 * @param wait 延迟执行毫秒数
178 * @param immediate true 表立即执行,false 表非立即执行
179 */
180 export function debounce(func, wait, immediate) {
181 let timeout;
182
183 return function () {
184 let context = this;
185 let args = arguments;
186
187 if (timeout) clearTimeout(timeout);
188 if (immediate) {
189 var callNow = !timeout;
190 timeout = setTimeout(() => {
191 timeout = null;
192 }, wait)
193 if (callNow) func.apply(context, args)
194 } else {
195 timeout = setTimeout(function () {
196 func.apply(context, args)
197 }, wait);
198 }
199 }
200 }
201
202 /**
203 * @desc 函数节流
204 * @param func 函数
205 * @param wait 延迟执行毫秒数
206 * @param type 1 表时间戳版,2 表定时器版
207 * 时间戳版的函数触发是在时间段内开始的时候,而定时器版的函数触发是在时间段内结束的时候。
208 */
209 export function throttle(func, wait, type) {
210 if (type === 1) {
211 var previous = 0;
212 } else if (type === 2) {
213 var timeout;
214 }
215 return function () {
216 let context = this;
217 let args = arguments;
218 if (type === 1) {
219 let now = Date.now();
220
221 if (now - previous > wait) {
222 func.apply(context, args);
223 previous = now;
224 }
225 } else if (type === 2) {
226 if (!timeout) {
227 timeout = setTimeout(() => {
228 timeout = null;
229 func.apply(context, args)
230 }, wait)
231 }
232 }
233 }
234 }
...\ No newline at end of file ...\ No newline at end of file
1 import wx from 'weixin-js-sdk';
2
3 wx.ready(function () { //通过ready接口处理成功验证
4 // config信息验证成功后会执行ready方法
5 wx.onMenuShareAppMessage({ // 分享给朋友 ,在config里面填写需要使用的JS接口列表,然后这个方法才可以用
6 title: '这里是标题', // 分享标题
7 desc: 'This is a test!', // 分享描述
8 link: '链接', // 分享链接
9 imgUrl: '图片', // 分享图标
10 type: '', // 分享类型,music、video或link,不填默认为link
11 dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
12 success: function () {
13 // 用户确认分享后执行的回调函数
14 },
15 cancel: function () {
16 // 用户取消分享后执行的回调函数
17 }
18 });
19 wx.onMenuShareTimeline({ //分享朋友圈
20 title: '标题', // 分享标题
21 link: '链接',
22 imgUrl: '图片', // 分享图标
23 success: function () {
24 // 用户确认分享后执行的回调函数
25 },
26 cancel: function () {
27 // 用户取消分享后执行的回调函数
28 }
29 });
30 });
31 wx.error(function (res) {//通过error接口处理失败验证
32 // config信息验证失败会执行error函数
33 });
34
35
36 wx.config({
37 debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
38 appId: '', // 必填,公众号的唯一标识
39 timestamp: '', // 必填,生成签名的时间戳
40 nonceStr: '', // 必填,生成签名的随机串
41 signature: '',// 必填,签名,见附录1
42 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
43 });
1 const Timestamp = new Date().getTime();
2 const MiniCssExtractPlugin = require('mini-css-extract-plugin');
3 // 打包目录
4 let webpack_public_path = 'dist'
5 if (process.env.NODE_ENV === 'production') {
6 webpack_public_path = process.env.VUE_APP_TITLE
7 }
8 module.exports = {
9 configureWebpack: { // webpack 配置
10 // 修改打包后js文件名
11 output: { // 输出重构 打包编译后的 文件名称 【模块名称.版本号.时间戳】
12 filename: `static/js/[name].${Timestamp}.js`,
13 chunkFilename: `static/js/[name].${Timestamp}.js`
14 },
15 // 修改打包后css文件名
16 plugins: [
17 new MiniCssExtractPlugin({
18 filename: `static/css/[name].${Timestamp}.css`,
19 chunkFilename: `static/css/[name].${Timestamp}.css`
20 })
21 ]
22 },
23 // 修改打包后img文件名
24 // chainWebpack: config => {
25 // config.module
26 // .rule('images')
27 // .use('url-loader')
28 // .tap(options => {
29 // return {
30 // limit: 4096,
31 // fallback: {
32 // loader: 'file-loader',
33 // options: {
34 // name: `img/[name].${Timestamp}.[ext]`
35 // }
36 // }
37 // };
38 // })
39 // },
40 // 部署生产环境和开发环境下的URL。
41 // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
42 //例如 https://www.my-app.com/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.my-app.com/my-app/,则设置 baseUrl 为 /my-app/。
43 //baseUrl 从 Vue CLI 3.3 起已弃用,请使用publicPath
44 //baseUrl: process.env.NODE_ENV === "production" ? "./" : "/",
45 publicPath: process.env.NODE_ENV === "dev" ? "/" : "./",
46
47 // outputDir: 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)
48 outputDir: webpack_public_path,
49 //用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
50 assetsDir: "assets",
51 //指定生成的 index.html 的输出路径 (打包之后,改变系统默认的index.html的文件名)
52 // indexPath: "myIndex.html",
53 //默认情况下,生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存。你可以通过将这个选项设为 false 来关闭文件名哈希。(false的时候就是让原来的文件名不改变)
54 filenameHashing: false,
55
56 // lintOnSave:{ type:Boolean default:true } 问你是否使用eslint
57 lintOnSave: true,
58 //如果你想要在生产构建时禁用 eslint-loader,你可以用如下配置
59 // lintOnSave: process.env.NODE_ENV !== 'production',
60
61 //是否使用包含运行时编译器的 Vue 构建版本。设置为 true 后你就可以在 Vue 组件中使用 template 选项了,但是这会让你的应用额外增加 10kb 左右。(默认false)
62 // runtimeCompiler: false,
63
64 /**
65 * 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
66 * 打包之后发现map文件过大,项目文件体积很大,设置为false就可以不输出map文件
67 * map文件的作用在于:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得知是哪里的代码报错。
68 * 有了map就可以像未加密的代码一样,准确的输出是哪一行哪一列有错。
69 * */
70 productionSourceMap: false,
71
72 // 它支持webPack-dev-server的所有选项
73 devServer: {
74 host: "localhost",
75 port: 9001, // 端口号
76 https: false, // https:{type:Boolean}
77 open: true, //配置自动启动浏览器
78 // proxy: 'http://localhost:4000' // 配置跨域处理,只有一个代理
79 }
80 };
...\ No newline at end of file ...\ No newline at end of file