├── .babelrc ├── .gitignore ├── LICENSE ├── README.md ├── build ├── config.js ├── env.js ├── webpack.base.config.js ├── webpack.dev.config.js └── webpack.prod.config.js ├── favicon.ico ├── index.html ├── package-lock.json ├── package.json └── src ├── app.vue ├── caculate └── caculate.js ├── config ├── api.js └── storage.js ├── images ├── login.png ├── logo-min-light.png ├── logo-min.png ├── logo.png └── logo_light.png ├── libs ├── table2excel.js └── util.js ├── locale ├── index.js └── locale.js ├── main.js ├── router ├── index.js └── router.js ├── service ├── getData.js └── http.js ├── smeditor ├── ColorPicker.vue ├── FontSizePicker.vue ├── Insert.vue ├── InsertLink.vue ├── InsertVideo.vue ├── SMEditor.vue ├── TitlePicker.vue └── icons.js ├── store ├── index.js └── modules │ ├── app.js │ └── user.js ├── styles ├── common.less ├── fonts │ ├── ionicons.eot │ ├── ionicons.svg │ ├── ionicons.ttf │ └── ionicons.woff ├── loading.less ├── login_bg.jpg └── reset-iview-style.less ├── template └── index.ejs ├── vendors ├── vendors.base.js └── vendors.exten.js └── views ├── Main.vue ├── bond └── BondManage.vue ├── content ├── AddAdvertisement.vue ├── AddAnnouncement.vue ├── AddHelpManage.vue ├── AnnounceManage.vue └── HelpManage.vue ├── error-page ├── 403.less ├── 403.vue ├── 404.less ├── 404.vue ├── 500.less ├── 500.vue ├── error-page.less └── error-page.vue ├── exchange ├── Order.vue ├── OrderDetail.vue └── Setting.vue ├── finance ├── AuditDetail.vue ├── ChargeCoinDetail.vue ├── FeeManage.vue ├── FinanceStatistic.vue ├── OtcDetail.vue ├── TradeDetail.vue ├── WithdrawDetail.vue └── WithdrawalsExamine.vue ├── home ├── components │ ├── countUp.vue │ ├── dataSourcePie.vue │ ├── inforCard.vue │ ├── map.vue │ ├── mapDataTable.vue │ ├── serviceRequests.vue │ ├── styles │ │ ├── infor-card.less │ │ └── to-do-list-item.less │ ├── toDoListItem.vue │ ├── userFlow.vue │ └── visiteVolume.vue ├── home.less ├── home.vue └── map-data │ ├── china.json │ ├── get-city-value.js │ ├── get-geography-value.js │ └── get-style-json.js ├── login.less ├── login.vue ├── main-components ├── breadcrumb-nav.vue ├── fullscreen.vue ├── lockscreen │ ├── components │ │ ├── locking-page.vue │ │ └── unlock.vue │ ├── lockscreen.vue │ └── styles │ │ └── unlock.less ├── message-tip.vue ├── shrinkable-menu │ ├── components │ │ ├── sidebarMenu.vue │ │ └── sidebarMenuShrink.vue │ ├── shrinkable-menu.vue │ └── styles │ │ └── menu.less ├── tags-page-opened.vue └── theme-switch │ ├── theme-switch.vue │ └── theme │ ├── g.css │ ├── r.css │ └── y.css ├── main.less ├── member ├── Authenticate.vue ├── AuthenticateDetail.vue ├── DrawList.vue ├── MemberAsset.vue ├── MemberDetail.vue ├── Parnter.vue ├── RechargeList.vue └── memberManage.vue ├── otc ├── AdvertiseDetail.vue ├── AppealDetail.vue ├── AppealManage.vue ├── BusinessAudit.vue ├── BusinessDetail.vue ├── ExitBond.vue ├── ExitBondDetail.vue ├── adManage.vue ├── coinManage.vue └── orderManage.vue ├── own-space ├── message.vue └── own-space.vue ├── system ├── AccessLog.vue ├── AddAuditEmployee.vue ├── Coin.vue ├── CoinTransferDetail.vue ├── Department.vue ├── Dictionary.vue ├── Employee.vue ├── Permission.vue └── Role.vue └── user └── PersonalCenter.vue /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "es2015" 4 | ] 5 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /node_modules 3 | 4 | .DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 张志强 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ZTuoExchange_admin_web 2 | 3 | #### 项目介绍 4 | ZTuo后台管理系统 5 | 6 | #### 软件架构 7 | vue+iview框架 8 | 9 | #### Install Prerequisites 10 | The following dependencies are required to run an instance: 11 | 12 | 1. NodeJS - 9.11.2 13 | 2. Npm - 5.6.0 14 | #### 安装教程 15 | 16 | 1. npm install 安装包以及依赖 17 | 2. npm run dev 本地开发环境启动 【】 18 | 3. npm run build 代码打包发布 19 | 20 | #### 参与贡献 21 | 22 | 1. Fork 本项目 23 | 2. 新建 Feat_xxx 分支 24 | 3. 提交代码 25 | 4. 新建 Pull Request 26 | 27 | #### 项目解构简介 28 | -build 配置文件 29 | -config.js 对外暴露是开发环境[dev]还是打包后[pro] 30 | -env.js 环境切换 31 | -webpack.base.config.js -webpack基本配置 32 | -webpack.dev.config.js -webpack-merge 合并基础配置和[npm run dev]开发环境 33 | -webpack.prod.config.js -webpack-merge 合并基础配置和[npm run build]打包需要的配置 34 | -src 主目录 35 | -caculate 36 | caculate.js 过滤搜索条件 37 | -config 38 | -- api.js 接口整理 39 | -- storage.js 缓存处理 40 | -images 图片 41 | -libs 插件 42 | -locale 多语言配置文件,暂不支持 43 | -router 前端路由配置 44 | -service 封装axios接口请求,以及页面请求的接口处理 45 | -smeditor 富文本编辑器 46 | -store Vuex store 47 | -styles 公用样式 48 | -template 线上index.html模版 ejs 49 | -vendors 开发环境需要的js引入 50 | -views 页面目录 51 | app.vue 页面初始化 52 | main.js 入口文件 53 | 54 | -index.html 55 | -package.json -项目配置文件 56 | 57 | 捐赠支持 58 | 59 | BTC:3AU5QZb591Vs63SAzdhebBZpQ6qj9GVCNm 60 | 61 | LTC:33tZdhUBqhB2s3JoUEsuBhHQ75taW12WAc 62 | 63 | ETH:0x38d7f0c2d5054941717bde236a7f0aa94e89d5af 64 | -------------------------------------------------------------------------------- /build/config.js: -------------------------------------------------------------------------------- 1 | import Env from './env'; 2 | let trueconfig = Env.slice(0, 3) 3 | let config = { 4 | env: trueconfig 5 | }; 6 | export default config; -------------------------------------------------------------------------------- /build/env.js: -------------------------------------------------------------------------------- 1 | export default "production"; -------------------------------------------------------------------------------- /build/webpack.base.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const os = require('os'); 3 | const webpack = require('webpack'); 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 5 | const HappyPack = require('happypack'); 6 | var happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length }); 7 | 8 | function resolve(dir) { 9 | return path.join(__dirname, dir); 10 | } 11 | 12 | module.exports = { 13 | entry: { 14 | main: '@/main', 15 | 'vender-base': '@/vendors/vendors.base.js', 16 | 'vender-exten': '@/vendors/vendors.exten.js' 17 | }, 18 | output: { 19 | path: path.resolve(__dirname, '../dist/dist') 20 | }, 21 | module: { 22 | rules: [{ 23 | test: /\.vue$/, 24 | loader: 'vue-loader', 25 | options: { 26 | loaders: { 27 | less: ExtractTextPlugin.extract({ 28 | use: ['css-loader?minimize', 'autoprefixer-loader', 'less-loader'], 29 | fallback: 'vue-style-loader' 30 | }), 31 | }, 32 | loaders: { 33 | css: 'vue-style-loader!css-loader', 34 | less: 'vue-style-loader!css-loader!less-loader' 35 | }, 36 | postLoaders: { 37 | html: 'babel-loader' 38 | } 39 | } 40 | }, 41 | { 42 | test: /iview\/.*?js$/, 43 | loader: 'happypack/loader?id=happybabel', 44 | exclude: /node_modules/ 45 | }, 46 | { 47 | test: /\.js$/, 48 | loader: 'happypack/loader?id=happybabel', 49 | exclude: /node_modules/ 50 | }, 51 | { 52 | test: /\.js[x]?$/, 53 | include: [resolve('src')], 54 | exclude: /node_modules/, 55 | loader: 'happypack/loader?id=happybabel' 56 | }, 57 | { 58 | test: /\.css$/, 59 | use: ExtractTextPlugin.extract({ 60 | use: ['css-loader?minimize', 'autoprefixer-loader'], 61 | fallback: 'style-loader' 62 | }) 63 | }, 64 | { 65 | test: /\.less$/, 66 | use: ExtractTextPlugin.extract({ 67 | use: ['autoprefixer-loader', 'less-loader'], 68 | fallback: 'style-loader' 69 | }), 70 | }, 71 | { 72 | test: /\.(gif|jpg|png|woff|svg|eot|ttf)\??.*$/, 73 | loader: 'url-loader?limit=1024' 74 | }, 75 | { 76 | test: /\.(html|tpl)$/, 77 | loader: 'html-loader' 78 | } 79 | ] 80 | }, 81 | plugins: [ 82 | new HappyPack({ 83 | id: 'happybabel', 84 | loaders: ['babel-loader'], 85 | threadPool: happyThreadPool, 86 | verbose: true 87 | }) 88 | ], 89 | resolve: { 90 | extensions: ['.js', '.vue'], 91 | alias: { 92 | 'vue': 'vue/dist/vue.esm.js', 93 | '@': resolve('../src'), 94 | } 95 | } 96 | }; -------------------------------------------------------------------------------- /build/webpack.dev.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 4 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 5 | const merge = require('webpack-merge'); 6 | const webpackBaseConfig = require('./webpack.base.config.js'); 7 | const fs = require('fs'); 8 | const package = require('../package.json'); 9 | const ip = require('ip').address() 10 | 11 | fs.open('./build/env.js', 'w', function(err, fd) { 12 | const buf = 'export default "development";'; 13 | fs.write(fd, buf, 0, buf.length, 0, function(err, written, buffer) {}); 14 | }); 15 | 16 | module.exports = merge(webpackBaseConfig, { 17 | devtool: '#source-map', 18 | devServer: { 19 | port: 9527, 20 | host: "127.0.0.1" 21 | }, 22 | output: { 23 | publicPath: '/dist/', 24 | filename: '[name].js', 25 | chunkFilename: '[name].chunk.js' 26 | }, 27 | plugins: [ 28 | new ExtractTextPlugin({ 29 | filename: '[name].css', 30 | allChunks: true 31 | }), 32 | new webpack.optimize.CommonsChunkPlugin({ 33 | name: ['vender-exten', 'vender-base'], 34 | minChunks: Infinity 35 | }), 36 | new HtmlWebpackPlugin({ 37 | title: '后台管理', 38 | filename: '../index.html', 39 | template: './src/template/index.ejs', 40 | favicon: './favicon.ico', 41 | inject: false 42 | }), 43 | new CopyWebpackPlugin([{ 44 | from: 'src/views/main-components/theme-switch/theme' 45 | }, ], { 46 | ignore: [ 47 | //'text-editor.vue' 48 | ] 49 | }) 50 | ] 51 | }); -------------------------------------------------------------------------------- /build/webpack.prod.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 4 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 5 | const cleanWebpackPlugin = require('clean-webpack-plugin'); 6 | const UglifyJsParallelPlugin = require('webpack-uglify-parallel'); 7 | const merge = require('webpack-merge'); 8 | const webpackBaseConfig = require('./webpack.base.config.js'); 9 | const os = require('os'); 10 | const fs = require('fs'); 11 | const path = require('path'); 12 | const package = require('../package.json'); 13 | 14 | fs.open('./build/env.js', 'w', function(err, fd) { 15 | const buf = 'export default "production";'; 16 | fs.write(fd, buf, 0, buf.length, 0, function(err, written, buffer) {}); 17 | }); 18 | 19 | 20 | module.exports = merge(webpackBaseConfig, { 21 | output: { 22 | publicPath: '/dist/', 23 | filename: '[name].[hash].js', 24 | chunkFilename: '[name].[hash].chunk.js' 25 | }, 26 | plugins: [ 27 | new cleanWebpackPlugin(['dist/*'], { 28 | root: path.resolve(__dirname, '../') 29 | }), 30 | new ExtractTextPlugin({ 31 | filename: '[name].[hash].css', 32 | allChunks: true 33 | }), 34 | new webpack.optimize.CommonsChunkPlugin({ 35 | // name: 'vendors', 36 | // filename: 'vendors.[hash].js' 37 | name: ['vender-exten', 'vender-base'], 38 | minChunks: Infinity 39 | }), 40 | new webpack.DefinePlugin({ 41 | 'process.env': { 42 | NODE_ENV: '"production"' 43 | } 44 | }), 45 | new webpack.optimize.UglifyJsPlugin({ 46 | compress: { 47 | warnings: false 48 | } 49 | }), 50 | // new UglifyJsParallelPlugin({ 51 | // workers: os.cpus().length, 52 | // mangle: true, 53 | // compressor: { 54 | // warnings: false, 55 | // drop_console: true, 56 | // drop_debugger: true 57 | // } 58 | // }), 59 | new CopyWebpackPlugin([{ 60 | from: 'favicon.ico' 61 | }, 62 | { 63 | from: 'src/styles/fonts', 64 | to: 'fonts' 65 | }, 66 | { 67 | from: 'src/views/main-components/theme-switch/theme' 68 | } 69 | ], { 70 | ignore: [ 71 | // 'text-editor.vue' 72 | ] 73 | }), 74 | new HtmlWebpackPlugin({ 75 | title: '后台管理', 76 | favicon: './favicon.ico', 77 | filename: '../index.html', 78 | template: './src/template/index.ejs', 79 | inject: false 80 | }) 81 | ] 82 | }); -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/favicon.ico -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 管理后台 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "admins", 3 | "version": "1.2.3", 4 | "description": "a management bases on iview", 5 | "main": "main.js", 6 | "scripts": { 7 | "init": "webpack --progress --config build/webpack.dev.config.js", 8 | "dev": "webpack-dev-server --content-base ./ --open --inline --hot --compress --config build/webpack.dev.config.js", 9 | "build": "webpack --progress --hide-modules --config build/webpack.prod.config.js" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/iview/iview-admin.git" 14 | }, 15 | "author": "Lison", 16 | "license": "MIT", 17 | "dependencies": { 18 | "@antv/data-set": "^0.8.7", 19 | "ajv": "^5.0.0", 20 | "area-data": "^1.0.0", 21 | "axios": "^0.17.1", 22 | "clipboard": "^1.7.1", 23 | "countup": "^1.8.2", 24 | "cropperjs": "^1.1.3", 25 | "echarts": "^3.8.5", 26 | "html2canvas": "^0.5.0-beta4", 27 | "ip": "^1.1.5", 28 | "iview": "^2.13.1", 29 | "iview-area": "^1.5.12", 30 | "jquery": "^2.2.3", 31 | "js-cookie": "^2.2.0", 32 | "js-file-download": "^0.4.1", 33 | "rasterizehtml": "^1.2.4", 34 | "simplemde": "^1.11.2", 35 | "smeditor": "^0.1.19", 36 | "sortablejs": "^1.7.0", 37 | "time-formater": "^1.0.1", 38 | "tinymce": "^4.7.3", 39 | "viser-vue": "^2.2.3", 40 | "vue": "^2.5.9", 41 | "vue-resource": "^1.3.5", 42 | "vue-router": "^3.0.1", 43 | "vuex": "^3.0.1" 44 | }, 45 | "devDependencies": { 46 | "autoprefixer-loader": "^3.2.0", 47 | "babel": "^6.23.0", 48 | "babel-core": "^6.23.1", 49 | "babel-eslint": "^8.0.3", 50 | "babel-loader": "^7.1.2", 51 | "babel-plugin-transform-runtime": "^6.12.0", 52 | "babel-preset-env": "^1.6.1", 53 | "babel-preset-es2015": "^6.24.1", 54 | "babel-preset-stage-3": "^6.24.1", 55 | "babel-runtime": "^6.11.6", 56 | "clean-webpack-plugin": "^0.1.17", 57 | "copy-webpack-plugin": "^4.2.3", 58 | "css-hot-loader": "^1.3.4", 59 | "css-loader": "^0.28.7", 60 | "eslint": "^4.12.1", 61 | "eslint-config-google": "^0.9.1", 62 | "eslint-config-standard": "^10.2.1", 63 | "eslint-plugin-html": "^4.0.1", 64 | "eslint-plugin-import": "^2.8.0", 65 | "eslint-plugin-node": "^5.2.1", 66 | "eslint-plugin-promise": "^3.6.0", 67 | "eslint-plugin-standard": "^3.0.1", 68 | "extract-text-webpack-plugin": "^3.0.2", 69 | "file-loader": "^1.1.5", 70 | "happypack": "^4.0.0", 71 | "html-loader": "^0.5.1", 72 | "html-webpack-plugin": "^2.28.0", 73 | "less": "^2.7.3", 74 | "less-loader": "^4.1.0", 75 | "semver": "^5.4.1", 76 | "style-loader": "^0.19.0", 77 | "unsupported": "^1.1.0", 78 | "url-loader": "^0.6.2", 79 | "vue-hot-reload-api": "^2.2.4", 80 | "vue-html-loader": "^1.2.3", 81 | "vue-i18n": "^5.0.3", 82 | "vue-loader": "^13.5.0", 83 | "vue-style-loader": "^3.0.3", 84 | "vue-template-compiler": "^2.5.9", 85 | "webpack": "^3.10.0", 86 | "webpack-dev-server": "^2.9.5", 87 | "webpack-merge": "^4.1.1", 88 | "webpack-uglify-parallel": "^0.1.4" 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/caculate/caculate.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 过滤搜索条件 3 | */ 4 | export const filterSearch = searchID => { 5 | if (!searchID || (!String(searchID).length)) { 6 | return false; 7 | } else { 8 | 9 | if (isNaN(searchID * 1) || searchID * 1 < 0 || 10 | (searchID.toString().split('.')[1] !== undefined)) { 11 | 12 | return false; 13 | 14 | } else { 15 | return true; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/config/api.js: -------------------------------------------------------------------------------- 1 | export default { 2 | host: 'http://127.0.0.1/8090', 3 | common: { 4 | login: '/admin/system/employee/sign/in' 5 | }, 6 | system: { 7 | permissionAll: '/admin/system/role/permission/all', 8 | role: '/admin/system/role/all', 9 | rolePermission: '/admin/system/role/permission', 10 | statistics: '/admin/system/statistics/dashboard' 11 | }, 12 | otc:{ 13 | //法币币种管理 14 | OtcCoin: '/admin/otc/otc-coin/page-query', 15 | OtcCoinDetail:'admin/otc/otc-coin/detail', 16 | update: 'admin/otc/otc-coin/update', 17 | create: 'admin/otc/otc-coin/create', 18 | //法币广告管理 19 | advertise:'admin/otc/advertise/page-query', 20 | advertiseStatus:'admin/otc/advertise/alter-status', 21 | //法币订单管理 22 | order:'admin/otc/order/page-query', 23 | orderDetail:'admin/otc/order/detail', 24 | //法币申诉管理 25 | appeal:'admin/otc/appeal/page-query', 26 | detail:'admin/otc/appeal/detail', 27 | cancelOrder:'admin/otc/appeal/cancel-order',//取消订单 28 | releaseCoin: 'admin/otc/appeal/release-coin',//放币 29 | } 30 | } -------------------------------------------------------------------------------- /src/config/storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 存储localStorage 3 | */ 4 | export const setStore = (name, content) => { 5 | if (!name) return; 6 | if (typeof content !== 'string') { 7 | content = JSON.stringify(content); 8 | } 9 | window.localStorage.setItem(name, content); 10 | } 11 | 12 | /** 13 | * 获取localStorage 14 | */ 15 | export const getStore = name => { 16 | if (!name) return; 17 | return window.localStorage.getItem(name); 18 | } 19 | 20 | /** 21 | * 删除localStorage 22 | */ 23 | export const removeStore = name => { 24 | if (!name) return; 25 | window.localStorage.removeItem(name); 26 | } -------------------------------------------------------------------------------- /src/images/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/src/images/login.png -------------------------------------------------------------------------------- /src/images/logo-min-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/src/images/logo-min-light.png -------------------------------------------------------------------------------- /src/images/logo-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/src/images/logo-min.png -------------------------------------------------------------------------------- /src/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/src/images/logo.png -------------------------------------------------------------------------------- /src/images/logo_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/src/images/logo_light.png -------------------------------------------------------------------------------- /src/libs/table2excel.js: -------------------------------------------------------------------------------- 1 | var idTmr; 2 | function getExplorer () { 3 | var explorer = window.navigator.userAgent; 4 | if (explorer.indexOf('MSIE') >= 0) { 5 | // ie 6 | return 'ie'; 7 | } else if (explorer.indexOf('Firefox') >= 0) { 8 | // firefox 9 | return 'Firefox'; 10 | } else if (explorer.indexOf('Chrome') >= 0) { 11 | // Chrome 12 | return 'Chrome'; 13 | } else if (explorer.indexOf('Opera') >= 0) { 14 | // Opera 15 | return 'Opera'; 16 | } else if (explorer.indexOf('Safari') >= 0) { 17 | // Safari 18 | return 'Safari'; 19 | }; 20 | }; 21 | function tranform (table, aId, name) { 22 | let tableHead = table.$children[0].$el; 23 | let tableBody = table.$children[1].$el; 24 | let tableInnerHTML = ''; 25 | if (table.$children.length !== 1) { 26 | let len = tableBody.rows.length; 27 | let i = -1; 28 | while (i < len) { 29 | if (i === -1) { 30 | Array.from(tableHead.rows[0].children).forEach((td) => { 31 | tableInnerHTML = tableInnerHTML + '' + td.children[0].children[0].innerHTML + ''; 32 | }); 33 | tableInnerHTML += ''; 34 | } else { 35 | tableInnerHTML += ''; 36 | Array.from(tableBody.rows[i].children).forEach((td) => { 37 | tableInnerHTML = tableInnerHTML + '' + td.children[0].children[0].innerHTML + ''; 38 | }); 39 | tableInnerHTML += ''; 40 | } 41 | i++; 42 | } 43 | tableInnerHTML += ''; 44 | } 45 | 46 | if (getExplorer() !== 'Safari' && name.substr(-1, 4) !== '.xls') { 47 | name += '.xls'; 48 | } 49 | 50 | if (getExplorer() === 'ie') { 51 | var curTbl = table; 52 | var oXL = new ActiveXObject('Excel.Application'); 53 | var oWB = oXL.Workbooks.Add(); 54 | var xlsheet = oWB.Worksheets(1); 55 | var sel = document.body.createTextRange(); 56 | sel.moveToElementText(curTbl); 57 | sel.select(); 58 | sel.execCommand('Copy'); 59 | xlsheet.Paste(); 60 | oXL.Visible = true; 61 | 62 | try { 63 | var fname = oXL.Application.GetSaveAsFilename('Excel.xls', 'Excel Spreadsheets (*.xls), *.xls'); 64 | } catch (e) { 65 | print('Nested catch caught ' + e); 66 | } finally { 67 | oWB.SaveAs(fname); 68 | // oWB.Close(savechanges = false); 69 | oXL.Quit(); 70 | oXL = null; 71 | idTmr = setInterval(Cleanup(), 1); 72 | } 73 | } else { 74 | tableToExcel(tableInnerHTML, aId, name); 75 | } 76 | } 77 | function Cleanup () { 78 | window.clearInterval(idTmr); 79 | // CollectGarbage(); 80 | } 81 | let tableToExcel = (function () { 82 | let uri = 'data:application/vnd.ms-excel;base64,'; 83 | let template = '{table}
'; 84 | let base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))); }; 85 | let format = function (s, c) { 86 | return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }); 87 | }; 88 | return function (table, aId, name) { 89 | let ctx = {worksheet: name || 'Worksheet', table: table}; 90 | document.getElementById(aId).href = uri + base64(format(template, ctx)); 91 | document.getElementById(aId).download = name; 92 | document.getElementById(aId).click(); 93 | }; 94 | })(); 95 | 96 | const table2excel = {}; 97 | 98 | table2excel.transform = tranform; 99 | 100 | export default table2excel; 101 | -------------------------------------------------------------------------------- /src/locale/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Locales from './locale'; 3 | import zhLocale from 'iview/src/locale/lang/zh-CN'; 4 | import enLocale from 'iview/src/locale/lang/en-US'; 5 | import zhTLocale from 'iview/src/locale/lang/zh-TW'; 6 | 7 | // 自动设置语言 8 | const navLang = navigator.language; 9 | const localLang = (navLang === 'zh-CN' || navLang === 'en-US') ? navLang : false; 10 | const lang = window.localStorage.lang || localLang || 'zh-CN'; 11 | 12 | Vue.config.lang = lang; 13 | 14 | // 多语言配置 15 | const locales = Locales; 16 | const mergeZH = Object.assign(zhLocale, locales['zh-CN']); 17 | const mergeEN = Object.assign(enLocale, locales['en-US']); 18 | const mergeTW = Object.assign(zhTLocale, locales['zh-TW']); 19 | Vue.locale('zh-CN', mergeZH); 20 | Vue.locale('en-US', mergeEN); 21 | Vue.locale('zh-TW', mergeTW); 22 | -------------------------------------------------------------------------------- /src/locale/locale.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'zh-CN': { 3 | home: '首页', 4 | switchLangTitle: '切换语言', 5 | international: '多语言切换', 6 | iviewComponentTitle: 'iview组件多语言切换', 7 | tip: '注:iview-admin只是为了示范如何实现多语言切换,所以只对当前页做了翻译。', 8 | intro: 'iview目前支持15种语言,只要你看得到的iview组件出现iview内置文字的地方都会根据你设置的语言类型自动切换对应的语言。', 9 | placeholderText: '请输入文字...', 10 | placeholderDate: '选择日期', 11 | name: '姓名', 12 | company: '公司', 13 | btnText: '点击查看模态框', 14 | modalText: '在这里你可以看到iview模态框默认的确定和取消按钮会切换语言', 15 | poptip: '国际化的气泡提示', 16 | showPoptipText: '点击显示气泡提示' 17 | }, 18 | 'zh-TW': { 19 | home: '首頁', 20 | switchLangTitle: '切換語言', 21 | international: '多語言切換', 22 | iviewComponentTitle: 'iview組件多語言切換', 23 | tip: '注:iview-admin只是為了示範如何實現多語言切換,所以只對當前頁做了翻譯。', 24 | intro: 'iview目前支持15種語言,只要你看得到的iview組件出現iview內置文字的地方都會根據你設置的語言類型自動切換對應的語言。', 25 | placeholderText: '請輸入文字...', 26 | placeholderDate: '選擇日期', 27 | name: '姓名', 28 | company: '公司', 29 | btnText: '點擊查看模態框', 30 | modalText: '在這裡你可以看到iview模態框默認的確定和取消按鈕會切換語言', 31 | poptip: '國際化的氣泡提示', 32 | showPoptipText: '點擊顯示氣泡提示' 33 | }, 34 | 'en-US': { 35 | home: 'home', 36 | switchLangTitle: 'Switch Lang', 37 | international: 'Switch Lang', 38 | tip: 'Note: iview-admin just to demonstrate how to achieve multi-language switching, so only the current page to do the translation.', 39 | iviewComponentTitle: 'The effect on the iview', 40 | intro: 'iview currently supports 15 languages, as long as you see the iview component where the text will be based on your language type automatically set the corresponding language.', 41 | placeholderText: 'please enter text...', 42 | placeholderDate: 'Select Date', 43 | name: 'name', 44 | company: 'company', 45 | btnText: 'Click to show modal', 46 | modalText: 'Here you can see the iview modal box by default to the OK and Cancel buttons that will switch the language', 47 | poptip: 'international poptip', 48 | showPoptipText: 'Click to show poptip' 49 | } 50 | }; 51 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import iView from 'iview'; 3 | import { router, initRouter } from './router/index'; 4 | import { appRouter } from './router/router'; 5 | import store from './store'; 6 | import App from './app.vue'; 7 | import '@/locale'; 8 | import 'iview/dist/styles/iview.css'; 9 | import VueI18n from 'vue-i18n'; 10 | import util from '@/libs/util'; 11 | import axios from 'axios'; 12 | import qs from 'qs'; 13 | import Api from '@/config/api'; 14 | import Cookies from 'js-cookie'; 15 | import Viser from 'viser-vue'; 16 | import { setStore, getStore, removeStore } from "@/config/storage.js"; 17 | 18 | Vue.prototype.$ajax = axios; 19 | axios.defaults.withCredentials = true; 20 | 21 | function toFloor(number, scale = 8) { 22 | if (new Number(number) == 0) { //如果是"0.0000000000000000" 23 | return 0; 24 | } 25 | let str = number + ""; //转字符串 26 | if (str.indexOf('e') > -1 || str.indexOf('E') > -1) { //科学计数法 27 | let num = new Number(number).toFixed(scale + 1), 28 | str = num + ""; 29 | return str.substring(0, str.length - 1); 30 | } else if (str.indexOf(".") > -1) { //小数 31 | if (scale == 0) { 32 | return str.substring(0, str.indexOf(".")); 33 | } 34 | return str.substring(0, str.indexOf(".") + scale + 1); //截取指定位数 35 | } else { //整数 36 | return str; 37 | } 38 | } 39 | Vue.filter('toFloor', (number, scale) => { 40 | return toFloor(number, scale); 41 | }); 42 | Vue.prototype.toFloor = toFloor; 43 | axios.interceptors.response.use((response) => { 44 | const data = response.data 45 | let baseURL = response.config.baseURL; 46 | let url = response.config.url; 47 | 48 | if (data.code === 4000) { 49 | Cookies.remove('user'); 50 | Cookies.remove('userPhone'); 51 | Cookies.remove('userInfo'); 52 | router.push({ name: 'login' }); 53 | } 54 | if (data.code === 5000) { 55 | router.push({ name: 'error-403' }); 56 | } 57 | return response; 58 | }) 59 | 60 | // axios.interceptors.request.use((config) => { 61 | // config.headers['x-auth-token'] = Cookies.get('x-auth-token'); 62 | // return config; 63 | // }) 64 | Vue.prototype.numToFixed = util.numToFixed; //主要用于科学计数法转数字 65 | 66 | Vue.prototype.api = Api; 67 | Vue.use(VueI18n); 68 | Vue.use(iView); 69 | Vue.use(Viser); 70 | 71 | new Vue({ 72 | el: '#app', 73 | router: router, 74 | store: store, 75 | render: h => h(App), 76 | data: { 77 | currentPageName: '' 78 | }, 79 | mounted() { 80 | this.currentPageName = this.$route.name; 81 | // 显示打开的页面的列表 82 | this.$store.commit('setOpenedList'); 83 | this.$store.commit('initCachepage'); 84 | // 权限菜单过滤相关 85 | this.$store.commit('updateMenulist'); 86 | }, 87 | created() { 88 | let tagsList = []; 89 | appRouter.map((item) => { 90 | if (item.children.length <= 1) { 91 | tagsList.push(item.children[0]); 92 | } else { 93 | tagsList.push(...item.children); 94 | } 95 | }); 96 | this.$store.commit('setTagsList', tagsList); 97 | } 98 | }); -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import iView from 'iview'; 3 | import Util from '../libs/util'; 4 | import VueRouter from 'vue-router'; 5 | import Cookies from 'js-cookie'; 6 | import { routers, otherRouter, appRouter } from './router'; 7 | 8 | Vue.use(VueRouter); 9 | 10 | // 路由配置 11 | const RouterConfig = { 12 | // mode: 'history', 13 | routes: routers 14 | }; 15 | 16 | export const router = new VueRouter(RouterConfig); 17 | 18 | router.beforeEach((to, from, next) => { 19 | iView.LoadingBar.start(); 20 | Util.title(to.meta.title); 21 | 22 | if (Cookies.get('locking') === '1' && to.name !== 'locking') { // 判断当前是否是锁定状态 23 | next({ 24 | replace: true, 25 | name: 'locking' 26 | }); 27 | } else if (Cookies.get('locking') === '0' && to.name === 'locking') { 28 | next(false); 29 | } else { 30 | if (!Cookies.get('user') && to.name !== 'login') { // 判断是否已经登录且前往的页面不是登录页 31 | next({ 32 | name: 'login' 33 | }); 34 | } else if (Cookies.get('user') && to.name === 'login') { // 判断是否已经登录且前往的是登录页 35 | Util.title(); 36 | next({ 37 | name: 'home_index' 38 | }); 39 | } else { 40 | const curRouterObj = Util.getRouterObjByName([otherRouter, ...appRouter], to.name); 41 | 42 | if (curRouterObj && curRouterObj.access !== undefined) { // 需要判断权限的路由 43 | if (curRouterObj.access === 1) { 44 | Util.toDefaultPage([otherRouter, ...appRouter], to.name, router, next); // 如果在地址栏输入的是一级菜单则默认打开其第一个二级菜单的页面 45 | } else { 46 | // removeStore("leftSidebarList"); 47 | // Cookies.remove('userInfo'); 48 | // Cookies.remove('userPhone'); 49 | // removeStore("pageOpenedList"); 50 | // this.$store.commit("logout", this); 51 | // this.$store.commit("clearOpenedSubmenu"); 52 | // this.$store.commit('clearAllTags'); 53 | // clearAppRouter(); 54 | // this.$router.push({ 55 | // name: "login" 56 | // }); 57 | 58 | // this.$Message.warning('您无此权限 !'); 59 | // next(); 60 | 61 | next({ 62 | replace: true, 63 | name: 'error-403' 64 | }); 65 | } 66 | } else { // 没有配置权限的路由, 直接通过 67 | Util.toDefaultPage([...routers], to.name, router, next); 68 | } 69 | } 70 | } 71 | }); 72 | 73 | router.afterEach((to) => { 74 | Util.openNewPage(router.app, to.name, to.params, to.query); 75 | iView.LoadingBar.finish(); 76 | window.scrollTo(0, 0); 77 | }); -------------------------------------------------------------------------------- /src/service/http.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import qs from 'qs' 3 | 4 | export const BASEURL = axios.defaults.baseURL = 'http://39.104.119.155:9090/'; 5 | 6 | export const fetch = (url, params = {}) => { 7 | return new Promise((resolve, reject) => { 8 | axios.get(url, { 9 | params: params 10 | }) 11 | .then(response => { 12 | resolve(response.data); 13 | }) 14 | .catch(err => { 15 | reject(err); 16 | }) 17 | }) 18 | } 19 | 20 | export const post = (url, data = {}) => { 21 | return new Promise((resolve, reject) => { 22 | axios.post(url, qs.stringify(data, { arrayFormat: 'repeat' })) 23 | .then(response => { 24 | resolve(response.data) 25 | }) 26 | .catch(err => { 27 | reject(err); 28 | }) 29 | }) 30 | } 31 | 32 | export const patch = (url, data = {}) => { 33 | return new Promise((resolve, reject) => { 34 | axios.patch(url, qs.stringify(data, { arrayFormat: 'repeat' })) 35 | .then(response => { 36 | resolve(response.data) 37 | }) 38 | .catch(err => { 39 | reject(err); 40 | }) 41 | }) 42 | } 43 | 44 | export const put = (url, data = {}) => { 45 | return new Promise((resolve, reject) => { 46 | axios.put(url, qs.stringify(data)) 47 | .then(response => { 48 | resolve(response.data) 49 | }) 50 | .catch(err => { 51 | reject(err); 52 | }) 53 | }) 54 | } 55 | 56 | export const postConfig = (url, data = {}, config) => { 57 | return new Promise((resolve, reject) => { 58 | axios.post(url, data, config) 59 | .then(response => { 60 | resolve(response.data) 61 | }) 62 | .catch(err => { 63 | reject(err); 64 | }) 65 | }) 66 | } -------------------------------------------------------------------------------- /src/smeditor/ColorPicker.vue: -------------------------------------------------------------------------------- 1 | 8 | 33 | 34 | 71 | -------------------------------------------------------------------------------- /src/smeditor/FontSizePicker.vue: -------------------------------------------------------------------------------- 1 | 8 | 27 | 28 | 60 | -------------------------------------------------------------------------------- /src/smeditor/Insert.vue: -------------------------------------------------------------------------------- 1 | 20 | 56 | 57 | 109 | -------------------------------------------------------------------------------- /src/smeditor/InsertLink.vue: -------------------------------------------------------------------------------- 1 | 12 | 38 | 39 | 118 | -------------------------------------------------------------------------------- /src/smeditor/InsertVideo.vue: -------------------------------------------------------------------------------- 1 | 11 | 33 | 34 | 112 | -------------------------------------------------------------------------------- /src/smeditor/TitlePicker.vue: -------------------------------------------------------------------------------- 1 | 10 | 35 | 36 | 77 | -------------------------------------------------------------------------------- /src/smeditor/icons.js: -------------------------------------------------------------------------------- 1 | const qiniu = (name) => { 2 | return `https://om4m02471.qnssl.com/2018/editor/${name}.svg?2` 3 | } 4 | 5 | const names = ['bold', 'italic', 'underline', 'strikethrough', 'color', 'listOrdered', 'listUnordered', 'listCheck', 'indent', 'outdent', 'alignLeft', 'alignCenter', 'alignRight', 'undo', 'redo', 'removeFormat', 'insertVideo', 'insertLink', 'insertImage', 'insertLine', 'insertQuote', 'insertBlock'] 6 | const icons = {} 7 | 8 | names.forEach(name => { 9 | icons[name] = qiniu(name.toLowerCase()) 10 | }) 11 | 12 | export default icons 13 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | 4 | import app from './modules/app'; 5 | import user from './modules/user'; 6 | 7 | Vue.use(Vuex); 8 | 9 | const store = new Vuex.Store({ 10 | state: { 11 | // 12 | }, 13 | mutations: { 14 | // 15 | }, 16 | actions: { 17 | 18 | }, 19 | modules: { 20 | app, 21 | user 22 | } 23 | }); 24 | 25 | export default store; 26 | -------------------------------------------------------------------------------- /src/store/modules/app.js: -------------------------------------------------------------------------------- 1 | import { otherRouter, appRouter } from '@/router/router'; 2 | import myhome from '@/views/home/home.vue'; 3 | 4 | 5 | import { setStore, getStore, removeStore } from "@/config/storage.js" 6 | 7 | import Util from '@/libs/util'; 8 | import Cookies from 'js-cookie'; 9 | import Vue from 'vue'; 10 | 11 | const app = { 12 | state: { 13 | maskLayer: true, 14 | cachePage: [], 15 | lang: '', 16 | isFullScreen: false, 17 | openedSubmenuArr: [], // 要展开的菜单数组 18 | menuTheme: 'dark', // 主题 19 | themeColor: '', 20 | pageOpenedList: [{ 21 | title: '首页', 22 | path: '', 23 | name: 'home_index' 24 | }], 25 | currentPageName: '', 26 | currentPath: [{ 27 | title: '首页', 28 | path: '', 29 | name: 'home_index' 30 | }], // 面包屑数组 31 | menuList: [], 32 | datas: [], 33 | permissionData: {}, 34 | routers: [ 35 | otherRouter, 36 | ...appRouter 37 | ], 38 | tagsList: [...otherRouter.children], 39 | messageCount: 0, 40 | dontCache: ['artical-publish'] // 在这里定义你不想要缓存的页面的name属性值(参见路由配置router.js) 41 | }, 42 | mutations: { 43 | // mutations里面注册时间 type为方法名字,触发该函数的方法为commit 44 | switchMaskLayer(state, bol) { 45 | state.maskLayer = bol; 46 | }, 47 | updatePermission(state, data) { 48 | state.permissionData = data; 49 | }, 50 | setTagsList(state, list) { 51 | state.tagsList.push(...list); 52 | }, 53 | updateMenulist(state) { 54 | state.menuList = appRouter; 55 | }, 56 | clearMenulist(state) { 57 | state.menuList = []; 58 | }, 59 | changeMenuTheme(state, theme) { 60 | state.menuTheme = theme; 61 | }, 62 | changeMainTheme(state, mainTheme) { 63 | state.themeColor = mainTheme; 64 | }, 65 | resetOpenSubmenu(state, arr) { 66 | state.openedSubmenuArr = arr; 67 | }, 68 | addOpenSubmenu(state, name) { 69 | let isEmpty = false; 70 | if (name.length === 0) { 71 | isEmpty = true; 72 | } 73 | if (!isEmpty) { 74 | state.openedSubmenuArr.push(name); 75 | } 76 | state.openedSubmenuArr = [...new Set(state.openedSubmenuArr)]; 77 | }, 78 | closePage(state, name) { 79 | state.cachePage.forEach((item, index) => { 80 | if (item === name) { 81 | state.cachePage.splice(index, 1); 82 | } 83 | }); 84 | }, 85 | initCachepage(state) { 86 | if (localStorage.cachePage) { 87 | state.cachePage = JSON.parse(localStorage.cachePage); 88 | } 89 | }, 90 | removeTag(state, name) { 91 | state.pageOpenedList.map((item, index) => { 92 | if (item.name === name) { 93 | state.pageOpenedList.splice(index, 1); 94 | } 95 | }); 96 | }, 97 | pageOpenedList(state, get) { 98 | let openedPage = state.pageOpenedList[get.index]; 99 | if (get.argu) { 100 | openedPage.argu = get.argu; 101 | } 102 | if (get.query) { 103 | openedPage.query = get.query; 104 | } 105 | state.pageOpenedList.splice(get.index, 1, openedPage); 106 | localStorage.pageOpenedList = JSON.stringify(state.pageOpenedList); 107 | }, 108 | clearAllTags(state) { 109 | state.pageOpenedList.splice(1); 110 | state.cachePage.length = 0; 111 | localStorage.pageOpenedList = JSON.stringify(state.pageOpenedList); 112 | }, 113 | clearOtherTags(state, vm) { 114 | let currentName = vm.$route.name; 115 | let currentIndex = 0; 116 | state.pageOpenedList.forEach((item, index) => { 117 | if (item.name === currentName) { 118 | currentIndex = index; 119 | } 120 | }); 121 | if (currentIndex === 0) { 122 | state.pageOpenedList.splice(1); 123 | } else { 124 | state.pageOpenedList.splice(currentIndex + 1); 125 | state.pageOpenedList.splice(1, currentIndex - 1); 126 | } 127 | let newCachepage = state.cachePage.filter(item => { 128 | return item === currentName; 129 | }); 130 | state.cachePage = newCachepage; 131 | localStorage.pageOpenedList = JSON.stringify(state.pageOpenedList); 132 | }, 133 | setOpenedList(state) { 134 | state.pageOpenedList = localStorage.pageOpenedList ? JSON.parse(localStorage.pageOpenedList) : [otherRouter.children[0]]; 135 | }, 136 | setCurrentPath(state, pathArr) { 137 | state.currentPath = pathArr; 138 | }, 139 | setCurrentPageName(state, name) { 140 | state.currentPageName = name; 141 | }, 142 | setAvator(state, path) { 143 | localStorage.avatorImgPath = path; 144 | }, 145 | switchLang(state, lang) { 146 | state.lang = lang; 147 | Vue.config.lang = lang; 148 | }, 149 | clearOpenedSubmenu(state) { 150 | debugger; 151 | state.openedSubmenuArr.length = 0; 152 | }, 153 | setMessageCount(state, count) { 154 | state.messageCount = count; 155 | }, 156 | increateTag(state, tagObj) { 157 | if (!Util.oneOf(tagObj.name, state.dontCache)) { 158 | state.cachePage.push(tagObj.name); 159 | localStorage.cachePage = JSON.stringify(state.cachePage); 160 | } 161 | state.pageOpenedList.push(tagObj); 162 | localStorage.pageOpenedList = JSON.stringify(state.pageOpenedList); 163 | } 164 | } 165 | }; 166 | 167 | export default app; -------------------------------------------------------------------------------- /src/store/modules/user.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie'; 2 | 3 | const user = { 4 | state: { 5 | pageLoading: false, 6 | memberCheckMask: false, 7 | memberCheckImgInfo: {}, 8 | date: '', 9 | businessCheckMask: false, 10 | businessCheckInfo: {}, 11 | }, 12 | mutations: { 13 | logout(state, vm) { 14 | Cookies.remove('user'); 15 | Cookies.remove('password'); 16 | Cookies.remove('access'); 17 | // 恢复默认样式 18 | let themeLink = document.querySelector('link[name="theme"]'); 19 | themeLink.setAttribute('href', ''); 20 | // 清空打开的页面等数据,但是保存主题数据 21 | let theme = ''; 22 | if (localStorage.theme) { 23 | theme = localStorage.theme; 24 | } 25 | localStorage.clear(); 26 | if (theme) { 27 | localStorage.theme = theme; 28 | } 29 | }, 30 | switchBusinessMask(state, bol) { 31 | state.businessCheckMask = bol; 32 | }, 33 | switchLoading(state, bol) { 34 | state.pageLoading = bol; 35 | }, 36 | switchMemberMask(state, bol) { 37 | state.memberCheckMask = bol; 38 | }, 39 | businessCheckInfo(state, obj) { 40 | state.businessCheckInfo = obj; 41 | }, 42 | memeberCheckImg(state, obj) { 43 | state.memberCheckImgInfo = obj; 44 | }, 45 | changeDate(state, str) { 46 | state.date = str; 47 | } 48 | } 49 | }; 50 | 51 | export default user; -------------------------------------------------------------------------------- /src/styles/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/src/styles/fonts/ionicons.eot -------------------------------------------------------------------------------- /src/styles/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/src/styles/fonts/ionicons.ttf -------------------------------------------------------------------------------- /src/styles/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/src/styles/fonts/ionicons.woff -------------------------------------------------------------------------------- /src/styles/loading.less: -------------------------------------------------------------------------------- 1 | .demo-spin-icon-load{ 2 | animation: ani-demo-spin 1s linear infinite; 3 | } 4 | @keyframes ani-demo-spin { 5 | from { transform: rotate(0deg);} 6 | 50% { transform: rotate(180deg);} 7 | to { transform: rotate(360deg);} 8 | } -------------------------------------------------------------------------------- /src/styles/login_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jya126/ZTuoExchange_admin_web/e3f9f89b07d14854611e7fc8c69a0ea0ed9753c4/src/styles/login_bg.jpg -------------------------------------------------------------------------------- /src/styles/reset-iview-style.less: -------------------------------------------------------------------------------- 1 | .errorFormatBorder { 2 | .ivu-input{ 3 | border-color: #ed3f14a6; 4 | box-shadow: 0 0 2px 1px #ed3f14a6; 5 | } 6 | } 7 | 8 | .resetRequired{ 9 | &>.ivu-form-item-label:before{ 10 | content: "*"; 11 | display: inline-block; 12 | margin-right: 4px; 13 | line-height: 1; 14 | font-family: SimSun; 15 | font-size: 12px; 16 | color: #ed3f14; 17 | } 18 | } 19 | 20 | .resetFromErr { 21 | .ivu-input{ 22 | border: 1px solid #ed3f14; 23 | } 24 | } 25 | 26 | .resetFromErr { 27 | .ivu-input:focus{ 28 | border-color: #ed3f14; 29 | outline: 0; 30 | box-shadow: 0 0 0 2px rgba(237, 63, 20, .2); 31 | } 32 | } 33 | 34 | 35 | /* 不显示用户名、密码 输入框logo */ 36 | 37 | .ivu-input { 38 | background-image: unset !important; 39 | } 40 | 41 | /* form内单行显示自定义input 编辑投票 */ 42 | 43 | .formLine { 44 | &>.ivu-form-item-label { 45 | width: 90px !important; 46 | } 47 | } 48 | 49 | .formLine{ 50 | &>.ivu-form-item-content { 51 | margin-left: 90px !important; 52 | } 53 | } 54 | 55 | /* 用户管理 添加角色路由*/ 56 | 57 | .mainEmployeeContent { 58 | &>.ivu-form-item-content { 59 | padding-right: 60px !important; 60 | } 61 | } 62 | 63 | /* 64 | 认证商家详情页 65 | */ 66 | .businessDetail{ 67 | .ivu-spin-main{ 68 | position: absolute; 69 | top: 50%; 70 | left: 50%; 71 | transform: translate(-50%,-50%); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/template/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 管理后台 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/vendors/vendors.base.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import iView from 'iview'; 3 | import VueRouter from 'vue-router'; 4 | import Vuex from 'vuex'; 5 | -------------------------------------------------------------------------------- /src/vendors/vendors.exten.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | // import echarts from 'echarts'; 3 | import Cookies from 'js-cookie'; 4 | import clipboard from 'clipboard'; 5 | import html2canvas from 'html2canvas'; 6 | import rasterizehtml from 'rasterizehtml'; 7 | -------------------------------------------------------------------------------- /src/views/bond/BondManage.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | 222 | 223 | -------------------------------------------------------------------------------- /src/views/content/AddAnnouncement.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 168 | 169 | 213 | 214 | -------------------------------------------------------------------------------- /src/views/content/AddHelpManage.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 174 | 175 | 219 | 220 | -------------------------------------------------------------------------------- /src/views/error-page/403.less: -------------------------------------------------------------------------------- 1 | @keyframes error403animation { 2 | 0% { 3 | transform: rotateZ(0deg); 4 | } 5 | 40% { 6 | transform: rotateZ(-20deg); 7 | } 8 | 45% { 9 | transform: rotateZ(-15deg); 10 | } 11 | 50% { 12 | transform: rotateZ(-20deg); 13 | } 14 | 55% { 15 | transform: rotateZ(-15deg); 16 | } 17 | 60% { 18 | transform: rotateZ(-20deg); 19 | } 20 | 100% { 21 | transform: rotateZ(0deg); 22 | } 23 | } 24 | .error403{ 25 | &-body-con{ 26 | width: 700px; 27 | height: 500px; 28 | position: absolute; 29 | left: 50%; 30 | top: 50%; 31 | transform: translate(-50%,-50%); 32 | &-title{ 33 | text-align: center; 34 | font-size: 240px; 35 | font-weight: 700; 36 | color: #2d8cf0; 37 | height: 260px; 38 | line-height: 260px; 39 | margin-top: 40px; 40 | .error403-0-span{ 41 | display: inline-block; 42 | position: relative; 43 | width: 170px; 44 | height: 170px; 45 | border-radius: 50%; 46 | border: 20px solid #ed3f14; 47 | color: #ed3f14; 48 | margin-right: 10px; 49 | i{ 50 | display: inline-block; 51 | font-size: 120px; 52 | position: absolute; 53 | left: 50%; 54 | top: 50%; 55 | transform: translate(-50%,-50%); 56 | } 57 | } 58 | .error403-key-span{ 59 | display: inline-block; 60 | position: relative; 61 | width: 100px; 62 | height: 190px; 63 | border-radius: 50%; 64 | margin-right: 10px; 65 | i{ 66 | display: inline-block; 67 | font-size: 190px; 68 | position: absolute; 69 | left: 20px; 70 | transform: translate(-50%,-60%); 71 | transform-origin: center bottom; 72 | animation: error403animation 2.8s ease 0s infinite; 73 | } 74 | } 75 | } 76 | &-message{ 77 | display: block; 78 | text-align: center; 79 | font-size: 30px; 80 | font-weight: 500; 81 | letter-spacing: 4px; 82 | color: #dddde2; 83 | } 84 | } 85 | &-btn-con{ 86 | text-align: center; 87 | padding: 20px 0; 88 | margin-bottom: 40px; 89 | } 90 | } -------------------------------------------------------------------------------- /src/views/error-page/403.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 19 | 20 | 39 | -------------------------------------------------------------------------------- /src/views/error-page/404.less: -------------------------------------------------------------------------------- 1 | @keyframes error404animation { 2 | 0% { 3 | transform: rotateZ(0deg); 4 | } 5 | 20% { 6 | transform: rotateZ(-60deg); 7 | } 8 | 40% { 9 | transform: rotateZ(-10deg); 10 | } 11 | 60% { 12 | transform: rotateZ(50deg); 13 | } 14 | 80% { 15 | transform: rotateZ(-20deg); 16 | } 17 | 100% { 18 | transform: rotateZ(0deg); 19 | } 20 | } 21 | .error404{ 22 | &-body-con{ 23 | width: 700px; 24 | height: 500px; 25 | position: absolute; 26 | left: 50%; 27 | top: 50%; 28 | transform: translate(-50%,-50%); 29 | &-title{ 30 | text-align: center; 31 | font-size: 240px; 32 | font-weight: 700; 33 | color: #2d8cf0; 34 | height: 260px; 35 | line-height: 260px; 36 | margin-top: 40px; 37 | span{ 38 | display: inline-block; 39 | color: #19be6b; 40 | font-size: 230px; 41 | animation: error404animation 3s ease 0s infinite alternate; 42 | } 43 | } 44 | &-message{ 45 | display: block; 46 | text-align: center; 47 | font-size: 30px; 48 | font-weight: 500; 49 | letter-spacing: 12px; 50 | color: #dddde2; 51 | } 52 | } 53 | &-btn-con{ 54 | text-align: center; 55 | padding: 20px 0; 56 | margin-bottom: 40px; 57 | } 58 | } -------------------------------------------------------------------------------- /src/views/error-page/404.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 19 | 20 | 35 | -------------------------------------------------------------------------------- /src/views/error-page/500.less: -------------------------------------------------------------------------------- 1 | @keyframes error500animation { 2 | 0% { 3 | transform: rotateZ(0deg); 4 | } 5 | 20% { 6 | transform: rotateZ(-10deg); 7 | } 8 | 40% { 9 | transform: rotateZ(5deg); 10 | } 11 | 60% { 12 | transform: rotateZ(-5deg); 13 | } 14 | 80% { 15 | transform: rotateZ(10deg); 16 | } 17 | 100% { 18 | transform: rotateZ(0deg); 19 | } 20 | } 21 | .error500{ 22 | &-body-con{ 23 | width: 700px; 24 | height: 500px; 25 | position: absolute; 26 | left: 50%; 27 | top: 50%; 28 | transform: translate(-50%,-50%); 29 | &-title{ 30 | text-align: center; 31 | font-size: 240px; 32 | font-weight: 700; 33 | color: #2d8cf0; 34 | height: 260px; 35 | line-height: 260px; 36 | margin-top: 40px; 37 | .error500-0-span{ 38 | display: inline-block; 39 | position: relative; 40 | width: 170px; 41 | height: 170px; 42 | border-radius: 50%; 43 | border: 20px solid #ed3f14; 44 | color: #ed3f14; 45 | margin-right: 10px; 46 | i{ 47 | display: inline-block; 48 | font-size: 120px; 49 | position: absolute; 50 | bottom: -10px; 51 | left: 10px; 52 | transform-origin: center bottom; 53 | animation: error500animation 3s ease 0s infinite alternate; 54 | } 55 | } 56 | } 57 | &-message{ 58 | display: block; 59 | text-align: center; 60 | font-size: 30px; 61 | font-weight: 500; 62 | letter-spacing: 4px; 63 | color: #dddde2; 64 | } 65 | } 66 | &-btn-con{ 67 | text-align: center; 68 | padding: 20px 0; 69 | margin-bottom: 40px; 70 | } 71 | } -------------------------------------------------------------------------------- /src/views/error-page/500.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 21 | 22 | 37 | -------------------------------------------------------------------------------- /src/views/error-page/error-page.less: -------------------------------------------------------------------------------- 1 | .error-page{ 2 | &-show{ 3 | width: 100%; 4 | height: 180px; 5 | transform: scale(0.4); 6 | } 7 | &-cover{ 8 | position: absolute; 9 | width: 100%; 10 | height: 100%; 11 | left: 0; 12 | top: 0; 13 | } 14 | &-intro-con{ 15 | height: 180px; 16 | p{ 17 | display: block; 18 | width: 100%; 19 | text-align: center; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/views/error-page/error-page.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 85 | 86 | 98 | -------------------------------------------------------------------------------- /src/views/exchange/OrderDetail.vue: -------------------------------------------------------------------------------- 1 | 58 | 59 | 174 | 175 | -------------------------------------------------------------------------------- /src/views/finance/ChargeCoinDetail.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 164 | 165 | -------------------------------------------------------------------------------- /src/views/finance/FeeManage.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 157 | 158 | 161 | 162 | -------------------------------------------------------------------------------- /src/views/finance/TradeDetail.vue: -------------------------------------------------------------------------------- 1 | 107 | 108 | 211 | 212 | -------------------------------------------------------------------------------- /src/views/finance/WithdrawDetail.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | 209 | 210 | 216 | -------------------------------------------------------------------------------- /src/views/home/components/countUp.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 117 | -------------------------------------------------------------------------------- /src/views/home/components/dataSourcePie.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 59 | -------------------------------------------------------------------------------- /src/views/home/components/inforCard.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 30 | 31 | 60 | 61 | -------------------------------------------------------------------------------- /src/views/home/components/map.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /src/views/home/components/mapDataTable.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 32 | -------------------------------------------------------------------------------- /src/views/home/components/serviceRequests.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /src/views/home/components/styles/infor-card.less: -------------------------------------------------------------------------------- 1 | .infor-card-icon-con{ 2 | height: 100%; 3 | } 4 | .height-100{ 5 | height: 100%; 6 | } 7 | .infor-card-con{ 8 | height: 100px; 9 | } 10 | .infor-intro-text{ 11 | font-size:12px; 12 | font-weight:500; 13 | color:#C8C8C8; 14 | } -------------------------------------------------------------------------------- /src/views/home/components/styles/to-do-list-item.less: -------------------------------------------------------------------------------- 1 | .to-do-list-item-text{ 2 | word-break:keep-all; 3 | white-space:nowrap; 4 | overflow: hidden; 5 | text-overflow: ellipsis; 6 | font-weight: 500; 7 | cursor: pointer; 8 | height: 36px; 9 | 10 | .height-100{ 11 | height: 100%; 12 | } 13 | .infor-icon-row{ 14 | color: #c8c8c8; 15 | } 16 | } 17 | .hasDid{ 18 | text-decoration: line-through; 19 | color: gray; 20 | font-weight: 100; 21 | } -------------------------------------------------------------------------------- /src/views/home/components/toDoListItem.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 24 | 25 | -------------------------------------------------------------------------------- /src/views/home/components/userFlow.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 82 | -------------------------------------------------------------------------------- /src/views/home/components/visiteVolume.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 77 | -------------------------------------------------------------------------------- /src/views/home/home.less: -------------------------------------------------------------------------------- 1 | .user-infor{ 2 | height: 135px; 3 | } 4 | .avator-img{ 5 | display: block; 6 | width: 80%; 7 | max-width: 100px; 8 | height: auto; 9 | } 10 | .card-user-infor-name{ 11 | font-size: 2em; 12 | color: #2d8cf0; 13 | } 14 | .card-title{ 15 | color: #abafbd; 16 | } 17 | .made-child-con-middle{ 18 | height: 100%; 19 | } 20 | .to-do-list-con{ 21 | height: 145px; 22 | overflow: auto; 23 | } 24 | .to-do-item{ 25 | padding: 2px; 26 | } 27 | .infor-card-con{ 28 | height: 100px; 29 | } 30 | .infor-card-icon-con{ 31 | height: 100%; 32 | color: white; 33 | border-radius: 3px 0 0 3px; 34 | } 35 | .map-con{ 36 | height: 305px; 37 | } 38 | .map-incon{ 39 | height: 100%; 40 | } 41 | .data-source-row{ 42 | height: 200px; 43 | } 44 | .line-chart-con{ 45 | height: 150px; 46 | } 47 | -------------------------------------------------------------------------------- /src/views/home/map-data/get-city-value.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | {name: '海门', value: 45}, 3 | {name: '鄂尔多斯', value: 34}, 4 | {name: '招远', value: 47}, 5 | {name: '舟山', value: 22}, 6 | {name: '齐齐哈尔', value: 74}, 7 | {name: '广州', value: 138}, 8 | {name: '盐城', value: 15}, 9 | {name: '北京', value: 250}, 10 | {name: '深圳', value: 141}, 11 | {name: '赤峰', value: 16}, 12 | {name: '青岛', value: 89}, 13 | {name: '乳山', value: 18}, 14 | {name: '金昌', value: 34}, 15 | {name: '泉州', value: 21}, 16 | {name: '莱西', value: 66}, 17 | {name: '日照', value: 45}, 18 | {name: '胶南', value: 23}, 19 | {name: '南通', value: 54}, 20 | {name: '拉萨', value: 22}, 21 | {name: '云浮', value: 78}, 22 | {name: '梅州', value: 23}, 23 | {name: '文登', value: 78}, 24 | {name: '上海', value: 218} 25 | ]; 26 | -------------------------------------------------------------------------------- /src/views/home/map-data/get-geography-value.js: -------------------------------------------------------------------------------- 1 | export default { 2 | '海门': [121.15, 31.89], 3 | '鄂尔多斯': [109.781327, 39.608266], 4 | '招远': [120.38, 37.35], 5 | '舟山': [122.207216, 29.985295], 6 | '齐齐哈尔': [123.97, 47.33], 7 | '广州': [113.23, 23.16], 8 | '盐城': [120.13, 33.38], 9 | '赤峰': [118.87, 42.28], 10 | '深圳': [114.07, 22.62], 11 | '青岛': [120.33, 36.07], 12 | '北京': [116.46, 39.92], 13 | '乳山': [121.52, 36.89], 14 | '金昌': [102.188043, 38.520089], 15 | '泉州': [118.58, 24.93], 16 | '莱西': [120.53, 36.86], 17 | '日照': [119.46, 35.42], 18 | '胶南': [119.97, 35.88], 19 | '南通': [121.05, 32.08], 20 | '拉萨': [91.11, 29.97], 21 | '云浮': [112.02, 22.93], 22 | '梅州': [116.1, 24.55], 23 | '文登': [122.05, 37.2], 24 | '上海': [121.48, 31.22] 25 | }; 26 | -------------------------------------------------------------------------------- /src/views/home/map-data/get-style-json.js: -------------------------------------------------------------------------------- 1 | export default [{ 2 | 'featureType': 'water', 3 | 'elementType': 'all', 4 | 'stylers': { 5 | 'visibility': 'off' 6 | } 7 | }, { 8 | 'featureType': 'land', 9 | 'elementType': 'all', 10 | 'stylers': { 11 | 'color': 'red' 12 | } 13 | }, { 14 | 'featureType': 'railway', 15 | 'elementType': 'all', 16 | 'stylers': { 17 | 'visibility': 'off' 18 | } 19 | }, { 20 | 'featureType': 'highway', 21 | 'elementType': 'all', 22 | 'stylers': { 23 | 'color': '#fdfdfd' 24 | } 25 | }, { 26 | 'featureType': 'highway', 27 | 'elementType': 'labels', 28 | 'stylers': { 29 | 'visibility': 'off' 30 | } 31 | }, { 32 | 'featureType': 'arterial', 33 | 'elementType': 'geometry', 34 | 'stylers': { 35 | 'color': '#00ff00' 36 | } 37 | }, { 38 | 'featureType': 'arterial', 39 | 'elementType': 'geometry.fill', 40 | 'stylers': { 41 | 'color': '#fefefe' 42 | } 43 | }, { 44 | 'featureType': 'poi', 45 | 'elementType': 'all', 46 | 'stylers': { 47 | 'visibility': 'off' 48 | } 49 | }, { 50 | 'featureType': 'green', 51 | 'elementType': 'all', 52 | 'stylers': { 53 | 'visibility': 'off' 54 | } 55 | }, { 56 | 'featureType': 'subway', 57 | 'elementType': 'all', 58 | 'stylers': { 59 | 'visibility': 'off' 60 | } 61 | }, { 62 | 'featureType': 'manmade', 63 | 'elementType': 'all', 64 | 'stylers': { 65 | 'color': 'red' 66 | } 67 | }, { 68 | 'featureType': 'local', 69 | 'elementType': 'all', 70 | 'stylers': { 71 | 'color': 'red' 72 | } 73 | }, { 74 | 'featureType': 'arterial', 75 | 'elementType': 'labels', 76 | 'stylers': { 77 | 'visibility': 'off' 78 | } 79 | }, { 80 | 'featureType': 'boundary', 81 | 'elementType': 'all', 82 | 'stylers': { 83 | 'color': '#000' 84 | } 85 | }, { 86 | 'featureType': 'building', 87 | 'elementType': 'all', 88 | 'stylers': { 89 | 'color': '#d1d1d1' 90 | } 91 | }, { 92 | 'featureType': 'label', 93 | 'elementType': 'labels.text.fill', 94 | 'stylers': { 95 | 'color': '#999999' 96 | } 97 | }]; 98 | -------------------------------------------------------------------------------- /src/views/login.less: -------------------------------------------------------------------------------- 1 | .login{ 2 | width: 100%; 3 | height: 100%; 4 | background-image: url('../images/login.png'); 5 | background-size: cover; 6 | background-position: center; 7 | position: relative; 8 | &-con{ 9 | position: absolute; 10 | right: 160px; 11 | top: 50%; 12 | transform: translateY(-60%); 13 | width: 300px; 14 | &-header{ 15 | font-size: 16px; 16 | font-weight: 300; 17 | text-align: center; 18 | padding: 30px 0; 19 | } 20 | .form-con{ 21 | padding: 10px 0 0; 22 | } 23 | .login-tip{ 24 | font-size: 10px; 25 | text-align: center; 26 | color: #c3c3c3; 27 | } 28 | .phone-num{ 29 | font-size: 16px; 30 | font-weight: 700; 31 | text-align: center; 32 | line-height: 32px; 33 | border: 1px solid #dddee1; 34 | } 35 | 36 | } 37 | } -------------------------------------------------------------------------------- /src/views/login.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 77 | 78 | -------------------------------------------------------------------------------- /src/views/main-components/breadcrumb-nav.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 28 | 29 | -------------------------------------------------------------------------------- /src/views/main-components/fullscreen.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 75 | -------------------------------------------------------------------------------- /src/views/main-components/lockscreen/components/locking-page.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 45 | -------------------------------------------------------------------------------- /src/views/main-components/lockscreen/components/unlock.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 28 | 29 | 81 | -------------------------------------------------------------------------------- /src/views/main-components/lockscreen/lockscreen.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 66 | 67 | -------------------------------------------------------------------------------- /src/views/main-components/lockscreen/styles/unlock.less: -------------------------------------------------------------------------------- 1 | .unlock-body-con{ 2 | position: absolute; 3 | width: 400px; 4 | height: 100px; 5 | left: 50%; 6 | top: 50%; 7 | margin-left: -200px; 8 | margin-top: -200px; 9 | transform-origin: center center; 10 | z-index: 10; 11 | .unlock-avator-con{ 12 | position: absolute; 13 | left: 50%; 14 | top: 50%; 15 | transform: translate(-50%,-50%); 16 | box-sizing: border-box; 17 | width: 100px; 18 | height: 100px; 19 | border-radius: 50%; 20 | overflow: hidden; 21 | border: 2px solid white; 22 | cursor: pointer; 23 | transition: all .5s; 24 | z-index: 12; 25 | box-shadow: 0 0 10px 2px rgba(255, 255, 255, .3); 26 | .unlock-avator-img{ 27 | width: 100%; 28 | height: 100%; 29 | display: block; 30 | z-index: 7; 31 | } 32 | .unlock-avator-cover{ 33 | width: 100%; 34 | height: 100%; 35 | background: rgba(0, 0, 0, .6); 36 | z-index: 11600; 37 | position: absolute; 38 | left: 0; 39 | top: 0; 40 | opacity: 0; 41 | transition: opacity .2s; 42 | color: white; 43 | span{ 44 | display: block; 45 | margin: 20px auto 5px; 46 | text-align: center; 47 | } 48 | p{ 49 | text-align: center; 50 | font-size: 16px; 51 | font-weight: 500; 52 | } 53 | } 54 | &:hover .unlock-avator-cover{ 55 | opacity: 1; 56 | transition: opacity .2s; 57 | } 58 | } 59 | .unlock-avator-under-back{ 60 | position: absolute; 61 | left: 50%; 62 | top: 50%; 63 | transform: translate(-45px,-50%); 64 | box-sizing: border-box; 65 | width: 100px; 66 | height: 100px; 67 | border-radius: 50%; 68 | background: #667aa6; 69 | transition: all .5s; 70 | z-index: 5; 71 | } 72 | .unlock-input-con{ 73 | position: absolute; 74 | height: 70px; 75 | width: 350px; 76 | top: 15px; 77 | right: 0px; 78 | .unlock-input-overflow-con{ 79 | position: absolute; 80 | width: 100%; 81 | height: 100%; 82 | left: 0; 83 | top: 0; 84 | overflow: hidden; 85 | .unlock-overflow-body{ 86 | position: absolute; 87 | top: 0; 88 | right: 0; 89 | width: 100%; 90 | height: 100%; 91 | transition: all .5s ease .5s; 92 | .unlock-input{ 93 | float: left; 94 | display: block; 95 | box-sizing: content-box; 96 | height: 22px; 97 | width: 230px; 98 | font-size: 18px; 99 | outline: none; 100 | padding: 11px 10px 11px 30px; 101 | border: 2px solid #e2ddde; 102 | margin-top: 10px; 103 | } 104 | .unlock-btn{ 105 | float: left; 106 | display: block; 107 | font-size: 20px; 108 | padding: 7px 30px; 109 | cursor: pointer; 110 | border-radius: 0 25px 25px 0; 111 | border: 2px solid #e2ddde; 112 | border-left: none; 113 | background: #2d8cf0; 114 | outline: none; 115 | transition: all .2s; 116 | margin-top: 10px; 117 | &:hover{ 118 | background: #5cadff; 119 | box-shadow: 0 0 10px 3px rgba(255, 255, 255, .2); 120 | } 121 | } 122 | .click-unlock-btn{ 123 | background: #2b85e4 !important; 124 | } 125 | } 126 | } 127 | } 128 | .unlock-locking-tip-con{ 129 | width: 100px; 130 | height: 30px; 131 | text-align: center; 132 | position: absolute; 133 | left: 50%; 134 | margin-left: -50px; 135 | bottom: -80px; 136 | color: white; 137 | font-size: 18px; 138 | } 139 | } 140 | @keyframes unlock-in{ 141 | 0% { 142 | transform: scale(0); 143 | } 144 | 80%{ 145 | transform: scale(0); 146 | } 147 | 88% { 148 | transform: scale(1.3); 149 | } 150 | 100% { 151 | transform: scale(1); 152 | } 153 | } 154 | @keyframes unlock-out{ 155 | 0% { 156 | transform: scale(1); 157 | } 158 | 60%{ 159 | transform: scale(1.2); 160 | } 161 | 100% { 162 | transform: scale(0); 163 | } 164 | } 165 | .show-unlock-enter-active{ 166 | animation: unlock-in 1.4s ease; 167 | } 168 | .show-unlock-leave-to{ 169 | opacity: 0; 170 | } 171 | .show-unlock-leave-active{ 172 | transition: opacity .2s; 173 | } 174 | .unlock-con{ 175 | width: 100%; 176 | height: 100%; 177 | } -------------------------------------------------------------------------------- /src/views/main-components/message-tip.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 31 | -------------------------------------------------------------------------------- /src/views/main-components/shrinkable-menu/components/sidebarMenu.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | 30 | 76 | -------------------------------------------------------------------------------- /src/views/main-components/shrinkable-menu/components/sidebarMenuShrink.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 62 | -------------------------------------------------------------------------------- /src/views/main-components/shrinkable-menu/shrinkable-menu.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 24 | 25 | 97 | -------------------------------------------------------------------------------- /src/views/main-components/shrinkable-menu/styles/menu.less: -------------------------------------------------------------------------------- 1 | .ivu-shrinkable-menu{ 2 | position: relative; 3 | height: 100%; 4 | width: 100%; 5 | } -------------------------------------------------------------------------------- /src/views/member/DrawList.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 108 | 109 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /src/views/member/Parnter.vue: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /src/views/member/RechargeList.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /src/views/otc/AdvertiseDetail.vue: -------------------------------------------------------------------------------- 1 | 91 | 92 | 190 | 191 | 207 | 208 | 209 | -------------------------------------------------------------------------------- /src/views/otc/AppealDetail.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 76 | 77 | -------------------------------------------------------------------------------- /src/views/otc/BusinessDetail.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 90 | 91 | -------------------------------------------------------------------------------- /src/views/otc/ExitBondDetail.vue: -------------------------------------------------------------------------------- 1 | 52 | 90 | 91 | 111 | 112 | -------------------------------------------------------------------------------- /src/views/system/AccessLog.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 154 | 155 | -------------------------------------------------------------------------------- /src/views/system/CoinTransferDetail.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 134 | 135 | -------------------------------------------------------------------------------- /src/views/system/Dictionary.vue: -------------------------------------------------------------------------------- 1 | 2 | 64 | 65 | 214 | 215 | 218 | -------------------------------------------------------------------------------- /src/views/system/Employee.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 210 | 211 | -------------------------------------------------------------------------------- /src/views/user/PersonalCenter.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 134 | 135 | 138 | 139 | 140 | --------------------------------------------------------------------------------