1
15
.gitattributes
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
.DS_Store
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
|
||||
# LocalHistory in vscode
|
||||
|
||||
package-lock.json
|
||||
7
.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
node_modules/
|
||||
upload/
|
||||
logs/
|
||||
node_modules.*
|
||||
build/
|
||||
www/
|
||||
config/template/temp/
|
||||
17
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
// 使用 IntelliSense 了解相关属性。
|
||||
// 悬停以查看现有属性的描述。
|
||||
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "启动程序",
|
||||
"skipFiles": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"program": "${workspaceFolder}\\app.js"
|
||||
}
|
||||
]
|
||||
}
|
||||
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 light
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
32
README.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# 项目前后端整合在一起,
|
||||
|
||||
## 前端使用 vue2.0+ivew+vue-router
|
||||
|
||||
### 如何运行
|
||||
|
||||
#### 第一步
|
||||
|
||||
npm run api
|
||||
|
||||
npm run serve
|
||||
|
||||
#### 第二步
|
||||
|
||||
退回到根目录
|
||||
cd ../ npm run serve 即可启动前端
|
||||
|
||||
## 后端使用 koa2+ sequelize+mysql
|
||||
|
||||
### 如何运行
|
||||
|
||||
根目录 运行
|
||||
|
||||
npm install
|
||||
|
||||
vscode 直接点调试按钮即可
|
||||
|
||||
## 生产环境
|
||||
|
||||
vue_admin /service/webapps/production/dm/plug_vue_admin_web
|
||||
|
||||
nodejs /data/service/nodejs/easy-analysis-plug-api
|
||||
10
admin/.babelrc
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
'presets': [
|
||||
[
|
||||
'@vue/app',
|
||||
{
|
||||
useBuiltIns: 'entry'
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
9
admin/.editorconfig
Normal file
@@ -0,0 +1,9 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
2
admin/.env.prod
Normal file
@@ -0,0 +1,2 @@
|
||||
NODE_ENV=production
|
||||
VUE_APP_ENV=production
|
||||
2
admin/.env.sit
Normal file
@@ -0,0 +1,2 @@
|
||||
NODE_ENV=production
|
||||
VUE_APP_ENV=sit
|
||||
0
admin/.eslintignore
Normal file
21
admin/.eslintrc.js
Normal file
@@ -0,0 +1,21 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
parserOptions: {
|
||||
sourceType: 'module'
|
||||
},
|
||||
extends: ['plugin:vue/essential', '@vue/standard'],
|
||||
rules: {
|
||||
'generator-star-spacing': 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
|
||||
'space-before-function-paren': 0,
|
||||
'no-undef': 'off',
|
||||
camelcase: 'off',
|
||||
semi: ['off', 'always'],
|
||||
indent: ['off', 2],
|
||||
"prettier/prettier": "off"
|
||||
},
|
||||
parserOptions: { parser: 'babel-eslint' },
|
||||
parser: 'vue-eslint-parser',
|
||||
plugins: ['prettier'],
|
||||
extends: ['plugin:prettier/recommended']
|
||||
}
|
||||
27
admin/.gitignore
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
/dist
|
||||
/config
|
||||
|
||||
/tests/e2e/videos/
|
||||
/tests/e2e/screenshots/
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Log files
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw*
|
||||
|
||||
build/env.js
|
||||
5
admin/.postcssrc.js
Normal file
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
autoprefixer: {}
|
||||
}
|
||||
}
|
||||
5
admin/.travis.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
language: node_js
|
||||
node_js: stable
|
||||
script: npm run lint
|
||||
notifications:
|
||||
email: false
|
||||
35
admin/README.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# 智能代码系统
|
||||
|
||||
`
|
||||
|
||||
## 安装依赖
|
||||
|
||||
```bush
|
||||
npm install
|
||||
```
|
||||
|
||||
## Run
|
||||
|
||||
### 运行
|
||||
|
||||
```bush
|
||||
npm run serve
|
||||
```
|
||||
|
||||
### 编译
|
||||
|
||||
```bush
|
||||
npm run build
|
||||
```
|
||||
|
||||
## 简介
|
||||
|
||||
## 功能
|
||||
|
||||
- 登录/登出
|
||||
- 权限管理
|
||||
- 列表过滤
|
||||
- 权限切换
|
||||
- 多语言切换
|
||||
|
||||
Copyright (c) 2016-present
|
||||
3
admin/cypress.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"pluginsFile": "tests/e2e/plugins/index.js"
|
||||
}
|
||||
94
admin/package.json
Normal file
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"name": "light",
|
||||
"version": "2.0.0",
|
||||
"author": "light<light@163.com>",
|
||||
"private": false,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve --open",
|
||||
"build": "vue-cli-service build",
|
||||
"build:sit": "vue-cli-service build --mode sit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.2.2",
|
||||
"@babel/polyfill": "^7.2.5",
|
||||
"@babel/preset-env": "^7.2.3",
|
||||
"@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
|
||||
"@vue/babel-preset-jsx": "^1.1.2",
|
||||
"ali-oss": "^6.18.0",
|
||||
"axios": "^0.18.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"brace": "^0.11.1",
|
||||
"child_process": "^1.0.2",
|
||||
"clipboard": "^2.0.0",
|
||||
"codemirror": "^5.38.0",
|
||||
"copy-webpack-plugin": "^9.0.0",
|
||||
"core-js": "^2.6.12",
|
||||
"countup": "^1.8.2",
|
||||
"cropperjs": "^1.2.2",
|
||||
"dayjs": "^1.7.7",
|
||||
"echarts": "^4.1.0",
|
||||
"eslint": "^7.15.0",
|
||||
"eslint-config-prettier": "^7.0.0",
|
||||
"eslint-plugin-prettier": "^3.3.0",
|
||||
"html2canvas": "^1.0.0-alpha.12",
|
||||
"iview": "^3.1.3",
|
||||
"iview-area": "^1.5.17",
|
||||
"js-cookie": "^2.2.0",
|
||||
"regenerator-runtime": "^0.14.1",
|
||||
"simplemde": "^1.11.2",
|
||||
"sortablejs": "^1.7.0",
|
||||
"three": "^0.130.1",
|
||||
"tree-table-vue": "^1.1.0",
|
||||
"v-org-tree": "^1.0.6",
|
||||
"view-design": "^4.7.0",
|
||||
"vue": "^2.5.10",
|
||||
"vue-router": "^3.0.1",
|
||||
"vuedraggable": "^2.16.0",
|
||||
"vuex": "^3.0.1",
|
||||
"vuex-persistedstate": "^2.7.0",
|
||||
"wangeditor": "^4.7.5",
|
||||
"xlsx": "^0.13.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vue/cli-plugin-babel": "^3.0.1",
|
||||
"@vue/cli-plugin-eslint": "^3.0.1",
|
||||
"@vue/cli-plugin-unit-mocha": "^3.0.1",
|
||||
"@vue/cli-service": "^3.0.1",
|
||||
"@vue/eslint-config-standard": "^3.0.0-beta.10",
|
||||
"@vue/test-utils": "^1.0.0-beta.10",
|
||||
"autoprefixer": "^9.8.6",
|
||||
"cache-loader": "^4.1.0",
|
||||
"chai": "^4.1.2",
|
||||
"copy-webpack-plugin": "^5.1.2",
|
||||
"css-loader": "^3.6.0",
|
||||
"eslint-plugin-cypress": "^2.0.1",
|
||||
"file-loader": "^6.2.0",
|
||||
"less-loader": "^6.2.0",
|
||||
"lint-staged": "^6.0.0",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"thread-loader": "^2.1.3",
|
||||
"url-loader": "^4.1.1",
|
||||
"vue-loader": "^15.4.2",
|
||||
"vue-style-loader": "^4.1.3",
|
||||
"vue-template-compiler": "^2.5.13"
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not ie <= 8"
|
||||
],
|
||||
"gitHooks": {
|
||||
"pre-commit": "lint-staged"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.js": [
|
||||
"vue-cli-service lint",
|
||||
"git add"
|
||||
],
|
||||
"*.vue": [
|
||||
"vue-cli-service lint",
|
||||
"git add"
|
||||
]
|
||||
}
|
||||
}
|
||||
BIN
admin/public/icon.ico
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
28
admin/public/index.html
Normal file
@@ -0,0 +1,28 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<meta name="renderer" content="webkit|ie-comp|ie-stand" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||
|
||||
<link rel="icon" href="./icon.ico" type="image/x-icon" />
|
||||
<link rel="shortcut icon" href="./icon.ico" type="image/x-icon" />
|
||||
<script src="./static/jquery.3.2.1.min.js"></script>
|
||||
<title>智能代码平台</title>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>
|
||||
<strong
|
||||
>We're sorry but iview-admin doesn't work properly without JavaScript
|
||||
enabled. Please enable it to continue.</strong
|
||||
>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
4
admin/public/static/jquery.3.2.1.min.js
vendored
Normal file
35
admin/src/App.vue
Normal file
@@ -0,0 +1,35 @@
|
||||
<template>
|
||||
<div id="app">
|
||||
<router-view />
|
||||
|
||||
<Spin id="spin-box-one" class="spin-box" size="large" fix>
|
||||
<Icon type="ios-loading" size=18 class="spin-icon-load"></Icon>
|
||||
<div>加载中...</div>
|
||||
</Spin>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'App',
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
|
||||
#app {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.spin-box {
|
||||
display: none;
|
||||
z-index: 999 !important;
|
||||
background-color: rgba(255, 255, 255, 0.3) !important;
|
||||
|
||||
.spin-icon-load {
|
||||
font-size: 32px !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
21
admin/src/api/ad/sysAdServer.js
Normal file
@@ -0,0 +1,21 @@
|
||||
import http from "@/libs/http";
|
||||
|
||||
class SysAdServer {
|
||||
async getAll(param) {
|
||||
return await http.get("/sys_ad/index", param);
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
return await http.post("/sys_ad/add", row);
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
return await http.post("/sys_ad/edit", row);
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
return await http.post("/sys_ad/del", row);
|
||||
}
|
||||
}
|
||||
const sysAdServer = new SysAdServer();
|
||||
export default sysAdServer;
|
||||
30
admin/src/api/auto/formFieldServer.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import http from "@/libs/http";
|
||||
class FormFieldServer {
|
||||
async all(param) {
|
||||
let res = await http.get("/sys_form_field/all", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async page(row) {
|
||||
let res = await http.post("/sys_form_field/page", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_form_field/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_form_field/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_form_field/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const formFieldServer = new FormFieldServer();
|
||||
export default formFieldServer;
|
||||
35
admin/src/api/auto/formServer.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import http from "@/libs/http";
|
||||
class FormServer {
|
||||
async all(param) {
|
||||
let res = await http.get("/sys_form/all", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async page(row) {
|
||||
let res = await http.post("/sys_form/page", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async generate(row) {
|
||||
let res = await http.post("/sys_form/generate", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_form/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_form/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_form/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const formServer = new FormServer();
|
||||
export default formServer;
|
||||
30
admin/src/api/auto/menuServer.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import http from "@/libs/http";
|
||||
|
||||
class MenuServer {
|
||||
async list(row) {
|
||||
let res = await http.get("/sys_menu/index", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async generate(row) {
|
||||
let res = await http.post("/sys_menu/generate", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_menu/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_menu/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_menu/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
const menuServer = new MenuServer();
|
||||
export default menuServer;
|
||||
32
admin/src/api/auto/modelFieldServer.js
Normal file
@@ -0,0 +1,32 @@
|
||||
import http from "@/libs/http";
|
||||
class ModelFieldServer {
|
||||
async all(row) {
|
||||
let res = await http.get("/sys_model_field/all", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async allByKey(row) {
|
||||
let res = await http.get("/sys_model_field/allByKey", row, {
|
||||
hideLoad: true
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_model_field/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_model_field/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_model_field/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const modelFieldServer = new ModelFieldServer();
|
||||
export default modelFieldServer;
|
||||
48
admin/src/api/auto/modelServer.js
Normal file
@@ -0,0 +1,48 @@
|
||||
import http from "@/libs/http";
|
||||
class ModelServer {
|
||||
async interface(row) {
|
||||
let res = await http.post("/sys_model/interface", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async all() {
|
||||
let res = await http.get("/sys_model/all", {});
|
||||
return res;
|
||||
}
|
||||
|
||||
async detail(row) {
|
||||
let res = await http.get("/sys_model/detail", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async autoModelBydb(row) {
|
||||
let res = await http.post("/sys_model/autoModelBydb", row);
|
||||
return res;
|
||||
|
||||
|
||||
}
|
||||
|
||||
async regenerate(row) {
|
||||
let res = await http.post("/sys_model/regenerate", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_model/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_model/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_model/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const modelServer = new ModelServer();
|
||||
export default modelServer;
|
||||
29
admin/src/api/auto/paramSetupServer.js
Normal file
@@ -0,0 +1,29 @@
|
||||
import http from "@/libs/http";
|
||||
class ParamSetupServer {
|
||||
async getAll() {
|
||||
return await http.get("/sys_parameter/index", {});
|
||||
}
|
||||
|
||||
async getOne(key) {
|
||||
return await http.get("/sys_parameter/key", { key });
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
return await http.post("/sys_parameter/add", row);
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
return await http.post("/sys_parameter/edit", row);
|
||||
}
|
||||
|
||||
async setSysConfig(row) {
|
||||
return await http.post("/sys_parameter/setSysConfig", row);
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
return await http.post("/sys_parameter/del", row);
|
||||
}
|
||||
}
|
||||
|
||||
const paramSetupServer = new ParamSetupServer();
|
||||
export default paramSetupServer;
|
||||
35
admin/src/api/auto/projectServer.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import http from "@/libs/http";
|
||||
class listClServer {
|
||||
async all(param) {
|
||||
let res = await http.get("/sys_project/all", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async page(row) {
|
||||
let res = await http.post("/sys_project/page", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async exportCsv(row) {
|
||||
let res = http.fileExport("/sys_project/export", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_project/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_project/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_project/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const listServer = new listClServer();
|
||||
export default listServer;
|
||||
29
admin/src/api/auto/sysControlTypeServer.js
Normal file
@@ -0,0 +1,29 @@
|
||||
import http from "@/libs/http";
|
||||
class SysControlTypeServer {
|
||||
async all(param) {
|
||||
let res = await http.get("/sys_control_type/all", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async page(row) {
|
||||
let res = await http.post("/sys_control_type/page", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(param) {
|
||||
let res = await http.post("/sys_control_type/add", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(param) {
|
||||
let res = await http.post("/sys_control_type/edit", param);
|
||||
return res;
|
||||
}
|
||||
async del(param) {
|
||||
let res = await http.post("/sys_control_type/del", param);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const sysControlTypeServer = new SysControlTypeServer();
|
||||
export default sysControlTypeServer;
|
||||
35
admin/src/api/cote/info_server.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import http from "@/libs/http";
|
||||
class infoClServer {
|
||||
async all(param) {
|
||||
let res = await http.get("/inf_info/all", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async page(row) {
|
||||
let res = await http.post("/inf_info/page", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async exportCsv(row) {
|
||||
let res = http.fileExport("/inf_info/export", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/inf_info/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/inf_info/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/inf_info/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const infoServer = new infoClServer();
|
||||
export default infoServer;
|
||||
38
admin/src/api/cote/info_type_server.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import http from '@/libs/http';
|
||||
class info_typeClServer {
|
||||
async all(param) {
|
||||
let res= await http.get('/inf_info_type/all', param);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async page(row) {
|
||||
let res= await http.post('/inf_info_type/page', row);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async exportCsv(row) {
|
||||
let res = http.fileExport("/inf_info_type/export", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res= await http.post('/inf_info_type/add', row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res= await http.post('/inf_info_type/edit', row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res= await http.post('/inf_info_type/del', row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const info_typeServer = new info_typeClServer();
|
||||
export default info_typeServer;
|
||||
|
||||
26
admin/src/api/home/homeServer.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import http from "@/libs/http";
|
||||
class HomeServer {
|
||||
// 获取订单统计
|
||||
async getOderCount() {
|
||||
let res = await http.get("/order/count");
|
||||
return res;
|
||||
}
|
||||
|
||||
async getUserCount() {
|
||||
let res = await http.get("/user/count");
|
||||
return res;
|
||||
}
|
||||
|
||||
async getSalesRank() {
|
||||
let res = await http.get("/index/salesRank");
|
||||
return res;
|
||||
}
|
||||
|
||||
async userRecommendRank() {
|
||||
let res = await http.get("/index/userRecommendRank");
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const homeServer = new HomeServer();
|
||||
export default homeServer;
|
||||
40
admin/src/api/project/detail_server.js
Normal file
@@ -0,0 +1,40 @@
|
||||
import http from "@/libs/http";
|
||||
class DetailServer {
|
||||
async editDbConfig(row) {
|
||||
let res = await http.post("/sys_project/editDbConfig", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async editWxConfig(row) {
|
||||
let res = await http.post("/sys_project/editWxConfig", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async editRedisConfig(row) {
|
||||
let res = await http.post("/sys_project/editRedisConfig", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async editAliyunConfig(row) {
|
||||
let res = await http.post("/sys_project/editAliyunConfig", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
async autoInitDb(row) {
|
||||
let res = await http.post("/sys_project/autoInitDb", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async detailConfig(row) {
|
||||
let res = await http.post("/sys_project/detailConfig", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const detailServer = new DetailServer();
|
||||
export default detailServer;
|
||||
35
admin/src/api/project/list_server.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import http from "@/libs/http";
|
||||
class listClServer {
|
||||
async all(param) {
|
||||
let res = await http.get("/sys_project/all", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async page(row) {
|
||||
let res = await http.post("/sys_project/page", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async exportCsv(row) {
|
||||
let res = http.fileExport("/sys_project/export", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_project/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_project/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_project/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const listServer = new listClServer();
|
||||
export default listServer;
|
||||
20
admin/src/api/system/announcementServer.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import http from '@/libs/http'
|
||||
class AnnouncementServer {
|
||||
async dtl() {
|
||||
let res = await http.get('/sys_announcement/dtl')
|
||||
return res
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post('/sys_announcement/add', row)
|
||||
return res
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post('/sys_announcement/edit', row)
|
||||
return res
|
||||
}
|
||||
}
|
||||
|
||||
const announcementServer = new AnnouncementServer()
|
||||
export default announcementServer
|
||||
21
admin/src/api/system/fileServe.js
Normal file
@@ -0,0 +1,21 @@
|
||||
import http from "@/libs/http";
|
||||
class FileServe {
|
||||
async upload_oos_img(row) {
|
||||
let res = await http.postFormData("/sys_file/upload_oos_img", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async upload_Img(row) {
|
||||
let res = await http.postFormData("/file/upload_Img", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
// 下载基础项目
|
||||
async getBaseProject(row){
|
||||
let res = await http.post("/sys_file/get_base_project", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const fileServe = new FileServe();
|
||||
export default fileServe;
|
||||
30
admin/src/api/system/rolePermissionServer.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import http from '@/libs/http'
|
||||
class RolePermissionServer {
|
||||
async getRoles(callback) {
|
||||
let res = await http.get('/SysRolePermission/Query', {})
|
||||
return res
|
||||
}
|
||||
|
||||
async getRole(row) {
|
||||
let res = await http.get('/SysRolePermission/QueryByRoleId', row)
|
||||
return res
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post('/SysRolePermission/add', row)
|
||||
return res
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post('/SysRolePermission/edit', row)
|
||||
return res
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post('/SysRolePermission/del', row)
|
||||
return res
|
||||
}
|
||||
}
|
||||
|
||||
const rolePermissionServer = new RolePermissionServer()
|
||||
export default rolePermissionServer
|
||||
26
admin/src/api/system/roleServer.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import http from "@/libs/http";
|
||||
class RoleServer {
|
||||
async list() {
|
||||
let res = await http.get("/sys_role/index", {});
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_role/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_role/edit", row);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_role/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const roleServer = new RoleServer();
|
||||
export default roleServer;
|
||||
15
admin/src/api/system/shpProfitServer.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import http from '@/libs/http'
|
||||
class ShpProfitServer {
|
||||
async report(param) {
|
||||
let res = await http.post('/shpProfit/report', param)
|
||||
return res
|
||||
}
|
||||
|
||||
async list(param) {
|
||||
let res = await http.post('/shpProfit/list', param)
|
||||
return res
|
||||
}
|
||||
}
|
||||
|
||||
const shpProfitServer = new ShpProfitServer()
|
||||
export default shpProfitServer
|
||||
25
admin/src/api/system/specificationServer.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import http from '@/libs/http'
|
||||
class SpecificationServer {
|
||||
async list() {
|
||||
let res = await http.post('/specification/list', {})
|
||||
return res
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post('/specification/add', row)
|
||||
return res
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post('/specification/edit', row)
|
||||
return res
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post('/specification/del', row)
|
||||
return res
|
||||
}
|
||||
}
|
||||
|
||||
const specificationServer = new SpecificationServer()
|
||||
export default specificationServer
|
||||
10
admin/src/api/system/sysAddressServer.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import http from "@/libs/http";
|
||||
class SysAddress {
|
||||
async index(param) {
|
||||
let res = await http.get("/sys_address/index", param);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const sysAddress = new SysAddress();
|
||||
export default sysAddress;
|
||||
30
admin/src/api/system/sysModuleServer.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import http from "@/libs/http";
|
||||
class SysModuleServer {
|
||||
async all() {
|
||||
let res = await http.get("/sys_menu/all", {});
|
||||
return res;
|
||||
}
|
||||
|
||||
async list(row) {
|
||||
let res = await http.get("/sys_menu/all", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_menu/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_menu/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_menu/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const sysModuleServer = new SysModuleServer();
|
||||
export default sysModuleServer;
|
||||
25
admin/src/api/system/sys_log_serve.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import http from "@/libs/http";
|
||||
class SysLogServe {
|
||||
async all(param) {
|
||||
let res = await http.get("/sys_log/all", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async detail(param) {
|
||||
let res = await http.get("/sys_log/detail", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async delete(param) {
|
||||
let res = await http.get("/sys_log/delete", param);
|
||||
return res;
|
||||
}
|
||||
|
||||
async operates(param) {
|
||||
let res = await http.get("/sys_log/operates", param);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const sys_log_serve = new SysLogServe();
|
||||
export default sys_log_serve;
|
||||
38
admin/src/api/system/systemType_server.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import http from '@/libs/http';
|
||||
class systemTypeClServer {
|
||||
async all(param) {
|
||||
let res= await http.get('/sys_project_type/all', param);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async page(row) {
|
||||
let res= await http.post('/sys_project_type/page', row);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async exportCsv(row) {
|
||||
let res = http.fileExport("/sys_project_type/export", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res= await http.post('/sys_project_type/add', row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res= await http.post('/sys_project_type/edit', row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res= await http.post('/sys_project_type/del', row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const systemTypeServer = new systemTypeClServer();
|
||||
export default systemTypeServer;
|
||||
|
||||
40
admin/src/api/system/userServer.js
Normal file
@@ -0,0 +1,40 @@
|
||||
import http from "@/libs/http";
|
||||
class UserServer {
|
||||
async login(row) {
|
||||
let res = await http.post("/sys_user/login", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async all() {
|
||||
let res = await http.get("/sys_user/index", {});
|
||||
return res;
|
||||
}
|
||||
|
||||
async exportCsv(row) {
|
||||
let res = http.fileExport("/sys_user/export", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async authorityMenus() {
|
||||
let res = await http.post("/sys_user/authorityMenus", {});
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res = await http.post("/sys_user/add", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res = await http.post("/sys_user/edit", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res = await http.post("/sys_user/del", row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const userServer = new UserServer();
|
||||
export default userServer;
|
||||
38
admin/src/api/vip/vip_member_server.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import http from '@/libs/http';
|
||||
class vip_memberClServer {
|
||||
async all(param) {
|
||||
let res= await http.get('/vip_member/all', param);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async page(row) {
|
||||
let res= await http.post('/vip_member/page', row);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
async exportCsv(row) {
|
||||
let res = http.fileExport("/vip_member/export", row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async add(row) {
|
||||
let res= await http.post('/vip_member/add', row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async edit(row) {
|
||||
let res= await http.post('/vip_member/edit', row);
|
||||
return res;
|
||||
}
|
||||
|
||||
async del(row) {
|
||||
let res= await http.post('/vip_member/del', row);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const vip_memberServer = new vip_memberClServer();
|
||||
export default vip_memberServer;
|
||||
|
||||
3688
admin/src/assets/css/animate.css
vendored
Normal file
149
admin/src/assets/css/base.less
Normal file
@@ -0,0 +1,149 @@
|
||||
body,
|
||||
div,
|
||||
dl,
|
||||
dt,
|
||||
dd,
|
||||
ul,
|
||||
ol,
|
||||
li,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
pre,
|
||||
code,
|
||||
form,
|
||||
fieldset,
|
||||
legend,
|
||||
input,
|
||||
button,
|
||||
textarea,
|
||||
p,
|
||||
blockquote,
|
||||
th,
|
||||
td {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
background: #fff;
|
||||
color: #495060;
|
||||
font-size: 14px;
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
td,
|
||||
th,
|
||||
caption {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-weight: normal;
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #495060;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
li {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
input,
|
||||
textarea,
|
||||
select,
|
||||
button {
|
||||
font: 14px Verdana, Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
html {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/*滚动条整体样式*/
|
||||
*::-webkit-scrollbar {
|
||||
width: 10px;
|
||||
/*高宽分别对应横竖滚动条的尺寸*/
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
*::-webkit-scrollbar-thumb {
|
||||
/*滚动条里面小方块*/
|
||||
border-radius: 5px;
|
||||
-webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.1);
|
||||
background: #9ca6bb;
|
||||
}
|
||||
|
||||
*::-webkit-scrollbar-track {
|
||||
/*滚动条里面轨道*/
|
||||
-webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 5px;
|
||||
background: #dcdee2;
|
||||
}
|
||||
|
||||
.ml(@i) when(@i <= 300) {
|
||||
.ml@{i} {
|
||||
margin-left: @i + 0px;
|
||||
}
|
||||
.ml((@i + 5));
|
||||
}
|
||||
|
||||
.ml(5);
|
||||
|
||||
.mt(@i) when(@i <= 100) {
|
||||
.mt@{i} {
|
||||
margin-top: @i + 0px;
|
||||
}
|
||||
.mt((@i + 5));
|
||||
}
|
||||
|
||||
.mt(5);
|
||||
|
||||
.pa(@i) when(@i <= 100) {
|
||||
.pa@{i} {
|
||||
padding: @i + 0px;
|
||||
}
|
||||
.pa((@i + 5));
|
||||
}
|
||||
|
||||
.pa(5);
|
||||
|
||||
.w(@i) when(@i <= 100) {
|
||||
.w@{i} {
|
||||
width: @i + 0%;
|
||||
}
|
||||
.w((@i + 5));
|
||||
}
|
||||
|
||||
.w(5);
|
||||
|
||||
.h(@i) when(@i <= 100) {
|
||||
.h@{i} {
|
||||
height: @i + 0%;
|
||||
}
|
||||
.h((@i + 5));
|
||||
}
|
||||
|
||||
.h(5);
|
||||
269
admin/src/assets/css/ivewExpand.less
Normal file
@@ -0,0 +1,269 @@
|
||||
.ace_print-margin-layer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ivu-select-dropdown {
|
||||
z-index: 999999;
|
||||
}
|
||||
|
||||
.ivu-select-dropdown-list {
|
||||
height: 200px !important;
|
||||
}
|
||||
|
||||
.float-right {
|
||||
float: right;
|
||||
margin-right: 10px;
|
||||
}
|
||||
.ivu-tooltip-inner {
|
||||
background: #fff;
|
||||
color: #495060;
|
||||
}
|
||||
|
||||
.flex {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.flex-left {
|
||||
justify-content: flex-start;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.flex-right {
|
||||
justify-content: flex-end;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.ivu-layout-header {
|
||||
background-color: #f5f7f9;
|
||||
|
||||
padding: 0px 0.05rem;
|
||||
}
|
||||
|
||||
.mt10 {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.mt20 {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.mt30 {
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.ml5 {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.ml10 {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.ml20 {
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.ml30 {
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
.ml100 {
|
||||
margin-left: 100px;
|
||||
}
|
||||
|
||||
.pa-5 {
|
||||
padding: 0.05rem;
|
||||
}
|
||||
|
||||
.pa-10 {
|
||||
padding: 0.1rem;
|
||||
}
|
||||
|
||||
.pa-20 {
|
||||
padding: 0.2rem;
|
||||
}
|
||||
|
||||
.pa-30 {
|
||||
padding: 0.3rem;
|
||||
}
|
||||
|
||||
.red {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.buld {
|
||||
color: green;
|
||||
}
|
||||
|
||||
.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.float-right {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.chart-element {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.table-warp {
|
||||
.ivu-card-body {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
.w-e-text-container {
|
||||
min-height: 800px !important;
|
||||
}
|
||||
|
||||
.ivu-card-body {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.ivu-btn {
|
||||
margin: 0px 5px;
|
||||
}
|
||||
|
||||
.head-tool-box {
|
||||
padding: 5px;
|
||||
background-color: #dcdee2;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.h50 {
|
||||
height: 0.5rem;
|
||||
line-height: 0.5rem;
|
||||
}
|
||||
|
||||
.mr10 {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.content-view {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
align-items: flex-start;
|
||||
background-color: #fff;
|
||||
padding: 5px;
|
||||
|
||||
.table-head-tool {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
line-height: 35px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
|
||||
.ivu-form-item {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.table-body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.ivu-table-cell {
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.arrowBox {
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
width: 13px;
|
||||
height: 50px;
|
||||
margin-top: -25px;
|
||||
top: 49%;
|
||||
right: 1px;
|
||||
background-color: #043250;
|
||||
border-radius: 4px 0 0 4px;
|
||||
overflow: hidden;
|
||||
|
||||
.ivu-icon {
|
||||
position: relative;
|
||||
font-size: 36px;
|
||||
color: #515a6e;
|
||||
top: 8px;
|
||||
left: -12px;
|
||||
}
|
||||
}
|
||||
|
||||
.ivu-badge-count {
|
||||
top: 3px;
|
||||
}
|
||||
|
||||
.datetime-box {
|
||||
.ivu-date-picker-cells-cell:not(.ivu-date-picker-cells-cell-disabled) {
|
||||
background-color: rgba(10, 255, 0, 0.3);
|
||||
color: #000000;
|
||||
}
|
||||
}
|
||||
|
||||
.sub-title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.tip-info {
|
||||
color: #ff9900;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.tc {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.seach-input {
|
||||
width: 300px;
|
||||
float: right;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.item-right {
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
}
|
||||
|
||||
.sort-num {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
i {
|
||||
margin: 5px;
|
||||
font-size: 20px;
|
||||
cursor: pointer;
|
||||
&.ivu-icon-md-arrow-up {
|
||||
color: green;
|
||||
}
|
||||
|
||||
&.ivu-icon-md-arrow-down {
|
||||
color: indianred;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
html,
|
||||
body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
37
admin/src/assets/icons/iconfont.css
Normal file
@@ -0,0 +1,37 @@
|
||||
|
||||
@font-face {font-family: "iconfont";
|
||||
src: url('iconfont.eot?t=1541579316141'); /* IE9*/
|
||||
src: url('iconfont.eot?t=1541579316141#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAiEAAsAAAAADmgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8eUnXY21hcAAAAYAAAACjAAACLi+YJuBnbHlmAAACJAAABAgAAAcg4dRWHmhlYWQAAAYsAAAAMQAAADYTL8piaGhlYQAABmAAAAAgAAAAJAfdA4xobXR4AAAGgAAAABQAAAAsLAD//2xvY2EAAAaUAAAAGAAAABgImgpGbWF4cAAABqwAAAAfAAAAIAEcAG5uYW1lAAAGzAAAAUUAAAJtPlT+fXBvc3QAAAgUAAAAbgAAAI54roygeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWCcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeMTx/ytzwv4EhhrmBoRkozAiSAwDuUwzMeJzlkUEKwkAMRd/YabXFhQvxFF6qPYPrUujGY7jyIr1JoZNjtMnEhag3MOEN5MMk8D9QAoVyVSKEJwGrh6oh6wVN1iM3nc+cVImJVKdOehlklElmWdYVstp+ql8VdIv15a1NLW0zFXsO7Kjz3erH/3+rY37vr6kxnx1LKNWOJZlaxxJNnWOpSu+ot8jgqMvI6KjfyOSo88jsaAbI4tBsig89rQB4nLVUTWwbRRSeNzO767i2g7N/FP9s7MRrE5ON4/V6rSZyU0PiINSSNImES4IUoapWz6hEiqiMBDQqEojkAkiFStyKRC+9VSoFCeUEyqESVUAqEkcu3OAQb3hrJxAXwSGI3X0/szPz5vvm2x0i7O/vf8IJe5VkSJnUyUtklRBQJE1VIjRtUafkmk6pSu2ipleh4+xikkKxSksWTUeo8m8NoagpYtoslTmxrLl37z64e33esuJjU8P5Wd262LxoPVnPZ06Pxfe+C0YjkhSJygPhQCA8ABPOykwuN7NyuRvgUnAgLEnhATkaCQQiUe/7XKUyV6nQz+t2o7l66+rs7NVbq82GXTdrdjxjRGU5amTids2bUDMFtzCsqsMYMqr3IDY6OT05GjsI8Exv/6CSkOWEQigh+y3clxY5QVTcEZFIGtHLxDUJs6WsHR1y9SFKdr1HggCp3V1ICYL36OOpVmvKN9bC1u6R3vZ0qwWtVovgJfqOfUvfIYxIWL+fyETHNVJqSkIT1JTjW8ZWh3yDJDz0ctvsyt51etvrg9/QHhqGlzMM+vbmizPnDWPLMNbW19e7tffvsBzL99aWEfBRY46t+tbe3PypXv/IMDYN43WsQBe9HL2NC33RuxABrPsG+xH3o4bVRE2KgCRqulbWNf8W/UYVHM129aKra24VshZkq+CWD/Oy6Xt8cGYEthgHVlVliCfynAlqjo6oysTKlYUAD4docMI5/1ZioN+GwZNBcTwWUmTdBUqhTwX29QebXzF4An4JJMzwfMl+WQ01+IlQZVR4yhie53ycA16pOI/ODiYNGK4MChdCgXNnX5gIJXPCSYnf2OF850aQ+zJIyOs+u8+mMO8jQdwtg1TIWVRjKAnFcslMi8KfGUPoSUCergUyUk77dMyS69Ms6tijKZKYwUGKbpfdzu+iYeZYAHMFiOVi+MD7h9mb99qC0L7X8c+XatMfTj97KZ5IxJt/pd43tYYQKEjAnXMOB6kQEBrwg+LPjindAPOHNdC3q3ait0I3/ZIunZEARLNYNEUA6czSP3N/7j9wz6ZESdX0VNl1zGNS/szbQaQSIGk4DtVPcZf8AgXpf9A2OyTit5s2syZmand46bhEe2WtodLHkvaoqtTXuXN2/c42WADP9HGfbUcUW7JgqHss4xHtlMys679FqUomdP9VJBQBdnlPABBubpuNwqnmQj6/0HwNQzKxDUJFgKiXurBG6dqFjmeBzsvtRPJgGIZThYa5fdOvsReOticPh6JHHXxsv7ItJpOniYPYsmZ/x0QD/o5P105DeQwF6MH33ogoLi+KQp7zpY3HQV5bFMURzheXeds7gpP+jKNXljjHuYvXHke7cdCxLLZf6YX7B63UcCV4nGNgZGBgAOKAN2ZR8fw2Xxm4WRhA4AbHYRMY/f///1oWBuYGIJeDgQkkCgAvWgs2AAAAeJxjYGRgYG7438AQw8Lw/z8DAwsDA1AEBXADAHXiBHJ4nGNhYGBgYfj/nwVM48cATwECKwAAAAAAjAC6AOgBFAGAAf4CbgLqAzgDkHicY2BkYGDgZkhiYGcAASYg5gJCBob/YD4DABOmAYsAeJxlj01OwzAQhV/6B6QSqqhgh+QFYgEo/RGrblhUavdddN+mTpsqiSPHrdQDcB6OwAk4AtyAO/BIJ5s2lsffvHljTwDc4Acejt8t95E9XDI7cg0XuBeuU38QbpBfhJto41W4Rf1N2MczpsJtdGF5g9e4YvaEd2EPHXwI13CNT+E69S/hBvlbuIk7/Aq30PHqwj7mXle4jUcv9sdWL5xeqeVBxaHJIpM5v4KZXu+Sha3S6pxrW8QmU4OgX0lTnWlb3VPs10PnIhVZk6oJqzpJjMqt2erQBRvn8lGvF4kehCblWGP+tsYCjnEFhSUOjDFCGGSIyujoO1Vm9K+xQ8Jee1Y9zed0WxTU/3OFAQL0z1xTurLSeTpPgT1fG1J1dCtuy56UNJFezUkSskJe1rZUQuoBNmVXjhF6XNGJPyhnSP8ACVpuyAAAAHicbYhdDoIwEAb3a6k/YIIX8VArWewmdJFWJOnpJTG+OQ+TzJCjLy39p4ODR4OAA4444YwWHS7U3IVzn6Voldtb8ksHnvohrlqjjmw1rmzXsvdT7fEbblnCmOfNfJIYStJJfGIL27yb6AOCGR89AAA=') format('woff'),
|
||||
url('iconfont.ttf?t=1541579316141') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
|
||||
url('iconfont.svg?t=1541579316141#iconfont') format('svg'); /* iOS 4.1- */
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family:"iconfont" !important;
|
||||
font-size:16px;
|
||||
font-style:normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-bear:before { content: "\e600"; }
|
||||
|
||||
.icon-resize-vertical:before { content: "\e7c3"; }
|
||||
|
||||
.icon-chuizhifanzhuan:before { content: "\e661"; }
|
||||
|
||||
.icon-shuipingfanzhuan:before { content: "\e662"; }
|
||||
|
||||
.icon-qq:before { content: "\e609"; }
|
||||
|
||||
.icon-frown:before { content: "\e77e"; }
|
||||
|
||||
.icon-meh:before { content: "\e780"; }
|
||||
|
||||
.icon-smile:before { content: "\e783"; }
|
||||
|
||||
.icon-man:before { content: "\e7e2"; }
|
||||
|
||||
.icon-woman:before { content: "\e7e5"; }
|
||||
|
||||
BIN
admin/src/assets/icons/iconfont.eot
Normal file
56
admin/src/assets/icons/iconfont.svg
Normal file
@@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<!--
|
||||
2013-9-30: Created.
|
||||
-->
|
||||
<svg>
|
||||
<metadata>
|
||||
Created by iconfont
|
||||
</metadata>
|
||||
<defs>
|
||||
|
||||
<font id="iconfont" horiz-adv-x="1024" >
|
||||
<font-face
|
||||
font-family="iconfont"
|
||||
font-weight="500"
|
||||
font-stretch="normal"
|
||||
units-per-em="1024"
|
||||
ascent="896"
|
||||
descent="-128"
|
||||
/>
|
||||
<missing-glyph />
|
||||
|
||||
<glyph glyph-name="bear" unicode="" d="M1024 683.008q0-70.656-46.08-121.856 46.08-89.088 46.08-193.536 0-96.256-39.936-181.248t-109.568-147.968-162.816-99.328-199.68-36.352-199.68 36.352-162.304 99.328-109.568 147.968-40.448 181.248q0 104.448 46.08 193.536-46.08 51.2-46.08 121.856 0 37.888 13.824 71.168t37.376 58.368 55.808 39.424 68.096 14.336q43.008 0 78.848-18.432t59.392-50.176q46.08 17.408 96.256 26.624t102.4 9.216 102.4-9.216 96.256-26.624q24.576 31.744 59.904 50.176t78.336 18.432q36.864 0 68.608-14.336t55.296-39.424 37.376-58.368 13.824-71.168zM205.824 268.288q10.24 0 18.944 10.24t15.36 28.672 10.24 42.496 3.584 51.712-3.584 51.712-10.24 41.984-15.36 28.16-18.944 10.24q-9.216 0-17.92-10.24t-15.36-28.16-10.752-41.984-4.096-51.712 4.096-51.712 10.752-42.496 15.36-28.672 17.92-10.24zM512-31.744000000000028q53.248 0 99.84 13.312t81.408 35.84 54.784 52.736 19.968 65.024q0 33.792-19.968 64t-54.784 52.736-81.408 35.84-99.84 13.312-99.84-13.312-81.408-35.84-54.784-52.736-19.968-64q0-34.816 19.968-65.024t54.784-52.736 81.408-35.84 99.84-13.312zM818.176 268.288q10.24 0 18.944 10.24t15.36 28.672 10.24 42.496 3.584 51.712-3.584 51.712-10.24 41.984-15.36 28.16-18.944 10.24q-9.216 0-17.92-10.24t-15.36-28.16-10.752-41.984-4.096-51.712 4.096-51.712 10.752-42.496 15.36-28.672 17.92-10.24zM512 235.51999999999998q39.936 0 68.096-9.728t28.16-24.064-28.16-24.064-68.096-9.728-68.096 9.728-28.16 24.064 28.16 24.064 68.096 9.728z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="resize-vertical" unicode="" d="M512 896C229.248 896 0 666.752 0 384s229.248-512 512-512 512 229.248 512 512S794.752 896 512 896zM576 192l64 0-128-128-128 128 64 0L448 576l-64 0 128 128 128-128-64 0L576 192z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="chuizhifanzhuan" unicode="" d="M286.01856 645.08416l472.4224 0 0-146.2784-472.4224 0 0 146.2784ZM87.19872 420.37248l885.80096 0 0-70.87104-885.80096 0 0 70.87104ZM773.55008 268.05248l0-31.0016L270.6688 237.05088l0 31.0016L773.55008 268.05248zM773.55008 121.4208l0-31.0016L270.6688 90.4192l0 31.0016L773.55008 121.4208zM742.54848 240.75776l31.0016 0 0-123.04896-31.0016 0L742.54848 240.75776zM270.70464 240.57856l31.0016 0 0-123.04896-31.0016 0L270.70464 240.57856z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="shuipingfanzhuan" unicode="" d="M252.76928 596.096l146.2784 0 0-472.42752-146.2784 0 0 472.42752ZM477.48096 810.65472l70.87104 0 0-885.80608-70.87104 0 0 885.80608ZM629.80096 611.2l31.0016 0 0-502.88128-31.0016 0L629.80096 611.2zM776.42752 611.2l31.0016 0 0-502.88128-31.0016 0L776.42752 611.2zM657.09056 580.1984l0 31.0016 123.04896 0 0-31.0016L657.09056 580.1984zM657.27488 108.35456l0 31.0016 123.04896 0 0-31.0016L657.27488 108.35456z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="qq" unicode="" d="M147.372058 491.394284c-5.28997-13.909921 2.431986-22.698872 0-75.732573-0.682996-14.25092-62.165649-78.762555-86.569511-145.791177-24.192863-66.517625-27.519845-135.978232 9.811944-163.285078 37.419789-27.305846 72.191593 90.879487 76.757567 73.685584 1.961989-7.509958 4.436975-15.317914 7.423958-23.338868a331.945126 331.945126 0 0 1 61.140655-101.162429c5.929967-6.783962-36.009797-19.199892-61.140655-61.99365-25.173858-42.751759 7.209959-120.49032 132.223254-120.49032 161.27909 0 197.288886 56.70368 200.574868 56.447681 12.031932-0.895995 12.841928 0 25.599855 0 15.572912 0 9.129948-1.279993 23.593867 0 7.807956 0.682996 86.186514-67.839617 194.686901-56.447681 184.873956 19.45589 156.586116 81.40754 142.079198 120.48932-15.103915 40.83277-68.692612 59.946662-66.303626 62.549647 44.28775 48.938724 51.285711 79.018554 66.346626 123.9463 6.143965 18.473896 49.066723-101.674426 82.089537-73.685584 13.781922 11.690934 41.301767 60.24566 13.781922 163.285078-27.519845 102.996419-80.767544 126.505286-79.615551 145.791177 2.389987 40.191773 1.023994 68.436614-1.023994 75.732573-9.812945 35.4128-30.378829 27.604844-30.378829 35.4128C858.450044 730.752933 705.10691 896 515.966978 896s-342.398067-165.289067-342.398068-369.192916c0-16.169909-14.378919-4.223976-26.154852-35.4128z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="frown" unicode="" d="M336 475m-48 0a48 48 0 1 1 96 0 48 48 0 1 1-96 0ZM688 475m-48 0a48 48 0 1 1 96 0 48 48 0 1 1-96 0ZM512 832C264.6 832 64 631.4 64 384s200.6-448 448-448 448 200.6 448 448S759.4 832 512 832z m263-711c-34.2-34.2-74-61-118.3-79.8C611 21.8 562.3 12 512 12c-50.3 0-99 9.8-144.8 29.2-44.3 18.7-84.1 45.6-118.3 79.8-34.2 34.2-61 74-79.8 118.3C149.8 285 140 333.7 140 384s9.8 99 29.2 144.8c18.7 44.3 45.6 84.1 79.8 118.3 34.2 34.2 74 61 118.3 79.8C413 746.2 461.7 756 512 756c50.3 0 99-9.8 144.8-29.2 44.3-18.7 84.1-45.6 118.3-79.8 34.2-34.2 61-74 79.8-118.3C874.2 483 884 434.3 884 384s-9.8-99-29.2-144.8c-18.7-44.3-45.6-84.1-79.8-118.2zM512 363c-85.5 0-155.6-67.3-160-151.6-0.2-4.6 3.4-8.4 8-8.4h48.1c4.2 0 7.8 3.2 8.1 7.4C420 259.9 461.5 299 512 299s92.1-39.1 95.8-88.6c0.3-4.2 3.9-7.4 8.1-7.4H664c4.6 0 8.2 3.8 8 8.4-4.4 84.3-74.5 151.6-160 151.6z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="meh" unicode="" d="M336 475m-48 0a48 48 0 1 1 96 0 48 48 0 1 1-96 0ZM688 475m-48 0a48 48 0 1 1 96 0 48 48 0 1 1-96 0ZM512 832C264.6 832 64 631.4 64 384s200.6-448 448-448 448 200.6 448 448S759.4 832 512 832z m263-711c-34.2-34.2-74-61-118.3-79.8C611 21.8 562.3 12 512 12c-50.3 0-99 9.8-144.8 29.2-44.3 18.7-84.1 45.6-118.3 79.8-34.2 34.2-61 74-79.8 118.3C149.8 285 140 333.7 140 384s9.8 99 29.2 144.8c18.7 44.3 45.6 84.1 79.8 118.3 34.2 34.2 74 61 118.3 79.8C413 746.2 461.7 756 512 756c50.3 0 99-9.8 144.8-29.2 44.3-18.7 84.1-45.6 118.3-79.8 34.2-34.2 61-74 79.8-118.3C874.2 483 884 434.3 884 384s-9.8-99-29.2-144.8c-18.7-44.3-45.6-84.1-79.8-118.2zM664 331H360c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h304c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="smile" unicode="" d="M336 475m-48 0a48 48 0 1 1 96 0 48 48 0 1 1-96 0ZM688 475m-48 0a48 48 0 1 1 96 0 48 48 0 1 1-96 0ZM512 832C264.6 832 64 631.4 64 384s200.6-448 448-448 448 200.6 448 448S759.4 832 512 832z m263-711c-34.2-34.2-74-61-118.3-79.8C611 21.8 562.3 12 512 12c-50.3 0-99 9.8-144.8 29.2-44.3 18.7-84.1 45.6-118.3 79.8-34.2 34.2-61 74-79.8 118.3C149.8 285 140 333.7 140 384s9.8 99 29.2 144.8c18.7 44.3 45.6 84.1 79.8 118.3 34.2 34.2 74 61 118.3 79.8C413 746.2 461.7 756 512 756c50.3 0 99-9.8 144.8-29.2 44.3-18.7 84.1-45.6 118.3-79.8 34.2-34.2 61-74 79.8-118.3C874.2 483 884 434.3 884 384s-9.8-99-29.2-144.8c-18.7-44.3-45.6-84.1-79.8-118.2zM664 363h-48.1c-4.2 0-7.8-3.2-8.1-7.4C604 306.1 562.5 267 512 267s-92.1 39.1-95.8 88.6c-0.3 4.2-3.9 7.4-8.1 7.4H360c-4.6 0-8.2-3.8-8-8.4 4.4-84.3 74.5-151.6 160-151.6s155.6 67.3 160 151.6c0.2 4.6-3.4 8.4-8 8.4z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="man" unicode="" d="M874 776H622c-3.3 0-6-2.7-6-6v-56c0-3.3 2.7-6 6-6h160.4L583.1 508.7c-50 38.5-111 59.3-175.1 59.3-76.9 0-149.3-30-203.6-84.4S120 356.9 120 280s30-149.3 84.4-203.6C258.7 22 331.1-8 408-8s149.3 30 203.6 84.4C666 130.7 696 203.1 696 280c0 64.1-20.8 124.9-59.2 174.9L836 654.1V494c0-3.3 2.7-6 6-6h56c3.3 0 6 2.7 6 6V746c0 16.5-13.5 30-30 30zM408 68c-116.9 0-212 95.1-212 212s95.1 212 212 212 212-95.1 212-212-95.1-212-212-212z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="woman" unicode="" d="M909.7 739.4l-42.2 42.2c-3.1 3.1-8.2 3.1-11.3 0L764 689.4l-84.2 84.2c-3.1 3.1-8.2 3.1-11.3 0l-42.1-42.1c-3.1-3.1-3.1-8.1 0-11.3l84.2-84.2-135.5-135.3c-50 38.5-111 59.3-175.1 59.3-76.9 0-149.3-30-203.6-84.4S112 348.9 112 272s30-149.3 84.4-203.6C250.7 14 323.1-16 400-16s149.3 30 203.6 84.4C658 122.7 688 195.1 688 272c0 64.2-20.9 125.1-59.3 175.1l135.4 135.4 84.2-84.2c3.1-3.1 8.2-3.1 11.3 0l42.1 42.1c3.1 3.1 3.1 8.1 0 11.3l-84.2 84.2 92.2 92.2c3.1 3.1 3.1 8.2 0 11.3zM400 60c-116.9 0-212 95.1-212 212s95.1 212 212 212 212-95.1 212-212-95.1-212-212-212z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
|
||||
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
After Width: | Height: | Size: 8.2 KiB |
BIN
admin/src/assets/icons/iconfont.ttf
Normal file
BIN
admin/src/assets/icons/iconfont.woff
Normal file
BIN
admin/src/assets/images/administrato.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
admin/src/assets/images/auxiliaryPosition.jpg
Normal file
|
After Width: | Height: | Size: 174 KiB |
BIN
admin/src/assets/images/bg.png
Normal file
|
After Width: | Height: | Size: 373 KiB |
BIN
admin/src/assets/images/bigmeter.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
1
admin/src/assets/images/error-page/error-401.svg
Normal file
|
After Width: | Height: | Size: 31 KiB |
1
admin/src/assets/images/error-page/error-404.svg
Normal file
|
After Width: | Height: | Size: 26 KiB |
1
admin/src/assets/images/error-page/error-500.svg
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
admin/src/assets/images/famen.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
admin/src/assets/images/flowarrow.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
admin/src/assets/images/flowarrow2.png
Normal file
|
After Width: | Height: | Size: 1017 B |
BIN
admin/src/assets/images/load.gif
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
admin/src/assets/images/logo.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
admin/src/assets/images/meter.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
admin/src/assets/images/mincompanyLogo.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
admin/src/assets/images/secondaryflowMeter.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
admin/src/assets/images/start.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
admin/src/assets/images/unbigmeter.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
admin/src/assets/images/unfamen.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
admin/src/assets/images/unmeter.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
admin/src/assets/images/unsecondaryflowMeter.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
1019
admin/src/assets/three/OrbitControls.js
Normal file
30
admin/src/component.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import Vue from "vue";
|
||||
import TreeGrid from "./components/treeGrid/index.vue";
|
||||
import asyncModal from "./components/asyncModal/index.vue";
|
||||
import Editor from "./components/editor/index.vue";
|
||||
import UploadSingle from "./components/upload/Single.vue";
|
||||
import UoloadMultiple from "./components/upload/Multiple.vue";
|
||||
import CustomUpload from "./components/upload/Custom.vue";
|
||||
import pageHead from "./components/main/pageHead.vue";
|
||||
|
||||
import TextArea from "@component/textArea";
|
||||
import Tables from "@component/tables";
|
||||
import editModal from "@component/tables/editModal.vue";
|
||||
import FieldItem from "@component/tables/fieldItem.vue";
|
||||
class Component {
|
||||
register() {
|
||||
Vue.component("pageHead", pageHead);
|
||||
Vue.component("asyncModal", asyncModal);
|
||||
Vue.component("Editor", Editor);
|
||||
Vue.component("TreeGrid", TreeGrid);
|
||||
Vue.component("UploadSingle", UploadSingle);
|
||||
Vue.component("UoloadMultiple", UoloadMultiple);
|
||||
Vue.component("CustomUpload", CustomUpload);
|
||||
Vue.component("Tables", Tables);
|
||||
Vue.component("TextArea", TextArea);
|
||||
Vue.component("editModal", editModal);
|
||||
Vue.component("FieldItem", FieldItem);
|
||||
}
|
||||
}
|
||||
|
||||
export const component = new Component();
|
||||
47
admin/src/components/asyncModal/index.vue
Normal file
@@ -0,0 +1,47 @@
|
||||
<template>
|
||||
<Modal v-model="showModal" :width="width||80" :title="title" v-bind="$attrs">
|
||||
<div class="asyncModal-box">
|
||||
<slot></slot>
|
||||
</div>
|
||||
<div slot="footer">
|
||||
<Button @click="hide">取消</Button>
|
||||
<Button class="ml30" type="primary" @click="saveInfo">确定</Button>
|
||||
</div>
|
||||
</Modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ['title', 'width'],
|
||||
data() {
|
||||
return {
|
||||
showModal: false,
|
||||
callback: null,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
show(callback) {
|
||||
this.showModal = true
|
||||
this.callback = callback
|
||||
},
|
||||
hide() {
|
||||
this.showModal = false
|
||||
},
|
||||
|
||||
async saveInfo() {
|
||||
if (this.callback) {
|
||||
await this.callback()
|
||||
}
|
||||
this.$emit('on-ok')
|
||||
this.hide()
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.asyncModal-box {
|
||||
max-height: 90vh;
|
||||
min-height: 20vh;
|
||||
overflow: auto;
|
||||
}
|
||||
</style>
|
||||
42
admin/src/components/common-icon/common-icon.vue
Normal file
@@ -0,0 +1,42 @@
|
||||
<template>
|
||||
<component :is="iconType" :type="iconName" :color="iconColor" :size="iconSize" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Icons from '@component/md-icons'
|
||||
export default {
|
||||
name: 'CommonIcon',
|
||||
components: { Icons },
|
||||
props: {
|
||||
type: {
|
||||
type: String,
|
||||
},
|
||||
color: String,
|
||||
size: Number,
|
||||
},
|
||||
computed: {
|
||||
iconType() {
|
||||
if (this.type) {
|
||||
return this.type.indexOf('_') === 0 ? 'Icons' : 'Icon'
|
||||
}
|
||||
},
|
||||
iconName() {
|
||||
return this.iconType === 'Icons' ? this.getCustomIconName(this.type) : this.type
|
||||
},
|
||||
iconSize() {
|
||||
return this.size || (this.iconType === 'Icons' ? 12 : undefined)
|
||||
},
|
||||
iconColor() {
|
||||
return this.color || ''
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
getCustomIconName(iconName) {
|
||||
return iconName.slice(1)
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
2
admin/src/components/common-icon/index.js
Normal file
@@ -0,0 +1,2 @@
|
||||
import CommonIcon from './common-icon.vue'
|
||||
export default CommonIcon
|
||||
2
admin/src/components/cropper/index.js
Normal file
@@ -0,0 +1,2 @@
|
||||
import Cropper from './index.vue'
|
||||
export default Cropper
|
||||
36
admin/src/components/cropper/index.less
Normal file
@@ -0,0 +1,36 @@
|
||||
.bg{
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC")
|
||||
}
|
||||
.cropper-wrapper{
|
||||
width:100%;
|
||||
height: 100%;
|
||||
.img-box{
|
||||
height: 600px;
|
||||
width: 600px;
|
||||
border: 1px solid #ebebeb;
|
||||
display: inline-block;
|
||||
.bg;
|
||||
img{
|
||||
max-width: 100%;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
.right-con{
|
||||
display: inline-block;
|
||||
width: 170px;
|
||||
vertical-align: top;
|
||||
box-sizing: border-box;
|
||||
padding: 0 10px;
|
||||
margin-left: 30px;
|
||||
.preview-box{
|
||||
height: 150px !important;
|
||||
width: 100% !important;
|
||||
overflow: hidden;
|
||||
border: 1px solid #ebebeb;
|
||||
.bg;
|
||||
}
|
||||
.button-box{
|
||||
padding: 10px 0 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
155
admin/src/components/cropper/index.vue
Normal file
@@ -0,0 +1,155 @@
|
||||
<template>
|
||||
<div class="cropper-wrapper">
|
||||
<div class="img-box">
|
||||
<img class="cropper-image" :id="imgId" alt="">
|
||||
</div>
|
||||
<div class="right-con">
|
||||
<div v-if="preview" class="preview-box" :id="previewId"></div>
|
||||
<div class="button-box">
|
||||
<slot>
|
||||
<CustomUpload @chage="beforeUpload"> </CustomUpload>
|
||||
</slot>
|
||||
<div v-show="insideSrc">
|
||||
<Button type="primary" @click="rotate">
|
||||
<Icon type="md-refresh" :size="18" />
|
||||
</Button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div style="text-align: right;margin-top: 20px;">
|
||||
<Button style="width: 150px;margin-top: 10px;" type="primary" @click="crop">{{ cropButtonText }}</Button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Cropper from 'cropperjs'
|
||||
import './index.less'
|
||||
import 'cropperjs/dist/cropper.min.css'
|
||||
export default {
|
||||
name: 'Cropper',
|
||||
props: {
|
||||
src: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
preview: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
moveStep: {
|
||||
type: Number,
|
||||
default: 4,
|
||||
},
|
||||
cropButtonText: {
|
||||
type: String,
|
||||
default: '裁剪',
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
actionUrl: window.rootVue.$config.apiUrl + 'sys_file/upload_oos_img',
|
||||
cropper: null,
|
||||
insideSrc: '',
|
||||
file: null,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
imgId() {
|
||||
return `cropper${this._uid}`
|
||||
},
|
||||
previewId() {
|
||||
return `cropper_preview${this._uid}`
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
src(src) {
|
||||
this.replace(src)
|
||||
},
|
||||
insideSrc(src) {
|
||||
this.replace(src)
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
beforeUpload(file) {
|
||||
this.file = file
|
||||
const reader = new FileReader()
|
||||
reader.readAsDataURL(file)
|
||||
reader.onload = async (event) => {
|
||||
this.getSize(event.srcElement.result).then(({ width, height }) => {
|
||||
if (width < 500 || height < 500) {
|
||||
rootVue.$Message.error('图片尺寸小于 500*500 ,请更换图片')
|
||||
return false
|
||||
}
|
||||
this.insideSrc = event.srcElement.result
|
||||
})
|
||||
}
|
||||
return false
|
||||
},
|
||||
getSize(src) {
|
||||
let pro = new Promise((resolve, reject) => {
|
||||
let img = new Image()
|
||||
img.onload = function () {
|
||||
let { width, height } = img
|
||||
resolve({ width, height })
|
||||
}
|
||||
img.src = src
|
||||
})
|
||||
return pro
|
||||
},
|
||||
replace(src) {
|
||||
this.cropper.replace(src)
|
||||
this.insideSrc = src
|
||||
},
|
||||
rotate() {
|
||||
this.cropper.rotate(90)
|
||||
},
|
||||
shrink() {
|
||||
this.cropper.zoom(-0.1)
|
||||
},
|
||||
magnify() {
|
||||
this.cropper.zoom(0.1)
|
||||
},
|
||||
scale(d) {
|
||||
this.cropper[`scale${d}`](-this.cropper.getData()[`scale${d}`])
|
||||
},
|
||||
move(...argu) {
|
||||
this.cropper.move(...argu)
|
||||
},
|
||||
crop() {
|
||||
this.cropper.getCroppedCanvas({ fillColor: '#fff' }).toBlob(
|
||||
(blob) => {
|
||||
let file = new File([blob], this.file.name, {
|
||||
type: this.file.type,
|
||||
lastModified: Date.now(),
|
||||
})
|
||||
this.$emit('on-crop', file)
|
||||
this.insideSrc = ''
|
||||
this.filefile = null
|
||||
},
|
||||
'image/jpeg',
|
||||
0.8
|
||||
)
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.$nextTick(() => {
|
||||
let dom = document.getElementById(this.imgId)
|
||||
this.cropper = new Cropper(dom, {
|
||||
preview: `#${this.previewId}`,
|
||||
dragMode: 'move',
|
||||
checkCrossOrigin: true,
|
||||
aspectRatio: 5 / 5,
|
||||
cropBoxResizable: false,
|
||||
cropBoxMovable: false,
|
||||
outputSize: 0.8,
|
||||
minContainerWidth: 600, // 容器的最小宽度
|
||||
minContainerHeight: 600, // 容器的最小高度
|
||||
})
|
||||
})
|
||||
},
|
||||
}
|
||||
</script>
|
||||
92
admin/src/components/editor/index.vue
Normal file
@@ -0,0 +1,92 @@
|
||||
<template>
|
||||
<div :id="id"> </div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import WangEditor from 'wangeditor'
|
||||
export default {
|
||||
props: ['value'],
|
||||
data() {
|
||||
return {
|
||||
id: '',
|
||||
editor: null,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
let date = new Date()
|
||||
this.id = 'wangeditor_' + date.getTime()
|
||||
},
|
||||
mounted() {
|
||||
this.init()
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
let domId = `#${this.id}`
|
||||
this.editor = new WangEditor(domId)
|
||||
this.editor.config.uploadImgShowBase64 = true
|
||||
|
||||
this.editor.config.uploadImgServer = window.rootVue.$config.apiUrl + 'sys_file/upload_oos_img'
|
||||
this.editor.config.uploadImgHooks = {
|
||||
customInsert: (insertImg, result, editor) => {
|
||||
var url = result.data.path
|
||||
insertImg(url)
|
||||
},
|
||||
}
|
||||
|
||||
this.editor.config.menus = [
|
||||
'head', // 标题
|
||||
'bold', // 粗体
|
||||
'fontSize', // 字号
|
||||
'fontName', // 字体
|
||||
'italic', // 斜体
|
||||
'underline', // 下划线
|
||||
'strikeThrough', // 删除线
|
||||
'foreColor', // 文字颜色
|
||||
'backColor', // 背景颜色
|
||||
'link', // 插入链接
|
||||
'list', // 列表
|
||||
'justify', // 对齐方式
|
||||
'image', // 插入图片
|
||||
'fullscreen', // 全屏
|
||||
]
|
||||
|
||||
this.editor.config.pasteTextHandle = function (content) {
|
||||
if (content === '' && !content) return ''
|
||||
var str = content
|
||||
str = str.replace(/<xml>[\s\S]*?<\/xml>/gi, '')
|
||||
str = str.replace(/<style>[\s\S]*?<\/style>/gi, '')
|
||||
str = str.replace(/<\/?[^>]*>/g, '')
|
||||
str = str.replace(/[ | ]*\n/g, '\n')
|
||||
str = str.replace(/ /gi, '')
|
||||
str = str.replace(/spanyes'/gi, 'div')
|
||||
str = str.replace(/spanyes'/gi, '')
|
||||
str = str.replace(/';/gi, '')
|
||||
str = str.replace(/spanyes'/gi, 'span')
|
||||
str = str.replace(/<\/font>/gi, '')
|
||||
return str
|
||||
}
|
||||
|
||||
this.editor.config.onchange = (newHtml) => {
|
||||
this.$emit('input', newHtml)
|
||||
}
|
||||
|
||||
this.editor.create()
|
||||
|
||||
this.editor.$textElem.css('text-align', 'left')
|
||||
// 初始化设置值
|
||||
if (this.value) {
|
||||
this.setHtml(this.value)
|
||||
}
|
||||
},
|
||||
getHtml() {
|
||||
return this.editor.txt.html()
|
||||
},
|
||||
setHtml(text) {
|
||||
this.editor.txt.html(text)
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
</style>
|
||||
2
admin/src/components/info-card/index.js
Normal file
@@ -0,0 +1,2 @@
|
||||
import InforCard from './infor-card.vue'
|
||||
export default InforCard
|
||||
94
admin/src/components/info-card/infor-card.vue
Normal file
@@ -0,0 +1,94 @@
|
||||
<template>
|
||||
<Card :shadow="shadow" class="info-card-wrapper" :padding="0">
|
||||
<div class="content-con">
|
||||
<div class="left-area" :style="{background: color, width: leftWidth}">
|
||||
<common-icon class="icon" :type="icon" :size="iconSize" color="#fff" />
|
||||
</div>
|
||||
<div class="right-area" :style="{width: rightWidth}">
|
||||
<div>
|
||||
<slot></slot>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CommonIcon from '@component/common-icon'
|
||||
export default {
|
||||
name: 'InforCard',
|
||||
components: {
|
||||
CommonIcon,
|
||||
},
|
||||
props: {
|
||||
left: {
|
||||
type: Number,
|
||||
default: 36,
|
||||
},
|
||||
color: {
|
||||
type: String,
|
||||
default: '#2d8cf0',
|
||||
},
|
||||
icon: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
iconSize: {
|
||||
type: Number,
|
||||
default: 20,
|
||||
},
|
||||
shadow: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
leftWidth() {
|
||||
return `${this.left}%`
|
||||
},
|
||||
rightWidth() {
|
||||
return `${100 - this.left}%`
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.common {
|
||||
float: left;
|
||||
height: 100%;
|
||||
display: table;
|
||||
text-align: center;
|
||||
}
|
||||
.size {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.middle-center {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.info-card-wrapper {
|
||||
.size;
|
||||
overflow: hidden;
|
||||
.ivu-card-body {
|
||||
.size;
|
||||
}
|
||||
.content-con {
|
||||
.size;
|
||||
position: relative;
|
||||
.left-area {
|
||||
.common;
|
||||
& > .icon {
|
||||
.middle-center;
|
||||
}
|
||||
}
|
||||
.right-area {
|
||||
.common;
|
||||
& > div {
|
||||
.middle-center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
32
admin/src/components/load-flower/index.vue
Normal file
@@ -0,0 +1,32 @@
|
||||
<template>
|
||||
<div id="load-warp">
|
||||
<div class="m-load"> </div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {}
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
#load-warp {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
line-height: 100%;
|
||||
width: 100%;
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
z-index: 99999;
|
||||
display: none;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.m-load {
|
||||
position: relative;
|
||||
top: 50%;
|
||||
margin-top: -18px;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
background: url('../../assets/images/load.gif') center center no-repeat;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
2
admin/src/components/login-form/index.js
Normal file
@@ -0,0 +1,2 @@
|
||||
import LoginForm from './login-form.vue'
|
||||
export default LoginForm
|
||||
68
admin/src/components/login-form/login-form.vue
Normal file
@@ -0,0 +1,68 @@
|
||||
<template>
|
||||
<Form ref="loginForm" :model="form" :rules="rules" @keydown.enter.native="handleSubmit">
|
||||
<FormItem prop="userName">
|
||||
<Input v-model="form.userName" placeholder="请输入用户名">
|
||||
<span slot="prepend">
|
||||
<Icon :size="16" type="ios-person"></Icon>
|
||||
</span>
|
||||
</Input>
|
||||
</FormItem>
|
||||
<FormItem prop="password">
|
||||
<Input type="password" v-model="form.password" placeholder="请输入密码">
|
||||
<span slot="prepend">
|
||||
<Icon :size="14" type="md-lock"></Icon>
|
||||
</span>
|
||||
</Input>
|
||||
</FormItem>
|
||||
<FormItem>
|
||||
<Button style="margin-top:20px;" size="large" @click="handleSubmit" type="primary" long>登录</Button>
|
||||
</FormItem>
|
||||
</Form>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'LoginForm',
|
||||
props: {
|
||||
userNameRules: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return [{ required: true, message: '账号不能为空', trigger: 'blur' }]
|
||||
}
|
||||
},
|
||||
passwordRules: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return [{ required: true, message: '密码不能为空', trigger: 'blur' }]
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
form: {
|
||||
userName: '',
|
||||
password: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
rules() {
|
||||
return {
|
||||
userName: this.userNameRules,
|
||||
password: this.passwordRules
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleSubmit() {
|
||||
this.$refs.loginForm.validate(valid => {
|
||||
if (valid) {
|
||||
this.$emit('on-success-valid', {
|
||||
userName: this.form.userName,
|
||||
password: this.form.password
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
2
admin/src/components/main/components/a-back-top/index.js
Normal file
@@ -0,0 +1,2 @@
|
||||
import ABackTop from './index.vue'
|
||||
export default ABackTop
|
||||
95
admin/src/components/main/components/a-back-top/index.vue
Normal file
@@ -0,0 +1,95 @@
|
||||
<template>
|
||||
<div :class="classes" :style="styles" @click="back">
|
||||
<slot>
|
||||
<div :class="innerClasses">
|
||||
<i class="ivu-icon ivu-icon-ios-arrow-up"></i>
|
||||
</div>
|
||||
</slot>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { scrollTop } from '@/libs/util'
|
||||
import { on, off } from '@/libs/tools'
|
||||
const prefixCls = 'ivu-back-top'
|
||||
|
||||
export default {
|
||||
name: 'ABackTop',
|
||||
props: {
|
||||
height: {
|
||||
type: Number,
|
||||
default: 400
|
||||
},
|
||||
bottom: {
|
||||
type: Number,
|
||||
default: 30
|
||||
},
|
||||
right: {
|
||||
type: Number,
|
||||
default: 30
|
||||
},
|
||||
duration: {
|
||||
type: Number,
|
||||
default: 1000
|
||||
},
|
||||
container: {
|
||||
type: null,
|
||||
default: window
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
backTop: false
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// window.addEventListener('scroll', this.handleScroll, false)
|
||||
// window.addEventListener('resize', this.handleScroll, false)
|
||||
on(this.containerEle, 'scroll', this.handleScroll)
|
||||
on(this.containerEle, 'resize', this.handleScroll)
|
||||
},
|
||||
beforeDestroy() {
|
||||
// window.removeEventListener('scroll', this.handleScroll, false)
|
||||
// window.removeEventListener('resize', this.handleScroll, false)
|
||||
off(this.containerEle, 'scroll', this.handleScroll)
|
||||
off(this.containerEle, 'resize', this.handleScroll)
|
||||
},
|
||||
computed: {
|
||||
classes() {
|
||||
return [
|
||||
`${prefixCls}`,
|
||||
{
|
||||
[`${prefixCls}-show`]: this.backTop
|
||||
}
|
||||
]
|
||||
},
|
||||
styles() {
|
||||
return {
|
||||
bottom: `${this.bottom}px`,
|
||||
right: `${this.right}px`
|
||||
}
|
||||
},
|
||||
innerClasses() {
|
||||
return `${prefixCls}-inner`
|
||||
},
|
||||
containerEle() {
|
||||
return this.container === window
|
||||
? window
|
||||
: document.querySelector(this.container)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleScroll() {
|
||||
this.backTop = this.containerEle.scrollTop >= this.height
|
||||
},
|
||||
back() {
|
||||
let target =
|
||||
typeof this.container === 'string'
|
||||
? this.containerEle
|
||||
: document.documentElement || document.body
|
||||
const sTop = target.scrollTop
|
||||
scrollTop(this.containerEle, sTop, 0, this.duration)
|
||||
this.$emit('on-click')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,90 @@
|
||||
<template>
|
||||
<div v-if="showFullScreenBtn" class="full-screen-btn-con">
|
||||
<Tooltip :content="value ? '退出全屏' : '全屏'" placement="bottom">
|
||||
<Icon @click.native="handleChange" :type="value ? 'md-contract' : 'md-expand'" :size="23"></Icon>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'Fullscreen',
|
||||
computed: {
|
||||
showFullScreenBtn() {
|
||||
return window.navigator.userAgent.indexOf('MSIE') < 0
|
||||
}
|
||||
},
|
||||
props: {
|
||||
value: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleFullscreen() {
|
||||
let main = document.body
|
||||
if (this.value) {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen()
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen()
|
||||
} else if (document.webkitCancelFullScreen) {
|
||||
document.webkitCancelFullScreen()
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen()
|
||||
}
|
||||
} else {
|
||||
if (main.requestFullscreen) {
|
||||
main.requestFullscreen()
|
||||
} else if (main.mozRequestFullScreen) {
|
||||
main.mozRequestFullScreen()
|
||||
} else if (main.webkitRequestFullScreen) {
|
||||
main.webkitRequestFullScreen()
|
||||
} else if (main.msRequestFullscreen) {
|
||||
main.msRequestFullscreen()
|
||||
}
|
||||
}
|
||||
},
|
||||
handleChange() {
|
||||
this.handleFullscreen()
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
let isFullscreen =
|
||||
document.fullscreenElement ||
|
||||
document.mozFullScreenElement ||
|
||||
document.webkitFullscreenElement ||
|
||||
document.fullScreen ||
|
||||
document.mozFullScreen ||
|
||||
document.webkitIsFullScreen
|
||||
isFullscreen = !!isFullscreen
|
||||
document.addEventListener('fullscreenchange', () => {
|
||||
this.$emit('input', !this.value)
|
||||
this.$emit('on-change', !this.value)
|
||||
})
|
||||
document.addEventListener('mozfullscreenchange', () => {
|
||||
this.$emit('input', !this.value)
|
||||
this.$emit('on-change', !this.value)
|
||||
})
|
||||
document.addEventListener('webkitfullscreenchange', () => {
|
||||
this.$emit('input', !this.value)
|
||||
this.$emit('on-change', !this.value)
|
||||
})
|
||||
document.addEventListener('msfullscreenchange', () => {
|
||||
this.$emit('input', !this.value)
|
||||
this.$emit('on-change', !this.value)
|
||||
})
|
||||
this.$emit('input', isFullscreen)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
.full-screen-btn-con .ivu-tooltip-rel {
|
||||
height: 64px;
|
||||
line-height: 56px;
|
||||
i {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
2
admin/src/components/main/components/fullscreen/index.js
Normal file
@@ -0,0 +1,2 @@
|
||||
import Fullscreen from './fullscreen.vue'
|
||||
export default Fullscreen
|
||||
@@ -0,0 +1,4 @@
|
||||
.custom-bread-crumb{
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<template>
|
||||
<div class="custom-bread-crumb">
|
||||
<Breadcrumb :style="{fontSize: `${fontSize}px`}">
|
||||
<BreadcrumbItem v-for="item in list" :to="item.to" :key="`bread-crumb-${item.name}`">
|
||||
<common-icon style="margin-right: 4px;" :type="item.icon || ''" />
|
||||
{{ showTitle(item) }}
|
||||
</BreadcrumbItem>
|
||||
</Breadcrumb>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { showTitle } from '@/libs/util'
|
||||
import CommonIcon from '@component/common-icon/common-icon'
|
||||
import './custom-bread-crumb.less'
|
||||
export default {
|
||||
name: 'customBreadCrumb',
|
||||
components: {
|
||||
CommonIcon,
|
||||
},
|
||||
props: {
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
fontSize: {
|
||||
type: Number,
|
||||
default: 14,
|
||||
},
|
||||
showIcon: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
showTitle(item) {
|
||||
return showTitle(item, this)
|
||||
},
|
||||
isCustomIcon(iconName) {
|
||||
return iconName.indexOf('_') === 0
|
||||
},
|
||||
getCustomIconName(iconName) {
|
||||
return iconName.slice(1)
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,2 @@
|
||||
import customBreadCrumb from './custom-bread-crumb.vue'
|
||||
export default customBreadCrumb
|
||||
@@ -0,0 +1,18 @@
|
||||
.header-bar {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
height: 64px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.custom-content-con {
|
||||
height: 64px;
|
||||
padding-right: 120px;
|
||||
line-height: 64px;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<template>
|
||||
<div class="header-bar">
|
||||
<sider-trigger :collapsed="collapsed" icon="md-menu" @on-change="handleCollpasedChange"></sider-trigger>
|
||||
<custom-bread-crumb show-icon style="margin-left: 30px;" :list="breadCrumbList"></custom-bread-crumb>
|
||||
<div class="custom-content-con">
|
||||
<slot></slot>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import siderTrigger from './sider-trigger'
|
||||
import customBreadCrumb from './custom-bread-crumb'
|
||||
import './header-bar.less'
|
||||
export default {
|
||||
name: 'HeaderBar',
|
||||
components: {
|
||||
siderTrigger,
|
||||
customBreadCrumb,
|
||||
},
|
||||
props: {
|
||||
collapsed: Boolean,
|
||||
},
|
||||
computed: {
|
||||
breadCrumbList() {
|
||||
let route = this.$route.matched.map((p) => {
|
||||
let { name, path, meta } = p
|
||||
return { name, path, meta }
|
||||
})
|
||||
route.shift()
|
||||
return route
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
handleCollpasedChange(state) {
|
||||
this.$emit('on-coll-change', state)
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
2
admin/src/components/main/components/header-bar/index.js
Normal file
@@ -0,0 +1,2 @@
|
||||
import HeaderBar from './header-bar'
|
||||
export default HeaderBar
|
||||
@@ -0,0 +1,2 @@
|
||||
import siderTrigger from './sider-trigger.vue'
|
||||
export default siderTrigger
|
||||