Compare commits

..

2 Commits

23 changed files with 7388 additions and 1520 deletions

View File

@ -0,0 +1,174 @@
/*
* @Author: Kane
* @Date: 2023-03-14 09:19:21
* @LastEditors: Kane
* @FilePath: /it-console/.eslintrc.cjs
* @Description: eslint 配置文件
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
module.exports = {
root: true,
env: { // 需要在env中指定运行的环境这些环境其实就是一组预定义的全局变量让 ESLint 知道当前环境存在这些全局变量
node: true,
browser: true,
es2021: true,
},
parser:"espree",
parserOptions:{
sourceType: "module",
ecmaVersion: 2021,
},
extends:["eslint:recommended",],
rules:{
indent: ["warn", 4,],
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
"no-unused-vars": "warn",
semi: ["error", "always",], // 控制行尾部分号
quotes: ["error", "double",],
"comma-dangle": ["error", {
arrays: "always",
objects: "always",
imports: "never",
exports: "never",
functions: "never",
},], // 数组和对象键值对最后一个逗号
"comma-style": ["error", "last",], // 逗号在行位
"array-bracket-spacing": ["error", "never",],
"no-undef-init": "error",
"no-invalid-this": "error",
"no-use-before-define": "error",
"no-shadow-restricted-names": "error", // 禁止对一些关键字或者保留字进行赋值操作比如NaN、Infinity、undefined、eval、arguments等
"comma-spacing": ["error", { before: false, after: true, },],
"brace-style": ["error", "allman", { allowSingleLine: true, },],
"prefer-const": "warn",
"space-before-function-paren": ["error", {
anonymous: "always",
named: "never",
asyncArrow: "always",
},],
},
overrides: [
{
files: ["*.vue",],
parser: "vue-eslint-parser",
parserOptions: {
ecmaVersion: 2021,
sourceType: "module",
parser: { // <script>标签中的lang属性配置不同的parser
ts: "@typescript-eslint/parser",
js: "espree",
"<template>": "espree",
},
},
plugins: ["eslint-plugin-vue",],
extends: [
"plugin:vue/vue3-essential",
"plugin:vue/recommended",
"eslint:recommended",
"standard-with-typescript",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
],
rules: {
indent: ["warn", 4,],
// "space-in-parens": ["error", "always", { exceptions: ["empty",], },],
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
"no-unused-vars": "warn",
semi: ["error", "always",], // 控制行尾部分号
quotes: ["error", "double",],
"comma-dangle": ["error", {
arrays: "always",
objects: "always",
imports: "never",
exports: "never",
functions: "never",
},], // 数组和对象键值对最后一个逗号
"comma-style": ["error", "last",], // 逗号在行位
"array-bracket-spacing": ["error", "never",],
"no-undef-init": "error",
"no-invalid-this": "error",
"no-use-before-define": "error",
"no-shadow-restricted-names": "error", // 禁止对一些关键字或者保留字进行赋值操作比如NaN、Infinity、undefined、eval、arguments等
"comma-spacing": ["error", { before: false, after: true, },],
"brace-style": ["error", "allman", { allowSingleLine: true, },],
"prefer-const": "warn",
"space-before-function-paren": ["error", {
anonymous: "always",
named: "never",
asyncArrow: "always",
},],
// vue
"vue/html-indent": ["error", 4,],
// typescript
"@typescript-eslint/indent": ["warn", 4,],
"@typescript-eslint/no-extra-semi": "off",
"@typescript-eslint/no-inferrable-types": "off",
"@typescript-eslint/no-unused-vars": "warn",
"@typescript-eslint/ban-ts-comment": "warn",
"@typescript-eslint/member-delimiter-style": "off",
"@typescript-eslint/semi": ["error", "always",], // 控制行尾部分号
"@typescript-eslint/brace-style": ["error", "allman", { allowSingleLine: true, },],
"@typescript-eslint/comma-dangle": ["error", {
arrays: "always",
objects: "always",
imports: "never",
exports: "never",
functions: "never",
},], // 数组和对象键值对最后一个逗号
"@typescript-eslint/quotes": ["error", "double",],
"@typescript-eslint/space-before-function-paren": "off",
},
},
{
files: ["*.ts",],
parser: "@typescript-eslint/parser",
parserOptions: {
project: "./tsconfig.json",
},
plugins: ["@typescript-eslint",],
extends: [
"standard-with-typescript",
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
],
rules: {
"space-in-parens": ["error", "always", { exceptions: ["empty",], },],
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
"@typescript-eslint/indent": ["error", 4,],
"@typescript-eslint/no-extra-semi": "off",
"@typescript-eslint/no-inferrable-types": "off",
"@typescript-eslint/no-unused-vars": "warn",
"@typescript-eslint/ban-ts-comment": "warn",
"@typescript-eslint/member-delimiter-style": "off",
"@typescript-eslint/semi": ["error", "always",], // 控制行尾部分号
"@typescript-eslint/brace-style": ["error", "allman", { allowSingleLine: true, },],
"@typescript-eslint/comma-dangle": ["error", {
arrays: "always",
objects: "always",
imports: "never",
exports: "never",
functions: "never",
},], // 数组和对象键值对最后一个逗号
"@typescript-eslint/quotes": ["error", "double",],
"@typescript-eslint/space-before-function-paren": "off",
"@typescript-eslint/strict-boolean-expressions": ["error", {
allowString: false,
},],
"comma-style": ["error", "last",], // 逗号在行位
"array-bracket-spacing": ["error", "never",],
"no-undef-init": "error",
"no-invalid-this": "error",
"no-use-before-define": "error",
"no-shadow-restricted-names": "error", // 禁止对一些关键字或者保留字进行赋值操作比如NaN、Infinity、undefined、eval、arguments等
"prefer-const": "warn",
"spaced-comment": "error",
"space-before-function-paren": "off",
},
},
],
};

View File

@ -1,44 +0,0 @@
/*
* @Author: Kane
* @Date: 2022-12-14 15:12:46
* @LastEditors: Kane
* @LastEditTime: 2023-02-14 23:10:53
* @FilePath: /IT工具综合平台/.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',
"no-unused-vars": "warn",
"semi": ["error", "always",],//控制行尾部分号
"comma-dangle": ["warn", {
"arrays": "always",
"objects": "always",
"imports": "never",
"exports": "never",
"functions": "never",
},],//数组和对象键值对最后一个逗号
"comma-style": ["error", "last",], //逗号在行位
"array-bracket-spacing": ["error", "never",],
"no-undef-init": "error",
"no-invalid-this": "error",
"no-use-before-define": "error",
"no-shadow-restricted-names": "error", //禁止对一些关键字或者保留字进行赋值操作比如NaN、Infinity、undefined、eval、arguments等
// "comma-spacing": ["error", { "before": false, "after": true, },],
"brace-style": ["error", "allman", { "allowSingleLine": true, },],
},
};

View File

@ -1,5 +1,14 @@
/*
* @Author: Kane
* @Date: 2023-02-23 00:15:23
* @LastEditors: Kane
* @FilePath: /it-console/babel.config.js
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}
presets: [
"@vue/cli-plugin-babel/preset",
],
};

20
code/web/it-console/env.d.ts vendored Normal file
View File

@ -0,0 +1,20 @@
/*
* @Author: Kane
* @Date: 2023-03-03 10:07:00
* @LastEditors: Kane
* @FilePath: /task_schedule/env.d.ts
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
interface ImportMetaEnv
{
readonly VITE_APP_TITLE: string;
readonly VITE_URL_VALIDATE_ACCOUNT: string;
// 更多环境变量...
}
interface ImportMeta
{
readonly env: ImportMetaEnv;
}

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,9 @@
"vite": "^4.1.4",
"vue": "^3.2.13",
"vue-router": "^4.0.3",
"vuex": "^4.0.0"
"vuex": "^4.0.0",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0"
},
"devDependencies": {
"@babel/core": "^7.12.16",
@ -39,8 +41,7 @@
"@vue/cli-plugin-vuex": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"@vue/compiler-sfc": "^3.2.26",
"eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3",
"eslint": "^8.35.0",
"node-sass": "^8.0.0",
"sass-loader": "^13.2.0",
"vite": "^2.7.2",
@ -48,6 +49,10 @@
"vite-plugin-html": "3.2.0",
"vue-cli-plugin-element-plus": "~0.0.13",
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1"
"webpack-cli": "^5.0.1",
"eslint-config-recommended": "^4.1.0",
"eslint-config-standard-with-typescript": "^34.0.0",
"eslint-plugin-vue": "^9.9.0",
"sass": "^1.58.3"
}
}

10
code/web/it-console/sfc.d.ts vendored Normal file
View File

@ -0,0 +1,10 @@
/*
* @Author: Kane
* @Date: 2023-03-04 17:21:37
* @LastEditors: Kane
* @FilePath: /task_schedule/sfc.d.ts
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/

14
code/web/it-console/shims-vue.d.ts vendored Normal file
View File

@ -0,0 +1,14 @@
/*
* @Author: Kane
* @Date: 2023-03-04 17:23:02
* @LastEditors: Kane
* @FilePath: /task_schedule/shims-vue.d.ts
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
declare module '*.vue' {
import { ComponentOptions } from 'vue';
const componentOptions: ComponentOptions;
export default componentOptions;
}

View File

@ -2,33 +2,33 @@
* @Author: Kane
* @Date: 2022-12-14 15:12:46
* @LastEditors: Kane
* @LastEditTime: 2023-02-15 09:34:25
* @FilePath: /IT/src/App.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
* @LastEditTime: 2023-03-21 23:14:06
* @FilePath: /it-console/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>
<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()
{
const locale = zhCn;
return { locale, };
},
components: {
name: "App",
components: {
// HelloWorld,
},
},
setup()
{
const locale = zhCn;
return { locale, };
},
};
</script>

View File

@ -4,24 +4,31 @@
* @LastEditors: Kane
* @LastEditTime: 2023-02-06 09:26:48
* @FilePath: /IT/src/layout/Index.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<el-container id="layout-container" v-loading="ui.ageVisible" element-loading-text="载入应用数据…">
<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
id="layout-container"
v-loading="ui.ageVisible"
element-loading-text="载入应用数据…"
>
<el-header id="layout-header">
<LayoutHeader />
</el-header>
<el-container id="layout-container-down">
<el-aside
id="layout-aside"
:width="asideWidth"
>
<LayoutAside />
</el-aside>
<el-main id="layout-main">
<LayoutMain />
</el-main>
</el-container>
</el-container>
</el-container>
</template>
<script>
@ -33,50 +40,50 @@ import { onMounted, computed, reactive } from "vue";
// import { query_requirement_status } from "@/utils/api/requirement/requirement.js";
export default {
name: "layoutPage",
setup()
{
const store = useStore();
const ui = reactive(
{
pageVisible: true,
});
const asideWidth = computed(() =>
name: "LayoutPage",
components: {
LayoutAside,
LayoutHeader,
LayoutMain,
},
setup()
{
const collapse = store.state.app.asideBarCollapse;
const store = useStore();
return collapse === true ? "65px" : "180px";
});
const ui = reactive(
{
pageVisible: true,
});
onMounted(() =>
{
//
// query_requirement_status()
// .then((response) =>
// {
// // debugger;
// const data = response.data;
// console.log(data);
// })
// .catch((error) =>
// {
// // debugger;
// console.log(error);
// });
});
const asideWidth = computed(() =>
{
const collapse = store.state.app.asideBarCollapse;
return {
ui,
asideWidth,
};
},
components: {
LayoutAside,
LayoutHeader,
LayoutMain,
},
return collapse === true ? "65px" : "180px";
});
onMounted(() =>
{
//
// query_requirement_status()
// .then((response) =>
// {
// // debugger;
// const data = response.data;
// console.log(data);
// })
// .catch((error) =>
// {
// // debugger;
// console.log(error);
// });
});
return {
ui,
asideWidth,
};
},
};
</script>
@ -115,4 +122,4 @@ export default {
/* flex-grow: 1; */
/* overflow: overlay; */
}
</style>
</style>

