This commit is contained in:
张成
2025-11-21 16:53:49 +08:00
commit 8309808835
286 changed files with 32656 additions and 0 deletions

15
.gitattributes vendored Normal file
View 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
View File

@@ -0,0 +1,7 @@
node_modules/
upload/
logs/
node_modules.*
build/
www/
config/template/temp/

17
.vscode/launch.json vendored Normal file
View 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
View 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
View 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
View File

@@ -0,0 +1,10 @@
{
'presets': [
[
'@vue/app',
{
useBuiltIns: 'entry'
}
]
]
}

9
admin/.editorconfig Normal file
View 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
View File

@@ -0,0 +1,2 @@
NODE_ENV=production
VUE_APP_ENV=production

2
admin/.env.sit Normal file
View File

@@ -0,0 +1,2 @@
NODE_ENV=production
VUE_APP_ENV=sit

0
admin/.eslintignore Normal file
View File

21
admin/.eslintrc.js Normal file
View 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
View 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
View File

@@ -0,0 +1,5 @@
module.exports = {
plugins: {
autoprefixer: {}
}
}

5
admin/.travis.yml Normal file
View File

@@ -0,0 +1,5 @@
language: node_js
node_js: stable
script: npm run lint
notifications:
email: false

35
admin/README.md Normal file
View 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
View File

@@ -0,0 +1,3 @@
{
"pluginsFile": "tests/e2e/plugins/index.js"
}

94
admin/package.json Normal file
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

28
admin/public/index.html Normal file
View 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>

File diff suppressed because one or more lines are too long

35
admin/src/App.vue Normal file
View 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>

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;

View 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

View 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;

View 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

View 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;

View 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

View 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

View 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;

View 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;

View 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;

View 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;

View 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;

View 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

File diff suppressed because it is too large Load Diff

View 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);

View 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;
}

View 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,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') 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"; }

Binary file not shown.

View 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="&#58880;" 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="&#59331;" 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="&#58977;" 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="&#58978;" 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="&#58889;" 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="&#59262;" 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="&#59264;" 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="&#59267;" 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="&#59362;" 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="&#59365;" 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

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because it is too large Load Diff

30
admin/src/component.js Normal file
View 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();

View 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>

View 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>

View File

@@ -0,0 +1,2 @@
import CommonIcon from './common-icon.vue'
export default CommonIcon

View File

@@ -0,0 +1,2 @@
import Cropper from './index.vue'
export default Cropper

View 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;
}
}
}

View 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>

View 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(/&nbsp;/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>

View File

@@ -0,0 +1,2 @@
import InforCard from './infor-card.vue'
export default InforCard

View 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>

View 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>

View File

@@ -0,0 +1,2 @@
import LoginForm from './login-form.vue'
export default LoginForm

View 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>

View File

@@ -0,0 +1,2 @@
import ABackTop from './index.vue'
export default ABackTop

View 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>

View File

@@ -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>

View File

@@ -0,0 +1,2 @@
import Fullscreen from './fullscreen.vue'
export default Fullscreen

View File

@@ -0,0 +1,4 @@
.custom-bread-crumb{
display: inline-block;
vertical-align: top;
}

View File

@@ -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>

View File

@@ -0,0 +1,2 @@
import customBreadCrumb from './custom-bread-crumb.vue'
export default customBreadCrumb

View File

@@ -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;
}
}

View File

@@ -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>

View File

@@ -0,0 +1,2 @@
import HeaderBar from './header-bar'
export default HeaderBar

View File

@@ -0,0 +1,2 @@
import siderTrigger from './sider-trigger.vue'
export default siderTrigger

Some files were not shown because too many files have changed in this diff Show More