Compare commits

132 Commits

Author SHA1 Message Date
xuziqiang
9316629faa fix: 登录校验调整 2024-07-05 18:19:03 +08:00
xuziqiang
c7bbc1f003 fix: 角色新增同级 2024-07-05 17:36:24 +08:00
xuziqiang
da80693704 fix: bug修改 2024-07-05 17:29:34 +08:00
xuziqiang
40d93e74aa fix: bug修改 2024-07-05 17:26:31 +08:00
xuziqiang
b2a200486f fix: hx-op路由调整 2024-07-05 14:12:53 +08:00
xuziqiang
228f420bd4 fix: 项目图标调整 2024-07-05 13:51:28 +08:00
xuziqiang
78d49ff16e fix: 设备联调 2024-07-05 12:04:17 +08:00
xuziqiang
4bbb5c5133 fix: 组件调整 2024-07-04 11:19:38 +08:00
xuziqiang
d294c3f07a feat: 设备台账联调 2024-07-03 18:08:02 +08:00
xuziqiang
fba16c75b9 feat: 设备台账联调 2024-07-03 18:07:52 +08:00
xuziqiang
e5cd75c845 feat: 设备台账联调 2024-07-03 17:58:39 +08:00
xuziqiang
be09e531b9 fix:调整路由 2024-07-03 10:50:16 +08:00
xuziqiang
45908dd5c1 fix: 部门角色编辑调整 2024-07-02 14:52:12 +08:00
xuziqiang
7fd1733872 fix: remove useless console 2024-07-01 16:37:37 +08:00
xuziqiang
2d9fc62d86 feat: 解决批量删除之后选中数据清除问题 2024-07-01 16:04:12 +08:00
xuziqiang
7eb8ba79f8 feat: 树loading样式调整 2024-07-01 15:03:45 +08:00
xuziqiang
ef782e90b6 feat: ns-tree-api补充粘性定位 2024-06-28 16:46:07 +08:00
xuziqiang
46398fda22 fix: 抽离接口异常code 2024-06-28 16:07:37 +08:00
xuziqiang
edfc11825d feat: 补充全局自定义权限指令 2024-06-28 14:49:40 +08:00
xuziqiang
9f1620c9f8 fix: 调整placeholder 2024-06-28 11:45:29 +08:00
xuziqiang
9ddeaa59eb fix: childform 警告调整 2024-06-27 17:08:58 +08:00
xuziqiang
8f25d2293c feat: 分组切换 2024-06-27 15:21:14 +08:00
xuziqiang
7c64a6b231 fix: 修改tag右键操作异常 2024-06-27 14:27:04 +08:00
xuziqiang
d6865544d8 fix: 补充超出滚动 2024-06-27 10:59:05 +08:00
xuziqiang
3d2d777644 fix: bug修复 2024-06-26 16:57:42 +08:00
xuziqiang
613e7feaf4 fix: 样式细节调整 2024-06-26 14:58:23 +08:00
xuziqiang
b55ab2353e feat: 部门样式调整 2024-06-26 10:32:45 +08:00
xuziqiang
d654588e65 feat: 用户管理样式调整 2024-06-25 14:52:13 +08:00
xuziqiang
15fce86265 feat: form 组件样式调整 2024-06-25 11:21:35 +08:00
xuziqiang
cecd3a0325 feat;sider样式补充 2024-06-24 15:24:21 +08:00
xuziqiang
0c291263cd feat: 样式调整 2024-06-21 18:15:32 +08:00
xuziqiang
d4f17c4c02 feat: 树搜索调整 2024-06-21 15:56:21 +08:00
xuziqiang
e16ad610e7 feat: table cancel sticky 2024-06-21 15:45:35 +08:00
xuziqiang
fea7abd476 feat: 样式调整 2024-06-21 15:19:28 +08:00
xuziqiang
2ebe536243 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-06-19 18:23:50 +08:00
xuziqiang
ab3960fff8 fix: bug修复 2024-06-19 18:23:49 +08:00
lushihan
77a9fe882d feat:照明 2024-06-19 16:23:46 +08:00
xuziqiang
8a554f5871 fix: 权限排序异常 2024-06-19 16:22:19 +08:00
xuziqiang
5d7d8cc4de fix: bug 修复 2024-06-19 15:20:49 +08:00
xuziqiang
69776112f9 fix: bug 修复 2024-06-19 15:20:04 +08:00
xuziqiang
f744ad286e fix: 005 复制异常修复 2024-06-19 10:03:47 +08:00
xuziqiang
75a67c3039 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-06-18 18:16:23 +08:00
xuziqiang
ec1ae071f8 fix: 集团补充验证,部门权限取消清楚权限信息 2024-06-18 18:16:23 +08:00
lushihan
d527a1467f feat:照明 2024-06-18 16:41:31 +08:00
xuziqiang
012c049ab0 fix: 静态资源调整 2024-06-18 14:49:01 +08:00
xuziqiang
e0fe92a8f8 feat: 补充记住密码功能 2024-06-17 18:32:35 +08:00
xuziqiang
e9ca9cfab9 fix: 修改刷新页面权限丢失 2024-06-17 17:41:30 +08:00
xuziqiang
217496d5b6 fix: 登录过滤空格 2024-06-17 17:31:01 +08:00
xuziqiang
efced81544 fix: 登录验证异常 2024-06-17 17:24:03 +08:00
xuziqiang
1f62153ad4 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-06-17 16:59:50 +08:00
xuziqiang
09fa01122c feat: 登录补充验证码 2024-06-17 16:59:30 +08:00
lushihan
cd1690fb28 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-06-17 16:55:48 +08:00
lushihan
559db71640 feat:照明 2024-06-17 16:53:36 +08:00
xuziqiang
91dd7a7d0c fix: header 切换缓存逻辑补充 2024-06-17 13:48:27 +08:00
xuziqiang
bc80a22180 feat: 权限逻辑处理 2024-06-14 18:27:07 +08:00
xuziqiang
da3d5840df feat: 权限逻辑处理 2024-06-14 11:49:51 +08:00
lushihan
08972bfbfb feat:照明 2024-06-13 17:22:24 +08:00
xuziqiang
819a00f733 feat: 企业细节逻辑调整 2024-06-12 18:15:49 +08:00
xuziqiang
680855f310 feat: 企业联调 2024-06-12 16:41:30 +08:00
lushihan
8e6abb5c57 feat:完善 2024-06-12 15:57:35 +08:00
xuziqiang
689a349d96 fix: 路由调整 2024-06-11 16:45:18 +08:00
xuziqiang
dd82f15e7f Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-06-11 16:16:35 +08:00
xuziqiang
fbf460a620 fix: 资源路径调整 2024-06-11 16:13:51 +08:00
lushihan
c4132d41cd feat:添加 2024-06-11 15:44:41 +08:00
xuziqiang
c4652e2571 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-06-11 13:37:11 +08:00
xuziqiang
d58f066b39 feat: 细节调整 2024-06-11 13:37:10 +08:00
lushihan
e6ed0f0e09 照明 2024-06-11 09:01:15 +08:00
lushihan
3b6d11122e 6.11 2024-06-11 08:48:13 +08:00
lushihan
30743f1474 6.11 2024-06-11 08:47:52 +08:00
lushihan
ec6faa9494 feat:照明 2024-06-11 08:36:13 +08:00
xuziqiang
cbfa942ff6 feat: NsCascader 调整逻辑 2024-06-07 17:41:47 +08:00
xuziqiang
fc940e7241 feat: 补充新项目hx-op 2024-06-07 15:11:04 +08:00
xuziqiang
a0f5c4de08 feat: 调整部门新增逻辑 2024-06-07 14:16:45 +08:00
xuziqiang
112c701799 feat: 补充角色权限 2024-06-07 14:14:21 +08:00
xuziqiang
6a31e3199b fix: code format 2024-06-06 17:02:49 +08:00
xuziqiang
2141efd7a7 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-06-06 16:56:35 +08:00
xuziqiang
946384b9ed feat: 补充用户模块权限json 2024-06-06 16:56:34 +08:00
lushihan
0bfbf391e2 feat: 灯光 2024-06-06 16:49:24 +08:00
lushihan
e7e2d52dff fix: 照明调整文件路径 2024-06-06 14:37:33 +08:00
L
14a7c158bc 照明控制面板 2024-06-06 11:57:16 +08:00
xuziqiang
9c3508fbc8 feat: 调整用户企业树 2024-06-06 11:05:43 +08:00
xuziqiang
61218104d3 feat: 部门联调 2024-06-04 19:22:11 +08:00
xuziqiang
bd89f7973d feat: open permission 2024-06-04 11:40:32 +08:00
xuziqiang
e1b0d817fe feat: 用户联调 2024-06-04 10:54:02 +08:00
xuziqiang
31479608c0 feat: 能耗映射 2024-05-31 09:54:39 +08:00
xuziqiang
65230bf066 feat: 树补充搜索 2024-05-30 14:16:42 +08:00
xuziqiang
9319c09fb7 fix: 修改table mock数据 2024-05-29 18:24:44 +08:00
xuziqiang
620fbd509a fix: formItem formItemProps 调研关联性 2024-05-29 17:24:26 +08:00
xuziqiang
4614c8699f feat: 分组管理 2024-05-29 16:29:22 +08:00
xuziqiang
f7ebb4bd60 feat: drawer 组件封装 2024-05-29 13:58:08 +08:00
xuziqiang
c9f8148dc3 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-29 10:18:13 +08:00
xuziqiang
c4d7573cbb feat: 分组管理 2024-05-29 10:18:12 +08:00
dinghao
778ada00fc 提交 2024-05-28 18:00:25 +08:00
xuziqiang
e28ca898ee Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-28 14:48:38 +08:00
xuziqiang
a67f48c770 feat: 登录联调 2024-05-28 14:48:37 +08:00
dinghao
0db3da2362 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-28 11:09:59 +08:00
dinghao
de08945d49 tijiao 2024-05-28 11:08:57 +08:00
xuziqiang
ddb046d2d3 feat: 设备台账 2024-05-28 10:51:13 +08:00
xuziqiang
d2b0a2ca06 feat: 设备台账 2024-05-27 17:12:49 +08:00
xuziqiang
c7f104091f fix: prod图片修改 2024-05-27 13:27:54 +08:00
dinghao
2c6dc56e0b tijiao 2024-05-24 13:13:24 +08:00
xuziqiang
1e72487b35 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-24 10:32:06 +08:00
xuziqiang
8b2dc8a230 test build 2024-05-24 10:32:05 +08:00
dinghao
ab7217f0f0 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-24 09:44:15 +08:00
dinghao
11a7c77f69 tijiao 2024-05-24 09:44:08 +08:00
xuziqiang
576f313b2f feat: 补充头部下拉 2024-05-23 17:49:25 +08:00
xuziqiang
1a7a01894d Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-23 17:09:09 +08:00
xuziqiang
79743608b8 fix: modal close 2024-05-23 17:09:08 +08:00
dinghao
2dac756371 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-23 16:18:23 +08:00
dinghao
97ebd09edd tijiao 2024-05-23 16:18:18 +08:00
xuziqiang
c8718677f4 fix: style adjust 2024-05-23 16:17:12 +08:00
dinghao
060365e0fe tijiao 2024-05-23 15:50:47 +08:00
dinghao
cf301fb1f1 tijiao 2024-05-23 15:34:26 +08:00
dinghao
d8bc019f03 提交 2024-05-23 14:45:06 +08:00
dinghao
51d9fb84e5 tijiao 2024-05-23 14:34:26 +08:00
dinghao
0df4d84cb6 tijiao 2024-05-23 14:34:07 +08:00
dinghao
3e9897b798 feat:"tijaio" 2024-05-22 17:43:25 +08:00
xuziqiang
aee1cfdc40 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-22 16:39:51 +08:00
xuziqiang
443058d61f fix: form vertical width full 2024-05-22 16:39:50 +08:00
dinghao
3f236bb1b1 feat 2024-05-22 16:31:55 +08:00
xuziqiang
60ae99d410 feat: theme change 2024-05-22 14:36:37 +08:00
xuziqiang
54b7ffb119 fix: basic path warning 2024-05-22 14:28:56 +08:00
xuziqiang
78207546c7 fix: hx-ai-intelligent 区分 2024-05-22 14:06:24 +08:00
xuziqiang
5318f0f46c Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-22 13:42:00 +08:00
xuziqiang
de932dfe22 fix: 修改路由模式hash 2024-05-22 13:41:59 +08:00
dinghao
3958d730f0 tijiao 2024-05-22 11:53:03 +08:00
dinghao
91d6051664 Merge branch 'main' of http://123.60.103.97:3000/xuziqiang/SaaS-lib 2024-05-22 11:23:19 +08:00
dinghao
043e73267f feat: 部门权限 2024-05-22 11:23:13 +08:00
xuziqiang
69a68c615e fix: header图片 2024-05-21 17:22:20 +08:00
xuziqiang
1d25ea126c feat: remove useless project 2024-05-21 16:43:45 +08:00
xuziqiang
4a9b924df6 feat: huaxing-AI智能BAS系统 2024-05-21 16:42:16 +08:00
xuziqiang
84ef5b6032 test 2024-05-21 11:28:26 +08:00
860 changed files with 38689 additions and 152841 deletions

10
hx-ai-intelligent/.env Normal file
View File

@@ -0,0 +1,10 @@
# port
VITE_PORT = 3301
#mode
VITE_GLOB_APP_RUN_TYPE = saas
# spa-title
VITE_GLOB_APP_TITLE = hx-ai-intelligent Depositor
# spa shortname
VITE_GLOB_APP_SHORT_NAME = hx-ai-intelligent-depositor

View File

