浏览代码

修改界面:登录页、个人中心、水温时刻图表、查询页

修改后端:操作日志、水温列表查询优化
lamphua 1 个月前
父节点
当前提交
de62293dd8

+ 5
- 0
cmc-temperature-back/cmc-monitoring/pom.xml 查看文件

20
             <artifactId>ruoyi-common</artifactId>
20
             <artifactId>ruoyi-common</artifactId>
21
         </dependency>
21
         </dependency>
22
 
22
 
23
+        <dependency>
24
+            <groupId>com.ruoyi</groupId>
25
+            <artifactId>ruoyi-framework</artifactId>
26
+        </dependency>
27
+
23
         <!-- lombok -->
28
         <!-- lombok -->
24
         <dependency>
29
         <dependency>
25
             <groupId>org.projectlombok</groupId>
30
             <groupId>org.projectlombok</groupId>

+ 4
- 0
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/controller/CmcTemperatureController.java 查看文件

3
 import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
3
 import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
4
 import com.mybatisflex.core.paginate.Page;
4
 import com.mybatisflex.core.paginate.Page;
5
 import com.mybatisflex.core.query.QueryWrapper;
5
 import com.mybatisflex.core.query.QueryWrapper;
6
+import com.ruoyi.common.enums.BusinessType;
6
 import com.ruoyi.common.utils.ExcelUtil;
7
 import com.ruoyi.common.utils.ExcelUtil;
7
 import com.ruoyi.common.web.domain.PageData;
8
 import com.ruoyi.common.web.domain.PageData;
9
+import com.ruoyi.framework.annotation.RyLog;
8
 import com.ruoyi.monitoring.domain.CmcChannel;
10
 import com.ruoyi.monitoring.domain.CmcChannel;
9
 import com.ruoyi.monitoring.domain.CmcTemperature;
11
 import com.ruoyi.monitoring.domain.CmcTemperature;
10
 import com.ruoyi.monitoring.service.ICmcChannelService;
12
 import com.ruoyi.monitoring.service.ICmcChannelService;
104
     /**
106
     /**
105
      * 根据点位查询水温监测列表(不分页)
107
      * 根据点位查询水温监测列表(不分页)
106
      */
108
      */
109
+    @RyLog(title = "数据查询", businessType = BusinessType.QUERY)
107
     @Get
110
     @Get
108
     @Mapping("listAllByInfo")
111
     @Mapping("listAllByInfo")
