From 0c4ec290990bfc37528b17ebeab5439534671527 Mon Sep 17 00:00:00 2001
From: phpcjl <phpcjl@gmail.com>
Date: 星期三, 04 十二月 2024 16:02:19 +0800
Subject: [PATCH] 1.补充文档

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/MybatisPlusConfig.java                                       |   51 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsAreaMapper.java                                         |    7 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianStatus.java                                         |   26 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserException.java                        |   18 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsAppUserService.java                                    |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/AgreementServiceImpl.java                              |   15 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityDetailVO.java                                     |   27 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java                                          |   39 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SeckillActivityInfoServiceImpl.java                    |   71 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SystemConfigMapper.java                                      |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/VipGoodService.java                                         |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PointSettingMapper.java                                      |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianSubscribeVO.java                                       |   54 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RechargeSetMapper.java                                       |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShareService.java                                           |   15 
 ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/FastJson2JsonRedisSerializer.java            |   49 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataUpdateHandlerConfig.java                                 |   51 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/AgreementMapper.java                                         |   11 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/SiteStatusEnum.java                         |   46 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserPasswordNotMatchException.java        |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAddType.java                                             |   19 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsBargainPriceServiceImpl.java                      |   20 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsSeckillService.java                                    |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileException.java                        |   19 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsBargainPriceDetailMapper.java                           |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopWithdrawMapper.java                                      |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditStateEnum.java                                |   48 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java                                   |   56 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopMapper.java                                              |   25 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnCarTypeEnum.java                             |   46 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsVipMapper.java                                          |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java                                      |   18 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/VipSettingMapper.java                                        |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsVipService.java                                        |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/HandoverStateEnum.java                             |   49 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RedPackegeSetServiceImpl.java                          |   20 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SystemConfigService.java                                    |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopWithdrawService.java                                    |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BaseSettingMapper.java                                       |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CarStateEnum.java                                  |   50 
 ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java                             |   43 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopPointServiceImpl.java                              |   20 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BannerMapper.java                                            |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RegionService.java                                          |    7 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java                                              |  117 +
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/WarrantyStateEnum.java                             |   49 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java                                       |  197 ++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianService.java                                      |   22 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserAppletException.java                  |   48 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsCategoryMapper.java                                     |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsSeckillMapper.java                                      |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/Home.java                                                        |  105 +
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java                    |   64 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopDetailVO.java                                                |   70 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsService.java                                           |   24 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/VerifiableShopVo.java                                            |   18 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DelFlagEnum.java                                   |   43 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsCategoryService.java                                   |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java                             |   27 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/OrderActivityInfoMapper.java                                 |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/base/BaseException.java                        |   79 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java                                         |   19 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PhoneMapper.java                                             |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/AgreementService.java                                       |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsShopMapper.java                                         |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PhoneServiceImpl.java                                  |   20 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RegionMapper.java                                            |    7 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PointSettingService.java                                    |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsController.java                                     |    5 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShopStatus.java                                               |   18 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/UserStatus.java                                    |   30 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopBalanceStatementMapper.java                              |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsBargainPriceMapper.java                                 |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShareMapper.java                                             |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java                                              |   18 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PhoneService.java                                           |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopService.java                                            |   24 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java                                   |  561 +++++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BaseSettingServiceImpl.java                            |   20 
 ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java                        |   34 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/CouponInfoMapper.java                                        |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TechnicianSubscribeMapper.java                               |   29 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileNameLengthLimitExceededException.java |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java                                    |  182 +
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BannerService.java                                          |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/GoodsVO.java                                                     |   53 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsEvaluateServiceImpl.java                          |   20 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsBargainPriceService.java                               |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsAreaServiceImpl.java                              |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java                      |   46 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TechnicianMapper.java                                        |   24 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/InvalidExtensionException.java            |   80 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsShopServiceImpl.java                              |   20 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsEvaluateMapper.java                                     |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShareServiceImpl.java                                  |   19 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileSizeLimitExceededException.java       |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotPermissionException.java               |   23 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/HttpConfig.java                                              |   25 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/query/TimeRangePageQuery.java                            |   52 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/VipSettingService.java                                      |   17 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunModeEnum.java                    |   46 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BaseSettingService.java                                     |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotLoginException.java                    |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/WalletChangeVO.java                                              |   24 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RedPackegeSetMapper.java                                     |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SeckillActivityInfoMapper.java                               |   24 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsVipServiceImpl.java                               |   20 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/VipGoodServiceImpl.java                                |   20 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AdvertisingStatusEnum.java                  |   45 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ObsUploadUtil.java                                 |   78 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RechargeSetService.java                                     |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsAppUserServiceImpl.java                           |   20 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/OrderActivityInfoService.java                               |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java                                   |   18 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/IAgreementService.java                                      |   11 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/NearbyShopVO.java                                                |   21 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianServiceImpl.java                             |   37 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DisabledEnum.java                                  |   43 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/InsureTypeEnum.java                                |   49 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunStatusEnum.java                  |   50 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianDetailVO.java                                          |   50 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsBargainPriceDetailService.java                         |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditTypeEnum.java                                 |   48 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ImportTypeEnum.java                                |   56 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsShopService.java                                       |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsSeckillServiceImpl.java                           |   20 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExceptionUtil.java                                 |   39 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/CodeGenerateUtils.java                             |  106 +
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsAppUserMapper.java                                      |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopBalanceStatementService.java                            |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RedPackegeSetService.java                                   |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RechargeSetServiceImpl.java                            |   20 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java                                    |  382 +++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/VipGoodMapper.java                                           |   21 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/CaptchaExpireException.java               |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsAreaService.java                                       |    7 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsMapper.java                                             |   18 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityVO.java                                           |   38 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianVO.java                                                |   28 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnStateEnum.java                               |   50 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SeckillActivityInfoService.java                             |   24 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileUploadException.java                  |   61 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopPointService.java                                       |   16 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ApproveConfigEnum.java                             |   47 
 ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java                              |  276 ++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopPointMapper.java                                         |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java                                                |   18 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsEvaluateService.java                                   |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/CouponInfoService.java                                      |   16 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java                                  |  116 +
 150 files changed, 5,858 insertions(+), 2 deletions(-)

diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java
new file mode 100644
index 0000000..f77183a
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java
@@ -0,0 +1,182 @@
+package com.ruoyi.common.core.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.math.BigDecimal;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import com.ruoyi.common.core.utils.poi.ExcelHandlerAdapter;
+
+/**
+ * 自定义导出Excel数据注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface Excel
+{
+    /**
+     * 导出时在excel中排序
+     */
+    public int sort() default Integer.MAX_VALUE;
+
+    /**
+     * 导出到Excel中的名字.
+     */
+    public String name() default "";
+
+    /**
+     * 日期格式, 如: yyyy-MM-dd
+     */
+    public String dateFormat() default "";
+
+    /**
+     * 读取内容转表达式 (如: 0=男,1=女,2=未知)
+     */
+    public String readConverterExp() default "";
+
+    /**
+     * 分隔符,读取字符串组内容
+     */
+    public String separator() default ",";
+
+    /**
+     * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
+     */
+    public int scale() default -1;
+
+    /**
+     * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
+     */
+    public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
+
+    /**
+     * 导出时在excel中每个列的高度 单位为字符
+     */
+    public double height() default 14;
+
+    /**
+     * 导出时在excel中每个列的宽 单位为字符
+     */
+    public double width() default 16;
+
+    /**
+     * 文字后缀,如% 90 变成90%
+     */
+    public String suffix() default "";
+
+    /**
+     * 当值为空时,字段的默认值
+     */
+    public String defaultValue() default "";
+
+    /**
+     * 提示信息
+     */
+    public String prompt() default "";
+
+    /**
+     * 设置只能选择不能输入的列内容.
+     */
+    public String[] combo() default {};
+
+    /**
+     * 是否需要纵向合并单元格,应对需求:含有list集合单元格)
+     */
+    public boolean needMerge() default false;
+
+    /**
+     * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
+     */
+    public boolean isExport() default true;
+
+    /**
+     * 另一个类中的属性名称,支持多级获取,以小数点隔开
+     */
+    public String targetAttr() default "";
+
+    /**
+     * 是否自动统计数据,在最后追加一行统计数据总和
+     */
+    public boolean isStatistics() default false;
+
+    /**
+     * 导出类型(0数字 1字符串)
+     */
+    public ColumnType cellType() default ColumnType.STRING;
+
+    /**
+     * 导出列头背景色
+     */
+    public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
+
+    /**
+     * 导出列头字体颜色
+     */
+    public IndexedColors headerColor() default IndexedColors.WHITE;
+
+    /**
+     * 导出单元格背景色
+     */
+    public IndexedColors backgroundColor() default IndexedColors.WHITE;
+
+    /**
+     * 导出单元格字体颜色
+     */
+    public IndexedColors color() default IndexedColors.BLACK;
+
+    /**
+     * 导出字段对齐方式
+     */
+    public HorizontalAlignment align() default HorizontalAlignment.CENTER;
+
+    /**
+     * 自定义数据处理器
+     */
+    public Class<?> handler() default ExcelHandlerAdapter.class;
+
+    /**
+     * 自定义数据处理器参数
+     */
+    public String[] args() default {};
+
+    /**
+     * 字段类型(0:导出导入;1:仅导出;2:仅导入)
+     */
+    Type type() default Type.ALL;
+
+    public enum Type
+    {
+        ALL(0), EXPORT(1), IMPORT(2);
+        private final int value;
+
+        Type(int value)
+        {
+            this.value = value;
+        }
+
+        public int value()
+        {
+            return this.value;
+        }
+    }
+
+    public enum ColumnType
+    {
+        NUMERIC(0), STRING(1), IMAGE(2);
+        private final int value;
+
+        ColumnType(int value)
+        {
+            this.value = value;
+        }
+
+        public int value()
+        {
+            return this.value;
+        }
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java
new file mode 100644
index 0000000..38135e7
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java
@@ -0,0 +1,18 @@
+package com.ruoyi.common.core.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Excel注解集
+ * 
+ * @author ruoyi
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Excels
+{
+    Excel[] value();
+}
\ No newline at end of file
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ApproveConfigEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ApproveConfigEnum.java
new file mode 100644
index 0000000..6d079b5
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ApproveConfigEnum.java
@@ -0,0 +1,47 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditStateEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditStateEnum.java
new file mode 100644
index 0000000..9a6f806
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditStateEnum.java
@@ -0,0 +1,48 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditTypeEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditTypeEnum.java
new file mode 100644
index 0000000..242381f
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditTypeEnum.java
@@ -0,0 +1,48 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CarStateEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CarStateEnum.java
new file mode 100644
index 0000000..7c67e22
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CarStateEnum.java
@@ -0,0 +1,50 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DelFlagEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DelFlagEnum.java
new file mode 100644
index 0000000..5d770d3
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DelFlagEnum.java
@@ -0,0 +1,43 @@
+package com.ruoyi.common.core.enums;
+
+import lombok.Getter;
+
+/**
+ * @author xiaochen
+ * @ClassName Disable
+ * @Description
+ * @date 2022-06-08 16:55
+ */
+public enum DelFlagEnum {
+    NO(0, "否"),
+    YES(1, "是");
+
+    @Getter
+    private String desc;
+
+
+    @Getter
+    private int code;
+
+
+    DelFlagEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static DelFlagEnum fromCode(Integer code) {
+        DelFlagEnum[] resultTypes = DelFlagEnum.values();
+        for (DelFlagEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DisabledEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DisabledEnum.java
new file mode 100644
index 0000000..f43f4df
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DisabledEnum.java
@@ -0,0 +1,43 @@
+package com.ruoyi.common.core.enums;
+
+import lombok.Getter;
+
+/**
+ * @author xiaochen
+ * @ClassName Disable
+ * @Description
+ * @date 2022-06-08 16:55
+ */
+public enum DisabledEnum {
+    NO(0, "否"),
+    YES(1, "是");
+
+    @Getter
+    private String desc;
+
+
+    @Getter
+    private int code;
+
+
+    DisabledEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static DisabledEnum fromCode(Integer code) {
+        DisabledEnum[] resultTypes = DisabledEnum.values();
+        for (DisabledEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/HandoverStateEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/HandoverStateEnum.java
new file mode 100644
index 0000000..e8b13fa
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/HandoverStateEnum.java
@@ -0,0 +1,49 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ImportTypeEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ImportTypeEnum.java
new file mode 100644
index 0000000..34f21bc
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ImportTypeEnum.java
@@ -0,0 +1,56 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/InsureTypeEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/InsureTypeEnum.java
new file mode 100644
index 0000000..3900c9d
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/InsureTypeEnum.java
@@ -0,0 +1,49 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnCarTypeEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnCarTypeEnum.java
new file mode 100644
index 0000000..bdce874
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnCarTypeEnum.java
@@ -0,0 +1,46 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnStateEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnStateEnum.java
new file mode 100644
index 0000000..7914cdc
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnStateEnum.java
@@ -0,0 +1,50 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/UserStatus.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/UserStatus.java
new file mode 100644
index 0000000..65a8cd8
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/UserStatus.java
@@ -0,0 +1,30 @@
+package com.ruoyi.common.core.enums;
+
+/**
+ * 用户状态
+ * 
+ * @author ruoyi
+ */
+public enum UserStatus
+{
+    OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除");
+
+    private final String code;
+    private final String info;
+
+    UserStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/WarrantyStateEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/WarrantyStateEnum.java
new file mode 100644
index 0000000..cad7e1b
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/WarrantyStateEnum.java
@@ -0,0 +1,49 @@
+package com.ruoyi.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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AdvertisingStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AdvertisingStatusEnum.java
new file mode 100644
index 0000000..33aa0dd
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AdvertisingStatusEnum.java
@@ -0,0 +1,45 @@
+package com.ruoyi.common.core.enums.status;
+
+import lombok.Getter;
+
+/**
+ * @Description
+ * @Author xiaochen
+ * @Date 2023/6/8 16:42
+ */
+public enum AdvertisingStatusEnum {
+
+
+    NO(0, "否"),
+    YES(1, "是");
+
+    @Getter
+    private String desc;
+
+
+    @Getter
+    private int code;
+
+
+    AdvertisingStatusEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static AdvertisingStatusEnum fromCode(Integer code) {
+        AdvertisingStatusEnum[] resultTypes = AdvertisingStatusEnum.values();
+        for (AdvertisingStatusEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java
new file mode 100644
index 0000000..a9d6f08
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java
@@ -0,0 +1,46 @@
+package com.ruoyi.common.core.enums.status;
+
+import lombok.Getter;
+
+/**
+ * @Description
+ * @Author xiaochen
+ * @Date 2023/6/8 16:42
+ */
+public enum AppUserStatusEnum {
+
+
+    NORMAL(1, "正常"),
+    FREEZE(2, "冻结"),
+    LOGOFF(3, "注销");
+
+    @Getter
+    private String desc;
+
+
+    @Getter
+    private int code;
+
+
+    AppUserStatusEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static AppUserStatusEnum fromCode(Integer code) {
+        AppUserStatusEnum[] resultTypes = AppUserStatusEnum.values();
+        for (AppUserStatusEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunModeEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunModeEnum.java
new file mode 100644
index 0000000..78f4886
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunModeEnum.java
@@ -0,0 +1,46 @@
+package com.ruoyi.common.core.enums.status;
+
+import lombok.Getter;
+
+/**
+ * @Description
+ * @Author xiaochen
+ * @Date 2023/6/8 16:42
+ */
+public enum ChargingGunModeEnum {
+
+
+    SUPER_SUFFICIENT(1, "超级快充"),
+    FAST_SUFFICIENT(2, "快充"),
+    SLOW_SUFFICIENT(3, "慢充");
+
+    @Getter
+    private String desc;
+
+
+    @Getter
+    private int code;
+
+
+    ChargingGunModeEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static ChargingGunModeEnum fromCode(Integer code) {
+        ChargingGunModeEnum[] resultTypes = ChargingGunModeEnum.values();
+        for (ChargingGunModeEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunStatusEnum.java
new file mode 100644
index 0000000..219aea2
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunStatusEnum.java
@@ -0,0 +1,50 @@
+package com.ruoyi.common.core.enums.status;
+
+import lombok.Getter;
+
+/**
+ * @Description
+ * @Author xiaochen
+ * @Date 2023/6/8 16:42
+ */
+public enum ChargingGunStatusEnum {
+
+
+    OFFLINE(1, "离线"),
+    IDLE(2, "空闲"),
+    OCCUPATION_UNCHARGED(3, "占用(未充电)"),
+    OCCUPATION_CHARGING(4, "占用(充电中)"),
+    OCCUPATION_FULL(5, "占用(已充满)"),
+    OCCUPATION_LOCK(6, "占用(预约锁定)"),
+    FAULT(7, "故障");
+
+    @Getter
+    private String desc;
+
+
+    @Getter
+    private int code;
+
+
+    ChargingGunStatusEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static ChargingGunStatusEnum fromCode(Integer code) {
+        ChargingGunStatusEnum[] resultTypes = ChargingGunStatusEnum.values();
+        for (ChargingGunStatusEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/SiteStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/SiteStatusEnum.java
new file mode 100644
index 0000000..5d08b48
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/SiteStatusEnum.java
@@ -0,0 +1,46 @@
+package com.ruoyi.common.core.enums.status;
+
+import lombok.Getter;
+
+/**
+ * @Description
+ * @Author xiaochen
+ * @Date 2023/6/8 16:42
+ */
+public enum SiteStatusEnum {
+
+
+    NORMAL_USE(1, "正常使用"),
+    IN_MAINTENANCE(2, "维修中"),
+    CLOSE_OFFLINE(3, "关闭下线");
+
+    @Getter
+    private String desc;
+
+
+    @Getter
+    private int code;
+
+
+    SiteStatusEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static SiteStatusEnum fromCode(Integer code) {
+        SiteStatusEnum[] resultTypes = SiteStatusEnum.values();
+        for (SiteStatusEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotLoginException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotLoginException.java
new file mode 100644
index 0000000..01e5771
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotLoginException.java
@@ -0,0 +1,16 @@
+package com.ruoyi.common.core.exception.auth;
+
+/**
+ * 未能通过的登录认证异常
+ * 
+ * @author ruoyi
+ */
+public class NotLoginException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public NotLoginException(String message)
+    {
+        super(message);
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotPermissionException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotPermissionException.java
new file mode 100644
index 0000000..6e9d3db
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotPermissionException.java
@@ -0,0 +1,23 @@
+package com.ruoyi.common.core.exception.auth;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 未能通过的权限认证异常
+ * 
+ * @author ruoyi
+ */
+public class NotPermissionException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public NotPermissionException(String permission)
+    {
+        super(permission);
+    }
+
+    public NotPermissionException(String[] permissions)
+    {
+        super(StringUtils.join(permissions, ","));
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/base/BaseException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/base/BaseException.java
new file mode 100644
index 0000000..3d2fa10
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/base/BaseException.java
@@ -0,0 +1,79 @@
+package com.ruoyi.common.core.exception.base;
+
+/**
+ * 基础异常
+ * 
+ * @author ruoyi
+ */
+public class BaseException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 所属模块
+     */
+    private String module;
+
+    /**
+     * 错误码
+     */
+    private String code;
+
+    /**
+     * 错误码对应的参数
+     */
+    private Object[] args;
+
+    /**
+     * 错误消息
+     */
+    private String defaultMessage;
+
+    public BaseException(String module, String code, Object[] args, String defaultMessage)
+    {
+        this.module = module;
+        this.code = code;
+        this.args = args;
+        this.defaultMessage = defaultMessage;
+    }
+
+    public BaseException(String module, String code, Object[] args)
+    {
+        this(module, code, args, null);
+    }
+
+    public BaseException(String module, String defaultMessage)
+    {
+        this(module, null, null, defaultMessage);
+    }
+
+    public BaseException(String code, Object[] args)
+    {
+        this(null, code, args, null);
+    }
+
+    public BaseException(String defaultMessage)
+    {
+        this(null, null, null, defaultMessage);
+    }
+
+    public String getModule()
+    {
+        return module;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public Object[] getArgs()
+    {
+        return args;
+    }
+
+    public String getDefaultMessage()
+    {
+        return defaultMessage;
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileException.java
new file mode 100644
index 0000000..a156b7b
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileException.java
@@ -0,0 +1,19 @@
+package com.ruoyi.common.core.exception.file;
+
+import com.ruoyi.common.core.exception.base.BaseException;
+
+/**
+ * 文件信息异常类
+ * 
+ * @author ruoyi
+ */
+public class FileException extends BaseException
+{
+    private static final long serialVersionUID = 1L;
+
+    public FileException(String code, Object[] args, String msg)
+    {
+        super("file", code, args, msg);
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileNameLengthLimitExceededException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileNameLengthLimitExceededException.java
new file mode 100644
index 0000000..e8a4199
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileNameLengthLimitExceededException.java
@@ -0,0 +1,16 @@
+package com.ruoyi.common.core.exception.file;
+
+/**
+ * 文件名称超长限制异常类
+ * 
+ * @author ruoyi
+ */
+public class FileNameLengthLimitExceededException extends FileException
+{
+    private static final long serialVersionUID = 1L;
+
+    public FileNameLengthLimitExceededException(int defaultFileNameLength)
+    {
+        super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }, "the filename is too long");
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileSizeLimitExceededException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileSizeLimitExceededException.java
new file mode 100644
index 0000000..b592b6f
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileSizeLimitExceededException.java
@@ -0,0 +1,16 @@
+package com.ruoyi.common.core.exception.file;
+
+/**
+ * 文件名大小限制异常类
+ * 
+ * @author ruoyi
+ */
+public class FileSizeLimitExceededException extends FileException
+{
+    private static final long serialVersionUID = 1L;
+
+    public FileSizeLimitExceededException(long defaultMaxSize)
+    {
+        super("upload.exceed.maxSize", new Object[] { defaultMaxSize }, "the filesize is too large");
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileUploadException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileUploadException.java
new file mode 100644
index 0000000..c0f57cb
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileUploadException.java
@@ -0,0 +1,61 @@
+package com.ruoyi.common.core.exception.file;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+/**
+ * 文件上传异常类
+ * 
+ * @author ruoyi
+ */
+public class FileUploadException extends Exception
+{
+
+    private static final long serialVersionUID = 1L;
+
+    private final Throwable cause;
+
+    public FileUploadException()
+    {
+        this(null, null);
+    }
+
+    public FileUploadException(final String msg)
+    {
+        this(msg, null);
+    }
+
+    public FileUploadException(String msg, Throwable cause)
+    {
+        super(msg);
+        this.cause = cause;
+    }
+
+    @Override
+    public void printStackTrace(PrintStream stream)
+    {
+        super.printStackTrace(stream);
+        if (cause != null)
+        {
+            stream.println("Caused by:");
+            cause.printStackTrace(stream);
+        }
+    }
+
+    @Override
+    public void printStackTrace(PrintWriter writer)
+    {
+        super.printStackTrace(writer);
+        if (cause != null)
+        {
+            writer.println("Caused by:");
+            cause.printStackTrace(writer);
+        }
+    }
+
+    @Override
+    public Throwable getCause()
+    {
+        return cause;
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/InvalidExtensionException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/InvalidExtensionException.java
new file mode 100644
index 0000000..2a0b906
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/InvalidExtensionException.java
@@ -0,0 +1,80 @@
+package com.ruoyi.common.core.exception.file;
+
+import java.util.Arrays;
+
+/**
+ * 文件上传 误异常类
+ * 
+ * @author ruoyi
+ */
+public class InvalidExtensionException extends FileUploadException
+{
+    private static final long serialVersionUID = 1L;
+
+    private String[] allowedExtension;
+    private String extension;
+    private String filename;
+
+    public InvalidExtensionException(String[] allowedExtension, String extension, String filename)
+    {
+        super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]");
+        this.allowedExtension = allowedExtension;
+        this.extension = extension;
+        this.filename = filename;
+    }
+
+    public String[] getAllowedExtension()
+    {
+        return allowedExtension;
+    }
+
+    public String getExtension()
+    {
+        return extension;
+    }
+
+    public String getFilename()
+    {
+        return filename;
+    }
+
+    public static class InvalidImageExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+    public static class InvalidFlashExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+    public static class InvalidMediaExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+    
+    public static class InvalidVideoExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/CaptchaExpireException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/CaptchaExpireException.java
new file mode 100644
index 0000000..ec68864
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/CaptchaExpireException.java
@@ -0,0 +1,16 @@
+package com.ruoyi.common.core.exception.user;
+
+/**
+ * 验证码失效异常类
+ * 
+ * @author ruoyi
+ */
+public class CaptchaExpireException extends UserException
+{
+    private static final long serialVersionUID = 1L;
+
+    public CaptchaExpireException()
+    {
+        super("user.jcaptcha.expire", null);
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserAppletException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserAppletException.java
new file mode 100644
index 0000000..b8da2e9
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserAppletException.java
@@ -0,0 +1,48 @@
+package com.ruoyi.common.core.exception.user;
+
+/**
+ * 学生端登录异常信息
+ *
+ * @author HJL
+ * @version 1.0
+ * @since 2024-05-24 11:35
+ */
+public class UserAppletException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误提示
+     */
+    private String message;
+
+    /**
+     * 错误码
+     */
+    private int code;
+
+    public UserAppletException() {
+    }
+
+    public UserAppletException(String message, Integer code) {
+        this.message = message;
+        this.code = code;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserException.java
new file mode 100644
index 0000000..8ae8ea3
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserException.java
@@ -0,0 +1,18 @@
+package com.ruoyi.common.core.exception.user;
+
+import com.ruoyi.common.core.exception.base.BaseException;
+
+/**
+ * 用户信息异常类
+ * 
+ * @author ruoyi
+ */
+public class UserException extends BaseException
+{
+    private static final long serialVersionUID = 1L;
+
+    public UserException(String code, Object[] args)
+    {
+        super("user", code, args, null);
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserPasswordNotMatchException.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserPasswordNotMatchException.java
new file mode 100644
index 0000000..2e1a6b1
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserPasswordNotMatchException.java
@@ -0,0 +1,16 @@
+package com.ruoyi.common.core.exception.user;
+
+/**
+ * 用户密码不正确或不符合规范异常类
+ * 
+ * @author ruoyi
+ */
+public class UserPasswordNotMatchException extends UserException
+{
+    private static final long serialVersionUID = 1L;
+
+    public UserPasswordNotMatchException()
+    {
+        super("user.password.not.match", null);
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/query/TimeRangePageQuery.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/query/TimeRangePageQuery.java
new file mode 100644
index 0000000..4199627
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/query/TimeRangePageQuery.java
@@ -0,0 +1,52 @@
+package com.ruoyi.common.core.query;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.web.page.BasePage;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author xiaochen
+ * @ClassName TimeRangePageDTO
+ * @Description
+ * @date 2023-06-4 14:42
+ */
+@ApiModel("时间范围分页dto")
+public class TimeRangePageQuery extends BasePage {
+    @ApiModelProperty("开始时间 格式 yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间 格式 yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endTime;
+
+    public String getStartTime() {
+        if (Objects.nonNull(startTime)) {
+            return new SimpleDateFormat("yyyy-MM-dd").format(startTime) + " 00:00:00";
+        }
+        return null;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        if (Objects.nonNull(endTime)) {
+            return new SimpleDateFormat("yyyy-MM-dd").format(endTime) + " 23:59:59";
+        }
+        return null;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/CodeGenerateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/CodeGenerateUtils.java
new file mode 100644
index 0000000..32309d1
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/CodeGenerateUtils.java
@@ -0,0 +1,106 @@
+package com.ruoyi.common.core.utils;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+
+/**
+ * @Description 活动订单操作
+ * @Author xiaochen
+ * @Date 2021/7/28 10:26
+ */
+public class CodeGenerateUtils {
+
+    /**
+     * @return
+     * @Description 获取商品编码
+     * 商品编码规则:nanoTime(后5位)*5位随机数(10000~99999)
+     * @Author xiaochen
+     */
+    public static String generateProductCode() {
+        long nanoPart = System.nanoTime() % 100000L;
+        if (nanoPart < 10000L) {
+            nanoPart += 10000L;
+        }
+        long randomPart = (long) (Math.random() * (90000) + 10000);
+        String code = "0" + String.valueOf((new BigDecimal(nanoPart).multiply(new BigDecimal(randomPart))));
+        return code.substring(code.length() - 10);
+    }
+
+    /**
+     * @param id: 用户id
+     * @return
+     * @Description 生成订单编号
+     * 订单编号规则:(10位):(年末尾*月,取后2位)+(用户ID%3.33*日取整后2位)+(timestamp*10000以内随机数,取后6位)
+     * @Author xiaochen
+     */
+    public static String generateOrderSn(long id) {
+        Calendar calendar = Calendar.getInstance();
+        int year = calendar.get(Calendar.YEAR);
+        year = year % 10;
+        if (year == 0) year = 10;
+        int month = calendar.get(Calendar.MONTH) + 1;
+        int yearMonth = year * month;
+        String yearMonthPart = "0" + yearMonth;
+        yearMonthPart = yearMonthPart.substring(yearMonthPart.length() - 2);
+
+        int day = calendar.get(Calendar.DAY_OF_MONTH);
+        int dayNum = (int) ((id % 3.33) * day);
+        String dayPart = "0" + dayNum;
+        dayPart = dayPart.substring(dayPart.length() - 2);
+
+        String timestampPart = "" + (Math.random() * 10000) * (System.currentTimeMillis() / 10000);
+        timestampPart = timestampPart.replace(".", "").replace("E", "");
+        timestampPart = timestampPart.substring(0, 6);
+        return yearMonthPart + dayPart + timestampPart;
+    }
+
+    /**
+     * @return
+     * @Description 生成统一支付单号  规则:年(2)月(2)日(2)时(2)分(2)+timestamp*5位随机整数取后5位
+     * @Author xiaochen
+     */
+    public static String generateVolumeSn() {
+        Calendar calendar = Calendar.getInstance();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmss");
+        String dateTime = dateFormat.format(calendar.getTime());
+        dateTime = dateTime.substring(2);
+        String timestampPart = "" + (Math.random() * 10000) * (System.currentTimeMillis() / 10000);
+        timestampPart = timestampPart.replace(".", "").replace("E", "");
+        timestampPart = timestampPart.substring(0, 5);
+        return dateTime + timestampPart;
+    }
+
+    public static void main(String[] args) {
+        for (long i = 0; i < 20; i++) {
+            //String timestampPart = ""+(Math.random() * 10000) * (System.currentTimeMillis()/10000);
+            //System.out.println(timestampPart);
+            //System.out.println(generateOrderSn(i));
+            long l = System.currentTimeMillis() * Long.valueOf(CodeGenerateUtils.generateProductCode().substring(0, 5));
+            System.out.println(String.valueOf(l).substring(0,10));
+        }
+
+    }
+
+    /**
+     * @description  id补0生成编号
+     * @author  jqs
+     * @date    2024/4/17 14:19
+     * @param totalLength
+     * @param id
+     * @return  String
+     */
+    public static String toFillZeroCode(int totalLength, Long id) {
+        String idStr = id.toString();
+        int length = idStr.length();
+        if(totalLength <= length){
+            return idStr;
+        }
+        int fillLength = totalLength - length;
+        StringBuilder idsbs = new StringBuilder();
+        for (int i = 0; i < fillLength; i++) {
+            idsbs.append("0");
+        }
+        return idsbs.append(idStr).toString();
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExceptionUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExceptionUtil.java
new file mode 100644
index 0000000..12f6c72
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExceptionUtil.java
@@ -0,0 +1,39 @@
+package com.ruoyi.common.core.utils;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+
+/**
+ * 错误信息处理类。
+ *
+ * @author ruoyi
+ */
+public class ExceptionUtil
+{
+    /**
+     * 获取exception的详细错误信息。
+     */
+    public static String getExceptionMessage(Throwable e)
+    {
+        StringWriter sw = new StringWriter();
+        e.printStackTrace(new PrintWriter(sw, true));
+        return sw.toString();
+    }
+
+    public static String getRootErrorMessage(Exception e)
+    {
+        Throwable root = ExceptionUtils.getRootCause(e);
+        root = (root == null ? e : root);
+        if (root == null)
+        {
+            return "";
+        }
+        String msg = root.getMessage();
+        if (msg == null)
+        {
+            return "null";
+        }
+        return StringUtils.defaultString(msg);
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java
new file mode 100644
index 0000000..14c12e1
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java
@@ -0,0 +1,197 @@
+package com.ruoyi.common.core.utils;
+
+import com.alibaba.fastjson2.JSON;
+import com.ruoyi.common.core.constant.MsgConstants;
+import com.ruoyi.common.core.utils.req.SubmitTempletReq;
+import org.apache.commons.codec.binary.Base64;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+public class MsgUtil {
+
+    public final static String ecName= "四川明星新能源科技有限公司";
+    public final static String secretKey= "MX_xny2023?9";
+    public final static String sign= "1PUAVuY2b";
+
+
+
+    /**
+     * 更换手机号:【签名】验证码:XXX,用于更换手机号。请勿转发。
+     * @param phone 手机号
+     * @param code 验证码
+     * @return
+     */
+    public static String codeMsg(String phone,String code){
+        SubmitTempletReq submitReq = new SubmitTempletReq();
+        String[] paramss = {code};
+        submitReq.setApId(MsgConstants.CODE_AP_ID);
+        submitReq.setEcName(ecName);
+        submitReq.setSecretKey(secretKey);
+        submitReq.setParams(JSON.toJSONString(paramss));
+        submitReq.setMobiles(phone);
+        submitReq.setAddSerial("");
+        submitReq.setSign(sign);
+        submitReq.setTemplateId(MsgConstants.CODE_TEMPLATE_ID);
+        StringBuffer stringBuffer = new StringBuffer();
+        stringBuffer.append(submitReq.getEcName());
+        stringBuffer.append(submitReq.getApId());
+        stringBuffer.append(submitReq.getSecretKey());
+        stringBuffer.append(submitReq.getTemplateId());
+        stringBuffer.append(submitReq.getMobiles());
+        stringBuffer.append(submitReq.getParams());
+        stringBuffer.append(submitReq.getSign());
+        stringBuffer.append(submitReq.getAddSerial());
+        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
+        String reqText = JSON.toJSONString(submitReq);
+        //加密
+        String encode = Base64.encodeBase64String(reqText.getBytes());
+        System.err.println(encode);
+        return encode;
+    }
+
+    /**
+     * 更换手机号:【签名】验证码:XXX,用于更换手机号。请勿转发。
+     * @param phone 手机号
+     * @param code 验证码
+     * @return
+     */
+    public static String applyCodeMsg(String phone,String code){
+        SubmitTempletReq submitReq = new SubmitTempletReq();
+        String[] paramss = {code};
+        submitReq.setApId(MsgConstants.APPLY_AP_ID);
+        submitReq.setEcName(ecName);
+        submitReq.setSecretKey(secretKey);
+        submitReq.setParams(JSON.toJSONString(paramss));
+        submitReq.setMobiles(phone);
+        submitReq.setAddSerial("");
+        submitReq.setSign(sign);
+        submitReq.setTemplateId(MsgConstants.APPLY_TEMPLATE_ID);
+        StringBuffer stringBuffer = new StringBuffer();
+        stringBuffer.append(submitReq.getEcName());
+        stringBuffer.append(submitReq.getApId());
+        stringBuffer.append(submitReq.getSecretKey());
+        stringBuffer.append(submitReq.getTemplateId());
+        stringBuffer.append(submitReq.getMobiles());
+        stringBuffer.append(submitReq.getParams());
+        stringBuffer.append(submitReq.getSign());
+        stringBuffer.append(submitReq.getAddSerial());
+        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
+        String reqText = JSON.toJSONString(submitReq);
+        //加密
+        String encode = Base64.encodeBase64String(reqText.getBytes());
+        System.err.println(encode);
+        return encode;
+    }
+
+
+    /**
+     * 停车占位提醒:车辆已在3小时前完成充电,请及时取车,避免长时间占用充电资源。
+     * @param phone 手机号
+     * @return
+     */
+    public static String stopMsg(String phone){
+        SubmitTempletReq submitReq = new SubmitTempletReq();
+        submitReq.setTemplateId(MsgConstants.STOP_TEMPLATE_ID);
+        submitReq.setApId(MsgConstants.STOP_AP_ID);
+        submitReq.setEcName(ecName);
+        submitReq.setSecretKey(secretKey);
+        submitReq.setMobiles(phone);
+        submitReq.setAddSerial("");
+        submitReq.setSign(sign);
+        StringBuffer stringBuffer = new StringBuffer();
+        stringBuffer.append(submitReq.getEcName());
+        stringBuffer.append(submitReq.getApId());
+        stringBuffer.append(submitReq.getSecretKey());
+        stringBuffer.append(submitReq.getTemplateId());
+        stringBuffer.append(submitReq.getMobiles());
+        stringBuffer.append(submitReq.getParams());
+        stringBuffer.append(submitReq.getSign());
+        stringBuffer.append(submitReq.getAddSerial());
+        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
+        String reqText = JSON.toJSONString(submitReq);
+        //加密
+        String encode = Base64.encodeBase64String(reqText.getBytes());
+        System.err.println(encode);
+        return encode;
+    }
+
+    /**
+     * 充电结束:车辆充电结束,请及时取车。
+     * @param phone 手机号
+     * @return
+     */
+    public static String chargeStopMsg(String phone){
+        SubmitTempletReq submitReq = new SubmitTempletReq();
+        submitReq.setTemplateId(MsgConstants.CHARGE_TEMPLATE_ID);
+        submitReq.setApId(MsgConstants.CHARGE_AP_ID);
+        submitReq.setEcName(ecName);
+        submitReq.setSecretKey(secretKey);
+        submitReq.setMobiles(phone);
+        submitReq.setAddSerial("");
+        submitReq.setSign(sign);
+        StringBuffer stringBuffer = new StringBuffer();
+        stringBuffer.append(submitReq.getEcName());
+        stringBuffer.append(submitReq.getApId());
+        stringBuffer.append(submitReq.getSecretKey());
+        stringBuffer.append(submitReq.getTemplateId());
+        stringBuffer.append(submitReq.getMobiles());
+        stringBuffer.append(submitReq.getParams());
+        stringBuffer.append(submitReq.getSign());
+        stringBuffer.append(submitReq.getAddSerial());
+        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
+        String reqText = JSON.toJSONString(submitReq);
+        //加密
+        String encode = Base64.encodeBase64String(reqText.getBytes());
+        System.err.println(encode);
+        return encode;
+    }
+
+    /**  phone  单词可拼接5000个号码
+     * 桩故障(自动/手动):检测到【电站1】【编号】号桩设备离线,请及时查看处理!
+     * @param phone 手机号
+     * @param site 站点名称
+     * @param chargeGun 桩编号
+     * @return
+     */
+    public static String faultMsg(String phone,String site,String chargeGun){
+        SubmitTempletReq submitReq = new SubmitTempletReq();
+        if(site.length()<=10){
+            String[] paramss = {site,chargeGun};
+            submitReq.setParams(JSON.toJSONString(paramss));
+        }else{
+            String work1 = site.substring(0,10);
+            String[] paramss = {work1,chargeGun};
+            submitReq.setParams(JSON.toJSONString(paramss));
+        }
+        submitReq.setTemplateId(MsgConstants.FAULT_TEMPLATE_ID);
+        submitReq.setApId(MsgConstants.FAULT_AP_ID);
+        submitReq.setEcName(ecName);
+        submitReq.setSecretKey(secretKey);
+        submitReq.setMobiles(phone);
+        submitReq.setAddSerial("");
+        submitReq.setSign(sign);
+        StringBuffer stringBuffer = new StringBuffer();
+        stringBuffer.append(submitReq.getEcName());
+        stringBuffer.append(submitReq.getApId());
+        stringBuffer.append(submitReq.getSecretKey());
+        stringBuffer.append(submitReq.getTemplateId());
+        stringBuffer.append(submitReq.getMobiles());
+        stringBuffer.append(submitReq.getParams());
+        stringBuffer.append(submitReq.getSign());
+        stringBuffer.append(submitReq.getAddSerial());
+        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
+        String reqText = JSON.toJSONString(submitReq);
+        //加密
+        String encode = Base64.encodeBase64String(reqText.getBytes());
+        System.err.println(encode);
+        return encode;
+    }
+    /**
+     * 生成验证码
+     * @return
+     */
+    public static String createCode(){
+        return String.valueOf(ThreadLocalRandom.current().nextInt(100000, 999999));
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ObsUploadUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ObsUploadUtil.java
new file mode 100644
index 0000000..f5239c8
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ObsUploadUtil.java
@@ -0,0 +1,78 @@
+package com.ruoyi.common.core.utils;
+
+import com.obs.services.ObsClient;
+import com.obs.services.model.ObjectMetadata;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+
+public class ObsUploadUtil {
+
+	public static String endPoint = "obs.cn-southwest-2.myhuaweicloud.com";
+	public static String accessKeyId = "LP9N1TLAYN8ERS1PVIYK";
+	public static String accessKeySecret = "bV55lFHi1cG0SYBvnab8yIgDX6etKRSLh5j1gkPR";
+	public static String bucketName = "haitunyingyu";
+	public static String oss_domain = "https://haitunyingyu.obs.cn-southwest-2.myhuaweicloud.com/";
+	// 创建ObsClient实例
+	public static ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endPoint);
+
+	public static String obsUpload(MultipartFile file) throws IOException{
+		//CommonsMultipartFile file = (CommonsMultipartFile)multipartFile;
+		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();
+			if (originalFilename.contains("apk")){
+				fileName = "bf2fe5c5499341e5bc0d56c0c7d5fb2e.apk";
+				System.err.println("apk");
+			}else{
+				fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
+			}
+			obsClient.putObject(bucketName,"admin/"+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+"web","");
+			// 删除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/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java
new file mode 100644
index 0000000..2d0ec81
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java
@@ -0,0 +1,561 @@
+package com.ruoyi.common.core.utils;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import org.springframework.util.AntPathMatcher;
+import com.ruoyi.common.core.constant.Constants;
+import com.ruoyi.common.core.text.StrFormatter;
+
+/**
+ * 字符串工具类
+ * 
+ * @author ruoyi
+ */
+public class StringUtils extends org.apache.commons.lang3.StringUtils
+{
+    /** 空字符串 */
+    private static final String NULLSTR = "";
+
+    /** 下划线 */
+    private static final char SEPARATOR = '_';
+
+    /**
+     * 获取参数不为空值
+     * 
+     * @param value defaultValue 要判断的value
+     * @return value 返回值
+     */
+    public static <T> T nvl(T value, T defaultValue)
+    {
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * * 判断一个Collection是否为空, 包含List,Set,Queue
+     * 
+     * @param coll 要判断的Collection
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Collection<?> coll)
+    {
+        return isNull(coll) || coll.isEmpty();
+    }
+
+    /**
+     * * 判断一个Collection是否非空,包含List,Set,Queue
+     * 
+     * @param coll 要判断的Collection
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Collection<?> coll)
+    {
+        return !isEmpty(coll);
+    }
+
+    /**
+     * * 判断一个对象数组是否为空
+     * 
+     * @param objects 要判断的对象数组
+     ** @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Object[] objects)
+    {
+        return isNull(objects) || (objects.length == 0);
+    }
+
+    /**
+     * * 判断一个对象数组是否非空
+     * 
+     * @param objects 要判断的对象数组
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Object[] objects)
+    {
+        return !isEmpty(objects);
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     * 
+     * @param map 要判断的Map
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Map<?, ?> map)
+    {
+        return isNull(map) || map.isEmpty();
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     * 
+     * @param map 要判断的Map
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Map<?, ?> map)
+    {
+        return !isEmpty(map);
+    }
+
+    /**
+     * * 判断一个字符串是否为空串
+     * 
+     * @param str String
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(String str)
+    {
+        return isNull(str) || NULLSTR.equals(str.trim());
+    }
+
+    /**
+     * * 判断一个字符串是否为非空串
+     * 
+     * @param str String
+     * @return true:非空串 false:空串
+     */
+    public static boolean isNotEmpty(String str)
+    {
+        return !isEmpty(str);
+    }
+
+    /**
+     * * 判断一个对象是否为空
+     * 
+     * @param object Object
+     * @return true:为空 false:非空
+     */
+    public static boolean isNull(Object object)
+    {
+        return object == null;
+    }
+
+    /**
+     * * 判断一个对象是否非空
+     * 
+     * @param object Object
+     * @return true:非空 false:空
+     */
+    public static boolean isNotNull(Object object)
+    {
+        return !isNull(object);
+    }
+
+    /**
+     * * 判断一个对象是否是数组类型(Java基本型别的数组)
+     * 
+     * @param object 对象
+     * @return true:是数组 false:不是数组
+     */
+    public static boolean isArray(Object object)
+    {
+        return isNotNull(object) && object.getClass().isArray();
+    }
+
+    /**
+     * 去空格
+     */
+    public static String trim(String str)
+    {
+        return (str == null ? "" : str.trim());
+    }
+
+    /**
+     * 截取字符串
+     * 
+     * @param str 字符串
+     * @param start 开始
+     * @return 结果
+     */
+    public static String substring(final String str, int start)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (start > str.length())
+        {
+            return NULLSTR;
+        }
+
+        return str.substring(start);
+    }
+
+    /**
+     * 截取字符串
+     * 
+     * @param str 字符串
+     * @param start 开始
+     * @param end 结束
+     * @return 结果
+     */
+    public static String substring(final String str, int start, int end)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (end < 0)
+        {
+            end = str.length() + end;
+        }
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (end > str.length())
+        {
+            end = str.length();
+        }
+
+        if (start > end)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (end < 0)
+        {
+            end = 0;
+        }
+
+        return str.substring(start, end);
+    }
+
+    /**
+     * 判断是否为空,并且不是空白字符
+     * 
+     * @param str 要判断的value
+     * @return 结果
+     */
+    public static boolean hasText(String str)
+    {
+        return (str != null && !str.isEmpty() && containsText(str));
+    }
+
+    private static boolean containsText(CharSequence str)
+    {
+        int strLen = str.length();
+        for (int i = 0; i < strLen; i++)
+        {
+            if (!Character.isWhitespace(str.charAt(i)))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 格式化文本, {} 表示占位符<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     * 
+     * @param template 文本模板,被替换的部分用 {} 表示
+     * @param params 参数值
+     * @return 格式化后的文本
+     */
+    public static String format(String template, Object... params)
+    {
+        if (isEmpty(params) || isEmpty(template))
+        {
+            return template;
+        }
+        return StrFormatter.format(template, params);
+    }
+
+    /**
+     * 是否为http(s)://开头
+     * 
+     * @param link 链接
+     * @return 结果
+     */
+    public static boolean ishttp(String link)
+    {
+        return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS);
+    }
+
+    /**
+     * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value
+     *
+     * @param collection 给定的集合
+     * @param array 给定的数组
+     * @return boolean 结果
+     */
+    public static boolean containsAny(Collection<String> collection, String... array)
+    {
+        if (isEmpty(collection) || isEmpty(array))
+        {
+            return false;
+        }
+        else
+        {
+            for (String str : array)
+            {
+                if (collection.contains(str))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    /**
+     * 驼峰转下划线命名
+     */
+    public static String toUnderScoreCase(String str)
+    {
+        if (str == null)
+        {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        // 前置字符是否大写
+        boolean preCharIsUpperCase = true;
+        // 当前字符是否大写
+        boolean curreCharIsUpperCase = true;
+        // 下一字符是否大写
+        boolean nexteCharIsUpperCase = true;
+        for (int i = 0; i < str.length(); i++)
+        {
+            char c = str.charAt(i);
+            if (i > 0)
+            {
+                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
+            }
+            else
+            {
+                preCharIsUpperCase = false;
+            }
+
+            curreCharIsUpperCase = Character.isUpperCase(c);
+
+            if (i < (str.length() - 1))
+            {
+                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
+            }
+
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 是否包含字符串
+     * 
+     * @param str 验证字符串
+     * @param strs 字符串组
+     * @return 包含返回true
+     */
+    public static boolean inStringIgnoreCase(String str, String... strs)
+    {
+        if (str != null && strs != null)
+        {
+            for (String s : strs)
+            {
+                if (str.equalsIgnoreCase(trim(s)))
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
+     * 
+     * @param name 转换前的下划线大写方式命名的字符串
+     * @return 转换后的驼峰式命名的字符串
+     */
+    public static String convertToCamelCase(String name)
+    {
+        StringBuilder result = new StringBuilder();
+        // 快速检查
+        if (name == null || name.isEmpty())
+        {
+            // 没必要转换
+            return "";
+        }
+        else if (!name.contains("_"))
+        {
+            // 不含下划线,仅将首字母大写
+            return name.substring(0, 1).toUpperCase() + name.substring(1);
+        }
+        // 用下划线将原始字符串分割
+        String[] camels = name.split("_");
+        for (String camel : camels)
+        {
+            // 跳过原始字符串中开头、结尾的下换线或双重下划线
+            if (camel.isEmpty())
+            {
+                continue;
+            }
+            // 首字母大写
+            result.append(camel.substring(0, 1).toUpperCase());
+            result.append(camel.substring(1).toLowerCase());
+        }
+        return result.toString();
+    }
+
+    /**
+     * 驼峰式命名法
+     * 例如:user_name->userName
+     */
+    public static String toCamelCase(String s)
+    {
+        if (s == null)
+        {
+            return null;
+        }
+        if (s.indexOf(SEPARATOR) == -1)
+        {
+            return s;
+        }
+        s = s.toLowerCase();
+        StringBuilder sb = new StringBuilder(s.length());
+        boolean upperCase = false;
+        for (int i = 0; i < s.length(); i++)
+        {
+            char c = s.charAt(i);
+
+            if (c == SEPARATOR)
+            {
+                upperCase = true;
+            }
+            else if (upperCase)
+            {
+                sb.append(Character.toUpperCase(c));
+                upperCase = false;
+            }
+            else
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
+     * 
+     * @param str 指定字符串
+     * @param strs 需要检查的字符串数组
+     * @return 是否匹配
+     */
+    public static boolean matches(String str, List<String> strs)
+    {
+        if (isEmpty(str) || isEmpty(strs))
+        {
+            return false;
+        }
+        for (String pattern : strs)
+        {
+            if (isMatch(pattern, str))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 判断url是否与规则配置: 
+     * ? 表示单个字符; 
+     * * 表示一层路径内的任意字符串,不可跨层级; 
+     * ** 表示任意层路径;
+     * 
+     * @param pattern 匹配规则
+     * @param url 需要匹配的url
+     * @return
+     */
+    public static boolean isMatch(String pattern, String url)
+    {
+        AntPathMatcher matcher = new AntPathMatcher();
+        return matcher.match(pattern, url);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T cast(Object obj)
+    {
+        return (T) obj;
+    }
+
+    /**
+     * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。
+     * 
+     * @param num 数字对象
+     * @param size 字符串指定长度
+     * @return 返回数字的字符串格式,该字符串为指定长度。
+     */
+    public static final String padl(final Number num, final int size)
+    {
+        return padl(num.toString(), size, '0');
+    }
+
+    /**
+     * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。
+     * 
+     * @param s 原始字符串
+     * @param size 字符串指定长度
+     * @param c 用于补齐的字符
+     * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。
+     */
+    public static final String padl(final String s, final int size, final char c)
+    {
+        final StringBuilder sb = new StringBuilder(size);
+        if (s != null)
+        {
+            final int len = s.length();
+            if (s.length() <= size)
+            {
+                for (int i = size - len; i > 0; i--)
+                {
+                    sb.append(c);
+                }
+                sb.append(s);
+            }
+            else
+            {
+                return s.substring(len - size, len);
+            }
+        }
+        else
+        {
+            for (int i = size; i > 0; i--)
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java
new file mode 100644
index 0000000..cf5108b
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java
@@ -0,0 +1,382 @@
+package com.ruoyi.common.core.utils.ip;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import javax.servlet.http.HttpServletRequest;
+import com.ruoyi.common.core.utils.ServletUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+
+/**
+ * 获取IP方法
+ * 
+ * @author ruoyi
+ */
+public class IpUtils
+{
+    public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
+    // 匹配 ip
+    public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")";
+    public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))";
+    // 匹配网段
+    public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")";
+
+    /**
+     * 获取客户端IP
+     * 
+     * @return IP地址
+     */
+    public static String getIpAddr()
+    {
+        return getIpAddr(ServletUtils.getRequest());
+    }
+
+    /**
+     * 获取客户端IP
+     * 
+     * @param request 请求对象
+     * @return IP地址
+     */
+    public static String getIpAddr(HttpServletRequest request)
+    {
+        if (request == null)
+        {
+            return "unknown";
+        }
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getHeader("X-Forwarded-For");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getHeader("X-Real-IP");
+        }
+
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getRemoteAddr();
+        }
+
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
+    }
+
+    /**
+     * 检查是否为内部IP地址
+     * 
+     * @param ip IP地址
+     * @return 结果
+     */
+    public static boolean internalIp(String ip)
+    {
+        byte[] addr = textToNumericFormatV4(ip);
+        return internalIp(addr) || "127.0.0.1".equals(ip);
+    }
+
+    /**
+     * 检查是否为内部IP地址
+     * 
+     * @param addr byte地址
+     * @return 结果
+     */
+    private static boolean internalIp(byte[] addr)
+    {
+        if (StringUtils.isNull(addr) || addr.length < 2)
+        {
+            return true;
+        }
+        final byte b0 = addr[0];
+        final byte b1 = addr[1];
+        // 10.x.x.x/8
+        final byte SECTION_1 = 0x0A;
+        // 172.16.x.x/12
+        final byte SECTION_2 = (byte) 0xAC;
+        final byte SECTION_3 = (byte) 0x10;
+        final byte SECTION_4 = (byte) 0x1F;
+        // 192.168.x.x/16
+        final byte SECTION_5 = (byte) 0xC0;
+        final byte SECTION_6 = (byte) 0xA8;
+        switch (b0)
+        {
+            case SECTION_1:
+                return true;
+            case SECTION_2:
+                if (b1 >= SECTION_3 && b1 <= SECTION_4)
+                {
+                    return true;
+                }
+            case SECTION_5:
+                switch (b1)
+                {
+                    case SECTION_6:
+                        return true;
+                }
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * 将IPv4地址转换成字节
+     * 
+     * @param text IPv4地址
+     * @return byte 字节
+     */
+    public static byte[] textToNumericFormatV4(String text)
+    {
+        if (text.length() == 0)
+        {
+            return null;
+        }
+
+        byte[] bytes = new byte[4];
+        String[] elements = text.split("\\.", -1);
+        try
+        {
+            long l;
+            int i;
+            switch (elements.length)
+            {
+                case 1:
+                    l = Long.parseLong(elements[0]);
+                    if ((l < 0L) || (l > 4294967295L))
+                    {
+                        return null;
+                    }
+                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
+                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
+                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 2:
+                    l = Integer.parseInt(elements[0]);
+                    if ((l < 0L) || (l > 255L))
+                    {
+                        return null;
+                    }
+                    bytes[0] = (byte) (int) (l & 0xFF);
+                    l = Integer.parseInt(elements[1]);
+                    if ((l < 0L) || (l > 16777215L))
+                    {
+                        return null;
+                    }
+                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
+                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 3:
+                    for (i = 0; i < 2; ++i)
+                    {
+                        l = Integer.parseInt(elements[i]);
+                        if ((l < 0L) || (l > 255L))
+                        {
+                            return null;
+                        }
+                        bytes[i] = (byte) (int) (l & 0xFF);
+                    }
+                    l = Integer.parseInt(elements[2]);
+                    if ((l < 0L) || (l > 65535L))
+                    {
+                        return null;
+                    }
+                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 4:
+                    for (i = 0; i < 4; ++i)
+                    {
+                        l = Integer.parseInt(elements[i]);
+                        if ((l < 0L) || (l > 255L))
+                        {
+                            return null;
+                        }
+                        bytes[i] = (byte) (int) (l & 0xFF);
+                    }
+                    break;
+                default:
+                    return null;
+            }
+        }
+        catch (NumberFormatException e)
+        {
+            return null;
+        }
+        return bytes;
+    }
+
+    /**
+     * 获取IP地址
+     * 
+     * @return 本地IP地址
+     */
+    public static String getHostIp()
+    {
+        try
+        {
+            return InetAddress.getLocalHost().getHostAddress();
+        }
+        catch (UnknownHostException e)
+        {
+        }
+        return "127.0.0.1";
+    }
+
+    /**
+     * 获取主机名
+     * 
+     * @return 本地主机名
+     */
+    public static String getHostName()
+    {
+        try
+        {
+            return InetAddress.getLocalHost().getHostName();
+        }
+        catch (UnknownHostException e)
+        {
+        }
+        return "未知";
+    }
+
+    /**
+     * 从多级反向代理中获得第一个非unknown IP地址
+     *
+     * @param ip 获得的IP地址
+     * @return 第一个非unknown IP地址
+     */
+    public static String getMultistageReverseProxyIp(String ip)
+    {
+        // 多级反向代理检测
+        if (ip != null && ip.indexOf(",") > 0)
+        {
+            final String[] ips = ip.trim().split(",");
+            for (String subIp : ips)
+            {
+                if (false == isUnknown(subIp))
+                {
+                    ip = subIp;
+                    break;
+                }
+            }
+        }
+        return StringUtils.substring(ip, 0, 255);
+    }
+
+    /**
+     * 检测给定字符串是否为未知,多用于检测HTTP请求相关
+     *
+     * @param checkString 被检测的字符串
+     * @return 是否未知
+     */
+    public static boolean isUnknown(String checkString)
+    {
+        return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
+    }
+
+    /**
+     * 是否为IP
+     */
+    public static boolean isIP(String ip)
+    {
+        return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP);
+    }
+
+    /**
+     * 是否为IP,或 *为间隔的通配符地址
+     */
+    public static boolean isIpWildCard(String ip)
+    {
+        return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD);
+    }
+
+    /**
+     * 检测参数是否在ip通配符里
+     */
+    public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip)
+    {
+        String[] s1 = ipWildCard.split("\\.");
+        String[] s2 = ip.split("\\.");
+        boolean isMatchedSeg = true;
+        for (int i = 0; i < s1.length && !s1[i].equals("*"); i++)
+        {
+            if (!s1[i].equals(s2[i]))
+            {
+                isMatchedSeg = false;
+                break;
+            }
+        }
+        return isMatchedSeg;
+    }
+
+    /**
+     * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串
+     */
+    public static boolean isIPSegment(String ipSeg)
+    {
+        return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG);
+    }
+
+    /**
+     * 判断ip是否在指定网段中
+     */
+    public static boolean ipIsInNetNoCheck(String iparea, String ip)
+    {
+        int idx = iparea.indexOf('-');
+        String[] sips = iparea.substring(0, idx).split("\\.");
+        String[] sipe = iparea.substring(idx + 1).split("\\.");
+        String[] sipt = ip.split("\\.");
+        long ips = 0L, ipe = 0L, ipt = 0L;
+        for (int i = 0; i < 4; ++i)
+        {
+            ips = ips << 8 | Integer.parseInt(sips[i]);
+            ipe = ipe << 8 | Integer.parseInt(sipe[i]);
+            ipt = ipt << 8 | Integer.parseInt(sipt[i]);
+        }
+        if (ips > ipe)
+        {
+            long t = ips;
+            ips = ipe;
+            ipe = t;
+        }
+        return ips <= ipt && ipt <= ipe;
+    }
+
+    /**
+     * 校验ip是否符合过滤串规则
+     * 
+     * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99`
+     * @param ip 校验IP地址
+     * @return boolean 结果
+     */
+    public static boolean isMatchedIp(String filter, String ip)
+    {
+        if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip))
+        {
+            return false;
+        }
+        String[] ips = filter.split(";");
+        for (String iStr : ips)
+        {
+            if (isIP(iStr) && iStr.equals(ip))
+            {
+                return true;
+            }
+            else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip))
+            {
+                return true;
+            }
+            else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java
new file mode 100644
index 0000000..93a38a7
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java
@@ -0,0 +1,34 @@
+package com.ruoyi.common.redis.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @Descreption: 分布式锁注解
+ * @Author: luofl
+ * @Date: 2024/11/26 16:43
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DistributedLock {
+
+    /**
+     * 锁名字(没有EL解析)
+     */
+    String lockName() default "";
+
+    /**
+     * 锁前缀(有EL解析)
+     */
+    String lockNamePre() default "";
+
+    /**
+     * 锁后缀(有EL解析)
+     */
+    String lockNamePost() default "";
+
+    /**
+     * 锁前后缀拼接分隔符
+     */
+    String separator() default "_";
+}
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/FastJson2JsonRedisSerializer.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/FastJson2JsonRedisSerializer.java
new file mode 100644
index 0000000..80e1be4
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/FastJson2JsonRedisSerializer.java
@@ -0,0 +1,49 @@
+package com.ruoyi.common.redis.configure;
+
+import java.nio.charset.Charset;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONReader;
+import com.alibaba.fastjson2.JSONWriter;
+
+/**
+ * Redis使用FastJson序列化
+ * 
+ * @author ruoyi
+ */
+public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
+{
+    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
+
+    private Class<T> clazz;
+
+
+    public FastJson2JsonRedisSerializer(Class<T> clazz)
+    {
+        super();
+        this.clazz = clazz;
+    }
+
+    @Override
+    public byte[] serialize(T t) throws SerializationException
+    {
+        if (t == null)
+        {
+            return new byte[0];
+        }
+        return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
+    }
+
+    @Override
+    public T deserialize(byte[] bytes) throws SerializationException
+    {
+        if (bytes == null || bytes.length <= 0)
+        {
+            return null;
+        }
+        String str = new String(bytes, DEFAULT_CHARSET);
+
+        return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
new file mode 100644
index 0000000..6e1ec8a
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
@@ -0,0 +1,43 @@
+package com.ruoyi.common.redis.configure;
+
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * redis配置
+ * 
+ * @author ruoyi
+ */
+@Configuration
+@EnableCaching
+@AutoConfigureBefore(RedisAutoConfiguration.class)
+public class RedisConfig extends CachingConfigurerSupport
+{
+    @Bean
+    @SuppressWarnings(value = { "unchecked", "rawtypes" })
+    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
+    {
+        RedisTemplate<Object, Object> template = new RedisTemplate<>();
+        template.setConnectionFactory(connectionFactory);
+
+        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
+
+        // 使用StringRedisSerializer来序列化和反序列化redis的key值
+        template.setKeySerializer(new StringRedisSerializer());
+        template.setValueSerializer(serializer);
+
+        // Hash的key也采用StringRedisSerializer的序列化方式
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(serializer);
+
+        template.afterPropertiesSet();
+        return template;
+    }
+}
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java
new file mode 100644
index 0000000..5d3ad86
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java
@@ -0,0 +1,276 @@
+package com.ruoyi.common.redis.service;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.BoundSetOperations;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+/**
+ * spring redis 工具类
+ * 
+ * @author ruoyi
+ **/
+@SuppressWarnings(value = { "unchecked", "rawtypes" })
+@Component
+public class RedisService
+{
+    @Autowired
+    public RedisTemplate redisTemplate;
+
+    /**
+     * 缓存基本的对象,Integer、String、实体类等
+     *
+     * @param key 缓存的键值
+     * @param value 缓存的值
+     */
+    public <T> void setCacheObject(final String key, final T value)
+    {
+        redisTemplate.opsForValue().set(key, value);
+    }
+
+    /**
+     * 缓存基本的对象,Integer、String、实体类等
+     *
+     * @param key 缓存的键值
+     * @param value 缓存的值
+     * @param timeout 时间
+     * @param timeUnit 时间颗粒度
+     */
+    public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit)
+    {
+        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
+    }
+
+    /**
+     * 设置有效时间
+     *
+     * @param key Redis键
+     * @param timeout 超时时间
+     * @return true=设置成功;false=设置失败
+     */
+    public boolean expire(final String key, final long timeout)
+    {
+        return expire(key, timeout, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 设置有效时间
+     *
+     * @param key Redis键
+     * @param timeout 超时时间
+     * @param unit 时间单位
+     * @return true=设置成功;false=设置失败
+     */
+    public boolean expire(final String key, final long timeout, final TimeUnit unit)
+    {
+        return redisTemplate.expire(key, timeout, unit);
+    }
+
+    /**
+     * 获取有效时间
+     *
+     * @param key Redis键
+     * @return 有效时间
+     */
+    public long getExpire(final String key)
+    {
+        return redisTemplate.getExpire(key);
+    }
+
+    /**
+     * 判断 key是否存在
+     *
+     * @param key 键
+     * @return true 存在 false不存在
+     */
+    public Boolean hasKey(String key)
+    {
+        return redisTemplate.hasKey(key);
+    }
+
+    /**
+     * 获得缓存的基本对象。
+     *
+     * @param key 缓存键值
+     * @return 缓存键值对应的数据
+     */
+    public <T> T getCacheObject(final String key)
+    {
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
+        return operation.get(key);
+    }
+
+    /**
+     * 删除单个对象
+     *
+     * @param key
+     */
+    public boolean deleteObject(final String key)
+    {
+        return redisTemplate.delete(key);
+    }
+
+    /**
+     * 删除集合对象
+     *
+     * @param collection 多个对象
+     * @return
+     */
+    public boolean deleteObject(final Collection collection)
+    {
+        return redisTemplate.delete(collection) > 0;
+    }
+
+    /**
+     * 缓存List数据
+     *
+     * @param key 缓存的键值
+     * @param dataList 待缓存的List数据
+     * @return 缓存的对象
+     */
+    public <T> long setCacheList(final String key, final List<T> dataList)
+    {
+        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
+        return count == null ? 0 : count;
+    }
+
+    /**
+     * 获得缓存的list对象
+     *
+     * @param key 缓存的键值
+     * @return 缓存键值对应的数据
+     */
+    public <T> List<T> getCacheList(final String key)
+    {
+        return redisTemplate.opsForList().range(key, 0, -1);
+    }
+
+    /**
+     * 缓存Set
+     *
+     * @param key 缓存键值
+     * @param dataSet 缓存的数据
+     * @return 缓存数据的对象
+     */
+    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
+    {
+        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
+        Iterator<T> it = dataSet.iterator();
+        while (it.hasNext())
+        {
+            setOperation.add(it.next());
+        }
+        return setOperation;
+    }
+
+    /**
+     * 获得缓存的set
+     *
+     * @param key
+     * @return
+     */
+    public <T> Set<T> getCacheSet(final String key)
+    {
+        return redisTemplate.opsForSet().members(key);
+    }
+
+    /**
+     * 缓存Map
+     *
+     * @param key
+     * @param dataMap
+     */
+    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
+    {
+        if (dataMap != null) {
+            redisTemplate.opsForHash().putAll(key, dataMap);
+        }
+    }
+
+    public <T> void setCacheMap(final String key, final Map<String, T> dataMap, long timeout)
+    {
+        if (dataMap != null) {
+            redisTemplate.opsForHash().putAll(key, dataMap);
+            redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
+        }
+    }
+
+    /**
+     * 获得缓存的Map
+     *
+     * @param key
+     * @return
+     */
+    public <T> Map<String, T> getCacheMap(final String key)
+    {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * 往Hash中存入数据
+     *
+     * @param key Redis键
+     * @param hKey Hash键
+     * @param value 值
+     */
+    public <T> void setCacheMapValue(final String key, final String hKey, final T value)
+    {
+        redisTemplate.opsForHash().put(key, hKey, value);
+    }
+
+    /**
+     * 获取Hash中的数据
+     *
+     * @param key Redis键
+     * @param hKey Hash键
+     * @return Hash中的对象
+     */
+    public <T> T getCacheMapValue(final String key, final String hKey)
+    {
+        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
+        return opsForHash.get(key, hKey);
+    }
+
+    /**
+     * 获取多个Hash中的数据
+     *
+     * @param key Redis键
+     * @param hKeys Hash键集合
+     * @return Hash对象集合
+     */
+    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
+    {
+        return redisTemplate.opsForHash().multiGet(key, hKeys);
+    }
+
+    /**
+     * 删除Hash中的某条数据
+     *
+     * @param key Redis键
+     * @param hKey Hash键
+     * @return 是否成功
+     */
+    public boolean deleteCacheMapValue(final String key, final String hKey)
+    {
+        return redisTemplate.opsForHash().delete(key, hKey) > 0;
+    }
+
+    /**
+     * 获得缓存的基本对象列表
+     *
+     * @param pattern 字符串前缀
+     * @return 对象列表
+     */
+    public Collection<String> keys(final String pattern)
+    {
+        return redisTemplate.keys(pattern);
+    }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java
new file mode 100644
index 0000000..baa0983
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java
@@ -0,0 +1,39 @@
+package com.ruoyi.other;
+
+import com.ruoyi.common.security.annotation.EnableCustomConfig;
+import com.ruoyi.common.security.annotation.EnableRyFeignClients;
+import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * 账户模块
+ * @author ruoyi
+ */
+@EnableCustomConfig
+@MapperScan({"com.ruoyi.other.mapper"})
+@EnableCustomSwagger2
+@EnableRyFeignClients
+@SpringBootApplication
+@EnableScheduling//开启定时任务
+@ServletComponentScan
+@EnableTransactionManagement//开启事务
+public class RuoYiOtherApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(RuoYiOtherApplication.class, args);
+        System.out.println("(♥◠‿◠)ノ゙  基础模块启动成功   ლ(´ڡ`ლ)゙  \n" +
+                " .-------.       ____     __        \n" +
+                " |  _ _   \\      \\   \\   /  /    \n" +
+                " | ( ' )  |       \\  _. /  '       \n" +
+                " |(_ o _) /        _( )_ .'         \n" +
+                " | (_,_).' __  ___(_ o _)'          \n" +
+                " |  |\\ \\  |  ||   |(_,_)'         \n" +
+                " |  | \\ `'   /|   `-'  /           \n" +
+                " |  |  \\    /  \\      /           \n" +
+                " ''-'   `'-'    `-..-'              ");
+    }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataUpdateHandlerConfig.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataUpdateHandlerConfig.java
new file mode 100644
index 0000000..2e56889
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataUpdateHandlerConfig.java
@@ -0,0 +1,51 @@
+package com.ruoyi.other.config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.ruoyi.common.security.service.TokenService;
+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 java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @author xiaochen
+ * @ClassName DataUpdateInterceptor
+ * @Description 数据更新操作处理
+ * @date 2021-12-15
+ * <p>
+ * 注意,之前在此处注入了 JwtTokenUtils
+ * <p>
+ * 造成spring循环依赖,项目支棱不起来
+ */
+@Slf4j
+@Configuration
+public class DataUpdateHandlerConfig implements MetaObjectHandler {
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 新增数据执行
+     *
+     * @param metaObject
+     */
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
+        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
+    }
+
+    /**
+     * 修改数据执行
+     *
+     * @param metaObject
+     */
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
+    }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/HttpConfig.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/HttpConfig.java
new file mode 100644
index 0000000..2509b1d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/HttpConfig.java
@@ -0,0 +1,25 @@
+package com.ruoyi.other.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/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/MybatisPlusConfig.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..7f556ce
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/MybatisPlusConfig.java
@@ -0,0 +1,51 @@
+package com.ruoyi.other.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/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsController.java
index 91ea840..63c8837 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.page.TableDataInfo;
 import com.ruoyi.other.api.domain.Goods;
 import com.ruoyi.other.service.GoodsService;
 import com.ruoyi.other.vo.GoodsVO;
@@ -35,9 +36,9 @@
      */
     @GetMapping("/goodsList")
     @ApiOperation(value = "商品列表", tags = {"小程序-商城-首页-热门商品列表", "首页热门商品-小程序"})
-    public R<List<GoodsVO>> goodsList(Goods goods){
+    public R<TableDataInfo> goodsList(Goods goods){
         startPage();
-        return R.ok(goodsService.goodsList(goods));
+        return R.ok(getDataTable(goodsService.goodsList(goods)));
     }
 
 
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java
new file mode 100644
index 0000000..1a6702b
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java
@@ -0,0 +1,18 @@
+package com.ruoyi.other.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum GoodsStatus {
+    DOWN(0, "下架"),
+    UP(1, "上架");
+
+    private final Integer code;
+    private final String desc;
+
+    GoodsStatus(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java
new file mode 100644
index 0000000..7fe4fd8
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java
@@ -0,0 +1,18 @@
+package com.ruoyi.other.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum PhoneType {
+    PLATFORM(1, "平台"),
+    SHOP(2, "门店");
+
+    private final Integer code;
+    private final String desc;
+
+    PhoneType(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAddType.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAddType.java
new file mode 100644
index 0000000..819df7b
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAddType.java
@@ -0,0 +1,19 @@
+package com.ruoyi.other.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum ShareAddType {
+    PLATFORM(1, "平台添加"),
+    PROMPOTERS(2, "推广人添加"),
+    STORE(3, "门店添加");
+
+    private final Integer code;
+    private final String message;
+
+    ShareAddType(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java
new file mode 100644
index 0000000..1f0ce88
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java
@@ -0,0 +1,19 @@
+package com.ruoyi.other.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum ShareAuditStatus {
+    WAIT(0, "待审核"),
+    SUCCESS(1, "审核通过"),
+    FAIL(2, "审核失败");
+
+    private final Integer code;
+    private final String message;
+
+    ShareAuditStatus(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShopStatus.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShopStatus.java
new file mode 100644
index 0000000..a82be5a
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShopStatus.java
@@ -0,0 +1,18 @@
+package com.ruoyi.other.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum ShopStatus {
+    SHOP_STATUS_NORMAL(1, "正常"),
+    SHOP_STATUS_FREEZE(2, "冻结");
+
+    private final Integer code;
+    private final String message;
+
+    ShopStatus(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java
new file mode 100644
index 0000000..50ab4e6
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java
@@ -0,0 +1,18 @@
+package com.ruoyi.other.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum TechnicianErrorCode {
+    TECHNICIAN_ALREADY_SUBSCRIBED(1001, "该技师已被预约"),
+    ;
+
+    private final int code;
+    private final String message;
+
+    TechnicianErrorCode(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianStatus.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianStatus.java
new file mode 100644
index 0000000..3edfa0c
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianStatus.java
@@ -0,0 +1,26 @@
+package com.ruoyi.other.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum TechnicianStatus {
+    UNSUBSCRIBE(0, "待服务"),
+    SERVE(1, "已服务"),
+    CANCEL(2, "已取消");
+    private final Integer code;
+    private final String message;
+
+    TechnicianStatus(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public static String getMessage(Integer code) {
+        for (TechnicianStatus value : TechnicianStatus.values()) {
+            if (value.getCode().equals(code)) {
+                return value.getMessage();
+            }
+        }
+        return null;
+    }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java
new file mode 100644
index 0000000..cb4a599
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java
@@ -0,0 +1,117 @@
+package com.ruoyi.other.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.ruoyi.account.api.feignClient.AppUserClient;
+import com.ruoyi.account.api.model.AppUser;
+import com.ruoyi.common.core.constant.TokenConstants;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.feignClient.SysUserClient;
+import org.apache.logging.log4j.core.config.Order;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/23 11:22
+ */
+@Order(-200)
+@Component
+public class AuthFilter implements Filter {
+	private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
+	
+	@Lazy
+	@Resource
+	private AppUserClient appUserClient;
+	
+	@Lazy
+	@Resource
+	private SysUserClient sysUserClient;
+	
+	
+	@Override
+	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+		HttpServletRequest request = (HttpServletRequest) servletRequest;
+		HttpServletResponse response = (HttpServletResponse) servletResponse;
+		String userid = request.getHeader("user_id");
+		if(StringUtils.isEmpty(userid)){
+			filterChain.doFilter(servletRequest, servletResponse);
+			return;
+		}
+		String userType = request.getHeader("user_type");
+		//管理后台用户
+		if ("system".equals(userType)) {
+			SysUser sysUser = sysUserClient.getSysUser(Long.valueOf(userid)).getData();
+			if(null == sysUser || "2".equals(sysUser.getDelFlag())){
+				log.error("[账户异常处理]请求账户id:{}", userid);
+				unauthorizedResponse(response,"无效的账户");
+				return;
+			}
+			if("1".equals(sysUser.getStatus())){
+				log.error("[账户异常处理]请求账户id:{}", userid);
+				unauthorizedResponse(response,"账户已被停用,请联系系统管理员!");
+				return;
+			}
+		}
+		//小程序用户
+		if ("applet".equals(userType)) {
+			AppUser appUser = appUserClient.getAppUserById(Long.valueOf(userid));
+			if(null == appUser || appUser.getDelFlag() || 3 == appUser.getStatus()){
+				log.error("[账户异常处理]请求账户id:{}", userid);
+				unauthorizedResponse(response,"无效的账户");
+				return;
+			}
+			if(2 == appUser.getStatus()){
+				log.error("[账户异常处理]请求账户id:{}", userid);
+				unauthorizedResponse(response,"账户已被冻结,请联系系统管理员!");
+				return;
+			}
+		}
+		filterChain.doFilter(servletRequest, servletResponse);
+	}
+	
+	
+	
+	private void unauthorizedResponse(HttpServletResponse response, String msg) {
+		response.setStatus(HttpStatus.OK.value());
+		response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE);
+		PrintWriter writer = null;
+		try {
+			writer = response.getWriter();
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		writer.println(JSON.toJSONString(R.fail(msg)));
+		writer.flush();
+		writer.close();
+	}
+	
+	
+	
+	/**
+	 * 获取请求token
+	 */
+	private String getToken(HttpServletRequest request) {
+		String token = request.getHeader(TokenConstants.AUTHENTICATION);
+		// 如果前端设置了令牌前缀,则裁剪掉前缀
+		if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) {
+			token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
+		}
+		return token;
+	}
+	
+	
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/AgreementMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/AgreementMapper.java
new file mode 100644
index 0000000..1baf74d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/AgreementMapper.java
@@ -0,0 +1,11 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.Agreement;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/11/21 10:46
+ */
+public interface AgreementMapper extends BaseMapper<Agreement> {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BannerMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BannerMapper.java
new file mode 100644
index 0000000..c192df5
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BannerMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.Banner;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface BannerMapper extends BaseMapper<Banner> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BaseSettingMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BaseSettingMapper.java
new file mode 100644
index 0000000..3b3eab0
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BaseSettingMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.BaseSetting;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface BaseSettingMapper extends BaseMapper<BaseSetting> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/CouponInfoMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/CouponInfoMapper.java
new file mode 100644
index 0000000..fd17103
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/CouponInfoMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.CouponInfo;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface CouponInfoMapper extends BaseMapper<CouponInfo> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsAppUserMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsAppUserMapper.java
new file mode 100644
index 0000000..c614e37
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsAppUserMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.GoodsAppUser;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsAppUserMapper extends BaseMapper<GoodsAppUser> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsAreaMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsAreaMapper.java
new file mode 100644
index 0000000..6eaf296
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsAreaMapper.java
@@ -0,0 +1,7 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.GoodsArea;
+
+public interface GoodsAreaMapper extends BaseMapper<GoodsArea> {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsBargainPriceDetailMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsBargainPriceDetailMapper.java
new file mode 100644
index 0000000..8dc830a
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsBargainPriceDetailMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.GoodsBargainPriceDetail;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsBargainPriceDetailMapper extends BaseMapper<GoodsBargainPriceDetail> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsBargainPriceMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsBargainPriceMapper.java
new file mode 100644
index 0000000..7b958bd
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsBargainPriceMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.GoodsBargainPrice;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsBargainPriceMapper extends BaseMapper<GoodsBargainPrice> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsCategoryMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsCategoryMapper.java
new file mode 100644
index 0000000..0a1a2ae
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsCategoryMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.GoodsCategory;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsCategoryMapper extends BaseMapper<GoodsCategory> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsEvaluateMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsEvaluateMapper.java
new file mode 100644
index 0000000..758376d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsEvaluateMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.GoodsEvaluate;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsEvaluateMapper extends BaseMapper<GoodsEvaluate> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsMapper.java
new file mode 100644
index 0000000..2058cb9
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.Goods;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsMapper extends BaseMapper<Goods> {
+    List<Goods> selectListByShopId(Integer shopId, Integer vip);
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsSeckillMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsSeckillMapper.java
new file mode 100644
index 0000000..ee9ecb7
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsSeckillMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.GoodsSeckill;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsSeckillMapper extends BaseMapper<GoodsSeckill> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsShopMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsShopMapper.java
new file mode 100644
index 0000000..981cb2f
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsShopMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.GoodsShop;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsShopMapper extends BaseMapper<GoodsShop> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsVipMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsVipMapper.java
new file mode 100644
index 0000000..0dcd4c9
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsVipMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.GoodsVip;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsVipMapper extends BaseMapper<GoodsVip> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/OrderActivityInfoMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/OrderActivityInfoMapper.java
new file mode 100644
index 0000000..971eb7f
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/OrderActivityInfoMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.OrderActivityInfo;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface OrderActivityInfoMapper extends BaseMapper<OrderActivityInfo> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PhoneMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PhoneMapper.java
new file mode 100644
index 0000000..78d1335
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PhoneMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.ruoyi.other.api.domain.Phone;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface PhoneMapper extends BaseMapper<Phone> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PointSettingMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PointSettingMapper.java
new file mode 100644
index 0000000..1b28234
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PointSettingMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.PointSetting;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface PointSettingMapper extends BaseMapper<PointSetting> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RechargeSetMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RechargeSetMapper.java
new file mode 100644
index 0000000..ed11de4
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RechargeSetMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.RechargeSet;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface RechargeSetMapper extends BaseMapper<RechargeSet> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RedPackegeSetMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RedPackegeSetMapper.java
new file mode 100644
index 0000000..af26b30
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RedPackegeSetMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.RedPackegeSet;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface RedPackegeSetMapper extends BaseMapper<RedPackegeSet> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RegionMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RegionMapper.java
new file mode 100644
index 0000000..0f5ea38
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RegionMapper.java
@@ -0,0 +1,7 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.Region;
+
+public interface RegionMapper extends BaseMapper<Region> {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SeckillActivityInfoMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SeckillActivityInfoMapper.java
new file mode 100644
index 0000000..91eb0a3
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SeckillActivityInfoMapper.java
@@ -0,0 +1,24 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.Goods;
+import com.ruoyi.other.api.domain.SeckillActivityInfo;
+import com.ruoyi.other.vo.SeckillActivityDetailVO;
+import com.ruoyi.other.vo.SeckillActivityVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface SeckillActivityInfoMapper extends BaseMapper<SeckillActivityInfo> {
+
+    List<SeckillActivityVO> listSeckillActivity(Goods goods);
+
+    SeckillActivityDetailVO selectDetail(Integer seckillActivityId);
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShareMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShareMapper.java
new file mode 100644
index 0000000..a116b92
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShareMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.Share;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShareMapper extends BaseMapper<Share> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopBalanceStatementMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopBalanceStatementMapper.java
new file mode 100644
index 0000000..3363860
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopBalanceStatementMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.ShopBalanceStatement;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShopBalanceStatementMapper extends BaseMapper<ShopBalanceStatement> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopMapper.java
new file mode 100644
index 0000000..be480ad
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopMapper.java
@@ -0,0 +1,25 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.Shop;
+import com.ruoyi.other.vo.NearbyShopVO;
+import com.ruoyi.other.vo.ShopDetailVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShopMapper extends BaseMapper<Shop> {
+
+    List<NearbyShopVO> selectNearbyShopList(@Param("longitude") String longitude,@Param("latitude") String latitude);
+
+    ShopDetailVO selectShopDetail(Integer shopId);
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopPointMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopPointMapper.java
new file mode 100644
index 0000000..f1e5685
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopPointMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.ShopPoint;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShopPointMapper extends BaseMapper<ShopPoint> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopWithdrawMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopWithdrawMapper.java
new file mode 100644
index 0000000..91f40d5
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopWithdrawMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.ShopWithdraw;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShopWithdrawMapper extends BaseMapper<ShopWithdraw> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SystemConfigMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SystemConfigMapper.java
new file mode 100644
index 0000000..a068a21
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SystemConfigMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.SystemConfig;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface SystemConfigMapper extends BaseMapper<SystemConfig> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TechnicianMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TechnicianMapper.java
new file mode 100644
index 0000000..c3b24f7
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TechnicianMapper.java
@@ -0,0 +1,24 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.Technician;
+import com.ruoyi.other.vo.TechnicianDetailVO;
+import com.ruoyi.other.vo.TechnicianVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface TechnicianMapper extends BaseMapper<Technician> {
+
+    List<TechnicianVO> selectTechnicianListByShopId(Long shopId);
+
+    TechnicianDetailVO selectTechnicianDetail(Long technicianId);
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TechnicianSubscribeMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TechnicianSubscribeMapper.java
new file mode 100644
index 0000000..b3a3294
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TechnicianSubscribeMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.TechnicianSubscribe;
+import com.ruoyi.other.vo.TechnicianSubscribeVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface TechnicianSubscribeMapper extends BaseMapper<TechnicianSubscribe> {
+
+    /**
+     * 查看用户预约记录
+     * @param shopId
+     * @return
+     */
+    public List<TechnicianSubscribeVO> getTechnicianSubscribeByUserAndShop(@Param("userId") Long userId,
+                                                                           @Param("shopId") Long shopId);
+    public List<TechnicianSubscribeVO> getTechnicianSubscribeByUser(@Param("userId") Long userId,
+                                                                           @Param("status") Integer status);
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/VipGoodMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/VipGoodMapper.java
new file mode 100644
index 0000000..4f6ca6e
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/VipGoodMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.VipGood;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface VipGoodMapper extends BaseMapper<VipGood> {
+
+    /**
+     * 查询指定商品的指定会员价格
+     */
+    VipGood selectVipGood(Long goodsId, Integer vipId);
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/VipSettingMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/VipSettingMapper.java
new file mode 100644
index 0000000..1db8d1a
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/VipSettingMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.mapper;
+
+import com.ruoyi.other.api.domain.VipSetting;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface VipSettingMapper extends BaseMapper<VipSetting> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/AgreementService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/AgreementService.java
new file mode 100644
index 0000000..a90eb63
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/AgreementService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.Agreement;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface AgreementService extends IService<Agreement> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BannerService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BannerService.java
new file mode 100644
index 0000000..8d9a39d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BannerService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.Banner;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface BannerService extends IService<Banner> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BaseSettingService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BaseSettingService.java
new file mode 100644
index 0000000..c5803d0
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BaseSettingService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.BaseSetting;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface BaseSettingService extends IService<BaseSetting> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/CouponInfoService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/CouponInfoService.java
new file mode 100644
index 0000000..fdd24a5
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/CouponInfoService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.CouponInfo;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface CouponInfoService extends IService<CouponInfo> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsAppUserService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsAppUserService.java
new file mode 100644
index 0000000..7da4769
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsAppUserService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.GoodsAppUser;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsAppUserService extends IService<GoodsAppUser> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsAreaService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsAreaService.java
new file mode 100644
index 0000000..dc21a7e
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsAreaService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.GoodsArea;
+
+public interface GoodsAreaService extends IService<GoodsArea> {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsBargainPriceDetailService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsBargainPriceDetailService.java
new file mode 100644
index 0000000..72d5848
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsBargainPriceDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.GoodsBargainPriceDetail;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsBargainPriceDetailService extends IService<GoodsBargainPriceDetail> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsBargainPriceService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsBargainPriceService.java
new file mode 100644
index 0000000..b6a4b60
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsBargainPriceService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.GoodsBargainPrice;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsBargainPriceService extends IService<GoodsBargainPrice> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsCategoryService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsCategoryService.java
new file mode 100644
index 0000000..104e840
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsCategoryService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.GoodsCategory;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsCategoryService extends IService<GoodsCategory> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsEvaluateService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsEvaluateService.java
new file mode 100644
index 0000000..94d3a87
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsEvaluateService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.GoodsEvaluate;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsEvaluateService extends IService<GoodsEvaluate> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsSeckillService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsSeckillService.java
new file mode 100644
index 0000000..fe2e6f9
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsSeckillService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.GoodsSeckill;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsSeckillService extends IService<GoodsSeckill> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsService.java
new file mode 100644
index 0000000..d33e0d5
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.Goods;
+import com.ruoyi.other.vo.GoodsVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsService extends IService<Goods> {
+
+    List<GoodsVO> goodsList(Goods goods);
+
+    GoodsVO goodsDetail(Long goodsId);
+
+    List<Goods> getGoodsListByShopId(Integer shopId);
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsShopService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsShopService.java
new file mode 100644
index 0000000..d0e6b12
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsShopService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.GoodsShop;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsShopService extends IService<GoodsShop> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsVipService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsVipService.java
new file mode 100644
index 0000000..5d0cd4a
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsVipService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.GoodsVip;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface GoodsVipService extends IService<GoodsVip> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/IAgreementService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/IAgreementService.java
new file mode 100644
index 0000000..f4a93d1
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/IAgreementService.java
@@ -0,0 +1,11 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.Agreement;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/11/21 10:46
+ */
+public interface IAgreementService extends IService<Agreement> {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/OrderActivityInfoService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/OrderActivityInfoService.java
new file mode 100644
index 0000000..0d437b5
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/OrderActivityInfoService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.ruoyi.other.api.domain.OrderActivityInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface OrderActivityInfoService extends IService<OrderActivityInfo> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PhoneService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PhoneService.java
new file mode 100644
index 0000000..3031087
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PhoneService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.Phone;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface PhoneService extends IService<Phone> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PointSettingService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PointSettingService.java
new file mode 100644
index 0000000..dfeef36
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PointSettingService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.PointSetting;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface PointSettingService extends IService<PointSetting> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RechargeSetService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RechargeSetService.java
new file mode 100644
index 0000000..1180e24
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RechargeSetService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.RechargeSet;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface RechargeSetService extends IService<RechargeSet> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RedPackegeSetService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RedPackegeSetService.java
new file mode 100644
index 0000000..a3c879f
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RedPackegeSetService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.ruoyi.other.api.domain.RedPackegeSet;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface RedPackegeSetService extends IService<RedPackegeSet> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RegionService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RegionService.java
new file mode 100644
index 0000000..ef39093
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RegionService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.Region;
+
+public interface RegionService extends IService<Region> {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SeckillActivityInfoService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SeckillActivityInfoService.java
new file mode 100644
index 0000000..1d46d76
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SeckillActivityInfoService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.other.service;
+
+import com.ruoyi.other.api.domain.Goods;
+import com.ruoyi.other.api.domain.SeckillActivityInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.vo.SeckillActivityDetailVO;
+import com.ruoyi.other.vo.SeckillActivityVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface SeckillActivityInfoService extends IService<SeckillActivityInfo> {
+
+    List<SeckillActivityVO> listSeckillActivity(Goods goods);
+
+    SeckillActivityDetailVO detail(Integer seckillActivityId);
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShareService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShareService.java
new file mode 100644
index 0000000..a77005b
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShareService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.other.service;
+
+import com.ruoyi.other.api.domain.Share;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShareService extends IService<Share> {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopBalanceStatementService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopBalanceStatementService.java
new file mode 100644
index 0000000..5328644
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopBalanceStatementService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.ShopBalanceStatement;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShopBalanceStatementService extends IService<ShopBalanceStatement> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopPointService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopPointService.java
new file mode 100644
index 0000000..9d017fb
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopPointService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.ShopPoint;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShopPointService extends IService<ShopPoint> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopService.java
new file mode 100644
index 0000000..eedaaca
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.Goods;
+import com.ruoyi.other.api.domain.Shop;
+import com.ruoyi.other.vo.NearbyShopVO;
+import com.ruoyi.other.vo.ShopDetailVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShopService extends IService<Shop> {
+
+    List<NearbyShopVO> nearbyShopList(String longitude, String latitude);
+
+    ShopDetailVO getShopDetail(Integer shopId,String longitude, String latitude);
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopWithdrawService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopWithdrawService.java
new file mode 100644
index 0000000..599fe7b
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopWithdrawService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.ShopWithdraw;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface ShopWithdrawService extends IService<ShopWithdraw> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SystemConfigService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SystemConfigService.java
new file mode 100644
index 0000000..2162c83
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SystemConfigService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.SystemConfig;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface SystemConfigService extends IService<SystemConfig> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianService.java
new file mode 100644
index 0000000..7be2cbc
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianService.java
@@ -0,0 +1,22 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.Technician;
+import com.ruoyi.other.vo.TechnicianDetailVO;
+import com.ruoyi.other.vo.TechnicianVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface TechnicianService extends IService<Technician> {
+    List<TechnicianVO> getTechnicianListByShopId(Long shopId);
+
+    TechnicianDetailVO technicianDetail(Long technicianId);
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java
new file mode 100644
index 0000000..d3796aa
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java
@@ -0,0 +1,27 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.TechnicianSubscribe;
+import com.ruoyi.other.vo.TechnicianSubscribeVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface TechnicianSubscribeService extends IService<TechnicianSubscribe> {
+
+    /**
+     * 查询用于指定门店的相关预约记录
+     */
+    List<TechnicianSubscribeVO> getTechnicianSubscribeByUserAndShop(Long userId, Long shopId);
+
+    List<TechnicianSubscribeVO> getTechnicianSubscribeByUser(Long userId, Integer status);
+
+    void subscribe(TechnicianSubscribe technicianSubscribe, Long technicianId);
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/VipGoodService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/VipGoodService.java
new file mode 100644
index 0000000..3a3f6bb
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/VipGoodService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.VipGood;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface VipGoodService extends IService<VipGood> {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/VipSettingService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/VipSettingService.java
new file mode 100644
index 0000000..e576300
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/VipSettingService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.VipSetting;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+public interface VipSettingService extends IService<VipSetting> {
+
+    VipSetting getVipSettingByUserId(Long userId);
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/AgreementServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/AgreementServiceImpl.java
new file mode 100644
index 0000000..ec1ac50
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/AgreementServiceImpl.java
@@ -0,0 +1,15 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.api.domain.Agreement;
+import com.ruoyi.other.mapper.AgreementMapper;
+import com.ruoyi.other.service.IAgreementService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/11/21 10:48
+ */
+@Service
+public class AgreementServiceImpl extends ServiceImpl<AgreementMapper, Agreement> implements IAgreementService {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BaseSettingServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BaseSettingServiceImpl.java
new file mode 100644
index 0000000..a6ade96
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BaseSettingServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.BaseSettingMapper;
+import com.ruoyi.other.api.domain.BaseSetting;
+import com.ruoyi.other.service.BaseSettingService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class BaseSettingServiceImpl extends ServiceImpl<BaseSettingMapper, BaseSetting> implements BaseSettingService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsAppUserServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsAppUserServiceImpl.java
new file mode 100644
index 0000000..ce23b9c
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsAppUserServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.ruoyi.other.api.domain.GoodsAppUser;
+import com.ruoyi.other.service.GoodsAppUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.GoodsAppUserMapper;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class GoodsAppUserServiceImpl extends ServiceImpl<GoodsAppUserMapper, GoodsAppUser> implements GoodsAppUserService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsAreaServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsAreaServiceImpl.java
new file mode 100644
index 0000000..25d0a65
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsAreaServiceImpl.java
@@ -0,0 +1,16 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.api.domain.GoodsArea;
+import com.ruoyi.other.mapper.GoodsAreaMapper;
+import com.ruoyi.other.service.GoodsAreaService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Service
+public class GoodsAreaServiceImpl extends ServiceImpl<GoodsAreaMapper, GoodsArea> implements GoodsAreaService {
+    @Resource
+    private GoodsAreaMapper goodsAreaMapper;
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsBargainPriceServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsBargainPriceServiceImpl.java
new file mode 100644
index 0000000..bf7bf04
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsBargainPriceServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.GoodsBargainPriceMapper;
+import com.ruoyi.other.api.domain.GoodsBargainPrice;
+import com.ruoyi.other.service.GoodsBargainPriceService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class GoodsBargainPriceServiceImpl extends ServiceImpl<GoodsBargainPriceMapper, GoodsBargainPrice> implements GoodsBargainPriceService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsEvaluateServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsEvaluateServiceImpl.java
new file mode 100644
index 0000000..04203e5
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsEvaluateServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.GoodsEvaluateMapper;
+import com.ruoyi.other.api.domain.GoodsEvaluate;
+import com.ruoyi.other.service.GoodsEvaluateService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class GoodsEvaluateServiceImpl extends ServiceImpl<GoodsEvaluateMapper, GoodsEvaluate> implements GoodsEvaluateService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsSeckillServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsSeckillServiceImpl.java
new file mode 100644
index 0000000..3a40097
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsSeckillServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.ruoyi.other.api.domain.GoodsSeckill;
+import com.ruoyi.other.mapper.GoodsSeckillMapper;
+import com.ruoyi.other.service.GoodsSeckillService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class GoodsSeckillServiceImpl extends ServiceImpl<GoodsSeckillMapper, GoodsSeckill> implements GoodsSeckillService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
new file mode 100644
index 0000000..4a4ff9d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
@@ -0,0 +1,116 @@
+package com.ruoyi.other.service.impl;
+
+import cn.hutool.json.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.account.api.feignClient.AppUserClient;
+import com.ruoyi.account.api.model.AppUser;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.utils.bean.BeanUtils;
+import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.other.api.domain.Goods;
+import com.ruoyi.other.api.domain.GoodsArea;
+import com.ruoyi.other.api.domain.GoodsVip;
+import com.ruoyi.other.api.domain.VipSetting;
+import com.ruoyi.other.enums.GoodsStatus;
+import com.ruoyi.other.mapper.GoodsAreaMapper;
+import com.ruoyi.other.mapper.GoodsMapper;
+import com.ruoyi.other.service.GoodsService;
+import com.ruoyi.other.service.GoodsVipService;
+import com.ruoyi.other.service.VipSettingService;
+import com.ruoyi.other.vo.GoodsVO;
+import com.ruoyi.system.api.model.LoginUser;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements GoodsService {
+    @Resource
+    private GoodsMapper goodsMapper;
+    @Resource
+    private TokenService tokenService;
+    @Resource
+    private VipSettingService vipSettingService;
+    @Resource
+    private GoodsAreaMapper goodsAreaMapper;
+    @Resource
+    private GoodsVipService goodsVipService;
+    @Resource
+    private AppUserClient appUserClient;
+
+    @Override
+    public List<GoodsVO> goodsList(Goods search) {
+        List<Goods> goodsList = this.list(new LambdaQueryWrapper<Goods>()
+                .eq(Goods::getStatus, GoodsStatus.UP)
+                .eq(Objects.nonNull(search.getGoodsCategoryId()), Goods::getGoodsCategoryId, search.getGoodsCategoryId())
+                .like(StringUtils.isNotEmpty(search.getName()), Goods::getName, search.getName()));
+
+        List<GoodsVO> result = new ArrayList<>();
+        for (Goods goods : goodsList) {
+            GoodsVO goodsVO = new GoodsVO();
+            BeanUtils.copyBeanProp(goodsVO, goods);
+            result.add(goodsVO);
+        }
+        return result;
+    }
+
+    @Override
+    public GoodsVO goodsDetail(Long goodsId) {
+        if (goodsId == null || goodsId <= 0) {
+            throw new NullPointerException("商品ID不能为空");
+        }
+
+        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
+        AppUser appUser = appUserClient.getAppUserById(loginUserApplet.getUserid());
+        BigDecimal sellingPrice;
+        Integer integral;
+
+        GoodsArea goodsArea = goodsAreaMapper.selectOne(new LambdaQueryWrapper<GoodsArea>()
+                .eq(GoodsArea::getGoodsId, goodsId)
+                .eq(GoodsArea::getProvinceCode, appUser.getProvinceCode())
+                .eq(StringUtils.isNotEmpty(appUser.getCityCode()), GoodsArea::getCityCode, appUser.getCityCode())
+                .eq(StringUtils.isNotEmpty(appUser.getDistrictCode()), GoodsArea::getDistrictsCode, appUser.getDistrictCode()));
+
+        if (Objects.nonNull(goodsArea)){
+            sellingPrice = goodsArea.getSellingPrice();
+            integral = goodsArea.getIntegral();
+        }else {
+            VipSetting vipSetting = vipSettingService.getVipSettingByUserId(loginUserApplet.getUserid());
+            GoodsVip goodsVip = goodsVipService.getOne(new LambdaQueryWrapper<GoodsVip>()
+                    .eq(GoodsVip::getVip, vipSetting.getId())
+                    .eq(GoodsVip::getGoodsId, goodsId));
+
+            sellingPrice = goodsVip.getSellingPrice();
+            integral = goodsVip.getIntegral();
+        }
+
+        Goods goods = this.getById(goodsId);
+        GoodsVO goodsVO = new GoodsVO();
+        BeanUtils.copyBeanProp(goodsVO, goods);
+        goodsVO.setSellingPrice(sellingPrice);
+        goodsVO.setIntegral(integral);
+        return goodsVO;
+    }
+
+
+    @Override
+    public List<Goods> getGoodsListByShopId(Integer shopId) {
+        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
+        VipSetting vipSetting = vipSettingService.getVipSettingByUserId(loginUserApplet.getUserid());
+        return goodsMapper.selectListByShopId(shopId, vipSetting.getId());
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsShopServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsShopServiceImpl.java
new file mode 100644
index 0000000..19363c4
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsShopServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.GoodsShopMapper;
+import com.ruoyi.other.api.domain.GoodsShop;
+import com.ruoyi.other.service.GoodsShopService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class GoodsShopServiceImpl extends ServiceImpl<GoodsShopMapper, GoodsShop> implements GoodsShopService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsVipServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsVipServiceImpl.java
new file mode 100644
index 0000000..9ce8b0f
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsVipServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.GoodsVipMapper;
+import com.ruoyi.other.api.domain.GoodsVip;
+import com.ruoyi.other.service.GoodsVipService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class GoodsVipServiceImpl extends ServiceImpl<GoodsVipMapper, GoodsVip> implements GoodsVipService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PhoneServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PhoneServiceImpl.java
new file mode 100644
index 0000000..d227797
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PhoneServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.PhoneMapper;
+import com.ruoyi.other.api.domain.Phone;
+import com.ruoyi.other.service.PhoneService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class PhoneServiceImpl extends ServiceImpl<PhoneMapper, Phone> implements PhoneService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RechargeSetServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RechargeSetServiceImpl.java
new file mode 100644
index 0000000..2f6c32f
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RechargeSetServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.RechargeSetMapper;
+import com.ruoyi.other.api.domain.RechargeSet;
+import com.ruoyi.other.service.RechargeSetService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class RechargeSetServiceImpl extends ServiceImpl<RechargeSetMapper, RechargeSet> implements RechargeSetService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RedPackegeSetServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RedPackegeSetServiceImpl.java
new file mode 100644
index 0000000..669746d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RedPackegeSetServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.RedPackegeSetMapper;
+import com.ruoyi.other.api.domain.RedPackegeSet;
+import com.ruoyi.other.service.RedPackegeSetService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class RedPackegeSetServiceImpl extends ServiceImpl<RedPackegeSetMapper, RedPackegeSet> implements RedPackegeSetService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SeckillActivityInfoServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SeckillActivityInfoServiceImpl.java
new file mode 100644
index 0000000..9a660fd
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SeckillActivityInfoServiceImpl.java
@@ -0,0 +1,71 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.account.api.feignClient.AppUserClient;
+import com.ruoyi.account.api.model.AppUser;
+import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.other.api.domain.Goods;
+import com.ruoyi.other.api.domain.GoodsShop;
+import com.ruoyi.other.api.domain.SeckillActivityInfo;
+import com.ruoyi.other.api.domain.Shop;
+import com.ruoyi.other.mapper.GoodsShopMapper;
+import com.ruoyi.other.mapper.SeckillActivityInfoMapper;
+import com.ruoyi.other.mapper.ShopMapper;
+import com.ruoyi.other.service.SeckillActivityInfoService;
+import com.ruoyi.other.vo.SeckillActivityDetailVO;
+import com.ruoyi.other.vo.SeckillActivityVO;
+import com.ruoyi.system.api.model.LoginUser;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class SeckillActivityInfoServiceImpl extends ServiceImpl<SeckillActivityInfoMapper, SeckillActivityInfo> implements SeckillActivityInfoService {
+    @Resource
+    private SeckillActivityInfoMapper seckillActivityInfoMapper;
+    @Resource
+    private GoodsShopMapper goodsShopMapper;
+    @Resource
+    private ShopMapper shopMapper;
+    @Resource
+    private TokenService tokenService;
+    @Resource
+    private AppUserClient appUserClient;
+
+    @Override
+    public List<SeckillActivityVO> listSeckillActivity(Goods goods) {
+        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
+        AppUser appUser = appUserClient.getAppUserById(loginUserApplet.getUserid());
+        goods.setVipId(appUser.getVipId());
+        return seckillActivityInfoMapper.listSeckillActivity(goods);
+    }
+
+    @Override
+    public SeckillActivityDetailVO detail(Integer seckillActivityId) {
+        SeckillActivityDetailVO seckillActivityDetailVO = seckillActivityInfoMapper.selectDetail(seckillActivityId);
+        Long goodsId = seckillActivityDetailVO.getGoodsId();
+
+        List<Integer> shopIdList = goodsShopMapper.selectList(new LambdaQueryWrapper<GoodsShop>()
+                .eq(GoodsShop::getGoodsId, goodsId)).stream().map(GoodsShop::getShopId).collect(Collectors.toList());
+
+        List<String> shopNames = shopMapper.selectObjs(new LambdaQueryWrapper<Shop>()
+                        .select(Shop::getName)
+                        .in(Shop::getId, shopIdList))
+                .stream()
+                .map(Object::toString)
+                .collect(Collectors.toList());
+        seckillActivityDetailVO.setShopList(shopNames);
+        return seckillActivityDetailVO;
+    }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShareServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShareServiceImpl.java
new file mode 100644
index 0000000..44dcb61
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShareServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.ShareMapper;
+import com.ruoyi.other.api.domain.Share;
+import com.ruoyi.other.service.ShareService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class ShareServiceImpl extends ServiceImpl<ShareMapper, Share> implements ShareService {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopPointServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopPointServiceImpl.java
new file mode 100644
index 0000000..f0139a2
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopPointServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.ShopPointMapper;
+import com.ruoyi.other.api.domain.ShopPoint;
+import com.ruoyi.other.service.ShopPointService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class ShopPointServiceImpl extends ServiceImpl<ShopPointMapper, ShopPoint> implements ShopPointService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java
new file mode 100644
index 0000000..41a9c34
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java
@@ -0,0 +1,56 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.GeodesyUtil;
+import com.ruoyi.other.api.domain.Goods;
+import com.ruoyi.other.mapper.GoodsMapper;
+import com.ruoyi.other.mapper.ShopMapper;
+import com.ruoyi.other.api.domain.Shop;
+import com.ruoyi.other.service.ShopService;
+import com.ruoyi.other.vo.NearbyShopVO;
+import com.ruoyi.other.vo.ShopDetailVO;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements ShopService {
+    @Resource
+    private ShopMapper shopMapper;
+
+    @Override
+    public List<NearbyShopVO> nearbyShopList(String longitude, String latitude) {
+        return shopMapper.selectNearbyShopList(longitude,latitude);
+    }
+
+    @Override
+    public ShopDetailVO getShopDetail(Integer shopId, String longitude, String latitude) {
+        // 查询店铺详情
+        ShopDetailVO shopDetailVO = shopMapper.selectShopDetail(shopId);
+        if (shopDetailVO == null) {
+            throw new ServiceException("查询店铺不存在");
+        }
+
+        // 计算距离
+        String shopLocation = String.format("%s,%s", shopDetailVO.getLongitude(), shopDetailVO.getLatitude());
+        String userLocation = String.format("%s,%s", longitude, latitude);
+        Map<String, Double> distanceMap = GeodesyUtil.getDistance(userLocation, shopLocation);
+        Double wGs84 = distanceMap.get("WGs84");
+        shopDetailVO.setDistance(wGs84);
+        return shopDetailVO;
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianServiceImpl.java
new file mode 100644
index 0000000..519f02d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianServiceImpl.java
@@ -0,0 +1,37 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.TechnicianMapper;
+import com.ruoyi.other.api.domain.Technician;
+import com.ruoyi.other.service.TechnicianService;
+import com.ruoyi.other.vo.TechnicianDetailVO;
+import com.ruoyi.other.vo.TechnicianVO;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class TechnicianServiceImpl extends ServiceImpl<TechnicianMapper, Technician> implements TechnicianService {
+    @Resource
+    private TechnicianMapper technicianMapper;
+
+    @Override
+    public List<TechnicianVO> getTechnicianListByShopId(Long shopId) {
+        return technicianMapper.selectTechnicianListByShopId(shopId);
+    }
+
+    @Override
+    public TechnicianDetailVO technicianDetail(Long technicianId) {
+        return technicianMapper.selectTechnicianDetail(technicianId);
+    }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java
new file mode 100644
index 0000000..710c44d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java
@@ -0,0 +1,64 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.redis.annotation.DistributedLock;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.other.api.domain.TechnicianSubscribe;
+import com.ruoyi.other.enums.TechnicianErrorCode;
+import com.ruoyi.other.enums.TechnicianStatus;
+import com.ruoyi.other.mapper.TechnicianMapper;
+import com.ruoyi.other.mapper.TechnicianSubscribeMapper;
+import com.ruoyi.other.service.TechnicianSubscribeService;
+import com.ruoyi.other.vo.TechnicianSubscribeVO;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class TechnicianSubscribeServiceImpl extends ServiceImpl<TechnicianSubscribeMapper, TechnicianSubscribe> implements TechnicianSubscribeService {
+    @Resource
+    private TechnicianSubscribeMapper technicianSubscribeMapper;
+    @Resource
+    private TechnicianMapper technicianMapper;
+
+    @Override
+    public List<TechnicianSubscribeVO> getTechnicianSubscribeByUserAndShop(Long userId, Long shopId) {
+        return technicianSubscribeMapper.getTechnicianSubscribeByUserAndShop(userId, shopId);
+    }
+    @Override
+    public List<TechnicianSubscribeVO> getTechnicianSubscribeByUser(Long userId, Integer status) {
+        return technicianSubscribeMapper.getTechnicianSubscribeByUser(userId, status);
+    }
+
+    @Override
+//    @DistributedLock(lockNamePre = "#technician_subscribe_lock", lockNamePost = "#technicianId")
+    public void subscribe(TechnicianSubscribe subscribe, Long technicianId) {
+//        Long count = technicianSubscribeMapper.selectCount(new LambdaQueryWrapper<TechnicianSubscribe>()
+//                .eq(TechnicianSubscribe::getTechnicianId, technicianId)
+//                .eq(TechnicianSubscribe::getSubscribeTime, subscribe.getSubscribeTime())
+//                .eq(TechnicianSubscribe::getStatus, TechnicianStatus.UNSUBSCRIBE.getCode()));
+//        if (count > 0) {
+//            throw new ServiceException("当前时间段已被预约", TechnicianErrorCode.TECHNICIAN_ALREADY_SUBSCRIBED.getCode());
+//        }
+        // 创建技师预约单
+        Long userId = SecurityUtils.getUserId();
+        subscribe.setAppUserId(userId);
+        subscribe.setStatus(TechnicianStatus.UNSUBSCRIBE.getCode());
+        subscribe.setDelFlag(0);
+        subscribe.setCreateTime(LocalDateTime.now());
+        technicianSubscribeMapper.insert(subscribe);
+
+    }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/VipGoodServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/VipGoodServiceImpl.java
new file mode 100644
index 0000000..807e7b0
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/VipGoodServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.mapper.VipGoodMapper;
+import com.ruoyi.other.api.domain.VipGood;
+import com.ruoyi.other.service.VipGoodService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-11-20
+ */
+@Service
+public class VipGoodServiceImpl extends ServiceImpl<VipGoodMapper, VipGood> implements VipGoodService {
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/GoodsVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/GoodsVO.java
new file mode 100644
index 0000000..03308d7
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/GoodsVO.java
@@ -0,0 +1,53 @@
+package com.ruoyi.other.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@ApiModel(value="商品热销对象", description="热门商品")
+@Data
+public class GoodsVO {
+
+    @ApiModelProperty(value = "商品id")
+    private Long goodsId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "限购数量(-1不限购)")
+    private Integer purchaseLimit;
+
+    @ApiModelProperty(value = "类型(1=服务商品,2=单品商品)")
+    private Integer type;
+
+    @ApiModelProperty(value = "商品简介")
+    private String introduction;
+
+    @ApiModelProperty(value = "商品详情")
+    private String detail;
+
+    @ApiModelProperty(value = "封面图")
+    private String homePagePicture;
+
+    @ApiModelProperty(value = "详情图,多个逗号分隔")
+    private String detailPicture;
+
+    @ApiModelProperty(value = "积分支付(0=否,1=是)")
+    private Integer pointPayment;
+
+    @ApiModelProperty(value = "基础积分")
+    @TableField("integral")
+    private Integer integral;
+
+    @ApiModelProperty(value = "划线价")
+    private BigDecimal originalPrice;
+
+    @ApiModelProperty(value = "基础售价")
+    private BigDecimal sellingPrice;
+
+    @ApiModelProperty(value = "已售数量")
+    private Integer saleNum;
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/Home.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/Home.java
new file mode 100644
index 0000000..7ccccea
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/Home.java
@@ -0,0 +1,105 @@
+package com.ruoyi.other.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value="首页用户信息", description="")
+public class Home {
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+    /**
+     * 头像
+     */
+    @ApiModelProperty(value = "头像")
+    private String avatar;
+    /**
+     * 上级
+     */
+    @ApiModelProperty(value = "上级")
+    private String parentName;
+    /**
+     * 绑定店铺
+     */
+    @ApiModelProperty(value = "绑定店铺")
+    private String shopName;
+
+    /**
+     * 普通会员数量
+     */
+    @ApiModelProperty(value = "普通会员数量")
+    private Integer ordinaryMemberNum;
+
+    /**
+     * 黄金会员数量
+     */
+    @ApiModelProperty(value = "黄金会员数量")
+    private Integer goldenMemberNum;
+
+    /**
+     * 钻石会员数量
+     */
+    @ApiModelProperty(value = "钻石会员数量")
+    private Integer diamondMemberNum;
+
+    /**
+     * 代理数量
+     */
+    @ApiModelProperty(value = "代理数量")
+    private Integer agentNum;
+
+    /**
+     * 准代理数量
+     */
+    @ApiModelProperty(value = "准代理数量")
+    private Integer proxyNum;
+
+    /**
+     * 总代理数量
+     */
+    @ApiModelProperty(value = "总代理数量")
+    private Integer totalAgentNum;
+
+    /**
+     * 合伙人数量
+     */
+    @ApiModelProperty(value = "合伙人数量")
+    private Integer partnerNum;
+
+    /**
+     * 营业时间
+     */
+    @ApiModelProperty(value = "营业星期")
+    private String businessDate;
+
+    /**
+     * 评分
+     */
+    @ApiModelProperty(value = "评分")
+    private BigDecimal score;
+
+    /**
+     * 经度
+     */
+    @ApiModelProperty(value = "经度")
+    private String longitude;
+
+    /**
+     * 纬度
+     */
+    @ApiModelProperty(value = "纬度")
+    private String latitude;
+
+    /**
+     * 地址
+     */
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/NearbyShopVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/NearbyShopVO.java
new file mode 100644
index 0000000..e041a4c
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/NearbyShopVO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.other.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class NearbyShopVO {
+
+    @ApiModelProperty(value = "门店id")
+    private Integer id;
+
+    @ApiModelProperty(value = "封面图片")
+    private String homePicture;
+
+    @ApiModelProperty(value = "门店名称")
+    private String name;
+
+    @ApiModelProperty(value = "详细地址")
+    private String address;
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityDetailVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityDetailVO.java
new file mode 100644
index 0000000..5511f3b
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityDetailVO.java
@@ -0,0 +1,27 @@
+package com.ruoyi.other.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class SeckillActivityDetailVO extends SeckillActivityVO{
+
+    @ApiModelProperty(value = "产品id")
+    private Long goodsId;
+
+    @ApiModelProperty(value = "详情图,多个逗号分隔")
+    private String detailPicture;
+
+    @ApiModelProperty(value = "活动结束日期")
+    private LocalDateTime endTime;
+
+    @ApiModelProperty(value = "可用门店")
+    private List<String> shopList;
+
+    @ApiModelProperty(value = "商品详情")
+    private String detail;
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityVO.java
new file mode 100644
index 0000000..bd8e336
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityVO.java
@@ -0,0 +1,38 @@
+package com.ruoyi.other.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class SeckillActivityVO {
+
+    @ApiModelProperty(value = "活动id")
+    private Integer id;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "商品简介")
+    private String introduction;
+
+    @ApiModelProperty(value = "封面图")
+    private String homePagePicture;
+
+    @ApiModelProperty(value = "划线价")
+    private BigDecimal originalPrice;
+
+    @ApiModelProperty(value = "基础售价")
+    private BigDecimal sellingPrice;
+
+    @ApiModelProperty(value = "已售数量")
+    private Integer saleNum;
+
+    @ApiModelProperty(value = "开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Integer startTime;
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopDetailVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopDetailVO.java
new file mode 100644
index 0000000..96b1aa0
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopDetailVO.java
@@ -0,0 +1,70 @@
+package com.ruoyi.other.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ApiModel(value = "门店详情")
+public class ShopDetailVO {
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    /**
+     * 门店名称
+     */
+    @ApiModelProperty(value = "门店名称")
+    private String name;
+
+    @ApiModelProperty(value = "详情图,多个逗号分隔")
+    private String detailsPicture;
+
+    @ApiModelProperty(value = "资质证书图片")
+    private String certification;
+
+    @ApiModelProperty(value = "营业星期(1,2,3,4,5,6,7)")
+    private String businessDate;
+
+    @ApiModelProperty(value = "开始时间(HH:mm)")
+    private String startTime;
+
+    @ApiModelProperty(value = "结束时间(HH:mm)")
+    private String endTime;
+
+    /**
+     * 联系电话
+     */
+    @ApiModelProperty(value = "联系电话")
+    private List<String> phones;
+
+    /**
+     * 评分
+     */
+    @ApiModelProperty(value = "评分")
+    private BigDecimal score;
+
+    /**
+     * 地址
+     */
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    /**
+     * 距离
+     */
+    @ApiModelProperty(value = "距离")
+    private Double distance;
+
+    @ApiModelProperty(value = "经度")
+    private String longitude;
+
+    @ApiModelProperty(value = "纬度")
+    private String latitude;
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianDetailVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianDetailVO.java
new file mode 100644
index 0000000..e5bc269
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianDetailVO.java
@@ -0,0 +1,50 @@
+package com.ruoyi.other.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class TechnicianDetailVO {
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 技师姓名
+     */
+    @ApiModelProperty(value = "技师姓名")
+    private String name;
+
+    /**
+     * 服务次数
+     */
+    @ApiModelProperty(value = "服务次数")
+    private Integer serviceCount;
+
+    /**
+     * 评分
+     */
+    @ApiModelProperty(value = "评分")
+    private BigDecimal score;
+
+    /**
+     * 简介
+     */
+    @ApiModelProperty(value = "简介")
+    private String introduction;
+
+    /**
+     * 技师封面图
+     */
+    @ApiModelProperty(value = "技师封面图")
+    private String homePicture;
+
+    @ApiModelProperty(value = "技师详情图")
+    private String infoPicture;
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianSubscribeVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianSubscribeVO.java
new file mode 100644
index 0000000..1ec6886
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianSubscribeVO.java
@@ -0,0 +1,54 @@
+package com.ruoyi.other.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value="技师预约对象", description="")
+public class TechnicianSubscribeVO {
+
+    /**
+     * 门店名称
+     */
+    @ApiModelProperty(value = "门店名称")
+    private String shopName;
+
+    /**
+     * 门店地址
+     */
+    @ApiModelProperty(value = "门店地址")
+    private String shopAddress;
+
+    /**
+     * 用户地址
+     */
+    @ApiModelProperty(value = "用户地址")
+    private String userAddress;
+
+    /**
+     * 技师名字
+     */
+    @ApiModelProperty(value = "技师名字")
+    private String technicianName;
+
+    /**
+     * 预约时间
+     */
+    @ApiModelProperty(value = "预约时间")
+    private LocalDateTime subscribeTime;
+
+    /**
+     * 服务方式:1=上门服务,2=到店服务
+     */
+    @ApiModelProperty(value = "服务方式:1=上门服务,2=到店服务")
+    private Integer serviceMode;
+
+    /**
+     * 预约状态:0=待服务,1=已服务,2=已取消
+     */
+    @ApiModelProperty(value = "预约状态:0=待服务,1=已服务,2=已取消 4 已到期")
+    private Integer status;
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianVO.java
new file mode 100644
index 0000000..8b9c9ea
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/TechnicianVO.java
@@ -0,0 +1,28 @@
+package com.ruoyi.other.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class TechnicianVO {
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "技师姓名")
+    private String name;
+
+    @ApiModelProperty(value = "简介")
+    private String introduction;
+
+    @ApiModelProperty(value = "服务次数")
+    private Integer serviceCount;
+
+    @ApiModelProperty(value = "技师封面图")
+    private String homePicture;
+
+    @ApiModelProperty(value = "评分")
+    private BigDecimal score;
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/VerifiableShopVo.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/VerifiableShopVo.java
new file mode 100644
index 0000000..c55dc85
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/VerifiableShopVo.java
@@ -0,0 +1,18 @@
+package com.ruoyi.other.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/11/25 12:08
+ */
+@Data
+@ApiModel
+public class VerifiableShopVo {
+	@ApiModelProperty("门店id")
+	private Integer id;
+	@ApiModelProperty("门店名称")
+	private String name;
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/WalletChangeVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/WalletChangeVO.java
new file mode 100644
index 0000000..61ea79b
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/WalletChangeVO.java
@@ -0,0 +1,24 @@
+package com.ruoyi.other.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel(value="变更明细", description="")
+public class WalletChangeVO {
+
+    @ApiModelProperty(value = "变更类型:1-充值 2-提现 3-红包 4-分佣 5商城购物")
+    private Integer type;
+
+    @ApiModelProperty(value = "变更时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date changeTime;
+
+    @ApiModelProperty(value = "分佣消费金额")
+    private BigDecimal price;
+}

--
Gitblit v1.7.1