@@ -2,7 +2,7 @@
VITE_USE_MOCK = true VITE_USE_MOCK = true
# public path # public path
VITE_PUBLIC_PATH = / VITE_PUBLIC_PATH = /hx-ai-intelligent/
# Cross-domain proxy, you can configure multiple # Cross-domain proxy, you can configure multiple
# Please note that no line breaks http://100.73.70.51 # Please note that no line breaks http://100.73.70.51

View File

@@ -2,7 +2,7 @@
VITE_USE_MOCK = true VITE_USE_MOCK = true
# public path # public path
VITE_PUBLIC_PATH = / VITE_PUBLIC_PATH = /hx-ai-intelligent/
# Delete console # Delete console
VITE_DROP_CONSOLE = true VITE_DROP_CONSOLE = true

View File

@@ -0,0 +1 @@
0.0.1

View File

View File

@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/projectIcon.svg" />
<meta name="referrer" content="never" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- <script type="text/javascript">
window._AMapSecurityConfig = {
securityJsCode: '09e43004c09d39c0e61f8fd65d5e6a5a',
};
</script> -->
<title>AI智能BAS系统</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="./src/main.ts"></script>
</body>
</html>

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 810 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

View File

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 147 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36">
<g id="组_23402" data-name="组 23402" transform="translate(-959.12 -738.12)">
<rect id="矩形_16530" data-name="矩形 16530" width="36" height="36" transform="translate(959.12 738.12)" fill="none"/>
<g id="组_23400" data-name="组 23400" transform="translate(960.956 739.956)">
<path id="路径_30576" data-name="路径 30576" d="M207.674,163.872v-9.284a2.553,2.553,0,0,0-1.179-2.063l-8.056-4.634a2.417,2.417,0,0,0-2.358,0l-8.023,4.65a2.38,2.38,0,0,0-1.179,2.063v9.333A2.553,2.553,0,0,0,188.059,166l8.056,4.585a2.417,2.417,0,0,0,2.358,0l8.056-4.634A2.331,2.331,0,0,0,207.674,163.872Z" transform="translate(-181.117 -142.881)" fill="#4388fb" opacity="0.2"/>
<path id="路径_30577" data-name="路径 30577" d="M265.893,314.283h-2.718l-.884-2.653h-4.224l-.884,2.653h-2.718l4.224-11.625h2.9Zm-4.093-4.617-1.326-4.044a9.365,9.365,0,0,1-.2-1.015h-.065a5.831,5.831,0,0,1-.2,1.015l-1.326,4.044Zm8.072-7.073v11.625h-2.456V302.592Z" transform="translate(-246.539 -292.932)" fill="#4388fb"/>
<path id="路径_30578" data-name="路径 30578" d="M36.685,20.095a.9.9,0,0,0-.884.884v2.472a1.535,1.535,0,0,1-.77,1.294L23.7,31.262a1.422,1.422,0,0,1-1.523,0l-11.33-6.517a1.456,1.456,0,0,1-.77-1.294V20.177a2.409,2.409,0,0,0-1-4.6,2.425,2.425,0,0,0-2.423,2.407,2.391,2.391,0,0,0,1.637,2.276v3.176a3.268,3.268,0,0,0,1.637,2.816l11.33,6.582a3.244,3.244,0,0,0,1.637.409,3.471,3.471,0,0,0,1.637-.475l11.281-6.517a3.268,3.268,0,0,0,1.637-2.816V20.963A.76.76,0,0,0,36.685,20.095Zm.884-6.942V10.287a3.268,3.268,0,0,0-1.637-2.816L24.585.954a3.284,3.284,0,0,0-3.291,0L9.947,7.471A3.268,3.268,0,0,0,8.31,10.287v2.227a.884.884,0,1,0,1.768,0V10.287a1.535,1.535,0,0,1,.77-1.294l11.33-6.517a1.422,1.422,0,0,1,1.523,0L34.982,9.059a1.456,1.456,0,0,1,.77,1.294v2.734a2.4,2.4,0,1,0,1.817.065Z" transform="translate(-6.656 -0.512)" fill="#4388fb"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,202 @@
<template>
<a-config-provider :locale="locale">
<router-view />
</a-config-provider>
</template>
<script lang="ts">
import { defineComponent, watch, ref } from 'vue';
import zhCN from 'ant-design-vue/es/locale/zh_CN';
import { useRouter } from 'vue-router';
import Cookies from 'js-cookie';
import { message } from 'ant-design-vue';
export default defineComponent({
name: 'App',
setup() {
const router = useRouter();
const cachedViews = ['Status'];
window.localStorage.setItem('mapKey', JSON.stringify({ type: 'tmap', url: '' }));
// watch(
// () => router.currentRoute.value,
// (e) => {
// // if (Cookies.get('nervsid') === undefined && e.fullPath !== '/login') {
// // message.warn('登陆信息已过期,请重新登录!', 1);
// // router.push('/login');
// // }
// // } else {
// // if (Cookies.get('nervsid') !== undefined && e === '/login') {
// // let url = window.sessionStorage.getItem('url');
// // url === null ? window.sessionStorage.setItem('url', '/doorway/visitor/audit') : '';
// // router.push(url === null ? '/doorway' : url);
// // }
// // }
// }
// );
return {
cachedViews,
locale: zhCN,
};
},
});
</script>
<style lang="less" scoped>
// :deep(.ns-content) {
// // padding-top: 80px !important;
// }
// #app {
// width: 100%;
// height: 100%;
// }
// :deep(.ant-menu-title-content) {
// background: unset !important;
// z-index: 9 !important;
// }
// :deep(.ns-left-menu) {
// .ant-menu-item-selected {
// // color: #fff !important;
// background: @primary-color;
// border-radius: 12px;
// // height: 40px;
// // line-height: 40px;
// padding: 5px @ns-gap;
// position: relative;
// a {
// color: @white !important;
// }
// }
// .ant-menu-item-active,
// .ant-submenu-item-active {
// // color: rgba(@primary-color, 0.1) !important;
// }
// }
// :deep(.ant-menu-light.ant-menu-horizontal > .ant-menu-item:hover) {
// // background: @primary-color;
// }
// // :deep(.ant-menu-inline .ant-menu-submenu-title) {
// // color: rgba(255, 255, 255, 0.9) !important;
// // }
// :deep(.ns-left-menu .ant-layout-sider-children .ant-menu-sub.ant-menu-inline) {
// // position: relative;
// // &::before {
// // display: flex;
// // width: 2px;
// // height: calc(100% - 40px);
// // position: absolute;
// // top: 20px;
// // left: 20px;
// // content: '';
// // background-color: rgba(255, 255, 255, 0.2);
// // }
// }
// //*************************含tab的 list列表样式 */
// :deep(.tabListTable) {
// .ns-table-title {
// text-align: left;
// height: 46px;
// line-height: 46px;
// font-size: 18px;
// font-weight: bold;
// user-select: text;
// padding-left: 16px;
// background: #fff;
// width: calc(100% + 32px);
// margin-left: -16px;
// }
// .tabs-list {
// overflow: visible !important;
// }
// .ant-tabs-nav {
// width: calc(100% + 32px);
// margin-left: -16px !important;
// background: #fff;
// }
// .ant-tabs-nav-wrap {
// padding: 0 16px;
// }
// }
// //*********************详情页返回修改 */
// :deep(.nsDetailView) {
// min-height: 100%;
// height: 100%;
// .ns-detail-content {
// padding: 0px 24px;
// border-top: 16px solid #e5ebf0;
// }
// .ant-descriptions-item-label {
// color: rgba(0, 0, 0, 0.5);
// font-family: PingFang SC;
// font-size: 14px;
// }
// .ant-descriptions-item-content {
// color: rgba(0, 0, 0, 0.95);
// font-family: PingFang SC;
// font-size: 14px;
// }
// .ant-descriptions-title {
// &::after {
// content: '';
// width: 75px;
// height: 7px;
// display: block;
// background: linear-gradient(90deg, #537fff 0%, #fff 82.67%);
// margin-left: 2px;
// margin-top: -2px;
// }
// }
// .ant-descriptions-row > th,
// .ant-descriptions-row > td {
// padding-bottom: 8px;
// }
// .ns-page-header {
// margin-bottom: 0 !important;
// padding-top: 7px !important;
// padding-bottom: 7px !important;
// width: calc(100% + 32px);
// margin-left: -16px;
// .title {
// cursor: pointer;
// font-size: 18px !important;
// }
// }
// .ant-descriptions-header {
// margin: 16px 0 16px 0 !important;
// .ant-descriptions-title {
// line-height: 16px;
// font-size: 16px;
// }
// }
// }
// :deep(.ns-detail .ant-descriptions-header .descriptions-title) {
// &:after {
// content: '';
// width: 75px;
// height: 7px;
// display: block;
// background: linear-gradient(90deg, @primary-color 0%, #fff 82.67%);
// margin-left: 2px;
// margin-top: -2px;
// }
// }
// :deep(.ant-descriptions-header .descriptions-title) {
// &:after {
// content: '';
// width: 75px;
// height: 7px;
// display: block;
// background: linear-gradient(90deg, @primary-color 0%, #fff 82.67%);
// margin-left: 2px;
// margin-top: -2px;
// }
// }
</style>

View File

@@ -0,0 +1,11 @@
import { BASE_URL } from './index';
export enum device {
queryDeviceTree = `${BASE_URL}/deviceInfo/queryDeviceTree`, // 左侧树
queryDevicePage = `${BASE_URL}/deviceInfo/queryDevicePage`, // 列表
dropArea = `${BASE_URL}/deviceInfo/dropArea`, // 查询下拉区域
}
export enum group {
queryDeviceGroupTree = `${BASE_URL}/deviceGroup/queryDeviceGroupTree`, // 左侧树
creatOrUpdate = `${BASE_URL}/deviceGroup/creatOrUpdate`, // 左侧树节点新增编辑
}

View File

@@ -4,3 +4,6 @@
export const apiModule = { export const apiModule = {
parking: ['User', 'CurrentUser', 'Organizational'], parking: ['User', 'CurrentUser', 'Organizational'],
}; };
export const BASE_URL = '/carbon-smart';
export const dict = `${BASE_URL}/client/dict/listByKey`;

View File

@@ -0,0 +1,37 @@
import { BASE_URL } from './index';
export enum permission {
add = `${BASE_URL}/admin/permission/save`,
queryOrgPermission = `${BASE_URL}/api/dept/queryOrgPermission`,
queryRolePermission = `${BASE_URL}/api/dept/queryRolePermission`,
queryFilterDeptPermission = `${BASE_URL}/api/dept/queryFilterDeptPermission`,
queryDeptPermission = `${BASE_URL}/api/dept/queryDeptPermission`,
queryDeptPermissionFilter = `${BASE_URL}/api/dept/queryDeptPermissionFilter`,
queryRolePermissionFilter = `${BASE_URL}/api/dept/queryRolePermissionFilter`,
}
export enum origanizemanage {
userList = '/carbon-smart/api/user/queryUserByPage',
addUser = '/carbon-smart/api/user/save',
editUser = '/carbon-smart/api/user/edit',
frozen = '/carbon-smart/api/user/frozen',
resetPwd = '/carbon-smart/api/user/resetPwd',
del = '/carbon-smart/api/user/del',
batchDel = '/carbon-smart/api/user/batchDel',
queryOrgTree = '/carbon-smart/api/user/queryOrgTree',
queryDeptTree = '/carbon-smart/api/user/queryDeptTree',
queryUserPerList = '/carbon-smart/api/user/queryUserPerList',
}
export enum department {
queryDeptTree = `${BASE_URL}/api/dept/queryDeptTree`,
deptSave = `${BASE_URL}/api/dept/save`,
deptEdit = `${BASE_URL}/api/dept/edit`,
deptDel = `${BASE_URL}/api/dept/del`,
addPermission = `${BASE_URL}/api/dept/addPermission`,
addRolePermission = `${BASE_URL}/api/dept/addRolePermission`,
delRole = `${BASE_URL}/api/dept/delRole`,
addRole = `${BASE_URL}/api/dept/addRole`,
editRole = `${BASE_URL}/api/dept/editRole`,
queryRoleTree = `${BASE_URL}/api/dept/queryRoleTree`,
}

View File

@@ -8,13 +8,10 @@ enum Api {
USER_INFO = 'api/web/objs/CurrentUser', //获取用户信息 USER_INFO = 'api/web/objs/CurrentUser', //获取用户信息
USER_RESOURCE = '/api/community/objs/User/Resource', //获取用户资源 USER_RESOURCE = '/api/community/objs/User/Resource', //获取用户资源
} }
export const userLogin = (data: RoomListModel) => http.post(Api.USER_LOGIN, data); export const userLogin = (data) => http.post(Api.USER_LOGIN, data);
export const userInfo = () => http.get(Api.USER_INFO); export const userInfo = () => http.get(Api.USER_INFO);
export const userResource = () => http.get(Api.USER_RESOURCE); export const userResource = () => http.get(Api.USER_RESOURCE);
/** /**
* @description * @description
* @property `[fatherRegionUuid]` * @property `[fatherRegionUuid]`
*/ */
interface RoomListModel {
data: string;
}

View File

