Commit c9c558934936be2c04a932241bc1497f9f30efa5

Authored by xp.Huang
2 parents 5a769273 54867fc1

Merge branch 'v1.4.0_dev' into 'main_dev'

V1.4.0 dev

See merge request yunteng/thingskit-front!1366
@@ -5,6 +5,7 @@ export interface HomeStatisticsRecordType { @@ -5,6 +5,7 @@ export interface HomeStatisticsRecordType {
5 customerInfo: TotalInfo; 5 customerInfo: TotalInfo;
6 productInfo: TotalInfo; 6 productInfo: TotalInfo;
7 messageInfo: MessageInfo; 7 messageInfo: MessageInfo;
  8 + alarmNoticeInfo: AlarmNoticeInfo;
8 } 9 }
9 10
10 export interface TotalInfo { 11 export interface TotalInfo {
@@ -29,3 +30,8 @@ export interface MessageInfo { @@ -29,3 +30,8 @@ export interface MessageInfo {
29 todayMessageAdd: number; 30 todayMessageAdd: number;
30 todayDataPointsAdd: number; 31 todayDataPointsAdd: number;
31 } 32 }
  33 +
  34 +export interface AlarmNoticeInfo {
  35 + sumCount: number;
  36 + todayAdd: number;
  37 +}
@@ -22,6 +22,22 @@ enum Api { @@ -22,6 +22,22 @@ enum Api {
22 ResetCode = '/noauth/reset_code/', 22 ResetCode = '/noauth/reset_code/',
23 ResetPassword = '/noauth/reset/', 23 ResetPassword = '/noauth/reset/',
24 APP_GET_TOKEN = '/third/login/id/', 24 APP_GET_TOKEN = '/third/login/id/',
  25 + AUTH_LOGOUT = '/auth/logout',
  26 +}
  27 +
  28 +/**
  29 + * @description: user logout api
  30 + */
  31 +export function logoutApi(_, mode: ErrorMessageMode = 'modal') {
  32 + return defHttp.post(
  33 + {
  34 + url: Api.AUTH_LOGOUT,
  35 + },
  36 + {
  37 + errorMessageMode: mode,
  38 + joinPrefix: false,
  39 + }
  40 + );
25 } 41 }
26 42
27 /** 43 /**
  1 +export enum PermissionEnum {
  2 + TENANT_SUB_ADMINISTRATOR = 4, //租户子管理员
  3 +}
@@ -19,7 +19,7 @@ import { @@ -19,7 +19,7 @@ import {
19 RefreshTokenParams, 19 RefreshTokenParams,
20 SmsLoginParams, 20 SmsLoginParams,
21 } from '/@/api/sys/model/userModel'; 21 } from '/@/api/sys/model/userModel';
22 -import { doRefreshToken, getMyInfo, loginApi, smsCodeLoginApi } from '/@/api/sys/user'; 22 +import { doRefreshToken, getMyInfo, loginApi, logoutApi, smsCodeLoginApi } from '/@/api/sys/user';
23 import { useI18n } from '/@/hooks/web/useI18n'; 23 import { useI18n } from '/@/hooks/web/useI18n';
24 import { useMessage } from '/@/hooks/web/useMessage'; 24 import { useMessage } from '/@/hooks/web/useMessage';
25 import { router } from '/@/router'; 25 import { router } from '/@/router';
@@ -240,7 +240,6 @@ export const useUserStore = defineStore({ @@ -240,7 +240,6 @@ export const useUserStore = defineStore({
240 // setAuthCache(REFRESH_TOKEN_KEY, undefined); 240 // setAuthCache(REFRESH_TOKEN_KEY, undefined);
241 // this.setSessionTimeout(false); 241 // this.setSessionTimeout(false);
242 // // goLogin && router.push(PageEnum.BASE_LOGIN); 242 // // goLogin && router.push(PageEnum.BASE_LOGIN);
243 -  
244 this.setToken(undefined); 243 this.setToken(undefined);
245 this.setSessionTimeout(false); 244 this.setSessionTimeout(false);
246 setAuthCache(REFRESH_TOKEN_KEY, undefined); 245 setAuthCache(REFRESH_TOKEN_KEY, undefined);
@@ -284,6 +283,7 @@ export const useUserStore = defineStore({ @@ -284,6 +283,7 @@ export const useUserStore = defineStore({
284 title: t('sys.app.logoutTip'), 283 title: t('sys.app.logoutTip'),
285 content: t('sys.app.logoutMessage'), 284 content: t('sys.app.logoutMessage'),
286 onOk: async () => { 285 onOk: async () => {
  286 + await logoutApi(null, 'modal'); //新增退出登录接口
287 await this.logout(true); 287 await this.logout(true);
288 }, 288 },
289 }); 289 });
@@ -90,7 +90,7 @@ @@ -90,7 +90,7 @@
90 </div> 90 </div>
91 </template> 91 </template>
92 <script lang="ts" setup> 92 <script lang="ts" setup>
93 - import { ref, onMounted, defineComponent, Ref } from 'vue'; 93 + import { ref, onMounted, defineComponent, Ref, computed } from 'vue';
94 import { Card } from 'ant-design-vue'; 94 import { Card } from 'ant-design-vue';
95 import { getHomeData } from '/@/api/dashboard'; 95 import { getHomeData } from '/@/api/dashboard';
96 import { isAdmin } from '/@/enums/roleEnum'; 96 import { isAdmin } from '/@/enums/roleEnum';
@@ -109,6 +109,8 @@ @@ -109,6 +109,8 @@
109 import msgPicture from '/@/assets/images/msg-count.png'; 109 import msgPicture from '/@/assets/images/msg-count.png';
110 import tenantPicture from '/@/assets/images/zh.png'; 110 import tenantPicture from '/@/assets/images/zh.png';
111 import customerPicture from '/@/assets/images/kf.png'; 111 import customerPicture from '/@/assets/images/kf.png';
  112 + import { useUserStore } from '/@/store/modules/user';
  113 + import { PermissionEnum } from '/@/enums/permissionEnum';
112 114
113 interface RecordType { 115 interface RecordType {
114 value: number; 116 value: number;
@@ -156,8 +158,23 @@ @@ -156,8 +158,23 @@
156 ]; 158 ];
157 159
158 const { isSysadmin, isPlatformAdmin } = useRole(); 160 const { isSysadmin, isPlatformAdmin } = useRole();
  161 +
  162 + const userStore = useUserStore();
  163 +
  164 + const hasTenantSubAdminPermission = computed(() => {
  165 + return userStore.getUserInfo?.level === PermissionEnum.TENANT_SUB_ADMINISTRATOR;
  166 + });
  167 +
159 const handleTransformStatisticalInfo = (record: HomeStatisticsRecordType) => { 168 const handleTransformStatisticalInfo = (record: HomeStatisticsRecordType) => {
160 - const { deviceInfo, productInfo, alarmInfo, messageInfo, customerInfo, tenantInfo } = record; 169 + const {
  170 + deviceInfo,
  171 + productInfo,
  172 + alarmInfo,
  173 + messageInfo,
  174 + customerInfo,
  175 + tenantInfo,
  176 + alarmNoticeInfo,
  177 + } = record;
161 178
162 const productTotal: StatisticalItemType = { 179 const productTotal: StatisticalItemType = {
163 images: productPicture, 180 images: productPicture,
@@ -226,10 +243,25 @@ @@ -226,10 +243,25 @@
226 todayTotals: [{ label: '今日新增', value: customerInfo?.todayAdd }], 243 todayTotals: [{ label: '今日新增', value: customerInfo?.todayAdd }],
227 }; 244 };
228 245
  246 + const alarmNoticeInfoTotal: StatisticalItemType = {
  247 + images: msgPicture,
  248 + totals: [{ label: '告警通知数', value: alarmNoticeInfo?.sumCount }],
  249 + tooltips: [
  250 + { label: '告警通知数', value: alarmNoticeInfo?.sumCount },
  251 + { label: '今日新增', value: alarmNoticeInfo?.todayAdd },
  252 + ],
  253 + todayTotals: [{ label: '今日新增', value: alarmNoticeInfo?.todayAdd }],
  254 + };
  255 +
229 if (unref(isSysadmin) || unref(isPlatformAdmin)) { 256 if (unref(isSysadmin) || unref(isPlatformAdmin)) {
230 statisticalPanelList.value = [deviceTotal, tenantTotal, customerTotal]; 257 statisticalPanelList.value = [deviceTotal, tenantTotal, customerTotal];
231 } else { 258 } else {
232 - statisticalPanelList.value = [productTotal, deviceTotal, alarmTotal, messageTotal]; 259 + statisticalPanelList.value = [
  260 + productTotal,
  261 + deviceTotal,
  262 + alarmTotal,
  263 + hasTenantSubAdminPermission.value ? alarmNoticeInfoTotal : messageTotal,
  264 + ];
233 } 265 }
234 }; 266 };
235 267
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 v-bind="$attrs" 4 v-bind="$attrs"
5 :active-tab-key="activeKey" 5 :active-tab-key="activeKey"
6 @tabChange="onTabChange" 6 @tabChange="onTabChange"
7 - v-if="!isAdmin(role)" 7 + v-if="!isAdmin(role) && !hasTenantSubAdminPermission"
8 > 8 >
9 <template #messageStatistics> 9 <template #messageStatistics>
10 <span>消息量统计</span> 10 <span>消息量统计</span>
@@ -169,7 +169,7 @@ @@ -169,7 +169,7 @@
169 </div> 169 </div>
170 </template> 170 </template>
171 <script lang="ts" setup> 171 <script lang="ts" setup>
172 - import { ref, reactive, unref } from 'vue'; 172 + import { ref, reactive, unref, computed } from 'vue';
173 import { Card, DatePicker, Tooltip, Button } from 'ant-design-vue'; 173 import { Card, DatePicker, Tooltip, Button } from 'ant-design-vue';
174 import { QuestionCircleOutlined } from '@ant-design/icons-vue'; 174 import { QuestionCircleOutlined } from '@ant-design/icons-vue';
175 // import VisitAnalysis from './VisitAnalysis.vue'; 175 // import VisitAnalysis from './VisitAnalysis.vue';
@@ -186,6 +186,8 @@ @@ -186,6 +186,8 @@
186 import { getTrendData } from '/@/api/dashboard'; 186 import { getTrendData } from '/@/api/dashboard';
187 import { useGlobSetting } from '/@/hooks/setting'; 187 import { useGlobSetting } from '/@/hooks/setting';
188 import { RangePickerValue } from 'ant-design-vue/lib/date-picker/interface'; 188 import { RangePickerValue } from 'ant-design-vue/lib/date-picker/interface';
  189 + import { useUserStore } from '/@/store/modules/user';
  190 + import { PermissionEnum } from '/@/enums/permissionEnum';
189 191
190 defineExpose({ 192 defineExpose({
191 isAdmin, 193 isAdmin,
@@ -208,6 +210,12 @@ @@ -208,6 +210,12 @@
208 }, 210 },
209 ]; 211 ];
210 212
  213 + const userStore = useUserStore();
  214 +
  215 + const hasTenantSubAdminPermission = computed(() => {
  216 + return userStore.getUserInfo?.level === PermissionEnum.TENANT_SUB_ADMINISTRATOR;
  217 + });
  218 +
211 // 快速选择日期 219 // 快速选择日期
212 const activeIndex = ref(3); 220 const activeIndex = ref(3);
213 const dateValue = ref(); 221 const dateValue = ref();
@@ -58,7 +58,7 @@ @@ -58,7 +58,7 @@
58 }); 58 });
59 } 59 }
60 getTenantRoles(data.record.tenantId).then((result) => { 60 getTenantRoles(data.record.tenantId).then((result) => {
61 - const { ...params } = data.record; 61 + const { icon: _, ...params } = data.record; // icon这个字段不能回显
62 //为表单赋值 62 //为表单赋值
63 setFieldsValue({ 63 setFieldsValue({
64 ...params, 64 ...params,
@@ -43,6 +43,7 @@ export interface UserInfo { @@ -43,6 +43,7 @@ export interface UserInfo {
43 phoneNumber?: string; 43 phoneNumber?: string;
44 email?: string; 44 email?: string;
45 tenantId?: string; 45 tenantId?: string;
  46 + level?: number;
46 } 47 }
47 48
48 export interface BeforeMiniState { 49 export interface BeforeMiniState {