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 = { module.exports = {
presets: [ presets: [
'@vue/cli-plugin-babel/preset' "@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", "vite": "^4.1.4",
"vue": "^3.2.13", "vue": "^3.2.13",
"vue-router": "^4.0.3", "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": { "devDependencies": {
"@babel/core": "^7.12.16", "@babel/core": "^7.12.16",
@ -39,8 +41,7 @@
"@vue/cli-plugin-vuex": "~5.0.0", "@vue/cli-plugin-vuex": "~5.0.0",
"@vue/cli-service": "~5.0.0", "@vue/cli-service": "~5.0.0",
"@vue/compiler-sfc": "^3.2.26", "@vue/compiler-sfc": "^3.2.26",
"eslint": "^7.32.0", "eslint": "^8.35.0",
"eslint-plugin-vue": "^8.0.3",
"node-sass": "^8.0.0", "node-sass": "^8.0.0",
"sass-loader": "^13.2.0", "sass-loader": "^13.2.0",
"vite": "^2.7.2", "vite": "^2.7.2",
@ -48,6 +49,10 @@
"vite-plugin-html": "3.2.0", "vite-plugin-html": "3.2.0",
"vue-cli-plugin-element-plus": "~0.0.13", "vue-cli-plugin-element-plus": "~0.0.13",
"webpack": "^5.75.0", "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 * @Author: Kane
* @Date: 2022-12-14 15:12:46 * @Date: 2022-12-14 15:12:46
* @LastEditors: Kane * @LastEditors: Kane
* @LastEditTime: 2023-02-15 09:34:25 * @LastEditTime: 2023-03-21 23:14:06
* @FilePath: /IT/src/App.vue * @FilePath: /it-console/src/App.vue
* @Description: * @Description:
* *
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) ${2022} by Kane, All Rights Reserved.
--> -->
<template> <template>
<el-config-provider :locale="this.locale"> <el-config-provider :locale="locale">
<router-view></router-view> <router-view />
</el-config-provider> </el-config-provider>
</template> </template>
<script> <script>
// //
import zhCn from "element-plus/lib/locale/lang/zh-cn"; import zhCn from "element-plus/lib/locale/lang/zh-cn";
export default { export default {
name: "App", name: "App",
setup() components: {
{
const locale = zhCn;
return { locale, };
},
components: {
// HelloWorld, // HelloWorld,
}, },
setup()
{
const locale = zhCn;
return { locale, };
},
}; };
</script> </script>

View File

@ -9,19 +9,26 @@
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) ${2022} by Kane, All Rights Reserved.
--> -->
<template> <template>
<el-container id="layout-container" v-loading="ui.ageVisible" element-loading-text="载入应用数据…"> <el-container
<el-header id="layout-header"> id="layout-container"
<LayoutHeader /> v-loading="ui.ageVisible"
</el-header> element-loading-text="载入应用数据…"
<el-container id="layout-container-down"> >
<el-aside :width="asideWidth" id="layout-aside"> <el-header id="layout-header">
<LayoutAside /> <LayoutHeader />
</el-aside> </el-header>
<el-main id="layout-main"> <el-container id="layout-container-down">
<LayoutMain /> <el-aside
</el-main> id="layout-aside"
:width="asideWidth"
>
<LayoutAside />
</el-aside>
<el-main id="layout-main">
<LayoutMain />
</el-main>
</el-container>
</el-container> </el-container>
</el-container>
</template> </template>
<script> <script>
@ -33,50 +40,50 @@ import { onMounted, computed, reactive } from "vue";
// import { query_requirement_status } from "@/utils/api/requirement/requirement.js"; // import { query_requirement_status } from "@/utils/api/requirement/requirement.js";
export default { export default {
name: "layoutPage", name: "LayoutPage",
setup() components: {
{ LayoutAside,
const store = useStore(); LayoutHeader,
LayoutMain,
const ui = reactive( },
{ setup()
pageVisible: true,
});
const asideWidth = computed(() =>
{ {
const collapse = store.state.app.asideBarCollapse; const store = useStore();
return collapse === true ? "65px" : "180px"; const ui = reactive(
}); {
pageVisible: true,
});
onMounted(() => const asideWidth = computed(() =>
{ {
// const collapse = store.state.app.asideBarCollapse;
// query_requirement_status()
// .then((response) =>
// {
// // debugger;
// const data = response.data;
// console.log(data);
// })
// .catch((error) =>
// {
// // debugger;
// console.log(error);
// });
});
return { return collapse === true ? "65px" : "180px";
ui, });
asideWidth,
}; onMounted(() =>
}, {
components: { //
LayoutAside, // query_requirement_status()
LayoutHeader, // .then((response) =>
LayoutMain, // {
}, // // debugger;
// const data = response.data;
// console.log(data);
// })
// .catch((error) =>
// {
// // debugger;
// console.log(error);
// });
});
return {
ui,
asideWidth,
};
},
}; };
</script> </script>

View File

@ -2,39 +2,75 @@
* @Author: Kane * @Author: Kane
* @Date: 2023-01-04 11:30:33 * @Date: 2023-01-04 11:30:33
* @LastEditors: Kane * @LastEditors: Kane
* @LastEditTime: 2023-02-06 09:28:16 * @LastEditTime: 2023-03-21 23:18:41
* @FilePath: /IT/src/layout/components/Aside.vue * @FilePath: /it-console/src/layout/components/Aside.vue
* @Description: * @Description:
* *
* Copyright (c) ${2022} by Kane, All Rights Reserved. 223142 2f4156 * Copyright (c) ${2022} by Kane, All Rights Reserved. 223142 2f4156
--> -->
<template> <template>
<el-scrollbar class="wrapper"> <el-scrollbar class="wrapper">
<el-menu id="side-bar" router :default-active="currentPath" background-color="#2f4156" text-color="#fff" <el-menu
active-text-color="#ffd04b" :collapse="asideCollapse"> id="side-bar"
<template v-for="route in routes" :key="route.path"> 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="!route.hidden">
<template v-if="hasOnlyChild(route.children)"> <template v-if="hasOnlyChild(route.children)">
<!-- 当只有一个子路由时直接渲染子路由 --> <!-- 当只有一个子路由时直接渲染子路由 -->
<el-menu-item :index="route.children[0].path" class="sidebar-submenu"> <el-menu-item
<component :is="route.children[0].meta.icon" class="icons"> :key="route.path"
</component> :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> --> <!-- <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> </el-menu-item>
</template> </template>
<template v-else> <template v-else>
<!-- 不是一个子路由时有可能没有子路由或者是多个子路由 --> <!-- 不是一个子路由时有可能没有子路由或者是多个子路由 -->
<el-sub-menu v-if="route.children && route.children.length" :index="route.path" <el-sub-menu
class="sidebar-submenu"> v-if="route.children && route.children.length"
:key="route.path"
:index="route.path"
class="sidebar-submenu"
>
<template #title> <template #title>
<component :is="route.meta.icon" class="icons"></component> <component
:is="route.meta.icon"
class="icons"
/>
<span>{{ route.meta && route.meta.title }}</span> <span>{{ route.meta && route.meta.title }}</span>
</template> </template>
<template v-for="child in route.children" :key="child.path"> <template
<el-menu-item v-if="!child.hidden" :index="child.path" class="sidebar-item"> v-for="child in route.children"
<component :is="child.meta.icon" class="icons"></component> >
<template #title>{{ child.meta && child.meta.title }}</template> <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> </el-menu-item>
</template> </template>
</el-sub-menu> </el-sub-menu>
@ -54,23 +90,23 @@ export default {
name: "LayoutAside", name: "LayoutAside",
setup() setup()
{ {
const router = useRouter();// const router = useRouter();//
const routes = router.getRoutes();// const routes = router.getRoutes();//
const store = useStore(); const store = useStore();
// //
const hasOnlyChild = (children) => const hasOnlyChild = (children) =>
{ {
// //
if (!children) if (!children)
{ {
return false; return false;
} }
//hidden // hidden
const routes = children.filter((item) => const routes = children.filter((item) =>
{ {
return item.hidden ? false : true; return !item.hidden;
}); });
if (routes.length === 1) if (routes.length === 1)
@ -81,16 +117,16 @@ export default {
return false; return false;
}; };
// //
// //
const currentPath = computed(() => const currentPath = computed(() =>
{ {
let path = useRoute().path; const path = useRoute().path;
return path; return path;
}); });
// //
const asideCollapse = computed(() => const asideCollapse = computed(() =>
{ {
return store.state.app.ui.asideBarCollapse; return store.state.app.ui.asideBarCollapse;

View File

@ -9,49 +9,52 @@
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) ${2022} by Kane, All Rights Reserved.
--> -->
<template> <template>
<div class="app_banner no_select"> <div class="app_banner no_select">
<span class="company_name">CPIC</span> <span class="company_name">CPIC</span>
<div class="version_div"> <div class="version_div">
<div>测试版</div> <div>测试版</div>
<div>3.6.7 x64 Build 202208301257</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>
<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> </template>
<script> <script>
//import { ElMessage } from "element-plus"; // import { ElMessage } from "element-plus";
import { Logout } from "../../utils/api/info/account"; import { Logout } from "../../utils/api/info/account";
export default { export default {
name: "AppBanner", name: "AppBanner",
data() data()
{
return {};
},
// created() {
// console.log("banner");
// },
mounted()
{
//console.log("banner");
},
methods: {
logout()
{ {
this.$confirm("是否退出系统?", "请确认", { return {};
confirmButtonText: "是", },
cancelButtonText: "否", // created() {
type: "warning", // console.log("banner");
}).then(() => // },
{ mounted()
Logout(); {
}); // console.log("banner");
},
methods: {
logout()
{
this.$confirm("是否退出系统?", "请确认", {
confirmButtonText: "是",
cancelButtonText: "否",
type: "warning",
}).then(() =>
{
Logout();
});
},
}, },
},
}; };
</script> </script>
<style scoped> <style scoped>

View File

@ -2,24 +2,27 @@
* @Author: Kane * @Author: Kane
* @Date: 2023-01-04 11:39:04 * @Date: 2023-01-04 11:39:04
* @LastEditors: Kane * @LastEditors: Kane
* @LastEditTime: 2023-02-22 18:33:11 * @LastEditTime: 2023-03-21 23:19:06
* @FilePath: /IT/src/layout/components/Header.vue * @FilePath: /it-console/src/layout/components/Header.vue
* @Description: * @Description:
* *
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) ${2022} by Kane, All Rights Reserved.
--> -->
<template> <template>
<div class="app_banner no_select"> <div class="app_banner no_select">
<span class="company_name">CPIC</span> <span class="company_name">CPIC</span>
<div class="version_div"> <div class="version_div">
<div>测试版</div> <div>测试版</div>
<div>3.6.7 x64 Build 202208301257</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>
<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> </template>
<script> <script>
@ -27,23 +30,23 @@ import { ElMessageBox } from "element-plus";
import { Logout } from "../../utils/api/info/account"; import { Logout } from "../../utils/api/info/account";
export default { export default {
name: "AppBanner", name: "AppBanner",
setup() setup()
{
const logout = () =>
{ {
ElMessageBox.confirm("是否退出系统?", "请确认", { const logout = () =>
confirmButtonText: "是", {
cancelButtonText: "否", ElMessageBox.confirm("是否退出系统?", "请确认", {
type: "warning", confirmButtonText: "是",
}).then(() => cancelButtonText: "否",
{ type: "warning",
Logout(); }).then(() =>
}); {
}; Logout();
});
};
return { logout, }; return { logout, };
}, },
}; };
</script> </script>
<style scoped> <style scoped>

View File

@ -2,8 +2,8 @@
* @Author: Kane * @Author: Kane
* @Date: 2023-01-04 11:40:03 * @Date: 2023-01-04 11:40:03
* @LastEditors: Kane * @LastEditors: Kane
* @LastEditTime: 2023-02-07 10:47:57 * @LastEditTime: 2023-03-21 23:19:27
* @FilePath: /IT/src/layout/components/Main.vue * @FilePath: /it-console/src/layout/components/Main.vue
* @Description: * @Description:
* *
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) ${2022} by Kane, All Rights Reserved.

View File

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

View File

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

View File

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

View File

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

View File

@ -10,47 +10,77 @@
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) ${2022} by Kane, All Rights Reserved.
--> -->
<template> <template>
<div id="login"> <div id="login">
<div class="form-wrapper"> <div class="form-wrapper">
<ul class="menu-tab"> <ul class="menu-tab">
<li :class="{ 'current': ui.current_menu === item.type }" @click="onToggleMenu(item.type)" <li
v-for="item in tab_menu" :key="item.type">{{ item.label }} v-for="item in tabMenu"
</li> :key="item.type"
</ul> :class="{ 'current': ui.current_menu === item.type }"
<!-- <el-form ref="form" :model="form"> --> @click="onToggleMenu(item.type)"
<el-form ref="form"> >
<el-form-item> {{ item.label }}
<label class="form-label">用户名</label> </li>
<el-input type="text" v-model.lazy.trim="loginForm.username"></el-input> </ul>
</el-form-item> <!-- <el-form ref="form" :model="form"> -->
<el-form-item> <el-form ref="form">
<label class="form-label">密码</label> <el-form-item>
<el-input type="password" v-model.lazy.trim="loginForm.password"></el-input> <label class="form-label">用户名</label>
</el-form-item> <el-input
<el-form-item v-show="ui.current_menu === tab_menu[1].type"> v-model.lazy.trim="loginForm.username"
<label class="form-label">确认密码</label> type="text"
<el-input type="password" disabled v-model.lazy.trim="loginForm.confirm_password"></el-input> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<label class="form-label">验证码</label> <label class="form-label">密码</label>
<el-row :gutter="10"> <el-input
<el-col :span="14"> v-model.lazy.trim="loginForm.password"
<el-input type="text" disabled></el-input> type="password"
</el-col> />
<el-col :span="10"> </el-form-item>
<el-button type="danger" disabled class="el-button-block" @click="getValidateCode()">获取验证码</el-button> <el-form-item v-show="ui.current_menu === tabMenu[1].type">
</el-col> <label class="form-label">确认密码</label>
</el-row> <el-input
</el-form-item> v-model.lazy.trim="loginForm.confirm_password"
<el-form-item> type="password"
<el-button type="primary" class="el-button-block" @click="login" :disabled="ui.submit_btn_disable" disabled
:loading="ui.submit_btn_loading"> />
{{ ui.current_menu === "login" ? "登录" : "注册" }} </el-form-item>
</el-button> <el-form-item>
</el-form-item> <label class="form-label">验证码</label>
</el-form> <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>
</div>
</template> </template>
<script> <script>
@ -60,168 +90,168 @@ import { useRouter } from "vue-router";
import { Login } from "@/utils/api/info/account"; import { Login } from "@/utils/api/info/account";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
//import router from "../../router/index"; // import router from "../../router/index";
export default { export default {
name: "loginPage", name: "LoginPage",
setup() 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) =>
{ {
ui.current_menu = type; const store = useStore();
console.log(process.env.VUE_APP_API_URL_LOGIN); const router = useRouter();
};
const getValidateCode = () => const loginForm = reactive({
{ username: "",
ElMessage({ password: "",
message: "测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字", confirm_password: "",
center: true, validateCode: "",
type: "error", });
});
};
//tokenvuexlocalStorage const tabMenu = reactive(
const saveUserInfo = (userInfo) => [
{ { type: "login", label: "登录", },
console.log("保存用户信息"); { type: "regiester", label: "注册", },
console.log("保存用户信息", store); ]);
//vuex
store.commit("app/SET_USERINFO", userInfo);
//localStorage const ui = reactive(
const token = userInfo.token; {
const userInfoJson = JSON.stringify(userInfo); current_menu: "",
staffInfo: null,
submit_btn_disable: false,
submit_btn_loading: false,
});
window.localStorage.setItem("token", token); const onToggleMenu = (type) =>
window.localStorage.setItem("user_info", userInfoJson); {
}; 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 = () => const login = () =>
{ {
if (loginForm.username.length === 0 || loginForm.password === 0) if (loginForm.username.length === 0 || loginForm.password === 0)
{ {
ElMessage({ ElMessage({
message: "请填写您的P13账号和密码", message: "请填写您的P13账号和密码",
type: "error", 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; onMounted(() =>
}
ui.submit_btn_disable = true;
ui.submit_btn_loading = true;
const userInfo = {
p13account: loginForm.username,
password: loginForm.password,
};
Login(userInfo)
.then((response) =>
{ {
// //
//tokenvuexlocalStoreage store.state.app.userInfo = null;
//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(() => return {
{ //
// ui,
ui.current_menu = tab_menu[0].type; loginForm,
}); tabMenu,
//
onMounted(() => onToggleMenu,
{ saveUserInfo,
// login,
store.state.app.userInfo = null; getValidateCode,
}); };
},
return {
//
ui,
loginForm,
tab_menu,
//
onToggleMenu,
saveUserInfo,
login,
getValidateCode,
};
},
}; };
</script> </script>

View File

@ -11,7 +11,7 @@
* @Author: Kane * @Author: Kane
* @Date: 2023-02-21 11:03:15 * @Date: 2023-02-21 11:03:15
* @LastEditors: Kane * @LastEditors: Kane
* @LastEditTime: 2023-02-24 11:09:40 * @LastEditTime: 2023-03-21 23:22:57
* @FilePath: /it-console/src/views/info/StaffInfo.vue * @FilePath: /it-console/src/views/info/StaffInfo.vue
* @Description:< * @Description:<
* *
@ -25,19 +25,19 @@
<span>姓名</span> <span>姓名</span>
</el-col> </el-col>
<el-col :span="4"> <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>
<el-col :span="2"> <el-col :span="2">
<span>工号</span> <span>工号</span>
</el-col> </el-col>
<el-col :span="4"> <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>
<el-col :span="2"> <el-col :span="2">
<span>P13账号</span> <span>P13账号</span>
</el-col> </el-col>
<el-col :span="4"> <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-col>
</el-row> </el-row>
<el-row :gutter="10"> <el-row :gutter="10">
@ -45,18 +45,25 @@
<span>部门</span> <span>部门</span>
</el-col> </el-col>
<el-col :span="4"> <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>
<el-col :span="2"> <el-col :span="2">
<span>部门代码</span> <span>部门代码</span>
</el-col> </el-col>
<el-col :span="4"> <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>
<el-col :span="6"> <el-col :span="6">
<div class="toolbutton-wrapper"> <div class="toolbutton-wrapper">
<el-button type="primary" icon="search">查询</el-button> <el-button
<el-button icon="Refresh">重置</el-button> type="primary"
icon="search"
>
查询
</el-button>
<el-button icon="Refresh">
重置
</el-button>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
@ -71,7 +78,7 @@ export default {
name: "StuffInfo", name: "StuffInfo",
setup() setup()
{ {
const query_param = reactive( const queryParam = reactive(
{ {
stuffName: "", stuffName: "",
stuffCode: "", stuffCode: "",
@ -82,7 +89,7 @@ export default {
); );
return { return {
query_param, queryParam,
}; };
}, },
}; };

View File

@ -9,20 +9,20 @@
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) ${2022} by Kane, All Rights Reserved.
--> -->
<template> <template>
需求编辑页面 <div>需求编辑页面</div>
</template> </template>
<script> <script>
import { onBeforeMount, onBeforeUpdate } from 'vue'; import { onBeforeMount, onBeforeUpdate } from "vue";
import { useRoute } from 'vue-router'; import { useRoute } from "vue-router";
export default { export default {
name: "requirement-editing", name: "RequirementEditing",
setup() setup()
{ {
const route = useRoute(); const route = useRoute();
// //
onBeforeMount(() => onBeforeMount(() =>
{ {
console.log("接收的参数:", route.query); console.log("接收的参数:", route.query);

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",
]
}