显示用户积分

Change-Id: I5f1bfda3f2636352352e35f5ff358a8e06b7d8d0
diff --git a/react-ui/src/pages/User/Center/index.tsx b/react-ui/src/pages/User/Center/index.tsx
index 7272fa3..4028e11 100644
--- a/react-ui/src/pages/User/Center/index.tsx
+++ b/react-ui/src/pages/User/Center/index.tsx
@@ -60,122 +60,89 @@
 
 
   //  渲染用户信息
+  // @ts-ignore
   const renderUserInfo = ({
-    userName,
-    phonenumber,
-    email,
-    sex,
-    dept,
-    uploadCount,
-    downloadCount,
-    rateCount,
-    score,
-  }: Partial<API.CurrentUser>) => {
+                            userName,
+                            phonenumber,
+                            email,
+                            sex,
+                            dept,
+                            uploadCount,
+                            downloadCount,
+                            rateCount,
+                            score,
+                            level,
+                          }: Partial<API.CurrentUser>) => {
     return (
       <List>
         <List.Item>
           <div>
-            <UserOutlined
-              style={{
-                marginRight: 8,
-              }}
-            />
+            <UserOutlined style={{ marginRight: 8 }} />
             用户名
           </div>
           <div>{userName}</div>
         </List.Item>
         <List.Item>
           <div>
-            <ManOutlined
-              style={{
-                marginRight: 8,
-              }}
-            />
+            <ManOutlined style={{ marginRight: 8 }} />
             性别
           </div>
           <div>{sex === '1' ? '女' : '男'}</div>
         </List.Item>
         <List.Item>
           <div>
-            <MobileOutlined
-              style={{
-                marginRight: 8,
-              }}
-            />
+            <MobileOutlined style={{ marginRight: 8 }} />
             电话
           </div>
           <div>{phonenumber}</div>
         </List.Item>
         <List.Item>
           <div>
-            <MailOutlined
-              style={{
-                marginRight: 8,
-              }}
-            />
+            <MailOutlined style={{ marginRight: 8 }} />
             邮箱
           </div>
           <div>{email}</div>
         </List.Item>
         <List.Item>
           <div>
-            <MailOutlined
-              style={{
-                marginRight: 8,
-              }}
-            />
+            <MailOutlined style={{ marginRight: 8 }} />
             上传量
           </div>
           <div>{uploadCount}</div>
         </List.Item>
         <List.Item>
           <div>
-            <MailOutlined
-              style={{
-                marginRight: 8,
-              }}
-            />
+            <MailOutlined style={{ marginRight: 8 }} />
             下载量
           </div>
           <div>{downloadCount}</div>
         </List.Item>
         <List.Item>
           <div>
-            <MailOutlined
-              style={{
-                marginRight: 8,
-              }}
-            />
+            <MailOutlined style={{ marginRight: 8 }} />
             分享率
           </div>
           <div>{rateCount}</div>
         </List.Item>
-        {/* <List.Item>
-          <div>
-            <ClusterOutlined
-              style={{
-                marginRight: 8,
-              }}
-            />
-            部门
-          </div>
-          <div>{dept?.deptName}</div>
-        </List.Item> */}
         <List.Item>
           <div>
-            <MailOutlined
-              style={{
-                marginRight: 8,
-              }}
-            />
+            <MailOutlined style={{ marginRight: 8 }} />
             积分
           </div>
           <div>{score}</div>
         </List.Item>
+        <List.Item>
+          <div>
+            <MailOutlined style={{ marginRight: 8 }} />
+            用户等级
+          </div>
+          <div>{level}</div>
+        </List.Item>
       </List>
     );
   };
 
