Browse Source

Merge remote-tracking branch 'origin/dev' into dev

fangqing 2 tuần trước cách đây
mục cha
commit
00fa647314

+ 3 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java

@@ -118,6 +118,9 @@ public class CaptchaController {
             case "update":
                 verifyKey = CacheConstants.SMS_UPDATE_PASSWORD_CODE_KEY + phoneNumber;
                 break;
+            case "verify":
+                verifyKey = CacheConstants.SMS_VERIFY_CODE_KEY + phoneNumber;
+                break;
         }
 
         if (Strings.isBlank(verifyKey)) {

+ 9 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.common.config.WxAppConfig;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.LoginToken;
 import com.ruoyi.common.core.domain.entity.SysMenu;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginBody;
@@ -112,9 +113,11 @@ public class SysLoginController {
 
         String[] result = {openid,nickname,headimgurl};
 
-        String token = loginService.wxLogin(result);
+        LoginToken loginToken = loginService.wxLogin(result);
         AjaxResult ajax = AjaxResult.success();
-        ajax.put(Constants.TOKEN, token);
+        ajax.put(Constants.TOKEN, loginToken.getToken());
+        ajax.put("isPhonenumber",loginToken.getPhonenumber());
+
         return ajax;
     }
 
@@ -141,9 +144,11 @@ public class SysLoginController {
         // TODO 检验token成功具体业务操作。。。
         String[] result = {appid};
 
-        String token = loginService.appleLogin(result);
+        LoginToken loginToken = loginService.appleLogin(result);
         AjaxResult ajax = AjaxResult.success();
-        ajax.put(Constants.TOKEN, token);
+        ajax.put(Constants.TOKEN, loginToken.getToken());
+        ajax.put("isPhonenumber",loginToken.getPhonenumber());
+
         return ajax;
     }
 

+ 106 - 10
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java

@@ -31,6 +31,8 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
@@ -157,24 +159,92 @@ public class SysProfileController extends BaseController {
     }
 
 
-    @ApiOperation("获取用户信息")
+    @ApiOperation("手机号获取用户信息")
     @GetMapping("/userPhoneNumber")
     @Anonymous
-    @Log(title = "登录", businessType = BusinessType.UPDATE)
     public AjaxResult userPhoneNumber(Long userId,Long phoneNumber,Long smsCode) {
-        SysUser sysUser = null;
+        if (phoneNumber == null || smsCode == null ){
+            return error("参数异常!");
+        }
+        smsVerifyCodeKey(phoneNumber.toString(), smsCode.toString());
+        System.out.println("打印成功");
+        List<SysUser> sysUsers = userMapper.selectUserByphoneNumber(userId, phoneNumber);
+        return AjaxResult.success(sysUsers);
+    }
 
-        try {
-            validateSmsCaptcha(phoneNumber.toString(), smsCode.toString());
-            sysUser = userMapper.selectUserByphoneNumber(userId,phoneNumber);
-        } catch (Exception e) {
-            e.printStackTrace();
+    @ApiOperation("换绑VX/apple账户手机号")
+    @GetMapping("/updateToolId")
+    @Anonymous
+    @Transactional
+    public AjaxResult updateChangeVxAplle(String type,Long phoneNumber,Long oldUserId,Long newUserId) {
+        if (type == null){
+            return error("参数异常!");
+        }
 
-            throw new ProjectException();
+        //如果当前oldUserId没有传值
+        if (oldUserId == null) {
+            oldUserId = SecurityUtils.getUserId();
         }
-        return AjaxResult.success(sysUser);
+
+        SysUser user = userMapper.selectUserById(oldUserId);
+        SysUser oldUser = new SysUser();
+        SysUser newUser = new SysUser();
+        System.out.println(user);
+        String openId = user.getOpenId();
+        String appId = user.getAppId();
+
+        switch (type) {
+            case "1":
+                //换绑微信登录
+                if (openId == null){
+                    return AjaxResult.error("微信账户异常");
+                }
+                //更新老用户
+                oldUser = user;
+                oldUser.setOpenId("");
+                oldUser.setPhonenumber("");
+                userMapper.updateUser(oldUser);
+
+                //更新要绑定的新用户
+                newUser = userMapper.selectUserById(newUserId);
+                newUser.setOpenId(openId);
+                newUser.setPhonenumber(String.valueOf(phoneNumber));
+                userMapper.updateUser(newUser);
+                break;
+            case "2":
+                //换绑苹果登录
+                if (appId == null){
+                    return AjaxResult.error("苹果账户异常");
+                }
+                //更新老用户
+                oldUser = user;
+                oldUser.setAppId("");
+                oldUser.setPhonenumber("");
+                userMapper.updateUser(oldUser);
+
+                //更新要绑定的新用户
+                newUser = userMapper.selectUserById(newUserId);
+                newUser.setAppId(openId);
+                newUser.setPhonenumber(String.valueOf(phoneNumber));
+                userMapper.updateUser(newUser);
+                break;
+            case "3":
+                //当前手机号绑定
+                oldUser = user;
+                oldUser.setPhonenumber(String.valueOf(phoneNumber));
+                userMapper.updateUser(oldUser);
+                break;
+        }
+
+
+
+
+
+        return AjaxResult.success("更新成功");
     }
 
+
+
     /**
      * 重置密码(验证码)
      */
@@ -243,6 +313,32 @@ public class SysProfileController extends BaseController {
         }
     }
 
+    /**
+     * 校验短信验证码
+     * 校验操作不更新不登录 单纯校验手机号
+     * @param username 用户名
+     * @param code     验证码
+     * @return 结果
+     */
+    public void smsVerifyCodeKey(String username, String code) {
+        if (StringUtils.isEmpty(code)) {
+            throw new CaptchaNullException();
+        }
+        String verifyKey = CacheConstants.SMS_VERIFY_CODE_KEY + StringUtils.nvl(username, "");
+        try {
+            String captcha = redisCache.getCacheObject(verifyKey).toString();
+            if (captcha == null) {
+                throw new CaptchaExpireException();
+            }
+            if (!code.equalsIgnoreCase(captcha)) {
+                throw new CaptchaException();
+            }
+            redisCache.deleteObject(verifyKey);
+        } catch (NullPointerException e) {
+            throw new CaptchaExpireException();
+        }
+    }
+
 
     /**
      * 拉黑用户

+ 14 - 31
ruoyi-admin/src/main/resources/logback.xml

@@ -11,7 +11,7 @@
 			<pattern>${log.pattern}</pattern>
 		</encoder>
 	</appender>
-	
+
 	<!-- 系统日志输出 -->
 	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-info.log</file>
@@ -25,16 +25,9 @@
 		<encoder>
 			<pattern>${log.pattern}</pattern>
 		</encoder>
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <!-- 过滤的级别 -->
-            <level>INFO</level>
-            <!-- 匹配时的操作:接收(记录) -->
-            <onMatch>ACCEPT</onMatch>
-            <!-- 不匹配时的操作:拒绝(不记录) -->
-            <onMismatch>DENY</onMismatch>
-        </filter>
+		<!-- 移除过滤器,接受所有级别的日志 -->
 	</appender>
-	
+
 	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-error.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
@@ -47,16 +40,9 @@
         <encoder>
             <pattern>${log.pattern}</pattern>
         </encoder>
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <!-- 过滤的级别 -->
-            <level>ERROR</level>
-			<!-- 匹配时的操作:接收(记录) -->
-            <onMatch>ACCEPT</onMatch>
-			<!-- 不匹配时的操作:拒绝(不记录) -->
-            <onMismatch>DENY</onMismatch>
-        </filter>
+        <!-- 移除过滤器,接受所有级别的日志 -->
     </appender>
-	
+
 	<!-- 用户访问日志输出  -->
     <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<file>${log.path}/sys-user.log</file>
@@ -70,24 +56,21 @@
             <pattern>${log.pattern}</pattern>
         </encoder>
     </appender>
-	
+
 	<!-- 系统模块日志级别控制  -->
-	<logger name="com.ruoyi" level="info" />
+	<logger name="com.ruoyi" level="debug" />
 	<!-- Spring日志级别控制  -->
-	<logger name="org.springframework" level="warn" />
+	<logger name="org.springframework" level="info" />
 
-	<root level="info">
+	<!-- 根日志级别控制 -->
+	<root level="debug">
 		<appender-ref ref="console" />
+		<appender-ref ref="file_info" />
+		<appender-ref ref="file_error" />
 	</root>
-	
-	<!--系统操作日志-->
-    <root level="info">
-        <appender-ref ref="file_info" />
-        <appender-ref ref="file_error" />
-    </root>
-	
+
 	<!--系统用户操作日志-->
     <logger name="sys-user" level="info">
         <appender-ref ref="sys-user"/>
     </logger>
-</configuration> 
+</configuration>

+ 7 - 1
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java

@@ -2,7 +2,7 @@ package com.ruoyi.common.constant;
 
 /**
  * 缓存的key 常量
- * 
+ *
  * @author ruoyi
  */
 public class CacheConstants
@@ -32,6 +32,12 @@ public class CacheConstants
      */
     public static final String SMS_UPDATE_PASSWORD_CODE_KEY = "sms_update_password_codes:";
 
+    /**
+     * 短信手机验证码 redis key
+     */
+    public static final String SMS_VERIFY_CODE_KEY = "sms_verify_code_key:";
+
+
     /**
      * 参数管理 cache key
      */

+ 47 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/LoginToken.java

@@ -0,0 +1,47 @@
+package com.ruoyi.common.core.domain.entity;
+
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * @author fangqing
+ * @date 2025/7/7 13:55
+ */
+public class LoginToken extends BaseEntity {
+
+
+    /**
+     * Token
+     */
+    @Excel(name = "Token")
+    private String token;
+
+    /**
+     * 是否有手机号
+     */
+    private Boolean isPhonenumber;
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public Boolean getPhonenumber() {
+        return isPhonenumber;
+    }
+
+    public void setPhonenumber(Boolean phonenumber) {
+        isPhonenumber = phonenumber;
+    }
+
+    @Override
+    public String toString() {
+        return "Token{" +
+                "token='" + token + '\'' +
+                ", isPhonenumber=" + isPhonenumber +
+                '}';
+    }
+}

+ 27 - 4
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.domain.entity.LoginToken;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.core.redis.RedisCache;
@@ -113,7 +114,7 @@ public class SysLoginService {
      * @param Result 登录凭证 只能用一次
      * @return
      */
-    public String wxLogin(String[] Result){
+    public LoginToken wxLogin(String[] Result){
         //字符串转json
         //JSONObject jsonObject = JSONObject.parseObject(Result);
 
@@ -207,7 +208,17 @@ public class SysLoginService {
         loginUser = (LoginUser) authentication.getPrincipal();
         recordLoginInfo(loginUser.getUserId());
         // 生成token
-        return tokenService.createToken(loginUser);
+        //查询是否绑定手机号
+        String phonenumber = wxUser.getPhonenumber();
+        Boolean isPhonenumber = false;
+        if (phonenumber != null || phonenumber != ""){
+            isPhonenumber = true;
+        }
+
+        LoginToken loginToken  = new LoginToken();
+        loginToken.setPhonenumber(isPhonenumber);
+        loginToken.setToken(tokenService.createToken(loginUser));
+        return loginToken;
     }
 
     /**
@@ -216,7 +227,7 @@ public class SysLoginService {
      * @param Result 登录凭证 只能用一次
      * @return
      */
-    public String appleLogin(String[] Result){
+    public LoginToken appleLogin(String[] Result){
 
         String appid = Result[0];//jsonObject.getString("openid");
         System.out.println("appid:"+appid);
@@ -289,7 +300,19 @@ public class SysLoginService {
         loginUser = (LoginUser) authentication.getPrincipal();
         recordLoginInfo(loginUser.getUserId());
         // 生成token
-        return tokenService.createToken(loginUser);
+
+        //查询是否绑定手机号
+        String phonenumber = wxUser.getPhonenumber();
+        Boolean isPhonenumber = false;
+        if (phonenumber != null || phonenumber != ""){
+            isPhonenumber = true;
+        }
+
+        LoginToken loginToken  = new LoginToken();
+        loginToken.setPhonenumber(isPhonenumber);
+        loginToken.setToken(tokenService.createToken(loginUser));
+
+        return loginToken;
     }
 
     //生成随机用户名,数字和字母组成,

+ 7 - 4
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/CommunityArticleController.java

@@ -234,6 +234,11 @@ public class CommunityArticleController extends BaseController {
             boolean isFillWater = communityArticle.isFillWater();
             log.info("isWaterMark:{},isFillWater:{},Images:{}", isWaterMark, isFillWater, communityArticle.getImages());
             if (isWaterMark && null != communityArticle.getImages()) {
+                for (CommunityImagesVo image : communityArticle.getImages()) {
+                    if (null == image) {
+                        throw new RuntimeException("图片上传失败!");
+                    }
+                }
                 log.info("需要做图片/视频修改...");
                 //获取用户名
                 String nickName = SecurityUtils.getLoginUser().getUser().getNickName();
@@ -899,8 +904,6 @@ public class CommunityArticleController extends BaseController {
     }
 
 
-
-
     @ApiOperation("查询用户")
     @GetMapping("/userList")
     public AjaxResult userList(String SearchValue) {
@@ -1562,7 +1565,7 @@ public class CommunityArticleController extends BaseController {
             } else {
                 communityArticleService.update(new UpdateWrapper<CommunityArticle>()
                         .set("is_top", false)
-                        .set("top_time",null)
+                        .set("top_time", null)
                         .eq("id", communityArticle.getId()));
                 msg = "已取消置顶";
             }
@@ -1585,7 +1588,7 @@ public class CommunityArticleController extends BaseController {
                 updateWrapper.eq("user_id", userId)
                         .eq("is_top", 1)
                         .notIn("id", communityArticles.stream().map(CommunityArticle::getId).collect(Collectors.toList()))
-                        .set("top_time",null)
+                        .set("top_time", null)
                         .set("is_top", false); // 将 is_top 设置为 false
 
                 communityArticleMapper.update(null, updateWrapper);

+ 15 - 5
ruoyi-generator/src/main/resources/mapper/community/ArticleMapper.xml

@@ -202,13 +202,23 @@
         </where>
         group by a.id,a.create_time
         <if test="searchType == 0">
-            ORDER BY a.top_time DESC
+            ORDER BY a.create_time DESC
         </if>
-        <if test="searchType == 1">
-            ORDER BY a.top_time DESC, a.create_time DESC
+        <if test="classIds == null or classIds.size() == 0">
+            <if test="searchType == 1">
+                ORDER BY a.top_time DESC, a.create_time DESC
+            </if>
+            <if test="searchType == 2">
+                ORDER BY a.top_time DESC, a.page_views DESC
+            </if>
         </if>
-        <if test="searchType == 2">
-            ORDER BY a.top_time DESC, a.page_views DESC
+        <if test="classIds != null and classIds.size() > 0">
+            <if test="searchType == 1">
+                ORDER BY a.create_time DESC
+            </if>
+            <if test="searchType == 2">
+                ORDER BY a.page_views DESC
+            </if>
         </if>
         <if test="searchType == 3">
             order by RAND()

+ 5 - 10
ruoyi-generator/src/main/resources/mapper/community/CommunityCollectionMapper.xml

@@ -20,12 +20,10 @@
         a.update_time,
         '0'  as isFollow
         FROM community_collection a
-        LEFT JOIN community_collection_article b ON a.id = b.collection_id
-        LEFT JOIN community_article c ON b.article_id = c.id
+        LEFT JOIN (select * from community_collection_article where is_delete != '1' OR is_delete IS NULL)  b ON a.id = b.collection_id
+        LEFT JOIN (select * from community_article where is_delete != '1' OR is_delete IS NULL) c ON b.article_id = c.id
         WHERE a.user_id = #{userId}
         AND (a.is_delete != '1' OR a.is_delete IS NULL)
-        AND (b.is_delete != '1' OR b.is_delete IS NULL)
-        AND (c.is_delete != '1' OR c.is_delete IS NULL)   AND (c.is_draft != '1' OR c.is_draft IS NULL)
         <if test="articleId != null and articleId != ''">
             AND b.article_id = #{articleId}
         </if>
@@ -58,14 +56,11 @@
         a.update_time,
         '1'  as isFollow
         FROM community_collection a
-        LEFT JOIN community_collection_article b ON a.id = b.collection_id
-        LEFT JOIN community_article c ON b.article_id = c.id
-        LEFT JOIN community_collection_user d ON d.collection_id = a.id
+        LEFT JOIN (select * from community_collection_article where is_delete != '1' OR is_delete IS NULL) b ON a.id = b.collection_id
+        LEFT JOIN (select * from community_article where is_delete != '1' OR is_delete IS NULL) c ON b.article_id = c.id
+        LEFT JOIN (select * from community_collection_user where is_delete != '1' OR is_delete IS NULL)  d ON d.collection_id = a.id
         WHERE d.user_id =  #{userId} AND  d.id  is not null
         AND (a.is_delete != '1' OR a.is_delete IS NULL)
-        AND (b.is_delete != '1' OR b.is_delete IS NULL)
-        AND (d.is_delete != '1' OR d.is_delete IS NULL)
-        AND (c.is_delete != '1' OR c.is_delete IS NULL)   AND (c.is_draft != '1' OR c.is_draft IS NULL)
         <if test="articleId != null and articleId != ''">
             AND b.article_id = #{articleId}
         </if>

+ 1 - 1
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -60,7 +60,7 @@ public interface SysUserMapper extends BaseMapper<SysUser>
      * @param userId 用户ID
      * @return 用户对象信息
      */
-    public SysUser selectUserByphoneNumber(@Param("userId")  Long userId,@Param("phoneNumber")   Long phoneNumber);
+    public List<SysUser> selectUserByphoneNumber(@Param("userId")  Long userId,@Param("phoneNumber")   Long phoneNumber);
 
     /**
      * 根据openId查询用户信息

+ 8 - 2
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -55,7 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<sql id="selectUserVo">
         select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
-        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,u.user_state,u.report_time
+        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,u.user_state,u.report_time,u.open_id,u.app_id
         from sys_user u
 		    left join sys_dept d on u.dept_id = d.dept_id
 		    left join sys_user_role ur on u.user_id = ur.user_id
@@ -160,7 +160,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
 	<select id="selectUserByphoneNumber" resultType="com.ruoyi.common.core.domain.entity.SysUser">
-		select * from sys_user
+		select
+		user_id, phonenumber,avatar,nick_name,open_id,app_id
+		from sys_user
 		<where>
 			<if test="userId != null and userId != '' ">
 				AND user_id = #{userId}
@@ -168,7 +170,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="phoneNumber != null and phoneNumber != ''">
 				AND phonenumber = #{phoneNumber}
 			</if>
+			and del_flag = '0'
 		</where>
+		limit 1
 	</select>
 
 
@@ -228,6 +232,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="remark != null">remark = #{remark},</if>
 			<if test="userState != null and userState != ''">user_state = #{userState},</if>
 			<if test="reportTime != null">report_time = #{reportTime},</if>
+			<if test="openId != null">open_id = #{openId},</if>
+			<if test="appId != null">app_id = #{appId},</if>
  			update_time = sysdate()
  		</set>
  		where user_id = #{userId}