View File

@ -2,39 +2,75 @@
* @Author: Kane
* @Date: 2023-01-04 11:30:33
* @LastEditors: Kane
* @LastEditTime: 2023-02-06 09:28:16
* @FilePath: /IT/src/layout/components/Aside.vue
* @Description:
*
* @LastEditTime: 2023-03-21 23:18:41
* @FilePath: /it-console/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 routes" :key="route.path">
<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 routes"
>
<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-menu-item
:key="route.path"
:index="route.children[0].path"
class="sidebar-submenu"
>
<component
:is="route.children[0].meta.icon"
class="icons"
/>
<!-- <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>
<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">
<el-sub-menu
v-if="route.children && route.children.length"
:key="route.path"
:index="route.path"
class="sidebar-submenu"
>
<template #title>
<component :is="route.meta.icon" class="icons"></component>
<component
:is="route.meta.icon"
class="icons"
/>
<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>
<template
v-for="child in route.children"
>
<el-menu-item
v-if="!child.hidden"
:key="child.path"
:index="child.path"
class="sidebar-item"
>
<component
:is="child.meta.icon"
class="icons"
/>
<template #title>
{{ child.meta && child.meta.title }}
</template>
</el-menu-item>
</template>
</el-sub-menu>
@ -54,23 +90,23 @@ export default {
name: "LayoutAside",
setup()
{
const router = useRouter();//
const routes = router.getRoutes();//
const router = useRouter();//
const routes = router.getRoutes();//
const store = useStore();
//
//
const hasOnlyChild = (children) =>
{
//
//
if (!children)
{
return false;
}
//hidden
// hidden
const routes = children.filter((item) =>
{
return item.hidden ? false : true;
return !item.hidden;
});
if (routes.length === 1)
@ -81,16 +117,16 @@ export default {
return false;
};
//
//
//
//
const currentPath = computed(() =>
{
let path = useRoute().path;
const path = useRoute().path;
return path;
});
//
//
const asideCollapse = computed(() =>
{
return store.state.app.ui.asideBarCollapse;
@ -163,4 +199,4 @@ export default {
height: 100%;
/* min-height: 400px; */
}
</style>
</style>

View File

@ -4,54 +4,57 @@
* @LastEditors: Kane
* @LastEditTime: 2023-02-04 01:09:49
* @FilePath: \IT工具综合平台\src\layout\components\Header.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
* @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 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>
<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 { 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()
name: "AppBanner",
data()
{
this.$confirm("是否退出系统?", "请确认", {
confirmButtonText: "是",
cancelButtonText: "否",
type: "warning",
}).then(() =>
{
Logout();
});
return {};
},
// created() {
// console.log("banner");
// },
mounted()
{
// console.log("banner");
},
methods: {
logout()
{
this.$confirm("是否退出系统?", "请确认", {
confirmButtonText: "是",
cancelButtonText: "否",
type: "warning",
}).then(() =>
{
Logout();
});
},
},
},
};
</script>
<style scoped>
@ -96,4 +99,4 @@ export default {
padding-top: 5px;
/* border: 1px solid salmon; */
}
</style>
</style>

View File

@ -2,24 +2,27 @@
* @Author: Kane
* @Date: 2023-01-04 11:39:04
* @LastEditors: Kane
* @LastEditTime: 2023-02-22 18:33:11
* @FilePath: /IT/src/layout/components/Header.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
* @LastEditTime: 2023-03-21 23:19:06
* @FilePath: /it-console/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 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>
<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>
@ -27,23 +30,23 @@ import { ElMessageBox } from "element-plus";
import { Logout } from "../../utils/api/info/account";
export default {
name: "AppBanner",
setup()
{
const logout = () =>
name: "AppBanner",
setup()
{
ElMessageBox.confirm("是否退出系统?", "请确认", {
confirmButtonText: "是",
cancelButtonText: "否",
type: "warning",
}).then(() =>
{
Logout();
});
};
const logout = () =>
{
ElMessageBox.confirm("是否退出系统?", "请确认", {
confirmButtonText: "是",
cancelButtonText: "否",
type: "warning",
}).then(() =>
{
Logout();
});
};
return { logout, };
},
return { logout, };
},
};
</script>
<style scoped>
@ -88,4 +91,4 @@ export default {
padding-top: 5px;
/* border: 1px solid salmon; */
}
</style>
</style>

View File

@ -2,11 +2,11 @@
* @Author: Kane
* @Date: 2023-01-04 11:40:03
* @LastEditors: Kane
* @LastEditTime: 2023-02-07 10:47:57
* @FilePath: /IT/src/layout/components/Main.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
* @LastEditTime: 2023-03-21 23:19:27
* @FilePath: /it-console/src/layout/components/Main.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<!-- <div class="main-content"> -->
@ -33,4 +33,4 @@ export default {
.view-wrapper {
padding: 10px;
}
</style>
</style>

View File

@ -2,214 +2,214 @@
* @Author: Kane
* @Date: 2022-12-14 15:12:46
* @LastEditors: Kane
* @LastEditTime: 2023-02-21 13:09:15
* @FilePath: /IT/src/router/index.js
* @LastEditTime: 2023-03-21 23:20:10
* @FilePath: /it-console/src/router/index.js
* @Description: 定义应用路由配置
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
import { createRouter, createWebHashHistory } from 'vue-router';
import { createRouter, createWebHashHistory } from "vue-router";
const routes = [
//框架路由
{
path: "/",
name: "Root",
redirect: "Login", //默认路由指向登录页面
hidden: true,
},
{
path: "/error-page",
name: "ErrorPage",
hidden: true,
component: () => import("@/views/ErrorPage.vue"),
},
{
path: "/login",
name: "Login",
component: () => import("../views/account/Login.vue"),
hidden: true,
},
{
path: "/home",
name: "Home",
hidden: true,
meta: {
title: "控制台",
//框架路由
{
path: "/",
name: "Root",
redirect: "Login", //默认路由指向登录页面
hidden: true,
},
component: () => import("../layout/Index.vue"),
},
//侧边导航栏路由
{ //首页
path: "/console",
name: "Console",
meta: {
title: "总览",
icon: "house",
{
path: "/error-page",
name: "ErrorPage",
hidden: true,
component: () => import("@/views/ErrorPage.vue"),
},
component: () => import("../layout/Index.vue"),
children: [
{
path: "/desktop",
name: "DeskTop",
{
path: "/login",
name: "Login",
component: () => import("../views/account/Login.vue"),
hidden: true,
},
{
path: "/home",
name: "Home",
hidden: true,
meta: {
title: "工作台",
icon: "house",
title: "控制台",
},
component: () => import("../views/overview/Desktop.vue"),
},
],
},
{
component: () => import("../layout/Index.vue"),
},
//侧边导航栏路由
{ //首页
path: "/console",
name: "Console",
meta: {
title: "总览",
icon: "house",
},
component: () => import("../layout/Index.vue"),
children: [
{
path: "/desktop",
name: "DeskTop",
meta: {
title: "工作台",
icon: "house",
},
component: () => import("../views/overview/Desktop.vue"),
},
],
},
{
//需求管理
path: "/requirement",
name: "Requirement",
meta: {
title: "需求管理",
icon: "Document",
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"),
},
],
},
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: "/query_info",
name: "QueryInfo",
meta: {
title: "信息查询",
icon: "search",
path: "/query_info",
name: "QueryInfo",
meta: {
title: "信息查询",
icon: "search",
},
component: () => import("@/layout/Index.vue"),
children: [
{
path: "/query_stuff",
name: "QueryStuff",
meta: {
title: "人员信息",
icon: "user",
},
component: () => import("@/views/info/StaffInfo.vue"),
},
],
},
component: () => import("@/layout/Index.vue"),
children: [
{
path: "/query_stuff",
name: "QueryStuff",
{//权限管理
path: "/privilege",
name: "Privilege",
meta: {
title: "人员信息",
icon: "user",
title: "权限管理",
icon: "User",
},
component: () => import("@/views/info/StaffInfo.vue"),
},
],
},
{//权限管理
path: "/privilege",
name: "Privilege",
meta: {
title: "权限管理",
icon: "User",
children: [
{
path: "/user-manager",
name: "UserManager",
meta: {
title: "用户管理",
icon: "User",
},
component: () => import("../views/privilege/StaffInfo.vue"),
},
{
path: "/privilege-manager",
name: "PrivilegeManager",
meta: {
title: "权限管理",
icon: "edit",
},
component: () => import("../views/privilege/PrivilegeManager.vue"),
},
],
component: () => import("../layout/Index.vue"),
},
children: [
{
path: "/user-manager",
name: "UserManager",
{
path: "/network",
name: "NetworkManager",
meta: {
title: "用户管理",
icon: "User",
title: "网络管理",
icon: "switch",
},
component: () => import("../views/privilege/StaffInfo.vue"),
},
{
path: "/privilege-manager",
name: "PrivilegeManager",
meta: {
title: "权限管理",
icon: "edit",
},
component: () => import("../views/privilege/PrivilegeManager.vue"),
},
],
component: () => import("../layout/Index.vue"),
},
{
path: "/network",
name: "NetworkManager",
meta: {
title: "网络管理",
icon: "switch",
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"),
},
],
},
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,
history: createWebHashHistory(),
routes,
});
//前置路由守卫
router.beforeEach((to) =>
{
const token = window.localStorage.getItem("token");
const token = window.localStorage.getItem("token");
//先检查token
if (!token)
{
//先检查token
if (!token)
{
//如果token不存在判断路由是否走向login,如果不是则指向login
//走向login则不干预
if (to.name !== "Login")
{
return {
name: "Login",
};
if (to.name !== "Login")
{
return {
name: "Login",
};
}
}
}
//修改默认打开的页面,跳向工作台
// if (to.name === "Home")
// {
// console.log("跳向工作台");
//修改默认打开的页面,跳向工作台
// if (to.name === "Home")
// {
// console.log("跳向工作台");
// return {
// name: "DeskTop",
// };
// }
// return {
// name: "DeskTop",
// };
// }
});
export default router;

View File

@ -10,7 +10,7 @@
*/
const state = {
status: {},//包含全部需求状态的数组
status: {}, //包含全部需求状态的数组
status_update_time: new Date(),
ui: {
selected_status: [], //已选择的需求状态

View File

@ -10,7 +10,7 @@
*/
//常量
const REQUIREMRNT_UI = `requirement_ui`;
const REQUIREMRNT_UI = "requirement_ui";
/**
* 从localStorage中读取 REQUIREMRNT_UI 的值并转换成对象

View File

@ -18,7 +18,7 @@ import router from "@/router/index";
* @param store 保存在vuex中需求相关的对象
* @param {string} error_page_name 提示错误页面的路径
*****************************************************/
function query_requirement_ui(requirement_store, error_page_name)
function queryRequirementUI(requirement_store, error_page_name)
{
//发送请求
instance.request(
@ -48,4 +48,4 @@ function query_requirement_ui(requirement_store, error_page_name)
});
}
export { query_requirement_ui };
export { queryRequirementUI };

View File

@ -5,52 +5,82 @@
* @LastEditors: Kane
* @LastEditTime: 2023-02-07 10:46:48
* @FilePath: /IT/src/views/account/Login.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<div id="login">
<div class="form-wrapper">
<ul class="menu-tab">
<li :class="{ 'current': ui.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="ui.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="ui.submit_btn_disable"
:loading="ui.submit_btn_loading">
{{ ui.current_menu === "login" ? "登录" : "注册" }}
</el-button>
</el-form-item>
</el-form>
<div id="login">
<div class="form-wrapper">
<ul class="menu-tab">
<li
v-for="item in tabMenu"
:key="item.type"
:class="{ 'current': ui.current_menu === item.type }"
@click="onToggleMenu(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
v-model.lazy.trim="loginForm.username"
type="text"
/>
</el-form-item>
<el-form-item>
<label class="form-label">密码</label>
<el-input
v-model.lazy.trim="loginForm.password"
type="password"
/>
</el-form-item>
<el-form-item v-show="ui.current_menu === tabMenu[1].type">
<label class="form-label">确认密码</label>
<el-input
v-model.lazy.trim="loginForm.confirm_password"
type="password"
disabled
/>
</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-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"
:disabled="ui.submit_btn_disable"
:loading="ui.submit_btn_loading"
@click="login"
>
{{ ui.current_menu === "login" ? "登录" : "注册" }}
</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
@ -60,168 +90,168 @@ import { useRouter } from "vue-router";
import { Login } from "@/utils/api/info/account";
import { ElMessage } from "element-plus";
//import router from "../../router/index";
// import router from "../../router/index";
export default {
name: "loginPage",
setup()
{
const store = useStore();
const router = useRouter();
const loginForm = reactive({
username: "",
password: "",
confirm_password: "",
validateCode: "",
});
const tab_menu = reactive(
[
{ type: "login", label: "登录", },
{ type: "regiester", label: "注册", },
]);
const ui = reactive(
{
current_menu: "",
staffInfo: null,
submit_btn_disable: false,
submit_btn_loading: false,
});
const onToggleMenu = (type) =>
name: "LoginPage",
setup()
{
ui.current_menu = type;
console.log(process.env.VUE_APP_API_URL_LOGIN);
};
const store = useStore();
const router = useRouter();
const getValidateCode = () =>
{
ElMessage({
message: "测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字",
center: true,
type: "error",
});
};
const loginForm = reactive({
username: "",
password: "",
confirm_password: "",
validateCode: "",
});
//tokenvuexlocalStorage
const saveUserInfo = (userInfo) =>
{
console.log("保存用户信息");
console.log("保存用户信息", store);
//vuex
store.commit("app/SET_USERINFO", userInfo);
const tabMenu = reactive(
[
{ type: "login", label: "登录", },
{ type: "regiester", label: "注册", },
]);
//localStorage
const token = userInfo.token;
const userInfoJson = JSON.stringify(userInfo);
const ui = reactive(
{
current_menu: "",
staffInfo: null,
submit_btn_disable: false,
submit_btn_loading: false,
});
window.localStorage.setItem("token", token);
window.localStorage.setItem("user_info", userInfoJson);
};
const onToggleMenu = (type) =>
{
ui.current_menu = type;
console.log(process.env.VUE_APP_API_URL_LOGIN);
};
/**
const getValidateCode = () =>
{
ElMessage({
message: "测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字",
center: true,
type: "error",
});
};
// tokenvuexlocalStorage
const saveUserInfo = (userInfo) =>
{
console.log("保存用户信息");
console.log("保存用户信息", store);
// vuex
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);
};
/**
* 登录
*/
const login = () =>
{
if (loginForm.username.length === 0 || loginForm.password === 0)
{
ElMessage({
message: "请填写您的P13账号和密码",
type: "error",
const login = () =>
{
if (loginForm.username.length === 0 || loginForm.password === 0)
{
ElMessage({
message: "请填写您的P13账号和密码",
type: "error",
});
return;
}
ui.submit_btn_disable = true;
ui.submit_btn_loading = true;
const userInfo = {
p13account: loginForm.username,
password: loginForm.password,
};
Login(userInfo)
.then((response) =>
{
//
// tokenvuexlocalStoreage
// router.push
const data = response.data;
//
if (data.success === true)
{
ElMessage({
message: data.message,
type: "success",
center: true,
});
ui.staffInfo = data.staffInfo;
// token
saveUserInfo(data);
//
router.push("/Desktop");
}
else
{
//
ElMessage({
message: data.message,
type: "error",
center: true,
});
ui.submit_btn_disable = false;
ui.submit_btn_loading = false;
}
})
.catch((error) =>
{
//
console.log(error);
ElMessage({
message: error.message,
type: "error",
center: true,
});
ui.submit_btn_disable = false;
ui.submit_btn_loading = false;
});
};
onBeforeMount(() =>
{
//
ui.current_menu = tabMenu[0].type;
});
return;
}
ui.submit_btn_disable = true;
ui.submit_btn_loading = true;
const userInfo = {
p13account: loginForm.username,
password: loginForm.password,
};
Login(userInfo)
.then((response) =>
onMounted(() =>
{
//
//tokenvuexlocalStoreage
//router.push
const data = response.data;
//
if (data.success === true)
{
ElMessage({
message: data.message,
type: "success",
center: true,
});
ui.staffInfo = data.staffInfo;
//token
saveUserInfo(data);
//
router.push("/Desktop");
}
else
{
//
ElMessage({
message: data.message,
type: "error",
center: true,
});
ui.submit_btn_disable = false;
ui.submit_btn_loading = false;
}
})
.catch((error) =>
{
//
console.log(error);
ElMessage({
message: error.message,
type: "error",
center: true,
});
ui.submit_btn_disable = false;
ui.submit_btn_loading = false;
//
store.state.app.userInfo = null;
});
};
onBeforeMount(() =>
{
//
ui.current_menu = tab_menu[0].type;
});
onMounted(() =>
{
//
store.state.app.userInfo = null;
});
return {
//
ui,
loginForm,
tab_menu,
//
onToggleMenu,
saveUserInfo,
login,
getValidateCode,
};
},
return {
//
ui,
loginForm,
tabMenu,
//
onToggleMenu,
saveUserInfo,
login,
getValidateCode,
};
},
};
</script>
@ -292,4 +322,4 @@ export default {
.el-button-block {
width: 100%;
}
</style>
</style>

View File

@ -1,21 +1,21 @@
<!--
* 佛曰:
* 写字楼里写字间写字间里程序员
* 程序人员写程序又拿程序换酒钱
* 酒醒只在网上坐酒醉还来网下眠
* 酒醉酒醒日复日网上网下年复年
* 但愿老死电脑间不愿鞠躬老板前
* 奔驰宝马贵者趣公交自行程序员
* 别人笑我忒疯癫我笑自己命太贱
* 不见满街漂亮妹哪个归得程序员
* 佛曰:
* 写字楼里写字间写字间里程序员
* 程序人员写程序又拿程序换酒钱
* 酒醒只在网上坐酒醉还来网下眠
* 酒醉酒醒日复日网上网下年复年
* 但愿老死电脑间不愿鞠躬老板前
* 奔驰宝马贵者趣公交自行程序员
* 别人笑我忒疯癫我笑自己命太贱
* 不见满街漂亮妹哪个归得程序员
* @Author: Kane
* @Date: 2023-02-21 11:03:15
* @LastEditors: Kane
* @LastEditTime: 2023-02-24 11:09:40
* @LastEditTime: 2023-03-21 23:22:57
* @FilePath: /it-console/src/views/info/StaffInfo.vue
* @Description:<
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
<div class="view_wrapper">
@ -25,19 +25,19 @@
<span>姓名</span>
</el-col>
<el-col :span="4">
<el-input v-model.trim.lazy="query_param.stuffName"></el-input>
<el-input v-model.trim.lazy="queryParam.stuffName" />
</el-col>
<el-col :span="2">
<span>工号</span>
</el-col>
<el-col :span="4">
<el-input v-model.trim.lazy="query_param.stuffCode"></el-input>
<el-input v-model.trim.lazy="queryParam.stuffCode" />
</el-col>
<el-col :span="2">
<span>P13账号</span>
</el-col>
<el-col :span="4">
<el-input v-model.trim.lazy="query_param.p13UID"></el-input>
<el-input v-model.trim.lazy="queryParam.p13UID" />
</el-col>
</el-row>
<el-row :gutter="10">
@ -45,18 +45,25 @@
<span>部门</span>
</el-col>
<el-col :span="4">
<el-input v-model.trim.lazy="query_param.departmentName"></el-input>
<el-input v-model.trim.lazy="queryParam.departmentName" />
</el-col>
<el-col :span="2">
<span>部门代码</span>
</el-col>
<el-col :span="4">
<el-input v-model.trim.lazy="query_param.departmentCode"></el-input>
<el-input v-model.trim.lazy="queryParam.departmentCode" />
</el-col>
<el-col :span="6">
<div class="toolbutton-wrapper">
<el-button type="primary" icon="search">查询</el-button>
<el-button icon="Refresh">重置</el-button>
<el-button
type="primary"
icon="search"
>
查询
</el-button>
<el-button icon="Refresh">
重置
</el-button>
</div>
</el-col>
</el-row>
@ -71,7 +78,7 @@ export default {
name: "StuffInfo",
setup()
{
const query_param = reactive(
const queryParam = reactive(
{
stuffName: "",
stuffCode: "",
@ -82,7 +89,7 @@ export default {
);
return {
query_param,
queryParam,
};
},
};
@ -114,4 +121,4 @@ export default {
justify-content: right;
align-items: center;
}
</style>
</style>

View File

@ -4,25 +4,25 @@
* @LastEditors: Kane
* @LastEditTime: 2023-02-06 08:32:09
* @FilePath: /IT/src/views/requirement/RequirementEditing.vue
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
需求编辑页面
<div>需求编辑页面</div>
</template>
<script>
import { onBeforeMount, onBeforeUpdate } from 'vue';
import { useRoute } from 'vue-router';
import { onBeforeMount, onBeforeUpdate } from "vue";
import { useRoute } from "vue-router";
export default {
name: "requirement-editing",
name: "RequirementEditing",
setup()
{
const route = useRoute();
//
//
onBeforeMount(() =>
{
console.log("接收的参数:", route.query);
@ -40,4 +40,4 @@ export default {
<style scoped>
</style>
</style>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,47 @@
/*
* @Author: Kane
* @Date: 2023-03-01 23:38:12
* @LastEditors: Kane
* @FilePath: /task_schedule/tsconfig.json
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
{
"compilerOptions": {
"forceConsistentCasingInFileNames": true,
"useDefineForClassFields": true,
"target": "ESNext",
"module": "CommonJS",
"moduleResolution": "node",
"strict": true,
"jsx": "preserve",
"sourceMap": true,
"resolveJsonModule": true,
"esModuleInterop": false,
"baseUrl": "./", // paths
"paths": { //
"@/*": [
"src/*"
],
},
"lib": [
"ESNext",
"DOM"
],
"types": [
"vite/client"
]
},
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"*.d.ts",
"src/router/index.js",
"src/router/index.js",
],
"exclude": [
"./node_modules",
]
}