commit 0131747f90691c5c7c4455170726b13681a617fe Author: 张家训 Date: Wed Aug 19 17:59:00 2026 +0800 Initial commit: freedom-web frontend project diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..2a81884 --- /dev/null +++ b/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "@vue/app" + ] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e69de29 diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..4891343 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,18 @@ +module.exports = { + root: true, + 'extends': [ + 'plugin:vue/essential', + '@vue/standard' + ], + rules: { + // allow async-await + 'generator-star-spacing': 'off', + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'vue/no-parsing-error': [2, { 'x-invalid-end-tag': false }], + 'no-undef': 'off' + }, + parserOptions: { + parser: 'babel-eslint' + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae34079 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +### Node ### +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +.pnp +.pnp.js + +### Build ### +dist/ +coverage/ + +### IDE ### +.idea +*.iml +*.ipr +*.iws +.vscode/ +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### System ### +.DS_Store +Thumbs.db +debug.log + +### Env ### +.env.local +.env.*.local diff --git a/.postcssrc.js b/.postcssrc.js new file mode 100644 index 0000000..961986e --- /dev/null +++ b/.postcssrc.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..07c971f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: stable +script: npm run lint +notifications: + email: false diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7ec88ac --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 iView + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..7bbd2d4 --- /dev/null +++ b/README.en.md @@ -0,0 +1,36 @@ +# freedom-web + +#### Description +十分钟毕设-内部项目 + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md new file mode 100644 index 0000000..9945af9 --- /dev/null +++ b/README.md @@ -0,0 +1,187 @@ +

+ + + +

+ +# iView Admin + +[![](https://img.shields.io/github/release/iview/iview-admin.svg)](https://github.com/iview/iview-admin/releases) +[![](https://img.shields.io/travis/iview/iview-admin.svg?style=flat-square)](https://travis-ci.org/iview/iview-admin) +[![vue](https://img.shields.io/badge/vue-2.5.10-brightgreen.svg?style=flat-square)](https://github.com/vuejs/vue) +[![iview ui](https://img.shields.io/badge/iview-3.0.0-brightgreen.svg?style=flat-square)](https://github.com/iview/iview) +[![npm](https://img.shields.io/npm/l/express.svg)]() + +[更新日志](https://github.com/iview/iview-admin/releases) + +[使用文档](https://lison16.github.io/iview-admin-doc/#/) + +[在线访问](https://admin.iviewui.com/) + +[简化版模板](https://github.com/iview/iview-admin/tree/template) + +[教学视频(26课时)](https://segmentfault.com/ls/1650000016221751?utm_source=banner) + +`注:在线版本会在开发版本新小版本发布后更新到相应版本,所以如果想体验最新版本iview-admin,请clone完整项目代码到本地运行。` + +## Install +```bush +// install dependencies +npm install +``` +## Run +### Development +```bush +npm run dev +``` +### Production(Build) +```bush +npm run build +``` + +## 简介 +  iView admin是基于Vue.js,搭配使用[iView](https://www.iviewui.com) UI组件库形成的一套后台集成解决方案,由TalkingData前端可视化团队部分成员开发维护。iView admin遵守iView设计和开发约定,风格统一,设计考究,并且更多功能在不停开发中。 +如果您想查看iview-admin的更新动态,您可以到[更新日志](https://github.com/iview/iview-admin/releases)查看了解最新更新;如果您是新手,想快速入手iview-admin,您可以到[使用教程](https://github.com/iview/iview-admin/wiki)查看讲解;如果您想在线体验iview-admin,您可以到[在线访问](https://admin.iviewui.com/)体验。如果你只是想要一个清醒爽朗的界面,那你可以下载[简化版模板](https://github.com/iview/iview-admin/tree/template)来做开发。 + +## 功能 + +- 登录/登出 +- 权限管理 + - 列表过滤 + - 权限切换 +- 多语言切换 +- 组件 + - 富文本编辑器 + - Markdown编辑器 + - 城市级联 + - 图片预览编辑 + - 可拖拽列表 + - 文件上传 + - 数字渐变 + - split-pane +- 表单编辑 + - 文章发布 + - 工作流 +- 表格 + - 可拖拽排序 + - 可编辑表格 + - 行内编辑 + - 单元格编辑 + - 可搜索表格 + - 表格导出数据 + - 导出为Csv文件 + - 导出为Xls文件 + - 表格转图片 +- 错误页面 + - 403页面 + - 404页面 + - 500页面 +- 高级路由 + - 动态路由 + - 带参页面 +- 换肤 +- 收缩侧边栏 +- tag标签导航 +- 面包屑导航 +- 全屏/退出全屏 +- 锁屏 +- 消息中心 +- 个人中心 + +## 文件结构 +```shell +. +├── build 项目构建配置 +├── config 开发相关配置 +├── public 打包所需静态资源 +└── src + ├── api AJAX请求 + └── assets 项目静态资源 + ├── icons 自定义图标资源 + └── images 图片资源 + ├── components 业务组件 + ├── config 项目运行配置 + ├── directive 自定义指令 + ├── libs 封装工具函数 + ├── locale 多语言文件 + ├── mock mock模拟数据 + ├── router 路由配置 + ├── store Vuex配置 + ├── view 页面文件 + └── tests 测试相关 +``` + +## Links + +- [TalkingData](https://github.com/TalkingData) +- [iView](https://github.com/iview/iview) +- [Vue](https://github.com/vuejs/vue) +- [Webpack](https://github.com/webpack/webpack) + +## 效果展示 + +- 响应式布局首页 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/home.gif) + +- 标签导航 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/page-tags.gif) + +- 权限管理 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/access.gif) + +- 可拖拽列表 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/dragable-list.gif) + +- 图片预览编辑 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/image-editor.gif) + +- 文件上传 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/upload.gif) + +- 数字渐变 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/count-to.gif) + +- split-pane +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/split-pane.gif) + +- 文章发布 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/article-publish.gif) + +- 工作流 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/workflow.gif) + +- 可拖拽表格 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/dragable-table.gif) + +- 可编辑表格 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/editable-table.gif) + +- 表格导出数据 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/exportable-table.gif) + +- 表格转图片 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/table2image.gif) + +- 错误页面 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/error-page.gif) + +- 锁屏 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/locking.gif) + +- 可收缩侧边栏 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/sidebarmenu.gif) + +- 主题切换 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/theme.gif) + +- 消息中心 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/message.gif) + +### 💖💖 If you find this project helpful, maybe you can buy me a coffee. 💖💖 +![image](https://github.com/iview/iview-admin/raw/dev/github-gif/code.png) + + +## License +[MIT](http://opensource.org/licenses/MIT) + +Copyright (c) 2016-present, iView diff --git a/config/env.js b/config/env.js new file mode 100644 index 0000000..e47b814 --- /dev/null +++ b/config/env.js @@ -0,0 +1 @@ +export default 'development' diff --git a/config/url.js b/config/url.js new file mode 100644 index 0000000..c6fdf58 --- /dev/null +++ b/config/url.js @@ -0,0 +1,6 @@ +import env from './env' + +const DEV_URL = 'https://www.easy-mock.com/mock/5add9213ce4d0e69998a6f51/iview-admin/' +const PRO_URL = 'https://produce.com' + +export default env === 'development' ? DEV_URL : PRO_URL diff --git a/cypress.json b/cypress.json new file mode 100644 index 0000000..470c720 --- /dev/null +++ b/cypress.json @@ -0,0 +1,3 @@ +{ + "pluginsFile": "tests/e2e/plugins/index.js" +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8238849 --- /dev/null +++ b/package.json @@ -0,0 +1,78 @@ +{ + "name": "freedom-web", + "version": "3.0.0", + "author": "zhangjiaxun<732128096@qq.com>", + "private": false, + "scripts": { + "dev": "vue-cli-service serve --open", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint", + "test:unit": "vue-cli-service test:unit", + "test:e2e": "vue-cli-service test:e2e" + }, + "dependencies": { + "@riophae/vue-treeselect": "^0.4.0", + "ali-oss": "^6.5.1", + "axios": "^0.18.0", + "clipboard": "^2.0.0", + "codemirror": "^5.38.0", + "countup": "^1.8.2", + "cropperjs": "^1.2.2", + "dayjs": "^1.7.7", + "echarts": "^4.8.0", + "file-saver": "^2.0.2", + "html2canvas": "^1.0.0-alpha.12", + "iview-area": "^1.5.17", + "js-cookie": "^2.2.0", + "jsencrypt": "^3.0.0-rc.1", + "jsrsasign": "^8.0.12", + "mathjs": "^6.6.4", + "qs": "latest", + "simplemde": "^1.11.2", + "sortablejs": "^1.7.0", + "view-design": "^4.5.0", + "vue": "^2.5.10", + "vue-i18n": "^7.8.0", + "vue-quill-editor": "^3.0.6", + "vue-router": "^3.0.1", + "vuedraggable": "^2.16.0", + "vuex": "^3.0.1", + "wangeditor": "^3.1.1", + "xlsx": "^0.13.5" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "^3.0.1", + "@vue/cli-plugin-eslint": "^3.0.1", + "@vue/cli-plugin-unit-mocha": "^3.0.1", + "@vue/cli-service": "^3.0.1", + "@vue/eslint-config-standard": "^3.0.0-beta.10", + "@vue/test-utils": "^1.0.0-beta.10", + "chai": "^4.1.2", + "eslint-plugin-cypress": "^2.0.1", + "less": "^2.7.3", + "less-loader": "^4.0.5", + "lint-staged": "^6.0.0", + "mockjs": "^1.0.1-beta3", + "script-loader": "^0.7.2", + "vue-particles": "^1.0.9", + "vue-template-compiler": "^2.5.13" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ], + "gitHooks": { + "pre-commit": "lint-staged" + }, + "lint-staged": { + "*.js": [ + "vue-cli-service lint", + "git add" + ], + "*.vue": [ + "vue-cli-service lint", + "git add" + ] + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..44254d7 --- /dev/null +++ b/public/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + freedom + + + +
+ + + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..b1cbdae --- /dev/null +++ b/src/App.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/api/code/youth-generator.js b/src/api/code/youth-generator.js new file mode 100644 index 0000000..fa452a5 --- /dev/null +++ b/src/api/code/youth-generator.js @@ -0,0 +1,38 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'system/youth-generator/findListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取table下拉列表 **/ +export const getTableSelectList = (data) => { + return axios.request({ + url: 'system/youth-generator/getTableSelectList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 提交代码生成规则 **/ +export const executeGenerator = (data) => { + return axios.request({ + url: 'system/youth-generator/executeGenerator', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + diff --git a/src/api/data.js b/src/api/data.js new file mode 100644 index 0000000..9ba95be --- /dev/null +++ b/src/api/data.js @@ -0,0 +1,30 @@ +import axios from '@/libs/api.request' + +export const getTableData = () => { + return axios.request({ + url: 'get_table_data', + method: 'get' + }) +} + +export const getDragList = () => { + return axios.request({ + url: 'get_drag_list', + method: 'get' + }) +} + +export const errorReq = () => { + return axios.request({ + url: 'error_url', + method: 'post' + }) +} + +export const saveErrorLogger = info => { + return axios.request({ + url: 'save_error_logger', + data: info, + method: 'post' + }) +} diff --git a/src/api/kpi/kpi-quota-item.js b/src/api/kpi/kpi-quota-item.js new file mode 100644 index 0000000..1e2a7c4 --- /dev/null +++ b/src/api/kpi/kpi-quota-item.js @@ -0,0 +1,62 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取列表 **/ +export const getItemDataList = (data) => { + return axios.request({ + url: 'system/kpi-quota-item/findListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增 **/ +export const addItem = (data) => { + return axios.request({ + url: 'system/kpi-quota-item/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新 **/ +export const updateItem = (data) => { + return axios.request({ + url: 'system/kpi-quota-item/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除 **/ +export const removeItem = (data) => { + return axios.request({ + url: 'system/kpi-quota-item/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取列表 **/ +export const getKpiQuotaItemList = (data) => { + return axios.request({ + url: 'system/kpi-quota-item/getKpiQuotaItemList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} diff --git a/src/api/kpi/kpi-quota-library.js b/src/api/kpi/kpi-quota-library.js new file mode 100644 index 0000000..f357a0b --- /dev/null +++ b/src/api/kpi/kpi-quota-library.js @@ -0,0 +1,94 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'system/kpi-quota-library/findListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增 **/ +export const add = (data) => { + return axios.request({ + url: 'system/kpi-quota-library/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新 **/ +export const update = (data) => { + return axios.request({ + url: 'system/kpi-quota-library/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除 **/ +export const remove = (data) => { + return axios.request({ + url: 'system/kpi-quota-library/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取考核规则树 **/ +export const getLibraryTreeList = () => { + return axios.request({ + url: 'system/kpi-quota-library/getLibraryTreeList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 获取考核规则树 **/ +export const getQuotaTransferList = () => { + return axios.request({ + url: 'system/kpi-quota-library/getQuotaTransferList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 统计指标累计使用情况 **/ +export const getQuotaCountList = () => { + return axios.request({ + url: 'system/kpi-quota-library/getQuotaCountList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 统计Home累计使用情况 **/ +export const getHomeInfoCountList = () => { + return axios.request({ + url: 'system/kpi-quota-library/getHomeInfoCountList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} diff --git a/src/api/kpi/kpi-quota-record.js b/src/api/kpi/kpi-quota-record.js new file mode 100644 index 0000000..89855bf --- /dev/null +++ b/src/api/kpi/kpi-quota-record.js @@ -0,0 +1,50 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'system/kpi-quota-record/findListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增 **/ +export const add = (data) => { + return axios.request({ + url: 'system/kpi-quota-record/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新 **/ +export const update = (data) => { + return axios.request({ + url: 'system/kpi-quota-record/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除 **/ +export const remove = (data) => { + return axios.request({ + url: 'system/kpi-quota-record/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} diff --git a/src/api/kpi/kpi-staff.js b/src/api/kpi/kpi-staff.js new file mode 100644 index 0000000..0a68a36 --- /dev/null +++ b/src/api/kpi/kpi-staff.js @@ -0,0 +1,73 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取人员列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'system/kpi-staff/findListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增人员 **/ +export const add = (data) => { + return axios.request({ + url: 'system/kpi-staff/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新人员 **/ +export const update = (data) => { + return axios.request({ + url: 'system/kpi-staff/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除人员 **/ +export const remove = (data) => { + return axios.request({ + url: 'system/kpi-staff/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取当前staff信息 **/ +export const getStaffInfo = () => { + return axios.request({ + url: 'system/kpi-staff/getStaffInfo', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 获取staff下拉列表 **/ +export const getStaffSelectList = () => { + return axios.request({ + url: 'system/kpi-staff/getStaffSelectList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + diff --git a/src/api/kpi/kpi-template-item.js b/src/api/kpi/kpi-template-item.js new file mode 100644 index 0000000..8082d89 --- /dev/null +++ b/src/api/kpi/kpi-template-item.js @@ -0,0 +1,62 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'system/kpi-template-item/findListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增 **/ +export const add = (data) => { + return axios.request({ + url: 'system/kpi-template-item/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新 **/ +export const update = (data) => { + return axios.request({ + url: 'system/kpi-template-item/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除 **/ +export const remove = (data) => { + return axios.request({ + url: 'system/kpi-template-item/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取模板配置 **/ +export const getKpiTemplateItemList = (data) => { + return axios.request({ + url: 'system/kpi-template-item/getKpiTemplateItemList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} diff --git a/src/api/kpi/kpi-template-quota.js b/src/api/kpi/kpi-template-quota.js new file mode 100644 index 0000000..e4513cd --- /dev/null +++ b/src/api/kpi/kpi-template-quota.js @@ -0,0 +1,87 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'system/kpi-template-quota/findListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增 **/ +export const add = (data) => { + return axios.request({ + url: 'system/kpi-template-quota/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新 **/ +export const update = (data) => { + return axios.request({ + url: 'system/kpi-template-quota/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除 **/ +export const remove = (data) => { + return axios.request({ + url: 'system/kpi-template-quota/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 根据模板获取指标串 **/ +export const getQuotaIdStrByTemplateId = (data) => { + return axios.request({ + url: 'system/kpi-template-quota/getQuotaIdStrByTemplateId', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 根据模板获取指标串 **/ +export const addBatchData = (data) => { + return axios.request({ + url: 'system/kpi-template-quota/addBatchData', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 修改模板配置 **/ +export const updateBatchData = (data) => { + return axios.request({ + url: 'system/kpi-template-quota/updateBatchData', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + diff --git a/src/api/kpi/kpi-template.js b/src/api/kpi/kpi-template.js new file mode 100644 index 0000000..156f7f6 --- /dev/null +++ b/src/api/kpi/kpi-template.js @@ -0,0 +1,99 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'system/kpi-template/findListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增 **/ +export const add = (data) => { + return axios.request({ + url: 'system/kpi-template/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新 **/ +export const update = (data) => { + return axios.request({ + url: 'system/kpi-template/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除 **/ +export const remove = (data) => { + return axios.request({ + url: 'system/kpi-template/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取考核模板下拉列表 **/ +export const getTemplateSelectList = (data) => { + return axios.request({ + url: 'system/kpi-template/getTemplateSelectList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取模板指标项作为表头及模板统计数据 **/ +export const getTemplateCountListWithPage = (data) => { + return axios.request({ + url: 'system/kpi-template/getTemplateCountListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取统计数据饼形图数据列表 **/ +export const getTemplatePieList = (data) => { + return axios.request({ + url: 'system/kpi-template/getTemplatePieList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取统计数据表格数据列表 **/ +export const getTemplateTableList = (data) => { + return axios.request({ + url: 'system/kpi-template/getTemplateTableList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + diff --git a/src/api/routers.js b/src/api/routers.js new file mode 100644 index 0000000..04a03a9 --- /dev/null +++ b/src/api/routers.js @@ -0,0 +1,11 @@ +import axios from '@/libs/api.request' + +export const getRouterReq = (access) => { + return axios.request({ + url: 'get_router', + params: { + access + }, + method: 'get' + }) +} diff --git a/src/api/sys/sys-dept.js b/src/api/sys/sys-dept.js new file mode 100644 index 0000000..d00b436 --- /dev/null +++ b/src/api/sys/sys-dept.js @@ -0,0 +1,86 @@ +import axios from '@/libs/api.request' +import { getToken } from "@/libs/util" + +/** 获取部门下拉树 **/ +export const getTreeSelectList = () => { + return axios.request({ + url: 'sys-dept/getTreeSelectList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 获取部门树 **/ +export const getTreeList = () => { + return axios.request({ + url: 'sys-dept/getTreeList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 获取一级部门的下拉选择数据 **/ +export const getDeptSelectList = (value) => { + return axios.request({ + url: 'sys-dept/getDeptSelectList', + headers: { + "Authorization": getToken() + }, + data:{ + "menuLevel": value + }, + method: 'post' + }) +} + +/** 获取部门列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'sys-dept/findPageList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增部门 **/ +export const add = (data) => { + return axios.request({ + url: 'sys-dept/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新部门 **/ +export const update = (data) => { + return axios.request({ + url: 'sys-dept/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除部门 **/ +export const remove = (data) => { + return axios.request({ + url: 'sys-dept/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} diff --git a/src/api/sys/sys-permission.js b/src/api/sys/sys-permission.js new file mode 100644 index 0000000..255a053 --- /dev/null +++ b/src/api/sys/sys-permission.js @@ -0,0 +1,97 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取权限下拉树 **/ +export const getTreeSelectList = () => { + return axios.request({ + url: 'sys-permission/getTreeSelectList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 登录成功获取权限列表 **/ +export const getPermissionList = () => { + return axios.request({ + url: 'sys-permission/getPermissionList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 获取权限树 **/ +export const getTreeList = () => { + return axios.request({ + url: 'sys-permission/getTreeList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 获取权限树根据RoleId获取 **/ +export const getTreeListByRoleId = (roleId) => { + return axios.request({ + url: 'sys-permission/getTreeListByRoleId', + headers: { + "Authorization": getToken() + }, + data:{ + roleId: roleId + }, + method: 'post' + }) +} + +/** 获取权限列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'sys-permission/findPageList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增权限 **/ +export const add = (data) => { + return axios.request({ + url: 'sys-permission/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新权限 **/ +export const update = (data) => { + return axios.request({ + url: 'sys-permission/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除权限 **/ +export const remove = (data) => { + return axios.request({ + url: 'sys-permission/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} diff --git a/src/api/sys/sys-role.js b/src/api/sys/sys-role.js new file mode 100644 index 0000000..18c2777 --- /dev/null +++ b/src/api/sys/sys-role.js @@ -0,0 +1,74 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + + +/** 获取角色列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'sys-role/findPageList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增角色 **/ +export const add = (data) => { + return axios.request({ + url: 'sys-role/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新角色 **/ +export const update = (data) => { + return axios.request({ + url: 'sys-role/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除角色 **/ +export const remove = (data) => { + return axios.request({ + url: 'sys-role/delete', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 添加角色菜单关联关系,先删后增 **/ +export const addRolePermission = (data) => { + return axios.request({ + url: 'sys-role/addRolePermission', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 获取角色下拉选择数据 **/ +export const getRoleSelectList = () => { + return axios.request({ + url: 'sys-role/getRoleSelectList', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} diff --git a/src/api/sys/sys-user.js b/src/api/sys/sys-user.js new file mode 100644 index 0000000..d7448f1 --- /dev/null +++ b/src/api/sys/sys-user.js @@ -0,0 +1,132 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + + +/** 用户登录 **/ +export const login = ({ username, password ,ip }) => { + const data = { + username, + password + } + return axios.request({ + url: '/login', + data, + method: 'post' + }) +} + +/** 获取用户信息 **/ +export const getUserInfo = (token) => { + return axios.request({ + url: 'sys-user/getUserInfo', + headers: { + "Authorization": token + }, + method: 'post' + }) +} + +/** 用户登出 **/ +export const logout = (token) => { + return axios.request({ + url: '/logout', + headers: { + "Authorization": token + }, + method: 'post' + }) +} + +/** 获取用户列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'sys-user/findPageList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 新增用户 **/ +export const add = (data) => { + return axios.request({ + url: 'sys-user/add', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新用户 **/ +export const update = (data) => { + return axios.request({ + url: 'sys-user/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 删除用户 **/ +export const remove = (data) => { + return axios.request({ + url: 'sys-user/remove', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 重置用户密码 **/ +export const resetPassword = (data) => { + return axios.request({ + url: 'sys-user/resetPassword', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新用户密码 **/ +export const updatePassword = (data) => { + return axios.request({ + url: 'sys-user/updatePassword', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 下载Excel模板 **/ +export const getExcelTemplate = () => { + return axios.request({ + url: 'sys-user/getExcelTemplate', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} + +/** 获取个人信息 **/ +export const getPersonalInfo = () => { + return axios.request({ + url: 'sys-user/getPersonalInfo', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} diff --git a/src/assets/icons/iconfont.css b/src/assets/icons/iconfont.css new file mode 100644 index 0000000..2f0fb5d --- /dev/null +++ b/src/assets/icons/iconfont.css @@ -0,0 +1,33 @@ + +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1530874958372'); /* IE9*/ + src: url('iconfont.eot?t=1530874958372#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAjEAAsAAAAADmwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZW8UnVY21hcAAAAYAAAACeAAACID1NtZpnbHlmAAACIAAABFoAAAdYtnrc/mhlYWQAAAZ8AAAAMQAAADYR6R6WaGhlYQAABrAAAAAgAAAAJAfdA4tobXR4AAAG0AAAABkAAAAoJ+n//2xvY2EAAAbsAAAAFgAAABYKcgh8bWF4cAAABwQAAAAdAAAAIAEbAG5uYW1lAAAHJAAAAUUAAAJtPlT+fXBvc3QAAAhsAAAAVwAAAG1+6rtfeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/sc4gYGVgYOpk+kMAwNDP4RmfM1gxMjBwMDEwMrMgBUEpLmmMDgwVDx/ytzwv4EhhrmBoRkozAiSAwA2fA1beJzFkTsOwjAQRJ/JB4woKDgGp6NKgaJIuQcVN8lNIsV7jDDOpiFKDWM9Sx7Lu9YsUAGFuIsSwptA1ktuWPyC8+KXPHS+cZVT0iRStNY6622w0aZ51u2+u1VQle3K7kF1K2qO6nAiyqp3Xv9I4X+tv3VZ9ud6Uio0K/piwlF2St7Jc7TWyfO1zlGyWO8oY2xw8vxtdJQ7NjnED8roN6wAAHictVTNbxtFFJ+3u7O7cex1vZ/xx/rbu27cbJzdtdeqg5OapkmBVglJJBwSpAhVtSrBCdEeoDISqBEgvnpBSIWqICGVP6FVKUgoN5RDJaSAVKFy48KRQ+wwayeQFMEhiN3Z997szDz9fu83MwgjtPszfZceQRIqogl0Gs0jBGwJsgKlQ8Z0LaoESgYrmizQZs7McLmsRT8BWpaVVbvqGhrLsWEQIAlOxq6aFmVCxW1QdbBVHSAajy2KhYRIfwCBETP5Vu8p6hYoqVwi3BjrnT0xJdtpib8cFMWoKL7LsxjzFMWEBXhJU4fwUIDtfYHDMeVu6jiVgmDUjD3TCqXj4vqG+7Je0IYAOh2Q4mnhy6lILELaazFVEqPcsRA/Egvl8jJc/mV4RArqxiNEHry7u/spg+gXUQFV0Sx6Dq0TrjKnKrJAZS2q4nqGj92xVa0BfePYSQrsBkXKQAoi/1sH26rMZg23yiDLmn/nzoM7by9YVmJ8Ol+a06wL7QvWyGypMDWe2Pk+EBE4TohIYojnQyLUK2tnisUza5cGDi4GxBDHhUQpIvC8EOn9UKzV5ms16qtZp9Vev311bu7q7fV2y5k1mk6ikIpIUiRVSDjNXl0plL1yXlHyxBWU3oP42OTM5Fh8z8GJw+NpWZckXUYU2QMdUpcOGkaKrz7iVKRVkWcg2uFMJ5LztByFtnsPMYbM9jZkMO49/GS605n2P7pDetsHRrszRJZOp+PXHEju1+mfSO4mQhKrcgJwrKqpVU31X9bvNKCiOp5me5rqNcC0wGyAV92Pq4ZvSSMrBbhOM0A3FAkSeomhsVKkRhW5vvbqIs+EglSgXnn2TV0MO5COBtiJeFCWNA8oCoYUoL/98KNvaDgGv/K6EVpwneeVYIsZDtbGcCyVX2CYCQbIk0kwkbl0MgX5WhqvBPnz556uB5NFHOWYG1sMs3UjwPi8OMLrPn2fnibxEAqQ05NCNXSOEM4lwT8XWRb/GdEEehIIT88CiVDO+nQM1/Np2hoZUWWOLZBJsuZUvf7WU0lUsQDmyxAvxkmD9/ejN+51Me7e69uzbnPm45knLyZ0PdH+K+x912xhvswBUzlfYYAr87gFP8r+6rg8cLCwn4PYbsPRD2cYhF9Ty6c4ANawbYMF4E4t/zP30/+Bu5lhOUXVMlWvYhyR8ue9LYKUA0IajkL1M1IlP0GZ+x+0NXMs2btZwzRIpAymu0cleljWJlH6SNIeVJXyde7fA7/TGzRP7scJn21fFIezIDe44sh1V3EN0/P/EqlcAwZnlRASgL60gwHwzU2jVT7ZXiyVFtuvEJfUNwHXMER6mZUrFHVlpW9pvv9zU0/uTSPuZLllbN70c+yEIt3J/anEEh18bL/R12kJHUcVgs00wv2PTcHf8WnqFFTHiQCH8L03yrKrSywuMczyxuMgry2x7CjDLK0y3d4BnNQjMnttmWHI2qVrj6Pd2BtYZbsvHIb7B37maBAAAHicY2BkYGAA4sCb7Pfj+W2+MnCzMIDA9dRcPxj9////WhYG5gYgl4OBCSQKAED2C7oAAAB4nGNgZGBgbvjfwBDDwvD/PwMDCwMDUAQFcAEAdeEEcXicY2FgYGB+ycDAwvD/PwsDiMaOAV4UAw8AAAAAAAAAAHYBAgEwAZwCGgKKAwYDVAOsAAB4nGNgZGBg4GJIYmBnAAEmMI8LSP4H8xkAE4sBigAAAHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nG3ESQqAMBAEwOksLvHgS3xUlBEDWUgiKr5ewat1KBL0MfTPQEBCQaNBiw49DAbCpWa2ZSxc3c3TwWV3i/UiZ72WdEYZeNM1OM8y2KjP9E70ABXpEngA') format('woff'), + url('iconfont.ttf?t=1530874958372') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg?t=1530874958372#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-bear:before { content: "\e600"; } + +.icon-resize-vertical:before { content: "\e7c3"; } + +.icon-qq:before { content: "\e609"; } + +.icon-frown:before { content: "\e77e"; } + +.icon-meh:before { content: "\e780"; } + +.icon-smile:before { content: "\e783"; } + +.icon-man:before { content: "\e7e2"; } + +.icon-woman:before { content: "\e7e5"; } + diff --git a/src/assets/icons/iconfont.eot b/src/assets/icons/iconfont.eot new file mode 100644 index 0000000..52cc252 Binary files /dev/null and b/src/assets/icons/iconfont.eot differ diff --git a/src/assets/icons/iconfont.svg b/src/assets/icons/iconfont.svg new file mode 100644 index 0000000..bc113a2 --- /dev/null +++ b/src/assets/icons/iconfont.svg @@ -0,0 +1,57 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/iconfont.ttf b/src/assets/icons/iconfont.ttf new file mode 100644 index 0000000..d40bb62 Binary files /dev/null and b/src/assets/icons/iconfont.ttf differ diff --git a/src/assets/icons/iconfont.woff b/src/assets/icons/iconfont.woff new file mode 100644 index 0000000..d05f153 Binary files /dev/null and b/src/assets/icons/iconfont.woff differ diff --git a/src/assets/images/error-page/error-401.svg b/src/assets/images/error-page/error-401.svg new file mode 100644 index 0000000..19e2f9f --- /dev/null +++ b/src/assets/images/error-page/error-401.svg @@ -0,0 +1 @@ +tasting \ No newline at end of file diff --git a/src/assets/images/error-page/error-404.svg b/src/assets/images/error-page/error-404.svg new file mode 100644 index 0000000..77d97f7 --- /dev/null +++ b/src/assets/images/error-page/error-404.svg @@ -0,0 +1 @@ +drone_delivery \ No newline at end of file diff --git a/src/assets/images/error-page/error-500.svg b/src/assets/images/error-page/error-500.svg new file mode 100644 index 0000000..ef72fd3 --- /dev/null +++ b/src/assets/images/error-page/error-500.svg @@ -0,0 +1 @@ +co-working \ No newline at end of file diff --git a/src/assets/images/login-bg.jpg b/src/assets/images/login-bg.jpg new file mode 100644 index 0000000..eaa9797 Binary files /dev/null and b/src/assets/images/login-bg.jpg differ diff --git a/src/assets/images/logo-min.jpg b/src/assets/images/logo-min.jpg new file mode 100644 index 0000000..18abf21 Binary files /dev/null and b/src/assets/images/logo-min.jpg differ diff --git a/src/assets/images/logo.jpg b/src/assets/images/logo.jpg new file mode 100644 index 0000000..11638b3 Binary files /dev/null and b/src/assets/images/logo.jpg differ diff --git a/src/assets/images/talkingdata.png b/src/assets/images/talkingdata.png new file mode 100644 index 0000000..87ad50e Binary files /dev/null and b/src/assets/images/talkingdata.png differ diff --git a/src/assets/my-icons/iconfont.css b/src/assets/my-icons/iconfont.css new file mode 100644 index 0000000..5f82105 --- /dev/null +++ b/src/assets/my-icons/iconfont.css @@ -0,0 +1,29 @@ +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1592808236095'); /* IE9 */ + src: url('iconfont.eot?t=1592808236095#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAATUAAsAAAAAChgAAASHAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDHAqHUIYkATYCJAMQCwoABCAFhG0HSxuZCFFUTcpkPwrctfB50RzGy5/utMt36b43i3M8fO33eu7uBgAVoEIFOD4q4wksq9ikKGyV+sJUs2fd2neEZ83WTuv0RKYn4EFiU2cq8bCqc/nHTk804YR+W/Y7pJyi5K7/cyz1qgTyX+m9Y8/oZQONonVAEYmRwmswH8gUxLPpfE7g5QSajbOD9m6f32CokLcLxHUMBoYBi5JRHxqF+oRDi3ivpzE9p494Z318/LUYQ5K6TN51//TGwfkPP3byUzXAp4Egbc4F/igyFoBCnCd6DnUc1YKlaU4q7VoFGhVXoqllw892qsqRTUXTyGhU/cNLRD1Z0wrscjbzgybxtMMwCWh3UCPBATmkETMgNkHcgEwZ9asiW2+w9RYwOBwWl0qjEh1FH0HBG9RyiG2blASxTLnOcbrchAaut9ztvVRj2s9mb90pTb+aflE9Y4ckLWPGBjeCPX22PBtptzRNny6fPsvmGkFMW2WBRlmlTdmG0CzZNMkUMEASEFrGqVLFmD6VOX3mgJlS7ug01rRpMjR7vyV76V4MBiwh2ChYz5oi6eYhNoUWPpUF6Sw2sICei9VNLUpDaZBGYQEf1S0xQ55IdwByB4sRuf6JuOUZ0+3VNT3SEAaREJauCeCRhkICpSOd6fNP/MXWxID0oZT0I1x/9mTx6j2Vn9KAjYxxws8viPQvc0TOb0z99VXZQZ4D8uvzkoJ0JDB7KI3wDmoqpJCodPQ92dJwkkaaGhLqXZvfWwuLnECe3lZ2WyfSo+Mtg49193FnVGW7GqPVyGNKpnVqJo3MpDYWrUI5PpsOVJyHnLIDJQfKrEtw+Qu9O44wBpQMYIB7ku2qA08ytWpVfz+hq/bfFff/bG17SKO2scwMXC8wfTxSJtpdr/V0TbCf5xz9JbrZDDfqCZWZ7jTpfTmXLkMFeqbSzEzPo8tSmZvrCbrspIU+R2nhKHMhRLvcoIxQN+NwDJwj8JFYmLsxFO6Gj0IQH41F+IXUNQYfY58VH4tFeuDjsHH4+LRhGEMRqfBWQASGXUKl3lLoYgjoUaxXdA91ldBXmM8rTdArSw/yjJSg906e752j3/h5vPG1Aw0A1Y98JOOAfND+RFXLj53tp3Iz/5u3PfmLtX9D9mmZ8r2/ZWWFqlpRTAuPlrSw9BmUFhxRvnLZWspboUl+tcUHS3AxVc2KnSevQLd7Tej6CtcSGvV5kDQYg6zRBLJgF6BOi2Wo12gTms2LPLpFjyYdUZowZyiB0Gk9JO1qkHU6iyzYu1Cn31uo1xkdaHYQPadsMRVxvCtklBz+nTBaLrxq17Fd/0Khzoz45Rb1g6SKcTw4OIXzd1SQNLFH1YQzVY9eOMdbcjXKMsZSOCGr23/V8rhzLEt6pK3lHMZ2CWIo4qAiJ6iSxQremFyNI+//ggS1jCEZfX74PxBRiStHzhw4FUDeaYpCfQ5l7WaN4EwL5ZmtygiWQxFwkUzJMNSQvFGCWGqrokKqdORIxyorqtl2r8v38BxoJp+uRIocJeq03rEjb4qQRP08g2uuLRVheFjHzMUiAAAA') format('woff2'), + url('iconfont.woff?t=1592808236095') format('woff'), + url('iconfont.ttf?t=1592808236095') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1592808236095#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-wodefangjian:before { + content: "\e61a"; +} + +.icon-louceng:before { + content: "\e642"; +} + +.icon-building:before { + content: "\e600"; +} + diff --git a/src/assets/my-icons/iconfont.eot b/src/assets/my-icons/iconfont.eot new file mode 100644 index 0000000..ba0b4f5 Binary files /dev/null and b/src/assets/my-icons/iconfont.eot differ diff --git a/src/assets/my-icons/iconfont.svg b/src/assets/my-icons/iconfont.svg new file mode 100644 index 0000000..fd9809f --- /dev/null +++ b/src/assets/my-icons/iconfont.svg @@ -0,0 +1,35 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/my-icons/iconfont.ttf b/src/assets/my-icons/iconfont.ttf new file mode 100644 index 0000000..f8d2ccf Binary files /dev/null and b/src/assets/my-icons/iconfont.ttf differ diff --git a/src/assets/my-icons/iconfont.woff b/src/assets/my-icons/iconfont.woff new file mode 100644 index 0000000..2531fd2 Binary files /dev/null and b/src/assets/my-icons/iconfont.woff differ diff --git a/src/common/css/weui.min.css b/src/common/css/weui.min.css new file mode 100644 index 0000000..3be1a06 --- /dev/null +++ b/src/common/css/weui.min.css @@ -0,0 +1,5 @@ +/*! + * WeUI v2.1.4 (https://github.com/weui/weui) + * Copyright 2020 Tencent, Inc. + * Licensed under the MIT license + */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{line-height:1.6;font-family:-apple-system-font,Helvetica Neue,sans-serif}*{margin:0;padding:0}a img{border:0}a{text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}input,textarea{caret-color:#07c160}::-webkit-input-placeholder{color:rgba(0,0,0,.3)}[class*=" weui-icon-"],[class^=weui-icon-]{display:inline-block;vertical-align:middle;width:24px;height:24px;-webkit-mask-position:50% 50%;mask-position:50% 50%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%;background-color:currentColor}.weui-icon-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-download{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-info{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-safe-success{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-safe-warn{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success-no-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-waiting{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-waiting-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-warn{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-info-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-cancel{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)}.weui-icon-search{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-clear{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-back{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-delete{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success-no-circle-thin{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-arrow{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-arrow-bold{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-back-arrow{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-back-arrow-thin{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-close{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-close-thin{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-back-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success{color:#07c160}.weui-icon-waiting{color:#10aeff}.weui-icon-warn{color:#fa5151}.weui-icon-info{color:#10aeff}.weui-icon-success-circle,.weui-icon-success-no-circle,.weui-icon-success-no-circle-thin{color:#07c160}.weui-icon-waiting-circle{color:#10aeff}.weui-icon-circle{color:rgba(0,0,0,.3)}.weui-icon-download{color:#07c160}.weui-icon-info-circle{color:rgba(0,0,0,.3)}.weui-icon-safe-success{color:#07c160}.weui-icon-safe-warn{color:#ffbe00}.weui-icon-cancel{color:#fa5151}.weui-icon-search{color:rgba(0,0,0,.5)}.weui-icon-clear{color:rgba(0,0,0,.3)}.weui-icon-clear:active{color:rgba(0,0,0,.5)}.weui-icon-delete.weui-icon_gallery-delete{color:#fff}.weui-icon-arrow,.weui-icon-arrow-bold,.weui-icon-back-arrow,.weui-icon-back-arrow-thin{width:12px}.weui-icon-arrow,.weui-icon-arrow-bold{color:rgba(0,0,0,.3)}.weui-icon-back,.weui-icon-back-arrow,.weui-icon-back-arrow-thin,.weui-icon-back-circle{color:rgba(0,0,0,.9)}.weui-icon_msg{width:64px;height:64px}.weui-icon_msg.weui-icon-warn{color:#fa5151}.weui-icon_msg-primary{width:64px;height:64px}.weui-icon_msg-primary.weui-icon-warn{color:#ffc300}.weui-link{-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-link,.weui-link:visited{color:#576b95}.weui-btn{position:relative;display:block;width:184px;margin-left:auto;margin-right:auto;padding:8px 24px;box-sizing:border-box;font-weight:700;font-size:17px;text-align:center;text-decoration:none;color:#fff;line-height:1.41176471;border-radius:4px;-webkit-tap-highlight-color:rgba(0,0,0,0);overflow:hidden}.weui-btn_block{width:auto}.weui-btn_inline{display:inline-block}.weui-btn_default{color:#06ae56;background-color:#f2f2f2}.weui-btn_default:not(.weui-btn_disabled):visited{color:#06ae56}.weui-btn_default:not(.weui-btn_disabled):active{color:#06ae56;background-color:#d9d9d9}.weui-btn_primary{background-color:#07c160}.weui-btn_primary:not(.weui-btn_disabled):visited{color:#fff}.weui-btn_primary:not(.weui-btn_disabled):active{color:#fff;background-color:#06ad56}.weui-btn_warn{color:#fa5151;background-color:#f2f2f2}.weui-btn_warn:not(.weui-btn_disabled):visited{color:#fa5151}.weui-btn_warn:not(.weui-btn_disabled):active{color:#fa5151;background-color:#d9d9d9}.weui-btn_disabled{color:rgba(0,0,0,.18);background-color:#fafafa}.weui-btn_loading .weui-loading{margin:-.2em .34em 0 0}.weui-btn_loading.weui-btn_primary{color:#fff}.weui-btn_loading.weui-btn_default{background-color:#d9d9d9}.weui-btn_loading.weui-btn_primary{background-color:#06ad56}.weui-btn_loading.weui-btn_warn{background-color:#d9d9d9}.weui-btn_plain-primary{color:#07c160;border:1px solid #1aad19}.weui-btn_plain-primary:not(.weui-btn_plain-disabled):active{color:#06ae56;border-color:#179c16;background-color:rgba(0,0,0,.1)}.weui-btn_plain-primary:after{border-width:0}.weui-btn_plain-default{color:#353535;border:1px solid #353535}.weui-btn_plain-default:not(.weui-btn_plain-disabled):active{color:#323232;border-color:#323232;background-color:rgba(0,0,0,.1)}.weui-btn_plain-default:after{border-width:0}.weui-btn_plain-disabled{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}.weui-btn_cell{position:relative;display:block;margin-left:auto;margin-right:auto;box-sizing:border-box;font-weight:700;font-size:17px;text-align:center;text-decoration:none;color:#fff;line-height:1.41176471;padding:16px;-webkit-tap-highlight-color:rgba(0,0,0,0);overflow:hidden;background-color:#fff}.weui-btn_cell+.weui-btn_cell{margin-top:16px}.weui-btn_cell:active{background-color:#ececec}.weui-btn_cell__icon{display:inline-block;vertical-align:middle;width:24px;height:24px;margin:-.2em .34em 0 0}.weui-btn_cell-default{color:rgba(0,0,0,.9)}.weui-btn_cell-primary{color:#576b95}.weui-btn_cell-warn{color:#fa5151}button.weui-btn,input.weui-btn{border-width:0;outline:0;-webkit-appearance:none}button.weui-btn:focus,input.weui-btn:focus{outline:0}button.weui-btn_inline,button.weui-btn_mini,input.weui-btn_inline,input.weui-btn_mini{width:auto}button.weui-btn_plain-default,button.weui-btn_plain-primary,input.weui-btn_plain-default,input.weui-btn_plain-primary{border-width:1px;background-color:transparent}.weui-btn_mini{display:inline-block;width:auto;padding:0 .75em;line-height:2;font-size:16px}.weui-btn:not(.weui-btn_mini)+.weui-btn:not(.weui-btn_mini){margin-top:16px}.weui-btn.weui-btn_inline+.weui-btn.weui-btn_inline{margin-top:auto;margin-left:16px}.weui-btn-area{margin:48px 16px 8px}.weui-btn-area_inline{display:-webkit-box;display:-webkit-flex;display:flex}.weui-btn-area_inline .weui-btn{margin-top:auto;margin-right:16px;width:100%;-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-btn-area_inline .weui-btn:last-child{margin-right:0}.weui-btn_reset{background:transparent;border:0;padding:0;outline:0}.weui-btn_icon{font-size:0}.weui-btn_icon:active [class*=weui-icon-]{color:rgba(0,0,0,.5)}.weui-cells{margin-top:8px;background-color:#fff;line-height:1.41176471;font-size:17px;overflow:hidden;position:relative}.weui-cells:before{top:0;border-top:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-cells:after,.weui-cells:before{content:" ";position:absolute;left:0;right:0;height:1px;color:rgba(0,0,0,.1);z-index:2}.weui-cells:after{bottom:0;border-bottom:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-cells__title{margin-top:16px;margin-bottom:3px;padding-left:16px;padding-right:16px;color:rgba(0,0,0,.5);font-size:14px;line-height:1.4}.weui-cells__title+.weui-cells{margin-top:0}.weui-cells__tips{margin-top:8px;color:rgba(0,0,0,.5);padding-left:16px;padding-right:16px;font-size:14px;line-height:1.4}.weui-cell{padding:16px;position:relative;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-cell:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:16px;z-index:2}.weui-cell:first-child:before{display:none}.weui-cell_active:active{background-color:#ececec}.weui-cell_primary{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start}.weui-cell__bd{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-cell__ft{text-align:right;color:rgba(0,0,0,.5)}.weui-cell_swiped{display:block;padding:0}.weui-cell_swiped>.weui-cell__bd{position:relative;z-index:1;background-color:#fff}.weui-cell_swiped>.weui-cell__ft{position:absolute;right:0;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:flex;color:#fff}.weui-swiped-btn{display:block;padding:16px 1em;line-height:1.41176471;color:inherit}.weui-swiped-btn_default{background-color:#ededed}.weui-swiped-btn_warn{background-color:#fa5151}.weui-cell_access{-webkit-tap-highlight-color:rgba(0,0,0,0);color:inherit}.weui-cell_access:active{background-color:#ececec}.weui-cell_access .weui-cell__ft{padding-right:22px;position:relative}.weui-cell_access .weui-cell__ft:after{content:" ";width:12px;height:24px;-webkit-mask-position:0 0;mask-position:0 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%;background-color:currentColor;color:rgba(0,0,0,.3);-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);position:absolute;top:50%;right:0;margin-top:-12px}.weui-cell_link{color:#576b95;font-size:17px}.weui-cell_link:first-child:before{display:block}.weui-check__label{-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-check__label:active{background-color:#ececec}.weui-check{position:absolute;left:-9999em}.weui-cells_radio .weui-cell__ft{padding-left:16px;font-size:0}.weui-cells_radio .weui-check+.weui-icon-checked{min-width:16px;color:transparent}.weui-cells_radio .weui-check:checked+.weui-icon-checked{color:#07c160;-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-cells_checkbox .weui-check__label:before{left:55px}.weui-cells_checkbox .weui-cell__hd{padding-right:16px;font-size:0}.weui-cells_checkbox .weui-icon-checked{color:rgba(0,0,0,.3);-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E)}.weui-cells_checkbox .weui-check:checked+.weui-icon-checked{color:#07c160;-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E)}.weui-label{display:block;width:105px;word-wrap:break-word;word-break:break-all}.weui-input{width:100%;border:0;outline:0;-webkit-appearance:none;background-color:transparent;font-size:inherit;color:inherit;height:1.41176471em;line-height:1.41176471}.weui-input::-webkit-inner-spin-button,.weui-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.weui-input:focus:not(:placeholder-shown)+.weui-btn_input-clear{display:inline}.weui-textarea{display:block;border:0;resize:none;background:transparent;width:100%;color:inherit;font-size:1em;line-height:inherit;outline:0}.weui-textarea-counter{color:rgba(0,0,0,.3);text-align:right;font-size:14px}.weui-cell_warn .weui-textarea-counter{color:#fa5151}.weui-toptips{display:none;position:fixed;-webkit-transform:translateZ(0);transform:translateZ(0);top:8px;left:8px;right:8px;padding:10px;border-radius:8px;font-size:14px;text-align:center;color:#fff;z-index:5000;word-wrap:break-word;word-break:break-all}.weui-toptips_warn{background-color:#fa5151}.weui-cells_form .weui-cell_disabled:active,.weui-cells_form .weui-cell_readonly:active,.weui-cells_form .weui-cell_switch:active,.weui-cells_form .weui-cell_vcode:active{background-color:transparent}.weui-cells_form .weui-cell__ft{font-size:0}.weui-cells_form .weui-icon-warn{display:none}.weui-cells_form input,.weui-cells_form label[for],.weui-cells_form textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-cell_warn{color:#fa5151}.weui-cell_warn .weui-icon-warn{display:inline-block}.weui-cell_disabled .weui-input:disabled,.weui-cell_disabled .weui-textarea:disabled,.weui-cell_readonly .weui-input:disabled,.weui-cell_readonly .weui-textarea:disabled{opacity:1;-webkit-text-fill-color:rgba(0,0,0,.5)}.weui-cell_disabled .weui-input[disabled],.weui-cell_disabled .weui-input[readonly],.weui-cell_disabled .weui-textarea[disabled],.weui-cell_disabled .weui-textarea[readonly],.weui-cell_readonly .weui-input[disabled],.weui-cell_readonly .weui-input[readonly],.weui-cell_readonly .weui-textarea[disabled],.weui-cell_readonly .weui-textarea[readonly]{color:rgba(0,0,0,.5)}.weui-btn_input-clear{display:none;padding-left:8px}.weui-btn_input-clear [class*=weui-icon-]{width:18px}.weui-form-preview{position:relative;background-color:#fff}.weui-form-preview:before{top:0;border-top:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-form-preview:after,.weui-form-preview:before{content:" ";position:absolute;left:0;right:0;height:1px;color:rgba(0,0,0,.1)}.weui-form-preview:after{bottom:0;border-bottom:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-form-preview__hd{position:relative;padding:16px;text-align:right;line-height:2.5em}.weui-form-preview__hd:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:16px}.weui-form-preview__hd .weui-form-preview__value{font-style:normal;font-size:1.6em}.weui-form-preview__bd{padding:16px;font-size:.9em;text-align:right;color:rgba(0,0,0,.5);line-height:2}.weui-form-preview__ft{position:relative;line-height:50px;display:-webkit-box;display:-webkit-flex;display:flex}.weui-form-preview__ft:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-form-preview__item{overflow:hidden}.weui-form-preview__label{float:left;margin-right:1em;min-width:4em;color:rgba(0,0,0,.5);text-align:justify;text-align-last:justify}.weui-form-preview__value{display:block;overflow:hidden;word-break:normal;word-wrap:break-word;color:rgba(0,0,0,.9)}.weui-form-preview__btn{position:relative;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#576b95;text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}button.weui-form-preview__btn{background-color:transparent;border:0;outline:0;line-height:inherit;font-size:inherit}.weui-form-preview__btn:active{background-color:#ececec}.weui-form-preview__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-form-preview__btn:first-child:after{display:none}.weui-form-preview__btn_default{color:rgba(0,0,0,.9)}.weui-form-preview__btn_primary{color:#576b95}.weui-cell_select{padding:0}.weui-cell_select .weui-select{padding-right:30px}.weui-cell_select .weui-cell__bd:after{content:" ";width:12px;height:24px;-webkit-mask-position:0 0;mask-position:0 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%;background-color:currentColor;color:rgba(0,0,0,.3);-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);position:absolute;top:50%;right:16px;margin-top:-12px}.weui-select{-webkit-appearance:none;border:0;outline:0;background-color:transparent;width:100%;font-size:inherit;height:56px;line-height:56px;position:relative;z-index:1;padding-left:16px}.weui-cell_select-before{padding-right:16px}.weui-cell_select-before .weui-select{width:105px;box-sizing:border-box}.weui-cell_select-before .weui-cell__hd{position:relative}.weui-cell_select-before .weui-cell__hd:after{content:" ";position:absolute;right:0;top:0;width:1px;bottom:0;border-right:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-cell_select-before .weui-cell__hd:before{content:" ";width:12px;height:24px;-webkit-mask-position:0 0;mask-position:0 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%;background-color:currentColor;color:rgba(0,0,0,.3);-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);position:absolute;top:50%;right:16px;margin-top:-12px}.weui-cell_select-before .weui-cell__bd{padding-left:16px}.weui-cell_select-before .weui-cell__bd:after{display:none}.weui-cell_select-before.weui-cell_access .weui-cell__hd{line-height:56px;padding-left:32px}.weui-cell_select-after{padding-left:16px}.weui-cell_select-after .weui-select{padding-left:0}.weui-cell_select-after.weui-cell_access .weui-cell__bd{line-height:56px}.weui-cell_vcode{padding-top:0;padding-right:0;padding-bottom:0}.weui-vcode-btn,.weui-vcode-img{margin-left:5px;height:56px;vertical-align:middle}.weui-vcode-btn{display:inline-block;padding:0 .6em 0 .7em;line-height:56px;font-size:17px;color:#576b95;position:relative}.weui-vcode-btn:before{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}button.weui-vcode-btn{background-color:transparent;border:0;outline:0}.weui-vcode-btn:active{color:#767676}.weui-gallery{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000;z-index:1000}.weui-gallery__img,.weui-gallery__opr{position:absolute;left:0;left:constant(safe-area-inset-left);left:env(safe-area-inset-left);right:0;right:constant(safe-area-inset-right);right:env(safe-area-inset-right)}.weui-gallery__img{top:0;top:constant(safe-area-inset-top);top:env(safe-area-inset-top);bottom:60px;bottom:calc(60px + constant(safe-area-inset-bottom));bottom:calc(60px + env(safe-area-inset-bottom));width:100%;background:50% no-repeat;background-size:contain}.weui-gallery__opr{position:absolute;bottom:0;bottom:constant(safe-area-inset-bottom);bottom:env(safe-area-inset-bottom);background-color:#0d0d0d;color:#fff;line-height:60px;text-align:center}.weui-gallery__del{display:block}.weui-cell_switch{padding-top:12px;padding-bottom:12px}.weui-switch{-webkit-appearance:none;appearance:none}.weui-switch,.weui-switch-cp__box{position:relative;width:52px;height:32px;border:2px solid rgba(0,0,0,.1);outline:0;border-radius:16px;box-sizing:border-box;background-color:#fff;-webkit-transition:background-color .1s,border .1s;transition:background-color .1s,border .1s}.weui-switch-cp__box:before,.weui-switch:before{content:" ";position:absolute;top:0;left:0;bottom:0;right:0;border-radius:15px;background-color:#fdfdfd;-webkit-transition:-webkit-transform .35s cubic-bezier(.45,1,.4,1);transition:-webkit-transform .35s cubic-bezier(.45,1,.4,1);transition:transform .35s cubic-bezier(.45,1,.4,1);transition:transform .35s cubic-bezier(.45,1,.4,1),-webkit-transform .35s cubic-bezier(.45,1,.4,1)}.weui-switch-cp__box:after,.weui-switch:after{content:" ";position:absolute;top:0;left:0;width:28px;height:28px;border-radius:15px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);-webkit-transition:-webkit-transform .35s cubic-bezier(.4,.4,.25,1.35);transition:-webkit-transform .35s cubic-bezier(.4,.4,.25,1.35);transition:transform .35s cubic-bezier(.4,.4,.25,1.35);transition:transform .35s cubic-bezier(.4,.4,.25,1.35),-webkit-transform .35s cubic-bezier(.4,.4,.25,1.35)}.weui-switch-cp__input:checked~.weui-switch-cp__box,.weui-switch:checked{border-color:#07c160;background-color:#07c160}.weui-switch-cp__input:checked~.weui-switch-cp__box:before,.weui-switch:checked:before{-webkit-transform:scale(0);transform:scale(0)}.weui-switch-cp__input:checked~.weui-switch-cp__box:after,.weui-switch:checked:after{-webkit-transform:translateX(20px);transform:translateX(20px)}.weui-switch-cp__input{position:absolute;left:-9999px}.weui-switch-cp__box{display:block}.weui-uploader{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-uploader__hd{display:-webkit-box;display:-webkit-flex;display:flex;padding-bottom:16px;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-uploader__title{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-uploader__info{color:rgba(0,0,0,.3)}.weui-uploader__bd{margin-bottom:-8px;margin-right:-8px;overflow:hidden}.weui-uploader__files{list-style:none}.weui-uploader__file{float:left;margin-right:8px;margin-bottom:8px;width:96px;height:96px;background:no-repeat 50%;background-size:cover}.weui-uploader__file_status{position:relative}.weui-uploader__file_status:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.5)}.weui-uploader__file_status .weui-uploader__file-content{display:block}.weui-uploader__file-content{display:none;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#fff}.weui-uploader__file-content .weui-icon-warn{display:inline-block}.weui-uploader__input-box{float:left;position:relative;margin-right:8px;margin-bottom:8px;width:96px;height:96px;box-sizing:border-box;background-color:#ededed}.weui-uploader__input-box:after,.weui-uploader__input-box:before{content:" ";position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:#a3a3a3}.weui-uploader__input-box:before{width:2px;height:32px}.weui-uploader__input-box:after{width:32px;height:2px}.weui-uploader__input-box:active{border-color:#8b8b8b}.weui-uploader__input-box:active:after,.weui-uploader__input-box:active:before{background-color:#8b8b8b}.weui-uploader__input{position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;opacity:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-msg{padding-top:48px;padding:calc(48px + constant(safe-area-inset-top)) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);padding:calc(48px + env(safe-area-inset-top)) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);text-align:center;line-height:1.4;min-height:100%;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;background-color:#fff}.weui-msg a:not(.weui-btn){color:#576b95;display:inline-block;vertical-align:baseline}.weui-msg__icon-area{margin-bottom:32px}.weui-msg__text-area{margin-bottom:32px;padding:0 32px;-webkit-box-flex:1;-webkit-flex:1;flex:1;line-height:1.6}.weui-msg__text-area:first-child{padding-top:96px}.weui-msg__title{font-weight:700;font-size:22px}.weui-msg__desc,.weui-msg__title{margin-bottom:16px;word-wrap:break-word;word-break:break-all}.weui-msg__desc{font-size:17px;color:rgba(0,0,0,.9)}.weui-msg__desc-primary{font-size:14px;color:rgba(0,0,0,.5);word-wrap:break-word;word-break:break-all;margin-bottom:16px}.weui-msg__opr-area{margin-bottom:16px}.weui-msg__opr-area .weui-btn-area{margin:0}.weui-msg__opr-area .weui-btn+.weui-btn{margin-bottom:16px}.weui-msg__opr-area:last-child{margin-bottom:96px}.weui-msg__opr-area+.weui-msg__extra-area{margin-top:48px}.weui-msg__tips-area{margin-bottom:16px;padding:0 40px}.weui-msg__opr-area+.weui-msg__tips-area{margin-bottom:48px}.weui-msg__tips-area:last-child{margin-bottom:64px}.weui-msg__extra-area,.weui-msg__tips{font-size:12px;color:rgba(0,0,0,.5)}.weui-msg__extra-area{margin-bottom:24px}.weui-msg__extra-area a{color:#576b95}.weui-cells__group_form:first-child .weui-cells__title{margin-top:0}.weui-cells__group_form .weui-cells__title{margin-top:24px;margin-bottom:8px;padding:0 32px}.weui-cells__group_form .weui-cell:before,.weui-cells__group_form .weui-cells:before{left:32px;right:32px}.weui-cells__group_form .weui-cells_checkbox .weui-check__label:before{left:72px}.weui-cells__group_form .weui-cells:after{left:32px;right:32px}.weui-cells__group_form .weui-cell{padding:16px 32px}.weui-cells__group_form .weui-cell:not(.weui-cell_link){color:rgba(0,0,0,.9)}.weui-cells__group_form .weui-cell__hd{padding-right:16px}.weui-cells__group_form .weui-cell__ft{padding-left:16px}.weui-cells__group_form .weui-cell_warn input{color:#fa5151}.weui-cells__group_form .weui-label{max-width:5em;margin-right:8px}.weui-cells__group_form .weui-cells__tips{margin-top:8px;padding:0 32px;color:rgba(0,0,0,.3)}.weui-cells__group_form .weui-cells__tips a{font-weight:700}.weui-cells__group_form .weui-cell_vcode{padding:12px 32px}.weui-cells__group_form .weui-vcode-btn{font-size:16px;padding:0 12px;margin-left:0;height:auto;width:auto;line-height:2em;color:#06ae56;background-color:#f2f2f2}.weui-cells__group_form .weui-vcode-btn:before{display:none}.weui-cells__group_form .weui-cell_select{padding:0}.weui-cells__group_form .weui-cell_select .weui-select{padding:0 32px}.weui-cells__group_form .weui-cell_select .weui-cell__bd:after{right:32px}.weui-cells__group_form .weui-cell_select-before .weui-label{margin-right:24px}.weui-cells__group_form .weui-cell_select-before .weui-select{padding-right:24px;box-sizing:initial}.weui-cells__group_form .weui-cell_select-after{padding-left:32px}.weui-cells__group_form .weui-cell_select-after .weui-select{padding-left:0}.weui-cells__group_form .weui-cell_switch{padding:12px 32px}.weui-form{padding:56px 0 0;padding:calc(56px + constant(safe-area-inset-top)) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);padding:calc(56px + env(safe-area-inset-top)) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;min-height:100%;box-sizing:border-box;line-height:1.4;background-color:#fff}.weui-form .weui-footer,.weui-form .weui-footer__link{font-size:14px}.weui-form .weui-agree{padding:0}.weui-form__text-area{padding:0 32px;color:rgba(0,0,0,.9);text-align:center}.weui-form__control-area{-webkit-box-flex:1;-webkit-flex:1;flex:1;margin:48px 0}.weui-form__tips-area{overflow:hidden}.weui-form__extra-area,.weui-form__tips-area{margin-bottom:24px;text-align:center}.weui-form__opr-area{margin-bottom:64px}.weui-form__opr-area:last-child{margin-bottom:96px}.weui-form__title{font-size:22px;font-weight:700;line-height:1.36}.weui-form__desc{font-size:17px;margin-top:16px}.weui-form__tips{color:rgba(0,0,0,.5);font-size:14px}.weui-form__tips a{color:#576b95}.weui-article{padding:24px 16px;padding:24px calc(16px + constant(safe-area-inset-right)) calc(24px + constant(safe-area-inset-bottom)) calc(16px + constant(safe-area-inset-left));padding:24px calc(16px + env(safe-area-inset-right)) calc(24px + env(safe-area-inset-bottom)) calc(16px + env(safe-area-inset-left));font-size:17px;color:rgba(0,0,0,.9)}.weui-article section{margin-bottom:1.5em}.weui-article h1{font-size:22px;font-weight:700;margin-bottom:.9em;line-height:1.4}.weui-article h2{font-size:17px}.weui-article h2,.weui-article h3{font-weight:700;margin-bottom:.34em;line-height:1.4}.weui-article h3{font-size:15px}.weui-article *{max-width:100%;box-sizing:border-box;word-wrap:break-word}.weui-article p{margin:0 0 .8em}.weui-tabbar{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;z-index:500;background-color:#f7f7f7}.weui-tabbar:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-tabbar__item{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;padding:8px 0;padding-bottom:calc(8px + constant(safe-area-inset-bottom));padding-bottom:calc(8px + env(safe-area-inset-bottom));font-size:0;color:rgba(0,0,0,.5);text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-tabbar__item:first-child{padding-left:constant(safe-area-inset-left);padding-left:env(safe-area-inset-left)}.weui-tabbar__item:last-child{padding-right:constant(safe-area-inset-right);padding-right:env(safe-area-inset-right)}.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon,.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon>i,.weui-tabbar__item.weui-bar__item_on .weui-tabbar__label{color:#07c160}.weui-tabbar__icon{display:inline-block;width:28px;height:28px;margin-bottom:2px}.weui-tabbar__icon>i,i.weui-tabbar__icon{font-size:24px;color:rgba(0,0,0,.5)}.weui-tabbar__icon img{width:100%;height:100%}.weui-tabbar__label{color:rgba(0,0,0,.9);font-size:10px;line-height:1.4}.weui-navbar{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;z-index:500;background-color:#fff;padding-top:constant(safe-area-inset-top);padding-top:env(safe-area-inset-top)}.weui-navbar:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-navbar+.weui-tab__panel{padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)}.weui-navbar__item{position:relative;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;padding:16px 0;padding-top:calc(16px + constant(safe-area-inset-top));padding-top:calc(16px + env(safe-area-inset-top));text-align:center;font-size:17px;line-height:1.41176471;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-navbar__item.weui-bar__item_on,.weui-navbar__item:active{background-color:#ececec}.weui-navbar__item:after{content:" ";position:absolute;right:0;top:0;width:1px;bottom:0;border-right:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-navbar__item:first-child{padding-left:constant(safe-area-inset-left);padding-left:env(safe-area-inset-left)}.weui-navbar__item:last-child{padding-right:constant(safe-area-inset-right);padding-right:env(safe-area-inset-right)}.weui-navbar__item:last-child:after{display:none}.weui-tab{display:-webkit-box;display:-webkit-flex;display:flex;height:100%;box-sizing:border-box;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.weui-tab__panel{box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1;flex:1;overflow:auto;-webkit-overflow-scrolling:touch}.weui-tab__content{display:none}.weui-progress{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-progress__bar{background-color:#ededed;height:3px;-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-progress__inner-bar{width:0;height:100%;background-color:#07c160}.weui-progress__opr{display:block;margin-left:15px;font-size:0}.weui-panel{background-color:#fff;margin-top:10px;position:relative;overflow:hidden}.weui-panel:first-child{margin-top:0}.weui-panel:before{top:0;border-top:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-panel:after,.weui-panel:before{content:" ";position:absolute;left:0;right:0;height:1px;color:rgba(0,0,0,.1)}.weui-panel:after{bottom:0;border-bottom:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-panel__hd{padding:16px 16px 13px;color:rgba(0,0,0,.9);font-size:15px;font-weight:700;position:relative}.weui-panel__hd:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:15px}.weui-media-box{padding:16px;position:relative}.weui-media-box:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:16px}.weui-media-box:first-child:before{display:none}a.weui-media-box{color:#000;-webkit-tap-highlight-color:rgba(0,0,0,0)}a.weui-media-box:active{background-color:#ececec}.weui-media-box__title{font-weight:400;font-size:17px;color:rgba(0,0,0,.9);width:auto;white-space:nowrap;word-wrap:normal;word-wrap:break-word;word-break:break-all}.weui-media-box__desc,.weui-media-box__title{line-height:1.4;overflow:hidden;text-overflow:ellipsis}.weui-media-box__desc{color:rgba(0,0,0,.3);font-size:14px;padding-top:4px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.weui-media-box__info{margin-top:16px;padding-bottom:4px;font-size:13px;color:#cecece;line-height:1em;list-style:none;overflow:hidden}.weui-media-box__info__meta{float:left;padding-right:1em}.weui-media-box__info__meta_extra{padding-left:1em;border-left:1px solid #cecece}.weui-media-box_appmsg{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-media-box_appmsg .weui-media-box__hd{margin-right:16px;width:60px;height:60px;line-height:60px;text-align:center}.weui-media-box_appmsg .weui-media-box__thumb{width:100%;max-height:100%;vertical-align:top}.weui-media-box_appmsg .weui-media-box__bd{-webkit-box-flex:1;-webkit-flex:1;flex:1;min-width:0}.weui-media-box_small-appmsg{padding:0}.weui-media-box_small-appmsg .weui-cells{margin-top:0}.weui-media-box_small-appmsg .weui-cells:before{display:none}.weui-grids{position:relative;overflow:hidden}.weui-grids:before{right:0;height:1px;border-top:1px solid #d9d9d9;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-grids:after,.weui-grids:before{content:" ";position:absolute;left:0;top:0;color:#d9d9d9}.weui-grids:after{width:1px;bottom:0;border-left:1px solid #d9d9d9;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-grid{position:relative;float:left;padding:20px 10px;width:33.33333333%;box-sizing:border-box}.weui-grid:before{top:0;width:1px;border-right:1px solid #d9d9d9;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-grid:after,.weui-grid:before{content:" ";position:absolute;right:0;bottom:0;color:#d9d9d9}.weui-grid:after{left:0;height:1px;border-bottom:1px solid #d9d9d9;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-grid:active{background-color:#ececec}.weui-grid__icon{width:28px;height:28px;margin:0 auto}.weui-grid__icon img{display:block;width:100%;height:100%}.weui-grid__icon+.weui-grid__label{margin-top:4px}.weui-grid__label{display:block;color:rgba(0,0,0,.9);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.weui-footer,.weui-grid__label{text-align:center;font-size:14px}.weui-footer{color:rgba(0,0,0,.3);line-height:1.4}.weui-footer a{color:#576b95}.weui-footer_fixed-bottom{position:fixed;bottom:0;left:0;right:0;padding-top:16px;padding-bottom:16px;padding-bottom:calc(16px + constant(safe-area-inset-bottom));padding-bottom:calc(16px + env(safe-area-inset-bottom));left:constant(safe-area-inset-left);left:env(safe-area-inset-left);right:constant(safe-area-inset-right);right:env(safe-area-inset-right)}.weui-footer__links{font-size:0}.weui-footer__link{display:inline-block;vertical-align:top;margin:0 8px;position:relative;font-size:14px}.weui-footer__link:before{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid #c7c7c7;color:#c7c7c7;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5);left:-8px;top:.36em;bottom:.36em}.weui-footer__link:first-child:before{display:none}.weui-footer__text{padding:0 16px;font-size:12px}.weui-flex{display:-webkit-box;display:-webkit-flex;display:flex}.weui-flex__item{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-dialog{position:fixed;z-index:5000;top:50%;left:16px;right:16px;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#fff;text-align:center;border-radius:12px;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;max-height:90%}.weui-dialog__hd{padding:32px 24px 16px}.weui-dialog__title{font-weight:700;font-size:17px;line-height:1.4}.weui-dialog__bd{overflow-y:auto;-webkit-overflow-scrolling:touch;padding:0 24px;margin-bottom:32px;font-size:17px;line-height:1.4;word-wrap:break-word;-webkit-hyphens:auto;hyphens:auto;color:rgba(0,0,0,.5)}.weui-dialog__bd:first-child{min-height:40px;padding:32px 24px 0;font-weight:700;color:rgba(0,0,0,.9);-webkit-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.weui-dialog__bd:first-child,.weui-dialog__ft{display:-webkit-box;display:-webkit-flex;display:flex}.weui-dialog__ft{position:relative;line-height:56px;min-height:56px;font-size:17px}.weui-dialog__ft:after{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-dialog__btn{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#576b95;font-weight:700;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0);position:relative}.weui-dialog__btn:active{background-color:#ececec}.weui-dialog__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-dialog__btn:first-child:after{display:none}.weui-dialog__btn_default{color:rgba(0,0,0,.9)}.weui-skin_android .weui-dialog{text-align:left;box-shadow:0 6px 30px 0 rgba(0,0,0,.1)}.weui-skin_android .weui-dialog__title{font-size:22px;line-height:1.4}.weui-skin_android .weui-dialog__hd{text-align:left}.weui-skin_android .weui-dialog__bd{color:rgba(0,0,0,.5);text-align:left}.weui-skin_android .weui-dialog__bd:first-child{color:rgba(0,0,0,.9)}.weui-skin_android .weui-dialog__ft{display:block;text-align:right;line-height:40px;min-height:40px;padding:0 24px 16px}.weui-skin_android .weui-dialog__ft:after{display:none}.weui-skin_android .weui-dialog__btn{display:inline-block;vertical-align:top;padding:0 .8em}.weui-skin_android .weui-dialog__btn:after{display:none}.weui-skin_android .weui-dialog__btn:last-child{margin-right:-.8em}.weui-skin_android .weui-dialog__btn_default{color:rgba(0,0,0,.9)}@media screen and (min-width:352px){.weui-dialog{width:320px;margin:0 auto}}.weui-half-screen-dialog{position:fixed;left:0;right:0;bottom:0;max-height:75%;z-index:5000;line-height:1.4;background-color:#fff;border-top-left-radius:12px;border-top-right-radius:12px;overflow:hidden;padding:0 24px;padding:0 calc(24px + constant(safe-area-inset-right)) constant(safe-area-inset-bottom) calc(24px + constant(safe-area-inset-left));padding:0 calc(24px + env(safe-area-inset-right)) env(safe-area-inset-bottom) calc(24px + env(safe-area-inset-left))}.weui-half-screen-dialog__hd{font-size:8px;height:8em;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-half-screen-dialog__hd .weui-icon-btn{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.weui-half-screen-dialog__hd .weui-icon-btn:active{opacity:.5}.weui-half-screen-dialog__hd__side{position:relative;left:-8px}.weui-half-screen-dialog__hd__main{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-half-screen-dialog__hd__side+.weui-half-screen-dialog__hd__main{text-align:center;padding:0 40px}.weui-half-screen-dialog__hd__main+.weui-half-screen-dialog__hd__side{right:-8px;left:auto}.weui-half-screen-dialog__hd__main+.weui-half-screen-dialog__hd__side .weui-icon-btn{right:0}.weui-half-screen-dialog__title{display:block;color:rgba(0,0,0,.9);font-weight:700;font-size:15px}.weui-half-screen-dialog__subtitle{display:block;color:rgba(0,0,0,.5);font-size:10px}.weui-half-screen-dialog__bd{word-wrap:break-word;-webkit-hyphens:auto;hyphens:auto;overflow-y:auto;padding-top:4px;padding-bottom:40px;font-size:14px;color:rgba(0,0,0,.9)}.weui-half-screen-dialog__desc{font-size:17px;font-weight:700;color:rgba(0,0,0,.9);line-height:1.4}.weui-half-screen-dialog__tips{padding-top:16px;font-size:14px;color:rgba(0,0,0,.3);line-height:1.4}.weui-half-screen-dialog__ft{padding:0 24px 32px;text-align:center}.weui-half-screen-dialog__ft .weui-btn:nth-last-child(n+2),.weui-half-screen-dialog__ft .weui-btn:nth-last-child(n+2)~.weui-btn{display:inline-block;vertical-align:top;margin:0 8px;width:120px}.weui-icon-btn{outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0);border-width:0;background-color:transparent;color:rgba(0,0,0,.9);font-size:0}.weui-icon-more{width:24px;-webkit-mask:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M5 10.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5z'/%3E%3C/svg%3E") no-repeat 50% 50%;mask:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M5 10.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5z'/%3E%3C/svg%3E") no-repeat 50% 50%;-webkit-mask-size:cover;mask-size:cover}.weui-icon-btn_goback,.weui-icon-more{display:inline-block;vertical-align:middle;height:24px;background-color:currentColor;color:rgba(0,0,0,.9)}.weui-icon-btn_goback{width:12px;-webkit-mask:url("data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E") no-repeat 50% 50%;mask:url("data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E") no-repeat 50% 50%;-webkit-mask-size:cover;mask-size:cover}.weui-icon-btn_close{color:rgba(0,0,0,.9);display:inline-block;vertical-align:middle;width:12px;height:24px;-webkit-mask:url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E") no-repeat 50% 50%;mask:url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E") no-repeat 50% 50%;-webkit-mask-size:cover;mask-size:cover;background-color:currentColor}.weui-toast{position:fixed;z-index:5000;width:120px;height:120px;top:40%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:hsla(0,0%,7%,.7);text-align:center;border-radius:5px;color:#fff;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.weui-icon_toast{display:block}.weui-icon_toast.weui-icon-success-no-circle{color:#fff;width:55px;height:55px}.weui-icon_toast.weui-loading{margin:8px 0;width:38px;height:38px;vertical-align:baseline}.weui-toast__content{font-size:14px}.weui-mask{background:rgba(0,0,0,.6)}.weui-mask,.weui-mask_transparent{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0}.weui-actionsheet{position:fixed;left:0;bottom:0;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:5000;width:100%;background-color:#eae7e8;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;border-top-left-radius:12px;border-top-right-radius:12px;overflow:hidden}.weui-actionsheet__title{position:relative;height:56px;padding:0 24px;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;text-align:center;font-size:12px;color:rgba(0,0,0,.5);line-height:1.4;background:#fff}.weui-actionsheet__title:before{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-actionsheet__title .weui-actionsheet__title-text{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.weui-actionsheet__menu{color:rgba(0,0,0,.9);background-color:#fff}.weui-actionsheet__action{margin-top:8px;background-color:#fff;padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)}.weui-actionsheet__cell{position:relative;padding:16px;text-align:center;font-size:17px;line-height:1.41176471}.weui-actionsheet__cell:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-actionsheet__cell:active{background-color:#ececec}.weui-actionsheet__cell:first-child:before{display:none}.weui-actionsheet__cell_warn{color:#fa5151}.weui-skin_android .weui-actionsheet{position:fixed;left:50%;top:50%;bottom:auto;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:274px;box-sizing:border-box;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:transparent;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;border-top-left-radius:0;border-top-right-radius:0}.weui-skin_android .weui-actionsheet__action{display:none}.weui-skin_android .weui-actionsheet__menu{border-radius:2px;box-shadow:0 6px 30px 0 rgba(0,0,0,.1)}.weui-skin_android .weui-actionsheet__cell{padding:16px;font-size:17px;line-height:1.41176471;color:rgba(0,0,0,.9);text-align:left}.weui-skin_android .weui-actionsheet__cell:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.weui-skin_android .weui-actionsheet__cell:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.weui-actionsheet_toggle{-webkit-transform:translate(0);transform:translate(0)}.weui-loadmore{width:65%;margin:1.5em auto;line-height:1.6em;font-size:14px;text-align:center}.weui-loadmore__tips{display:inline-block;vertical-align:middle;color:rgba(0,0,0,.9)}.weui-loadmore_line{border-top:1px solid rgba(0,0,0,.1);margin-top:2.4em}.weui-loadmore_line .weui-loadmore__tips{position:relative;top:-.9em;padding:0 .55em;background-color:#fff;color:rgba(0,0,0,.5)}.weui-loadmore_dot .weui-loadmore__tips{padding:0 .16em}.weui-loadmore_dot .weui-loadmore__tips:before{content:" ";width:4px;height:4px;border-radius:50%;background-color:rgba(0,0,0,.1);display:inline-block;position:relative;vertical-align:0;top:-.16em}.weui-badge{display:inline-block;padding:.15em .4em;min-width:8px;border-radius:18px;background-color:#fa5151;color:#fff;line-height:1.2;text-align:center;font-size:12px;vertical-align:middle}.weui-badge_dot{padding:.4em;min-width:0}.weui-search-bar{position:relative;padding:8px;display:-webkit-box;display:-webkit-flex;display:flex;box-sizing:border-box;background-color:#ededed;-webkit-text-size-adjust:100%;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-search-bar.weui-search-bar_focusing .weui-search-bar__cancel-btn{display:block}.weui-search-bar.weui-search-bar_focusing .weui-search-bar__label{display:none}.weui-search-bar .weui-icon-search{width:16px;height:16px}.weui-search-bar__form{position:relative;-webkit-box-flex:1;-webkit-flex:auto;flex:auto;background-color:#fff;border-radius:4px}.weui-search-bar__box{position:relative;padding-left:28px;padding-right:32px;height:100%;width:100%;box-sizing:border-box;z-index:1}.weui-search-bar__box .weui-search-bar__input{padding:8px 0;width:100%;height:1.14285714em;border:0;font-size:14px;line-height:1.14285714em;box-sizing:content-box;background:transparent;caret-color:#07c160}.weui-search-bar__box .weui-search-bar__input:focus{outline:none}.weui-search-bar__box .weui-icon-search{position:absolute;top:50%;left:8px;margin-top:-8px}.weui-search-bar__box .weui-icon-clear{position:absolute;top:50%;right:0;margin-top:-16px;padding:8px;width:16px;height:16px;-webkit-mask-size:16px;mask-size:16px}.weui-search-bar__label{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;font-size:0;border-radius:4px;line-height:32px;text-align:center;color:rgba(0,0,0,.5);background:#fff}.weui-search-bar__label span{display:inline-block;font-size:14px;vertical-align:middle}.weui-search-bar__label .weui-icon-search{margin-right:4px}.weui-search-bar__cancel-btn{display:none;margin-left:8px;line-height:28px;color:#576b95;white-space:nowrap}.weui-search-bar__input:not(:valid)~.weui-icon-clear{display:none}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{display:none}.weui-picker{position:fixed;width:100%;box-sizing:border-box;left:0;bottom:0;z-index:5000;background-color:#fff;padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.weui-picker__hd{display:-webkit-box;display:-webkit-flex;display:flex;padding:16px;padding:16px calc(16px + constant(safe-area-inset-right)) 16px calc(16px + constant(safe-area-inset-left));padding:16px calc(16px + env(safe-area-inset-right)) 16px calc(16px + env(safe-area-inset-left));position:relative;text-align:center;font-size:17px;line-height:1.4}.weui-picker__hd:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-picker__bd{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;background-color:#fff;height:240px;overflow:hidden}.weui-picker__group{-webkit-box-flex:1;-webkit-flex:1;flex:1;position:relative;height:100%}.weui-picker__group:first-child .weui-picker__item{padding-left:constant(safe-area-inset-left);padding-left:env(safe-area-inset-left)}.weui-picker__group:last-child .weui-picker__item{padding-right:constant(safe-area-inset-right);padding-right:env(safe-area-inset-right)}.weui-picker__mask{top:0;height:100%;margin:0 auto;background:-webkit-linear-gradient(top,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),-webkit-linear-gradient(bottom,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background:linear-gradient(180deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),linear-gradient(0deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background-position:top,bottom;background-size:100% 92px;background-repeat:no-repeat;-webkit-transform:translateZ(0);transform:translateZ(0)}.weui-picker__indicator,.weui-picker__mask{position:absolute;left:0;width:100%;z-index:3}.weui-picker__indicator{height:56px;top:92px}.weui-picker__indicator:before{top:0;border-top:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-picker__indicator:after,.weui-picker__indicator:before{content:" ";position:absolute;left:0;right:0;height:1px;color:rgba(0,0,0,.1)}.weui-picker__indicator:after{bottom:0;border-bottom:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-picker__content{position:absolute;top:0;left:0;width:100%}.weui-picker__item{height:48px;line-height:48px;text-align:center;color:rgba(0,0,0,.9);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.weui-picker__item_disabled{color:rgba(0,0,0,.5)}@-webkit-keyframes a{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes a{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.weui-animate-slide-up{-webkit-animation:a ease .3s forwards;animation:a ease .3s forwards}@-webkit-keyframes b{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes b{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.weui-animate-slide-down{-webkit-animation:b ease .3s forwards;animation:b ease .3s forwards}@-webkit-keyframes c{0%{opacity:0}to{opacity:1}}@keyframes c{0%{opacity:0}to{opacity:1}}.weui-animate-fade-in{-webkit-animation:c ease .3s forwards;animation:c ease .3s forwards}@-webkit-keyframes d{0%{opacity:1}to{opacity:0}}@keyframes d{0%{opacity:1}to{opacity:0}}.weui-animate-fade-out{-webkit-animation:d ease .3s forwards;animation:d ease .3s forwards}.weui-agree{display:block;padding:8px 15px 0;font-size:14px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-agree a{color:#576b95}.weui-agree__text{color:rgba(0,0,0,.5);margin-left:2px}.weui-agree__checkbox{-webkit-appearance:none;appearance:none;border:0;outline:0;vertical-align:middle;background-color:currentColor;-webkit-mask-position:0 0;mask-position:0 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);color:rgba(0,0,0,.3);width:1em;height:1em;font-size:17px;margin-top:-.2em}.weui-agree__checkbox:checked{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);color:#07c160}.weui-agree_animate{-webkit-animation:e .3s 1;animation:e .3s 1}@-webkit-keyframes e{0%{-webkit-transform:translateX(0);transform:translateX(0)}16%{-webkit-transform:translateX(-8px);transform:translateX(-8px)}28%{-webkit-transform:translateX(-16px);transform:translateX(-16px)}44%{-webkit-transform:translateX(0);transform:translateX(0)}59%{-webkit-transform:translateX(-16px);transform:translateX(-16px)}73%{-webkit-transform:translateX(0);transform:translateX(0)}82%{-webkit-transform:translateX(16px);transform:translateX(16px)}94%{-webkit-transform:translateX(8px);transform:translateX(8px)}to{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes e{0%{-webkit-transform:translateX(0);transform:translateX(0)}16%{-webkit-transform:translateX(-8px);transform:translateX(-8px)}28%{-webkit-transform:translateX(-16px);transform:translateX(-16px)}44%{-webkit-transform:translateX(0);transform:translateX(0)}59%{-webkit-transform:translateX(-16px);transform:translateX(-16px)}73%{-webkit-transform:translateX(0);transform:translateX(0)}82%{-webkit-transform:translateX(16px);transform:translateX(16px)}94%{-webkit-transform:translateX(8px);transform:translateX(8px)}to{-webkit-transform:translateX(0);transform:translateX(0)}}.weui-loading{width:20px;height:20px;display:inline-block;vertical-align:middle;-webkit-animation:f 1s steps(12) infinite;animation:f 1s steps(12) infinite;background:transparent url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E9E9E9' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23989697' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%239B999A' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23A3A1A2' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23ABA9AA' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23B2B2B2' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23BAB8B9' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23C2C0C1' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23CBCBCB' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23D2D2D2' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23DADADA' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E2E2E2' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E") no-repeat;background-size:100%}.weui-btn_loading.weui-btn_primary .weui-loading,.weui-loading.weui-loading_transparent{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E")}@-webkit-keyframes f{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes f{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.weui-slider{padding:15px 18px;-webkit-user-select:none;user-select:none}.weui-slider__inner{position:relative;height:2px;background-color:rgba(0,0,0,.1)}.weui-slider__track{height:2px;background-color:#07c160;width:0}.weui-slider__handler{position:absolute;left:0;top:50%;width:28px;height:28px;margin-left:-14px;margin-top:-14px;border-radius:50%;background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.2)}.weui-slider-box{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-slider-box .weui-slider{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-slider-box__value{margin-left:.5em;min-width:24px;color:rgba(0,0,0,.5);text-align:center;font-size:14px} \ No newline at end of file diff --git a/src/common/excel/Blob.js b/src/common/excel/Blob.js new file mode 100644 index 0000000..26382cc --- /dev/null +++ b/src/common/excel/Blob.js @@ -0,0 +1,179 @@ +/* eslint-disable */ +/* Blob.js + * A Blob implementation. + * 2014-05-27 + * + * By Eli Grey, http://eligrey.com + * By Devin Samarin, https://github.com/eboyjr + * License: X11/MIT + * See LICENSE.md + */ + +/*global self, unescape */ +/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, + plusplus: true */ + +/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */ + +(function (view) { + "use strict"; + + view.URL = view.URL || view.webkitURL; + + if (view.Blob && view.URL) { + try { + new Blob; + return; + } catch (e) {} + } + + // Internally we use a BlobBuilder implementation to base Blob off of + // in order to support older browsers that only have BlobBuilder + var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) { + var + get_class = function(object) { + return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; + } + , FakeBlobBuilder = function BlobBuilder() { + this.data = []; + } + , FakeBlob = function Blob(data, type, encoding) { + this.data = data; + this.size = data.length; + this.type = type; + this.encoding = encoding; + } + , FBB_proto = FakeBlobBuilder.prototype + , FB_proto = FakeBlob.prototype + , FileReaderSync = view.FileReaderSync + , FileException = function(type) { + this.code = this[this.name = type]; + } + , file_ex_codes = ( + "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " + + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" + ).split(" ") + , file_ex_code = file_ex_codes.length + , real_URL = view.URL || view.webkitURL || view + , real_create_object_URL = real_URL.createObjectURL + , real_revoke_object_URL = real_URL.revokeObjectURL + , URL = real_URL + , btoa = view.btoa + , atob = view.atob + + , ArrayBuffer = view.ArrayBuffer + , Uint8Array = view.Uint8Array + ; + FakeBlob.fake = FB_proto.fake = true; + while (file_ex_code--) { + FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; + } + if (!real_URL.createObjectURL) { + URL = view.URL = {}; + } + URL.createObjectURL = function(blob) { + var + type = blob.type + , data_URI_header + ; + if (type === null) { + type = "application/octet-stream"; + } + if (blob instanceof FakeBlob) { + data_URI_header = "data:" + type; + if (blob.encoding === "base64") { + return data_URI_header + ";base64," + blob.data; + } else if (blob.encoding === "URI") { + return data_URI_header + "," + decodeURIComponent(blob.data); + } if (btoa) { + return data_URI_header + ";base64," + btoa(blob.data); + } else { + return data_URI_header + "," + encodeURIComponent(blob.data); + } + } else if (real_create_object_URL) { + return real_create_object_URL.call(real_URL, blob); + } + }; + URL.revokeObjectURL = function(object_URL) { + if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { + real_revoke_object_URL.call(real_URL, object_URL); + } + }; + FBB_proto.append = function(data/*, endings*/) { + var bb = this.data; + // decode data to a binary string + if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { + var + str = "" + , buf = new Uint8Array(data) + , i = 0 + , buf_len = buf.length + ; + for (; i < buf_len; i++) { + str += String.fromCharCode(buf[i]); + } + bb.push(str); + } else if (get_class(data) === "Blob" || get_class(data) === "File") { + if (FileReaderSync) { + var fr = new FileReaderSync; + bb.push(fr.readAsBinaryString(data)); + } else { + // async FileReader won't work as BlobBuilder is sync + throw new FileException("NOT_READABLE_ERR"); + } + } else if (data instanceof FakeBlob) { + if (data.encoding === "base64" && atob) { + bb.push(atob(data.data)); + } else if (data.encoding === "URI") { + bb.push(decodeURIComponent(data.data)); + } else if (data.encoding === "raw") { + bb.push(data.data); + } + } else { + if (typeof data !== "string") { + data += ""; // convert unsupported types to strings + } + // decode UTF-16 to binary string + bb.push(unescape(encodeURIComponent(data))); + } + }; + FBB_proto.getBlob = function(type) { + if (!arguments.length) { + type = null; + } + return new FakeBlob(this.data.join(""), type, "raw"); + }; + FBB_proto.toString = function() { + return "[object BlobBuilder]"; + }; + FB_proto.slice = function(start, end, type) { + var args = arguments.length; + if (args < 3) { + type = null; + } + return new FakeBlob( + this.data.slice(start, args > 1 ? end : this.data.length) + , type + , this.encoding + ); + }; + FB_proto.toString = function() { + return "[object Blob]"; + }; + FB_proto.close = function() { + this.size = this.data.length = 0; + }; + return FakeBlobBuilder; + }(view)); + + view.Blob = function Blob(blobParts, options) { + var type = options ? (options.type || "") : ""; + var builder = new BlobBuilder(); + if (blobParts) { + for (var i = 0, len = blobParts.length; i < len; i++) { + builder.append(blobParts[i]); + } + } + return builder.getBlob(type); + }; +}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this)); diff --git a/src/common/excel/Export2Excel.js b/src/common/excel/Export2Excel.js new file mode 100644 index 0000000..9147f7a --- /dev/null +++ b/src/common/excel/Export2Excel.js @@ -0,0 +1,163 @@ +/* eslint-disable */ +require('script-loader!file-saver'); +require('./Blob'); +require('script-loader!xlsx/dist/xlsx.core.min'); +function generateArray(table) { + var out = []; + var rows = table.querySelectorAll('tr'); + var ranges = []; + for (var R = 0; R < rows.length; ++R) { + var outRow = []; + var row = rows[R]; + var columns = row.querySelectorAll('td'); + for (var C = 0; C < columns.length; ++C) { + var cell = columns[C]; + var colspan = cell.getAttribute('colspan'); + var rowspan = cell.getAttribute('rowspan'); + var cellValue = cell.innerText; + if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; + + //Skip ranges + ranges.forEach(function (range) { + if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) { + for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null); + } + }); + + //Handle Row Span + if (rowspan || colspan) { + rowspan = rowspan || 1; + colspan = colspan || 1; + ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}}); + } + ; + + //Handle Value + outRow.push(cellValue !== "" ? cellValue : null); + + //Handle Colspan + if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null); + } + out.push(outRow); + } + return [out, ranges]; +}; + +function datenum(v, date1904) { + if (date1904) v += 1462; + var epoch = Date.parse(v); + return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); +} + +function sheet_from_array_of_arrays(data, opts) { + var ws = { + s:{ + "!row" : [{wpx: 67}] + } + }; + ws['!cols']= []; + for(var n = 0; n != data[0].length; ++n){ + var tempCellValue = data[0][n]; + if(tempCellValue != null && tempCellValue.length > 0){ + var tempCellWidth = (tempCellValue.length + 1) * 12; + ws['!cols'].push({ + wpx: tempCellWidth + }); + }else{ + ws['!cols'].push({ + wpx: 50 + }); + } + } + var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}}; + for (var R = 0; R != data.length; ++R) { + for (var C = 0; C != data[R].length; ++C) { + if (range.s.r > R) range.s.r = R; + if (range.s.c > C) range.s.c = C; + if (range.e.r < R) range.e.r = R; + if (range.e.c < C) range.e.c = C; + var cell = { + v : data[R][C], + s:{ + fill: { fgColor: { rgb: "33000000"}}, + alignment: {horizontal: "center" ,vertical: "center"}, + } + }; + if (cell.v == null) continue; + var cell_ref = XLSX.utils.encode_cell({c: C, r: R}); + + if (typeof cell.v === 'number') cell.t = 'n'; + else if (typeof cell.v === 'boolean') cell.t = 'b'; + else if (cell.v instanceof Date) { + cell.t = 'n'; + cell.z = XLSX.SSF._table[14]; + cell.v = datenum(cell.v); + } + else cell.t = 's'; + + ws[cell_ref] = cell; + } + } + if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range); + return ws; +} + +function Workbook() { + if (!(this instanceof Workbook)) return new Workbook(); + this.SheetNames = []; + this.Sheets = {}; +} + +function s2ab(s) { + var buf = new ArrayBuffer(s.length); + var view = new Uint8Array(buf); + for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; + return buf; +} + +export function export_table_to_excel(id) { + var theTable = document.getElementById(id); + var oo = generateArray(theTable); + var ranges = oo[1]; + + /* original data */ + var data = oo[0]; + var ws_name = "SheetJS"; + + var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); + + /* add ranges to worksheet */ + // ws['!cols'] = ['apple', 'banan']; + ws['!merges'] = ranges; + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); + + saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx") +} + +function formatJson(jsonData) { + console.log(jsonData) +} +export function export_json_to_excel(th, jsonData, defaultTitle) { + + /* original data */ + + var data = jsonData; + data.unshift(th); + var ws_name = "SheetJS"; + + var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); + + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); + var title = defaultTitle || '列表' + saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx") +} diff --git a/src/common/js/common.js b/src/common/js/common.js new file mode 100644 index 0000000..d3a73ac --- /dev/null +++ b/src/common/js/common.js @@ -0,0 +1,4 @@ +/** + * @description nginx地址 + */ +export const nginxPath = 'http://47.104.226.229:80' diff --git a/src/common/js/util.js b/src/common/js/util.js new file mode 100644 index 0000000..fd7b02e --- /dev/null +++ b/src/common/js/util.js @@ -0,0 +1,124 @@ +import { export_json_to_excel } from '@/common/excel/Export2Excel' +/** + * 判断内容是否为空 + * @type {{}} + */ +export const utils = { + isEmpty(content) { + if (content == null || content == undefined || content === "" || JSON.stringify(content) == "{}") { + return true + } + return false + } +} + +/** + * 对象的操作 + * @type {{}} + */ +export const objectUtil = { + /** + * 两个对象拼接成一个对象,副对象字段为空的不要 + * @param mainObj 主对象 + * @param obj 副对象 + */ + trimJoin(mainObj, obj) { + var keys = Object.keys(obj) + for (let i = 0; i < keys.length; i++) { + if (!utils.isEmpty(obj[keys[i]])) { + mainObj[keys[i]] = obj[keys[i]] + } + } + return mainObj + }, + /** + * 两个对象拼接成一个对象 + */ + join(mainObj, obj) { + var keys = Object.keys(obj) + for (let i = 0; i < keys.length; i++) { + mainObj[keys[i]] = obj[keys[i]] + } + return mainObj + } +} + + +/** + * 导出Excel + * @param columns 被导出的自定义列 + * @param list 被导出数据 + * @param fileName 被导出Excel名称 + */ +export const exportExcel = (columns, list, fileName) => { + require.ensure([], () => { + let tHeader = [] + let filterVal = [] + columns.forEach(item =>{ + tHeader.push(item.title) + filterVal.push({key: item.key, callback: item.callback}) + }) + const data = list.map(v => { + return filterVal.map(j => { + if (j.callback != undefined) { + return j.callback(v[j.key]) + }else{ + return v[j.key] + } + }) + }) + export_json_to_excel(tHeader, data, fileName) + }) +} + +/** + * 将其格式化为时间 yy-MM-dd hh:mm:ss + * @param 时间戳 + */ +export const formatDate = (date) => { + date = new Date(date) + const yy = date.getFullYear() + let MM = date.getMonth() + 1 + MM = MM < 10 ? '0' + MM : MM + let dd = date.getDate() + dd = dd < 10 ? ('0' + dd) : dd + let hh = date.getHours() + hh = hh < 10 ? ('0' + hh) : hh + let mm = date.getMinutes() + mm = mm < 10 ? ('0' + mm) : mm + let ss = date.getSeconds() + ss = ss < 10 ? ('0' + ss) : ss + return yy + '-' + MM + '-' + dd +' '+ hh + ':' + mm + ':' + ss +} + +/** + * 将其格式化为时间 yy-MM-dd hh:mm:ss + * @param 时间戳 + */ +export const formatDateToYyMMDd = (date) => { + date = new Date(date) + const yy = date.getFullYear() + let MM = date.getMonth() + 1 + MM = MM < 10 ? '0' + MM : MM + let dd = date.getDate() + dd = dd < 10 ? ('0' + dd) : dd + + return yy + '-' + MM + '-' + dd +} + +/** + * 生成UUID的方法 + */ +export const uuid = () => { + let s = []; + let hexDigits = "0123456789abcdef"; + for (let i = 0; i < 36; i++) { + s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); + } + s[14] = "4"; + s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); + s[8] = s[13] = s[18] = s[23] = ""; + + let uuid = s.join(""); + return uuid; +} diff --git a/src/components/charts/bar.vue b/src/components/charts/bar.vue new file mode 100644 index 0000000..b0a2709 --- /dev/null +++ b/src/components/charts/bar.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/components/charts/index.js b/src/components/charts/index.js new file mode 100644 index 0000000..2ca3c91 --- /dev/null +++ b/src/components/charts/index.js @@ -0,0 +1,3 @@ +import ChartPie from './pie.vue' +import ChartBar from './bar.vue' +export { ChartPie, ChartBar } diff --git a/src/components/charts/pie.vue b/src/components/charts/pie.vue new file mode 100644 index 0000000..c86d68c --- /dev/null +++ b/src/components/charts/pie.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/charts/theme.json b/src/components/charts/theme.json new file mode 100644 index 0000000..d3b2ce1 --- /dev/null +++ b/src/components/charts/theme.json @@ -0,0 +1,518 @@ + +{ + "color": [ + "#2ec7c9", + "#b6a2de", + "#5ab1ef", + "#ffb980", + "#d87a80", + "#8d98b3", + "#e5cf0d", + "#97b552", + "#95706d", + "#dc69aa", + "#07a2a4", + "#9a7fd1", + "#588dd5", + "#f5994e", + "#c05050", + "#59678c", + "#c9ab00", + "#7eb00a", + "#6f5553", + "#c14089" + ], + "backgroundColor": "rgba(0,0,0,0)", + "textStyle": {}, + "title": { + "textStyle": { + "color": "#008acd" + }, + "subtextStyle": { + "color": "#aaaaaa" + } + }, + "line": { + "itemStyle": { + "normal": { + "borderWidth": 1 + } + }, + "lineStyle": { + "normal": { + "width": 2 + } + }, + "symbolSize": 3, + "symbol": "emptyCircle", + "smooth": true + }, + "radar": { + "itemStyle": { + "normal": { + "borderWidth": 1 + } + }, + "lineStyle": { + "normal": { + "width": 2 + } + }, + "symbolSize": 3, + "symbol": "emptyCircle", + "smooth": true + }, + "bar": { + "itemStyle": { + "normal": { + "barBorderWidth": 0, + "barBorderColor": "#ccc" + }, + "emphasis": { + "barBorderWidth": 0, + "barBorderColor": "#ccc" + } + } + }, + "pie": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "scatter": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "boxplot": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "parallel": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "sankey": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "funnel": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "gauge": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "candlestick": { + "itemStyle": { + "normal": { + "color": "#d87a80", + "color0": "#2ec7c9", + "borderColor": "#d87a80", + "borderColor0": "#2ec7c9", + "borderWidth": 1 + } + } + }, + "graph": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "lineStyle": { + "normal": { + "width": 1, + "color": "#aaaaaa" + } + }, + "symbolSize": 3, + "symbol": "emptyCircle", + "smooth": true, + "color": [ + "#2ec7c9", + "#b6a2de", + "#5ab1ef", + "#ffb980", + "#d87a80", + "#8d98b3", + "#e5cf0d", + "#97b552", + "#95706d", + "#dc69aa", + "#07a2a4", + "#9a7fd1", + "#588dd5", + "#f5994e", + "#c05050", + "#59678c", + "#c9ab00", + "#7eb00a", + "#6f5553", + "#c14089" + ], + "label": { + "normal": { + "textStyle": { + "color": "#eeeeee" + } + } + } + }, + "map": { + "itemStyle": { + "normal": { + "areaColor": "#dddddd", + "borderColor": "#eeeeee", + "borderWidth": 0.5 + }, + "emphasis": { + "areaColor": "rgba(254,153,78,1)", + "borderColor": "#444", + "borderWidth": 1 + } + }, + "label": { + "normal": { + "textStyle": { + "color": "#d87a80" + } + }, + "emphasis": { + "textStyle": { + "color": "rgb(100,0,0)" + } + } + } + }, + "geo": { + "itemStyle": { + "normal": { + "areaColor": "#dddddd", + "borderColor": "#eeeeee", + "borderWidth": 0.5 + }, + "emphasis": { + "areaColor": "rgba(254,153,78,1)", + "borderColor": "#444", + "borderWidth": 1 + } + }, + "label": { + "normal": { + "textStyle": { + "color": "#d87a80" + } + }, + "emphasis": { + "textStyle": { + "color": "rgb(100,0,0)" + } + } + } + }, + "categoryAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#008acd" + } + }, + "axisTick": { + "show": true, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#333" + } + }, + "splitLine": { + "show": false, + "lineStyle": { + "color": [ + "#eee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.3)", + "rgba(200,200,200,0.3)" + ] + } + } + }, + "valueAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#008acd" + } + }, + "axisTick": { + "show": true, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#333" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eee" + ] + } + }, + "splitArea": { + "show": true, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.3)", + "rgba(200,200,200,0.3)" + ] + } + } + }, + "logAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#008acd" + } + }, + "axisTick": { + "show": true, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#333" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eee" + ] + } + }, + "splitArea": { + "show": true, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.3)", + "rgba(200,200,200,0.3)" + ] + } + } + }, + "timeAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#008acd" + } + }, + "axisTick": { + "show": true, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#333" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.3)", + "rgba(200,200,200,0.3)" + ] + } + } + }, + "toolbox": { + "iconStyle": { + "normal": { + "borderColor": "#2ec7c9" + }, + "emphasis": { + "borderColor": "#18a4a6" + } + } + }, + "legend": { + "textStyle": { + "color": "#333333" + } + }, + "tooltip": { + "axisPointer": { + "lineStyle": { + "color": "#008acd", + "width": "1" + }, + "crossStyle": { + "color": "#008acd", + "width": "1" + } + } + }, + "timeline": { + "lineStyle": { + "color": "#008acd", + "width": 1 + }, + "itemStyle": { + "normal": { + "color": "#008acd", + "borderWidth": 1 + }, + "emphasis": { + "color": "#a9334c" + } + }, + "controlStyle": { + "normal": { + "color": "#008acd", + "borderColor": "#008acd", + "borderWidth": 0.5 + }, + "emphasis": { + "color": "#008acd", + "borderColor": "#008acd", + "borderWidth": 0.5 + } + }, + "checkpointStyle": { + "color": "#2ec7c9", + "borderColor": "rgba(46,199,201,0.4)" + }, + "label": { + "normal": { + "textStyle": { + "color": "#008acd" + } + }, + "emphasis": { + "textStyle": { + "color": "#008acd" + } + } + } + }, + "visualMap": { + "color": [ + "#5ab1ef", + "#e0ffff" + ] + }, + "dataZoom": { + "backgroundColor": "rgba(47,69,84,0)", + "dataBackgroundColor": "rgba(239,239,255,1)", + "fillerColor": "rgba(182,162,222,0.2)", + "handleColor": "#008acd", + "handleSize": "100%", + "textStyle": { + "color": "#333333" + } + }, + "markPoint": { + "label": { + "normal": { + "textStyle": { + "color": "#eeeeee" + } + }, + "emphasis": { + "textStyle": { + "color": "#eeeeee" + } + } + } + } +} diff --git a/src/components/common-icon/common-icon.vue b/src/components/common-icon/common-icon.vue new file mode 100644 index 0000000..768fa1b --- /dev/null +++ b/src/components/common-icon/common-icon.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/common-icon/index.js b/src/components/common-icon/index.js new file mode 100644 index 0000000..1207d15 --- /dev/null +++ b/src/components/common-icon/index.js @@ -0,0 +1,2 @@ +import CommonIcon from './common-icon.vue' +export default CommonIcon diff --git a/src/components/common/common.less b/src/components/common/common.less new file mode 100644 index 0000000..3c3e5b1 --- /dev/null +++ b/src/components/common/common.less @@ -0,0 +1,8 @@ +.no-select{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/src/components/common/util.js b/src/components/common/util.js new file mode 100644 index 0000000..2129e7a --- /dev/null +++ b/src/components/common/util.js @@ -0,0 +1,3 @@ +export const showTitle = (item, vm) => { + return vm.$config.useI18n ? vm.$t(item.name) : ((item.meta && item.meta.title) || item.name) +} diff --git a/src/components/count-to/count-to.vue b/src/components/count-to/count-to.vue new file mode 100644 index 0000000..a10e3ff --- /dev/null +++ b/src/components/count-to/count-to.vue @@ -0,0 +1,174 @@ + + + diff --git a/src/components/count-to/index.js b/src/components/count-to/index.js new file mode 100644 index 0000000..17b3332 --- /dev/null +++ b/src/components/count-to/index.js @@ -0,0 +1,2 @@ +import countTo from './count-to.vue' +export default countTo diff --git a/src/components/count-to/index.less b/src/components/count-to/index.less new file mode 100644 index 0000000..e17d7c6 --- /dev/null +++ b/src/components/count-to/index.less @@ -0,0 +1,10 @@ +@prefix: ~"count-to"; + +.@{prefix}-wrapper{ + .content-outer{ + display: inline-block; + .@{prefix}-unit-text{ + font-style: normal; + } + } +} diff --git a/src/components/drag-list/drag-list.vue b/src/components/drag-list/drag-list.vue new file mode 100644 index 0000000..664abc9 --- /dev/null +++ b/src/components/drag-list/drag-list.vue @@ -0,0 +1,92 @@ + + + diff --git a/src/components/drag-list/index.js b/src/components/drag-list/index.js new file mode 100644 index 0000000..d2bb972 --- /dev/null +++ b/src/components/drag-list/index.js @@ -0,0 +1,2 @@ +import DragList from './drag-list.vue' +export default DragList diff --git a/src/components/editor/editor.vue b/src/components/editor/editor.vue new file mode 100644 index 0000000..c2184cd --- /dev/null +++ b/src/components/editor/editor.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/editor/index.js b/src/components/editor/index.js new file mode 100644 index 0000000..56e8de2 --- /dev/null +++ b/src/components/editor/index.js @@ -0,0 +1,2 @@ +import Editor from './editor.vue' +export default Editor diff --git a/src/components/icons/icons.vue b/src/components/icons/icons.vue new file mode 100644 index 0000000..50b7183 --- /dev/null +++ b/src/components/icons/icons.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/components/icons/index.js b/src/components/icons/index.js new file mode 100644 index 0000000..bdc38b2 --- /dev/null +++ b/src/components/icons/index.js @@ -0,0 +1,2 @@ +import Icons from './icons.vue' +export default Icons diff --git a/src/components/info-card/index.js b/src/components/info-card/index.js new file mode 100644 index 0000000..354419b --- /dev/null +++ b/src/components/info-card/index.js @@ -0,0 +1,2 @@ +import InforCard from './infor-card.vue' +export default InforCard diff --git a/src/components/info-card/infor-card.vue b/src/components/info-card/infor-card.vue new file mode 100644 index 0000000..6240d0e --- /dev/null +++ b/src/components/info-card/infor-card.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/src/components/login-form/index.js b/src/components/login-form/index.js new file mode 100644 index 0000000..d480c28 --- /dev/null +++ b/src/components/login-form/index.js @@ -0,0 +1,2 @@ +import LoginForm from './login-form.vue' +export default LoginForm diff --git a/src/components/login-form/login-form.vue b/src/components/login-form/login-form.vue new file mode 100644 index 0000000..c5dee75 --- /dev/null +++ b/src/components/login-form/login-form.vue @@ -0,0 +1,69 @@ + + diff --git a/src/components/main/components/error-store/error-store.vue b/src/components/main/components/error-store/error-store.vue new file mode 100644 index 0000000..9941677 --- /dev/null +++ b/src/components/main/components/error-store/error-store.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/components/main/components/error-store/index.js b/src/components/main/components/error-store/index.js new file mode 100644 index 0000000..a777df1 --- /dev/null +++ b/src/components/main/components/error-store/index.js @@ -0,0 +1,2 @@ +import ErrorStore from './error-store.vue' +export default ErrorStore diff --git a/src/components/main/components/fullscreen/fullscreen.vue b/src/components/main/components/fullscreen/fullscreen.vue new file mode 100644 index 0000000..d5213fa --- /dev/null +++ b/src/components/main/components/fullscreen/fullscreen.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/components/main/components/fullscreen/index.js b/src/components/main/components/fullscreen/index.js new file mode 100644 index 0000000..422c7c1 --- /dev/null +++ b/src/components/main/components/fullscreen/index.js @@ -0,0 +1,2 @@ +import Fullscreen from './fullscreen.vue' +export default Fullscreen diff --git a/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less b/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less new file mode 100644 index 0000000..1ace1eb --- /dev/null +++ b/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less @@ -0,0 +1,4 @@ +.custom-bread-crumb{ + display: inline-block; + vertical-align: top; +} diff --git a/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue b/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue new file mode 100644 index 0000000..51b121d --- /dev/null +++ b/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue @@ -0,0 +1,46 @@ + + diff --git a/src/components/main/components/header-bar/custom-bread-crumb/index.js b/src/components/main/components/header-bar/custom-bread-crumb/index.js new file mode 100644 index 0000000..a590fe0 --- /dev/null +++ b/src/components/main/components/header-bar/custom-bread-crumb/index.js @@ -0,0 +1,2 @@ +import customBreadCrumb from './custom-bread-crumb.vue' +export default customBreadCrumb diff --git a/src/components/main/components/header-bar/header-bar.less b/src/components/main/components/header-bar/header-bar.less new file mode 100644 index 0000000..c245d19 --- /dev/null +++ b/src/components/main/components/header-bar/header-bar.less @@ -0,0 +1,14 @@ +.header-bar{ + width: 100%; + height: 100%; + position: relative; + .custom-content-con{ + float: right; + height: auto; + padding-right: 20px; + line-height: 64px; + & > *{ + float: right; + } + } +} diff --git a/src/components/main/components/header-bar/header-bar.vue b/src/components/main/components/header-bar/header-bar.vue new file mode 100644 index 0000000..1452146 --- /dev/null +++ b/src/components/main/components/header-bar/header-bar.vue @@ -0,0 +1,34 @@ + + diff --git a/src/components/main/components/header-bar/index.js b/src/components/main/components/header-bar/index.js new file mode 100644 index 0000000..3d4a170 --- /dev/null +++ b/src/components/main/components/header-bar/index.js @@ -0,0 +1,2 @@ +import HeaderBar from './header-bar' +export default HeaderBar diff --git a/src/components/main/components/header-bar/sider-trigger/index.js b/src/components/main/components/header-bar/sider-trigger/index.js new file mode 100644 index 0000000..15853f4 --- /dev/null +++ b/src/components/main/components/header-bar/sider-trigger/index.js @@ -0,0 +1,2 @@ +import siderTrigger from './sider-trigger.vue' +export default siderTrigger diff --git a/src/components/main/components/header-bar/sider-trigger/sider-trigger.less b/src/components/main/components/header-bar/sider-trigger/sider-trigger.less new file mode 100644 index 0000000..eb50999 --- /dev/null +++ b/src/components/main/components/header-bar/sider-trigger/sider-trigger.less @@ -0,0 +1,21 @@ +.trans{ + transition: transform .2s ease; +} +@size: 40px; +.sider-trigger-a{ + padding: 6px; + width: @size; + height: @size; + display: inline-block; + text-align: center; + color: #5c6b77; + margin-top: 12px; + i{ + .trans; + vertical-align: top; + } + &.collapsed i{ + transform: rotateZ(90deg); + .trans; + } +} diff --git a/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue b/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue new file mode 100644 index 0000000..200e18f --- /dev/null +++ b/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/components/main/components/language/index.js b/src/components/main/components/language/index.js new file mode 100644 index 0000000..de2a90a --- /dev/null +++ b/src/components/main/components/language/index.js @@ -0,0 +1,2 @@ +import Language from './language.vue' +export default Language diff --git a/src/components/main/components/language/language.vue b/src/components/main/components/language/language.vue new file mode 100644 index 0000000..b1d92ec --- /dev/null +++ b/src/components/main/components/language/language.vue @@ -0,0 +1,51 @@ + + + diff --git a/src/components/main/components/side-menu/collapsed-menu.vue b/src/components/main/components/side-menu/collapsed-menu.vue new file mode 100644 index 0000000..73ac93e --- /dev/null +++ b/src/components/main/components/side-menu/collapsed-menu.vue @@ -0,0 +1,51 @@ + + diff --git a/src/components/main/components/side-menu/index.js b/src/components/main/components/side-menu/index.js new file mode 100644 index 0000000..5b36868 --- /dev/null +++ b/src/components/main/components/side-menu/index.js @@ -0,0 +1,2 @@ +import SideMenu from './side-menu.vue' +export default SideMenu diff --git a/src/components/main/components/side-menu/item-mixin.js b/src/components/main/components/side-menu/item-mixin.js new file mode 100644 index 0000000..8b807af --- /dev/null +++ b/src/components/main/components/side-menu/item-mixin.js @@ -0,0 +1,21 @@ +export default { + props: { + parentItem: { + type: Object, + default: () => {} + }, + theme: String, + iconSize: Number + }, + computed: { + parentName () { + return this.parentItem.name + }, + children () { + return this.parentItem.children + }, + textColor () { + return this.theme === 'dark' ? '#fff' : '#495060' + } + } +} diff --git a/src/components/main/components/side-menu/mixin.js b/src/components/main/components/side-menu/mixin.js new file mode 100644 index 0000000..21b618b --- /dev/null +++ b/src/components/main/components/side-menu/mixin.js @@ -0,0 +1,18 @@ +import CommonIcon from '_c/common-icon' +import { showTitle } from '@/libs/util' +export default { + components: { + CommonIcon + }, + methods: { + showTitle (item) { + return showTitle(item, this) + }, + showChildren (item) { + return item.children && (item.children.length > 1 || (item.meta && item.meta.showAlways)) + }, + getNameOrHref (item, children0) { + return item.href ? `isTurnByHref_${item.href}` : (children0 ? item.children[0].name : item.name) + } + } +} diff --git a/src/components/main/components/side-menu/side-menu-item.vue b/src/components/main/components/side-menu/side-menu-item.vue new file mode 100644 index 0000000..12338a6 --- /dev/null +++ b/src/components/main/components/side-menu/side-menu-item.vue @@ -0,0 +1,26 @@ + + diff --git a/src/components/main/components/side-menu/side-menu.less b/src/components/main/components/side-menu/side-menu.less new file mode 100644 index 0000000..4716d82 --- /dev/null +++ b/src/components/main/components/side-menu/side-menu.less @@ -0,0 +1,40 @@ +.side-menu-wrapper{ + user-select: none; + .menu-collapsed{ + padding-top: 10px; + + .ivu-dropdown{ + width: 100%; + .ivu-dropdown-rel a{ + width: 100%; + } + } + .ivu-tooltip{ + width: 100%; + .ivu-tooltip-rel{ + width: 100%; + } + .ivu-tooltip-popper .ivu-tooltip-content{ + .ivu-tooltip-arrow{ + border-right-color: #fff; + } + .ivu-tooltip-inner{ + background: #fff; + color: #495060; + } + } + } + + + } + a.drop-menu-a{ + display: inline-block; + padding: 6px 15px; + width: 100%; + text-align: center; + color: #495060; + } +} +.menu-title{ + padding-left: 6px; +} diff --git a/src/components/main/components/side-menu/side-menu.vue b/src/components/main/components/side-menu/side-menu.vue new file mode 100644 index 0000000..6cb611e --- /dev/null +++ b/src/components/main/components/side-menu/side-menu.vue @@ -0,0 +1,114 @@ + + + diff --git a/src/components/main/components/tags-nav/index.js b/src/components/main/components/tags-nav/index.js new file mode 100644 index 0000000..585792a --- /dev/null +++ b/src/components/main/components/tags-nav/index.js @@ -0,0 +1,2 @@ +import TagsNav from './tags-nav.vue' +export default TagsNav diff --git a/src/components/main/components/tags-nav/tags-nav.less b/src/components/main/components/tags-nav/tags-nav.less new file mode 100644 index 0000000..a4c8c5d --- /dev/null +++ b/src/components/main/components/tags-nav/tags-nav.less @@ -0,0 +1,87 @@ +.no-select{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.size{ + width: 100%; + height: 100%; +} +.tags-nav{ + position: relative; + border-top: 1px solid #F0F0F0; + border-bottom: 1px solid #F0F0F0; + .no-select; + .size; + .close-con{ + position: absolute; + right: 0; + top: 0; + height: 100%; + width: 32px; + background: #fff; + text-align: center; + z-index: 10; + } + .btn-con{ + position: absolute; + top: 0px; + height: 100%; + background: #fff; + padding-top: 3px; + z-index: 10; + button{ + padding: 6px 4px; + line-height: 14px; + text-align: center; + } + &.left-btn{ + left: 0px; + } + &.right-btn{ + right: 32px; + border-right: 1px solid #F0F0F0; + } + } + .scroll-outer{ + position: absolute; + left: 28px; + right: 61px; + top: 0; + bottom: 0; + box-shadow: 0px 0 3px 2px rgba(100,100,100,.1) inset; + .scroll-body{ + height: ~"calc(100% - 1px)"; + display: inline-block; + padding: 1px 4px 0; + position: absolute; + overflow: visible; + white-space: nowrap; + transition: left .3s ease; + .ivu-tag-dot-inner{ + transition: background .2s ease; + } + } + } + .contextmenu { + position: absolute; + margin: 0; + padding: 5px 0; + background: #fff; + z-index: 100; + list-style-type: none; + border-radius: 4px; + box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3); + li { + margin: 0; + padding: 5px 15px; + cursor: pointer; + &:hover { + background: #eee; + } + } + } +} diff --git a/src/components/main/components/tags-nav/tags-nav.vue b/src/components/main/components/tags-nav/tags-nav.vue new file mode 100644 index 0000000..e87f7b4 --- /dev/null +++ b/src/components/main/components/tags-nav/tags-nav.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/src/components/main/components/user/index.js b/src/components/main/components/user/index.js new file mode 100644 index 0000000..3d04a5c --- /dev/null +++ b/src/components/main/components/user/index.js @@ -0,0 +1,2 @@ +import User from './user.vue' +export default User diff --git a/src/components/main/components/user/user.less b/src/components/main/components/user/user.less new file mode 100644 index 0000000..0974462 --- /dev/null +++ b/src/components/main/components/user/user.less @@ -0,0 +1,9 @@ +.user{ + &-avator-dropdown{ + cursor: pointer; + display: inline-block; + // height: 64px; + vertical-align: middle; + // line-height: 64px; + } +} diff --git a/src/components/main/components/user/user.vue b/src/components/main/components/user/user.vue new file mode 100644 index 0000000..be9de81 --- /dev/null +++ b/src/components/main/components/user/user.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/components/main/index.js b/src/components/main/index.js new file mode 100644 index 0000000..7df2a08 --- /dev/null +++ b/src/components/main/index.js @@ -0,0 +1,2 @@ +import Main from './main.vue' +export default Main diff --git a/src/components/main/main.less b/src/components/main/main.less new file mode 100644 index 0000000..f982f79 --- /dev/null +++ b/src/components/main/main.less @@ -0,0 +1,77 @@ +.main{ + .logo-con{ + height: 64px; + padding: 10px; + img{ + height: 44px; + width: auto; + display: block; + margin: 0 auto; + } + } + .header-con{ + background: #fff; + padding: 0 20px; + width: 100%; + } + .main-layout-con{ + height: 100%; + overflow: hidden; + } + .main-content-con{ + height: ~"calc(100% - 60px)"; + overflow: hidden; + } + .tag-nav-wrapper{ + padding: 0; + height:40px; + background:#F0F0F0; + } + .content-wrapper{ + padding: 18px; + height: ~"calc(100% - 80px)"; + overflow: auto; + // 内容填充白色背景 + background: #fff; + } + .left-sider{ + .ivu-layout-sider-children{ + overflow-y: scroll; + margin-right: -18px; + } + } +} +.ivu-menu-item > i{ + margin-right: 12px !important; +} +.ivu-menu-submenu > .ivu-menu > .ivu-menu-item > i { + margin-right: 8px !important; +} +.collased-menu-dropdown{ + width: 100%; + margin: 0; + line-height: normal; + padding: 7px 0 6px 16px; + clear: both; + font-size: 12px !important; + white-space: nowrap; + list-style: none; + cursor: pointer; + transition: background 0.2s ease-in-out; + &:hover{ + background: rgba(100, 100, 100, 0.1); + } + & * { + color: #515a6e; + } + .ivu-menu-item > i{ + margin-right: 12px !important; + } + .ivu-menu-submenu > .ivu-menu > .ivu-menu-item > i { + margin-right: 8px !important; + } +} + +.ivu-select-dropdown.ivu-dropdown-transfer{ + max-height: 400px; +} diff --git a/src/components/main/main.vue b/src/components/main/main.vue new file mode 100644 index 0000000..2635e63 --- /dev/null +++ b/src/components/main/main.vue @@ -0,0 +1,166 @@ + + diff --git a/src/components/markdown/index.js b/src/components/markdown/index.js new file mode 100644 index 0000000..99e0cda --- /dev/null +++ b/src/components/markdown/index.js @@ -0,0 +1,2 @@ +import MarkdownEditor from './markdown.vue' +export default MarkdownEditor diff --git a/src/components/markdown/markdown.vue b/src/components/markdown/markdown.vue new file mode 100644 index 0000000..f893791 --- /dev/null +++ b/src/components/markdown/markdown.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/my-components/icon-choose.vue b/src/components/my-components/icon-choose.vue new file mode 100644 index 0000000..03904af --- /dev/null +++ b/src/components/my-components/icon-choose.vue @@ -0,0 +1,221 @@ + + + + + + diff --git a/src/components/my-components/upload-avatar.vue b/src/components/my-components/upload-avatar.vue new file mode 100644 index 0000000..c32da40 --- /dev/null +++ b/src/components/my-components/upload-avatar.vue @@ -0,0 +1,155 @@ + + + + + + diff --git a/src/components/parent-view/index.js b/src/components/parent-view/index.js new file mode 100644 index 0000000..a959c65 --- /dev/null +++ b/src/components/parent-view/index.js @@ -0,0 +1,2 @@ +import ParentView from './parent-view.vue' +export default ParentView diff --git a/src/components/parent-view/parent-view.vue b/src/components/parent-view/parent-view.vue new file mode 100644 index 0000000..c4ef369 --- /dev/null +++ b/src/components/parent-view/parent-view.vue @@ -0,0 +1,8 @@ + + diff --git a/src/components/paste-editor/index.js b/src/components/paste-editor/index.js new file mode 100644 index 0000000..f02331a --- /dev/null +++ b/src/components/paste-editor/index.js @@ -0,0 +1,2 @@ +import PasteEditor from './paste-editor.vue' +export default PasteEditor diff --git a/src/components/paste-editor/paste-editor.less b/src/components/paste-editor/paste-editor.less new file mode 100644 index 0000000..2ffd2bd --- /dev/null +++ b/src/components/paste-editor/paste-editor.less @@ -0,0 +1,26 @@ +.paste-editor-wrapper{ + width: 100%; + height: 100%; + border: 1px dashed gainsboro; + textarea.textarea-el{ + width: 100%; + height: 100%; + } + .CodeMirror{ + height: 100%; + padding: 0; + .CodeMirror-code div .CodeMirror-line > span > span.cm-tab{ + &::after{ + content: '→'; + color: #BFBFBF; + } + } + } + .first-row{ + font-weight: 700; + font-size: 14px; + } + .incorrect-row{ + background: #F5CBD1; + } +} diff --git a/src/components/paste-editor/paste-editor.vue b/src/components/paste-editor/paste-editor.vue new file mode 100644 index 0000000..083d6c4 --- /dev/null +++ b/src/components/paste-editor/paste-editor.vue @@ -0,0 +1,115 @@ + + + diff --git a/src/components/paste-editor/plugins/placeholder.js b/src/components/paste-editor/plugins/placeholder.js new file mode 100644 index 0000000..d9bf77e --- /dev/null +++ b/src/components/paste-editor/plugins/placeholder.js @@ -0,0 +1,58 @@ +export default (codemirror) => { + (function (mod) { + mod(codemirror) + })(function (CodeMirror) { + CodeMirror.defineOption('placeholder', '', function (cm, val, old) { + var prev = old && old !== CodeMirror.Init + if (val && !prev) { + cm.on('blur', onBlur) + cm.on('change', onChange) + cm.on('swapDoc', onChange) + onChange(cm) + } else if (!val && prev) { + cm.off('blur', onBlur) + cm.off('change', onChange) + cm.off('swapDoc', onChange) + clearPlaceholder(cm) + var wrapper = cm.getWrapperElement() + wrapper.className = wrapper.className.replace(' CodeMirror-empty', '') + } + + if (val && !cm.hasFocus()) onBlur(cm) + }) + + function clearPlaceholder (cm) { + if (cm.state.placeholder) { + cm.state.placeholder.parentNode.removeChild(cm.state.placeholder) + cm.state.placeholder = null + } + } + function setPlaceholder (cm) { + clearPlaceholder(cm) + var elt = cm.state.placeholder = document.createElement('pre') + elt.style.cssText = 'height: 0; overflow: visible; color: #80848f;' + elt.style.direction = cm.getOption('direction') + elt.className = 'CodeMirror-placeholder' + var placeHolder = cm.getOption('placeholder') + if (typeof placeHolder === 'string') placeHolder = document.createTextNode(placeHolder) + elt.appendChild(placeHolder) + cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild) + } + + function onBlur (cm) { + if (isEmpty(cm)) setPlaceholder(cm) + } + function onChange (cm) { + let wrapper = cm.getWrapperElement() + let empty = isEmpty(cm) + wrapper.className = wrapper.className.replace(' CodeMirror-empty', '') + (empty ? ' CodeMirror-empty' : '') + + if (empty) setPlaceholder(cm) + else clearPlaceholder(cm) + } + + function isEmpty (cm) { + return (cm.lineCount() === 1) && (cm.getLine(0) === '') + } + }) +} diff --git a/src/components/split-pane/index.js b/src/components/split-pane/index.js new file mode 100644 index 0000000..f5ed60e --- /dev/null +++ b/src/components/split-pane/index.js @@ -0,0 +1,2 @@ +import Split from './split.vue' +export default Split diff --git a/src/components/split-pane/index.less b/src/components/split-pane/index.less new file mode 100644 index 0000000..2583d90 --- /dev/null +++ b/src/components/split-pane/index.less @@ -0,0 +1,114 @@ +@split-prefix-cls: ~"ivu-split"; +@box-shadow: 0 0 4px 0 rgba(28, 36, 56, 0.4); +@trigger-bar-background: rgba(23, 35, 61, 0.25); +@trigger-background: #F8F8F9; +@trigger-width: 6px; +@trigger-bar-width: 4px; +@trigger-bar-offset: (@trigger-width - @trigger-bar-width) / 2; +@trigger-bar-interval: 3px; +@trigger-bar-weight: 1px; +@trigger-bar-con-height: (@trigger-bar-weight + @trigger-bar-interval) * 8; + +.@{split-prefix-cls}{ + &-wrapper{ + position: relative; + width: 100%; + height: 100%; + } + &-pane{ + position: absolute; + &.left-pane, &.right-pane{ + top: 0px; + bottom: 0px; + } + &.left-pane{ + left: 0px; + } + &.right-pane{ + right: 0px; + } + &.top-pane, &.bottom-pane{ + left: 0px; + right: 0px; + } + &.top-pane{ + top: 0px; + } + &.bottom-pane{ + bottom: 0px; + } + } + &-trigger{ + &-con{ + position: absolute; + transform: translate(-50%, -50%); + z-index: 10; + } + &-bar-con{ + position: absolute; + overflow: hidden; + &.vertical{ + left: @trigger-bar-offset; + top: 50%; + height: @trigger-bar-con-height; + transform: translate(0, -50%); + } + &.horizontal{ + left: 50%; + top: @trigger-bar-offset; + width: @trigger-bar-con-height; + transform: translate(-50%, 0); + } + } + &-vertical{ + width: @trigger-width; + height: 100%; + background: @trigger-background; + box-shadow: @box-shadow; + cursor: col-resize; + .@{split-prefix-cls}-trigger-bar{ + width: @trigger-bar-width; + height: 1px; + background: @trigger-bar-background; + float: left; + margin-top: @trigger-bar-interval; + } + } + &-horizontal{ + height: @trigger-width; + width: 100%; + background: @trigger-background; + box-shadow: @box-shadow; + cursor: row-resize; + .@{split-prefix-cls}-trigger-bar{ + height: @trigger-bar-width; + width: 1px; + background: @trigger-bar-background; + float: left; + margin-right: @trigger-bar-interval; + } + } + } + &-horizontal{ + .@{split-prefix-cls}-trigger-con{ + top: 50%; + height: 100%; + width: 0; + } + } + &-vertical{ + .@{split-prefix-cls}-trigger-con{ + left: 50%; + height: 0; + width: 100%; + } + } + .no-select{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } +} diff --git a/src/components/split-pane/split.vue b/src/components/split-pane/split.vue new file mode 100644 index 0000000..409982e --- /dev/null +++ b/src/components/split-pane/split.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/src/components/split-pane/trigger.vue b/src/components/split-pane/trigger.vue new file mode 100644 index 0000000..9abdf03 --- /dev/null +++ b/src/components/split-pane/trigger.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/components/tables/edit.vue b/src/components/tables/edit.vue new file mode 100644 index 0000000..e1066ef --- /dev/null +++ b/src/components/tables/edit.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/tables/handle-btns.js b/src/components/tables/handle-btns.js new file mode 100644 index 0000000..551b2e3 --- /dev/null +++ b/src/components/tables/handle-btns.js @@ -0,0 +1,33 @@ +const btns = { + delete: (h, params, vm) => { + return h('Poptip', { + props: { + confirm: true, + title: '你确定要删除吗?' + }, + on: { + 'on-ok': () => { + vm.$emit('on-delete', params) + vm.$emit('input', params.tableData.filter((item, index) => index !== params.row.initRowIndex)) + } + } + }, [ + h('Button', { + props: { + type: 'text', + ghost: true + } + }, [ + h('Icon', { + props: { + type: 'md-trash', + size: 18, + color: '#000000' + } + }) + ]) + ]) + } +} + +export default btns diff --git a/src/components/tables/index.js b/src/components/tables/index.js new file mode 100644 index 0000000..4dabfab --- /dev/null +++ b/src/components/tables/index.js @@ -0,0 +1,2 @@ +import Tables from './tables.vue' +export default Tables diff --git a/src/components/tables/index.less b/src/components/tables/index.less new file mode 100644 index 0000000..3c352e1 --- /dev/null +++ b/src/components/tables/index.less @@ -0,0 +1,17 @@ +.search-con{ + padding: 10px 0; + .search{ + &-col{ + display: inline-block; + width: 200px; + } + &-input{ + display: inline-block; + width: 200px; + margin-left: 2px; + } + &-btn{ + margin-left: 2px; + } + } +} diff --git a/src/components/tables/tables.vue b/src/components/tables/tables.vue new file mode 100644 index 0000000..d142b2d --- /dev/null +++ b/src/components/tables/tables.vue @@ -0,0 +1,277 @@ + + + diff --git a/src/config/index.js b/src/config/index.js new file mode 100644 index 0000000..74375ad --- /dev/null +++ b/src/config/index.js @@ -0,0 +1,36 @@ +export default { + /** + * @description 配置显示在浏览器标签的title + */ + title: 'freedom', + /** + * @description token在Cookie中存储的天数,默认1天 + */ + cookieExpires: 1, + /** + * @description 是否使用国际化,默认为false + * 如果不使用,则需要在路由中给需要在菜单中展示的路由设置meta: {title: 'xxx'} + * 用来在菜单中显示文字 + */ + useI18n: false, + /** + * @description api请求基础路径 + */ + baseUrl: { + dev: 'http://localhost:8800', // 开发环境 + pro: 'http://106.14.163.31:8800' // 生产环境 + }, + /** + * @description 默认打开的首页的路由name值,默认为home + */ + homeName: 'home', + /** + * @description 需要加载的插件 + */ + plugin: { + // 'error-store': { + // showInHeader: true, // 设为false后不会在顶部显示错误日志徽标 + // developmentOff: false // 设为true后在开发环境不会收集错误信息,方便开发中排查错误 + // } + } +} diff --git a/src/directive/directives.js b/src/directive/directives.js new file mode 100644 index 0000000..42dd84f --- /dev/null +++ b/src/directive/directives.js @@ -0,0 +1,45 @@ +import { on } from '@/libs/tools' +const directives = { + draggable: { + inserted: (el, binding, vnode) => { + let triggerDom = document.querySelector(binding.value.trigger) + triggerDom.style.cursor = 'move' + let bodyDom = document.querySelector(binding.value.body) + let pageX = 0 + let pageY = 0 + let transformX = 0 + let transformY = 0 + let canMove = false + const handleMousedown = e => { + let transform = /\(.*\)/.exec(bodyDom.style.transform) + if (transform) { + transform = transform[0].slice(1, transform[0].length - 1) + let splitxy = transform.split('px, ') + transformX = parseFloat(splitxy[0]) + transformY = parseFloat(splitxy[1].split('px')[0]) + } + pageX = e.pageX + pageY = e.pageY + canMove = true + } + const handleMousemove = e => { + let xOffset = e.pageX - pageX + transformX + let yOffset = e.pageY - pageY + transformY + if (canMove) bodyDom.style.transform = `translate(${xOffset}px, ${yOffset}px)` + } + const handleMouseup = e => { + canMove = false + } + on(triggerDom, 'mousedown', handleMousedown) + on(document, 'mousemove', handleMousemove) + on(document, 'mouseup', handleMouseup) + }, + update: (el, binding, vnode) => { + if (!binding.value.recover) return + let bodyDom = document.querySelector(binding.value.body) + bodyDom.style.transform = '' + } + } +} + +export default directives diff --git a/src/directive/index.js b/src/directive/index.js new file mode 100644 index 0000000..e698f3d --- /dev/null +++ b/src/directive/index.js @@ -0,0 +1,15 @@ +import directive from './directives' + +const importDirective = Vue => { + /** + * 拖拽指令 v-draggable="options" + * options = { + * trigger: /这里传入作为拖拽触发器的CSS选择器/, + * body: /这里传入需要移动容器的CSS选择器/, + * recover: /拖动结束之后是否恢复到原来的位置/ + * } + */ + Vue.directive('draggable', directive.draggable) +} + +export default importDirective diff --git a/src/index.less b/src/index.less new file mode 100644 index 0000000..9e7e4d4 --- /dev/null +++ b/src/index.less @@ -0,0 +1,245 @@ +@import '~view-design/src/styles/index.less'; + +// Prefix +@css-prefix : ivu-; +@css-prefix-iconfont : ivu-icon; + +// Color +@primary-color : #2d8cf0; +@info-color : #2db7f5; +@success-color : #19be6b; +@processing-color : @primary-color; +@warning-color : #ff9900; +@error-color : #ed4014; +@normal-color : #e6ebf1; +@link-color : #2D8cF0; +@link-hover-color : tint(@link-color, 20%); +@link-active-color : shade(@link-color, 5%); +@selected-color : fade(@primary-color, 90%); +@tooltip-color : #fff; +@subsidiary-color : #808695; +@rate-star-color : #f5a623; +@white: #fff; +@black: #000; + +// Base +@body-background : #fff; +@component-background : #fff; +@font-family : "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif; +@code-family : Consolas,Menlo,Courier,monospace; +@title-color : #17233d; +@text-color : #515a6e; +@text-color-secondary: fade(@black, 45%); +@heading-color: fade(#000, 85%); +@heading-color-dark: fade(@white, 100%); +@font-size-base : 14px; +@font-size-small : 12px; +@font-size-large : @font-size-base + 2px; +@line-height-base : 1.5; +@line-height-computed : floor((@font-size-base * @line-height-base)); +@border-radius-base : 6px; +@border-radius-small : 4px; +@cursor-disabled : not-allowed; + +// vertical paddings +@padding-lg: 24px; // containers +@padding-md: 16px; // small containers and buttons +@padding-sm: 12px; // Form controls and items +@padding-xs: 8px; // small items + +// Border color +@border-color-base : #dcdee2; // outside +@border-color-split : #e8eaec; // inside +@border-width-base : 1px; // width of the border for a component +@border-style-base : solid; // style of a components border + +// Background color +@background-color-base : #f7f7f7; // base +@background-color-select-hover: @input-disabled-bg; +@tooltip-bg : rgba(70, 76, 91, .9); +@head-bg : #f9fafc; +@table-thead-bg : #f8f8f9; +@table-td-stripe-bg : #f8f8f9; +@table-td-hover-bg : #ebf7ff; +@table-td-highlight-bg : #ebf7ff; +@menu-dark-title : #191a23; +@menu-dark-active-bg : #191a23; +@menu-dark-subsidiary-color : rgba(255,255,255,.7); +@menu-dark-group-title-color : rgba(255,255,255,.36); +@date-picker-cell-hover-bg : #e1f0fe; + +// Shadow +@shadow-color : rgba(0, 0, 0, .2); +@shadow-base : @shadow-down; +@shadow-card : 0 1px 1px 0 rgba(0,0,0,.1); +@shadow-up : 0 -1px 6px @shadow-color; +@shadow-down : 0 1px 6px @shadow-color; +@shadow-left : -1px 0 6px @shadow-color; +@shadow-right : 1px 0 6px @shadow-color; + +// Button +@btn-height-base : 32px; +@btn-height-large : 40px; +@btn-height-small : 24px; + +@btn-padding-base : 0 @padding-md - 1px; +@btn-padding-large : @btn-padding-base; +@btn-padding-small : 0 @padding-xs - 1px; + +@btn-font-weight : normal; +@btn-padding-base-icon : 5px 15px 6px; +@btn-padding-large-icon : 6px 15px 6px 15px; +@btn-padding-small-icon : 1px 7px 2px; +@btn-font-size : @font-size-base; +@btn-font-size-large : @font-size-large; +@btn-font-size-small : @font-size-base; +@btn-border-radius : 4px; +@btn-border-radius-small: 3px; +@btn-group-border : shade(@primary-color, 5%); + +@btn-disable-color : #c5c8ce; +@btn-disable-bg : @background-color-base; +@btn-disable-border : @border-color-base; + +@btn-default-color : @text-color; +@btn-default-bg : #fff; +@btn-default-border : @border-color-base; + +@btn-primary-color : #fff; +@btn-primary-bg : @primary-color; + +@btn-ghost-color : @text-color; +@btn-ghost-bg : #fff; +@btn-ghost-border : @border-color-base; + +@btn-circle-size : @btn-height-base; +@btn-circle-size-large : @btn-height-large; +@btn-circle-size-small : @btn-height-small; + +@btn-square-size : @btn-height-base; +@btn-square-size-large : @btn-height-large; +@btn-square-size-small : @btn-height-small; + +// Layout and Grid +@grid-columns : 24; +@grid-gutter-width : 0; +@layout-body-background : #f5f7f9; +@layout-header-background : #191a23; +@layout-header-height : 64px; +@layout-header-padding : 0 50px; +@layout-footer-padding : 24px 50px; +@layout-footer-background : @layout-body-background; +@layout-sider-background : @layout-header-background; +@layout-trigger-height : 48px; +@layout-trigger-color : #fff; +@layout-zero-trigger-width : 36px; +@layout-zero-trigger-height : 42px; + +// Legend +@legend-color : #999; + +// Input +@input-height-base : 32px; +@input-height-large : 40px; +@input-height-small : 24px; + +@input-padding-horizontal : 7px; +@input-padding-vertical-base : 4px; +@input-padding-vertical-small: 1px; +@input-padding-vertical-large: 6px; + +@input-placeholder-color : @btn-disable-color; +@input-color : @text-color; +@input-border-color : @border-color-base; +@input-bg : #fff; +@input-group-bg : #f8f8f9; + +@input-hover-border-color : @primary-color; +@input-focus-border-color : @primary-color; +@input-disabled-bg : #f3f3f3; + +// Tag +@tag-font-size : 12px; + +// Media queries breakpoints +// Extra small screen / phone +@screen-xs : 480px; +@screen-xs-min : @screen-xs; +@screen-xs-max : (@screen-xs-min - 1); + +// Small screen / tablet +@screen-sm : 576px; +@screen-sm-min : @screen-sm; +@screen-sm-max : (@screen-sm-min - 1); + +// Medium screen / desktop +@screen-md : 768px; +@screen-md-min : @screen-md; +@screen-md-max : (@screen-md-min - 1); + +// Large screen / wide desktop +@screen-lg : 992px; +@screen-lg-min : @screen-lg; +@screen-lg-max : (@screen-lg-min - 1); + +// Extra large screen / full hd +@screen-xl : 1200px; +@screen-xl-min : @screen-xl; +@screen-xl-max : (@screen-xl-min - 1); + +// Extra extra large screen / large descktop +@screen-xxl : 1600px; +@screen-xxl-min : @screen-xxl; +@screen-xxl-max : (@screen-xxl-min - 1); + +// Z-index +@zindex-spin : 8; +@zindex-affix : 10; +@zindex-back-top : 10; +@zindex-select : 900; +@zindex-modal : 1000; +@zindex-drawer : 1000; +@zindex-message : 1010; +@zindex-notification : 1010; +@zindex-tooltip : 1060; +@zindex-transfer : 1060; +@zindex-loading-bar : 2000; +@zindex-spin-fullscreen : 2010; + +// Animation +@animation-time : .3s; +@animation-time-quick : .15s; +@transition-time : .2s; +@ease-in-out : ease-in-out; + +// Slider +@slider-color : tint(@primary-color, 20%); +@slider-height : 4px; +@slider-margin : 16px 0; +@slider-button-wrap-size : 18px; +@slider-button-wrap-offset : -5px; +@slider-disabled-color : #ccc; + +// Avatar +@avatar-size-base: 32px; +@avatar-size-lg: 40px; +@avatar-size-sm: 24px; +@avatar-font-size-base: 18px; +@avatar-font-size-lg: 24px; +@avatar-font-size-sm: 14px; +@avatar-bg: #ccc; +@avatar-color: #fff; +@avatar-border-radius: @border-radius-small; + +// Anchor +@anchor-border-width: 2px; + +// List +// --- +@list-header-background: transparent; +@list-footer-background: transparent; +@list-empty-text-padding: @padding-md; +@list-item-padding: @padding-sm 0; +@list-item-meta-margin-bottom: @padding-md; +@list-item-meta-avatar-margin-right: @padding-md; +@list-item-meta-title-margin-bottom: @padding-sm; diff --git a/src/libs/api.request.js b/src/libs/api.request.js new file mode 100644 index 0000000..01cb87b --- /dev/null +++ b/src/libs/api.request.js @@ -0,0 +1,6 @@ +import HttpRequest from '@/libs/axios' +import config from '@/config' +const baseUrl = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro + +const axios = new HttpRequest(baseUrl) +export default axios diff --git a/src/libs/axios.js b/src/libs/axios.js new file mode 100644 index 0000000..9b804d5 --- /dev/null +++ b/src/libs/axios.js @@ -0,0 +1,137 @@ +import axios from 'axios' +import store from '@/store' +import qs from 'qs' +import { Notice } from 'view-design' +import Cookies from 'js-cookie' +import { TOKEN_KEY, EXPIRETIME_KEY } from '@/libs/util' + + +// import { Spin } from 'view-design' +const addErrorLog = errorInfo => { + const { statusText, status, request: { responseURL } } = errorInfo + let info = { + type: 'ajax', + code: status, + mes: statusText, + url: responseURL + } + if (!responseURL.includes('save_error_logger')) store.dispatch('addErrorLog', info) +} + +class HttpRequest { + constructor (baseUrl = baseURL) { + this.baseUrl = baseUrl + this.queue = {} + } + getInsideConfig () { + const config = { + baseURL: this.baseUrl, + headers: { + // + }, + /** transformRequest 允许在向服务器发送前,修改请求数据,只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream**/ + transformRequest: [function (data) { + // 对data进行任意转化处理 + data = qs.stringify(data, {indices: false}) + return data; + }], + // `paramsSerializer` 是一个负责 `params` 序列化的函数 + paramsSerializer: function (params) { + return qs.stringify(params, {arrayFormat: 'brackets'}) + }, + } + return config + } + destroy (url) { + delete this.queue[url] + if (!Object.keys(this.queue).length) { + // Spin.hide() + } + } + interceptors (instance, url) { + // 请求拦截 + instance.interceptors.request.use(config => { + // 添加全局的loading... + if (!Object.keys(this.queue).length) { + // Spin.show() // 不建议开启,因为界面不友好 + } + this.queue[url] = true + + // 根据项目需求添加请求拦截 + //判断请求不是登陆接口的时候,字段是不是过期了,(根据业务逻辑做对应的处理) + //console.log("进入请求拦截器...") + //console.log(url) + + if ((url.indexOf('login') < 0) && (config.url.indexOf('logout') )) { + let curTime = new Date().getTime() + let expireTime = store.state.user.expireTime // 获取token过期时间 + //console.log(expireTime) + if (expireTime) { + let lessTime = eval(expireTime - curTime); // 后台返回的过期时间与现在的进行计算 + //console.log(lessTime) + if (lessTime <= 0) { + Notice.warning({ + title: '登录过期', + desc: '请重新登录!' + }) + Cookies.remove(TOKEN_KEY); + Cookies.remove(EXPIRETIME_KEY); + + } + } + } + + return config + }, error => { + return Promise.reject(error) + }) + // 响应拦截 + instance.interceptors.response.use(res => { + // 根据项目需求添加响应拦截 + //console.log("进入响应拦截器...") + //console.log(res.data.code ) + + let code = res.data.code + if (code === 415){ + // 1、用户名或密码错误 + Notice.warning({ + title: res.data.message, + desc: '请重新登录!' + }) + Cookies.remove(TOKEN_KEY) + Cookies.remove(EXPIRETIME_KEY) + }else if(code === 511 || code === 512 || code === 513){ + // 2、token 失效、不存在、错误 + Notice.warning({ + title: res.data.message, + desc: '请重新登录!' + }) + Cookies.remove(TOKEN_KEY) + Cookies.remove(EXPIRETIME_KEY) + }else if(code === 500){ + // 3、系统内部错误 + Notice.warning({ + title: '系统内部错误', + desc: '系统将自动登出!' + }) + Cookies.remove(TOKEN_KEY); + Cookies.remove(EXPIRETIME_KEY); + } + + this.destroy(url) + const { data, status } = res + return { data, status } + }, error => { + this.destroy(url) + addErrorLog(error.response) + return Promise.reject(error) + }) + } + request (options) { + const instance = axios.create() + options = Object.assign(this.getInsideConfig(), options) + this.interceptors(instance, options.url) + return instance(options) + } +} +export default HttpRequest diff --git a/src/libs/excel.js b/src/libs/excel.js new file mode 100644 index 0000000..ba9d406 --- /dev/null +++ b/src/libs/excel.js @@ -0,0 +1,113 @@ +/* eslint-disable */ +import XLSX from 'xlsx'; + +function auto_width(ws, data){ + /*set worksheet max width per col*/ + const colWidth = data.map(row => row.map(val => { + /*if null/undefined*/ + if (val == null) { + return {'wch': 10}; + } + /*if chinese*/ + else if (val.toString().charCodeAt(0) > 255) { + return {'wch': val.toString().length * 2}; + } else { + return {'wch': val.toString().length}; + } + })) + /*start in the first row*/ + let result = colWidth[0]; + for (let i = 1; i < colWidth.length; i++) { + for (let j = 0; j < colWidth[i].length; j++) { + if (result[j]['wch'] < colWidth[i][j]['wch']) { + result[j]['wch'] = colWidth[i][j]['wch']; + } + } + } + ws['!cols'] = result; +} + +function json_to_array(key, jsonData){ + return jsonData.map(v => key.map(j => { return v[j] })); +} + +// fix data,return string +function fixdata(data) { + let o = '' + let l = 0 + const w = 10240 + for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w))) + o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w))) + return o +} + +// get head from excel file,return array +function get_header_row(sheet) { + const headers = [] + const range = XLSX.utils.decode_range(sheet['!ref']) + let C + const R = range.s.r /* start in the first row */ + for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */ + var cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })] /* find the cell in the first row */ + var hdr = 'UNKNOWN ' + C // <-- replace with your desired default + if (cell && cell.t) hdr = XLSX.utils.format_cell(cell) + headers.push(hdr) + } + return headers +} + +export const export_table_to_excel= (id, filename) => { + const table = document.getElementById(id); + const wb = XLSX.utils.table_to_book(table); + XLSX.writeFile(wb, filename); + + /* the second way */ + // const table = document.getElementById(id); + // const wb = XLSX.utils.book_new(); + // const ws = XLSX.utils.table_to_sheet(table); + // XLSX.utils.book_append_sheet(wb, ws, filename); + // XLSX.writeFile(wb, filename); +} + +export const export_json_to_excel = ({data, key, title, filename, autoWidth}) => { + const wb = XLSX.utils.book_new(); + data.unshift(title); + const ws = XLSX.utils.json_to_sheet(data, {header: key, skipHeader: true}); + if(autoWidth){ + const arr = json_to_array(key, data); + auto_width(ws, arr); + } + XLSX.utils.book_append_sheet(wb, ws, filename); + XLSX.writeFile(wb, filename + '.xlsx'); +} + +export const export_array_to_excel = ({key, data, title, filename, autoWidth}) => { + const wb = XLSX.utils.book_new(); + const arr = json_to_array(key, data); + arr.unshift(title); + const ws = XLSX.utils.aoa_to_sheet(arr); + if(autoWidth){ + auto_width(ws, arr); + } + XLSX.utils.book_append_sheet(wb, ws, filename); + XLSX.writeFile(wb, filename + '.xlsx'); +} + +export const read = (data, type) => { + /* if type == 'base64' must fix data first */ + // const fixedData = fixdata(data) + // const workbook = XLSX.read(btoa(fixedData), { type: 'base64' }) + const workbook = XLSX.read(data, { type: type }); + const firstSheetName = workbook.SheetNames[0]; + const worksheet = workbook.Sheets[firstSheetName]; + const header = get_header_row(worksheet); + const results = XLSX.utils.sheet_to_json(worksheet); + return {header, results}; +} + +export default { + export_table_to_excel, + export_array_to_excel, + export_json_to_excel, + read +} diff --git a/src/libs/icon.js b/src/libs/icon.js new file mode 100644 index 0000000..b1fa532 --- /dev/null +++ b/src/libs/icon.js @@ -0,0 +1,3513 @@ +export const icons = [ + { + "icons": [ + "ios-add-circle-outline" + ], + "tags": [ + "circle" + ] + }, + { + "icons": [ + "ios-add-circle", + "md-add-circle" + ], + "tags": [ + "add", + "circle" + ] + }, + { + "icons": [ + "ios-add", + "md-add" + ], + "tags": [ + "add", + "include", + "invite", + "plus" + ] + }, + { + "icons": [ + "ios-alarm", + "md-alarm" + ], + "tags": [ + "alarm" + ] + }, + { + "icons": [ + "ios-albums", + "md-albums" + ], + "tags": [ + "albums", + "boxes", + "slides", + "square" + ] + }, + { + "icons": [ + "ios-alert", + "md-alert" + ], + "tags": [ + "!", + "alert", + "attention", + "exclamation", + "notice", + "warning" + ] + }, + { + "icons": [ + "ios-american-football", + "md-american-football" + ], + "tags": [ + "american", + "football" + ] + }, + { + "icons": [ + "ios-analytics", + "md-analytics" + ], + "tags": [ + "analytics", + "data", + "metrics", + "track" + ] + }, + { + "icons": [ + "ios-aperture", + "md-aperture" + ], + "tags": [ + "aperture", + "dark", + "images", + "levels", + "light", + "settings" + ] + }, + { + "icons": [ + "ios-apps", + "md-apps" + ], + "tags": [ + "apps", + "applications" + ] + }, + { + "icons": [ + "ios-appstore", + "md-appstore" + ], + "tags": [ + "appstore", + "store" + ] + }, + { + "icons": [ + "ios-archive", + "md-archive" + ], + "tags": [ + "archive", + "email" + ] + }, + { + "icons": [ + "ios-arrow-back", + "md-arrow-back" + ], + "tags": [ + "arrow", + "back", + "chevron", + "navigation" + ] + }, + { + "icons": [ + "ios-arrow-down", + "md-arrow-down" + ], + "tags": [ + "arrow", + "chevron", + "down" + ] + }, + { + "icons": [ + "ios-arrow-dropdown-circle", + "md-arrow-dropdown-circle" + ], + "tags": [ + "arrow", + "circle", + "dropdown" + ] + }, + { + "icons": [ + "ios-arrow-dropdown", + "md-arrow-dropdown" + ], + "tags": [ + "arrow", + "dropdown" + ] + }, + { + "icons": [ + "ios-arrow-dropleft-circle", + "md-arrow-dropleft-circle" + ], + "tags": [ + "arrow", + "circle", + "dropleft" + ] + }, + { + "icons": [ + "ios-arrow-dropleft", + "md-arrow-dropleft" + ], + "tags": [ + "arrow", + "dropleft" + ] + }, + { + "icons": [ + "ios-arrow-dropright-circle", + "md-arrow-dropright-circle" + ], + "tags": [ + "arrow", + "circle", + "dropright" + ] + }, + { + "icons": [ + "ios-arrow-dropright", + "md-arrow-dropright" + ], + "tags": [ + "arrow", + "dropright" + ] + }, + { + "icons": [ + "ios-arrow-dropup-circle", + "md-arrow-dropup-circle" + ], + "tags": [ + "arrow", + "circle", + "dropup" + ] + }, + { + "icons": [ + "ios-arrow-dropup", + "md-arrow-dropup" + ], + "tags": [ + "arrow", + "dropup" + ] + }, + { + "icons": [ + "ios-arrow-forward", + "md-arrow-forward" + ], + "tags": [ + "arrow", + "chevron", + "forward", + "navigation" + ] + }, + { + "icons": [ + "ios-arrow-round-back", + "md-arrow-round-back" + ], + "tags": [ + "arrow", + "back", + "round" + ] + }, + { + "icons": [ + "ios-arrow-round-down", + "md-arrow-round-down" + ], + "tags": [ + "arrow", + "down", + "round" + ] + }, + { + "icons": [ + "ios-arrow-round-forward", + "md-arrow-round-forward" + ], + "tags": [ + "arrow", + "forward", + "round" + ] + }, + { + "icons": [ + "ios-arrow-round-up", + "md-arrow-round-up" + ], + "tags": [ + "arrow", + "round", + "up" + ] + }, + { + "icons": [ + "ios-arrow-up", + "md-arrow-up" + ], + "tags": [ + "arrow", + "chevron", + "up" + ] + }, + { + "icons": [ + "ios-at", + "md-at" + ], + "tags": [ + "@", + "at" + ] + }, + { + "icons": [ + "ios-attach", + "md-attach" + ], + "tags": [ + "attach" + ] + }, + { + "icons": [ + "ios-backspace", + "md-backspace" + ], + "tags": [ + "backspace" + ] + }, + { + "icons": [ + "ios-barcode", + "md-barcode" + ], + "tags": [ + "barcode", + "camera", + "reader" + ] + }, + { + "icons": [ + "ios-baseball", + "md-baseball" + ], + "tags": [ + "baseball" + ] + }, + { + "icons": [ + "ios-basket", + "md-basket" + ], + "tags": [ + "basket" + ] + }, + { + "icons": [ + "ios-basketball", + "md-basketball" + ], + "tags": [ + "basketball" + ] + }, + { + "icons": [ + "ios-battery-charging", + "md-battery-charging" + ], + "tags": [ + "battery", + "charging" + ] + }, + { + "icons": [ + "ios-battery-dead", + "md-battery-dead" + ], + "tags": [ + "battery", + "dead" + ] + }, + { + "icons": [ + "ios-battery-full", + "md-battery-full" + ], + "tags": [ + "battery", + "full" + ] + }, + { + "icons": [ + "ios-beaker", + "md-beaker" + ], + "tags": [ + "beaker", + "flask", + "mixture", + "potion" + ] + }, + { + "icons": [ + "ios-beer", + "md-beer" + ], + "tags": [ + "beer", + "drink", + "eat", + "food" + ] + }, + { + "icons": [ + "ios-bicycle", + "md-bicycle" + ], + "tags": [ + "bicycle" + ] + }, + { + "icons": [ + "ios-bluetooth", + "md-bluetooth" + ], + "tags": [ + "bluetooth", + "cloud", + "connection" + ] + }, + { + "icons": [ + "ios-boat", + "md-boat" + ], + "tags": [ + "boat" + ] + }, + { + "icons": [ + "ios-body", + "md-body" + ], + "tags": [ + "body" + ] + }, + { + "icons": [ + "ios-bonfire", + "md-bonfire" + ], + "tags": [ + "bonfire", + "heat", + "hot" + ] + }, + { + "icons": [ + "ios-book", + "md-book" + ], + "tags": [ + "book", + "read" + ] + }, + { + "icons": [ + "ios-bookmark", + "md-bookmark" + ], + "tags": [ + "bookmark", + "favorite", + "save", + "tag" + ] + }, + { + "icons": [ + "ios-bookmarks", + "md-bookmarks" + ], + "tags": [ + "bookmarks", + "favorite" + ] + }, + { + "icons": [ + "ios-bowtie", + "md-bowtie" + ], + "tags": [ + "bowtie" + ] + }, + { + "icons": [ + "ios-briefcase", + "md-briefcase" + ], + "tags": [ + "briefcase", + "folder", + "organize" + ] + }, + { + "icons": [ + "ios-browsers", + "md-browsers" + ], + "tags": [ + "browsers", + "square" + ] + }, + { + "icons": [ + "ios-brush", + "md-brush" + ], + "tags": [ + "brush" + ] + }, + { + "icons": [ + "ios-bug", + "md-bug" + ], + "tags": [ + "bug", + "develop", + "error", + "hacker", + "program" + ] + }, + { + "icons": [ + "ios-build", + "md-build" + ], + "tags": [ + "build" + ] + }, + { + "icons": [ + "ios-bulb", + "md-bulb" + ], + "tags": [ + "bulb" + ] + }, + { + "icons": [ + "ios-bus", + "md-bus" + ], + "tags": [ + "bus" + ] + }, + { + "icons": [ + "ios-cafe", + "md-cafe" + ], + "tags": [ + "cafe" + ] + }, + { + "icons": [ + "ios-calculator", + "md-calculator" + ], + "tags": [ + "arithmatic", + "calculator", + "math" + ] + }, + { + "icons": [ + "ios-calendar", + "md-calendar" + ], + "tags": [ + "calendar", + "date", + "month", + "week" + ] + }, + { + "icons": [ + "ios-call", + "md-call" + ], + "tags": [ + "call", + "telephone" + ] + }, + { + "icons": [ + "ios-camera", + "md-camera" + ], + "tags": [ + "camera", + "image", + "photo" + ] + }, + { + "icons": [ + "ios-car", + "md-car" + ], + "tags": [ + "car" + ] + }, + { + "icons": [ + "ios-card", + "md-card" + ], + "tags": [ + "$", + "card", + "cash", + "credit", + "debit", + "dollars", + "money", + "price", + "shopping" + ] + }, + { + "icons": [ + "ios-cart", + "md-cart" + ], + "tags": [ + "cart" + ] + }, + { + "icons": [ + "ios-cash", + "md-cash" + ], + "tags": [ + "$", + "cash", + "credit", + "debit", + "dollars", + "money", + "price", + "shopping" + ] + }, + { + "icons": [ + "ios-chatboxes", + "md-chatboxes" + ], + "tags": [ + "chatboxes", + "talk" + ] + }, + { + "icons": [ + "ios-chatbubbles", + "md-chatbubbles" + ], + "tags": [ + "chatbubbles", + "talk" + ] + }, + { + "icons": [ + "ios-checkbox-outline", + "md-checkbox-outline" + ], + "tags": [ + "checkbox", + "success" + ] + }, + { + "icons": [ + "ios-checkbox", + "md-checkbox" + ], + "tags": [ + "checkbox", + "success" + ] + }, + { + "icons": [ + "ios-checkmark-circle-outline", + "md-checkmark-circle-outline" + ], + "tags": [ + "checkmark", + "success" + ] + }, + { + "icons": [ + "ios-checkmark-circle", + "md-checkmark-circle" + ], + "tags": [ + "checkmark", + "circle", + "success" + ] + }, + { + "icons": [ + "ios-checkmark", + "md-checkmark" + ], + "tags": [ + "checkmark", + "success" + ] + }, + { + "icons": [ + "ios-clipboard", + "md-clipboard" + ], + "tags": [ + "clipboard", + "write" + ] + }, + { + "icons": [ + "ios-clock", + "md-clock" + ], + "tags": [ + "clock", + "time" + ] + }, + { + "icons": [ + "ios-close-circle-outline" + ], + "tags": [ + "close", + "cicle" + ] + }, + { + "icons": [ + "ios-close-circle", + "md-close-circle" + ], + "tags": [ + "circle", + "close" + ] + }, + { + "icons": [ + "ios-close", + "md-close" + ], + "tags": [ + "close", + "delete", + "remove" + ] + }, + { + "icons": [ + "ios-cloud-circle", + "md-cloud-circle" + ], + "tags": [ + "circle", + "cloud" + ] + }, + { + "icons": [ + "ios-cloud-done", + "md-cloud-done" + ], + "tags": [ + "cloud", + "done" + ] + }, + { + "icons": [ + "ios-cloud-download", + "md-cloud-download" + ], + "tags": [ + "cloud", + "download", + "storage" + ] + }, + { + "icons": [ + "ios-cloud-outline", + "md-cloud-outline" + ], + "tags": [ + "cloud" + ] + }, + { + "icons": [ + "ios-cloud-upload", + "md-cloud-upload" + ], + "tags": [ + "cloud", + "storage", + "upload" + ] + }, + { + "icons": [ + "ios-cloud", + "md-cloud" + ], + "tags": [ + "cloud", + "storage", + "weather", + "whether" + ] + }, + { + "icons": [ + "ios-cloudy-night", + "md-cloudy-night" + ], + "tags": [ + "cloudy", + "night", + "overcast", + "weather", + "whether" + ] + }, + { + "icons": [ + "ios-cloudy", + "md-cloudy" + ], + "tags": [ + "cloudy", + "overcast", + "weather", + "whether" + ] + }, + { + "icons": [ + "ios-code-download", + "md-code-download" + ], + "tags": [ + "code", + "develop", + "download", + "hacker", + "program" + ] + }, + { + "icons": [ + "ios-code-working", + "md-code-working" + ], + "tags": [ + "code", + "develop", + "hacker", + "program", + "working" + ] + }, + { + "icons": [ + "ios-code", + "md-code" + ], + "tags": [ + "code", + "develop", + "hacker", + "program" + ] + }, + { + "icons": [ + "ios-cog", + "md-cog" + ], + "tags": [ + "cog", + "gear", + "options", + "settings" + ] + }, + { + "icons": [ + "ios-color-fill", + "md-color-fill" + ], + "tags": [ + "color", + "fill" + ] + }, + { + "icons": [ + "ios-color-filter", + "md-color-filter" + ], + "tags": [ + "color", + "filter" + ] + }, + { + "icons": [ + "ios-color-palette", + "md-color-palette" + ], + "tags": [ + "color", + "palette" + ] + }, + { + "icons": [ + "ios-color-wand", + "md-color-wand" + ], + "tags": [ + "color", + "wand" + ] + }, + { + "icons": [ + "ios-compass", + "md-compass" + ], + "tags": [ + "compass", + "directions", + "location", + "navigation" + ] + }, + { + "icons": [ + "ios-construct", + "md-construct" + ], + "tags": [ + "construct" + ] + }, + { + "icons": [ + "ios-contact", + "md-contact" + ], + "tags": [ + "contact", + "people", + "users" + ] + }, + { + "icons": [ + "ios-contacts", + "md-contacts" + ], + "tags": [ + "contacts", + "people", + "users" + ] + }, + { + "icons": [ + "ios-contract", + "md-contract" + ], + "tags": [ + "contract" + ] + }, + { + "icons": [ + "ios-contrast", + "md-contrast" + ], + "tags": [ + "contrast", + "dark", + "images", + "levels", + "light", + "settings" + ] + }, + { + "icons": [ + "ios-copy", + "md-copy" + ], + "tags": [ + "copy", + "duplicate", + "paper" + ] + }, + { + "icons": [ + "ios-create", + "md-create" + ], + "tags": [ + "create" + ] + }, + { + "icons": [ + "ios-crop", + "md-crop" + ], + "tags": [ + "crop" + ] + }, + { + "icons": [ + "ios-cube", + "md-cube" + ], + "tags": [ + "box", + "container", + "cube", + "square" + ] + }, + { + "icons": [ + "ios-cut", + "md-cut" + ], + "tags": [ + "cut" + ] + }, + { + "icons": [ + "ios-desktop", + "md-desktop" + ], + "tags": [ + "desktop" + ] + }, + { + "icons": [ + "ios-disc", + "md-disc" + ], + "tags": [ + "cd", + "disc", + "vinyl" + ] + }, + { + "icons": [ + "ios-document", + "md-document" + ], + "tags": [ + "document", + "file", + "paper" + ] + }, + { + "icons": [ + "ios-done-all", + "md-done-all" + ], + "tags": [ + "all", + "done" + ] + }, + { + "icons": [ + "ios-download", + "md-download" + ], + "tags": [ + "download", + "export" + ] + }, + { + "icons": [ + "ios-easel", + "md-easel" + ], + "tags": [ + "easel" + ] + }, + { + "icons": [ + "ios-egg", + "md-egg" + ], + "tags": [ + "baby", + "bird", + "birth", + "egg", + "twitter" + ] + }, + { + "icons": [ + "ios-exit", + "md-exit" + ], + "tags": [ + "exit" + ] + }, + { + "icons": [ + "ios-expand", + "md-expand" + ], + "tags": [ + "expand" + ] + }, + { + "icons": [ + "ios-eye-off", + "md-eye-off" + ], + "tags": [ + "eye", + "off" + ] + }, + { + "icons": [ + "ios-eye", + "md-eye" + ], + "tags": [ + "exposed", + "eye", + "look", + "see", + "view" + ] + }, + { + "icons": [ + "ios-fastforward", + "md-fastforward" + ], + "tags": [ + "fastforward", + "jump", + "next", + "skip" + ] + }, + { + "icons": [ + "ios-female", + "md-female" + ], + "tags": [ + "dudette", + "female", + "girl", + "lady" + ] + }, + { + "icons": [ + "ios-filing", + "md-filing" + ], + "tags": [ + "archive", + "filing" + ] + }, + { + "icons": [ + "ios-film", + "md-film" + ], + "tags": [ + "film" + ] + }, + { + "icons": [ + "ios-finger-print", + "md-finger-print" + ], + "tags": [ + "finger", + "print" + ] + }, + { + "icons": [ + "ios-flag", + "md-flag" + ], + "tags": [ + "favorite", + "flag", + "marker" + ] + }, + { + "icons": [ + "ios-flame", + "md-flame" + ], + "tags": [ + "fire", + "flame", + "heat", + "hot" + ] + }, + { + "icons": [ + "ios-flash", + "md-flash" + ], + "tags": [ + "flash", + "lightning", + "weather", + "whether" + ] + }, + { + "icons": [ + "ios-flask", + "md-flask" + ], + "tags": [ + "bubbles", + "flask", + "mixture", + "potion" + ] + }, + { + "icons": [ + "ios-flower", + "md-flower" + ], + "tags": [ + "flower" + ] + }, + { + "icons": [ + "ios-folder-open", + "md-folder-open" + ], + "tags": [ + "folder", + "open" + ] + }, + { + "icons": [ + "ios-folder", + "md-folder" + ], + "tags": [ + "file", + "folder" + ] + }, + { + "icons": [ + "ios-football", + "md-football" + ], + "tags": [ + "football", + "soccer" + ] + }, + { + "icons": [ + "ios-funnel", + "md-funnel" + ], + "tags": [ + "funnel", + "sort" + ] + }, + { + "icons": [ + "ios-git-branch", + "md-git-branch" + ], + "tags": [ + "branch", + "git" + ] + }, + { + "icons": [ + "ios-git-commit", + "md-git-commit" + ], + "tags": [ + "commit", + "git" + ] + }, + { + "icons": [ + "ios-git-compare", + "md-git-compare" + ], + "tags": [ + "compare", + "git" + ] + }, + { + "icons": [ + "ios-git-merge", + "md-git-merge" + ], + "tags": [ + "git", + "merge" + ] + }, + { + "icons": [ + "ios-git-network", + "md-git-network" + ], + "tags": [ + "git", + "network" + ] + }, + { + "icons": [ + "ios-git-pull-request", + "md-git-pull-request" + ], + "tags": [ + "git", + "pull", + "request" + ] + }, + { + "icons": [ + "ios-glasses", + "md-glasses" + ], + "tags": [ + "glasses", + "look", + "reading", + "see", + "steve" + ] + }, + { + "icons": [ + "ios-globe", + "md-globe" + ], + "tags": [ + "globe" + ] + }, + { + "icons": [ + "ios-grid", + "md-grid" + ], + "tags": [ + "grid", + "menu" + ] + }, + { + "icons": [ + "ios-hammer", + "md-hammer" + ], + "tags": [ + "hammer", + "options", + "settings", + "tools" + ] + }, + { + "icons": [ + "ios-hand", + "md-hand" + ], + "tags": [ + "hand", + "stop" + ] + }, + { + "icons": [ + "ios-happy", + "md-happy" + ], + "tags": [ + "fun", + "good", + "happy", + "like", + "yes" + ] + }, + { + "icons": [ + "ios-headset", + "md-headset" + ], + "tags": [ + "headset" + ] + }, + { + "icons": [ + "ios-heart", + "md-heart" + ], + "tags": [ + "heart", + "love" + ] + }, + { + "icons": [ + "ios-help-buoy", + "md-help-buoy" + ], + "tags": [ + "?", + "buoy", + "help", + "question" + ] + }, + { + "icons": [ + "ios-help-circle", + "md-help-circle" + ], + "tags": [ + "circle", + "help" + ] + }, + { + "icons": [ + "ios-help", + "md-help" + ], + "tags": [ + "?", + "help", + "information", + "question" + ] + }, + { + "icons": [ + "ios-home", + "md-home" + ], + "tags": [ + "home", + "house" + ] + }, + { + "icons": [ + "ios-ice-cream", + "md-ice-cream" + ], + "tags": [ + "cream", + "ice" + ] + }, + { + "icons": [ + "ios-image", + "md-image" + ], + "tags": [ + "camera", + "image", + "photo" + ] + }, + { + "icons": [ + "ios-images", + "md-images" + ], + "tags": [ + "images", + "photo" + ] + }, + { + "icons": [ + "ios-infinite", + "md-infinite" + ], + "tags": [ + "forever", + "infinite", + "loop" + ] + }, + { + "icons": [ + "ios-information-circle", + "md-information-circle" + ], + "tags": [ + "circle", + "information" + ] + }, + { + "icons": [ + "ios-information", + "md-information" + ], + "tags": [ + "help", + "information", + "knowledge" + ] + }, + { + "icons": [ + "ios-jet", + "md-jet" + ], + "tags": [ + "fly", + "jet", + "plane" + ] + }, + { + "icons": [ + "ios-key", + "md-key" + ], + "tags": [ + "access", + "key" + ] + }, + { + "icons": [ + "ios-keypad", + "md-keypad" + ], + "tags": [ + "keypad", + "type" + ] + }, + { + "icons": [ + "ios-laptop", + "md-laptop" + ], + "tags": [ + "apple", + "laptop", + "macbook", + "osx" + ] + }, + { + "icons": [ + "ios-leaf", + "md-leaf" + ], + "tags": [ + "green", + "leaf", + "nature", + "plant", + "recycle" + ] + }, + { + "icons": [ + "ios-link", + "md-link" + ], + "tags": [ + "anchor", + "attach", + "chain", + "href", + "link" + ] + }, + { + "icons": [ + "ios-list-box", + "md-list-box" + ], + "tags": [ + "box", + "list" + ] + }, + { + "icons": [ + "ios-list", + "md-list" + ], + "tags": [ + "list" + ] + }, + { + "icons": [ + "ios-locate", + "md-locate" + ], + "tags": [ + "gps", + "locate", + "maps", + "navigate" + ] + }, + { + "icons": [ + "ios-lock", + "md-lock" + ], + "tags": [ + "lock" + ] + }, + { + "icons": [ + "ios-log-in", + "md-log-in" + ], + "tags": [ + "in", + "log", + "signin" + ] + }, + { + "icons": [ + "ios-log-out", + "md-log-out" + ], + "tags": [ + "log", + "out", + "signout" + ] + }, + { + "icons": [ + "ios-magnet", + "md-magnet" + ], + "tags": [ + "attraction", + "magnet", + "sticky" + ] + }, + { + "icons": [ + "ios-mail-open", + "md-mail-open" + ], + "tags": [ + "mail", + "open" + ] + }, + { + "icons": [ + "ios-mail", + "md-mail" + ], + "tags": [ + "email", + "mail" + ] + }, + { + "icons": [ + "ios-male", + "md-male" + ], + "tags": [ + "boy", + "dude", + "guy", + "male", + "male" + ] + }, + { + "icons": [ + "ios-man", + "md-man" + ], + "tags": [ + "boy", + "dude", + "guy", + "male", + "man" + ] + }, + { + "icons": [ + "ios-map", + "md-map" + ], + "tags": [ + "gps", + "map", + "navigation", + "pin" + ] + }, + { + "icons": [ + "ios-medal", + "md-medal" + ], + "tags": [ + "medal" + ] + }, + { + "icons": [ + "ios-medical", + "md-medical" + ], + "tags": [ + "medical" + ] + }, + { + "icons": [ + "ios-medkit", + "md-medkit" + ], + "tags": [ + "case", + "disease", + "firstaid", + "health", + "medkit", + "sick" + ] + }, + { + "icons": [ + "ios-megaphone", + "md-megaphone" + ], + "tags": [ + "megaphone" + ] + }, + { + "icons": [ + "ios-menu", + "md-menu" + ], + "tags": [ + "menu" + ] + }, + { + "icons": [ + "ios-mic-off", + "md-mic-off" + ], + "tags": [ + "mic", + "noise", + "off", + "sound", + "speaker", + "talk" + ] + }, + { + "icons": [ + "ios-mic", + "md-mic" + ], + "tags": [ + "mic", + "noise", + "sound", + "speaker", + "talk" + ] + }, + { + "icons": [ + "ios-microphone", + "md-microphone" + ], + "tags": [ + "microphone", + "music", + "noise", + "recorde", + "sound", + "speak" + ] + }, + { + "icons": [ + "ios-moon", + "md-moon" + ], + "tags": [ + "dark", + "moon", + "night", + "sky" + ] + }, + { + "icons": [ + "ios-more", + "md-more" + ], + "tags": [ + "more", + "options" + ] + }, + { + "icons": [ + "ios-move", + "md-move" + ], + "tags": [ + "move" + ] + }, + { + "icons": [ + "ios-musical-note", + "md-musical-note" + ], + "tags": [ + "listening", + "musical", + "noise", + "note", + "play", + "sound" + ] + }, + { + "icons": [ + "ios-musical-notes", + "md-musical-notes" + ], + "tags": [ + "listening", + "musical", + "noise", + "notes", + "play", + "sound" + ] + }, + { + "icons": [ + "ios-navigate", + "md-navigate" + ], + "tags": [ + "gps", + "location", + "map", + "navigate", + "pin" + ] + }, + { + "icons": [ + "ios-notifications-off", + "md-notifications-off" + ], + "tags": [ + "notifications", + "off" + ] + }, + { + "icons": [ + "ios-notifications-outline", + "md-notifications-outline" + ], + "tags": [ + "notifications" + ] + }, + { + "icons": [ + "ios-notifications", + "md-notifications" + ], + "tags": [ + "notifications" + ] + }, + { + "icons": [ + "ios-nuclear", + "md-nuclear" + ], + "tags": [ + "danger", + "hazard", + "nuclear", + "warning" + ] + }, + { + "icons": [ + "ios-nutrition", + "md-nutrition" + ], + "tags": [ + "nutrition" + ] + }, + { + "icons": [ + "ios-open", + "md-open" + ], + "tags": [ + "open" + ] + }, + { + "icons": [ + "ios-options", + "md-options" + ], + "tags": [ + "options" + ] + }, + { + "icons": [ + "ios-outlet", + "md-outlet" + ], + "tags": [ + "computer", + "digital", + "electricity", + "outlet" + ] + }, + { + "icons": [ + "ios-paper-plane", + "md-paper-plane" + ], + "tags": [ + "paper", + "plane" + ] + }, + { + "icons": [ + "ios-paper", + "md-paper" + ], + "tags": [ + "feed", + "paper", + "paper" + ] + }, + { + "icons": [ + "ios-partly-sunny", + "md-partly-sunny" + ], + "tags": [ + "partly", + "sunny" + ] + }, + { + "icons": [ + "ios-pause", + "md-pause" + ], + "tags": [ + "break", + "freeze", + "hold", + "music", + "pause" + ] + }, + { + "icons": [ + "ios-paw", + "md-paw" + ], + "tags": [ + "paw" + ] + }, + { + "icons": [ + "ios-people", + "md-people" + ], + "tags": [ + "head", + "human", + "people", + "person", + "stalker", + "users" + ] + }, + { + "icons": [ + "ios-person-add", + "md-person-add" + ], + "tags": [ + "add", + "head", + "human", + "member", + "new", + "person", + "staff", + "users" + ] + }, + { + "icons": [ + "ios-person", + "md-person" + ], + "tags": [ + "head", + "human", + "person", + "staff", + "users" + ] + }, + { + "icons": [ + "ios-phone-landscape", + "md-phone-landscape" + ], + "tags": [ + "landscape", + "phone" + ] + }, + { + "icons": [ + "ios-phone-portrait", + "md-phone-portrait" + ], + "tags": [ + "phone", + "portrait" + ] + }, + { + "icons": [ + "ios-photos", + "md-photos" + ], + "tags": [ + "images", + "photos", + "square", + "stills" + ] + }, + { + "icons": [ + "ios-pie", + "md-pie" + ], + "tags": [ + "cog", + "options", + "pie", + "settings" + ] + }, + { + "icons": [ + "ios-pin", + "md-pin" + ], + "tags": [ + "gps", + "navigation", + "pin" + ] + }, + { + "icons": [ + "ios-pint", + "md-pint" + ], + "tags": [ + "pint" + ] + }, + { + "icons": [ + "ios-pizza", + "md-pizza" + ], + "tags": [ + "drink", + "eat", + "food", + "pizza" + ] + }, + { + "icons": [ + "ios-planet", + "md-planet" + ], + "tags": [ + "globe", + "home", + "nature", + "planet", + "planet", + "space" + ] + }, + { + "icons": [ + "ios-play", + "md-play" + ], + "tags": [ + "arrow", + "music", + "play", + "right", + "watch" + ] + }, + { + "icons": [ + "ios-podium", + "md-podium" + ], + "tags": [ + "award", + "compete", + "competition", + "lose", + "podium", + "win" + ] + }, + { + "icons": [ + "ios-power", + "md-power" + ], + "tags": [ + "off", + "on", + "power" + ] + }, + { + "icons": [ + "ios-pricetag", + "md-pricetag" + ], + "tags": [ + "$", + "commerce", + "items", + "money", + "pricetag", + "shopping" + ] + }, + { + "icons": [ + "ios-pricetags", + "md-pricetags" + ], + "tags": [ + "$", + "commerce", + "items", + "money", + "pricetags", + "shopping" + ] + }, + { + "icons": [ + "ios-print", + "md-print" + ], + "tags": [ + "print" + ] + }, + { + "icons": [ + "ios-pulse", + "md-pulse" + ], + "tags": [ + "hot", + "live", + "pulse", + "rate" + ] + }, + { + "icons": [ + "ios-qr-scanner", + "md-qr-scanner" + ], + "tags": [ + "qr", + "reader", + "scanner" + ] + }, + { + "icons": [ + "ios-quote", + "md-quote" + ], + "tags": [ + "chat", + "quotation", + "quote" + ] + }, + { + "icons": [ + "ios-radio-button-off", + "md-radio-button-off" + ], + "tags": [ + "button", + "off", + "radio" + ] + }, + { + "icons": [ + "ios-radio-button-on", + "md-radio-button-on" + ], + "tags": [ + "button", + "on", + "radio" + ] + }, + { + "icons": [ + "ios-radio", + "md-radio" + ], + "tags": [ + "radio" + ] + }, + { + "icons": [ + "ios-rainy", + "md-rainy" + ], + "tags": [ + "cloud", + "rainy", + "water", + "weather", + "whether" + ] + }, + { + "icons": [ + "ios-recording", + "md-recording" + ], + "tags": [ + "film", + "recording", + "tape", + "voicemail" + ] + }, + { + "icons": [ + "ios-redo", + "md-redo" + ], + "tags": [ + "forward", + "redo" + ] + }, + { + "icons": [ + "ios-refresh-circle", + "md-refresh-circle" + ], + "tags": [ + "circle", + "refresh" + ] + }, + { + "icons": [ + "ios-refresh", + "md-refresh" + ], + "tags": [ + "refresh", + "reload", + "renew", + "reset" + ] + }, + { + "icons": [ + "ios-remove-circle", + "md-remove-circle" + ], + "tags": [ + "circle", + "remove" + ] + }, + { + "icons": [ + "ios-remove", + "md-remove" + ], + "tags": [ + "minus", + "remove", + "subtract" + ] + }, + { + "icons": [ + "ios-reorder", + "md-reorder" + ], + "tags": [ + "reorder" + ] + }, + { + "icons": [ + "ios-repeat", + "md-repeat" + ], + "tags": [ + "repeat" + ] + }, + { + "icons": [ + "ios-resize", + "md-resize" + ], + "tags": [ + "resize" + ] + }, + { + "icons": [ + "ios-restaurant", + "md-restaurant" + ], + "tags": [ + "restaurant" + ] + }, + { + "icons": [ + "ios-return-left", + "md-return-left" + ], + "tags": [ + "left", + "return" + ] + }, + { + "icons": [ + "ios-return-right", + "md-return-right" + ], + "tags": [ + "return", + "right" + ] + }, + { + "icons": [ + "ios-reverse-camera", + "md-reverse-camera" + ], + "tags": [ + "camera", + "picture", + "reverse" + ] + }, + { + "icons": [ + "ios-rewind", + "md-rewind" + ], + "tags": [ + "back", + "music", + "previous", + "rewind" + ] + }, + { + "icons": [ + "ios-ribbon", + "md-ribbon" + ], + "tags": [ + "ribbon" + ] + }, + { + "icons": [ + "ios-rose", + "md-rose" + ], + "tags": [ + "rose" + ] + }, + { + "icons": [ + "ios-sad", + "md-sad" + ], + "tags": [ + "bad", + "cry", + "no", + "sad" + ] + }, + { + "icons": [ + "ios-school", + "md-school" + ], + "tags": [ + "school" + ] + }, + { + "icons": [ + "ios-search", + "md-search" + ], + "tags": [ + "magnifyingglass", + "search" + ] + }, + { + "icons": [ + "ios-send", + "md-send" + ], + "tags": [ + "email", + "paper", + "send" + ] + }, + { + "icons": [ + "ios-settings", + "md-settings" + ], + "tags": [ + "options", + "settings" + ] + }, + { + "icons": [ + "ios-share-alt", + "md-share-alt" + ], + "tags": [ + "alt", + "share" + ] + }, + { + "icons": [ + "ios-share", + "md-share" + ], + "tags": [ + "share" + ] + }, + { + "icons": [ + "ios-shirt", + "md-shirt" + ], + "tags": [ + "shirt" + ] + }, + { + "icons": [ + "ios-shuffle", + "md-shuffle" + ], + "tags": [ + "random", + "shuffle" + ] + }, + { + "icons": [ + "ios-skip-backward", + "md-skip-backward" + ], + "tags": [ + "backward", + "music", + "previous", + "skip" + ] + }, + { + "icons": [ + "ios-skip-forward", + "md-skip-forward" + ], + "tags": [ + "forward", + "music", + "next", + "skip" + ] + }, + { + "icons": [ + "ios-snow", + "md-snow" + ], + "tags": [ + "snow" + ] + }, + { + "icons": [ + "ios-speedometer", + "md-speedometer" + ], + "tags": [ + "drive", + "level", + "speed", + "speedometer" + ] + }, + { + "icons": [ + "ios-square-outline", + "md-square-outline" + ], + "tags": [ + "square" + ] + }, + { + "icons": [ + "ios-square", + "md-square" + ], + "tags": [ + "square" + ] + }, + { + "icons": [ + "ios-star-half", + "md-star-half" + ], + "tags": [ + "favorite", + "half", + "rate", + "star" + ] + }, + { + "icons": [ + "ios-star-outline", + "md-star-outline" + ], + "tags": [ + "star" + ] + }, + { + "icons": [ + "ios-star", + "md-star" + ], + "tags": [ + "favorite", + "star" + ] + }, + { + "icons": [ + "ios-stats", + "md-stats" + ], + "tags": [ + "stats" + ] + }, + { + "icons": [ + "ios-stopwatch", + "md-stopwatch" + ], + "tags": [ + "stopwatch" + ] + }, + { + "icons": [ + "ios-subway", + "md-subway" + ], + "tags": [ + "subway" + ] + }, + { + "icons": [ + "ios-sunny", + "md-sunny" + ], + "tags": [ + "light", + "sky", + "sunny", + "weather", + "whether" + ] + }, + { + "icons": [ + "ios-swap", + "md-swap" + ], + "tags": [ + "swap" + ] + }, + { + "icons": [ + "ios-switch", + "md-switch" + ], + "tags": [ + "switch" + ] + }, + { + "icons": [ + "ios-sync", + "md-sync" + ], + "tags": [ + "sync" + ] + }, + { + "icons": [ + "ios-tablet-landscape", + "md-tablet-landscape" + ], + "tags": [ + "landscape", + "tablet" + ] + }, + { + "icons": [ + "ios-tablet-portrait", + "md-tablet-portrait" + ], + "tags": [ + "portrait", + "tablet" + ] + }, + { + "icons": [ + "ios-tennisball", + "md-tennisball" + ], + "tags": [ + "tennisball" + ] + }, + { + "icons": [ + "ios-text", + "md-text" + ], + "tags": [ + "text" + ] + }, + { + "icons": [ + "ios-thermometer", + "md-thermometer" + ], + "tags": [ + "cold", + "heat", + "hot", + "mercury", + "temperature", + "thermometer" + ] + }, + { + "icons": [ + "ios-thumbs-down", + "md-thumbs-down" + ], + "tags": [ + "down", + "thumbs" + ] + }, + { + "icons": [ + "ios-thumbs-up", + "md-thumbs-up" + ], + "tags": [ + "thumbs", + "up" + ] + }, + { + "icons": [ + "ios-thunderstorm", + "md-thunderstorm" + ], + "tags": [ + "cloudy", + "lightning", + "overcast", + "rain", + "sky", + "storm", + "thunderstorm", + "weather", + "whether" + ] + }, + { + "icons": [ + "ios-time", + "md-time" + ], + "tags": [ + "clock", + "hour", + "minute", + "second", + "time", + "watch" + ] + }, + { + "icons": [ + "ios-timer", + "md-timer" + ], + "tags": [ + "clock", + "timer" + ] + }, + { + "icons": [ + "ios-train", + "md-train" + ], + "tags": [ + "train" + ] + }, + { + "icons": [ + "ios-transgender", + "md-transgender" + ], + "tags": [ + "transgender" + ] + }, + { + "icons": [ + "ios-trash", + "md-trash" + ], + "tags": [ + "close", + "delete", + "remove", + "trash" + ] + }, + { + "icons": [ + "ios-trending-down", + "md-trending-down" + ], + "tags": [ + "down", + "trending" + ] + }, + { + "icons": [ + "ios-trending-up", + "md-trending-up" + ], + "tags": [ + "trending", + "up" + ] + }, + { + "icons": [ + "ios-trophy", + "md-trophy" + ], + "tags": [ + "award", + "compete", + "competition", + "lose", + "trophy", + "win" + ] + }, + { + "icons": [ + "ios-umbrella", + "md-umbrella" + ], + "tags": [ + "dry", + "rain", + "shelter", + "umbrella", + "wet" + ] + }, + { + "icons": [ + "ios-undo", + "md-undo" + ], + "tags": [ + "reply", + "undo" + ] + }, + { + "icons": [ + "ios-unlock", + "md-unlock" + ], + "tags": [ + "unlock" + ] + }, + { + "icons": [ + "ios-videocam", + "md-videocam" + ], + "tags": [ + "camera", + "film", + "movie", + "videocam" + ] + }, + { + "icons": [ + "ios-volume-mute", + "md-volume-mute" + ], + "tags": [ + "mute", + "sound", + "volume" + ] + }, + { + "icons": [ + "ios-volume-off", + "md-volume-off" + ], + "tags": [ + "off", + "volume" + ] + }, + { + "icons": [ + "ios-walk", + "md-walk" + ], + "tags": [ + "walk" + ] + }, + { + "icons": [ + "ios-warning", + "md-warning" + ], + "tags": [ + "warning" + ] + }, + { + "icons": [ + "ios-watch", + "md-watch" + ], + "tags": [ + "watch" + ] + }, + { + "icons": [ + "ios-water", + "md-water" + ], + "tags": [ + "water" + ] + }, + { + "icons": [ + "ios-wifi", + "md-wifi" + ], + "tags": [ + "bars", + "connection", + "internet", + "wifi" + ] + }, + { + "icons": [ + "ios-wine", + "md-wine" + ], + "tags": [ + "wine" + ] + }, + { + "icons": [ + "ios-woman", + "md-woman" + ], + "tags": [ + "dudette", + "female", + "girl", + "lady", + "woman" + ] + }, + { + "icons": [ + "logo-android" + ], + "tags": [ + "android" + ] + }, + { + "icons": [ + "logo-angular" + ], + "tags": [ + "angular" + ] + }, + { + "icons": [ + "logo-apple" + ], + "tags": [ + "apple" + ] + }, + { + "icons": [ + "logo-bitcoin" + ], + "tags": [ + "bitcoin" + ] + }, + { + "icons": [ + "logo-buffer" + ], + "tags": [ + "buffer" + ] + }, + { + "icons": [ + "logo-chrome" + ], + "tags": [ + "chrome" + ] + }, + { + "icons": [ + "logo-codepen" + ], + "tags": [ + "codepen" + ] + }, + { + "icons": [ + "logo-css3" + ], + "tags": [ + "css3" + ] + }, + { + "icons": [ + "logo-designernews" + ], + "tags": [ + "designernews" + ] + }, + { + "icons": [ + "logo-dribbble" + ], + "tags": [ + "dribbble" + ] + }, + { + "icons": [ + "logo-dropbox" + ], + "tags": [ + "dropbox" + ] + }, + { + "icons": [ + "logo-euro" + ], + "tags": [ + "euro" + ] + }, + { + "icons": [ + "logo-facebook" + ], + "tags": [ + "facebook" + ] + }, + { + "icons": [ + "logo-foursquare" + ], + "tags": [ + "foursquare" + ] + }, + { + "icons": [ + "logo-freebsd-devil" + ], + "tags": [ + "freebsd-devil" + ] + }, + { + "icons": [ + "logo-github" + ], + "tags": [ + "github" + ] + }, + { + "icons": [ + "logo-google" + ], + "tags": [ + "google" + ] + }, + { + "icons": [ + "logo-googleplus" + ], + "tags": [ + "googleplus" + ] + }, + { + "icons": [ + "logo-hackernews" + ], + "tags": [ + "hackernews" + ] + }, + { + "icons": [ + "logo-html5" + ], + "tags": [ + "html5" + ] + }, + { + "icons": [ + "logo-instagram" + ], + "tags": [ + "instagram" + ] + }, + { + "icons": [ + "logo-javascript" + ], + "tags": [ + "javascript" + ] + }, + { + "icons": [ + "logo-linkedin" + ], + "tags": [ + "linkedin" + ] + }, + { + "icons": [ + "logo-markdown" + ], + "tags": [ + "markdown" + ] + }, + { + "icons": [ + "logo-nodejs" + ], + "tags": [ + "nodejs" + ] + }, + { + "icons": [ + "logo-octocat" + ], + "tags": [ + "octocat" + ] + }, + { + "icons": [ + "logo-pinterest" + ], + "tags": [ + "pinterest" + ] + }, + { + "icons": [ + "logo-playstation" + ], + "tags": [ + "playstation" + ] + }, + { + "icons": [ + "logo-python" + ], + "tags": [ + "python" + ] + }, + { + "icons": [ + "logo-reddit" + ], + "tags": [ + "reddit" + ] + }, + { + "icons": [ + "logo-rss" + ], + "tags": [ + "rss" + ] + }, + { + "icons": [ + "logo-sass" + ], + "tags": [ + "sass" + ] + }, + { + "icons": [ + "logo-skype" + ], + "tags": [ + "skype" + ] + }, + { + "icons": [ + "logo-snapchat" + ], + "tags": [ + "snapchat" + ] + }, + { + "icons": [ + "logo-steam" + ], + "tags": [ + "steam" + ] + }, + { + "icons": [ + "logo-tumblr" + ], + "tags": [ + "tumblr" + ] + }, + { + "icons": [ + "logo-tux" + ], + "tags": [ + "tux" + ] + }, + { + "icons": [ + "logo-twitch" + ], + "tags": [ + "twitch" + ] + }, + { + "icons": [ + "logo-twitter" + ], + "tags": [ + "twitter" + ] + }, + { + "icons": [ + "logo-usd" + ], + "tags": [ + "usd" + ] + }, + { + "icons": [ + "logo-vimeo" + ], + "tags": [ + "vimeo" + ] + }, + { + "icons": [ + "logo-whatsapp" + ], + "tags": [ + "whatsapp" + ] + }, + { + "icons": [ + "logo-windows" + ], + "tags": [ + "windows" + ] + }, + { + "icons": [ + "logo-wordpress" + ], + "tags": [ + "wordpress" + ] + }, + { + "icons": [ + "logo-xbox" + ], + "tags": [ + "xbox" + ] + }, + { + "icons": [ + "logo-yahoo" + ], + "tags": [ + "yahoo" + ] + }, + { + "icons": [ + "logo-yen" + ], + "tags": [ + "yen" + ] + }, + { + "icons": [ + "logo-youtube" + ], + "tags": [ + "youtube" + ] + } +] diff --git a/src/libs/router-util.js b/src/libs/router-util.js new file mode 100644 index 0000000..336a49c --- /dev/null +++ b/src/libs/router-util.js @@ -0,0 +1,65 @@ +import { + hasChild, + localRead, + getToken +} from '@/libs/util' +import Main from '@/components/main' +import routers from '@/router/routers' +import Router from 'vue-router' +import { + forEach +} from '@/libs/tools' +import routes from "../router/routers"; + +// 加载菜单 +export const loadMenuList = () => { + let list = [] + let menuListStr = localRead('route') + if (!menuListStr) { + return list + } + let menuList = formatMenuList(JSON.parse(menuListStr)) + list = routers.concat(menuList) + return list +} + +export const formatMenuList = (list) => { + console.log(list) + // 遍历格式化菜单 + let resList = [] + forEach(list, item => { + let object = { + path: item.url, + name: item.permissionCode, + meta:{ + hideInMenu: false, + notCache: false, + icon: item.icon, + title: item.permissionName + } + } + + if (item.level === 0 || item.component === 'Main') { + // 一级菜单 + object.component = Main + } else { + // 二级菜单 + // 这里的component 应为 /sys/sys-user 类似的数据,对应的是src/view/下的本地文件 + object.component = () => import('@/view' + item.component + '.vue') + } + + if (hasChild(item)) { + // 如果有子菜单那么则递归 + object.children = formatMenuList(item.children) + } + resList.push(object) + }) + + return resList +} + +// 定义一个函数来创建router +export const createRouter = (routes) => new Router({ + routes, + mode: 'history' +}) diff --git a/src/libs/tools.js b/src/libs/tools.js new file mode 100644 index 0000000..0ca81d6 --- /dev/null +++ b/src/libs/tools.js @@ -0,0 +1,215 @@ +export const forEach = (arr, fn) => { + if (!arr.length || !fn) return + let i = -1 + let len = arr.length + while (++i < len) { + let item = arr[i] + fn(item, i, arr) + } +} + +/** + * @param {Array} arr1 + * @param {Array} arr2 + * @description 得到两个数组的交集, 两个数组的元素为数值或字符串 + */ +export const getIntersection = (arr1, arr2) => { + let len = Math.min(arr1.length, arr2.length) + let i = -1 + let res = [] + while (++i < len) { + const item = arr2[i] + if (arr1.indexOf(item) > -1) res.push(item) + } + return res +} + +/** + * @param {Array} arr1 + * @param {Array} arr2 + * @description 得到两个数组的并集, 两个数组的元素为数值或字符串 + */ +export const getUnion = (arr1, arr2) => { + return Array.from(new Set([...arr1, ...arr2])) +} + +/** + * @param {Array} target 目标数组 + * @param {Array} arr 需要查询的数组 + * @description 判断要查询的数组是否至少有一个元素包含在目标数组中 + */ +export const hasOneOf = (targetarr, arr) => { + return targetarr.some(_ => arr.indexOf(_) > -1) +} + +/** + * @param {String|Number} value 要验证的字符串或数值 + * @param {*} validList 用来验证的列表 + */ +export function oneOf (value, validList) { + for (let i = 0; i < validList.length; i++) { + if (value === validList[i]) { + return true + } + } + return false +} + +/** + * @param {Number} timeStamp 判断时间戳格式是否是毫秒 + * @returns {Boolean} + */ +const isMillisecond = timeStamp => { + const timeStr = String(timeStamp) + return timeStr.length > 10 +} + +/** + * @param {Number} timeStamp 传入的时间戳 + * @param {Number} currentTime 当前时间时间戳 + * @returns {Boolean} 传入的时间戳是否早于当前时间戳 + */ +const isEarly = (timeStamp, currentTime) => { + return timeStamp < currentTime +} + +/** + * @param {Number} num 数值 + * @returns {String} 处理后的字符串 + * @description 如果传入的数值小于10,即位数只有1位,则在前面补充0 + */ +const getHandledValue = num => { + return num < 10 ? '0' + num : num +} + +/** + * @param {Number} timeStamp 传入的时间戳 + * @param {Number} startType 要返回的时间字符串的格式类型,传入'year'则返回年开头的完整时间 + */ +const getDate = (timeStamp, startType) => { + const d = new Date(timeStamp * 1000) + const year = d.getFullYear() + const month = getHandledValue(d.getMonth() + 1) + const date = getHandledValue(d.getDate()) + const hours = getHandledValue(d.getHours()) + const minutes = getHandledValue(d.getMinutes()) + const second = getHandledValue(d.getSeconds()) + let resStr = '' + if (startType === 'year') resStr = year + '-' + month + '-' + date + ' ' + hours + ':' + minutes + ':' + second + else resStr = month + '-' + date + ' ' + hours + ':' + minutes + return resStr +} + +/** + * @param {String|Number} timeStamp 时间戳 + * @returns {String} 相对时间字符串 + */ +export const getRelativeTime = timeStamp => { + // 判断当前传入的时间戳是秒格式还是毫秒 + const IS_MILLISECOND = isMillisecond(timeStamp) + // 如果是毫秒格式则转为秒格式 + if (IS_MILLISECOND) Math.floor(timeStamp /= 1000) + // 传入的时间戳可以是数值或字符串类型,这里统一转为数值类型 + timeStamp = Number(timeStamp) + // 获取当前时间时间戳 + const currentTime = Math.floor(Date.parse(new Date()) / 1000) + // 判断传入时间戳是否早于当前时间戳 + const IS_EARLY = isEarly(timeStamp, currentTime) + // 获取两个时间戳差值 + let diff = currentTime - timeStamp + // 如果IS_EARLY为false则差值取反 + if (!IS_EARLY) diff = -diff + let resStr = '' + const dirStr = IS_EARLY ? '前' : '后' + // 少于等于59秒 + if (diff <= 59) resStr = diff + '秒' + dirStr + // 多于59秒,少于等于59分钟59秒 + else if (diff > 59 && diff <= 3599) resStr = Math.floor(diff / 60) + '分钟' + dirStr + // 多于59分钟59秒,少于等于23小时59分钟59秒 + else if (diff > 3599 && diff <= 86399) resStr = Math.floor(diff / 3600) + '小时' + dirStr + // 多于23小时59分钟59秒,少于等于29天59分钟59秒 + else if (diff > 86399 && diff <= 2623859) resStr = Math.floor(diff / 86400) + '天' + dirStr + // 多于29天59分钟59秒,少于364天23小时59分钟59秒,且传入的时间戳早于当前 + else if (diff > 2623859 && diff <= 31567859 && IS_EARLY) resStr = getDate(timeStamp) + else resStr = getDate(timeStamp, 'year') + return resStr +} + +/** + * @returns {String} 当前浏览器名称 + */ +export const getExplorer = () => { + const ua = window.navigator.userAgent + const isExplorer = (exp) => { + return ua.indexOf(exp) > -1 + } + if (isExplorer('MSIE')) return 'IE' + else if (isExplorer('Firefox')) return 'Firefox' + else if (isExplorer('Chrome')) return 'Chrome' + else if (isExplorer('Opera')) return 'Opera' + else if (isExplorer('Safari')) return 'Safari' +} + +/** + * @description 绑定事件 on(element, event, handler) + */ +export const on = (function () { + if (document.addEventListener) { + return function (element, event, handler) { + if (element && event && handler) { + element.addEventListener(event, handler, false) + } + } + } else { + return function (element, event, handler) { + if (element && event && handler) { + element.attachEvent('on' + event, handler) + } + } + } +})() + +/** + * @description 解绑事件 off(element, event, handler) + */ +export const off = (function () { + if (document.removeEventListener) { + return function (element, event, handler) { + if (element && event) { + element.removeEventListener(event, handler, false) + } + } + } else { + return function (element, event, handler) { + if (element && event) { + element.detachEvent('on' + event, handler) + } + } + } +})() + +/** + * 判断一个对象是否存在key,如果传入第二个参数key,则是判断这个obj对象是否存在key这个属性 + * 如果没有传入key这个参数,则判断obj对象是否有键值对 + */ +export const hasKey = (obj, key) => { + if (key) return key in obj + else { + let keysArr = Object.keys(obj) + return keysArr.length + } +} + +/** + * @param {*} obj1 对象 + * @param {*} obj2 对象 + * @description 判断两个对象是否相等,这两个对象的值只能是数字或字符串 + */ +export const objEqual = (obj1, obj2) => { + const keysArr1 = Object.keys(obj1) + const keysArr2 = Object.keys(obj2) + if (keysArr1.length !== keysArr2.length) return false + else if (keysArr1.length === 0 && keysArr2.length === 0) return true + /* eslint-disable-next-line */ + else return !keysArr1.some(key => obj1[key] != obj2[key]) +} diff --git a/src/libs/util.js b/src/libs/util.js new file mode 100644 index 0000000..293a038 --- /dev/null +++ b/src/libs/util.js @@ -0,0 +1,381 @@ +import Cookies from 'js-cookie' +// cookie保存的天数 +import config from '@/config' +import { forEach, hasOneOf, objEqual } from '@/libs/tools' +const { title, cookieExpires, useI18n } = config + +// 将token 和 过期时间expireTime 存入 cookie中 +export const TOKEN_KEY = 'token' + +export const setToken = (token) => { + Cookies.set(TOKEN_KEY, token, {expires: config.cookieExpires || 1}) +} + +export const getToken = () => { + const token = Cookies.get(TOKEN_KEY) + if (token) return token + else return false +} + +export const EXPIRETIME_KEY = 'expireTime' + +export const setExpireTime = (expireTime) => { + Cookies.set(EXPIRETIME_KEY, expireTime, {expires: config.cookieExpires || 1}) +} + +export const getExpireTime = () => { + const expireTime = Cookies.get(EXPIRETIME_KEY) + if (expireTime) return expireTime + else return false +} + +export const hasChild = (item) => { + return item.children && item.children.length !== 0 +} + +const showThisMenuEle = (item, access) => { + if (item.meta && item.meta.access && item.meta.access.length) { + if (hasOneOf(item.meta.access, access)) return true + else return false + } else return true +} +/** + * @param {Array} list 通过路由列表得到菜单列表 + * @returns {Array} + */ +export const getMenuByRouter = (list, access) => { + let res = [] + forEach(list, item => { + if (!item.meta || (item.meta && !item.meta.hideInMenu)) { + let obj = { + icon: (item.meta && item.meta.icon) || '', + name: item.name, + meta: item.meta + } + if ((hasChild(item) || (item.meta && item.meta.showAlways)) && showThisMenuEle(item, access)) { + obj.children = getMenuByRouter(item.children, access) + } + if (item.meta && item.meta.href) obj.href = item.meta.href + if (showThisMenuEle(item, access)) res.push(obj) + } + }) + return res +} + +/** + * @param {Array} routeMetched 当前路由metched + * @returns {Array} + */ +export const getBreadCrumbList = (route, homeRoute) => { + let homeItem = { ...homeRoute, icon: homeRoute.meta.icon } + let routeMetched = route.matched + if (routeMetched.some(item => item.name === homeRoute.name)) return [homeItem] + let res = routeMetched.filter(item => { + return item.meta === undefined || !item.meta.hide + }).map(item => { + let meta = {...item.meta} + if (meta.title && typeof meta.title === 'function') meta.title = meta.title(route) + let obj = { + icon: (item.meta && item.meta.icon) || '', + name: item.name, + meta: meta + } + return obj + }) + res = res.filter(item => { + return !item.meta.hideInMenu + }) + return [{...homeItem, to: homeRoute.path}, ...res] +} + +export const getRouteTitleHandled = (route) => { + let router = {...route} + let meta = {...route.meta} + let title = '' + if (meta.title) { + if (typeof meta.title === 'function') title = meta.title(router) + else title = meta.title + } + meta.title = title + router.meta = meta + return router +} + +export const showTitle = (item, vm) => { + let title = item.meta.title + if (vm.$config.useI18n) { + if (title.includes('{{') && title.includes('}}') && vm.$config.useI18n) title = title.replace(/({{[\s\S]+?}})/, (m, str) => str.replace(/{{([\s\S]*)}}/, (m, _) => vm.$t(_.trim()))) + else title = vm.$t(item.name) + } else title = (item.meta && item.meta.title) || item.name + return title +} + +/** + * @description 本地存储和获取标签导航列表 + */ +export const setTagNavListInLocalstorage = list => { + localStorage.tagNaveList = JSON.stringify(list) +} +/** + * @returns {Array} 其中的每个元素只包含路由原信息中的name, path, meta三项 + */ +export const getTagNavListFromLocalstorage = () => { + const list = localStorage.tagNaveList + return list ? JSON.parse(list) : [] +} + +/** + * @param {Array} routers 路由列表数组 + * @description 用于找到路由列表中name为home的对象 + */ +export const getHomeRoute = (routers, homeName = 'home') => { + let i = -1 + let len = routers.length + let homeRoute = {} + while (++i < len) { + let item = routers[i] + if (item.children && item.children.length) { + let res = getHomeRoute(item.children, homeName) + if (res.name) return res + } else { + if (item.name === homeName) homeRoute = item + } + } + return homeRoute +} + +/** + * @param {*} list 现有标签导航列表 + * @param {*} newRoute 新添加的路由原信息对象 + * @description 如果该newRoute已经存在则不再添加 + */ +export const getNewTagList = (list, newRoute) => { + const { name, path, meta } = newRoute + let newList = [...list] + if (newList.findIndex(item => item.name === name) >= 0) return newList + else newList.push({ name, path, meta }) + return newList +} + +/** + * @param {*} access 用户权限数组,如 ['super_admin', 'admin'] + * @param {*} route 路由列表 + */ +const hasAccess = (access, route) => { + if (route.meta && route.meta.access) return hasOneOf(access, route.meta.access) + else return true +} + +/** + * 权鉴 + * @param {*} name 即将跳转的路由name + * @param {*} access 用户权限数组 + * @param {*} routes 路由列表 + * @description 用户是否可跳转到该页 + */ +export const canTurnTo = (name, access, routes) => { + const routePermissionJudge = (list) => { + return list.some(item => { + if (item.children && item.children.length) { + return routePermissionJudge(item.children) + } else if (item.name === name) { + return hasAccess(access, item) + } + }) + } + + return routePermissionJudge(routes) +} + +/** + * @param {String} url + * @description 从URL中解析参数 + */ +export const getParams = url => { + const keyValueArr = url.split('?')[1].split('&') + let paramObj = {} + keyValueArr.forEach(item => { + const keyValue = item.split('=') + paramObj[keyValue[0]] = keyValue[1] + }) + return paramObj +} + +/** + * @param {Array} list 标签列表 + * @param {String} name 当前关闭的标签的name + */ +export const getNextRoute = (list, route) => { + let res = {} + if (list.length === 2) { + res = getHomeRoute(list) + } else { + const index = list.findIndex(item => routeEqual(item, route)) + if (index === list.length - 1) res = list[list.length - 2] + else res = list[index + 1] + } + return res +} + +/** + * @param {Number} times 回调函数需要执行的次数 + * @param {Function} callback 回调函数 + */ +export const doCustomTimes = (times, callback) => { + let i = -1 + while (++i < times) { + callback(i) + } +} + +/** + * @param {Object} file 从上传组件得到的文件对象 + * @returns {Promise} resolve参数是解析后的二维数组 + * @description 从Csv文件中解析出表格,解析成二维数组 + */ +export const getArrayFromFile = (file) => { + let nameSplit = file.name.split('.') + let format = nameSplit[nameSplit.length - 1] + return new Promise((resolve, reject) => { + let reader = new FileReader() + reader.readAsText(file) // 以文本格式读取 + let arr = [] + reader.onload = function (evt) { + let data = evt.target.result // 读到的数据 + let pasteData = data.trim() + arr = pasteData.split((/[\n\u0085\u2028\u2029]|\r\n?/g)).map(row => { + return row.split('\t') + }).map(item => { + return item[0].split(',') + }) + if (format === 'csv') resolve(arr) + else reject(new Error('[Format Error]:你上传的不是Csv文件')) + } + }) +} + +/** + * @param {Array} array 表格数据二维数组 + * @returns {Object} { columns, tableData } + * @description 从二维数组中获取表头和表格数据,将第一行作为表头,用于在iView的表格中展示数据 + */ +export const getTableDataFromArray = (array) => { + let columns = [] + let tableData = [] + if (array.length > 1) { + let titles = array.shift() + columns = titles.map(item => { + return { + title: item, + key: item + } + }) + tableData = array.map(item => { + let res = {} + item.forEach((col, i) => { + res[titles[i]] = col + }) + return res + }) + } + return { + columns, + tableData + } +} + +export const findNodeUpper = (ele, tag) => { + if (ele.parentNode) { + if (ele.parentNode.tagName === tag.toUpperCase()) { + return ele.parentNode + } else { + return findNodeUpper(ele.parentNode, tag) + } + } +} + +export const findNodeUpperByClasses = (ele, classes) => { + let parentNode = ele.parentNode + if (parentNode) { + let classList = parentNode.classList + if (classList && classes.every(className => classList.contains(className))) { + return parentNode + } else { + return findNodeUpperByClasses(parentNode, classes) + } + } +} + +export const findNodeDownward = (ele, tag) => { + const tagName = tag.toUpperCase() + if (ele.childNodes.length) { + let i = -1 + let len = ele.childNodes.length + while (++i < len) { + let child = ele.childNodes[i] + if (child.tagName === tagName) return child + else return findNodeDownward(child, tag) + } + } +} + +export const showByAccess = (access, canViewAccess) => { + return hasOneOf(canViewAccess, access) +} + +/** + * @description 根据name/params/query判断两个路由对象是否相等 + * @param {*} route1 路由对象 + * @param {*} route2 路由对象 + */ +export const routeEqual = (route1, route2) => { + const params1 = route1.params || {} + const params2 = route2.params || {} + const query1 = route1.query || {} + const query2 = route2.query || {} + return (route1.name === route2.name) && objEqual(params1, params2) && objEqual(query1, query2) +} + +/** + * 判断打开的标签列表里是否已存在这个新添加的路由对象 + */ +export const routeHasExist = (tagNavList, routeItem) => { + let len = tagNavList.length + let res = false + doCustomTimes(len, (index) => { + if (routeEqual(tagNavList[index], routeItem)) res = true + }) + return res +} + +export const localSave = (key, value) => { + localStorage.setItem(key, value) +} + +export const localRead = (key) => { + return localStorage.getItem(key) || '' +} + +export const localDelete = (key) => { + return localStorage.removeItem(key) +} + +/** + * @description 根据当前跳转的路由设置显示在浏览器标签的title + * @param {Object} routeItem 路由对象 + * @param {Object} vm Vue实例 + */ +export const setTitle = (routeItem, vm) => { + const handledRoute = getRouteTitleHandled(routeItem) + const pageTitle = showTitle(handledRoute, vm) + const resTitle = pageTitle ? `${title} - ${pageTitle}` : title + window.document.title = resTitle +} + +/** + * @description 读取并且拼接路由 + */ +export const localReadRouters = () => { + localStorage.getItem('route') + return localStorage.getItem('route') +} diff --git a/src/locale/index.js b/src/locale/index.js new file mode 100644 index 0000000..25f84bc --- /dev/null +++ b/src/locale/index.js @@ -0,0 +1,37 @@ +import Vue from 'vue' +import VueI18n from 'vue-i18n' +import { localRead } from '@/libs/util' +import customZhCn from './lang/zh-CN' +import customZhTw from './lang/zh-TW' +import customEnUs from './lang/en-US' +import zhCnLocale from 'view-design/src/locale/lang/zh-CN' +import enUsLocale from 'view-design/src/locale/lang/en-US' +import zhTwLocale from 'view-design/src/locale/lang/zh-TW' + +Vue.use(VueI18n) + +// 自动根据浏览器系统语言设置语言 +const navLang = navigator.language +const localLang = (navLang === 'zh-CN' || navLang === 'en-US') ? navLang : false +let lang = localLang || localRead('local') || 'zh-CN' + +Vue.config.lang = lang + +// vue-i18n 6.x+写法 +Vue.locale = () => {} +const messages = { + 'zh-CN': Object.assign(zhCnLocale, customZhCn), + 'zh-TW': Object.assign(zhTwLocale, customZhTw), + 'en-US': Object.assign(enUsLocale, customEnUs) +} +const i18n = new VueI18n({ + locale: lang, + messages +}) + +export default i18n + +// vue-i18n 5.x写法 +// Vue.locale('zh-CN', Object.assign(zhCnLocale, customZhCn)) +// Vue.locale('en-US', Object.assign(zhTwLocale, customZhTw)) +// Vue.locale('zh-TW', Object.assign(enUsLocale, customEnUs)) diff --git a/src/locale/lang/en-US.js b/src/locale/lang/en-US.js new file mode 100644 index 0000000..171d3de --- /dev/null +++ b/src/locale/lang/en-US.js @@ -0,0 +1,38 @@ +export default { + home: 'Home', + components: 'Components', + count_to_page: 'Count-to', + tables_page: 'Table', + split_pane_page: 'Split-pane', + markdown_page: 'Markdown-editor', + editor_page: 'Rich-Text-Editor', + icons_page: 'Custom-icon', + img_cropper_page: 'Image-editor', + update: 'Update', + doc: 'Document', + join_page: 'QQ Group', + update_table_page: 'Update .CSV', + update_paste_page: 'Paste Table Data', + multilevel: 'multilevel', + directive_page: 'Directive', + level_1: 'Level-1', + level_2: 'Level-2', + level_2_1: 'Level-2-1', + level_2_3: 'Level-2-3', + level_2_2: 'Level-2-2', + level_2_2_1: 'Level-2-2-1', + excel: 'Excel', + 'upload-excel': 'Upload Excel', + 'export-excel': 'Export Excel', + tools_methods_page: 'Tools Methods', + drag_list_page: 'Drag-list', + i18n_page: 'Internationalization', + modalTitle: 'Modal Title', + content: 'This is the modal box content.', + buttonText: 'Show Modal', + 'i18n-tip': 'Note: Only this page is multi-language, other pages do not add language content to the multi-language package.', + error_store_page: 'Error Collection', + error_logger_page: 'Error Logger', + query: 'Query', + params: 'Params' +} diff --git a/src/locale/lang/zh-CN.js b/src/locale/lang/zh-CN.js new file mode 100644 index 0000000..680653a --- /dev/null +++ b/src/locale/lang/zh-CN.js @@ -0,0 +1,38 @@ +export default { + home: '首页', + components: '组件', + count_to_page: '数字渐变', + tables_page: '多功能表格', + split_pane_page: '分割窗口', + markdown_page: 'Markdown编辑器', + editor_page: '富文本编辑器', + icons_page: '自定义图标', + img_cropper_page: '图片编辑器', + update: '上传数据', + join_page: 'QQ群', + doc: '文档', + update_table_page: '上传CSV文件', + update_paste_page: '粘贴表格数据', + multilevel: '多级菜单', + directive_page: '指令', + level_1: 'Level-1', + level_2: 'Level-2', + level_2_1: 'Level-2-1', + level_2_3: 'Level-2-3', + level_2_2: 'Level-2-2', + level_2_2_1: 'Level-2-2-1', + excel: 'Excel', + 'upload-excel': '上传excel', + 'export-excel': '导出excel', + tools_methods_page: '工具函数', + drag_list_page: '拖拽列表', + i18n_page: '多语言', + modalTitle: '模态框题目', + content: '这是模态框内容', + buttonText: '显示模态框', + 'i18n-tip': '注:仅此页做了多语言,其他页面没有在多语言包中添加语言内容', + error_store_page: '错误收集', + error_logger_page: '错误日志', + query: '带参路由', + params: '动态路由' +} diff --git a/src/locale/lang/zh-TW.js b/src/locale/lang/zh-TW.js new file mode 100644 index 0000000..90ff7ef --- /dev/null +++ b/src/locale/lang/zh-TW.js @@ -0,0 +1,38 @@ +export default { + home: '首頁', + components: '组件', + count_to_page: '数字渐变', + tables_page: '多功能表格', + split_pane_page: '分割窗口', + markdown_page: 'Markdown編輯器', + editor_page: '富文本編輯器', + icons_page: '自定義圖標', + img_cropper_page: '圖片編輯器', + update: '上傳數據', + join_page: 'QQ群', + doc: '文檔', + update_table_page: '上傳CSV文件', + update_paste_page: '粘貼表格數據', + multilevel: '多级菜单', + directive_page: '指令', + level_1: 'Level-1', + level_2: 'Level-2', + level_2_1: 'Level-2-1', + level_2_3: 'Level-2-3', + level_2_2: 'Level-2-2', + level_2_2_1: 'Level-2-2-1', + excel: 'Excel', + 'upload-excel': '上傳excel', + 'export-excel': '導出excel', + tools_methods_page: '工具函數', + drag_list_page: '拖拽列表', + i18n_page: '多語言', + modalTitle: '模態框題目', + content: '這是模態框內容', + buttonText: '顯示模態框', + 'i18n-tip': '注:僅此頁做了多語言,其他頁面沒有在多語言包中添加語言內容', + error_store_page: '錯誤收集', + error_logger_page: '錯誤日誌', + query: '帶參路由', + params: '動態路由' +} diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..2b41f1a --- /dev/null +++ b/src/main.js @@ -0,0 +1,64 @@ +// The Vue build version to load with the `import` command +// (runtime-only or standalone) has been set in webpack.base.conf with an alias. +import Vue from 'vue' +import App from './App' +import router from './router' +import store from './store' +import ViewUI from 'view-design'; +import config from '@/config' +import importDirective from '@/directive' +import installPlugin from '@/plugin' +// math.js 解决计算精度问题 +import * as math from 'mathjs' +// echarts 绘制图表 +import echarts from 'echarts' +// import style +import 'view-design/dist/styles/iview.css' +import './index.less' +import '@/assets/icons/iconfont.css' +import '@/assets/my-icons/iconfont.css' +import tdTheme from "./components/charts/theme.json"; +// 粒子特效 +import VueParticles from 'vue-particles' + +// 实际打包时应该不引入mock +// if (process.env.NODE_ENV !== 'production') require('@/mock') + +Vue.use(ViewUI); + +/** + * @description 注册admin内置插件 + */ +installPlugin(Vue) +/** + * @description 生产环境关掉提示 + */ +Vue.config.productionTip = false +/** + * @description 全局注册应用配置 + */ +Vue.prototype.$config = config +/** + * @description 全局注册数学计算函数 + */ +Vue.prototype.$math = math +/** + * @description 全局注册echarts + */ +Vue.prototype.$echarts = echarts +/** + * @description 粒子特效 + */ +Vue.use(VueParticles) + +/** + * 注册指令 + */ +importDirective(Vue) + +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}) diff --git a/src/mock/data.js b/src/mock/data.js new file mode 100644 index 0000000..517daa0 --- /dev/null +++ b/src/mock/data.js @@ -0,0 +1,26 @@ +import Mock from 'mockjs' +import { doCustomTimes } from '@/libs/util' +const Random = Mock.Random + +export const getTableData = req => { + let tableData = [] + doCustomTimes(5, () => { + tableData.push(Mock.mock({ + name: '@name', + email: '@email', + createTime: '@date' + })) + }) + return tableData +} + +export const getDragList = req => { + let dragList = [] + doCustomTimes(5, () => { + dragList.push(Mock.mock({ + name: Random.csentence(10, 13), + id: Random.increment(10) + })) + }) + return dragList +} diff --git a/src/mock/index.js b/src/mock/index.js new file mode 100644 index 0000000..ac43573 --- /dev/null +++ b/src/mock/index.js @@ -0,0 +1,13 @@ +import Mock from 'mockjs' +import { login, logout, getUserInfo } from './login' +import { getTableData, getDragList } from './data' + +// 登录相关和获取用户信息 +Mock.mock(/\/login/, login) +Mock.mock(/\/get_info/, getUserInfo) +Mock.mock(/\/logout/, logout) +Mock.mock(/\/get_table_data/, getTableData) +Mock.mock(/\/get_drag_list/, getDragList) +Mock.mock(/\/save_error_logger/, 'success') + +export default Mock diff --git a/src/mock/login.js b/src/mock/login.js new file mode 100644 index 0000000..fc19c4f --- /dev/null +++ b/src/mock/login.js @@ -0,0 +1,31 @@ +import { getParams } from '@/libs/util' +const USER_MAP = { + super_admin: { + name: 'super_admin', + user_id: '1', + access: ['super_admin', 'admin'], + token: 'super_admin', + avator: 'https://file.iviewui.com/dist/a0e88e83800f138b94d2414621bd9704.png' + }, + admin: { + name: 'admin', + user_id: '2', + access: ['admin'], + token: 'admin', + avator: 'https://avatars0.githubusercontent.com/u/20942571?s=460&v=4' + } +} + +export const login = req => { + req = JSON.parse(req.body) + return {token: USER_MAP[req.username].token} +} + +export const getUserInfo = req => { + const params = getParams(req.url) + return USER_MAP[params.token] +} + +export const logout = req => { + return null +} diff --git a/src/plugin/error-store/index.js b/src/plugin/error-store/index.js new file mode 100644 index 0000000..46b5941 --- /dev/null +++ b/src/plugin/error-store/index.js @@ -0,0 +1,17 @@ +import store from '@/store' +export default { + install (Vue, options) { + if (options.developmentOff && process.env.NODE_ENV === 'development') return + Vue.config.errorHandler = (error, vm, mes) => { + let info = { + type: 'script', + code: 0, + mes: error.message, + url: window.location.href + } + Vue.nextTick(() => { + store.dispatch('addErrorLog', info) + }) + } + } +} diff --git a/src/plugin/index.js b/src/plugin/index.js new file mode 100644 index 0000000..c47165b --- /dev/null +++ b/src/plugin/index.js @@ -0,0 +1,9 @@ +import config from '@/config' +const { plugin } = config + +export default (Vue) => { + for (let name in plugin) { + const value = plugin[name] + Vue.use(require(`./${name}`).default, typeof value === 'object' ? value : undefined) + } +} diff --git a/src/router/before-close.js b/src/router/before-close.js new file mode 100644 index 0000000..4f1dec5 --- /dev/null +++ b/src/router/before-close.js @@ -0,0 +1,17 @@ +import { Modal } from 'view-design' + +const beforeClose = { + before_close_normal: (resolve) => { + Modal.confirm({ + title: '确定要关闭这一页吗', + onOk: () => { + resolve(true) + }, + onCancel: () => { + resolve(false) + } + }) + } +} + +export default beforeClose diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..6829850 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,81 @@ +import Vue from 'vue' +import Router from 'vue-router' +import routes from './routers' +import store from '@/store' +import iView from 'view-design' +import config from '@/config' +import { setToken, getToken, canTurnTo, setTitle, localSave, localRead } from '@/libs/util' +import { loadMenuList, formatMenuList } from '@/libs/router-util' +import { getPermissionList } from '@/api/sys/sys-permission' + +const {homeName} = config + +Vue.use(Router) +const router = new Router({ + routes, + mode: 'history' +}) +const LOGIN_PAGE_NAME = 'login' + +const turnTo = (to, access, next) => { + if (canTurnTo(to.name, access, routes)) next() // 有权限,可访问 + else next({replace: true, name: 'error_401'}) // 无权限,重定向到401页面 +} + +router.beforeEach((to, from, next) => { + iView.LoadingBar.start() + const token = getToken() + const menuListStr = localRead('route') // 读取路由数据 + + if (!token && to.name !== LOGIN_PAGE_NAME) { + // 未登录且要跳转的页面不是登录页 + next({ + name: LOGIN_PAGE_NAME // 跳转到登录页 + }) + } else if (!token && to.name === LOGIN_PAGE_NAME) { + // 未登陆且要跳转的页面是登录页 + next() // 跳转 + } else if (token && to.name === LOGIN_PAGE_NAME) { + // 已登录且要跳转的页面是登录页 + next({ + name: homeName // 跳转到homeName页 + }) + } else { + store.dispatch('getUserInfo').then(user => { + // 如果本地不存在路由数据则动态获取 + if (menuListStr == null || menuListStr == '') { + getPermissionList(getToken()).then(res => { + let list = [] + let permissionList = res.data.data + localSave('route', JSON.stringify(permissionList)) + // 格式化菜单 + list = formatMenuList(permissionList) + // 刷新界面菜单 + store.commit('updateMenuList', list) + + next() + }) + } else { + console.log("2") + let list = formatMenuList(JSON.parse(menuListStr)) + store.commit('updateMenuList', list) + next() + } + + }).catch(() => { + setToken('') + next({ + name: 'login' + }) + }) + + } +}) + +router.afterEach(to => { + setTitle(to, router.app) + iView.LoadingBar.finish() + window.scrollTo(0, 0) +}) + +export default router diff --git a/src/router/routers.js b/src/router/routers.js new file mode 100644 index 0000000..9f12fb3 --- /dev/null +++ b/src/router/routers.js @@ -0,0 +1,114 @@ +import Main from '@/components/main' + +/** + * iview-admin中meta除了原生参数外可配置的参数: + * meta: { + * title: { String|Number|Function } + * 显示在侧边栏、面包屑和标签栏的文字 + * 使用'{{ 多语言字段 }}'形式结合多语言使用,例子看多语言的路由配置; + * 可以传入一个回调函数,参数是当前路由对象,例子看动态路由和带参路由 + * hideInMenu: (false) 设为true后在左侧菜单不会显示该页面选项 + * notCache: (false) 设为true后页面不会缓存 + * access: (null) 可访问该页面的权限数组,当前路由设置的权限会影响子路由 + * icon: (-) 该页面在左侧菜单、面包屑和标签导航处显示的图标,如果是自定义图标,需要在图标名称前加下划线'_' + * beforeCloseName: (-) 设置该字段,则在关闭当前tab页时会去'@/router/before-close.js'里寻找该字段名对应的方法,作为关闭前的钩子函数 + * } + */ + +export default [ + { + path: '/login', + name: 'login', + meta: { + title: 'Login - 登录', + hideInMenu: true + }, + component: () => import('@/view/login/login.vue') + }, + { + path: '/', + name: '_home', + redirect: '/home', + component: Main, + meta: { + hideInMenu: true, + notCache: true + }, + children: [ + { + path: '/home', + name: 'home', + meta: { + hideInMenu: true, + title: '首页', + notCache: true, + icon: 'md-home' + }, + component: () => import('@/view/home/home') + } + ] + }, + { + path: '/center', + name: 'center', + component: Main, + meta: { + hideInBread: true, + hideInMenu: true + }, + children: [ + { + path: 'personal_center', + name: 'personal-center', + meta: { + icon: 'md-notifications', + title: '个人中心' + }, + component: () => import('@/view/home/personal-center.vue') + }, + { + path: 'message_center', + name: 'message-center', + meta: { + icon: 'md-notifications', + title: '消息中心' + }, + component: () => import('@/view/home/message-center.vue') + } + ] + }, + { + path: '/401', + name: 'error_401', + meta: { + hideInMenu: true + }, + component: () => import('@/view/error-page/401.vue') + }, + { + path: '/500', + name: 'error_500', + meta: { + hideInMenu: true + }, + component: () => import('@/view/error-page/500.vue') + }, + { + path: '/404', + name: 'error_404', + meta: { + hideInMenu: true + }, + component: () => import('@/view/error-page/404.vue') + }, + { + path: '*', + name: '_no_match', + redirect: '/home', + component: Main, + meta: { + hideInMenu: true, + notCache: true + } + } +] diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..2c8c77e --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,23 @@ +import Vue from 'vue' +import Vuex from 'vuex' + +import user from './module/user' +import app from './module/app' + +Vue.use(Vuex) + +export default new Vuex.Store({ + state: { + // + }, + mutations: { + // + }, + actions: { + // + }, + modules: { + user, + app + } +}) diff --git a/src/store/module/app.js b/src/store/module/app.js new file mode 100644 index 0000000..be9b6be --- /dev/null +++ b/src/store/module/app.js @@ -0,0 +1,125 @@ +import { + getBreadCrumbList, + setTagNavListInLocalstorage, + getMenuByRouter, + getTagNavListFromLocalstorage, + getHomeRoute, + getNextRoute, + routeHasExist, + routeEqual, + getRouteTitleHandled, + localSave, + localRead +} from '@/libs/util' +import beforeClose from '@/router/before-close' +import { saveErrorLogger } from '@/api/data' +import router from '@/router' +import routers from '@/router/routers' +import config from '@/config' +// ①引入路由数据读取方法 +import { loadMenuList, createRouter } from '@/libs/router-util' + +const { homeName } = config + +const closePage = (state, route) => { + const nextRoute = getNextRoute(state.tagNavList, route) + state.tagNavList = state.tagNavList.filter(item => { + return !routeEqual(item, route) + }) + router.push(nextRoute) +} + +export default { + state: { + breadCrumbList: [], + tagNavList: [], + homeRoute: getHomeRoute(routers, homeName), + local: localRead('local'), + errorList: [], + hasReadErrorPage: false, + menuList: loadMenuList(), + }, + getters: { + //menuList: (state, getters, rootState) => getMenuByRouter(routers, rootState.user.access), + // ②通过路由列表得到菜单列表 + // menuList: (state, getters, rootState) => getMenuByRouter(loadMenuList(), rootState.user.access), + menuList: (state, getters, rootState) => getMenuByRouter(state.menuList, rootState.user.access), + errorCount: state => state.errorList.length + }, + mutations: { + setBreadCrumb (state, route) { + state.breadCrumbList = getBreadCrumbList(route, state.homeRoute) + }, + setTagNavList (state, list) { + let tagList = [] + if (list) { + tagList = [...list] + } else tagList = getTagNavListFromLocalstorage() || [] + if (tagList[0] && tagList[0].name !== homeName) tagList.shift() + let homeTagIndex = tagList.findIndex(item => item.name === homeName) + if (homeTagIndex > 0) { + let homeTag = tagList.splice(homeTagIndex, 1)[0] + tagList.unshift(homeTag) + } + state.tagNavList = tagList + setTagNavListInLocalstorage([...tagList]) + }, + closeTag (state, route) { + let tag = state.tagNavList.filter(item => routeEqual(item, route)) + route = tag[0] ? tag[0] : null + if (!route) return + if (route.meta && route.meta.beforeCloseName && route.meta.beforeCloseName in beforeClose) { + new Promise(beforeClose[route.meta.beforeCloseName]).then(close => { + if (close) { + closePage(state, route) + } + }) + } else { + closePage(state, route) + } + }, + addTag (state, { route, type = 'unshift' }) { + let router = getRouteTitleHandled(route) + if (!routeHasExist(state.tagNavList, router)) { + if (type === 'push') state.tagNavList.push(router) + else { + if (router.name === homeName) state.tagNavList.unshift(router) + else state.tagNavList.splice(1, 0, router) + } + setTagNavListInLocalstorage([...state.tagNavList]) + } + }, + setLocal (state, lang) { + localSave('local', lang) + state.local = lang + }, + addError (state, error) { + state.errorList.push(error) + }, + setHasReadErrorLoggerStatus (state, status = true) { + state.hasReadErrorPage = status + }, + updateMenuList(state, routes) { + // ③接受前台数组,刷新菜单 + router.matcher = createRouter(routers).matcher + router.addRoutes(routes) + state.menuList = routes + }, + }, + actions: { + addErrorLog ({ commit, rootState }, info) { + if (!window.location.href.includes('error_logger_page')) commit('setHasReadErrorLoggerStatus', false) + const { user: { token, userId, username } } = rootState + let data = { + ...info, + time: Date.parse(new Date()), + token, + userId, + username + } + saveErrorLogger(info).then(() => { + commit('addError', data) + }) + } + } +} diff --git a/src/store/module/user.js b/src/store/module/user.js new file mode 100644 index 0000000..b7e3995 --- /dev/null +++ b/src/store/module/user.js @@ -0,0 +1,109 @@ +import { login, logout, getUserInfo } from '@/api/sys/sys-user' +import { setToken, getToken, setExpireTime, getExpireTime, localDelete } from '@/libs/util' + +export default { + state: { + username: '', + userId: '', + avatorImgPath: '', + nickname: '', + token: getToken(), + expireTime: getExpireTime(), //增加的token过期时间 + access: '', + hasGetInfo: false + }, + mutations: { + setAvator (state, avatorPath) { + state.avatorImgPath = avatorPath + }, + setUserId (state, id) { + state.userId = id + }, + setUsername (state, username) { + state.username = username + }, + setNickname (state, nickname) { + state.nickname = nickname + }, + setAccess (state, access) { + state.access = access + }, + setToken (state, token) { + state.token = token + setToken(token) + }, + setExpireTime (state, expireTime) { + state.expireTime = expireTime + setExpireTime(expireTime) + }, + setHasGetInfo (state, status) { + state.hasGetInfo = status + } + }, + actions: { + // 登录 + handleLogin ({ commit }, {username, password ,ip}) { + username = username.trim() + return new Promise((resolve, reject) => { + login({ + username, + password, + ip + }).then(res => { + let data = res.data + console.log("data:", data) + if (data.code === 200) { + let token = data.token + console.log("token:", token) + commit('setToken', token) + let curDate = new Date() + let expireTime = curDate.getTime() +24*60*60*1000 // 假设过期时间为后一天24*60*60*1000 + commit('setExpireTime',expireTime) + } + resolve(data) + }).catch(err => { + reject(err) + }) + }) + }, + // 退出登录 + handleLogOut ({ state, commit }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + commit('setToken', '') + commit('setAccess', []) + // 退出时清空缓存路由 + localDelete('route') + resolve() + }).catch(err => { + reject(err) + }) + // 如果你的退出登录无需请求接口,则可以直接使用下面三行代码而无需使用logout调用接口 + // commit('setToken', '') + // commit('setAccess', []) + // resolve() + }) + }, + // 获取用户相关信息 + getUserInfo ({ state, commit }) { + return new Promise((resolve, reject) => { + try { + getUserInfo(state.token).then(res => { + const data = res.data.data; + commit('setAvator', data.avatar) + commit('setUsername', data.username) // 登录账号 + commit('setNickname', data.nickname) // 昵称 + commit('setUserId', data.id) //用户ID + commit('setAccess', ['admin']) //用户权限 + commit('setHasGetInfo', true) + resolve(data) + }).catch(err => { + reject(err) + }) + } catch (error) { + reject(error) + } + }) + } + } +} diff --git a/src/view/code/generator-config.vue b/src/view/code/generator-config.vue new file mode 100644 index 0000000..49731eb --- /dev/null +++ b/src/view/code/generator-config.vue @@ -0,0 +1,268 @@ + + + + + diff --git a/src/view/code/youth-generator.vue b/src/view/code/youth-generator.vue new file mode 100644 index 0000000..97ebf2f --- /dev/null +++ b/src/view/code/youth-generator.vue @@ -0,0 +1,474 @@ + + + + + diff --git a/src/view/error-page/401.vue b/src/view/error-page/401.vue new file mode 100644 index 0000000..1032326 --- /dev/null +++ b/src/view/error-page/401.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/view/error-page/404.vue b/src/view/error-page/404.vue new file mode 100644 index 0000000..473df42 --- /dev/null +++ b/src/view/error-page/404.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/view/error-page/500.vue b/src/view/error-page/500.vue new file mode 100644 index 0000000..6a885da --- /dev/null +++ b/src/view/error-page/500.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/view/error-page/back-btn-group.vue b/src/view/error-page/back-btn-group.vue new file mode 100644 index 0000000..a5fe7fd --- /dev/null +++ b/src/view/error-page/back-btn-group.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/view/error-page/error-content.vue b/src/view/error-page/error-content.vue new file mode 100644 index 0000000..b77eaab --- /dev/null +++ b/src/view/error-page/error-content.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/view/error-page/error.less b/src/view/error-page/error.less new file mode 100644 index 0000000..6380245 --- /dev/null +++ b/src/view/error-page/error.less @@ -0,0 +1,46 @@ +.error-page{ + width: 100%; + height: 100%; + position: relative; + background: #f8f8f9; + .content-con{ + width: 700px; + height: 600px; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -60%); + img{ + display: block; + width: 100%; + height: 100%; + } + .text-con{ + position: absolute; + left: 0px; + top: 0px; + h4{ + position: absolute; + left: 0px; + top: 0px; + font-size: 80px; + font-weight: 700; + color: #348EED; + } + h5{ + position: absolute; + width: 700px; + left: 0px; + top: 100px; + font-size: 20px; + font-weight: 700; + color: #67647D; + } + } + .back-btn-group{ + position: absolute; + right: 0px; + bottom: 20px; + } + } +} diff --git a/src/view/home/example.vue b/src/view/home/example.vue new file mode 100644 index 0000000..ff06acd --- /dev/null +++ b/src/view/home/example.vue @@ -0,0 +1,114 @@ + + + diff --git a/src/view/home/home.vue b/src/view/home/home.vue new file mode 100644 index 0000000..ec91079 --- /dev/null +++ b/src/view/home/home.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/src/view/home/index.js b/src/view/home/index.js new file mode 100644 index 0000000..de4ced1 --- /dev/null +++ b/src/view/home/index.js @@ -0,0 +1,2 @@ +import home from './home.vue' +export default home diff --git a/src/view/home/message-center.vue b/src/view/home/message-center.vue new file mode 100644 index 0000000..3898e35 --- /dev/null +++ b/src/view/home/message-center.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/view/home/notice.vue b/src/view/home/notice.vue new file mode 100644 index 0000000..debf1f4 --- /dev/null +++ b/src/view/home/notice.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/view/home/personal-center.vue b/src/view/home/personal-center.vue new file mode 100644 index 0000000..9dde612 --- /dev/null +++ b/src/view/home/personal-center.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/src/view/kpi/kpi-quota-count.vue b/src/view/kpi/kpi-quota-count.vue new file mode 100644 index 0000000..08043f0 --- /dev/null +++ b/src/view/kpi/kpi-quota-count.vue @@ -0,0 +1,500 @@ + + + + + diff --git a/src/view/kpi/kpi-quota-library.vue b/src/view/kpi/kpi-quota-library.vue new file mode 100644 index 0000000..411cd54 --- /dev/null +++ b/src/view/kpi/kpi-quota-library.vue @@ -0,0 +1,726 @@ + + + + + diff --git a/src/view/kpi/kpi-quota-record.vue b/src/view/kpi/kpi-quota-record.vue new file mode 100644 index 0000000..16bc187 --- /dev/null +++ b/src/view/kpi/kpi-quota-record.vue @@ -0,0 +1,462 @@ + + + + + diff --git a/src/view/kpi/kpi-staff.vue b/src/view/kpi/kpi-staff.vue new file mode 100644 index 0000000..775fe79 --- /dev/null +++ b/src/view/kpi/kpi-staff.vue @@ -0,0 +1,731 @@ + + + + + diff --git a/src/view/kpi/kpi-template-item.vue b/src/view/kpi/kpi-template-item.vue new file mode 100644 index 0000000..a7975a0 --- /dev/null +++ b/src/view/kpi/kpi-template-item.vue @@ -0,0 +1,321 @@ + + + + + diff --git a/src/view/kpi/kpi-template-quota.vue b/src/view/kpi/kpi-template-quota.vue new file mode 100644 index 0000000..dc8426b --- /dev/null +++ b/src/view/kpi/kpi-template-quota.vue @@ -0,0 +1,321 @@ + + + + + diff --git a/src/view/kpi/kpi-template.vue b/src/view/kpi/kpi-template.vue new file mode 100644 index 0000000..6922e59 --- /dev/null +++ b/src/view/kpi/kpi-template.vue @@ -0,0 +1,562 @@ + + + + + diff --git a/src/view/login/login.less b/src/view/login/login.less new file mode 100644 index 0000000..e986ed4 --- /dev/null +++ b/src/view/login/login.less @@ -0,0 +1,29 @@ +.login{ + width: 100%; + height: 100%; + background-image: url('../../assets/images/login-bg.jpg'); + background-size: cover; + background-position: center; + position: relative; + &-con{ + position: absolute; + right: 160px; + top: 50%; + transform: translateY(-60%); + width: 300px; + &-header{ + font-size: 16px; + font-weight: 300; + text-align: center; + padding: 30px 0; + } + .form-con{ + padding: 10px 0 0; + } + .login-tip{ + font-size: 10px; + text-align: center; + color: #c3c3c3; + } + } +} diff --git a/src/view/login/login.vue b/src/view/login/login.vue new file mode 100644 index 0000000..5cfb68d --- /dev/null +++ b/src/view/login/login.vue @@ -0,0 +1,68 @@ + + + + + + + diff --git a/src/view/sys/sys-dept.vue b/src/view/sys/sys-dept.vue new file mode 100644 index 0000000..62b6935 --- /dev/null +++ b/src/view/sys/sys-dept.vue @@ -0,0 +1,436 @@ + + + + + diff --git a/src/view/sys/sys-permission.vue b/src/view/sys/sys-permission.vue new file mode 100644 index 0000000..8d2909b --- /dev/null +++ b/src/view/sys/sys-permission.vue @@ -0,0 +1,466 @@ + + + + + diff --git a/src/view/sys/sys-role.vue b/src/view/sys/sys-role.vue new file mode 100644 index 0000000..0263a65 --- /dev/null +++ b/src/view/sys/sys-role.vue @@ -0,0 +1,486 @@ + + + + + diff --git a/src/view/sys/sys-user.vue b/src/view/sys/sys-user.vue new file mode 100644 index 0000000..ef436a4 --- /dev/null +++ b/src/view/sys/sys-user.vue @@ -0,0 +1,495 @@ + + + + + diff --git a/tests/e2e/.eslintrc b/tests/e2e/.eslintrc new file mode 100644 index 0000000..02023fb --- /dev/null +++ b/tests/e2e/.eslintrc @@ -0,0 +1,12 @@ +{ + "plugins": [ + "cypress" + ], + "env": { + "mocha": true, + "cypress/globals": true + }, + "rules": { + "strict": "off" + } +} diff --git a/tests/e2e/plugins/index.js b/tests/e2e/plugins/index.js new file mode 100644 index 0000000..cfefc78 --- /dev/null +++ b/tests/e2e/plugins/index.js @@ -0,0 +1,9 @@ +// https://docs.cypress.io/guides/guides/plugins-guide.html + +module.exports = (on, config) => Object.assign({}, config, { + fixturesFolder: 'tests/e2e/fixtures', + integrationFolder: 'tests/e2e/specs', + screenshotsFolder: 'tests/e2e/screenshots', + videosFolder: 'tests/e2e/videos', + supportFile: 'tests/e2e/support/index.js' +}) diff --git a/tests/e2e/specs/test.js b/tests/e2e/specs/test.js new file mode 100644 index 0000000..41ad94a --- /dev/null +++ b/tests/e2e/specs/test.js @@ -0,0 +1,8 @@ +// https://docs.cypress.io/api/introduction/api.html + +describe('My First Test', () => { + it('Visits the app root url', () => { + cy.visit('/') + cy.contains('h1', 'Welcome to Your Vue.js App') + }) +}) diff --git a/tests/e2e/support/commands.js b/tests/e2e/support/commands.js new file mode 100644 index 0000000..c1f5a77 --- /dev/null +++ b/tests/e2e/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add("login", (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This is will overwrite an existing command -- +// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/tests/e2e/support/index.js b/tests/e2e/support/index.js new file mode 100644 index 0000000..d68db96 --- /dev/null +++ b/tests/e2e/support/index.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/tests/unit/.eslintrc.js b/tests/unit/.eslintrc.js new file mode 100644 index 0000000..74fe627 --- /dev/null +++ b/tests/unit/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + env: { + mocha: true + }, + rules: { + 'import/no-extraneous-dependencies': 'off' + } +} \ No newline at end of file diff --git a/tests/unit/HelloWorld.spec.js b/tests/unit/HelloWorld.spec.js new file mode 100644 index 0000000..bb668bf --- /dev/null +++ b/tests/unit/HelloWorld.spec.js @@ -0,0 +1,13 @@ +import { expect } from 'chai' +import { shallow } from '@vue/test-utils' +import HelloWorld from '@/components/HelloWorld.vue' + +describe('HelloWorld.vue', () => { + it('renders props.msg when passed', () => { + const msg = 'new message' + const wrapper = shallow(HelloWorld, { + propsData: { msg } + }) + expect(wrapper.text()).to.include(msg) + }) +}) diff --git a/vue.config.js b/vue.config.js new file mode 100644 index 0000000..b3e1a73 --- /dev/null +++ b/vue.config.js @@ -0,0 +1,42 @@ +const path = require('path') + +const resolve = dir => { + return path.join(__dirname, dir) +} + +// 项目部署基础 +// 默认情况下,我们假设你的应用将被部署在域的根目录下, +// 例如:https://www.my-app.com/ +// 默认:'/' +// 如果您的应用程序部署在子路径中,则需要在这指定子路径 +// 例如:https://www.foobar.com/my-app/ +// 需要将它改为'/my-app/' +const BASE_URL = process.env.NODE_ENV === 'production' + ? '/' + : '/' + +module.exports = { + // Project deployment base + // By default we assume your app will be deployed at the root of a domain, + // e.g. https://www.my-app.com/ + // If your app is deployed at a sub-path, you will need to specify that + // sub-path here. For example, if your app is deployed at + // https://www.foobar.com/my-app/ + // then change this to '/my-app/' + baseUrl: BASE_URL, + // tweak internal webpack configuration. + // see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md + // 如果你不需要使用eslint,把lintOnSave设为false即可 + lintOnSave: false, + chainWebpack: config => { + config.resolve.alias + .set('@', resolve('src')) // key,value自行定义,比如.set('@@', resolve('src/components')) + .set('_c', resolve('src/components')) + }, + // 打包时不生成.map文件 + productionSourceMap: false + // 这里写你调用接口的基础路径,来解决跨域,如果设置了代理,那你本地开发环境的axios的baseUrl要写为 '' ,即空字符串 + // devServer: { + // proxy: 'localhost:3000' + // } +}