@@ -0,0 +1,88 @@
<template>
<ns-modal
ref="modalRef"
v-bind="extraModalConfig"
destroyOnClose
v-model:visible="visible"
:title="title"
:okButtonProps="buttonProps"
@ok="handleOk">
<ns-form ref="formRef" :schemas="schemas" :model="formData" formLayout="formVertical" />
</ns-modal>
</template>
<script lang="ts" setup>
import { computed, ref, toRefs, watch } from 'vue';
import { HttpRequestConfig, NsMessage, useApi } from '/nerv-lib/saas';
import { useRoute } from 'vue-router';
type Props = {
title?: string;
schemas: Array<any>;
api: string | object | Function;
data?: object;
extraModalConfig?: object;
};
const route = useRoute();
const { httpRequest } = useApi();
const props = withDefaults(defineProps<Props>(), {
title: '新增',
});
const { schemas } = toRefs(props);
const formData = ref();
watch(
() => props?.data,
(val) => {
formData.value = val;
},
{
immediate: true,
deep: true,
},
);
const modalRef = ref();
const formRef = ref();
const visible = ref(false);
const validateResult = computed(() => {
return !formRef.value?.validateResult;
});
const toggle = () => {
visible.value = !visible.value;
};
const setLoading = (loading = true) => {
buttonProps.value.loading = loading;
};
const handleOk = () => {
setLoading(true);
formRef.value
.triggerSubmit()
.then((data: any) => {
const { api } = props;
const requestConfig: HttpRequestConfig = { method: 'POST' };
const { params } = route;
httpRequest({ api, params: data, pathParams: params, requestConfig })
.then(() => {
NsMessage.success('操作成功', 1, () => {
toggle();
});
})
.finally(() => {
setLoading(false);
});
})
.catch(() => {});
};
const buttonProps = ref({
disabled: validateResult,
loading: false,
});
defineExpose({
toggle,
});
</script>
<style lang="less"></style>

View File

@@ -0,0 +1,115 @@
import { http } from '/nerv-lib/saas';
import { permission } from '/@/api/origanizemanage';
import { appConfigStore } from '/nerv-lib/saas/store/modules/app-config';
import { authorizationService } from '/nerv-base/store/modules/authorization-service';
import { get } from 'lodash-es';
import { computed, ref, toRef } from 'vue';
const ORGID = sessionStorage.getItem('ORGID') ? Number(sessionStorage.getItem('ORGID')) : '';
const selectDefaultValue = ref(ORGID);
const transform = (data, map) => {
return Object.keys(map).reduce((pre, cur) => {
pre[cur] = data[map[cur]];
return pre;
}, {});
};
export const appConfig = {
projectType: 'web',
baseApi: '/api',
projectName: '济阳站_AI智能BAS系统',
enablePermissions: false,
// themeColor: '#eee',
siderPosition: 'left',
baseHeader: '/parkingManage',
baseRouter: '/parkingManage/parkingLotManage',
themeConfig: {
bgImageUrl: `${import.meta.env.VITE_PUBLIC_PATH}/asset/image/login/background.png`,
logoLessUrl: `${import.meta.env.VITE_PUBLIC_PATH}/asset/image/headerIcon.png`,
},
// userCustomRouterGuard: (to, from, next, whiteNameList, authorizationStore, appConfig) => {
// console.log({ to, from, next, whiteNameList, authorizationStore, appConfig }, 'routeConfig');
// next();
// },
// customUpdatePwd: () => import('/@/view/updatePassword/updatePassword.vue'),
headerSlotConfig: {
component: 'NsSelectApi',
componentProps: {
style: { width: '200px', color: '#2778FF', marginRight: '10px' },
api: '/carbon-smart/user/login/logInInfo',
size: 'large',
defaultValue: selectDefaultValue,
// autoSelectFirst: true,
placeholder: '请选择',
onSelect: async (cur, record) => {
console.log(cur, record);
const configStore = appConfigStore();
const useAuthorization = authorizationService();
sessionStorage.setItem('ORGID', record.orgId);
const res = await configStore.userResource({ data: record });
useAuthorization.updateUserResource(res.data);
// value.value = cur;
},
resultField: 'data.linkList',
labelField: 'orgName',
valueField: 'orgId',
immediate: true,
dropdownReload: true,
},
},
timeout: 60 * 1000,
userLoginApi: (params) => {
return http.post('/carbon-smart/user/login', { ...params });
},
userResourceApi: (params) => {
const { orgId } = get(params, 'data') || { orgId: '' };
const finalId = orgId || ORGID;
// 解决初始化登录select无初始值的问题
selectDefaultValue.value = finalId;
const userInfo = JSON.parse(sessionStorage.getItem('userInfo')!);
const ownOrgInfo = userInfo.linkList?.filter(({ orgId: id }) => id === finalId)[0];
return http.post('/carbon-smart/user/login/logInPermission', ownOrgInfo).then((res) => {
return res;
});
},
userInfoApi: () => {
return http.post('/carbon-smart/user/login/logInInfo').then((res) => {
const info = res.data;
const trD = transform(info, {
accountCode: 'userId',
accountName: 'accountNo',
accountRealName: 'accountNo',
orgId: 'orgId',
orgName: 'orgName',
projectId: 'projectId',
linkList: 'linkList',
permissionVos: 'permissionVos',
});
sessionStorage.setItem('ORGID', info.orgId);
selectDefaultValue.value = info.orgId;
return { data: { ...trD } };
});
},
useHistoryTag: false,
// 修改密码配置
updatePassWordInfo: {
title: '修改密码',
subtitle: 'huaxing平台',
api: '/api/web/objs/User/changePassword',
},
// headerBellInfo: {
// isShow: true,
// api: '/api/web/objs/bulletin/readCount',
// toRouterName: 'NoticeManageIndex',
// },
resourceInfo: {
api: permission.add,
},
};

View File

@@ -0,0 +1,9 @@
/**
* Configure and register global directives
*/
import type { App } from 'vue';
import { setupPermissionDirective } from './permission';
export function setupGlobDirectives(app: App) {
setupPermissionDirective(app);
}

View File

@@ -0,0 +1,46 @@
/**
* Global authority directive
* Used for fine-grained control of component permissions
* @Example v-auth="name"
*/
import type { App, Directive, DirectiveBinding } from 'vue';
import { authorizationService } from '/nerv-lib/saas/store/modules/authorization-service';
function isAuth(el: Element, binding: any) {
const { checkPermission, checkAllPermission, checkPermissionRouter } = authorizationService();
const { value, modifiers } = binding;
if (!value) return;
//操作按钮
if (modifiers.op) {
if (!checkPermission(value)) {
el.parentNode?.removeChild(el);
}
}
// 全部
if (modifiers.all) {
if (!checkAllPermission(value)) {
el.parentNode?.removeChild(el);
}
}
// 路由
if (modifiers.route) {
if (!checkPermissionRouter(value)) {
el.parentNode?.removeChild(el);
}
}
}
const mounted = (el: Element, binding: DirectiveBinding<string | string[]>) => {
isAuth(el, binding);
};
const authDirective: Directive = {
mounted,
};
export function setupPermissionDirective(app: App) {
app.directive('auth', authDirective);
}
export default authDirective;

View File

