├── .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 = '';
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
33 |
34 |
71 |
--------------------------------------------------------------------------------
/src/smeditor/FontSizePicker.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
27 |
28 |
60 |
--------------------------------------------------------------------------------
/src/smeditor/Insert.vue:
--------------------------------------------------------------------------------
1 |
2 |
19 |
20 |
56 |
57 |
109 |
--------------------------------------------------------------------------------
/src/smeditor/InsertLink.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
X
5 |
插入链接
6 |
7 |
8 |
9 |
10 |
11 |
12 |
38 |
39 |
118 |
--------------------------------------------------------------------------------
/src/smeditor/InsertVideo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
X
5 |
插入视频
6 |
7 |
8 |
9 |
10 |
11 |
33 |
34 |
112 |
--------------------------------------------------------------------------------
/src/smeditor/TitlePicker.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
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 |
2 |
3 |
4 |
5 | 查询保证金策略
6 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
27 |
28 |
29 |
36 |
37 |
44 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
222 |
223 |
--------------------------------------------------------------------------------
/src/views/content/AddAnnouncement.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 编辑公告
6 |
7 |
29 |
30 |
31 |
32 |
35 |
36 |
37 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
168 |
169 |
213 |
214 |
--------------------------------------------------------------------------------
/src/views/content/AddHelpManage.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 系统帮助
6 |
7 |
34 |
35 |
36 |
37 |
40 |
41 |
42 |
45 |
46 |
47 |
48 |
49 |
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 |
6 |
7 |
8 |
9 | 4
10 | You don't have permission
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
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 |
6 |
7 |
8 |
9 | 44
10 | YOU LOOK LOST
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
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 |
6 |
7 |
8 |
9 |
10 | 5
11 |
12 | Oops! the server is wrong
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
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 |
7 |
8 |
9 |
10 |
11 |
12 | 404-页面不存在
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 当访问的页面不存在时会跳转到404页面,您可以在浏览器地址栏中修改url为一个不存在的路径,体验一下效果
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | 403-权限不足
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | 在当前登录用户不具有执行当前操作的权限时跳转到该页面,您可以在ajax请求方法中判断返回的状态码为403时跳转到该页面
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 | 500-服务端错误
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 | 当请求之后出现服务端错误时跳转到该页面,您可以在ajax请求方法中判断返回的状态码为500时跳转到该页面
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
98 |
--------------------------------------------------------------------------------
/src/views/exchange/OrderDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 币币委托详情
6 |
10 |
11 |
12 |
13 |
14 |
15 | 委托单号:{{detail[0].orderId}}
16 |
17 |
18 | 状态:{{getStatus(detail[0].status)}}
19 |
20 |
21 | 委托时间:{{getTime(detail[0].time)}}
22 |
23 |
24 | 委托类型:{{getStyle(detail[0].type)}}
25 |
26 |
27 |
28 |
29 |
30 | 委托价格:{{detail[0].price}}
31 |
32 |
33 | 委托数量:{{detail[0].amount}}
34 |
35 |
36 | 成交数量:{{detail[0].tradedAmount}}
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | 交易记录
46 |
47 |
48 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
174 |
175 |
--------------------------------------------------------------------------------
/src/views/finance/ChargeCoinDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 充币明细
6 |
10 |
11 |
12 |
13 |
14 |
23 |
24 |
25 | 币种:
26 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
164 |
165 |
--------------------------------------------------------------------------------
/src/views/finance/FeeManage.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 手续费管理
6 |
10 |
11 |
12 |
13 |
14 | 交易类型:
15 |
20 |
21 |
22 | 交易时间:
23 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
157 |
158 |
161 |
162 |
--------------------------------------------------------------------------------
/src/views/finance/TradeDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 交易明细
6 |
10 |
11 |
12 |
13 |
14 |
15 |
24 |
25 |
34 |
35 |
36 | 交易类型:
37 |
42 |
43 |
44 |
61 |
62 |
79 |
80 |
81 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
211 |
212 |
--------------------------------------------------------------------------------
/src/views/finance/WithdrawDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 提币明细
6 |
10 |
11 |
12 |
13 |
14 |
23 |
24 |
33 |
34 |
43 |
44 |
45 | 币种:
46 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
209 |
210 |
216 |
--------------------------------------------------------------------------------
/src/views/home/components/countUp.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ startVal }}{{ unit }}
4 |
5 |
6 |
7 |
8 |
117 |
--------------------------------------------------------------------------------
/src/views/home/components/dataSourcePie.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
59 |
--------------------------------------------------------------------------------
/src/views/home/components/inforCard.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
23 | {{ introText }}
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
60 |
61 |
--------------------------------------------------------------------------------
/src/views/home/components/map.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
89 |
90 |
91 |
--------------------------------------------------------------------------------
/src/views/home/components/mapDataTable.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
32 |
--------------------------------------------------------------------------------
/src/views/home/components/serviceRequests.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | {{ content }}
15 |
16 |
17 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/views/home/components/userFlow.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
82 |
--------------------------------------------------------------------------------
/src/views/home/components/visiteVolume.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
6 |
7 |
8 |
9 |
10 | 欢迎登录
11 |
12 |
49 |
73 |
74 |
75 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/src/views/main-components/breadcrumb-nav.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ itemTitle(item) }}
8 |
9 |
10 |
11 |
28 |
29 |
--------------------------------------------------------------------------------
/src/views/main-components/fullscreen.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
75 |
--------------------------------------------------------------------------------
/src/views/main-components/lockscreen/components/locking-page.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
45 |
--------------------------------------------------------------------------------
/src/views/main-components/lockscreen/components/unlock.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
9 |
![]()
10 |
14 |
15 |
16 |
24 |
已锁定
25 |
26 |
27 |
28 |
29 |
81 |
--------------------------------------------------------------------------------
/src/views/main-components/lockscreen/lockscreen.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
31 |
--------------------------------------------------------------------------------
/src/views/main-components/shrinkable-menu/components/sidebarMenu.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
28 |
29 |
30 |
76 |
--------------------------------------------------------------------------------
/src/views/main-components/shrinkable-menu/components/sidebarMenuShrink.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
9 |
10 |
11 |
12 | {{ itemTitle(child) }}
13 |
14 |
15 |
16 |
17 |
18 |
21 |
22 |
23 | {{ itemTitle(item.children[0]) }}
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
62 |
--------------------------------------------------------------------------------
/src/views/main-components/shrinkable-menu/shrinkable-menu.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
23 |
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 |
2 |
3 |
4 |
5 |
6 | 提币明细
7 |
11 |
12 |
13 |
14 |
22 |
23 |
24 |
25 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
108 |
109 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/src/views/member/Parnter.vue:
--------------------------------------------------------------------------------
1 |
2 |
22 |
23 |
--------------------------------------------------------------------------------
/src/views/member/RechargeList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 充币明细
7 |
11 |
12 |
13 |
14 |
22 |
23 |
24 |
25 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
96 |
97 |
100 |
101 |
102 |
--------------------------------------------------------------------------------
/src/views/otc/AdvertiseDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
10 | 基本信息
11 |
12 |
13 |
14 |
15 | 状态:{{ !baseInfo.status ? '上架' : '下架' }}
16 |
17 |
18 | 交易类型:{{ !baseInfo.advertiseType ? '买入' : '卖出' }}
19 |
20 |
21 | 交易币种:{{ !baseInfo.coin ? '' : baseInfo.coin.unit }}
22 |
23 |
24 | 交易货币:{{ !baseInfo.country ? '' : baseInfo.country.localCurrency }}
25 |
26 |
27 |
28 |
29 | 交易期限:{{ baseInfo.timeLimit }}分钟
30 |
31 |
32 | 买入量:{{ baseInfo.dealAmount }}
33 |
34 |
35 | 国家:{{ !baseInfo.country ? '' : baseInfo.country.zhName }}
36 |
37 |
38 | 付款方式:{{ baseInfo.payMode }}
39 |
40 |
41 |
42 |
43 | 最小交易额:{{ baseInfo.minLimit }}
44 |
45 |
46 | 最大交易额:{{ baseInfo.maxLimit }}
47 |
48 |
49 | 固定价格:{{ baseInfo.price }}
50 |
51 |
52 |
53 |
54 | 备注信息:{{ baseInfo.remark }}
55 |
56 |
57 | 自动回复:{{ !baseInfo.auto ? '是' : '否'}}
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | 订单明细
67 |
70 |
71 |
72 |
78 |
79 |
80 |
81 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
190 |
191 |
207 |
208 |
209 |
--------------------------------------------------------------------------------
/src/views/otc/AppealDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 订单详情 {{ cbData.orderSn }}
6 |
7 |
8 |
9 |
10 | 状态:{{ !cbData.isSuccess ? '败诉' : '胜诉' }}
11 |
12 |
13 | 交易币种:{{ cbData.coinName }}
14 |
15 |
16 | 交易类型:{{ !cbData.advertiseType ? '买入' : '卖出' }}
17 |
18 |
19 | 支付方式:{{ cbData.payMode }}
20 |
21 |
22 |
23 |
24 | 申诉人:{{ cbData.initiatorName }}
25 |
26 |
27 | 广告主:{{ `(${cbData.advertiseCreaterName})${cbData.advertiseCreaterUserName}` }}
28 |
29 |
30 | 承接人:{{ `(${cbData.customerUserName})${cbData.customerName}`}}
31 |
32 |
33 |
34 |
35 | 订单数量 :{{ cbData.number }}
36 |
37 |
38 | 订单金额:{{ cbData.money }}
39 |
40 |
41 |
42 | 备注:{{ cbData.remark }}
43 |
44 |
45 |
46 |
47 |
48 |
49 |
76 |
77 |
--------------------------------------------------------------------------------
/src/views/otc/BusinessDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 商家信息
5 |
9 |
10 |
11 |
12 |
13 | 审核状态:{{ userInfo.status | filterStatus }}
14 |
15 |
16 | 真实姓名:{{ userInfo.realName }}
17 |
18 |
19 | 保证金:{{ userInfo.amount + userInfo.info.coinSymbol }}
20 |
21 |
22 |
23 |
24 | 手机号:{{ userInfo.info.telno }}
25 |
26 |
27 | 微信号:{{ userInfo.info.wechat }}
28 |
29 |
30 | QQ号:{{ userInfo.info.qq }}
31 |
32 |
33 |
34 | 未通过原因:{{ !userInfo.detail ? '无' : userInfo.detail }}
35 |
36 |
37 |
38 |
39 | ![个人数字资产证明]()
40 | 个人数字资产证明
41 |
42 |
43 | ![数字资产交易证明]()
44 | 数字资产交易证明
45 |
46 |
47 |
48 |
49 |
50 |
51 |
90 |
91 |
--------------------------------------------------------------------------------
/src/views/otc/ExitBondDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
12 | 退保申请
13 |
14 | 退保金额:{{ !exitBondDetail.depositRecord ? '' : exitBondDetail.depositRecord.amount+exitBondDetail.depositRecord.coin.unit }}
15 | 状态:{{ (!exitBondDetail.businessCancelApply ? '' :exitBondDetail.businessCancelApply.status) | filterStatus }}
16 | 申请时间:{{ !exitBondDetail.businessCancelApply ? '' :exitBondDetail.businessCancelApply.cancelApplyTime }}
17 | 审核时间:{{ !exitBondDetail.businessCancelApply ? '' :exitBondDetail.businessCancelApply.handleTime }}
18 |
19 |
20 | 退保原因:{{ !exitBondDetail.businessCancelApply ? '' : exitBondDetail.businessCancelApply.reason | reasonFilter}}
21 |
22 |
23 |
24 |
25 | 用户信息
26 |
27 | 真实姓名:{{ !exitBondDetail.businessCancelApply ? '' : exitBondDetail.businessCancelApply.member.realName}}
28 | 会员昵称:{{ !exitBondDetail.businessCancelApply ? '' : exitBondDetail.businessCancelApply.member.username }}
29 | 手机号:{{ !exitBondDetail.businessCancelApply ? '' : exitBondDetail.businessCancelApply.member.mobilePhone }}
30 | 邮箱号:{{ !exitBondDetail.businessCancelApply ? '' : exitBondDetail.businessCancelApply.member.email }}
31 |
32 |
33 |
34 |
35 | 交易信息
36 |
37 | 申诉次数:{{ exitBondDetail.complainantNum }}
38 | 被申诉次数数:{{ exitBondDetail.defendantNum }}
39 | 总成交额:{{ !exitBondDetail.money ? 0 : exitBondDetail.money }}
40 | 总手续费:{{ !exitBondDetail.fee ? 0 : exitBondDetail.fee }}
41 |
42 |
43 | 发布广告数:{{ exitBondDetail.advertiseNum }}
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
90 |
91 |
111 |
112 |
--------------------------------------------------------------------------------
/src/views/system/AccessLog.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 系统日志
6 |
10 |
11 |
12 |
13 |
14 |
15 |
22 |
23 |
24 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
43 |
44 |
45 |
52 |
53 |
54 |
55 |
56 |
154 |
155 |
--------------------------------------------------------------------------------
/src/views/system/CoinTransferDetail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 转入明细
6 |
10 |
11 |
12 |
13 |
19 |
20 |
21 |
28 |
29 |
30 |
31 |
32 |
134 |
135 |
--------------------------------------------------------------------------------
/src/views/system/Dictionary.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 系统信息维护
7 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
24 |
25 |
26 |
33 |
34 |
43 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
214 |
215 |
218 |
--------------------------------------------------------------------------------
/src/views/system/Employee.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 用户管理
6 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
27 |
28 |
29 |
30 |
35 |
36 |
37 |
42 | 是否删除所选的{{ delArr.length }}项?
43 |
44 |
45 |
46 |
47 |
48 |
210 |
211 |
--------------------------------------------------------------------------------
/src/views/user/PersonalCenter.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 个人中心
6 |
7 |
8 |
9 |
10 |
16 |
17 |
18 |
24 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
134 |
135 |
138 |
139 |
140 |
--------------------------------------------------------------------------------