From 403fbe8fa8d3df96d692ad41ffa1c300b0db5493 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期六, 24 八月 2024 18:02:02 +0800
Subject: [PATCH] APP端登录模块接口

---
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java                                           |    4 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/vo/ContentSettingVO.java                                            |   23 
 xinquan-auth/src/main/java/com/xinquan/auth/util/HuaWeiSMSUtil.java                                                                        |  189 +++
 xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java                                                                   |  247 ++++
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/VersionServiceImpl.java                                       |   20 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java                                                    |   44 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserEnergyRecordController.java                    |    3 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTree.java                                                        |   10 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java                                   |   62 +
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/TreeLevelEnum.java                                          |   32 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserController.java                                |    3 
 xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java                                                                      |   13 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/LoginUser.java                                                   |   16 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusic.java                                    |   10 
 xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java                                 |   45 
 xinquan-auth/src/main/java/com/xinquan/auth/form/VerifyResultVO.java                                                                       |   23 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/HotWordsService.java                                               |   16 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserCourseController.java                          |    3 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/CommonQuestionService.java                                         |   16 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/HomeBackgroundMusicUserMapper.java                          |   16 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/CustomConfigService.java                                           |   16 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/UserLevelSettingServiceImpl.java                              |   20 
 xinquan-api/xinquan-api-user/pom.xml                                                                                                       |    7 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/ContentSettingService.java                                         |   16 
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ListingStatusEnum.java                                      |   39 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/HomeBackgroundMusicUserServiceImpl.java               |   20 
 xinquan-modules/xinquan-system/pom.xml                                                                                                     |    5 
 xinquan-auth/src/main/java/com/xinquan/auth/form/AppLoginBody.java                                                                         |   34 
 pom.xml                                                                                                                                    |    5 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserBankController.java                            |    3 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java                                                    |   41 
 xinquan-modules/pom.xml                                                                                                                    |    5 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/HomeBackgroundMusicUserService.java                        |   16 
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AppUserStatusEnum.java                                      |   24 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/UserLevelSettingService.java                                       |   16 
 xinquan-modules/xinquan-user/pom.xml                                                                                                       |   12 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/VipSettingServiceImpl.java                                    |   20 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/BannerServiceImpl.java                                        |   20 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppWXLoginBody.java                                              |   49 +
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java                                               |   10 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/TreeLevelSettingServiceImpl.java                              |   20 
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/DisabledEnum.java                                           |    8 
 xinquan-modules/xinquan-meditation/pom.xml                                                                                                 |   12 
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/ServiceNameConstants.java                                |   14 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserQuestionService.java                                            |   16 
 xinquan-modules/xinquan-order/pom.xml                                                                                                      |   12 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserQuestionMapper.java                                              |   16 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/UserLevelSetting.java                                               |   12 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserMeditationController.java                      |    3 
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/config/MybatisPlusConfig.java                                     |   58 +
 xinquan-modules/xinquan-file/src/main/java/com/xinquan/file/utils/ObsUploadUtil.java                                                       |   77 +
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWalletRecordController.java                    |    3 
 xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java                                         |    2 
 xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicMapper.xml                                      |    4 
 xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java                                  |   26 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusicUser.java                                |   42 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/ContentSettingServiceImpl.java                                |   20 
 xinquan-modules/xinquan-file/pom.xml                                                                                                       |   13 
 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderPaymentRecordService.java                                       |    2 
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ConfigEnum.java                                             |   63 +
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppVerifyCellPhoneBody.java                                      |   28 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtTagController.java                                    |   27 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/PublicService.java                                                 |   34 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/CommonQuestionServiceImpl.java                                |   20 
 xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/annotation/EnableCustomConfig.java                        |    4 
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/SecurityConstants.java                                   |    5 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/TreeLevelSettingService.java                                       |   16 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java                                           |  302 ++++++
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTagController.java                             |    3 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeRedemptionRecordController.java                  |    3 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeController.java                                  |    3 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserQuestionMapper.xml                                                      |   11 
 xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java                                            |   57 +
 code-generator/pom.xml                                                                                                                     |   52 +
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseModel.java                                         |   13 
 xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml                                                 |    2 
 xinquan-modules/xinquan-gen/pom.xml                                                                                                        |   19 
 xinquan-auth/src/main/java/com/xinquan/auth/form/AppChangePwdBody.java                                                                     |   29 
 xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicUserMapper.xml                                  |   18 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicController.java               |    3 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWithdrawController.java                        |    3 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml                                                          |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserQuestionController.java                         |   20 
 xinquan-modules/xinquan-system/src/main/resources/mapper/system/TreeLevelSettingMapper.xml                                                 |    1 
 xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/config/JacksonConfig.java                                 |   48 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/CustomConfigServiceImpl.java                                  |   20 
 xinquan-modules/xinquan-course/pom.xml                                                                                                     |   12 
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java                                      |   23 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppleLoginUser.java                                              |   18 
 xinquan-gateway/src/main/java/com/xinquan/gateway/config/SwaggerProvider.java                                                              |    4 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/VersionService.java                                                |   16 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/HomeBackgroundMusicMapper.java                              |    4 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/VipSettingService.java                                             |   16 
 xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/handler/MyMetaObjectHandler.java                          |   44 
 xinquan-common/xinquan-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |    2 
 xinquan-modules/xinquan-file/src/main/java/com/xinquan/file/controller/SysFileController.java                                              |   28 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicUserController.java           |   20 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/client/PublicController.java                                    |   38 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserQuestionServiceImpl.java                                   |   20 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java                                                    |    3 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/feignClient/SysUserClient.java                                         |    9 
 /dev/null                                                                                                                                  |   76 -
 xinquan-api/xinquan-api-course/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports         |    1 
 xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java                                                                |  120 ++
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppCaptchaBody.java                                              |   26 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/BannerService.java                                                 |   16 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/HotWordsServiceImpl.java                                      |   20 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTreeController.java                            |    3 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/SysUserFallbackFactory.java                                    |    9 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/WXLoginUser.java                                                 |   68 +
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java                                                                |    1 
 111 files changed, 2,626 insertions(+), 310 deletions(-)

diff --git a/code-generator/pom.xml b/code-generator/pom.xml
new file mode 100644
index 0000000..21c6175
--- /dev/null
+++ b/code-generator/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>com.xinquan</groupId>
+    <artifactId>xinquan</artifactId>
+    <version>3.6.2</version>
+  </parent>
+
+  <artifactId>code-generator</artifactId>
+
+  <properties>
+    <maven.compiler.source>8</maven.compiler.source>
+    <maven.compiler.target>8</maven.compiler.target>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+  <dependencies>
+    <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
+    <dependency>
+      <groupId>org.apache.velocity</groupId>
+      <artifactId>velocity-engine-core</artifactId>
+      <version>2.3</version>
+    </dependency>
+
+    <!-- Mysql Connector -->
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.13.2</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>com.baomidou</groupId>
+      <artifactId>mybatis-plus-generator</artifactId>
+      <version>3.4.0</version>
+      <scope>test</scope>
+    </dependency>
+    
+    <dependency>
+      <groupId>com.xinquan</groupId>
+      <artifactId>xinquan-common-core</artifactId>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 53fada4..ce34c0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -238,10 +238,7 @@
         <module>xinquan-modules</module>
         <module>xinquan-api</module>
         <module>xinquan-common</module>
-        <module>xinquan-modules/xinquan-user</module>
-        <module>xinquan-modules/xinquan-course</module>
-        <module>xinquan-modules/xinquan-meditation</module>
-        <module>xinquan-modules/xinquan-order</module>
+        <module>code-generator</module>
     </modules>
     <packaging>pom</packaging>
 
diff --git a/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java
index 247ffd1..5fcac4a 100644
--- a/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java
+++ b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java
@@ -8,7 +8,7 @@
  * @author mitao
  * @date 2024/8/21
  */
-@FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.COURSE, fallbackFactory = RemoteCourseFallbackFactory.class)
+@FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.COURSE_SERVICE, fallbackFactory = RemoteCourseFallbackFactory.class)
 public interface RemoteCourseService {
 
 }
diff --git a/xinquan-api/xinquan-api-course/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xinquan-api/xinquan-api-course/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 2e77edb..e69de29 100644
--- a/xinquan-api/xinquan-api-course/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/xinquan-api/xinquan-api-course/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1 +0,0 @@
-com.xinquan.course.api.factory.RemoteCourseFallbackFactory
\ No newline at end of file
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/config/DataUpdateHandlerConfig.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/config/DataUpdateHandlerConfig.java
deleted file mode 100644
index 63a80da..0000000
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/config/DataUpdateHandlerConfig.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.xinquan.system.api.config;
-
-import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
-import com.xinquan.system.api.model.LoginUser;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.reflection.MetaObject;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.util.StringUtils;
-
-import java.util.Date;
-
-/**
- * @author xiaochen
- * @ClassName DataUpdateInterceptor
- * @Description 数据更新操作处理
- * @date 2021-12-15
- * <p>
- * 注意,之前在此处注入了 JwtTokenUtils
- * <p>
- * 造成spring循环依赖,项目支棱不起来
- */
-@Slf4j
-@Configuration
-public class DataUpdateHandlerConfig implements MetaObjectHandler {
-
-    @Override
-    public void insertFill(MetaObject metaObject) {
-
-    }
-
-    @Override
-    public void updateFill(MetaObject metaObject) {
-
-    }
-}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/config/HttpConfig.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/config/HttpConfig.java
deleted file mode 100644
index b33ed30..0000000
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/config/HttpConfig.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.xinquan.system.api.config;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.web.client.RestTemplateBuilder;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.client.RestTemplate;
-
-/**
- * http请求工具配置
- *
- * @author: KingKong
- * @create: 2018-11-14 10:47
- **/
-@Configuration
-public class HttpConfig {
-
-    @Autowired
-    private RestTemplateBuilder builder;
-
-    @Bean
-    public RestTemplate restTemplate() {
-        return builder.build();
-    }
-}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/config/MybatisPlusConfig.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/config/MybatisPlusConfig.java
deleted file mode 100644
index 5b7c44a..0000000
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/config/MybatisPlusConfig.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.xinquan.system.api.config;
-
-import com.baomidou.mybatisplus.annotation.DbType;
-import com.baomidou.mybatisplus.core.config.GlobalConfig;
-import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
-import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * @author xiaochen
- * @ClassName MybatisPlusConfig
- * @Description MybatisPlus相关配置
- * @date 2020-09-22 11:22、
- * 直接以实现类作为bean的注入(有事务管理的类)
- * @EnableTransactionManagement(proxyTargetClass = true)
- */
-@Configuration
-public class MybatisPlusConfig {
-    private final DataUpdateHandlerConfig dataUpdateHandler;
-
-    @Autowired
-    public MybatisPlusConfig(DataUpdateHandlerConfig dataUpdateHandler) {
-        this.dataUpdateHandler = dataUpdateHandler;
-    }
-
-    /**
-     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
-     */
-    @Bean
-    public MybatisPlusInterceptor mybatisPlusInterceptor() {
-        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
-        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
-        return interceptor;
-    }
-
-    /**
-     * 自动填充功能
-     *
-     * @return
-     */
-    @Bean
-    public GlobalConfig globalConfig() {
-        GlobalConfig globalConfig = new GlobalConfig();
-        globalConfig.setMetaObjectHandler(dataUpdateHandler);
-        return globalConfig;
-    }
-
-
-}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java
index 3faf056..d39f786 100644
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java
@@ -1,6 +1,7 @@
 package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.xinquan.common.core.annotation.Excel;
 import com.xinquan.common.core.annotation.Excel.ColumnType;
 import com.xinquan.common.core.annotation.Excel.Type;
@@ -28,7 +29,7 @@
 
     /** 用户ID */
     @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
-    @TableField("user_id")
+    @TableId("user_id")
     private Long userId;
 
     /** 部门ID */
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/SysUserFallbackFactory.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/SysUserFallbackFactory.java
index d7a2790..e725bf7 100644
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/SysUserFallbackFactory.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/SysUserFallbackFactory.java
@@ -4,11 +4,9 @@
 import com.xinquan.system.api.domain.SysRole;
 import com.xinquan.system.api.domain.SysUser;
 import com.xinquan.system.api.feignClient.SysUserClient;
-import com.xinquan.system.api.model.*;
+import java.util.List;
 import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.stereotype.Component;
-
-import java.util.List;
 @Component
 public class SysUserFallbackFactory implements FallbackFactory<SysUserClient> {
     @Override
@@ -48,11 +46,6 @@
             @Override
             public R<List<SysUser>> queryUserByPhoneList(List<String> phoneList) {
                 return R.fail("通过手机号集合查询用户失败:" + cause.getMessage());
-            }
-
-            @Override
-            public R<Boolean> addUserRole(List<SysUserRoleDTO> dtoList) {
-                return R.fail("默认批量添加修理厂失败:" + cause.getMessage());
             }
 
             @Override
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/feignClient/SysUserClient.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/feignClient/SysUserClient.java
index 91488ed..b0c0698 100644
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/feignClient/SysUserClient.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/feignClient/SysUserClient.java
@@ -5,7 +5,6 @@
 import com.xinquan.system.api.domain.SysRole;
 import com.xinquan.system.api.domain.SysUser;
 import com.xinquan.system.api.factory.SysUserFallbackFactory;
-import com.xinquan.system.api.model.SysUserRoleDTO;
 import java.util.List;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -52,14 +51,6 @@
      */
     @PostMapping("/user/queryUserByPhoneList")
     R<List<SysUser>>  queryUserByPhoneList(@RequestBody List<String> phoneList);
-
-    /**
-     * 默认批量添加修理厂
-     * @param dtoList
-     * @return
-     */
-    @PostMapping("/user/addUserRole")
-    R<Boolean>  addUserRole(@RequestBody List<SysUserRoleDTO> dtoList);
 
     /**
      * 通过手机号查询用户
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppCaptchaBody.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppCaptchaBody.java
new file mode 100644
index 0000000..ebc36f7
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppCaptchaBody.java
@@ -0,0 +1,26 @@
+package com.xinquan.system.api.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import javax.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2024/8/22
+ */
+@Data
+@ApiModel(value = "APP端验证码对象", description = "APP端验证码对象")
+public class AppCaptchaBody implements Serializable {
+
+    private static final long serialVersionUID = 6079425494597881288L;
+
+    @ApiModelProperty(value = "手机号")
+    @NotBlank(message = "手机号不能为空")
+    private String cellPhone;
+
+    @ApiModelProperty("验证码")
+    @NotBlank(message = "验证码不能为空")
+    private String captcha;
+}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppVerifyCellPhoneBody.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppVerifyCellPhoneBody.java
new file mode 100644
index 0000000..61a9254
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppVerifyCellPhoneBody.java
@@ -0,0 +1,28 @@
+package com.xinquan.system.api.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author mitao
+ * @date 2024/8/23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "APP端验证手机号对象", description = "APP端验证手机号对象")
+public class AppVerifyCellPhoneBody extends AppCaptchaBody {
+
+    private static final long serialVersionUID = -6119279151800382508L;
+    @NotBlank(message = "微信openid或苹果appleId不能为空")
+    @ApiModelProperty(value = "微信openid或苹果appleId")
+    private String wxOrAppleId;
+
+    @NotNull(message = "登录类型不能为空")
+    @ApiModelProperty(value = "登录类型 1=微信 2=苹果")
+    private Integer loginType;
+
+}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppWXLoginBody.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppWXLoginBody.java
new file mode 100644
index 0000000..75a7315
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppWXLoginBody.java
@@ -0,0 +1,49 @@
+package com.xinquan.system.api.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * 用户登录对象
+ *
+ * @author ruoyi
+ */
+@Data
+@ApiModel("APP用户微信登录对象")
+public class AppWXLoginBody implements Serializable {
+
+    private static final long serialVersionUID = 2440885532660952359L;
+
+    /**
+     * 微信openId
+     */
+    @ApiModelProperty(value = "微信openId")
+    @NotBlank(message = "微信openId不能为空")
+    private String wxOpenId;
+
+    /**
+     * 用户昵称
+     */
+    @ApiModelProperty(value = "用户昵称")
+    @NotBlank(message = "用户昵称不能为空")
+    private String nickname;
+
+    /**
+     * 用户头像
+     */
+    @ApiModelProperty(value = "用户头像")
+    @NotBlank(message = "用户头像不能为空")
+    private String headImgUrl;
+
+    /**
+     * 用户头像
+     */
+    @ApiModelProperty(value = "用户性别")
+    @NotNull(message = "用户性别不能为空")
+    private Integer sex;
+
+}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppleLoginUser.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppleLoginUser.java
new file mode 100644
index 0000000..17d18c9
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppleLoginUser.java
@@ -0,0 +1,18 @@
+package com.xinquan.system.api.model;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户信息
+ *
+ * @author ruoyi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "苹果登录用户信息")
+public class AppleLoginUser extends WXLoginUser {
+
+    private static final long serialVersionUID = 6891070491318038281L;
+}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/CompanyAddSysUserDto.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/CompanyAddSysUserDto.java
deleted file mode 100644
index f5886e6..0000000
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/CompanyAddSysUserDto.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.xinquan.system.api.model;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class CompanyAddSysUserDto {
-    List<CompanyUserListVo> list;
-    @ApiModelProperty("公司id")
-    private Integer companyId;
-}
\ No newline at end of file
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/CompanySysUserReq.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/CompanySysUserReq.java
deleted file mode 100644
index 6813344..0000000
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/CompanySysUserReq.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.xinquan.system.api.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CompanySysUserReq {
-    private Integer companyId;
-    private String name;
-    private List<Integer> userIds;
-
-}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/CompanyUserListVo.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/CompanyUserListVo.java
deleted file mode 100644
index 04e56aa..0000000
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/CompanyUserListVo.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.xinquan.system.api.model;
-
-import lombok.Data;
-
-@Data
-public class CompanyUserListVo {
-    private Long id;
-
-    private String userName;
-
-    private String phoneNumber;
-
-    private String password;
-
-    private String nickName;
-}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/LoginUser.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/LoginUser.java
index 1b4d64b..649c8ff 100644
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/LoginUser.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/LoginUser.java
@@ -1,14 +1,17 @@
 package com.xinquan.system.api.model;
 
