diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f107fe2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,108 @@
+
+
+
+RuoYi v3.9.0
+基于SpringBoot+Vue3前后端分离的Java快速开发框架
+
+
+
+
+
+
+## 平台简介
+
+* 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。
+* 配套后端代码仓库地址[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) 或 [RuoYi-Vue-fast](https://gitcode.com/yangzongzhuan/RuoYi-Vue-fast) 版本。
+* 前端技术栈([Vue2](https://cn.vuejs.org) + [Element](https://github.com/ElemeFE/element) + [Vue CLI](https://cli.vuejs.org/zh)),请移步[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue/tree/master/ruoyi-ui)。
+* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)
+
+## 前端运行
+
+```bash
+# 克隆项目
+git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git
+
+# 进入项目目录
+cd RuoYi-Vue3
+
+# 安装依赖
+yarn --registry=https://registry.npmmirror.com
+
+# 启动服务
+yarn dev
+
+# 构建测试环境 yarn build:stage
+# 构建生产环境 yarn build:prod
+# 前端访问地址 http://localhost:80
+```
+
+## 内置功能
+
+1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
+2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
+3. 岗位管理:配置系统用户所属担任职务。
+4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
+5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
+6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
+7. 参数管理:对系统动态配置常用参数。
+8. 通知公告:系统通知公告信息发布维护。
+9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
+10. 登录日志:系统登录日志记录查询包含登录异常。
+11. 在线用户:当前系统中活跃用户状态监控。
+12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
+13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。
+14. 系统接口:根据业务代码自动生成相关的api接口文档。
+15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。
+16. 缓存监控:对系统的缓存信息查询,命令统计等。
+17. 在线构建器:拖动表单元素生成相应的HTML代码。
+18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
+
+## 在线体验
+
+- admin/admin123
+- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。
+
+演示地址:http://vue.ruoyi.vip
+文档地址:http://doc.ruoyi.vip
+
+## 演示图
+
+
+
+  |
+  |
+
+
+  |
+  |
+
+
+  |
+  |
+
+
+  |
+  |
+
+
+  |
+  |
+
+
+  |
+  |
+
+
+  |
+  |
+
+
+  |
+  |
+
+
+
+
+## 若依前后端分离交流群
+
+QQ群: [](https://jq.qq.com/?_wv=1027&k=5bVB1og) [](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [](https://jq.qq.com/?_wv=1027&k=51G72yr) [](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [](https://jq.qq.com/?_wv=1027&k=SpyH2875) [](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=GsOo-OLz53J8y_9TPoO6XXSGNRTgbFxA&authKey=R7Uy%2Feq%2BZsoKNqHvRKhiXpypW7DAogoWapOawUGHokJSBIBIre2%2FoiAZeZBSLuBc&noverify=0&group_code=191164766) 点击按钮入群。
\ No newline at end of file
diff --git a/bin/build.bat b/bin/build.bat
new file mode 100644
index 0000000..8868727
--- /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..8693727
--- /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..f9d3ae8
--- /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/html/ie.html b/html/ie.html
new file mode 100644
index 0000000..390ce8a
--- /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/index.html b/index.html
new file mode 100644
index 0000000..491c3f1
--- /dev/null
+++ b/index.html
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+
+
+
+ 十堰运维
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d8058bd
--- /dev/null
+++ b/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "ruoyi",
+ "version": "3.9.0",
+ "description": "若依管理系统",
+ "author": "若依",
+ "license": "MIT",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build:prod": "vite build",
+ "build:stage": "vite build --mode staging",
+ "preview": "vite preview"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://gitee.com/y_project/RuoYi-Vue.git"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "2.3.1",
+ "@vueup/vue-quill": "1.2.0",
+ "@vueuse/core": "13.3.0",
+ "axios": "1.9.0",
+ "clipboard": "2.0.11",
+ "echarts": "5.6.0",
+ "element-plus": "2.10.7",
+ "file-saver": "2.0.5",
+ "fuse.js": "6.6.2",
+ "js-beautify": "1.14.11",
+ "js-cookie": "3.0.5",
+ "jsencrypt": "3.3.2",
+ "moment": "^2.30.1",
+ "nprogress": "0.2.0",
+ "pinia": "3.0.2",
+ "splitpanes": "4.0.4",
+ "vue": "3.5.16",
+ "vue-cropper": "1.1.1",
+ "vue-router": "4.5.1",
+ "vuedraggable": "4.1.0",
+ "xlsx": "^0.18.5"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "5.2.4",
+ "less": "^4.4.1",
+ "sass-embedded": "1.89.1",
+ "unplugin-auto-import": "0.18.6",
+ "unplugin-vue-setup-extend-plus": "1.0.1",
+ "vite": "6.3.5",
+ "vite-plugin-compression": "0.5.1",
+ "vite-plugin-svg-icons": "2.0.1"
+ },
+ "overrides": {
+ "quill": "2.0.2"
+ }
+}
diff --git a/public/config.js b/public/config.js
new file mode 100644
index 0000000..3b27f31
--- /dev/null
+++ b/public/config.js
@@ -0,0 +1,14 @@
+/*
+ * @Author: 季万俊
+ * @Date: 2025-09-26 16:33:30
+ * @Description:
+ */
+window.customConfigUrl = {
+ // baseURL: 'http://172.16.1.254:13020', //常用接口地址
+ baseURL: 'http://forex.zicp.net', //常用接口地址
+ refreshTime: 3000000, //详情窗口数据轮询间隔时间
+ deviceDataReqTime: 3000000, //平面图页面状态轮询间隔
+ faultColor: '#FF9912', //故障 报警 颜色
+ openColor: '#00C957', //运行中 颜色
+ closeColor: '#FF0000' //非运行中 颜色
+};
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..e263760
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..87b89b0
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/src/api/alarm/index.js b/src/api/alarm/index.js
new file mode 100644
index 0000000..24d7cc7
--- /dev/null
+++ b/src/api/alarm/index.js
@@ -0,0 +1,98 @@
+import request from "@/utils/request";
+
+//级别列表查询
+export function getLevelList(query) {
+ return request({
+ url: "/sysConfig/level/list",
+ method: "get",
+ params: query,
+ });
+}
+// 单条级别查询
+export function getLevelDetail(query) {
+ return request({
+ url: "/sysConfig/level/" + query.id,
+ method: "get",
+ });
+}
+// 新增级别数据
+export function addLevel(data) {
+ return request({
+ url: "/sysConfig/level/add",
+ method: "post",
+ data
+ });
+}
+// 修改级别数据
+export function updateLevel(data) {
+ return request({
+ url: "/sysConfig/level/update",
+ method: "post",
+ data
+ });
+}
+// 删除级别数据
+export function delLevel(query) {
+ return request({
+ url: "/sysConfig/level/remove/" + query.id,
+ method: "get",
+ });
+}
+// 查询人员列表
+export function getUser(query) {
+ return request({
+ url: "/sysConfig/level/getUser",
+ method: "get",
+ params:query
+ });
+}
+
+//查询报警列表
+export function getAlarmList(query) {
+ return request({
+ url: "/sysConfig/warningConfig/list",
+ method: "get",
+ params:query
+ });
+}
+// 查看报警详情
+export function getAlarmDetail(query) {
+ return request({
+ url: "/sysConfig/warningConfig/"+query.id,
+ method: "get",
+ // params:query
+ });
+}
+// 修改报警
+export function updateAlarm(data) {
+ return request({
+ url: "/sysConfig/warningConfig/update",
+ method: "post",
+ data
+ });
+}
+// 查看报警详情
+export function delAlarm(query) {
+ return request({
+ url: "/sysConfig/warningConfig/remove/"+query.id,
+ method: "get",
+ // params:query
+ });
+}
+// 新增报警
+export function addAlarm(data) {
+ return request({
+ url: "/sysConfig/warningConfig/add",
+ method: "post",
+ data
+ });
+}
+// 根据类型查询参数
+export function getStatus(query) {
+ return request({
+ url: "/sysConfig/warningConfig/getStatus/"+query.id,
+ method: "get",
+ // params:query
+ });
+}
+
diff --git a/src/api/energyConsumption.js b/src/api/energyConsumption.js
new file mode 100644
index 0000000..e25951e
--- /dev/null
+++ b/src/api/energyConsumption.js
@@ -0,0 +1,80 @@
+import request from "@/utils/request";
+export function waterMeterMonitor(data) {
+ return request({
+ url: "/energyConsumptionManagement/waterMeterMonitor",
+ method: "post",
+ data,
+ });
+}
+export function electricityMeterMonitor(data) {
+ return request({
+ url: `/energyConsumptionManagement/electricityMeterMonitor`,
+ method: "post",
+ data,
+ });
+}
+export function controlAllList(data) {
+ return request({
+ url: `/device/control/allList`,
+ method: "post",
+ data,
+ });
+}
+export function conditionalDeviceAndControlArea(query) {
+ return request({
+ url: `/energyConsumptionManagement/conditionalDeviceAndControlArea`,
+ method: "get",
+ params: query,
+ });
+}
+export function saveDeviceRule(data) {
+ return request({
+ url: `/energyConsumptionManagement/saveDeviceRule`,
+ method: "post",
+ data,
+ });
+}
+export function pageListDeviceRule(query) {
+ return request({
+ url: `/energyConsumptionManagement/pageListDeviceRule`,
+ method: "get",
+ params: query,
+ });
+}
+export function detailDeviceRule(ruleId, typeId) {
+ return request({
+ url: `/energyConsumptionManagement/detailDeviceRule?deviceRuleId=${ruleId}&deviceTypeId=${typeId}`,
+ method: "get",
+ });
+}
+export function deleteDeviceRuleById(id) {
+ return request({
+ url: `/energyConsumptionManagement/deleteDeviceRuleById?deviceRuleId=${id}`,
+ method: "get",
+ });
+}
+export function getElectricityUsageDetails(date, type) {
+ return request({
+ url: `/energyConsumptionManagement/getElectricityUsageDetails?searchDate=${date}&searchType=${type}`,
+ method: "get",
+ });
+}
+export function getWaterUsageDetails(date, type) {
+ return request({
+ url: `/energyConsumptionManagement/getWaterUsageDetails?searchDate=${date}&searchType=${type}`,
+ method: "get",
+ });
+}
+export function getEnergyConsumptionData(query = {}) {
+ return request({
+ url: `/energyConsumptionManagement/getEnergyConsumptionData`,
+ method: "get",
+ params: query,
+ });
+}
+export function getPowerLadderDetail(date) {
+ return request({
+ url: `/energyConsumptionManagement/getPowerLadderDetail?date=${date}`,
+ method: "get",
+ });
+}
diff --git a/src/api/environmental.js b/src/api/environmental.js
new file mode 100644
index 0000000..d4289ff
--- /dev/null
+++ b/src/api/environmental.js
@@ -0,0 +1,62 @@
+/*
+ * @Author: 季万俊
+ * @Date: 2025-09-26 11:23:42
+ * @Description:
+ */
+import request from "@/utils/request";
+export function deviceControlList(data) {
+ return request({
+ url: "/device/control/list",
+ method: "post",
+ data,
+ });
+}
+
+export function deviceControlListOther(data) {
+ return request({
+ url: "/device/control/listOther",
+ method: "post",
+ data,
+ });
+}
+export function controlDevice(data) {
+ return request({
+ url: `/ControlDevice`,
+ method: "post",
+ data,
+ baseUrl: process.env.VITE_VUE_APP_CONTROL_BASE_API,
+ });
+}
+
+
+// 新增巡更管理接口
+export function addPatrol(data) {
+ return request({
+ url: `/sysConfig/management/add`,
+ method: "post",
+ data,
+ });
+}
+// 查询巡更管理接口
+export function getPatrolList(query) {
+ return request({
+ url: `/sysConfig/management/list`,
+ method: "get",
+ params: query,
+ });
+}
+// 修改巡更管理接口
+export function updatePatrol(data) {
+ return request({
+ url: `/sysConfig/management/update`,
+ method: "post",
+ data,
+ });
+}
+// 删除
+export function delPatrol(query) {
+ return request({
+ url: `/sysConfig/management/remove/${query.id}`,
+ method: "get",
+ });
+}
diff --git a/src/api/equipment.js b/src/api/equipment.js
new file mode 100644
index 0000000..543260f
--- /dev/null
+++ b/src/api/equipment.js
@@ -0,0 +1,350 @@
+import request from "@/utils/request";
+export function deviceList(query) {
+ return request({
+ url: "/device/device/list",
+ method: "get",
+ params: query,
+ });
+}
+export function deviceTypeList(query) {
+ return request({
+ url: "/device/device/deviceTypeList",
+ method: "get",
+ params: query,
+ });
+}
+export function addDevice(data) {
+ return request({
+ url: "/device/device/add",
+ method: "post",
+ data,
+ });
+}
+export function editDevice(data) {
+ return request({
+ url: "/device/device/edit",
+ method: "post",
+ data,
+ });
+}
+export function deleteDevice(query) {
+ return request({
+ url: `/device/device/remove/${query}`,
+ method: "get",
+ // params: query,
+ });
+}
+export function instructionList(query = {}) {
+ return request({
+ url: `/device/instruction/list`,
+ method: "get",
+ params: query,
+ });
+}
+export function addInstruction(data) {
+ return request({
+ url: `/device/instruction/add`,
+ method: "post",
+ data,
+ });
+}
+export function editInstruction(data) {
+ return request({
+ url: `/device/instruction/edit`,
+ method: "post",
+ data,
+ });
+}
+export function deleteInstruction(query) {
+ return request({
+ url: `/device/instruction/remove/${query}`,
+ method: "get",
+ });
+}
+export function deviceTypeModel(query) {
+ return request({
+ url: `/device/typeModel/${query}`,
+ method: "get",
+ });
+}
+export function deviceTypeModelList(query) {
+ return request({
+ url: `/device/typeModel/list`,
+ method: "get",
+ params: query,
+ });
+}
+export function deviceTypeModelAdd(data) {
+ return request({
+ url: `/device/typeModel/add`,
+ method: "post",
+ data,
+ });
+}
+export function deviceTypeModelEdit(data) {
+ return request({
+ url: `/device/typeModel/edit`,
+ method: "post",
+ data,
+ });
+}
+export function deviceTypeModelDelete(id) {
+ return request({
+ url: `/device/typeModel/remove/${id}`,
+ method: "get",
+ });
+}
+export function monitorList(query = {}) {
+ return request({
+ url: `/device/management/list`,
+ method: "get",
+ params: query,
+ });
+}
+// http协议外层编辑
+export function protocolHttpEdit(data) {
+ return request({
+ url: `/device/protocolHttp/edit`,
+ method: "post",
+ data,
+ });
+}
+// 其他协议外层编辑
+export function protocolOtherEdit(data) {
+ return request({
+ url: `/device/protocolOther/edit`,
+ method: "post",
+ data,
+ });
+}
+// http协议表格增删改查
+export function protocolHttpValueList(query) {
+ return request({
+ url: `/device/protocolHttpValue/list`,
+ method: "get",
+ params: query,
+ });
+}
+export function protocolHttpValueAdd(data) {
+ return request({
+ url: `/device/protocolHttpValue/add`,
+ method: "post",
+ data,
+ });
+}
+export function protocolHttpValueEdit(data) {
+ return request({
+ url: `/device/protocolHttpValue/edit`,
+ method: "post",
+ data,
+ });
+}
+export function protocolHttpValueDelete(id) {
+ return request({
+ url: `/device/protocolHttpValue/remove/${id}`,
+ method: "get",
+ });
+}
+// 其他协议表格增删改查
+export function protocolOtherValueList(query) {
+ return request({
+ url: `/device/protocolOtherValue/list`,
+ method: "get",
+ params: query,
+ });
+}
+export function protocolOtherValueAdd(data) {
+ return request({
+ url: `/device/protocolOtherValue/add`,
+ method: "post",
+ data,
+ });
+}
+export function protocolOtherValueEdit(data) {
+ return request({
+ url: `/device/protocolOtherValue/edit`,
+ method: "post",
+ data,
+ });
+}
+export function protocolOtherValueDelete(id) {
+ return request({
+ url: `/device/protocolOtherValue/remove/${id}`,
+ method: "get",
+ });
+}
+export function minitorAdd(data) {
+ return request({
+ url: "/device/management/add",
+ method: "post",
+ data,
+ });
+}
+export function minitorEdit(data) {
+ return request({
+ url: "/device/management/edit",
+ method: "post",
+ data,
+ });
+}
+export function minitorDelete(id) {
+ return request({
+ url: `/device/management/remove/${id}`,
+ method: "get",
+ });
+}
+
+export function ruleAdd(data) {
+ return request({
+ url: "/management/rule/add",
+ method: "post",
+ data,
+ });
+}
+
+export function ruleList(query) {
+ return request({
+ url: `/management/rule/list`,
+ method: "get",
+ params: query,
+ });
+}
+
+export function ruleDel(data) {
+ return request({
+ url: "/management/rule/remove/"+data,
+ method: "get",
+ });
+}
+
+export function rulegroupAdd(data) {
+ return request({
+ url: "/management/rulegroup/add",
+ method: "post",
+ data,
+ });
+}
+
+export function rulegroupList(query) {
+ return request({
+ url: `/management/rulegroup/list`,
+ method: "get",
+ params: query,
+ });
+}
+
+export function rulegroupDel(data) {
+ return request({
+ url: "/management/rulegroup/remove/"+data,
+ method: "get",
+ });
+}
+
+export function rulegroupUpdate(data) {
+ return request({
+ url: "/management/rulegroup/update",
+ method: "post",
+ data,
+ });
+}
+
+export function ruleQuerybyId(data) {
+ return request({
+ url: "/management/rule/"+data,
+ method: "get",
+ });
+}
+
+export function rulegroupQuerybyId(data) {
+ return request({
+ url: "/management/rulegroup/"+data,
+ method: "get",
+ });
+}
+
+export function ruleUpdate(data) {
+ return request({
+ url: "/management/rule/update",
+ method: "post",
+ data,
+ });
+}
+
+export function getServerData(query) {
+ return request({
+ url: `/GetData/`,
+ method: "get",
+ params: query,
+ baseUrl: process.env.VITE_VUE_APP_SERVER_BASE_API,
+ });
+}
+
+export function setServerData(query) {
+ return request({
+ url: `/ControlServer/`,
+ method: "get",
+ params: query,
+ baseUrl: process.env.VITE_VUE_APP_SERVER_BASE_API,
+ });
+}
+
+export function getSysConfig(query) {
+ return request({
+ url: `/sysConfig/config/1`,
+ method: "get",
+ params: query,
+ });
+}
+
+export function sysConfigUpdate(data) {
+ return request({
+ url: "/sysConfig/config/update",
+ method: "post",
+ data,
+ });
+}
+
+export function deviceAdd(data) {
+ return request({
+ url: "/device/day/add",
+ method: "post",
+ data,
+ });
+}
+
+export function devicedayList(query) {
+ return request({
+ url: `/device/day/list`,
+ method: "get",
+ params: query,
+ });
+}
+
+export function deviceDayDel(data) {
+ return request({
+ url: "/device/day/remove/"+data,
+ method: "get",
+ });
+}
+
+export function deviceDayUpdate(data) {
+ return request({
+ url: "/device/day/update",
+ method: "post",
+ data,
+ });
+}
+export function deviceGetYear(query) {
+ return request({
+ url: `/device/day/getYear`,
+ method: "get",
+ params: query,
+ });
+}
+export function getVacationDayByYear(query) {
+ return request({
+ url: `/device/day/getVacationDayByYear`,
+ method: "get",
+ params: query,
+ });
+}
diff --git a/src/api/index.js b/src/api/index.js
new file mode 100644
index 0000000..7cb463a
--- /dev/null
+++ b/src/api/index.js
@@ -0,0 +1,15 @@
+import request from "@/utils/request";
+export function deviceTypeListCount(query) {
+ return request({
+ url: "/device/device/deviceTypeListCount",
+ method: "get",
+ params: query,
+ });
+}
+export function getEnergyUseTrend(query = {}) {
+ return request({
+ url: "/energyConsumptionManagement/getEnergyUseTrend",
+ method: "get",
+ params: query,
+ });
+}
diff --git a/src/api/knowledge/content.js b/src/api/knowledge/content.js
new file mode 100644
index 0000000..c64b3cc
--- /dev/null
+++ b/src/api/knowledge/content.js
@@ -0,0 +1,52 @@
+import request from "@/utils/request";
+
+//知识库内容新增
+export function knowledgeAdd(query) {
+ return request({
+ url: "/device/knowledge/add",
+ method: "post",
+ data: query,
+ });
+}
+//知识库查询
+export function knowledgeList(query) {
+ return request({
+ url: "/device/knowledge/list",
+ method: "get",
+ params: query,
+ });
+}
+
+//知识库修改
+export function knowledgeUpdate(query) {
+ return request({
+ url: "/device/knowledge/update",
+ method: "post",
+ data: query,
+ });
+}
+
+//知识库删除
+export function knowledgeRemove(query) {
+ return request({
+ url: "/device/knowledge/remove/" + query,
+ method: "get",
+ params: query,
+ });
+}
+
+//知识库单条查询
+export function knowledgeById(query) {
+ return request({
+ url: "/device/knowledge/" + query,
+ method: "get",
+ });
+}
+//知识库类型查询
+export function knowledgeTypeList(query) {
+ return request({
+ url: "/device/knowledgeType/list",
+ method: "get",
+ params: query,
+ });
+}
\ No newline at end of file
diff --git a/src/api/knowledge/type.js b/src/api/knowledge/type.js
new file mode 100644
index 0000000..22e10cc
--- /dev/null
+++ b/src/api/knowledge/type.js
@@ -0,0 +1,36 @@
+import request from "@/utils/request";
+
+//知识库类型新增
+export function knowledgeTypeAdd(query) {
+ return request({
+ url: "/device/knowledgeType/add",
+ method: "post",
+ data: query,
+ });
+}
+//知识库类型查询
+export function knowledgeTypeList(query) {
+ return request({
+ url: "/device/knowledgeType/list",
+ method: "get",
+ params: query,
+ });
+}
+
+//知识库类型修改
+export function knowledgeTypeUpdate(query) {
+ return request({
+ url: "/device/knowledgeType/update",
+ method: "post",
+ data: query,
+ });
+}
+
+//知识库类型删除
+export function knowledgeTypeRemove(query) {
+ return request({
+ url: "/device/knowledgeType/remove/" + query,
+ method: "get",
+ params: query,
+ });
+}
\ No newline at end of file
diff --git a/src/api/login.js b/src/api/login.js
new file mode 100644
index 0000000..9f333cb
--- /dev/null
+++ b/src/api/login.js
@@ -0,0 +1,60 @@
+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,
+ repeatSubmit: 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..6e52e6e
--- /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..e1f2c87
--- /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(cacheKey) {
+ return request({
+ url: '/monitor/cache/clearCacheKey/' + cacheKey,
+ method: 'delete'
+ })
+}
+
+// 清理全部缓存
+export function clearCacheAll() {
+ return request({
+ url: '/monitor/cache/clearCacheAll',
+ method: 'delete'
+ })
+}
diff --git a/src/api/monitor/job.js b/src/api/monitor/job.js
new file mode 100644
index 0000000..b33ad3d
--- /dev/null
+++ b/src/api/monitor/job.js
@@ -0,0 +1,71 @@
+import request from '@/utils/request'
+
+// 查询定时任务调度列表
+export function listJob(query) {
+ return request({
+ url: '/monitor/job/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询定时任务调度详细
+export function getJob(jobId) {
+ return request({
+ url: '/monitor/job/' + jobId,
+ method: 'get'
+ })
+}
+
+// 新增定时任务调度
+export function addJob(data) {
+ return request({
+ url: '/monitor/job',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改定时任务调度
+export function updateJob(data) {
+ return request({
+ url: '/monitor/job',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除定时任务调度
+export function delJob(jobId) {
+ return request({
+ url: '/monitor/job/' + jobId,
+ method: 'delete'
+ })
+}
+
+// 任务状态修改
+export function changeJobStatus(jobId, status) {
+ const data = {
+ jobId,
+ status
+ }
+ return request({
+ url: '/monitor/job/changeStatus',
+ method: 'put',
+ data: data
+ })
+}
+
+
+// 定时任务立即执行一次
+export function runJob(jobId, jobGroup) {
+ const data = {
+ jobId,
+ jobGroup
+ }
+ return request({
+ url: '/monitor/job/run',
+ method: 'put',
+ data: data
+ })
+}
\ No newline at end of file
diff --git a/src/api/monitor/jobLog.js b/src/api/monitor/jobLog.js
new file mode 100644
index 0000000..654bbae
--- /dev/null
+++ b/src/api/monitor/jobLog.js
@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+
+// 查询调度日志列表
+export function listJobLog(query) {
+ return request({
+ url: '/monitor/jobLog/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 删除调度日志
+export function delJobLog(jobLogId) {
+ return request({
+ url: '/monitor/jobLog/' + jobLogId,
+ method: 'delete'
+ })
+}
+
+// 清空调度日志
+export function cleanJobLog() {
+ return request({
+ url: '/monitor/jobLog/clean',
+ method: 'delete'
+ })
+}
diff --git a/src/api/monitor/logininfor.js b/src/api/monitor/logininfor.js
new file mode 100644
index 0000000..c49a40e
--- /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..288ebe0
--- /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..6e881df
--- /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/server.js b/src/api/monitor/server.js
new file mode 100644
index 0000000..cac7791
--- /dev/null
+++ b/src/api/monitor/server.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 获取服务信息
+export function getServer() {
+ return request({
+ url: '/monitor/server',
+ method: 'get'
+ })
+}
\ No newline at end of file
diff --git a/src/api/system/area.js b/src/api/system/area.js
new file mode 100644
index 0000000..32049c0
--- /dev/null
+++ b/src/api/system/area.js
@@ -0,0 +1,36 @@
+import request from "@/utils/request";
+export function managementList(query) {
+ return request({
+ url: "/management/management/list",
+ method: "get",
+ params: query,
+ });
+}
+export function managementListAll(query) {
+ return request({
+ url: "/management/management/listAll",
+ method: "get",
+ params: query,
+ });
+}
+export function managementAdd(data) {
+ return request({
+ url: "/management/management/add",
+ method: "post",
+ data: data,
+ });
+}
+export function managementDelete(query) {
+ return request({
+ url: `/management/management/remove/${query}`,
+ method: "get",
+ // params: query,
+ });
+}
+export function managementEdit(data) {
+ return request({
+ url: `/management/management/edit`,
+ method: "post",
+ data,
+ });
+}
diff --git a/src/api/system/config.js b/src/api/system/config.js
new file mode 100644
index 0000000..7858c69
--- /dev/null
+++ b/src/api/system/config.js
@@ -0,0 +1,60 @@
+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 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..9ca6966
--- /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..2a6e481
--- /dev/null
+++ b/src/api/system/dict/data.js
@@ -0,0 +1,52 @@
+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..526977d
--- /dev/null
+++ b/src/api/system/dict/type.js
@@ -0,0 +1,60 @@
+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'
+ })
+}
\ No newline at end of file
diff --git a/src/api/system/menu.js b/src/api/system/menu.js
new file mode 100644
index 0000000..97258ee
--- /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..737fc16
--- /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/post.js b/src/api/system/post.js
new file mode 100644
index 0000000..8faa266
--- /dev/null
+++ b/src/api/system/post.js
@@ -0,0 +1,44 @@
+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..528cd18
--- /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..6d98f63
--- /dev/null
+++ b/src/api/system/user.js
@@ -0,0 +1,136 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/ruoyi";
+
+// 查询用户列表
+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',
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+ 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'
+ })
+}
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..96cd5eb
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,84 @@
+import { createApp } from 'vue'
+
+import Cookies from 'js-cookie'
+
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import 'element-plus/theme-chalk/dark/css-vars.css'
+import locale from 'element-plus/es/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
+import { download } from '@/utils/request'
+
+// svg图标
+import 'virtual:svg-icons-register'
+import SvgIcon from '@/components/SvgIcon'
+import elementIcons from '@/components/SvgIcon/svgicon'
+
+import './permission' // permission control
+
+import { useDict } from '@/utils/dict'
+import { getConfigKey } from "@/api/system/config"
+import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi'
+
+// 分页组件
+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 DictTag from '@/components/DictTag'
+
+const app = createApp(App)
+
+// 全局方法挂载
+app.config.globalProperties.useDict = useDict
+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.getConfigKey = getConfigKey
+app.config.globalProperties.selectDictLabel = selectDictLabel
+app.config.globalProperties.selectDictLabels = selectDictLabels
+
+// 全局组件挂载
+app.component('DictTag', DictTag)
+app.component('Pagination', Pagination)
+app.component('FileUpload', FileUpload)
+app.component('ImageUpload', ImageUpload)
+app.component('ImagePreview', ImagePreview)
+app.component('RightToolbar', RightToolbar)
+app.component('Editor', Editor)
+
+app.use(router)
+app.use(store)
+app.use(plugins)
+app.use(elementIcons)
+app.component('svg-icon', SvgIcon)
+
+directive(app)
+
+// 使用element-plus 并且设置全局的大小
+app.use(ElementPlus, {
+ locale: locale,
+ // 支持 large、default、small
+ size: Cookies.get('size') || 'default'
+})
+
+app.mount('#app')
diff --git a/src/permission.js b/src/permission.js
new file mode 100644
index 0000000..5c47727
--- /dev/null
+++ b/src/permission.js
@@ -0,0 +1,96 @@
+/*
+ * @Author: 季万俊
+ * @Date: 2025-09-04 19:58:43
+ * @Description:
+ */
+import router from './router'
+import { ElMessage } from 'element-plus'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import { getToken } from '@/utils/auth'
+import { isHttp, isPathMatch } 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']
+
+// 添加路由的辅助函数
+const addRoutes = (routes) => {
+ routes.forEach(route => {
+ router.addRoute(route)
+ })
+}
+
+// 初始化路由
+const initRoutes = () => {
+ const permissionStore = usePermissionStore()
+ permissionStore.GenerateRoutes().then(accessRoutes => {
+ // 根据roles权限生成可访问的路由表
+ addRoutes(accessRoutes) // 动态添加可访问路由表
+ // next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+ })
+}
+
+router.beforeEach((to, from, next) => {
+ NProgress.start()
+
+ // 在路由守卫内部获取store实例
+ const userStore = useUserStore()
+ const settingsStore = useSettingsStore()
+ const permissionStore = usePermissionStore()
+
+ if (getToken()) {
+ to.meta.title && settingsStore.setTitle(to.meta.title)
+ /* has token*/
+ if (to.path === '/login') {
+ next({ path: '/' })
+ NProgress.done()
+ } else if (whiteList.indexOf(to.path) !== -1) {
+ next()
+ } else {
+ if (userStore.roles.length === 0) {
+ isRelogin.show = true
+ // 判断当前用户是否已拉取完user_info信息
+ userStore.GetInfo().then(() => {
+ isRelogin.show = false
+ permissionStore.GenerateRoutes().then(accessRoutes => {
+ // 根据roles权限生成可访问的路由表
+ addRoutes(accessRoutes) // 动态添加可访问路由表
+ next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+ })
+ }).catch(err => {
+ userStore.LogOut().then(() => {
+ ElMessage.error(err)
+ next({ path: '/' })
+ })
+ })
+ } else {
+ next()
+ }
+ }
+ } else {
+ // 没有token
+ if (whiteList.indexOf(to.path) !== -1) {
+ // 在免登录白名单,直接进入
+ next()
+ } else {
+ next()
+ return
+ next(`/login?redirect=${encodeURIComponent(to.fullPath)}`) // 否则全部重定向到登录页
+ NProgress.done()
+ }
+ }
+})
+
+router.afterEach(() => {
+ NProgress.done()
+})
+
+// 在应用启动后初始化路由
+setTimeout(() => {
+ initRoutes()
+}, 0)
diff --git a/src/settings.js b/src/settings.js
new file mode 100644
index 0000000..0757ed4
--- /dev/null
+++ b/src/settings.js
@@ -0,0 +1,62 @@
+/*
+ * @Author: 季万俊
+ * @Date: 2025-09-26 11:23:42
+ * @Description:
+ */
+export default {
+ /**
+ * 网页标题
+ */
+ title: import.meta.env.VITE_APP_TITLE,
+
+ /**
+ * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
+ */
+ sideTheme: 'theme-light',
+
+ /**
+ * 是否系统布局配置
+ */
+ showSettings: true,
+
+ /**
+ * 是否显示顶部导航
+ */
+ topNav: false,
+
+ /**
+ * 是否显示 tagsView
+ */
+ tagsView: true,
+
+ /**
+ * 显示页签图标
+ */
+ tagsIcon: false,
+
+ /**
+ * 是否固定头部
+ */
+ fixedHeader: false,
+
+ /**
+ * 是否显示logo
+ */
+ sidebarLogo: true,
+
+ /**
+ * 是否显示动态标题
+ */
+ dynamicTitle: false,
+
+ /**
+ * 是否显示底部版权
+ */
+ footerVisible: false,
+
+ /**
+ * 底部版权文本内容
+ */
+ footerContent: 'Copyright © 2018-2025 RuoYi. All Rights Reserved.'
+}
+
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..627c911
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,94 @@
+/*
+ * @Author: 季万俊
+ * @Date: 2025-09-04 19:58:43
+ * @Description:
+ */
+import { defineConfig, loadEnv } from 'vite'
+import path from 'path'
+import createVitePlugins from './vite/plugins'
+
+const baseUrl = 'http://localhost:8080' // 后端接口
+
+// https://vitejs.dev/config/
+export default defineConfig(({ mode, command }) => {
+ const env = loadEnv(mode, process.cwd())
+ const { VITE_APP_ENV } = env
+ return {
+ // 部署生产环境和开发环境下的URL。
+ // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
+ // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
+ base: VITE_APP_ENV === 'production' ? '/' : '/',
+ plugins: createVitePlugins(env, command === 'build'),
+ resolve: {
+ // https://cn.vitejs.dev/config/#resolve-alias
+ alias: {
+ // 设置路径
+ '~': path.resolve(__dirname, './'),
+ // 设置别名
+ '@': path.resolve(__dirname, './src')
+ },
+ // https://cn.vitejs.dev/config/#resolve-extensions
+ extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
+ },
+ // 打包配置
+ build: {
+ // https://vite.dev/config/build-options.html
+ sourcemap: command === 'build' ? false : 'inline',
+ outDir: 'dist',
+ assetsDir: 'assets',
+ chunkSizeWarningLimit: 2000,
+ rollupOptions: {
+ output: {
+ chunkFileNames: 'static/js/[name]-[hash].js',
+ entryFileNames: 'static/js/[name]-[hash].js',
+ assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
+ }
+ }
+ },
+ // vite 相关配置
+ server: {
+ port: 80,
+ host: true,
+ open: true,
+ proxy: {
+ // https://cn.vitejs.dev/config/#server-proxy
+ '/dev-api': {
+ target: baseUrl,
+ changeOrigin: true,
+ rewrite: (p) => p.replace(/^\/dev-api/, '')
+ },
+ // springdoc proxy
+ '^/v3/api-docs/(.*)': {
+ target: baseUrl,
+ changeOrigin: true,
+ }
+ }
+ },
+ css: {
+ preprocessorOptions: {
+ scss: {
+ // 屏蔽Sass的@import deprecation警告
+ quietDeps: true, // 抑制依赖中的警告
+ // 可选:针对特定警告代码进行屏蔽(Sass的@import警告代码为deprecation-module-import)
+ warningSuppress: [
+ { code: 'deprecation-module-import' }
+ ]
+ }
+ },
+ postcss: {
+ plugins: [
+ {
+ postcssPlugin: 'internal:charset-removal',
+ AtRule: {
+ charset: (atRule) => {
+ if (atRule.name === 'charset') {
+ atRule.remove()
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+})