109
     public PageData<CmcTemperature> listAllByInfo(CmcTemperature cmcTemperature, CmcChannel cmcChannel) {
112
     public PageData<CmcTemperature> listAllByInfo(CmcTemperature cmcTemperature, CmcChannel cmcChannel) {
115
     /**
118
     /**
116
      * 导出用户列表
119
      * 导出用户列表
117
      */
120
      */
121
+    @RyLog(title = "数据导出", businessType = BusinessType.EXPORT)
118
     @Post
122
     @Post
119
     @Mapping("export")
123
     @Mapping("export")
120
     public void export(CmcTemperature cmcTemperature, CmcChannel cmcChannel) {
124
     public void export(CmcTemperature cmcTemperature, CmcChannel cmcChannel) {

+ 71
- 29
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/impl/CmcTemperatureServiceImpl.java 查看文件

28
     @Inject
28
     @Inject
29
     CmcChannelMapper cmcChannelMapper;
29
     CmcChannelMapper cmcChannelMapper;
30
 
30
 
31
-    @Inject
32
-    ICmcTemperatureService cmcTemperatureService;
33
-
34
-    @Inject
35
-    ICmcChannelService cmcChannelService;
31
+    // 移除循环依赖注入,直接使用mapper
32
+    // @Inject
33
+    // ICmcTemperatureService cmcTemperatureService;
36
 
34
 
37
     /**
35
     /**
38
      * 查询水温监测列表信息
36
      * 查询水温监测列表信息
42
      */
40
      */
43
     @Override
41
     @Override
44
     public List<CmcTemperature> listTemperature(CmcTemperature cmcTemperature, CmcChannel cmcChannel) {
42
     public List<CmcTemperature> listTemperature(CmcTemperature cmcTemperature, CmcChannel cmcChannel) {
43
+        // 使用mapper直接查询,避免循环依赖
45
         int channelSize = cmcChannelMapper.listChannel(cmcChannel).size();
44
         int channelSize = cmcChannelMapper.listChannel(cmcChannel).size();
46
         QueryWrapper qw = getQW(cmcTemperature, cmcChannel);
45
         QueryWrapper qw = getQW(cmcTemperature, cmcChannel);
47
-        List<CmcTemperature> records = cmcTemperatureService.list(qw);
46
+        List<CmcTemperature> records = cmcTemperatureMapper.selectListByQuery(qw);
47
+
48
+        if (records.isEmpty()) {
49
+            return new ArrayList<>();
50
+        }
51
+
48
         List<CmcTemperature> temperatureList = new ArrayList<>();
52
         List<CmcTemperature> temperatureList = new ArrayList<>();
53
+
54
+        // 优化内存使用:减少不必要的列表操作
49
         if (records.size() > 2) {
55
         if (records.size() > 2) {
50
             long diffInMillis;
56
             long diffInMillis;
51
             // 第30条与第31条数据时间差 毫秒
57
             // 第30条与第31条数据时间差 毫秒
52
-            if (channelSize > 30) {
58
+            if (channelSize > 30 && records.size() > 30) {
53
                 diffInMillis = records.get(30).getDatetime().getTime() - records.get(29).getDatetime().getTime();
59
                 diffInMillis = records.get(30).getDatetime().getTime() - records.get(29).getDatetime().getTime();
54
                 // 时间差超过15分钟,删最后10条数据
60
                 // 时间差超过15分钟,删最后10条数据
55
-                if (diffInMillis / 1000 / 60 > 15)
56
-                    records.subList(records.size() - channelSize + 30, records.size()).clear();
61
+                if (diffInMillis / 1000 / 60 > 15) {
62
+                    // 使用更安全的方式删除数据,避免内存泄漏
63
+                    int removeStart = Math.max(0, records.size() - channelSize + 30);
64
+                    records = records.subList(0, removeStart);
65
+                }
57
             }
66
             }
67
+
58
             // 第1条数据与0时时间差 毫秒
68
             // 第1条数据与0时时间差 毫秒
59
-            diffInMillis = records.get(0).getDatetime().getTime() - cmcTemperature.getStartTime().getTime();
60
-            if (diffInMillis / 1000 / 60 > 15)
61
-                records.subList(records.size() - channelSize, records.size()).clear();
69
+            if (records.size() > 0 && cmcTemperature.getStartTime() != null) {
70
+                diffInMillis = records.get(0).getDatetime().getTime() - cmcTemperature.getStartTime().getTime();
71
+                if (diffInMillis / 1000 / 60 > 15) {
72
+                    int removeStart = Math.max(0, records.size() - channelSize);
73
+                    records = records.subList(0, removeStart);
74
+                }
75
+            }
76
+
77
+            // 查询15分钟前的数据
62
             CmcTemperature temperature = new CmcTemperature();
78
             CmcTemperature temperature = new CmcTemperature();
63
             long fifteenMinutesAgoMillis = cmcTemperature.getStartTime().getTime() - (15 * 60 * 1000);
79
             long fifteenMinutesAgoMillis = cmcTemperature.getStartTime().getTime() - (15 * 60 * 1000);
64
             Date fifteenMinutesAgo = new Date(fifteenMinutesAgoMillis);
80
             Date fifteenMinutesAgo = new Date(fifteenMinutesAgoMillis);
65
             temperature.setStartTime(fifteenMinutesAgo);
81
             temperature.setStartTime(fifteenMinutesAgo);
66
             temperature.setEndTime(cmcTemperature.getStartTime());
82
             temperature.setEndTime(cmcTemperature.getStartTime());
67
             QueryWrapper qw1 = getQW(temperature, cmcChannel);
83
             QueryWrapper qw1 = getQW(temperature, cmcChannel);
68
-            temperatureList = cmcTemperatureService.list(qw1);
84
+            List<CmcTemperature> previousData = cmcTemperatureMapper.selectListByQuery(qw1);
85
+
86
+            // 合并数据,避免重复创建列表
87
+            temperatureList.addAll(previousData);
69
             temperatureList.addAll(records);
88
             temperatureList.addAll(records);
70
-            if (channelSize > 30) {
71
-                for (int i = 0; i < temperatureList.size() - channelSize + 1; i = i + channelSize) {
72
-                    Date minTime = temperatureList.get(i).getDatetime();
73
-                    if (temperatureList.get(i + 10).getDatetime().getTime() > minTime.getTime()) {
74
-                        for (int j = i + 10; j < i + channelSize; j++) {
75
-                            temperatureList.get(j).setDatetime(minTime);
76
-                        }
77
-                    } else {
78
-                        if (temperatureList.get(i + 30).getDatetime().getTime() > minTime.getTime()) {
79
-                            for (int j = i + 30; j < i + channelSize; j++) {
80
-                                temperatureList.get(j).setDatetime(minTime);
81
-                            }
82
-                        }
83
-                    }
84
-                }
89
+
90
+            // 优化数据处理逻辑
91
+            if (channelSize > 30 && temperatureList.size() > channelSize) {
92
+                processTemperatureData(temperatureList, channelSize);
85
             }
93
             }
86
         }
94
         }
95
+
87
         return temperatureList;
96
         return temperatureList;
88
     }
97
     }
89
 
98
 
99
+    /**
100
+     * 处理温度数据,优化内存使用
101
+     * @param temperatureList 温度数据列表
102
+     * @param channelSize 通道数量
103
+     */
104
+    private void processTemperatureData(List<CmcTemperature> temperatureList, int channelSize) {
105
+        // 使用迭代器模式,避免频繁的索引访问
106
+        for (int i = 0; i < temperatureList.size() - channelSize + 1; i += channelSize) {
107
+            if (i + channelSize > temperatureList.size()) {
108
+                break;
109
+            }
110
+
111
+            Date minTime = temperatureList.get(i).getDatetime();
112
+
113
+            // 优化时间比较逻辑
114
+            if (i + 10 < temperatureList.size() &&
115
+                    temperatureList.get(i + 10).getDatetime().getTime() > minTime.getTime()) {
116
+                // 更新第10-30条数据的时间
117
+                for (int j = i + 10; j < Math.min(i + channelSize, temperatureList.size()); j++) {
118
+                    temperatureList.get(j).setDatetime(new Date(minTime.getTime()));
119
+                }
120
+            } else if (i + 30 < temperatureList.size() &&
121
+                    temperatureList.get(i + 30).getDatetime().getTime() > minTime.getTime()) {
122
+                // 更新第30条之后数据的时间
123
+                for (int j = i + 30; j < Math.min(i + channelSize, temperatureList.size()); j++) {
124
+                    temperatureList.get(j).setDatetime(new Date(minTime.getTime()));
125
+                }
126
+            }
127
+        }
128
+    }
129
+
90
     private QueryWrapper getQW(CmcTemperature cmcTemperature, CmcChannel cmcChannel) {
130
     private QueryWrapper getQW(CmcTemperature cmcTemperature, CmcChannel cmcChannel) {
91
         QueryWrapper qw = QueryWrapper.create();
131
         QueryWrapper qw = QueryWrapper.create();
92
-        qw.select(CmcTemperature::getId, CmcTemperature::getGroupNo, CmcTemperature::getSensorNo, CmcTemperature::getData, CmcTemperature::getVolt, CmcTemperature::getCSQ, CmcTemperature::getDatetime)
132
+        qw.select(CmcTemperature::getId, CmcTemperature::getGroupNo, CmcTemperature::getSensorNo,
133
+                        CmcTemperature::getData, CmcTemperature::getVolt, CmcTemperature::getCSQ,
134
+                        CmcTemperature::getDatetime)
93
                 .select(CmcChannel::getInfo)
135
                 .select(CmcChannel::getInfo)
94
                 .from(CmcTemperature.class)
136
                 .from(CmcTemperature.class)
95
                 .leftJoin(CmcChannel.class)
137
                 .leftJoin(CmcChannel.class)

+ 16
- 0
cmc-temperature-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOperLogController.java 查看文件

14
 import org.noear.solon.core.handle.Result;
14
 import org.noear.solon.core.handle.Result;
15
 
15
 
16
 import java.util.Arrays;
16
 import java.util.Arrays;
17
+import java.util.Comparator;
17
 import java.util.List;
18
 import java.util.List;
19
+import java.util.stream.Collectors;
18
 
20
 
19
 /**
21
 /**
20
  * 操作日志 操作处理
22
  * 操作日志 操作处理
39
         return getPageData(result);
41
         return getPageData(result);
40
     }
42
     }
41
 
43
 
44
+    /**
45
+     * 查询最近操作日志
46
+     */
47
+    @Get
48
+    @Mapping("recent")
49
+    public SysOperLog list(SysOperLog sysOperLog) {
50
+        QueryWrapper qw = getQW(sysOperLog);
51
+        List<SysOperLog> resultList = sysOperLogService.list(qw).stream().sorted(Comparator.comparing(SysOperLog::getCreateTime).reversed()).collect(Collectors.toList());
52
+        SysOperLog result = new SysOperLog();
53
+        if (resultList.size() > 0)
54
+            result = resultList.get(0);
55
+        return result;
56
+    }
57
+
42
     /**
58
     /**
43
      * 导出操作日志列表
59
      * 导出操作日志列表
44
      */
60
      */

+ 14
- 1
cmc-temperature-back/ruoyi-admin/src/main/resources/app-dev.yml 查看文件

168
       jdbcUrl: jdbc:sqlite::resource:static/cmc-temperature.db?date_string_format=yyyy-MM-dd HH:mm:ss
168
       jdbcUrl: jdbc:sqlite::resource:static/cmc-temperature.db?date_string_format=yyyy-MM-dd HH:mm:ss
169
       username:
169
       username:
170
       password:
170
       password:
171
+      # 添加连接池优化配置
172
+      maximumPoolSize: 5
173
+      minimumIdle: 1
174
+      connectionTimeout: 180000
175
+      idleTimeout: 600000
176
+      maxLifetime: 1800000
171
     access:
177
     access:
172
       type: com.zaxxer.hikari.HikariDataSource
178
       type: com.zaxxer.hikari.HikariDataSource
173
       driverClassName: net.ucanaccess.jdbc.UcanaccessDriver
179
       driverClassName: net.ucanaccess.jdbc.UcanaccessDriver
174
-      jdbcUrl: jdbc:ucanaccess://E:/Java/cmc-temperature/cmc-temperature-back/sql/SKREC_ID1.accdb
180
+#      jdbcUrl: jdbc:ucanaccess://D:/temperature/Data/SKREC_ID1.accdb
181
+      jdbcUrl: jdbc:ucanaccess://E:/Java/cmc-temperature/cmc-temperature-back/sql/Data/SKREC_ID1.accdb
175
       username:
182
       username:
176
       password:
183
       password:
184
+      # 添加连接池优化配置
185
+      maximumPoolSize: 5
186
+      minimumIdle: 1
187
+      connectionTimeout: 180000
188
+      idleTimeout: 600000
189
+      maxLifetime: 1800000
177
 #      type: com.zaxxer.hikari.HikariDataSource
190
 #      type: com.zaxxer.hikari.HikariDataSource
178
 #      driverClassName: com.mysql.cj.jdbc.Driver
191
 #      driverClassName: com.mysql.cj.jdbc.Driver
179
 #      jdbcUrl: jdbc:mysql://127.0.0.1:3306/ry-vue?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
192
 #      jdbcUrl: jdbc:mysql://127.0.0.1:3306/ry-vue?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true

二进制
cmc-temperature-back/ruoyi-admin/src/main/resources/static/cmc-temperature.db 查看文件


+ 6
- 1
cmc-temperature-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java 查看文件

53
     /**
53
     /**
54
      * 清空数据
54
      * 清空数据
55
      */
55
      */
56
-    CLEAN
56
+    CLEAN,
57
+
58
+    /**
59
+     * 查询
60
+     */
61
+    QUERY
57
 }
62
 }

+ 9
- 0
cmc-temperature-ui/src/api/system/operlog.js 查看文件

9
   })
9
   })