+import com.xinquan.system.api.domain.SysUser;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.util.Set;
-import com.xinquan.system.api.domain.SysUser;
 
 /**
  * 用户信息
  *
  * @author ruoyi
  */
+@ApiModel(value = "登录用户信息")
 public class LoginUser implements Serializable
 {
     private static final long serialVersionUID = 1L;
@@ -16,46 +19,55 @@
     /**
      * 用户唯一标识
      */
+    @ApiModelProperty(value = "用户唯一标识")
     private String token;
 
     /**
-     * 用户名id
+     * 用户id
      */
+    @ApiModelProperty(value = "用户id")
     private Long userid;
 
     /**
      * 用户名
      */
+    @ApiModelProperty(value = "用户名")
     private String username;
 
     /**
      * 登录时间
      */
+    @ApiModelProperty(value = "登录时间")
     private Long loginTime;
 
     /**
      * 过期时间
      */
+    @ApiModelProperty(value = "过期时间")
     private Long expireTime;
 
     /**
      * 登录IP地址
      */
+    @ApiModelProperty(value = "登录IP地址")
     private String ipaddr;
 
     /**
      * 权限列表
      */
+    @ApiModelProperty(value = "权限列表")
     private Set<String> permissions;
 
     /**
      * 角色列表
      */
+    @ApiModelProperty(value = "角色列表")
     private Set<String> roles;
 
     /**
      * 用户信息
      */
+    @ApiModelProperty(value = "用户信息")
     private SysUser sysUser;
 
     public String getToken()
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/SysUserRoleDTO.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/SysUserRoleDTO.java
deleted file mode 100644
index 894451a..0000000
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/SysUserRoleDTO.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.xinquan.system.api.model;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-@ApiModel(value = "自动关联修理厂角色DTO")
-public class SysUserRoleDTO implements Serializable {
-
-    @ApiModelProperty(value = "用户id")
-    private Long userId;
-    @ApiModelProperty(value = "角色id")
-    private Long roleId;
-
-}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/TRepairShopAdd.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/TRepairShopAdd.java
deleted file mode 100644
index 58c3d14..0000000
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/TRepairShopAdd.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.xinquan.system.api.model;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
-
-@Data
-public class TRepairShopAdd {
-    @ApiModelProperty("账号")
-    @NotBlank(message = "账号不能为空")
-    private String phonenumber;
-    @ApiModelProperty("密码")
-    @NotBlank(message = "密码不能为空")
-    private String pwd;
-  
-}
\ No newline at end of file
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/TRepairShopAddDto.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/TRepairShopAddDto.java
deleted file mode 100644
index 90587ae..0000000
--- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/TRepairShopAddDto.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.xinquan.system.api.model;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-import java.util.List;
-@Data
-public class TRepairShopAddDto {
-    private List<TRepairShopAdd> list;
-    @ApiModelProperty("修理场id")
-    @NotNull(message = "修理厂id不能为空")
-    private Integer repairId;
-}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/WXLoginUser.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/WXLoginUser.java
new file mode 100644
index 0000000..13bfe0b
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/WXLoginUser.java
@@ -0,0 +1,68 @@
+package com.xinquan.system.api.model;
+
+import com.xinquan.system.api.domain.SysUser;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * 用户信息
+ *
+ * @author ruoyi
+ */
+@Data
+@ApiModel(value = "微信登录用户信息")
+public class WXLoginUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户唯一标识
+     */
+    @ApiModelProperty(value = "APP用户id")
+    private Long token;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id")
+    private Long userid;
+
+    /**
+     * 用户名
+     */
+    @ApiModelProperty(value = "用户名")
+    private String username;
+
+    /**
+     * 登录时间
+     */
+    @ApiModelProperty(value = "登录时间")
+    private Long loginTime;
+
+    /**
+     * 过期时间
+     */
+    @ApiModelProperty(value = "过期时间")
+    private Long expireTime;
+
+    /**
+     * 登录IP地址
+     */
+    @ApiModelProperty(value = "登录IP地址")
+    private String ipaddr;
+
+    @ApiModelProperty(value = "绑定手机号状态 1=是 2=否")
+    private Integer bindStatus = 2;
+
+    @ApiModelProperty(value = "用户手机")
+    private String cellPhone;
+
+    /**
+     * 系统用户信息
+     */
+    @ApiModelProperty(value = "系统用户信息")
+    private SysUser sysUser;
+
+}
diff --git a/xinquan-api/xinquan-api-user/pom.xml b/xinquan-api/xinquan-api-user/pom.xml
index 3a4e2fd..98cab4e 100644
--- a/xinquan-api/xinquan-api-user/pom.xml
+++ b/xinquan-api/xinquan-api-user/pom.xml
@@ -27,5 +27,12 @@
         </exclusion>
       </exclusions>
     </dependency>
+    
+    <!--system feign模块-->
+    <dependency>
+      <groupId>com.xinquan</groupId>
+      <artifactId>xinquan-api-system</artifactId>
+      <scope>compile</scope>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java
index 2a87c9f..f821cf1 100644
--- a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java
+++ b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java
@@ -1,6 +1,12 @@
 package com.xinquan.user.api.factory;
 
 import com.xinquan.common.core.domain.R;
+import com.xinquan.system.api.model.AppCaptchaBody;
+import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
+import com.xinquan.system.api.model.AppWXLoginBody;
+import com.xinquan.system.api.model.AppleLoginUser;
+import com.xinquan.system.api.model.LoginUser;
+import com.xinquan.system.api.model.WXLoginUser;
 import com.xinquan.user.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.api.feign.RemoteAppUserService;
@@ -28,6 +34,26 @@
             public R<Boolean> registerAppUser(AppUserDTO appUserDTO, String source) {
                 return R.fail("APP用户注册失败。");
             }
+
+            @Override
+            public R<WXLoginUser> wxLogin(AppWXLoginBody body, String inner) {
+                return R.fail("APP用户微信登录失败。");
+            }
+
+            @Override
+            public R<AppleLoginUser> appleLogin(String appleId, String source) {
+                return R.fail("APP用户苹果登录失败。");
+            }
+
+            @Override
+            public R<LoginUser> appCaptchaLogin(AppCaptchaBody body, String source) {
+                return R.fail("APP用户验证码登录失败。");
+            }
+
+            @Override
+            public R<WXLoginUser> verifyCellPhone(AppVerifyCellPhoneBody body, String source) {
+                return R.fail("APP用户微信苹果登录验证手机号失败。");
+            }
         };
     }
 }
diff --git a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java
index 0735297..81c9882 100644
--- a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java
+++ b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java
@@ -3,6 +3,12 @@
 import com.xinquan.common.core.constant.SecurityConstants;
 import com.xinquan.common.core.constant.ServiceNameConstants;
 import com.xinquan.common.core.domain.R;
+import com.xinquan.system.api.model.AppCaptchaBody;
+import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
+import com.xinquan.system.api.model.AppWXLoginBody;
+import com.xinquan.system.api.model.AppleLoginUser;
+import com.xinquan.system.api.model.LoginUser;
+import com.xinquan.system.api.model.WXLoginUser;
 import com.xinquan.user.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.api.factory.RemoteAppUserFallbackFactory;
@@ -10,16 +16,17 @@
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * @author mitao
  * @date 2024/8/21
  */
-@FeignClient(contextId = "remoteAppUserService", value = ServiceNameConstants.APP_USER, fallbackFactory = RemoteAppUserFallbackFactory.class)
+@FeignClient(contextId = "remoteAppUserService", value = ServiceNameConstants.APP_USER_SERVICE, fallbackFactory = RemoteAppUserFallbackFactory.class)
 public interface RemoteAppUserService {
 
     /**
-     * 获取用户信息
+     * 获取未注销的用户信息
      *
      * @param dto
      * @param source
@@ -30,7 +37,7 @@
             @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
     /**
-     * app用户注册
+     * APP用户注册
      *
      * @param appUserDTO
      * @param source
@@ -39,4 +46,48 @@
     @PostMapping("/inner/app-user/registerAppUser")
     R<Boolean> registerAppUser(@RequestBody AppUserDTO appUserDTO,
             @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * APP微信登录
+     *
+     * @param body
+     * @param source
+     * @return
+     */
+    @PostMapping("/inner/app-user/wxLogin")
+    R<WXLoginUser> wxLogin(@RequestBody AppWXLoginBody body,
+            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * APP苹果登录
+     *
+     * @param appleId
+     * @param source
+     * @return
+     */
+    @PostMapping("/inner/app-user/appleLogin")
+    R<AppleLoginUser> appleLogin(@RequestParam("appleId") String appleId,
+            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * 验证码登录
+     *
+     * @param body
+     * @param source
+     * @return
+     */
+    @PostMapping("/inner/app-user/captchaLogin")
+    R<LoginUser> appCaptchaLogin(@RequestBody AppCaptchaBody body,
+            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * 微信苹果登录验证手机号码操作
+     *
+     * @param body
+     * @param source
+     * @return
+     */
+    @PostMapping("/inner/app-user/verifyCellPhone")
+    R<WXLoginUser> verifyCellPhone(@RequestBody AppVerifyCellPhoneBody body,
+            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 }
diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java b/xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java
index 47e877a..41f1707 100644
--- a/xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java
+++ b/xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java
@@ -1,8 +1,11 @@
 package com.xinquan.auth.controller;
 
+import com.xinquan.auth.form.AppChangePwdBody;
+import com.xinquan.auth.form.AppLoginBody;
 import com.xinquan.auth.form.AppRegisterBody;
 import com.xinquan.auth.form.LoginBody;
 import com.xinquan.auth.form.RegisterBody;
+import com.xinquan.auth.form.VerifyResultVO;
 import com.xinquan.auth.service.SysLoginService;
 import com.xinquan.common.core.domain.R;
 import com.xinquan.common.core.utils.JwtUtils;
@@ -13,7 +16,12 @@
 import com.xinquan.system.api.domain.SysRole;
 import com.xinquan.system.api.domain.SysUser;
 import com.xinquan.system.api.feignClient.SysUserClient;
+import com.xinquan.system.api.model.AppCaptchaBody;
+import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
+import com.xinquan.system.api.model.AppWXLoginBody;
+import com.xinquan.system.api.model.AppleLoginUser;
 import com.xinquan.system.api.model.LoginUser;
+import com.xinquan.system.api.model.WXLoginUser;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
@@ -23,6 +31,7 @@
 import javax.servlet.http.HttpServletRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -52,11 +61,15 @@
      * @param cellPhone 手机号码
      * @return
      */
-    @GetMapping("/app/send-captcha-code")
+    @GetMapping("/app/sendCaptchaCode")
     @ApiOperation(value = "发送验证码",tags = {"APP端"})
-    @ApiImplicitParams({@ApiImplicitParam(name = "cellPhone",value = "手机号码",required = true,dataType = "String",paramType = "query")})
-    public R<?> sendCaptchaCode(@RequestParam("cellPhone") String cellPhone) {
-        sysLoginService.sendCaptchaCode(cellPhone);
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "cellPhone", value = "手机号码", required = true, dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "type", value = "类型 1=注册 2=验证码登录 3=找回密码 4=第三方登录后验证手机", required = true, dataType = "Integer", paramType = "query")})
+    public R<?> sendCaptchaCode(
+            @RequestParam(value = "cellPhone", required = true) String cellPhone,
+            @RequestParam("type") Integer type) {
+        sysLoginService.sendCaptchaCode(cellPhone, type);
         return R.ok();
     }
 
@@ -67,13 +80,110 @@
      */
     @ApiOperation(value = "注册账户",tags = {"APP端"})
     @PostMapping("/app/register")
-    public R<?> appRegister(@RequestBody AppRegisterBody appRegisterBody)
+    public R<?> appRegister(@Validated @RequestBody AppRegisterBody appRegisterBody)
     {
         // 用户注册
         sysLoginService.appRegister(appRegisterBody);
         return R.ok();
     }
 
+    /**
+     * 账号密码登录
+     *
+     * @param body
+     * @return
+     */
+    @ApiOperation(value = "账号密码登录", tags = {"APP端"})
+    @PostMapping("/app/login")
+    public R<?> appLogin(@Validated @RequestBody AppLoginBody body) {
+        LoginUser userInfo = sysLoginService.appLogin(body);
+        return R.ok(tokenService.createToken(userInfo));
+    }
+
+    /**
+     * 验证码登录
+     *
+     * @param body
+     * @return
+     */
+    @ApiOperation(value = "验证码登录", tags = {"APP端"})
+    @PostMapping("/app/captchaLogin")
+    public R<?> appCaptchaLogin(@Validated @RequestBody AppCaptchaBody body) {
+        LoginUser userInfo = sysLoginService.appCaptchaLogin(body);
+        return R.ok(tokenService.createToken(userInfo));
+    }
+
+    /**
+     * 验证手机号
+     *
+     * @param body
+     * @return
+     */
+    @ApiOperation(value = "忘记密码-验证手机号", tags = {"APP端"})
+    @PostMapping("/app/verifyPhone")
+    public R<VerifyResultVO> verifyPhone(@Validated @RequestBody AppCaptchaBody body) {
+        return R.ok(sysLoginService.verifyPhone(body));
+    }
+
+    /**
+     * 设置新密码
+     *
+     * @param body
+     * @return
+     */
+    @ApiOperation(value = "设置新密码", tags = {"APP端"})
+    @PostMapping("/app/changePassword")
+    public R<?> changePassword(@Validated @RequestBody AppChangePwdBody body) {
+        sysLoginService.changePassword(body);
+        return R.ok();
+    }
+
+    /**
+     * APP微信登录
+     *
+     * @param body
+     * @return
+     */
+    @ApiOperation(value = "微信登录", tags = {"APP端"})
+    @PostMapping("/app/wxLogin")
+    public R<?> thirdLogin(@Validated @RequestBody AppWXLoginBody body) {
+        WXLoginUser wxLoginUser = sysLoginService.wxLogin(body);
+        return R.ok(tokenService.createToken4WXLoginUser(wxLoginUser));
+    }
+
+    /**
+     * 苹果登录
+     *
+     * @param appleId
+     * @return
+     */
+    @ApiOperation(value = "苹果登录", tags = {"APP端"})
+    @PostMapping("/app/appleLogin")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "appleId", value = "苹果ID", required = true, dataType = "String", paramType = "query")})
+    public R<?> appleLogin(@RequestParam(value = "appleId", required = true) String appleId) {
+        AppleLoginUser appleLoginUser = sysLoginService.appleLogin(appleId);
+        return R.ok(tokenService.createToken4WXLoginUser(appleLoginUser));
+    }
+
+    /**
+     * 微信苹果登录-验证手机号
+     *
+     * @param body
+     * @return
+     */
+    @ApiOperation(value = "微信苹果登录-验证手机号", tags = {"APP端"})
+    @PostMapping("/app/verifyCellPhone")
+    public R<?> verifyCellPhone(@Validated @RequestBody AppVerifyCellPhoneBody body) {
+        return R.ok(tokenService.createToken4WXLoginUser(sysLoginService.verifyCellPhone(body)));
+    }
+
+    /**
+     * 管理后台登录
+     *
+     * @param form
+     * @return
+     */
     @ApiOperation(value = "管理后台登录",tags = {"管理后台"})
     @PostMapping("login")
     public R<?> login(@RequestBody LoginBody form)
diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppChangePwdBody.java b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppChangePwdBody.java
new file mode 100644
index 0000000..db9023c
--- /dev/null
+++ b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppChangePwdBody.java
@@ -0,0 +1,29 @@
+package com.xinquan.auth.form;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import javax.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户登录对象
+ *
+ * @author ruoyi
+ */
+@Data
+@ApiModel("APP用户修改密码对象")
+@EqualsAndHashCode(callSuper = true)
+public class AppChangePwdBody extends AppLoginBody implements Serializable {
+
+    private static final long serialVersionUID = 2440885532660952359L;
+
+    /**
+     * 用户密码
+     */
+    @ApiModelProperty(value = "密码修改秘钥")
+    @NotBlank(message = "密码修改秘钥不能为空")
+    private String secret;
+
+}
diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppLoginBody.java b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppLoginBody.java
new file mode 100644
index 0000000..00767d2
--- /dev/null
+++ b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppLoginBody.java
@@ -0,0 +1,34 @@
+package com.xinquan.auth.form;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import javax.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * 用户登录对象
+ *
+ * @author ruoyi
+ */
+@Data
+@ApiModel("APP用户登录对象")
+public class AppLoginBody implements Serializable {
+
+    private static final long serialVersionUID = 2440885532660952359L;
+
+    /**
+     * 手机号
+     */
+    @ApiModelProperty(value = "手机号")
+    @NotBlank(message = "手机号不能为空")
+    private String cellPhone;
+
+    /**
+     * 用户密码
+     */
+    @ApiModelProperty(value = "用户密码")
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+}
diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java
index 4fda916..b1407b3 100644
--- a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java
+++ b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java
@@ -1,10 +1,12 @@
 package com.xinquan.auth.form;
 
+import com.xinquan.system.api.model.AppCaptchaBody;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import javax.validation.constraints.NotBlank;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 /**
  * 用户注册对象
@@ -12,23 +14,16 @@
  * @author ruoyi
  */
 @Data
+@EqualsAndHashCode(callSuper = true)
 @ApiModel(value = "APP端注册对象", description = "APP端注册对象")
