skyfffire 2 месяцев назад
Родитель
Сommit
6aebab6e9e

+ 1 - 1
src/main/java/common/interceptor/empty/EmptyInterceptor.java

@@ -16,7 +16,7 @@ public class EmptyInterceptor implements Interceptor {
         if (annotation == null) {
             inv.invoke();
         } else {
-            String[] keyArray = annotation.keyArray();
+            String[] keyArray = annotation.value();
             Controller controller = inv.getController();
             JSONObject paramsModel = MyController.getJsonModelByRequestAndType(controller.getRequest(), JSONObject.class);
 

+ 1 - 1
src/main/java/common/interceptor/empty/EmptyInterface.java

@@ -6,5 +6,5 @@ import java.lang.annotation.*;
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.TYPE, ElementType.METHOD})
 public @interface EmptyInterface {
-	String[] keyArray();
+	String[] value();
 }

+ 12 - 0
src/main/java/common/model/Role.java

@@ -0,0 +1,12 @@
+package common.model;
+
+import common.model.base.BaseRole;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class Role extends BaseRole<Role> {
+	public static final Role dao = new Role().dao();
+}
+

+ 1 - 0
src/main/java/common/model/_MappingKit.java

@@ -18,6 +18,7 @@ public class _MappingKit {
 	public static void mapping(ActiveRecordPlugin arp) {
 		arp.addMapping("t_nft", "id", Nft.class);
 		arp.addMapping("t_nftt", "id", Nftt.class);
+		arp.addMapping("t_role", "id", Role.class);
 		arp.addMapping("t_user", "id", User.class);
 	}
 }

+ 55 - 0
src/main/java/common/model/base/BaseRole.java

@@ -0,0 +1,55 @@
+package common.model.base;
+
+import com.jfinal.plugin.activerecord.Model;
+import com.jfinal.plugin.activerecord.IBean;
+
+/**
+ * Generated by JFinal, do not modify this file.
+ */
+@SuppressWarnings("serial")
+public abstract class BaseRole<M extends BaseRole<M>> extends Model<M> implements IBean {
+	/**
+	 * 权限id
+	 */
+	public void setId(java.lang.Integer id) {
+		set("id", id);
+	}
+	
+	/**
+	 * 权限id
+	 */
+	public java.lang.Integer getId() {
+		return getInt("id");
+	}
+	/**
+	 * 权限备注
+	 */
+	public void setNote(java.lang.String note) {
+		set("note", note);
+	}
+	
+	/**
+	 * 权限备注
+	 */
+	public java.lang.String getNote() {
+		return getStr("note");
+	}
+	
+	public boolean save() {
+		set("create_time", System.currentTimeMillis());
+		
+		return super.save();
+	}
+	
+	public boolean update() {
+		set("update_time", System.currentTimeMillis());
+		
+		return super.update();
+	}
+
+	public boolean delete() {
+		set("is_deleted", 1);
+
+		return super.update();
+	}
+}

+ 13 - 0
src/main/java/common/model/base/BaseUser.java

@@ -99,6 +99,19 @@ public abstract class BaseUser<M extends BaseUser<M>> extends Model<M> implement
 	public java.lang.Integer getIntegral() {
 		return getInt("integral");
 	}
+	/**
+	 * 最后登录时间
+	 */
+	public void setLoginTime(java.lang.Long loginTime) {
+		set("login_time", loginTime);
+	}
+	
+	/**
+	 * 最后登录时间
+	 */
+	public java.lang.Long getLoginTime() {
+		return getLong("login_time");
+	}
 	public void setCreateTime(java.lang.Long createTime) {
 		set("create_time", createTime);
 	}

+ 1 - 1
src/main/java/common/utils/http/MyController.java

