diff --git a/.gitignore b/.gitignore
index 31eae03..c45175a 100755
--- a/.gitignore
+++ b/.gitignore
@@ -44,3 +44,4 @@ build/
/logs/
/.idea/
/han-note-oss/han-note-oss-biz/src/main/resources/application-dev.yml
+/han-note-user/han-note-user-biz/src/main/resources/application-dev.yml
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 8126366..25b2c58 100755
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -11,6 +11,12 @@
+
+
+
+
+
+
diff --git a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/controller/UserController.java b/han-note-auth/src/main/java/com/hanserwei/hannote/auth/controller/UserController.java
index e00621c..d9281cc 100644
--- a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/controller/UserController.java
+++ b/han-note-auth/src/main/java/com/hanserwei/hannote/auth/controller/UserController.java
@@ -11,11 +11,9 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
-@RequestMapping("/user")
@Slf4j
@RequiredArgsConstructor
public class UserController {
diff --git a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/domain/dataobject/UserDO.java b/han-note-auth/src/main/java/com/hanserwei/hannote/auth/domain/dataobject/UserDO.java
index 8f62885..7bda988 100644
--- a/han-note-auth/src/main/java/com/hanserwei/hannote/auth/domain/dataobject/UserDO.java
+++ b/han-note-auth/src/main/java/com/hanserwei/hannote/auth/domain/dataobject/UserDO.java
@@ -28,7 +28,7 @@ public class UserDO {
private Long id;
/**
- * 小哈书号(唯一凭证)
+ * 小憨书号(唯一凭证)
*/
@TableField(value = "han_note_id")
private String hanNoteId;
diff --git a/han-note-gateway/src/main/java/com/hanserwei/hannote/gateway/auth/SaTokenConfigure.java b/han-note-gateway/src/main/java/com/hanserwei/hannote/gateway/auth/SaTokenConfigure.java
index e02e4c1..eb6330f 100644
--- a/han-note-gateway/src/main/java/com/hanserwei/hannote/gateway/auth/SaTokenConfigure.java
+++ b/han-note-gateway/src/main/java/com/hanserwei/hannote/gateway/auth/SaTokenConfigure.java
@@ -22,13 +22,13 @@ public class SaTokenConfigure {
.setAuth(obj -> {
// 登录校验
SaRouter.match("/**") // 拦截所有路由
- .notMatch("/auth/user/login") // 排除登录接口
+ .notMatch("/auth/login") // 排除登录接口
.notMatch("/auth/verification/code/send") // 排除验证码发送接口
.check(r -> StpUtil.checkLogin()) // 校验是否登录
;
// 权限认证 -- 不同模块, 校验不同权限
- SaRouter.match("/auth/user/logout", r -> StpUtil.checkPermission("app:note:publish"));
+ SaRouter.match("/auth/logout", r -> StpUtil.checkPermission("app:note:publish"));
// SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
// SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
// SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
diff --git a/han-note-gateway/src/main/resources/application.yml b/han-note-gateway/src/main/resources/application.yml
index ddd669c..d01cb9a 100644
--- a/han-note-gateway/src/main/resources/application.yml
+++ b/han-note-gateway/src/main/resources/application.yml
@@ -10,6 +10,12 @@ spring:
- Path=/auth/**
filters:
- StripPrefix=1
+ - id: user
+ uri: lb://han-note-user
+ predicates:
+ - Path=/user/**
+ filters:
+ - StripPrefix=1
data:
redis:
database: 5 # Redis 数据库索引(默认为 0)
diff --git a/han-note-user/han-note-user-api/pom.xml b/han-note-user/han-note-user-api/pom.xml
new file mode 100644
index 0000000..94e452b
--- /dev/null
+++ b/han-note-user/han-note-user-api/pom.xml
@@ -0,0 +1,25 @@
+
+ 4.0.0
+
+
+ com.hanserwei
+ han-note-user
+ ${revision}
+
+
+
+ jar
+
+ han-note-user-api
+ ${project.artifactId}
+ RPC层, 供其他服务调用
+
+
+
+ com.hanserwei
+ hanserwei-common
+
+
+
+
diff --git a/han-note-user/han-note-user-biz/pom.xml b/han-note-user/han-note-user-biz/pom.xml
new file mode 100644
index 0000000..3474506
--- /dev/null
+++ b/han-note-user/han-note-user-biz/pom.xml
@@ -0,0 +1,80 @@
+
+ 4.0.0
+
+
+ com.hanserwei
+ han-note-user
+ ${revision}
+
+
+
+ jar
+
+ han-note-user-biz
+ ${project.artifactId}
+ 用户服务业务模块
+
+
+
+ com.hanserwei
+ hanserwei-common
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+ com.mysql
+ mysql-connector-j
+
+
+ com.baomidou
+ mybatis-plus-spring-boot3-starter
+
+
+ com.alibaba
+ druid-spring-boot-3-starter
+
+
+ com.hanserwei
+ hanserwei-spring-boot-starter-jackson
+
+
+ com.hanserwei
+ hanserwei-spring-boot-starter-biz-operationlog
+
+
+ com.hanserwei
+ hanserwei-spring-boot-starter-biz-context
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/HannoteUserBizApplication.java b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/HannoteUserBizApplication.java
new file mode 100644
index 0000000..21ad5df
--- /dev/null
+++ b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/HannoteUserBizApplication.java
@@ -0,0 +1,13 @@
+package com.hanserwei.hannote.user.biz;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@MapperScan("com.hanserwei.hannote.user.biz.domain.mapper")
+public class HannoteUserBizApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(HannoteUserBizApplication.class, args);
+ }
+}
diff --git a/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/controller/UserController.java b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/controller/UserController.java
new file mode 100644
index 0000000..4ce2807
--- /dev/null
+++ b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/controller/UserController.java
@@ -0,0 +1,33 @@
+package com.hanserwei.hannote.user.biz.controller;
+
+import com.hanserwei.framework.common.response.Response;
+import com.hanserwei.hannote.user.biz.model.vo.UpdateUserInfoReqVO;
+import com.hanserwei.hannote.user.biz.service.UserService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/user")
+@Slf4j
+public class UserController {
+
+ @Resource
+ private UserService userService;
+
+ /**
+ * 用户信息修改
+ *
+ * @param updateUserInfoReqVO 修改信息请求
+ * @return 响应
+ */
+ @PostMapping(value = "/update", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public Response> updateUserInfo(@Validated UpdateUserInfoReqVO updateUserInfoReqVO) {
+ return userService.updateUserInfo(updateUserInfoReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/domain/dataobject/UserDO.java b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/domain/dataobject/UserDO.java
new file mode 100644
index 0000000..8c7d7fe
--- /dev/null
+++ b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/domain/dataobject/UserDO.java
@@ -0,0 +1,107 @@
+package com.hanserwei.hannote.user.biz.domain.dataobject;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 用户表
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "t_user")
+public class UserDO {
+ /**
+ * 主键ID
+ */
+ @TableId(value = "id", type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 小憨书号(唯一凭证)
+ */
+ @TableField(value = "han_note_id")
+ private String hanNoteId;
+
+ /**
+ * 密码
+ */
+ @TableField(value = "`password`")
+ private String password;
+
+ /**
+ * 昵称
+ */
+ @TableField(value = "nickname")
+ private String nickname;
+
+ /**
+ * 头像
+ */
+ @TableField(value = "avatar")
+ private String avatar;
+
+ /**
+ * 生日
+ */
+ @TableField(value = "birthday")
+ private LocalDate birthday;
+
+ /**
+ * 背景图
+ */
+ @TableField(value = "background_img")
+ private String backgroundImg;
+
+ /**
+ * 邮箱
+ */
+ @TableField(value = "email")
+ private String email;
+
+ /**
+ * 性别(0:女 1:男)
+ */
+ @TableField(value = "sex")
+ private Integer sex;
+
+ /**
+ * 状态(0:启用 1:禁用)
+ */
+ @TableField(value = "`status`")
+ private Integer status;
+
+ /**
+ * 个人简介
+ */
+ @TableField(value = "introduction")
+ private String introduction;
+
+ /**
+ * 创建时间
+ */
+ @TableField(value = "create_time")
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ @TableField(value = "update_time")
+ private LocalDateTime updateTime;
+
+ /**
+ * 逻辑删除(0:未删除 1:已删除)
+ */
+ @TableField(value = "is_deleted")
+ private Boolean isDeleted;
+}
\ No newline at end of file
diff --git a/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/domain/mapper/UserDOMapper.java b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/domain/mapper/UserDOMapper.java
new file mode 100644
index 0000000..a1364a4
--- /dev/null
+++ b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/domain/mapper/UserDOMapper.java
@@ -0,0 +1,7 @@
+package com.hanserwei.hannote.user.biz.domain.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hanserwei.hannote.user.biz.domain.dataobject.UserDO;
+
+public interface UserDOMapper extends BaseMapper {
+}
\ No newline at end of file
diff --git a/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/enums/ResponseCodeEnum.java b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/enums/ResponseCodeEnum.java
new file mode 100644
index 0000000..1a61efe
--- /dev/null
+++ b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/enums/ResponseCodeEnum.java
@@ -0,0 +1,28 @@
+package com.hanserwei.hannote.user.biz.enums;
+
+import com.hanserwei.framework.common.exception.BaseExceptionInterface;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum ResponseCodeEnum implements BaseExceptionInterface {
+
+ // ----------- 通用异常状态码 -----------
+ SYSTEM_ERROR("USER-10000", "出错啦,后台小维正在努力修复中..."),
+ PARAM_NOT_VALID("USER-10001", "参数错误!!!"),
+
+ // ----------- 业务异常状态码 -----------
+ NICK_NAME_VALID_FAIL("USER-20001", "昵称请设置2-24个字符,不能使用@《/等特殊字符"),
+ HAN_NOTE_ID_VALID_FAIL("USER-20002", "小憨书号请设置6-15个字符,仅可使用英文(必须)、数字、下划线"),
+ SEX_VALID_FAIL("USER-20003", "性别错误"),
+ INTRODUCTION_VALID_FAIL("USER-20004", "个人简介请设置1-100个字符"),
+ ;
+ ;
+
+ // 异常码
+ private final String errorCode;
+ // 错误信息
+ private final String errorMsg;
+
+}
\ No newline at end of file
diff --git a/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/enums/SexEnum.java b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/enums/SexEnum.java
new file mode 100644
index 0000000..32bed10
--- /dev/null
+++ b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/enums/SexEnum.java
@@ -0,0 +1,26 @@
+package com.hanserwei.hannote.user.biz.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Objects;
+
+@Getter
+@AllArgsConstructor
+public enum SexEnum {
+
+ WOMAN(0),
+ MAN(1);
+
+ private final Integer value;
+
+ public static boolean isValid(Integer value) {
+ for (SexEnum loginTypeEnum : SexEnum.values()) {
+ if (Objects.equals(value, loginTypeEnum.getValue())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/exception/GlobalExceptionHandler.java b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..a5281a4
--- /dev/null
+++ b/han-note-user/han-note-user-biz/src/main/java/com/hanserwei/hannote/user/biz/exception/GlobalExceptionHandler.java
@@ -0,0 +1,103 @@
+package com.hanserwei.hannote.user.biz.exception;
+
+import com.hanserwei.framework.common.exception.ApiException;
+import com.hanserwei.framework.common.response.Response;
+import com.hanserwei.hannote.user.biz.enums.ResponseCodeEnum;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.Optional;
+
+@SuppressWarnings("LoggingSimilarMessage")
+@ControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+ /**
+ * 捕获自定义业务异常
+ *
+ * @return Response.fail(e)
+ */
+ @ExceptionHandler({ApiException.class})
+ @ResponseBody
+ public Response