-public class AppRegisterBody implements Serializable
+public class AppRegisterBody extends AppCaptchaBody implements Serializable
 {
 
     private static final long serialVersionUID = 438348119520198682L;
 
-    @ApiModelProperty(value = "电话号码")
-    @NotBlank(message = "电话号码不能为空")
-    private String cellPhone;
-
     @ApiModelProperty(value = "用户密码")
     @NotBlank(message = "用户密码不能为空")
     private String password;
-
-    @ApiModelProperty("验证码")
-    @NotBlank(message = "验证码不能为空")
-    private String verifyCode;
 
     @ApiModelProperty("邀请人id")
     private Long inviteUserId;
diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/form/VerifyResultVO.java b/xinquan-auth/src/main/java/com/xinquan/auth/form/VerifyResultVO.java
new file mode 100644
index 0000000..2055d54
--- /dev/null
+++ b/xinquan-auth/src/main/java/com/xinquan/auth/form/VerifyResultVO.java
@@ -0,0 +1,23 @@
+package com.xinquan.auth.form;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2024/8/22
+ */
+@Data
+@ApiModel("手机号验证结果")
+public class VerifyResultVO implements Serializable {
+
+    private static final long serialVersionUID = -1642557986917707324L;
+    @ApiModelProperty("密码修改秘钥")
+    private String secret;
+    
+    @ApiModelProperty("是否验证成功")
+    private Boolean successFlag;
+
+}
diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java b/xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java
index 144e53b..36d0fc3 100644
--- a/xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java
+++ b/xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java
@@ -2,12 +2,17 @@
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.RandomUtil;
+import com.xinquan.auth.form.AppChangePwdBody;
+import com.xinquan.auth.form.AppLoginBody;
 import com.xinquan.auth.form.AppRegisterBody;
+import com.xinquan.auth.form.VerifyResultVO;
+import com.xinquan.auth.util.HuaWeiSMSUtil;
 import com.xinquan.common.core.constant.CacheConstants;
 import com.xinquan.common.core.constant.Constants;
 import com.xinquan.common.core.constant.SecurityConstants;
 import com.xinquan.common.core.constant.UserConstants;
 import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.enums.AppUserStatusEnum;
 import com.xinquan.common.core.enums.UserStatus;
 import com.xinquan.common.core.exception.ServiceException;
 import com.xinquan.common.core.text.Convert;
@@ -17,7 +22,13 @@
 import com.xinquan.common.security.utils.SecurityUtils;
 import com.xinquan.system.api.RemoteUserService;
 import com.xinquan.system.api.domain.SysUser;
+import com.xinquan.system.api.feignClient.SysUserClient;
+import com.xinquan.system.api.model.AppCaptchaBody;
+import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
+import com.xinquan.system.api.model.AppWXLoginBody;
+import com.xinquan.system.api.model.AppleLoginUser;
 import com.xinquan.system.api.model.LoginUser;
+import com.xinquan.system.api.model.WXLoginUser;
 import com.xinquan.user.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.api.feign.RemoteAppUserService;
@@ -25,6 +36,8 @@
 import java.time.LocalDateTime;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -53,6 +66,8 @@
     @Autowired
     private RemoteAppUserService remoteAppUserService;
 
+    @Autowired
+    private SysUserClient sysUserClient;
     /**
      * 登录
      */
@@ -163,7 +178,8 @@
         String cellPhone = appRegisterBody.getCellPhone();
         String password = appRegisterBody.getPassword();
         //验证码校验
-        if (!verifyCode(cellPhone, appRegisterBody.getVerifyCode()))
+        if (!verifyCaptcha(cellPhone, appRegisterBody.getCaptcha(),
+                CacheConstants.APP_REGISTER_CAPTCHA_CODE_PREFIX))
         {
             throw new ServiceException("验证码错误");
         }
@@ -211,14 +227,14 @@
     /**
      * 校验验证码
      * @param cellPhone 手机号
-     * @param verifyCode 验证码
+     * @param captcha 验证码
      * @return true/false
      */
-    private boolean verifyCode(String cellPhone, String verifyCode) {
-        if (StringUtils.isNotBlank(cellPhone) && StringUtils.isNotBlank(verifyCode)) {
-            String key = CacheConstants.APP_CAPTCHA_CODE_PREFIX + cellPhone;
+    private boolean verifyCaptcha(String cellPhone, String captcha, String keyPrefix) {
+        if (StringUtils.isNotBlank(cellPhone) && StringUtils.isNotBlank(captcha)) {
+            String key = keyPrefix + cellPhone;
             String code = redisService.getCacheObject(key);
-            if (StringUtils.isNotBlank(code) && code.equals(verifyCode)) {
+            if (StringUtils.isNotBlank(code) && code.equals(captcha)) {
                 redisService.deleteObject(key);
                 return true;
             }
@@ -227,25 +243,228 @@
     }
 
     /**
-     * 发送验证码
-     * @param cellPhone 手机号码
+     * 根据类型获取对象的验证码key
+     *
+     * @param type
+     * @return
      */
-    public void sendCaptchaCode(String cellPhone) {
-        Boolean result = redisService.hasKey(
-                CacheConstants.APP_CAPTCHA_CODE_PREFIX + cellPhone);
+    private String getCaptchaCodeByTypePrefix(Integer type) {
+        switch (type) {
+            case 1:
+                return CacheConstants.APP_REGISTER_CAPTCHA_CODE_PREFIX;
+            case 2:
+                return CacheConstants.APP_LOGIN_CAPTCHA_CODE_PREFIX;
+            case 3:
+                return CacheConstants.APP_PASSWORD_CAPTCHA_CODE_PREFIX;
+            case 4:
+                return CacheConstants.APP_VERIFY_CAPTCHA_CODE_PREFIX;
+            default:
+                return "";
+        }
+    }
+    /**
+     * 发送验证码
+     *
+     * @param cellPhone 手机号码
+     * @param type
+     */
+    public void sendCaptchaCode(String cellPhone, Integer type) {
+        String key = getCaptchaCodeByTypePrefix(type);
+        Boolean result = redisService.hasKey(key + cellPhone);
         if (result) {
             throw new ServiceException("请勿重复发送验证码");
         }
         String code = RandomUtil.randomNumbers(6);
         try {
-            //TODO 发送短信
-            log.info("发送验证码成功,手机号:{} 验证码:{}", cellPhone,code);
+            log.info("发送验证码成功,手机号:{} 验证码:{}", cellPhone, code);
+            // TODO 修改sender参数及templateId
+            HuaWeiSMSUtil.sendSms("[\"" + code + "\"]", cellPhone, "8823121426646",
+                    "cf1707ec44694627b1b483b0277e12fd");
         } catch (Exception e) {
             log.error("发送短信失败", e);
             throw new ServiceException("验证码发送失败");
         }
         //将验证码放入redis
-        redisService.setCacheObject(CacheConstants.APP_CAPTCHA_CODE_PREFIX + cellPhone, code, 5L,
+        redisService.setCacheObject(key + cellPhone, code, 5L,
                 TimeUnit.MINUTES);
     }
+
+    /**
+     * APP账号密码登录
+     *
+     * @param body
+     * @return
+     */
+    public LoginUser appLogin(AppLoginBody body) {
+
+        // IP黑名单校验
+        String blackStr = Convert.toStr(
+                redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
+        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) {
+            recordLogService.recordLogininfor(body.getCellPhone(), Constants.LOGIN_FAIL,
+                    "很遗憾,访问IP已被列入系统黑名单");
+            throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
+        }
+        // 查询用户信息
+        AppUser appUser = remoteAppUserService.getUserByCondition(
+                AppUserDTO.builder().cellPhone(body.getCellPhone()).build(),
+                SecurityConstants.INNER).getData();
+        if (StringUtils.isNull(appUser)) {
+            recordLogService.recordLogininfor(body.getCellPhone(), Constants.LOGIN_FAIL,
+                    "登录用户不存在");
+            throw new ServiceException("登录用户:" + body.getCellPhone() + " 不存在");
+        }
+        // 1:正常 2:冻结 3:注销
+        if (appUser.getUserStatus().equals(AppUserStatusEnum.FROZEN.getCode())) {
+            recordLogService.recordLogininfor(body.getCellPhone(), Constants.LOGIN_FAIL,
+                    "账号已冻结");
+            throw new ServiceException("账号已冻结");
+        }
+        if (appUser.getUserStatus().equals(AppUserStatusEnum.LOGOUT.getCode())) {
+            recordLogService.recordLogininfor(body.getCellPhone(), Constants.LOGIN_FAIL,
+                    "账号已注销");
+            throw new ServiceException("账号已注销");
+        }
+        // 查询系统用户信息
+        SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
+        if (StringUtils.isNull(sysUser)) {
+            recordLogService.recordLogininfor(body.getCellPhone(), Constants.LOGIN_FAIL,
+                    "登录用户不存在");
+            throw new ServiceException("登录用户:" + body.getCellPhone() + " 不存在");
+        }
+        // 校验账号密码
+        passwordService.validate(sysUser, body.getPassword());
+        LoginUser userInfo = new LoginUser();
+        userInfo.setSysUser(sysUser);
+        recordLogService.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_SUCCESS,
+                "登录成功");
+        return userInfo;
+    }
+
+    /**
+     * APP微信登录
+     *
+     * @param body
+     * @return
+     */
+    public WXLoginUser wxLogin(AppWXLoginBody body) {
+        // 通过wxOpenId查询APP用户信息
+        R<WXLoginUser> userResult = remoteAppUserService.wxLogin(body, SecurityConstants.INNER);
+        if (R.FAIL == userResult.getCode()) {
+            throw new ServiceException(userResult.getMsg());
+        }
+
+        return userResult.getData();
+    }
+
+    /**
+     * 苹果登录
+     *
+     * @param appleId 苹果id
+     * @return
+     */
+    public AppleLoginUser appleLogin(String appleId) {
+        R<AppleLoginUser> userResult = remoteAppUserService.appleLogin(appleId,
+                SecurityConstants.INNER);
+        if (R.FAIL == userResult.getCode()) {
+            throw new ServiceException(userResult.getMsg());
+        }
+        return userResult.getData();
+    }
+
+    /**
+     * 验证手机号
+     *
+     * @param body
+     * @return
+     */
+    public VerifyResultVO verifyPhone(AppCaptchaBody body) {
+        VerifyResultVO verifyResultVO = new VerifyResultVO();
+        boolean b = verifyCaptcha(body.getCellPhone(), body.getCaptcha(),
+                CacheConstants.APP_VERIFY_CAPTCHA_CODE_PREFIX);
+        verifyResultVO.setSuccessFlag(b);
+        if (b) {
+            // 验证成功,删除验证码
+            redisService.deleteObject(
+                    CacheConstants.APP_VERIFY_CAPTCHA_CODE_PREFIX + body.getCellPhone());
+            verifyResultVO.setSecret(IdUtil.randomUUID());
+            redisService.setCacheObject(
+                    CacheConstants.APP_PASSWORD_SECRET_PREFIX + body.getCellPhone(),
+                    verifyResultVO.getSecret(), 10L, TimeUnit.MINUTES);
+        }
+        return verifyResultVO;
+    }
+
+    public void changePassword(AppChangePwdBody body) {
+        Object baseSecret = redisService.getCacheObject(
+                CacheConstants.APP_PASSWORD_SECRET_PREFIX + body.getCellPhone());
+        if (Objects.isNull(baseSecret)) {
+            throw new ServiceException("密码修改秘钥已失效,请重新校验手机号获取");
+        }
+        if (!body.getSecret().equals(baseSecret.toString())) {
+            throw new ServiceException("密码修改秘钥不正确");
+        }
+        // 校验密码,密码至少8个字符,不能全是字母或者数字
+        String regex = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$\n";
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(body.getPassword());
+        if (!matcher.matches()) {
+            throw new ServiceException("密码至少8个字符,不能全是字母或者数字");
+        }
+        // 根据手机号查询用户
+        AppUser appUser = remoteAppUserService.getUserByCondition(
+                AppUserDTO.builder().cellPhone(body.getCellPhone()).build(),
+                SecurityConstants.INNER).getData();
+        if (Objects.isNull(appUser)) {
+            throw new ServiceException("用户不存在或已注销");
+        }
+        // 查询系统用户
+        SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
+        if (Objects.isNull(sysUser)) {
+            throw new ServiceException("用户不存在或已注销");
+        }
+        // 修改密码
+        sysUser.setPassword(SecurityUtils.encryptPassword(body.getPassword()));
+        sysUserClient.updateUser(sysUser);
+        redisService.deleteObject(CacheConstants.APP_PASSWORD_SECRET_PREFIX + body.getCellPhone());
+    }
+
+    /**
+     * 验证码登录
+     *
+     * @param body
+     * @return
+     */
+    public LoginUser appCaptchaLogin(AppCaptchaBody body) {
+        // 校验验证码
+        if (!verifyCaptcha(body.getCellPhone(), body.getCaptcha(),
+                CacheConstants.APP_LOGIN_CAPTCHA_CODE_PREFIX)) {
+            throw new ServiceException("验证码不正确");
+        }
+        R<LoginUser> loginUserR = remoteAppUserService.appCaptchaLogin(body,
+                SecurityConstants.INNER);
+        if (R.FAIL == loginUserR.getCode()) {
+            throw new ServiceException(loginUserR.getMsg());
+        }
+        return loginUserR.getData();
+    }
+
+    public WXLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) {
+        String captcha = redisService.getCacheObject(
+                CacheConstants.APP_VERIFY_CAPTCHA_CODE_PREFIX + body.getCellPhone());
+        if (Objects.isNull(captcha)) {
+            throw new ServiceException("验证码已失效,请重新获取");
+        }
+        // 校验验证码
+        if (!verifyCaptcha(body.getCellPhone(), body.getCaptcha(),
+                CacheConstants.APP_LOGIN_CAPTCHA_CODE_PREFIX)) {
+            throw new ServiceException("验证码不正确");
+        }
+        // 更新用户系统用户信息
+        R<WXLoginUser> result = remoteAppUserService.verifyCellPhone(body, SecurityConstants.INNER);
+        if (R.FAIL == result.getCode()) {
+            throw new ServiceException(result.getMsg());
+        }
+        return result.getData();
+    }
 }
diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/util/HuaWeiSMSUtil.java b/xinquan-auth/src/main/java/com/xinquan/auth/util/HuaWeiSMSUtil.java
new file mode 100644
index 0000000..4e2f386
--- /dev/null
+++ b/xinquan-auth/src/main/java/com/xinquan/auth/util/HuaWeiSMSUtil.java
@@ -0,0 +1,189 @@
+package com.xinquan.auth.util;
+
+import java.nio.charset.Charset;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.http.HttpHeaders;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.methods.RequestBuilder;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+
+// 如果JDK版本是1.8,可使用原生Base64类
+
+public class HuaWeiSMSUtil {
+
+    // 无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值
+    private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"";
+    // 无需修改,用于格式化鉴权头域,给"Authorization"参数赋值
+    private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\"";
+
+    public static void main(String[] args) throws Exception {
+
+        sendSms("[\"" + 12356 + "\"]", "18283820718", "8823121426646",
+                "cf1707ec44694627b1b483b0277e12fd");
+
+//        sendSms("[\"17623778642\",\"蓉A-7823\"]","17623778642","8819122535459","6c848255000c4619833ab690e393f906");
+//        sendSms("[\"17623778642\",\"蓉A-7823\",\"2019/12/27\",\"14:00\"]","17623778642","8819122535459","bb13d00d11e043659001a89c72d54cab");
+    }
+
+    /**
+     * 调用短信
+     *
+     * @param code       入参
+     * @param phone      接收短信手机号
+     * @param sender     国内短信签名通道号或国际/港澳台短信通道号
+     * @param templateId 模板ID
+     * @throws Exception
+     */
+    public static void sendSms(String code, String phone, String sender, String templateId)
+            throws Exception {
+        // TODO 必填,请参考"开发准备"获取如下数据,替换为实际值
+        String url = "https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1"; // APP接入地址+接口访问URI
+        String appKey = "tTMBH29Tm6tKKHf882JXob82P1rb"; // APP_Key
+        String appSecret = "Ob02q15WAgDZRwW9kDlVPklBSdfR"; // APP_Secret
+
+        // 条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
+        // 国际/港澳台短信不用关注该参数
+        String signature = null; // 签名名称
+
+        // 必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔
+        String receiver = "+86" + phone; // 短信接收人号码
+
+        // 选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
+        String statusCallBack = "";
+
+        /**
+         * 选填,使用无变量模板时请赋空值 String templateParas = "";
+         * 单变量模板示例:模板内容为"您的验证码是${NUM_6}"时,templateParas可填写为"[\"369751\"]"
+         * 双变量模板示例:模板内容为"您有${NUM_2}件快递请到${TXT_20}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]"
+         * ${DATE}${TIME}变量不允许取值为空,${TXT_20}变量可以使用英文空格或点号替代空值,${NUM_6}变量可以使用0替代空值
+         * 查看更多模板和变量规范:产品介绍>模板和变量规范
+         */
+        String templateParas = code; // 模板变量
+
+        // 请求Body,不携带签名名称时,signature请填null
+        String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack,
+                signature);
+        if (null == body || body.isEmpty()) {
+            System.out.println("body is null.");
+            return;
+        }
+
+        // 请求Headers中的X-WSSE参数值
+        String wsseHeader = buildWsseHeader(appKey, appSecret);
+        if (null == wsseHeader || wsseHeader.isEmpty()) {
+            System.out.println("wsse header is null.");
+            return;
+        }
+
+        // 如果JDK版本低于1.8,可使用如下代码
+        // 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
+        // CloseableHttpClient client = HttpClients.custom()
+        //        .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+        //            @Override
+        //            public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+        //                return true;
+        //            }
+        //        }).build()).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();
+
+        // 如果JDK版本是1.8,可使用如下代码
+        // 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
+        CloseableHttpClient client = HttpClients.custom()
+                .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null,
+                        (x509CertChain, authType) -> true).build())
+                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
+                .build();
+
+        HttpResponse response = client.execute(RequestBuilder.create("POST")// 请求方法POST
+                .setUri(url)
+                .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded")
+                .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE)
+                .addHeader("X-WSSE", wsseHeader)
+                .setEntity(new StringEntity(body)).build());
+
+        System.out.println(response.toString()); // 打印响应头域信息
+        System.out.println(EntityUtils.toString(response.getEntity())); // 打印响应消息实体
+    }
+
+    /**
+     * 构造请求Body体
+     *
+     * @param sender
+     * @param receiver
+     * @param templateId
+     * @param templateParas
+     * @param statusCallbackUrl
+     * @param signature         | 签名名称,使用国内短信通用模板时填写
+     * @return
+     */
+    static String buildRequestBody(String sender, String receiver, String templateId,
+            String templateParas,
+            String statusCallbackUrl, String signature) {
+        if (null == sender || null == receiver || null == templateId || sender.isEmpty()
+                || receiver.isEmpty()
+                || templateId.isEmpty()) {
+            System.out.println("buildRequestBody(): sender, receiver or templateId is null.");
+            return null;
+        }
+        List<NameValuePair> keyValues = new ArrayList<NameValuePair>();
+
+        keyValues.add(new BasicNameValuePair("from", sender));
+        keyValues.add(new BasicNameValuePair("to", receiver));
+        keyValues.add(new BasicNameValuePair("templateId", templateId));
+        if (null != templateParas && !templateParas.isEmpty()) {
+            keyValues.add(new BasicNameValuePair("templateParas", templateParas));
+        }
+        if (null != statusCallbackUrl && !statusCallbackUrl.isEmpty()) {
+            keyValues.add(new BasicNameValuePair("statusCallback", statusCallbackUrl));
+        }
+        if (null != signature && !signature.isEmpty()) {
+            keyValues.add(new BasicNameValuePair("signature", signature));
+        }
+
+        return URLEncodedUtils.format(keyValues, Charset.forName("UTF-8"));
+    }
+
+    /**
+     * 构造X-WSSE参数值
+     *
+     * @param appKey
+     * @param appSecret
+     * @return
+     */
+    static String buildWsseHeader(String appKey, String appSecret) {
+        if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) {
+            System.out.println("buildWsseHeader(): appKey or appSecret is null.");
+            return null;
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+        String time = sdf.format(new Date()); // Created
+        String nonce = UUID.randomUUID().toString().replace("-", ""); // Nonce
+
+        byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret);
+        String hexDigest = Hex.encodeHexString(passwordDigest);
+
+        // 如果JDK版本是1.8,请加载原生Base64类,并使用如下代码
+        String passwordDigestBase64Str = Base64.getEncoder()
+                .encodeToString(hexDigest.getBytes()); // PasswordDigest
+        // 如果JDK版本低于1.8,请加载三方库提供Base64类,并使用如下代码
+        // String passwordDigestBase64Str = Base64.encodeBase64String(hexDigest.getBytes(Charset.forName("utf-8"))); //PasswordDigest
+        // 若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正
+        // passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", "");
+
+        return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);
+    }
+}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/config/MybatisPlusConfig.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..3195c5a
--- /dev/null
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/config/MybatisPlusConfig.java
@@ -0,0 +1,58 @@
+package com.xinquan.common.core.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * Mybatis Plus 配置
+ *
+ * @author ruoyi
+ */
+@EnableTransactionManagement(proxyTargetClass = true)
+@Configuration
+public class MybatisPlusConfig {
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        // 分页插件
+        interceptor.addInnerInterceptor(paginationInnerInterceptor());
+        // 乐观锁插件
+        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
+        // 阻断插件
+        interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
+        return interceptor;
+    }
+
+    /**
+     * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
+     */
+    public PaginationInnerInterceptor paginationInnerInterceptor() {
+        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
+        // 设置数据库类型为mysql
+        paginationInnerInterceptor.setDbType(DbType.MYSQL);
+        // 设置最大单页限制数量,默认 500 条,-1 不受限制
+        paginationInnerInterceptor.setMaxLimit(-1L);
+        return paginationInnerInterceptor;
+    }
+
+    /**
+     * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
+     */
+    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
+        return new OptimisticLockerInnerInterceptor();
+    }
+
+    /**
+     * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
+     */
+    public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
+        return new BlockAttackInnerInterceptor();
+    }
+}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java
index 26266ab..b07c78d 100644
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java
@@ -56,5 +56,26 @@
      * 登录IP黑名单 cache key
      */
     public static final String SYS_LOGIN_BLACKIPLIST = SYS_CONFIG_KEY + "sys.login.blackIPList";