@@ -1,3 +1,5 @@
import { routerConfig } from '/nerv-lib/saas/config/router.config';
export enum ResultEnum { export enum ResultEnum {
SUCCESS = 0, SUCCESS = 0,
ERROR = 1, ERROR = 1,
@@ -6,10 +8,10 @@ export enum ResultEnum {
} }
export enum RequestEnum { export enum RequestEnum {
GET = 'GET', GET = 'POST',
POST = 'POST', POST = 'POST',
PUT = 'PUT', PUT = 'POST',
DELETE = 'DELETE', DELETE = 'POST',
} }
export enum ContentTypeEnum { export enum ContentTypeEnum {
@@ -20,3 +22,11 @@ export enum ContentTypeEnum {
// form-data upload // form-data upload
FORM_DATA = 'multipart/form-data;charset=UTF-8', FORM_DATA = 'multipart/form-data;charset=UTF-8',
} }
export const errCodeMap = new Map<number, any>([
[13, ''],
[1, ''],
[11, ''],
[3005, ''],
[10086, () => routerConfig.logout()],
]);

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="2.5601806640625" height="11.380615234375" viewBox="0 0 2.5601806640625 11.380615234375" fill="none">
<path d="M1.26462 2.52904C1.72366 2.54024 2.15274 2.30174 2.38556 1.90594C2.61838 1.51015 2.61838 1.01924 2.38556 0.623459C2.15274 0.227661 1.72366 -0.0108337 1.26462 0.00037384C0.578369 0.0171204 0.0307617 0.578232 0.0307617 1.26469C0.0307617 1.95116 0.578369 2.51227 1.26462 2.52904Z" fill="#5A5A68" >
</path>
<path d="M0 5.69049C0 6.38898 0.566193 6.9552 1.26471 6.9552C1.96317 6.9552 2.52936 6.38898 2.52936 5.69049C2.52936 4.99204 1.96317 4.42578 1.26471 4.42578C0.566193 4.42578 0 4.99204 0 5.69049Z" fill="#5A5A68" >
</path>
<path d="M1.26471 11.3805C1.9632 11.3805 2.52942 10.8143 2.52942 10.1158C2.52942 9.4173 1.9632 8.85107 1.26471 8.85107C0.566223 8.85107 0 9.4173 0 10.1158C0 10.8143 0.566223 11.3805 1.26471 11.3805Z" fill="#5A5A68" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 961 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="11.989990234375" height="11.1085205078125" viewBox="0 0 11.989990234375 11.1085205078125" fill="none">
<path d="M11.4607 7.93429L10.704 7.93429L10.704 6.36826C10.704 5.93552 10.3055 5.58339 9.81754 5.58339L6.4082 5.58339L6.4082 3.96776L7.62086 3.96776C7.91499 3.96776 8.15565 3.74458 8.15565 3.47179L8.15565 0.495972C8.15565 0.223183 7.91499 0 7.62086 0L4.41207 0C4.11794 0 3.87727 0.223183 3.87727 0.495972L3.87727 3.47179C3.87727 3.74458 4.11794 3.96776 4.41207 3.96776L5.57927 3.96776L5.57927 5.58339L2.18999 5.58339C1.70065 5.58339 1.30357 5.93552 1.30357 6.36826L1.30357 7.93429L0.534798 7.93429C0.240654 7.93429 0 8.15747 0 8.43025L0 10.6125C0 10.8853 0.240654 11.1085 0.534798 11.1085L2.8879 11.1085C3.18204 11.1085 3.4227 10.8853 3.4227 10.6125L3.4227 8.43025C3.4227 8.15747 3.18204 7.93429 2.8879 7.93429L2.13116 7.93429L2.13116 6.37321C2.13651 6.36578 2.15657 6.35213 2.18865 6.35213L5.57793 6.35213L5.57793 7.93429L4.8252 7.93429C4.53107 7.93429 4.29041 8.15747 4.29041 8.43025L4.29041 10.6125C4.29041 10.8853 4.53107 11.1085 4.8252 11.1085L7.17831 11.1085C7.47245 11.1085 7.7131 10.8853 7.7131 10.6125L7.7131 8.43025C7.7131 8.15747 7.47245 7.93429 7.17831 7.93429L6.40553 7.93429L6.40553 6.35213L9.81352 6.35213C9.84561 6.35213 9.86566 6.36578 9.87102 6.37321L9.87102 7.93429L9.10224 7.93429C8.80811 7.93429 8.56744 8.15747 8.56744 8.43026L8.56744 10.6125C8.56744 10.8853 8.80811 11.1085 9.10224 11.1085L11.4553 11.1085C11.7495 11.1085 11.9901 10.8853 11.9901 10.6125L11.9901 8.43026C11.9955 8.15747 11.7548 7.93429 11.4607 7.93429Z" fill="#4388FB" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="11.0960693359375" height="11.361328125" viewBox="0 0 11.0960693359375 11.361328125" fill="none">
<path d="M5.97288 0.0889032L10.8515 3.28616C11.0042 3.38656 11.0961 3.55643 11.0961 3.73899L11.0961 10.8194C11.096 11.1182 10.8536 11.3604 10.5548 11.3604L0.541595 11.3604C0.242524 11.3606 1.90735e-06 11.1182 0 10.8191L0 3.74666C0 3.56014 0.0961657 3.38656 0.254683 3.28776L5.38954 0.0820341C5.56864 -0.0296883 5.79635 -0.02711 5.97288 0.0886391L5.97288 0.0889032ZM7.84865 7.26703L6.76599 7.26703C6.31761 7.26703 5.95412 7.63051 5.95412 8.07889L5.95412 9.18401C5.95412 9.63239 6.31761 9.99588 6.76599 9.99588L7.84838 9.99588C8.29677 9.99588 8.66025 9.63239 8.66025 9.18401L8.66025 8.07916C8.66025 7.63078 8.29677 7.2673 7.84838 7.2673L7.84865 7.26703ZM7.84865 3.71945L6.76599 3.71945C6.31761 3.71945 5.95412 4.08293 5.95412 4.53131L5.95412 5.63643C5.95412 6.08481 6.31761 6.4483 6.76599 6.4483L7.84838 6.4483C8.29677 6.4483 8.66025 6.08481 8.66025 5.63643L8.66025 4.53131C8.66025 4.08293 8.29677 3.71945 7.84838 3.71945L7.84865 3.71945Z" fill="#4388FB" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 251 B

View File

Before

Width:  |  Height:  |  Size: 923 B

After

Width:  |  Height:  |  Size: 923 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12.0859375" height="10.474609375" viewBox="0 0 12.0859375 10.474609375" fill="none">
<path d="M11.6831 9.66875L11.2802 9.66875L11.2802 4.02865C11.2802 3.14235 10.5551 2.41719 9.66875 2.41719L7.25156 2.41719L7.25156 9.26588C7.25156 9.49149 7.0743 9.66875 6.8487 9.66875C6.62309 9.66875 6.44583 9.49149 6.44583 9.26588L6.44583 1.61147C6.44583 0.725159 5.72068 0 4.83437 0L2.41719 0C1.53089 0 0.805729 0.725159 0.805729 1.61147L0.805729 9.66875L0.402865 9.66875C0.17726 9.66875 0 9.84601 0 10.0716C0 10.2972 0.17726 10.4745 0.402865 10.4745L11.6831 10.4745C11.9087 10.4745 12.0859 10.2972 12.0859 10.0716C12.0859 9.84601 11.9087 9.66875 11.6831 9.66875ZM4.43151 8.0573L2.82005 8.0573C2.59445 8.0573 2.41719 7.88004 2.41719 7.65443C2.41719 7.42883 2.59445 7.25156 2.82005 7.25156L4.43151 7.25156C4.65711 7.25156 4.83437 7.42883 4.83437 7.65443C4.83437 7.88004 4.65711 8.0573 4.43151 8.0573ZM4.43151 5.64011L2.82005 5.64011C2.59445 5.64011 2.41719 5.46284 2.41719 5.23724C2.41719 5.01164 2.59445 4.83438 2.82005 4.83438L4.43151 4.83438C4.65711 4.83438 4.83437 5.01164 4.83437 5.23724C4.83437 5.46284 4.65711 5.64011 4.43151 5.64011ZM4.43151 3.22292L2.82005 3.22292C2.59445 3.22292 2.41719 3.04565 2.41719 2.82005C2.41719 2.59445 2.59445 2.41719 2.82005 2.41719L4.43151 2.41719C4.65711 2.41719 4.83437 2.59445 4.83437 2.82005C4.83437 3.04565 4.65711 3.22292 4.43151 3.22292ZM10.0716 8.0573L8.46016 8.0573C8.23455 8.0573 8.05729 7.88004 8.05729 7.65443C8.05729 7.42883 8.23455 7.25156 8.46016 7.25156L10.0716 7.25156C10.2972 7.25156 10.4745 7.42883 10.4745 7.65443C10.4745 7.88004 10.2972 8.0573 10.0716 8.0573ZM10.0716 5.64011L8.46016 5.64011C8.23455 5.64011 8.05729 5.46284 8.05729 5.23724C8.05729 5.01164 8.23455 4.83438 8.46016 4.83438L10.0716 4.83438C10.2972 4.83438 10.4745 5.01164 10.4745 5.23724C10.4745 5.46284 10.2972 5.64011 10.0716 5.64011Z" fill="#4388FB" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16.1484375" height="19.0057373046875" viewBox="0 0 16.1484375 19.0057373046875" fill="none">
<path d="M13.6104 6.18792L13.3798 6.18792L13.3798 5.08296C13.3798 2.28066 10.9989 0 8.07392 0C5.14905 0 2.76692 2.28066 2.76692 5.08296L2.76692 6.18792L2.53533 6.18792C1.13511 6.19047 0 7.27711 0 8.61894L0 16.5746C0 17.9138 1.13743 19.0057 2.53533 19.0057L13.6104 19.0057C15.0071 19.0057 16.1479 17.9138 16.1479 16.5746L16.1479 8.61894C16.1479 7.27995 15.0071 6.18792 13.6104 6.18792ZM4.15229 5.08296C4.15229 3.00999 5.90854 1.32588 8.07392 1.32588C10.2371 1.32588 11.9946 3.00999 11.9946 5.08296L11.9946 6.18792L4.15229 6.18792L4.15229 5.08296ZM14.7628 16.5746C14.7628 16.8678 14.6419 17.149 14.4251 17.3558C14.2097 17.563 13.9157 17.6796 13.6104 17.6796L2.53533 17.6796C2.22998 17.6796 1.93599 17.563 1.72053 17.3558C1.50274 17.149 1.38294 16.8678 1.38294 16.5746L1.38294 8.61894C1.38294 8.00865 1.89912 7.51386 2.53533 7.51386L13.6104 7.51386C13.9157 7.51386 14.2097 7.63041 14.4251 7.83736C14.6419 8.04483 14.7628 8.32595 14.7628 8.61894L14.7628 16.5746ZM7.3809 10.8286C7.3809 10.4627 7.68973 10.1659 8.07347 10.1659C8.45617 10.1659 8.76488 10.4627 8.76488 10.8286L8.76488 14.3649C8.76488 14.7309 8.45617 15.0276 8.07347 15.0276C7.68973 15.0276 7.3809 14.7309 7.3809 14.3649L7.3809 10.8286Z" fill-rule="evenodd" fill="#7C7C7C" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="15.4384765625" height="14.517333984375" viewBox="0 0 15.4384765625 14.517333984375" fill="currentColor">
<path d="M6.32606 8.89293L1.26484 8.89293C0.569183 8.89293 0 8.31818 0 7.61136L0 1.28157C0 0.574753 0.569183 0 1.26484 0L6.32606 0C7.02172 0 7.5909 0.574753 7.5909 1.28157L7.5909 7.61136C7.5909 8.31631 7.02358 8.89293 6.32606 8.89293ZM14.4415 2.05164L11.2533 2.05164C10.7046 2.05164 10.2564 1.59779 10.2564 1.04163L10.2564 1.01001C10.2564 0.453857 10.7046 0 11.2533 0L14.4415 0C14.9902 0 15.4385 0.453857 15.4385 1.01001L15.4385 1.04163C15.4366 1.59779 14.9865 2.05164 14.4415 2.05164ZM14.4415 5.44624L11.2533 5.44624C10.7046 5.44624 10.2564 4.99239 10.2564 4.43623L10.2564 4.40462C10.2564 3.84846 10.7046 3.39459 11.2533 3.39459L14.4415 3.39459C14.9902 3.39459 15.4385 3.84846 15.4385 4.40462L15.4385 4.43623C15.4366 4.99239 14.9865 5.44624 14.4415 5.44624ZM14.4415 8.84457L11.2533 8.84457C10.7046 8.84457 10.2564 8.39072 10.2564 7.83456L10.2564 7.80295C10.2564 7.24678 10.7046 6.79292 11.2533 6.79292L14.4415 6.79292C14.9902 6.79292 15.4385 7.24678 15.4385 7.80295L15.4385 7.83456C15.4366 8.39072 14.9865 8.84457 14.4415 8.84457ZM14.1718 14.5174L1.26484 14.5174C0.569183 14.5174 0 13.9426 0 13.2358L0 11.4018C0 10.6949 0.569183 10.1202 1.26484 10.1202L14.1718 10.1202C14.8674 10.1202 15.4366 10.6949 15.4366 11.4018L15.4366 13.2358C15.4366 13.9426 14.8674 14.5174 14.1718 14.5174Z" fill="currentColor" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="13.654296875" height="14.517303466796875" viewBox="0 0 13.654296875 14.517303466796875" fill="none">
<path d="M7.7187 0.222214L12.8503 2.95256C13.345 3.21599 13.6542 3.73064 13.6546 4.29111L13.6546 10.2367C13.6546 10.8 13.3449 11.3159 12.8474 11.5781L7.71483 14.2969C7.15997 14.5908 6.49557 14.5908 5.94072 14.2969L0.80719 11.5791C0.31076 11.3161 0.000213623 10.8004 0 10.2386L0 4.29208C0 3.73071 0.309738 3.21582 0.803329 2.95158L5.93687 0.222214C6.49385 -0.0740738 7.1617 -0.0740738 7.7187 0.222214ZM9.69315 4.92796L6.83699 6.57527L6.81763 6.57527L3.96243 4.92796C3.63583 4.73979 3.21854 4.85202 3.03038 5.17863C2.84222 5.50523 2.95445 5.92252 3.28105 6.11067L6.14592 7.76573L6.14592 10.6712C6.14592 11.0169 6.40453 11.308 6.74785 11.3487L6.82828 11.3536C7.20512 11.3536 7.5106 11.0481 7.5106 10.6712L7.5106 7.76378L10.3755 6.11067C10.7021 5.92197 10.8139 5.50426 10.6252 5.17766C10.4365 4.85106 10.0188 4.73926 9.69217 4.92795L9.69315 4.92796Z" fill="currentColor" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="17.279296875" height="14.6025390625" viewBox="0 0 17.279296875 14.6025390625" fill="currentColor">
<path d="M10.007 14.5797L10.007 10.2525L7.28672 10.2525L7.28672 14.5913C7.20171 14.5957 7.13389 14.6022 7.06605 14.6022C5.78165 14.6022 4.49657 14.6029 3.21208 14.6022C2.77071 14.6022 2.47391 14.3191 2.47196 13.8503C2.46304 12.07 2.46575 10.2881 2.47392 8.50777C2.47392 8.41387 2.54524 8.29381 2.6172 8.22973C3.77963 7.20271 4.94816 6.18224 6.11472 5.16097C6.89124 4.48119 7.66712 3.80132 8.44361 3.12223C8.50395 3.0698 8.56569 3.01889 8.64169 2.95401C9.10501 3.35876 9.56628 3.76126 10.0269 4.16451C11.5463 5.49436 13.0638 6.82713 14.5874 8.15192C14.7512 8.2938 14.8211 8.4379 14.8197 8.66717C14.8101 10.3574 14.8128 12.0481 14.8163 13.7375C14.8169 14.0447 14.745 14.3119 14.4893 14.4815C14.3968 14.5432 14.2796 14.5965 14.1734 14.5972C12.8102 14.6044 11.4469 14.6007 10.0845 14.6C10.0646 14.6001 10.0439 14.5906 10.007 14.5797L10.007 14.5797ZM12.0542 2.59968C12.0542 1.88561 12.0536 1.22617 12.0542 0.567406C12.0549 0.146721 12.1494 0.046257 12.5449 0.0455475C13.159 0.0455475 13.7732 0.0448761 14.3873 0.046257C14.7039 0.0470581 14.8135 0.165627 14.8142 0.521568C14.8157 1.93143 14.819 3.34212 14.8101 4.752C14.8087 4.96963 14.8663 5.10934 15.0273 5.24763C15.7004 5.82269 16.3604 6.41369 17.0239 7.00109C17.3494 7.28937 17.3576 7.42977 17.0835 7.77266C16.9177 7.98081 16.7553 8.19265 16.588 8.40011C16.3824 8.65698 16.2124 8.67303 15.9664 8.45463C13.6107 6.36707 11.2551 4.27808 8.89869 2.18983C8.81712 2.11777 8.73353 2.04712 8.6382 1.96411C8.10844 2.43295 7.58274 2.89661 7.05841 3.36166C5.14625 5.05622 3.23403 6.7514 1.32181 8.44586C1.06275 8.67586 0.901754 8.66209 0.683794 8.39129C0.503304 8.16627 0.324193 7.94017 0.146461 7.71297C-0.0605403 7.44801 -0.0522817 7.27692 0.19785 7.05352C1.26495 6.10507 2.33488 5.16026 3.40405 4.21403C4.82891 2.9526 6.25519 1.6927 7.67941 0.4291C8.32567 -0.143761 8.95488 -0.143761 9.60259 0.433456C10.3681 1.11544 11.1358 1.79462 11.9027 2.47441C11.9391 2.50652 11.9775 2.5363 12.0542 2.59968L12.0542 2.59968Z" fill="currentColor" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="19" height="20.010009765625" viewBox="0 0 19 20.010009765625" fill="none">
<path d="M13.3 5.95C13.3 3.71639 11.4895 1.91 9.26 1.91C7.02904 1.91 5.22 3.71639 5.22 5.95C5.22 8.18291 7.02904 10 9.26 10C11.4907 10 13.3 8.18291 13.3 5.95ZM18.96 18.78C18.9879 18.8668 19 18.954 19 19.05C19 19.5756 18.5742 20.01 18.05 20.01C17.7989 20.01 17.5571 19.9088 17.38 19.73C17.2004 19.5511 17.1 19.3033 17.1 19.05L17.08 19.05C16.8338 15.063 13.5383 11.9 9.5 11.9C5.46167 11.9 2.16878 15.063 1.92 19.05L1.9 19.05C1.9 19.5756 1.47526 20.01 0.95 20.01C0.700244 20.01 0.457124 19.9086 0.28 19.73C0.100434 19.5514 0 19.3035 0 19.05C0 18.9599 0.015708 18.8735 0.04 18.79C0.315269 15.1717 2.59568 12.1213 5.78 10.76C4.2988 9.67791 3.33 7.92778 3.33 5.95C3.33 2.6628 5.99205 0 9.27 0C12.5488 0 15.2 2.6628 15.2 5.95C15.2 7.78701 14.3536 9.5196 12.91 10.64C16.2461 11.9305 18.67 15.0545 18.96 18.78Z" fill="#7C7C7C" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 1002 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M10.4557 18.6706C10.4092 18.6706 10.3627 18.6654 10.3173 18.6549C10.2426 18.6377 8.46434 18.2175 6.67349 16.914C5.61102 16.1408 4.76262 15.2154 4.15213 14.1639C3.38754 12.847 3 11.3377 3 9.67612L3 4.20406C3 3.94798 3.15846 3.71857 3.39803 3.62791L10.2384 1.03976C10.3789 0.986755 10.534 0.986755 10.6745 1.03976L17.5149 3.62788C17.7545 3.7184 17.9132 3.94788 17.9131 4.20406L17.9131 9.67612C17.9131 11.3377 17.5256 12.8474 16.761 14.1639C16.1505 15.2145 15.3021 16.1408 14.2397 16.914C12.4474 18.2165 10.6691 18.6367 10.5942 18.6549C10.5488 18.6654 10.5023 18.6706 10.4557 18.6706ZM4.23244 4.6292L4.23244 9.67612C4.23244 12.2738 5.28627 14.3656 7.36478 15.8929C8.68451 16.8625 10.0281 17.2957 10.4557 17.4171C10.8834 17.2957 12.2273 16.8625 13.547 15.8929C15.6248 14.3656 16.6793 12.2743 16.6793 9.67612L16.6793 4.6292L10.4557 2.27499L4.23244 4.6292Z" fill="#7C7C7C" >
</path>
<path d="M9.49429 12.2693L9.48495 12.2693C9.3183 12.2668 9.15976 12.1969 9.04556 12.0755L7.07401 9.98022C6.84058 9.73248 6.8522 9.34241 7.09992 9.10895C7.34769 8.87552 7.73776 8.88712 7.97119 9.13489L9.5076 10.7691L13.1869 7.08978C13.4275 6.849 13.8177 6.849 14.0584 7.08969C14.2992 7.33041 14.2992 7.72064 14.0584 7.96133L9.9299 12.0886C9.81445 12.2043 9.65771 12.2693 9.49429 12.2693Z" fill="#7C7C7C" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16.21484375" height="13.50872802734375" viewBox="0 0 16.21484375 13.50872802734375" fill="none">
<path d="M8.10415 0C9.84551 0.0632347 11.2034 1.39415 11.1426 2.97804C11.1467 3.44998 11.0312 3.91644 10.805 4.34118L13.2695 6.18327C13.5772 5.96724 13.9542 5.84864 14.343 5.84555C15.4184 5.88545 16.2552 6.70962 16.2133 7.68764C16.2353 8.15778 16.0502 8.61648 15.6992 8.9622C15.3482 9.30793 14.8601 9.51217 14.343 9.52972C13.8259 9.51217 13.3379 9.30793 12.9868 8.9622C12.6358 8.61648 12.4508 8.15778 12.4727 7.68764C12.4714 7.46591 12.5125 7.24566 12.5942 7.03676L10.1298 5.19468C9.72493 5.55505 9.21346 5.80042 8.65782 5.90082L8.65782 8.75605C9.81002 9.04805 10.5971 10.0142 10.5686 11.1016C10.618 12.3849 9.51517 13.462 8.10415 13.5087C6.69582 13.4587 5.59701 12.3826 5.64643 11.1017C5.61473 10.0153 6.39954 9.04848 7.55049 8.75606L7.55049 5.90083C6.99538 5.79909 6.48431 5.55392 6.07856 5.1947L3.62083 7.03678C3.70258 7.24568 3.74371 7.46592 3.74236 7.68765C3.76428 8.15779 3.57925 8.61649 3.22823 8.96222C2.87721 9.30794 2.38914 9.51219 1.87206 9.52974C1.35497 9.51219 0.866907 9.30794 0.515883 8.96222C0.164859 8.61649 -0.020171 8.15779 0.00174713 7.68765C-0.0401125 6.70964 0.796688 5.88547 1.87206 5.84557C2.26084 5.84866 2.63785 5.96725 2.94563 6.18328L5.40335 4.3412C5.1771 3.91646 5.06158 3.44999 5.06575 2.97805C5.0049 1.39416 6.36279 0.0632407 8.10415 0L8.10415 0Z" fill="currentColor" >
</path>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -3,8 +3,17 @@ import App from '/@/App.vue';
import { saasInit } from '/nerv-lib/saas'; import { saasInit } from '/nerv-lib/saas';
import { apiModule } from '/@/api'; import { apiModule } from '/@/api';
import { appConfig } from '/@/config'; import { appConfig } from '/@/config';
import './theme/global.less';
import { LeftOutlined } from '@ant-design/icons-vue';
import { setupGlobDirectives } from '/@/directives';
const app = createApp(App); const app = createApp(App);
app.component('LeftOutlined', LeftOutlined);
// Register global directive
// 注册全局指令
setupGlobDirectives(app);
saasInit({ saasInit({
app, app,
apiModule, apiModule,

View File

@@ -0,0 +1,29 @@
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue');
const equipmentControl = {
path: '/equipmentControl',
name: 'EquipmentControl',
meta: { title: '设备群控', icon: 'shebeiqunkong', index: 4 },
redirect: { name: 'LightManage' },
children: [
{
path: 'lightManage',
name: 'LightManage',
meta: { title: '智能照明', hideChildren: true, icon: 'shebeiqunkong' },
component: Base,
redirect: { name: 'lightManageIndex' },
children: [
{
path: 'index',
name: 'lightManageIndex',
component: () => import('/@/view/equipmentControl/lightingManage/indexs.vue'),
meta: {
title: '智能照明',
keepAlive: true,
// backApi: [],
},
},
],
},
],
};
export default equipmentControl;

View File

@@ -0,0 +1,68 @@
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue');
const equipment = {
path: '/equipmentManage',
name: 'EquipmentManage',
meta: { title: '设备管理', icon: 'shebeiguanli', index: 1 },
redirect: { name: 'Ledger' },
children: [
{
path: 'ledger',
name: 'Ledger',
meta: { title: '设备台账', hideChildren: true, icon: 'shebeiguanli' },
component: Base,
redirect: { name: 'LedgerIndex' },
children: [
{
path: 'index',
name: 'LedgerIndex',
// component: () => import('/nerv-lib/saas/view/menuManage/index.vue'),
component: () => import('/@/view/equipmentManage/ledger/index.vue'),
meta: {
title: '设备台账',
keepAlive: true,
// backApi: [],
},
},
],
},
{
path: 'group',
name: 'Group',
meta: { title: '分组管理', hideChildren: true, icon: 'shebeiguanli' },
component: Base,
redirect: { name: 'GroupIndex' },
children: [
{
path: 'index',
name: 'GroupIndex',
component: () => import('/@/view/equipmentManage/group/index.vue'),
meta: {
title: '分组管理',
keepAlive: true,
// backApi: [],
},
},
],
},
// {
// path: 'energyMapping',
// name: 'EnergyMapping',
// meta: { title: '能耗映射', hideChildren: true, icon: 'shebeiguanli' },
// component: Base,
// redirect: { name: 'EnergyMappingIndex' },
// children: [
// {
// path: 'index',
// name: 'EnergyMappingIndex',
// component: () => import('/@/view/equipmentManage/energyMapping/index.vue'),
// meta: {
// title: '能耗映射',
// keepAlive: true,
// // backApi: [],
// },
// },
// ],
// },
],
};
export default equipment;

View File

@@ -0,0 +1,28 @@
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue');
const home = {
path: '/home',
name: 'home',
meta: { title: '首页', icon: 'shouye', index: 0, hideChildren: true },
redirect: { name: 'homeIndex' },
children: [
{
path: 'index',
name: 'homeIndex',
meta: { title: '首页', hideChildren: true, icon: 'shouye' },
component: () => import('/@/view/developing.vue'),
// redirect: { name: 'homeIndex' },
// children: [
// {
// path: 'index',
// name: 'homeIndex',
// meta: {
// title: '首页',
// keepAlive: true,
// // backApi: [],
// },
// },
// ],
},
],
};
export default home;

View File

@@ -3,7 +3,7 @@
const RootRoute = { const RootRoute = {
path: '/', path: '/',
name: 'root', name: 'root',
redirect: { name: 'ParkingStorageManageIndex' }, redirect: { name: 'home' },
meta: { meta: {
title: 'Root', title: 'Root',
}, },

View File

@@ -0,0 +1,60 @@
const Base = () => import('/nerv-lib/saas/view/system/layout/content.vue');
const organizationManage = {
path: '/organizationManage',
name: 'organizationManage',
meta: { title: '组织管理', icon: 'zuzhiguanli', index: 99 },
redirect: { name: 'UserManage' },
children: [
{
path: 'userManage',
name: 'UserManage',
meta: { title: '用户管理', hideChildren: true, icon: 'zuzhiguanli' },
component: Base,
redirect: { name: 'UserManageIndex' },
children: [
{
path: 'index',
name: 'UserManageIndex',
component: () => import('/@/view/organizationManage/usermanage/index.vue'),
meta: {
title: '用户管理',
keepAlive: true,
operates: [
{ title: '新增', code: 'userAdd' },
{ title: '导入', code: 'userImport' },
{ title: '模板下载', code: 'userTemDownload' },
{ title: '导出', code: 'userExports' },
{ title: '批量删除', code: 'userBatchDel' },
{ title: '编辑', code: 'userEdit' },
{ title: '冻结', code: 'userFrozen' },
{ title: '解冻', code: 'userUnFrozen' },
{ title: '重置密码', code: 'userCodeReset' },
{ title: '删除', code: 'userDelete' },
],
// backApi: [],
},
},
],
},
{
path: 'authorityManage',
name: 'AuthorityManage',
meta: { title: '部门/权限', hideChildren: true, icon: 'zuzhiguanli' },
component: Base,
redirect: { name: 'AuthorityManageIndex' },
children: [
{
path: 'index',
name: 'AuthorityManageIndex',
component: () => import('/@/view/organizationManage/departmentManage/index.vue'),
meta: {
title: '部门/权限',
keepAlive: true,
// backApi: [],
},
},
],
},
],
};
export default organizationManage;

View File

@@ -14,7 +14,8 @@
.ant-menu-inline .ant-menu-item, .ant-menu-inline .ant-menu-item,
.ant-menu-inline .ant-menu-submenu-title { .ant-menu-inline .ant-menu-submenu-title {
width: 100% !important; max-width: 100% !important;
transition: none !important;
} }
.ns-basic-table .ant-btn:hover { .ns-basic-table .ant-btn:hover {
@@ -46,17 +47,17 @@
} }
// header菜单字体样式 // header菜单字体样式
.ant-menu-dark.ant-menu-horizontal>.ant-menu-item, // .ant-menu-dark.ant-menu-horizontal>.ant-menu-item,
.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu { // .ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu {
color: #fff; // color: #fff;
} // }
.ant-menu-dark .ant-menu-item, // .ant-menu-dark .ant-menu-item,
.ant-menu-dark .ant-menu-item-group-title, // .ant-menu-dark .ant-menu-item-group-title,
.ant-menu-dark .ant-menu-item>a, // .ant-menu-dark .ant-menu-item>a,
.ant-menu-dark .ant-menu-item>span>a { // .ant-menu-dark .ant-menu-item>span>a {
color: #fff; // color: #fff;
} // }
@font-face { @font-face {
/*给字体命名*/ /*给字体命名*/
@@ -111,13 +112,13 @@
.ant-menu-title-content { .ant-menu-title-content {
svg { svg {
color: #A1ABC2; // color: #A1ABC2;
} }
} }
.ant-menu-item-selected { .ant-menu-item-selected {
svg { svg {
color: #D0DBF5; // color: #D0DBF5;
} }
} }
@@ -181,3 +182,7 @@
background-color: #AEAEAE; background-color: #AEAEAE;
} }
} }
#app {
min-width: 1200px;
}

View File

@@ -1,7 +1,7 @@
// @import "./global-antd.less"; // @import "./global-antd.less";
@primary-color: #1C4DDC; // 全局主色 // @primary-color: #ff7602; // 全局主色
@layout-header-hover: #1C4DDC; //hover // @layout-header-hover: #924908; //hover
@layout-header-background: #111519; // 头部背景色 // @layout-header-background: #111519; // 头部背景色
// @layout-header-background:url(/asset/image/header_background.png) no-repeat; // @layout-header-background:url(/asset/image/header_background.png) no-repeat;
// @ant-layout-sider-collapsed-background:url(/asset/image/sider_collapsed_background.png) no-repeat; // @ant-layout-sider-collapsed-background:url(/asset/image/sider_collapsed_background.png) no-repeat;

View File

@@ -0,0 +1,17 @@
<template>
<div class="content">{{ content }}</div>
</template>
<script lang="ts" setup>
import { useRouter } from 'vue-router';
console.log(useRouter().currentRoute.value.meta);
const content = useRouter().currentRoute.value.meta.title + 'developing';
</script>
<style scoped lang="less">
.content {
font-size: 30px;
display: flex;
align-items: center;
justify-content: center;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

View File

@@ -0,0 +1,952 @@
// <style lang="less" scoped>
// :deep(.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover){
// background-color: rgba(20,41,76,1);
// color:rgb(29, 83, 172)
// }
// :global(.ant-transfer-list-header-selected) {
// color: rgba(255, 83, 0)
// }
// :global(.ant-transfer-list-header > *:not(:last-child)) {
// color: rgba(255, 83, 0)
// }
// .tagtext {
// margin-left: 8px;
// }
// .light-tag {
// position: fixed;
// bottom: 135px;
// left: 450px;
// width: 396px;
// height: 200px;
// opacity: 0.8;
// border-radius: 8px;
// background: rgba(0, 0, 0, 1);
// }
// .light-tag-tit {
// display: flex;
// margin-top: 18px;
// margin-left: 18px;
// }
// .light-tag-box {
// padding: 15px 15px;
// }
// .light-tag-box>img {
// width: 120px;
// height: 51px;
// margin-bottom: 10px;
// }
// .light-tag-box>span {
// color: #fff;
// }
// .titleimg,
// .titletext {
// display: inline-block;
// align-items: center;
// justify-content: center;
// }
// .control-btn,
// .light-btn {
// display: inline-block;
// margin-top: 10px;
// }
// .controlarea-btn,
// .temp-btn {
// display: inline-block;
// margin-top: 16px;
// }
// :global(.ant-drawer-content) {
// background-color: rgba(0, 0, 0, 1);
// opacity: 0.8;
// }
// :global(.ant-modal-content) {
// background-color: rgba(0, 0, 0, 1);
// opacity: 0.8;
// }
// :deep(.ant-transfer-list) {
// width: 230px;
// height: 450px;
// }
// :deep(.ant-transfer-list-header) {
// background-color: rgba(0, 0, 0, 1);
// color: rgba(255, 255, 255, 1);
// }
// .bulbLogo1 {
// margin-top: 40%;
// margin-left: 12%;
// }
// .bulbLogo2 {
// margin-top: 35%;
// margin-left: 20%;
// }
// .bulbLogo3 {
// margin-top: 23%;
// margin-left: 10%;
// }
// .bulbLogo4 {
// margin-top: 10%;
// margin-left: 15%;
// }
// .bulbLogo5 {
// margin-top: 8%;
// margin-left: 13%;
// }
// .bulbLogo6 {
// margin-top: 8%;
// margin-left: 15%;
// }
// .bulbLogo7 {
// margin-top: 0%;
// margin-left: 12%;
// }
// .bulbLogo9 {
// margin-top: 35%;
// margin-left: 20%;
// }
// .bulbLogo10 {
// margin-top: 35%;
// margin-left: 20%;
// }
// .bulbLogo11 {
// margin-top: 35%;
// margin-left: 20%;
// }
// .bulbLogo12 {
// margin-top: 35%;
// margin-left: 20%;
// }
// .custom-table {
// border-collapse: collapse;
// width: 416px;
// height: 60px;
// color: rgba(255, 255, 255, 1);
// }
// .custom-table th,
// .custom-table td {
// border: 1px solid rgba(163, 192, 243, 1);
// text-align: left;
// padding: 8px;
// text-align: center;
// }
// .table1 {
// margin-top: 20px;
// width: 100%;
// cellspacing: 0;
// cellpadding: 0;
// border: 1px solid rgba(255, 255, 255);
// border-radius: 5px;
// background: rgba(255, 255, 255, 0.1);
// }
// .lightarea,
// .circuitarea,
// .controlarea,
// .controlscenearea,
// .lightparametersarea {
// width: 100%;
// margin-top: 20px;
// display: flex;
// align-items: center;
// }
// .lightareatab,
// .circuittab,
// .controltab,
// .controlscenetab,
// .lightparameterstab {
// width: 5px;
// height: 23px;
// opacity: 1;
// background: rgba(26, 174, 251, 1);
// margin-right: 4px;
// }
// .lightareatext,
// .circuittext,
// .controltext,
// .controlscenetext,
// .lightparameterstext {
// font-size: 14px;
// color: rgba(255, 255, 255, 1);
// line-height: 19px;
// width: 110px;
// height: 23px;
// opacity: 1;
// background: linear-gradient(270deg,
// rgba(86, 221, 253, 0) 0%,
// rgba(25, 176, 255, 1) 100%);
// }
// .lightareatab,
// .lightareatext {
// display: inline-block;
// justify-content: center;
// }
// .plan.enabled {
// border: none;
// font-size: 14px;
// font-weight: 400;
// border-radius: 5px;
// color: rgba(255, 255, 255, 1);
// vertical-align: top;
// margin-left: 235px;
// width: 88px;
// height: 32px;
// background: linear-gradient(180deg, rgba(103, 222, 0, 1) 0%, rgba(0, 181, 6, 1) 100%);
// color: white;
// }
// .plan.disabled {
// border: none;
// font-size: 14px;
// font-weight: 400;
// border-radius: 5px;
// color: rgba(255, 255, 255, 1);
// vertical-align: top;
// margin-left: 235px;
// width: 88px;
// height: 32px;
// background-color: red;
// }
// .plan:disabled {
// cursor: not-allowed;
// }
// .openplan.enabled2 {
// border: none;
// font-size: 14px;
// font-weight: 400;
// border-radius: 5px;
// color: rgba(255, 255, 255, 1);
// vertical-align: top;
// width: 88px;
// height: 32px;
// background: linear-gradient(180deg, rgba(103, 222, 0, 1) 0%, rgba(0, 181, 6, 1) 100%);
// color: white;
// }
// .openplan.disabled2 {
// border: none;
// font-size: 14px;
// font-weight: 400;
// border-radius: 5px;
// color: rgba(255, 255, 255, 1);
// vertical-align: top;
// width: 88px;
// height: 32px;
// background-color: red;
// }
// .openplan:disabled {
// cursor: not-allowed;
// }
// .btn2 {
// display: flex;
// align-items: center;
// margin-left: 80px;
// }
// .openzm {
// color: rgba(34, 183, 255, 1);
// margin-left: 20px;
// font-size: 14px;
// }
// .custom-checkbox {
// width: 13px;
// height: 13px;
// }
// .both {
// width: 59.79px;
// height: 32px;
// opacity: 1;
// background: linear-gradient(180deg,
// rgba(255, 187, 0, 1) 0%,
// rgba(255, 112, 3, 1) 91.21%,
// rgba(255, 129, 3, 1) 100%);
// margin-left: 8px;
// font-size: 12px;
// color: rgba(255, 255, 255, 1);
// border: none;
// border-radius: 5px;
// }
// .btn2 {
// button {
// margin: 0 5px;
// }
// }
// .allbtn {
// border: 0;
// width: 40px;
// color: rgba(255, 255, 255, 1);
// background-color: transparent;
// }
// .blue-background.ant-switch-checked {
// background-color: linear-gradient(180deg,
// rgba(1, 206, 255, 1) 0%,
// rgba(0, 150, 229, 1) 100%) !important;
// }
// .grey-background.ant-switch {
// background-color: grey !important;
// }
// .blue-background.ant-switch-checked .ant-switch-handle {
// background-color: linear-gradient(180deg,
// rgba(1, 206, 255, 1) 0%,
// rgba(0, 150, 229, 1) 100%) !important;
// }
// .grey-background.ant-switch .ant-switch-handle {
// background-color: grey !important;
// }
// p {
// color: rgba(255, 255, 255, 1);
// }
// .area,
// .btnarea,
// .controlmodebtnarea,
// .controlscenebtnarea {
// margin-left: -17px;
// button {
// width: 21%;
// padding: 0 2%;
// }
// }
// .btn {
// width: 92px;
// height: 40px;
// border-radius: 4px;
// opacity: 1;
// margin-top: 10px;
// margin-left: 17px;
// font-size: 14px;
// font-weight: 400;
// opacity: 1;
// border: 1px solid rgba(207, 212, 219, 1);
// line-height: 20.27px;
// color: rgba(255, 255, 255, 1);
// text-align: center;
// vertical-align: top;
// background-color: rgba(255, 255, 255, 0.1);
// }
// .selected {
// background: linear-gradient(180deg,
// rgba(201, 245, 255, 1) 0%,
// rgba(138, 215, 255, 1) 100%);
// color: rgba(0, 61, 90, 1);
// border: 1px solid rgba(255, 255, 255, 1);
// }
// .btn:hover {
// background-color: rgba(207, 212, 219, 1);
// }
// .btn:active {
// background-color: rgba(102, 102, 102, 1);
// color: white;
// }
// .circuitarea,
// .controlscenearea,
// .lightparametersarea {
// left: 51px;
// width: 100%;
// margin-top: 20px;
// }
// .circuittab,
// .circuittext {
// display: inline-block;
// }
// .batch {
// width: 60px;
// height: 32px;
// opacity: 1;
// border: 1px solid rgba(67, 136, 251, 1);
// color: rgba(67, 136, 251, 1);
// border-radius: 5px;
// background-color: rgba(255, 255, 255, 1);
// margin-left: 11px;
// }
// .controlarea {
// left: 51px;
// width: 100%;
// margin-top: 20px;
// }
// .controltab,
// .controltext {
// display: inline-block;
// }
// :deep(.cell) {
// text-align: center;
// }
// :deep(#pane-first) {
// height: 100%;
// }
// .controlscenetab,
// .controlscenetext {
// display: inline-block;
// }
// .lightparameterstab,
// .lightparameterstext {
// display: inline-block;
// }
// .lightparameterstextarea>p {
// height: 100%;
// display: flex;
// border: 1px solid rgba(236, 239, 245, 1);
// justify-content: center;
// align-items: center;
// }
// .bottom {
// width: 100%;
// height: 64px;
// display: flex;
// justify-content: flex-end;
// align-items: center;
// position: fixed;
// bottom: 0;
// right: 0;
// margin-bottom: 10px;
// }
// .execute {
// margin-right: 20px;
// width: 74px;
// height: 40px;
// opacity: 1;
// border-radius: 4px;
// background: rgba(67, 136, 251, 1);
// font-size: 14px;
// font-weight: 400;
// color: rgba(255, 255, 255, 1);
// border: 0;
// margin-left: 10px;
// }
// .flushed {
// width: 74px;
// height: 40px;
// opacity: 1;
// border-radius: 4px;
// font-size: 14px;
// font-weight: 400;
// color: rgba(102, 102, 102, 1);
// background: rgba(255, 255, 255, 1);
// border: 1px solid rgba(193, 197, 204, 1);
// }
// .tabreboot,
// .tabdelete {
// border: none;
// background-color: rgba(0,0,0,0);
// font-size: 14px;
// font-weight: 400;
// letter-spacing: 0;
// line-height: 20px;
// color: rgba(67, 136, 251, 1);
// }
// .tabreboot {
// margin-right: 8px;
// }
// .add {
// width: 74px;
// height: 40px;
// opacity: 1;
// border-radius: 4px;
// background: rgba(67, 136, 251, 1);
// border: rgba(67, 136, 251, 1);
// font-size: 14px;
// font-weight: 400;
// color: rgba(255, 255, 255, 1);
// }
// .divadd {
// width: 100%;
// height: 64px;
// display: flex;
// justify-content: flex-end;
// align-items: center;
// position: fixed;
// bottom: 0;
// right: 0;
// margin-bottom: 10px;
// margin-right: 20px;
// }
// .atable {
// margin-top: 20px;
// }
// :deep(.ant-table-pagination) {
// visibility: hidden;
// }
// .drawer-content {
// margin-left: 20px;
// }
// .arrow-indicator {
// position: absolute;
// top: 50%;
// left: 0;
// transform: translateY(-50%);
// z-index: 1;
// }
// .drawer-title1 {
// position: fixed;
// width: 33px;
// height: 33px;
// top: 0;
// bottom: 0;
// right: 20px;
// margin: auto;
// z-index: 99999;
// }
// .drawer-title2 {
// position: fixed;
// width: 33px;
// height: 33px;
// top: 0;
// bottom: 0;
// right: 495px;
// margin: auto;
// z-index: 99999;
// }
// .arrowbtn {
// display: flex;
// justify-content: center;
// align-items: center;
// width: 28px;
// height: 28px;
// background: rgba(0, 0, 0, 1);
// opacity: 0.5;
// border: none;
// }
// :deep(.ant-tabs-tab-btn) {
// color: white;
// }
// :deep(.ant-table) {
// background-color: transparent;
// }
// :deep(.ant-table-bordered) {
// background-color: transparent;
// }
// :deep(.ant-table-thead) {
// background-color: transparent;
// }
// :deep(.ant-table-cell) {
// background-color: transparent;
// color: #fff;
// }
// .lighting-img-box {
// width: 100%;
// max-height: calc(100% - 79px);
// }
// .lighting-img-box>img {
// width: 100%;
// height: calc(100vh - 96px);
// object-fit: cover;
// }
// .F1 {
// width: 120px;
// height: 50.72px;
// border-radius: 4px;
// background: rgba(39, 120, 255, 1);
// border: 1px solid rgba(51, 199, 255, 1);
// box-shadow: 0px 10px 15px rgba(0, 54, 136, 0.3);
// font-size: 24px;
// font-weight: 400;
// color: rgba(255, 255, 255, 1);
// }
// .F2,
// .platform {
// width: 120px;
// height: 50.72px;
// border-radius: 4px;
// background: rgba(7, 72, 116, 1);
// box-shadow: 0px 10px 15px rgba(0, 54, 136, 0.3);
// font-size: 24px;
// font-weight: 400;
// color: rgba(146, 187, 255, 1);
// border: 1px solid rgba(39, 120, 255, 1);
// margin-top: 20px;
// }
// .btn-box {
// position: fixed;
// top: 100px;
// left: 250px;
// }
// .lighting-img-box>.bulbBox>.wh100 {
// width: 38px;
// height: calc(38px + 19px);
// }
// .lighting-img-box>.bulbBox>.bulbLogo1 {
// position: absolute;
// top: 10%;
// left: 10%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo2 {
// position: absolute;
// top: 9%;
// left: 15%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo3 {
// position: absolute;
// top: 34%;
// left: 25%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo4 {
// position: absolute;
// top: 45%;
// left: 30%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo5 {
// position: absolute;
// top: 45%;
// left: 30%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo6 {
// position: absolute;
// top: 55%;
// left: 30%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo7 {
// position: absolute;
// top: 60%;
// left: 40%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo8 {
// position: absolute;
// top: 55%;
// left: 70%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo9 {
// position: absolute;
// top: 10%;
// left: 60%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo10 {
// position: absolute;
// top: 10%;
// left: 40%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo11 {
// position: absolute;
// top: 15%;
// left: 50%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo12 {
// position: absolute;
// top: 15%;
// left: 60%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo13 {
// position: absolute;
// top: 55%;
// left: 70%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo14 {
// position: absolute;
// top: 45%;
// left: 60%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo15 {
// position: absolute;
// top: 45%;
// left: 80%;
// display: flex;
// align-items: center;
// }
// .lighting-img-box>.bulbBox>.bulbLogo16 {
// position: absolute;
// top: 45%;
// left: 90%;
// display: flex;
// align-items: center;
// }
// .editable-cell {
// position: relative;
// .editable-cell-input-wrapper,
// .editable-cell-text-wrapper {
// padding-right: 24px;
// }
// .editable-cell-text-wrapper {
// padding: 5px 24px 5px 5px;
// }
// .editable-cell-icon,
// .editable-cell-icon-check {
// position: absolute;
// right: 0;
// width: 20px;
// cursor: pointer;
// }
// .editable-cell-icon {
// margin-top: 4px;
// display: none;
// }
// .editable-cell-icon-check {
// line-height: 28px;
// }
// .editable-cell-icon:hover,
// .editable-cell-icon-check:hover {
// color: #108ee9;
// }
// .editable-add-btn {
// margin-bottom: 8px;
// }
// }
// .editable-cell:hover .editable-cell-icon {
// display: inline-block;
// }
// .div-operation {
// width: 3px;
// height: 13px;
// opacity: 1;
// border-radius: 1px;
// background: rgba(67, 136, 251, 1);
// }
// .text-operation {
// color: rgba(255, 255, 255, 1);
// font-size: 16px;
// font-weight: 700;
// margin-left: 5px;
// }
// .div-operation,
// .text-operation {
// display: inline-block;
// }
// .jbox {
// background-color: #000;
// opacity: 1;
// z-index: 99999;
// }
// .journal {
// padding: 3% 5%;
// background-size: 450px 177px;
// width: 482px;
// height: 177px;
// background-color: rgba(0, 0, 0);
// border-radius: 12px;
// border: 2px solid transparent;
// border-image: linear-gradient(to bottom, #0077FF, #00F6FF, #000000) 1;
// }
// .imgText {
// display: flex;
// align-items: center;
// justify-content: space-between;
// .ztzm {
// display: flex;
// align-items: center;
// }
// .cxbtn {
// color: rgba(255, 255, 255, 1);
// border: none;
// border-radius: 6px;
// width: 59.79px;
// height: 32px;
// opacity: 1;
// background: linear-gradient(180deg,
// rgba(255, 187, 0, 1) 0%,
// rgba(255, 112, 3, 1) 91.21%,
// rgba(255, 129, 3, 1) 100%);
// }
// }
// :deep(.ant-modal-content) {
// width: 555px;
// height: 792px;
// }
// :deep(.ant-modal-body) {
// width: 555px;
// max-height: 792px !important;
// box-sizing: border-box;
// }
// .text-change {
// text-align: center;
// color: rgba(255, 255, 255, 1);
// font-size: 20px;
// }
// .excuno {
// width: 150px;
// height: 40px;
// margin-top: 30px;
// }
// .excuok {
// width: 150px;
// height: 40px;
// margin-top: 30px;
// }
// .excubtn {
// display: flex;
// justify-content: space-between;
// }
// .addok {
// width: 74px;
// height: 40px;
// opacity: 1;
// border-radius: 4px;
// background: rgba(67, 136, 251, 1);
// border: rgba(67, 136, 251, 1);
// font-size: 14px;
// font-weight: 400;
// color: rgba(255, 255, 255, 1);
// margin-top: 440px;
// margin-left: 350px;
// }
// .zmhlbtn {
// position: relative;
// }
// .anticon-stop {
// position: absolute;
// right: 3px;
// bottom: 3px;
// }
// .istrindex {
// background: rgba(67, 136, 251, 1);
// }
// :deep(.ant-modal-mask.ant-modal-content) {
// height: 100vh;
// position: fixed;
// right: 496px;
// top: 0%;
// }
// :global(.ant-modal-content) {
// position: fixed;
// bottom: 20px;
// right: 500px;
// }
// </style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,232 @@
import { dateUtil } from '/nerv-lib/util/date-util';
import data from './mock.json';
import { cloneDeep } from 'lodash-es';
import { ref } from 'vue';
const columns = [
{
title: '能源种类',
dataIndex: '能源种类',
},
{
title: '计量单位',
dataIndex: '计量单位',
},
{
title: '速算系数',
dataIndex: '速算系数',
},
{
title: '全年',
dataIndex: '全年',
},
{
title: '1月',
dataIndex: '1月',
},
{
title: '2月',
dataIndex: '2月',
},
{
title: '3月',
dataIndex: '3月',
},
{
title: '4月',
dataIndex: '4月',
},
{
title: '5月',
dataIndex: '5月',
},
{
title: '6月',
dataIndex: '6月',
},
{
title: '7月',
dataIndex: '7月',
},
{
title: '8月',
dataIndex: '8月',
},
{
title: '9月',
dataIndex: '9月',
},
{
title: '10月',
dataIndex: '10月',
},
{
title: '11月',
dataIndex: '11月',
},
{
title: '12月',
dataIndex: '12月',
},
];
const formConfig = {
schemas: [
{
field: 'time',
label: '年份',
component: 'NsDatePicker',
componentProps: {
picker: 'year',
valueFormat: 'YYYY-MM-DD',
},
},
],
params: {},
};
const mockData = ref(cloneDeep(data.dataSource));
const doWnload = (url) => {
const a = document.createElement('a');
document.body.appendChild(a);
a.href = encodeURI(url);
//设置下载的文件名
// a.download = fileName.value;
//触发a标签的点击事件进行下载
a.click();
};
export const tableConfig1 = (el, fileDownRef) => {
return {
title: '能耗',
value: mockData.value,
rowSelection: null,
columns,
formConfig,
headerActions: [
{
label: '新增',
name: 'groupEdit',
type: 'primary',
handle: (a, b) => {
el.value.toggle();
},
},
{
label: '导入',
name: 'groupImport',
type: 'primary',
extra: {
// api: props.postImportApi, // 导入接口名
title: '设备信息', // 弹窗title
templateName: 'whiteListUser', // 所使用的文件名称
indexName: '设备id', // 匹配类型字段
message: [
{ label: '1、若必填项未填写则不能进行导入操作' },
{ label: `2、当重复时则更新数据。` },
{ label: '3、数据将从模版的第五行进行导入。' },
{ label: '4、文件导入勿超过5MB。' },
],
},
},
{
label: '导出',
name: 'groupExports',
type: 'primary',
handle: () => {
doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx');
},
},
{
label: '模板下载',
name: 'groupTemDownload',
type: 'primary',
handle: () => {
// http.get('/asset/file/whiteListUser.xlsx');
doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx');
},
},
{
label: '上传凭证',
name: 'groupImport',
type: 'primary',
extra: {
// api: props.postImportApi, // 导入接口名
title: '设备信息', // 弹窗title
templateName: 'whiteListUser', // 所使用的文件名称
indexName: '设备id', // 匹配类型字段
message: [
{ label: '1、若必填项未填写则不能进行导入操作' },
{ label: `2、当重复时则更新数据。` },
{ label: '3、数据将从模版的第五行进行导入。' },
{ label: '4、文件导入勿超过5MB。' },
],
},
},
{
label: '凭证下载',
name: 'groupTemDownload',
type: 'primary',
handle: () => {
fileDownRef.value.toggle();
},
},
],
columnActions: {
title: '操作',
actions: [
{
label: '编辑',
name: 'edit',
handle: () => {
mockData.value.splice(0, 1);
},
},
{
label: '删除',
name: 'FeedBackDetail',
dynamicParams: ['uuid', 'appealType'],
confirm: true,
handle: () => {
mockData.value.splice(0, 1);
},
},
],
},
};
};
export const tableConfig2 = {
title: '碳排',
value: data.dataSource,
rowSelection: null,
columns,
formConfig,
headerActions: [
{
label: '导出',
name: 'groupTemDownload',
type: 'primary',
handle: () => {
// http.get('/asset/file/whiteListUser.xlsx');
doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx');
},
},
],
};
export const tableConfig3 = {
title: '标煤',
value: data.dataSource,
rowSelection: null,
columns,
formConfig,
headerActions: [
{
label: '导出',
name: 'groupTemDownload',
type: 'primary',
handle: () => {
// http.get('/asset/file/whiteListUser.xlsx');
doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx');
},
},
],
};

View File

@@ -0,0 +1,116 @@
<template>
<ns-drawer
v-model:visible="visible"
width="520"
title="新增"
:ok="btnClick"
:cancel="() => (visible = false)"
placement="right">
<ns-view-list-table v-bind="tableConfig" />
</ns-drawer>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { NsMessage } from '/nerv-lib/component';
const visible = ref(false);
const model = ref({});
const toggle = () => {
visible.value = !visible.value;
};
const doWnload = (url) => {
const a = document.createElement('a');
document.body.appendChild(a);
a.href = encodeURI(url);
//设置下载的文件名
// a.download = fileName.value;
//触发a标签的点击事件进行下载
a.click();
};
const mockDataSource = ref([
{
type: '电力',
fileName: '电力_2024.pdf',
},
{
type: '水',
fileName: '电力_2024.pdf',
},
{
type: '天然气',
fileName: '电力_2024.pdf',
},
{
type: '汽油',
fileName: '电力_2024.pdf',
},
{
type: '煤油',
fileName: '电力_2024.pdf',
},
]);
const tableConfig = {
value: mockDataSource.value,
sticky: false,
rowKey: 'type',
columns: [
{
title: '序号',
dataIndex: 'index',
customRender: ({ index }) => index + 1,
},
{
title: '能源类型',
dataIndex: 'type',
},
{
title: '文件名',
dataIndex: 'fileName',
},
],
headerActions: [
{
label: '批量下载',
name: 'groupTemDownload',
type: 'primary',
handle: () => {
// http.get('/asset/file/whiteListUser.xlsx');
doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx');
},
},
],
columnActions: {
title: '操作',
actions: [
{
label: '下载',
name: 'groupTemDownload',
handle: () => {
// http.get('/asset/file/whiteListUser.xlsx');
doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx');
},
},
],
},
};
const btnClick = () => {
visible.value = false;
NsMessage.success('操作成功');
};
defineExpose({
toggle,
});
</script>
<style scoped lang="less">
:deep(.ns-table-header) {
min-width: 200px;
}
:deep(.ns-table-container),
:deep(.ns-table-main) {
border-top: 0px !important;
}
</style>

View File

@@ -0,0 +1,28 @@
<template>
<div>
<a-tabs>
<a-tab-pane v-for="(item, index) in tabList" :key="index" v-bind="item">
<ns-view-list-table v-bind="item.config" />
</a-tab-pane>
</a-tabs>
<opForm ref="opFormRef" />
<fileDown ref="fileDownRef" />
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { tableConfig1, tableConfig2, tableConfig3 } from './config';
import opForm from './op.vue';
import fileDown from './fileDown.vue';
const opFormRef = ref();
const fileDownRef = ref();
const tabList = [
{ tab: '能耗', config: tableConfig1(opFormRef, fileDownRef) },
{ tab: '碳排', config: tableConfig2 },
{ tab: '标煤', config: tableConfig3 },
];
defineOptions({
name: 'EnergyMappingIndex', // 与页面路由name一致缓存才可生效
});
</script>
<style lang="less" scoped></style>

View File

@@ -0,0 +1,10 @@
{
"dataSource":[
{"序号": "1", "能源种类": "电力", "计量单位": "tce", "速算系数": "0.5tce/kWh", "全年": "19900", "1月": "10000", "2月": "9900", "3月": "", "4月": "", "5月": "", "6月": "", "7月": "", "8月": "", "9月": "", "10月": "", "11月": "", "12月": ""},
{"序号": "2", "能源种类": "水", "计量单位": "tce", "速算系数": "0.5tce/t", "全年": "16500", "1月": "8000", "2月": "8500", "3月": "", "4月": "", "5月": "", "6月": "", "7月": "", "8月": "", "9月": "", "10月": "", "11月": "", "12月": ""},
{"序号": "3", "能源种类": "天然气", "计量单位": "tce", "速算系数": "0.5tce/𝑚3/m3", "全年": "590", "1月": "300", "2月": "290", "3月": "", "4月": "", "5月": "", "6月": "", "7月": "", "8月": "", "9月": "", "10月": "", "11月": "", "12月": ""},
{"序号": "4", "能源种类": "汽油", "计量单位": "tce", "速算系数": "0.5tce/𝑚3/m3", "全年": "330", "1月": "150", "2月": "180", "3月": "", "4月": "", "5月": "", "6月": "", "7月": "", "8月": "", "9月": "", "10月": "", "11月": "", "12月": ""},
{"序号": "5", "能源种类": "煤油", "计量单位": "tce", "速算系数": "0.5tce/t", "全年": "43", "1月": "20", "2月": "23", "3月": "", "4月": "", "5月": "", "6月": "", "7月": "", "8月": "", "9月": "", "10月": "", "11月": "", "12月": ""}
]
}

View File

@@ -0,0 +1,135 @@
<template>
<ns-drawer
v-model:visible="visible"
width="520"
title="新增"
:ok="btnClick"
:cancel="() => (visible = false)"
placement="right">
<a-tabs>
<a-tab-pane class="pane" key="1" tab="能源种类">
<ns-form :schemas="schemas" :model="model" formLayout="vertical" />
</a-tab-pane>
<a-tab-pane class="pane" key="2" tab="能耗统计">
<ns-basic-table v-bind="tableConfig" formLayout="vertical" />
</a-tab-pane>
</a-tabs>
</ns-drawer>
</template>
<script lang="ts" setup>
import { createVNode, ref, toRef, toRefs } from 'vue';
import { NsMessage } from '/nerv-lib/component';
import { Switch } from 'ant-design-vue';
const visible = ref(false);
const model = ref({});
const toggle = () => {
visible.value = !visible.value;
};
const mockDataSource = ref([]);
for (let index = 0; index < 12; index++) {
mockDataSource.value.push({ type: '手动', op: true });
}
const schemas = [
{
label: '能源种类',
field: 'formula1',
component: 'NsInput',
componentProps: {
placeholder: '请输入',
},
rules: [{ required: true }],
},
{
label: '计量单位',
field: 'formula2',
component: 'NsInput',
componentProps: {
placeholder: '请输入',
},
rules: [{ required: true }],
},
{
label: '计算碳排',
field: 'formula3',
component: 'NsRadioGroup',
defaultValue: 1,
componentProps: {
radioType: 'radio',
options: [
{ label: '是', value: 1 },
{ label: '否', value: 0 },
],
},
rules: [{ required: true }],
},
{
label: '计算标煤',
field: 'formula4',
component: 'NsRadioGroup',
defaultValue: 1,
componentProps: {
radioType: 'radio',
options: [
{ label: '是', value: 1 },
{ label: '否', value: 0 },
],
},
rules: [{ required: true }],
},
{
label: '采集节点',
field: 'formula5',
component: 'NsInput',
componentProps: {
placeholder: '请输入',
},
},
];
const tableConfig = {
dataSource: mockDataSource.value,
pagination: false,
rowKey: (record) => record.groupName,
columns: [
{
title: '月份',
dataIndex: 'month',
customRender: ({ index }) => index + 1 + '月',
width: 80,
align: 'center',
},
{
title: '汇总方式',
dataIndex: 'type',
align: 'center',
},
{
title: '操作',
dataIndex: 'op',
align: 'center',
customRender: (data) =>
createVNode(Switch, {
checked: Boolean(data.record.op),
onChange: (val) => {
setTimeout(() => {
data.record.op = val;
}, 10);
},
}),
},
],
};
const btnClick = () => {
visible.value = false;
NsMessage.success('操作成功');
};
defineExpose({
toggle,
});
</script>
<style scoped lang="less">
.pane {
margin-top: 16px;
}
</style>

View File

@@ -0,0 +1,431 @@
import { dateUtil } from '/nerv-lib/util/date-util';
import data from './mock.json';
import { http } from '/nerv-lib/util';
import { ref } from 'vue';
import { group } from '/@/api/deviceManage';
import { dict } from '/@/api';
const tableKeyMap = [
{
title: '来源企业',
dataIndex: 'id',
},
{
title: '设备id',
dataIndex: 'deviceCode',
},
{
title: '设备编号',
dataIndex: 'deviceName',
textNumber: 8,
textEllipsis: true,
},
{
title: '分组名称',
dataIndex: 'position',
},
{
title: '设备品牌/型号',
dataIndex: 'position',
},
{
title: '设备状态',
dataIndex: 'position',
},
];
const tableCalKeyMap = [
{
title: '来源企业',
dataIndex: 'id',
},
{
title: '节点编号',
dataIndex: 'deviceName',
textNumber: 8,
textEllipsis: true,
},
{
title: '节点路径',
dataIndex: 'position',
},
];
const doWnload = (url) => {
const a = document.createElement('a');
document.body.appendChild(a);
a.href = encodeURI(url);
//设置下载的文件名
// a.download = fileName.value;
//触发a标签的点击事件进行下载
a.click();
};
const mockData = ref(data.listData);
export const formSchema = [
{
field: 'isCreate',
component: 'NsInput',
show: false,
},
{
field: 'orgId',
component: 'NsInput',
show: false,
},
{
field: 'isCreatSon',
component: 'NsInput',
show: false,
},
{
label: '节点名称',
field: 'pointName',
component: 'NsInput',
componentProps: {
placeholder: '请输入节点名称(必填)',
},
rules: [
{
required: true,
message: '请输入节点名称',
},
],
},
{
label: '节点类型',
field: 'pointType',
component: 'NsSelectApi',
componentProps: {
placeholder: '请选择节点类型(必填)',
api: dict,
params: { dicKey: 'COUNT_POINT' },
immediate: true,
resultField: 'data.COUNT_POINT',
labelField: 'cnValue',
valueField: 'cnValue',
},
rules: [
{
required: true,
message: '请输入节点类型',
},
],
},
];
export const treeConfig = (orgId) => {
return {
defaultExpandAll: true,
header: {
icon: 'orgLink',
title: '能耗分组',
},
params: { orgId },
api: group.queryDeviceGroupTree,
// api: () => {
// return new Promise((resolve) => {
// setTimeout(() => {
// resolve({ data: [{ title: '全部', key: 'all', children: data.data }] });
// }, 100);
// });
// },
transform: (data) => {
return [{ title: '全部', key: 'all', selectable: false, children: data }];
},
formConfig: {
schemas: [
{
field: 'energyType',
label: '',
component: 'NsSelectApi',
autoSubmit: true,
componentProps: {
api: dict,
params: { dicKey: 'ENERGY_TYPE' },
immediate: true,
resultField: 'data.ENERGY_TYPE',
labelField: 'cnValue',
valueField: 'cnValue',
placeholder: '请选择能耗种类',
},
},
{
field: 'pointName',
label: '',
component: 'NsInput',
autoSubmit: true,
componentProps: {
placeholder: '请输入节点名称',
},
},
],
},
};
};
export const tableConfig = (el, elGroup, elFormula) => {
return {
title: '点位信息',
// api: '/carbon_emission/device/getDeviceList',
value: mockData.value,
headerActions: [
{
label: '编辑',
name: 'groupEdit',
type: 'primary',
handle: (a, b) => {
el.value.toggle();
},
},
{
label: '批量删除',
name: 'groupTemDownload',
type: 'primary',
dynamicDisabled: (data: any) => {
return data.list.length === 0;
},
handle: () => {
mockData.value.splice(0, 2);
},
},
{
label: '批量导出',
name: 'groupExports',
type: 'primary',
dynamicDisabled: (data: any) => {
return data.list.length === 0;
},
extra: {
xlsxMap: tableKeyMap,
xlsxName: '分组信息YYYY-MM-DD',
},
},
{
label: '批量导入',
name: 'groupImport',
type: 'primary',
extra: {
// api: props.postImportApi, // 导入接口名
title: '设备信息', // 弹窗title
templateName: 'whiteListUser', // 所使用的文件名称
indexName: '设备id', // 匹配类型字段
message: [
{ label: '1、若必填项未填写则不能进行导入操作' },
{ label: `2、当重复时则更新数据。` },
{ label: '3、数据将从模版的第五行进行导入。' },
{ label: '4、文件导入勿超过5MB。' },
],
},
},
{
label: '模板下载',
name: 'groupTemDownload',
type: 'primary',
handle: () => {
// http.get('/asset/file/whiteListUser.xlsx');
doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx');
},
},
{
label: '批量分组',
name: 'groupTemDownload',
type: 'primary',
handle: () => {
elGroup.value.toggle();
},
},
{
label: '公式编辑',
name: 'groupTemDownload',
type: 'primary',
handle: () => {
elFormula.value.toggle();
},
},
],
columns: tableKeyMap,
columnActions: {
title: '操作',
actions: [
{
label: '删除',
name: 'FeedBackDetail',
dynamicParams: ['uuid', 'appealType'],
confirm: true,
handle: () => {
mockData.value.splice(0, 1);
},
},
],
},
formConfig: {
schemas: [
{
field: 'name',
label: '设备名称',
component: 'NsInput',
componentProps: {
placeholder: '请输入',
},
},
{
field: 'provider',
label: '设备厂商',
component: 'NsInput',
componentProps: {
placeholder: '请输入',
},
},
{
field: 'payWay',
label: '设备区域',
component: 'NsSelect',
componentProps: {
placeholder: '请选择',
options: [
{
label: '全部',
value: '',
},
],
},
},
{
field: 'createTime',
label: '生产日期',
component: 'NsRangePicker',
fieldMap: ['queryStartDate', 'queryEndDate'],
componentProps: {
valueFormat: 'YYYY-MM-DD',
},
},
{
field: 'createTime1',
label: '采购日期',
component: 'NsRangePicker',
fieldMap: ['queryStartDate', 'queryEndDate'],
componentProps: {
valueFormat: 'YYYY-MM-DD',
},
},
{
field: 'createTime2',
label: '启用日期',
component: 'NsRangePicker',
fieldMap: ['queryStartDate', 'queryEndDate'],
componentProps: {
valueFormat: 'YYYY-MM-DD',
},
},
],
},
// pagination: { pageSizeOptions: false },
rowKey: 'id',
};
};
export const tableConfigCal = (el, elGroup, elFormula) => {
return {
title: '点位信息',
// api: '/carbon_emission/device/getDeviceList',
value: mockData.value,
headerActions: [
{
label: '编辑',
name: 'groupEdit',
type: 'primary',
handle: (a, b) => {
el.value.toggle();
},
},
{
label: '批量删除',
name: 'groupTemDownload',
type: 'primary',
dynamicDisabled: (data: any) => {
return data.list.length === 0;
},
handle: () => {
mockData.value.splice(0, 2);
},
},
{
label: '批量导出',
name: 'groupExports',
type: 'primary',
dynamicDisabled: (data: any) => {
return data.list.length === 0;
},
extra: {
xlsxMap: tableKeyMap,
xlsxName: '分组信息YYYY-MM-DD',
},
},
{
label: '批量导入',
name: 'groupImport',
type: 'primary',
extra: {
// api: props.postImportApi, // 导入接口名
title: '设备信息', // 弹窗title
templateName: 'whiteListUser', // 所使用的文件名称
indexName: '设备id', // 匹配类型字段
message: [
{ label: '1、若必填项未填写则不能进行导入操作' },
{ label: `2、当重复时则更新数据。` },
{ label: '3、数据将从模版的第五行进行导入。' },
{ label: '4、文件导入勿超过5MB。' },
],
},
},
{
label: '模板下载',
name: 'groupTemDownload',
type: 'primary',
handle: () => {
// http.get('/asset/file/whiteListUser.xlsx');
doWnload('/hx-ai-intelligent/asset/file/whiteListUser.xlsx');
},
},
],
columns: tableCalKeyMap,
columnActions: {
title: '操作',
actions: [
{
label: '删除',
name: 'FeedBackDetail',
dynamicParams: ['uuid', 'appealType'],
confirm: true,
handle: () => {
mockData.value.splice(0, 1);
},
},
],
},
formConfig: {
schemas: [
{
field: 'name',
label: '设备名称',
component: 'NsInput',
componentProps: {
placeholder: '请选择公司',
},
},
{
field: 'provider',
component: 'NsInput',
componentProps: {
placeholder: '请输入节点编号',
},
},
],
},
// pagination: { pageSizeOptions: false },
rowKey: 'id',
};
};

View File

@@ -0,0 +1,96 @@
<template>
<ns-drawer
v-model:visible="visible"
size="large"
class="custom-class"
title="编辑"
:ok="btnClick"
:cancel="() => (visible = false)"
placement="right">
<div class="drawerContainer">
<ns-tree-api v-bind="treeConfig" @select="treeSelect" />
<a-transfer
v-model:target-keys="targetKeys"
:data-source="mockData"
style="height: 100%; width: 66%"
:listStyle="listStyle"
show-search
:filter-option="filterOption"
:render="(item) => item.title" />
</div>
</ns-drawer>
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue';
import { NsMessage } from '/nerv-lib/component';
import { treeConfig } from './config';
const visible = ref(false);
const mockData = ref([]);
const listStyle = {
height: '100%',
width: '100%',
};
const targetKeys = ref<string[]>([]);
const toggle = () => {
visible.value = !visible.value;
};
onMounted(() => {
getMock('上海公司');
});
const filterOption = (inputValue: string, option: MockData) => {
return option.description.indexOf(inputValue) > -1;
};
const btnClick = () => {
visible.value = false;
NsMessage.success('编辑成功');
};
function treeSelect(
selectedKeys: never[],
e: {
selected: boolean;
selectedNodes: { props: { dataRef: any } }[];
node: any;
event: any;
},
) {
console.log(selectedKeys, e);
const {
dataRef: { title },
} = e.node;
getMock(title);
}
const getMock = (company) => {
const keys = [];
const mData = [];
for (let i = 0; i < 60; i++) {
const data = {
key: i.toString(),
title: `A00${i + 1}总用电量(${company})`,
description: `description of content${i + 1}`,
chosen: Math.random() * 2 > 1,
};
if (data.chosen) {
keys.push(data.key);
}
mData.push(data);
}
mockData.value = mData;
targetKeys.value = keys;
};
defineExpose({
toggle,
});
</script>
<style scoped lang="less">
.drawerContainer {
height: 100%;
display: flex;
justify-content: space-between;
}
</style>

View File

@@ -0,0 +1,120 @@
<template>
<ns-drawer
v-model:visible="visible"
width="520"
title="公式编辑"
:ok="btnClick"
:cancel="() => (visible = false)"
placement="right">
<ns-form :schemas="schemas" :model="model" formLayout="vertical" />
</ns-drawer>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { NsMessage } from '/nerv-lib/component';
const visible = ref(false);
const model = ref({});
const toggle = () => {
visible.value = !visible.value;
};
const mockDataSource = ref([
{
groupName: '1号厂区',
},
{
groupName: '2号厂区',
},
{
groupName: '3号厂区',
},
]);
const schemas = [
{
field: 'basicInfo',
label: '',
displayFormItem: false,
class: 'ns-form-item-full',
component: 'NsChildForm',
componentProps: {
title: '公式编辑',
schemas: [
{
label: '',
field: 'formula',
component: 'NsTextarea',
defaultValue: '(A+B)*2',
formItemProps: {
wrapperCol: { span: 24 },
},
componentProps: {
placeholder: '请输入',
autoSize: {
minRows: 6,
maxRows: 6,
},
},
},
],
},
},
{
field: 'list',
label: '',
displayFormItem: false,
class: 'ns-form-item-full',
component: 'NsChildForm',
componentProps: {
title: '分组列表',
schemas: [
{
label: '',
field: 'NsBasicTable',
component: 'NsBasicTable',
formItemProps: {
wrapperCol: { span: 24 },
},
componentProps: {
disabled: true,
placeholder: '请输入',
dataSource: mockDataSource.value,
pagination: false,
rowKey: (record) => record.groupName,
columns: [
{
title: '序号',
dataIndex: 'name',
customRender: ({ index }) => index + 1,
width: 80,
align: 'center',
},
{
title: '分组名称',
dataIndex: 'groupName',
align: 'center',
},
],
},
},
],
},
},
];
const btnClick = () => {
visible.value = false;
NsMessage.success('操作成功');
};
defineExpose({
toggle,
});
</script>
<style scoped lang="less">
.drawerContainer {
height: 100%;
display: flex;
justify-content: space-between;
}
</style>

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