@@ -18,7 +18,7 @@ public class MyController extends Controller {
 		String data = HttpKit.readData(request);
 		
 		// request只支持读取一次,无法满足需求
-		if (!StrKit.isBlank(data)) {
+		if (StrKit.notBlank(data)) {
 			request.setAttribute("data", data);
 		} else {
 			data = (String) request.getAttribute("data");

+ 0 - 1
src/main/java/modules/upload/UploadController.java

@@ -5,7 +5,6 @@ import com.jfinal.kit.StrKit;
 import com.jfinal.upload.UploadFile;
 import common.interceptor.LoginInterceptor;
 import common.interceptor.role.RequiredRoleInterface;
-import common.interceptor.role.RoleInterceptor;
 import common.utils.http.MyController;
 import common.utils.http.MyRet;
 import modules.user.UserController;

+ 125 - 26
src/main/java/modules/user/UserController.java

@@ -8,6 +8,7 @@ import com.jfinal.kit.StrKit;
 import common.interceptor.LoginInterceptor;
 import common.interceptor.empty.EmptyInterceptor;
 import common.interceptor.empty.EmptyInterface;
+import common.interceptor.role.RequiredRoleInterface;
 import common.model.User;
 import common.utils.http.MyController;
 import common.utils.http.MyRet;
@@ -30,7 +31,7 @@ public class UserController extends MyController {
         renderText(service.hello());
     }
     
-    @EmptyInterface(keyArray = {"mobile_number"})
+    @EmptyInterface({"mobile_number"})
     public void sendVerifyCode() {
         // --- 核心修改部分 ---
         // 通过 MyController 获取解析后的 JSON 对象,拦截器也使用了这个方法
@@ -73,7 +74,7 @@ public class UserController extends MyController {
         }
     }
 
-    @EmptyInterface(keyArray = {"mobile_number", "pwd_md5", "repeat_pwd_md5", "verify_code"})
+    @EmptyInterface({"mobile_number", "pwd_md5", "repeat_pwd_md5", "verify_code"})
     public void register() {
         // --- 核心修改部分:从 JSON 请求体中获取参数 ---
         JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
@@ -120,9 +121,9 @@ public class UserController extends MyController {
         renderJson(service.saveUser(user));
     }
 
-    @EmptyInterface(keyArray = {"mobile_number"})
+    @EmptyInterface({"mobile_number"})
     public void login() {
-        // --- 核心修改部分:从 JSON 请求体中获取参数 ---
+        // --- 从 JSON 请求体中获取参数 ---
         JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
 
         // 因为 EmptyInterceptor 已经保证了这些字段不为空,这里可以直接获取
@@ -139,11 +140,11 @@ public class UserController extends MyController {
         // 2.判断是使用密码还是验证码登录
         MyRet ret = MyRet.fail("违规操作会导致ip封禁!");
         // 如果传入了密码优先使用密码登录
-        if (!StrKit.isBlank(pwdMd5)) {
+        if (StrKit.notBlank(pwdMd5)) {
             ret = service.login(mobileNumber, HashKit.md5(pwdMd5));
         } 
         // 如果有验证码传入进行验证码校验
-        if (!StrKit.isBlank(verifyCode)) {
+        if (StrKit.notBlank(verifyCode)) {
             MyRet verifyCodeRet = checkVerifyCode(verifyCode);
             if (!verifyCodeRet.isOk()) {
                 renderJson(verifyCodeRet);
@@ -154,8 +155,13 @@ public class UserController extends MyController {
         }
         
         if (ret.isOk()) {
+            // 更新用户时间
+            service.updateUserLoginTime(mobileNumber);
+            
+            // 将token传回前端
             ret.set("token", createToken("dl-token"));
 
+            // 其它参数的封装
             setSessionAttr("id", ((User)ret.get("data")).getStr("id"));
             setSessionAttr("mobile_number", ((User)ret.get("data")).getStr("mobile_number"));
             setSessionAttr("role", ((User)ret.get("data")).getStr("role"));
@@ -178,7 +184,7 @@ public class UserController extends MyController {
             renderJson(MyRet.ok("获取成功").setData(user));
         }
     }
-    
+
     public void logout() {
         removeSessionAttr("id");
         removeSessionAttr("mobile_number");
@@ -188,29 +194,122 @@ public class UserController extends MyController {
         renderJson(MyRet.ok("已成功登出。"));
     }
 
+    /**
+     * 更新用户的方法,传什么更新什么,不传就不更新,id必须传
+     */
+    @Before(LoginInterceptor.class)
+    @RequiredRoleInterface({UserController.ROLE_SUPER_ADMIN})
+    @EmptyInterface({"id"})
+    public void updateByAdmin() {
+        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
+        String id = requestBodyJson.getString("id");
+        
+        User user = service.findUserById(id);
+
+        // 检查用户合法性
+        if (user == null) {
+            renderJson(MyRet.fail("用户获取不合法,该id对应的用户不存在,不要乱传参数。"));
+            return;
+        }
+        
+        // 校验昵称是否需要修改
+        String nickname = requestBodyJson.getString("nickname");
+        if (StrKit.notBlank(nickname)) {
+            user.set("nickname", nickname);
+        }
+        
+        // 校验手机号是否需要修改
+        String mobileNumber = requestBodyJson.getString("mobile_number");
+        if (StrKit.notBlank(mobileNumber)) {
+            user.set("mobile_number", mobileNumber);
+        }
+        
+        // 密码修改
+        String pwdMd5 = requestBodyJson.getString("pwd_md5");
+        if (StrKit.notBlank(pwdMd5)) {
+            user.set("pwd_md5_md5", HashKit.md5(pwdMd5));
+        }
+
+        // 权限修改
+        String roleStr = requestBodyJson.getString("role");
+        if (StrKit.notBlank(roleStr)) {
+            try {
+                int roleInt = Integer.parseInt(roleStr); // 转换为 int 类型
+                
+                if (roleInt == ROLE_SUPER_ADMIN) {
+                    renderJson(MyRet.fail("为了安全考虑!不能在该接口设置超级管理员!请联系开发者处理!"));
+                    return;
+                } else if (user.getInt("role") == 0) {
+                    renderJson(MyRet.fail("为了安全考虑!不能在该接口将超级管理员降级!请联系开发者处理!"));
+                    return;
+                } else {
+                    user.set("role", roleInt);
+                }
+            } catch (NumberFormatException e) {
+                // 处理转换失败的情况,例如记录日志,或者返回错误信息给前端
+                renderJson(MyRet.fail("角色值格式不正确"));
+                return; // 中断后续操作
+            }
+        }
+
+        // 推荐人修改
+        String referrerIdStr = requestBodyJson.getString("referrer_id");
+        if (StrKit.notBlank(referrerIdStr)) {
+            try {
+                long referrerIdLong = Long.parseLong(referrerIdStr); // 或者 int,根据数据库字段大小
+                user.set("referrer_id", referrerIdLong);
+            } catch (NumberFormatException e) {
+                renderJson(MyRet.fail("推荐人ID格式不正确"));
+                return;
+            }
+        }
+
+        // 积分修改
+        String integralStr = requestBodyJson.getString("integral");
+        if (StrKit.notBlank(integralStr)) {
+            try {
+                int integralInt = Integer.parseInt(integralStr);
+                user.set("integral", integralInt);
+            } catch (NumberFormatException e) {
+                renderJson(MyRet.fail("积分值格式不正确"));
+                return;
+            }
+        }
+        
+        // 更新时间
+        user.set("update_time", System.currentTimeMillis());
+        
+        // 执行更新业务
+        if (user.update()) {
+            renderJson(MyRet.ok("用户更新成功").setData(service.findUserByMobileNumber(user.getMobileNumber())));
+        } else {
+            renderJson(MyRet.fail("用户更新失败"));
+        }
+    }
+
     /*
     * 
-### 验证码修改密码
-POST {{ baseUrl }}/user/updatePwd
-Content-Type: application/json
-
-{
-  "mobile_number": "17781855864",
-  "new_pwd_md5": "e10adc3949ba59abbe56e057f20f883e",
-  "verify_code": "9119"
-}
+    ### 验证码修改密码
+    POST {{ baseUrl }}/user/updatePwd
+    Content-Type: application/json
+    
+    {
+      "mobile_number": "17781855864",
+      "new_pwd_md5": "e10adc3949ba59abbe56e057f20f883e",
+      "verify_code": "9119"
+    }
     * 
     * */
-//    @EmptyInterface(keyArray = {"mobile_number", "new_pwd_md5", "verify_code"})
-//    public void updatePwd() {
-//        // --- 核心修改部分:从 JSON 请求体中获取参数 ---
-//        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
-//
-//        // 因为 EmptyInterceptor 已经保证了这些字段不为空,这里可以直接获取
-//        String mobileNumber = requestBodyJson.getString("mobile_number");
-//        String pwdMd5 = requestBodyJson.getString("new_pwd_md5");
-//        String verifyCode = requestBodyJson.getString("verify_code");
-//    }
+    //    @EmptyInterface(keyArray = {"mobile_number", "new_pwd_md5", "verify_code"})
+    //    public void updatePwd() {
+    //        // --- 核心修改部分:从 JSON 请求体中获取参数 ---
+    //        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
+    //
+    //        // 因为 EmptyInterceptor 已经保证了这些字段不为空,这里可以直接获取
+    //        String mobileNumber = requestBodyJson.getString("mobile_number");
+    //        String pwdMd5 = requestBodyJson.getString("new_pwd_md5");
+    //        String verifyCode = requestBodyJson.getString("verify_code");
+    //    }
     
     private MyRet checkVerifyCode(String userVerifyCode) {
         // 3. 验证码校验

+ 12 - 0
src/main/java/modules/user/UserService.java

@@ -44,6 +44,18 @@ public class UserService {
         }
     }
     
+    public void updateUserLoginTime(String mobileNumber) {
+        String sql = "update t_user set login_time = ? where mobile_number = ?";
+
+        Db.update(sql, System.currentTimeMillis(), mobileNumber);
+    }
+
+    public User findUserById(String id) {
+        String sql = "select * from t_user where id = ?";
+
+        return User.dao.findFirst(sql, id);
+    }
+    
     public User findUserByMobileNumber(String MobileNumber) {
         String columns = "id, nickname, mobile_number, role, referrer_id, integral, create_time, update_time, is_deleted";
         String sql = "select " + columns + " from t_user where mobile_number = ?";

+ 10 - 0
src/test/rest/UserControllerTest.http

@@ -37,3 +37,13 @@ POST {{ baseUrl }}/user/getUserInfo
 Content-Type: application/json
 dl-token: 3814944677224469098
 
+### 更新用户的方法,传什么更新什么,不传就不更新,id必须传
+POST {{ baseUrl }}/user/updateByAdmin
+Content-Type: application/json
+dl-token: 7324757096464221038
+
+{
+  "id": "10003",
+  "nickname": "skyfffire",
+  "integral": 10
+}