-    public static final String APP_CAPTCHA_CODE_PREFIX = "app_captcha_code:";
+
+    /**
+     * APP注册验证码 redis key
+     */
+    public static final String APP_REGISTER_CAPTCHA_CODE_PREFIX = "app_register_captcha_code:";
+    /**
+     * APP登录验证码 redis key
+     */
+    public static final String APP_LOGIN_CAPTCHA_CODE_PREFIX = "app_login_captcha_code:";
+    /**
+     * APP修改密码验证码 redis key
+     */
+    public static final String APP_PASSWORD_CAPTCHA_CODE_PREFIX = "app_password_captcha_code:";
+    /**
+     * APP第三方登录手机号校验验证码 redis key
+     */
+    public static final String APP_VERIFY_CAPTCHA_CODE_PREFIX = "app_verify_captcha_code:";
+    /**
+     * APP第三方登录手机号校验验证码修改密码秘钥 redis key
+     */
+    public static final String APP_PASSWORD_SECRET_PREFIX = "app_password_secret:";
+
 }
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java
index 9f00c38..72b3b35 100644
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java
@@ -133,4 +133,8 @@
      */
     public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
             "org.springframework", "org.apache", "com.xinquan.common.core.utils.file" };
+    /**
+     * 默认密码
+     */
+    public static final String DEFAULT_PASSWORD = "123456";
 }
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/SecurityConstants.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/SecurityConstants.java
index d775d0e..edc53fd 100644
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/SecurityConstants.java
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/SecurityConstants.java
@@ -18,6 +18,11 @@
     public static final String DETAILS_USERNAME = "username";
 
     /**
+     * 登录端
+     */
+    public static final String LOGIN_FROM = "login_from";
+    
+    /**
      * 授权信息字段
      */
     public static final String AUTHORIZATION_HEADER = "Authorization";
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/ServiceNameConstants.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/ServiceNameConstants.java
index ad644cd..44687f2 100644
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/ServiceNameConstants.java
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/ServiceNameConstants.java
@@ -24,15 +24,19 @@
     /**
      * 课程服务的serviceid
      */
-    public static final String COURSE = "xinquan-course";
+    public static final String COURSE_SERVICE = "xinquan-course";
 
     /**
-     * 车辆服务的serviceid
+     * 用户服务的serviceid
      */
-    public static final String APP_USER = "xinquan-user";
+    public static final String APP_USER_SERVICE = "xinquan-user";
 
     /**
-     * 车辆合同的serviceid
+     * 冥想服务的serviceid
      */
