创建项目
							
								
								
									
										5
									
								
								code/web/admin_system/.browserslistrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
> 1%
 | 
			
		||||
last 2 versions
 | 
			
		||||
not dead
 | 
			
		||||
not ie 11
 | 
			
		||||
safari >= 7
 | 
			
		||||
							
								
								
									
										2
									
								
								code/web/admin_system/.env.development
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,2 @@
 | 
			
		||||
VUE_APP_API_URL_LOGIN = "http://222.76.244.118:11001/admin-system/account/p13_account_check"
 | 
			
		||||
VUR_APPP_API_URL_UPLOAD_FILE= "http://222.76.244.118:11001/admin-system/file/file-upload.do"
 | 
			
		||||
							
								
								
									
										27
									
								
								code/web/admin_system/.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,27 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-14 15:12:46
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2022-12-14 15:20:20
 | 
			
		||||
 * @FilePath: \admin_system\.eslintrc.js
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
module.exports = {
 | 
			
		||||
  root: true,
 | 
			
		||||
  env: {
 | 
			
		||||
    node: true
 | 
			
		||||
  },
 | 
			
		||||
  'extends': [
 | 
			
		||||
    'plugin:vue/vue3-essential',
 | 
			
		||||
    'eslint:recommended'
 | 
			
		||||
  ],
 | 
			
		||||
  parserOptions: {
 | 
			
		||||
    parser: '@babel/eslint-parser'
 | 
			
		||||
  },
 | 
			
		||||
  rules: {
 | 
			
		||||
    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
 | 
			
		||||
    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								code/web/admin_system/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
			
		||||
.DS_Store
 | 
			
		||||
node_modules
 | 
			
		||||
/dist
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# local env files
 | 
			
		||||
.env.local
 | 
			
		||||
.env.*.local
 | 
			
		||||
 | 
			
		||||
# Log files
 | 
			
		||||
npm-debug.log*
 | 
			
		||||
yarn-debug.log*
 | 
			
		||||
yarn-error.log*
 | 
			
		||||
pnpm-debug.log*
 | 
			
		||||
 | 
			
		||||
# Editor directories and files
 | 
			
		||||
.idea
 | 
			
		||||
.vscode
 | 
			
		||||
*.suo
 | 
			
		||||
*.ntvs*
 | 
			
		||||
*.njsproj
 | 
			
		||||
*.sln
 | 
			
		||||
*.sw?
 | 
			
		||||
							
								
								
									
										24
									
								
								code/web/admin_system/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,24 @@
 | 
			
		||||
# admin_system
 | 
			
		||||
 | 
			
		||||
## Project setup
 | 
			
		||||
```
 | 
			
		||||
npm install
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Compiles and hot-reloads for development
 | 
			
		||||
```
 | 
			
		||||
npm run serve
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Compiles and minifies for production
 | 
			
		||||
```
 | 
			
		||||
npm run build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Lints and fixes files
 | 
			
		||||
```
 | 
			
		||||
npm run lint
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Customize configuration
 | 
			
		||||
See [Configuration Reference](https://cli.vuejs.org/config/).
 | 
			
		||||
							
								
								
									
										5
									
								
								code/web/admin_system/babel.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
module.exports = {
 | 
			
		||||
  presets: [
 | 
			
		||||
    '@vue/cli-plugin-babel/preset'
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								code/web/admin_system/jsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,19 @@
 | 
			
		||||
{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "target": "es5",
 | 
			
		||||
    "module": "esnext",
 | 
			
		||||
    "baseUrl": "./",
 | 
			
		||||
    "moduleResolution": "node",
 | 
			
		||||
    "paths": {
 | 
			
		||||
      "@/*": [
 | 
			
		||||
        "src/*"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    "lib": [
 | 
			
		||||
      "esnext",
 | 
			
		||||
      "dom",
 | 
			
		||||
      "dom.iterable",
 | 
			
		||||
      "scripthost"
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23141
									
								
								code/web/admin_system/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										36
									
								
								code/web/admin_system/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,36 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "admin_system",
 | 
			
		||||
  "version": "0.1.0",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "serve": "vue-cli-service serve",
 | 
			
		||||
    "build": "vue-cli-service build",
 | 
			
		||||
    "lint": "vue-cli-service lint"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@element-plus/icons-vue": "^2.0.10",
 | 
			
		||||
    "axios": "^1.2.1",
 | 
			
		||||
    "core-js": "^3.8.3",
 | 
			
		||||
    "element-plus": "^2.2.26",
 | 
			
		||||
    "sass": "^1.56.2",
 | 
			
		||||
    "sass-loader": "^13.2.0",
 | 
			
		||||
    "scss": "^0.2.4",
 | 
			
		||||
    "scss-loader": "^0.0.1",
 | 
			
		||||
    "vue": "^3.2.13",
 | 
			
		||||
    "vue-router": "^4.0.3",
 | 
			
		||||
    "vuex": "^4.0.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/core": "^7.12.16",
 | 
			
		||||
    "@babel/eslint-parser": "^7.12.16",
 | 
			
		||||
    "@vue/cli-plugin-babel": "~5.0.0",
 | 
			
		||||
    "@vue/cli-plugin-eslint": "~5.0.0",
 | 
			
		||||
    "@vue/cli-plugin-router": "~5.0.0",
 | 
			
		||||
    "@vue/cli-plugin-vuex": "~5.0.0",
 | 
			
		||||
    "@vue/cli-service": "~5.0.0",
 | 
			
		||||
    "eslint": "^7.32.0",
 | 
			
		||||
    "eslint-plugin-vue": "^8.0.3",
 | 
			
		||||
    "svg-sprite-loader": "^2.1.0",
 | 
			
		||||
    "vue-cli-plugin-element-plus": "~0.0.13"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								code/web/admin_system/public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.2 KiB  | 
							
								
								
									
										43
									
								
								code/web/admin_system/public/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,43 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-17 11:08:18
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-26 01:37:19
 | 
			
		||||
 * @FilePath: \admin_system\public\index.html
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="">
 | 
			
		||||
    <head>
 | 
			
		||||
        <meta charset="utf-8" />
 | 
			
		||||
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 | 
			
		||||
        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
 | 
			
		||||
        <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
 | 
			
		||||
        <title><%= htmlWebpackPlugin.options.title %></title>
 | 
			
		||||
    </head>
 | 
			
		||||
    <body>
 | 
			
		||||
        <noscript>
 | 
			
		||||
            <strong
 | 
			
		||||
                >We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't
 | 
			
		||||
                work properly without JavaScript enabled. Please enable it to
 | 
			
		||||
                continue.</strong
 | 
			
		||||
            >
 | 
			
		||||
        </noscript>
 | 
			
		||||
        <div id="app" v-cloak></div>
 | 
			
		||||
        <!-- built files will be auto injected -->
 | 
			
		||||
    </body>
 | 
			
		||||
    <style>
 | 
			
		||||
        .v-cloak {
 | 
			
		||||
            display: none;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        body {
 | 
			
		||||
            width: 100vw;
 | 
			
		||||
            height: 100vh;
 | 
			
		||||
            max-height: 100vh;
 | 
			
		||||
            min-width: 1280px;
 | 
			
		||||
        }
 | 
			
		||||
    </style>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										35
									
								
								code/web/admin_system/src/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,35 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-14 15:12:46
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-19 14:26:17
 | 
			
		||||
 * @FilePath: \admin_system\src\App.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
  <el-config-provider :locale="this.locale">
 | 
			
		||||
    <router-view></router-view>
 | 
			
		||||
  </el-config-provider>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
//引入语言组件
 | 
			
		||||
import zhCn from "element-plus/lib/locale/lang/zh-cn";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "App",
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      locale: zhCn, //语言属性
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  components: {
 | 
			
		||||
    // HelloWorld,
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										24
									
								
								code/web/admin_system/src/assets/css/colors.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-11-12 23:22:59
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2022-12-05 01:07:18
 | 
			
		||||
 * @FilePath: \hello-cli\src\assets\css\colors.css
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
    --backupground-color: #f4f5f7ff;
 | 
			
		||||
    --btn-color-blue: #307dbe;
 | 
			
		||||
    --btn-color-yellow: #f7b24d;
 | 
			
		||||
    --btn-color-green: #5bad60;
 | 
			
		||||
    --btn-color-red: #e56651;
 | 
			
		||||
    --btn-font-color: #fff;
 | 
			
		||||
 | 
			
		||||
    --input-focus-color: #e56651;
 | 
			
		||||
 | 
			
		||||
    /* 标题栏背景色 */
 | 
			
		||||
    --banner-background-color: #1d74b2;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								code/web/admin_system/src/assets/css/global.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-05 00:07:49
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2022-12-05 00:48:04
 | 
			
		||||
 * @FilePath: \hello-cli\src\assets\css\global.css
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
html,
 | 
			
		||||
body,
 | 
			
		||||
#app {
 | 
			
		||||
    /* padding: 0px; */
 | 
			
		||||
    margin: 0px;
 | 
			
		||||
    overflow: hidden;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								code/web/admin_system/src/assets/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.7 KiB  | 
							
								
								
									
										36
									
								
								code/web/admin_system/src/components/svg/SvgIcon.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,36 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-06 20:33:57
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-07 17:10:07
 | 
			
		||||
 * @FilePath: \admin_system\src\components\svg\SvgIcon.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    svg-icon:{{ this.iconName }}
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
    name: "svg-icon",
 | 
			
		||||
    data()
 | 
			
		||||
    {
 | 
			
		||||
        return {
 | 
			
		||||
            iconName: ""
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
    props: ["icon"],
 | 
			
		||||
    created()
 | 
			
		||||
    {
 | 
			
		||||
        console.log("svg");
 | 
			
		||||
        console.log(this.icon);
 | 
			
		||||
        this.iconName = this.icon;
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M757.76 102.4a122.88 122.88 0 0 1 122.88 122.88v376.8832l-1.4336-0.1536A89.6 89.6 0 0 1 960 691.2v153.6A89.6 89.6 0 0 1 870.4 934.4H153.6a89.6 89.6 0 0 1-89.6-89.6v-153.6a89.6 89.6 0 0 1 80.7936-89.1904l-1.4336 0.1536V225.28A122.88 122.88 0 0 1 266.24 102.4h491.52zM280.064 678.4H153.6a12.8 12.8 0 0 0-12.4416 9.8816l-0.3584 2.9184v153.6c0 7.0656 5.7344 12.8 12.8 12.8h716.8a12.8 12.8 0 0 0 12.8-12.8v-153.6a12.8 12.8 0 0 0-12.8-12.8h-126.5152l-84.992 68.352a38.4 38.4 0 0 1-24.0128 8.448H389.12a38.4 38.4 0 0 1-24.064-8.448L280.064 678.4zM757.76 179.2H266.24a46.08 46.08 0 0 0-45.7216 40.2944L220.16 225.28v376.32h73.3696a38.4 38.4 0 0 1 24.064 8.448l85.0432 68.352h218.6752l85.0944-68.352a38.4 38.4 0 0 1 18.8416-8.0896l5.2224-0.3584H803.84V225.28a46.08 46.08 0 0 0-40.2944-45.7216L757.76 179.2z m-114.1248 280.9344a38.4 38.4 0 0 1 5.2224 76.4416l-5.2224 0.3584H380.416a38.4 38.4 0 0 1-5.2224-76.4416l5.2224-0.3584h263.2704z m0-153.6a38.4 38.4 0 0 1 5.2224 76.4416l-5.2224 0.3584H380.416a38.4 38.4 0 0 1-5.2224-76.4416l5.2224-0.3584h263.2704z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M512 76.8a435.2 435.2 0 1 1 0 870.4 435.2 435.2 0 0 1 0-870.4zM512 153.6a358.4 358.4 0 1 0 0 716.8 358.4 358.4 0 0 0 0-716.8z m168.0384 141.2608a38.4 38.4 0 0 1 49.152 49.1008l-95.5904 266.4448a38.4 38.4 0 0 1-23.1936 23.1936L343.9616 729.088a38.4 38.4 0 0 1-49.152-49.1008l95.5904-266.4448a38.4 38.4 0 0 1 23.1936-23.1936zM440.832 500.4288l-46.1312 128.9216 128.8192-46.2336-82.688-82.688z m188.6208-105.8304l-136.8576 48.9984 87.7568 87.7568 49.1008-136.7552z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 753 B  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M665.6 448c49.4592 0 89.6 40.1408 89.6 89.6v307.2A89.6 89.6 0 0 1 665.6 934.4H358.4a89.6 89.6 0 0 1-89.6-89.6v-307.2c0-49.4592 40.1408-89.6 89.6-89.6z m12.8 281.6h-332.8v115.2a12.8 12.8 0 0 0 9.8816 12.4416L358.4 857.6h307.2a12.8 12.8 0 0 0 12.8-12.8v-115.2z m-250.88 25.6a38.4 38.4 0 1 1 0 76.8 38.4 38.4 0 0 1 0-76.8zM512 102.4a307.3536 307.3536 0 0 1 292.2496 212.3264 256.0512 256.0512 0 0 1 27.8016 488.3456v-84.6336a179.4048 179.4048 0 0 0 89.2928-145.408L921.6 563.2a179.3024 179.3024 0 0 0-126.464-171.3152l-9.3696-2.56-41.3696-10.2912-13.1584-40.6016a230.5024 230.5024 0 0 0-434.7904-10.3936l-3.584 10.3424-13.2096 40.6016-41.4208 10.24a179.3024 179.3024 0 0 0-46.2336 329.216v84.6336a256.1024 256.1024 0 0 1 27.7504-488.3456A307.2512 307.2512 0 0 1 512 102.4z m153.6 422.4H358.4a12.8 12.8 0 0 0-12.8 12.8v115.2h332.8V537.6a12.8 12.8 0 0 0-9.8816-12.4416L665.6 524.8z m-238.08 25.6a38.4 38.4 0 1 1 0 76.8 38.4 38.4 0 0 1 0-76.8z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M333.0048 113.664a153.6 153.6 0 0 1 153.6 153.6v174.1824a45.1584 45.1584 0 0 1-45.1584 45.1584H267.264a153.6 153.6 0 0 1-153.6-153.6V267.264a153.6 153.6 0 0 1 153.6-153.6h65.7408z m7.424 77.1584l-7.424-0.3584H267.264a76.8 76.8 0 0 0-76.4416 69.4272l-0.3584 7.3728v65.7408a76.8 76.8 0 0 0 69.4272 76.4416l7.3728 0.3584h142.5408V267.264a76.8 76.8 0 0 0-62.208-75.4176l-7.168-1.024zM441.4464 537.6c24.9344 0 45.1584 20.224 45.1584 45.1584v174.1824a153.6 153.6 0 0 1-153.6 153.6H267.264a153.6 153.6 0 0 1-153.6-153.6V691.2a153.6 153.6 0 0 1 153.6-153.6h174.1824z m-31.6416 76.7488L267.264 614.4a76.8 76.8 0 0 0-76.4416 69.4272l-0.3584 7.3728v65.7408a76.8 76.8 0 0 0 69.4272 76.4416l7.3728 0.3584h65.7408a76.8 76.8 0 0 0 76.4416-69.376l0.3584-7.424v-142.592z m347.136-500.6848a153.6 153.6 0 0 1 153.6 153.6v65.7408a153.6 153.6 0 0 1-153.6 153.6h-174.1824a45.1584 45.1584 0 0 1-45.1584-45.1584V267.264a153.6 153.6 0 0 1 153.6-153.6h65.7408z m0 76.8H691.2a76.8 76.8 0 0 0-76.4416 69.4272L614.4 267.264l-0.0512 142.5408h142.592a76.8 76.8 0 0 0 76.4416-69.376l0.3584-7.424V267.264a76.8 76.8 0 0 0-69.376-76.4416l-7.424-0.3584z m0 347.136a153.6 153.6 0 0 1 153.6 153.6v65.7408a153.6 153.6 0 0 1-153.6 153.6H691.2a153.6 153.6 0 0 1-153.6-153.6v-174.1824c0-24.9344 20.224-45.1584 45.1584-45.1584h174.1824zM614.4 756.9408a76.8 76.8 0 0 0 69.4272 76.4416l7.3728 0.3584h65.7408a76.8 76.8 0 0 0 76.4416-69.376l0.3584-7.424V691.2a76.8 76.8 0 0 0-69.376-76.4416L756.9408 614.4l-142.592-0.0512 0.0512 142.592z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.7 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M773.12 102.4a122.88 122.88 0 0 1 122.88 122.88v573.44a122.88 122.88 0 0 1-122.88 122.88H250.88a122.88 122.88 0 0 1-122.88-122.88V225.28A122.88 122.88 0 0 1 250.88 102.4h522.24z m0 76.8H250.88a46.08 46.08 0 0 0-45.7216 40.2944L204.8 225.28v573.44a46.08 46.08 0 0 0 40.2944 45.7216l5.7856 0.3584h522.24a46.08 46.08 0 0 0 45.7216-40.2944L819.2 798.72V225.28a46.08 46.08 0 0 0-40.2944-45.7216L773.12 179.2zM436.6336 247.1424c6.3488 0.2048 12.6976 0.9216 18.9952 2.1504 38.8096 7.5264 68.7104 32.256 89.8048 71.8336 19.6608 37.0176 26.88 67.4816 20.48 97.3824a99.4816 99.4816 0 0 1-30.5664 53.248l-0.9216 0.768 5.0176 8.3968 9.6768 14.4896 6.8608 9.9328 9.216 12.1856 6.8608 8.2432 3.7888-1.2288c50.688-15.5136 97.28 1.4336 140.544 47.616l7.6288 8.448c38.7584 45.8752 41.728 86.3744 26.2656 115.456l-3.2768 6.8096c-8.6528 16.0768-23.4496 33.1264-44.288 49.6128-29.3888 23.1424-71.0144 39.424-105.3696 38.0928l-8.448-0.8704-12.6976-1.5872a215.3984 215.3984 0 0 1-74.9568-27.4944c-47.9744-28.16-95.232-77.312-142.3872-152.4736-31.4368-50.0736-51.5072-89.4464-64.3584-130.3552a234.752 234.752 0 0 1-9.0112-124.8256 111.616 111.616 0 0 1 55.296-74.752l13.0048-7.0656c32.6144-17.92 55.6032-24.9856 82.8416-24.064z m-2.6624 76.7488c-11.3664-0.4096-21.7088 2.7648-43.3664 14.6432l-12.544 6.8608a34.5088 34.5088 0 0 0-17.3056 22.784c-5.632 27.9552-3.4816 56.832 6.6048 85.248 10.9568 34.816 28.3136 68.864 56.5248 113.92 71.0656 113.3568 117.248 140.4928 180.736 146.7904l-1.4848-0.2048 4.4544-0.256c11.1104-1.4336 27.8016-8.0384 41.1648-16.896l6.4-4.608c14.336-11.3152 22.2208-21.0432 25.9584-29.3376 2.56-4.864 2.048-11.5712-15.4624-32.256-28.3648-32.8192-47.9744-40.0384-70.912-31.4368l-8.1408 3.4304-6.656 3.3792a38.4 38.4 0 0 1-41.472-4.5568 104.0896 104.0896 0 0 1-8.192-7.424c-13.312-13.7216-25.6-28.3648-37.0688-44.3904l-15.9744-23.3472c-8.6528-13.312-16.4864-27.136-23.808-41.984l-3.4304-7.4752a38.4 38.4 0 0 1 16.7424-50.1248c16.0768-8.4992 22.2208-15.616 24.064-24.2176 1.9456-9.216-1.2288-22.7328-13.1584-45.2096-10.8544-20.2752-22.272-29.7472-36.5568-32.5632a46.4896 46.4896 0 0 0-7.168-0.768z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 2.3 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M798.72 102.4A122.88 122.88 0 0 1 921.6 225.28v573.44a122.88 122.88 0 0 1-122.88 122.88H225.28A122.88 122.88 0 0 1 102.4 798.72V225.28A122.88 122.88 0 0 1 225.28 102.4h573.44z m0 76.8H225.28a46.08 46.08 0 0 0-45.7216 40.2944L179.2 225.28v573.44a46.08 46.08 0 0 0 40.2944 45.7216l5.7856 0.3584h573.44a46.08 46.08 0 0 0 45.7216-40.2944l0.3584-5.7856V225.28a46.08 46.08 0 0 0-40.2944-45.7216L798.72 179.2z" fill="#595959" /><path d="M368.7936 248.32a38.4 38.4 0 0 1 38.0416 33.1776l0.3584 5.2224v204.032a102.4 102.4 0 0 1 0 189.8496V737.28a38.4 38.4 0 0 1-76.4928 5.2224l-0.3072-5.2224v-56.6784a102.4 102.4 0 0 1 0-189.9008V286.72a38.4 38.4 0 0 1 38.4-38.4z m0 311.7568a25.6 25.6 0 1 0 0 51.2 25.6 25.6 0 0 0 0-51.2zM655.36 248.32a38.4 38.4 0 0 1 38.0416 33.1776l0.3584 5.2224 0.0512 56.6272a102.4 102.4 0 0 1 0 189.8496L693.76 737.28a38.4 38.4 0 0 1-76.4416 5.2224l-0.3584-5.2224v-204.032a102.4 102.4 0 0 1 0-189.952V286.72a38.4 38.4 0 0 1 38.4-38.4z m0 164.352a25.6 25.6 0 1 0 0 51.2 25.6 25.6 0 0 0 0-51.2z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M773.12 102.4a122.88 122.88 0 0 1 122.88 122.88v573.44a122.88 122.88 0 0 1-122.88 122.88H250.88a122.88 122.88 0 0 1-122.88-122.88v-84.5824H102.4a38.4 38.4 0 0 1-5.2224-76.3904L102.4 637.3888l25.6-0.0512v-87.04H102.4a38.4 38.4 0 0 1-5.2224-76.3904L102.4 473.5488l25.6-0.0512v-87.04H102.4a38.4 38.4 0 0 1-5.2224-76.3904L102.4 309.7088l25.6-0.0512V225.28A122.88 122.88 0 0 1 250.88 102.4h522.24z m0 76.8H250.88a46.08 46.08 0 0 0-45.7216 40.2944L204.8 225.28v84.4288a38.4 38.4 0 0 1 5.2224 76.4416L204.8 386.5088v87.04a38.4 38.4 0 0 1 5.2224 76.4416L204.8 550.3488v87.04a38.4 38.4 0 0 1 5.2224 76.4416L204.8 714.1888V798.72a46.08 46.08 0 0 0 40.2944 45.7216l5.7856 0.3584h522.24a46.08 46.08 0 0 0 45.7216-40.2944L819.2 798.72V225.28a46.08 46.08 0 0 0-40.2944-45.7216L773.12 179.2z m-235.52 104.96a140.8 140.8 0 0 1 106.6496 232.704A217.4464 217.4464 0 0 1 755.2 706.56a38.4 38.4 0 1 1-76.8 0 140.8 140.8 0 1 0-281.6 0 38.4 38.4 0 1 1-76.8 0c0-81.408 44.7488-152.4224 111.0016-189.7472A140.8 140.8 0 0 1 537.6 284.16z m0 76.8a64 64 0 1 0 0 128 64 64 0 0 0 0-128z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M652.8 43.52c45.568 0 83.2 34.048 88.8832 78.08l-0.1024-0.6656 44.3392 0.0512a122.88 122.88 0 0 1 122.88 122.88v573.44a122.88 122.88 0 0 1-122.88 122.88H238.08a122.88 122.88 0 0 1-122.88-122.88v-573.44a122.88 122.88 0 0 1 122.88-122.88l44.3392-0.0512-0.1024 0.6656A89.6 89.6 0 0 1 371.2 43.52z m86.7328 153.088a89.6 89.6 0 0 1-86.7328 67.072h-281.6a89.6 89.6 0 0 1-86.7328-67.072l0.3072 1.1776H238.08a46.08 46.08 0 0 0-45.7216 40.2944l-0.3584 5.7856v573.44a46.08 46.08 0 0 0 40.2944 45.7216l5.7856 0.3584h547.84a46.08 46.08 0 0 0 45.7216-40.2944l0.3584-5.7856v-573.44a46.08 46.08 0 0 0-40.2944-45.7216l-5.7856-0.3584h-46.6944zM512 335.36a140.8 140.8 0 0 1 104.192 235.52 191.6928 191.6928 0 0 1 87.808 161.28 38.4 38.4 0 0 1-76.4416 5.2224l-0.3584-5.2224a115.2 115.2 0 1 0-230.4 0 38.4 38.4 0 1 1-76.8 0c0-67.6352 34.9696-127.1296 87.808-161.28A140.8 140.8 0 0 1 512 335.36z m0 76.8a64 64 0 1 0 0 128 64 64 0 0 0 0-128z m140.8-291.84h-281.6A12.8 12.8 0 0 0 358.4 133.12v40.96c0 7.0656 5.7344 12.8 12.8 12.8h281.6A12.8 12.8 0 0 0 665.6 174.08v-40.96a12.8 12.8 0 0 0-12.8-12.8z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M665.6 89.6a38.4 38.4 0 0 1 38.0416 33.1776l0.3584 5.2224v30.6688l120.32 0.0512a122.88 122.88 0 0 1 122.88 122.88v496.64a122.88 122.88 0 0 1-122.88 122.88H199.68a122.88 122.88 0 0 1-122.88-122.88V281.6a122.88 122.88 0 0 1 122.88-122.88l120.32-0.0512V128a38.4 38.4 0 0 1 76.4416-5.2224l0.3584 5.2224v30.6688h230.4V128a38.4 38.4 0 0 1 38.4-38.4zM320 235.4688L199.68 235.52a46.08 46.08 0 0 0-45.7216 40.2944L153.6 281.6v496.64a46.08 46.08 0 0 0 40.2944 45.7216l5.7856 0.3584h624.64a46.08 46.08 0 0 0 45.7216-40.2944L870.4 778.24V281.6a46.08 46.08 0 0 0-40.2944-45.7216L824.32 235.52l-120.32-0.0512v17.2032a38.4 38.4 0 0 1-76.4416 5.2224l-0.3584-5.2224v-17.2032h-230.4v17.2032a38.4 38.4 0 0 1-76.4416 5.2224l-0.3584-5.2224v-17.2032zM384 367.36a120.064 120.064 0 0 1 87.552 202.24 164.2496 164.2496 0 0 1 72.448 136.96 32 32 0 1 1-64 0c0-52.5312-39.0656-95.3344-88.3712-99.328l-7.6288 0.256c-2.56 0-5.12-0.1024-7.68-0.256-49.2544 3.9936-88.32 46.7968-88.32 99.328a32 32 0 1 1-64 0c0-57.2416 28.7744-107.776 72.4992-137.0624A120.064 120.064 0 0 1 384 367.36z m362.6496 209.5104a38.4 38.4 0 0 1 5.1712 76.4928l-5.1712 0.3072H614.4a38.4 38.4 0 0 1-5.2224-76.4416l5.2224-0.3584h132.2496zM384 431.36a56.064 56.064 0 0 0-6.5024 111.7696l6.5024-0.2048 6.5024 0.2048A56.064 56.064 0 0 0 384 431.36z m362.6496-8.0896a38.4 38.4 0 0 1 5.1712 76.4928l-5.1712 0.3072H614.4a38.4 38.4 0 0 1-5.2224-76.4416L614.4 423.2704h132.2496z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.7 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M716.8 460.8a256 256 0 1 1 0 512 256 256 0 0 1 0-512z m30.72-358.4A122.88 122.88 0 0 1 870.4 225.28l0.0512 196.2496a330.496 330.496 0 0 0-76.8-28.6208L793.6 225.28a46.08 46.08 0 0 0-40.2944-45.7216L747.52 179.2H225.28a46.08 46.08 0 0 0-45.7216 40.2944L179.2 225.28v573.44a46.08 46.08 0 0 0 40.2944 45.7216l5.7856 0.3584h184.2176c11.5712 27.7504 26.7776 53.5552 45.0048 76.8H225.28A122.88 122.88 0 0 1 102.4 798.72V225.28A122.88 122.88 0 0 1 225.28 102.4h522.24z m-30.72 435.2a179.2 179.2 0 1 0 0 358.4 179.2 179.2 0 0 0 0-358.4z m0 31.1296a38.4 38.4 0 0 1 38.0416 33.1776l0.3584 5.2224v78.5408h48.64a38.4 38.4 0 0 1 38.0416 33.28l0.3584 5.12a38.4 38.4 0 0 1-33.1776 38.0928l-5.2224 0.3584H716.8a38.4 38.4 0 0 1-38.0416-33.1776l-0.3584-5.2224v-116.992a38.4 38.4 0 0 1 38.4-38.4zM431.2064 435.2a38.4 38.4 0 0 1 5.2224 76.4416L431.2064 512h-153.6a38.4 38.4 0 0 1-5.2224-76.4416l5.2224-0.3584h153.6z m177.3568-153.6a38.4 38.4 0 0 1 5.2224 76.4416L608.5632 358.4H277.6064a38.4 38.4 0 0 1-5.2224-76.4416l5.2224-0.3584h330.9568z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M665.6 115.2a38.4 38.4 0 0 1 38.0416 33.1776L704 153.6v30.6688l94.72 0.0512A122.88 122.88 0 0 1 921.6 307.2v471.04a122.88 122.88 0 0 1-122.88 122.88H225.28A122.88 122.88 0 0 1 102.4 778.24V307.2a122.88 122.88 0 0 1 122.88-122.88l94.72-0.0512V153.6a38.4 38.4 0 0 1 76.4416-5.2224L396.8 153.6v30.6688h230.4V153.6a38.4 38.4 0 0 1 38.4-38.4zM320 261.0688L225.28 261.12a46.08 46.08 0 0 0-45.7216 40.2944L179.2 307.2v471.04a46.08 46.08 0 0 0 40.2944 45.7216l5.7856 0.3584h573.44a46.08 46.08 0 0 0 45.7216-40.2944l0.3584-5.7856V307.2a46.08 46.08 0 0 0-40.2944-45.7216L798.72 261.12l-94.72-0.0512v17.2032a38.4 38.4 0 0 1-76.4416 5.2224l-0.3584-5.2224v-17.2032h-230.4v17.2032a38.4 38.4 0 0 1-76.4416 5.2224l-0.3584-5.2224v-17.2032zM307.2 588.8a51.2 51.2 0 1 1 0 102.4 51.2 51.2 0 0 1 0-102.4z m409.6 12.544a38.4 38.4 0 0 1 5.2224 76.4416l-5.2224 0.3584H460.8a38.4 38.4 0 0 1-5.2224-76.4416L460.8 601.344h256zM307.2 424.96a51.2 51.2 0 1 1 0 102.4 51.2 51.2 0 0 1 0-102.4z m409.6 12.544a38.4 38.4 0 0 1 5.2224 76.4416l-5.2224 0.3584H460.8a38.4 38.4 0 0 1-5.2224-76.4416L460.8 437.504h256z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M495.0528 78.1824a38.4 38.4 0 0 1 33.8944 0l384 189.0304a41.3184 41.3184 0 0 1 6.4 3.9424l1.536 1.28a26.4192 26.4192 0 0 1 2.4576 2.2016l0.9728 1.024a24.9344 24.9344 0 0 1 2.304 2.7136l0.7168 1.024a34.816 34.816 0 0 1 4.096 7.2192l1.6384 4.9152a38.912 38.912 0 0 1 1.3312 10.1376v441.1392a38.4 38.4 0 0 1-21.4528 34.4576l-384 189.0304a39.0656 39.0656 0 0 1-9.728 3.2768l-4.7616 0.6144h-4.9152l-4.8128-0.6144a37.888 37.888 0 0 1-9.472-3.1744l-0.2048-0.1024-384-189.0304a38.4 38.4 0 0 1-21.4528-34.4576V301.6704c0-3.584 0.512-6.9632 1.3312-10.1376l1.6896-4.9152a37.5808 37.5808 0 0 1 3.9936-7.168l0.8192-1.024a25.3952 25.3952 0 0 1 2.2016-2.7648l1.024-1.024a24.2176 24.2176 0 0 1 2.4064-2.2016l1.6384-1.28a37.0688 37.0688 0 0 1 6.3488-3.9424l-4.096 2.3552a39.0656 39.0656 0 0 1 3.072-1.8432l1.024-0.512zM166.4 363.4176v355.4304l307.2 151.296v-355.5328l-307.2-151.1936z m691.2 0l-307.2 151.1936v355.5328l307.2-151.296V363.4176zM512 155.392L214.9376 301.6704 512 447.8976l297.0112-146.2272L512 155.392z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
| 
		 After Width: | Height: | Size: 4.9 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M579.2256 95.1808l286.72 187.4432A122.88 122.88 0 0 1 921.6 385.536V798.72a122.88 122.88 0 0 1-122.88 122.88H225.28A122.88 122.88 0 0 1 102.4 798.72V385.4848A122.88 122.88 0 0 1 158.0544 282.624l286.72-187.4432a122.88 122.88 0 0 1 134.4512 0zM492.032 156.4672l-5.2736 2.9696-286.72 187.4944a46.08 46.08 0 0 0-20.48 32.768L179.2 385.536V798.72a46.08 46.08 0 0 0 40.2944 45.7216l5.7856 0.3584h573.44a46.08 46.08 0 0 0 45.7216-40.2944l0.3584-5.7856V385.4848a46.08 46.08 0 0 0-16.2304-35.1232l-4.608-3.4304-286.72-187.4944a46.08 46.08 0 0 0-45.2096-2.9696z m202.1376 516.4544a38.4 38.4 0 0 1 0 76.8H329.8304a38.4 38.4 0 1 1 0-76.8h364.3392z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 928 B  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M870.4 832a38.4 38.4 0 0 1 5.2224 76.4416L870.4 908.8H153.6a38.4 38.4 0 0 1-5.2224-76.4416L153.6 832h716.8z m-71.68-716.8a122.88 122.88 0 0 1 122.88 122.88v419.84a122.88 122.88 0 0 1-122.88 122.88H225.28a122.88 122.88 0 0 1-122.88-122.88v-419.84a122.88 122.88 0 0 1 122.88-122.88h573.44z m0 76.8H225.28a46.08 46.08 0 0 0-45.7216 40.2944L179.2 238.08v419.84a46.08 46.08 0 0 0 40.2944 45.7216l5.7856 0.3584h573.44a46.08 46.08 0 0 0 45.7216-40.2944l0.3584-5.7856v-419.84a46.08 46.08 0 0 0-40.2944-45.7216L798.72 192z m-13.824 98.304a38.4 38.4 0 0 1 3.7376 49.9712l-3.7376 4.3008-222.0032 222.0032a38.4 38.4 0 0 1-50.0224 3.7376l-4.3008-3.7376-108.544-108.544-108.544 108.544a38.4 38.4 0 0 1-50.0224 3.7376l-4.3008-3.7376a38.4 38.4 0 0 1-3.7376-49.9712l3.7376-4.3008 135.68-135.7312a38.4 38.4 0 0 1 50.0224-3.7376l4.3008 3.7376 108.544 108.544 194.8672-194.816a38.4 38.4 0 0 1 54.272 0z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M481.536 199.4752a38.4 38.4 0 0 1 39.0656 38.4l-0.0512 300.3904h300.4416a38.4 38.4 0 0 1 38.0416 33.2288l0.3584 5.1712A377.2416 377.2416 0 1 1 469.6064 199.68z m-37.7856 79.2576l-6.144 0.8192a300.544 300.544 0 0 0 44.544 597.5552 300.4928 300.4928 0 0 0 297.216-256l0.7168-6.0416H482.2016a38.4 38.4 0 0 1-38.0928-33.1776l-0.3072-5.2224-0.0512-297.9328z m171.776-204.4416l5.0688 0.0512a371.4048 371.4048 0 0 1 342.528 357.5808l0.2048 11.8784a38.4 38.4 0 0 1-38.4 39.0656h-307.2a38.4 38.4 0 0 1-38.4-38.4V112.64a38.4 38.4 0 0 1 41.2672-38.2976z m40.5504 82.7904v248.9856h227.84l-0.8704-7.0656a294.7584 294.7584 0 0 0-222.3616-240.896l-4.608-1.024z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 937 B  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M512 153.6a307.3536 307.3536 0 0 1 292.2496 212.3264 256.0512 256.0512 0 0 1-36.1984 503.1936L768 870.4H256v-1.28a256 256 0 0 1-36.2496-503.1936A307.2512 307.2512 0 0 1 512 153.6z m0 76.8a230.4512 230.4512 0 0 0-215.552 148.8384l-3.584 10.3424-13.2096 40.6016-41.4208 10.24a179.3024 179.3024 0 0 0 15.6672 351.0784l9.728 1.2288 9.216 0.8704h478.3104l9.2672-0.8704a179.2 179.2 0 0 0 160.9216-168.4992L921.6 614.4a179.3024 179.3024 0 0 0-126.464-171.3152l-9.3696-2.56-41.3696-10.2912-13.1584-40.6016A230.5024 230.5024 0 0 0 512 230.4z" fill="#595959" /><path d="M512 371.2a38.4 38.4 0 0 1 38.0416 33.1776L550.4 409.6v170.2912l27.2896-27.2896a38.4 38.4 0 0 1 50.3808-3.4304l3.9424 3.4304a38.4 38.4 0 0 1 3.4304 50.3808l-3.4304 3.9424-94.1056 94.1056a38.4 38.4 0 0 1-50.3808 3.4304l-3.9424-3.4304-94.1568-94.1056a38.4 38.4 0 0 1 50.3808-57.7536l3.9424 3.4304 29.8496 29.8496V409.6a38.4 38.4 0 0 1 38.4-38.4z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M358.4 205.4144c19.2 0 37.632 3.2256 54.784 9.0624a267.3664 267.3664 0 0 0-31.5904 70.656A91.904 91.904 0 0 0 358.4 282.2656c-49.664 0-89.6 39.0656-89.6 86.784S308.736 455.68 358.4 455.68a92.16 92.16 0 0 0 29.4912-4.8128c8.96 24.576 21.4528 47.4624 36.8128 68.096-20.2752 8.704-42.752 13.5168-66.304 13.5168-91.6992 0-166.4-73.0112-166.4-163.5328S266.7008 205.4144 358.4 205.4144zM283.5456 633.5488H227.5328a48.384 48.384 0 0 0-48.0256 42.7008l-0.3072 5.632v43.2128a5.12 5.12 0 0 0 3.1232 4.7104l1.9968 0.4096h72.2944a234.1376 234.1376 0 0 0-0.3584 12.1856v51.2c0 4.5056 0.2048 9.0112 0.512 13.4144H184.32a81.92 81.92 0 0 1-81.92-81.92v-43.2128a125.1328 125.1328 0 0 1 125.1328-125.184h122.7264a231.4752 231.4752 0 0 0-66.7136 76.8zM793.856 588.8a153.6 153.6 0 0 1 153.6 153.6v51.2a102.4 102.4 0 0 1-102.4 102.4h-409.6a102.4 102.4 0 0 1-102.4-102.4v-51.2a153.6 153.6 0 0 1 153.6-153.6h307.2z m0 76.8h-307.2a76.8 76.8 0 0 0-76.4416 69.4272l-0.3584 7.3728v51.2a25.6 25.6 0 0 0 20.992 25.1904l4.608 0.4096h409.6a25.6 25.6 0 0 0 25.1904-20.992l0.4096-4.608v-51.2a76.8 76.8 0 0 0-69.376-76.4416L793.856 665.6zM640.256 166.4a192 192 0 1 0 0 384 192 192 0 0 0 0-384z m0 76.8a115.2 115.2 0 1 1 0 230.4 115.2 115.2 0 0 1 0-230.4z" fill="#595959" /><path d="M793.856 588.8a153.6 153.6 0 0 1 153.6 153.6v51.2a102.4 102.4 0 0 1-102.4 102.4h-409.6a102.4 102.4 0 0 1-102.4-102.4v-51.2a153.6 153.6 0 0 1 153.6-153.6h307.2z m0 76.8h-307.2a76.8 76.8 0 0 0-76.4416 69.4272l-0.3584 7.3728v51.2a25.6 25.6 0 0 0 20.992 25.1904l4.608 0.4096h409.6a25.6 25.6 0 0 0 25.1904-20.992l0.4096-4.608v-51.2a76.8 76.8 0 0 0-69.376-76.4416L793.856 665.6z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.9 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M711.9872 115.2l8.192 0.256a120.0128 120.0128 0 0 1 111.8208 119.7568l-0.0512-1.9968h10.2912A130.56 130.56 0 0 1 972.8 363.776v427.264A130.56 130.56 0 0 1 842.24 921.6H232.96A130.56 130.56 0 0 1 102.4 791.04V235.2128l0.256-8.192A120.0128 120.0128 0 0 1 222.4128 115.2h489.5744z m130.2528 194.816H232.96c-27.6992 0-50.5344 20.992-53.4528 47.9232l-0.3072 5.8368v427.264c0 27.6992 20.992 50.5344 47.9232 53.4528l5.8368 0.3072h609.28c27.6992 0 50.5344-20.992 53.4528-47.9232l0.3072-5.8368v-48.4352h-220.416a165.2224 165.2224 0 0 1 0-330.3936H896v-48.4352c0-27.648-20.992-50.4832-47.9232-53.4016l-5.8368-0.3584z m53.76 178.9952h-220.416c-46.2336 0-84.1728 35.5328-88.064 80.7936l-0.3072 7.6288c0 46.2336 35.5328 84.224 80.7424 88.064l7.68 0.3072H896V489.0112z m-211.2 50.1248a38.4 38.4 0 1 1 0 76.8 38.4 38.4 0 0 1 0-76.8z m27.1872-347.136H222.4128l-5.4272 0.3584a43.2128 43.2128 0 0 0-37.7856 42.8544v9.5744a130.048 130.048 0 0 1 53.76-11.5712h522.0864l-0.2048-3.4304a43.2128 43.2128 0 0 0-37.376-37.4272l-5.4784-0.3584z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M512 51.2c19.5584 0 48.2304 6.656 85.9136 19.968l21.4528 7.9872 23.2448 9.216 12.288 5.12 25.9584 11.264 27.7504 12.5952 29.5424 13.8752 31.3344 15.2064 33.1264 16.5376 53.0432 27.2896A122.88 122.88 0 0 1 921.6 299.1104V537.6a409.6 409.6 0 0 1-396.8 409.3952L512 947.2a409.6 409.6 0 0 1-409.6-409.6V299.1104a122.88 122.88 0 0 1 65.9456-108.8512l35.84-18.5344 33.9968-17.152 32.256-15.872 30.4128-14.592 28.672-13.2096 26.8288-11.9296c8.6528-3.7376 16.9984-7.2704 25.0368-10.5472l23.2448-9.2672 21.504-7.936C463.7184 57.856 492.3904 51.2 512 51.2z m0 76.8c-5.632 0-13.4144 1.2288-23.1936 3.6864L476.16 135.168l-14.4896 4.7104-16.384 5.8368-28.0064 10.9056-31.8976 13.5168-23.4496 10.4448-38.2976 17.8176-27.5456 13.312-29.184 14.336-30.72 15.616-32.256 16.6912a46.08 46.08 0 0 0-24.2688 34.4064l-0.4608 6.3488V537.6c0 179.8144 142.592 326.2976 319.744 332.5952l11.8784 0.2048 11.5712-0.1536a332.8 332.8 0 0 0 322.2016-320.7168l0.2048-11.9296V299.1104a46.0288 46.0288 0 0 0-24.6784-40.7552l-32.256-16.6912-45.568-22.9376-28.3648-13.824-39.5264-18.688a2152.5504 2152.5504 0 0 0-12.288-5.632l-23.5008-10.4448-31.8976-13.5168-28.0064-10.9056-16.384-5.8368-14.4896-4.7104-12.6464-3.4816A101.6832 101.6832 0 0 0 512 128z m39.0656 176.3328a38.4 38.4 0 0 1 17.2032 47.4624l-2.2016 4.7104-70.8608 127.8976H593.92a38.4 38.4 0 0 1 35.84 52.1728l-2.2528 4.864-102.4 184.7808a38.4 38.4 0 0 1-69.376-32.512l2.2016-4.7616 70.7584-127.744H430.08a38.4 38.4 0 0 1-35.84-52.1216l2.2528-4.864 102.4-184.8832a38.4 38.4 0 0 1 52.224-15.0016z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.8 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M824.32 128a122.88 122.88 0 0 1 122.88 122.88v522.24a122.88 122.88 0 0 1-122.88 122.88H199.68a122.88 122.88 0 0 1-122.88-122.88V250.88a122.88 122.88 0 0 1 122.88-122.88h624.64z m0 76.8H199.68a46.08 46.08 0 0 0-45.7216 40.2944L153.6 250.88v522.24a46.08 46.08 0 0 0 40.2944 45.7216L199.68 819.2h624.64a46.08 46.08 0 0 0 45.7216-40.2944L870.4 773.12V250.88a46.08 46.08 0 0 0-40.2944-45.7216L824.32 204.8zM512 350.72a38.4 38.4 0 0 1 5.2224 76.4416L512 427.52l-79.36-0.0512v235.5712a38.4 38.4 0 0 1-76.4416 5.2224l-0.3584-5.2224V427.4688L276.48 427.52a38.4 38.4 0 0 1-5.2224-76.4416L276.48 350.72H512z m234.6496 256a38.4 38.4 0 0 1 5.1712 76.4416l-5.1712 0.3584h-102.4a38.4 38.4 0 0 1-5.2224-76.4416l5.2224-0.3584h102.4z m0-122.4192a38.4 38.4 0 0 1 5.1712 76.4416l-5.1712 0.3584h-102.4a38.4 38.4 0 0 1-5.2224-76.4416l5.2224-0.3584h102.4z m0-122.4704a38.4 38.4 0 0 1 5.1712 76.4928l-5.1712 0.3072h-102.4a38.4 38.4 0 0 1-5.2224-76.4416l5.2224-0.3584h102.4z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
@@ -0,0 +1 @@
 | 
			
		||||
<?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"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M680.3456 935.7312l-10.1888 0.256H522.24a38.4 38.4 0 0 1-5.2224-76.4416l5.2224-0.3584h147.968c36.352 0 68.7616-16.8448 89.9072-43.1616h49.5104c14.2336 0 28.0064-2.0992 40.96-6.144a192 192 0 0 1-170.24 125.8496zM531.2 115.2a330.9568 330.9568 0 0 1 330.752 319.0784l0.2048 11.8784 0.0512 17.408a137.216 137.216 0 0 0-52.6336-10.4448l-24.2176-0.0512v-6.912a254.1568 254.1568 0 0 0-243.1488-253.952l-11.008-0.2048h-38.4a254.1568 254.1568 0 0 0-253.952 243.1488l-0.2048 11.008v6.912l-24.2688 0.0512a137.216 137.216 0 0 0-52.6336 10.4448l0.1024-17.408a330.9568 330.9568 0 0 1 319.0784-330.752l11.8784-0.2048h38.4z" fill="#595959" /><path d="M262.4 453.12h-48.0256A137.5744 137.5744 0 0 0 76.8 590.7456v87.7056a137.5744 137.5744 0 0 0 137.6256 137.6256h47.9744a89.6 89.6 0 0 0 89.6-89.6V542.72a89.6 89.6 0 0 0-89.6-89.6z m-48.0256 76.8h48.0256a12.8 12.8 0 0 1 12.8 12.8v183.7568a12.8 12.8 0 0 1-12.8 12.8h-48.0256A60.8256 60.8256 0 0 1 153.6 678.4v-87.7056c0-33.5872 27.2384-60.8256 60.8256-60.8256zM761.6 453.12h48.0256a137.5744 137.5744 0 0 1 137.5744 137.6256v87.7056a137.5744 137.5744 0 0 1-137.6256 137.6256h-47.9744a89.6 89.6 0 0 1-89.6-89.6V542.72c0-49.4592 40.1408-89.6 89.6-89.6z m48.0256 76.8h-48.0256a12.8 12.8 0 0 0-12.8 12.8v183.7568c0 7.0656 5.7344 12.8 12.8 12.8h48.0256c33.536 0 60.7744-27.2384 60.7744-60.8256v-87.7056c0-33.5872-27.2384-60.8256-60.8256-60.8256z" fill="#595959" /></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										22
									
								
								code/web/admin_system/src/components/svg/svg.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,22 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-06 20:49:04
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-07 12:17:28
 | 
			
		||||
 * @FilePath: \admin_system\src\components\svg\svg.js
 | 
			
		||||
 * @Description: 导入svg图标
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
const context = require.context("./icons", false, /\.svg$/);
 | 
			
		||||
console.log(context);
 | 
			
		||||
 | 
			
		||||
function requireAll(context)
 | 
			
		||||
{
 | 
			
		||||
    return context.keys().map(context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const svgMap = requireAll(context);
 | 
			
		||||
 | 
			
		||||
console.log("导入svg");
 | 
			
		||||
console.log(svgMap);
 | 
			
		||||
							
								
								
									
										15
									
								
								code/web/admin_system/src/css/app.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-11-12 23:32:20
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2022-11-29 13:21:49
 | 
			
		||||
 * @FilePath: \hello-cli\src\assets\css\app.css
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
@import url("colors.css");
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
    background-color: #f4f5f7ff;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								code/web/admin_system/src/css/colors.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-11-12 23:22:59
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2022-12-05 01:07:18
 | 
			
		||||
 * @FilePath: \hello-cli\src\assets\css\colors.css
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
    --backupground-color: #f4f5f7ff;
 | 
			
		||||
    --btn-color-blue: #307dbe;
 | 
			
		||||
    --btn-color-yellow: #f7b24d;
 | 
			
		||||
    --btn-color-green: #5bad60;
 | 
			
		||||
    --btn-color-red: #e56651;
 | 
			
		||||
    --btn-font-color: #fff;
 | 
			
		||||
 | 
			
		||||
    --input-focus-color: #e56651;
 | 
			
		||||
 | 
			
		||||
    /* 标题栏背景色 */
 | 
			
		||||
    --banner-background-color: #1d74b2;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								code/web/admin_system/src/css/global.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-05 00:07:49
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2022-12-05 00:48:04
 | 
			
		||||
 * @FilePath: \hello-cli\src\assets\css\global.css
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
html,
 | 
			
		||||
body,
 | 
			
		||||
#app {
 | 
			
		||||
    /* padding: 0px; */
 | 
			
		||||
    margin: 0px;
 | 
			
		||||
    overflow: hidden;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										57
									
								
								code/web/admin_system/src/css/kane.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,57 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-10-12 08:49:14
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2022-11-12 23:34:06
 | 
			
		||||
 * @FilePath: \car_dealer\css\kane.css
 | 
			
		||||
 * @Description: vue学习用的样式表!
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
    --backupground-color: #f4f5f7ff;
 | 
			
		||||
    --btn-color-blue: #307dbe;
 | 
			
		||||
    --btn-color-yellow: #f7b24d;
 | 
			
		||||
    --btn-color-green: #5bad60;
 | 
			
		||||
    --btn-color-red: #e56651;
 | 
			
		||||
    --btn-font-color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#root,
 | 
			
		||||
#app {
 | 
			
		||||
    padding: 50px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.content {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
hr {
 | 
			
		||||
    background-color: steelblue;
 | 
			
		||||
    border: none;
 | 
			
		||||
    height: 3px;
 | 
			
		||||
    /* width: 100% */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* .test {
 | 
			
		||||
    width                   : 110vw;
 | 
			
		||||
    height                  : 100vh;
 | 
			
		||||
    border                  : 1px solid red;
 | 
			
		||||
    overflow                : auto;
 | 
			
		||||
} */
 | 
			
		||||
 | 
			
		||||
input[type="text"] {
 | 
			
		||||
    border: none;
 | 
			
		||||
    outline: solid 2px #e56651;
 | 
			
		||||
    /* font-size: 2rem; */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
label {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-size: 2rem;
 | 
			
		||||
    margin-top: 15px;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										379
									
								
								code/web/admin_system/src/css/normalize.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,379 @@
 | 
			
		||||
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
 | 
			
		||||
 | 
			
		||||
/* Document
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the line height in all browsers.
 | 
			
		||||
 * 2. Prevent adjustments of font size after orientation changes in iOS.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
  line-height: 1.15;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  -webkit-text-size-adjust: 100%;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Sections
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the margin in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Render the `main` element consistently in IE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
main {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Correct the font size and margin on `h1` elements within `section` and
 | 
			
		||||
 * `article` contexts in Chrome, Firefox, and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
h1 {
 | 
			
		||||
  font-size: 2em;
 | 
			
		||||
  margin: 0.67em 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Grouping content
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Add the correct box sizing in Firefox.
 | 
			
		||||
 * 2. Show the overflow in Edge and IE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
hr {
 | 
			
		||||
  box-sizing: content-box;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  height: 0;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  overflow: visible;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the inheritance and scaling of font size in all browsers.
 | 
			
		||||
 * 2. Correct the odd `em` font sizing in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
pre {
 | 
			
		||||
  font-family: monospace, monospace;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font-size: 1em;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Text-level semantics
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the gray background on active links in IE 10.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
a {
 | 
			
		||||
  background-color: transparent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Remove the bottom border in Chrome 57-
 | 
			
		||||
 * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
abbr[title] {
 | 
			
		||||
  border-bottom: none;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  text-decoration: underline;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  text-decoration: underline dotted;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct font weight in Chrome, Edge, and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
b,
 | 
			
		||||
strong {
 | 
			
		||||
  font-weight: bolder;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the inheritance and scaling of font size in all browsers.
 | 
			
		||||
 * 2. Correct the odd `em` font sizing in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
code,
 | 
			
		||||
kbd,
 | 
			
		||||
samp {
 | 
			
		||||
  font-family: monospace, monospace;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font-size: 1em;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct font size in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
small {
 | 
			
		||||
  font-size: 80%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Prevent `sub` and `sup` elements from affecting the line height in
 | 
			
		||||
 * all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
sub,
 | 
			
		||||
sup {
 | 
			
		||||
  font-size: 75%;
 | 
			
		||||
  line-height: 0;
 | 
			
		||||
  position: relative;
 | 
			
		||||
  vertical-align: baseline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub {
 | 
			
		||||
  bottom: -0.25em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sup {
 | 
			
		||||
  top: -0.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Embedded content
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the border on images inside links in IE 10.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
img {
 | 
			
		||||
  border-style: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Forms
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Change the font styles in all browsers.
 | 
			
		||||
 * 2. Remove the margin in Firefox and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
input,
 | 
			
		||||
optgroup,
 | 
			
		||||
select,
 | 
			
		||||
textarea {
 | 
			
		||||
  font-family: inherit;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font-size: 100%;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  line-height: 1.15;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Show the overflow in IE.
 | 
			
		||||
 * 1. Show the overflow in Edge.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
input {
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  overflow: visible;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the inheritance of text transform in Edge, Firefox, and IE.
 | 
			
		||||
 * 1. Remove the inheritance of text transform in Firefox.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
select {
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  text-transform: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Correct the inability to style clickable types in iOS and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
[type="button"],
 | 
			
		||||
[type="reset"],
 | 
			
		||||
[type="submit"] {
 | 
			
		||||
  -webkit-appearance: button;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the inner border and padding in Firefox.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button::-moz-focus-inner,
 | 
			
		||||
[type="button"]::-moz-focus-inner,
 | 
			
		||||
[type="reset"]::-moz-focus-inner,
 | 
			
		||||
[type="submit"]::-moz-focus-inner {
 | 
			
		||||
  border-style: none;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Restore the focus styles unset by the previous rule.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button:-moz-focusring,
 | 
			
		||||
[type="button"]:-moz-focusring,
 | 
			
		||||
[type="reset"]:-moz-focusring,
 | 
			
		||||
[type="submit"]:-moz-focusring {
 | 
			
		||||
  outline: 1px dotted ButtonText;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Correct the padding in Firefox.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
fieldset {
 | 
			
		||||
  padding: 0.35em 0.75em 0.625em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the text wrapping in Edge and IE.
 | 
			
		||||
 * 2. Correct the color inheritance from `fieldset` elements in IE.
 | 
			
		||||
 * 3. Remove the padding so developers are not caught out when they zero out
 | 
			
		||||
 *    `fieldset` elements in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
legend {
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  color: inherit;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
  display: table;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  max-width: 100%;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  /* 3 */
 | 
			
		||||
  white-space: normal;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct vertical alignment in Chrome, Firefox, and Opera.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
progress {
 | 
			
		||||
  vertical-align: baseline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the default vertical scrollbar in IE 10+.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
textarea {
 | 
			
		||||
  overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Add the correct box sizing in IE 10.
 | 
			
		||||
 * 2. Remove the padding in IE 10.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[type="checkbox"],
 | 
			
		||||
[type="radio"] {
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Correct the cursor style of increment and decrement buttons in Chrome.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[type="number"]::-webkit-inner-spin-button,
 | 
			
		||||
[type="number"]::-webkit-outer-spin-button {
 | 
			
		||||
  height: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the odd appearance in Chrome and Safari.
 | 
			
		||||
 * 2. Correct the outline style in Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[type="search"] {
 | 
			
		||||
  -webkit-appearance: textfield;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  outline-offset: -2px;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the inner padding in Chrome and Safari on macOS.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[type="search"]::-webkit-search-decoration {
 | 
			
		||||
  -webkit-appearance: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the inability to style clickable types in iOS and Safari.
 | 
			
		||||
 * 2. Change font properties to `inherit` in Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
::-webkit-file-upload-button {
 | 
			
		||||
  -webkit-appearance: button;
 | 
			
		||||
  /* 1 */
 | 
			
		||||
  font: inherit;
 | 
			
		||||
  /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Interactive
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Add the correct display in Edge, IE 10+, and Firefox.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
details {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Add the correct display in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
summary {
 | 
			
		||||
  display: list-item;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Misc
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct display in IE 10+.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
template {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct display in IE 10.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[hidden] {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								code/web/admin_system/src/css/root.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,20 @@
 | 
			
		||||
:root {
 | 
			
		||||
    font-size: 1em;
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
*,
 | 
			
		||||
*::before,
 | 
			
		||||
*::after {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    box-sizing: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
    font-family: Arial, Helvetica, sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pointer {
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										87
									
								
								code/web/admin_system/src/layout/Index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,87 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-04 11:05:44
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-26 10:29:03
 | 
			
		||||
 * @FilePath: \admin_system\src\layout\Index.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
  <el-container id="layout-container">
 | 
			
		||||
    <el-header id="layout-header">
 | 
			
		||||
      <LayoutHeader />
 | 
			
		||||
    </el-header>
 | 
			
		||||
    <el-container id="layout-container-down">
 | 
			
		||||
      <el-aside :width="asideWidth" id="layout-aside">
 | 
			
		||||
        <LayoutAside />
 | 
			
		||||
      </el-aside>
 | 
			
		||||
      <el-main id="layout-main">
 | 
			
		||||
        <LayoutMain />
 | 
			
		||||
      </el-main>
 | 
			
		||||
    </el-container>
 | 
			
		||||
  </el-container>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import LayoutAside from "./components/Aside.vue";
 | 
			
		||||
import LayoutHeader from "./components/Header.vue";
 | 
			
		||||
import LayoutMain from "./components/Main.vue";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "layoutPage",
 | 
			
		||||
  components: {
 | 
			
		||||
    LayoutAside,
 | 
			
		||||
    LayoutHeader,
 | 
			
		||||
    LayoutMain,
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    asideWidth()
 | 
			
		||||
    {
 | 
			
		||||
      const collapse = this.$store.state.app.asideBarCollapse;
 | 
			
		||||
 | 
			
		||||
      return collapse === true ? "65px" : "180px";
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
#layout-container {
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
  max-height: 100vh;
 | 
			
		||||
  /* overflow: hiddens; */
 | 
			
		||||
  /* min-width: 1280px; */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#layout-container-down {
 | 
			
		||||
  height: calc(100vh - 50px);
 | 
			
		||||
  max-height: calc(100vh - 50px);
 | 
			
		||||
  min-height: calc(100vh - 50px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#layout-aside {
 | 
			
		||||
  /* width: 175px; */
 | 
			
		||||
  background-color: #2f4156;
 | 
			
		||||
  overflow-x: hidden;
 | 
			
		||||
  /* height: calc(100vh - 50px);
 | 
			
		||||
  max-height: calc(100vh - 50px);
 | 
			
		||||
  min-height: calc(100vh - 50px); */
 | 
			
		||||
  height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#layout-header {
 | 
			
		||||
  height: 50px;
 | 
			
		||||
  padding: 0px;
 | 
			
		||||
  flex-grow: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#layout-main {
 | 
			
		||||
  padding: 0px;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  /* height: calc(100vh - 50px); */
 | 
			
		||||
  /* flex-grow: 1; */
 | 
			
		||||
  /* overflow: overlay; */
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										150
									
								
								code/web/admin_system/src/layout/components/Aside.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,150 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-04 11:30:33
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-28 16:01:49
 | 
			
		||||
 * @FilePath: \admin_system\src\layout\components\Aside.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.  223142 2f4156
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    <el-scrollbar class="wrapper">
 | 
			
		||||
        <el-menu id="side-bar" router :default-active="currentPath" background-color="#2f4156" text-color="#fff"
 | 
			
		||||
            active-text-color="#ffd04b" :collapse="asideCollapse">
 | 
			
		||||
            <template v-for="route in this.routers" :key="route.path">
 | 
			
		||||
                <template v-if="!route.hidden">
 | 
			
		||||
                    <template v-if="hasOnlyChild(route.children)">
 | 
			
		||||
                        <!-- 当只有一个子路由时,直接渲染子路由 -->
 | 
			
		||||
                        <el-menu-item :index="route.children[0].path" class="sidebar-submenu">
 | 
			
		||||
                            <component :is="route.children[0].meta.icon" class="icons">
 | 
			
		||||
                            </component>
 | 
			
		||||
                            <!-- <el-icon v-html="route.children[0].meta && route.children[0].meta.icon"></el-icon> -->
 | 
			
		||||
                            <template #title>{{ route.children[0].meta && route.children[0].meta.title }}</template>
 | 
			
		||||
                        </el-menu-item>
 | 
			
		||||
                    </template>
 | 
			
		||||
                    <template v-else>
 | 
			
		||||
                        <!-- 不是一个子路由时,有可能没有子路由,或者是多个子路由 -->
 | 
			
		||||
                        <el-sub-menu v-if="route.children && route.children.length" :index="route.path"
 | 
			
		||||
                            class="sidebar-submenu">
 | 
			
		||||
                            <template #title>
 | 
			
		||||
                                <component :is="route.meta.icon" class="icons"></component>
 | 
			
		||||
                                <span>{{ route.meta && route.meta.title }}</span>
 | 
			
		||||
                            </template>
 | 
			
		||||
                            <template v-for="child in route.children" :key="child.path">
 | 
			
		||||
                                <el-menu-item v-if="!child.hidden" :index="child.path" class="sidebar-item">
 | 
			
		||||
                                    <component :is="child.meta.icon" class="icons"></component>
 | 
			
		||||
                                    <template #title>{{ child.meta && child.meta.title }}</template>
 | 
			
		||||
                                </el-menu-item>
 | 
			
		||||
                            </template>
 | 
			
		||||
                        </el-sub-menu>
 | 
			
		||||
                    </template>
 | 
			
		||||
                </template>
 | 
			
		||||
            </template>
 | 
			
		||||
        </el-menu>
 | 
			
		||||
    </el-scrollbar>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { useRouter, useRoute } from "vue-router";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "LayoutAside",
 | 
			
		||||
    data()
 | 
			
		||||
    {
 | 
			
		||||
        return {
 | 
			
		||||
            routers: null,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
        //用于判断一个路由是否只有一项子路由
 | 
			
		||||
        hasOnlyChild: function (children)
 | 
			
		||||
        {
 | 
			
		||||
            //防御验证
 | 
			
		||||
            if (!children)
 | 
			
		||||
            {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //剔除掉hidden的路由
 | 
			
		||||
            const routes = children.filter((item) =>
 | 
			
		||||
            {
 | 
			
		||||
                return item.hidden ? false : true;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            if (routes.length === 1)
 | 
			
		||||
            {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return false;
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
    computed: {
 | 
			
		||||
        //获取当前的路由
 | 
			
		||||
        currentPath()
 | 
			
		||||
        {
 | 
			
		||||
            let path = useRoute().path;
 | 
			
		||||
 | 
			
		||||
            return path;
 | 
			
		||||
        },
 | 
			
		||||
        //获取导航栏是否折叠的标志
 | 
			
		||||
        asideCollapse()
 | 
			
		||||
        {
 | 
			
		||||
            return this.$store.state.app.asideBarCollapse;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    created()
 | 
			
		||||
    {
 | 
			
		||||
        this.routers = useRouter().options.routes;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
.el-menu {
 | 
			
		||||
    border-right: none;
 | 
			
		||||
    /* border-left: 5px solid #1d74b2; */
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
 | 
			
		||||
    -webkit-touch-callout: none;
 | 
			
		||||
    -moz-user-select: none;
 | 
			
		||||
    /*火狐*/
 | 
			
		||||
    -webkit-user-select: none;
 | 
			
		||||
    /*webkit浏览器*/
 | 
			
		||||
    -ms-user-select: none;
 | 
			
		||||
    /*IE10*/
 | 
			
		||||
    -khtml-user-select: none;
 | 
			
		||||
    /*早期浏览器*/
 | 
			
		||||
    user-select: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-active {
 | 
			
		||||
    background-color: #ffffff4f !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* .is-opened {
 | 
			
		||||
    border-left: 5px solid #1d74b2;
 | 
			
		||||
} */
 | 
			
		||||
 | 
			
		||||
.icons {
 | 
			
		||||
    width: 1em;
 | 
			
		||||
    height: 1em;
 | 
			
		||||
    margin-right: 8px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sidebar-submenu {
 | 
			
		||||
    background-color: #2f4156 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sidebar-item {
 | 
			
		||||
    background-color: #223142 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.wrapper {
 | 
			
		||||
    height: 100%;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										100
									
								
								code/web/admin_system/src/layout/components/Header.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,100 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-04 11:39:04
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-19 14:53:38
 | 
			
		||||
 * @FilePath: \admin_system\src\layout\components\Header.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="app_banner no_select">
 | 
			
		||||
    <span class="company_name">CPIC</span>
 | 
			
		||||
    <div class="version_div">
 | 
			
		||||
      <div>测试版</div>
 | 
			
		||||
      <div>3.6.7 x64 Build 202208301257</div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="buttons_div">
 | 
			
		||||
      <User
 | 
			
		||||
        style="width: 25px; height; 25px; margin-right: 8px; cursor:pointer;"
 | 
			
		||||
      />
 | 
			
		||||
      <SwitchButton
 | 
			
		||||
        style="width: 25px; height; 25px; margin-right: 8px; cursor:pointer;"
 | 
			
		||||
        @click="logout"
 | 
			
		||||
      />
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
//import { ElMessage } from "element-plus";
 | 
			
		||||
import { Logout } from "../../utils/api/info/account";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "AppBanner",
 | 
			
		||||
  data() {
 | 
			
		||||
    return {};
 | 
			
		||||
  },
 | 
			
		||||
  // created() {
 | 
			
		||||
  //   console.log("banner请求数据!");
 | 
			
		||||
  // },
 | 
			
		||||
  mounted() {
 | 
			
		||||
    //console.log("banner请求数据!");
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    logout() {
 | 
			
		||||
      this.$confirm("是否退出系统?", "请确认", {
 | 
			
		||||
        confirmButtonText: "是",
 | 
			
		||||
        cancelButtonText: "否",
 | 
			
		||||
        type: "warning",
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        Logout();
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped>
 | 
			
		||||
.app_banner {
 | 
			
		||||
  background-color: var(--banner-background-color);
 | 
			
		||||
  color: #fff;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: left;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  padding: 0px 15px 0px 15px;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  position: relative;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no_select {
 | 
			
		||||
  -webkit-touch-callout: none;
 | 
			
		||||
  -moz-user-select: none;
 | 
			
		||||
  /*火狐*/
 | 
			
		||||
  -webkit-user-select: none;
 | 
			
		||||
  /*webkit浏览器*/
 | 
			
		||||
  -ms-user-select: none;
 | 
			
		||||
  /*IE10*/
 | 
			
		||||
  -khtml-user-select: none;
 | 
			
		||||
  /*早期浏览器*/
 | 
			
		||||
  user-select: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.app_banner > * + * {
 | 
			
		||||
  margin-left: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.company_name {
 | 
			
		||||
  font-size: 2rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.version_div {
 | 
			
		||||
  font-size: 0.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.buttons_div {
 | 
			
		||||
  margin-left: auto;
 | 
			
		||||
  padding-top: 5px;
 | 
			
		||||
  /* border: 1px solid salmon; */
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										36
									
								
								code/web/admin_system/src/layout/components/Main.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,36 @@
 | 
			
		||||
 <!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-04 11:40:03
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-26 12:34:20
 | 
			
		||||
 * @FilePath: \admin_system\src\layout\components\Main.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    <!-- <div class="main-content"> -->
 | 
			
		||||
    <el-scrollbar>
 | 
			
		||||
        <div class="view-wrapper">
 | 
			
		||||
            <router-view />
 | 
			
		||||
        </div>
 | 
			
		||||
    </el-scrollbar>
 | 
			
		||||
    <!-- </div> -->
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
    name: "LayoutMain"
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
.el-scrollbar {
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    background-color: #ecf2f9;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.view-wrapper {
 | 
			
		||||
    padding: 15px;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										41
									
								
								code/web/admin_system/src/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,41 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-14 15:12:46
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-07 16:44:45
 | 
			
		||||
 * @FilePath: \admin_system\src\main.js
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
import { createApp } from 'vue';
 | 
			
		||||
import App from './App.vue';
 | 
			
		||||
import router from './router';
 | 
			
		||||
import store from './store';
 | 
			
		||||
//import "@/components/svg/svg";
 | 
			
		||||
 | 
			
		||||
import("./css/root.css");
 | 
			
		||||
import("./css/normalize.css");
 | 
			
		||||
import("./css/colors.css");
 | 
			
		||||
import("element-plus/dist/index.css");
 | 
			
		||||
 | 
			
		||||
// import "./assets/css/root.css";
 | 
			
		||||
// import "./assets/css/normalize.css";
 | 
			
		||||
// import "./assets/css/global.css";
 | 
			
		||||
// import "./assets/css/colors.css";
 | 
			
		||||
 | 
			
		||||
import ElementPlus from "element-plus";
 | 
			
		||||
import * as ElementPlusIconsVue from "@element-plus/icons-vue";
 | 
			
		||||
import SvgIcon from "./components/svg/SvgIcon";
 | 
			
		||||
 | 
			
		||||
const app = createApp(App);
 | 
			
		||||
 | 
			
		||||
app.component("SvgIcon", SvgIcon);
 | 
			
		||||
 | 
			
		||||
for (const [key, component] of Object.entries(ElementPlusIconsVue))
 | 
			
		||||
{
 | 
			
		||||
    app.component(key, component);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.use(ElementPlus);
 | 
			
		||||
app.use(store).use(router).mount('#app');
 | 
			
		||||
							
								
								
									
										206
									
								
								code/web/admin_system/src/router/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,206 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-14 15:12:46
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-28 16:00:58
 | 
			
		||||
 * @FilePath: \admin_system\src\router\index.js
 | 
			
		||||
 * @Description: 定义应用路由配置
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
import { createRouter, createWebHashHistory } from 'vue-router';
 | 
			
		||||
 | 
			
		||||
const routes = [
 | 
			
		||||
  //框架路由
 | 
			
		||||
  {
 | 
			
		||||
    path: "/",
 | 
			
		||||
    name: "Root",
 | 
			
		||||
    redirect: "Login", //默认路由指向登录页面
 | 
			
		||||
    hidden: true,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: "/login",
 | 
			
		||||
    name: "Login",
 | 
			
		||||
    component: () => import("../views/account/Login.vue"),
 | 
			
		||||
    hidden: true,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: "/home",
 | 
			
		||||
    name: "Home",
 | 
			
		||||
    hidden: true,
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: "控制台"
 | 
			
		||||
    },
 | 
			
		||||
    component: () => import("../layout/Index.vue"),
 | 
			
		||||
  },
 | 
			
		||||
  //侧边导航栏路由
 | 
			
		||||
  { //首页
 | 
			
		||||
    path: "/console",
 | 
			
		||||
    name: "Console",
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: "总览",
 | 
			
		||||
      icon: "house",
 | 
			
		||||
    },
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: "/desktop",
 | 
			
		||||
        name: "DeskTop",
 | 
			
		||||
        meta: {
 | 
			
		||||
          title: "工作台",
 | 
			
		||||
          icon: "house",
 | 
			
		||||
        },
 | 
			
		||||
        component: () => import("../views/overview/OverView.vue"),
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
    component: () => import("../layout/Index.vue"),
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    //需求管理
 | 
			
		||||
    path: "/requirement",
 | 
			
		||||
    name: "Requirement",
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: "需求管理",
 | 
			
		||||
      icon: "Document",
 | 
			
		||||
    },
 | 
			
		||||
    component: () => import("../layout/Index.vue"),
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: "/requirement-manager",
 | 
			
		||||
        name: "RequirementManager",
 | 
			
		||||
        meta: {
 | 
			
		||||
          title: "需求管理",
 | 
			
		||||
          icon: "Document",
 | 
			
		||||
        },
 | 
			
		||||
        component: () => import("../views/requirement/RequirementManager.vue"),
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: "/requirement-editing",
 | 
			
		||||
        name: "RequirementEditing",
 | 
			
		||||
        hidden: true,
 | 
			
		||||
        meta: {
 | 
			
		||||
          title: "需求管理",
 | 
			
		||||
          icon: "edit",
 | 
			
		||||
        },
 | 
			
		||||
        component: () => import("../views/requirement/RequirementEditing.vue"),
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
  },
 | 
			
		||||
  {//信息管理
 | 
			
		||||
    path: "/news",
 | 
			
		||||
    name: "News",
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: "信息管理",
 | 
			
		||||
      icon: "edit",
 | 
			
		||||
    },
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: "/staffInfo",
 | 
			
		||||
        name: "StaffInfo",
 | 
			
		||||
        meta: {
 | 
			
		||||
          title: "人员信息",
 | 
			
		||||
          icon: "edit",
 | 
			
		||||
        },
 | 
			
		||||
        component: () => import("../views/info/StaffInfo.vue"),
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: "/editStuffInfo",
 | 
			
		||||
        name: "EditStaffInfo",
 | 
			
		||||
        hidden: true,
 | 
			
		||||
        meta: {
 | 
			
		||||
          title: "编辑人员信息",
 | 
			
		||||
        },
 | 
			
		||||
        component: () => import("../views/info/EditStaffInfo.vue"),
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: "/newsIndex",
 | 
			
		||||
        name: "NewsIndex",
 | 
			
		||||
        meta: {
 | 
			
		||||
          title: "信息列表",
 | 
			
		||||
          icon: "edit",
 | 
			
		||||
        },
 | 
			
		||||
        component: () => import("../views/news/News.vue"),
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: "/newsedit",
 | 
			
		||||
        name: "NewsEdit",
 | 
			
		||||
        meta: {
 | 
			
		||||
          title: "信息编辑",
 | 
			
		||||
          icon: "edit",
 | 
			
		||||
        },
 | 
			
		||||
        component: () => import("../views/news/NewsEdit.vue"),
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
    component: () => import("../layout/Index.vue"),
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: "/network",
 | 
			
		||||
    name: "NetworkManager",
 | 
			
		||||
    meta: {
 | 
			
		||||
      title: "网络管理",
 | 
			
		||||
      icon: "User",
 | 
			
		||||
    },
 | 
			
		||||
    component: () => import("../layout/Index.vue"),
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: "/network-point-manager",
 | 
			
		||||
        name: "NetworkPointManager",
 | 
			
		||||
        meta: {
 | 
			
		||||
          title: "网络点管理",
 | 
			
		||||
          icon: "Monitor",
 | 
			
		||||
        },
 | 
			
		||||
        component: () => import("../views/network/NetworkPoint/NetworkPoint.vue"),
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: "/network-point-edit",
 | 
			
		||||
        name: "NetworkPointEdit",
 | 
			
		||||
        hidden: true,
 | 
			
		||||
        component: () => import("../views/network/NetworkPoint/EditNetworkPoint.vue"),
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: "/switch-manager",
 | 
			
		||||
        name: "SwitchManager",
 | 
			
		||||
        meta: {
 | 
			
		||||
          title: "交换机管理",
 | 
			
		||||
          icon: "switch",
 | 
			
		||||
        },
 | 
			
		||||
        component: () => import("../views/network/switch/SwitchManager.vue"),
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const router = createRouter({
 | 
			
		||||
  history: createWebHashHistory(),
 | 
			
		||||
  routes
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
//前置路由守卫
 | 
			
		||||
router.beforeEach((to) =>
 | 
			
		||||
{
 | 
			
		||||
  const token = window.localStorage.getItem("token");
 | 
			
		||||
 | 
			
		||||
  //先检查token
 | 
			
		||||
  if (!token)
 | 
			
		||||
  {
 | 
			
		||||
    //如果token不存在,判断路由是否走向login,如果不是则指向login
 | 
			
		||||
    //走向login则不干预
 | 
			
		||||
    if (to.name !== "Login")
 | 
			
		||||
    {
 | 
			
		||||
      return {
 | 
			
		||||
        name: "Login",
 | 
			
		||||
      };
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //修改默认打开的页面,跳向工作台
 | 
			
		||||
  if (to.name === "Home")
 | 
			
		||||
  {
 | 
			
		||||
    console.log("跳向工作台");
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
      name: "DeskTop",
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default router;
 | 
			
		||||
							
								
								
									
										20
									
								
								code/web/admin_system/src/store/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,20 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-14 15:12:46
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-11 14:20:04
 | 
			
		||||
 * @FilePath: \admin_system\src\store\index.js
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
import { createStore } from 'vuex';
 | 
			
		||||
import app from "./modules/app";
 | 
			
		||||
 | 
			
		||||
const store = createStore({
 | 
			
		||||
  modules: {
 | 
			
		||||
    app,
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default store;
 | 
			
		||||
							
								
								
									
										39
									
								
								code/web/admin_system/src/store/modules/app.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,39 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-07 22:25:43
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-11 09:44:46
 | 
			
		||||
 * @FilePath: \admin_system\src\store\modules\app.js
 | 
			
		||||
 * @Description: vuex中存放全局数据的模块
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
const state = {
 | 
			
		||||
    count: 1001,
 | 
			
		||||
    asideBarCollapse: false, //侧边栏折叠标志位
 | 
			
		||||
    userInfo: null, //用户信息和token
 | 
			
		||||
};
 | 
			
		||||
const getters = {};
 | 
			
		||||
const mutations = {
 | 
			
		||||
    SET_COUNT(state, newCount)
 | 
			
		||||
    {
 | 
			
		||||
        state.count = newCount;
 | 
			
		||||
    },
 | 
			
		||||
    SET_ASIDE_COLLAPSE(state)
 | 
			
		||||
    {
 | 
			
		||||
        state.asideBarCollapse = !state.asideBarCollapse;
 | 
			
		||||
    },
 | 
			
		||||
    SET_USERINFO(state, userInfo)
 | 
			
		||||
    {
 | 
			
		||||
        state.userInfo = userInfo;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
const actions = {};
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    namespaced: true,
 | 
			
		||||
    state,
 | 
			
		||||
    getters,
 | 
			
		||||
    mutations,
 | 
			
		||||
    actions,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										29
									
								
								code/web/admin_system/src/utils/api/common.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-22 17:16:53
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2022-12-22 20:48:03
 | 
			
		||||
 * @FilePath: \admin_system\src\utils\api\common.js
 | 
			
		||||
 * @Description: 通用请求
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
//import axios from "axios";
 | 
			
		||||
import instance from "@utils/request";
 | 
			
		||||
 | 
			
		||||
const URL_GET_VALIDATE_CODE = "";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 获取验证码
 | 
			
		||||
 */
 | 
			
		||||
export function GetValidate(data)
 | 
			
		||||
{
 | 
			
		||||
    return instance.request(
 | 
			
		||||
        {
 | 
			
		||||
            method: "post",
 | 
			
		||||
            url: URL_GET_VALIDATE_CODE,
 | 
			
		||||
            data,
 | 
			
		||||
        }
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								code/web/admin_system/src/utils/api/config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,14 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-23 11:10:23
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2022-12-23 11:11:58
 | 
			
		||||
 * @FilePath: \admin_system\src\utils\api\config.js
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
export const API_URL = {
 | 
			
		||||
    URL_LOGIN: process.env.VUE_APP_API_URL_LOGIN,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										45
									
								
								code/web/admin_system/src/utils/api/info/account.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,45 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-22 09:10:20
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-25 00:29:54
 | 
			
		||||
 * @FilePath: \admin_system\src\utils\api\info\account.js
 | 
			
		||||
 * @Description:
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved.
 | 
			
		||||
 */
 | 
			
		||||
import instance from "@/utils/api/request";
 | 
			
		||||
import { API_URL } from "@/utils/api/config"; //所有API的地址
 | 
			
		||||
import router from "../../../router/index";
 | 
			
		||||
import store from "../../../store/index";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 登录请求函数
 | 
			
		||||
 * @param {*} userInfo 
 | 
			
		||||
 * @returns 返回promise对象
 | 
			
		||||
 */
 | 
			
		||||
export function Login(userInfo)
 | 
			
		||||
{
 | 
			
		||||
    //console.log("登录请求地址:", API_URL.URL_LOGIN);
 | 
			
		||||
    //const url = "http://localhost:8080/admin-system/account/p13_account_check";
 | 
			
		||||
    return instance.request(
 | 
			
		||||
        {
 | 
			
		||||
            method: "post",
 | 
			
		||||
            url: API_URL.URL_LOGIN,
 | 
			
		||||
            data: userInfo,
 | 
			
		||||
        }
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 退出登录
 | 
			
		||||
 */
 | 
			
		||||
export function Logout()
 | 
			
		||||
{
 | 
			
		||||
    console.log(store);
 | 
			
		||||
 | 
			
		||||
    window.localStorage.removeItem("token");
 | 
			
		||||
    window.localStorage.removeItem("user_info");
 | 
			
		||||
 | 
			
		||||
    router.replace("/login");
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								code/web/admin_system/src/utils/api/request.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,95 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-22 17:18:10
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-12 17:47:39
 | 
			
		||||
 * @FilePath: \admin_system\src\utils\api\request.js
 | 
			
		||||
 * @Description: 配置axios拦截器
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
import axios from "axios";
 | 
			
		||||
import store from "../../store/index";
 | 
			
		||||
import { ElMessageBox } from "element-plus";
 | 
			
		||||
import router from "@/router";
 | 
			
		||||
 | 
			
		||||
const service = axios.create(
 | 
			
		||||
    {
 | 
			
		||||
        baseURL: "",
 | 
			
		||||
        timeout: 5000,
 | 
			
		||||
    }
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 加上请求拦截器
 | 
			
		||||
 */
 | 
			
		||||
service.interceptors.request.use(
 | 
			
		||||
    function (config)
 | 
			
		||||
    {
 | 
			
		||||
        //axios拦截器请求,在请求的header加上用户名和token
 | 
			
		||||
        if (store.state.app.userInfo)
 | 
			
		||||
        {
 | 
			
		||||
            //如果userInfo存在,则加上用户名和token
 | 
			
		||||
            const username = store.state.app.userInfo.user_info.p13uid;
 | 
			
		||||
            const token = store.state.app.userInfo.token;
 | 
			
		||||
 | 
			
		||||
            config.headers["token"] = token;
 | 
			
		||||
            config.headers["username"] = username;
 | 
			
		||||
 | 
			
		||||
            console.log("拦截器,加上username和token!", username, token);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            console.log("拦截器,userinfo为空!");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return config;
 | 
			
		||||
    },
 | 
			
		||||
    function (error)
 | 
			
		||||
    {
 | 
			
		||||
        return Promise.reject(error);
 | 
			
		||||
    }
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
//响应拦截器
 | 
			
		||||
service.interceptors.response.use(
 | 
			
		||||
    function (response)
 | 
			
		||||
    {
 | 
			
		||||
        //200
 | 
			
		||||
        if (response.status === 200)
 | 
			
		||||
        {
 | 
			
		||||
            console.log("响应拦截器,响应代码", response.status);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //401,用户token失效,跳转到
 | 
			
		||||
        if (response.state === 401)
 | 
			
		||||
        {
 | 
			
		||||
            ElMessageBox.confirm(
 | 
			
		||||
                "用户登录超时,请重新登录",
 | 
			
		||||
                "警告",
 | 
			
		||||
                {
 | 
			
		||||
                    confirmButtonText: "是",
 | 
			
		||||
                    cancelButtonText: "否",
 | 
			
		||||
                    type: "warning",
 | 
			
		||||
                },
 | 
			
		||||
            ).then(() =>
 | 
			
		||||
            {
 | 
			
		||||
                router.replace("/login");
 | 
			
		||||
            }).catch(() =>
 | 
			
		||||
            {
 | 
			
		||||
                router.replace("/login");
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return response;
 | 
			
		||||
    },
 | 
			
		||||
    function (error)
 | 
			
		||||
    {
 | 
			
		||||
        console.log("响应拦截器,异常信息:", error);
 | 
			
		||||
 | 
			
		||||
        return Promise.reject(error);
 | 
			
		||||
    }
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export default service;
 | 
			
		||||
							
								
								
									
										259
									
								
								code/web/admin_system/src/views/account/Login.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,259 @@
 | 
			
		||||
<!-- eslint-disable no-unused-vars -->
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-14 15:23:54
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-18 22:24:21
 | 
			
		||||
 * @FilePath: \admin_system\src\views\account\Login.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
  <div id="login">
 | 
			
		||||
    <div class="form-warp">
 | 
			
		||||
      <ul class="menu-tab">
 | 
			
		||||
        <li :class="{ 'current': current_menu === item.type }" @click="onToggleMenu(item.type)" v-for="item in tab_menu"
 | 
			
		||||
          :key="item.type">{{ item.label }}
 | 
			
		||||
        </li>
 | 
			
		||||
      </ul>
 | 
			
		||||
      <!-- <el-form ref="form" :model="form"> -->
 | 
			
		||||
      <el-form ref="form">
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <label class="form-label">用户名</label>
 | 
			
		||||
          <el-input type="text" v-model.lazy.trim="loginForm.username"></el-input>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <label class="form-label">密码</label>
 | 
			
		||||
          <el-input type="password" v-model.lazy.trim="loginForm.password"></el-input>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item v-show="current_menu === tab_menu[1].type">
 | 
			
		||||
          <label class="form-label">确认密码</label>
 | 
			
		||||
          <el-input type="password" disabled v-model.lazy.trim="loginForm.confirm_password"></el-input>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <label class="form-label">验证码</label>
 | 
			
		||||
          <el-row :gutter="10">
 | 
			
		||||
            <el-col :span="14">
 | 
			
		||||
              <el-input type="text" disabled></el-input>
 | 
			
		||||
            </el-col>
 | 
			
		||||
            <el-col :span="10">
 | 
			
		||||
              <el-button type="danger" disabled class="el-button-block" @click="getValidateCode()">获取验证码</el-button>
 | 
			
		||||
            </el-col>
 | 
			
		||||
          </el-row>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <el-button type="primary" class="el-button-block" @click="login" :disabled="submit_btn_disable"
 | 
			
		||||
            :loading="submit_btn_loading">
 | 
			
		||||
            {{ current_menu === "login" ? "登录" : "注册" }}
 | 
			
		||||
          </el-button>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      </el-form>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { Login } from "@/utils/api/info/account";
 | 
			
		||||
import { ElMessage } from "element-plus";
 | 
			
		||||
import router from "../../router/index";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "loginPage",
 | 
			
		||||
  data()
 | 
			
		||||
  {
 | 
			
		||||
    return {
 | 
			
		||||
      loginForm: {
 | 
			
		||||
        username: "",
 | 
			
		||||
        password: "",
 | 
			
		||||
        confirm_password: "",
 | 
			
		||||
        validateCode: "",
 | 
			
		||||
      },
 | 
			
		||||
      tab_menu: [
 | 
			
		||||
        { type: "login", label: "登录" },
 | 
			
		||||
        { type: "regiester", label: "注册" },
 | 
			
		||||
      ],
 | 
			
		||||
      current_menu: "",
 | 
			
		||||
      staffInfo: null,
 | 
			
		||||
      submit_btn_disable: false,
 | 
			
		||||
      submit_btn_loading: false,
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    onToggleMenu(type)
 | 
			
		||||
    {
 | 
			
		||||
      this.current_menu = type;
 | 
			
		||||
      console.log(process.env.VUE_APP_API_URL_LOGIN);
 | 
			
		||||
    },
 | 
			
		||||
    getValidateCode()
 | 
			
		||||
    {
 | 
			
		||||
      ElMessage({
 | 
			
		||||
        message: "测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字",
 | 
			
		||||
        center: true,
 | 
			
		||||
        type: "error",
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * 登录
 | 
			
		||||
     */
 | 
			
		||||
    login()
 | 
			
		||||
    {
 | 
			
		||||
      if (this.loginForm.username.length === 0 || this.loginForm.password === 0)
 | 
			
		||||
      {
 | 
			
		||||
        ElMessage({
 | 
			
		||||
          message: "请填写您的P13账号和密码!",
 | 
			
		||||
          type: "error",
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this.submit_btn_disable = true;
 | 
			
		||||
      this.submit_btn_loading = true;
 | 
			
		||||
 | 
			
		||||
      const userInfo = {
 | 
			
		||||
        p13account: this.loginForm.username,
 | 
			
		||||
        password: this.loginForm.password,
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      Login(userInfo)
 | 
			
		||||
        .then((response) =>
 | 
			
		||||
        {
 | 
			
		||||
          //成功获取到返回值时的响应函数,要判断返回值的成功标志
 | 
			
		||||
          //验证成功,将获取到的token和用户信息保存到vuex和localStoreage
 | 
			
		||||
          //然后router.push,进行路由跳转到控制台
 | 
			
		||||
          const data = response.data;
 | 
			
		||||
 | 
			
		||||
          //判断是否成功,显示提示信息
 | 
			
		||||
          if (data.success === true)
 | 
			
		||||
          {
 | 
			
		||||
            ElMessage({
 | 
			
		||||
              message: data.message,
 | 
			
		||||
              type: "success",
 | 
			
		||||
              center: true,
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            this.staffInfo = data.staffInfo;
 | 
			
		||||
 | 
			
		||||
            //保存用户信息和token
 | 
			
		||||
            this.saveUserInfo(data);
 | 
			
		||||
 | 
			
		||||
            //验证成功,跳转路由
 | 
			
		||||
            router.push("/home");
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            //验证失败
 | 
			
		||||
            ElMessage({
 | 
			
		||||
              message: data.message,
 | 
			
		||||
              type: "error",
 | 
			
		||||
              center: true,
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            this.submit_btn_disable = false;
 | 
			
		||||
            this.submit_btn_loading = false;
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
        .catch((error) =>
 | 
			
		||||
        {
 | 
			
		||||
          //没有获取到响应数据
 | 
			
		||||
          console.log(error);
 | 
			
		||||
 | 
			
		||||
          ElMessage({
 | 
			
		||||
            message: error.message,
 | 
			
		||||
            type: "error",
 | 
			
		||||
            center: true,
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          this.submit_btn_disable = false;
 | 
			
		||||
          this.submit_btn_loading = false;
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
    saveUserInfo(userInfo) //将获取到的用户信息和token保存到vuex和localStorage
 | 
			
		||||
    {
 | 
			
		||||
      //保存到vuex
 | 
			
		||||
      this.$store.commit("app/SET_USERINFO", userInfo);
 | 
			
		||||
 | 
			
		||||
      //保存到localStorage
 | 
			
		||||
      const token = userInfo.token;
 | 
			
		||||
      const userInfoJson = JSON.stringify(userInfo);
 | 
			
		||||
 | 
			
		||||
      window.localStorage.setItem("token", token);
 | 
			
		||||
      window.localStorage.setItem("user_info", userInfoJson);
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  created()
 | 
			
		||||
  {
 | 
			
		||||
    //初始化菜单选项
 | 
			
		||||
    this.current_menu = this.tab_menu[0].type;
 | 
			
		||||
  },
 | 
			
		||||
  mounted()
 | 
			
		||||
  {
 | 
			
		||||
    //清理状态
 | 
			
		||||
    this.$store.state.app.userInfo = null;
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
#login {
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
  background-color: #344a5f;
 | 
			
		||||
  padding-top: 50px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.form-warp {
 | 
			
		||||
  width: 320px;
 | 
			
		||||
  padding: 30px;
 | 
			
		||||
  margin: auto;
 | 
			
		||||
  background-color: #ffffff10;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*.menu-tab {
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  margin-bottom: 15px;
 | 
			
		||||
 | 
			
		||||
  li {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    padding: 10px 24px;
 | 
			
		||||
    margin: 0 10px;
 | 
			
		||||
    color: #fff;
 | 
			
		||||
    font-size: 16px;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
 | 
			
		||||
    &.current {
 | 
			
		||||
      background-color: rgba(0, 0, 0, 0.1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}*/
 | 
			
		||||
.menu-tab {
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  margin-bottom: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.menu-tab li {
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  padding: 10px 24px;
 | 
			
		||||
  margin: 0 10px;
 | 
			
		||||
  color: #fff;
 | 
			
		||||
  font-size: 14px;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.menu-tab .current {
 | 
			
		||||
  background-color: rgba(0, 0, 0, 0.1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.form-label {
 | 
			
		||||
  display: block;
 | 
			
		||||
  color: #fff;
 | 
			
		||||
  font-size: 14px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.el-button-block {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										27
									
								
								code/web/admin_system/src/views/info/EditStaffInfo.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,27 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-24 23:25:16
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-24 23:57:11
 | 
			
		||||
 * @FilePath: \admin_system\src\views\info\EditStaffInfo.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
  <div></div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
  name: "EditStaffInfo",
 | 
			
		||||
  data: function ()
 | 
			
		||||
  {
 | 
			
		||||
    return {};
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										189
									
								
								code/web/admin_system/src/views/info/StaffInfo.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,189 @@
 | 
			
		||||
/* eslint-disable */
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-12 14:43:46
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-26 23:18:49
 | 
			
		||||
 * @FilePath: \admin_system\src\views\info\StaffInfo.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="query_box">
 | 
			
		||||
        <el-form inline width="600px">
 | 
			
		||||
            <el-row :gutter="10" class="el-row">
 | 
			
		||||
                <el-col :span="8">
 | 
			
		||||
                    <el-input v-model="query_param.staff_code" placeholder="请输入P09工号或P13账号"></el-input>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="4">
 | 
			
		||||
                    <el-button type="danger">查询</el-button>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="12"></el-col>
 | 
			
		||||
            </el-row>
 | 
			
		||||
        </el-form>
 | 
			
		||||
        <el-table ref="table" :data="table_data" border width="100%" stripe>
 | 
			
		||||
            <el-table-column type="selection" min-width="30" align="center"></el-table-column>
 | 
			
		||||
            <el-table-column min-width="200" label="员工名称" align="left" fixed="left">
 | 
			
		||||
                <template #default="rowdata">
 | 
			
		||||
                    <span @click="onShowStaffInfo(rowdata.row)" style="cursor: pointer; display: block; height: 100%">{{
 | 
			
		||||
                        rowdata.row.staff_name
 | 
			
		||||
                    }}</span>
 | 
			
		||||
                </template>
 | 
			
		||||
            </el-table-column>
 | 
			
		||||
            <el-table-column prop="staff_code" min-width="100" label="工号" align="left"></el-table-column>
 | 
			
		||||
            <el-table-column prop="p13uid" min-width="200" label="P13账号" align="left"></el-table-column>
 | 
			
		||||
            <el-table-column label="操作" min-width="200" align="center" fixed="right">
 | 
			
		||||
                <template #default>
 | 
			
		||||
                    <el-button type="warning">编辑</el-button>
 | 
			
		||||
                    <el-button type="danger">删除</el-button>
 | 
			
		||||
                </template>
 | 
			
		||||
            </el-table-column>
 | 
			
		||||
        </el-table>
 | 
			
		||||
        <el-row :gutter="10" width="100%">
 | 
			
		||||
            <el-col :span="18">
 | 
			
		||||
                <el-pagination class="pull_left" @current-change="onCurrentPageIndexChange"
 | 
			
		||||
                    @size-change="onTablePageSizeChange" size="small" background :current-page="this.table_current_page"
 | 
			
		||||
                    :page-size="10" :page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, nex, jumper"
 | 
			
		||||
                    :total="table_data.length">
 | 
			
		||||
                </el-pagination>
 | 
			
		||||
            </el-col>
 | 
			
		||||
        </el-row>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
/* eslint-disable no-unused-vars*/
 | 
			
		||||
export default {
 | 
			
		||||
    name: "staff-info",
 | 
			
		||||
    data()
 | 
			
		||||
    {
 | 
			
		||||
        return {
 | 
			
		||||
            query_param: {
 | 
			
		||||
                staff_code: "",
 | 
			
		||||
            },
 | 
			
		||||
            table_current_page: 1,
 | 
			
		||||
            table_data: [
 | 
			
		||||
                {
 | 
			
		||||
                    staff_name: "王炜",
 | 
			
		||||
                    staff_code: "588",
 | 
			
		||||
                    p13uid: "wangwei-202",
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    staff_name: "王炜",
 | 
			
		||||
                    staff_code: "588",
 | 
			
		||||
                    p13uid: "wangwei-202",
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    staff_name: "王炜",
 | 
			
		||||
                    staff_code: "588",
 | 
			
		||||
                    p13uid: "wangwei-202",
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    staff_name: "王炜",
 | 
			
		||||
                    staff_code: "588",
 | 
			
		||||
                    p13uid: "wangwei-202",
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    staff_name: "王炜",
 | 
			
		||||
                    staff_code: "588",
 | 
			
		||||
                    p13uid: "wangwei-202",
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
        onTableEdit(row) { },
 | 
			
		||||
        /**
 | 
			
		||||
         * 根据表格行index返回样式,实现斑马纹
 | 
			
		||||
         * @param row
 | 
			
		||||
         * @param rowIndex
 | 
			
		||||
         * @return 返回的样式名称
 | 
			
		||||
         */
 | 
			
		||||
        tabRowClassName(row, rowIndex)
 | 
			
		||||
        {
 | 
			
		||||
            let index = rowIndex + 1;
 | 
			
		||||
            if (index % 2 == 0)
 | 
			
		||||
            {
 | 
			
		||||
                return "warning-row";
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        /**
 | 
			
		||||
         * 点击表格 用户名称 时的消息处理函数
 | 
			
		||||
         * @param {*} staff
 | 
			
		||||
         */
 | 
			
		||||
        onShowStaffInfo(staff)
 | 
			
		||||
        {
 | 
			
		||||
            console.log("点击名称", staff);
 | 
			
		||||
        },
 | 
			
		||||
        /**
 | 
			
		||||
         * 表格页显示数量变更时消息处理函数
 | 
			
		||||
         */
 | 
			
		||||
        onTablePageSizeChange() { },
 | 
			
		||||
        /**
 | 
			
		||||
         * 用户变更当前页时消息处理函数
 | 
			
		||||
         */
 | 
			
		||||
        onCurrentPageIndexChange() { },
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
.el-row {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.el-label {
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.query_box {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    padding: 15px;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.query_box>*+* {
 | 
			
		||||
    margin-top: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.info_box {
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    padding: 15px;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.el-table .warning-row {
 | 
			
		||||
    background-color: #f3f9ff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.query_box:hover,
 | 
			
		||||
.info_box:hover {
 | 
			
		||||
    box-shadow: 0px 0px 20px -10px rgb(14 18 22 / 25%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.cell {
 | 
			
		||||
    height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pull_left {
 | 
			
		||||
    margin-left: 15px;
 | 
			
		||||
    margin-right: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pull_right {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pull_right:last-child {
 | 
			
		||||
    margin-right: 15px;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
@@ -0,0 +1,37 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-25 11:26:11
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-25 11:26:13
 | 
			
		||||
 * @FilePath: \admin_system\src\views\network\NetworkPoint copy.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-25 11:24:47
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-25 11:24:48
 | 
			
		||||
 * @FilePath: \admin_system\src\views\network\NetworkPoint.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
  <div>网络点位信息修改</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
  name: "network-point-editor",
 | 
			
		||||
  data()
 | 
			
		||||
  {
 | 
			
		||||
    return {};
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -0,0 +1,27 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-25 11:24:47
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-25 11:34:07
 | 
			
		||||
 * @FilePath: \admin_system\src\views\network\NetworkPoint.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    <div>网络点位管理</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
    name: "network-point-management",
 | 
			
		||||
    data()
 | 
			
		||||
    {
 | 
			
		||||
        return {};
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -0,0 +1,27 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-25 14:48:53
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-25 14:48:54
 | 
			
		||||
 * @FilePath: \admin_system\src\views\network\switch\SwitchManager.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    交换机管理
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
    name: "switch-manager",
 | 
			
		||||
    data()
 | 
			
		||||
    {
 | 
			
		||||
        return {};
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										23
									
								
								code/web/admin_system/src/views/news/News.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-06 15:26:44
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-06 15:26:46
 | 
			
		||||
 * @FilePath: \admin_system\src\views\news\News.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    信息管理
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
    name: "NewsPage"
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										52
									
								
								code/web/admin_system/src/views/news/NewsEdit.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,52 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-06 19:05:53
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-08 19:26:26
 | 
			
		||||
 * @FilePath: \admin_system\src\views\news\NewsEdit.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    信息编辑:{{ getCount }}
 | 
			
		||||
    <br>
 | 
			
		||||
    <el-button type="danger" @click="this.add">计数加一</el-button>
 | 
			
		||||
    <SvgIcon icon="house"></SvgIcon>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
//import { ElMessage } from 'element-plus';
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: "NewsEdit",
 | 
			
		||||
    data()
 | 
			
		||||
    {
 | 
			
		||||
        return {
 | 
			
		||||
            store: null,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
    computed: {
 | 
			
		||||
        getCount()
 | 
			
		||||
        {
 | 
			
		||||
            return this.$store.state.app.count;
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
        add()
 | 
			
		||||
        {
 | 
			
		||||
            let count = this.store.state.app.count + 1;
 | 
			
		||||
 | 
			
		||||
            this.store.commit("app/SET_COUNT", count);
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    created()
 | 
			
		||||
    {
 | 
			
		||||
        this.store = this.$store;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										33
									
								
								code/web/admin_system/src/views/news/NewsTest.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,33 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-06 19:23:12
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-06 19:23:29
 | 
			
		||||
 * @FilePath: \admin_system\src\views\news\NewsTest.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-06 15:26:44
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-06 15:26:46
 | 
			
		||||
 * @FilePath: \admin_system\src\views\news\News.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    信息管理
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
    name: "NewsPage"
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										67
									
								
								code/web/admin_system/src/views/overview/OverView.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,67 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-06 15:30:12
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-28 09:44:31
 | 
			
		||||
 * @FilePath: \admin_system\src\views\overview\OverView.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    <el-form :inline="true" label-width="5em" class="query_form">
 | 
			
		||||
        <el-row :gutter="10">
 | 
			
		||||
            <el-col :span="7">
 | 
			
		||||
                <el-form-item label="需求编号">
 | 
			
		||||
                    <el-input style="width:100%;"></el-input>
 | 
			
		||||
                </el-form-item>
 | 
			
		||||
            </el-col>
 | 
			
		||||
            <el-col :span="7">
 | 
			
		||||
                <el-form-item label="标题">
 | 
			
		||||
                    <el-input style="width:100%;"></el-input>
 | 
			
		||||
                </el-form-item>
 | 
			
		||||
            </el-col>
 | 
			
		||||
            <el-col :span="7">
 | 
			
		||||
                <el-form-item label="提交人">
 | 
			
		||||
                    <el-input style="width:100%;"></el-input>
 | 
			
		||||
                </el-form-item>
 | 
			
		||||
            </el-col>
 | 
			
		||||
            <el-col :span="3"></el-col>
 | 
			
		||||
        </el-row>
 | 
			
		||||
        <el-row :gutter="10">
 | 
			
		||||
            <el-col :span="7">
 | 
			
		||||
                <el-form-item label="状态">
 | 
			
		||||
                    <el-select style="width:100%;">
 | 
			
		||||
                        <el-option key="部门审批" value="部门审批"></el-option>
 | 
			
		||||
                        <el-option key="需求分析" value="需求分析">需求分析</el-option>
 | 
			
		||||
                        <el-option key="技术开发" value="技术开发">技术开发</el-option>
 | 
			
		||||
                        <el-option key="被退回" value="被退回"></el-option>
 | 
			
		||||
                    </el-select>
 | 
			
		||||
                </el-form-item>
 | 
			
		||||
            </el-col>
 | 
			
		||||
            <el-col :span="7">
 | 
			
		||||
                <el-form-item label="提交日期">
 | 
			
		||||
                    <el-date-picker style="width:100%;"></el-date-picker>
 | 
			
		||||
                </el-form-item>
 | 
			
		||||
            </el-col>
 | 
			
		||||
            <el-col :span="7">
 | 
			
		||||
                <el-form-item label="至">
 | 
			
		||||
                    <el-date-picker style="width:100%;"></el-date-picker>
 | 
			
		||||
                </el-form-item>
 | 
			
		||||
            </el-col>
 | 
			
		||||
            <el-col :span="3"></el-col>
 | 
			
		||||
        </el-row>
 | 
			
		||||
    </el-form>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
    name: "OverVue"
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
.query_form {
 | 
			
		||||
    max-width: 63em;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
@@ -0,0 +1,37 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-25 23:16:29
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-25 23:19:00
 | 
			
		||||
 * @FilePath: \admin_system\src\views\requirement\RequirementEditing.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-25 23:13:47
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-25 23:15:21
 | 
			
		||||
 * @FilePath: \admin_system\src\views\requirement\RequirementManager.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
    需求编辑页面
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
    name: "requirement-editing",
 | 
			
		||||
    data()
 | 
			
		||||
    {
 | 
			
		||||
        return {};
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -0,0 +1,368 @@
 | 
			
		||||
<!--
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2023-01-25 23:13:47
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-28 17:44:26
 | 
			
		||||
 * @FilePath: \admin_system\src\views\requirement\RequirementManager.vue
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
-->
 | 
			
		||||
<template>
 | 
			
		||||
 | 
			
		||||
    <div class="requirement_wrapper">
 | 
			
		||||
        <!-- 查询框 -->
 | 
			
		||||
        <div class="search-box">
 | 
			
		||||
            <el-row :gutter="10">
 | 
			
		||||
                <el-col :span="2">
 | 
			
		||||
                    <span>标题:</span>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="16">
 | 
			
		||||
                    <el-input></el-input>
 | 
			
		||||
                </el-col>
 | 
			
		||||
            </el-row>
 | 
			
		||||
            <el-row :gutter="10">
 | 
			
		||||
                <el-col :span="2">
 | 
			
		||||
                    <span>需求编号:</span>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="4">
 | 
			
		||||
                    <el-input v-model="query_param.requirement_serial"></el-input>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="2">
 | 
			
		||||
                    <span>申请人:</span>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="4">
 | 
			
		||||
                    <el-input v-model="query_param.request_people"></el-input>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="2">
 | 
			
		||||
                    <span>状态:</span>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="4">
 | 
			
		||||
                    <!-- <el-input v-model="query_param.status"></el-input> -->
 | 
			
		||||
                    <el-select multiple collapse-tags collapse-tags-tooltip v-model="query_param.status">
 | 
			
		||||
                        <el-option v-for="option in requirement_status" :value="option" :key="option"></el-option>
 | 
			
		||||
                    </el-select>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="6"></el-col>
 | 
			
		||||
            </el-row>
 | 
			
		||||
            <el-row :gutter="10">
 | 
			
		||||
                <el-col :span="2">
 | 
			
		||||
                    <span>提交日期:</span>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="4">
 | 
			
		||||
                    <el-date-picker v-model="query_param.submit_start_date" style="width:100%;"></el-date-picker>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="2">
 | 
			
		||||
                    <span>至:</span>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="4">
 | 
			
		||||
                    <el-date-picker v-model="query_param.submit_end_date" style="width:100%;"></el-date-picker>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="6">
 | 
			
		||||
                    <div class="button-wrapper-right">
 | 
			
		||||
                        <el-button type="primary" icon="search">查询</el-button>
 | 
			
		||||
                        <el-button icon="Refresh">重置</el-button>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="6"></el-col>
 | 
			
		||||
            </el-row>
 | 
			
		||||
        </div>
 | 
			
		||||
        <!-- 工具栏 -->
 | 
			
		||||
        <div class="tool-button-wrapper">
 | 
			
		||||
            <el-row :gutter="10">
 | 
			
		||||
                <el-col :span="4">
 | 
			
		||||
                    <div class="button-wrapper-left">
 | 
			
		||||
                        <el-button type="success" icon="DocumentAdd" plain>新增</el-button>
 | 
			
		||||
                        <el-button type="warning" icon="document" plain>导出</el-button>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="20">
 | 
			
		||||
                    <div class="table-display-wrapper">
 | 
			
		||||
                        <span>结果筛选:</span>
 | 
			
		||||
                        <div class="result-filter-wrapper">
 | 
			
		||||
                            <el-checkbox-button label="已完成" checked></el-checkbox-button>
 | 
			
		||||
                            <el-checkbox-button label="已取消" checked></el-checkbox-button>
 | 
			
		||||
                            <el-checkbox-button label="被退回" checked></el-checkbox-button>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </el-col>
 | 
			
		||||
            </el-row>
 | 
			
		||||
        </div>
 | 
			
		||||
        <!-- 需求列表 -->
 | 
			
		||||
        <el-table :data="tableData" border stripe style="width:100%;" :height="tableHeight">
 | 
			
		||||
            <el-table-column type="selection" align="center"></el-table-column>
 | 
			
		||||
            <el-table-column label="需求编号" align="center" width="160">
 | 
			
		||||
                <template #default="requirement">
 | 
			
		||||
                    <span @click="dialogRequirementDetailVisible = true;" class="requirement-serial">{{
 | 
			
		||||
                        requirement.row.serial_no
 | 
			
		||||
                    }}</span>
 | 
			
		||||
                </template>
 | 
			
		||||
            </el-table-column>
 | 
			
		||||
            <el-table-column label="标题" prop="title" min-width="200" align="center">
 | 
			
		||||
                <template #default="requirement">
 | 
			
		||||
                    <span class="requirement-title">{{ requirement.row.title }}</span>
 | 
			
		||||
                </template>
 | 
			
		||||
            </el-table-column>
 | 
			
		||||
            <el-table-column label="申请人" prop="request_people" align="center" width="100"></el-table-column>
 | 
			
		||||
            <el-table-column label="状态" prop="status" align="center" width="100"></el-table-column>
 | 
			
		||||
            <el-table-column label="提交日期" prop="submit_date" align="center" width="130"></el-table-column>
 | 
			
		||||
            <el-table-column label="操作" align="center" fixed="right" width="200">
 | 
			
		||||
                <template #default>
 | 
			
		||||
                    <el-button type="warning" icon="edit">编辑</el-button>
 | 
			
		||||
                    <el-button type="danger" icon="delete">删除</el-button>
 | 
			
		||||
                </template>
 | 
			
		||||
            </el-table-column>
 | 
			
		||||
        </el-table>
 | 
			
		||||
        <div class="pagination_wrapper">
 | 
			
		||||
            <el-pagination class="pull_left" @current-change="onCurrentPageIndexChange"
 | 
			
		||||
                @size-change="onTablePageSizeChange" size="small" background v-model="this.table_current_page"
 | 
			
		||||
                :page-size="this.table_page_size" :page-sizes="[10, 20, 50, 100]"
 | 
			
		||||
                layout="total, sizes, prev, pager, next, jumper" :total="requirement_data.length">
 | 
			
		||||
            </el-pagination>
 | 
			
		||||
        </div>
 | 
			
		||||
        <!-- 需求详细信息对话框 -->
 | 
			
		||||
        <el-dialog class="requirement-detail-dialog" v-model="dialogRequirementDetailVisible" width="55%"
 | 
			
		||||
            :close-on-click-modal="true" :close-on-press-escape="false" :show-close="false" title="需求详情">
 | 
			
		||||
            <el-scrollbar height="300px">
 | 
			
		||||
                <div class="requirement-detail-wrapper" style="padding: 0px 10px;">
 | 
			
		||||
                    <el-row :gutter="10">
 | 
			
		||||
                        <el-col :span="2">
 | 
			
		||||
                            <span>标题</span>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                        <el-col :span="22">
 | 
			
		||||
                            <el-input></el-input>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                    </el-row>
 | 
			
		||||
                    <el-row :gutter="10">
 | 
			
		||||
                        <el-col :span="2">
 | 
			
		||||
                            <span>需求编号</span>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                        <el-col :span="6">
 | 
			
		||||
                            <el-input v-model="query_param.requirement_serial"></el-input>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                        <el-col :span="2">
 | 
			
		||||
                            <span>申请人</span>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                        <el-col :span="6">
 | 
			
		||||
                            <el-input v-model="query_param.request_people"></el-input>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                        <el-col :span="2">
 | 
			
		||||
                            <span>状态</span>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                        <el-col :span="6">
 | 
			
		||||
                            <!-- <el-input v-model="query_param.status"></el-input> -->
 | 
			
		||||
                            <el-select multiple collapse-tags collapse-tags-tooltip v-model="query_param.status">
 | 
			
		||||
                                <el-option v-for="option in requirement_status" :value="option"
 | 
			
		||||
                                    :key="option"></el-option>
 | 
			
		||||
                            </el-select>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                    </el-row>
 | 
			
		||||
                    <el-row :gutter="10">
 | 
			
		||||
                        <el-col :span="2">
 | 
			
		||||
                            <span>提交日期</span>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                        <el-col :span="6">
 | 
			
		||||
                            <el-date-picker v-model="query_param.submit_start_date"
 | 
			
		||||
                                style="width:100%;"></el-date-picker>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                        <el-col :span="2">
 | 
			
		||||
                            <span>至</span>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                        <el-col :span="6">
 | 
			
		||||
                            <el-date-picker v-model="query_param.submit_end_date" style="width:100%;"></el-date-picker>
 | 
			
		||||
                        </el-col>
 | 
			
		||||
                    </el-row>
 | 
			
		||||
                </div>
 | 
			
		||||
            </el-scrollbar>
 | 
			
		||||
            <template #footer>
 | 
			
		||||
                <div class="dialogFooter">
 | 
			
		||||
                    <el-button type="primary" @click="dialogRequirementDetailVisible = false;">关闭</el-button>
 | 
			
		||||
                </div>
 | 
			
		||||
            </template>
 | 
			
		||||
        </el-dialog>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { requirementTestData } from '@/test/data/TestData';
 | 
			
		||||
export default {
 | 
			
		||||
    name: "requirement-manager",
 | 
			
		||||
    data()
 | 
			
		||||
    {
 | 
			
		||||
        return {
 | 
			
		||||
            requirement_data: requirementTestData, //需求数据,当前值是测试数据
 | 
			
		||||
            table_current_page: 1,//分页组件当前的页面索引
 | 
			
		||||
            table_page_size: 10,
 | 
			
		||||
            query_param: {
 | 
			
		||||
                requirement_serial: "",
 | 
			
		||||
                request_people: "",
 | 
			
		||||
                submit_start_date: "",
 | 
			
		||||
                submit_end_date: "",
 | 
			
		||||
                status: "",
 | 
			
		||||
            },
 | 
			
		||||
            requirement_status: [
 | 
			
		||||
                "未提交", "部门审核", "需求分析", "技术开发", "待发布", "已发布", "被退回",
 | 
			
		||||
            ],
 | 
			
		||||
            dialogRequirementDetailVisible: false, //需求详情对话框是否显示
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
    computed: {
 | 
			
		||||
        //计算表格的高度
 | 
			
		||||
        tableHeight()
 | 
			
		||||
        {
 | 
			
		||||
            return 10 * 50 + 40;
 | 
			
		||||
        },
 | 
			
		||||
        tableData()
 | 
			
		||||
        {
 | 
			
		||||
            const startIndex = this.table_page_size * (this.table_current_page - 1);
 | 
			
		||||
            const endIndex = (this.table_page_size * this.table_current_page);// < this.requirement_data.length ? (this.table_page_size * this.table_current_page) : this.requirement_data.length;
 | 
			
		||||
 | 
			
		||||
            return this.requirement_data.slice(startIndex, endIndex);
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
        onTablePageSizeChange(pageSize)
 | 
			
		||||
        {
 | 
			
		||||
            console.log("选择的pageSize", pageSize);
 | 
			
		||||
            this.table_page_size = pageSize;
 | 
			
		||||
        },
 | 
			
		||||
        //用户变更当前页时消息处理函数
 | 
			
		||||
        onCurrentPageIndexChange(pageIndex)
 | 
			
		||||
        {
 | 
			
		||||
            this.table_current_page = pageIndex;
 | 
			
		||||
        },
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
/* 整个页面的外壳 ******************************/
 | 
			
		||||
.requirement_wrapper {
 | 
			
		||||
    padding: 15px 10px;
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    box-shadow: 0px 0px 20px -10px rgb(14 18 22 / 25%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.requirement_wrapper:hover {
 | 
			
		||||
    box-shadow: 0px 0px 20px -10px rgb(14 18 22 / 40%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.requirement_wrapper>*+* {
 | 
			
		||||
    margin-top: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 查询框 **********************************/
 | 
			
		||||
.search-box {
 | 
			
		||||
    padding: 0 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.search-box span {
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    display: block;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    font-size: 15px;
 | 
			
		||||
    color: #5f5f5f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.search-box>.el-row {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.search-box .el-row+.el-row {
 | 
			
		||||
    margin-top: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 查询结果筛选框 */
 | 
			
		||||
.tool-button-wrapper {
 | 
			
		||||
    padding: 0px 15px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tool-button-wrapper>.el-row {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tool-button-wrapper span {
 | 
			
		||||
    font-weight: small;
 | 
			
		||||
    display: block;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    font-size: 15px;
 | 
			
		||||
    color: #5f5f5f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tool-button-wrapper .el-checkbox {
 | 
			
		||||
    font-size: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.table-display-wrapper {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button-wrapper-right {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: right;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button-wrapper-left {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: left;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.result-filter-wrapper {
 | 
			
		||||
    padding: 0 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 需求列表 */
 | 
			
		||||
.requirement-title {
 | 
			
		||||
    display: block;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.requirement-serial {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/***分页组件 *************/
 | 
			
		||||
.pagination_wrapper {
 | 
			
		||||
    padding-right: 15px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*需求详情对话框 */
 | 
			
		||||
.requirement-detail-dialog {
 | 
			
		||||
    width: 400px;
 | 
			
		||||
    height: 600px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.requirement-detail-dialog .el-row {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: left;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    margin-top: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.requirement-detail-wrapper {
 | 
			
		||||
    padding: 0 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.requirement-detail-wrapper span {
 | 
			
		||||
    display: block;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										51
									
								
								code/web/admin_system/vue.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,51 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @Author: Kane
 | 
			
		||||
 * @Date: 2022-12-17 11:08:18
 | 
			
		||||
 * @LastEditors: Kane
 | 
			
		||||
 * @LastEditTime: 2023-01-07 12:08:14
 | 
			
		||||
 * @FilePath: \admin_system\vue.config.js
 | 
			
		||||
 * @Description: 
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
			
		||||
 */
 | 
			
		||||
// const { defineConfig } = require('@vue/cli-service');
 | 
			
		||||
// module.exports = defineConfig(
 | 
			
		||||
//   {
 | 
			
		||||
//     transpileDependencies: true,
 | 
			
		||||
//     devServer: {
 | 
			
		||||
//       open: true,
 | 
			
		||||
//       host: "localhost",
 | 
			
		||||
//       port: 8000,
 | 
			
		||||
//     },
 | 
			
		||||
//   }
 | 
			
		||||
// );
 | 
			
		||||
module.exports = {
 | 
			
		||||
  transpileDependencies: true,
 | 
			
		||||
  devServer: {
 | 
			
		||||
    open: true,
 | 
			
		||||
    host: "localhost",
 | 
			
		||||
    port: 8000,
 | 
			
		||||
  },
 | 
			
		||||
  chainWebpack: (config) =>
 | 
			
		||||
  {
 | 
			
		||||
    // svg 图标解析
 | 
			
		||||
    const svgRule = config.module.rule("svg");  //默认规则赋给 subRule 变量  
 | 
			
		||||
    svgRule.uses.clear();  // 清除已有的所有规则。
 | 
			
		||||
    svgRule  // 添加要替换的规则
 | 
			
		||||
      .use("svg-sprite-loader")
 | 
			
		||||
      .loader("svg-sprite-loader")
 | 
			
		||||
      .options({
 | 
			
		||||
        symbolId: "icon-[name]",
 | 
			
		||||
        include: ["./src/components/svg/icons"] // 特别注意的目录路径
 | 
			
		||||
      });
 | 
			
		||||
    // 配置base64转换规则
 | 
			
		||||
    // config.module
 | 
			
		||||
    //   .rule('images')
 | 
			
		||||
    //   .use('url-loader')
 | 
			
		||||
    //   .loader('url-loader')
 | 
			
		||||
    //   .tap(options => Object.assign(options, { limit: 1 }));
 | 
			
		||||
 | 
			
		||||
    // 载入项目分析工具
 | 
			
		||||
    // config.plugin('webpack-bundle-analyzer').use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										3
									
								
								code/web/项目源码/.browserslistrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
> 1%
 | 
			
		||||
last 2 versions
 | 
			
		||||
not dead
 | 
			
		||||
							
								
								
									
										3
									
								
								code/web/项目源码/.env.development
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
VUE_APP_API = '/devApi'
 | 
			
		||||
VUE_APP_DEV_TARGET = 'http://v3.web-jshtml.cn/api'
 | 
			
		||||
# VUE_API_DEV_TARGET = 'http://v3.com/api'
 | 
			
		||||
							
								
								
									
										1
									
								
								code/web/项目源码/.env.production
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
VUE_APP_API = 'http://v3.web-jshtml.cn/api'
 | 
			
		||||
							
								
								
									
										1
									
								
								code/web/项目源码/.env.test
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
VUE_APP_API = 'http://v3.web-jshtml.cn/api'
 | 
			
		||||
							
								
								
									
										14
									
								
								code/web/项目源码/.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,14 @@
 | 
			
		||||
module.exports = {
 | 
			
		||||
  root: true,
 | 
			
		||||
  env: {
 | 
			
		||||
    node: true,
 | 
			
		||||
  },
 | 
			
		||||
  extends: ["plugin:vue/vue3-essential", "eslint:recommended", "@vue/prettier"],
 | 
			
		||||
  parserOptions: {
 | 
			
		||||
    parser: "babel-eslint",
 | 
			
		||||
  },
 | 
			
		||||
  rules: {
 | 
			
		||||
    "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
 | 
			
		||||
    "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										22
									
								
								code/web/项目源码/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,22 @@
 | 
			
		||||
.DS_Store
 | 
			
		||||
node_modules
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# local env files
 | 
			
		||||
.env.local
 | 
			
		||||
.env.*.local
 | 
			
		||||
 | 
			
		||||
# Log files
 | 
			
		||||
npm-debug.log*
 | 
			
		||||
yarn-debug.log*
 | 
			
		||||
yarn-error.log*
 | 
			
		||||
pnpm-debug.log*
 | 
			
		||||
 | 
			
		||||
# Editor directories and files
 | 
			
		||||
.idea
 | 
			
		||||
.vscode
 | 
			
		||||
*.suo
 | 
			
		||||
*.ntvs*
 | 
			
		||||
*.njsproj
 | 
			
		||||
*.sln
 | 
			
		||||
*.sw?
 | 
			
		||||
							
								
								
									
										24
									
								
								code/web/项目源码/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,24 @@
 | 
			
		||||
# vue3-element-plus-admin
 | 
			
		||||
 | 
			
		||||
## Project setup
 | 
			
		||||
```
 | 
			
		||||
npm install
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Compiles and hot-reloads for development
 | 
			
		||||
```
 | 
			
		||||
npm run serve
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Compiles and minifies for production
 | 
			
		||||
```
 | 
			
		||||
npm run build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Lints and fixes files
 | 
			
		||||
```
 | 
			
		||||
npm run lint
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Customize configuration
 | 
			
		||||
See [Configuration Reference](https://cli.vuejs.org/config/).
 | 
			
		||||
							
								
								
									
										3
									
								
								code/web/项目源码/babel.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
module.exports = {
 | 
			
		||||
  presets: ["@vue/cli-plugin-babel/preset"],
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										30307
									
								
								code/web/项目源码/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										44
									
								
								code/web/项目源码/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,44 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "vue3-element-plus-admin",
 | 
			
		||||
  "version": "0.1.0",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "serve": "vue-cli-service serve",
 | 
			
		||||
    "dev": "vue-cli-service serve --mode test",
 | 
			
		||||
    "build": "vue-cli-service build",
 | 
			
		||||
    "lint": "vue-cli-service lint",
 | 
			
		||||
    "build:test": "vue-cli-service build --mode test"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "axios": "^0.21.0",
 | 
			
		||||
    "core-js": "^3.6.5",
 | 
			
		||||
    "element-plus": "^2.2.26",
 | 
			
		||||
    "js-cookie": "^2.2.1",
 | 
			
		||||
    "js-sha1": "^0.6.0",
 | 
			
		||||
    "vue": "^3.2.27",
 | 
			
		||||
    "vue-router": "^4.1.6",
 | 
			
		||||
    "vuex": "^4.0.2",
 | 
			
		||||
    "wangeditor": "^4.7.12"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@vue/cli-plugin-babel": "~4.5.0",
 | 
			
		||||
    "@vue/cli-plugin-eslint": "~4.5.0",
 | 
			
		||||
    "@vue/cli-plugin-router": "~4.5.0",
 | 
			
		||||
    "@vue/cli-plugin-vuex": "~4.5.0",
 | 
			
		||||
    "@vue/cli-service": "~4.5.0",
 | 
			
		||||
    "@vue/compiler-sfc": "^3.0.0",
 | 
			
		||||
    "@vue/eslint-config-prettier": "^6.0.0",
 | 
			
		||||
    "babel-eslint": "^10.1.0",
 | 
			
		||||
    "babel-plugin-component": "^1.1.1",
 | 
			
		||||
    "eslint": "^6.7.2",
 | 
			
		||||
    "eslint-plugin-prettier": "^3.3.1",
 | 
			
		||||
    "eslint-plugin-vue": "^7.0.0",
 | 
			
		||||
    "prettier": "^2.2.1",
 | 
			
		||||
    "sass": "^1.26.5",
 | 
			
		||||
    "sass-loader": "^8.0.2",
 | 
			
		||||
    "svg-sprite-loader": "^5.2.1",
 | 
			
		||||
    "unplugin-auto-import": "^0.5.11",
 | 
			
		||||
    "unplugin-element-plus": "^0.2.0",
 | 
			
		||||
    "unplugin-vue-components": "^0.17.17"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								code/web/项目源码/public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.2 KiB  | 
							
								
								
									
										25
									
								
								code/web/项目源码/public/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,25 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 | 
			
		||||
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
 | 
			
		||||
    <!-- vue3最新版本 -->
 | 
			
		||||
    <script src="https://unpkg.com/vue@next"></script>
 | 
			
		||||
    <!-- 引入Element Plus UI 组件库 -->
 | 
			
		||||
    <link rel="stylesheet" href="//unpkg.com/element-plus/dist/index.css" />
 | 
			
		||||
    <script src="//unpkg.com/element-plus"></script>
 | 
			
		||||
    <!-- 语言包 -->
 | 
			
		||||
    <script src="https://unpkg.com/browse/element-plus@1.2.0-beta.4/es/locale/lang/zh-cn.mjs"></script>
 | 
			
		||||
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
 | 
			
		||||
    <title><%= htmlWebpackPlugin.options.title %></title>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <noscript>
 | 
			
		||||
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
 | 
			
		||||
    </noscript>
 | 
			
		||||
    <div id="app"></div>
 | 
			
		||||
    <!-- built files will be auto injected -->
 | 
			
		||||
    
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										21
									
								
								code/web/项目源码/src/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <el-config-provider :locale="locale">
 | 
			
		||||
    <router-view />
 | 
			
		||||
  </el-config-provider>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import zhCn from 'element-plus/lib/locale/lang/zh-cn'
 | 
			
		||||
export default {
 | 
			
		||||
  name: "App",
 | 
			
		||||
  setup() {
 | 
			
		||||
    // 切换为中文
 | 
			
		||||
    let locale = zhCn
 | 
			
		||||
    return {
 | 
			
		||||
      locale
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
<style lang="scss">
 | 
			
		||||
#app{}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										37
									
								
								code/web/项目源码/src/api/account.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,37 @@
 | 
			
		||||
import instance from "@/utils/request";  // 引入拦截器
 | 
			
		||||
/** 注册 */
 | 
			
		||||
export function Register(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/register/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 登录 */
 | 
			
		||||
export function Login(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/login/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 登出 */
 | 
			
		||||
export function Logout(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/logout/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 路由权限 */
 | 
			
		||||
export function GetPermission(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/permission",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
							
								
								
									
										72
									
								
								code/web/项目源码/src/api/common.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,72 @@
 | 
			
		||||
import instance from "@/utils/request";  // 引入拦截器
 | 
			
		||||
/** 获取验证码 */
 | 
			
		||||
export function GetCode(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/getCode/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** http 状态码异常演示接口 */
 | 
			
		||||
export function ErrorHttp(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/error/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * BasisTable组件公共接口 
 | 
			
		||||
 * @param { String } method 请求类型 
 | 
			
		||||
 * @param { String } url 请求地址 
 | 
			
		||||
 * @param { Object } data 请求参数 
 | 
			
		||||
 */
 | 
			
		||||
export function TableData(params = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: params.method,
 | 
			
		||||
        url: params.url,
 | 
			
		||||
        data: params.data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 * @param { method } String 请求类型 
 | 
			
		||||
 * @param { url } String 请求地址 
 | 
			
		||||
 * @param { data } Object 请求参数 
 | 
			
		||||
 * @description BasisTable组件公共接口 
 | 
			
		||||
 */
 | 
			
		||||
 export function SwitchStatus(params = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: params.method,
 | 
			
		||||
        url: params.url,
 | 
			
		||||
        data: params.data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 * @param { method } String 请求类型 
 | 
			
		||||
 * @param { url } String 请求地址 
 | 
			
		||||
 * @param { data } Object 请求参数 
 | 
			
		||||
 * @description BasisTable组件公共接口 
 | 
			
		||||
 */
 | 
			
		||||
 export function CommonApi(params = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: params.method,
 | 
			
		||||
        url: params.url,
 | 
			
		||||
        data: params.data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 文件上传 */
 | 
			
		||||
export function UploadFile(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/upload",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										102
									
								
								code/web/项目源码/src/api/info.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,102 @@
 | 
			
		||||
import instance from "@/utils/request";  // 引入拦截器
 | 
			
		||||
/** 一级分类添加 */
 | 
			
		||||
export function firstCategoryAdd(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/addFirstCategory/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 获取分类 */
 | 
			
		||||
export function GetCategory(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/getCategoryAll/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 子级分类添加 */
 | 
			
		||||
export function ChildCategoryAdd(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/addChildrenCategory/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 分类编辑 */
 | 
			
		||||
export function CategoryEdit(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/editCategory/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 分类删除 */
 | 
			
		||||
export function CategoryDel(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/deleteCategory/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** 添加信息 */
 | 
			
		||||
export function InfoCreate(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/add/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 获取列表 */
 | 
			
		||||
export function GetTableList(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/getList/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 发布状态 */
 | 
			
		||||
export function Status(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/status/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 删除 */
 | 
			
		||||
export function Delete(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/delete/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 获取详情 */
 | 
			
		||||
export function GetDetailed(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "get",
 | 
			
		||||
        url: "/news/detailed/",
 | 
			
		||||
        params: data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** 信息修改 */
 | 
			
		||||
export function InfoEdit(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/news/editInfo/",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										46
									
								
								code/web/项目源码/src/api/menu.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,46 @@
 | 
			
		||||
import instance from "@/utils/request";  // 引入拦截器
 | 
			
		||||
/** 创建菜单 */
 | 
			
		||||
export function MenuCreate(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/menu/create",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 获取菜单详情 */
 | 
			
		||||
export function MenuDetailed(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/menu/detailed",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** 菜单编辑 */
 | 
			
		||||
export function MenuUpdate(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/menu/update",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 菜单列表 */
 | 
			
		||||
export function MenuList(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/menu/listsTree",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 菜单列表树状数据 */
 | 
			
		||||
export function MenuListTree(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/menu/listsTree",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										75
									
								
								code/web/项目源码/src/api/requestUrl.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,75 @@
 | 
			
		||||
const apiUrl = {
 | 
			
		||||
    // 信息模块
 | 
			
		||||
    info: {                      // 模块键名
 | 
			
		||||
        list: {                  // 列表数据接口
 | 
			
		||||
            url: "/news/getList/",   
 | 
			
		||||
            method: "post"
 | 
			
		||||
        },
 | 
			
		||||
        info_status: {
 | 
			
		||||
            url: "/news/status/",   
 | 
			
		||||
            method: "post"
 | 
			
		||||
        },
 | 
			
		||||
        delete: {
 | 
			
		||||
            method: "post",
 | 
			
		||||
            url: "/news/delete/"
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    // 级联选择器模块
 | 
			
		||||
    cascader: {
 | 
			
		||||
        category: {
 | 
			
		||||
            url: "/news/getCategoryAll/",
 | 
			
		||||
            method: "post"
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    // 菜单模块
 | 
			
		||||
    menu: {
 | 
			
		||||
        list: {
 | 
			
		||||
            url: "/menu/lists",
 | 
			
		||||
            method: "post"
 | 
			
		||||
        },
 | 
			
		||||
        delete: {
 | 
			
		||||
            method: "post",
 | 
			
		||||
            url: "/menu/remove"
 | 
			
		||||
        },
 | 
			
		||||
        hidden_status: {
 | 
			
		||||
            url: "/menu/statusHidden",
 | 
			
		||||
            method: "post"
 | 
			
		||||
        },
 | 
			
		||||
        disabled_status: {
 | 
			
		||||
            url: "/menu/statusDisabled",
 | 
			
		||||
            method: "post"
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    // 角色模块
 | 
			
		||||
    role: {
 | 
			
		||||
        status: {
 | 
			
		||||
            url: "/role/status",
 | 
			
		||||
            method: "post"
 | 
			
		||||
        },
 | 
			
		||||
        delete: {
 | 
			
		||||
            url: "/role/delete",
 | 
			
		||||
            method: "post"
 | 
			
		||||
        },
 | 
			
		||||
        list: {
 | 
			
		||||
            url: "/role/lists",
 | 
			
		||||
            method: "post"
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    // 用户模块
 | 
			
		||||
    user: {
 | 
			
		||||
        status: {
 | 
			
		||||
            url: "/user/status",
 | 
			
		||||
            method: "post"
 | 
			
		||||
        },
 | 
			
		||||
        delete: {
 | 
			
		||||
            method: "post",
 | 
			
		||||
            url: "/user/remove"
 | 
			
		||||
        },
 | 
			
		||||
        list: {
 | 
			
		||||
            url: "/user/lists",
 | 
			
		||||
            method: "post"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
export default apiUrl;
 | 
			
		||||
							
								
								
									
										38
									
								
								code/web/项目源码/src/api/role.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,38 @@
 | 
			
		||||
import instance from "@/utils/request";  // 引入拦截器
 | 
			
		||||
/** 创建角色 */
 | 
			
		||||
export function RoleCreate(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/role/create",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 角色详情 */
 | 
			
		||||
export function RoleDetailed(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/role/detailed",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 角色修改 */
 | 
			
		||||
export function RoleUpdate(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/role/update",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 角色列表 */
 | 
			
		||||
export function RoleListAll(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/role/all",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										36
									
								
								code/web/项目源码/src/api/user.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,36 @@
 | 
			
		||||
import instance from "@/utils/request";  // 引入拦截器
 | 
			
		||||
/** 创建用户 */
 | 
			
		||||
export function UserCreate(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/user/create",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 用户详情 */
 | 
			
		||||
export function UserDetailed(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/user/detailed",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 用户修改 */
 | 
			
		||||
export function UserUpdate(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/user/update",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 修改密码 */
 | 
			
		||||
export function UpdatePass(data = {}){
 | 
			
		||||
    return instance.request({
 | 
			
		||||
        method: "post",
 | 
			
		||||
        url: "/user/password",
 | 
			
		||||
        data
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								code/web/项目源码/src/assets/images/logo-min.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 490 B  | 
							
								
								
									
										
											BIN
										
									
								
								code/web/项目源码/src/assets/images/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.4 KiB  | 
							
								
								
									
										125
									
								
								code/web/项目源码/src/assets/zhCn.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,125 @@
 | 
			
		||||
var zhCn = {
 | 
			
		||||
    name: "zh-cn",
 | 
			
		||||
    el: {
 | 
			
		||||
      colorpicker: {
 | 
			
		||||
        confirm: "\u786E\u5B9A",
 | 
			
		||||
        clear: "\u6E05\u7A7A"
 | 
			
		||||
      },
 | 
			
		||||
      datepicker: {
 | 
			
		||||
        now: "\u6B64\u523B",
 | 
			
		||||
        today: "\u4ECA\u5929",
 | 
			
		||||
        cancel: "\u53D6\u6D88",
 | 
			
		||||
        clear: "\u6E05\u7A7A",
 | 
			
		||||
        confirm: "\u786E\u5B9A",
 | 
			
		||||
        selectDate: "\u9009\u62E9\u65E5\u671F",
 | 
			
		||||
        selectTime: "\u9009\u62E9\u65F6\u95F4",
 | 
			
		||||
        startDate: "\u5F00\u59CB\u65E5\u671F",
 | 
			
		||||
        startTime: "\u5F00\u59CB\u65F6\u95F4",
 | 
			
		||||
        endDate: "\u7ED3\u675F\u65E5\u671F",
 | 
			
		||||
        endTime: "\u7ED3\u675F\u65F6\u95F4",
 | 
			
		||||
        prevYear: "\u524D\u4E00\u5E74",
 | 
			
		||||
        nextYear: "\u540E\u4E00\u5E74",
 | 
			
		||||
        prevMonth: "\u4E0A\u4E2A\u6708",
 | 
			
		||||
        nextMonth: "\u4E0B\u4E2A\u6708",
 | 
			
		||||
        year: "\u5E74",
 | 
			
		||||
        month1: "1 \u6708",
 | 
			
		||||
        month2: "2 \u6708",
 | 
			
		||||
        month3: "3 \u6708",
 | 
			
		||||
        month4: "4 \u6708",
 | 
			
		||||
        month5: "5 \u6708",
 | 
			
		||||
        month6: "6 \u6708",
 | 
			
		||||
        month7: "7 \u6708",
 | 
			
		||||
        month8: "8 \u6708",
 | 
			
		||||
        month9: "9 \u6708",
 | 
			
		||||
        month10: "10 \u6708",
 | 
			
		||||
        month11: "11 \u6708",
 | 
			
		||||
        month12: "12 \u6708",
 | 
			
		||||
        weeks: {
 | 
			
		||||
          sun: "\u65E5",
 | 
			
		||||
          mon: "\u4E00",
 | 
			
		||||
          tue: "\u4E8C",
 | 
			
		||||
          wed: "\u4E09",
 | 
			
		||||
          thu: "\u56DB",
 | 
			
		||||
          fri: "\u4E94",
 | 
			
		||||
          sat: "\u516D"
 | 
			
		||||
        },
 | 
			
		||||
        months: {
 | 
			
		||||
          jan: "\u4E00\u6708",
 | 
			
		||||
          feb: "\u4E8C\u6708",
 | 
			
		||||
          mar: "\u4E09\u6708",
 | 
			
		||||
          apr: "\u56DB\u6708",
 | 
			
		||||
          may: "\u4E94\u6708",
 | 
			
		||||
          jun: "\u516D\u6708",
 | 
			
		||||
          jul: "\u4E03\u6708",
 | 
			
		||||
          aug: "\u516B\u6708",
 | 
			
		||||
          sep: "\u4E5D\u6708",
 | 
			
		||||
          oct: "\u5341\u6708",
 | 
			
		||||
          nov: "\u5341\u4E00\u6708",
 | 
			
		||||
          dec: "\u5341\u4E8C\u6708"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      select: {
 | 
			
		||||
        loading: "\u52A0\u8F7D\u4E2D",
 | 
			
		||||
        noMatch: "\u65E0\u5339\u914D\u6570\u636E",
 | 
			
		||||
        noData: "\u65E0\u6570\u636E",
 | 
			
		||||
        placeholder: "\u8BF7\u9009\u62E9"
 | 
			
		||||
      },
 | 
			
		||||
      cascader: {
 | 
			
		||||
        noMatch: "\u65E0\u5339\u914D\u6570\u636E",
 | 
			
		||||
        loading: "\u52A0\u8F7D\u4E2D",
 | 
			
		||||
        placeholder: "\u8BF7\u9009\u62E9",
 | 
			
		||||
        noData: "\u6682\u65E0\u6570\u636E"
 | 
			
		||||
      },
 | 
			
		||||
      pagination: {
 | 
			
		||||
        goto: "\u524D\u5F80",
 | 
			
		||||
        pagesize: "\u6761/\u9875",
 | 
			
		||||
        total: "\u5171 {total} \u6761",
 | 
			
		||||
        pageClassifier: "\u9875",
 | 
			
		||||
        deprecationWarning: "\u4F60\u4F7F\u7528\u4E86\u4E00\u4E9B\u5DF2\u88AB\u5E9F\u5F03\u7684\u7528\u6CD5\uFF0C\u8BF7\u53C2\u8003 el-pagination \u7684\u5B98\u65B9\u6587\u6863"
 | 
			
		||||
      },
 | 
			
		||||
      messagebox: {
 | 
			
		||||
        title: "\u63D0\u793A",
 | 
			
		||||
        confirm: "\u786E\u5B9A",
 | 
			
		||||
        cancel: "\u53D6\u6D88",
 | 
			
		||||
        error: "\u8F93\u5165\u7684\u6570\u636E\u4E0D\u5408\u6CD5!"
 | 
			
		||||
      },
 | 
			
		||||
      upload: {
 | 
			
		||||
        deleteTip: "\u6309 delete \u952E\u53EF\u5220\u9664",
 | 
			
		||||
        delete: "\u5220\u9664",
 | 
			
		||||
        preview: "\u67E5\u770B\u56FE\u7247",
 | 
			
		||||
        continue: "\u7EE7\u7EED\u4E0A\u4F20"
 | 
			
		||||
      },
 | 
			
		||||
      table: {
 | 
			
		||||
        emptyText: "\u6682\u65E0\u6570\u636E",
 | 
			
		||||
        confirmFilter: "\u7B5B\u9009",
 | 
			
		||||
        resetFilter: "\u91CD\u7F6E",
 | 
			
		||||
        clearFilter: "\u5168\u90E8",
 | 
			
		||||
        sumText: "\u5408\u8BA1"
 | 
			
		||||
      },
 | 
			
		||||
      tree: {
 | 
			
		||||
        emptyText: "\u6682\u65E0\u6570\u636E"
 | 
			
		||||
      },
 | 
			
		||||
      transfer: {
 | 
			
		||||
        noMatch: "\u65E0\u5339\u914D\u6570\u636E",
 | 
			
		||||
        noData: "\u65E0\u6570\u636E",
 | 
			
		||||
        titles: ["\u5217\u8868 1", "\u5217\u8868 2"],
 | 
			
		||||
        filterPlaceholder: "\u8BF7\u8F93\u5165\u641C\u7D22\u5185\u5BB9",
 | 
			
		||||
        noCheckedFormat: "\u5171 {total} \u9879",
 | 
			
		||||
        hasCheckedFormat: "\u5DF2\u9009 {checked}/{total} \u9879"
 | 
			
		||||
      },
 | 
			
		||||
      image: {
 | 
			
		||||
        error: "\u52A0\u8F7D\u5931\u8D25"
 | 
			
		||||
      },
 | 
			
		||||
      pageHeader: {
 | 
			
		||||
        title: "\u8FD4\u56DE"
 | 
			
		||||
      },
 | 
			
		||||
      popconfirm: {
 | 
			
		||||
        confirmButtonText: "\u786E\u5B9A",
 | 
			
		||||
        cancelButtonText: "\u53D6\u6D88"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  
 | 
			
		||||
  export { zhCn as default };
 | 
			
		||||
  //# sourceMappingURL=zh-cn.mjs.map
 | 
			
		||||
  
 | 
			
		||||
							
								
								
									
										21
									
								
								code/web/项目源码/src/components/HelloWorld.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="home">
 | 
			
		||||
    <h1>这里是测试文字</h1>
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>无序列表LI</li>
 | 
			
		||||
      <li>无序列表LI</li>
 | 
			
		||||
    </ul>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
  name: "HelloWorld",
 | 
			
		||||
  props: {
 | 
			
		||||
    msg: String,
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
 | 
			
		||||
<style scoped lang="scss"></style>
 | 
			
		||||
							
								
								
									
										12
									
								
								code/web/项目源码/src/components/cd-form/Input.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,12 @@
 | 
			
		||||
 | 
			
		||||
import { h } from 'vue';
 | 
			
		||||
const Input = (props, context) => {
 | 
			
		||||
  return () => {
 | 
			
		||||
      return (
 | 
			
		||||
          <div>sdfdsf</div>
 | 
			
		||||
      )
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Input.props = ['level'];
 | 
			
		||||
export default Input;
 | 
			
		||||
							
								
								
									
										34
									
								
								code/web/项目源码/src/components/cd-form/hook/relationHook.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,34 @@
 | 
			
		||||
export function relationHook(){
 | 
			
		||||
    /**
 | 
			
		||||
     * @param { String } value 控制方的选项 value
 | 
			
		||||
     * @param { Array } data 关联关系的数据配置 relation_hidden
 | 
			
		||||
     * @param { Object } props 显示/隐藏对象集保
 | 
			
		||||
     */
 | 
			
		||||
    const HiddenItem = (value, data, props) => {
 | 
			
		||||
        if(data && Array.isArray(data) && data.length > 0) {
 | 
			
		||||
            data.forEach(item => {
 | 
			
		||||
                const field = item[0];
 | 
			
		||||
                const objValue = item[1];
 | 
			
		||||
                props[field] = objValue[value]
 | 
			
		||||
                // 选项为 1 时
 | 
			
		||||
                // props["title"] = objValue["1"]      => true
 | 
			
		||||
                // props["iamge_url"] = objValue["1"]  => true
 | 
			
		||||
                // 选项为 0 时
 | 
			
		||||
                // props["title"] = objValue["0"]      => true
 | 
			
		||||
                // props["iamge_url"] = objValue["0"]  => undefined
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const DisabledItem = (value, data, props) => {
 | 
			
		||||
        if(data && Array.isArray(data) && data.length > 0) {
 | 
			
		||||
            data.forEach(item => {
 | 
			
		||||
                const field = item[0];
 | 
			
		||||
                const objValue = item[1];
 | 
			
		||||
                props[field] = objValue[value]
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
   
 | 
			
		||||
    return { HiddenItem, DisabledItem };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										75
									
								
								code/web/项目源码/src/components/cd-form/hook/rulesHook.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,75 @@
 | 
			
		||||
import { moneyNValid } from "@/utils/amountFormat";
 | 
			
		||||
/**
 | 
			
		||||
 * @returns BasisForm组件创建校验规则
 | 
			
		||||
 */
 | 
			
		||||
export function rulesHook() {
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {*} data 配置额外组件
 | 
			
		||||
   */
 | 
			
		||||
  const InitRules = (data = []) => {
 | 
			
		||||
    if (data.length === 0) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    // 判断是否有required属性
 | 
			
		||||
    data.forEach((item) => {
 | 
			
		||||
      // 初始化规则数组
 | 
			
		||||
      let rulesArr = [];
 | 
			
		||||
      if (item.required) {
 | 
			
		||||
        const json = {
 | 
			
		||||
          required: true,
 | 
			
		||||
          message: item.required_msg || messageType(item).msg,
 | 
			
		||||
          trigger: "blur",
 | 
			
		||||
        };
 | 
			
		||||
        rulesArr.push(json);
 | 
			
		||||
      }
 | 
			
		||||
      // 生成placeholder
 | 
			
		||||
      item.placeholder = item.placeholder || messageType(item).placeholder;
 | 
			
		||||
      // 是否有其他的校验规则
 | 
			
		||||
      const rule = item.rule;
 | 
			
		||||
      if (rule && Array.isArray(rule) && rule.length > 0) {
 | 
			
		||||
        rulesArr = rulesArr.concat(rule);
 | 
			
		||||
      }
 | 
			
		||||
      // price
 | 
			
		||||
      if (item.type === "price" && !item.rule) {
 | 
			
		||||
        const json = { validator: moneyNValid, trigger: "blur" };
 | 
			
		||||
        rulesArr.push(json);
 | 
			
		||||
      }
 | 
			
		||||
      // 定义rules属性赋值
 | 
			
		||||
      item.rules = rulesArr;
 | 
			
		||||
    });
 | 
			
		||||
    return data;
 | 
			
		||||
  };
 | 
			
		||||
  /**
 | 
			
		||||
   *
 | 
			
		||||
   * @description 提示文本
 | 
			
		||||
   */
 | 
			
		||||
  const messageType = (data) => {
 | 
			
		||||
    let msg = "";
 | 
			
		||||
    switch (data.type) {
 | 
			
		||||
      case "input":
 | 
			
		||||
      case "wangeditor":
 | 
			
		||||
      case "price":
 | 
			
		||||
      case "range":
 | 
			
		||||
      case "textarea":
 | 
			
		||||
        msg = "请输入";
 | 
			
		||||
        break;
 | 
			
		||||
      case "upload":
 | 
			
		||||
        msg = "请上传";
 | 
			
		||||
        break;
 | 
			
		||||
      case "radio":
 | 
			
		||||
      case "checkbox":
 | 
			
		||||
      case "select":
 | 
			
		||||
      case "date":
 | 
			
		||||
      case "cascader":
 | 
			
		||||
        msg = "请选择";
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        msg = "未定义";
 | 
			
		||||
    }
 | 
			
		||||
    return {
 | 
			
		||||
      msg: `${msg}${data.label}`,
 | 
			
		||||
      placeholder: `${msg}${data.label}`,
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  return { InitRules };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										180
									
								
								code/web/项目源码/src/components/cd-form/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,180 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <el-form ref="formDom" :model="field" :class="[{'label-gray': labelGray}]" :label-position="labelPosition" element-loading-text="加载中,请稍候" :label-width="label_width" >
 | 
			
		||||
    <el-row :gutter="gutter">
 | 
			
		||||
      <template v-for="item in form_item" :key="item.prop">
 | 
			
		||||
        <el-col v-if="!form_hidden[item.prop]" :span="item.col || 24">
 | 
			
		||||
          <component :is="'htmlComponent'" v-if="item.type === 'html'" :prop="item" />
 | 
			
		||||
          <el-form-item v-else :label="item.label" :prop="item.prop" :rules="item.rules">
 | 
			
		||||
            <!--自定义label-->
 | 
			
		||||
            <template v-if="item.label_html" #label>
 | 
			
		||||
              <span class="custom-label">
 | 
			
		||||
                <div>
 | 
			
		||||
                  <span style="position: relative;">
 | 
			
		||||
                    <label class="form-center" v-html="item.label_html.label || ''" />
 | 
			
		||||
                    <em v-if="item.label_html.spot" class="spot"></em>
 | 
			
		||||
                  </span>
 | 
			
		||||
                </div>
 | 
			
		||||
                <span :class="item.label_html.suffix_class" @click="item.label_html.suffix_callback && item.label_html.suffix_callback(item)" v-html="item.label_html.suffix_text || ''" />
 | 
			
		||||
              </span>
 | 
			
		||||
            </template>
 | 
			
		||||
            <!--动态组件-->
 | 
			
		||||
            <div v-show="control" style="width:100%">
 | 
			
		||||
              <component :is="item.type + 'Component'" v-if="item.type !== 'slot'" v-model:value="field[item.prop]" v-model:second-value="field[item.secondprop]" v-model:select-value="field[item.selProp]" :data="item" :header="item" :disabled="disabled[item.prop]" @callback="componentCallback" />
 | 
			
		||||
              <!--插槽-->
 | 
			
		||||
              <template v-else>
 | 
			
		||||
                <slot :name="item.slot_name" />
 | 
			
		||||
                <span v-if="item.tip" class="tip">{{ item.tip }}</span>
 | 
			
		||||
              </template>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div v-show="!control">
 | 
			
		||||
              <slot v-if="item.slot_text" :name="item.slot_text" />
 | 
			
		||||
              <span v-else>{{ fieldText[item.prop] || '--' }}</span>
 | 
			
		||||
            </div>
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
        </el-col>
 | 
			
		||||
      </template>
 | 
			
		||||
    </el-row>
 | 
			
		||||
    <!-- button -->
 | 
			
		||||
      <div :class="['form-button', {'dialog-footer': dialog}]">
 | 
			
		||||
        <template v-if="form_button && form_button.length > 0">
 | 
			
		||||
          <template v-for="button in form_button" :key="button.key">
 | 
			
		||||
            <template v-if="!button.hidden">
 | 
			
		||||
            <CdButton v-if="button.key === 'submit'" :loading="load || loading" margin="0 0 0 16px" :type="button.type" @click="button.callback ? button.callback() : handlerFormValidate()">
 | 
			
		||||
              {{ button.label }}
 | 
			
		||||
            </CdButton>
 | 
			
		||||
            <CdButton v-else-if="button.key === 'cancel'" margin="0 0 0 16px" border @click="button.callback ? button.callback() : handlerFormCancel()">
 | 
			
		||||
              {{ button.label }}
 | 
			
		||||
            </CdButton>
 | 
			
		||||
            <CdButton v-else :type="button.type" margin="0 0 0 16px" @click="button.callback && button.callback()">{{ button.label }}</CdButton>
 | 
			
		||||
            </template>
 | 
			
		||||
          </template>
 | 
			
		||||
        </template>
 | 
			
		||||
      </div>
 | 
			
		||||
  </el-form>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { defineAsyncComponent, onBeforeUnmount, reactive, ref, watch } from "vue";
 | 
			
		||||
import { checkDataType } from "../common";
 | 
			
		||||
// hook
 | 
			
		||||
import { rulesHook } from "./hook/rulesHook";
 | 
			
		||||
import { relationHook } from "./hook/relationHook";
 | 
			
		||||
// props
 | 
			
		||||
import { props } from "./props";
 | 
			
		||||
// require import components
 | 
			
		||||
const files = require.context("@/cd-components/cd-control", true, /\index.vue$/);
 | 
			
		||||
const modules = {};
 | 
			
		||||
files.keys().forEach((key) => {
 | 
			
		||||
  const name = key.split("/");
 | 
			
		||||
  modules[name[1] + "Component"] = files(key).default || files(key);
 | 
			
		||||
});
 | 
			
		||||
export default {
 | 
			
		||||
  name: "BasisForm",
 | 
			
		||||
  components: {
 | 
			
		||||
    ...modules,
 | 
			
		||||
    CdButton: defineAsyncComponent(() => import("../cd-button")),
 | 
			
		||||
  },
 | 
			
		||||
  props,
 | 
			
		||||
  emits: ["callback", "cancel"],
 | 
			
		||||
  setup(props, { emit }) {
 | 
			
		||||
    const { InitRules } = rulesHook();
 | 
			
		||||
    const { HiddenItem, DisabledItem } = relationHook();
 | 
			
		||||
    // 校验规则处理
 | 
			
		||||
    const form_item = reactive(InitRules(props.item));
 | 
			
		||||
    const label_width = ref(props.labelWidth);
 | 
			
		||||
    const form_button = reactive(props.button);
 | 
			
		||||
    const form_disabled = reactive(props.disabled);
 | 
			
		||||
    const load = ref(false)
 | 
			
		||||
    let form_hidden = ref({});
 | 
			
		||||
    watch(() => props.hidden, (value) => {
 | 
			
		||||
      form_hidden.value = value
 | 
			
		||||
    })
 | 
			
		||||
    // 表单提交验证
 | 
			
		||||
    const formDom = ref(null);
 | 
			
		||||
    const handlerFormValidate = () => {
 | 
			
		||||
      formDom.value.validate((valid) => {
 | 
			
		||||
        if(valid) {
 | 
			
		||||
          if (checkDataType().isFunction(props.beforeChange)) {
 | 
			
		||||
            load.value = true
 | 
			
		||||
            props.beforeChange().then(() => {
 | 
			
		||||
              load.value = false
 | 
			
		||||
            }).catch(() => {
 | 
			
		||||
              load.value = false
 | 
			
		||||
            })
 | 
			
		||||
            return false
 | 
			
		||||
          }
 | 
			
		||||
          emit("callback")
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      
 | 
			
		||||
    };
 | 
			
		||||
    const handlerFormCancel = () => {
 | 
			
		||||
      handlerFormReset()
 | 
			
		||||
      emit("cancel");
 | 
			
		||||
    };
 | 
			
		||||
    /**
 | 
			
		||||
     * 重置表单
 | 
			
		||||
     */
 | 
			
		||||
    const handlerFormReset = () => {
 | 
			
		||||
      formDom.value.resetFields();
 | 
			
		||||
    };
 | 
			
		||||
    // change 事件
 | 
			
		||||
    const componentCallback = (params) => {};
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 生命周期
 | 
			
		||||
     */
 | 
			
		||||
    onBeforeUnmount(() => {
 | 
			
		||||
      form_hidden.value = {}
 | 
			
		||||
      handlerFormReset()
 | 
			
		||||
    })
 | 
			
		||||
    
 | 
			
		||||
    return {
 | 
			
		||||
      form_item,
 | 
			
		||||
      label_width,
 | 
			
		||||
      form_button,
 | 
			
		||||
      form_hidden,
 | 
			
		||||
      form_disabled,
 | 
			
		||||
      formDom,
 | 
			
		||||
      load,
 | 
			
		||||
      handlerFormValidate,
 | 
			
		||||
      handlerFormCancel,
 | 
			
		||||
      handlerFormReset,
 | 
			
		||||
      componentCallback,
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
.form-button {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
.form-left {
 | 
			
		||||
  text-align: left;
 | 
			
		||||
}
 | 
			
		||||
.form-center {
 | 
			
		||||
  text-align: center;
 | 
			
		||||
}
 | 
			
		||||
.form-right {
 | 
			
		||||
  text-align: right;
 | 
			
		||||
}
 | 
			
		||||
.custom-label {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  > span {
 | 
			
		||||
    float: right;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
::v-deep .color-lable-danger {
 | 
			
		||||
  width: 6px;
 | 
			
		||||
  height: 6px;
 | 
			
		||||
  background: #ff6060;
 | 
			
		||||
  border-radius: 50%;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  right: -7px;
 | 
			
		||||
  top: 7px;
 | 
			
		||||
}
 | 
			
		||||
:deep(.el-input__wrapper) {
 | 
			
		||||
  border-radius: 0;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										57
									
								
								code/web/项目源码/src/components/cd-form/props.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,57 @@
 | 
			
		||||
export const props = {
 | 
			
		||||
  item: {
 | 
			
		||||
    type: Array,
 | 
			
		||||
    default: () => [],
 | 
			
		||||
  },
 | 
			
		||||
  button: {
 | 
			
		||||
    type: Array,
 | 
			
		||||
    default: () => [],
 | 
			
		||||
  },
 | 
			
		||||
  labelWidth: {
 | 
			
		||||
    type: [String, Number],
 | 
			
		||||
    default: "100px",
 | 
			
		||||
  },
 | 
			
		||||
  field: {
 | 
			
		||||
    type: Object,
 | 
			
		||||
    default: () => ({}),
 | 
			
		||||
  },
 | 
			
		||||
  fieldText: {
 | 
			
		||||
    type: Object,
 | 
			
		||||
    default: () => ({}),
 | 
			
		||||
  },
 | 
			
		||||
  loading: {
 | 
			
		||||
    type: Boolean,
 | 
			
		||||
    default: false,
 | 
			
		||||
  },
 | 
			
		||||
  hidden: {
 | 
			
		||||
    type: Object,
 | 
			
		||||
    default: () => ({}),
 | 
			
		||||
  },
 | 
			
		||||
  disabled: {
 | 
			
		||||
    type: Object,
 | 
			
		||||
    default: () => ({}),
 | 
			
		||||
  },
 | 
			
		||||
  position: {
 | 
			
		||||
    type: String,
 | 
			
		||||
    default: "left",
 | 
			
		||||
  },
 | 
			
		||||
  labelPosition: {
 | 
			
		||||
    type: String,
 | 
			
		||||
    default: "right",
 | 
			
		||||
  },
 | 
			
		||||
  gutter: {
 | 
			
		||||
    type: Number,
 | 
			
		||||
    default: 0,
 | 
			
		||||
  },
 | 
			
		||||
  beforeChange: Function,
 | 
			
		||||
  dialog: Boolean,
 | 
			
		||||
  labelGray: Boolean,
 | 
			
		||||
  control: {
 | 
			
		||||
    type: Boolean,
 | 
			
		||||
    default: true,
 | 
			
		||||
  },
 | 
			
		||||
  fieldData: {
 | 
			
		||||
    type: Object,
 | 
			
		||||
    default: () => ({}),
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										86
									
								
								code/web/项目源码/src/components/control/cascader/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,86 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <el-cascader :style="{width}" :disabled="disabled" v-model="data.value" :options="data.options" :props="data.props" @change="handlerChange"></el-cascader>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { reactive, onBeforeMount, watch } from 'vue';
 | 
			
		||||
// API
 | 
			
		||||
import { CommonApi } from "@/api/common";
 | 
			
		||||
// requestUrl
 | 
			
		||||
import ApiUrl from "@/api/requestUrl";
 | 
			
		||||
export default {
 | 
			
		||||
    name: 'BasisCascader',
 | 
			
		||||
    components: {},
 | 
			
		||||
    props: {
 | 
			
		||||
        cascaderProps: {
 | 
			
		||||
            type: Object,
 | 
			
		||||
            default: () => ({})
 | 
			
		||||
        },
 | 
			
		||||
        url: {
 | 
			
		||||
            type: String,
 | 
			
		||||
            default: ""
 | 
			
		||||
        },
 | 
			
		||||
        method: {
 | 
			
		||||
            type: String,
 | 
			
		||||
            default: "post"
 | 
			
		||||
        },
 | 
			
		||||
        data: {
 | 
			
		||||
            type: Object,
 | 
			
		||||
            default: () => ({})
 | 
			
		||||
        },
 | 
			
		||||
        value: {
 | 
			
		||||
            type: [String, Number],
 | 
			
		||||
            default: 0
 | 
			
		||||
        },
 | 
			
		||||
        width: {
 | 
			
		||||
            type: String,
 | 
			
		||||
            default: "100%"
 | 
			
		||||
        },
 | 
			
		||||
        disabled: {
 | 
			
		||||
            type: Boolean,
 | 
			
		||||
            default: false
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    emits: ["update:value", 'callback'],
 | 
			
		||||
    setup(props, { emit }){
 | 
			
		||||
        const data = reactive({
 | 
			
		||||
            props: props.data.props,
 | 
			
		||||
            options: [],
 | 
			
		||||
            value: 0
 | 
			
		||||
        })
 | 
			
		||||
        const handlerChange = (value) => {
 | 
			
		||||
            // 获取最后一项
 | 
			
		||||
            const val = value[value.length - 1];
 | 
			
		||||
            // 返回
 | 
			
		||||
            emit("update:value", val);
 | 
			
		||||
        }
 | 
			
		||||
        /** 获取列表 */
 | 
			
		||||
        const getData = () => {
 | 
			
		||||
            const url = ApiUrl?.cascader?.[props.url || props?.data?.url]?.url;
 | 
			
		||||
            const method = ApiUrl?.cascader?.[props.url]?.method || "post";
 | 
			
		||||
            if(!url) {
 | 
			
		||||
                throw new Error("url地址不存在");
 | 
			
		||||
            }
 | 
			
		||||
            // 参数
 | 
			
		||||
            const request_data = {
 | 
			
		||||
                url,
 | 
			
		||||
                method,
 | 
			
		||||
                data: props.data,
 | 
			
		||||
            }
 | 
			
		||||
            CommonApi(request_data).then(response => {
 | 
			
		||||
                data.options = response.data;
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
        /** 生命周期挂载之前 */
 | 
			
		||||
        onBeforeMount(() => {
 | 
			
		||||
            getData();
 | 
			
		||||
        })
 | 
			
		||||
        /** 监听 */
 | 
			
		||||
        watch(() => props.value, (newValue) => {
 | 
			
		||||
            data.value = newValue
 | 
			
		||||
        } )
 | 
			
		||||
 | 
			
		||||
        return { data, handlerChange }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||