+
   // 渲染tab切换
   const renderChildrenByTabKey = (tabValue: tabKeyType) => {
     if (tabValue === 'base') {
@@ -205,6 +172,8 @@
                 <div className={styles.avatarHolder} onClick={() => { setCropperModalOpen(true) }}>
                   <img alt="" src={currentUser.avatar} />
                 </div>
+
+                  ``  `````````````````````````````````1
                 {renderUserInfo(currentUser)}
                 <Divider dashed />
                 {/* <div className={styles.team}>
diff --git a/react-ui/src/services/ant-design-pro/typings.d.ts b/react-ui/src/services/ant-design-pro/typings.d.ts
index 4ee1264..20f44dc 100644
--- a/react-ui/src/services/ant-design-pro/typings.d.ts
+++ b/react-ui/src/services/ant-design-pro/typings.d.ts
@@ -1,54 +1,110 @@
+/* eslint-disable */
+// 该文件由 OneAPI 自动生成,请勿手动修改!
+
 declare namespace API {
-  type CurrentUser = UserInfo & {
-    signature?: string;
-    title?: string;
-    group?: string;
-    tags?: { key?: string; label?: string }[];
-    notifyCount?: number;
-    unreadCount?: number;
-    country?: string;
-    access?: string;
-    geographic?: {
-      province?: { label?: string; key?: string };
-      city?: { label?: string; key?: string };
-    };
+  interface PageInfo {
+    current?: number;
+    pageSize?: number;
+    total?: number;
+    list?: Array<Record<string, any>>;
+  }
+
+  interface PageInfo_UserInfo_ {
+    current?: number;
+    pageSize?: number;
+    total?: number;
+    list?: Array<UserInfo>;
+  }
+
+  interface Result {
+    code: number;
+    msg: string;
+    data?: Record<string, any>;
+  }
+
+  interface Result_PageInfo_UserInfo__ {
+    code: number;
+    msg: string;
+    data?: PageInfo_UserInfo_;
+  }
+  interface UserInfoResult {
+    code?: number;
+    msg?: string;
+    user: UserInfo;
+    permissions: any;
+    roles: any;
+  }
+
+  interface Result_string_ {
+    success?: boolean;
+    errorMessage?: string;
+    data?: string;
+  }
+
+  type UserGenderEnum = 'MALE' | 'FEMALE';
+
+  interface UserInfo {
+    userId?: string;
+    userName?: string;
+    nickName?: string;
+    avatar?: string;
+    sex?: string;
+    email?: string;
+    gender?: UserGenderEnum;
+    unreadCount: number;
     address?: string;
-    phone?: string;
+    phonenumber?: string;
+    dept?: Dept;
+    roles?: Role[];
+    permissions: string[];
+    uploadCount?: number;
+    downloadCount?: number;
+    rateCount?: number;
+    score?: number;
+  }
+
+  interface UserInfoVO {
+    name?: string;
+    /** nick */
+    nickName?: string;
+    /** email */
+    email?: string;
+  }
+
+  type definitions_0 = null;
+
+  type MenuItemMeta = {
+    title: string;
+    icon: string;
+    noCache: boolean;
+    link: string;
   };
 
-  type ErrorResponse = {
-    /** 业务约定的错误码 */
-    errorCode: string;
-    /** 业务上的错误信息 */
-    errorMessage?: string;
-    /** 业务上的请求是否成功 */
+  type RoutersMenuItem = {
+    alwaysShow?: boolean;
+    children?: RoutersMenuItem[];
+    component?: string;
+    hidden?: boolean;
+    meta: MenuItemMeta;
+    name: string;
+    path: string;
+    redirect?: string;
+    [key: string]: any;
+  };
+  interface GetRoutersResult {
+    code: number;
+    msg: string;
+    data: RoutersMenuItem[];
+  }
+
+  type NoticeIconList = {
+    data?: NoticeIconItem[];
+    /** 列表的内容总数 */
+    total?: number;
     success?: boolean;
   };
 
-  type FakeCaptcha = {
-    code?: number;
-    status?: string;
-  };
-
-  type getFakeCaptchaParams = {
-    /** 手机号 */
-    phone?: string;
-  };
-
-  type LoginParams = {
-    username?: string;
-    password?: string;
-    uuid?: string;
-    autoLogin?: boolean;
-    type?: string;
-  };
-
-  type LoginResult = {
-    code: number;
-    msg?: string;
-    type?: string;
-    token?: string;
-  };
+  type NoticeIconItemType = 'notification' | 'message' | 'event';
 
   type NoticeIconItem = {
     id?: string;
@@ -63,46 +119,77 @@
     type?: NoticeIconItemType;
   };
 
-  type NoticeIconItemType = 'notification' | 'message' | 'event';
-
-  type NoticeIconList = {
-    data?: NoticeIconItem[];
-    /** 列表的内容总数 */
-    total?: number;
-    success?: boolean;
+  export type MenuType = {
+    menuId: number;
+    menuName: string;
+    parentId: string;
+    orderNum: number;
+    path: string;
+    component: string;
+    isFrame: number;
+    isCache: number;
+    menuType: string;
+    visible: string;
+    status: string;
+    perms: string;
+    icon: string;
+    createBy: string;
+    createTime: Date;
+    updateBy: string;
+    updateTime: Date;
+    remark: string;
   };
 
-  type PageParams = {
-    current?: number;
-    pageSize?: number;
+  export type MenuListParams = {
+    menuId?: string;
+    menuName?: string;
+    parentId?: string;
+    orderNum?: string;
+    path?: string;
+    component?: string;
+    isFrame?: string;
+    isCache?: string;
+    menuType?: string;
+    visible?: string;
+    status?: string;
+    perms?: string;
+    icon?: string;
+    createBy?: string;
+    createTime?: string;
+    updateBy?: string;
+    updateTime?: string;
+    remark?: string;
+    pageSize?: string;
+    currentPage?: string;
+    filter?: string;
+    sorter?: string;
   };
 
-  type RuleList = {
-    data?: RuleListItem[];
-    /** 列表的内容总数 */
-    total?: number;
-    success?: boolean;
+  export type DictTypeType = {
+    dictId: number;
+    dictName: string;
+    dictType: string;
+    status: string;
+    createBy: string;
+    createTime: Date;
+    updateBy: string;
+    updateTime: Date;
+    remark: string;
   };
 
-  type RuleListItem = {
-    key?: number;
-    disabled?: boolean;
-    href?: string;
-    avatar?: string;
-    name?: string;
-    owner?: string;
-    desc?: string;
-    callNo?: number;
-    status?: number;
-    updatedAt?: string;
-    createdAt?: string;
-    progress?: number;
-  };
-
-  type ruleParams = {
-    /** 当前的页码 */
-    current?: number;
-    /** 页面的容量 */
-    pageSize?: number;
+  export type DictTypeListParams = {
+    dictId?: string;
+    dictName?: string;
+    dictType?: string;
+    status?: string;
+    createBy?: string;
+    createTime?: string;
+    updateBy?: string;
+    updateTime?: string;
+    remark?: string;
+    pageSize?: string;
+    currentPage?: string;
+    filter?: string;
+    sorter?: string;
   };
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 1d34237..c19ae8c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.web.controller.system;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 import jakarta.servlet.http.HttpServletResponse;
 import org.apache.commons.lang3.ArrayUtils;
@@ -31,8 +33,7 @@
 import com.ruoyi.system.service.ISysPostService;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.ISysUserService;
-import java.util.Map;
-import java.util.HashMap;
+
 /**
  * 用户信息
  * 
@@ -54,7 +55,6 @@
     @Autowired
     private ISysPostService postService;
 
-
     @GetMapping("/profile/info")
     public AjaxResult getUserRateInfo() {
         Long userId = getUserId(); // 当前登录用户ID
@@ -62,6 +62,7 @@
         int uploadCount = userService.getUploadByUserId(userId);
         int downloadCount = userService.getDownloadByUserId(userId);
         int score = userService.getUserScore(userId);
+        int level = userService.getUserLevel(userId);
 
         // 计算上传率(可选)
         String rateCount = "0%";
@@ -75,10 +76,11 @@
         rateInfo.put("downloadCount", downloadCount);
         rateInfo.put("rateCount", rateCount);
         rateInfo.put("score", score);
+        rateInfo.put("level", level);
 
         return AjaxResult.success(rateInfo);
     }
-    
+
     /**
      * 获取用户列表
      */
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index b17312e..9e14af8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -124,9 +124,8 @@
      * @return 结果
      */
     public SysUser checkEmailUnique(String email);
-
     public int getUploadByUserId(Long userId);
     public int getDownloadByUserId(Long userId);
     public int getUserScore(Long userId);
-
+    public int getUserLevel(Long userId);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
index a27cb01..bec77ff 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -209,4 +209,6 @@
     public int getDownloadByUserId(Long userId);
 
     public int getUserScore(Long userId);
+
+    public int getUserLevel(Long userId);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index ef2b2a3..503581e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -562,4 +562,9 @@
     public int getUserScore(Long userId) {
         return userMapper.getUserScore(userId);
     }
+
+    @Override
+    public int getUserLevel(Long userId) {
+        return userMapper.getUserLevel(userId);
+    }
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index d222434..2423536 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -71,6 +71,16 @@
 		SELECT score FROM user_score WHERE user_id = #{userId}
 	</select>
 
+	<!-- 获取用户等级(总积分 / 10 向下取整) -->
+	<select id="getUserLevel" resultType="int">
+		SELECT IFNULL(SUM(score), 10) / 10
+		FROM user_tag_scores
+		WHERE user_id = #{userId}
+	</select>
+
+
+
+
 	<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
 		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
 		left join sys_dept d on u.dept_id = d.dept_id