-    public static final String CONTRACT_SERVICE = "xinquan-contract";
+    public static final String MEDITATION_SERVICE = "xinquan-meditation";
+    /**
+     * 订单服务
+     */
+    public static final String ORDER_SERVICE = "xinquan-order";
 }
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AppUserStatusEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AppUserStatusEnum.java
new file mode 100644
index 0000000..ab4cf8e
--- /dev/null
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AppUserStatusEnum.java
@@ -0,0 +1,24 @@
+package com.xinquan.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum AppUserStatusEnum {
+    NORMAL(1, "正常"),
+    FROZEN(2, "冻结"),
+    LOGOUT(3, "注销");
+
+    private final Integer code;
+    private final String desc;
+
+    public static AppUserStatusEnum getEnumByCode(Integer code) {
+        for (AppUserStatusEnum e : AppUserStatusEnum.values()) {
+            if (e.code.equals(code)) {
+                return e;
+            }
+        }
+        return null;
+    }
+} 
\ No newline at end of file
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ApproveConfigEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ApproveConfigEnum.java
deleted file mode 100644
index 8efb987..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ApproveConfigEnum.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum ApproveConfigEnum {
-
-    /*审批类型 1=交车审批、2=续约审批、3=退车审批*/
-
-    DELIVERY_APPROVAL(1, "交车审批"),
-    RENEWAL_APPROVAL(2, "续约审批"),
-    RETURN_APPROVAL(3, "退车审批");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    ApproveConfigEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static ApproveConfigEnum fromCode(Integer code) {
-        ApproveConfigEnum[] resultTypes = ApproveConfigEnum.values();
-        for (ApproveConfigEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AuditStateEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AuditStateEnum.java
deleted file mode 100644
index 262dabb..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AuditStateEnum.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum AuditStateEnum {
-
-    /*审核状态 0待审批 1通过 2驳回 3已撤回*/
-
-    PENDING_APPROVAL(0, "待审批"),
-    APPROVED(1, "审批通过"),
-    APPROVAL_REJECTION(2, "审批驳回"),
-    WITHDRAWN(3, "已撤回");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    AuditStateEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static AuditStateEnum fromCode(Integer code) {
-        AuditStateEnum[] resultTypes = AuditStateEnum.values();
-        for (AuditStateEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AuditTypeEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AuditTypeEnum.java
deleted file mode 100644
index 56fdb71..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AuditTypeEnum.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum AuditTypeEnum {
-
-    /*审核类型 1交车申请 2续约申请 3退车申请  4事故账单申请*/
-
-    DELIVERY_APPLICATION(1, "交车申请"),
-    RENEWAL_APPLICATION(2, "续约申请"),
-    RETURN_APPLICATION(3, "退车申请"),
-    ACCIDENT_BILL_APPLICATION(4, "事故账单申请");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    AuditTypeEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static AuditTypeEnum fromCode(Integer code) {
-        AuditTypeEnum[] resultTypes = AuditTypeEnum.values();
-        for (AuditTypeEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/CarColorEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/CarColorEnum.java
deleted file mode 100644
index 8d5ccc4..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/CarColorEnum.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum CarColorEnum {
-
-    /*1=白色、2=黑色、3=银色、4=灰色、5=红色、6=蓝色、7=绿色、8=黄色、9=金色、10=紫色、11=橙色、12=其他*/
-
-    WHITE(1, "白色"),
-    BLACK(2, "黑色"),
-    SILVERY(3, "银色"),
-    GREY(4, "灰色"),
-    RED(5, "红色"),
-    BLUE(6, "蓝色"),
-    GREEN(7, "绿色"),
-    YELLOW(8, "黄色"),
-    GOLDEN(9, "金色"),
-    PURPLE(10, "紫色"),
-    ORANGE(11, "橙色"),
-    OTHER(12, "其他");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    CarColorEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static CarColorEnum fromCode(Integer code) {
-        CarColorEnum[] resultTypes = CarColorEnum.values();
-        for (CarColorEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/CarStateEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/CarStateEnum.java
deleted file mode 100644
index 7d752fc..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/CarStateEnum.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum CarStateEnum {
-
-    /*状态1= 待上户、2=待办证、3=待整备、4=待租、5=已租、6=已处置*/
-
-    PENDING_REGISTRATION(1, "待上户"),
-    PENDING_CERTIFICATE(2, "待办证"),
-    TO_BE_PREPARED(3, "待整备"),
-    FOR_RENT(4, "待租"),
-    RENTED(5, "已租"),
-    DISPOSED(6, "已处置");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    CarStateEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static CarStateEnum fromCode(Integer code) {
-        CarStateEnum[] resultTypes = CarStateEnum.values();
-        for (CarStateEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ConfigEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ConfigEnum.java
new file mode 100644
index 0000000..3ef84da
--- /dev/null
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ConfigEnum.java
@@ -0,0 +1,63 @@
+package com.xinquan.common.core.enums;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.HashMap;
+import java.util.Map;
+import lombok.Getter;
+
+/**
+ * @ClassName ConfigEnum
+ * @Description TODO
+ * @Author jqs
+ * @Date 2023/6/6 10:35
+ * @Version 1.0
+ */
+
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+@Getter
+public enum ConfigEnum {
+
+    PLATFORM_SERVICE_PHONE("PLATFORM_SERVICE_PHONE", 1, "客服电话"),
+    PLATFORM_SERVICE_CODE("PLATFORM_SERVICE_CODE", 1, "客服二维码"),
+    SHOP_EMERGENCY_DEGREE("SHOP_EMERGENCY_DEGREE", 3, "合作商任务紧急程度"),
+    SHOP_FOLLOW_TYPE("SHOP_FOLLOW_TYPE", 3, "合作商跟进类型"),
+    SHOP_CUSTOM_STATUS("SHOP_CUSTOM_STATUS", 3, "合作商状态"),
+    SHOP_SOURCE_CHANNEL("SHOP_SOURCE_CHANNEL", 3, "来源渠道"),
+    SHARE_INTEGRAL("SHARE_INTEGRAL", 2, "分享小程序可获得积分"),
+    SUGGEST_PLATFORM_INTEGRAL("SUGGEST_PLATFORM_INTEGRAL", 2, "平台建议可获得积分"),
+    SIGN_IN_INTEGRAL("SIGN_IN_INTEGRAL", 2, "每日签到可获得积分"),
+    SUGGEST_SHOP_INTEGRAL("SUGGEST_SHOP_INTEGRAL", 2, "门店建议可获得积分"),
+    ORDER_AUTO_CANCEL_TIME("ORDER_AUTO_CANCEL_TIME", 2, "C端订单自动取消时间"),
+    PAY_MONEY_INTEGRAL("PAY_MONEY_INTEGRAL", 2, "购物满1元可获得积分"),
+    MEMBER_SOURCE_CHANNEL("MEMBER_SOURCE_CHANNEL", 4, "会员来源"),
+    MEMBER_CHARACTER("MEMBER_CHARACTER", 4, "会员性格"),
+    MEMBER_LEVEL("MEMBER_LEVEL", 4, "会员等级"),
+    MEMBER_TYPE("MEMBER_TYPE", 4, "会员类型"),
+    NURSE_PROBLEM("NURSE_PROBLEM", 4, "调理问题"),
+    HOME_STYLE("HOME_STYLE", 2, "首页风格"),
+    HOME_SLOGAN("HOME_SLOGAN", 1, "首页广告语"),
+    HOME_LOGO("HOME_LOGO", 1, "首页logo"),
+    SHOP_COMMON_PROPORTION("SHOP_COMMON_PROPORTION", 3, "商户统一分成");
+
+
+    private final String key;
+    private final Integer keyType;
+    private final String keyName;
+    private static final Map<String, ConfigEnum> valueMap = new HashMap<>();
+
+    static {
+        for (ConfigEnum configEnum : ConfigEnum.values()) {
+            valueMap.put(configEnum.keyName, configEnum);
+        }
+    }
+
+    ConfigEnum(String key, Integer keyType, String keyName) {
+        this.key = key;
+        this.keyType = keyType;
+        this.keyName = keyName;
+    }
+
+    public static ConfigEnum getByKeyName(String keyName) {
+        return valueMap.get(keyName);
+    }
+}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ContractStateEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ContractStateEnum.java
deleted file mode 100644
index e1a13aa..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ContractStateEnum.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum ContractStateEnum {
-
-    /*合同状态 1签约中 2审批拒绝 3续约中 4待执行 5执行中 6结算中 7已结束 8已作废 9即将到期 10已到期 11已撤销*/
-
-    SIGNING(1, "签约中"),
-    APPROVAL_REJECTION(2, "审批拒绝"),
-    UNDER_RENEWAL(3, "续约中"),
-    TO_BE_EXECUTED(4, "待执行"),
-    UNDER_EXECUTION(5, "执行中"),
-    SETTLEMENT_PROGRESS(6, "结算中"),
-    ENDED(7, "已结束"),
-    VOIDED(8, "已作废"),
-    DUE(9, "即将到期"),
-    EXPIRED(10, "已到期"),
-    REVOKED(11, "已撤销");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    ContractStateEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static ContractStateEnum fromCode(Integer code) {
-        ContractStateEnum[] resultTypes = ContractStateEnum.values();
-        for (ContractStateEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ContractTypeEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ContractTypeEnum.java
deleted file mode 100644
index 4ec2f2f..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ContractTypeEnum.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum ContractTypeEnum {
-
-    /*合同类型 1=纯租 2=以租代购 3=打工模式*/
-    PURE_RENT(1, "纯租"),
-    CAR_LEASE(2, "以租代购"),
-    WORKING_MODE(3, "打工模式");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    ContractTypeEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static ContractTypeEnum fromCode(Integer code) {
-        ContractTypeEnum[] resultTypes = ContractTypeEnum.values();
-        for (ContractTypeEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/DisabledEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/DisabledEnum.java
index 06cc9ca..fbc94a1 100644
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/DisabledEnum.java
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/DisabledEnum.java
@@ -8,15 +8,15 @@
  * @Description
  * @date 2022-06-08 16:55
  */
+@Getter
 public enum DisabledEnum {
-    NO(0, "否"),
-    YES(1, "是");
 
-    @Getter
+    YES(1, "是"),
+    NO(2, "否");
+
     private String desc;
 
 
-    @Getter
     private int code;
 
 
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/HandoverStateEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/HandoverStateEnum.java
deleted file mode 100644
index 23bfe20..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/HandoverStateEnum.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum HandoverStateEnum {
-
-    /*交车状态 1待交车 2待审批 3已交车 4审批拒绝*/
-
-    VEHICLE_DELIVERED(1, "待交车"),
-    PENDING_APPROVAL(2, "待审批"),
-    DELIVERED(3, "已交车"),
-    APPROVAL_REJECTION(4, "审批拒绝"),
-    REVOKED(5, "已撤销");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    HandoverStateEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static HandoverStateEnum fromCode(Integer code) {
-        HandoverStateEnum[] resultTypes = HandoverStateEnum.values();
-        for (HandoverStateEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ImportTypeEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ImportTypeEnum.java
deleted file mode 100644
index 2a4456f..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ImportTypeEnum.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum ImportTypeEnum {
-
-    /*1=新车车辆导入 、2=已有车辆导入、3=上户导入、4=设备导入、5=违章导入、6=违章图片导入、7=保养记录导入、8=保单导入、9=合同导入*/
-
-    NEW_CAR(1, "新车车辆导入"),
-    EXIST_CAR(2, "已有车辆导入"),
-    WEALTHY(3, "上户导入"),
-    DEVICE(4, "设备导入"),
-    VIOLATION(5, "违章导入"),
-    VIOLATION_PICTURE(6, "违章图片导入"),
-    SERVICE(7, "保养记录导入"),
-    WARRANTY(8, "保单导入"),
-    CONTRACT(9, "合同导入"),
-    CERTIFICATE(10, "办证导入"),
-    INSPECTANNUALLY(11, "车辆年检导入"),
-    MAINTENANCE(12, "车辆维修导入");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    ImportTypeEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static ImportTypeEnum fromCode(Integer code) {
-        ImportTypeEnum[] resultTypes = ImportTypeEnum.values();
-        for (ImportTypeEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/InsureTypeEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/InsureTypeEnum.java
deleted file mode 100644
index fcacfda..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/InsureTypeEnum.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum InsureTypeEnum {
-
-    /*保险类型 1=商业险、2=交强险、3=承运人责任险、4=客伤险、5=盗抢险*/
-
-    COMMERCIAL_INSURANCE(1, "商业险"),
-    COMPULSORY_INSURANCE(2, "交强险"),
-    CARRIER_LIABILITY_INSURANCE(3, "承运人责任险"),
-    CUSTOMER_INJURY_INSURANCE(4, "客伤险"),
-    THEFT_INSURANCE(5, "盗抢险");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    InsureTypeEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static InsureTypeEnum fromCode(Integer code) {
-        InsureTypeEnum[] resultTypes = InsureTypeEnum.values();
-        for (InsureTypeEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ListingStatusEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ListingStatusEnum.java
new file mode 100644
index 0000000..17881ca
--- /dev/null
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ListingStatusEnum.java
@@ -0,0 +1,39 @@
+package com.xinquan.common.core.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+
+@Getter
+@AllArgsConstructor
+public enum ListingStatusEnum {
+
+    /*上架状态 0=上架中 1=已下架*/
+
+    ON_SHELVES(0, "上架中"),
+    REMOVED_FROM_THE_SHELF(1, "已下架");
+    @EnumValue
+    private final int code;
+    @JsonValue
+    private final String desc;
+
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static ListingStatusEnum fromCode(Integer code) {
+        ListingStatusEnum[] resultTypes = ListingStatusEnum.values();
+        for (ListingStatusEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PurchaseStateEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PurchaseStateEnum.java
deleted file mode 100644
index c3a58af..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PurchaseStateEnum.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum PurchaseStateEnum {
-
-    /*购买状态 1在保 2停保 3复保 4脱保*/
-
-    UNDER_PROTECTION(1, "在保"),
-    SUSPENSION_MAINTENANCE(2, "停保"),
-    REINSURANCE(3, "复保"),
-    DELISTING(4, "脱保");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    PurchaseStateEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static PurchaseStateEnum fromCode(Integer code) {
-        PurchaseStateEnum[] resultTypes = PurchaseStateEnum.values();
-        for (PurchaseStateEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReturnCarTypeEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReturnCarTypeEnum.java
deleted file mode 100644
index 4c1de25..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReturnCarTypeEnum.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum ReturnCarTypeEnum {
-
-    /*合同类型 合同到期、提前退车、强制收车*/
-    EXPIRE(1, "合同到期"),
-    EARLY_WITHDRAWAL(2, "提前退车"),
-    COMPULSORY_COLLECTION(3, "强制收车");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    ReturnCarTypeEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static ReturnCarTypeEnum fromCode(Integer code) {
-        ReturnCarTypeEnum[] resultTypes = ReturnCarTypeEnum.values();
-        for (ReturnCarTypeEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReturnStateEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReturnStateEnum.java
deleted file mode 100644
index c94f36a..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReturnStateEnum.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum ReturnStateEnum {
-
-    /*退车状态 1=待验车 2=待生成账单 3=待审批 4=已退车 5=审批拒绝*/
-
-    VEHICLE_INSPECTED(1, "待验车"),
-    PENDING_BILL_GENERATION(2, "待生成账单"),
-    PENDING_APPROVAL(3, "待审批"),
-    RETURNED_VEHICLE(4, "已退车"),
-    APPROVAL_REJECTION(5, "审批拒绝"),
-    REVOKED(6, "已撤销");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    ReturnStateEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static ReturnStateEnum fromCode(Integer code) {
-        ReturnStateEnum[] resultTypes = ReturnStateEnum.values();
-        for (ReturnStateEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/TreeLevelEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/TreeLevelEnum.java
new file mode 100644
index 0000000..293d763
--- /dev/null
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/TreeLevelEnum.java
@@ -0,0 +1,32 @@
+package com.xinquan.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum TreeLevelEnum {
+    SEED(1, "种子", 0),
+    SPROUTING(2, "发芽", 1000),
+    SEEDLING(3, "幼苗", 2000),
+    SMALL_SAPLINGS(4, "小树苗", 3000),
+    MEDIUM_SIZED_SAPLINGS(5, "中等树苗", 4000),
+    SMALL_TREE(5, "小树", 6000),
+    MEDIUM_TREE(6, "中树", 8000),
+    BIG_TREE(7, "大树", 10000),
+    MATURE_TREE(8, "成熟的大树", 12000),
+    TOWERING_TREES(8, "参天大树", 14400);
+
+    private final Integer code;
+    private final String desc;
+    private final Integer growthValue;
+
+    public static TreeLevelEnum getEnumByCode(Integer code) {
+        for (TreeLevelEnum e : TreeLevelEnum.values()) {
+            if (e.code.equals(code)) {
+                return e;
+            }
+        }
+        return null;
+    }
+} 
\ No newline at end of file
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/WarrantyStateEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/WarrantyStateEnum.java
deleted file mode 100644
index 7238ef6..0000000
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/WarrantyStateEnum.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.xinquan.common.core.enums;
-
-import lombok.Getter;
-
-/**
- * @Description
- * @Author xiaochen
- * @Date 2023/6/8 16:42
- */
-public enum WarrantyStateEnum {
-
-    /*保单状态 1正常 2已脱保 3已停保 4即将到期 5建议停保*/
-
-    NORMAL(1, "正常"),
-    DELISTED(2, "已脱保"),
-    DISCONTINUED_WARRANTY(3, "已停保"),
-    DUE(4, "即将到期"),
-    SUGGEST_DISCONTINUING_MAINTENANCE(5, "建议停保");
-
-    @Getter
-    private String desc;
-
-
-    @Getter
-    private int code;
-
-
-    WarrantyStateEnum(int code, String desc) {
-        this.code = code;
-        this.desc = desc;
-    }
-
-    /**
-     * 通过code获取枚举
-     *
-     * @param code
-     * @return
-     */
-    public static WarrantyStateEnum fromCode(Integer code) {
-        WarrantyStateEnum[] resultTypes = WarrantyStateEnum.values();
-        for (WarrantyStateEnum resultType : resultTypes) {
-            if (code.equals(resultType.getCode())) {
-                return resultType;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseModel.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseModel.java
index 694c891..8f788a3 100644
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseModel.java
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseModel.java
@@ -3,7 +3,6 @@
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.time.LocalDateTime;
@@ -19,24 +18,24 @@
 
     /** 创建者 */
     @ApiModelProperty(value = "记录创建人,前端忽略")
-    @TableField(value = "createBy", fill = FieldFill.INSERT)
+    @TableField(value = "create_by", fill = FieldFill.INSERT)
     private String createBy;
 
     /** 创建时间 */
     @ApiModelProperty(value = "记录创建时间,前端忽略")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(value = "createTime", fill = FieldFill.INSERT)
+    // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     /** 更新者 */
     @ApiModelProperty(value = "记录修改人,前端忽略")
-    @TableField(value = "updateBy", fill = FieldFill.INSERT_UPDATE)
+    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
     private String updateBy;
 
     /** 更新时间 */
     @ApiModelProperty(value = "记录修改时间,前端忽略")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(value = "updateTime", fill = FieldFill.INSERT_UPDATE)
+    // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
 
     /** 是否删除 0未删除 1已删除 */
diff --git a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/annotation/EnableCustomConfig.java b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/annotation/EnableCustomConfig.java
index cd7e3de..b2b01e0 100644
--- a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/annotation/EnableCustomConfig.java
+++ b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/annotation/EnableCustomConfig.java
@@ -1,5 +1,7 @@
 package com.xinquan.common.security.annotation;
 
+import com.xinquan.common.security.config.ApplicationConfig;
+import com.xinquan.common.security.feign.FeignAutoConfiguration;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
@@ -10,8 +12,6 @@
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.context.annotation.Import;
 import org.springframework.scheduling.annotation.EnableAsync;
-import com.xinquan.common.security.config.ApplicationConfig;
-import com.xinquan.common.security.feign.FeignAutoConfiguration;
 
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.RUNTIME)
diff --git a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/config/JacksonConfig.java b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/config/JacksonConfig.java
index aeb8196..369fb8b 100644
--- a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/config/JacksonConfig.java
+++ b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/config/JacksonConfig.java
@@ -1,33 +1,37 @@
 package com.xinquan.common.security.config;
- 
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.databind.MapperFeature;
+
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import java.math.BigInteger;
+import java.time.format.DateTimeFormatter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
 import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
-import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
- 
+
 /**
  * Jackson配置
  */
-@Configuration
+@ConditionalOnClass(ObjectMapper.class)
 public class JacksonConfig {
- 
-    @SuppressWarnings("deprecation")
+
+    private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+    private static final String DATE_PATTERN = "yyyy-MM-dd";
+
     @Bean
-    public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
-        final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
-        builder.serializationInclusion(JsonInclude.Include.NON_NULL);
-        final ObjectMapper objectMapper = builder.build();
-        SimpleModule simpleModule = new SimpleModule();
-        // Long 转为 String 防止 js 丢失精度
-        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
-        objectMapper.registerModule(simpleModule);
-        // 忽略 transient 关键词属性
-        objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
-        return new MappingJackson2HttpMessageConverter(objectMapper);
+    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
+        return jacksonObjectMapperBuilder -> {
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(
+                    DATE_TIME_PATTERN);
+            jacksonObjectMapperBuilder.timeZone("GMT+8");
+            jacksonObjectMapperBuilder.serializers(new LocalDateTimeSerializer(dateTimeFormatter));
+            jacksonObjectMapperBuilder.deserializers(
+                    new LocalDateTimeDeserializer(dateTimeFormatter));
+            // long -> string
+            jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
+            jacksonObjectMapperBuilder.serializerByType(BigInteger.class,
+                    ToStringSerializer.instance);
+        };
     }
 }
\ No newline at end of file
diff --git a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/config/LocalDateTimeSerializerConfig.java b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/config/LocalDateTimeSerializerConfig.java
deleted file mode 100644
index 9ab600d..0000000
--- a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/config/LocalDateTimeSerializerConfig.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.xinquan.common.security.config;
-
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
-import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.convert.converter.Converter;
-
-@Configuration
-public class LocalDateTimeSerializerConfig {
-    private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
-    private static final String DATE_PATTERN = "yyyy-MM-dd";
-
-    /**
-     * string转localdate
-     */
-    @Bean
-    public Converter<String, LocalDate> localDateConverter() {
-        return new Converter<String, LocalDate>() {
-            @Override
-            public LocalDate convert(String source) {
-                if (source.trim().length() == 0) {
-                    return null;
-                }
-                try {
-                    return LocalDate.parse(source);
-                } catch (Exception e) {
-                    return LocalDate.parse(source, DateTimeFormatter.ofPattern(DATE_PATTERN));
-                }
-            }
-        };
-    }
-
-    /**
-     * string转localdatetime
-     */
-    @Bean
-    public Converter<String, LocalDateTime> localDateTimeConverter() {
-        return new Converter<String, LocalDateTime>() {
-            @Override
-            public LocalDateTime convert(String source) {
-                if (source.trim().length() == 0) {
-                    return null;
-                }
-                // 先尝试ISO格式: 2019-07-15T16:00:00
-                try {
-                    return LocalDateTime.parse(source);
-                } catch (Exception e) {
-                    return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DATE_TIME_PATTERN));
-                }
-            }
-        };
-    }
-
-    /**
-     * 统一配置
-     */
-    @Bean
-    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
-        JavaTimeModule module = new JavaTimeModule();
-        LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-        module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);
-        return builder -> {
-            builder.simpleDateFormat(DATE_TIME_PATTERN);
-            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_PATTERN)));
-            builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)));
-            builder.modules(module);
-        };
-    }
-}
diff --git a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/handler/MyMetaObjectHandler.java b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/handler/MyMetaObjectHandler.java
new file mode 100644
index 0000000..73263ff
--- /dev/null
+++ b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/handler/MyMetaObjectHandler.java
@@ -0,0 +1,44 @@
+package com.xinquan.common.security.handler;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.xinquan.common.security.utils.SecurityUtils;
+import java.time.LocalDateTime;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
+
+/**
+ * 自动填充处理类
+ *
+ * @author mitao
+ * @date 2024-05-16
+ */
+@Slf4j
+public class MyMetaObjectHandler implements MetaObjectHandler {
+
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        // 获取当前登录用户
+        Long userId = SecurityUtils.getUserId();
+        fillValue("createBy", userId.toString(), metaObject);
+        fillValue("createTime", LocalDateTime.now(), metaObject);
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        // 获取当前登录用户
+        Long userId = SecurityUtils.getUserId();
+        fillValue("updateBy", userId.toString(), metaObject);
+        fillValue("updateTime", LocalDateTime.now(), metaObject);
+    }
+
+    private void fillValue(String fieldName, Object data, MetaObject metaObject) {
+        if (metaObject.hasSetter(fieldName)) {
+            // 值为空时设置默认值
+            Object sidObj = getFieldValByName(fieldName, metaObject);
+            if (sidObj == null || "updateBy".equals(fieldName) || "updateTime".equals(fieldName)) {
+                setFieldValByName(fieldName, data, metaObject);
+            }
+        }
+    }
+}
+
diff --git a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java
index c305f70..b36ae3e 100644
--- a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java
+++ b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java
@@ -1,11 +1,5 @@
 package com.xinquan.common.security.service;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.http.HttpServletRequest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 import com.xinquan.common.core.constant.CacheConstants;
 import com.xinquan.common.core.constant.SecurityConstants;
 import com.xinquan.common.core.utils.JwtUtils;
@@ -16,6 +10,13 @@
 import com.xinquan.common.redis.service.RedisService;
 import com.xinquan.common.security.utils.SecurityUtils;
 import com.xinquan.system.api.model.LoginUser;
+import com.xinquan.system.api.model.WXLoginUser;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 /**
  * token验证处理
@@ -166,4 +167,36 @@
     {
         return ACCESS_TOKEN + token;
     }
+
+    public Map<String, Object> createToken4WXLoginUser(WXLoginUser wxLoginUser) {
+        LoginUser loginUser = new LoginUser();
+        // Jwt存储信息
+        Map<String, Object> claimsMap = new HashMap<String, Object>();
+        // 接口返回信息
+        Map<String, Object> rspMap = new HashMap<String, Object>();
+        // 用户为空只返回openid
+        rspMap.put("cellPhone", "");
+        rspMap.put("access_token", "");
+        if (wxLoginUser.getSysUser() != null) {
+            loginUser.setSysUser(wxLoginUser.getSysUser());
+            String token = IdUtils.fastUUID();
+            Long userId = loginUser.getSysUser().getUserId();
+            String userName = loginUser.getSysUser().getUserName();
+            loginUser.setToken(token);
+            loginUser.setUserid(userId);
+            loginUser.setIpaddr(IpUtils.getIpAddr());
+            refreshToken(loginUser);
+            claimsMap.put(SecurityConstants.USER_KEY, token);
+            claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
+            claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
+            if (StringUtils.isNotBlank(wxLoginUser.getCellPhone())) {
+                rspMap.put("cellPhone", wxLoginUser.getCellPhone());
+            } else {
+                rspMap.put("cellPhone", "");
+            }
+            rspMap.put("access_token", JwtUtils.createToken(claimsMap));
+            rspMap.put("expires_in", expireTime);
+        }
+        return rspMap;
+    }
 }
\ No newline at end of file
diff --git a/xinquan-common/xinquan-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xinquan-common/xinquan-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 93e01eb..1433457 100644
--- a/xinquan-common/xinquan-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/xinquan-common/xinquan-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -3,5 +3,5 @@
 com.xinquan.common.security.aspect.PreAuthorizeAspect
 com.xinquan.common.security.aspect.InnerAuthAspect
 com.xinquan.common.security.handler.GlobalExceptionHandler
+com.xinquan.common.security.handler.MyMetaObjectHandler
 com.xinquan.common.security.config.JacksonConfig
-com.xinquan.common.security.config.LocalDateTimeSerializerConfig
diff --git a/xinquan-gateway/src/main/java/com/xinquan/gateway/config/SwaggerProvider.java b/xinquan-gateway/src/main/java/com/xinquan/gateway/config/SwaggerProvider.java
index cfb868e..9db6bec 100644
--- a/xinquan-gateway/src/main/java/com/xinquan/gateway/config/SwaggerProvider.java
+++ b/xinquan-gateway/src/main/java/com/xinquan/gateway/config/SwaggerProvider.java
@@ -56,6 +56,10 @@
                 .forEach(routeDefinition -> routeDefinition.getPredicates().stream()
                         .filter(predicateDefinition -> "Path".equalsIgnoreCase(predicateDefinition.getName()))
                         // .filter(predicateDefinition -> !"xinquan-auth".equalsIgnoreCase(routeDefinition.getId()))
+                        .filter(predicateDefinition -> !"xinquan-gen".equalsIgnoreCase(
+                                routeDefinition.getId()))
+                        .filter(predicateDefinition -> !"xinquan-job".equalsIgnoreCase(
+                                routeDefinition.getId()))
                         .forEach(predicateDefinition -> resourceList
                                 .add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs()
                                         .get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", SWAGGER2URL)))));
diff --git a/xinquan-modules/pom.xml b/xinquan-modules/pom.xml
index 9eda2bc..80e7ed1 100644
--- a/xinquan-modules/pom.xml
+++ b/xinquan-modules/pom.xml
@@ -13,6 +13,11 @@
         <module>xinquan-gen</module>
         <module>xinquan-job</module>
         <module>xinquan-file</module>
+        <module>xinquan-user</module>
+        <module>xinquan-meditation</module>
+        <module>xinquan-course</module>
+        <module>xinquan-order</module>
+
     </modules>
 
     <artifactId>xinquan-modules</artifactId>
diff --git a/xinquan-modules/xinquan-course/pom.xml b/xinquan-modules/xinquan-course/pom.xml
index 0fa87ff..a7ab784 100644
--- a/xinquan-modules/xinquan-course/pom.xml
+++ b/xinquan-modules/xinquan-course/pom.xml
@@ -5,12 +5,11 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>com.xinquan</groupId>
-    <artifactId>xinquan</artifactId>
+    <artifactId>xinquan-modules</artifactId>
     <version>3.6.2</version>
-    <relativePath>../../pom.xml</relativePath>
   </parent>
 
-  <artifactId>xinquan-course</artifactId>
+  <artifactId>xinquan-modules-course</artifactId>
 
   <properties>
     <maven.compiler.source>8</maven.compiler.source>
@@ -19,13 +18,6 @@
   </properties>
 
   <dependencies>
-
-    <!--system feign模块-->
-    <dependency>
-      <groupId>com.xinquan</groupId>
-      <artifactId>xinquan-api-system</artifactId>
-      <scope>compile</scope>
-    </dependency>
 
     <!--user feign模块-->
     <dependency>
diff --git a/xinquan-modules/xinquan-file/pom.xml b/xinquan-modules/xinquan-file/pom.xml
index 3e729ec..e27178c 100644
--- a/xinquan-modules/xinquan-file/pom.xml
+++ b/xinquan-modules/xinquan-file/pom.xml
@@ -65,7 +65,18 @@
             <groupId>com.xinquan</groupId>
             <artifactId>xinquan-common-swagger</artifactId>
         </dependency>
-        
+        <!--华为云OBS-->
+        <dependency>
+            <groupId>com.huaweicloud</groupId>
+            <artifactId>esdk-obs-java</artifactId>
+            <version>3.19.5</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>okio</artifactId>
+                    <groupId>com.squareup.okio</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/xinquan-modules/xinquan-file/src/main/java/com/xinquan/file/controller/SysFileController.java b/xinquan-modules/xinquan-file/src/main/java/com/xinquan/file/controller/SysFileController.java
index 07ad8e6..d411d65 100644
--- a/xinquan-modules/xinquan-file/src/main/java/com/xinquan/file/controller/SysFileController.java
+++ b/xinquan-modules/xinquan-file/src/main/java/com/xinquan/file/controller/SysFileController.java
@@ -1,15 +1,17 @@
 package com.xinquan.file.controller;
 
+import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.utils.file.FileUtils;
+import com.xinquan.file.service.ISysFileService;
+import com.xinquan.file.utils.ObsUploadUtil;
+import com.xinquan.system.api.domain.SysFile;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
-import com.xinquan.common.core.domain.R;
-import com.xinquan.common.core.utils.file.FileUtils;
-import com.xinquan.file.service.ISysFileService;
-import com.xinquan.system.api.domain.SysFile;
 
 /**
  * 文件请求处理
@@ -45,4 +47,22 @@
             return R.fail(e.getMessage());
         }
     }
+
+    /**
+     * 文件上传请求
+     */
+    @PostMapping("obs-upload")
+    public R<String> uploadOSS(@RequestPart("file") MultipartFile file) {
+        try {
+            // 上传并返回访问地址
+            String fileName = file.getOriginalFilename();
+            String prefix = fileName.substring(fileName.lastIndexOf("."));
+            long fileSize = file.getSize();
+            String url = ObsUploadUtil.obsUpload(file);
+            return R.ok(url);
+        } catch (Exception e) {
+            log.error("上传文件失败", e);
+            return R.fail(e.getMessage());
+        }
+    }
 }
\ No newline at end of file
diff --git a/xinquan-modules/xinquan-file/src/main/java/com/xinquan/file/utils/ObsUploadUtil.java b/xinquan-modules/xinquan-file/src/main/java/com/xinquan/file/utils/ObsUploadUtil.java
new file mode 100644
index 0000000..73e9f8e
--- /dev/null
+++ b/xinquan-modules/xinquan-file/src/main/java/com/xinquan/file/utils/ObsUploadUtil.java
@@ -0,0 +1,77 @@
+package com.xinquan.file.utils;
+
+import com.obs.services.ObsClient;
+import com.obs.services.model.ObjectMetadata;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+import org.springframework.web.multipart.MultipartFile;
+
+public class ObsUploadUtil {
+
+    // OBS图片访问域名 TODO 修改正式参数
+    public static String endPoint = "obs.cn-southwest-2.myhuaweicloud.com";
+    public static String accessKeyId = "IZB26ZHC7C5MWIOH1TGE";
+    public static String accessKeySecret = "y5PXhFMDOHiPH0nnQMz4gkvA63oqKAC621zXzOPk";
+    public static String bucketName = "mimishejiao";
+    public static String oss_domain = "https://mimishejiao.obs.cn-southwest-2.myhuaweicloud.com/";
+
+    // 创建ObsClient实例
+    public static ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endPoint);
+
+    public static String obsUpload(MultipartFile file)
+            throws IOException {
+        String fileName = "";
+        if (file != null && !"".equals(file.getOriginalFilename())
+                && file.getOriginalFilename() != null) {
+            InputStream content = file.getInputStream();// 获得指定文件的输入流
+            ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
+            meta.setContentLength(file.getSize());  // 必须设置ContentLength
+            String originalFilename = file.getOriginalFilename();
+            fileName =
+                    UUID.randomUUID().toString().replaceAll("-", "") + originalFilename.subSequence(
+                            originalFilename.lastIndexOf("."), originalFilename.length());
+            obsClient.putObject(bucketName, "xinquan/" + fileName, content, meta);// 上传Object.
+            if (fileName != null && !"".equals(fileName)) {
+                System.out.println(fileName);
+                fileName = oss_domain + "admin/" + fileName;
+            }
+        }
+        return fileName;
+    }
+
+    /**
+     * 删除某个Object
+     *
+     * @param bucketUrl
+     * @return
+     */
+    public static boolean deleteObject(String bucketUrl) {
+        try {
+            bucketUrl = bucketUrl.replace(oss_domain + "admin/", "");
+            // 删除Object.
+            obsClient.deleteObject(bucketName, bucketUrl);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        } finally {
+            // ossClient.shutdown();
+        }
+        return true;
+    }
+
+//	 public static void createBucket(String bucketName)
+//     {
+//         //初始化 OSSClient
+////          ossClient = new OssClient(endPoint, accessKeyId, accessKeySecret);
+//
+//         // 新建一个Bucket
+//         Bucket bucket = ossClient.createBucket(bucketName);
+//         System.out.println(bucket.getName());
+//         System.out.println(bucket.getCreationDate());
+//     }
+//
+//	 public static void main(String[] args) {
+//		 OssUploadUtil.createBucket("ssfdfsd");
+//	}
+}
diff --git a/xinquan-modules/xinquan-gen/pom.xml b/xinquan-modules/xinquan-gen/pom.xml
index 4ab26fc..7e5356e 100644
--- a/xinquan-modules/xinquan-gen/pom.xml
+++ b/xinquan-modules/xinquan-gen/pom.xml
@@ -88,25 +88,6 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
-        <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
-        <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity-engine-core</artifactId>
-            <version>2.3</version>
-        </dependency>
-
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.13.2</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-generator</artifactId>
-            <version>3.4.0</version>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 
     <build>
diff --git a/xinquan-modules/xinquan-meditation/pom.xml b/xinquan-modules/xinquan-meditation/pom.xml
index 4653ed5..8839b86 100644
--- a/xinquan-modules/xinquan-meditation/pom.xml
+++ b/xinquan-modules/xinquan-meditation/pom.xml
@@ -5,12 +5,11 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>com.xinquan</groupId>
-    <artifactId>xinquan</artifactId>
+    <artifactId>xinquan-modules</artifactId>
     <version>3.6.2</version>
-    <relativePath>../../pom.xml</relativePath>
   </parent>
 
-  <artifactId>xinquan-meditation</artifactId>
+  <artifactId>xinquan-modules-meditation</artifactId>
 
   <properties>
     <maven.compiler.source>8</maven.compiler.source>
@@ -19,13 +18,6 @@
   </properties>
 
   <dependencies>
-
-    <!--system feign模块-->
-    <dependency>
-      <groupId>com.xinquan</groupId>
-      <artifactId>xinquan-api-system</artifactId>
-      <scope>compile</scope>
-    </dependency>
 
     <!--user feign模块-->
     <dependency>
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeBackgroundMusicController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicController.java
similarity index 87%
rename from xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeBackgroundMusicController.java
rename to xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicController.java
index 683adad..e4f7092 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeBackgroundMusicController.java
+++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicController.java
@@ -1,8 +1,7 @@
-package com.xinquan.system.controller;
+package com.xinquan.meditation.controller.client;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicUserController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicUserController.java
new file mode 100644
index 0000000..f964608
--- /dev/null
+++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicUserController.java
@@ -0,0 +1,20 @@
+package com.xinquan.meditation.controller.client;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 首页背景音乐用户关系表		 前端控制器
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@RestController
+@RequestMapping("/meditation/home-background-music-user")
+public class HomeBackgroundMusicUserController {
+
+}
+
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/HomeBackgroundMusic.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusic.java
similarity index 92%
rename from xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/HomeBackgroundMusic.java
rename to xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusic.java
index 13ca592..58e1fa9 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/HomeBackgroundMusic.java
+++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusic.java
@@ -1,10 +1,10 @@
-package com.xinquan.system.domain;
+package com.xinquan.meditation.domain;
 
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.xinquan.common.core.web.domain.BaseModel;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xinquan.common.core.web.domain.BaseModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -27,7 +27,7 @@
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty(value = "首页背景音乐id")
-    @TableId(value = "id", type = IdType.AUTO)
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
     private Long id;
 
     @ApiModelProperty(value = "背景图片")
diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusicUser.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusicUser.java
new file mode 100644
index 0000000..e0faa75
--- /dev/null
+++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusicUser.java
@@ -0,0 +1,42 @@
+package com.xinquan.meditation.domain;
+
+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 com.xinquan.common.core.web.domain.BaseModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 首页背景音乐用户关系表
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_home_background_music_user")
+@ApiModel(value = "HomeBackgroundMusicUser对象", description = "首页背景音乐用户关系表")
+public class HomeBackgroundMusicUser extends BaseModel {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "首页背景音乐用户关系id")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "用户id")
+    @TableField("app_user_id")
+    private Long appUserId;
+
+    @ApiModelProperty(value = "首页音频id")
+    @TableField("home_background_music_id")
+    private Long homeBackgroundMusicId;
+
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/HomeBackgroundMusicMapper.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/HomeBackgroundMusicMapper.java
similarity index 71%
rename from xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/HomeBackgroundMusicMapper.java
rename to xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/HomeBackgroundMusicMapper.java
index 5991001..3da3666 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/HomeBackgroundMusicMapper.java
+++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/HomeBackgroundMusicMapper.java
@@ -1,7 +1,7 @@
-package com.xinquan.system.mapper;
+package com.xinquan.meditation.mapper;
 
-import com.xinquan.system.domain.HomeBackgroundMusic;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xinquan.meditation.domain.HomeBackgroundMusic;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/HomeBackgroundMusicUserMapper.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/HomeBackgroundMusicUserMapper.java
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/HomeBackgroundMusicUserMapper.java
@@ -0,0 +1,16 @@
+package com.xinquan.meditation.mapper;
+
+import com.xinquan.meditation.domain.HomeBackgroundMusicUser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 首页背景音乐用户关系表		 Mapper 接口
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface HomeBackgroundMusicUserMapper extends BaseMapper<HomeBackgroundMusicUser> {
+
+}
diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/HomeBackgroundMusicUserService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/HomeBackgroundMusicUserService.java
new file mode 100644
index 0000000..ffbdc74
--- /dev/null
+++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/HomeBackgroundMusicUserService.java
@@ -0,0 +1,16 @@
+package com.xinquan.meditation.service;
+
+import com.xinquan.meditation.domain.HomeBackgroundMusicUser;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 首页背景音乐用户关系表		 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface HomeBackgroundMusicUserService extends IService<HomeBackgroundMusicUser> {
+
+}
diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/HomeBackgroundMusicUserServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/HomeBackgroundMusicUserServiceImpl.java
new file mode 100644
index 0000000..28d27fc
--- /dev/null
+++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/HomeBackgroundMusicUserServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.meditation.service.impl;
+
+import com.xinquan.meditation.domain.HomeBackgroundMusicUser;
+import com.xinquan.meditation.mapper.HomeBackgroundMusicUserMapper;
+import com.xinquan.meditation.service.HomeBackgroundMusicUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 首页背景音乐用户关系表		 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class HomeBackgroundMusicUserServiceImpl extends ServiceImpl<HomeBackgroundMusicUserMapper, HomeBackgroundMusicUser> implements HomeBackgroundMusicUserService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/HomeBackgroundMusicMapper.xml b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicMapper.xml
similarity index 84%
rename from xinquan-modules/xinquan-system/src/main/resources/mapper/system/HomeBackgroundMusicMapper.xml
rename to xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicMapper.xml
index f3ae0ad..61f8292 100644
--- a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/HomeBackgroundMusicMapper.xml
+++ b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicMapper.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.xinquan.system.mapper.HomeBackgroundMusicMapper">
+<mapper namespace="com.xinquan.meditation.mapper.HomeBackgroundMusicMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.system.domain.HomeBackgroundMusic">
+    <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.HomeBackgroundMusic">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicUserMapper.xml b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicUserMapper.xml
new file mode 100644
index 0000000..1aaea91
--- /dev/null
+++ b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicUserMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xinquan.meditation.mapper.HomeBackgroundMusicUserMapper">
+
+  <!-- 通用查询映射结果 -->
+  <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.HomeBackgroundMusicUser">
+    <id column="id" property="id"/>
+    <result column="app_user_id" property="appUserId"/>
+    <result column="home_background_music_id" property="homeBackgroundMusicId"/>
+  </resultMap>
+
+  <!-- 通用查询结果列 -->
+  <sql id="Base_Column_List">
+    id, app_user_id, home_background_music_id
+  </sql>
+
+</mapper>
diff --git a/xinquan-modules/xinquan-order/pom.xml b/xinquan-modules/xinquan-order/pom.xml
index e82b56c..9ac2e80 100644
--- a/xinquan-modules/xinquan-order/pom.xml
+++ b/xinquan-modules/xinquan-order/pom.xml
@@ -5,12 +5,11 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>com.xinquan</groupId>
-    <artifactId>xinquan</artifactId>
+    <artifactId>xinquan-modules</artifactId>
     <version>3.6.2</version>
-    <relativePath>../../pom.xml</relativePath>
   </parent>
 
-  <artifactId>xinquan-order</artifactId>
+  <artifactId>xinquan-modules-order</artifactId>
 
   <properties>
     <maven.compiler.source>8</maven.compiler.source>
@@ -19,13 +18,6 @@
   </properties>
 
   <dependencies>
-
-    <!--system feign模块-->
-    <dependency>
-      <groupId>com.xinquan</groupId>
-      <artifactId>xinquan-api-system</artifactId>
-      <scope>compile</scope>
-    </dependency>
 
     <!--user feign模块-->
     <dependency>
diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderPaymentRecordService.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderPaymentRecordService.java
index 298b781..d04feaf 100644
--- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderPaymentRecordService.java
+++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderPaymentRecordService.java
@@ -1,7 +1,7 @@
 package com.xinquan.order.service;
 
-import com.xinquan.order.domain.OrderPaymentRecord;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.xinquan.order.domain.OrderPaymentRecord;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-system/pom.xml b/xinquan-modules/xinquan-system/pom.xml
index 1498f24..86eae5d 100644
--- a/xinquan-modules/xinquan-system/pom.xml
+++ b/xinquan-modules/xinquan-system/pom.xml
@@ -143,6 +143,11 @@
             <groupId>com.github.xiaoymin</groupId>
             <artifactId>knife4j-spring-boot-starter</artifactId>
         </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/client/PublicController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/client/PublicController.java
new file mode 100644
index 0000000..a66ec85
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/client/PublicController.java
@@ -0,0 +1,38 @@
+package com.xinquan.system.controller.client;
+
+import com.xinquan.common.core.web.domain.AjaxResult;
+import com.xinquan.system.service.PublicService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author mitao
+ * @date 2024/8/23
+ */
+@Slf4j
+@Api(tags = {"公共接口"})
+@RestController
+@RequestMapping("/public")
+@RequiredArgsConstructor
+public class PublicController {
+
+    private final PublicService publicService;
+
+    @ApiOperation(value = "获取用户协议、隐私协议、关于心泉、新手冥想指南、课程/冥想音频购买协议")
+    @GetMapping("/getContent")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "key", value = "用户内容 1=用户协议 2=隐私协议 3=关于心泉 4=新手冥想指南 5=课程/冥想音频购买协议",
+                    required = true, type = "Integer", paramType = "query")})
+    public AjaxResult getContent(
+            @RequestParam(value = "key", required = true) Integer key) {
+        return AjaxResult.success(publicService.getContent(key));
+    }
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java
index e0da597..eed4d18 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java
@@ -1,10 +1,10 @@
 package com.xinquan.system.domain;
 
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.xinquan.common.core.web.domain.BaseModel;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xinquan.common.core.web.domain.BaseModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -30,6 +30,10 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    @ApiModelProperty(value = "树苗等级类型 1=种子 2=发芽 3=幼苗 4=小树苗 5=中等树苗 6=小树 7=中树 8=大树 9=成熟的大树 10=参天大树")
+    @TableField("tree_level_type")
+    private Integer treeLevelType;
+    
     @ApiModelProperty(value = "树苗阶段")
     @TableField("level_name")
     private String levelName;
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/UserLevelSetting.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/UserLevelSetting.java
index acac59a..78022f7 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/UserLevelSetting.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/UserLevelSetting.java
@@ -1,10 +1,10 @@
 package com.xinquan.system.domain;
 
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.xinquan.common.core.web.domain.BaseModel;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xinquan.common.core.web.domain.BaseModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -30,9 +30,9 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
-    @ApiModelProperty(value = "树苗设置id")
-    @TableField("tree_level_setting_id")
-    private Integer treeLevelSettingId;
+    @ApiModelProperty(value = "树苗等级类型 1=种子 2=发芽 3=幼苗 4=小树苗 5=中等树苗 6=小树 7=中树 8=大树 9=成熟的大树 10=参天大树")
+    @TableField("tree_level_type")
+    private Integer treeLevelType;
 
     @ApiModelProperty(value = "等级图标")
     @TableField("level_icon")
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/vo/ContentSettingVO.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/vo/ContentSettingVO.java
new file mode 100644
index 0000000..c170090
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/vo/ContentSettingVO.java
@@ -0,0 +1,23 @@
+package com.xinquan.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ContentSettingVO对象", description = "内容设置视图对象")
+public class ContentSettingVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "内容id")
+    private Long id;
+
+    @ApiModelProperty(value = "内容类型 1=用户协议 2=隐私协议 3=关于心泉 4= 新手冥想指南 5=课程/冥想音频购买协议")
+    private Integer contentType;
+
+    @ApiModelProperty(value = "内容")
+    private String content;
+
+}
\ No newline at end of file
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/BannerService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/BannerService.java
new file mode 100644
index 0000000..250f87f
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/BannerService.java
@@ -0,0 +1,16 @@
+package com.xinquan.system.service;
+
+import com.xinquan.system.domain.Banner;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 用户信息表 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface BannerService extends IService<Banner> {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/CommonQuestionService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/CommonQuestionService.java
new file mode 100644
index 0000000..4ca1db8
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/CommonQuestionService.java
@@ -0,0 +1,16 @@
+package com.xinquan.system.service;
+
+import com.xinquan.system.domain.CommonQuestion;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 常见问题表 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface CommonQuestionService extends IService<CommonQuestion> {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/ContentSettingService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/ContentSettingService.java
new file mode 100644
index 0000000..97020d2
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/ContentSettingService.java
@@ -0,0 +1,16 @@
+package com.xinquan.system.service;
+
+import com.xinquan.system.domain.ContentSetting;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 内容设置表 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface ContentSettingService extends IService<ContentSetting> {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/CustomConfigService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/CustomConfigService.java
new file mode 100644
index 0000000..c6d1388
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/CustomConfigService.java
@@ -0,0 +1,16 @@
+package com.xinquan.system.service;
+
+import com.xinquan.system.domain.CustomConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 系统配置 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface CustomConfigService extends IService<CustomConfig> {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/HotWordsService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/HotWordsService.java
new file mode 100644
index 0000000..c11a333
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/HotWordsService.java
@@ -0,0 +1,16 @@
+package com.xinquan.system.service;
+
+import com.xinquan.system.domain.HotWords;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 热词表	 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface HotWordsService extends IService<HotWords> {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/PublicService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/PublicService.java
new file mode 100644
index 0000000..4eedfae
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/PublicService.java
@@ -0,0 +1,34 @@
+package com.xinquan.system.service;
+
+import com.xinquan.common.core.utils.page.BeanUtils;
+import com.xinquan.system.domain.ContentSetting;
+import com.xinquan.system.domain.vo.ContentSettingVO;
+import java.util.Optional;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author mitao
+ * @date 2024/8/23
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class PublicService {
+
+    private final ContentSettingService contentSettingService;
+
+    /**
+     * 根据key获取内容
+     *
+     * @param key
+     * @return
+     */
+    public ContentSettingVO getContent(Integer key) {
+        Optional<ContentSetting> contentSetting = contentSettingService.lambdaQuery()
+                .eq(ContentSetting::getContentType, key).oneOpt();
+        return contentSetting.map(setting -> BeanUtils.copyBean(setting, ContentSettingVO.class))
+                .orElse(null);
+    }
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/TreeLevelSettingService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/TreeLevelSettingService.java
new file mode 100644
index 0000000..e993a50
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/TreeLevelSettingService.java
@@ -0,0 +1,16 @@
+package com.xinquan.system.service;
+
+import com.xinquan.system.domain.TreeLevelSetting;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 树苗音频表 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface TreeLevelSettingService extends IService<TreeLevelSetting> {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/UserLevelSettingService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/UserLevelSettingService.java
new file mode 100644
index 0000000..26da795
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/UserLevelSettingService.java
@@ -0,0 +1,16 @@
+package com.xinquan.system.service;
+
+import com.xinquan.system.domain.UserLevelSetting;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 用户等级表 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface UserLevelSettingService extends IService<UserLevelSetting> {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/VersionService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/VersionService.java
new file mode 100644
index 0000000..b48ccba
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/VersionService.java
@@ -0,0 +1,16 @@
+package com.xinquan.system.service;
+
+import com.xinquan.system.domain.Version;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 版本表 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface VersionService extends IService<Version> {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/VipSettingService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/VipSettingService.java
new file mode 100644
index 0000000..2b2c80e
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/VipSettingService.java
@@ -0,0 +1,16 @@
+package com.xinquan.system.service;
+
+import com.xinquan.system.domain.VipSetting;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 会员设置表 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+public interface VipSettingService extends IService<VipSetting> {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/BannerServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/BannerServiceImpl.java
new file mode 100644
index 0000000..a537def
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/BannerServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.system.service.impl;
+
+import com.xinquan.system.domain.Banner;
+import com.xinquan.system.mapper.BannerMapper;
+import com.xinquan.system.service.BannerService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户信息表 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> implements BannerService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/CommonQuestionServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/CommonQuestionServiceImpl.java
new file mode 100644
index 0000000..de2b43f
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/CommonQuestionServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.system.service.impl;
+
+import com.xinquan.system.domain.CommonQuestion;
+import com.xinquan.system.mapper.CommonQuestionMapper;
+import com.xinquan.system.service.CommonQuestionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 常见问题表 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class CommonQuestionServiceImpl extends ServiceImpl<CommonQuestionMapper, CommonQuestion> implements CommonQuestionService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/ContentSettingServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/ContentSettingServiceImpl.java
new file mode 100644
index 0000000..b5aab80
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/ContentSettingServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.system.service.impl;
+
+import com.xinquan.system.domain.ContentSetting;
+import com.xinquan.system.mapper.ContentSettingMapper;
+import com.xinquan.system.service.ContentSettingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 内容设置表 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class ContentSettingServiceImpl extends ServiceImpl<ContentSettingMapper, ContentSetting> implements ContentSettingService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/CustomConfigServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/CustomConfigServiceImpl.java
new file mode 100644
index 0000000..c0877cc
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/CustomConfigServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.system.service.impl;
+
+import com.xinquan.system.domain.CustomConfig;
+import com.xinquan.system.mapper.CustomConfigMapper;
+import com.xinquan.system.service.CustomConfigService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统配置 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class CustomConfigServiceImpl extends ServiceImpl<CustomConfigMapper, CustomConfig> implements CustomConfigService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/HotWordsServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/HotWordsServiceImpl.java
new file mode 100644
index 0000000..c394f6f
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/HotWordsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.system.service.impl;
+
+import com.xinquan.system.domain.HotWords;
+import com.xinquan.system.mapper.HotWordsMapper;
+import com.xinquan.system.service.HotWordsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 热词表	 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class HotWordsServiceImpl extends ServiceImpl<HotWordsMapper, HotWords> implements HotWordsService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/TreeLevelSettingServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/TreeLevelSettingServiceImpl.java
new file mode 100644
index 0000000..86a05df
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/TreeLevelSettingServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.system.service.impl;
+
+import com.xinquan.system.domain.TreeLevelSetting;
+import com.xinquan.system.mapper.TreeLevelSettingMapper;
+import com.xinquan.system.service.TreeLevelSettingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 树苗音频表 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class TreeLevelSettingServiceImpl extends ServiceImpl<TreeLevelSettingMapper, TreeLevelSetting> implements TreeLevelSettingService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/UserLevelSettingServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/UserLevelSettingServiceImpl.java
new file mode 100644
index 0000000..8391ff1
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/UserLevelSettingServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.system.service.impl;
+
+import com.xinquan.system.domain.UserLevelSetting;
+import com.xinquan.system.mapper.UserLevelSettingMapper;
+import com.xinquan.system.service.UserLevelSettingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户等级表 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class UserLevelSettingServiceImpl extends ServiceImpl<UserLevelSettingMapper, UserLevelSetting> implements UserLevelSettingService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/VersionServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/VersionServiceImpl.java
new file mode 100644
index 0000000..679da4a
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/VersionServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.system.service.impl;
+
+import com.xinquan.system.domain.Version;
+import com.xinquan.system.mapper.VersionMapper;
+import com.xinquan.system.service.VersionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 版本表 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class VersionServiceImpl extends ServiceImpl<VersionMapper, Version> implements VersionService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/VipSettingServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/VipSettingServiceImpl.java
new file mode 100644
index 0000000..ebf5b45
--- /dev/null
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/VipSettingServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.system.service.impl;
+
+import com.xinquan.system.domain.VipSetting;
+import com.xinquan.system.mapper.VipSettingMapper;
+import com.xinquan.system.service.VipSettingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 会员设置表 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-23
+ */
+@Service
+public class VipSettingServiceImpl extends ServiceImpl<VipSettingMapper, VipSetting> implements VipSettingService {
+
+}
diff --git a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/TreeLevelSettingMapper.xml b/xinquan-modules/xinquan-system/src/main/resources/mapper/system/TreeLevelSettingMapper.xml
index 092d4db..d4a1def 100644
--- a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/TreeLevelSettingMapper.xml
+++ b/xinquan-modules/xinquan-system/src/main/resources/mapper/system/TreeLevelSettingMapper.xml
@@ -10,6 +10,7 @@
         <result column="create_time" property="createTime" />
         <result column="update_by" property="updateBy" />
         <result column="update_time" property="updateTime" />
+        <result column="tree_level_type" property="treeLevelType"/>
         <result column="level_name" property="levelName" />
         <result column="growth_value" property="growthValue" />
         <result column="grow_up_music" property="growUpMusic" />
diff --git a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml b/xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml
index f4bfb0d..f0e3b46 100644
--- a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml
+++ b/xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml
@@ -10,7 +10,7 @@
         <result column="create_time" property="createTime" />
         <result column="update_by" property="updateBy" />
         <result column="update_time" property="updateTime" />
-        <result column="tree_level_setting_id" property="treeLevelSettingId" />
+        <result column="tree_level_type" property="treeLevelType"/>
         <result column="level_icon" property="levelIcon" />
         <result column="level_name" property="levelName" />
         <result column="growth_value" property="growthValue" />
diff --git a/xinquan-modules/xinquan-user/pom.xml b/xinquan-modules/xinquan-user/pom.xml
index 97fe2d3..ed9d8fc 100644
--- a/xinquan-modules/xinquan-user/pom.xml
+++ b/xinquan-modules/xinquan-user/pom.xml
@@ -5,12 +5,11 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>com.xinquan</groupId>
-    <artifactId>xinquan</artifactId>
+    <artifactId>xinquan-modules</artifactId>
     <version>3.6.2</version>
-    <relativePath>../../pom.xml</relativePath>
   </parent>
 
-  <artifactId>xinquan-user</artifactId>
+  <artifactId>xinquan-modules-user</artifactId>
 
   <properties>
     <maven.compiler.source>8</maven.compiler.source>
@@ -19,12 +18,6 @@
   </properties>
 
   <dependencies>
-    <!--system feign模块-->
-    <dependency>
-      <groupId>com.xinquan</groupId>
-      <artifactId>xinquan-api-system</artifactId>
-      <scope>compile</scope>
-    </dependency>
 
     <!--user feign模块-->
     <dependency>
@@ -117,6 +110,7 @@
 
     <!-- 引入Druid依赖,阿里巴巴所提供的数据源 -->
     <dependency>
+
       <groupId>com.alibaba</groupId>
       <artifactId>druid-spring-boot-starter</artifactId>
       <version>${druid.version}</version>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserQuestionController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserQuestionController.java
new file mode 100644
index 0000000..7a62970
--- /dev/null
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserQuestionController.java
@@ -0,0 +1,20 @@
+package com.xinquan.user.controller.client;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 用户计划引导页问题记录表 前端控制器
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-24
+ */
+@RestController
+@RequestMapping("/client/user/app-user-question")
+public class ClientAppUserQuestionController {
+
+}
+
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java
index d55a04e..34b057a 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java
@@ -2,14 +2,22 @@
 
 import com.xinquan.common.core.domain.R;
 import com.xinquan.common.security.annotation.InnerAuth;
+import com.xinquan.system.api.model.AppCaptchaBody;
+import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
+import com.xinquan.system.api.model.AppWXLoginBody;
+import com.xinquan.system.api.model.AppleLoginUser;
+import com.xinquan.system.api.model.LoginUser;
+import com.xinquan.system.api.model.WXLoginUser;
 import com.xinquan.user.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.service.AppUserService;
+import java.util.Optional;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 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.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -31,17 +39,67 @@
      */
     @InnerAuth
     @PostMapping("/getUserByCondition")
-    R<AppUser> getUserByCondition(@RequestBody AppUserDTO dto){
+    R<Optional<AppUser>> getUserByCondition(@RequestBody AppUserDTO dto) {
         return R.ok(appUserService.getUserByCondition(dto));
     }
 
     /**
-     * app用户注册
+     * APP用户注册
      * @param appUserDTO
      * @return
      */
+    @InnerAuth
     @PostMapping("/registerAppUser")
     R<Boolean> registerAppUser(@RequestBody AppUserDTO appUserDTO){
         return R.ok(appUserService.registerAppUser(appUserDTO));
     }
+
+    /**
+     * APP微信登录
+     *
+     * @param body
+     * @return
+     */
+    @InnerAuth
+    @PostMapping("/wxLogin")
+    R<WXLoginUser> wxLogin(@RequestBody AppWXLoginBody body) {
+        return R.ok(appUserService.wxLogin(body));
+    }
+
+    /**
+     * APP苹果登录
+     *
+     * @param appleId
+     * @param source
+     * @return
+     */
+    @InnerAuth
+    @PostMapping("/appleLogin")
+    R<AppleLoginUser> appleLogin(@RequestParam("appleId") String appleId) {
+        return R.ok(appUserService.appleLogin(appleId));
+    }
+
+    /**
+     * 验证码登录
+     *
+     * @param body
+     * @return
+     */
+    @InnerAuth
+    @PostMapping("/captchaLogin")
+    R<LoginUser> appCaptchaLogin(@RequestBody AppCaptchaBody body) {
+        return R.ok(appUserService.appCaptchaLogin(body));
+    }
+
+    /**
+     * 微信苹果登录验证手机号码操作
+     *
+     * @param body
+     * @return
+     */
+    @InnerAuth
+    @PostMapping("/verifyCellPhone")
+    R<WXLoginUser> verifyCellPhone(@RequestBody AppVerifyCellPhoneBody body) {
+        return R.ok(appUserService.verifyCellPhone(body));
+    }
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserBankController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserBankController.java
index 7770bf3..d6dba1e 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserBankController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserBankController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserController.java
index a7631a1..4c21f68 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserCourseController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserCourseController.java
index da1af4b..4a2e1a3 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserCourseController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserCourseController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserEnergyRecordController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserEnergyRecordController.java
index 6ff14bf..9aae452 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserEnergyRecordController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserEnergyRecordController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserMeditationController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserMeditationController.java
index 7f9aec4..2ac3390 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserMeditationController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserMeditationController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTagController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTagController.java
index 7066583..e7908d6 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTagController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTagController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTreeController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTreeController.java
index 5489309..49c7198 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTreeController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserTreeController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWalletRecordController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWalletRecordController.java
index 92ee57d..bf08f5c 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWalletRecordController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWalletRecordController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWithdrawController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWithdrawController.java
index bd66a44..3bd9715 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWithdrawController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserWithdrawController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeController.java
index 6ebabe3..2f69bcf 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeRedemptionRecordController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeRedemptionRecordController.java
index 3c5b07c..76e5d22 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeRedemptionRecordController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtPrizeRedemptionRecordController.java
@@ -1,8 +1,7 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
 
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtTagController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtTagController.java
index 7cb5cd0..27e3cbb 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtTagController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtTagController.java
@@ -1,8 +1,9 @@
-package com.xinquan.controller;
+package com.xinquan.user.controller.management;
 
-
+import com.xinquan.user.service.TagService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -13,9 +14,29 @@
  * @author mitao
  * @since 2024-08-21
  */
+@Api(value = "管理后台接口", tags = "管理后台接口")
 @RestController
 @RequestMapping("/mgt/tag")
+@RequiredArgsConstructor
 public class MgtTagController {
 
+    private final TagService tagService;
+
+/*    @ApiOperation(value = "添加用户标签")
+    @PostMapping("save")
+    public AjaxResult save(@RequestBody Tag tag) {
+        tagService.save(tag);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation(value = "获取用户标签")
+    @GetMapping("/{id}")
+    @ApiParam(value = "标签id")
+    public AjaxResult save(@PathVariable("id") Long id) {
+
+        Tag byId = tagService.getById(id);
+        return AjaxResult.success(byId);
+    }*/
+
 }
 
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java
new file mode 100644
index 0000000..fc5627e
--- /dev/null
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java
@@ -0,0 +1,41 @@
+package com.xinquan.user.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xinquan.common.core.web.domain.BaseModel;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 用户计划引导页问题记录表
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_app_user_question")
+@ApiModel(value="AppUserQuestion对象", description="用户计划引导页问题记录表")
+public class AppUserQuestion extends BaseModel {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "用户计划引导问题记录表")
+    @TableId("id")
+    private Long id;
+
+    @ApiModelProperty(value = "1:您是否内心纠结敏感多疑?2:您是否辗转反侧彻夜难眠?3:您是否情绪失控暴躁易怒?4:您是否沉迷情感倍受伤害?5:您是否人生迷茫踌躇彷徨?6:其它补充说明")
+    @TableField("type")
+    private Integer type;
+
+    @ApiModelProperty(value = "回答 1:是2:否3:偶尔有")
+    @TableField("answer")
+    private Integer answer;
+
+
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTree.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTree.java
index 659e4c3..cb02369 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTree.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTree.java
@@ -1,10 +1,10 @@
 package com.xinquan.user.domain;
 
 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 com.xinquan.common.core.web.domain.BaseModel;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -34,9 +34,9 @@
     @TableField("app_user_id")
     private Long appUserId;
 
-    @ApiModelProperty(value = "树苗等级id")
-    @TableField("tree_level_id")
-    private Integer treeLevelId;
+    @ApiModelProperty(value = "树苗等级类型 1=种子 2=发芽 3=幼苗 4=小树苗 5=中等树苗 6=小树 7=中树 8=大树 9=成熟的大树 10=参天大树")
+    @TableField("tree_level_type")
+    private Integer treeLevelType;
 
     @ApiModelProperty(value = "成长值")
     @TableField("growth_value")
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java
index 51cc6c2..9e17342 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java
@@ -34,5 +34,4 @@
     @TableField("tag_name")
     private String tagName;
 
-
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserQuestionMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserQuestionMapper.java
new file mode 100644
index 0000000..38f61d1
--- /dev/null
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserQuestionMapper.java
@@ -0,0 +1,16 @@
+package com.xinquan.user.mapper;
+
+import com.xinquan.user.domain.AppUserQuestion;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户计划引导页问题记录表 Mapper 接口
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-24
+ */
+public interface AppUserQuestionMapper extends BaseMapper<AppUserQuestion> {
+
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserQuestionService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserQuestionService.java
new file mode 100644
index 0000000..bfe63a4
--- /dev/null
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserQuestionService.java
@@ -0,0 +1,16 @@
+package com.xinquan.user.service;
+
+import com.xinquan.user.domain.AppUserQuestion;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 用户计划引导页问题记录表 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-24
+ */
+public interface AppUserQuestionService extends IService<AppUserQuestion> {
+
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java
index 96dd552..31bd3b1 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java
@@ -1,8 +1,15 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.xinquan.system.api.model.AppCaptchaBody;
+import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
+import com.xinquan.system.api.model.AppWXLoginBody;
+import com.xinquan.system.api.model.AppleLoginUser;
+import com.xinquan.system.api.model.LoginUser;
+import com.xinquan.system.api.model.WXLoginUser;
 import com.xinquan.user.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
+import java.util.Optional;
 
 /**
  * <p>
@@ -15,14 +22,49 @@
 public interface AppUserService extends IService<AppUser> {
     /**
      * 获取用户信息
+     *
      * @param dto
      * @return
      */
-    AppUser getUserByCondition(AppUserDTO dto);
+    Optional<AppUser> getUserByCondition(AppUserDTO dto);
+
     /**
      * app用户注册
      * @param appUserDTO
      * @return
      */
     Boolean registerAppUser(AppUserDTO appUserDTO);
+
+    /**
+     * APP微信登录
+     *
+     * @param body
+     * @return
+     */
+    WXLoginUser wxLogin(AppWXLoginBody body);
+
+    /**
+     * 苹果登录
+     *
+     * @param appleId
+     * @param source
+     * @return
+     */
+    AppleLoginUser appleLogin(String appleId);
+
+    /**
+     * 验证码登录
+     *
+     * @param body
+     * @return
+     */
+    LoginUser appCaptchaLogin(AppCaptchaBody body);
+
+    /**
+     * 微信苹果登录验证手机号码操作
+     *
+     * @param body
+     * @return
+     */
+    WXLoginUser verifyCellPhone(AppVerifyCellPhoneBody body);
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserQuestionServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserQuestionServiceImpl.java
new file mode 100644
index 0000000..c7ecee7
--- /dev/null
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserQuestionServiceImpl.java
@@ -0,0 +1,20 @@
+package com.xinquan.user.service.impl;
+
+import com.xinquan.user.domain.AppUserQuestion;
+import com.xinquan.user.mapper.AppUserQuestionMapper;
+import com.xinquan.user.service.AppUserQuestionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户计划引导页问题记录表 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-24
+ */
+@Service
+public class AppUserQuestionServiceImpl extends ServiceImpl<AppUserQuestionMapper, AppUserQuestion> implements AppUserQuestionService {
+
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java
index ec96e38..46fd4ce 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java
@@ -1,13 +1,39 @@
 package com.xinquan.user.service.impl;
 
+import cn.hutool.core.util.IdUtil;
 import com.alibaba.nacos.common.utils.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xinquan.common.core.constant.Constants;
+import com.xinquan.common.core.constant.SecurityConstants;
+import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.enums.AppUserStatusEnum;
+import com.xinquan.common.core.enums.DisabledEnum;
+import com.xinquan.common.core.enums.TreeLevelEnum;
+import com.xinquan.common.core.exception.ServiceException;
 import com.xinquan.common.core.utils.page.BeanUtils;
+import com.xinquan.common.security.utils.SecurityUtils;
+import com.xinquan.system.api.RemoteUserService;
+import com.xinquan.system.api.domain.SysUser;
+import com.xinquan.system.api.feignClient.SysUserClient;
+import com.xinquan.system.api.model.AppCaptchaBody;
+import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
+import com.xinquan.system.api.model.AppWXLoginBody;
+import com.xinquan.system.api.model.AppleLoginUser;
+import com.xinquan.system.api.model.LoginUser;
+import com.xinquan.system.api.model.WXLoginUser;
 import com.xinquan.user.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
+import com.xinquan.user.domain.AppUserTree;
 import com.xinquan.user.mapper.AppUserMapper;
 import com.xinquan.user.service.AppUserService;
+import com.xinquan.user.service.AppUserTreeService;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Objects;
+import java.util.Optional;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <p>
@@ -18,20 +44,28 @@
  * @since 2024-08-21
  */
 @Service
+@RequiredArgsConstructor
 public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> implements AppUserService {
+
+    private final SysUserClient sysUserClient;
+    private final RemoteUserService remoteUserService;
+    private final AppUserTreeService appUserTreeService;
     /**
      * 获取用户信息
+     *
      * @param dto
      * @return
      */
     @Override
-    public AppUser getUserByCondition(AppUserDTO dto) {
-        return  this.lambdaQuery()
+    public Optional<AppUser> getUserByCondition(AppUserDTO dto) {
+        return this.lambdaQuery()
+                .eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId())
                 .eq(StringUtils.isNotBlank(dto.getAppleId()), AppUser::getAppleId, dto.getAppleId())
                 .eq(StringUtils.isNotBlank(dto.getCellPhone()), AppUser::getCellPhone,
                         dto.getCellPhone())
                 .eq(StringUtils.isNotBlank(dto.getWxOpenId()), AppUser::getWxOpenId,
-                        dto.getWxOpenId()).oneOpt().orElse(null);
+                        dto.getWxOpenId())
+                .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
     }
 
     /**
@@ -44,4 +78,266 @@
         AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class);
         return this.save(appUser);
     }
+
+    /**
+     * APP微信登录
+     *
+     * @param body
+     * @return
+     */
+    @Override
+    public WXLoginUser wxLogin(AppWXLoginBody body) {
+        WXLoginUser wxLoginUser = new WXLoginUser();
+        Optional<AppUser> optionalAppUser = this.getUserByCondition(
+                AppUserDTO.builder().wxOpenId(body.getWxOpenId()).build());
+        // 存在账户,查询关联系统用户
+        if (optionalAppUser.isPresent()) {
+            AppUser appUser = optionalAppUser.get();
+            SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
+            wxLoginUser.setSysUser(sysUser);
+            if (Objects.nonNull(sysUser.getUserName())) {
+                wxLoginUser.setBindStatus(1);
+                wxLoginUser.setCellPhone(appUser.getCellPhone());
+            }
+        } else {
+            // 不存在账户,创建账户
+            // 注册用户信息
+            SysUser sysUser = new SysUser();
+            sysUser.setNickName(body.getNickname());
+            sysUser.setAvatar(body.getHeadImgUrl());
+
+            R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser,
+                    SecurityConstants.INNER);
+            if (registerResult.getCode() == Constants.FAIL) {
+                throw new ServiceException(registerResult.getMsg());
+            }
+            SysUser sysUserRes = registerResult.getData();
+            AppUser appUser = new AppUser();
+            appUser.setUserId(sysUserRes.getUserId());
+            appUser.setWxOpenId(body.getWxOpenId());
+            appUser.setNickname(body.getNickname());
+            appUser.setAvatar(body.getHeadImgUrl());
+            appUser.setGender(body.getSex());
+            appUser.setBalance(BigDecimal.ZERO);
+            appUser.setSanskritFlag(DisabledEnum.NO.getCode());
+            appUser.setBalance(BigDecimal.ZERO);
+            appUser.setIncome(BigDecimal.ZERO);
+            appUser.setTotalEnergyValue(0);
+            appUser.setRegisterTime(LocalDateTime.now());
+            appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
+            this.save(appUser);
+            // 初始化用户树苗
+            initUserTree(appUser.getId());
+            wxLoginUser.setSysUser(null);
+            wxLoginUser.setBindStatus(DisabledEnum.NO.getCode());
+        }
+        return wxLoginUser;
+    }
+
+    @Override
+    public AppleLoginUser appleLogin(String appleId) {
+        AppleLoginUser appleLoginUser = new AppleLoginUser();
+        Optional<AppUser> optionalAppUser = this.getUserByCondition(
+                AppUserDTO.builder().appleId(appleId).build());
+        // 存在账户,查询关联系统用户
+        if (optionalAppUser.isPresent()) {
+            AppUser appUser = optionalAppUser.get();
+            SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
+            appleLoginUser.setSysUser(sysUser);
+            if (Objects.nonNull(sysUser.getUserName())) {
+                appleLoginUser.setBindStatus(1);
+                appleLoginUser.setCellPhone(appUser.getCellPhone());
+            }
+        } else {
+            // 不存在账户,创建账户
+            // 注册用户信息
+            SysUser sysUser = new SysUser();
+            String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
+            sysUser.setNickName(nickname);
+            sysUser.setAvatar("qwer");
+
+            R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser,
+                    SecurityConstants.INNER);
+            if (registerResult.getCode() == Constants.FAIL) {
+                throw new ServiceException(registerResult.getMsg());
+            }
+            SysUser sysUserRes = registerResult.getData();
+            AppUser appUser = new AppUser();
+            appUser.setUserId(sysUserRes.getUserId());
+            appUser.setNickname(nickname);
+            appUser.setAvatar("qwer"); // TODO 待完善默认头像
+            appUser.setBalance(BigDecimal.ZERO);
+            appUser.setSanskritFlag(DisabledEnum.NO.getCode());
+            appUser.setBalance(BigDecimal.ZERO);
+            appUser.setIncome(BigDecimal.ZERO);
+            appUser.setTotalEnergyValue(0);
+            appUser.setRegisterTime(LocalDateTime.now());
+            appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
+            this.save(appUser);
+            // 初始化用户树苗
+            initUserTree(appUser.getId());
+            appleLoginUser.setSysUser(null);
+            appleLoginUser.setBindStatus(DisabledEnum.NO.getCode());
+        }
+
+        return appleLoginUser;
+    }
+
+    /**
+     * 验证码登录
+     *
+     * @param body
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public LoginUser appCaptchaLogin(AppCaptchaBody body) {
+        LoginUser loginUser = new LoginUser();
+        Optional<AppUser> optionalAppUser = this.getUserByCondition(
+                AppUserDTO.builder().cellPhone(body.getCellPhone()).build());
+        if (optionalAppUser.isPresent()) {
+            AppUser appUser = optionalAppUser.get();
+            SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
+            loginUser.setSysUser(sysUser);
+        } else {
+            // 注册用户信息
+            SysUser sysUser = new SysUser();
+            String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
+            sysUser.setNickName(nickname);
+            sysUser.setAvatar("qwer");
+            sysUser.setUserName(body.getCellPhone());
+            // 设置默认密码123456
+            sysUser.setPassword(SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD));
+
+            R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser,
+                    SecurityConstants.INNER);
+            if (registerResult.getCode() == Constants.FAIL) {
+                throw new ServiceException(registerResult.getMsg());
+            }
+            SysUser sysUserRes = registerResult.getData();
+            AppUser appUser = new AppUser();
+            appUser.setUserId(sysUserRes.getUserId());
+            appUser.setNickname(nickname);
+            appUser.setCellPhone(body.getCellPhone());
+            appUser.setAvatar("qwer"); // TODO 待完善默认头像
+            appUser.setBalance(BigDecimal.ZERO);
+            appUser.setSanskritFlag(DisabledEnum.NO.getCode());
+            appUser.setBalance(BigDecimal.ZERO);
+            appUser.setIncome(BigDecimal.ZERO);
+            appUser.setTotalEnergyValue(0);
+            appUser.setRegisterTime(LocalDateTime.now());
+            appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
+            this.save(appUser);
+            // 初始化用户树苗
+            initUserTree(appUser.getId());
+        }
+        return loginUser;
+    }
+
+    /**
+     * 初始化用户树苗
+     *
+     * @param appUserId 用户id
+     */
+    private void initUserTree(Long appUserId) {
+        AppUserTree appUserTree = new AppUserTree();
+        appUserTree.setAppUserId(appUserId);
+        appUserTree.setTreeLevelType(TreeLevelEnum.SEED.getCode());
+        appUserTree.setGrowthValue(0);
+        appUserTree.setSowAgain(2);
+        appUserTree.setCurrentEnergyValue(0);
+        appUserTreeService.save(appUserTree);
+    }
+
+    /**
+     * 微信苹果登录验证手机号码操作
+     *
+     * @param body
+     * @return
+     */
+    @Override
+    public WXLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) {
+        Integer loginType = body.getLoginType();
+        String wxOrAppleId = body.getWxOrAppleId();
+        SysUser sysUser;
+        AppUser appUser;
+        // 先通过手机号查询用户,如果用户先使用手机号码登录过,那么就已经存在这个手机号码的用户了。
+        Optional<AppUser> baseOptionalAppUser = this.getUserByCondition(
+                AppUserDTO.builder().cellPhone(body.getCellPhone()).build());
+        // 如果存在 更新wxOpenId 或appleId
+        if (baseOptionalAppUser.isPresent()) {
+            appUser = baseOptionalAppUser.get();
+            if (loginType.equals(1)) {
+                appUser.setWxOpenId(wxOrAppleId);
+            } else {
+                appUser.setAppleId(wxOrAppleId);
+            }
+            // 查询系统用户
+            sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
+            if (Objects.isNull(sysUser)) {
+                throw new ServiceException("系统用户不存在");
+            }
+        } else {
+            Optional<AppUser> userOptional = getAppUserByThirdId(loginType, wxOrAppleId);
+
+            if (loginType.equals(1)) {
+                // 微信登录
+                handleUserNotPresent(userOptional, "该用户不存在,请重新进行微信授权登录");
+            } else {
+                // 苹果登录
+                handleUserNotPresent(userOptional, "该用户不存在,请重新进行苹果授权登录");
+            }
+            appUser = userOptional.get();
+            appUser.setCellPhone(body.getCellPhone());
+            // 更新系统用户
+            sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
+            if (Objects.isNull(sysUser)) {
+                throw new ServiceException("系统用户不存在");
+            }
+            sysUser.setUserName(body.getCellPhone());
+            sysUser.setPassword(
+                    SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD)); // 默认密码为123456
+            sysUser.setPhonenumber(body.getCellPhone());
+            sysUserClient.updateSysUser(sysUser);
+        }
+        // 更新用户信息
+        this.updateById(appUser);
+        if (loginType.equals(1)) {
+            // 微信登录
+            WXLoginUser wxLoginUser = new WXLoginUser();
+            wxLoginUser.setBindStatus(1);
+            wxLoginUser.setCellPhone(body.getCellPhone());
+            wxLoginUser.setSysUser(sysUser);
+            return wxLoginUser;
+        } else {
+            // 苹果登录
+            AppleLoginUser appleLoginUser = new AppleLoginUser();
+            appleLoginUser.setBindStatus(1);
+            appleLoginUser.setCellPhone(body.getCellPhone());
+            appleLoginUser.setSysUser(sysUser);
+            return appleLoginUser;
+        }
+    }
+
+    // 定义一个方法来处理用户不存在的情况
+    private void handleUserNotPresent(Optional<AppUser> userOptional, String errorMessage) {
+        if (!userOptional.isPresent()) {
+            throw new ServiceException(errorMessage);
+        }
+    }
+
+    /**
+     * 根据第三方id获取未注销用户
+     *
+     * @param loginType   登录类型 1=微信 2=苹果
+     * @param wxOrAppleId 微信openid或苹果appleId
+     * @return Optional<AppUser>
+     */
+    private Optional<AppUser> getAppUserByThirdId(Integer loginType, String wxOrAppleId) {
+        return this.lambdaQuery()
+                .eq(loginType.equals(1), AppUser::getWxOpenId, wxOrAppleId)
+                .eq(loginType.equals(2), AppUser::getAppleId, wxOrAppleId)
+                .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT)
+                .oneOpt();
+    }
 }
diff --git a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/HomeBackgroundMusicMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserQuestionMapper.xml
similarity index 65%
copy from xinquan-modules/xinquan-system/src/main/resources/mapper/system/HomeBackgroundMusicMapper.xml
copy to xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserQuestionMapper.xml
index f3ae0ad..9ac78ec 100644
--- a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/HomeBackgroundMusicMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserQuestionMapper.xml
@@ -1,18 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.xinquan.system.mapper.HomeBackgroundMusicMapper">
+<mapper namespace="com.xinquan.user.mapper.AppUserQuestionMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.system.domain.HomeBackgroundMusic">
+    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserQuestion">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
         <result column="create_time" property="createTime" />
         <result column="update_by" property="updateBy" />
         <result column="update_time" property="updateTime" />
-        <result column="image_url" property="imageUrl" />
-        <result column="audio_file" property="audioFile" />
-        <result column="sort_num" property="sortNum" />
+        <result column="type" property="type" />
+        <result column="answer" property="answer" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -22,7 +21,7 @@
         create_time,
         update_by,
         update_time,
-        id, image_url, audio_file, sort_num
+        id, type, answer
     </sql>
 
 </mapper>
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml
index fc42269..144edf5 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml
@@ -11,7 +11,7 @@
         <result column="update_by" property="updateBy" />
         <result column="update_time" property="updateTime" />
         <result column="app_user_id" property="appUserId" />
-        <result column="tree_level_id" property="treeLevelId" />
+        <result column="tree_level_type" property="treeLevelType"/>
         <result column="growth_value" property="growthValue" />
         <result column="current_energy_value" property="currentEnergyValue" />
         <result column="sow_again" property="sowAgain" />

--
Gitblit v1.7.1