10
 }
10
 }
11
 
11
 
12
+// 查询最近操作日志
13
+export function recentOperLog(query) {
14
+  return request({
15
+    url: '/system/operlog/recent',
16
+    method: 'get',
17
+    params: query
18
+  })
19
+}
20
+
12
 // 删除操作日志
21
 // 删除操作日志
13
 export function delOperlog(operId) {
22
 export function delOperlog(operId) {
14
   return request({
23
   return request({

二进制
cmc-temperature-ui/src/assets/images/user.png 查看文件


+ 7
- 1
cmc-temperature-ui/src/store/modules/user.js 查看文件

1
+/*
2
+ * @Author: wrh
3
+ * @Date: 2025-08-19 15:15:48
4
+ * @LastEditors: wrh
5
+ * @LastEditTime: 2025-09-19 13:54:07
6
+ */
1
 import { login, logout, getUserInfo } from '@/api/login'
7
 import { login, logout, getUserInfo } from '@/api/login'
2
 import { getToken, setToken, removeToken } from '@/utils/auth'
8
 import { getToken, setToken, removeToken } from '@/utils/auth'
3
-import defAva from '@/assets/images/avatar.jpg'
9
+import defAva from '@/assets/images/user.png'
4
 
10
 
5
 const useUserStore = defineStore(
11
 const useUserStore = defineStore(
6
   'user',
12
   'user',

+ 11
- 8
cmc-temperature-ui/src/views/login.vue 查看文件

59
 const { proxy } = getCurrentInstance()
59
 const { proxy } = getCurrentInstance()
60
 
60
 
61
 const loginForm = ref({
61
 const loginForm = ref({
62
-  username: 'admin',
63
-  password: 'admin123',
62
+  username: '',
63
+  password: '',
64
   rememberMe: false,
64
   rememberMe: false,
65
   code: '',
65
   code: '',
66
   uuid: ''
66
   uuid: ''
145
 .login {
145
 .login {
146
   display: flex;
146
   display: flex;
147
   flex-direction: column;
147
   flex-direction: column;
148
-  justify-content: center;
148
+  justify-content: top;
149
   align-items: center;
149
   align-items: center;
150
   height: 100%;
150
   height: 100%;
151
   background-image: url('@/assets/images/loginBg.jpeg');
151
   background-image: url('@/assets/images/loginBg.jpeg');
156
 
156
 
157
 .login-header {
157
 .login-header {
158
   text-align: center;
158
   text-align: center;
159
-  margin-bottom: 40px;
160
-  position: relative;
159
+  left: 70%;
160
+  top: 8%;
161
+  position: absolute;
161
   z-index: 2;
162
   z-index: 2;
162
   
163
   
163
   .main-title {
164
   .main-title {
164
-    font-size: 42px;
165
+    font-size: 26px;
165
     font-weight: 700;
166
     font-weight: 700;
166
     color: #ffffff;
167
     color: #ffffff;
167
     margin-bottom: 10px;
168
     margin-bottom: 10px;
185
   border-radius: 16px;
186
   border-radius: 16px;
186
   padding: 40px;
187
   padding: 40px;
187
   box-shadow: 0 15px 35px rgba(0, 0, 0, 0.2);
188
   box-shadow: 0 15px 35px rgba(0, 0, 0, 0.2);
188
-  width: 450px;
189
-  position: relative;
189
+  width: 500px;
190
+  position: absolute;
191
+  bottom: 30%;
192
+  left: 70%;
190
   z-index: 2;
193
   z-index: 2;
191
   border: 1px solid rgba(255, 255, 255, 0.3);
194
   border: 1px solid rgba(255, 255, 255, 0.3);
192
   transition: all 0.3s ease;
195
   transition: all 0.3s ease;

+ 2
- 2
cmc-temperature-ui/src/views/system/user/index.vue 查看文件

2
   <div class="app-container">
2
   <div class="app-container">
3
     <el-row :gutter="20">
3
     <el-row :gutter="20">
4
       <!-- 部门数据 -->
4
       <!-- 部门数据 -->
5
-      <el-col :span="4" :xs="24">
5
+      <!-- <el-col :span="4" :xs="24">
6
         <div class="head-container">
6
         <div class="head-container">
7
           <el-input
7
           <el-input
8
             v-model="deptName"
8
             v-model="deptName"
25
             @node-click="handleNodeClick"
25
             @node-click="handleNodeClick"
26
           />
26
           />
27
         </div>
27
         </div>
28
-      </el-col>
28
+      </el-col> -->
29
       <!-- 用户数据 -->
29
       <!-- 用户数据 -->
30
       <el-col :span="20" :xs="24">
30
       <el-col :span="20" :xs="24">
31
         <el-form v-show="showSearch" ref="queryRef" :model="queryParams" :inline="true" label-width="68px">
31
         <el-form v-show="showSearch" ref="queryRef" :model="queryParams" :inline="true" label-width="68px">

+ 4
- 4
cmc-temperature-ui/src/views/system/user/profile/index.vue 查看文件

17
                 <svg-icon icon-class="user" />登录账号
17
                 <svg-icon icon-class="user" />登录账号
18
                 <div class="pull-right">{{ state.user.userName }}</div>
18
                 <div class="pull-right">{{ state.user.userName }}</div>
19
               </li>
19
               </li>
20
-              <li class="list-group-item">
20
+              <!-- <li class="list-group-item">
21
                 <svg-icon icon-class="phone" />手机号码
21
                 <svg-icon icon-class="phone" />手机号码
22
                 <div class="pull-right">{{ state.user.phonenumber }}</div>
22
                 <div class="pull-right">{{ state.user.phonenumber }}</div>
23
-              </li>
24
-              <li class="list-group-item">
23
+              </li> -->
24
+              <!-- <li class="list-group-item">
25
                 <svg-icon icon-class="email" />用户邮箱
25
                 <svg-icon icon-class="email" />用户邮箱
26
                 <div class="pull-right">{{ state.user.email }}</div>
26
                 <div class="pull-right">{{ state.user.email }}</div>
27
-              </li>
27
+              </li> -->
28
               <li class="list-group-item">
28
               <li class="list-group-item">
29
                 <svg-icon icon-class="tree" />所属部门
29
                 <svg-icon icon-class="tree" />所属部门
30
                 <div v-if="state.user.dept" class="pull-right">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div>
30
                 <div v-if="state.user.dept" class="pull-right">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div>

+ 10
- 10
cmc-temperature-ui/src/views/system/user/profile/userInfo.vue 查看文件

3
     <el-form-item label="用户昵称" prop="nickName">
3
     <el-form-item label="用户昵称" prop="nickName">
4
       <el-input v-model="user.nickName" maxlength="30" />
4
       <el-input v-model="user.nickName" maxlength="30" />
5
     </el-form-item>
5
     </el-form-item>
6
-    <el-form-item label="手机号码" prop="phonenumber">
6
+    <!-- <el-form-item label="手机号码" prop="phonenumber">
7
       <el-input v-model="user.phonenumber" maxlength="11" />
7
       <el-input v-model="user.phonenumber" maxlength="11" />
8
     </el-form-item>
8
     </el-form-item>
9
     <el-form-item label="邮箱" prop="email">
9
     <el-form-item label="邮箱" prop="email">
14
         <el-radio value="0">男</el-radio>
14
         <el-radio value="0">男</el-radio>
15
         <el-radio value="1">女</el-radio>
15
         <el-radio value="1">女</el-radio>
16
       </el-radio-group>
16
       </el-radio-group>
17
-    </el-form-item>
17
+    </el-form-item> -->
18
     <el-form-item>
18
     <el-form-item>
19
       <el-button type="primary" :loading="loadingButton" @click="submit">保存</el-button>
19
       <el-button type="primary" :loading="loadingButton" @click="submit">保存</el-button>
20
       <el-button type="danger" @click="close">关闭</el-button>
20
       <el-button type="danger" @click="close">关闭</el-button>
39
   nickName: [
39
   nickName: [
40
     { required: true, message: '用户昵称不能为空', trigger: 'blur' }
40
     { required: true, message: '用户昵称不能为空', trigger: 'blur' }
41
   ],
41
   ],
42
-  email: [
43
-    { required: true, message: '邮箱地址不能为空', trigger: 'blur' },
44
-    { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
45
-  ],
46
-  phonenumber: [
47
-    { required: true, message: '手机号码不能为空', trigger: 'blur' },
48
-    { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
49
-  ]
42
+  // email: [
43
+  //   { required: true, message: '邮箱地址不能为空', trigger: 'blur' },
44
+  //   { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
45
+  // ],
46
+  // phonenumber: [
47
+  //   { required: true, message: '手机号码不能为空', trigger: 'blur' },
48
+  //   { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
49
+  // ]
50
 })
50
 })
51
 
51
 
52
 /** 提交按钮 */
52
 /** 提交按钮 */

+ 1
- 0
cmc-temperature-ui/src/views/temperature/TemperatureChart.vue 查看文件

562
     },
562
     },
563
     yAxis: {
563
     yAxis: {
564
       type: 'category',
564
       type: 'category',
565
+      inverse: true,
565
       data: momentSeries.map(s => s.name),
566
       data: momentSeries.map(s => s.name),
566
       axisLine: {
567
       axisLine: {
567
         lineStyle: {
568
         lineStyle: {

+ 22
- 11
cmc-temperature-ui/src/views/temperature/index.vue 查看文件

1
 <!--
1
 <!--
2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2025-08-20 10:14:22
3
  * @Date: 2025-08-20 10:14:22
4
- * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-08-21 09:52:13
4
+ * @LastEditors: wrh
5
+ * @LastEditTime: 2025-09-19 11:19:17
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div class="temperature-page">
8
   <div class="temperature-page">
22
           </div>
22
           </div>
23
           <template #dropdown>
23
           <template #dropdown>
24
             <el-dropdown-menu>
24
             <el-dropdown-menu>
25
+              <el-dropdown-item v-if="isAdmin" divided command="system">
26
+                <svg-icon icon-class="system" />
27
+                系统管理
28
+              </el-dropdown-item>
29
+              <el-dropdown-item v-if="!isAdmin" divided command="profile">
30
+                <svg-icon icon-class="user" />
31
+                个人中心
32
+              </el-dropdown-item>
25
               <el-dropdown-item divided command="logout">
33
               <el-dropdown-item divided command="logout">
26
-                <svg-icon icon-class="logout" />
34
+                <svg-icon icon-class="eye" />
27
                 退出登录
35
                 退出登录
28
               </el-dropdown-item>
36
               </el-dropdown-item>
29
             </el-dropdown-menu>
37
             </el-dropdown-menu>
40
 </template>
48
 </template>
41
 
49
 
42
 <script setup>
50
 <script setup>
43
-import { ref, onMounted } from 'vue'
51
+import { ref, onMounted, getCurrentInstance } from 'vue'
44
 import { useRouter } from 'vue-router'
52
 import { useRouter } from 'vue-router'
45
 import useUserStore from '@/store/modules/user'
53
 import useUserStore from '@/store/modules/user'
46
 import { title } from '@/store/modules/settings'
54
 import { title } from '@/store/modules/settings'
49
 const router = useRouter()
57
 const router = useRouter()
50
 const userStore = useUserStore()
58
 const userStore = useUserStore()
51
 const { proxy } = getCurrentInstance()
59
 const { proxy } = getCurrentInstance()
60
+const isAdmin = ref(false)
52
 
61
 
53
 // 用户信息
62
 // 用户信息
54
 const userInfo = ref({
63
 const userInfo = ref({
55
-  username: 'admin',
64
+  username: '',
56
   avatar: ''
65
   avatar: ''
57
 })
66
 })
58
 
67
 
59
 // 获取用户信息
68
 // 获取用户信息
60
 const getUserInfo = () => {
69
 const getUserInfo = () => {
61
-  const user = userStore.user
62
-  if (user) {
63
-    userInfo.value.username = user.userName || 'admin'
64
-    userInfo.value.avatar = user.avatar || ''
65
-  }
70
+  if (userStore.name == '玛尔挡水电站')
71
+    isAdmin.value = true
72
+  userInfo.value.username = userStore.name
73
+  userInfo.value.avatar = userStore.avatar  
66
 }
74
 }
67
 
75
 
68
 // 处理下拉菜单命令
76
 // 处理下拉菜单命令
70
   switch (command) {
78
   switch (command) {
71
     case 'profile':
79
     case 'profile':
72
       // 跳转到个人中心
80
       // 跳转到个人中心
73
-      router.push('/system/user/profile')
81
+      router.push('/user/profile')
74
       break
82
       break
75
     case 'settings':
83
     case 'settings':
76
       // 跳转到系统设置
84
       // 跳转到系统设置
77
       router.push('/system/config')
85
       router.push('/system/config')
78
       break
86
       break
87
+    case 'system':
88
+      router.push('/system/user')
89
+      break
79
     case 'logout':
90
     case 'logout':
80
       handleLogout()
91
       handleLogout()
81
       break
92
       break

+ 13
- 2
cmc-temperature-ui/src/views/temperature/temMonitor.vue 查看文件

107
 </template>
107
 </template>
108
 
108
 
109
 <script setup>
109
 <script setup>
110
-import { ref, reactive, computed, onMounted, nextTick } from 'vue'
110
+import { ref, reactive, computed, onMounted, nextTick, getCurrentInstance } from 'vue'
111
 import { ElMessage } from 'element-plus'
111
 import { ElMessage } from 'element-plus'
112
 import { Search, Refresh, Download } from '@element-plus/icons-vue'
112
 import { Search, Refresh, Download } from '@element-plus/icons-vue'
113
 import { listTemperature, listByInfo, listAllByInfo } from '@/api/monitoring/temperature'
113
 import { listTemperature, listByInfo, listAllByInfo } from '@/api/monitoring/temperature'
114
+import { recentOperLog } from '@/api/system/operlog'
114
 import { listChannel, channelInfoList } from '@/api/monitoring/channel'
115
 import { listChannel, channelInfoList } from '@/api/monitoring/channel'
115
 import TemperatureChart from './TemperatureChart.vue'
116
 import TemperatureChart from './TemperatureChart.vue'
117
+import useUserStore from '@/store/modules/user'
118
+import { parseTime } from '@/utils/date'
116
 
119
 
117
 // 响应式数据
120
 // 响应式数据
118
 const loading = ref(false)
121
 const loading = ref(false)
120
 const activeTab = ref('table')
123
 const activeTab = ref('table')
121
 const chartRef = ref(null)
124
 const chartRef = ref(null)
122
 const { proxy } = getCurrentInstance()
125
 const { proxy } = getCurrentInstance()
126
+const userStore = useUserStore()
123
 
127
 
124
 // 搜索表单数据
128
 // 搜索表单数据
129
+const today = ref(parseTime(new Date(), '{y}-{m}-{d}'))
130
+const yesterday = ref(parseTime(new Date(new Date().setDate(new Date().getDate()-1)), '{y}-{m}-{d}'))
125
 const searchForm = reactive({
131
 const searchForm = reactive({
126
-  timeRange: [],
132
+  timeRange: [yesterday.value, today.value],
127
   Info: '',
133
   Info: '',
128
   queryType: '',
134
   queryType: '',
129
   deviceId: '',
135
   deviceId: '',
159
       value: item
165
       value: item
160
     }))
166
     }))
161
   })
167
   })
168
+  recentOperLog({createBy: userStore.userId}).then(res => {
169
+    if (res.operParam) {
170
+      searchForm.Info = res.operParam.split('Info\', values=[')[1].split(']')[0]
171
+    }
172
+  })
162
 }
173
 }
163
 getDeviceList()
174
 getDeviceList()
164
 
175
 

正在加载...
取消
保存