commit 8054a60a86c87842927eb9e04b405b7ab96ed1d6
Author: wuhuanxiao <316947114@qq.com>
Date: Wed Jan 8 15:30:48 2025 +0800
test
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..5b1a804
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,21 @@
+# 告诉EditorConfig插件,这是根文件,不用继续往上查找
+root = true
+
+# 匹配全部文件
+[*]
+# 缩进风格,可选space、tab
+indent_style = space
+# 缩进的空格数
+indent_size = 2
+# 设置字符集
+charset = utf-8
+# 结尾换行符,可选lf、cr、crlf
+end_of_line = lf
+# 在文件结尾插入新行
+trim_trailing_whitespace = true
+# 删除一行中的前后空格
+insert_final_newline = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..62190fe
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,17 @@
+# 页面标题
+VITE_APP_TITLE = 一重垂直铸机数字化平台
+
+# 开发环境配置
+VITE_APP_ENV = 'development'
+
+# 若依管理系统/开发环境
+VITE_APP_BASE_API = '/dev-api'
+
+# 应用访问路径 例如使用前缀 /admin/
+VITE_APP_CONTEXT_PATH = '/'
+
+# 监控地址
+VITE_APP_MONITRO_ADMIN = 'http://localhost:9090/admin/applications'
+
+# xxl-job 控制台地址
+VITE_APP_XXL_JOB_ADMIN = 'http://localhost:9100/xxl-job-admin'
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..4507f29
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,29 @@
+###
+ # @Company: 沈阳信诚科技
+ # @Email: html_venustar@163.com
+ # @Author: Liuqiming
+ # @Description:
+ # @LastEditors: Liuqiming
+ # @LastEditTime: 2024-02-27 11:14:25
+ # @Date: 2024-02-27 11:14:25
+###
+# 页面标题
+VITE_APP_TITLE = 一重垂直铸机数字化平台
+
+# 生产环境配置
+VITE_APP_ENV = 'production'
+
+# 应用访问路径 例如使用前缀 /admin/
+VITE_APP_CONTEXT_PATH = '/'
+
+# 监控地址
+VITE_APP_MONITRO_ADMIN = '/admin/applications'
+
+# 监控地址
+VITE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'
+
+# 若依管理系统/生产环境
+VITE_APP_BASE_API = '/prod-api'
+
+# 是否在打包时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..78a752d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..f2dd878
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,7 @@
+FROM swr.cn-north-4.myhuaweicloud.com/inossem_xingyun/nginx:1.22-alpine-3.16
+LABEL MAINTAINER="Inossem" VERSION="3.0" appName="Cfhi Web"
+
+COPY dist /usr/share/nginx/html
+COPY deploy/nginx.conf /etc/nginx/conf.d/default.conf
+
+ENV LANG=en_US.UTF-8
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..05a61e3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,52 @@
+
+## 前端运行
+
+```bash
+# 进入项目目录
+cd cfhi-web
+
+# 安装依赖
+npm install --registry=https://registry.npmmirror.com
+
+# 启动服务
+npm run dev
+
+# 构建测试环境 yarn build:stage
+npm run build:stage
+
+
+# 构建生产环境 yarn build:prod
+npm run build:prod
+
+
+# 前端访问地址 vite.config.js 中自行配置后台地址
+```
+
+## 项目代码开发要求
+1. vue文件涉及所有方法、函数、特殊情况自定义组件等,均需要添加注释及说明
+2. 所有接口请求,必须使用 then(()=>{}).catch(err => console.log(err)),若有接口请求错误,须在控制台输出错误信息
+3. 关于特殊情况单独封装的自定义组件,须在页面文件夹内创建页面专属的components文件夹,将自定义单独组件放入,方便后期维护
+4. 接手项目熟悉框架时,着重熟悉项目封装好的公共组件,公共方法及公共loading、提示、svg等,开发时使用公共内容减少代码冗余
+5. 前端文件创建目录要求:模块文件夹 ——> 菜单文件夹 ——> 页面文件,以方便后期维护
+ 例如:系统运维/人员管理/人员管理页面文件 - src/views/system/user/index
+6. 所有通用页面基于公共组件及公共方法开发,前端固定配置须摘出jsx或js文件
+7. 前端开发,框架分支为 init-dev,功能开发人员基于dev拉取自己的分支,开发完成后向dev合并
+8. 前端项目便捷路径配置说明
+ '@': ./src
+ '@A': ./src/api
+ '@S': ./src/assets
+ '@C': ./src/components
+ '@U': ./src/utils
+
+## 项目开发问题记录
+1.项目主要使用的 els-table 及 els-form 组件,已引入全局,开发文档请查询 component 文件夹内组件下的readme 文档
+2. TypeError: Cannot read properties of null (reading 'length')
+ 若发现如图报错,则须检查 jsx 语法内 return返回的dom元素不可直接为 <>> 若根据条件判断需要返回空值,须返回 即可解决报错问题
\ No newline at end of file
diff --git a/bin/build.bat b/bin/build.bat
new file mode 100644
index 0000000..ecbb454
--- /dev/null
+++ b/bin/build.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] Weḅdistļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn build:prod
+
+pause
\ No newline at end of file
diff --git a/bin/package.bat b/bin/package.bat
new file mode 100644
index 0000000..f5b24e0
--- /dev/null
+++ b/bin/package.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] װWeḅnode_modulesļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn --registry=https://registry.npmmirror.com
+
+pause
\ No newline at end of file
diff --git a/bin/run-web.bat b/bin/run-web.bat
new file mode 100644
index 0000000..d2fe397
--- /dev/null
+++ b/bin/run-web.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] ʹ Vite Web ̡
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn dev
+
+pause
\ No newline at end of file
diff --git a/deploy/nginx.conf b/deploy/nginx.conf
new file mode 100644
index 0000000..00e4624
--- /dev/null
+++ b/deploy/nginx.conf
@@ -0,0 +1,89 @@
+
+server {
+ listen 80;
+ server_name localhost;
+
+ # https配置参考 start
+ #listen 443 ssl;
+
+ # 证书直接存放 /docker/nginx/cert/ 目录下即可 更改证书名称即可 无需更改证书路径
+ #ssl on;
+ #ssl_certificate /etc/nginx/cert/xxx.local.crt; # /etc/nginx/cert/ 为docker映射路径 不允许更改
+ #ssl_certificate_key /etc/nginx/cert/xxx.local.key; # /etc/nginx/cert/ 为docker映射路径 不允许更改
+ #ssl_session_timeout 5m;
+ #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
+ #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
+ #ssl_prefer_server_ciphers on;
+ # https配置参考 end
+
+ # 演示环境配置 拦截除 GET POST 之外的所有请求
+ # if ($request_method !~* GET|POST) {
+ # rewrite ^/(.*)$ /403;
+ # }
+
+ # location = /403 {
+ # default_type application/json;
+ # return 200 '{"msg":"演示模式,不允许操作","code":500}';
+ # }
+
+ # 限制外网访问内网 actuator 相关路径
+ location ~ ^(/[^/]*)?/actuator(/.*)?$ {
+ return 403;
+ }
+
+ location / {
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header REMOTE-HOST $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "Upgrade";
+
+ root /usr/share/nginx/html;
+ try_files $uri $uri/ /index.html;
+ index index.html index.htm;
+ }
+
+ location /prod-api/ {
+ proxy_redirect off;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header REMOTE-HOST $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "Upgrade";
+
+ proxy_pass http://cfhi-server:8080/;
+ }
+
+ # https 会拦截内链所有的 http 请求 造成功能无法使用
+ # 解决方案1 将 admin 服务 也配置成 https
+ # 解决方案2 将菜单配置为外链访问 走独立页面 http 访问
+# location /admin/ {
+# proxy_set_header Host $http_host;
+# proxy_set_header X-Real-IP $remote_addr;
+# proxy_set_header REMOTE-HOST $remote_addr;
+# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+# proxy_pass http://monitor-admin/admin/;
+# }
+
+ # https 会拦截内链所有的 http 请求 造成功能无法使用
+ # 解决方案1 将 xxljob 服务 也配置成 https
+ # 解决方案2 将菜单配置为外链访问 走独立页面 http 访问
+# location /xxl-job-admin/ {
+# proxy_set_header Host $http_host;
+# proxy_set_header X-Real-IP $remote_addr;
+# proxy_set_header REMOTE-HOST $remote_addr;
+# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+# proxy_pass http://xxljob-admin/xxl-job-admin/;
+# }
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root html;
+ }
+}
diff --git a/html/ie.html b/html/ie.html
new file mode 100644
index 0000000..052ffcd
--- /dev/null
+++ b/html/ie.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+ 请升级您的浏览器
+
+
+
+
+
+
+请升级您的浏览器,以便我们更好的为您提供服务!
+您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。
+
+请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束
+自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明 。
+
+您可以选择更先进的浏览器
+推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。
+
+
+
+
\ No newline at end of file
diff --git a/image.png b/image.png
new file mode 100644
index 0000000..0b2c9ec
Binary files /dev/null and b/image.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..03bebc3
--- /dev/null
+++ b/index.html
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+ 一重垂直铸机数字化平台
+
+
+
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d52cc9f
--- /dev/null
+++ b/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "cfhi-web",
+ "version": "4.8.2",
+ "description": "一重垂直铸机数字化平台",
+ "author": "Inossem",
+ "license": "MIT",
+ "scripts": {
+ "dev": "vite",
+ "build:prod": "vite build",
+ "preview": "vite preview"
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://gitlab.inossem.com/cfhi-dcbem/cfhi-web.git"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "2.0.10",
+ "@vitejs/plugin-vue-jsx": "^2.1.1",
+ "@vueup/vue-quill": "1.2.0",
+ "@vueuse/core": "9.5.0",
+ "axios": "0.27.2",
+ "echarts": "5.4.0",
+ "echarts-gl": "^2.0.8",
+ "element-plus": "2.2.27",
+ "file-saver": "2.0.5",
+ "fuse.js": "6.6.2",
+ "html-to-image": "^1.11.11",
+ "html2canvas": "^1.4.1",
+ "js-cookie": "3.0.1",
+ "jsencrypt": "3.3.1",
+ "jspdf": "^2.5.1",
+ "mitt": "^3.0.1",
+ "nprogress": "0.2.0",
+ "pinia": "2.0.22",
+ "vue": "3.2.45",
+ "vue-cropper": "1.0.3",
+ "vue-router": "4.1.4",
+ "vuedraggable": "^4.1.0"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "3.1.0",
+ "@vue/compiler-sfc": "3.2.45",
+ "sass": "1.56.1",
+ "unplugin-auto-import": "0.11.4",
+ "unplugin-vue-setup-extend-plus": "0.4.9",
+ "vite": "3.2.3",
+ "vite-plugin-compression": "0.5.1",
+ "vite-plugin-svg-icons": "2.0.1"
+ }
+}
diff --git a/public/logo.png b/public/logo.png
new file mode 100644
index 0000000..a52c580
Binary files /dev/null and b/public/logo.png differ
diff --git a/public/static/img/profile.png b/public/static/img/profile.png
new file mode 100644
index 0000000..4986bc9
Binary files /dev/null and b/public/static/img/profile.png differ
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..8fc0d78
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/api/dataDisplay/aod.js b/src/api/dataDisplay/aod.js
new file mode 100644
index 0000000..8860653
--- /dev/null
+++ b/src/api/dataDisplay/aod.js
@@ -0,0 +1,18 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description:
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-01 11:11:44
+ * @Date: 2024-02-29 14:29:00
+ */
+import request from '@/utils/request'
+
+//精炼炉信息
+export function refiningFurnace() {
+ return request({
+ url: '/business/boeLftapping/refiningFurnace',
+ method: 'post',
+ })
+}
diff --git a/src/api/dataDisplay/overview.js b/src/api/dataDisplay/overview.js
new file mode 100644
index 0000000..4d410da
--- /dev/null
+++ b/src/api/dataDisplay/overview.js
@@ -0,0 +1,68 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description:
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-15 15:16:25
+ * @Date: 2024-03-14 10:12:55
+ */
+import request from '@/utils/request'
+
+// 班组,班组长
+export function queryTeamInfo(time) {
+ return request({
+ url: '/system/team/queryTeamInfo?time=' + time,
+ method: 'get',
+ })
+}
+
+// 质量对比
+export function qualityMonthCompare() {
+ return request({
+ url: '/quality/qualityMonthCompare',
+ method: 'post',
+ })
+}
+// 本年度各班组质量情况
+export function qualitySituationOfTeam() {
+ return request({
+ url: '/quality/qualitySituationOfTeam',
+ method: 'post',
+ })
+}
+// 成本费用
+export function costingPie(month) {
+ return request({
+ url: '/business/costingInformation/costingPie?monthNum=' + month,
+ method: 'get',
+ })
+}
+// 月度产量统计
+export function currentYearMonthlyProductionStatistics() {
+ return request({
+ url: '/busses/l2L3RepProdData/currentYearMonthlyProductionStatistics',
+ method: 'get',
+ })
+}
+// 机组生产监控
+export function realTimeData() {
+ return request({
+ url: '/unitMonitoring/realTimeData',
+ method: 'post',
+ })
+}
+// 班组产量对比
+export function everyTeamProductionStatistics() {
+ return request({
+ url: '/busses/l2L3RepProdData/everyTeamProductionStatistics',
+ method: 'get',
+ })
+}
+// 班组成本对比
+export function teamCostComparison(month) {
+ return request({
+ url: '/teamStatistics/teamCostComparison?monthNum=' + month,
+ method: 'get',
+ })
+}
\ No newline at end of file
diff --git a/src/api/demo/demo.js b/src/api/demo/demo.js
new file mode 100644
index 0000000..04d4025
--- /dev/null
+++ b/src/api/demo/demo.js
@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 查询测试单表列表
+export function listDemo(query) {
+ return request({
+ url: '/demo/demo/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 自定义分页接口
+export function pageDemo(query) {
+ return request({
+ url: '/demo/demo/page',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询测试单表详细
+export function getDemo(id) {
+ return request({
+ url: '/demo/demo/' + id,
+ method: 'get'
+ })
+}
+
+// 新增测试单表
+export function addDemo(data) {
+ return request({
+ url: '/demo/demo',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改测试单表
+export function updateDemo(data) {
+ return request({
+ url: '/demo/demo',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除测试单表
+export function delDemo(id) {
+ return request({
+ url: '/demo/demo/' + id,
+ method: 'delete'
+ })
+}
+
diff --git a/src/api/demo/tree.js b/src/api/demo/tree.js
new file mode 100644
index 0000000..4c7ebc0
--- /dev/null
+++ b/src/api/demo/tree.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询测试树表列表
+export function listTree(query) {
+ return request({
+ url: '/demo/tree/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询测试树表详细
+export function getTree(id) {
+ return request({
+ url: '/demo/tree/' + id,
+ method: 'get'
+ })
+}
+
+// 新增测试树表
+export function addTree(data) {
+ return request({
+ url: '/demo/tree',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改测试树表
+export function updateTree(data) {
+ return request({
+ url: '/demo/tree',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除测试树表
+export function delTree(id) {
+ return request({
+ url: '/demo/tree/' + id,
+ method: 'delete'
+ })
+}
diff --git a/src/api/digitalCasting/from/benchmarking.js b/src/api/digitalCasting/from/benchmarking.js
new file mode 100644
index 0000000..4f36409
--- /dev/null
+++ b/src/api/digitalCasting/from/benchmarking.js
@@ -0,0 +1,27 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description:
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-28 11:54:06
+ * @Date: 2024-03-20 11:24:43
+ */
+import request from '@/utils/request'
+
+// echarts接口
+export function compareLineDetails(data) {
+ return request({
+ url: '/business/report/compareLineDetails',
+ method: 'post',
+ data
+ })
+}
+// echarts接口
+export function compareBarDetails(data) {
+ return request({
+ url: '/business/report/compareBarDetails',
+ method: 'post',
+ data
+ })
+}
diff --git a/src/api/digitalCasting/from/castingFrom.js b/src/api/digitalCasting/from/castingFrom.js
new file mode 100644
index 0000000..5fdf671
--- /dev/null
+++ b/src/api/digitalCasting/from/castingFrom.js
@@ -0,0 +1,27 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 铸坯追溯接口
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-25 17:19:13
+ * @Date: 2024-03-21 09:07:20
+ */
+import request from "@/utils/request";
+
+// 大包回转变化
+export function getLadleRotationChanges(data) {
+ return request({
+ url: "/castingTrace/getLadleRotationChanges",
+ method: "post",
+ data
+ });
+}
+// 设备经过时间
+export function sliceList(data) {
+ return request({
+ url: "/castingTrace/sliceList",
+ method: "post",
+ data
+ });
+}
diff --git a/src/api/digitalCasting/monitor/achievements.js b/src/api/digitalCasting/monitor/achievements.js
new file mode 100644
index 0000000..eddea71
--- /dev/null
+++ b/src/api/digitalCasting/monitor/achievements.js
@@ -0,0 +1,27 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 生产实绩接口
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-28 15:16:11
+ * @Date: 2024-03-12 14:53:31
+ */
+import request from '@/utils/request'
+
+// 列表接口
+export function prodDataList(params) {
+ return request({
+ url: '/business/prodData/page',
+ method: 'get',
+ params
+ })
+}
+// 重量汇总
+export function prodDataGetWeight(params) {
+ return request({
+ url: '/business/prodData/getWeight',
+ method: 'get',
+ params
+ })
+}
diff --git a/src/api/digitalCasting/monitor/produceEvents.js b/src/api/digitalCasting/monitor/produceEvents.js
new file mode 100644
index 0000000..57420f9
--- /dev/null
+++ b/src/api/digitalCasting/monitor/produceEvents.js
@@ -0,0 +1,19 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 生产事件记录接口
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-05 09:20:07
+ * @Date: 2024-03-05 09:12:33
+ */
+import request from '@/utils/request'
+
+// 列表接口
+export function eventRecordsList(params) {
+ return request({
+ url: '/business/eventRecords/list',
+ method: 'get',
+ params
+ })
+}
diff --git a/src/api/digitalCasting/monitor/schedule.js b/src/api/digitalCasting/monitor/schedule.js
new file mode 100644
index 0000000..8de6f33
--- /dev/null
+++ b/src/api/digitalCasting/monitor/schedule.js
@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+// 铸坯跟踪 上方铸坯
+export function trace() {
+ return request({
+ url: '/monitoring/trace',
+ method: 'post',
+ })
+}
+
+// 铸坯跟踪 拉速、拉速斜率
+export function speed() {
+ return request({
+ url: '/monitoring/speed',
+ method: 'post',
+ })
+}
+
+// 生产事件监控
+export function event() {
+ return request({
+ url: '/monitoring/event',
+ method: 'post',
+ })
+}
diff --git a/src/api/digitalCasting/report/report.js b/src/api/digitalCasting/report/report.js
new file mode 100644
index 0000000..60d04a9
--- /dev/null
+++ b/src/api/digitalCasting/report/report.js
@@ -0,0 +1,80 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 铸坯报告 + 铸坯报告详情
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-18 14:47:00
+ * @Date: 2024-03-18 14:45:21
+ */
+import request from "@/utils/request";
+//浇铸计划列表
+export function reportList(params) {
+ return request({
+ url: "/business/report/list",
+ method: "get",
+ params
+ });
+}
+//铸坯报告头部信息
+export function getCastingReportById(id) {
+ return request({
+ url: `/business/report/${id}`,
+ method: "get",
+ });
+}
+//不同时间占比
+export function getProportion(data) {
+ return request({
+ url: `/business/report/getProportion`,
+ method: "post",
+ data
+ });
+}
+//查询检验实绩列表
+export function getBqsSmprlst(data) {
+ return request({
+ url: `/business/report/getBqsSmprlst`,
+ method: "post",
+ data
+ });
+}
+//查询工艺参数配置列表
+export function configQueryList() {
+ return request({
+ url: `/tech/config/queryList`,
+ method: "post",
+ });
+}
+//工艺参数折线图
+export function processParametersLineChart(data) {
+ return request({
+ url: `/business/report/getProcessParameters`,
+ method: "post",
+ data
+ });
+}
+// 精炼出钢实绩
+export function getBoeLftapping(data) {
+ return request({
+ url: `/business/report/getBoeLftapping`,
+ method: "post",
+ data
+ });
+}
+//发布
+export function update(data) {
+ return request({
+ url: `/business/report/update`,
+ method: "post",
+ data
+ });
+}
+// 浇铸事件
+export function getReportEvent(data) {
+ return request({
+ url: `/business/report/getReportEvents`,
+ method: "post",
+ data
+ });
+}
diff --git a/src/api/login.js b/src/api/login.js
new file mode 100644
index 0000000..649f59c
--- /dev/null
+++ b/src/api/login.js
@@ -0,0 +1,59 @@
+import request from '@/utils/request'
+
+// 登录方法
+export function login(username, password, code, uuid) {
+ const data = {
+ username,
+ password,
+ code,
+ uuid
+ }
+ return request({
+ url: '/login',
+ headers: {
+ isToken: false
+ },
+ method: 'post',
+ data: data
+ })
+}
+
+// 注册方法
+export function register(data) {
+ return request({
+ url: '/register',
+ headers: {
+ isToken: false
+ },
+ method: 'post',
+ data: data
+ })
+}
+
+// 获取用户详细信息
+export function getInfo() {
+ return request({
+ url: '/getInfo',
+ method: 'get'
+ })
+}
+
+// 退出方法
+export function logout() {
+ return request({
+ url: '/logout',
+ method: 'post'
+ })
+}
+
+// 获取验证码
+export function getCodeImg() {
+ return request({
+ url: '/captchaImage',
+ headers: {
+ isToken: false
+ },
+ method: 'get',
+ timeout: 20000
+ })
+}
\ No newline at end of file
diff --git a/src/api/menu.js b/src/api/menu.js
new file mode 100644
index 0000000..faef101
--- /dev/null
+++ b/src/api/menu.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 获取路由
+export const getRouters = () => {
+ return request({
+ url: '/getRouters',
+ method: 'get'
+ })
+}
\ No newline at end of file
diff --git a/src/api/monitor/cache.js b/src/api/monitor/cache.js
new file mode 100644
index 0000000..45a9003
--- /dev/null
+++ b/src/api/monitor/cache.js
@@ -0,0 +1,57 @@
+import request from '@/utils/request'
+
+// 查询缓存详细
+export function getCache() {
+ return request({
+ url: '/monitor/cache',
+ method: 'get'
+ })
+}
+
+// 查询缓存名称列表
+export function listCacheName() {
+ return request({
+ url: '/monitor/cache/getNames',
+ method: 'get'
+ })
+}
+
+// 查询缓存键名列表
+export function listCacheKey(cacheName) {
+ return request({
+ url: '/monitor/cache/getKeys/' + cacheName,
+ method: 'get'
+ })
+}
+
+// 查询缓存内容
+export function getCacheValue(cacheName, cacheKey) {
+ return request({
+ url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey,
+ method: 'get'
+ })
+}
+
+// 清理指定名称缓存
+export function clearCacheName(cacheName) {
+ return request({
+ url: '/monitor/cache/clearCacheName/' + cacheName,
+ method: 'delete'
+ })
+}
+
+// 清理指定键名缓存
+export function clearCacheKey(cacheName, cacheKey) {
+ return request({
+ url: '/monitor/cache/clearCacheKey/' + cacheName + '/' + cacheKey,
+ method: 'delete'
+ })
+}
+
+// 清理全部缓存
+export function clearCacheAll() {
+ return request({
+ url: '/monitor/cache/clearCacheAll',
+ method: 'delete'
+ })
+}
diff --git a/src/api/monitor/logininfor.js b/src/api/monitor/logininfor.js
new file mode 100644
index 0000000..4d112b7
--- /dev/null
+++ b/src/api/monitor/logininfor.js
@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+// 查询登录日志列表
+export function list(query) {
+ return request({
+ url: '/monitor/logininfor/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 删除登录日志
+export function delLogininfor(infoId) {
+ return request({
+ url: '/monitor/logininfor/' + infoId,
+ method: 'delete'
+ })
+}
+
+// 解锁用户登录状态
+export function unlockLogininfor(userName) {
+ return request({
+ url: '/monitor/logininfor/unlock/' + userName,
+ method: 'get'
+ })
+}
+
+// 清空登录日志
+export function cleanLogininfor() {
+ return request({
+ url: '/monitor/logininfor/clean',
+ method: 'delete'
+ })
+}
diff --git a/src/api/monitor/online.js b/src/api/monitor/online.js
new file mode 100644
index 0000000..bd22137
--- /dev/null
+++ b/src/api/monitor/online.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 查询在线用户列表
+export function list(query) {
+ return request({
+ url: '/monitor/online/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 强退用户
+export function forceLogout(tokenId) {
+ return request({
+ url: '/monitor/online/' + tokenId,
+ method: 'delete'
+ })
+}
diff --git a/src/api/monitor/operlog.js b/src/api/monitor/operlog.js
new file mode 100644
index 0000000..a04bca8
--- /dev/null
+++ b/src/api/monitor/operlog.js
@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+
+// 查询操作日志列表
+export function list(query) {
+ return request({
+ url: '/monitor/operlog/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 删除操作日志
+export function delOperlog(operId) {
+ return request({
+ url: '/monitor/operlog/' + operId,
+ method: 'delete'
+ })
+}
+
+// 清空操作日志
+export function cleanOperlog() {
+ return request({
+ url: '/monitor/operlog/clean',
+ method: 'delete'
+ })
+}
diff --git a/src/api/monitor/realTime.js b/src/api/monitor/realTime.js
new file mode 100644
index 0000000..7a2d620
--- /dev/null
+++ b/src/api/monitor/realTime.js
@@ -0,0 +1,10 @@
+// 浇铸计划 -- 浇次
+import request from "@U/request";
+
+export function getCastTimesNoList(params) {
+ return request({
+ url: '/business/report/getCastTimesNoList',
+ method: 'get',
+ params
+ })
+}
diff --git a/src/api/produce/Scheduling.js b/src/api/produce/Scheduling.js
new file mode 100644
index 0000000..4b8fe52
--- /dev/null
+++ b/src/api/produce/Scheduling.js
@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+// 查询所有班组信息
+export function queryAllList() {
+ return request({
+ url: '/system/team/queryAllList',
+ method: 'post',
+ })
+ }
+// 查询所有班次信息
+export function classesList() {
+ return request({
+ url: '/sf/shift/queryAllList',
+ method: 'post',
+ })
+}
+//批量排班
+export function batchGenerate(data) {
+ return request({
+ url: '/business/schedule/batchGenerate',
+ method: 'post',
+ data
+ })
+}
+//排班日历
+export function calendarList(data) {
+ return request({
+ url: '/business/schedule/calendarList',
+ method: 'post',
+ data
+ })
+}
diff --git a/src/api/produce/castingPlan.js b/src/api/produce/castingPlan.js
new file mode 100644
index 0000000..0ff35c4
--- /dev/null
+++ b/src/api/produce/castingPlan.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+//浇铸计划列表
+export function queryList(params) {
+ return request({
+ url: '/business/castingplan/list',
+ method: 'get',
+ params
+ })
+ }
diff --git a/src/api/produce/coordinate.js b/src/api/produce/coordinate.js
new file mode 100644
index 0000000..ae29afa
--- /dev/null
+++ b/src/api/produce/coordinate.js
@@ -0,0 +1,16 @@
+import request from "@/utils/request";
+//设备坐标设定列表
+export function equipmentList() {
+ return request({
+ url: "/equipment/equipment/list",
+ method: "post"
+ });
+}
+//设备坐标设定列表
+export function equipmentEdit(data) {
+ return request({
+ url: "/equipment/equipment/edit",
+ method: "post",
+ data,
+ });
+}
diff --git a/src/api/produce/information.js b/src/api/produce/information.js
new file mode 100644
index 0000000..aefe5ec
--- /dev/null
+++ b/src/api/produce/information.js
@@ -0,0 +1,125 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 生产信息录入接口
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-02-23 11:44:04
+ * @Date: 2024-02-20 13:53:49
+ */
+import request from '@/utils/request'
+// 浇铸计划 -- 浇次
+export function getCastTimesNoList() {
+ return request({
+ url: '/business/castingplan/getCastTimesNoList',
+ method: 'post',
+ })
+}
+// 加料 -- 物料名称
+export function materialInfoList(data) {
+ return request({
+ url: '/business/materialInfo/list',
+ method: 'post',
+ data
+ })
+}
+// 加料 -- 新增
+export function chargingInAdd(data) {
+ return request({
+ url: '/chargingIn/add',
+ method: 'post',
+ data
+ })
+}
+// 加料 -- 列表
+export function getChargingInList(data) {
+ return request({
+ url: '/chargingIn/list',
+ method: 'post',
+ data
+ })
+}
+// 加料 -- 编辑
+export function chargingInEdit(data) {
+ return request({
+ url: '/chargingIn/edit',
+ method: 'post',
+ data
+ })
+}
+// 加料 -- 编辑
+export function chargingInRemove(ids) {
+ return request({
+ url: '/chargingIn/remove/' + ids,
+ method: 'post',
+ })
+}
+// 质量 -- 新增
+export function qualityAddApi(data) {
+ return request({
+ url: '/quality/add',
+ method: 'post',
+ data
+ })
+}
+// 质量 -- 列表
+export function qualityListApi(data) {
+ return request({
+ url: '/quality/list',
+ method: 'post',
+ data
+ })
+}
+// 质量 -- 编辑
+export function qualityEditApi(data) {
+ return request({
+ url: '/quality/edit',
+ method: 'post',
+ data
+ })
+}
+// 质量 -- 删除
+export function qualityRemoveApi(ids) {
+ return request({
+ url: '/quality/remove/' + ids,
+ method: 'post',
+ })
+}
+// 质量 -- 铸坯编号
+export function qualityCastingList() {
+ return request({
+ url: '/quality/castingList',
+ method: 'post',
+ })
+}
+// 异常事件 -- 新增
+export function abnormalAddApi(data) {
+ return request({
+ url: '/abnormalEventInformation/add',
+ method: 'post',
+ data
+ })
+}
+// 异常事件 -- 列表
+export function abnormalListApi(data) {
+ return request({
+ url: '/abnormalEventInformation/list',
+ method: 'post',
+ data
+ })
+}
+// 异常事件 -- 编辑
+export function abnormalEditApi(data) {
+ return request({
+ url: '/abnormalEventInformation/edit',
+ method: 'post',
+ data
+ })
+}
+// 异常事件 -- 删除
+export function abnormalRemoveApi(ids) {
+ return request({
+ url: '/abnormalEventInformation/remove/' + ids,
+ method: 'post',
+ })
+}
diff --git a/src/api/produce/shiftManagement.js b/src/api/produce/shiftManagement.js
new file mode 100644
index 0000000..aaa7d16
--- /dev/null
+++ b/src/api/produce/shiftManagement.js
@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+// 班次表单列表查询
+export function queryTeamList() {
+ return request({
+ url: '/sf/shift/queryTeamList',
+ method: 'post',
+ })
+ }
+// 新增班次操作
+export function shiftAdd(data) {
+ return request({
+ url: '/sf/shift/add',
+ method: 'post',
+ data,
+ })
+ }
+// 删除班次操作
+export function shiftDelete(id) {
+ return request({
+ url: `/sf/shift/${id}`,
+ method: 'get',
+ })
+ }
+// 编辑班次操作
+export function shiftUpdate(data) {
+ return request({
+ url: `/sf/shift/update`,
+ method: 'post',
+ data
+ })
+ }
\ No newline at end of file
diff --git a/src/api/produce/teamManagement.js b/src/api/produce/teamManagement.js
new file mode 100644
index 0000000..5475cd2
--- /dev/null
+++ b/src/api/produce/teamManagement.js
@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+// 班组表单列表查询
+export function queryTeamList() {
+ return request({
+ url: '/system/team/queryTeamList',
+ method: 'post',
+ })
+ }
+//新增班组
+export function teamAdd(data) {
+ return request({
+ url: '/system/team/add',
+ method: 'post',
+ data,
+ })
+ }
+//编辑班组 提交
+export function update(data) {
+ return request({
+ url: '/system/team/update ',
+ method: 'post',
+ data,
+ })
+}
+// 获取班长人员列表
+export function queryTeamUserList() {
+ return request({
+ url: '/sf/teamUser/queryTeamUserList',
+ method: 'post',
+ })
+ }
+//获取人员配置列表
+export function queryUserList(data) {
+ return request({
+ url: '/sf/teamUser/queryUserList',
+ method: 'post',
+ data
+ })
+ }
+//删除某一行
+export function deleteTeam(id) {
+ return request({
+ url: `/system/team/${id}`,
+ method: 'get',
+ })
+ }
+//人员配置确认操作
+export function staffingAdd(data) {
+ return request({
+ url: `/sf/teamUser/add`,
+ method: 'post',
+ data
+ })
+}
\ No newline at end of file
diff --git a/src/api/system/config.js b/src/api/system/config.js
new file mode 100644
index 0000000..9b93886
--- /dev/null
+++ b/src/api/system/config.js
@@ -0,0 +1,72 @@
+import request from '@/utils/request'
+
+// 查询参数列表
+export function listConfig(query) {
+ return request({
+ url: '/system/config/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询参数详细
+export function getConfig(configId) {
+ return request({
+ url: '/system/config/' + configId,
+ method: 'get'
+ })
+}
+
+// 根据参数键名查询参数值
+export function getConfigKey(configKey) {
+ return request({
+ url: '/system/config/configKey/' + configKey,
+ method: 'get'
+ })
+}
+
+// 新增参数配置
+export function addConfig(data) {
+ return request({
+ url: '/system/config',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改参数配置
+export function updateConfig(data) {
+ return request({
+ url: '/system/config',
+ method: 'put',
+ data: data
+ })
+}
+
+// 修改参数配置
+export function updateConfigByKey(key, value) {
+ return request({
+ url: '/system/config/updateByKey',
+ method: 'put',
+ data: {
+ configKey: key,
+ configValue: value
+ }
+ })
+}
+
+// 删除参数配置
+export function delConfig(configId) {
+ return request({
+ url: '/system/config/' + configId,
+ method: 'delete'
+ })
+}
+
+// 刷新参数缓存
+export function refreshCache() {
+ return request({
+ url: '/system/config/refreshCache',
+ method: 'delete'
+ })
+}
diff --git a/src/api/system/dept.js b/src/api/system/dept.js
new file mode 100644
index 0000000..fc943cd
--- /dev/null
+++ b/src/api/system/dept.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询部门列表
+export function listDept(query) {
+ return request({
+ url: '/system/dept/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询部门列表(排除节点)
+export function listDeptExcludeChild(deptId) {
+ return request({
+ url: '/system/dept/list/exclude/' + deptId,
+ method: 'get'
+ })
+}
+
+// 查询部门详细
+export function getDept(deptId) {
+ return request({
+ url: '/system/dept/' + deptId,
+ method: 'get'
+ })
+}
+
+// 新增部门
+export function addDept(data) {
+ return request({
+ url: '/system/dept',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改部门
+export function updateDept(data) {
+ return request({
+ url: '/system/dept',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除部门
+export function delDept(deptId) {
+ return request({
+ url: '/system/dept/' + deptId,
+ method: 'delete'
+ })
+}
\ No newline at end of file
diff --git a/src/api/system/dict/data.js b/src/api/system/dict/data.js
new file mode 100644
index 0000000..8ab1109
--- /dev/null
+++ b/src/api/system/dict/data.js
@@ -0,0 +1,61 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description:
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-02-06 11:26:10
+ * @Date: 2024-02-06 11:26:06
+ */
+import request from '@/utils/request'
+
+// 查询字典数据列表
+export function listData(query) {
+ return request({
+ url: '/system/dict/data/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询字典数据详细
+export function getData(dictCode) {
+ return request({
+ url: '/system/dict/data/' + dictCode,
+ method: 'get'
+ })
+}
+
+// 根据字典类型查询字典数据信息
+export function getDicts(dictType) {
+ return request({
+ url: '/system/dict/data/type/' + dictType,
+ method: 'get'
+ })
+}
+
+// 新增字典数据
+export function addData(data) {
+ return request({
+ url: '/system/dict/data',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改字典数据
+export function updateData(data) {
+ return request({
+ url: '/system/dict/data',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除字典数据
+export function delData(dictCode) {
+ return request({
+ url: '/system/dict/data/' + dictCode,
+ method: 'delete'
+ })
+}
diff --git a/src/api/system/dict/type.js b/src/api/system/dict/type.js
new file mode 100644
index 0000000..f931f84
--- /dev/null
+++ b/src/api/system/dict/type.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 查询字典类型列表
+export function listType(query) {
+ return request({
+ url: '/system/dict/type/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询字典类型详细
+export function getType(dictId) {
+ return request({
+ url: '/system/dict/type/' + dictId,
+ method: 'get'
+ })
+}
+
+// 新增字典类型
+export function addType(data) {
+ return request({
+ url: '/system/dict/type',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改字典类型
+export function updateType(data) {
+ return request({
+ url: '/system/dict/type',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除字典类型
+export function delType(dictId) {
+ return request({
+ url: '/system/dict/type/' + dictId,
+ method: 'delete'
+ })
+}
+
+// 刷新字典缓存
+export function refreshCache() {
+ return request({
+ url: '/system/dict/type/refreshCache',
+ method: 'delete'
+ })
+}
+
+// 获取字典选择框列表
+export function optionselect() {
+ return request({
+ url: '/system/dict/type/optionselect',
+ method: 'get'
+ })
+}
+
diff --git a/src/api/system/menu.js b/src/api/system/menu.js
new file mode 100644
index 0000000..f6415c6
--- /dev/null
+++ b/src/api/system/menu.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询菜单列表
+export function listMenu(query) {
+ return request({
+ url: '/system/menu/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询菜单详细
+export function getMenu(menuId) {
+ return request({
+ url: '/system/menu/' + menuId,
+ method: 'get'
+ })
+}
+
+// 查询菜单下拉树结构
+export function treeselect() {
+ return request({
+ url: '/system/menu/treeselect',
+ method: 'get'
+ })
+}
+
+// 根据角色ID查询菜单下拉树结构
+export function roleMenuTreeselect(roleId) {
+ return request({
+ url: '/system/menu/roleMenuTreeselect/' + roleId,
+ method: 'get'
+ })
+}
+
+// 新增菜单
+export function addMenu(data) {
+ return request({
+ url: '/system/menu',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改菜单
+export function updateMenu(data) {
+ return request({
+ url: '/system/menu',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除菜单
+export function delMenu(menuId) {
+ return request({
+ url: '/system/menu/' + menuId,
+ method: 'delete'
+ })
+}
\ No newline at end of file
diff --git a/src/api/system/notice.js b/src/api/system/notice.js
new file mode 100644
index 0000000..c274ea5
--- /dev/null
+++ b/src/api/system/notice.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询公告列表
+export function listNotice(query) {
+ return request({
+ url: '/system/notice/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询公告详细
+export function getNotice(noticeId) {
+ return request({
+ url: '/system/notice/' + noticeId,
+ method: 'get'
+ })
+}
+
+// 新增公告
+export function addNotice(data) {
+ return request({
+ url: '/system/notice',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改公告
+export function updateNotice(data) {
+ return request({
+ url: '/system/notice',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除公告
+export function delNotice(noticeId) {
+ return request({
+ url: '/system/notice/' + noticeId,
+ method: 'delete'
+ })
+}
\ No newline at end of file
diff --git a/src/api/system/oss.js b/src/api/system/oss.js
new file mode 100644
index 0000000..1df68ad
--- /dev/null
+++ b/src/api/system/oss.js
@@ -0,0 +1,28 @@
+
+import request from '@/utils/request'
+
+// 查询OSS对象存储列表
+export function listOss(query) {
+ return request({
+ url: '/system/oss/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询OSS对象基于id串
+export function listByIds(ossId) {
+ return request({
+ url: '/system/oss/listByIds/' + ossId,
+ method: 'get'
+ })
+}
+
+// 删除OSS对象存储
+export function delOss(ossId) {
+ return request({
+ url: '/system/oss/' + ossId,
+ method: 'post'
+ })
+}
+
diff --git a/src/api/system/ossConfig.js b/src/api/system/ossConfig.js
new file mode 100644
index 0000000..f290762
--- /dev/null
+++ b/src/api/system/ossConfig.js
@@ -0,0 +1,58 @@
+import request from '@/utils/request'
+
+// 查询对象存储配置列表
+export function listOssConfig(query) {
+ return request({
+ url: '/system/oss/config/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询对象存储配置详细
+export function getOssConfig(ossConfigId) {
+ return request({
+ url: '/system/oss/config/' + ossConfigId,
+ method: 'get'
+ })
+}
+
+// 新增对象存储配置
+export function addOssConfig(data) {
+ return request({
+ url: '/system/oss/config',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改对象存储配置
+export function updateOssConfig(data) {
+ return request({
+ url: '/system/oss/config',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除对象存储配置
+export function delOssConfig(ossConfigId) {
+ return request({
+ url: '/system/oss/config/' + ossConfigId,
+ method: 'delete'
+ })
+}
+
+// 对象存储状态修改
+export function changeOssConfigStatus(ossConfigId, status, configKey) {
+ const data = {
+ ossConfigId,
+ status,
+ configKey
+ }
+ return request({
+ url: '/system/oss/config/changeStatus',
+ method: 'put',
+ data: data
+ })
+}
diff --git a/src/api/system/post.js b/src/api/system/post.js
new file mode 100644
index 0000000..1389260
--- /dev/null
+++ b/src/api/system/post.js
@@ -0,0 +1,45 @@
+import request from '@/utils/request'
+
+// 查询岗位列表
+export function listPost(query) {
+ return request({
+ url: '/system/post/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询岗位详细
+export function getPost(postId) {
+ return request({
+ url: '/system/post/' + postId,
+ method: 'get'
+ })
+}
+
+// 新增岗位
+export function addPost(data) {
+ return request({
+ url: '/system/post',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改岗位
+export function updatePost(data) {
+ return request({
+ url: '/system/post',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除岗位
+export function delPost(postId) {
+ return request({
+ url: '/system/post/' + postId,
+ method: 'delete'
+ })
+}
+
diff --git a/src/api/system/role.js b/src/api/system/role.js
new file mode 100644
index 0000000..f13e6f4
--- /dev/null
+++ b/src/api/system/role.js
@@ -0,0 +1,119 @@
+import request from '@/utils/request'
+
+// 查询角色列表
+export function listRole(query) {
+ return request({
+ url: '/system/role/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询角色详细
+export function getRole(roleId) {
+ return request({
+ url: '/system/role/' + roleId,
+ method: 'get'
+ })
+}
+
+// 新增角色
+export function addRole(data) {
+ return request({
+ url: '/system/role',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改角色
+export function updateRole(data) {
+ return request({
+ url: '/system/role',
+ method: 'put',
+ data: data
+ })
+}
+
+// 角色数据权限
+export function dataScope(data) {
+ return request({
+ url: '/system/role/dataScope',
+ method: 'put',
+ data: data
+ })
+}
+
+// 角色状态修改
+export function changeRoleStatus(roleId, status) {
+ const data = {
+ roleId,
+ status
+ }
+ return request({
+ url: '/system/role/changeStatus',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除角色
+export function delRole(roleId) {
+ return request({
+ url: '/system/role/' + roleId,
+ method: 'delete'
+ })
+}
+
+// 查询角色已授权用户列表
+export function allocatedUserList(query) {
+ return request({
+ url: '/system/role/authUser/allocatedList',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询角色未授权用户列表
+export function unallocatedUserList(query) {
+ return request({
+ url: '/system/role/authUser/unallocatedList',
+ method: 'get',
+ params: query
+ })
+}
+
+// 取消用户授权角色
+export function authUserCancel(data) {
+ return request({
+ url: '/system/role/authUser/cancel',
+ method: 'put',
+ data: data
+ })
+}
+
+// 批量取消用户授权角色
+export function authUserCancelAll(data) {
+ return request({
+ url: '/system/role/authUser/cancelAll',
+ method: 'put',
+ params: data
+ })
+}
+
+// 授权用户选择
+export function authUserSelectAll(data) {
+ return request({
+ url: '/system/role/authUser/selectAll',
+ method: 'put',
+ params: data
+ })
+}
+
+// 根据角色ID查询部门树结构
+export function deptTreeSelect(roleId) {
+ return request({
+ url: '/system/role/deptTree/' + roleId,
+ method: 'get'
+ })
+}
diff --git a/src/api/system/user.js b/src/api/system/user.js
new file mode 100644
index 0000000..ab0414b
--- /dev/null
+++ b/src/api/system/user.js
@@ -0,0 +1,151 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/cfhi";
+
+// 查询用户列表
+export function listUser(query) {
+ return request({
+ url: '/system/user/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询用户详细
+export function getUser(userId) {
+ return request({
+ url: '/system/user/' + parseStrEmpty(userId),
+ method: 'get'
+ })
+}
+
+// 新增用户
+export function addUser(data) {
+ return request({
+ url: '/system/user',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改用户
+export function updateUser(data) {
+ return request({
+ url: '/system/user',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除用户
+export function delUser(userId) {
+ return request({
+ url: '/system/user/' + userId,
+ method: 'delete'
+ })
+}
+
+// 用户密码重置
+export function resetUserPwd(userId, password) {
+ const data = {
+ userId,
+ password
+ }
+ return request({
+ url: '/system/user/resetPwd',
+ method: 'put',
+ data: data
+ })
+}
+
+// 用户状态修改
+export function changeUserStatus(userId, status) {
+ const data = {
+ userId,
+ status
+ }
+ return request({
+ url: '/system/user/changeStatus',
+ method: 'put',
+ data: data
+ })
+}
+
+// 查询用户个人信息
+export function getUserProfile() {
+ return request({
+ url: '/system/user/profile',
+ method: 'get'
+ })
+}
+
+// 修改用户个人信息
+export function updateUserProfile(data) {
+ return request({
+ url: '/system/user/profile',
+ method: 'put',
+ data: data
+ })
+}
+
+// 用户密码重置
+export function updateUserPwd(oldPassword, newPassword) {
+ const data = {
+ oldPassword,
+ newPassword
+ }
+ return request({
+ url: '/system/user/profile/updatePwd',
+ method: 'put',
+ params: data
+ })
+}
+
+// 用户头像上传
+export function uploadAvatar(data) {
+ return request({
+ url: '/system/user/profile/avatar',
+ method: 'post',
+ data: data
+ })
+}
+
+// 查询授权角色
+export function getAuthRole(userId) {
+ return request({
+ url: '/system/user/authRole/' + userId,
+ method: 'get'
+ })
+}
+
+// 保存授权角色
+export function updateAuthRole(data) {
+ return request({
+ url: '/system/user/authRole',
+ method: 'put',
+ params: data
+ })
+}
+
+// 查询部门下拉树结构
+export function deptTreeSelect() {
+ return request({
+ url: '/system/user/deptTree',
+ method: 'get'
+ })
+}
+
+// 获取部门
+export function getByDeptId(postId='') {
+ return request({
+ url: '/system/post/getByDeptId?deptId=' + postId,
+ method: 'get'
+ })
+}
+
+// 根据部门获取班组
+export function userTeamlist(deptId='') {
+ return request({
+ url: '/system/user/userTeamlist?deptId=' + deptId,
+ method: 'get'
+ })
+}
\ No newline at end of file
diff --git a/src/api/tool/gen.js b/src/api/tool/gen.js
new file mode 100644
index 0000000..441791c
--- /dev/null
+++ b/src/api/tool/gen.js
@@ -0,0 +1,85 @@
+import request from '@/utils/request'
+
+// 查询生成表数据
+export function listTable(query) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/list',
+ method: 'get',
+ params: query
+ })
+}
+// 查询db数据库列表
+export function listDbTable(query) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/db/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询表详细信息
+export function getGenTable(tableId) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/' + tableId,
+ method: 'get'
+ })
+}
+
+// 修改代码生成信息
+export function updateGenTable(data) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen',
+ method: 'put',
+ data: data
+ })
+}
+
+// 导入表
+export function importTable(data) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/importTable',
+ method: 'post',
+ params: data
+ })
+}
+
+// 预览生成代码
+export function previewTable(tableId) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/preview/' + tableId,
+ method: 'get'
+ })
+}
+
+// 删除表数据
+export function delTable(tableId) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/' + tableId,
+ method: 'delete'
+ })
+}
+
+// 生成代码(自定义路径)
+export function genCode(tableName) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/genCode/' + tableName,
+ method: 'get'
+ })
+}
+
+// 同步数据库
+export function synchDb(tableName) {
+ return request({
+ headers: { 'datasource': localStorage.getItem("dataName") },
+ url: '/tool/gen/synchDb/' + tableName,
+ method: 'get'
+ })
+}
diff --git a/src/assets/401_images/401.gif b/src/assets/401_images/401.gif
new file mode 100644
index 0000000..cd6e0d9
Binary files /dev/null and b/src/assets/401_images/401.gif differ
diff --git a/src/assets/404_images/404.png b/src/assets/404_images/404.png
new file mode 100644
index 0000000..3d8e230
Binary files /dev/null and b/src/assets/404_images/404.png differ
diff --git a/src/assets/404_images/404_cloud.png b/src/assets/404_images/404_cloud.png
new file mode 100644
index 0000000..c6281d0
Binary files /dev/null and b/src/assets/404_images/404_cloud.png differ
diff --git a/src/assets/fonts/din.ttf b/src/assets/fonts/din.ttf
new file mode 100644
index 0000000..1220089
Binary files /dev/null and b/src/assets/fonts/din.ttf differ
diff --git a/src/assets/fonts/pmzd.ttf b/src/assets/fonts/pmzd.ttf
new file mode 100644
index 0000000..cd65b62
Binary files /dev/null and b/src/assets/fonts/pmzd.ttf differ
diff --git a/src/assets/icons/svg/404.svg b/src/assets/icons/svg/404.svg
new file mode 100644
index 0000000..6df5019
--- /dev/null
+++ b/src/assets/icons/svg/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/BilletNo.svg b/src/assets/icons/svg/BilletNo.svg
new file mode 100644
index 0000000..17e7dc3
--- /dev/null
+++ b/src/assets/icons/svg/BilletNo.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/Moon.svg b/src/assets/icons/svg/Moon.svg
new file mode 100644
index 0000000..5c5fe2e
--- /dev/null
+++ b/src/assets/icons/svg/Moon.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/Vector.svg b/src/assets/icons/svg/Vector.svg
new file mode 100644
index 0000000..d80565a
--- /dev/null
+++ b/src/assets/icons/svg/Vector.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/arrow-right.svg b/src/assets/icons/svg/arrow-right.svg
new file mode 100644
index 0000000..32a1458
--- /dev/null
+++ b/src/assets/icons/svg/arrow-right.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/assets/icons/svg/arrowBottom .svg b/src/assets/icons/svg/arrowBottom .svg
new file mode 100644
index 0000000..4b3f03e
--- /dev/null
+++ b/src/assets/icons/svg/arrowBottom .svg
@@ -0,0 +1,11 @@
+
diff --git a/src/assets/icons/svg/arrowBottom.svg b/src/assets/icons/svg/arrowBottom.svg
new file mode 100644
index 0000000..dd02c90
--- /dev/null
+++ b/src/assets/icons/svg/arrowBottom.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/arrowLeft.svg b/src/assets/icons/svg/arrowLeft.svg
new file mode 100644
index 0000000..4b3f03e
--- /dev/null
+++ b/src/assets/icons/svg/arrowLeft.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/assets/icons/svg/arrowRight.svg b/src/assets/icons/svg/arrowRight.svg
new file mode 100644
index 0000000..f066e55
--- /dev/null
+++ b/src/assets/icons/svg/arrowRight.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/billetDiameter.svg b/src/assets/icons/svg/billetDiameter.svg
new file mode 100644
index 0000000..8e14688
--- /dev/null
+++ b/src/assets/icons/svg/billetDiameter.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/billetLength.svg b/src/assets/icons/svg/billetLength.svg
new file mode 100644
index 0000000..c76f750
--- /dev/null
+++ b/src/assets/icons/svg/billetLength.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/billetPouring.svg b/src/assets/icons/svg/billetPouring.svg
new file mode 100644
index 0000000..cfef886
--- /dev/null
+++ b/src/assets/icons/svg/billetPouring.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/bug.svg b/src/assets/icons/svg/bug.svg
new file mode 100644
index 0000000..05a150d
--- /dev/null
+++ b/src/assets/icons/svg/bug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/build.svg b/src/assets/icons/svg/build.svg
new file mode 100644
index 0000000..97c4688
--- /dev/null
+++ b/src/assets/icons/svg/build.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/button.svg b/src/assets/icons/svg/button.svg
new file mode 100644
index 0000000..904fddc
--- /dev/null
+++ b/src/assets/icons/svg/button.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/cascader.svg b/src/assets/icons/svg/cascader.svg
new file mode 100644
index 0000000..e256024
--- /dev/null
+++ b/src/assets/icons/svg/cascader.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/casting-1.svg b/src/assets/icons/svg/casting-1.svg
new file mode 100644
index 0000000..1e52d92
--- /dev/null
+++ b/src/assets/icons/svg/casting-1.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/assets/icons/svg/casting-2.svg b/src/assets/icons/svg/casting-2.svg
new file mode 100644
index 0000000..4ffc088
--- /dev/null
+++ b/src/assets/icons/svg/casting-2.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/casting-3.svg b/src/assets/icons/svg/casting-3.svg
new file mode 100644
index 0000000..822ebf1
--- /dev/null
+++ b/src/assets/icons/svg/casting-3.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/casting-4.svg b/src/assets/icons/svg/casting-4.svg
new file mode 100644
index 0000000..e79a599
--- /dev/null
+++ b/src/assets/icons/svg/casting-4.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/casting-5.svg b/src/assets/icons/svg/casting-5.svg
new file mode 100644
index 0000000..874e2b2
--- /dev/null
+++ b/src/assets/icons/svg/casting-5.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/casting-6.svg b/src/assets/icons/svg/casting-6.svg
new file mode 100644
index 0000000..aaf6388
--- /dev/null
+++ b/src/assets/icons/svg/casting-6.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/casting-7.svg b/src/assets/icons/svg/casting-7.svg
new file mode 100644
index 0000000..c9f59fd
--- /dev/null
+++ b/src/assets/icons/svg/casting-7.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/assets/icons/svg/castingDetailsGygccs.svg b/src/assets/icons/svg/castingDetailsGygccs.svg
new file mode 100644
index 0000000..7262ef4
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsGygccs.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/assets/icons/svg/castingDetailsJljl.svg b/src/assets/icons/svg/castingDetailsJljl.svg
new file mode 100644
index 0000000..f26fff4
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsJljl.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/castingDetailsLlxx.svg b/src/assets/icons/svg/castingDetailsLlxx.svg
new file mode 100644
index 0000000..f163ed0
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsLlxx.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/castingDetailsMj.svg b/src/assets/icons/svg/castingDetailsMj.svg
new file mode 100644
index 0000000..9da8d4f
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsMj.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/castingDetailsNo1.svg b/src/assets/icons/svg/castingDetailsNo1.svg
new file mode 100644
index 0000000..e17ac4c
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsNo1.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/castingDetailsYcsj.svg b/src/assets/icons/svg/castingDetailsYcsj.svg
new file mode 100644
index 0000000..f9a66b2
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsYcsj.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/castingDetailsZd.svg b/src/assets/icons/svg/castingDetailsZd.svg
new file mode 100644
index 0000000..d5e702e
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsZd.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/assets/icons/svg/castingDetailsZj.svg b/src/assets/icons/svg/castingDetailsZj.svg
new file mode 100644
index 0000000..ebee067
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsZj.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/castingDetailsZl.svg b/src/assets/icons/svg/castingDetailsZl.svg
new file mode 100644
index 0000000..4ffc088
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsZl.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/castingDetailsZlxx.svg b/src/assets/icons/svg/castingDetailsZlxx.svg
new file mode 100644
index 0000000..edff7c5
--- /dev/null
+++ b/src/assets/icons/svg/castingDetailsZlxx.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/chart.svg b/src/assets/icons/svg/chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/src/assets/icons/svg/chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/checkbox.svg b/src/assets/icons/svg/checkbox.svg
new file mode 100644
index 0000000..013fd3a
--- /dev/null
+++ b/src/assets/icons/svg/checkbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/clipboard.svg b/src/assets/icons/svg/clipboard.svg
new file mode 100644
index 0000000..90923ff
--- /dev/null
+++ b/src/assets/icons/svg/clipboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/code.svg b/src/assets/icons/svg/code.svg
new file mode 100644
index 0000000..5f9c5ab
--- /dev/null
+++ b/src/assets/icons/svg/code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/color.svg b/src/assets/icons/svg/color.svg
new file mode 100644
index 0000000..44a81aa
--- /dev/null
+++ b/src/assets/icons/svg/color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/component.svg b/src/assets/icons/svg/component.svg
new file mode 100644
index 0000000..29c3458
--- /dev/null
+++ b/src/assets/icons/svg/component.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/countdown.svg b/src/assets/icons/svg/countdown.svg
new file mode 100644
index 0000000..fb99f0c
--- /dev/null
+++ b/src/assets/icons/svg/countdown.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/dashboard.svg b/src/assets/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/src/assets/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/date-range.svg b/src/assets/icons/svg/date-range.svg
new file mode 100644
index 0000000..fda571e
--- /dev/null
+++ b/src/assets/icons/svg/date-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/date.svg b/src/assets/icons/svg/date.svg
new file mode 100644
index 0000000..52dc73e
--- /dev/null
+++ b/src/assets/icons/svg/date.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/dict.svg b/src/assets/icons/svg/dict.svg
new file mode 100644
index 0000000..4849377
--- /dev/null
+++ b/src/assets/icons/svg/dict.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/display-clock.svg b/src/assets/icons/svg/display-clock.svg
new file mode 100644
index 0000000..27f2ffb
--- /dev/null
+++ b/src/assets/icons/svg/display-clock.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/assets/icons/svg/display-logo.svg b/src/assets/icons/svg/display-logo.svg
new file mode 100644
index 0000000..df4b1e1
--- /dev/null
+++ b/src/assets/icons/svg/display-logo.svg
@@ -0,0 +1,34 @@
+
diff --git a/src/assets/icons/svg/display-menu.svg b/src/assets/icons/svg/display-menu.svg
new file mode 100644
index 0000000..5e1cc10
--- /dev/null
+++ b/src/assets/icons/svg/display-menu.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/display-r1.svg b/src/assets/icons/svg/display-r1.svg
new file mode 100644
index 0000000..307f68e
--- /dev/null
+++ b/src/assets/icons/svg/display-r1.svg
@@ -0,0 +1,50 @@
+
diff --git a/src/assets/icons/svg/display-r2.svg b/src/assets/icons/svg/display-r2.svg
new file mode 100644
index 0000000..0b55094
--- /dev/null
+++ b/src/assets/icons/svg/display-r2.svg
@@ -0,0 +1,49 @@
+
diff --git a/src/assets/icons/svg/documentation.svg b/src/assets/icons/svg/documentation.svg
new file mode 100644
index 0000000..7043122
--- /dev/null
+++ b/src/assets/icons/svg/documentation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/download.svg b/src/assets/icons/svg/download.svg
new file mode 100644
index 0000000..c896951
--- /dev/null
+++ b/src/assets/icons/svg/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/drag.svg b/src/assets/icons/svg/drag.svg
new file mode 100644
index 0000000..4185d3c
--- /dev/null
+++ b/src/assets/icons/svg/drag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/druid.svg b/src/assets/icons/svg/druid.svg
new file mode 100644
index 0000000..a2b4b4e
--- /dev/null
+++ b/src/assets/icons/svg/druid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/edit.svg b/src/assets/icons/svg/edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/src/assets/icons/svg/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/education.svg b/src/assets/icons/svg/education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/src/assets/icons/svg/education.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/email.svg b/src/assets/icons/svg/email.svg
new file mode 100644
index 0000000..74d25e2
--- /dev/null
+++ b/src/assets/icons/svg/email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/endOfCasting.svg b/src/assets/icons/svg/endOfCasting.svg
new file mode 100644
index 0000000..739f5ae
--- /dev/null
+++ b/src/assets/icons/svg/endOfCasting.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/endOfFurnace.svg b/src/assets/icons/svg/endOfFurnace.svg
new file mode 100644
index 0000000..5c8e479
--- /dev/null
+++ b/src/assets/icons/svg/endOfFurnace.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/example.svg b/src/assets/icons/svg/example.svg
new file mode 100644
index 0000000..46f42b5
--- /dev/null
+++ b/src/assets/icons/svg/example.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/excel.svg b/src/assets/icons/svg/excel.svg
new file mode 100644
index 0000000..74d97b8
--- /dev/null
+++ b/src/assets/icons/svg/excel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/exit-fullscreen.svg b/src/assets/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/src/assets/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/exportSvg.svg b/src/assets/icons/svg/exportSvg.svg
new file mode 100644
index 0000000..6682290
--- /dev/null
+++ b/src/assets/icons/svg/exportSvg.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/assets/icons/svg/eye-open.svg b/src/assets/icons/svg/eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/src/assets/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/eye.svg b/src/assets/icons/svg/eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/src/assets/icons/svg/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/form.svg b/src/assets/icons/svg/form.svg
new file mode 100644
index 0000000..dcbaa18
--- /dev/null
+++ b/src/assets/icons/svg/form.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/fullscreen.svg b/src/assets/icons/svg/fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/src/assets/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/github.svg b/src/assets/icons/svg/github.svg
new file mode 100644
index 0000000..db0a0d4
--- /dev/null
+++ b/src/assets/icons/svg/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/greenCheck.svg b/src/assets/icons/svg/greenCheck.svg
new file mode 100644
index 0000000..3247ed1
--- /dev/null
+++ b/src/assets/icons/svg/greenCheck.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/guide.svg b/src/assets/icons/svg/guide.svg
new file mode 100644
index 0000000..b271001
--- /dev/null
+++ b/src/assets/icons/svg/guide.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/guideBig.svg b/src/assets/icons/svg/guideBig.svg
new file mode 100644
index 0000000..a31725c
--- /dev/null
+++ b/src/assets/icons/svg/guideBig.svg
@@ -0,0 +1,33 @@
+
diff --git a/src/assets/icons/svg/icon.svg b/src/assets/icons/svg/icon.svg
new file mode 100644
index 0000000..82be8ee
--- /dev/null
+++ b/src/assets/icons/svg/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/input.svg b/src/assets/icons/svg/input.svg
new file mode 100644
index 0000000..ab91381
--- /dev/null
+++ b/src/assets/icons/svg/input.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/international.svg b/src/assets/icons/svg/international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/src/assets/icons/svg/international.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/job.svg b/src/assets/icons/svg/job.svg
new file mode 100644
index 0000000..2a93a25
--- /dev/null
+++ b/src/assets/icons/svg/job.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/kachi.svg b/src/assets/icons/svg/kachi.svg
new file mode 100644
index 0000000..3199be6
--- /dev/null
+++ b/src/assets/icons/svg/kachi.svg
@@ -0,0 +1,124 @@
+
diff --git a/src/assets/icons/svg/language.svg b/src/assets/icons/svg/language.svg
new file mode 100644
index 0000000..0082b57
--- /dev/null
+++ b/src/assets/icons/svg/language.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/link.svg b/src/assets/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/src/assets/icons/svg/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/list.svg b/src/assets/icons/svg/list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/src/assets/icons/svg/list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/lock.svg b/src/assets/icons/svg/lock.svg
new file mode 100644
index 0000000..74fee54
--- /dev/null
+++ b/src/assets/icons/svg/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/log.svg b/src/assets/icons/svg/log.svg
new file mode 100644
index 0000000..d879d33
--- /dev/null
+++ b/src/assets/icons/svg/log.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/login-logo.svg b/src/assets/icons/svg/login-logo.svg
new file mode 100644
index 0000000..510fbb5
--- /dev/null
+++ b/src/assets/icons/svg/login-logo.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/assets/icons/svg/logininfor.svg b/src/assets/icons/svg/logininfor.svg
new file mode 100644
index 0000000..267f844
--- /dev/null
+++ b/src/assets/icons/svg/logininfor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/logo.svg b/src/assets/icons/svg/logo.svg
new file mode 100644
index 0000000..aca2ff9
--- /dev/null
+++ b/src/assets/icons/svg/logo.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/assets/icons/svg/menu-digit.svg b/src/assets/icons/svg/menu-digit.svg
new file mode 100644
index 0000000..ea9bcbf
--- /dev/null
+++ b/src/assets/icons/svg/menu-digit.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/menu-energy.svg b/src/assets/icons/svg/menu-energy.svg
new file mode 100644
index 0000000..07068c8
--- /dev/null
+++ b/src/assets/icons/svg/menu-energy.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/menu-expend.svg b/src/assets/icons/svg/menu-expend.svg
new file mode 100644
index 0000000..d8782c6
--- /dev/null
+++ b/src/assets/icons/svg/menu-expend.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/assets/icons/svg/menu-monitor.svg b/src/assets/icons/svg/menu-monitor.svg
new file mode 100644
index 0000000..68e87ce
--- /dev/null
+++ b/src/assets/icons/svg/menu-monitor.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/assets/icons/svg/menu-performance.svg b/src/assets/icons/svg/menu-performance.svg
new file mode 100644
index 0000000..9f7f2a1
--- /dev/null
+++ b/src/assets/icons/svg/menu-performance.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/menu-produce.svg b/src/assets/icons/svg/menu-produce.svg
new file mode 100644
index 0000000..77e3cdc
--- /dev/null
+++ b/src/assets/icons/svg/menu-produce.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/menu-system.svg b/src/assets/icons/svg/menu-system.svg
new file mode 100644
index 0000000..6350630
--- /dev/null
+++ b/src/assets/icons/svg/menu-system.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/message.svg b/src/assets/icons/svg/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/src/assets/icons/svg/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/middle.svg b/src/assets/icons/svg/middle.svg
new file mode 100644
index 0000000..cbfd665
--- /dev/null
+++ b/src/assets/icons/svg/middle.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/money.svg b/src/assets/icons/svg/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/src/assets/icons/svg/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/moni-dis-0.svg b/src/assets/icons/svg/moni-dis-0.svg
new file mode 100644
index 0000000..d36d637
--- /dev/null
+++ b/src/assets/icons/svg/moni-dis-0.svg
@@ -0,0 +1,58 @@
+
diff --git a/src/assets/icons/svg/moni-dis-1.svg b/src/assets/icons/svg/moni-dis-1.svg
new file mode 100644
index 0000000..909c00f
--- /dev/null
+++ b/src/assets/icons/svg/moni-dis-1.svg
@@ -0,0 +1,53 @@
+
diff --git a/src/assets/icons/svg/moni-dis-2.svg b/src/assets/icons/svg/moni-dis-2.svg
new file mode 100644
index 0000000..1943979
--- /dev/null
+++ b/src/assets/icons/svg/moni-dis-2.svg
@@ -0,0 +1,59 @@
+
diff --git a/src/assets/icons/svg/moni-dis-3.svg b/src/assets/icons/svg/moni-dis-3.svg
new file mode 100644
index 0000000..b67a597
--- /dev/null
+++ b/src/assets/icons/svg/moni-dis-3.svg
@@ -0,0 +1,41 @@
+
diff --git a/src/assets/icons/svg/moni-dis-4.svg b/src/assets/icons/svg/moni-dis-4.svg
new file mode 100644
index 0000000..6679ec5
--- /dev/null
+++ b/src/assets/icons/svg/moni-dis-4.svg
@@ -0,0 +1,26 @@
+
diff --git a/src/assets/icons/svg/moni-dis-5.svg b/src/assets/icons/svg/moni-dis-5.svg
new file mode 100644
index 0000000..07ae71e
--- /dev/null
+++ b/src/assets/icons/svg/moni-dis-5.svg
@@ -0,0 +1,36 @@
+
diff --git a/src/assets/icons/svg/moni-dis-7.svg b/src/assets/icons/svg/moni-dis-7.svg
new file mode 100644
index 0000000..4c6daf7
--- /dev/null
+++ b/src/assets/icons/svg/moni-dis-7.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/assets/icons/svg/monitor.svg b/src/assets/icons/svg/monitor.svg
new file mode 100644
index 0000000..bc308cb
--- /dev/null
+++ b/src/assets/icons/svg/monitor.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/monitorCasting.svg b/src/assets/icons/svg/monitorCasting.svg
new file mode 100644
index 0000000..1d3faf6
--- /dev/null
+++ b/src/assets/icons/svg/monitorCasting.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/monitorSpeed.svg b/src/assets/icons/svg/monitorSpeed.svg
new file mode 100644
index 0000000..6cc742b
--- /dev/null
+++ b/src/assets/icons/svg/monitorSpeed.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/nested.svg b/src/assets/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/src/assets/icons/svg/nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/number.svg b/src/assets/icons/svg/number.svg
new file mode 100644
index 0000000..ad5ce9a
--- /dev/null
+++ b/src/assets/icons/svg/number.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/online.svg b/src/assets/icons/svg/online.svg
new file mode 100644
index 0000000..330a202
--- /dev/null
+++ b/src/assets/icons/svg/online.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/pass-eye.svg b/src/assets/icons/svg/pass-eye.svg
new file mode 100644
index 0000000..7210632
--- /dev/null
+++ b/src/assets/icons/svg/pass-eye.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/password.svg b/src/assets/icons/svg/password.svg
new file mode 100644
index 0000000..6c64def
--- /dev/null
+++ b/src/assets/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/pdf.svg b/src/assets/icons/svg/pdf.svg
new file mode 100644
index 0000000..957aa0c
--- /dev/null
+++ b/src/assets/icons/svg/pdf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/people.svg b/src/assets/icons/svg/people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/src/assets/icons/svg/people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/peoples.svg b/src/assets/icons/svg/peoples.svg
new file mode 100644
index 0000000..aab852e
--- /dev/null
+++ b/src/assets/icons/svg/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/phone.svg b/src/assets/icons/svg/phone.svg
new file mode 100644
index 0000000..ab8e8c4
--- /dev/null
+++ b/src/assets/icons/svg/phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/post.svg b/src/assets/icons/svg/post.svg
new file mode 100644
index 0000000..2922c61
--- /dev/null
+++ b/src/assets/icons/svg/post.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/pouringGz.svg b/src/assets/icons/svg/pouringGz.svg
new file mode 100644
index 0000000..4db02f6
--- /dev/null
+++ b/src/assets/icons/svg/pouringGz.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/pouringLoding.svg b/src/assets/icons/svg/pouringLoding.svg
new file mode 100644
index 0000000..059501b
--- /dev/null
+++ b/src/assets/icons/svg/pouringLoding.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/assets/icons/svg/pouringSz.svg b/src/assets/icons/svg/pouringSz.svg
new file mode 100644
index 0000000..47d3015
--- /dev/null
+++ b/src/assets/icons/svg/pouringSz.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/qq.svg b/src/assets/icons/svg/qq.svg
new file mode 100644
index 0000000..ee13d4e
--- /dev/null
+++ b/src/assets/icons/svg/qq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/question.svg b/src/assets/icons/svg/question.svg
new file mode 100644
index 0000000..cf75bd4
--- /dev/null
+++ b/src/assets/icons/svg/question.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/radio.svg b/src/assets/icons/svg/radio.svg
new file mode 100644
index 0000000..0cde345
--- /dev/null
+++ b/src/assets/icons/svg/radio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/rate.svg b/src/assets/icons/svg/rate.svg
new file mode 100644
index 0000000..aa3b14d
--- /dev/null
+++ b/src/assets/icons/svg/rate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/redis-list.svg b/src/assets/icons/svg/redis-list.svg
new file mode 100644
index 0000000..98a15b2
--- /dev/null
+++ b/src/assets/icons/svg/redis-list.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/redis.svg b/src/assets/icons/svg/redis.svg
new file mode 100644
index 0000000..2f1d62d
--- /dev/null
+++ b/src/assets/icons/svg/redis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/rest.svg b/src/assets/icons/svg/rest.svg
new file mode 100644
index 0000000..1fa6d8f
--- /dev/null
+++ b/src/assets/icons/svg/rest.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/row.svg b/src/assets/icons/svg/row.svg
new file mode 100644
index 0000000..0780992
--- /dev/null
+++ b/src/assets/icons/svg/row.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/search.svg b/src/assets/icons/svg/search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/src/assets/icons/svg/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/select.svg b/src/assets/icons/svg/select.svg
new file mode 100644
index 0000000..d628382
--- /dev/null
+++ b/src/assets/icons/svg/select.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/server.svg b/src/assets/icons/svg/server.svg
new file mode 100644
index 0000000..eb287e3
--- /dev/null
+++ b/src/assets/icons/svg/server.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/set-api-icon.svg b/src/assets/icons/svg/set-api-icon.svg
new file mode 100644
index 0000000..75571cc
--- /dev/null
+++ b/src/assets/icons/svg/set-api-icon.svg
@@ -0,0 +1,51 @@
+
diff --git a/src/assets/icons/svg/set-icon-diamond.svg b/src/assets/icons/svg/set-icon-diamond.svg
new file mode 100644
index 0000000..b1797db
--- /dev/null
+++ b/src/assets/icons/svg/set-icon-diamond.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/set-icon-pie.svg b/src/assets/icons/svg/set-icon-pie.svg
new file mode 100644
index 0000000..7e98280
--- /dev/null
+++ b/src/assets/icons/svg/set-icon-pie.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/set-icon-set.svg b/src/assets/icons/svg/set-icon-set.svg
new file mode 100644
index 0000000..0388e9f
--- /dev/null
+++ b/src/assets/icons/svg/set-icon-set.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/assets/icons/svg/set-icon-star.svg b/src/assets/icons/svg/set-icon-star.svg
new file mode 100644
index 0000000..2317a85
--- /dev/null
+++ b/src/assets/icons/svg/set-icon-star.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/set-icon-starf.svg b/src/assets/icons/svg/set-icon-starf.svg
new file mode 100644
index 0000000..f7ec7a9
--- /dev/null
+++ b/src/assets/icons/svg/set-icon-starf.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/set-no-icon.svg b/src/assets/icons/svg/set-no-icon.svg
new file mode 100644
index 0000000..1a20950
--- /dev/null
+++ b/src/assets/icons/svg/set-no-icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/shopping.svg b/src/assets/icons/svg/shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/src/assets/icons/svg/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/size.svg b/src/assets/icons/svg/size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/src/assets/icons/svg/size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/skill.svg b/src/assets/icons/svg/skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/src/assets/icons/svg/skill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/slider.svg b/src/assets/icons/svg/slider.svg
new file mode 100644
index 0000000..fbe4f39
--- /dev/null
+++ b/src/assets/icons/svg/slider.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/staging.svg b/src/assets/icons/svg/staging.svg
new file mode 100644
index 0000000..8f3abde
--- /dev/null
+++ b/src/assets/icons/svg/staging.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/star.svg b/src/assets/icons/svg/star.svg
new file mode 100644
index 0000000..6cf86e6
--- /dev/null
+++ b/src/assets/icons/svg/star.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/startOfCasting.svg b/src/assets/icons/svg/startOfCasting.svg
new file mode 100644
index 0000000..a882c3f
--- /dev/null
+++ b/src/assets/icons/svg/startOfCasting.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/startWatering.svg b/src/assets/icons/svg/startWatering.svg
new file mode 100644
index 0000000..e31bfca
--- /dev/null
+++ b/src/assets/icons/svg/startWatering.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/assets/icons/svg/sun.svg b/src/assets/icons/svg/sun.svg
new file mode 100644
index 0000000..910e12b
--- /dev/null
+++ b/src/assets/icons/svg/sun.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/assets/icons/svg/swagger.svg b/src/assets/icons/svg/swagger.svg
new file mode 100644
index 0000000..05d4e7b
--- /dev/null
+++ b/src/assets/icons/svg/swagger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/switch.svg b/src/assets/icons/svg/switch.svg
new file mode 100644
index 0000000..0ba61e3
--- /dev/null
+++ b/src/assets/icons/svg/switch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/system.svg b/src/assets/icons/svg/system.svg
new file mode 100644
index 0000000..5992593
--- /dev/null
+++ b/src/assets/icons/svg/system.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/tab.svg b/src/assets/icons/svg/tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/src/assets/icons/svg/tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/table.svg b/src/assets/icons/svg/table.svg
new file mode 100644
index 0000000..0e3dc9d
--- /dev/null
+++ b/src/assets/icons/svg/table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/teamsIcon.svg b/src/assets/icons/svg/teamsIcon.svg
new file mode 100644
index 0000000..668a828
--- /dev/null
+++ b/src/assets/icons/svg/teamsIcon.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/textarea.svg b/src/assets/icons/svg/textarea.svg
new file mode 100644
index 0000000..2709f29
--- /dev/null
+++ b/src/assets/icons/svg/textarea.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/theme.svg b/src/assets/icons/svg/theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/src/assets/icons/svg/theme.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/time-range.svg b/src/assets/icons/svg/time-range.svg
new file mode 100644
index 0000000..13c1202
--- /dev/null
+++ b/src/assets/icons/svg/time-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/time.svg b/src/assets/icons/svg/time.svg
new file mode 100644
index 0000000..b376e32
--- /dev/null
+++ b/src/assets/icons/svg/time.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/tool.svg b/src/assets/icons/svg/tool.svg
new file mode 100644
index 0000000..48e0e35
--- /dev/null
+++ b/src/assets/icons/svg/tool.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/tree-table.svg b/src/assets/icons/svg/tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/src/assets/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/tree.svg b/src/assets/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/src/assets/icons/svg/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/upload.svg b/src/assets/icons/svg/upload.svg
new file mode 100644
index 0000000..bae49c0
--- /dev/null
+++ b/src/assets/icons/svg/upload.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/user.svg b/src/assets/icons/svg/user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/src/assets/icons/svg/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/validCode.svg b/src/assets/icons/svg/validCode.svg
new file mode 100644
index 0000000..cfb1021
--- /dev/null
+++ b/src/assets/icons/svg/validCode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/wechat.svg b/src/assets/icons/svg/wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/src/assets/icons/svg/wechat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/svg/whiteFlag.svg b/src/assets/icons/svg/whiteFlag.svg
new file mode 100644
index 0000000..814b325
--- /dev/null
+++ b/src/assets/icons/svg/whiteFlag.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/zip.svg b/src/assets/icons/svg/zip.svg
new file mode 100644
index 0000000..f806fc4
--- /dev/null
+++ b/src/assets/icons/svg/zip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/images/change-password.png b/src/assets/images/change-password.png
new file mode 100644
index 0000000..4cfb570
Binary files /dev/null and b/src/assets/images/change-password.png differ
diff --git a/src/assets/images/dark.svg b/src/assets/images/dark.svg
new file mode 100644
index 0000000..f646bd7
--- /dev/null
+++ b/src/assets/images/dark.svg
@@ -0,0 +1,39 @@
+
+
\ No newline at end of file
diff --git a/src/assets/images/disOverImg.png b/src/assets/images/disOverImg.png
new file mode 100644
index 0000000..c3b2b6b
Binary files /dev/null and b/src/assets/images/disOverImg.png differ
diff --git a/src/assets/images/display-back.png b/src/assets/images/display-back.png
new file mode 100644
index 0000000..e044de4
Binary files /dev/null and b/src/assets/images/display-back.png differ
diff --git a/src/assets/images/display-border-back.png b/src/assets/images/display-border-back.png
new file mode 100644
index 0000000..f9a2220
Binary files /dev/null and b/src/assets/images/display-border-back.png differ
diff --git a/src/assets/images/furnaceComplete.png b/src/assets/images/furnaceComplete.png
new file mode 100644
index 0000000..95a3fcc
Binary files /dev/null and b/src/assets/images/furnaceComplete.png differ
diff --git a/src/assets/images/light.svg b/src/assets/images/light.svg
new file mode 100644
index 0000000..ab7cc08
--- /dev/null
+++ b/src/assets/images/light.svg
@@ -0,0 +1,39 @@
+
+
\ No newline at end of file
diff --git a/src/assets/images/login-background.png b/src/assets/images/login-background.png
new file mode 100644
index 0000000..96512f9
Binary files /dev/null and b/src/assets/images/login-background.png differ
diff --git a/src/assets/images/logo-title.png b/src/assets/images/logo-title.png
new file mode 100644
index 0000000..03da577
Binary files /dev/null and b/src/assets/images/logo-title.png differ
diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png
new file mode 100644
index 0000000..a52c580
Binary files /dev/null and b/src/assets/images/logo.png differ
diff --git a/src/assets/images/moni-dis.png b/src/assets/images/moni-dis.png
new file mode 100644
index 0000000..1d3b17e
Binary files /dev/null and b/src/assets/images/moni-dis.png differ
diff --git a/src/assets/images/preparation.png b/src/assets/images/preparation.png
new file mode 100644
index 0000000..7dada44
Binary files /dev/null and b/src/assets/images/preparation.png differ
diff --git a/src/assets/images/profile.png b/src/assets/images/profile.png
new file mode 100644
index 0000000..4986bc9
Binary files /dev/null and b/src/assets/images/profile.png differ
diff --git a/src/assets/images/report01.png b/src/assets/images/report01.png
new file mode 100644
index 0000000..d18e7b4
Binary files /dev/null and b/src/assets/images/report01.png differ
diff --git a/src/assets/images/report02.png b/src/assets/images/report02.png
new file mode 100644
index 0000000..1d534be
Binary files /dev/null and b/src/assets/images/report02.png differ
diff --git a/src/assets/images/report03.png b/src/assets/images/report03.png
new file mode 100644
index 0000000..f47fbbc
Binary files /dev/null and b/src/assets/images/report03.png differ
diff --git a/src/assets/images/set-api-back.png b/src/assets/images/set-api-back.png
new file mode 100644
index 0000000..aba083d
Binary files /dev/null and b/src/assets/images/set-api-back.png differ
diff --git a/src/assets/images/top-header-center.png b/src/assets/images/top-header-center.png
new file mode 100644
index 0000000..4206176
Binary files /dev/null and b/src/assets/images/top-header-center.png differ
diff --git a/src/assets/images/top-header-left.png b/src/assets/images/top-header-left.png
new file mode 100644
index 0000000..fcddda0
Binary files /dev/null and b/src/assets/images/top-header-left.png differ
diff --git a/src/assets/images/top-header-right.png b/src/assets/images/top-header-right.png
new file mode 100644
index 0000000..8a681e8
Binary files /dev/null and b/src/assets/images/top-header-right.png differ
diff --git a/src/assets/logo/logo.png b/src/assets/logo/logo.png
new file mode 100644
index 0000000..a52c580
Binary files /dev/null and b/src/assets/logo/logo.png differ
diff --git a/src/assets/styles/btn.scss b/src/assets/styles/btn.scss
new file mode 100644
index 0000000..3590d8d
--- /dev/null
+++ b/src/assets/styles/btn.scss
@@ -0,0 +1,99 @@
+@import './variables.module.scss';
+
+@mixin colorBtn($color) {
+ background: $color;
+
+ &:hover {
+ color: $color;
+
+ &:before,
+ &:after {
+ background: $color;
+ }
+ }
+}
+
+.blue-btn {
+ @include colorBtn($blue)
+}
+
+.light-blue-btn {
+ @include colorBtn($light-blue)
+}
+
+.red-btn {
+ @include colorBtn($red)
+}
+
+.pink-btn {
+ @include colorBtn($pink)
+}
+
+.green-btn {
+ @include colorBtn($green)
+}
+
+.tiffany-btn {
+ @include colorBtn($tiffany)
+}
+
+.yellow-btn {
+ @include colorBtn($yellow)
+}
+
+.pan-btn {
+ font-size: 14px;
+ color: #fff;
+ padding: 14px 36px;
+ border-radius: 8px;
+ border: none;
+ outline: none;
+ transition: 600ms ease all;
+ position: relative;
+ display: inline-block;
+
+ &:hover {
+ background: #fff;
+
+ &:before,
+ &:after {
+ width: 100%;
+ transition: 600ms ease all;
+ }
+ }
+
+ &:before,
+ &:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 2px;
+ width: 0;
+ transition: 400ms ease all;
+ }
+
+ &::after {
+ right: inherit;
+ top: inherit;
+ left: 0;
+ bottom: 0;
+ }
+}
+
+.custom-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ color: #fff;
+ -webkit-appearance: none;
+ text-align: center;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ padding: 10px 15px;
+ font-size: 14px;
+ border-radius: 4px;
+}
diff --git a/src/assets/styles/cfhi.scss b/src/assets/styles/cfhi.scss
new file mode 100644
index 0000000..4cd457f
--- /dev/null
+++ b/src/assets/styles/cfhi.scss
@@ -0,0 +1,278 @@
+ /**
+ * 通用css样式布局处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+ /** 基础通用 **/
+.pt5 {
+ padding-top: 5px;
+}
+.pr5 {
+ padding-right: 5px;
+}
+.pb5 {
+ padding-bottom: 5px;
+}
+.mt5 {
+ margin-top: 5px;
+}
+.mr5 {
+ margin-right: 5px;
+}
+.mb5 {
+ margin-bottom: 5px;
+}
+.mb8 {
+ margin-bottom: 8px;
+}
+.ml5 {
+ margin-left: 5px;
+}
+.mt10 {
+ margin-top: 10px;
+}
+.mr10 {
+ margin-right: 10px;
+}
+.mb10 {
+ margin-bottom: 10px;
+}
+.ml10 {
+ margin-left: 10px;
+}
+.mt20 {
+ margin-top: 20px;
+}
+.mr20 {
+ margin-right: 20px;
+}
+.mb20 {
+ margin-bottom: 20px;
+}
+.ml20 {
+ margin-left: 20px;
+}
+
+.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+
+.el-form .el-form-item__label {
+ font-weight: 700;
+}
+.el-dialog:not(.is-fullscreen) {
+ margin-top: 6vh !important;
+}
+
+.el-dialog.scrollbar .el-dialog__body {
+ overflow: auto;
+ overflow-x: hidden;
+ max-height: 70vh;
+ padding: 10px 20px 0;
+}
+
+.el-table {
+ .el-table__header-wrapper, .el-table__fixed-header-wrapper {
+ th {
+ word-break: break-word;
+ background-color: #f8f8f9 !important;
+ color: #515a6e;
+ height: 40px !important;
+ font-size: 13px;
+ }
+ }
+ .el-table__body-wrapper {
+ .el-button [class*="el-icon-"] + span {
+ margin-left: 1px;
+ }
+ }
+}
+
+/** 表单布局 **/
+.form-header {
+ font-size:15px;
+ color:#6379bb;
+ border-bottom:1px solid #ddd;
+ margin:8px 10px 25px 10px;
+ padding-bottom:5px;
+}
+
+/** 表格布局 **/
+.pagination-container {
+ margin-bottom: 20px;
+ margin-top: 14px;
+}
+
+/* tree border */
+.tree-border {
+ margin-top: 5px;
+ border: 1px solid #e5e6e7;
+ background: #FFFFFF none;
+ border-radius:4px;
+ width: 100%;
+ overflow-y: auto;
+}
+
+.pagination-container .el-pagination {
+ float: right;
+}
+
+@media ( max-width : 768px) {
+ .pagination-container .el-pagination > .el-pagination__jump {
+ display: none !important;
+ }
+ .pagination-container .el-pagination > .el-pagination__sizes {
+ display: none !important;
+ }
+}
+
+.el-table .fixed-width .el-button--small {
+ padding-left: 0;
+ padding-right: 0;
+ width: inherit;
+}
+
+/** 表格更多操作下拉样式 */
+.el-table .el-dropdown-link {
+ cursor: pointer;
+ color: #409EFF;
+ margin-left: 10px;
+}
+
+.el-table .el-dropdown, .el-icon-arrow-down {
+ font-size: 12px;
+}
+
+.el-tree-node__content > .el-checkbox {
+ margin-right: 8px;
+}
+
+.list-group-striped > .list-group-item {
+ border-left: 0;
+ border-right: 0;
+ border-radius: 0;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.list-group {
+ padding-left: 0px;
+ list-style: none;
+}
+
+.list-group-item {
+ border-bottom: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
+ margin-bottom: -1px;
+ padding: 11px 0px;
+ font-size: 13px;
+}
+
+.pull-right {
+ float: right !important;
+}
+
+.el-card__header {
+ padding: 14px 15px 7px !important;
+ min-height: 40px;
+}
+
+.el-card__body {
+ padding: 15px 20px 20px 20px !important;
+}
+
+.card-box {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-bottom: 10px;
+}
+
+/* button color */
+.el-button--cyan.is-active,
+.el-button--cyan:active {
+ background: #20B2AA;
+ border-color: #20B2AA;
+ color: #FFFFFF;
+}
+
+.el-button--cyan:focus,
+.el-button--cyan:hover {
+ background: #48D1CC;
+ border-color: #48D1CC;
+ color: #FFFFFF;
+}
+
+.el-button--cyan {
+ background-color: #20B2AA;
+ border-color: #20B2AA;
+ color: #FFFFFF;
+}
+
+/* text color */
+.text-navy {
+ color: #1ab394;
+}
+
+.text-primary {
+ color: inherit;
+}
+
+.text-success {
+ color: #1c84c6;
+}
+
+.text-info {
+ color: #23c6c8;
+}
+
+.text-warning {
+ color: #f8ac59;
+}
+
+.text-danger {
+ color: #E83333;
+}
+
+.text-muted {
+ color: #888888;
+}
+
+/* image */
+.img-circle {
+ border-radius: 50%;
+}
+
+.img-lg {
+ width: 120px;
+ height: 120px;
+}
+
+.avatar-upload-preview {
+ position: absolute;
+ top: 50%;
+ transform: translate(50%, -50%);
+ width: 200px;
+ height: 200px;
+ border-radius: 50%;
+ box-shadow: 0 0 4px #ccc;
+ overflow: hidden;
+}
+
+/* 拖拽列样式 */
+.sortable-ghost{
+ opacity: .8;
+ color: #fff!important;
+ background: #42b983!important;
+}
+
+/* 表格右侧工具栏样式 */
+.top-right-btn {
+ margin-left: auto;
+}
+.exportLoading{
+ pointer-events: none;
+}
+
diff --git a/src/assets/styles/data-display.scss b/src/assets/styles/data-display.scss
new file mode 100644
index 0000000..36938aa
--- /dev/null
+++ b/src/assets/styles/data-display.scss
@@ -0,0 +1,112 @@
+@import './wh.scss';
+
+.data-display-container{
+ width: 100vw;
+ height: 100vh;
+ background: url('../images/display-back.png') no-repeat;
+ background-size: 100% 100%;
+ color: #9ca0aa ;
+}
+.display-top-header{
+ width: 100vw;
+ height: h(70);
+ display: flex;
+ justify-content: space-between;
+ .left-header{
+ height: 100%;
+ background: url('../images/top-header-left.png') no-repeat;
+ background-size: 100% 100%;
+ .header-current{
+ display: inline-block;
+ height: h(55);
+ line-height: h(55);
+ background-image:-webkit-linear-gradient(bottom,rgb(128, 196, 255),rgb(244, 250, 255));
+ background-clip:text;
+ -webkit-background-clip:text;
+ -webkit-text-fill-color:transparent;
+ font-family: din;
+ font-weight: 500;
+ font-size: w(16);
+ .display-clock{
+ margin: 0 w(10) 0 0;
+ }
+ }
+ }
+ .center-header{
+ display: flex;
+ height: 100%;
+ font-family: pmzd;
+ line-height: h(70);
+ color: #fff;
+ text-align: center;
+ font-size: w(34);
+ font-weight: 400;
+ background: url('../images/top-header-center.png') no-repeat;
+ background-size: 100% 100%;
+ .display-logo{
+ font-size: h(65);
+ }
+ .display-title{
+ display: inline-block;
+ height: h(70);
+ line-height: h(70);
+ background-image:-webkit-linear-gradient(bottom,rgb(189, 225, 255),rgb(255, 255, 255));
+ background-clip:text;
+ -webkit-background-clip:text;
+ -webkit-text-fill-color:transparent;
+ }
+ }
+ .right-header{
+ height: 100%;
+ background: url('../images/top-header-right.png') no-repeat;
+ background-size: 100% 100%;
+ position: relative;
+ .right-header-content{
+ display: flex;
+ position: absolute;
+ right: w(10);
+ top: h(18);
+ .content{
+ width: w(165);
+ position: relative;
+ .content-text{
+ display: block;
+ width: w(160);
+ height: h(36);
+ padding-left: h(50);
+ background-image:-webkit-linear-gradient(right,#0057A1,#142142);
+ border-radius: h(18);
+ line-height: h(36);
+ position: absolute;
+ top: h(4);
+ font-size: w(16);
+ font-family: pmzd;
+ font-weight: 400;
+ color: #fff;
+ text-shadow: 2px 2px 8px rgba(0, 138, 255, 0.7);
+ white-space: nowrap; /* 防止文本换行 */
+ overflow: hidden; /* 文本溢出容器时隐藏 */
+ text-overflow: ellipsis; /* 使用省略号表示被隐藏的文本 */
+ span{
+ color: #18FEFE;
+ }
+ }
+ .content-icon{
+ display: block;
+ width: w(44);
+ height: h(44);
+ // position: absolute;
+ .display-right{
+ font-size: h(44);
+ }
+ }
+ }
+ .content-right{
+ width: w(180);
+ .content-text{
+ width: w(175);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss
new file mode 100644
index 0000000..f4b9fb4
--- /dev/null
+++ b/src/assets/styles/element-ui.scss
@@ -0,0 +1,112 @@
+// cover some element-ui styles
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+ font-weight: 400 !important;
+}
+
+.el-upload {
+ input[type="file"] {
+ display: none !important;
+ }
+}
+
+.el-upload__input {
+ display: none;
+}
+
+.cell {
+ .el-tag {
+ margin-right: 0px;
+ }
+}
+
+.small-padding {
+ .cell {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+.fixed-width {
+ .el-button--mini {
+ padding: 7px 10px;
+ width: 60px;
+ }
+}
+
+.status-col {
+ .cell {
+ padding: 0 10px;
+ text-align: center;
+
+ .el-tag {
+ margin-right: 0px;
+ }
+ }
+}
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+ transform: none;
+ left: 0;
+ position: relative;
+ margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+ .el-upload {
+ width: 100%;
+
+ .el-upload-dragger {
+ width: 100%;
+ height: 200px;
+ }
+ }
+}
+
+// dropdown
+.el-dropdown-menu {
+ a {
+ display: block
+ }
+}
+
+// fix date-picker ui bug in filter-item
+.el-range-editor.el-input__inner {
+ display: inline-flex !important;
+}
+
+// to fix el-date-picker css style
+.el-range-separator {
+ box-sizing: content-box;
+}
+
+.el-menu--collapse
+ > div
+ > .el-submenu
+ > .el-submenu__title
+ .el-submenu__icon-arrow {
+ display: none;
+}
+
+.el-dropdown .el-dropdown-link{
+ color: var(--el-color-primary) !important;
+}
+
+.el-input-group__append button.el-button{
+ background-color: var(--el-color-primary) !important;
+ border-color: var(--el-color-primary) !important;
+ border-radius: 0;
+ color: #fff !important;
+}
+.el-input-group--append .el-input-group__append{
+ overflow: hidden;
+}
+
+.el-input-group__append button.el-button:hover{
+ opacity: 0.8;
+ transition: all 0.25s;
+}
+
+
diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss
new file mode 100644
index 0000000..e0c8c21
--- /dev/null
+++ b/src/assets/styles/index.scss
@@ -0,0 +1,207 @@
+@import './variables.module.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+@import './btn.scss';
+@import './cfhi.scss';
+@import './data-display.scss';
+@import './wh.scss';
+
+
+@font-face {
+ font-family: 'pmzd';
+ src: url('../fonts/pmzd.ttf') format('opentype');
+}
+@font-face {
+ font-family: 'din';
+ src: url('../fonts/din.ttf') format('opentype');
+}
+
+
+
+body {
+ height: 100%;
+ margin: 0;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+ font-weight: 700;
+}
+
+html {
+ height: 100%;
+ box-sizing: border-box;
+}
+
+#app {
+ height: 100%;
+}
+
+*,
+*:before,
+*:after {
+ box-sizing: inherit;
+}
+
+.no-padding {
+ padding: 0px !important;
+}
+
+.padding-content {
+ padding: 4px 0;
+}
+
+a:focus,
+a:active {
+ outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+ cursor: pointer;
+ color: inherit;
+ text-decoration: none;
+}
+
+div:focus {
+ outline: none;
+}
+
+.fr {
+ float: right;
+}
+
+.fl {
+ float: left;
+}
+
+.pr-5 {
+ padding-right: 5px;
+}
+
+.pl-5 {
+ padding-left: 5px;
+}
+
+.block {
+ display: block;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.inlineBlock {
+ display: block;
+}
+
+.clearfix {
+ &:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+}
+
+aside {
+ background: #eef1f6;
+ padding: 8px 24px;
+ margin-bottom: 20px;
+ border-radius: 2px;
+ display: block;
+ line-height: 32px;
+ font-size: 16px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+ color: #2c3e50;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ a {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+ }
+}
+
+//main-container全局样式
+.app-container {
+ padding: 20px;
+ height: 100%;
+}
+
+.components-container {
+ margin: 30px 50px;
+ position: relative;
+}
+
+// .pagination-container {
+// margin-top: 30px;
+// }
+
+.text-center {
+ text-align: center
+}
+
+.sub-navbar {
+ height: 50px;
+ line-height: 50px;
+ position: relative;
+ width: 100%;
+ text-align: right;
+ padding-right: 20px;
+ transition: 600ms ease position;
+ background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+
+ .subtitle {
+ font-size: 20px;
+ color: #fff;
+ }
+
+ &.draft {
+ background: #d0d0d0;
+ }
+
+ &.deleted {
+ background: #d0d0d0;
+ }
+}
+
+.link-type,
+.link-type:focus {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+}
+
+.filter-container {
+ padding-bottom: 10px;
+
+ .filter-item {
+ display: inline-block;
+ vertical-align: middle;
+ margin-bottom: 10px;
+ }
+}
+
+// 标签页样式
+.el-tabs{
+ .el-tabs__nav > .is-active{
+ // background: rgba(0, 90, 224, 0.15);
+ color: #005AE0;
+ }
+}
diff --git a/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss
new file mode 100644
index 0000000..06fa061
--- /dev/null
+++ b/src/assets/styles/mixin.scss
@@ -0,0 +1,66 @@
+@mixin clearfix {
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+@mixin scrollBar {
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+}
+
+@mixin relative {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+@mixin pct($pct) {
+ width: #{$pct};
+ position: relative;
+ margin: 0 auto;
+}
+
+@mixin triangle($width, $height, $color, $direction) {
+ $width: $width/2;
+ $color-border-style: $height solid $color;
+ $transparent-border-style: $width solid transparent;
+ height: 0;
+ width: 0;
+
+ @if $direction==up {
+ border-bottom: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==right {
+ border-left: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+
+ @else if $direction==down {
+ border-top: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==left {
+ border-right: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+}
diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss
new file mode 100644
index 0000000..5e6b19a
--- /dev/null
+++ b/src/assets/styles/sidebar.scss
@@ -0,0 +1,250 @@
+#app {
+
+ .main-container {
+ height: calc(100% - 56px);
+ transition: margin-left .28s;
+ margin-left: $base-sidebar-width;
+ position: relative;
+ }
+
+ .sidebarHide {
+ margin-left: 70px !important;
+ }
+
+ .sidebar-container {
+ display: flex;
+ justify-content: space-between;
+ -webkit-transition: width .28s;
+ transition: width 0.28s;
+ width: $base-sidebar-width;
+ background-color: $base-menu-background;
+ height: 100%;
+ position: fixed;
+ font-size: 0px;
+ top: 56px;
+ bottom: 0;
+ left: 0;
+ z-index: 1000;
+ overflow: hidden;
+ // -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.15);
+ // box-shadow: 2px 0 6px rgba(0,21,41,.15);
+
+ // reset element-ui css
+ .horizontal-collapse-transition {
+ transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+ }
+
+ .scrollbar-wrapper {
+ border-right: 0.5px solid #dfe1e4;
+ overflow-x: hidden !important;
+ .el-menu-item.is-active{
+ background-color: var(--el-color-primary-light-8) !important;
+ font-weight: 500;
+ color: var(--el-menu-active-color) !important;
+ }
+ }
+
+ .el-scrollbar__bar.is-vertical {
+ right: 0px;
+ }
+
+ .el-scrollbar {
+ height: 100%;
+
+ .svg-icon {
+ margin-right: 16px;
+ }
+ }
+
+ &.has-logo {
+ .el-scrollbar {
+ height: calc(100% - 50px);
+ width: 170px;
+ background: #F5F7F9;
+ }
+ }
+
+ .is-horizontal {
+ display: none;
+ }
+
+ a {
+ display: inline-block;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .el-menu {
+ border: none;
+ height: 100%;
+ width: 100% !important;
+ }
+
+ .el-menu-item, .menu-title {
+ font-weight: 400;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+ }
+
+ .el-menu-item .el-menu-tooltip__trigger {
+ display: inline-block !important;
+ }
+
+ // menu hover
+ // .sub-menu-title-noDropdown{
+ // &:hover {
+ // background-color: rgba(0, 0, 0, 0.06) !important;
+ // }
+ // }
+
+ & .theme-dark .is-active > .el-sub-menu__title {
+ color: $base-menu-color-active !important;
+ }
+ & .is-active > .el-sub-menu__title {
+ color: var(--el-menu-active-color) !important;
+ }
+
+ & .nest-menu .el-sub-menu>.el-sub-menu__title,
+ & .el-sub-menu .el-menu-item {
+ min-width: $base-sidebar-width !important;
+ color: #7B828E;
+ // &:hover {
+ // background-color: rgba(0, 0, 0, 0.06) !important;
+ // }
+ }
+
+ & .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title,
+ & .theme-dark .el-sub-menu .el-menu-item {
+ background-color: $base-sub-menu-background !important;
+
+ &:hover {
+ background-color: $base-sub-menu-hover !important;
+ }
+ }
+ }
+
+ .hideSidebar {
+ .sidebar-container {
+ width: 70px !important;
+ }
+
+ .main-container {
+ margin-left: 70px;
+ }
+
+ .sub-menu-title-noDropdown {
+ padding: 0 !important;
+ position: relative;
+
+ .el-tooltip {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+ }
+ }
+
+ .el-sub-menu {
+ overflow: hidden;
+
+ &>.el-sub-menu__title {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+
+ }
+ }
+
+ .el-menu--collapse {
+ .el-sub-menu {
+ &>.el-sub-menu__title {
+ &>span {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ &>i {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ }
+ }
+ }
+ }
+
+ .el-menu--collapse .el-menu .el-sub-menu {
+ min-width: $base-sidebar-width !important;
+ }
+
+ // mobile responsive
+ .mobile {
+ .main-container {
+ margin-left: 0px;
+ }
+
+ .sidebar-container {
+ transition: transform .28s;
+ width: $base-sidebar-width !important;
+ }
+
+ &.hideSidebar {
+ .sidebar-container {
+ pointer-events: none;
+ transition-duration: 0.3s;
+ transform: translate3d(-$base-sidebar-width, 0, 0);
+ }
+ }
+ }
+
+ // .withoutAnimation {
+
+ // .main-container,
+ // .sidebar-container {
+ // transition: none;
+ // }
+ // }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+ &>.el-menu {
+ .svg-icon {
+ margin-right: 16px;
+ }
+ }
+ .nest-menu,.el-menu-item,.el-sub-menu__title{
+ &:hover {
+ // you can use $sub-menuHover
+ // background-color: #C2D7F8 !important;
+ background-color: var(--el-color-primary-light-8) !important;
+ }
+ }
+
+ // the scroll bar appears when the sub-menu is too long
+ >.el-menu--popup {
+ max-height: 100vh;
+ overflow-y: auto;
+
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+ }
+}
diff --git a/src/assets/styles/transition.scss b/src/assets/styles/transition.scss
new file mode 100644
index 0000000..073f8c6
--- /dev/null
+++ b/src/assets/styles/transition.scss
@@ -0,0 +1,49 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+ transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+ opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform--move,
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+ transition: all .5s;
+}
+
+.fade-transform-enter {
+ opacity: 0;
+ transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+ opacity: 0;
+ transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+ transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+ opacity: 0;
+ transform: translateX(20px);
+}
+
+.breadcrumb-move {
+ transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+ position: absolute;
+}
diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss
new file mode 100644
index 0000000..f1324d8
--- /dev/null
+++ b/src/assets/styles/variables.module.scss
@@ -0,0 +1,66 @@
+// base color
+$blue: #324157;
+$light-blue: #3A71A8;
+$red: #C03639;
+$pink: #E65D6E;
+$green: #30B08F;
+$tiffany: #4AB7BD;
+$yellow: #FEC171;
+$panGreen: #30B08F;
+
+// 默认菜单主题风格
+$base-menu-color: #bfcbd9;
+$base-menu-color-active: #f4f4f5;
+$base-menu-backcolor-active: rgba(0, 0, 0, 0.1);
+$base-menu-background: #304156;
+$base-logo-title-color: #ffffff;
+
+$base-menu-light-color: #434D5D;
+$base-menu-light-background: #f5f7f9;
+$base-logo-light-title-color: #001529;
+
+$base-sub-menu-background: #1f2d3d;
+$base-sub-menu-hover: #001528;
+
+// 自定义暗色菜单风格
+/**
+$base-menu-color:hsla(0,0%,100%,.65);
+$base-menu-color-active:#fff;
+$base-menu-background:#001529;
+$base-logo-title-color: #ffffff;
+
+$base-menu-light-color:rgba(0,0,0,.70);
+$base-menu-light-background:#ffffff;
+$base-logo-light-title-color: #001529;
+
+$base-sub-menu-background:#000c17;
+$base-sub-menu-hover:#001528;
+*/
+
+$--color-primary: #409EFF;
+$--color-success: #67C23A;
+$--color-warning: #E6A23C;
+$--color-danger: #E83333;
+$--color-info: #909399;
+
+$base-sidebar-width: 240px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ menuColor: $base-menu-color;
+ menuLightColor: $base-menu-light-color;
+ menuColorActive: $base-menu-color-active;
+ menuBackground: $base-menu-background;
+ menuLightBackground: $base-menu-light-background;
+ subMenuBackground: $base-sub-menu-background;
+ subMenuHover: $base-sub-menu-hover;
+ sideBarWidth: $base-sidebar-width;
+ logoTitleColor: $base-logo-title-color;
+ logoLightTitleColor: $base-logo-light-title-color;
+ primaryColor: $--color-primary;
+ successColor: $--color-success;
+ dangerColor: $--color-danger;
+ infoColor: $--color-info;
+ warningColor: $--color-warning;
+}
diff --git a/src/assets/styles/wh.scss b/src/assets/styles/wh.scss
new file mode 100644
index 0000000..1f1b4c3
--- /dev/null
+++ b/src/assets/styles/wh.scss
@@ -0,0 +1,10 @@
+
+@function w($w) {
+ $value: 'calc(100vw * #{$w} / 1920)';
+ @return unquote($value)
+};
+
+@function h($h) {
+ $value: 'calc(100vh * #{$h} / 1080)';
+ @return unquote($value)
+};
diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..489cba1
--- /dev/null
+++ b/src/components/Breadcrumb/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
+ {{ item.meta.title }}
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/DictTag/index.vue b/src/components/DictTag/index.vue
new file mode 100644
index 0000000..7d0888c
--- /dev/null
+++ b/src/components/DictTag/index.vue
@@ -0,0 +1,82 @@
+
+
+
+
+ {{ item.label + " " }}
+ {{ item.label + " " }}
+
+
+
+ {{ unmatchArray | handleArray }}
+
+
+
+
+
+
+
diff --git a/src/components/EchartsFoldLine/index.vue b/src/components/EchartsFoldLine/index.vue
new file mode 100644
index 0000000..bb9d751
--- /dev/null
+++ b/src/components/EchartsFoldLine/index.vue
@@ -0,0 +1,326 @@
+
+
+
+
+
+
+ {{ fatherMessage.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue
new file mode 100644
index 0000000..4b19833
--- /dev/null
+++ b/src/components/Editor/index.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+ $emit('update:modelValue', content)"
+ :options="options"
+ :style="styles"
+ />
+
+
+
+
+
+
+
diff --git a/src/components/ElsForm/README.md b/src/components/ElsForm/README.md
new file mode 100644
index 0000000..f9eec7b
--- /dev/null
+++ b/src/components/ElsForm/README.md
@@ -0,0 +1,112 @@
+
+
+# 父组件内使用
+ · 父组件vue文件
+
+
+
+
+
+ · 父组件jsx文件参数配置
+ 1.表单元素
+ const fieldList = ref([
+ {
+ label: '岗位名称',
+ type: 'input', // 类型为输入框,默认input,可不传
+ field: 'postName', // 绑定字段,必传
+ width: '400px',
+ max: 100, // 最大输入字数,可不传
+ rules: [{ required: true, message: "岗位名称不能为空", trigger: "blur" }],
+ placeholder: '请输入岗位名称'
+ },
+ {
+ label: '岗位顺序',
+ field: 'postSort',
+ type: 'number',
+ hidden: true,
+ width: '320px',
+ rules: [{ required: true, message: "岗位顺序不能为空", trigger: "blur" }],
+ placeholder: ''
+ },
+ {
+ label: '所属部门',
+ field: 'deptId',
+ type: 'treeSelect',
+ width: '400px',
+ props: { value: 'deptId', label: 'deptName', children: 'children' },
+ clearable: true,
+ rules: [{ required: true, message: "所属部门不能为空", trigger: "change" }],
+ placeholder: '请选择所属部门',
+ options: [树结构数据]
+ },
+ {
+ label: '备注',
+ field: 'remark',
+ type: 'textarea',
+ max: 100,
+ width: '400px',
+ placeholder: '请输入备注内容'
+ },
+ {
+ label: '事件时刻',
+ field: 'abnormalEventTime',
+ type: 'date',
+ enum: 'datetime',
+ valueFormat: 'YYYY-MM-DD HH:mm',
+ format: 'YYYY-MM-DD HH:mm',
+ width: '300px',
+ rules: [{required: true,message: '请选择事件时刻',trigger: 'change'}],
+ placeholder: '请选择事件时刻'
+ },
+ ])
+ [type类型枚举:select,cascader,treeSelect,checkbox,radio,date,time,timeRange,timeSelect,switch,number,textarea,imageUpload,password,input]
+ [当type='date'时枚举:enum='datetime','daterange'...其他可查看elementUI]
+ 2.表单配置项
+ const formOption = ref({
+ inline: false, // 是否行内表单
+ labelWidth: '80px',
+ scrollToError: true, //当表单校验时是否自动滚动至校验失败项
+ btnCenter: true, // 表单按钮组的排列位置【目前代码未修改,此项用来判断是否为弹窗使用表单】
+ labelPosition: 'right',
+ btn: ['submit', 'cancel'] //按钮组,全部选项['search', 'reset','submit', 'cancel'],哪项不传哪项隐藏
+ })
\ No newline at end of file
diff --git a/src/components/ElsForm/index.vue b/src/components/ElsForm/index.vue
new file mode 100644
index 0000000..6a3ce93
--- /dev/null
+++ b/src/components/ElsForm/index.vue
@@ -0,0 +1,554 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/ElsTable/README.md b/src/components/ElsTable/README.md
new file mode 100644
index 0000000..334f37f
--- /dev/null
+++ b/src/components/ElsTable/README.md
@@ -0,0 +1,159 @@
+
+# 父组件内使用
+ · 父组件vue文件
+
+
+
+
+ · 父组件jsx文件配置项
+
+ // 表格筛选条件 参数可参考公共表单组件的 fieldList
+ const feedSearchList = ref([
+ {
+ label: '浇次',
+ field: 'castTimesNo',
+ clearable: true,
+ width: '340px',
+ placeholder: '请输入浇次',
+ },
+ {
+ label: '加料类型',
+ field: 'chargingTypes',
+ type: 'select',
+ width: '340px',
+ clearable: true,
+ multiple: true,
+ placeholder: '请选择加料类型',
+ options: materialChargingType.value
+ },
+ {
+ label: '厂家',
+ field: 'manufacturer',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入厂家',
+ },
+ {
+ label: '记录员',
+ field: 'operator',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入记录员',
+ },
+ {
+ label: '加料日期',
+ field: 'chargingTimeRange',
+ width: '340px',
+ type: 'date',
+ enum: 'daterange', // 其他类型枚举 week, month, year, date, daterange
+ placeholder: '开始日期-结束日期' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ }
+ ])
+
+ // 表格的自定义按钮 hasPermi 为权限参数
+ const feedBtnList = ref([
+ { label: '加料录入', type: 'primary', icon:'Plus', met: 'addFeed', hasPermi:'chargingIn:information:add' },
+ { label: '批量删除', type: 'danger', icon:'Delete', met: 'feedBatchDelete', hasPermi:'chargingIn:information:remove' },
+ ])
+ // 表格列,支持多级表头,字段children
+ const feedColumns = ref([
+ {
+ label: "加料类型",
+ regular: true, // 取消此列的动态列控制
+ prop: "chargingTypeName",
+ minWidth: 120
+ },
+ {
+ label: "浇次",
+ regular: false, // false 或不传 此列可以动态列控制
+ prop: "castTimesNo",
+ minWidth: 100
+ },
+ {
+ label: "加料时间",
+ prop: "chargingTime",
+ sort: true, // 当前列是否支持前端element组件排序
+ minWidth: 160
+ },
+ {
+ label: "操作",
+ minWidth: 150,
+ fixed:'right', // 公共参数,固定列
+ // 自定义插槽,支持jsx语法, 若根据条件判断返回空,不可直接返回<>>虚拟元素,须返回等真实元素
+ slots: (row) => {
+ return <>
+ feedEditFn.value(row)} v-hasPermi={['chargingIn:information:edit']}>修改
+ feedDeleteFn.value(row)} v-hasPermi={['chargingIn:information:remove']}>删除
+ >
+ }
+ },
+ ])
+ // 分页参数
+ const feedPageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ // 表格的配置项
+ const tableOption = ref({
+ checkbox: true, // 是否展示多选框
+ checkList: true, // 是否展示多选框选中数据tag
+ checkKey: 'chargingAmount', // 展示多选框选中数据tag绑定的字段名, checkList为true生效
+ checkMax: 3, // 最大选择条数,不传不做限制
+ index: false, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false, // 是否隐藏分页
+ maxHeight: '58vh', // 表格最大高度
+ rowKey: 'id', // el-table 的 row-key属性,可不传
+ name: 'name', // 当一个路由地址下有多个表格组件,须传name字段,并保证name字段在项目中唯一,若不传会导致列配置功能出错!
+ hidToolBar: false, // 是否隐藏列设置按钮,默认不传展示,传true隐藏
+ slotFooter: function() { // 表格底部自定义插槽
+ return
+ }
+ })
+
+ // 注意: 如果动态列出现 xxx is defined 报错,请检查表格列Columns中的jsx语法是否引用了外部变量,local字符串函数转eval函数执行时,读取的此变量会找不到,需要在toolBar.vue中引入一下
\ No newline at end of file
diff --git a/src/components/ElsTable/index.vue b/src/components/ElsTable/index.vue
new file mode 100644
index 0000000..bd8df4b
--- /dev/null
+++ b/src/components/ElsTable/index.vue
@@ -0,0 +1,445 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+ 已选:
+
+ {{ tag[option.checkKey] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ElsTable/tableColumn.vue b/src/components/ElsTable/tableColumn.vue
new file mode 100644
index 0000000..15a6e6e
--- /dev/null
+++ b/src/components/ElsTable/tableColumn.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ElsTable/toolBar.vue b/src/components/ElsTable/toolBar.vue
new file mode 100644
index 0000000..9087889
--- /dev/null
+++ b/src/components/ElsTable/toolBar.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
new file mode 100644
index 0000000..a5c2734
--- /dev/null
+++ b/src/components/FileUpload/index.vue
@@ -0,0 +1,218 @@
+
+
+
+
+ 选取文件
+
+
+
+ 请上传
+ 大小不超过 {{ fileSize }}MB
+ 格式为 {{ fileType.join("/") }}
+ 的文件
+
+
+
+
+
+ {{ getFileName(file.name) }}
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue
new file mode 100644
index 0000000..18c201e
--- /dev/null
+++ b/src/components/Hamburger/index.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue
new file mode 100644
index 0000000..7a435dd
--- /dev/null
+++ b/src/components/HeaderSearch/index.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue
new file mode 100644
index 0000000..059e889
--- /dev/null
+++ b/src/components/IconSelect/index.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
diff --git a/src/components/IconSelect/requireIcons.js b/src/components/IconSelect/requireIcons.js
new file mode 100644
index 0000000..ac22fd7
--- /dev/null
+++ b/src/components/IconSelect/requireIcons.js
@@ -0,0 +1,8 @@
+let icons = []
+const modules = import.meta.glob('./../../assets/icons/svg/*.svg');
+for (const path in modules) {
+ const p = path.split('assets/icons/svg/')[1].split('.svg')[0];
+ icons.push(p);
+}
+
+export default icons
\ No newline at end of file
diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue
new file mode 100644
index 0000000..1dfe123
--- /dev/null
+++ b/src/components/ImagePreview/index.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue
new file mode 100644
index 0000000..418045d
--- /dev/null
+++ b/src/components/ImageUpload/index.vue
@@ -0,0 +1,258 @@
+
+
+
+
+
+
+ 上传图片
+
+
+
{
+ handlePictureCardPreview(item)
+ }
+ " />
+
+
+
+
+ 请上传
+
+ 大小不超过 {{ fileSize }}MB
+
+
+ 格式为 {{ fileType.join(" / ") }}
+
+ 的文件
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue
new file mode 100644
index 0000000..0a2238f
--- /dev/null
+++ b/src/components/Pagination/index.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/ParentView/index.vue b/src/components/ParentView/index.vue
new file mode 100644
index 0000000..7bf6148
--- /dev/null
+++ b/src/components/ParentView/index.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/components/RightToolbar/index.vue b/src/components/RightToolbar/index.vue
new file mode 100644
index 0000000..becb12c
--- /dev/null
+++ b/src/components/RightToolbar/index.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue
new file mode 100644
index 0000000..efe2f2e
--- /dev/null
+++ b/src/components/Screenfull/index.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue
new file mode 100644
index 0000000..ccfb837
--- /dev/null
+++ b/src/components/SizeSelect/index.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..8c101f6
--- /dev/null
+++ b/src/components/SvgIcon/index.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
diff --git a/src/components/SvgIcon/svgicon.js b/src/components/SvgIcon/svgicon.js
new file mode 100644
index 0000000..4431719
--- /dev/null
+++ b/src/components/SvgIcon/svgicon.js
@@ -0,0 +1,10 @@
+import * as components from '@element-plus/icons-vue'
+
+export default {
+ install: (app) => {
+ for (const key in components) {
+ const componentConfig = components[key];
+ app.component(componentConfig.name, componentConfig);
+ }
+ },
+};
diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue
new file mode 100644
index 0000000..06f6803
--- /dev/null
+++ b/src/components/TopNav/index.vue
@@ -0,0 +1,214 @@
+
+
+
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+ 更多菜单
+
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/TreeSelect/index.vue b/src/components/TreeSelect/index.vue
new file mode 100644
index 0000000..aabdd94
--- /dev/null
+++ b/src/components/TreeSelect/index.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/contentBorder/index.vue b/src/components/contentBorder/index.vue
new file mode 100644
index 0000000..34486a3
--- /dev/null
+++ b/src/components/contentBorder/index.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/dateTimeRange/index.vue b/src/components/dateTimeRange/index.vue
new file mode 100644
index 0000000..d577c77
--- /dev/null
+++ b/src/components/dateTimeRange/index.vue
@@ -0,0 +1,280 @@
+
+
+
+
{
+ handlerChange('start', val)
+ }
+ "
+ @visible-change="
+ (val) => {
+ handlerVisible('start',val)
+ }
+ "
+ :disabled="disabled"
+ />
+ {{ rangeSeparator }}
+ {
+ handlerChange('end', val)
+ }
+ "
+ @visible-change="
+ (val) => {
+ handlerVisible('end',val)
+ }
+ "
+ :disabled="disabled || startTime == '' || !startTime"
+ :disabled-date="disabledDate"
+ :disabled-hours="disabledHours"
+ :disabled-minutes="disabledMinutes"
+ >
+
+
+ {{ cell.text }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/iFrame/index.vue b/src/components/iFrame/index.vue
new file mode 100644
index 0000000..091b1a2
--- /dev/null
+++ b/src/components/iFrame/index.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/src/components/inputRange/index.vue b/src/components/inputRange/index.vue
new file mode 100644
index 0000000..5a1139e
--- /dev/null
+++ b/src/components/inputRange/index.vue
@@ -0,0 +1,136 @@
+
+
+
+ {{ rangeSeparator }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/utils/htmlToPdf.js b/src/components/utils/htmlToPdf.js
new file mode 100644
index 0000000..589d932
--- /dev/null
+++ b/src/components/utils/htmlToPdf.js
@@ -0,0 +1,66 @@
+// 页面导出为pdf格式
+import html2Canvas from "html2canvas";
+import jsPDF from "jspdf";
+import * as htmlToImage from 'html-to-image';
+import { toPng, toJpeg, toBlob, toPixelData, toSvg } from 'html-to-image';
+import { ElMessage } from 'element-plus'
+
+const htmlToPdf = {
+ getPdf(title, id, callback) {
+ var node = document.querySelector(id);
+ node.style.height = node.scrollHeight + 'px'
+ var dom = node.parentNode.innerHTML
+ var canvasImg = null
+ htmlToImage.toPng(node).then(function (dataUrl) {
+ canvasImg = new Image();
+ canvasImg.src = dataUrl
+ node.parentNode.appendChild(canvasImg);
+ html2Canvas(canvasImg, {
+ allowTaint: false,
+ taintTest: true,
+ logging: false,
+ useCORS: true,
+ dpi: window.devicePixelRatio * 1, //将分辨率提高到特定的DPI 提高四倍
+ scale: 1, //按比例增加分辨率
+ }).then((canvas) => {
+ var pdf = new jsPDF("p", "mm", "a4"); //A4纸,纵向
+ var ctx = canvas.getContext("2d"),
+ a4w = 190,
+ a4h = 272, //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
+ imgHeight = Math.floor((a4h * canvas.width) / a4w), //按A4显示比例换算一页图像的像素高度
+ renderedHeight = 0;
+ while (renderedHeight < canvas.height) {
+ var page = document.createElement("canvas");
+ page.className = 'pdf-canvas'
+ page.width = canvas.width;
+ page.height = Math.min(imgHeight, canvas.height - renderedHeight); //可能内容不足一页
+ //用getImageData剪裁指定区域,并画到前面创建的canvas对象中
+ page.getContext("2d").putImageData(
+ ctx.getImageData(0,renderedHeight,canvas.width,Math.min(imgHeight, canvas.height - renderedHeight)),
+ 0,0);
+ pdf.addImage(
+ page.toDataURL("image/jpeg", 1.0),
+ "JPEG",10,10,a4w,Math.min(a4h, (a4w * page.height) / page.width)); //添加图像到页面,保留10mm边距
+ renderedHeight += imgHeight;
+ if (renderedHeight < canvas.height) {
+ pdf.addPage(); //如果后面还有内容,添加一个空页
+ }
+ }
+ pdf.save(title + ".pdf");
+ node.parentNode.removeChild(canvasImg);
+ if (callback) {
+ callback()
+ }
+ ElMessage({ message: '导出成功!', type: 'success' })
+ node.style.height = '100%'
+ }).catch((err)=>{
+ console.log(err)
+ ElMessage({ message: '导出失败!', type: 'error' })
+ })
+ }).catch(function (error) {
+ ElMessage({ message: '导出失败!', type: 'error' })
+ console.error('oops, something went wrong!', error);
+ });
+ },
+};
+export default htmlToPdf;
diff --git a/src/config/browser.patch.js b/src/config/browser.patch.js
new file mode 100644
index 0000000..f1b0821
--- /dev/null
+++ b/src/config/browser.patch.js
@@ -0,0 +1,22 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 去除谷歌浏览器的scroll、wheel等事件警告
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-07 11:16:39
+ * @Date: 2024-02-05 17:29:59
+ */
+(function () {
+ if (typeof EventTarget !== "undefined") {
+ let func = EventTarget.prototype.addEventListener;
+ EventTarget.prototype.addEventListener = function (type, fn, capture) {
+ this.func = func;
+ if (typeof capture !== "boolean") {
+ capture = capture || {};
+ capture.passive = false;
+ }
+ this.func(type, fn, capture);
+ };
+ }
+}())
\ No newline at end of file
diff --git a/src/config/eventBus.js b/src/config/eventBus.js
new file mode 100644
index 0000000..4d1dd7e
--- /dev/null
+++ b/src/config/eventBus.js
@@ -0,0 +1,12 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 事件公交
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-05 17:41:30
+ * @Date: 2024-03-05 17:41:25
+ */
+import mitt from 'mitt';
+const bus = mitt();
+export default bus;
\ No newline at end of file
diff --git a/src/config/main.config.js b/src/config/main.config.js
new file mode 100644
index 0000000..0323ed0
--- /dev/null
+++ b/src/config/main.config.js
@@ -0,0 +1,68 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 其他公共配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-19 15:25:18
+ * @Date: 2024-02-01 17:05:35
+ */
+import { useDict } from '@/utils/dict'
+import { getConfigKey, updateConfigByKey } from "@/api/system/config";
+import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/cfhi'
+import { download } from '@/utils/request'
+import bus from './eventBus'
+import * as echarts from 'echarts'
+import htmlToPdf from '@C/utils/htmlToPdf.js'
+
+import ElsTable from '@C/ElsTable/index.vue'
+import ElsForm from '@C/ElsForm/index.vue'
+import ElsIframe from '@C/iFrame/index'
+import Pagination from '@/components/Pagination'
+import RightToolbar from '@/components/RightToolbar'
+import Editor from "@/components/Editor"
+import FileUpload from "@/components/FileUpload"
+import ImageUpload from "@/components/ImageUpload"
+import ImagePreview from "@/components/ImagePreview"
+import TreeSelect from '@/components/TreeSelect'
+import DictTag from '@/components/DictTag'
+import EchartsFoldLine from '@/components/EchartsFoldLine'
+import DateTimeRange from '@/components/dateTimeRange'
+import inputRange from '@/components/inputRange'
+import contentBorder from '@C/contentBorder/index'
+
+export default function configApp(app){
+ // 全局方法挂载
+ app.config.globalProperties.useDict = useDict
+ app.config.globalProperties.getConfigKey = getConfigKey
+ app.config.globalProperties.updateConfigByKey = updateConfigByKey
+ app.config.globalProperties.download = download
+ app.config.globalProperties.parseTime = parseTime
+ app.config.globalProperties.resetForm = resetForm
+ app.config.globalProperties.handleTree = handleTree
+ app.config.globalProperties.addDateRange = addDateRange
+ app.config.globalProperties.selectDictLabel = selectDictLabel
+ app.config.globalProperties.selectDictLabels = selectDictLabels
+ app.config.globalProperties.echarts = echarts
+ app.config.globalProperties.bus = bus
+ app.config.globalProperties.htmlToPdf = htmlToPdf
+
+ // 全局组件挂载
+ app.component('DictTag', DictTag) // 字典标签组件
+ app.component('Pagination', Pagination) // 分页组件
+ app.component('TreeSelect', TreeSelect) // 自定义树选择组件
+ app.component('FileUpload', FileUpload) // 文件上传组件
+ app.component('ImageUpload', ImageUpload) // 图片上传组件
+ app.component('ImagePreview', ImagePreview) // 图片预览组件
+ app.component('RightToolbar', RightToolbar) // 自定义表格工具组件
+ app.component('Editor', Editor) // 富文本组件
+ app.component('els-table', ElsTable) // 项目统一公共表格组件
+ app.component('els-form', ElsForm) // 项目统一公共表单组件
+ app.component('EchartsFoldLine', EchartsFoldLine) // 项目统一公共表单组件
+ app.component('ElsIframe', ElsIframe) // iframe组件
+ app.component('DateTimeRange', DateTimeRange) // iframe组件
+ app.component('inputRange', inputRange) // input输入范围组件
+ app.component('contentBorder', contentBorder) // input输入范围组件
+}
+
+
diff --git a/src/directive/common/copyText.js b/src/directive/common/copyText.js
new file mode 100644
index 0000000..7063df8
--- /dev/null
+++ b/src/directive/common/copyText.js
@@ -0,0 +1,66 @@
+/**
+* v-copyText 复制文本内容
+* Copyright (c) 2022 ruoyi
+*/
+
+export default {
+ beforeMount(el, { value, arg }) {
+ if (arg === "callback") {
+ el.$copyCallback = value;
+ } else {
+ el.$copyValue = value;
+ const handler = () => {
+ copyTextToClipboard(el.$copyValue);
+ if (el.$copyCallback) {
+ el.$copyCallback(el.$copyValue);
+ }
+ };
+ el.addEventListener("click", handler);
+ el.$destroyCopy = () => el.removeEventListener("click", handler);
+ }
+ }
+}
+
+function copyTextToClipboard(input, { target = document.body } = {}) {
+ const element = document.createElement('textarea');
+ const previouslyFocusedElement = document.activeElement;
+
+ element.value = input;
+
+ // Prevent keyboard from showing on mobile
+ element.setAttribute('readonly', '');
+
+ element.style.contain = 'strict';
+ element.style.position = 'absolute';
+ element.style.left = '-9999px';
+ element.style.fontSize = '12pt'; // Prevent zooming on iOS
+
+ const selection = document.getSelection();
+ const originalRange = selection.rangeCount > 0 && selection.getRangeAt(0);
+
+ target.append(element);
+ element.select();
+
+ // Explicit selection workaround for iOS
+ element.selectionStart = 0;
+ element.selectionEnd = input.length;
+
+ let isSuccess = false;
+ try {
+ isSuccess = document.execCommand('copy');
+ } catch { }
+
+ element.remove();
+
+ if (originalRange) {
+ selection.removeAllRanges();
+ selection.addRange(originalRange);
+ }
+
+ // Get the focus back on the previously focused element, if any
+ if (previouslyFocusedElement) {
+ previouslyFocusedElement.focus();
+ }
+
+ return isSuccess;
+}
diff --git a/src/directive/common/preventClick.js b/src/directive/common/preventClick.js
new file mode 100644
index 0000000..7b1e05f
--- /dev/null
+++ b/src/directive/common/preventClick.js
@@ -0,0 +1,23 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 多次点击同一按钮短时间禁用
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-02-28 14:20:38
+ * @Date: 2024-02-28 12:23:52
+ */
+export default {
+ beforeMount(el, { value }) {
+ const handler = () => {
+ if (!el.disabled) {
+ el.disabled = true;
+ setTimeout(() => {
+ el.disabled = false
+ }, value)
+ }
+ }
+ el.addEventListener("click", handler);
+ el.$destroyCopy = () => el.removeEventListener("click", handler);
+ }
+}
\ No newline at end of file
diff --git a/src/directive/index.js b/src/directive/index.js
new file mode 100644
index 0000000..cc81b1a
--- /dev/null
+++ b/src/directive/index.js
@@ -0,0 +1,11 @@
+import hasRole from './permission/hasRole'
+import hasPermi from './permission/hasPermi'
+import copyText from './common/copyText'
+import preventClick from './common/preventClick'
+
+export default function directive(app){
+ app.directive('hasRole', hasRole)
+ app.directive('hasPermi', hasPermi)
+ app.directive('copyText', copyText)
+ app.directive('preventClick', preventClick)
+}
\ No newline at end of file
diff --git a/src/directive/permission/hasPermi.js b/src/directive/permission/hasPermi.js
new file mode 100644
index 0000000..5d344a8
--- /dev/null
+++ b/src/directive/permission/hasPermi.js
@@ -0,0 +1,43 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description:
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-29 14:49:31
+ * @Date: 2024-03-29 14:44:41
+ */
+ /**
+ * v-hasPermi 操作权限处理
+ */
+
+import useUserStore from '@/store/modules/user'
+
+export default {
+ mounted(el, binding, vnode) {
+ const { value } = binding
+ let newVal = []
+ if (!(value instanceof Array)) {
+ newVal = value ? [value] : []
+ } else {
+ newVal = value[0] ? value : []
+ }
+ const all_permission = "*:*:*";
+ const permissions = useUserStore().permissions
+
+ if (newVal && newVal instanceof Array && newVal.length > 0) {
+ const permissionFlag = newVal
+
+ const hasPermissions = permissions.some(permission => {
+ return all_permission === permission || permissionFlag.includes(permission)
+ })
+
+ if (!hasPermissions) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ // throw new Error(`请设置操作权限标签值`)
+ return
+ }
+ }
+}
diff --git a/src/directive/permission/hasRole.js b/src/directive/permission/hasRole.js
new file mode 100644
index 0000000..8774bdd
--- /dev/null
+++ b/src/directive/permission/hasRole.js
@@ -0,0 +1,28 @@
+ /**
+ * v-hasRole 角色权限处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+import useUserStore from '@/store/modules/user'
+
+export default {
+ mounted(el, binding, vnode) {
+ const { value } = binding
+ const super_admin = "admin";
+ const roles = useUserStore().roles
+
+ if (value && value instanceof Array && value.length > 0) {
+ const roleFlag = value
+
+ const hasRole = roles.some(role => {
+ return super_admin === role || roleFlag.includes(role)
+ })
+
+ if (!hasRole) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ throw new Error(`请设置角色权限标签值`)
+ }
+ }
+}
diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue
new file mode 100644
index 0000000..6bc08b7
--- /dev/null
+++ b/src/layout/components/AppMain.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/IframeToggle/index.vue b/src/layout/components/IframeToggle/index.vue
new file mode 100644
index 0000000..2b8269b
--- /dev/null
+++ b/src/layout/components/IframeToggle/index.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/src/layout/components/InnerLink/index.vue b/src/layout/components/InnerLink/index.vue
new file mode 100644
index 0000000..53a903c
--- /dev/null
+++ b/src/layout/components/InnerLink/index.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
new file mode 100644
index 0000000..053ff78
--- /dev/null
+++ b/src/layout/components/Navbar.vue
@@ -0,0 +1,269 @@
+
+
+
+
+
+
+
diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue
new file mode 100644
index 0000000..badce0f
--- /dev/null
+++ b/src/layout/components/Settings/index.vue
@@ -0,0 +1,241 @@
+
+
+
+
主题风格设置
+
+
+
+ 主题颜色
+
+
+
+
+
+
+ 系统布局配置
+
+
+
+
+ 开启 Tags-Views
+
+
+
+
+
+
+
+
+ 显示 Logo
+
+
+
+
+
+
+ 动态标题
+
+
+
+
+
+
+
+ 保存配置
+ 重置配置
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue
new file mode 100644
index 0000000..8011431
--- /dev/null
+++ b/src/layout/components/Sidebar/Link.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue
new file mode 100644
index 0000000..f63ea73
--- /dev/null
+++ b/src/layout/components/Sidebar/Logo.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue
new file mode 100644
index 0000000..d1a68d1
--- /dev/null
+++ b/src/layout/components/Sidebar/SidebarItem.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/Sidebar/classifyMenu.vue b/src/layout/components/Sidebar/classifyMenu.vue
new file mode 100644
index 0000000..984da0e
--- /dev/null
+++ b/src/layout/components/Sidebar/classifyMenu.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue
new file mode 100644
index 0000000..1b399c0
--- /dev/null
+++ b/src/layout/components/Sidebar/index.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue
new file mode 100644
index 0000000..62ad690
--- /dev/null
+++ b/src/layout/components/TagsView/ScrollPane.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue
new file mode 100644
index 0000000..e106097
--- /dev/null
+++ b/src/layout/components/TagsView/index.vue
@@ -0,0 +1,407 @@
+
+
+
+
+
+
+
+ {{ tag.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/index.js b/src/layout/components/index.js
new file mode 100644
index 0000000..fd57731
--- /dev/null
+++ b/src/layout/components/index.js
@@ -0,0 +1,4 @@
+export { default as AppMain } from './AppMain'
+export { default as Navbar } from './Navbar'
+export { default as Settings } from './Settings'
+export { default as TagsView } from './TagsView/index.vue'
diff --git a/src/layout/index.vue b/src/layout/index.vue
new file mode 100644
index 0000000..8191e3b
--- /dev/null
+++ b/src/layout/index.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..826b0af
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,58 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 项目基础配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-02-28 15:58:08
+ * @Date: 2024-02-01 17:04:20
+ */
+import { createApp } from 'vue'
+
+import Cookies from 'js-cookie'
+
+import ElementPlus from 'element-plus'
+import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言
+
+import '@/assets/styles/index.scss' // global css
+import App from './App'
+import store from './store'
+import router from './router'
+import directive from './directive' // directive
+
+// 注册指令
+import plugins from './plugins' // plugins
+
+// svg图标
+import 'virtual:svg-icons-register'
+import SvgIcon from '@/components/SvgIcon'
+import elementIcons from '@/components/SvgIcon/svgicon'
+
+// 其他公共选项
+import configApp from '@/config/main.config.js'
+import '@/config/browser.patch.js'
+
+import './permission' // permission control
+
+const app = createApp(App)
+
+app.use(router)
+app.use(store)
+app.use(plugins)
+app.use(elementIcons)
+app.component('svg-icon', SvgIcon)
+
+directive(app)
+configApp(app)
+
+// 使用element-plus 并且设置全局的大小
+app.use(ElementPlus, {
+ locale: locale,
+ // 支持 large、default、small
+ size: Cookies.get('size') || 'default'
+})
+
+// 修改 el-dialog 默认点击遮照为不关闭
+app._context.components.ElDialog.props.closeOnClickModal.default = false
+
+app.mount('#app')
diff --git a/src/permission.js b/src/permission.js
new file mode 100644
index 0000000..a474e0e
--- /dev/null
+++ b/src/permission.js
@@ -0,0 +1,63 @@
+import router from './router'
+import { ElMessage } from 'element-plus'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import { getToken } from '@/utils/auth'
+import { isHttp } from '@/utils/validate'
+import { isRelogin } from '@/utils/request'
+import useUserStore from '@/store/modules/user'
+import useSettingsStore from '@/store/modules/settings'
+import usePermissionStore from '@/store/modules/permission'
+
+NProgress.configure({ showSpinner: false });
+
+const whiteList = ['/login', '/register'];
+
+router.beforeEach((to, from, next) => {
+ NProgress.start()
+ if (getToken()) {
+ to.meta.title && useSettingsStore().setTitle(to.meta.title)
+ /* has token*/
+ if (to.path === '/login') {
+ next({ path: '/' })
+ NProgress.done()
+ } else {
+ if (useUserStore().roles.length === 0) {
+ isRelogin.show = true
+ // 判断当前用户是否已拉取完user_info信息
+ useUserStore().getInfo().then(() => {
+ isRelogin.show = false
+ usePermissionStore().generateRoutes().then(accessRoutes => {
+ // 根据roles权限生成可访问的路由表
+ accessRoutes.forEach(route => {
+ if (!isHttp(route.path)) {
+ router.addRoute(route) // 动态添加可访问路由表
+ }
+ })
+ next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+ })
+ }).catch(err => {
+ useUserStore().logOut().then(() => {
+ ElMessage.error(err)
+ next({ path: '/' })
+ })
+ })
+ } else {
+ next()
+ }
+ }
+ } else {
+ // 没有token
+ if (whiteList.indexOf(to.path) !== -1) {
+ // 在免登录白名单,直接进入
+ next()
+ } else {
+ next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
+ NProgress.done()
+ }
+ }
+})
+
+router.afterEach(() => {
+ NProgress.done()
+})
diff --git a/src/plugins/auth.js b/src/plugins/auth.js
new file mode 100644
index 0000000..5e8c28d
--- /dev/null
+++ b/src/plugins/auth.js
@@ -0,0 +1,60 @@
+import useUserStore from '@/store/modules/user'
+
+function authPermission(permission) {
+ const all_permission = "*:*:*";
+ const permissions = useUserStore().permissions
+ if (permission && permission.length > 0) {
+ return permissions.some(v => {
+ return all_permission === v || v === permission
+ })
+ } else {
+ return false
+ }
+}
+
+function authRole(role) {
+ const super_admin = "admin";
+ const roles = useUserStore().roles
+ if (role && role.length > 0) {
+ return roles.some(v => {
+ return super_admin === v || v === role
+ })
+ } else {
+ return false
+ }
+}
+
+export default {
+ // 验证用户是否具备某权限
+ hasPermi(permission) {
+ return authPermission(permission);
+ },
+ // 验证用户是否含有指定权限,只需包含其中一个
+ hasPermiOr(permissions) {
+ return permissions.some(item => {
+ return authPermission(item)
+ })
+ },
+ // 验证用户是否含有指定权限,必须全部拥有
+ hasPermiAnd(permissions) {
+ return permissions.every(item => {
+ return authPermission(item)
+ })
+ },
+ // 验证用户是否具备某角色
+ hasRole(role) {
+ return authRole(role);
+ },
+ // 验证用户是否含有指定角色,只需包含其中一个
+ hasRoleOr(roles) {
+ return roles.some(item => {
+ return authRole(item)
+ })
+ },
+ // 验证用户是否含有指定角色,必须全部拥有
+ hasRoleAnd(roles) {
+ return roles.every(item => {
+ return authRole(item)
+ })
+ }
+}
diff --git a/src/plugins/cache.js b/src/plugins/cache.js
new file mode 100644
index 0000000..6b5c00b
--- /dev/null
+++ b/src/plugins/cache.js
@@ -0,0 +1,77 @@
+const sessionCache = {
+ set (key, value) {
+ if (!sessionStorage) {
+ return
+ }
+ if (key != null && value != null) {
+ sessionStorage.setItem(key, value)
+ }
+ },
+ get (key) {
+ if (!sessionStorage) {
+ return null
+ }
+ if (key == null) {
+ return null
+ }
+ return sessionStorage.getItem(key)
+ },
+ setJSON (key, jsonValue) {
+ if (jsonValue != null) {
+ this.set(key, JSON.stringify(jsonValue))
+ }
+ },
+ getJSON (key) {
+ const value = this.get(key)
+ if (value != null) {
+ return JSON.parse(value)
+ }
+ },
+ remove (key) {
+ sessionStorage.removeItem(key);
+ }
+}
+const localCache = {
+ set (key, value) {
+ if (!localStorage) {
+ return
+ }
+ if (key != null && value != null) {
+ localStorage.setItem(key, value)
+ }
+ },
+ get (key) {
+ if (!localStorage) {
+ return null
+ }
+ if (key == null) {
+ return null
+ }
+ return localStorage.getItem(key)
+ },
+ setJSON (key, jsonValue) {
+ if (jsonValue != null) {
+ this.set(key, JSON.stringify(jsonValue))
+ }
+ },
+ getJSON (key) {
+ const value = this.get(key)
+ if (value != null) {
+ return JSON.parse(value)
+ }
+ },
+ remove (key) {
+ localStorage.removeItem(key);
+ }
+}
+
+export default {
+ /**
+ * 会话级缓存
+ */
+ session: sessionCache,
+ /**
+ * 本地缓存
+ */
+ local: localCache
+}
diff --git a/src/plugins/download.js b/src/plugins/download.js
new file mode 100644
index 0000000..92a2356
--- /dev/null
+++ b/src/plugins/download.js
@@ -0,0 +1,71 @@
+import axios from 'axios'
+import { ElLoading, ElMessage } from 'element-plus'
+import { saveAs } from 'file-saver'
+import { getToken } from '@/utils/auth'
+import errorCode from '@/utils/errorCode'
+import { blobValidate } from '@/utils/cfhi'
+
+const baseURL = import.meta.env.VITE_APP_BASE_API
+let downloadLoadingInstance;
+
+export default {
+ oss(ossId) {
+ var url = baseURL + '/system/oss/download/' + ossId
+ downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
+ axios({
+ method: 'get',
+ url: url,
+ responseType: 'blob',
+ headers: { 'Authorization': 'Bearer ' + getToken() }
+ }).then((res) => {
+ const isBlob = blobValidate(res.data);
+ if (isBlob) {
+ const blob = new Blob([res.data], { type: 'application/octet-stream' })
+ this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
+ } else {
+ this.printErrMsg(res.data);
+ }
+ downloadLoadingInstance.close();
+ }).catch((r) => {
+ console.error(r)
+ Message.error('下载文件出现错误,请联系管理员!')
+ downloadLoadingInstance.close();
+ })
+ },
+ zip(url, name) {
+ var url = baseURL + url
+ downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
+ axios({
+ method: 'get',
+ url: url,
+ responseType: 'blob',
+ headers: {
+ 'Authorization': 'Bearer ' + getToken(),
+ 'datasource': localStorage.getItem("dataName")
+ }
+ }).then((res) => {
+ const isBlob = blobValidate(res.data);
+ if (isBlob) {
+ const blob = new Blob([res.data], { type: 'application/zip' })
+ this.saveAs(blob, name)
+ } else {
+ this.printErrMsg(res.data);
+ }
+ downloadLoadingInstance.close();
+ }).catch((r) => {
+ console.error(r)
+ ElMessage.error('下载文件出现错误,请联系管理员!')
+ downloadLoadingInstance.close();
+ })
+ },
+ saveAs(text, name, opts) {
+ saveAs(text, name, opts);
+ },
+ async printErrMsg(data) {
+ const resText = await data.text();
+ const rspObj = JSON.parse(resText);
+ const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
+ ElMessage.error(errMsg);
+ }
+}
+
diff --git a/src/plugins/index.js b/src/plugins/index.js
new file mode 100644
index 0000000..47d1b41
--- /dev/null
+++ b/src/plugins/index.js
@@ -0,0 +1,18 @@
+import tab from './tab'
+import auth from './auth'
+import cache from './cache'
+import modal from './modal'
+import download from './download'
+
+export default function installPlugins(app){
+ // 页签操作
+ app.config.globalProperties.$tab = tab
+ // 认证对象
+ app.config.globalProperties.$auth = auth
+ // 缓存对象
+ app.config.globalProperties.$cache = cache
+ // 模态框对象
+ app.config.globalProperties.$modal = modal
+ // 下载文件
+ app.config.globalProperties.$download = download
+}
diff --git a/src/plugins/modal.js b/src/plugins/modal.js
new file mode 100644
index 0000000..b59e14d
--- /dev/null
+++ b/src/plugins/modal.js
@@ -0,0 +1,82 @@
+import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus'
+
+let loadingInstance;
+
+export default {
+ // 消息提示
+ msg(content) {
+ ElMessage.info(content)
+ },
+ // 错误消息
+ msgError(content) {
+ ElMessage.error(content)
+ },
+ // 成功消息
+ msgSuccess(content) {
+ ElMessage.success(content)
+ },
+ // 警告消息
+ msgWarning(content) {
+ ElMessage.warning(content)
+ },
+ // 弹出提示
+ alert(content) {
+ ElMessageBox.alert(content, "系统提示")
+ },
+ // 错误提示
+ alertError(content) {
+ ElMessageBox.alert(content, "系统提示", { type: 'error' })
+ },
+ // 成功提示
+ alertSuccess(content) {
+ ElMessageBox.alert(content, "系统提示", { type: 'success' })
+ },
+ // 警告提示
+ alertWarning(content) {
+ ElMessageBox.alert(content, "系统提示", { type: 'warning' })
+ },
+ // 通知提示
+ notify(content) {
+ ElNotification.info(content)
+ },
+ // 错误通知
+ notifyError(content) {
+ ElNotification.error(content);
+ },
+ // 成功通知
+ notifySuccess(content) {
+ ElNotification.success(content)
+ },
+ // 警告通知
+ notifyWarning(content) {
+ ElNotification.warning(content)
+ },
+ // 确认窗体
+ confirm(content) {
+ return ElMessageBox.confirm(content, "系统提示", {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: "warning",
+ })
+ },
+ // 提交内容
+ prompt(content) {
+ return ElMessageBox.prompt(content, "系统提示", {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: "warning",
+ })
+ },
+ // 打开遮罩层
+ loading(content) {
+ loadingInstance = ElLoading.service({
+ lock: true,
+ text: content,
+ background: "rgba(0, 0, 0, 0.7)",
+ })
+ },
+ // 关闭遮罩层
+ closeLoading() {
+ loadingInstance.close();
+ }
+}
diff --git a/src/plugins/tab.js b/src/plugins/tab.js
new file mode 100644
index 0000000..7b51cf5
--- /dev/null
+++ b/src/plugins/tab.js
@@ -0,0 +1,69 @@
+import useTagsViewStore from '@/store/modules/tagsView'
+import router from '@/router'
+
+export default {
+ // 刷新当前tab页签
+ refreshPage(obj) {
+ const { path, query, matched } = router.currentRoute.value;
+ if (obj === undefined) {
+ matched.forEach((m) => {
+ if (m.components && m.components.default && m.components.default.name) {
+ if (!['Layout', 'ParentView'].includes(m.components.default.name)) {
+ obj = { name: m.components.default.name, path: path, query: query };
+ }
+ }
+ });
+ }
+ return useTagsViewStore().delCachedView(obj).then(() => {
+ const { path, query } = obj
+ router.replace({
+ path: '/redirect' + path,
+ query: query
+ })
+ })
+ },
+ // 关闭当前tab页签,打开新页签
+ closeOpenPage(obj) {
+ useTagsViewStore().delView(router.currentRoute.value);
+ if (obj !== undefined) {
+ return router.push(obj);
+ }
+ },
+ // 关闭指定tab页签
+ closePage(obj) {
+ if (obj === undefined) {
+ return useTagsViewStore().delView(router.currentRoute.value).then(({ visitedViews }) => {
+ const latestView = visitedViews.slice(-1)[0]
+ if (latestView) {
+ return router.push(latestView.fullPath)
+ }
+ return router.push('/');
+ });
+ }
+ return useTagsViewStore().delView(obj);
+ },
+ // 关闭所有tab页签
+ closeAllPage() {
+ return useTagsViewStore().delAllViews();
+ },
+ // 关闭左侧tab页签
+ closeLeftPage(obj) {
+ return useTagsViewStore().delLeftTags(obj || router.currentRoute.value);
+ },
+ // 关闭右侧tab页签
+ closeRightPage(obj) {
+ return useTagsViewStore().delRightTags(obj || router.currentRoute.value);
+ },
+ // 关闭其他tab页签
+ closeOtherPage(obj) {
+ return useTagsViewStore().delOthersViews(obj || router.currentRoute.value);
+ },
+ // 打开tab页签
+ openPage(url) {
+ return router.push(url);
+ },
+ // 修改tab页签
+ updatePage(obj) {
+ return useTagsViewStore().updateVisitedView(obj);
+ }
+}
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000..98518f9
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,175 @@
+import { createWebHistory, createRouter } from 'vue-router'
+/* Layout */
+import Layout from '@/layout'
+
+/**
+ * Note: 路由配置项
+ *
+ * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1
+ * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
+ * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面
+ * // 若你想不管路由下面的 children 声明的个数都显示你的根路由
+ * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
+ * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
+ * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题
+ * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数
+ * roles: ['admin', 'common'] // 访问路由的角色权限
+ * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限
+ * meta : {
+ noCache: true // 如果设置为true,则不会被 缓存(默认 false)
+ title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
+ icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg
+ breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示
+ activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。
+ }
+ */
+
+// 公共路由
+export const constantRoutes = [
+ {
+ path: '/redirect',
+ component: Layout,
+ hidden: true,
+ children: [
+ {
+ path: '/redirect/:path(.*)',
+ component: () => import('@/views/redirect/index.vue')
+ }
+ ]
+ },
+ {
+ path: '/login',
+ component: () => import('@/views/login'),
+ hidden: true
+ },
+ {
+ path: '/register',
+ component: () => import('@/views/register'),
+ hidden: true
+ },
+ {
+ path: "/:pathMatch(.*)*",
+ component: () => import('@/views/error/404'),
+ hidden: true
+ },
+ {
+ path: '/401',
+ component: () => import('@/views/error/401'),
+ hidden: true
+ },
+ {
+ path: '',
+ component: Layout,
+ redirect: 'index',
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/index'),
+ name: 'Index',
+ meta: { title: '工作台', icon: 'staging', affix: true }
+ }
+ ]
+ },
+ {
+ path: '/user',
+ component: Layout,
+ hidden: true,
+ redirect: 'noredirect',
+ children: [
+ {
+ path: 'profile',
+ component: () => import('@/views/system/user/profile/index'),
+ name: 'Profile',
+ meta: { title: '个人中心', icon: 'user' }
+ }
+ ]
+ }
+]
+
+// 动态路由,基于用户权限动态去加载
+export const dynamicRoutes = [
+ {
+ path: '/system/user-auth',
+ component: Layout,
+ hidden: true,
+ permissions: ['system:user:edit'],
+ children: [
+ {
+ path: 'role/:userId(\\d+)',
+ component: () => import('@/views/system/user/authRole'),
+ name: 'AuthRole',
+ meta: { title: '分配角色', activeMenu: '/system/user' }
+ }
+ ]
+ },
+ {
+ path: '/system/role-auth',
+ component: Layout,
+ hidden: true,
+ permissions: ['system:role:edit'],
+ children: [
+ {
+ path: 'user/:roleId(\\d+)',
+ component: () => import('@/views/system/role/authUser'),
+ name: 'AuthUser',
+ meta: { title: '分配用户', activeMenu: '/system/role' }
+ }
+ ]
+ },
+ {
+ path: '/system/dict-data',
+ component: Layout,
+ hidden: true,
+ permissions: ['system:dict:list'],
+ children: [
+ {
+ path: 'index/:dictId(\\d+)',
+ component: () => import('@/views/system/dict/data'),
+ name: 'Data',
+ meta: { title: '字典数据', activeMenu: '/system/dict' }
+ }
+ ]
+ },
+ {
+ path: '/system/oss-config',
+ component: Layout,
+ hidden: true,
+ permissions: ['system:oss:list'],
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/system/oss/config'),
+ name: 'OssConfig',
+ meta: { title: '配置管理', activeMenu: '/system/oss'}
+ }
+ ]
+ },
+ {
+ path: '/tool/gen-edit',
+ component: Layout,
+ hidden: true,
+ permissions: ['tool:gen:edit'],
+ children: [
+ {
+ path: 'index/:tableId(\\d+)',
+ component: () => import('@/views/tool/gen/editTable'),
+ name: 'GenEdit',
+ meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
+ }
+ ]
+ }
+]
+
+const router = createRouter({
+ history: createWebHistory(import.meta.env.VITE_APP_CONTEXT_PATH),
+ routes: constantRoutes,
+ scrollBehavior(to, from, savedPosition) {
+ if (savedPosition) {
+ return savedPosition
+ } else {
+ return { top: 0 }
+ }
+ },
+});
+
+export default router;
diff --git a/src/settings.js b/src/settings.js
new file mode 100644
index 0000000..cbbcaf6
--- /dev/null
+++ b/src/settings.js
@@ -0,0 +1,56 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 系统配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-02-22 12:10:35
+ * @Date: 2024-02-20 12:20:21
+ */
+export default {
+ /**
+ * 网页标题
+ */
+ title: import.meta.env.VITE_APP_TITLE,
+ /**
+ * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
+ */
+ sideTheme: 'theme-light',
+ /**
+ * 是否系统布局配置
+ */
+ showSettings: true,
+
+ /**
+ * 是否显示顶部导航
+ */
+ topNav: true,
+
+ /**
+ * 是否显示 tagsView
+ */
+ tagsView: true,
+
+ /**
+ * 是否固定头部
+ */
+ fixedHeader: false,
+
+ /**
+ * 是否显示logo
+ */
+ sidebarLogo: true,
+
+ /**
+ * 是否显示动态标题
+ */
+ dynamicTitle: false,
+
+ /**
+ * @type {string | array} 'production' | ['production', 'development']
+ * @description Need show err logs component.
+ * The default is only used in the production env
+ * If you want to also use it in dev, you can pass ['production', 'development']
+ */
+ errorLog: 'production'
+}
diff --git a/src/store/index.js b/src/store/index.js
new file mode 100644
index 0000000..f10f389
--- /dev/null
+++ b/src/store/index.js
@@ -0,0 +1,3 @@
+const store = createPinia()
+
+export default store
\ No newline at end of file
diff --git a/src/store/modules/app.js b/src/store/modules/app.js
new file mode 100644
index 0000000..13a5e61
--- /dev/null
+++ b/src/store/modules/app.js
@@ -0,0 +1,53 @@
+import Cookies from 'js-cookie'
+
+const useAppStore = defineStore(
+ 'app',
+ {
+ state: () => ({
+ sidebar: {
+ opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+ withoutAnimation: false,
+ hide: false,
+ currentModule: Cookies.get('currentModule') ? JSON.parse(Cookies.get('currentModule')) : {}
+ },
+ device: 'desktop',
+ size: Cookies.get('size') || 'default'
+ }),
+ actions: {
+ toggleSideBar(withoutAnimation) {
+ if (this.sidebar.hide) {
+ return false;
+ }
+ this.sidebar.opened = !this.sidebar.opened
+ this.sidebar.withoutAnimation = withoutAnimation
+ if (this.sidebar.opened) {
+ Cookies.set('sidebarStatus', 1)
+ } else {
+ Cookies.set('sidebarStatus', 0)
+ }
+ },
+ closeSideBar({ withoutAnimation }) {
+ Cookies.set('sidebarStatus', 0)
+ this.sidebar.opened = false
+ this.sidebar.withoutAnimation = withoutAnimation
+ },
+ toggleDevice(device) {
+ this.device = device
+ },
+ setSize(size) {
+ this.size = size;
+ Cookies.set('size', size)
+ },
+ toggleSideBarHide(status) {
+ this.sidebar.hide = status
+ },
+ toggleCurrentModule(val,sta=false) {
+ this.sidebar.currentModule = val
+ if (sta) {
+ Cookies.set('currentModule', JSON.stringify(val))
+ }
+ }
+ }
+ })
+
+export default useAppStore
diff --git a/src/store/modules/dict.js b/src/store/modules/dict.js
new file mode 100644
index 0000000..27fc308
--- /dev/null
+++ b/src/store/modules/dict.js
@@ -0,0 +1,57 @@
+const useDictStore = defineStore(
+ 'dict',
+ {
+ state: () => ({
+ dict: new Array()
+ }),
+ actions: {
+ // 获取字典
+ getDict(_key) {
+ if (_key == null && _key == "") {
+ return null;
+ }
+ try {
+ for (let i = 0; i < this.dict.length; i++) {
+ if (this.dict[i].key == _key) {
+ return this.dict[i].value;
+ }
+ }
+ } catch (e) {
+ return null;
+ }
+ },
+ // 设置字典
+ setDict(_key, value) {
+ if (_key !== null && _key !== "") {
+ this.dict.push({
+ key: _key,
+ value: value
+ });
+ }
+ },
+ // 删除字典
+ removeDict(_key) {
+ var bln = false;
+ try {
+ for (let i = 0; i < this.dict.length; i++) {
+ if (this.dict[i].key == _key) {
+ this.dict.splice(i, 1);
+ return true;
+ }
+ }
+ } catch (e) {
+ bln = false;
+ }
+ return bln;
+ },
+ // 清空字典
+ cleanDict() {
+ this.dict = new Array();
+ },
+ // 初始字典
+ initDict() {
+ }
+ }
+ })
+
+export default useDictStore
diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js
new file mode 100644
index 0000000..26ef253
--- /dev/null
+++ b/src/store/modules/permission.js
@@ -0,0 +1,143 @@
+import auth from '@/plugins/auth'
+import router, { constantRoutes, dynamicRoutes } from '@/router'
+import { getRouters } from '@/api/menu'
+import Layout from '@/layout/index'
+import ParentView from '@/components/ParentView'
+import InnerLink from '@/layout/components/InnerLink'
+
+// 匹配views里面所有的.vue文件
+const modules = import.meta.glob('./../../views/**/*.vue')
+
+const usePermissionStore = defineStore(
+ 'permission',
+ {
+ state: () => ({
+ routes: [],
+ addRoutes: [],
+ defaultRoutes: [],
+ topbarRouters: [],
+ sidebarRouters: []
+ }),
+ actions: {
+ setRoutes(routes) {
+ this.addRoutes = routes
+ this.routes = constantRoutes.concat(routes)
+ },
+ setDefaultRoutes(routes) {
+ this.defaultRoutes = constantRoutes.concat(routes)
+ },
+ setTopbarRoutes(routes) {
+ this.topbarRouters = routes
+ },
+ setSidebarRouters(routes) {
+ this.sidebarRouters = routes
+ },
+ generateRoutes(roles) {
+ return new Promise(resolve => {
+ // 向后端请求路由数据
+ getRouters().then(res => {
+ const sdata = JSON.parse(JSON.stringify(res.data))
+ const rdata = JSON.parse(JSON.stringify(res.data))
+ const defaultData = JSON.parse(JSON.stringify(res.data))
+ const sidebarRoutes = filterAsyncRouter(sdata)
+ const rewriteRoutes = filterAsyncRouter(rdata, false, true)
+ const defaultRoutes = filterAsyncRouter(defaultData)
+ const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
+ asyncRoutes.forEach(route => { router.addRoute(route) })
+ this.setRoutes(rewriteRoutes)
+ this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
+ this.setDefaultRoutes(sidebarRoutes)
+ // this.setTopbarRoutes(defaultRoutes)
+ this.setTopbarRoutes(constantRoutes.concat(defaultRoutes))
+ resolve(rewriteRoutes)
+ })
+ })
+ }
+ }
+ })
+
+// 遍历后台传来的路由字符串,转换为组件对象
+function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
+ return asyncRouterMap.filter(route => {
+ if (type && route.children) {
+ route.children = filterChildren(route.children)
+ }
+ if (route.component) {
+ // Layout ParentView 组件特殊处理
+ if (route.component === 'Layout') {
+ route.component = Layout
+ } else if (route.component === 'ParentView') {
+ route.component = ParentView
+ } else if (route.component === 'InnerLink') {
+ route.component = InnerLink
+ } else {
+ route.component = loadView(route.component)
+ }
+ }
+ if (route.children != null && route.children && route.children.length) {
+ route.children = filterAsyncRouter(route.children, route, type)
+ } else {
+ delete route['children']
+ delete route['redirect']
+ }
+ return true
+ })
+}
+
+function filterChildren(childrenMap, lastRouter = false) {
+ var children = []
+ childrenMap.forEach((el, index) => {
+ if (el.children && el.children.length) {
+ if (el.component === 'ParentView' && !lastRouter) {
+ el.children.forEach(c => {
+ c.path = el.path + '/' + c.path
+ if (c.children && c.children.length) {
+ children = children.concat(filterChildren(c.children, c))
+ return
+ }
+ children.push(c)
+ })
+ return
+ }
+ }
+ if (lastRouter) {
+ el.path = lastRouter.path + '/' + el.path
+ if (el.children && el.children.length) {
+ children = children.concat(filterChildren(el.children, el))
+ return
+ }
+ }
+ children = children.concat(el)
+ })
+ return children
+}
+
+// 动态路由遍历,验证是否具备权限
+export function filterDynamicRoutes(routes) {
+ const res = []
+ routes.forEach(route => {
+ if (route.permissions) {
+ if (auth.hasPermiOr(route.permissions)) {
+ res.push(route)
+ }
+ } else if (route.roles) {
+ if (auth.hasRoleOr(route.roles)) {
+ res.push(route)
+ }
+ }
+ })
+ return res
+}
+
+export const loadView = (view) => {
+ let res;
+ for (const path in modules) {
+ const dir = path.split('views/')[1].split('.vue')[0];
+ if (dir === view) {
+ res = () => modules[path]();
+ }
+ }
+ return res;
+}
+
+export default usePermissionStore
diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js
new file mode 100644
index 0000000..3ae2d97
--- /dev/null
+++ b/src/store/modules/settings.js
@@ -0,0 +1,47 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description:
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-02-28 09:36:14
+ * @Date: 2024-02-28 09:36:14
+ */
+import defaultSettings from '@/settings'
+import { useDynamicTitle } from '@/utils/dynamicTitle'
+
+const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings
+
+const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
+
+const useSettingsStore = defineStore(
+ 'settings',
+ {
+ state: () => ({
+ title: '',
+ theme: storageSetting.theme || '#005AE0',
+ sideTheme: storageSetting.sideTheme || sideTheme,
+ showSettings: showSettings,
+ topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
+ tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
+ fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader,
+ sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo,
+ dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle
+ }),
+ actions: {
+ // 修改布局设置
+ changeSetting(data) {
+ const { key, value } = data
+ if (this.hasOwnProperty(key)) {
+ this[key] = value
+ }
+ },
+ // 设置网页标题
+ setTitle(title) {
+ this.title = title
+ useDynamicTitle();
+ }
+ }
+ })
+
+export default useSettingsStore
diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js
new file mode 100644
index 0000000..9d07f33
--- /dev/null
+++ b/src/store/modules/tagsView.js
@@ -0,0 +1,182 @@
+const useTagsViewStore = defineStore(
+ 'tags-view',
+ {
+ state: () => ({
+ visitedViews: [],
+ cachedViews: [],
+ iframeViews: []
+ }),
+ actions: {
+ addView(view) {
+ this.addVisitedView(view)
+ this.addCachedView(view)
+ },
+ addIframeView(view) {
+ if (this.iframeViews.some(v => v.path === view.path)) return
+ this.iframeViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
+ },
+ addVisitedView(view) {
+ if (this.visitedViews.some(v => v.path === view.path)) return
+ this.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
+ },
+ addCachedView(view) {
+ if (this.cachedViews.includes(view.name)) return
+ if (!view.meta.noCache) {
+ this.cachedViews.push(view.name)
+ }
+ },
+ delView(view) {
+ return new Promise(resolve => {
+ this.delVisitedView(view)
+ this.delCachedView(view)
+ resolve({
+ visitedViews: [...this.visitedViews],
+ cachedViews: [...this.cachedViews]
+ })
+ })
+ },
+ delVisitedView(view) {
+ return new Promise(resolve => {
+ for (const [i, v] of this.visitedViews.entries()) {
+ if (v.path === view.path) {
+ this.visitedViews.splice(i, 1)
+ break
+ }
+ }
+ this.iframeViews = this.iframeViews.filter(item => item.path !== view.path)
+ resolve([...this.visitedViews])
+ })
+ },
+ delIframeView(view) {
+ return new Promise(resolve => {
+ this.iframeViews = this.iframeViews.filter(item => item.path !== view.path)
+ resolve([...this.iframeViews])
+ })
+ },
+ delCachedView(view) {
+ return new Promise(resolve => {
+ const index = this.cachedViews.indexOf(view.name)
+ index > -1 && this.cachedViews.splice(index, 1)
+ resolve([...this.cachedViews])
+ })
+ },
+ delOthersViews(view) {
+ return new Promise(resolve => {
+ this.delOthersVisitedViews(view)
+ this.delOthersCachedViews(view)
+ resolve({
+ visitedViews: [...this.visitedViews],
+ cachedViews: [...this.cachedViews]
+ })
+ })
+ },
+ delOthersVisitedViews(view) {
+ return new Promise(resolve => {
+ this.visitedViews = this.visitedViews.filter(v => {
+ return v.meta.affix || v.path === view.path
+ })
+ this.iframeViews = this.iframeViews.filter(item => item.path === view.path)
+ resolve([...this.visitedViews])
+ })
+ },
+ delOthersCachedViews(view) {
+ return new Promise(resolve => {
+ const index = this.cachedViews.indexOf(view.name)
+ if (index > -1) {
+ this.cachedViews = this.cachedViews.slice(index, index + 1)
+ } else {
+ this.cachedViews = []
+ }
+ resolve([...this.cachedViews])
+ })
+ },
+ delAllViews(view) {
+ return new Promise(resolve => {
+ this.delAllVisitedViews(view)
+ this.delAllCachedViews(view)
+ resolve({
+ visitedViews: [...this.visitedViews],
+ cachedViews: [...this.cachedViews]
+ })
+ })
+ },
+ delAllVisitedViews(view) {
+ return new Promise(resolve => {
+ const affixTags = this.visitedViews.filter(tag => tag.meta.affix)
+ this.visitedViews = affixTags
+ this.iframeViews = []
+ resolve([...this.visitedViews])
+ })
+ },
+ delAllCachedViews(view) {
+ return new Promise(resolve => {
+ this.cachedViews = []
+ resolve([...this.cachedViews])
+ })
+ },
+ updateVisitedView(view) {
+ for (let v of this.visitedViews) {
+ if (v.path === view.path) {
+ v = Object.assign(v, view)
+ break
+ }
+ }
+ },
+ delRightTags(view) {
+ return new Promise(resolve => {
+ const index = this.visitedViews.findIndex(v => v.path === view.path)
+ if (index === -1) {
+ return
+ }
+ this.visitedViews = this.visitedViews.filter((item, idx) => {
+ if (idx <= index || (item.meta && item.meta.affix)) {
+ return true
+ }
+ const i = this.cachedViews.indexOf(item.name)
+ if (i > -1) {
+ this.cachedViews.splice(i, 1)
+ }
+ if(item.meta.link) {
+ const fi = this.iframeViews.findIndex(v => v.path === item.path)
+ this.iframeViews.splice(fi, 1)
+ }
+ return false
+ })
+ resolve([...this.visitedViews])
+ })
+ },
+ delLeftTags(view) {
+ return new Promise(resolve => {
+ const index = this.visitedViews.findIndex(v => v.path === view.path)
+ if (index === -1) {
+ return
+ }
+ this.visitedViews = this.visitedViews.filter((item, idx) => {
+ if (idx >= index || (item.meta && item.meta.affix)) {
+ return true
+ }
+ const i = this.cachedViews.indexOf(item.name)
+ if (i > -1) {
+ this.cachedViews.splice(i, 1)
+ }
+ if(item.meta.link) {
+ const fi = this.iframeViews.findIndex(v => v.path === item.path)
+ this.iframeViews.splice(fi, 1)
+ }
+ return false
+ })
+ resolve([...this.visitedViews])
+ })
+ }
+ }
+ })
+
+export default useTagsViewStore
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
new file mode 100644
index 0000000..de021d2
--- /dev/null
+++ b/src/store/modules/user.js
@@ -0,0 +1,74 @@
+import { login, logout, getInfo } from '@/api/login'
+import { getToken, setToken, removeToken } from '@/utils/auth'
+import defAva from '@/assets/images/profile.png'
+
+const useUserStore = defineStore(
+ 'user',
+ {
+ state: () => ({
+ token: getToken(),
+ id: '',
+ name: '',
+ nickName: '',
+ avatar: '',
+ roles: [],
+ permissions: []
+ }),
+ actions: {
+ // 登录
+ login(userInfo) {
+ const username = userInfo.username.trim()
+ const password = userInfo.password
+ const code = userInfo.code
+ const uuid = userInfo.uuid
+ return new Promise((resolve, reject) => {
+ login(username, password, code, uuid).then(res => {
+ setToken(res.data.token)
+ this.token = res.data.token
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+ // 获取用户信息
+ getInfo() {
+ return new Promise((resolve, reject) => {
+ getInfo().then(res => {
+ const user = res.data.user
+ const avatar = (user.avatar == "" || user.avatar == null) ? defAva : user.avatar;
+
+ if (res.data.roles && res.data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
+ this.roles = res.data.roles
+ this.permissions = res.data.permissions
+ } else {
+ this.roles = ['ROLE_DEFAULT']
+ }
+ this.id = user.userId
+ this.name = user.userName
+ this.nickName = user.nickName
+ this.avatar = avatar
+ resolve(res)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+ // 退出系统
+ logOut() {
+ return new Promise((resolve, reject) => {
+ logout(this.token).then(() => {
+ this.token = ''
+ this.roles = []
+ this.permissions = []
+ removeToken()
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ }
+ }
+ })
+
+export default useUserStore
diff --git a/src/utils/auth.js b/src/utils/auth.js
new file mode 100644
index 0000000..08a43d6
--- /dev/null
+++ b/src/utils/auth.js
@@ -0,0 +1,15 @@
+import Cookies from 'js-cookie'
+
+const TokenKey = 'Admin-Token'
+
+export function getToken() {
+ return Cookies.get(TokenKey)
+}
+
+export function setToken(token) {
+ return Cookies.set(TokenKey, token)
+}
+
+export function removeToken() {
+ return Cookies.remove(TokenKey)
+}
diff --git a/src/utils/cfhi.js b/src/utils/cfhi.js
new file mode 100644
index 0000000..4efca08
--- /dev/null
+++ b/src/utils/cfhi.js
@@ -0,0 +1,246 @@
+
+
+/**
+ * 通用js方法封装处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+// 日期格式化
+export function parseTime(time, pattern) {
+ if (arguments.length === 0 || !time) {
+ return null
+ }
+ const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+ time = parseInt(time)
+ } else if (typeof time === 'string') {
+ time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
+ }
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+ let value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
+ if (result.length > 0 && value < 10) {
+ value = '0' + value
+ }
+ return value || 0
+ })
+ return time_str
+}
+
+// 表单重置
+export function resetForm(refName) {
+ if (this.$refs[refName]) {
+ this.$refs[refName].resetFields();
+ }
+}
+
+// 添加日期范围
+export function addDateRange(params, dateRange, propName) {
+ let search = params;
+ search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
+ dateRange = Array.isArray(dateRange) ? dateRange : [];
+ if (typeof (propName) === 'undefined') {
+ search.params['beginTime'] = dateRange[0];
+ search.params['endTime'] = dateRange[1];
+ } else {
+ search.params['begin' + propName] = dateRange[0];
+ search.params['end' + propName] = dateRange[1];
+ }
+ return search;
+}
+
+// 回显数据字典
+export function selectDictLabel(datas, value) {
+ if (value === undefined) {
+ return "";
+ }
+ var actions = [];
+ Object.keys(datas).some((key) => {
+ if (datas[key].value == ('' + value)) {
+ actions.push(datas[key].label);
+ return true;
+ }
+ })
+ if (actions.length === 0) {
+ actions.push(value);
+ }
+ return actions.join('');
+}
+
+// 回显数据字典(字符串数组)
+export function selectDictLabels(datas, value, separator) {
+ if (value === undefined || value.length ===0) {
+ return "";
+ }
+ if (Array.isArray(value)) {
+ value = value.join(",");
+ }
+ var actions = [];
+ var currentSeparator = undefined === separator ? "," : separator;
+ var temp = value.split(currentSeparator);
+ Object.keys(value.split(currentSeparator)).some((val) => {
+ var match = false;
+ Object.keys(datas).some((key) => {
+ if (datas[key].value == ('' + temp[val])) {
+ actions.push(datas[key].label + currentSeparator);
+ match = true;
+ }
+ })
+ if (!match) {
+ actions.push(temp[val] + currentSeparator);
+ }
+ })
+ return actions.join('').substring(0, actions.join('').length - 1);
+}
+
+// 字符串格式化(%s )
+export function sprintf(str) {
+ var args = arguments, flag = true, i = 1;
+ str = str.replace(/%s/g, function () {
+ var arg = args[i++];
+ if (typeof arg === 'undefined') {
+ flag = false;
+ return '';
+ }
+ return arg;
+ });
+ return flag ? str : '';
+}
+
+// 转换字符串,undefined,null等转化为""
+export function parseStrEmpty(str) {
+ if (!str || str == "undefined" || str == "null") {
+ return "";
+ }
+ return str;
+}
+
+// 数据合并
+export function mergeRecursive(source, target) {
+ for (var p in target) {
+ try {
+ if (target[p].constructor == Object) {
+ source[p] = mergeRecursive(source[p], target[p]);
+ } else {
+ source[p] = target[p];
+ }
+ } catch (e) {
+ source[p] = target[p];
+ }
+ }
+ return source;
+};
+
+/**
+ * 构造树型结构数据
+ * @param {*} data 数据源
+ * @param {*} id id字段 默认 'id'
+ * @param {*} parentId 父节点字段 默认 'parentId'
+ * @param {*} children 孩子节点字段 默认 'children'
+ */
+export function handleTree(data, id, parentId, children) {
+ let config = {
+ id: id || 'id',
+ parentId: parentId || 'parentId',
+ childrenList: children || 'children'
+ };
+
+ var childrenListMap = {};
+ var nodeIds = {};
+ var tree = [];
+
+ for (let d of data) {
+ let parentId = d[config.parentId];
+ if (childrenListMap[parentId] == null) {
+ childrenListMap[parentId] = [];
+ }
+ nodeIds[d[config.id]] = d;
+ childrenListMap[parentId].push(d);
+ }
+
+ for (let d of data) {
+ let parentId = d[config.parentId];
+ if (nodeIds[parentId] == null) {
+ tree.push(d);
+ }
+ }
+
+ for (let t of tree) {
+ adaptToChildrenList(t);
+ }
+
+ function adaptToChildrenList(o) {
+ if (childrenListMap[o[config.id]] !== null) {
+ o[config.childrenList] = childrenListMap[o[config.id]];
+ }
+ if (o[config.childrenList]) {
+ for (let c of o[config.childrenList]) {
+ adaptToChildrenList(c);
+ }
+ }
+ }
+ return tree;
+}
+
+/**
+* 参数处理
+* @param {*} params 参数
+*/
+export function tansParams(params) {
+ let result = ''
+ for (const propName of Object.keys(params)) {
+ const value = params[propName];
+ var part = encodeURIComponent(propName) + "=";
+ if (value !== null && value !== "" && typeof (value) !== "undefined") {
+ if (typeof value === 'object') {
+ for (const key of Object.keys(value)) {
+ if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
+ let params = propName + '[' + key + ']';
+ var subPart = encodeURIComponent(params) + "=";
+ result += subPart + encodeURIComponent(value[key]) + "&";
+ }
+ }
+ } else {
+ result += part + encodeURIComponent(value) + "&";
+ }
+ }
+ }
+ return result
+}
+
+
+// 返回项目路径
+export function getNormalPath(p) {
+ if (p.length === 0 || !p || p == 'undefined') {
+ return p
+ };
+ let res = p.replace('//', '/')
+ if (res[res.length - 1] === '/') {
+ return res.slice(0, res.length - 1)
+ }
+ return res;
+}
+
+// 验证是否为blob格式
+export function blobValidate(data) {
+ return data.type !== 'application/json'
+}
diff --git a/src/utils/dict.js b/src/utils/dict.js
new file mode 100644
index 0000000..9648f14
--- /dev/null
+++ b/src/utils/dict.js
@@ -0,0 +1,24 @@
+import useDictStore from '@/store/modules/dict'
+import { getDicts } from '@/api/system/dict/data'
+
+/**
+ * 获取字典数据
+ */
+export function useDict(...args) {
+ const res = ref({});
+ return (() => {
+ args.forEach((dictType, index) => {
+ res.value[dictType] = [];
+ const dicts = useDictStore().getDict(dictType);
+ if (dicts) {
+ res.value[dictType] = dicts;
+ } else {
+ getDicts(dictType).then(resp => {
+ res.value[dictType] = resp.data.map(p => ({ label: p.dictLabel, value: p.dictValue, elTagType: p.listClass, elTagClass: p.cssClass }))
+ useDictStore().setDict(dictType, res.value[dictType]);
+ })
+ }
+ })
+ return toRefs(res.value);
+ })()
+}
\ No newline at end of file
diff --git a/src/utils/dynamicTitle.js b/src/utils/dynamicTitle.js
new file mode 100644
index 0000000..64404b2
--- /dev/null
+++ b/src/utils/dynamicTitle.js
@@ -0,0 +1,15 @@
+import store from '@/store'
+import defaultSettings from '@/settings'
+import useSettingsStore from '@/store/modules/settings'
+
+/**
+ * 动态修改标题
+ */
+export function useDynamicTitle() {
+ const settingsStore = useSettingsStore();
+ if (settingsStore.dynamicTitle) {
+ document.title = settingsStore.title + ' - ' + defaultSettings.title;
+ } else {
+ document.title = defaultSettings.title;
+ }
+}
\ No newline at end of file
diff --git a/src/utils/errorCode.js b/src/utils/errorCode.js
new file mode 100644
index 0000000..d2111ee
--- /dev/null
+++ b/src/utils/errorCode.js
@@ -0,0 +1,6 @@
+export default {
+ '401': '认证失败,无法访问系统资源',
+ '403': '当前操作没有权限',
+ '404': '访问资源不存在',
+ 'default': '系统未知错误,请反馈给管理员'
+}
diff --git a/src/utils/index.js b/src/utils/index.js
new file mode 100644
index 0000000..5fbd53a
--- /dev/null
+++ b/src/utils/index.js
@@ -0,0 +1,403 @@
+import { parseTime } from './cfhi'
+
+/**
+ * 表格时间格式化
+ */
+export function formatDate(cellValue) {
+ if (cellValue == null || cellValue == "") return "";
+ var date = new Date(cellValue)
+ var year = date.getFullYear()
+ var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
+ var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
+ var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
+ var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
+ var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
+ return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+ if (('' + time).length === 10) {
+ time = parseInt(time) * 1000
+ } else {
+ time = +time
+ }
+ const d = new Date(time)
+ const now = Date.now()
+
+ const diff = (now - d) / 1000
+
+ if (diff < 30) {
+ return '刚刚'
+ } else if (diff < 3600) {
+ // less 1 hour
+ return Math.ceil(diff / 60) + '分钟前'
+ } else if (diff < 3600 * 24) {
+ return Math.ceil(diff / 3600) + '小时前'
+ } else if (diff < 3600 * 24 * 2) {
+ return '1天前'
+ }
+ if (option) {
+ return parseTime(time, option)
+ } else {
+ return (
+ d.getMonth() +
+ 1 +
+ '月' +
+ d.getDate() +
+ '日' +
+ d.getHours() +
+ '时' +
+ d.getMinutes() +
+ '分'
+ )
+ }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObject(url) {
+ url = url == null ? window.location.href : url
+ const search = url.substring(url.lastIndexOf('?') + 1)
+ const obj = {}
+ const reg = /([^?&=]+)=([^?&=]*)/g
+ search.replace(reg, (rs, $1, $2) => {
+ const name = decodeURIComponent($1)
+ let val = decodeURIComponent($2)
+ val = String(val)
+ obj[name] = val
+ return rs
+ })
+ return obj
+}
+
+/**
+ * @param {string} input value
+ * @returns {number} output value
+ */
+export function byteLength(str) {
+ // returns the byte length of an utf8 string
+ let s = str.length
+ for (var i = str.length - 1; i >= 0; i--) {
+ const code = str.charCodeAt(i)
+ if (code > 0x7f && code <= 0x7ff) s++
+ else if (code > 0x7ff && code <= 0xffff) s += 2
+ if (code >= 0xDC00 && code <= 0xDFFF) i--
+ }
+ return s
+}
+
+/**
+ * @param {Array} actual
+ * @returns {Array}
+ */
+export function cleanArray(actual) {
+ const newArray = []
+ for (let i = 0; i < actual.length; i++) {
+ if (actual[i]) {
+ newArray.push(actual[i])
+ }
+ }
+ return newArray
+}
+
+/**
+ * @param {Object} json
+ * @returns {Array}
+ */
+export function param(json) {
+ if (!json) return ''
+ return cleanArray(
+ Object.keys(json).map(key => {
+ if (json[key] === undefined) return ''
+ return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+ })
+ ).join('&')
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+ const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+ if (!search) {
+ return {}
+ }
+ const obj = {}
+ const searchArr = search.split('&')
+ searchArr.forEach(v => {
+ const index = v.indexOf('=')
+ if (index !== -1) {
+ const name = v.substring(0, index)
+ const val = v.substring(index + 1, v.length)
+ obj[name] = val
+ }
+ })
+ return obj
+}
+
+/**
+ * @param {string} val
+ * @returns {string}
+ */
+export function html2Text(val) {
+ const div = document.createElement('div')
+ div.innerHTML = val
+ return div.textContent || div.innerText
+}
+
+/**
+ * Merges two objects, giving the last one precedence
+ * @param {Object} target
+ * @param {(Object|Array)} source
+ * @returns {Object}
+ */
+export function objectMerge(target, source) {
+ if (typeof target !== 'object') {
+ target = {}
+ }
+ if (Array.isArray(source)) {
+ return source.slice()
+ }
+ Object.keys(source).forEach(property => {
+ const sourceProperty = source[property]
+ if (typeof sourceProperty === 'object') {
+ target[property] = objectMerge(target[property], sourceProperty)
+ } else {
+ target[property] = sourceProperty
+ }
+ })
+ return target
+}
+
+/**
+ * @param {HTMLElement} element
+ * @param {string} className
+ */
+export function toggleClass(element, className) {
+ if (!element || !className) {
+ return
+ }
+ let classString = element.className
+ const nameIndex = classString.indexOf(className)
+ if (nameIndex === -1) {
+ classString += '' + className
+ } else {
+ classString =
+ classString.substr(0, nameIndex) +
+ classString.substr(nameIndex + className.length)
+ }
+ element.className = classString
+}
+
+/**
+ * @param {string} type
+ * @returns {Date}
+ */
+export function getTime(type) {
+ if (type === 'start') {
+ return new Date().getTime() - 3600 * 1000 * 24 * 90
+ } else {
+ return new Date(new Date().toDateString())
+ }
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+ let timeout, args, context, timestamp, result
+
+ const later = function() {
+ // 据上一次触发时间间隔
+ const last = +new Date() - timestamp
+
+ // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
+ if (last < wait && last > 0) {
+ timeout = setTimeout(later, wait - last)
+ } else {
+ timeout = null
+ // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
+ if (!immediate) {
+ result = func.apply(context, args)
+ if (!timeout) context = args = null
+ }
+ }
+ }
+
+ return function(...args) {
+ context = this
+ timestamp = +new Date()
+ const callNow = immediate && !timeout
+ // 如果延时不存在,重新设定延时
+ if (!timeout) timeout = setTimeout(later, wait)
+ if (callNow) {
+ result = func.apply(context, args)
+ context = args = null
+ }
+
+ return result
+ }
+}
+
+export const throttle = (func, delay) => {
+ // 缓存一个定时器
+ let timer = null
+ // 这里返回的函数是每次用户实际调用的节流函数
+ return function(...args) {
+ if (!timer) { //判断timer是否有值,如果没有则说明定时器不存在即可继续执行
+ timer = setTimeout(() => { //关
+ func.apply(this, arguments)
+ timer = null; //开
+ }, delay)
+ }
+ }
+}
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone(source) {
+ if (!source && typeof source !== 'object') {
+ throw new Error('error arguments', 'deepClone')
+ }
+ const targetObj = source.constructor === Array ? [] : {}
+ Object.keys(source).forEach(keys => {
+ if (source[keys] && typeof source[keys] === 'object') {
+ targetObj[keys] = deepClone(source[keys])
+ } else {
+ targetObj[keys] = source[keys]
+ }
+ })
+ return targetObj
+}
+
+/**
+ * @param {Array} arr
+ * @returns {Array}
+ */
+export function uniqueArr(arr) {
+ return Array.from(new Set(arr))
+}
+
+/**
+ * @returns {string}
+ */
+export function createUniqueString() {
+ const timestamp = +new Date() + ''
+ const randomNum = parseInt((1 + Math.random()) * 65536) + ''
+ return (+(randomNum + timestamp)).toString(32)
+}
+
+/**
+ * Check if an element has a class
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ * @returns {boolean}
+ */
+export function hasClass(ele, cls) {
+ return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+/**
+ * Add class to element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function addClass(ele, cls) {
+ if (!hasClass(ele, cls)) ele.className += ' ' + cls
+}
+
+/**
+ * Remove class from element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function removeClass(ele, cls) {
+ if (hasClass(ele, cls)) {
+ const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
+ ele.className = ele.className.replace(reg, ' ')
+ }
+}
+
+export function makeMap(str, expectsLowerCase) {
+ const map = Object.create(null)
+ const list = str.split(',')
+ for (let i = 0; i < list.length; i++) {
+ map[list[i]] = true
+ }
+ return expectsLowerCase
+ ? val => map[val.toLowerCase()]
+ : val => map[val]
+}
+
+export const exportDefault = 'export default '
+
+export const beautifierConf = {
+ html: {
+ indent_size: '2',
+ indent_char: ' ',
+ max_preserve_newlines: '-1',
+ preserve_newlines: false,
+ keep_array_indentation: false,
+ break_chained_methods: false,
+ indent_scripts: 'separate',
+ brace_style: 'end-expand',
+ space_before_conditional: true,
+ unescape_strings: false,
+ jslint_happy: false,
+ end_with_newline: true,
+ wrap_line_length: '110',
+ indent_inner_html: true,
+ comma_first: false,
+ e4x: true,
+ indent_empty_lines: true
+ },
+ js: {
+ indent_size: '2',
+ indent_char: ' ',
+ max_preserve_newlines: '-1',
+ preserve_newlines: false,
+ keep_array_indentation: false,
+ break_chained_methods: false,
+ indent_scripts: 'normal',
+ brace_style: 'end-expand',
+ space_before_conditional: true,
+ unescape_strings: false,
+ jslint_happy: true,
+ end_with_newline: true,
+ wrap_line_length: '110',
+ indent_inner_html: true,
+ comma_first: false,
+ e4x: true,
+ indent_empty_lines: true
+ }
+}
+
+// 首字母大小
+export function titleCase(str) {
+ return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
+}
+
+// 下划转驼峰
+export function camelCase(str) {
+ return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
+}
+
+export function isNumberStr(str) {
+ return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
+}
+
diff --git a/src/utils/jsencrypt.js b/src/utils/jsencrypt.js
new file mode 100644
index 0000000..78d9523
--- /dev/null
+++ b/src/utils/jsencrypt.js
@@ -0,0 +1,30 @@
+import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
+
+// 密钥对生成 http://web.chacuo.net/netrsakeypair
+
+const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
+ 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
+
+const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
+ '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
+ 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
+ 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
+ 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
+ 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
+ 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
+ 'UP8iWi1Qw0Y='
+
+// 加密
+export function encrypt(txt) {
+ const encryptor = new JSEncrypt()
+ encryptor.setPublicKey(publicKey) // 设置公钥
+ return encryptor.encrypt(txt) // 对数据进行加密
+}
+
+// 解密
+export function decrypt(txt) {
+ const encryptor = new JSEncrypt()
+ encryptor.setPrivateKey(privateKey) // 设置私钥
+ return encryptor.decrypt(txt) // 对数据进行解密
+}
+
diff --git a/src/utils/permission.js b/src/utils/permission.js
new file mode 100644
index 0000000..93fee87
--- /dev/null
+++ b/src/utils/permission.js
@@ -0,0 +1,51 @@
+import useUserStore from '@/store/modules/user'
+
+/**
+ * 字符权限校验
+ * @param {Array} value 校验值
+ * @returns {Boolean}
+ */
+export function checkPermi(value) {
+ if (value && value instanceof Array && value.length > 0) {
+ const permissions = useUserStore().permissions
+ const permissionDatas = value
+ const all_permission = "*:*:*";
+
+ const hasPermission = permissions.some(permission => {
+ return all_permission === permission || permissionDatas.includes(permission)
+ })
+
+ if (!hasPermission) {
+ return false
+ }
+ return true
+ } else {
+ console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`)
+ return false
+ }
+}
+
+/**
+ * 角色权限校验
+ * @param {Array} value 校验值
+ * @returns {Boolean}
+ */
+export function checkRole(value) {
+ if (value && value instanceof Array && value.length > 0) {
+ const roles = useUserStore().roles
+ const permissionRoles = value
+ const super_admin = "admin";
+
+ const hasRole = roles.some(role => {
+ return super_admin === role || permissionRoles.includes(role)
+ })
+
+ if (!hasRole) {
+ return false
+ }
+ return true
+ } else {
+ console.error(`need roles! Like checkRole="['admin','editor']"`)
+ return false
+ }
+}
\ No newline at end of file
diff --git a/src/utils/request.js b/src/utils/request.js
new file mode 100644
index 0000000..e76cbdb
--- /dev/null
+++ b/src/utils/request.js
@@ -0,0 +1,148 @@
+import axios from 'axios'
+import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus'
+import { getToken } from '@/utils/auth'
+import errorCode from '@/utils/errorCode'
+import { tansParams, blobValidate } from '@/utils/cfhi'
+import cache from '@/plugins/cache'
+import { saveAs } from 'file-saver'
+import useUserStore from '@/store/modules/user'
+
+let downloadLoadingInstance;
+// 是否显示重新登录
+export let isRelogin = { show: false };
+
+axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
+// 对应国际化资源文件后缀
+axios.defaults.headers['Content-Language'] = 'zh_CN'
+// 创建axios实例
+const service = axios.create({
+ // axios中请求配置有baseURL选项,表示请求URL公共部分
+ baseURL: import.meta.env.VITE_APP_BASE_API,
+ // 超时
+ timeout: 120000 // 导出大数据量word时避免未完成即超时的问题
+})
+
+// request拦截器
+service.interceptors.request.use(config => {
+ // 是否需要设置 token
+ const isToken = (config.headers || {}).isToken === false
+ // 是否需要防止数据重复提交
+ const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
+ if (getToken() && !isToken) {
+ config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
+ }
+ // get请求映射params参数
+ if (config.method === 'get' && config.params) {
+ let url = config.url + '?' + tansParams(config.params);
+ url = url.slice(0, -1);
+ config.params = {};
+ config.url = url;
+ }
+ if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
+ const requestObj = {
+ url: config.url,
+ data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
+ time: new Date().getTime()
+ }
+ const sessionObj = cache.session.getJSON('sessionObj')
+ if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
+ cache.session.setJSON('sessionObj', requestObj)
+ } else {
+ const s_url = sessionObj.url; // 请求地址
+ const s_data = sessionObj.data; // 请求数据
+ const s_time = sessionObj.time; // 请求时间
+ const interval = 500; // 间隔时间(ms),小于此时间视为重复提交
+ if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
+ const message = '数据正在处理,请勿重复提交';
+ console.warn(`[${s_url}]: ` + message)
+ return Promise.reject(new Error(message))
+ } else {
+ cache.session.setJSON('sessionObj', requestObj)
+ }
+ }
+ }
+ return config
+}, error => {
+ console.log(error)
+ Promise.reject(error)
+})
+
+// 响应拦截器
+service.interceptors.response.use(res => {
+ // 未设置状态码则默认成功状态
+ const code = res.data.code || 200;
+ // 获取错误信息
+ const msg = errorCode[code] || res.data.msg || errorCode['default']
+ // 二进制数据则直接返回
+ if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
+ return res.data
+ }
+ if (code === 401) {
+ if (!isRelogin.show) {
+ isRelogin.show = true;
+ ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
+ isRelogin.show = false;
+ useUserStore().logOut().then(() => {
+ location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
+ })
+ }).catch(() => {
+ isRelogin.show = false;
+ });
+ }
+ return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
+ } else if (code === 500) {
+ ElMessage({ message: msg, type: 'error' })
+ return Promise.reject(new Error(msg))
+ } else if (code === 601) {
+ ElMessage({ message: msg, type: 'warning' })
+ return Promise.reject(new Error(msg))
+ } else if (code !== 200) {
+ ElNotification.error({ title: msg })
+ return Promise.reject('error')
+ } else {
+ return Promise.resolve(res.data)
+ }
+ },
+ error => {
+ console.log('err' + error)
+ let { message } = error;
+ if (message == "Network Error") {
+ message = "后端接口连接异常";
+ } else if (message.includes("timeout")) {
+ message = "系统接口请求超时";
+ } else if (message.includes("Request failed with status code")) {
+ message = "系统接口" + message.substr(message.length - 3) + "异常";
+ }
+ ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
+ return Promise.reject(error)
+ }
+)
+
+// 通用下载方法
+export function download(url, params, filename, config) {
+ downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
+ return service.post(url, params, {
+ // transformRequest: [(params) => { return tansParams(params) }],
+ // headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+ responseType: 'blob',
+ ...config
+ }).then(async (data) => {
+ const isBlob = blobValidate(data);
+ if (isBlob) {
+ const blob = new Blob([data])
+ saveAs(blob, filename)
+ } else {
+ const resText = await data.text();
+ const rspObj = JSON.parse(resText);
+ const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
+ ElMessage.error(errMsg);
+ }
+ downloadLoadingInstance.close();
+ }).catch((r) => {
+ console.error(r)
+ ElMessage.error('下载文件出现错误,请联系管理员!')
+ downloadLoadingInstance.close();
+ })
+}
+
+export default service
diff --git a/src/utils/scroll-to.js b/src/utils/scroll-to.js
new file mode 100644
index 0000000..c5d8e04
--- /dev/null
+++ b/src/utils/scroll-to.js
@@ -0,0 +1,58 @@
+Math.easeInOutQuad = function(t, b, c, d) {
+ t /= d / 2
+ if (t < 1) {
+ return c / 2 * t * t + b
+ }
+ t--
+ return -c / 2 * (t * (t - 2) - 1) + b
+}
+
+// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
+var requestAnimFrame = (function() {
+ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
+})()
+
+/**
+ * Because it's so fucking difficult to detect the scrolling element, just move them all
+ * @param {number} amount
+ */
+function move(amount) {
+ document.documentElement.scrollTop = amount
+ document.body.parentNode.scrollTop = amount
+ document.body.scrollTop = amount
+}
+
+function position() {
+ return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
+}
+
+/**
+ * @param {number} to
+ * @param {number} duration
+ * @param {Function} callback
+ */
+export function scrollTo(to, duration, callback) {
+ const start = position()
+ const change = to - start
+ const increment = 20
+ let currentTime = 0
+ duration = (typeof (duration) === 'undefined') ? 500 : duration
+ var animateScroll = function() {
+ // increment the time
+ currentTime += increment
+ // find the value with the quadratic in-out easing function
+ var val = Math.easeInOutQuad(currentTime, start, change, duration)
+ // move the document.body
+ move(val)
+ // do the animation unless its over
+ if (currentTime < duration) {
+ requestAnimFrame(animateScroll)
+ } else {
+ if (callback && typeof (callback) === 'function') {
+ // the animation is done so lets callback
+ callback()
+ }
+ }
+ }
+ animateScroll()
+}
diff --git a/src/utils/theme.js b/src/utils/theme.js
new file mode 100644
index 0000000..7051940
--- /dev/null
+++ b/src/utils/theme.js
@@ -0,0 +1,59 @@
+// 处理主题样式
+export function handleThemeStyle(theme) {
+ document.documentElement.style.setProperty('--el-menu-item-height', '48px')
+ document.documentElement.style.setProperty('--el-menu-sub-item-height', '48px')
+ document.documentElement.style.setProperty('--el-menu-level-padding', '11px')
+ document.documentElement.style.setProperty('--el-color-primary', theme)
+ document.documentElement.style.setProperty('--el-color-danger', '#E83333')
+ for (let i = 1; i <= 9; i++) {
+ document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(theme, i / 10)}`)
+ document.documentElement.style.setProperty(`--el-color-danger-light-${i}`, `${getLightColor('#E83333', i / 10)}`)
+ }
+ for (let i = 1; i <= 9; i++) {
+ document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, `${getDarkColor(theme, i / 10)}`)
+ document.documentElement.style.setProperty(`--el-color-danger-dark-${i}`, `${getDarkColor('#E83333', i / 10)}`)
+ }
+}
+
+// hex颜色转rgb颜色
+export function hexToRgb(str) {
+ if (str && str !== null) {
+ str = str.replace('#', '')
+ let hexs = str.match(/../g)
+ for (let i = 0; i < 3; i++) {
+ hexs[i] = parseInt(hexs[i], 16)
+ }
+ return hexs
+ } else {
+ return [64, 158, 255]
+ }
+}
+
+// rgb颜色转Hex颜色
+export function rgbToHex(r, g, b) {
+ let hexs = [r.toString(16), g.toString(16), b.toString(16)]
+ for (let i = 0; i < 3; i++) {
+ if (hexs[i].length == 1) {
+ hexs[i] = `0${hexs[i]}`
+ }
+ }
+ return `#${hexs.join('')}`
+}
+
+// 变浅颜色值
+export function getLightColor(color, level) {
+ let rgb = hexToRgb(color)
+ for (let i = 0; i < 3; i++) {
+ rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
+ }
+ return rgbToHex(rgb[0], rgb[1], rgb[2])
+}
+
+// 变深颜色值
+export function getDarkColor(color, level) {
+ let rgb = hexToRgb(color)
+ for (let i = 0; i < 3; i++) {
+ rgb[i] = Math.floor(rgb[i] * (1 - level))
+ }
+ return rgbToHex(rgb[0], rgb[1], rgb[2])
+}
diff --git a/src/utils/validate.js b/src/utils/validate.js
new file mode 100644
index 0000000..702add4
--- /dev/null
+++ b/src/utils/validate.js
@@ -0,0 +1,93 @@
+/**
+ * 判断url是否是http或https
+ * @param {string} path
+ * @returns {Boolean}
+ */
+ export function isHttp(url) {
+ return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
+}
+
+/**
+ * 判断path是否为外链
+ * @param {string} path
+ * @returns {Boolean}
+ */
+ export function isExternal(path) {
+ return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+ const valid_map = ['admin', 'editor']
+ return valid_map.indexOf(str.trim()) >= 0
+}
+
+/**
+ * @param {string} url
+ * @returns {Boolean}
+ */
+export function validURL(url) {
+ const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+ return reg.test(url)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validLowerCase(str) {
+ const reg = /^[a-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUpperCase(str) {
+ const reg = /^[A-Z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validAlphabets(str) {
+ const reg = /^[A-Za-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} email
+ * @returns {Boolean}
+ */
+export function validEmail(email) {
+ const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+ return reg.test(email)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function isString(str) {
+ if (typeof str === 'string' || str instanceof String) {
+ return true
+ }
+ return false
+}
+
+/**
+ * @param {Array} arg
+ * @returns {Boolean}
+ */
+export function isArray(arg) {
+ if (typeof Array.isArray === 'undefined') {
+ return Object.prototype.toString.call(arg) === '[object Array]'
+ }
+ return Array.isArray(arg)
+}
diff --git a/src/views/dataDisplay/aod.vue b/src/views/dataDisplay/aod.vue
new file mode 100644
index 0000000..6c52f59
--- /dev/null
+++ b/src/views/dataDisplay/aod.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
diff --git a/src/views/dataDisplay/components/RefiningFurnace.vue b/src/views/dataDisplay/components/RefiningFurnace.vue
new file mode 100644
index 0000000..6204e13
--- /dev/null
+++ b/src/views/dataDisplay/components/RefiningFurnace.vue
@@ -0,0 +1,168 @@
+
+
+
+
+

+

+
{{fatherRow.lfNo}}
+
+
+
+
+
+
+
+
炉号
+
{{fatherRow.lfNo}}
+
兑钢时间
+
{{fatherRow.mixTime}}
+
计划进站时间
+
{{fatherRow.plannedEntryTime}}
+
+
+
钢种
+
{{fatherRow.steelGrade}}
+
真空进站时间
+
{{fatherRow.vacuumEntryTime}}
+
实际进站时间
+
{{fatherRow.actualEntryTime}}
+
+
+
包号
+
{{fatherRow.intermedNo}}
+
真空出站时间
+
{{fatherRow.vacuumExitTime}}
+
进站温度
+
{{fatherRow.arrivalTemp}}
+
+
+
计划钢水量
+
{{fatherRow.steelWaterYield}}
+
冶炼结束时间
+
{{fatherRow.lfEndDate}}
+
浇铸钢水量
+
{{fatherRow.lfSteelWgt}}
+
+
+
实际钢水量
+
{{fatherRow.materialWgt}}
+
出钢温度
+
{{fatherRow.tapTemp}}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/dataDisplay/components/echartsBarLine.vue b/src/views/dataDisplay/components/echartsBarLine.vue
new file mode 100644
index 0000000..db96bab
--- /dev/null
+++ b/src/views/dataDisplay/components/echartsBarLine.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/dataDisplay/components/echartsPie.vue b/src/views/dataDisplay/components/echartsPie.vue
new file mode 100644
index 0000000..c23bb1b
--- /dev/null
+++ b/src/views/dataDisplay/components/echartsPie.vue
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/dataDisplay/components/echartsPie3D.vue b/src/views/dataDisplay/components/echartsPie3D.vue
new file mode 100644
index 0000000..f919b4b
--- /dev/null
+++ b/src/views/dataDisplay/components/echartsPie3D.vue
@@ -0,0 +1,345 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/dataDisplay/components/moniBorder.vue b/src/views/dataDisplay/components/moniBorder.vue
new file mode 100644
index 0000000..5a559fd
--- /dev/null
+++ b/src/views/dataDisplay/components/moniBorder.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/dataDisplay/components/moniGradient.vue b/src/views/dataDisplay/components/moniGradient.vue
new file mode 100644
index 0000000..bc033a2
--- /dev/null
+++ b/src/views/dataDisplay/components/moniGradient.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
diff --git a/src/views/dataDisplay/components/moniTable.vue b/src/views/dataDisplay/components/moniTable.vue
new file mode 100644
index 0000000..ef1d639
--- /dev/null
+++ b/src/views/dataDisplay/components/moniTable.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+ {handlerClick(tr,field, tr[field])}
+ ">{{ tr[field] }}
+
+
+ {{ tr[field] }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/dataDisplay/components/overBorder.vue b/src/views/dataDisplay/components/overBorder.vue
new file mode 100644
index 0000000..a6143ea
--- /dev/null
+++ b/src/views/dataDisplay/components/overBorder.vue
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/dataDisplay/components/progressBar.vue b/src/views/dataDisplay/components/progressBar.vue
new file mode 100644
index 0000000..8b7fd59
--- /dev/null
+++ b/src/views/dataDisplay/components/progressBar.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
{{ title }}
+
{{ percent }}%
+
{{ percent.toFixed(0) }}%
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/dataDisplay/components/topHeader.vue b/src/views/dataDisplay/components/topHeader.vue
new file mode 100644
index 0000000..732dfce
--- /dev/null
+++ b/src/views/dataDisplay/components/topHeader.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
diff --git a/src/views/dataDisplay/monitor.vue b/src/views/dataDisplay/monitor.vue
new file mode 100644
index 0000000..e717097
--- /dev/null
+++ b/src/views/dataDisplay/monitor.vue
@@ -0,0 +1,745 @@
+
+
+
+
+
+
+
+
+
+
+
+
大包测量温度(℃)300
+
受包位1#包
+
浇铸位2#包
+
1#大包重量(t)2
+
2#大包重量(t)2
+
+
+
+
+
中包测量温度(℃)300
+
中包连续测量温(℃)300
+
1#中间包重量(t)2
+
中间包液位(mm)1114
+
1#中间包车在预热位/
+
1#中间包车在浇铸位/
+
人工加保温剂(t)2
+
机器人加覆盖剂(t)2
+
保温剂厂家
+
+ 长兴众利耐火器材有限公司
+
+
+
覆盖剂厂家
+
+ 长兴众利耐火器材有限公司
+
+
+
中间包状态正常
+
保温罩开关状态最大
+
+
+
+
+
+
+
+
[ ]基本信息
+
+
+
+ 班组甲
+
+
+
+
+ 班次白班
+
+
+
+
+ 班组长张
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 来料信息
+
+
+
精炼出钢实绩
+
+ 炉号 | LH001 | 精炼结束时间 | 字段值 | 精炼包烘烤时间 | 字段值 |
+ 钢种 | 60CrNT | 工艺符号 | 字段值 | 耗氩量 | 字段值 |
+ 钢种代号 | 字段值 | 工艺编号 | 字段值 | 耗氮量 | 字段值 |
+ 产品类型 | 字段值 | 精炼包号 | 字段值 | 出钢量 | 字段值 |
+ 精炼开始时间 | 字段值 | 精炼包烘烤温度 | 字段值 | 出钢温度 | 字段值 |
+
+
检验实绩
+
+
+
+ {{ item.label }} |
+
+
+ {{ item[j.key] }} |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/dataDisplay/overview.vue b/src/views/dataDisplay/overview.vue
new file mode 100644
index 0000000..89ecc07
--- /dev/null
+++ b/src/views/dataDisplay/overview.vue
@@ -0,0 +1,557 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ rTimeData[0]?.prdSeqNum }}流
+
+
+
{{ rTimeData[0]?.prdSeqId }}
+
直径:{{ rTimeData[0]?.prdThick }}mm
+
生产开始时刻:{{ parseTime(rTimeData[0]?.createTime, '{y}/{m}/{d} {h}:{i}') }}
+
截面:{{ rTimeData[0]?.prdSection }}m²
+
生产持续时间:{{ rTimeData[0]?.durationTime }}
+
+
+
+
+
+
+
+
+
+ {{ rTimeData[1]?.prdSeqNum }}流
+
+
+
{{ rTimeData[1]?.prdSeqId }}
+
直径:{{ rTimeData[1]?.prdThick }}mm
+
生产开始时刻:{{ parseTime(rTimeData[1]?.createTime, '{y}/{m}/{d} {h}:{i}') }}
+
截面:{{ rTimeData[1]?.prdSection }}m²
+
生产持续时间:{{ rTimeData[1]?.durationTime }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
质量等级一般:{{ qualityMonthCompareData.currentMonth.generalNum }}个
+
质量等级良好:{{ qualityMonthCompareData.currentMonth.goodNum }}个
+
+
+
+
质量等级一般:{{ qualityMonthCompareData.lastMonth.generalNum }}个
+
质量等级良好:{{ qualityMonthCompareData.lastMonth.goodNum }}个
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
各班组·良好等级
+
+
+
+
各班组·良好占比
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/from/benchmarking/index.jsx b/src/views/digitalCasting/from/benchmarking/index.jsx
new file mode 100644
index 0000000..a30a84a
--- /dev/null
+++ b/src/views/digitalCasting/from/benchmarking/index.jsx
@@ -0,0 +1,295 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 铸坯生产对标配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-28 12:00:46
+ * @Date: 2024-02-26 14:16:10
+ */
+
+import { reactive } from "vue"
+
+export const init = () => {
+
+ const searchList = ref([
+ {
+ label: '铸坯编号',
+ field: 'prdNo',
+ width: '340px',
+ searchBtn: true,
+ clearable: true,
+ placeholder: '请输入铸坯编号',
+ },
+ ])
+ const btnList = ref([
+ { label: '生产对标', type: 'primary', met: 'produceBenchmark' },
+ ])
+ const columns = ref([
+ {
+ label: "铸坯编号",
+ prop: "prdNo",
+ minWidth: 120
+ },
+ {
+ label: "铸坯截面尺寸(㎡)",
+ prop: "prdSection",
+ minWidth: 100
+ },
+ {
+ label: "铸坯直径(㎜)",
+ prop: "prdThick",
+ minWidth: 100
+ },
+ {
+ label: "铸坯长度(m)",
+ prop: "prdLength",
+ minWidth: 120
+ },
+ {
+ label: "班组",
+ prop: "teamIds",
+ minWidth: 110
+ },
+ {
+ label: "生产开始时间",
+ prop: "prdStartTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "生产结束时间",
+ prop: "prdEndTime",
+ sort: true,
+ minWidth: 160
+ },
+ ])
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ // 表格表单公共配置
+ const tableOption = ref({
+ checkbox: true, // 是否展示多选框
+ checkList: true,
+ checkKey: 'prdNo',
+ checkMax: 3,
+ checkMaxMsg: '最多只能选择3个铸坯进行对比',
+ rowKey: 'prdNo',
+ index: false, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false, // 是否隐藏分页
+ maxHeight: '62vh'
+ })
+
+ const barData = ref({
+ title:'加料信息',
+ loading: false,
+ //Y轴单位
+ Yname:'单位:kg',
+ //数据是否从0开始 true不从0开始 false从0开始 如果是柱形图设计到两个量 一定要true 否则 样式回丢失
+ boundaryGap:true,
+ //横轴X 数据
+ XAxle: [],
+ //实际数据如果多条数据 数组里传入两个对象
+ actualData:[],
+ // 是否显示右上角下拉框 ture显示 false不显示
+ swtichSelect: false,
+ //又上角下拉默认值
+ optionsDefault:'2',
+ //又上角下拉选着数组
+ options:[]
+ })
+ const DBD0024 = ref({
+ title:'表面温度',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'2',
+ options:[]
+ })
+ const DBD48 = ref({
+ title:'中包重量',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD28 = ref({
+ title:'中包温度',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD32 = ref({
+ title:'过热度',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD3008 = ref({
+ title:'拉速',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD2016 = ref({
+ title:'铸流电搅-电流',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD3040 = ref({
+ title:'铸流电搅-电压',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD2020 = ref({
+ title:'铸流电搅-频率',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD2060 = ref({
+ title:'末端电搅-电流',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD3048 = ref({
+ title:'末端电搅-电压',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD2064 = ref({
+ title:'末端电搅-频率',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD3056 = ref({
+ title:'末端电搅-位置',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD2116 = ref({
+ title:'坯尾感应加热-温度',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD2132 = ref({
+ title:'坯尾感应加热-功率',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD1726 = ref({
+ title:'振动台-振幅',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const DBD1730 = ref({
+ title:'振动台-频率',
+ Yname:'',
+ dataZoom: true,
+ boundaryGap:false,
+ XAxle: [],
+ actualData:[],
+ swtichSelect: false,
+ optionsDefault:'1',
+ options:[]
+ })
+ const state = reactive({
+ DBD0024, DBD48, DBD28, DBD32, DBD3008, DBD2016, DBD3040, DBD2020,
+ DBD2060, DBD3048, DBD2064, DBD3056, DBD2116, DBD2132, DBD1726, DBD1730,
+ })
+ return {
+ searchList,
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ barData,
+ state
+ }
+}
diff --git a/src/views/digitalCasting/from/benchmarking/index.vue b/src/views/digitalCasting/from/benchmarking/index.vue
new file mode 100644
index 0000000..9a51eed
--- /dev/null
+++ b/src/views/digitalCasting/from/benchmarking/index.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/from/castingFrom/components/BilletInformation.vue b/src/views/digitalCasting/from/castingFrom/components/BilletInformation.vue
new file mode 100644
index 0000000..19e7742
--- /dev/null
+++ b/src/views/digitalCasting/from/castingFrom/components/BilletInformation.vue
@@ -0,0 +1,219 @@
+
+
+

+
+
+

+
+
#铸坯编号
+
{{ data?.prdNo }}
+
+
+
+
{{ data?.prdSection }}m²
+
+ 铸坯截面尺寸
+
+
+
+
{{ data?.prdThick }}mm
+
+ 铸坯直径
+
+
+
+
{{ data?.prdLength }}m
+
+ 铸坯长度
+
+
+
+
{{ data?.prdWeight }}t
+
+ 铸坯重量
+
+
+
+
+
+
+
+ 铸坯生产开始时间:{{ data?.prdStartTime }}
+ 铸坯生产结束时间:{{ data?.prdEndTime }}
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/from/castingFrom/components/timeLine.vue b/src/views/digitalCasting/from/castingFrom/components/timeLine.vue
new file mode 100644
index 0000000..4272bf0
--- /dev/null
+++ b/src/views/digitalCasting/from/castingFrom/components/timeLine.vue
@@ -0,0 +1,98 @@
+
+
+
+
+ 变化时刻:{{ item.proTime }}
+
+
+
受包位:{{ item.beforeLadle1Posb }}
+
+
受包位:{{ item.afterLadle1Posb }}
+
+
+
浇铸位:{{ item.beforeLadle1Posa }}
+
+
浇铸位:{{ item.afterLadle1Posa }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/from/castingFrom/detail.jsx b/src/views/digitalCasting/from/castingFrom/detail.jsx
new file mode 100644
index 0000000..723a050
--- /dev/null
+++ b/src/views/digitalCasting/from/castingFrom/detail.jsx
@@ -0,0 +1,48 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 铸坯追溯-切片查询表格配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-25 16:45:18
+ * @Date: 2024-02-26 14:16:09
+ */
+
+export const init = () => {
+ const searchList = ref([])
+ const btnList = ref([])
+ const columns = ref([
+ {
+ label: "设备名称",
+ prop: "equipmentName",
+ minWidth: 120
+ },
+ {
+ label: "设备坐标",
+ prop: "equipmentCoordinate",
+ minWidth: 100
+ },
+ {
+ label: "该切片经过设备的时间",
+ prop: "sliceTime",
+ minWidth: 100
+ },
+ ])
+
+ // 表格表单公共配置
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: true, // 是否隐藏分页
+ maxHeight: '100vh'
+ })
+ return {
+ searchList,
+ btnList,
+ columns,
+ tableOption,
+ }
+}
diff --git a/src/views/digitalCasting/from/castingFrom/detail.vue b/src/views/digitalCasting/from/castingFrom/detail.vue
new file mode 100644
index 0000000..2276c0c
--- /dev/null
+++ b/src/views/digitalCasting/from/castingFrom/detail.vue
@@ -0,0 +1,307 @@
+
+
+
+
+
+

+
{{ pageType ? '铸坯追溯-切片查询' : '铸坯追溯-时间查询'}}
+
+
+ 导出PDF
+ 导出Word
+
+
+
+
+
+
+
+ 位置(mm)
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/from/castingFrom/index.jsx b/src/views/digitalCasting/from/castingFrom/index.jsx
new file mode 100644
index 0000000..eb1c6c5
--- /dev/null
+++ b/src/views/digitalCasting/from/castingFrom/index.jsx
@@ -0,0 +1,106 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 铸坯追溯配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-25 11:40:48
+ * @Date: 2024-02-26 14:16:09
+ */
+const sectionFn = ref(null)
+const timeSearchFn = ref(null)
+
+export const init = ({
+ section,
+ timeSearch,
+}) => {
+ timeSearchFn.value = timeSearch
+ sectionFn.value = section
+
+ const searchList = ref([
+ {
+ label: '炉号',
+ field: 'lfHeatNo',
+ clearable: true,
+ width: '340px',
+ placeholder: '请输入炉号',
+ },
+ {
+ label: '铸坯编号',
+ field: 'prdNo',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入铸坯编号',
+ }
+ ])
+ const btnList = ref([])
+ const columns = ref([
+ {
+ label: "铸坯编号",
+ prop: "prdNo",
+ minWidth: 120
+ },
+ {
+ label: "炉号",
+ prop: "lfHeatNo",
+ minWidth: 100
+ },
+ {
+ label: "钢种",
+ prop: "steelGrade",
+ minWidth: 100
+ },
+ {
+ label: "班组",
+ prop: "teamIds",
+ minWidth: 120
+ },
+ {
+ label: "生产开始时间",
+ prop: "prdStartTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "生产结束时间",
+ prop: "prdEndTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "操作",
+ minWidth: 200,
+ fixed:'right',
+ slots: (row) => {
+ return <>
+ sectionFn.value(row)}>切片查询
+ timeSearchFn.value(row)}>时间查询
+ >
+ }
+ },
+ ])
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+
+ // 表格表单公共配置
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false, // 是否隐藏分页
+ maxHeight: '58vh',
+ rowKey: 'id'
+ })
+ return {
+ searchList,
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ }
+}
diff --git a/src/views/digitalCasting/from/castingFrom/index.vue b/src/views/digitalCasting/from/castingFrom/index.vue
new file mode 100644
index 0000000..9c4c912
--- /dev/null
+++ b/src/views/digitalCasting/from/castingFrom/index.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/monitor/achievements/index.jsx b/src/views/digitalCasting/monitor/achievements/index.jsx
new file mode 100644
index 0000000..9db0395
--- /dev/null
+++ b/src/views/digitalCasting/monitor/achievements/index.jsx
@@ -0,0 +1,131 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 生产实绩配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-28 17:13:00
+ * @Date: 2024-02-26 14:16:10
+ */
+
+const materialCastingType = ref([])
+export const init = ({material_casting_type}) => {
+ materialCastingType.value = material_casting_type
+ const searchList = ref([
+ {
+ label: '炉号',
+ field: 'prdHeatId',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入炉号',
+ },
+ {
+ label: '铸坯编号',
+ field: 'prdNo',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入铸坯编号',
+ },
+ {
+ label: '铸流号',
+ field: 'prdStrandNo',
+ width: '340px',
+ type: 'select',
+ clearable: true,
+ placeholder: '请选择铸流号',
+ options: materialCastingType.value
+ },
+ {
+ label: '时间',
+ field: 'msgDatetimeRange',
+ width: '340px',
+ type: 'date',
+ enum: 'daterange', // 其他类型枚举 week, month, year, date, daterange
+ placeholder: '开始日期-结束日期' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ }
+ ])
+ const btnList = ref([])
+ const columns = ref([
+ {
+ label: "铸坯编号",
+ prop: "prdNo",
+ minWidth: 120
+ },
+ {
+ label: "时间",
+ prop: "msgDatetime",
+ sort: true,
+ minWidth: 180
+ },
+ {
+ label: "炉号",
+ prop: "prdHeatId",
+ minWidth: 100
+ },
+ {
+ label: "钢种",
+ prop: "prdGradeId",
+ minWidth: 120
+ },
+ {
+ label: "铸流号",
+ prop: "prdStrandNo",
+ minWidth: 110
+ },
+ {
+ label: "浇次号",
+ prop: "prdSeqId",
+ minWidth: 160
+ },
+ {
+ label: "铸坯截面尺寸(㎡)",
+ prop: "prdSection",
+ minWidth: 160
+ },
+ {
+ label: "铸坯直径(㎜)",
+ prop: "prdThick",
+ minWidth: 160
+ },
+ {
+ label: "铸坯长度(㎜)",
+ prop: "prdLength",
+ minWidth: 160
+ },
+ {
+ label: "铸坯重量(kg)",
+ prop: "prdWeight",
+ minWidth: 160
+ },
+ {
+ label: "质量等级",
+ prop: "qualityLevel",
+ minWidth: 160
+ },
+ ])
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ // 表格表单公共配置
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false, // 是否隐藏分页
+ maxHeight: '70vh',
+ slotFooter: function() {
+ return
+ }
+ })
+ return {
+ searchList,
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ }
+}
diff --git a/src/views/digitalCasting/monitor/achievements/index.vue b/src/views/digitalCasting/monitor/achievements/index.vue
new file mode 100644
index 0000000..aa32fb3
--- /dev/null
+++ b/src/views/digitalCasting/monitor/achievements/index.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/monitor/callPolice/index.vue b/src/views/digitalCasting/monitor/callPolice/index.vue
new file mode 100644
index 0000000..266aa5b
--- /dev/null
+++ b/src/views/digitalCasting/monitor/callPolice/index.vue
@@ -0,0 +1,21 @@
+
+
+
+ 设备参数报警记录
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/monitor/process/index.vue b/src/views/digitalCasting/monitor/process/index.vue
new file mode 100644
index 0000000..180c0c0
--- /dev/null
+++ b/src/views/digitalCasting/monitor/process/index.vue
@@ -0,0 +1,21 @@
+
+
+
+ 生产过程监控
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/monitor/produceEvents/index.jsx b/src/views/digitalCasting/monitor/produceEvents/index.jsx
new file mode 100644
index 0000000..c601fae
--- /dev/null
+++ b/src/views/digitalCasting/monitor/produceEvents/index.jsx
@@ -0,0 +1,124 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 生产事件记录
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-05 09:21:51
+ * @Date: 2024-02-26 16:55:19
+ */
+
+export const init = () => {
+
+ const searchList = ref([
+ {
+ label: '炉号',
+ field: 'lfHeatNo',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入炉号',
+ },
+ {
+ label: '铸坯编号',
+ field: 'prdNo',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入铸坯编号',
+ },
+ {
+ label: '钢包到站',
+ field: 'ladleArriveTimes',
+ width: '340px',
+ type: 'date',
+ enum: 'daterange', // 其他类型枚举 week, month, year, date, daterange
+ placeholder: '开始日期-结束日期' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ }
+ ])
+ const btnList = ref([])
+ const columns = ref([
+ {
+ label: "铸坯编号",
+ prop: "prdNo",
+ minWidth: 160
+ },
+ {
+ label: "铸流号",
+ prop: "prdStrandNo",
+ minWidth: 160
+ },
+ {
+ label: "炉号",
+ prop: "lfHeatNo",
+ minWidth: 120
+ },
+ {
+ label: "钢种",
+ prop: "steelGrade",
+ minWidth: 100
+ },
+ {
+ label: "钢包到站时间",
+ sort: true,
+ prop: "ladleArriveTime",
+ minWidth: 140
+ },
+ {
+ label: "钢包离站时间",
+ sort: true,
+ prop: "ladleDepartureTime",
+ minWidth: 140
+ },
+ {
+ label: "开始浇铸时间",
+ sort: true,
+ prop: "startHeatTime",
+ minWidth: 140
+ },
+ {
+ label: "铸流开始时间",
+ sort: true,
+ prop: "strandOpenTime",
+ minWidth: 140
+ },
+ {
+ label: "炉次浇铸开始时间",
+ sort: true,
+ prop: "strandHeatStartTime",
+ minWidth: 170
+ },
+ {
+ label: "炉次浇铸结束时间",
+ sort: true,
+ prop: "strandHeatStopTime",
+ minWidth: 170
+ },
+ {
+ label: "铸流结束时间",
+ sort: true,
+ prop: "strandCloseTime",
+ minWidth: 170
+ },
+ ])
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ // 表格表单公共配置
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false, // 是否隐藏分页
+ maxHeight: '70vh'
+ })
+ return {
+ searchList,
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ }
+}
diff --git a/src/views/digitalCasting/monitor/produceEvents/index.vue b/src/views/digitalCasting/monitor/produceEvents/index.vue
new file mode 100644
index 0000000..1a87319
--- /dev/null
+++ b/src/views/digitalCasting/monitor/produceEvents/index.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/monitor/realTime/index.js b/src/views/digitalCasting/monitor/realTime/index.js
new file mode 100644
index 0000000..3188635
--- /dev/null
+++ b/src/views/digitalCasting/monitor/realTime/index.js
@@ -0,0 +1,222 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 设备参数实时看板配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-27 09:23:41
+ * @Date: 2024-03-07 11:50:16
+ */
+
+export const init = () => {
+ const tundishEcharts = ref({
+ title:'中间包',
+ //Y轴单位
+ Yname:'单位:m/min',
+ //数据是否从0开始 true不从0开始 false从0开始 如果是柱形图设计到两个量 一定要true 否则 样式回丢失
+ boundaryGap:false,
+ //横轴X 数据
+ XAxle: ['8:00','9:00','10:00','11:00','12:00','13:00'],
+ //实际数据如果多条数据 数组里传入两个对象
+ actualData:[
+ {
+ //上方对应名称
+ name:'中间包',
+ //平滑的线还带弧度 true弧度 false直线
+ smooth:true,
+ //数据Y
+ dataAxle: [10,4,7,11,8,3],
+ //线条颜色
+ color:'#005AE0',
+ //图形 line折现 bar柱
+ type:'line'
+ },
+ ],
+ // 是否显示右上角下拉框 ture显示 false不显示
+ swtichSelect: true,
+ //又上角下拉默认值
+ optionsDefault:'2',
+ //又上角下拉选着数组
+ options:[
+ {value: '1',label: '中间包重量',},
+ {value: '2',label: '中间包连续测量温度',},
+ {value: '3',label: '塞棒当前位置',},
+ ]
+ })
+ const superheatEcharts = ref({
+ title:'过热度',
+ Yname:'单位:℃',
+ boundaryGap:false,
+ XAxle: ['8:00','9:00','10:00','11:00','12:00','13:00'],
+ actualData:[
+ {
+ name:'过热度',
+ smooth:true,
+ dataAxle: [10,4,7,11,8,3],
+ color:'#005AE0',
+ type:'line'
+ },
+ ],
+ swtichSelect: false,
+ optionsDefault:'2',
+ options:[]
+ })
+ const crystallizerEcharts = ref({
+ title:'结晶器',
+ Yname:'单位:m/min',
+ boundaryGap:false,
+ XAxle: ['8:00','9:00','10:00','11:00','12:00','13:00'],
+ actualData:[
+ {
+ name:'A流',
+ smooth:true,
+ dataAxle: [10,4,7,11,8,3],
+ color:'#005AE0',
+ type:'line'
+ },
+ {
+ name:'B流',
+ smooth:true,
+ dataAxle: [4,6,10,9,8,3],
+ color:'rgba(57, 186, 21, 1)',
+ type:'line'
+ },
+ ],
+ swtichSelect: true,
+ optionsDefault:'1',
+ options:[
+ {value: '1',label: '结晶器液位'},
+ {value: '2',label: '结晶器冷却水温'}
+ ]
+ })
+ const crystallizerVibrationEcharts = ref({
+ title:'结晶器振动',
+ Yname:'单位:m/min',
+ boundaryGap:false,
+ XAxle: ['8:00','9:00','10:00','11:00','12:00','13:00'],
+ actualData:[
+ {
+ name:'A流',
+ smooth:true,
+ dataAxle: [10,4,7,11,8,3],
+ color:'#005AE0',
+ type:'line'
+ },
+ {
+ name:'B流',
+ smooth:true,
+ dataAxle: [4,6,10,9,8,3],
+ color:'rgba(57, 186, 21, 1)',
+ type:'line'
+ },
+ ],
+ swtichSelect: true,
+ optionsDefault:'1',
+ options:[
+ {value: '1',label: '振动台-行程'},
+ {value: '2',label: '振动台-频率'},
+ {value: '3',label: '振动台-负滑脱时间'}
+ ]
+ })
+ const castingEcharts = ref({
+ title:'铸流电搅',
+ Yname:'单位:m/min',
+ boundaryGap:false,
+ XAxle: ['8:00','9:00','10:00','11:00','12:00','13:00'],
+ actualData:[
+ {
+ name:'A流',
+ smooth:true,
+ dataAxle: [10,4,7,11,8,3],
+ color:'#005AE0',
+ type:'line'
+ },
+ {
+ name:'B流',
+ smooth:true,
+ dataAxle: [4,6,10,9,8,3],
+ color:'rgba(57, 186, 21, 1)',
+ type:'line'
+ },
+ ],
+ swtichSelect: true,
+ optionsDefault:'1',
+ options:[
+ {value: '1',label: '设定电流'},
+ {value: '2',label: '设定频率'},
+ {value: '3',label: '实际电流'},
+ {value: '4',label: '实际频率'}
+ ]
+ })
+ const endEcharts = ref({
+ title:'末端电搅',
+ Yname:'单位:m/min',
+ boundaryGap:false,
+ XAxle: ['8:00','9:00','10:00','11:00','12:00','13:00'],
+ actualData:[
+ {
+ name:'A流',
+ smooth:true,
+ dataAxle: [10,4,7,11,8,3],
+ color:'#005AE0',
+ type:'line'
+ },
+ {
+ name:'B流',
+ smooth:true,
+ dataAxle: [4,6,10,9,8,3],
+ color:'rgba(57, 186, 21, 1)',
+ type:'line'
+ },
+ ],
+ swtichSelect: true,
+ optionsDefault:'1',
+ options:[
+ {value: '1',label: '设定电流'},
+ {value: '2',label: '设定频率'},
+ {value: '3',label: '实际电流'},
+ {value: '4',label: '实际频率'},
+ {value: '5',label: '设定固相厚度'},
+ {value: '6',label: '设定固体厚度'}
+ ]
+ })
+ const inductanceEcharts = ref({
+ title:'电感加热',
+ Yname:'单位:m/min',
+ boundaryGap:false,
+ XAxle: ['8:00','9:00','10:00','11:00','12:00','13:00'],
+ actualData:[
+ {
+ name:'A流',
+ smooth:true,
+ dataAxle: [10,4,7,11,8,3],
+ color:'#005AE0',
+ type:'line'
+ },
+ {
+ name:'B流',
+ smooth:true,
+ dataAxle: [4,6,10,9,8,3],
+ color:'rgba(57, 186, 21, 1)',
+ type:'line'
+ },
+ ],
+ swtichSelect: true,
+ optionsDefault:'1',
+ options:[
+ {value: '1',label: '铸坯温度'},
+ {value: '2',label: '设定温度'},
+ {value: '3',label: '加热时间'},
+ {value: '4',label: '目标功率'},
+ ]
+ })
+ return {
+ tundishEcharts,
+ superheatEcharts,
+ crystallizerEcharts,
+ crystallizerVibrationEcharts,
+ castingEcharts,
+ endEcharts,
+ inductanceEcharts,
+ }
+}
diff --git a/src/views/digitalCasting/monitor/realTime/index.vue b/src/views/digitalCasting/monitor/realTime/index.vue
new file mode 100644
index 0000000..2e780f9
--- /dev/null
+++ b/src/views/digitalCasting/monitor/realTime/index.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+ {{ realTime[0] }} 至 {{ realTime[1] }}
+ 刷新
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/monitor/schedule/components/billetTracking.vue b/src/views/digitalCasting/monitor/schedule/components/billetTracking.vue
new file mode 100644
index 0000000..c5d7355
--- /dev/null
+++ b/src/views/digitalCasting/monitor/schedule/components/billetTracking.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
+
+ 铸坯编号:
+ {{ BilletTracking.billetNumber }}
+ 暂无
+
+
+
+
+ 直径:
+ {{ BilletTracking.diameter }}mm
+ 暂无
+
+
+
+ 目标长度:
+ {{ BilletTracking.lineVal }}m
+ 暂无
+
+
+
+ 浇铸长度:
+ {{ BilletTracking.realityVal }}m
+ 暂无
+
+
+
+
+
+

+
+
+
+
+ {{ BilletTracking.realityVal }}m
+
+
+
+
{{ BilletTracking.alias }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/monitor/schedule/components/echartsFoldLine.vue b/src/views/digitalCasting/monitor/schedule/components/echartsFoldLine.vue
new file mode 100644
index 0000000..48a8e8a
--- /dev/null
+++ b/src/views/digitalCasting/monitor/schedule/components/echartsFoldLine.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/monitor/schedule/components/monitor.vue b/src/views/digitalCasting/monitor/schedule/components/monitor.vue
new file mode 100644
index 0000000..9c1a0d1
--- /dev/null
+++ b/src/views/digitalCasting/monitor/schedule/components/monitor.vue
@@ -0,0 +1,315 @@
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
A流
+
+
+
+ -
+
+
B流
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/monitor/schedule/components/productionEvents.vue b/src/views/digitalCasting/monitor/schedule/components/productionEvents.vue
new file mode 100644
index 0000000..d2536dc
--- /dev/null
+++ b/src/views/digitalCasting/monitor/schedule/components/productionEvents.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+ {{ productionEvents.title }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/monitor/schedule/index.vue b/src/views/digitalCasting/monitor/schedule/index.vue
new file mode 100644
index 0000000..eb8d908
--- /dev/null
+++ b/src/views/digitalCasting/monitor/schedule/index.vue
@@ -0,0 +1,280 @@
+
+
+
浇铸进度监控
+
+
+
+
+
+ 生产事件监控
+
+
+
+
事件第一次发生
+
事件多次发生
+
事件未发生
+
+
+
+
+
+
+
+
+
+ 铸坯跟踪
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/report/components/Abnormal.vue b/src/views/digitalCasting/report/components/Abnormal.vue
new file mode 100644
index 0000000..5f466de
--- /dev/null
+++ b/src/views/digitalCasting/report/components/Abnormal.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+ 异常事件
+
+
+
+
+
+
+
+
{{ item.abnormalEventTitle }}
+
事件时刻: {{ item.abnormalEventTime }}
+
事件描述: {{ item.abnormalEventDesc }}
+
+
![]()
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/report/components/BilletInformation.vue b/src/views/digitalCasting/report/components/BilletInformation.vue
new file mode 100644
index 0000000..e5fce60
--- /dev/null
+++ b/src/views/digitalCasting/report/components/BilletInformation.vue
@@ -0,0 +1,208 @@
+
+
+
+

+
+
+

+
+
#铸坯编号
+
{{ castingInformation.prdNo }}
+
+
+
+
{{ castingInformation.prdSection }}米m²
+
+
+ 铸坯截面尺寸
+
+
+
+
{{ castingInformation.prdThick }}mm
+
+
+ 铸坯直径
+
+
+
+
{{ castingInformation.prdLength }}m
+
+
+ 铸坯长度
+
+
+
+
{{ castingInformation.prdWeight }}t
+
+
+ 铸坯重量
+
+
+
+
+
+
班组信息:{{
+ castingInformation.teamIds }}
+
+
报告时间:{{ castingInformation.reportTime }}
+
+
+
生产时长:{{
+ castingInformation.proTime }}
+
铸坯生产开始时间:{{ castingInformation.prdStartTime }}
+
铸坯生产结束时间:{{
+ castingInformation.prdEndTime }}
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/report/components/Feeding.vue b/src/views/digitalCasting/report/components/Feeding.vue
new file mode 100644
index 0000000..8b2fdfe
--- /dev/null
+++ b/src/views/digitalCasting/report/components/Feeding.vue
@@ -0,0 +1,234 @@
+
+
+
+
+
+ 加料记录
+
+
+
+
+
+
中间包保温剂
+
累计用量:
+
{{ chargingInListZjbbwjDosage }}
+
+
+
+
物料编码:{{ item.materialCode }}
+
物料名称:{{ item.materialName }}
+
厂家:{{ item.manufacturer }}
+
牌号:{{ item.brand }}
+
用量:{{ item.chargingAmount }}g
+
+
+
+
+
+
+
中间包覆盖剂
+
累计用量:
+
{{ chargingInListZjbfgjDosage }}
+
+
+
+
物料编码:{{ item.materialCode }}
+
物料名称:{{ item.materialName }}
+
厂家:{{ item.manufacturer }}
+
牌号:{{ item.brand }}
+
用量:{{ item.chargingAmount }}g
+
+
+
+
+
+
+
结晶器保护渣
+
累计用量:
+
{{ chargingInListJjqbwzDosage }}
+
+
+
+
物料编码:{{ item.materialCode }}
+
物料名称:{{ item.materialName }}
+
厂家:{{ item.manufacturer }}
+
牌号:{{ item.brand }}
+
用量:{{ item.chargingAmount }}g
+
+
+
+
+
+
+
结晶器发热剂
+
累计用量:
+
{{ chargingInListJjqfrjDosage }}
+
+
+
+
物料编码:{{ item.materialCode }}
+
物料名称:{{ item.materialName }}
+
厂家:{{ item.manufacturer }}
+
牌号:{{ item.brand }}
+
用量:{{ item.chargingAmount }}g
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/report/components/Incoming.vue b/src/views/digitalCasting/report/components/Incoming.vue
new file mode 100644
index 0000000..11ecd20
--- /dev/null
+++ b/src/views/digitalCasting/report/components/Incoming.vue
@@ -0,0 +1,275 @@
+
+
+
+
+ 来料信息
+
+
+
+
+
+ NO{{ index + 1}}
+ 炉号:{{ item.lfHeatNo }}
+
+
+
钢种:{{ item.steelGrade }}
+
精炼结束时间:{{ item.leEndDate }}
+
精炼包烘烤温度:{{ item.lfBakeTemp }}
+
耗氮量:{{ item.n2Consumption }}
+
+
+
钢种代号:{{ item.matQulCd }}
+
工艺符号:{{ item.technologyMark }}
+
精炼包烘烤时间:{{ item.lfBakeTime }}
+
出钢量:{{ item.lfSteelWgt }}
+
+
+
产品类型:{{ item.productType }}
+
工艺编号:{{ item.processNo }}
+
耗氩量:{{ item.arConsumption }}
+
出钢温度:{{ item.tapTemp }}
+
+
+
精炼开始时间:{{ item.lfBeginDate }}
+
精炼包号:{{ item.ladleNo }}
+
+
+
+
+
+
+
+
试样编号
+
{{ item.smpNo }}
+
试样类型
+
{{ item.smpType }}
+
炉号
+
{{ item.heatNo }}
+
+
+
炉座号
+
{{ item.station }}
+
物料号
+
{{ item.materId }}
+
物料名称(钢种)
+
{{ item.materName }}
+
+
+
物料代码(钢种代号)
+
{{ item.materCode }}
+
试验次数
+
{{ item.smpCnt }}
+
检验项目编码
+
{{ item.smpItemCode }}
+
+
+
检验项目名称
+
{{ item.smpItemName }}
+
检验项目序号
+
{{ item.smpItemNo }}
+
是否合格
+
{{ item.zjuge }}
+
+
+
单位
+
{{ item.itemUnit }}
+
C
+
{{ item.c }}
+
Si
+
{{ item.si }}
+
+
+
Mn
+
{{ item.mn }}
+
P
+
{{ item.p }}
+
S
+
{{ item.s }}
+
+
+
Cr
+
{{ item.cr }}
+
AL
+
{{ item.al }}
+
Mo
+
{{ item.mo }}
+
+
+
Ni
+
{{ item.ni }}
+
V
+
{{ item.v }}
+
Ti
+
{{ item.ti }}
+
+
+
Sn
+
{{ item.sn }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/report/components/Produce.vue b/src/views/digitalCasting/report/components/Produce.vue
new file mode 100644
index 0000000..5b6f7e3
--- /dev/null
+++ b/src/views/digitalCasting/report/components/Produce.vue
@@ -0,0 +1,521 @@
+
+
+
+
+
+ 生产事件信息
+
+
+
+
+
+
+
+
+
+ 浇铸时长:
+ {{ proportionData.castingDuration }}min
+
+
+
+ 冷却时长:
+ {{ proportionData.coolingDuration }}min
+
+
+
+
+
+
+ 浇铸
+
+
+
+
+
{{ proportionData.castingTime }}
+
+
{{ proportionData.coolingTime }}
+
+
+
+
+
+
+ 冷却
+
+
+
+
+
+
{{ proportionData.endTime }}
+
+
+
+
{{ proportionData.coolingTime }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/report/components/Quality.vue b/src/views/digitalCasting/report/components/Quality.vue
new file mode 100644
index 0000000..6bca80a
--- /dev/null
+++ b/src/views/digitalCasting/report/components/Quality.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+ 质量信息
+
+
+
+
+
{{ item.qualityLevelName }}
+
{{ item.qualityLevelName }}
+
缺陷类型:{{ item.defectTypeName }}
+
+
+
缺陷长度:{{ item.defectLength }}mm
+
缺陷深度:{{ item.defectDepth }}mm
+
缺陷宽度:{{ item.defectWidth }}mm
+
缺陷位置:
+
+ {{ item.defectLocation }}mm
+
+
+
+
+
+
+
缺陷描述:{{ item.defectDesc }}
+
+
+
缺陷图片:
+
![]()
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/digitalCasting/report/components/Technology.vue b/src/views/digitalCasting/report/components/Technology.vue
new file mode 100644
index 0000000..4d47bc8
--- /dev/null
+++ b/src/views/digitalCasting/report/components/Technology.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/report/details.vue b/src/views/digitalCasting/report/details.vue
new file mode 100644
index 0000000..ed7f6ee
--- /dev/null
+++ b/src/views/digitalCasting/report/details.vue
@@ -0,0 +1,260 @@
+
+
+
+
+
+
+

+
铸坯报告
+
+
+ 导出PDF
+ 导出Word
+ 发布
+
+
+
+
+
+
+
+
+
diff --git a/src/views/digitalCasting/report/index.jsx b/src/views/digitalCasting/report/index.jsx
new file mode 100644
index 0000000..3d76388
--- /dev/null
+++ b/src/views/digitalCasting/report/index.jsx
@@ -0,0 +1,107 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 铸坯报告配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-18 14:53:19
+ * @Date: 2024-02-26 12:28:19
+ */
+
+const viewFn = ref(null)
+
+export const init = ({view}) => {
+ viewFn.value = view
+
+ const searchList = ref([
+ {
+ label: '铸坯编号',
+ field: 'prdNo',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入铸坯编号',
+ },
+ {
+ label: '报告时间',
+ field: 'reportTimes',
+ width: '340px',
+ type: 'date',
+ enum: 'daterange', // 其他类型枚举 week, month, year, date, daterange
+ placeholder: '开始日期-结束日期' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ }
+ ])
+ const btnList = ref([])
+ const columns = ref([
+ {
+ label: "铸坯编号",
+ prop: "prdNo",
+ minWidth: 120
+ },
+ {
+ label: "班组",
+ prop: "teamIds",
+ minWidth: 120
+ },
+ {
+ label: "生产开始时间",
+ sort: true,
+ prop: "prdStartTime",
+ minWidth: 110
+ },
+ {
+ label: "生产结束时间",
+ prop: "prdEndTime",
+ sort: true,
+ minWidth: 120
+ },
+ {
+ label: "状态",
+ prop: "status",
+ sort: true,
+ minWidth: 120,
+ slots: (row) => {
+ return { row.status === '0' ? '待发布' : '已发布' }
+ }
+ },
+ {
+ label: "报告时间",
+ prop: "reportTime",
+ sort: true,
+ minWidth: 120
+ },
+ {
+ label: "操作",
+ minWidth: 150,
+ fixed:'right',
+ slots: (row) => {
+ if(row.status !== '0'){
+ return viewFn.value(row)}>查看报告
+ }else{
+ return viewFn.value(row)} v-hasPermi={['system:report:check']}>查看报告
+ }
+ }
+ },
+ ])
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ // 表格表单公共配置
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false, // 是否隐藏分页
+ maxHeight: '58vh'
+ })
+ return {
+ searchList,
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ }
+}
diff --git a/src/views/digitalCasting/report/index.vue b/src/views/digitalCasting/report/index.vue
new file mode 100644
index 0000000..6efd644
--- /dev/null
+++ b/src/views/digitalCasting/report/index.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/error/401.vue b/src/views/error/401.vue
new file mode 100644
index 0000000..1ba3792
--- /dev/null
+++ b/src/views/error/401.vue
@@ -0,0 +1,82 @@
+
+
+
+ 返回
+
+
+
+
+ 401错误!
+
+ 您没有访问权限!
+ 对不起,您没有访问权限,请不要进行非法操作!您可以返回主页面
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/error/404.vue b/src/views/error/404.vue
new file mode 100644
index 0000000..f205303
--- /dev/null
+++ b/src/views/error/404.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+ 404错误!
+
+
+ {{ message }}
+
+
+ 对不起,您正在寻找的页面不存在。尝试检查URL的错误,然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。
+
+
+ 返回首页
+
+
+
+
+
+
+
+
+
diff --git a/src/views/index.vue b/src/views/index.vue
new file mode 100644
index 0000000..ec5ced4
--- /dev/null
+++ b/src/views/index.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+ 个人信息
+
+
+
+
+
+
+
+
+
+ 基本资料
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/login.vue b/src/views/login.vue
new file mode 100644
index 0000000..2fffd5e
--- /dev/null
+++ b/src/views/login.vue
@@ -0,0 +1,314 @@
+
+
+
+
+
装备中国 走向世界
+
EQUIPPING CHINA GOING TO THE WORLD
+
EQUIPPING CHINA GOING TO THE WORLD
+
+
+ 一重垂直铸机数字化平台
+ 欢迎您登录系统
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+ 记住账号密码
+
+
+ 登 录
+ 登 录 中...
+
+
+ 立即注册
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/admin/index.vue b/src/views/monitor/admin/index.vue
new file mode 100644
index 0000000..1b13d64
--- /dev/null
+++ b/src/views/monitor/admin/index.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/src/views/monitor/cache/index.vue b/src/views/monitor/cache/index.vue
new file mode 100644
index 0000000..ccca20d
--- /dev/null
+++ b/src/views/monitor/cache/index.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+ 基本信息
+
+
+
+
+ Redis版本 |
+ {{ cache.info.redis_version }} |
+ 运行模式 |
+ {{ cache.info.redis_mode == "standalone" ? "单机" : "集群" }} |
+ 端口 |
+ {{ cache.info.tcp_port }} |
+ 客户端数 |
+ {{ cache.info.connected_clients }} |
+
+
+ 运行时间(天) |
+ {{ cache.info.uptime_in_days }} |
+ 使用内存 |
+ {{ cache.info.used_memory_human }} |
+ 使用CPU |
+ {{ parseFloat(cache.info.used_cpu_user_children).toFixed(2) }} |
+ 内存配置 |
+ {{ cache.info.maxmemory_human }} |
+
+
+ AOF是否开启 |
+ {{ cache.info.aof_enabled == "0" ? "否" : "是" }} |
+ RDB是否成功 |
+ {{ cache.info.rdb_last_bgsave_status }} |
+ Key数量 |
+ {{ cache.dbSize }} |
+ 网络入口/出口 |
+ {{ cache.info.instantaneous_input_kbps }}kps/{{cache.info.instantaneous_output_kbps}}kps |
+
+
+
+
+
+
+
+
+
+ 命令统计
+
+
+
+
+
+
+ 内存信息
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/cache/list.vue b/src/views/monitor/cache/list.vue
new file mode 100644
index 0000000..0728799
--- /dev/null
+++ b/src/views/monitor/cache/list.vue
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+ 缓存列表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 键名列表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 缓存内容
+ 清理全部
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue
new file mode 100644
index 0000000..f79bd53
--- /dev/null
+++ b/src/views/monitor/logininfor/index.vue
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 清空
+
+
+
+ 导出
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.loginTime) }}
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/online/index.vue b/src/views/monitor/online/index.vue
new file mode 100644
index 0000000..eb17ebc
--- /dev/null
+++ b/src/views/monitor/online/index.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ {{ (pageNum - 1) * pageSize + scope.$index + 1 }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.loginTime) }}
+
+
+
+
+ 强退
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue
new file mode 100644
index 0000000..8f3dae5
--- /dev/null
+++ b/src/views/monitor/operlog/index.vue
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ 导出
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.operTime) }}
+
+
+
+
+ {{ scope.row.costTime }}毫秒
+
+
+
+
+ 详细
+
+
+
+
+
+
+
+
+
+
+
+ {{ form.operName }} / {{form.deptName}} / {{ form.operIp }} / {{ form.operLocation }}
+
+
+ {{ form.requestMethod }} {{form.operUrl }}
+
+
+ {{ form.title }} / {{ typeFormat(form) }}
+
+
+ {{ form.method }}
+
+
+ {{ form.operParam }}
+
+
+ {{ form.jsonResult }}
+
+
+
+ 正常
+ 失败
+
+
+
+ {{ form.costTime }}毫秒
+
+
+ {{ parseTime(form.operTime) }}
+
+
+ {{ form.errorMsg }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/monitor/xxljob/index.vue b/src/views/monitor/xxljob/index.vue
new file mode 100644
index 0000000..9a73f52
--- /dev/null
+++ b/src/views/monitor/xxljob/index.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/src/views/produce/Scheduling/index.jsx b/src/views/produce/Scheduling/index.jsx
new file mode 100644
index 0000000..4cf9b25
--- /dev/null
+++ b/src/views/produce/Scheduling/index.jsx
@@ -0,0 +1,192 @@
+const headerArrVal = ref(null)
+const teamArrVal = ref(null)
+const classesArrVal = ref(null)
+export const init = ({ headerArr,teamArr,classesArr}) => {
+ headerArrVal.value = headerArr
+ teamArrVal.value = teamArr
+ classesArrVal.value = classesArr
+ const columns = headerArrVal.value
+ const pageSet = ref({
+ page: 1,
+ size: 10,
+ total:0
+ })
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: false, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: false, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: true, // 是否隐藏分页
+ hidToolBar:true
+ })
+ // form表单组件
+ const fieldList = ref([
+ {
+ label: '首班班次',
+ field: 'oneClasses',
+ type: 'select',
+ filterable: true,
+ width:'28%',
+ clearable: true,
+ disabled:true,
+ rules: [{required: true,message: '请选择',trigger: 'change'}],
+ placeholder: '请选择',
+ options: classesArrVal.value
+ },
+ {
+ label: '首班班组',
+ field: 'oneClass',
+ type: 'select',
+ filterable: true,
+ width:'28%',
+ clearable: true,
+ rules: [{required: true,message: '请选择',trigger: 'change'}],
+ placeholder: '请选择',
+ options: teamArrVal.value
+ },
+ {
+ label: '首班开始时间',
+ field: 'oneTime',
+ format:"YYYY/MM/DD HH:mm",
+ valueFormat:"YYYY-MM-DD HH:mm",
+ type: 'date',
+ width:'28%',
+ enum: 'date', // 其他类型枚举 week, month, year, date, daterange
+ rules: [{required: true,message: '请选择',trigger: 'blur'}],
+ placeholder: '开始时间' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ },
+ {
+ label: '二班班次',
+ field: 'twoClasses',
+ type: 'select',
+ filterable: true,
+ width:'28%',
+ clearable: true,
+ disabled:true,
+ rules: [{required: true,message: '请选择',trigger: 'change'}],
+ placeholder: '请选择',
+ options: classesArrVal.value
+ },
+ {
+ label: '二班班组',
+ field: 'twoClass',
+ type: 'select',
+ filterable: true,
+ width:'28%',
+ clearable: true,
+ rules: [{required: true,message: '请选择',trigger: 'change'}],
+ placeholder: '请选择',
+ options: teamArrVal.value
+ },
+ {
+ label: '二班开始时间',
+ field: 'twoTime',
+ type: 'date',
+ width:'28%',
+ format:"YYYY/MM/DD HH:mm",
+ valueFormat:"YYYY-MM-DD HH:mm",
+ disabled:true,
+ enum: 'date', // 其他类型枚举 week, month, year, date, daterange
+ rules: [{required: true,message: '请选择',trigger: 'blur'}],
+ placeholder: '开始时间' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ },
+ {
+ label: '三班班次',
+ field: 'threeClasses',
+ type: 'select',
+ filterable: true,
+ width:'28%',
+ clearable: true,
+ disabled:true,
+ rules: [{required: true,message: '请选择',trigger: 'change'}],
+ placeholder: '请选择',
+ options: classesArrVal.value
+ },
+ {
+ label: '三班班组',
+ field: 'threeClass',
+ type: 'select',
+ filterable: true,
+ width:'28%',
+ clearable: true,
+ rules: [{required: true,message: '请选择',trigger: 'change'}],
+ placeholder: '请选择',
+ options: teamArrVal.value
+ },
+ {
+ label: '三班开始时间',
+ field: 'threeTime',
+ type: 'date',
+ width:'28%',
+ format:"YYYY/MM/DD HH:mm",
+ valueFormat:"YYYY-MM-DD HH:mm",
+ disabled:true,
+ enum: 'date', // 其他类型枚举 week, month, year, date, daterange
+ rules: [{required: true,message: '请选择',trigger: 'blur'}],
+ placeholder: '开始时间' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ },
+ {
+ label: '休息',
+ field: 'fourClasses',
+ type: 'select',
+ filterable: true,
+ width:'28%',
+ clearable: true,
+ disabled:true,
+ // rules: [{required: true,message: '请选择',trigger: 'change'}],
+ placeholder: '休',
+ options: classesArrVal.value
+ },
+ {
+ label: '四班班组',
+ field: 'fourClass',
+ type: 'select',
+ filterable: true,
+ width:'28%',
+ clearable: true,
+ rules: [{required: true,message: '请选择',trigger: 'change'}],
+ placeholder: '请选择',
+ options: teamArrVal.value
+ },
+ {
+ label: '休息开始时间',
+ field: 'fourTime',
+ type: 'date',
+ width:'28%',
+ format:"YYYY/MM/DD HH:mm",
+ valueFormat:"YYYY-MM-DD HH:mm",
+ disabled:true,
+ enum: 'date', // 其他类型枚举 week, month, year, date, daterange
+ rules: [{required: true,message: '请选择',trigger: 'blur'}],
+ placeholder: '开始时间' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ },
+ {
+ label: '排班截至日期',
+ field: 'deadLine',
+ type: 'date',
+ width:'28%',
+ format:"YYYY/MM/DD",
+ valueFormat:"YYYY-MM-DD",
+ enum: 'date', // 其他类型枚举 week, month, year, date, daterange
+ rules: [{required: true,message: '请选择',trigger: 'blur'}],
+ placeholder: '截至日期' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ },
+ ])
+ // 表单配置项目
+ const formOption = ref({
+ inline: true, // 是否行内模式表单
+ labelPosition: 'top', // label标签展示位置
+ labelWidth: '120px', // 表单标签宽度
+ scrollToError: true, // 自动滚动到校验失败的第一项
+ btnCenter: true, // 表单的查询提交等按钮是否展示在中间,弹窗通用展示中间
+ btn: ['submit', 'cancel'] // 按钮展示组
+ })
+ return {
+ columns,
+ pageSet,
+ tableOption,
+ fieldList,
+ formOption
+ }
+}
diff --git a/src/views/produce/Scheduling/index.vue b/src/views/produce/Scheduling/index.vue
new file mode 100644
index 0000000..90b8281
--- /dev/null
+++ b/src/views/produce/Scheduling/index.vue
@@ -0,0 +1,438 @@
+
+
+
+ 排班日历
+
+
+
+
+
+
+ 本月
+ 批量排班
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/produce/castingPlan/index.jsx b/src/views/produce/castingPlan/index.jsx
new file mode 100644
index 0000000..0ca427b
--- /dev/null
+++ b/src/views/produce/castingPlan/index.jsx
@@ -0,0 +1,204 @@
+export const init = ({ }) => {
+ const searchList = ref([
+ {
+ label: '时间',
+ field: 'timeArray',
+ type: 'date',
+ enum: 'daterange', // 其他类型枚举 week, month, year, date, daterange
+ placeholder: '开始日期-结束日期' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ },
+ {
+ label: '浇次号',
+ field: 'castTimesNo',
+ placeholder: '请输入'
+ },
+ {
+ label: '钢种',
+ field: 'steelGrade',
+ placeholder: '请输入'
+ },
+ ])
+ const columns = ref([
+ {
+ label: "开始日期",
+ prop: "beginDate",
+ minWidth: 150,
+ tooltip:true,
+ },
+ {
+ label: "开始时间",
+ prop: "beginTime",
+ minWidth: 150,
+ tooltip:true,
+ },
+ {
+ label: "出钢日期",
+ prop: "tappingDate",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "出钢时间",
+ prop: "tappingTime",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "浇铸位号",
+ prop: "castPositionNo",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "浇次号",
+ prop: "castTimesNo",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "钢种",
+ prop: "steelGrade",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "钢种代号",
+ prop: "matCode",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "工艺符号",
+ prop: "techMark",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "钢水重量",
+ prop: "steelWaterYield",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "锭型",
+ prop: "ingotMold",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "浇铸数量",
+ prop: "castcount",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "钢锭去向",
+ prop: "direction",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "中间包号",
+ prop: "intermedNo",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "钢锭模号",
+ prop: "steelIngotNo",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "帽口号",
+ prop: "hotTopNo",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "底盘号",
+ prop: "chassisNo",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "操作内容",
+ prop: "operContent",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "工艺编号",
+ prop: "processNo",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "备注",
+ prop: "remarks",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "是否下达",
+ prop: "isrelease",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "是否使用",
+ prop: "isuse",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "旧序号",
+ prop: "oldSeqNo",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "插入时间",
+ prop: "insTime",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "插入人员",
+ prop: "insEmpId",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "修改时间",
+ prop: "updTime",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "修改人员",
+ prop: "updEmpId",
+ minWidth: 100,
+ tooltip:true,
+ },
+ ])
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false // 是否隐藏分页
+ })
+ return {
+ searchList,
+ columns,
+ pageSet,
+ tableOption
+ }
+}
diff --git a/src/views/produce/castingPlan/index.vue b/src/views/produce/castingPlan/index.vue
new file mode 100644
index 0000000..409a3a0
--- /dev/null
+++ b/src/views/produce/castingPlan/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/produce/coordinate/index.jsx b/src/views/produce/coordinate/index.jsx
new file mode 100644
index 0000000..8b15bd7
--- /dev/null
+++ b/src/views/produce/coordinate/index.jsx
@@ -0,0 +1,68 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 设备坐标设定配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-18 14:36:16
+ * @Date: 2024-03-18 12:30:06
+ */
+const editFn = ref(null)
+const saveFn = ref(null)
+const cancelFn = ref(null)
+export const init = ({ edit, save, cancel }) => {
+ editFn.value = edit
+ saveFn.value = save
+ cancelFn.value = cancel
+ const searchList = ref([])
+ const columns = ref([
+ {
+ label: "设备名称",
+ prop: "equipmentName",
+ minWidth: 150,
+ tooltip:true,
+ },
+ {
+ label: "设定坐标(m)",
+ prop: "equipmentCoordinate",
+ minWidth: 150,
+ tooltip:true,
+ slots: (row) => {
+ return row.is_edit ?
+ (row.dataType === 0 ?
+ :
+ )
+ : {row.equipmentCoordinate}
+ }
+ },
+ {
+ label: "最后修改时间",
+ prop: "updateTime",
+ minWidth: 100,
+ tooltip:true,
+ },
+ {
+ label: "操作",
+ minWidth: 150,
+ slots: (row) => {
+ return row.is_edit ? <>
+ {saveFn.value(row)}}>保存
+ {cancelFn.value(row)}}>取消
+ > : {editFn.value(row)}}>编辑
+ }
+ },
+ ])
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: true // 是否隐藏分页
+ })
+ return {
+ searchList,
+ columns,
+ tableOption
+ }
+}
diff --git a/src/views/produce/coordinate/index.vue b/src/views/produce/coordinate/index.vue
new file mode 100644
index 0000000..d672ab7
--- /dev/null
+++ b/src/views/produce/coordinate/index.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/produce/information/index.jsx b/src/views/produce/information/index.jsx
new file mode 100644
index 0000000..c3b00d7
--- /dev/null
+++ b/src/views/produce/information/index.jsx
@@ -0,0 +1,742 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 生产信息录入固定项配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-15 16:01:01
+ * @Date: 2024-02-04 14:51:31
+ */
+const feedEditFn = ref(null)
+const feedDeleteFn = ref(null)
+const materialChargingType = ref([])
+const materialFillChargingType = ref([])
+const materialCastingType = ref([])
+const qualityViewFn = ref(null)
+const qualityEditFn = ref(null)
+const qualityDeleteFn = ref(null)
+const abnormalViewFn = ref(null)
+const abnormalEditFn = ref(null)
+const abnormalDeleteFn = ref(null)
+const castTimesNoListData = ref(null)
+const materialListData = ref(null)
+const materialItemData = ref(null)
+const qualityLevel = ref(null)
+const defectType = ref(null)
+const prdNoListData = ref(null)
+
+export const init = ({
+ feedDelete,
+ feedEdit,
+ material_charging_type,
+ material_fill_charging_type,
+ material_casting_type,
+ qualityView,
+ qualityEdit,
+ qualityDelete,
+ abnormalView,
+ abnormalEdit,
+ abnormalDelete,
+ castTimesNoList,
+ materialList,
+ materialItem,
+ quality_level,
+ defect_type,
+ prdNoList
+}) => {
+ feedEditFn.value = feedEdit
+ feedDeleteFn.value = feedDelete
+ materialChargingType.value = material_charging_type
+ materialFillChargingType.value = material_fill_charging_type
+ materialCastingType.value = material_casting_type
+ qualityViewFn.value = qualityView
+ qualityEditFn.value = qualityEdit
+ qualityDeleteFn.value = qualityDelete
+ abnormalViewFn.value = abnormalView
+ abnormalEditFn.value = abnormalEdit
+ abnormalDeleteFn.value = abnormalDelete
+ castTimesNoListData.value = castTimesNoList
+ materialListData.value = materialList
+ materialItemData.value = materialItem
+ qualityLevel.value = quality_level
+ defectType.value = defect_type
+ prdNoListData.value = prdNoList
+ // feed 开头为加料信息页面用配置
+ const feedSearchList = ref([
+ {
+ label: '浇次',
+ field: 'castTimesNo',
+ // type: 'select',
+ clearable: true,
+ width: '340px',
+ placeholder: '请输入浇次',
+ // options: castTimesNoListData.value
+ },
+ {
+ label: '加料类型',
+ field: 'chargingTypes',
+ type: 'select',
+ width: '340px',
+ clearable: true,
+ multiple: true,
+ placeholder: '请选择加料类型',
+ options: materialChargingType.value
+ },
+ {
+ label: '厂家',
+ field: 'manufacturer',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入厂家',
+ },
+ {
+ label: '记录员',
+ field: 'operator',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入记录员',
+ },
+ {
+ label: '加料日期',
+ field: 'chargingTimeRange',
+ width: '340px',
+ type: 'date',
+ enum: 'daterange', // 其他类型枚举 week, month, year, date, daterange
+ placeholder: '开始日期-结束日期' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ }
+ ])
+ const feedBtnList = ref([
+ { label: '加料录入', type: 'primary', icon:'Plus', met: 'addFeed', hasPermi:'chargingIn:information:add' },
+ { label: '批量删除', type: 'danger', icon:'Delete', met: 'feedBatchDelete', hasPermi:'chargingIn:information:remove' },
+ ])
+ const feedColumns = ref([
+ {
+ label: "加料类型",
+ prop: "chargingTypeName",
+ minWidth: 120
+ },
+ {
+ label: "铸坯号",
+ prop: "prdNo",
+ minWidth: 200
+ },
+ {
+ label: "浇次",
+ prop: "castTimesNo",
+ minWidth: 100
+ },
+ {
+ label: "铸流号",
+ prop: "prdStrandNo",
+ minWidth: 100
+ },
+ {
+ label: "投料量(KG)",
+ prop: "chargingAmount",
+ minWidth: 120
+ },
+ {
+ label: "物料编码",
+ prop: "materialCode",
+ minWidth: 110
+ },
+ {
+ label: "物料名称",
+ prop: "materialName",
+ minWidth: 120
+ },
+ {
+ label: "厂家",
+ prop: "manufacturer",
+ minWidth: 120
+ },
+ {
+ label: "牌号",
+ prop: "brand",
+ minWidth: 100
+ },
+ {
+ label: "记录员",
+ prop: "operator",
+ minWidth: 110
+ },
+ {
+ label: "加料时间",
+ prop: "chargingTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "创建时间",
+ prop: "createTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "最后修改时间",
+ prop: "updateTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "操作",
+ minWidth: 150,
+ fixed:'right',
+ slots: (row) => {
+ return <>
+ feedEditFn.value(row)} v-hasPermi={['chargingIn:information:edit']}>修改
+ feedDeleteFn.value(row)} v-hasPermi={['chargingIn:information:remove']}>删除
+ >
+ }
+ },
+ ])
+ const feedPageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ const feedFieldList = ref([
+ {
+ label: '记录员',
+ field: 'operator',
+ width: '300px',
+ disabled: true,
+ placeholder: '请输入记录员'
+ },
+ {
+ label: '加料类型',
+ field: 'chargingType',
+ type: 'radio',
+ radioButton: true,
+ width: '300px',
+ clearable: false,
+ rules: [{required: true,message: '请选择加料类型',trigger: 'change'}],
+ placeholder: '请选择加料类型',
+ options: materialFillChargingType.value
+ },
+ {
+ label: '浇次',
+ field: 'castTimesNo',
+ type: 'select',
+ clearable: true,
+ width: '300px',
+ rules: [{required: true,message: '请选择浇次',trigger: 'change'}],
+ placeholder: '请选择浇次',
+ options: castTimesNoListData.value
+ },
+ {
+ label: '铸流号',
+ field: 'prdStrandNo',
+ type: 'select',
+ width: '300px',
+ hidden: true,
+ clearable: true,
+ rules: [{required: true,message: '请选择铸流号',trigger: 'change'}],
+ placeholder: '请选择铸流号',
+ options: materialCastingType.value
+ },
+ {
+ label: '投料量',
+ field: 'chargingAmount',
+ append: 'KG',
+ rules: [
+ {required: true,message: '请输入投料量',trigger: 'blur'},
+ {pattern: /(^[+]?[0-9]{1,5})(?!0+$)+(\.[0-9]{1,2})?$/, message: '请输入十万以内的正数,最多保留两位小数',trigger: 'blur'},
+ ],
+ width: '300px',
+ placeholder: '请输入投料量'
+ },
+ {
+ label: '物料编码',
+ field: 'materialCode',
+ type: 'select',
+ width: '300px',
+ filterable: true,
+ clearable: true,
+ rules: [{required: true,message: '请选择物料编码',trigger: 'change'}],
+ placeholder: '请选择物料编码',
+ options: materialListData.value
+ },
+ {
+ label: '物料名称',
+ field: 'materialName',
+ disabled: true,
+ width: '300px',
+ placeholder: '根据物料编码带出'
+ },
+ {
+ label: '厂家',
+ field: 'manufacturer',
+ type: 'select',
+ width: '300px',
+ clearable: true,
+ disabled: true,
+ // rules: [{required: true,message: '请选择物料厂家',trigger: 'change'}],
+ placeholder: '根据物料编码带出后选择',
+ // options: materialItemData.value
+ },
+ {
+ label: '牌号',
+ field: 'brand',
+ type: 'select',
+ width: '300px',
+ clearable: true,
+ disabled: true,
+ // rules: [{required: true,message: '请选择物料厂家',trigger: 'change'}],
+ placeholder: '根据物料编码带出后选择',
+ // options: materialItemData.value
+ },
+ {
+ label: '加料时间',
+ field: 'chargingTime',
+ type: 'date',
+ enum: 'datetime',
+ width: '300px',
+ clearable: true,
+ rules: [{required: true,message: '请输入加料时间',trigger: 'change'}],
+ placeholder: '请输入加料时间',
+ },
+ ])
+ // quality 开头为质量信息页面用配置
+ const qualitySearchList = ref([
+ {
+ label: '铸坯编号',
+ field: 'prdNo',
+ // type: 'select',
+ // filterable: true,
+ clearable: true,
+ width: '340px',
+ placeholder: '请输入铸坯编号',
+ // options: prdNoListData.value
+ },
+ {
+ label: '质量等级',
+ field: 'qualityLevel',
+ type: 'select',
+ width: '340px',
+ clearable: true,
+ placeholder: '请选择质量等级',
+ options: qualityLevel.value
+ },
+ {
+ label: '缺陷类型',
+ field: 'defectType',
+ type: 'select',
+ width: '340px',
+ clearable: true,
+ placeholder: '请选择缺陷类型',
+ options: defectType.value
+ },
+ {
+ label: '记录员',
+ field: 'operator',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入记录员',
+ },
+ {
+ label: '质检时间',
+ field: 'qualityControlTimeRange',
+ width: '340px',
+ type: 'date',
+ enum: 'daterange', // 其他类型枚举 week, month, year, date, daterange
+ placeholder: '开始日期-结束日期' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ }
+ ])
+ const qualityBtnList = ref([
+ { label: '质量信息录入', type: 'primary', icon:'Plus', met: 'addQuality', hasPermi:'quality:information:add' },
+ { label: '批量删除', type: 'danger', icon:'Delete', met: 'qualityBatchDelete', hasPermi:'quality:information:remove' },
+ ])
+ const qualityColumns = ref([
+ {
+ label: "铸坯编号",
+ prop: "prdNo",
+ minWidth: 100
+ },
+ {
+ label: "质量等级",
+ prop: "qualityLevelName",
+ minWidth: 100
+ },
+ {
+ label: "缺陷类型",
+ prop: "defectTypeName",
+ minWidth: 100
+ },
+ {
+ label: "缺陷长度",
+ prop: "defectLength",
+ minWidth: 100
+ },
+ {
+ label: "缺陷深度",
+ prop: "defectDepth",
+ minWidth: 100
+ },
+ {
+ label: "缺陷宽度",
+ prop: "defectWidth",
+ minWidth: 100
+ },
+ {
+ label: "缺陷位置",
+ prop: "defectLocation",
+ minWidth: 100
+ },
+ {
+ label: "缺陷描述",
+ prop: "defectDesc",
+ tooltip:true,
+ minWidth: 140
+ },
+ {
+ label: "记录员",
+ prop: "operator",
+ tooltip:true,
+ minWidth: 100
+ },
+ {
+ label: "质检时间",
+ prop: "qualityControlTime",
+ minWidth: 160
+ },
+ {
+ label: "创建时间",
+ prop: "createTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "最后修改时间",
+ prop: "updateTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "操作",
+ minWidth: 220,
+ fixed:'right',
+ slots: (row) => {
+ return <>
+ qualityViewFn.value(row)} v-hasPermi={['quality:information:view']}>详情
+ qualityEditFn.value(row)} v-hasPermi={['quality:information:edit']}>修改
+ qualityDeleteFn.value(row)} v-hasPermi={['quality:information:remove']}>删除
+ >
+ }
+ },
+ ])
+ const qualityPageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ const qualityFieldList = ref([
+ {
+ label: '记录员',
+ field: 'operator',
+ width: '300px',
+ disabled: true,
+ placeholder: '请输入记录员'
+ },
+ {
+ label: '铸坯编号',
+ field: 'prdNo',
+ type: 'select',
+ filterable: true,
+ clearable: true,
+ width: '300px',
+ rules: [{required: true,message: '请选择铸坯编号',trigger: 'change'}],
+ placeholder: '请选择铸坯编号',
+ options: prdNoListData.value
+ },
+ {
+ label: '质量等级',
+ field: 'qualityLevel',
+ type: 'select',
+ clearable: true,
+ width: '300px',
+ rules: [{required: true,message: '请选择质量等级',trigger: 'change'}],
+ placeholder: '请选择质量等级',
+ options: qualityLevel.value
+ },
+ {
+ label: '质检时间',
+ field: 'qualityControlTime',
+ type: 'date',
+ enum: 'datetime',
+ width: '300px',
+ clearable: true,
+ rules: [{required: true,message: '请输入质检时间',trigger: 'change'}],
+ placeholder: '请输入质检时间',
+ },
+ {
+ label: '缺陷类型',
+ field: 'defectType',
+ type: 'select',
+ clearable: true,
+ width: '300px',
+ rules: [{required: true,message: '请选择缺陷类型',trigger: 'change'}],
+ placeholder: '请选择缺陷类型',
+ options: defectType.value
+ },
+ {
+ label: '缺陷长度',
+ field: 'defectLength',
+ append: 'mm',
+ width: '300px',
+ rules: [{pattern: /(^[+]?[0-9]{1,5})(?!0+$)+(\.[0-9]{1,2})?$/, message: '请输入十万以内的正数,最多保留两位小数',trigger: 'blur'}],
+ placeholder: '请输入缺陷长度'
+ },
+ {
+ label: '缺陷深度',
+ field: 'defectDepth',
+ append: 'mm',
+ width: '300px',
+ rules: [{pattern: /(^[+]?[0-9]{1,5})(?!0+$)+(\.[0-9]{1,2})?$/, message: '请输入十万以内的正数,最多保留两位小数',trigger: 'blur'}],
+ placeholder: '请输入缺陷深度'
+ },
+ {
+ label: '缺陷宽度',
+ field: 'defectWidth',
+ append: 'mm',
+ width: '300px',
+ rules: [{pattern: /(^[+]?[0-9]{1,5})(?!0+$)+(\.[0-9]{1,2})?$/, message: '请输入十万以内的正数,最多保留两位小数',trigger: 'blur'}],
+ placeholder: '请输入缺陷宽度'
+ },
+ {
+ label: '缺陷位置',
+ field: 'defectLocation',
+ append: 'mm',
+ tooltip: '此处指缺陷距离头部位置',
+ rules: [
+ {required: true,message: '请输入缺陷位置',trigger: 'blur'},
+ {pattern: /(^[+]?[0-9]{1,5})(?!0+$)+(\.[0-9]{1,2})?$/, message: '请输入十万以内的正数,最多保留两位小数',trigger: 'blur'}
+ ],
+ width: '300px',
+ placeholder: '请输入缺陷位置'
+ },
+ {
+ label: '缺陷描述',
+ field: 'defectDesc',
+ type: 'textarea',
+ width: '690px',
+ max: 200,
+ placeholder: '请输入缺陷描述'
+ },
+ {
+ label: '缺陷图片',
+ type: 'imageUpload',
+ field: 'imgInfos',
+ limit: 10,
+ uploadType: 'picture-card', // 上传组件的展示类型
+ width: '690px',
+ },
+ ])
+ // abnormal 开头为异常事件记录页面用配置
+ const abnormalSearchList = ref([
+ {
+ label: '浇次',
+ field: 'castTimesNo',
+ // type: 'select',
+ clearable: true,
+ width: '340px',
+ placeholder: '请输入浇次',
+ // options: castTimesNoListData.value
+ },
+ {
+ label: '事件标题',
+ field: 'abnormalEventTitle',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入事件标题'
+ },
+ {
+ label: '记录员',
+ field: 'operator',
+ width: '340px',
+ clearable: true,
+ placeholder: '请输入记录员',
+ },
+ {
+ label: '事件时刻',
+ field: 'abnormalEventTimeRange',
+ width: '340px',
+ type: 'date',
+ enum: 'daterange', // 其他类型枚举 week, month, year, date, daterange
+ placeholder: '开始日期-结束日期' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ }
+ ])
+ const abnormalBtnList = ref([
+ { label: '异常事件录入', type: 'primary', icon:'Plus', met: 'addAbnormal', hasPermi:'business:eventInformation:add' },
+ { label: '批量删除', type: 'danger', icon:'Delete', met: 'abnormalBatchDelete', hasPermi:'business:eventInformation:remove' },
+ ])
+ const abnormalColumns = ref([
+ {
+ label: "浇次",
+ prop: "castTimesNo",
+ minWidth: 100
+ },
+ {
+ label: "铸流号",
+ prop: "prdStrandNo",
+ minWidth: 100
+ },
+ {
+ label: "事件时刻",
+ prop: "abnormalEventTime",
+ minWidth: 160,
+ sort: true,
+ slots: (row) => {
+ let arr = row.abnormalEventTime.split(':')
+ arr.pop()
+ return { arr.join(':') }
+ }
+ },
+ {
+ label: "事件标题",
+ prop: "abnormalEventTitle",
+ minWidth: 160
+ },
+ {
+ label: "事件描述",
+ prop: "abnormalEventDesc",
+ tooltip:true,
+ minWidth: 160
+ },
+ {
+ label: "记录员",
+ prop: "operator",
+ minWidth: 100
+ },
+ {
+ label: "创建时间",
+ prop: "createTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "最后修改时间",
+ prop: "updateTime",
+ sort: true,
+ minWidth: 160
+ },
+ {
+ label: "操作",
+ minWidth: 220,
+ fixed:'right',
+ slots: (row) => {
+ return <>
+ abnormalViewFn.value(row)} v-hasPermi={['business:eventInformation:view']}>详情
+ abnormalEditFn.value(row)} v-hasPermi={['business:eventInformation:edit']}>修改
+ abnormalDeleteFn.value(row)} v-hasPermi={['business:eventInformation:remove']}>删除
+ >
+ }
+ },
+ ])
+ const abnormalPageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ const abnormalFieldList = ref([
+ {
+ label: '记录员',
+ field: 'operator',
+ width: '300px',
+ disabled: true,
+ placeholder: '请输入记录员'
+ },
+ {
+ label: '浇次',
+ field: 'castTimesNo',
+ type: 'select',
+ clearable: true,
+ width: '300px',
+ rules: [{required: true,message: '请选择浇次',trigger: 'change'}],
+ placeholder: '请选择浇次',
+ options: castTimesNoListData.value
+ },
+ {
+ label: '铸流号',
+ field: 'prdStrandNo',
+ type: 'select',
+ clearable: true,
+ width: '300px',
+ // rules: [{required: true,message: '请选择铸流号',trigger: 'change'}],
+ placeholder: '请选择铸流号',
+ options: materialCastingType.value
+ },
+ {
+ label: '事件时刻',
+ field: 'abnormalEventTime',
+ type: 'date',
+ enum: 'datetime',
+ valueFormat: 'YYYY-MM-DD HH:mm',
+ format: 'YYYY-MM-DD HH:mm',
+ width: '300px',
+ rules: [{required: true,message: '请选择事件时刻',trigger: 'change'}],
+ placeholder: '请选择事件时刻'
+ },
+ {
+ label: '事件标题',
+ field: 'abnormalEventTitle',
+ width: '690px',
+ max: 20,
+ rules: [{required: true,message: '请输入事件标题',trigger: 'change'}],
+ placeholder: '请输入事件标题'
+ },
+ {
+ label: '事件描述',
+ field: 'abnormalEventDesc',
+ type: 'textarea',
+ width: '690px',
+ max: 200,
+ placeholder: '请输入事件描述'
+ },
+ {
+ label: '图片',
+ field: 'imgInfos',
+ type: 'imageUpload',
+ uploadType: 'picture-card', // 上传组件的展示类型
+ width: '690px',
+ },
+ ])
+
+ // 表格表单公共配置
+ const tableOption = ref({
+ checkbox: true, // 是否展示多选框
+ index: false, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false, // 是否隐藏分页
+ maxHeight: '58vh'
+ })
+ const formOption = ref({
+ inline: true, // 是否行内模式表单
+ labelPosition: 'top',
+ labelWidth: '100px', // 表单标签宽度
+ scrollToError: true, // 自动滚动到校验失败的第一项
+ btnCenter: true, // 表单的查询提交等按钮是否展示在中间,弹窗通用展示中间
+ btn: [ 'submit', 'cancel' ] // 按钮展示组
+ })
+ return {
+ feedSearchList,
+ feedBtnList,
+ feedColumns,
+ feedPageSet,
+ feedFieldList,
+ qualitySearchList,
+ qualityBtnList,
+ qualityColumns,
+ qualityPageSet,
+ qualityFieldList,
+ abnormalSearchList,
+ abnormalBtnList,
+ abnormalColumns,
+ abnormalPageSet,
+ abnormalFieldList,
+ tableOption,
+ formOption
+ }
+}
diff --git a/src/views/produce/information/index.vue b/src/views/produce/information/index.vue
new file mode 100644
index 0000000..4be88f5
--- /dev/null
+++ b/src/views/produce/information/index.vue
@@ -0,0 +1,678 @@
+
+
+
+
+
+
+
+
diff --git a/src/views/produce/shiftManagement/index.jsx b/src/views/produce/shiftManagement/index.jsx
new file mode 100644
index 0000000..3dccbdb
--- /dev/null
+++ b/src/views/produce/shiftManagement/index.jsx
@@ -0,0 +1,106 @@
+
+const onDeleteFn = ref(null)
+const onModifyFn = ref(null)
+export const init = ({ onDelete ,onModify}) => {
+ onDeleteFn.value = onDelete
+ onModifyFn.value = onModify
+ const btnList = ref([
+ // { label: '新增', type: 'primary', icon:'Plus', met: 'handlerAdd' },
+ ])
+ const columns = ref([
+ {
+ label: "班次",
+ prop: "shiftName",
+ minWidth: 100
+ },
+ {
+ label: "排班顺序",
+ prop: "orderSort",
+ minWidth: 100
+ },
+ {
+ label: "开始时间",
+ prop: "startTimeStr",
+ minWidth: 100
+ },
+ {
+ label: "结束时间",
+ prop: "endTimeStr",
+ minWidth: 100
+ },
+ {
+ label: "操作",
+ minWidth: 100,
+ slots: (row) => {
+ return (<>
+ onModifyFn.value(row)}>编辑
+ {/* onDeleteFn.value(row)}>删除 */}
+ >)
+ }
+ },
+ ])
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ // 表格配置项目
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: false, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: true // 是否隐藏分页
+ })
+ // form表单组件
+ const fieldList = ref([
+ {
+ label: '班次',
+ field: 'shiftName',
+ width:'320px',
+ rules: [{required: true,message: '请输入班次名称',trigger: 'blur'}],
+ placeholder: '请输入班次名称'
+ },
+ {
+ label: '开始时间',
+ width:'320px',
+ field: 'startTime',
+ type: 'timeSelect',
+ start: '00:00',
+ step: '00:30',
+ end: '23:30',
+ rules: [{required: true,message: '请选择开始时间',trigger: 'blur'}],
+ placeholder: '请选择开始时间' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ },
+ {
+ label: '结束时间',
+ width:'320px',
+ field: 'endTime',
+ type: 'timeSelect',
+ start: '00:00',
+ step: '00:30',
+ end: '23:30',
+ rules: [{required: true,message: '请选择结束时间',trigger: 'blur'}],
+ placeholder: '请选择结束时间' // 若选择框枚举类型为daterange, 此值接受 a-b 式截取提示内容展示
+ },
+ ])
+ // 表单配置项目
+ const formOption = ref({
+ inline: false, // 是否行内模式表单
+ labelWidth: '120px', // 表单标签宽度
+ scrollToError: true, // 自动滚动到校验失败的第一项
+ btnCenter: true, // 表单的查询提交等按钮是否展示在中间,弹窗通用展示中间
+ btn: ['submit', 'cancel'] // 按钮展示组
+ })
+ const formData = ref({}) // 回显赋值用
+ return {
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ fieldList,
+ formOption,
+ formData
+ }
+}
diff --git a/src/views/produce/shiftManagement/index.vue b/src/views/produce/shiftManagement/index.vue
new file mode 100644
index 0000000..b451f31
--- /dev/null
+++ b/src/views/produce/shiftManagement/index.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/produce/teamManagement/index.jsx b/src/views/produce/teamManagement/index.jsx
new file mode 100644
index 0000000..4bcbea5
--- /dev/null
+++ b/src/views/produce/teamManagement/index.jsx
@@ -0,0 +1,90 @@
+
+const onDeleteFn = ref(null)
+const onStaffingFn = ref(null)
+const onModifyFn = ref(null)
+const teamLeaderNameVal = ref(null)
+export const init = ({ onDelete ,onStaffing ,onModify,teamLeaderNameList}) => {
+ onDeleteFn.value = onDelete
+ onStaffingFn.value = onStaffing
+ onModifyFn.value = onModify
+ teamLeaderNameVal.value = teamLeaderNameList
+ const btnList = ref([
+ { label: '新增', type: 'primary', icon:'Plus', met: 'handlerAdd', hasPermi:'system:team:add'},
+ ])
+ const columns = ref([
+ {
+ label: "班组",
+ prop: "teamName",
+ minWidth: 100
+ },
+ {
+ label: "班组长",
+ prop: "teamLeaderName",
+ minWidth: 100
+ },
+ {
+ label: "操作",
+ minWidth: 100,
+ slots: (row) => {
+ return (<>
+ onStaffingFn.value(row)}>人员配置
+ onModifyFn.value(row)}>编辑
+ onDeleteFn.value(row)}>删除
+ >)
+ }
+ },
+ ])
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ // 表格配置项目
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: false, // 是否展示序号
+ fixed: "left", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: true // 是否隐藏分页
+ })
+ // form表单组件
+ const fieldList = ref([
+ {
+ label: '班组',
+ field: 'teamName',
+ width:'320px',
+ rules: [{required: true,message: '请输入班组信息',trigger: 'blur'}],
+ placeholder: '请输入'
+ },
+ {
+ label: '班组长',
+ field: 'teamLeaderId',
+ type: 'select',
+ filterable: true,
+ width:'320px',
+ clearable: true,
+ rules: [{required: true,message: '请选择班组长',trigger: 'change'}],
+ placeholder: '请选择',
+ options: teamLeaderNameVal.value
+ },
+ ])
+ // 表单配置项目
+ const formOption = ref({
+ inline: false, // 是否行内模式表单
+ labelWidth: '120px', // 表单标签宽度
+ scrollToError: true, // 自动滚动到校验失败的第一项
+ btnCenter: true, // 表单的查询提交等按钮是否展示在中间,弹窗通用展示中间
+ btn: ['submit', 'cancel'] // 按钮展示组
+ })
+
+
+ return {
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ fieldList,
+ formOption,
+ }
+}
diff --git a/src/views/produce/teamManagement/index.vue b/src/views/produce/teamManagement/index.vue
new file mode 100644
index 0000000..f7a75ee
--- /dev/null
+++ b/src/views/produce/teamManagement/index.vue
@@ -0,0 +1,244 @@
+
+
+
+
+
+
+
+ 班组: {{oneTableData.teamName}}
+
+ 班组长: {{oneTableData.teamLeaderName}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue
new file mode 100644
index 0000000..a469960
--- /dev/null
+++ b/src/views/redirect/index.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/register.vue b/src/views/register.vue
new file mode 100644
index 0000000..a71cb13
--- /dev/null
+++ b/src/views/register.vue
@@ -0,0 +1,219 @@
+
+
+
+ 一重垂直铸机数字化平台
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+ 注 册
+ 注 册 中...
+
+
+ 使用已有账户登录
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue
new file mode 100644
index 0000000..5452f1d
--- /dev/null
+++ b/src/views/system/config/index.vue
@@ -0,0 +1,306 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+ 刷新缓存
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue
new file mode 100644
index 0000000..5462e53
--- /dev/null
+++ b/src/views/system/dept/index.vue
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增部门
+
+
+ 展开/折叠
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 新增
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/dict/data.vue b/src/views/system/dict/data.vue
new file mode 100644
index 0000000..09c97ff
--- /dev/null
+++ b/src/views/system/dict/data.vue
@@ -0,0 +1,350 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+ 关闭
+
+
+
+
+
+
+
+
+
+ {{ scope.row.dictLabel }}
+ {{ scope.row.dictLabel }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue
new file mode 100644
index 0000000..b7986c6
--- /dev/null
+++ b/src/views/system/dict/index.vue
@@ -0,0 +1,313 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+ 刷新缓存
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.dictType }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
new file mode 100644
index 0000000..3f757f3
--- /dev/null
+++ b/src/views/system/menu/index.vue
@@ -0,0 +1,454 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 展开/折叠
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 新增
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 目录
+ 菜单
+ 按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是否外链
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+ 路由地址
+
+
+
+
+
+
+
+
+
+
+
+
+ 组件路径
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 权限字符
+
+
+
+
+
+
+
+
+
+
+
+
+ 路由参数
+
+
+
+
+
+
+
+
+
+
+
+ 是否缓存
+
+
+
+ 缓存
+ 不缓存
+
+
+
+
+
+
+
+
+
+
+ 显示状态
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+ 菜单状态
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue
new file mode 100644
index 0000000..c26b8c4
--- /dev/null
+++ b/src/views/system/notice/index.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/oss/config.vue b/src/views/system/oss/config.vue
new file mode 100644
index 0000000..facea7a
--- /dev/null
+++ b/src/views/system/oss/config.vue
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ private
+ public
+ custom
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.label}}
+
+
+
+
+ private
+ public
+ custom
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/oss/index.vue b/src/views/system/oss/index.vue
new file mode 100644
index 0000000..ecc045c
--- /dev/null
+++ b/src/views/system/oss/index.vue
@@ -0,0 +1,372 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 上传文件
+
+
+ 上传图片
+
+
+ 删除
+
+
+ 预览开关 : {{previewListResource ? "禁用" : "启用"}}
+
+
+ 配置管理
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+
+ 下载
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/post/index.jsx b/src/views/system/post/index.jsx
new file mode 100644
index 0000000..91e83f3
--- /dev/null
+++ b/src/views/system/post/index.jsx
@@ -0,0 +1,244 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 岗位配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-06 14:09:46
+ * @Date: 2024-02-04 16:56:20
+ */
+
+const handleUpdateFn = ref(null)
+const handleDeleteFn = ref(null)
+const handleUserNumFn = ref(null)
+const deptListVal = ref([])
+
+
+export const init = (proxy, { handleUpdate, handleDelete, deptList, handleUserNum }) => {
+ handleUpdateFn.value = handleUpdate
+ handleDeleteFn.value = handleDelete
+ handleUserNumFn.value = handleUserNum
+ deptListVal.value = deptList
+
+
+
+ const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+ const { sys_user_sex } = proxy.useDict("sys_user_sex");
+ // 表格筛选条件
+ const searchList = ref([
+ // {
+ // label: '岗位编码',
+ // field: 'postCode',
+ // clearable: true,
+ // placeholder: '请输入岗位编码',
+ // },
+ {
+ label: '岗位名称',
+ field: 'postName',
+ placeholder: '请输入岗位名称'
+ },
+ {
+ label: '部门',
+ field: 'deptId',
+ // type: 'cascader',
+ type: 'treeSelect',
+ props: { value: 'deptId', label: 'deptName', children: 'children' },
+ clearable: true,
+ placeholder: '请选择部门',
+ options: deptListVal.value
+ }
+ ])
+ // 表格配置按钮
+ const btnList = ref([
+ { label: '新增岗位', type: 'primary', plain: false, icon: 'Plus', met: 'handleAdd', hasPermi:'system:post:add' },
+ ])
+ // 表格配置项
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false // 是否隐藏分页
+ })
+ // 表格列
+ const columns = ref([
+ // {
+ // label: "岗位编码",
+ // prop: "postCode",
+ // minWidth: 100
+ // },
+ {
+ label: "岗位名称",
+ prop: "postName",
+ minWidth: 100,
+ },
+ // {
+ // label: "岗位排序",
+ // prop: "postSort",
+ // minWidth: 100,
+ // },
+ {
+ label: "部门名称",
+ prop: "deptName",
+ minWidth: 100,
+ },
+ {
+ label: "使用人数",
+ prop: "relateUserNum",
+ minWidth: 100,
+ slots: (row) => {
+ return {handleUserNumFn.value(row)}}>{row.relateUserNum}
+ }
+ },
+ // {
+ // label: "状态",
+ // prop: "status",
+ // minWidth: 100,
+ // slots: (row) => {
+ // return
+ // }
+ // },
+ {
+ label: "创建时间",
+ prop: "createTime",
+ sort: true,
+ minWidth: 100,
+ slots: (row) => {
+ return { proxy.parseTime(row.createTime) }
+ }
+ },
+ {
+ label: "操作",
+ minWidth: 100,
+ slots: (row) => {
+ if (row.relateUserNum == 0) {
+ return (<>
+ {handleUpdateFn.value(row)}} v-hasPermi={['system:post:edit']}>修改
+ {handleDeleteFn.value(row)}} v-hasPermi={['system:post:remove']}>删除
+ >)
+ } else {
+ return {handleUpdateFn.value(row)}} v-hasPermi={['system:post:edit']}>修改
+ }
+ }
+ },
+ ])
+ // 分页配置
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ // 表单元素
+ const fieldList = ref([
+ {
+ label: '岗位名称',
+ field: 'postName',
+ width: '400px',
+ rules: [{ required: true, message: "岗位名称不能为空", trigger: "blur" }],
+ placeholder: '请输入岗位名称'
+ },
+ // {
+ // label: '岗位编码',
+ // field: 'postCode',
+ // width: '270px',
+ // rules: [{ required: true, message: "岗位编码不能为空", trigger: "blur" }],
+ // placeholder: '请输入岗位编码'
+ // },
+ {
+ label: '岗位顺序',
+ field: 'postSort',
+ type: 'number',
+ hidden: true,
+ width: '320px',
+ rules: [{ required: true, message: "岗位顺序不能为空", trigger: "blur" }],
+ placeholder: ''
+ },
+ {
+ label: '所属部门',
+ field: 'deptId',
+ // type: 'cascader',
+ type: 'treeSelect',
+ width: '400px',
+ props: { value: 'deptId', label: 'deptName', children: 'children' },
+ clearable: true,
+ rules: [{ required: true, message: "所属部门不能为空", trigger: "change" }],
+ placeholder: '请选择所属部门',
+ options: deptList
+ },
+ {
+ label: '备注',
+ field: 'remark',
+ type: 'textarea',
+ max: 100,
+ width: '400px',
+ placeholder: '请输入备注内容'
+ },
+ // {
+ // label: '岗位状态',
+ // field: 'status',
+ // type: 'radio',
+ // radioButton: false,
+ // options: sys_normal_disable
+ // },
+ ])
+ // 表单配置项
+ const formOption = ref({
+ inline: false,
+ labelWidth: '80px',
+ scrollToError: true,
+ btnCenter: true,
+ labelPosition: 'right',
+ btn: ['submit', 'cancel']
+ })
+ // 使用人数弹窗表格配置
+ const userTableOption = ref({
+ fixed: "", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ pageHidden: false // 是否隐藏分页
+ })
+ // 分页配置
+ const userPageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ const userColumns = ref([
+ {
+ label: "员工编号",
+ prop: "userName",
+ minWidth: 100
+ },
+ {
+ label: "姓名",
+ prop: "nickName",
+ minWidth: 100,
+ },
+ {
+ label: "性别",
+ prop: "sex",
+ minWidth: 100,
+ slots: (row) => {
+ return { row.sex ? sys_user_sex.value.find(item => item.value === row.sex).label : '' }
+ }
+ },
+ {
+ label: "手机号码",
+ prop: "phonenumber",
+ minWidth: 100,
+ },
+ ])
+ return {
+ searchList,
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ fieldList,
+ formOption,
+ userTableOption,
+ userPageSet,
+ userColumns
+ }
+}
+
diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue
new file mode 100644
index 0000000..d832b5b
--- /dev/null
+++ b/src/views/system/post/index.vue
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+
+
+
+
+
+ 关闭
+
+
+
+
+
+
diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue
new file mode 100644
index 0000000..66b5f5e
--- /dev/null
+++ b/src/views/system/role/authUser.vue
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 添加用户
+
+
+ 批量取消授权
+
+
+ 关闭
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 取消授权
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/role/index.jsx b/src/views/system/role/index.jsx
new file mode 100644
index 0000000..55245f4
--- /dev/null
+++ b/src/views/system/role/index.jsx
@@ -0,0 +1,123 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 角色管理页面配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-27 10:12:00
+ * @Date: 2024-03-27 09:39:42
+ */
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 岗位配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-06 14:09:46
+ * @Date: 2024-02-04 16:56:20
+ */
+
+const handleUpdateFn = ref(null)
+const handleDeleteFn = ref(null)
+const handleStatusChangeFn = ref(null)
+
+
+export const init = (proxy, { handleUpdate, handleDelete, handleStatusChange }) => {
+ handleUpdateFn.value = handleUpdate
+ handleDeleteFn.value = handleDelete
+ handleStatusChangeFn.value = handleStatusChange
+
+ // 表格筛选条件
+ const searchList = ref([
+ {
+ label: '角色名称',
+ field: 'roleName',
+ searchBtn: true,
+ clearable: true,
+ placeholder: '请输入角色名称'
+ },
+ ])
+ // 表格配置按钮
+ const btnList = ref([
+ { label: '新增角色', type: 'primary', plain: false, icon: 'Plus', met: 'handleAdd', hasPermi:'system:role:add' },
+ ])
+ // 表格配置项
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false, // 是否隐藏分页
+ maxHeight: '65vh'
+ })
+ // 表格列
+ const columns = ref([
+ // {
+ // label: "角色编号",
+ // prop: "roleId",
+ // minWidth: 100
+ // },
+ {
+ label: "角色名称",
+ prop: "roleName",
+ minWidth: 100,
+ },
+ {
+ label: "角色描述",
+ prop: "remark",
+ minWidth: 100,
+ },
+ {
+ label: "权限字符",
+ prop: "roleKey",
+ minWidth: 100,
+ },
+ {
+ label: "显示顺序",
+ prop: "roleSort",
+ minWidth: 100,
+ },
+ {
+ label: "状态",
+ prop: "status",
+ minWidth: 100,
+ slots: (row) => {
+ return {handleStatusChangeFn.value(row)}}>
+ }
+ },
+ {
+ label: "创建时间",
+ prop: "createTime",
+ sort: true,
+ minWidth: 100,
+ slots: (row) => {
+ return { proxy.parseTime(row.createTime) }
+ }
+ },
+ {
+ label: "操作",
+ minWidth: 100,
+ slots: (row) => {
+ return (<>
+ {handleUpdateFn.value(row)}} v-hasPermi={['system:role:edit']}>修改
+ {handleDeleteFn.value(row)}} v-hasPermi={['system:role:remove']}>删除
+ >)
+ }
+ },
+ ])
+ // 分页配置
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ return {
+ searchList,
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ }
+}
+
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
new file mode 100644
index 0000000..8f9e685
--- /dev/null
+++ b/src/views/system/role/index.vue
@@ -0,0 +1,554 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 权限字符
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+ 展开/折叠
+ 全选/全不选
+ 父子联动
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 展开/折叠
+ 全选/全不选
+ 父子联动
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue
new file mode 100644
index 0000000..9be1ec9
--- /dev/null
+++ b/src/views/system/role/selectUser.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/user/authRole.vue b/src/views/system/user/authRole.vue
new file mode 100644
index 0000000..5f1f2fe
--- /dev/null
+++ b/src/views/system/user/authRole.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ (pageNum - 1) * pageSize + scope.$index + 1 }}
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+ 提交
+ 返回
+
+
+
+
+
+
diff --git a/src/views/system/user/index.jsx b/src/views/system/user/index.jsx
new file mode 100644
index 0000000..15a11ae
--- /dev/null
+++ b/src/views/system/user/index.jsx
@@ -0,0 +1,303 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 人员管理配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-29 11:04:30
+ * @Date: 2024-03-05 09:37:15
+ */
+import cpw from '../../../assets/images/change-password.png'
+const deptListVal = ref([])
+const postOptionsVal = ref([])
+const teamListVal = ref([])
+const roleOptionsVal = ref([])
+const handleStatusChangeFn = ref(null)
+const handleUpdateFn = ref(null)
+const handleResetPwdFn = ref(null)
+const handleDeleteFn = ref(null)
+
+export const init = (proxy, {
+ deptList,
+ postOptions,
+ teamList,
+ roleOptions,
+ handleStatusChange,
+ handleUpdate,
+ handleResetPwd,
+ handleDelete,
+}) => {
+ deptListVal.value = deptList
+ postOptionsVal.value = postOptions
+ teamListVal.value = teamList
+ roleOptionsVal.value = roleOptions
+ handleStatusChangeFn.value = handleStatusChange
+ handleUpdateFn.value = handleUpdate
+ handleResetPwdFn.value = handleResetPwd
+ handleDeleteFn.value = handleDelete
+
+ const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+ const { sys_user_sex } = proxy.useDict("sys_user_sex");
+ // 表格筛选条件
+ const searchList = ref([
+ {
+ label: '搜索',
+ field: 'userName',
+ placeholder: '请输入员工编号/姓名'
+ },
+ {
+ label: '部门',
+ field: 'deptId',
+ type: 'treeSelect',
+ props: { value: 'deptId', label: 'deptName', children: 'children' },
+ clearable: true,
+ placeholder: '请选择部门',
+ options: deptListVal.value
+ },
+ {
+ label: '岗位',
+ field: 'postIds',
+ type: 'select',
+ clearable: true,
+ multiple: true,
+ placeholder: '请选择岗位',
+ options: postOptionsVal.value
+ },
+ {
+ label: '班组',
+ field: 'teamId',
+ type: 'select',
+ clearable: true,
+ placeholder: '请选择班组',
+ options: teamListVal.value
+ },
+ {
+ label: '状态',
+ field: 'status',
+ type: 'select',
+ clearable: true,
+ placeholder: '请选择用户状态',
+ options: sys_normal_disable
+ },
+ ])
+ // 表格配置按钮
+ const btnList = ref([
+ { label: '新增员工', type: 'primary', icon: 'Plus', met: 'handleAdd', hasPermi:'system:user:add' },
+ ])
+ // 表格配置项
+ const tableOption = ref({
+ checkbox: false, // 是否展示多选框
+ index: true, // 是否展示序号
+ fixed: "", // 是否将多选框及序号列固定在最左侧
+ stripe: true, // 是否斑马纹表格
+ border: false, // 是否表格边框
+ pageHidden: false, // 是否隐藏分页
+ maxHeight: '58vh'
+ })
+ // 表格列
+ const columns = ref([
+ { label: "员工编号", prop: "userName", minWidth: 100 },
+ { label: "姓名", prop: "nickName", minWidth: 100 },
+ { label: "部门", prop: "deptName", minWidth: 100 },
+ { label: "岗位", prop: "postDesc", minWidth: 100 },
+ { label: "班组", prop: "teamName", minWidth: 100 },
+ { label: "手机号码", prop: "phonenumber", minWidth: 100 },
+ {
+ label: "性别", prop: "sex", minWidth: 100,
+ slots: (row) => {
+ return { row.sex ? sys_user_sex.value.find(item => item.value == row.sex).label : '' }
+ }
+ },
+ {
+ label: "状态", prop: "status", minWidth: 100,
+ slots: (row) => {
+ return {handleStatusChangeFn.value(row)}}>
+ }
+ },
+ {
+ label: "创建时间", prop: "createTime", sort: true, minWidth: 160,
+ slots: (row) => {
+ return { proxy.parseTime(row.createTime) }
+ }
+ },
+ {
+ label: "操作", minWidth: 140,
+ slots: (row) => {
+ const slots = {
+ reference: () => (
+ {
+ Object.keys(popVisible.value).forEach(item => {
+ popVisible.value[item] = false
+ })
+ newPassWord.value = ''
+ popVisible.value[row.userId] = true
+ }} v-hasPermi={['system:user:resetPwd']}>重置密码
+ )
+ }
+ const rule = {
+ password: [
+ { required: true, message: "密码不能为空", trigger: "blur" },
+ { pattern: /^.{6,}$/, message: "至少6位以上", trigger: "blur" },
+ { pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,20}$/, message: "至少包含一个数字和一个字母,不支持空格和符号", trigger: "blur" },
+ ]
+ }
+ if (row?.userId === 1) {
+ return
+ } else {
+ return (<>
+ {handleUpdateFn.value(row)}} v-hasPermi={['system:user:edit']}>修改
+ {/*
+
+

+
+
{ row.userName }
+
请输入{row.userName}的新密码
+
+
+
+
+
+
+
+ {popVisible.value[row.userId] = false}}>取消
+ {nextTick(() => {handleResetPwdFn.value(row)})}}>确定
+
+
+ */}
+ {handleResetPwdFn.value(row)}} v-hasPermi={['system:user:resetPwd']}>重置密码
+ {handleDeleteFn.value(row)}} v-hasPermi={['system:user:remove']}>删除
+ >)
+ }
+ }
+ },
+ ])
+ // 分页配置
+ const pageSet = ref({
+ pageNum: 1,
+ pageSize: 10,
+ total:0
+ })
+ // 表单元素
+ const fieldList = ref([
+ {
+ label: '员工编号',
+ field: 'userName',
+ width: '270px',
+ rules: [
+ { required: true, message: "员工编号不能为空", trigger: "blur" },
+ { min: 2, max: 20, message: "员工编号长度必须介于 2 和 20 之间", trigger: "blur" }
+ ],
+ placeholder: '请输入员工编号'
+ },
+ {
+ label: '姓名',
+ field: 'nickName',
+ width: '270px',
+ rules: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
+ placeholder: '请输入姓名'
+ },
+ {
+ label: '归属部门',
+ field: 'deptId',
+ type: 'treeSelect',
+ width: '270px',
+ props: { value: 'deptId', label: 'deptName', children: 'children' },
+ clearable: true,
+ rules: [{ required: true, message: "部门不能为空", trigger: "change" }],
+ placeholder: '请选择部门',
+ options: deptListVal.value
+ },
+ {
+ label: '岗位',
+ field: 'postIds',
+ type: 'select',
+ width: '270px',
+ clearable: true,
+ multiple: true,
+ rules: [{ required: true, message: "岗位不能为空", trigger: "change" }],
+ placeholder: '请选择岗位',
+ options: postOptionsVal.value
+ },
+ {
+ label: '角色',
+ field: 'roleIds',
+ type: 'select',
+ width: '270px',
+ clearable: true,
+ multiple: true,
+ rules: [{ required: true, message: "角色不能为空", trigger: "change" }],
+ placeholder: '请选择角色',
+ options: roleOptionsVal.value
+ },
+ {
+ label: '密码',
+ field: 'password',
+ type: 'password',
+ width: '270px',
+ rules: [
+ { required: true, message: "密码不能为空", trigger: "blur" },
+ { pattern: /^.{6,}$/, message: "至少6位以上", trigger: "blur" },
+ { pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,20}$/, message: "至少包含一个数字和一个字母,不支持空格和符号", trigger: "blur" },
+ ],
+ placeholder: '请输入密码'
+ },
+ {
+ label: '手机号码',
+ field: 'phonenumber',
+ width: '270px',
+ max: 11,
+ rules: [{ pattern: /^1[3456789]\d{9}$/, message: "手机号码格式不正确", trigger: "blur" }],
+ placeholder: '请输入手机号码'
+ },
+ {
+ label: '邮箱',
+ field: 'email',
+ width: '270px',
+ rules: [{ pattern: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, message: "邮箱格式不正确", trigger: "blur" }],
+ placeholder: '请输入邮箱'
+ },
+ {
+ label: '用户性别',
+ field: 'sex',
+ type: 'select',
+ width: '270px',
+ clearable: true,
+ placeholder: '请选择用户性别',
+ options: sys_user_sex
+ },
+ {
+ label: '状态',
+ field: 'status',
+ type: 'radio',
+ radioButton: false,
+ options: sys_normal_disable
+ },
+ ])
+ // 表单配置项
+ const formOption = ref({
+ inline: true,
+ labelWidth: '80px',
+ scrollToError: true,
+ btnCenter: true,
+ labelPosition: 'top',
+ btn: ['submit', 'cancel']
+ })
+
+
+ // popover 弹出方法
+ const popVisible = ref({})
+ const newPassWord = ref({
+ password:''
+ })
+ return {
+ searchList,
+ btnList,
+ columns,
+ pageSet,
+ tableOption,
+ fieldList,
+ formOption,
+ newPassWord
+ }
+}
+
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
new file mode 100644
index 0000000..42a6386
--- /dev/null
+++ b/src/views/system/user/index.vue
@@ -0,0 +1,266 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue
new file mode 100644
index 0000000..018ea2c
--- /dev/null
+++ b/src/views/system/user/profile/index.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+ 个人信息
+
+
+
+
+
+
+
+
+
+ 基本资料
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue
new file mode 100644
index 0000000..0597763
--- /dev/null
+++ b/src/views/system/user/profile/resetPwd.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
diff --git a/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue
new file mode 100644
index 0000000..f576c95
--- /dev/null
+++ b/src/views/system/user/profile/userAvatar.vue
@@ -0,0 +1,171 @@
+
+
+
![点击上传头像]()
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提 交
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue
new file mode 100644
index 0000000..0b9fe4f
--- /dev/null
+++ b/src/views/system/user/profile/userInfo.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+
+
+
+ 保存
+
+
+
+
+
+
diff --git a/src/views/tool/build/index.vue b/src/views/tool/build/index.vue
new file mode 100644
index 0000000..c3543a9
--- /dev/null
+++ b/src/views/tool/build/index.vue
@@ -0,0 +1,3 @@
+
+ 表单构建
+
\ No newline at end of file
diff --git a/src/views/tool/gen/basicInfoForm.vue b/src/views/tool/gen/basicInfoForm.vue
new file mode 100644
index 0000000..39c8515
--- /dev/null
+++ b/src/views/tool/gen/basicInfoForm.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/tool/gen/editTable.vue b/src/views/tool/gen/editTable.vue
new file mode 100644
index 0000000..a61556c
--- /dev/null
+++ b/src/views/tool/gen/editTable.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.dictName }}
+ {{ dict.dictType }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 提交
+ 返回
+
+
+
+
+
+
diff --git a/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue
new file mode 100644
index 0000000..e3e92cb
--- /dev/null
+++ b/src/views/tool/gen/genInfoForm.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+ 生成模板
+
+
+
+
+
+
+
+
+
+
+
+ 生成包路径
+
+
+
+
+
+
+
+
+
+
+
+ 生成模块名
+
+
+
+
+
+
+
+
+
+
+
+ 生成业务名
+
+
+
+
+
+
+
+
+
+
+
+ 生成功能名
+
+
+
+
+
+
+
+
+
+
+
+ 上级菜单
+
+
+
+
+
+
+
+
+
+
+
+ 生成代码方式
+
+
+
+
+ zip压缩包
+ 自定义路径
+
+
+
+
+
+
+ 自定义路径
+
+
+
+
+
+
+
+
+ 最近路径快速选择
+
+
+
+
+ 恢复默认的生成基础路径
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 树编码字段
+
+
+
+
+
+
+
+
+
+
+
+
+ 树父编码字段
+
+
+
+
+
+
+
+
+
+
+
+
+ 树名称字段
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关联子表的表名
+
+
+
+
+
+
+
+
+
+
+
+
+ 子表关联的外键名
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/tool/gen/importTable.vue b/src/views/tool/gen/importTable.vue
new file mode 100644
index 0000000..33b5633
--- /dev/null
+++ b/src/views/tool/gen/importTable.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue
new file mode 100644
index 0000000..fb2fc9e
--- /dev/null
+++ b/src/views/tool/gen/index.vue
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 生成
+
+
+ 导入
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+ {{(queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 复制
+ {{ value }}
+
+
+
+
+
+
+
+
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..fbe477e
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,79 @@
+/*
+ * @Company: 沈阳信诚科技
+ * @Email: html_venustar@163.com
+ * @Author: Liuqiming
+ * @Description: 项目基础配置
+ * @LastEditors: Liuqiming
+ * @LastEditTime: 2024-03-01 09:37:52
+ * @Date: 2024-02-01 16:33:25
+ */
+import { defineConfig, loadEnv } from 'vite'
+import path from 'path'
+import createVitePlugins from './vite/plugins'
+
+// https://vitejs.dev/config/
+export default defineConfig(({ mode, command }) => {
+ const env = loadEnv(mode, process.cwd())
+ return {
+ // 部署生产环境和开发环境下的URL。
+ // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
+ // 例如,如果你的应用被部署在 https://www.***.vip/admin/,则设置 baseUrl 为 /admin/。
+ base: env.VITE_APP_CONTEXT_PATH,
+ plugins: createVitePlugins(env, command === 'build'),
+ resolve: {
+ // https://cn.vitejs.dev/config/#resolve-alias
+ alias: {
+ // 设置路径
+ '~': path.resolve(__dirname, './'),
+ // 设置别名
+ '@': path.resolve(__dirname, './src'),
+ // 设置便捷路径
+ '@A': path.resolve(__dirname, './src/api'),
+ '@S': path.resolve(__dirname, './src/assets'),
+ '@C': path.resolve(__dirname, './src/components'),
+ '@U': path.resolve(__dirname, './src/utils')
+ },
+ // https://cn.vitejs.dev/config/#resolve-extensions
+ extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
+ },
+ // vite 相关配置
+ server: {
+ port: 8088,
+ host: true,
+ open: true,
+ proxy: {
+ // https://cn.vitejs.dev/config/#server-proxy
+ '/dev-api': {
+ target: 'http://localhost:8080',
+ // target: 'http://192.168.3.32:8080', // 刘壮后台
+ // target: 'http://192.168.1.61:8481', // 沈阳服务器
+ // target: 'http://192.168.3.146:8080', // 马成龙后台
+ changeOrigin: true,
+ rewrite: (p) => p.replace(/^\/dev-api/, '')
+ }
+ }
+ },
+ //fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file
+ css: {
+ postcss: {
+ plugins: [
+ {
+ postcssPlugin: 'internal:charset-removal',
+ AtRule: {
+ charset: (atRule) => {
+ if (atRule.name === 'charset') {
+ atRule.remove();
+ }
+ }
+ }
+ }
+ ]
+ },
+ preprocessorOptions: {
+ scss: {
+ additionalData: `@import "@/assets/styles/wh.scss";`
+ }
+ }
+ }
+ }
+})
diff --git a/vite/plugins/auto-import.js b/vite/plugins/auto-import.js
new file mode 100644
index 0000000..a5d3576
--- /dev/null
+++ b/vite/plugins/auto-import.js
@@ -0,0 +1,12 @@
+import autoImport from 'unplugin-auto-import/vite'
+
+export default function createAutoImport() {
+ return autoImport({
+ imports: [
+ 'vue',
+ 'vue-router',
+ 'pinia'
+ ],
+ dts: false
+ })
+}
diff --git a/vite/plugins/compression.js b/vite/plugins/compression.js
new file mode 100644
index 0000000..e90aaec
--- /dev/null
+++ b/vite/plugins/compression.js
@@ -0,0 +1,28 @@
+import compression from 'vite-plugin-compression'
+
+export default function createCompression(env) {
+ const { VITE_BUILD_COMPRESS } = env
+ const plugin = []
+ if (VITE_BUILD_COMPRESS) {
+ const compressList = VITE_BUILD_COMPRESS.split(',')
+ if (compressList.includes('gzip')) {
+ // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
+ plugin.push(
+ compression({
+ ext: '.gz',
+ deleteOriginFile: false
+ })
+ )
+ }
+ if (compressList.includes('brotli')) {
+ plugin.push(
+ compression({
+ ext: '.br',
+ algorithm: 'brotliCompress',
+ deleteOriginFile: false
+ })
+ )
+ }
+ }
+ return plugin
+}
diff --git a/vite/plugins/index.js b/vite/plugins/index.js
new file mode 100644
index 0000000..b7ca7c0
--- /dev/null
+++ b/vite/plugins/index.js
@@ -0,0 +1,18 @@
+
+import vue from '@vitejs/plugin-vue'
+import vueJsx from '@vitejs/plugin-vue-jsx';
+
+import createAutoImport from './auto-import'
+import createSvgIcon from './svg-icon'
+import createCompression from './compression'
+import createSetupExtend from './setup-extend'
+
+export default function createVitePlugins(viteEnv, isBuild = false) {
+ const vitePlugins = [vue()]
+ vitePlugins.push(vueJsx())
+ vitePlugins.push(createAutoImport())
+ vitePlugins.push(createSetupExtend())
+ vitePlugins.push(createSvgIcon(isBuild))
+ isBuild && vitePlugins.push(...createCompression(viteEnv))
+ return vitePlugins
+}
diff --git a/vite/plugins/setup-extend.js b/vite/plugins/setup-extend.js
new file mode 100644
index 0000000..ed8342e
--- /dev/null
+++ b/vite/plugins/setup-extend.js
@@ -0,0 +1,5 @@
+import setupExtend from 'unplugin-vue-setup-extend-plus/vite'
+
+export default function createSetupExtend() {
+ return setupExtend({})
+}
diff --git a/vite/plugins/svg-icon.js b/vite/plugins/svg-icon.js
new file mode 100644
index 0000000..30a4140
--- /dev/null
+++ b/vite/plugins/svg-icon.js
@@ -0,0 +1,10 @@
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
+import path from 'path'
+
+export default function createSvgIcon(isBuild) {
+ return createSvgIconsPlugin({
+ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],
+ symbolId: 'icon-[dir]-[name]',
+ svgoOptions: isBuild
+ })
+}