Bläddra i källkod

【项目开发】

1.开发中
ChenYL 11 månader sedan
förälder
incheckning
76a57e2a21
29 ändrade filer med 903 tillägg och 33 borttagningar
  1. 55 0
      data-easy/src/main/java/com/dataeasy/server/atomic/entity/SubscriptionTaskConfig.java
  2. 22 4
      data-easy/src/main/java/com/dataeasy/server/atomic/entity/SysScheduleTaskLog.java
  3. 14 0
      data-easy/src/main/java/com/dataeasy/server/atomic/mapper/SubscriptionTaskConfigMapper.java
  4. 7 0
      data-easy/src/main/java/com/dataeasy/server/atomic/service/IDataDaLeTouService.java
  5. 21 0
      data-easy/src/main/java/com/dataeasy/server/atomic/service/ISubscriptionTaskConfigService.java
  6. 14 0
      data-easy/src/main/java/com/dataeasy/server/atomic/service/ISysScheduleTaskLogService.java
  7. 28 0
      data-easy/src/main/java/com/dataeasy/server/atomic/service/IUserService.java
  8. 8 1
      data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/DataDaLeTouServiceImpl.java
  9. 38 0
      data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/SubscriptionTaskConfigServiceImpl.java
  10. 14 1
      data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/SysScheduleTaskLogServiceImpl.java
  11. 36 0
      data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/UserServiceImpl.java
  12. 21 0
      data-easy/src/main/java/com/dataeasy/server/constant/HzApiStatusEnum.java
  13. 36 0
      data-easy/src/main/java/com/dataeasy/server/constant/ScheduleTaskEnum.java
  14. 20 0
      data-easy/src/main/java/com/dataeasy/server/constant/ScheduleTaskLaunchMethodEnum.java
  15. 23 0
      data-easy/src/main/java/com/dataeasy/server/constant/ScheduleTaskStatusEnum.java
  16. 26 0
      data-easy/src/main/java/com/dataeasy/server/pojo/user/LoginRequest.java
  17. 25 0
      data-easy/src/main/java/com/dataeasy/server/pojo/user/NicknameRequest.java
  18. 22 0
      data-easy/src/main/java/com/dataeasy/server/pojo/user/UserInfoVO.java
  19. 21 0
      data-easy/src/main/java/com/dataeasy/server/service/controller/HealthController.java
  20. 30 0
      data-easy/src/main/java/com/dataeasy/server/service/controller/TokenController.java
  21. 55 0
      data-easy/src/main/java/com/dataeasy/server/service/controller/UserController.java
  22. 35 0
      data-easy/src/main/java/com/dataeasy/server/service/manager/IScheduleTaskManager.java
  23. 23 0
      data-easy/src/main/java/com/dataeasy/server/service/manager/ITokenManager.java
  24. 33 0
      data-easy/src/main/java/com/dataeasy/server/service/manager/IUserManager.java
  25. 42 0
      data-easy/src/main/java/com/dataeasy/server/service/manager/impl/TokenManagerImpl.java
  26. 87 0
      data-easy/src/main/java/com/dataeasy/server/service/manager/impl/UserManagerImpl.java
  27. 76 0
      data-easy/src/main/java/com/dataeasy/server/task/DaLeTouTask.java
  28. 21 2
      doc/sql/schema.sql
  29. 50 25
      doc/技术文档.md

+ 55 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/entity/SubscriptionTaskConfig.java

@@ -0,0 +1,55 @@
+package com.dataeasy.server.atomic.entity;
+
+import com.dataeasy.server.common.pojo.BaseEntity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 订阅源与定时任务配置表
+ * @date 2025/3/6 15:09
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "subscription_task_config")
+public class SubscriptionTaskConfig extends BaseEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 定时任务编码
+     */
+    @Column(name = "task_code")
+    private String taskCode;
+
+    /**
+     * 定时任务名称
+     */
+    @Column(name = "task_name")
+    private String taskName;
+
+    /**
+     * 订阅源ID
+     */
+    @Column(name = "subscription_source_id")
+    private Long subscriptionSourceId;
+
+    /**
+     * 执行选项(ENABLE-开启、DISABLE-关闭)
+     */
+    @Column(name = "execute_option")
+    private String executeOption;
+}

+ 22 - 4
data-easy/src/main/java/com/dataeasy/server/atomic/entity/SysScheduleTaskLog.java

@@ -1,10 +1,16 @@
 package com.dataeasy.server.atomic.entity;
 
 import com.dataeasy.server.common.pojo.BaseEntity;
+import com.dataeasy.server.constant.ScheduleTaskEnum;
+import com.dataeasy.server.constant.ScheduleTaskLaunchMethodEnum;
+import com.dataeasy.server.constant.ScheduleTaskStatusEnum;
 import jakarta.persistence.Column;
 import jakarta.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -17,6 +23,9 @@ import java.util.Date;
  * @date 2025/3/6 15:09
  */
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 @EqualsAndHashCode(callSuper = true)
 @Table(name = "sys_schedule_task_log")
 public class SysScheduleTaskLog extends BaseEntity implements Serializable {
@@ -26,9 +35,10 @@ public class SysScheduleTaskLog extends BaseEntity implements Serializable {
 
     /**
      * 定时任务编码
+     * @see ScheduleTaskEnum
      */
     @Column(name = "task_code")
-    private String taskCode;
+    private ScheduleTaskEnum taskCode;
 
     /**
      * 定时任务名称
@@ -38,9 +48,10 @@ public class SysScheduleTaskLog extends BaseEntity implements Serializable {
 
     /**
      * 启动方式(AUTO-自动,MANUAL-手动)
+     * @see ScheduleTaskLaunchMethodEnum
      */
     @Column(name = "launch_method")
-    private String launchMethod;
+    private ScheduleTaskLaunchMethodEnum launchMethod;
 
     /**
      * 任务开始时间
@@ -55,8 +66,15 @@ public class SysScheduleTaskLog extends BaseEntity implements Serializable {
     private Date endTime;
 
     /**
-     * 执行状态(DOING-执行中,SUCCESS-成功,FAIL-失败)
+     * 执行状态(RUNNING-执行中,SUCCESS-成功,FAIL-失败)
+     * @see ScheduleTaskStatusEnum
      */
     @Column(name = "process_status")
-    private String processStatus;
+    private ScheduleTaskStatusEnum processStatus;
+
+    /**
+     * 错误信息
+     */
+    @Column(name = "error_message")
+    private String errorMessage;
 }

+ 14 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/mapper/SubscriptionTaskConfigMapper.java

@@ -0,0 +1,14 @@
+package com.dataeasy.server.atomic.mapper;
+
+import com.dataeasy.server.atomic.entity.SubscriptionTaskConfig;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 订阅源与定时任务配置表 mapper
+ * @date 2025/3/6 15:30
+ */
+public interface SubscriptionTaskConfigMapper extends Mapper<SubscriptionTaskConfig> {
+
+}

+ 7 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/service/IDataDaLeTouService.java

@@ -1,5 +1,7 @@
 package com.dataeasy.server.atomic.service;
 
+import com.dataeasy.server.atomic.entity.DataDaLeTou;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -8,4 +10,9 @@ package com.dataeasy.server.atomic.service;
  */
 public interface IDataDaLeTouService {
 
+    /**
+     * 新增记录
+     * @param daLeTou
+     */
+    void insert(DataDaLeTou daLeTou);
 }

+ 21 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/service/ISubscriptionTaskConfigService.java

@@ -0,0 +1,21 @@
+package com.dataeasy.server.atomic.service;
+
+import com.dataeasy.server.atomic.entity.SubscriptionTaskConfig;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 订阅源与定时任务配置表 service
+ * @date 2025/3/6 15:31
+ */
+public interface ISubscriptionTaskConfigService {
+
+    /**
+     * 根据定时任务编码获取配置列表
+     * @param taskCode
+     * @return
+     */
+    List<SubscriptionTaskConfig> getByTaskCode(String taskCode);
+}

+ 14 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/service/ISysScheduleTaskLogService.java

@@ -1,5 +1,7 @@
 package com.dataeasy.server.atomic.service;
 
+import com.dataeasy.server.atomic.entity.SysScheduleTaskLog;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -7,4 +9,16 @@ package com.dataeasy.server.atomic.service;
  * @date 2025/3/6 15:31
  */
 public interface ISysScheduleTaskLogService {
+
+    /**
+     * 新增记录
+     * @param taskLog
+     */
+    void insert(SysScheduleTaskLog taskLog);
+
+    /**
+     * 根据ID更新
+     * @param taskLog
+     */
+    void updateById(SysScheduleTaskLog taskLog);
 }

+ 28 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/service/IUserService.java

@@ -1,5 +1,7 @@
 package com.dataeasy.server.atomic.service;
 
+import com.dataeasy.server.atomic.entity.User;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -7,4 +9,30 @@ package com.dataeasy.server.atomic.service;
  * @date 2025/3/6 15:31
  */
 public interface IUserService {
+
+    /**
+     * 根据ID查找用户
+     * @param id
+     * @return
+     */
+    User getById(Long id);
+
+    /**
+     * 根据小程序openId获取用户
+     * @param maOpenId 小程序openid
+     * @return
+     */
+    User getByMaOpenId(String maOpenId);
+
+    /**
+     * 新增用户
+     * @param user
+     */
+    void insert(User user);
+
+    /**
+     * 根据ID更新
+     * @param user
+     */
+    void updateById(User user);
 }

+ 8 - 1
data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/DataDaLeTouServiceImpl.java

@@ -1,5 +1,7 @@
 package com.dataeasy.server.atomic.service.impl;
 
+import com.dataeasy.server.atomic.entity.DataDaLeTou;
+import com.dataeasy.server.common.utils.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -16,6 +18,11 @@ import com.dataeasy.server.atomic.service.IDataDaLeTouService;
 public class DataDaLeTouServiceImpl implements IDataDaLeTouService {
 
     @Autowired
-    private DataDaLeTouMapper mapper;
+    private DataDaLeTouMapper daLeTouMapper;
 
+    @Override
+    public void insert(DataDaLeTou daLeTou) {
+        Assert.isNull(daLeTou);
+        daLeTouMapper.insert(daLeTou);
+    }
 }

+ 38 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/SubscriptionTaskConfigServiceImpl.java

@@ -0,0 +1,38 @@
+package com.dataeasy.server.atomic.service.impl;
+
+import com.dataeasy.server.atomic.entity.SubscriptionTaskConfig;
+import com.dataeasy.server.common.utils.Assert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.dataeasy.server.atomic.mapper.SubscriptionTaskConfigMapper;
+import com.dataeasy.server.atomic.service.ISubscriptionTaskConfigService;
+import tk.mybatis.mapper.entity.Example;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 订阅源与定时任务配置表 service
+ * @date 2025/3/6 15:32
+ */
+@Service
+public class SubscriptionTaskConfigServiceImpl implements ISubscriptionTaskConfigService {
+
+    @Autowired
+    private SubscriptionTaskConfigMapper taskConfigMapper;
+
+    @Override
+    public List<SubscriptionTaskConfig> getByTaskCode(String taskCode) {
+        Assert.isNull(taskCode);
+        Weekend<SubscriptionTaskConfig> weekend = Weekend.of(SubscriptionTaskConfig.class);
+        WeekendCriteria<SubscriptionTaskConfig, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andEqualTo(SubscriptionTaskConfig::getTaskCode, taskCode);
+        // TODO 缺了一个executeOption字段
+        weekend.selectProperties(SubscriptionTaskConfig::getSubscriptionSourceId);
+        return taskConfigMapper.selectByExample(weekend);
+    }
+}

+ 14 - 1
data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/SysScheduleTaskLogServiceImpl.java

@@ -1,5 +1,7 @@
 package com.dataeasy.server.atomic.service.impl;
 
+import com.dataeasy.server.atomic.entity.SysScheduleTaskLog;
+import com.dataeasy.server.common.utils.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -16,6 +18,17 @@ import com.dataeasy.server.atomic.service.ISysScheduleTaskLogService;
 public class SysScheduleTaskLogServiceImpl implements ISysScheduleTaskLogService {
 
     @Autowired
-    private SysScheduleTaskLogMapper mapper;
+    private SysScheduleTaskLogMapper taskLogMapper;
 
+    @Override
+    public void insert(SysScheduleTaskLog taskLog) {
+        Assert.isNull(taskLog);
+        taskLogMapper.insert(taskLog);
+    }
+
+    @Override
+    public void updateById(SysScheduleTaskLog taskLog) {
+        Assert.isNull(taskLog);
+        taskLogMapper.updateByPrimaryKeySelective(taskLog);
+    }
 }

+ 36 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/UserServiceImpl.java

@@ -1,10 +1,15 @@
 package com.dataeasy.server.atomic.service.impl;
 
+import com.dataeasy.server.atomic.entity.User;
 import com.dataeasy.server.atomic.mapper.UserMapper;
 import com.dataeasy.server.atomic.service.IUserService;
+import com.dataeasy.server.common.utils.Assert;
+import io.micrometer.common.util.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Objects;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -16,4 +21,35 @@ public class UserServiceImpl implements IUserService {
 
     @Autowired
     private UserMapper userMapper;
+
+    @Override
+    public User getById(Long id) {
+        if (Objects.isNull(id)) {
+            return null;
+        }
+        return userMapper.selectByPrimaryKey(id);
+    }
+
+    @Override
+    public User getByMaOpenId(String openId) {
+        if (StringUtils.isBlank(openId)) {
+            return null;
+        }
+
+        User queryUser = new User();
+        queryUser.setMaOpenId(openId);
+        return userMapper.selectOne(queryUser);
+    }
+
+    @Override
+    public void insert(User user) {
+        Assert.isNull(user);
+        userMapper.insert(user);
+    }
+
+    @Override
+    public void updateById(User user) {
+        Assert.isNull(user);
+        userMapper.updateByPrimaryKeySelective(user);
+    }
 }

+ 21 - 0
data-easy/src/main/java/com/dataeasy/server/constant/HzApiStatusEnum.java

@@ -0,0 +1,21 @@
+package com.dataeasy.server.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 接口盒子响应状态枚举(200-成功,400-错误)
+ * @date 2025/3/6 21:06
+ */
+@Getter
+@AllArgsConstructor
+public enum HzApiStatusEnum {
+
+    SUCCESS(200, "成功"),
+    ERROR(400, "错误");
+
+    private Integer code;
+    private String msg;
+}

+ 36 - 0
data-easy/src/main/java/com/dataeasy/server/constant/ScheduleTaskEnum.java

@@ -0,0 +1,36 @@
+package com.dataeasy.server.constant;
+
+import com.dataeasy.server.atomic.entity.SysScheduleTaskLog;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Date;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 定时任务枚举
+ * @date 2025/3/6 20:25
+ */
+@Getter
+@AllArgsConstructor
+public enum ScheduleTaskEnum {
+
+    DA_LE_TOU("大乐透定时任务");
+
+    private String name;
+
+    /**
+     * 创建定时任务执行记录
+     * @return
+     */
+    public SysScheduleTaskLog buildTaskLog() {
+        return SysScheduleTaskLog.builder()
+                .taskCode(ScheduleTaskEnum.DA_LE_TOU)
+                .taskName(this.name)
+                .startTime(new Date())
+                .processStatus(ScheduleTaskStatusEnum.RUNNING)
+                .launchMethod(ScheduleTaskLaunchMethodEnum.AUTO)
+                .build();
+    }
+}

+ 20 - 0
data-easy/src/main/java/com/dataeasy/server/constant/ScheduleTaskLaunchMethodEnum.java

@@ -0,0 +1,20 @@
+package com.dataeasy.server.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 定时任务启动方式枚举(AUTO-自动,MANUAL-手动)
+ * @date 2025/3/6 20:42
+ */
+@Getter
+@AllArgsConstructor
+public enum ScheduleTaskLaunchMethodEnum {
+
+    AUTO("自动"),
+    MANUAL("手动");
+
+    private String name;
+}

+ 23 - 0
data-easy/src/main/java/com/dataeasy/server/constant/ScheduleTaskStatusEnum.java

@@ -0,0 +1,23 @@
+package com.dataeasy.server.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 定时任务执行状态枚举(RUNNING-执行中,SUCCESS-成功,FAIL-失败)
+ * @date 2025/3/6 20:29
+ */
+@Getter
+@AllArgsConstructor
+public enum ScheduleTaskStatusEnum {
+
+    RUNNING("运行中"),
+
+    SUCCESS("已停止"),
+
+    FAIL("失败");
+
+    private String name;
+}

+ 26 - 0
data-easy/src/main/java/com/dataeasy/server/pojo/user/LoginRequest.java

@@ -0,0 +1,26 @@
+package com.dataeasy.server.pojo.user;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * @className LoginRequest
+ * @description 微信小程序登录DTO
+ * @author ChenYL
+ * @date 2023/07/23 16:09
+ * @version V1.0
+ **/
+@Data
+public class LoginRequest {
+
+    /**
+     * 微信小程序登录时获取的 code
+     */
+    @NotBlank(message = "微信code不能为空")
+    private String code;
+
+    /**
+     * 昵称
+     */
+    private String nickname;
+}

+ 25 - 0
data-easy/src/main/java/com/dataeasy/server/pojo/user/NicknameRequest.java

@@ -0,0 +1,25 @@
+package com.dataeasy.server.pojo.user;
+
+import org.hibernate.validator.constraints.Length;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户昵称 dto
+ * @date 2024/12/18 14:18
+ */
+@Data
+@EqualsAndHashCode
+public class NicknameRequest {
+
+    /**
+     * 昵称
+     */
+    @NotBlank(message = "昵称不能为空")
+    @Length(max = 30, message = "昵称长度不能超过30")
+    private String nickname;
+}

+ 22 - 0
data-easy/src/main/java/com/dataeasy/server/pojo/user/UserInfoVO.java

@@ -0,0 +1,22 @@
+package com.dataeasy.server.pojo.user;
+
+import java.math.BigDecimal;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户信息 VO
+ * @date 2024/11/25 19:42
+ */
+@Data
+@EqualsAndHashCode
+public class UserInfoVO {
+
+    /**
+     * 微信昵称
+     */
+    private String nickname;
+}

+ 21 - 0
data-easy/src/main/java/com/dataeasy/server/service/controller/HealthController.java

@@ -0,0 +1,21 @@
+package com.dataeasy.server.service.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author ChenYL
+ * @version V1.0
+ * @description 健康检查
+ * @date 2023/10/04 16:21
+ **/
+@RestController
+@RequestMapping("/health")
+public class HealthController {
+
+    @GetMapping("/info")
+    public String info() {
+        return "小石后端服务 正在运行";
+    }
+}

+ 30 - 0
data-easy/src/main/java/com/dataeasy/server/service/controller/TokenController.java

@@ -0,0 +1,30 @@
+package com.dataeasy.server.service.controller;
+
+import com.dataeasy.server.service.manager.ITokenManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author myou
+ * @version 1.0.0
+ * @date 2024/12/28 21:28
+ * @description JWT controller
+ */
+@RestController
+@RequestMapping("/token")
+public class TokenController {
+
+    @Autowired
+    private ITokenManager tokenManager;
+
+    /**
+     * 刷新token
+     * @return
+     */
+    @GetMapping("/refreshToken")
+    public String refreshToken() {
+        return tokenManager.refreshToken();
+    }
+}

+ 55 - 0
data-easy/src/main/java/com/dataeasy/server/service/controller/UserController.java

@@ -0,0 +1,55 @@
+package com.dataeasy.server.service.controller;
+
+import com.dataeasy.server.pojo.user.LoginRequest;
+import com.dataeasy.server.pojo.user.NicknameRequest;
+import com.dataeasy.server.pojo.user.UserInfoVO;
+import com.dataeasy.server.service.manager.IUserManager;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户 controller
+ * @date 2024/12/13 15:09
+ */
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+    @Autowired
+    private IUserManager userManager;
+
+    /**
+     * 用户登录
+     * @param request
+     * @return 访问凭据
+     */
+    @PostMapping("/login")
+    public String login(@RequestBody @Validated LoginRequest request) throws WxErrorException {
+        return userManager.login(request);
+    }
+
+    /**
+     * 查询当前用户信息
+     * @return
+     */
+    @GetMapping("/queryUserInfo")
+    public UserInfoVO queryUserInfo() {
+        return userManager.queryUserInfo();
+    }
+
+    /**
+     * 修改昵称
+     */
+    @PostMapping("/modifyNickname")
+    public void modifyNickname(@RequestBody @Validated NicknameRequest request) {
+        userManager.modifyNickname(request);
+    }
+}

+ 35 - 0
data-easy/src/main/java/com/dataeasy/server/service/manager/IScheduleTaskManager.java

@@ -0,0 +1,35 @@
+package com.dataeasy.server.service.manager;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 定时任务管理
+ * @date 2025/3/6 20:14
+ */
+public interface IScheduleTaskManager {
+
+    /**
+     * 大乐透定时任务
+     */
+    void autoDaLeTou();
+
+    /**
+     * 双色球定时任务
+     */
+    void autoShuangSeQiu();
+
+    /**
+     * 新债定时任务
+     */
+    void autoBond();
+
+    /**
+     * 新股定时任务
+     */
+    void autoStock();
+
+    /**
+     * ProductHunt热榜定时任务
+     */
+    void autoProductHunt();
+}

+ 23 - 0
data-easy/src/main/java/com/dataeasy/server/service/manager/ITokenManager.java

@@ -0,0 +1,23 @@
+package com.dataeasy.server.service.manager;
+
+/**
+ * @author myou
+ * @version 1.0.0
+ * @date 2024/12/28 21:22
+ * @description Json Web Token 管理类
+ */
+public interface ITokenManager {
+
+    /**
+     * 创建Token
+     * @param userId
+     * @return
+     */
+    String createToken(Long userId);
+
+    /**
+     * 刷新token
+     * @return
+     */
+    String refreshToken();
+}

+ 33 - 0
data-easy/src/main/java/com/dataeasy/server/service/manager/IUserManager.java

@@ -0,0 +1,33 @@
+package com.dataeasy.server.service.manager;
+
+
+import com.dataeasy.server.atomic.entity.User;
+import com.dataeasy.server.pojo.user.LoginRequest;
+import com.dataeasy.server.pojo.user.NicknameRequest;
+import com.dataeasy.server.pojo.user.UserInfoVO;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户 服务类
+ * @date 2024/11/30 14:28
+ */
+public interface IUserManager {
+
+    /**
+     * 用户登陆
+     */
+    String login(LoginRequest request) throws WxErrorException;
+
+    /**
+     * 查询当前用户信息
+     * @return
+     */
+    UserInfoVO queryUserInfo();
+
+    /**
+     * 修改昵称
+     */
+    void modifyNickname(NicknameRequest request);
+}

+ 42 - 0
data-easy/src/main/java/com/dataeasy/server/service/manager/impl/TokenManagerImpl.java

@@ -0,0 +1,42 @@
+package com.dataeasy.server.service.manager.impl;
+
+import java.util.Calendar;
+import java.util.Optional;
+
+import com.dataeasy.server.common.exception.BusinessException;
+import com.dataeasy.server.common.utils.Assert;
+import com.dataeasy.server.core.config.BizConfig;
+import com.dataeasy.server.service.manager.ITokenManager;
+import com.dataeasy.server.utiis.TokenUtils;
+import com.dataeasy.server.utiis.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author myou
+ * @version 1.0.0
+ * @date 2024/12/28 21:24
+ * @description Json Web Token 管理类
+ */
+@Service
+public class TokenManagerImpl implements ITokenManager {
+
+    @Autowired
+    private BizConfig bizConfig;
+
+    @Override
+    public String createToken(Long userId) {
+        Assert.isNullInBusiness(userId, "请传入用户ID");
+        Calendar instance = Calendar.getInstance();
+        instance.add(Calendar.DATE, bizConfig.getTokenExpire());
+        return TokenUtils.createToken(userId, instance.getTime());
+    }
+
+    @Override
+    public String refreshToken() {
+        // 获取用户信息
+        Long currentUserId =
+            Optional.ofNullable(UserUtils.getCurrentUserId()).orElseThrow(() -> BusinessException.fail("无法获取当前用户ID"));
+        return createToken(currentUserId);
+    }
+}

+ 87 - 0
data-easy/src/main/java/com/dataeasy/server/service/manager/impl/UserManagerImpl.java

@@ -0,0 +1,87 @@
+package com.dataeasy.server.service.manager.impl;
+
+import java.math.BigDecimal;
+import java.util.Objects;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import com.dataeasy.server.atomic.entity.User;
+import com.dataeasy.server.atomic.service.IUserService;
+import com.dataeasy.server.common.utils.Assert;
+import com.dataeasy.server.pojo.user.LoginRequest;
+import com.dataeasy.server.pojo.user.NicknameRequest;
+import com.dataeasy.server.pojo.user.UserInfoVO;
+import com.dataeasy.server.service.manager.ITokenManager;
+import com.dataeasy.server.service.manager.IUserManager;
+import com.dataeasy.server.utiis.UserUtils;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户 服务类
+ * @date 2024/11/30 14:28
+ */
+@Slf4j
+@Service
+public class UserManagerImpl implements IUserManager {
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private WxMaService wxMaService;
+
+    @Autowired
+    private ITokenManager tokenManager;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String login(LoginRequest request) throws WxErrorException {
+        // 微信登录
+        WxMaJscode2SessionResult wxMaJscode2SessionResult = wxMaService.jsCode2SessionInfo(request.getCode());
+
+        // 获取用户记录
+        User user = userService.getByMaOpenId(wxMaJscode2SessionResult.getOpenid());
+
+        // 存在责更新用户信息,没有则创建新用户
+        if (Objects.isNull(user)) {
+            user = new User();
+            user.setUnionId(wxMaJscode2SessionResult.getUnionid());
+            user.setMaOpenId(wxMaJscode2SessionResult.getOpenid());
+            user.setNickname(request.getNickname());
+            userService.insert(user);
+        } else {
+            User updateUser = new User();
+            updateUser.setId(user.getId());
+            updateUser.setNickname(request.getNickname());
+            userService.updateById(updateUser);
+        }
+
+        // 创建token
+        return tokenManager.createToken(user.getId());
+    }
+
+    @Override
+    public UserInfoVO queryUserInfo() {
+        Long currentUserId = UserUtils.getCurrentUserId();
+        User user = userService.getById(currentUserId);
+        UserInfoVO userInfoVO = new UserInfoVO();
+        BeanUtils.copyProperties(user, userInfoVO);
+        return userInfoVO;
+    }
+
+    @Override
+    public void modifyNickname(NicknameRequest request) {
+        User user = new User();
+        user.setId(UserUtils.getCurrentUserId());
+        user.setNickname(request.getNickname());
+        userService.updateById(user);
+    }
+}

+ 76 - 0
data-easy/src/main/java/com/dataeasy/server/task/DaLeTouTask.java

@@ -0,0 +1,76 @@
+package com.dataeasy.server.task;
+
+import com.dataeasy.server.atomic.entity.DataDaLeTou;
+import com.dataeasy.server.atomic.entity.SysScheduleTaskLog;
+import com.dataeasy.server.atomic.service.IDataDaLeTouService;
+import com.dataeasy.server.atomic.service.ISubscriptionTaskConfigService;
+import com.dataeasy.server.atomic.service.ISysScheduleTaskLogService;
+import com.dataeasy.server.common.exception.BusinessException;
+import com.dataeasy.server.constant.HzApiStatusEnum;
+import com.dataeasy.server.constant.ScheduleTaskEnum;
+import com.dataeasy.server.constant.ScheduleTaskStatusEnum;
+import com.dataeasy.server.feign.dto.hzapi.DaLeTouResponse;
+import com.dataeasy.server.service.manager.IHzApiManager;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Objects;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 大乐透定时任务
+ * @date 2025/3/6 20:19
+ */
+@Slf4j
+@Component
+public class DaLeTouTask {
+
+    @Autowired
+    private ISysScheduleTaskLogService taskLogService;
+
+    @Autowired
+    private IHzApiManager iHzApiManager;
+
+    @Autowired
+    private IDataDaLeTouService daLeTouService;
+
+    @Autowired
+    private ISubscriptionTaskConfigService taskConfigService;
+
+    public void execute() {
+        log.info("======= {} 开始执行 =======", ScheduleTaskEnum.DA_LE_TOU.getName());
+        // 新增任务执行记录
+        SysScheduleTaskLog addTaskLog = ScheduleTaskEnum.DA_LE_TOU.buildTaskLog();
+        taskLogService.insert(addTaskLog);
+
+        // 拉取数据
+        DaLeTouResponse daLeTouResponse = iHzApiManager.getDaLeTou();
+        if (Objects.isNull(daLeTouResponse)) {
+            log.warn("拉取大乐透数据失败,返回结果对象为空");
+            return;
+        }
+        if (!HzApiStatusEnum.SUCCESS.getCode().equals(daLeTouResponse.getCode())) {
+            log.warn("拉取大乐透数据失败,接口盒子返回错误信息:{}", daLeTouResponse.getMsg());
+            return;
+        }
+
+        // 数据入库
+        DataDaLeTou addDaLeTou = new DataDaLeTou();
+        BeanUtils.copyProperties(daLeTouResponse, addDaLeTou);
+        daLeTouService.insert(addDaLeTou);
+
+        // 寻找要推送数据的用户
+        // 推送数据
+
+        // 更新任务执行记录
+        SysScheduleTaskLog updateTaskLog = new SysScheduleTaskLog();
+        updateTaskLog.setId(addTaskLog.getId());
+        updateTaskLog.setProcessStatus(ScheduleTaskStatusEnum.SUCCESS);
+        taskLogService.updateById(updateTaskLog);
+
+        log.info("======= {} 执行结束 =======", ScheduleTaskEnum.DA_LE_TOU.getName());
+    }
+}

+ 21 - 2
doc/sql/schema.sql

@@ -233,7 +233,7 @@ CREATE TABLE `sys_schedule_task_log` (
   `launch_method` varchar(10) NOT NULL COMMENT '启动方式(AUTO-自动,MANUAL-手动)',
   `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '任务开始时间',
   `end_time` timestamp DEFAULT NULL COMMENT '任务结束时间',
-  `process_status` varchar(10) NOT NULL COMMENT '执行状态(DOING-执行中,SUCCESS-成功,FAIL-失败)',
+  `process_status` varchar(10) NOT NULL COMMENT '执行状态(RUNNING-执行中,SUCCESS-成功,FAIL-失败)',
   `created_by` bigint NOT NULL COMMENT '创建人',
   `creation_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
   `last_updated_by` bigint NOT NULL COMMENT '最后更新人',
@@ -316,6 +316,22 @@ CREATE TABLE `subscription_user_log` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户的订阅日志表';
 
+-- 订阅源与定时任务配置表
+CREATE TABLE `subscription_task_config` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `task_code` varchar(30) NOT NULL COMMENT '定时任务编码',
+  `task_name` varchar(100) NOT NULL COMMENT '定时任务名称',
+  `subscription_source_id` bigint NOT NULL COMMENT '订阅源ID',
+  `execute_option` varchar(10) NOT NULL COMMENT '执行选项(ENABLE-开启、DISABLE-关闭)',
+  `created_by` bigint NOT NULL COMMENT '创建人',
+  `creation_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `last_updated_by` bigint NOT NULL COMMENT '最后更新人',
+  `last_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
+  `version` bigint NOT NULL DEFAULT '1' COMMENT '版本号',
+  `delete_flag` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标志(0-未删除,1-已删除)',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='订阅源与定时任务配置表';
+
 -- 订单表
 CREATE TABLE `subscription_order` (
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
@@ -333,4 +349,7 @@ CREATE TABLE `subscription_order` (
   `version` bigint NOT NULL DEFAULT '1' COMMENT '版本号',
   `delete_flag` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标志(0-未删除,1-已删除)',
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='订单表';
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='订单表';
+
+ALTER TABLE data_easy.sys_schedule_task_log ADD error_message varchar(300) NULL COMMENT '错误信息';
+ALTER TABLE data_easy.sys_schedule_task_log CHANGE error_message error_message varchar(300) NULL COMMENT '错误信息' AFTER process_status;

+ 50 - 25
doc/技术文档.md

@@ -5,9 +5,10 @@
 ## 系统功能
 
 * 用户
-  * 登录
-  * 注销
-  * 修改昵称
+  * (已开发,待测试)登录
+  * (小程序支持即可)注销
+  * (已开发,待测试)修改昵称
+  * (已开发,待测试)查询用户基本信息
 * 小程序
   * 可订阅列表查询
   * 已订阅列表查询
@@ -21,8 +22,11 @@
     * 大乐透
     * Product Hunt的top30榜单
 * 订单历史记录查询
+* 微信用户关注服务号登记
+* 微信用户支付处理
 * 系统定时任务
   * 获取新股、新债数据并推送
+    * 拉取数据、获取待推送用户、推送
   * 获取双色球数据并推送
   * 获取大乐透数据并推送
   * 获取Product Hunt数据并推送
@@ -293,28 +297,6 @@
 
 
 
-### 定时任务执行记录表
-
-表名:sys_schedule_task_log
-
-| 字段             | 类型         | 描述                                              |
-| ---------------- | ------------ | ------------------------------------------------- |
-| id               | bigint       | 主键                                              |
-| task_code        | varchar(100) | 定时任务编码                                      |
-| task_name        | varchar(100) | 定时任务名称                                      |
-| launch_method    | varchar(10)  | 启动方式(AUTO-自动,MANUAL-手动)                |
-| start_time       | timestamp    | 任务开始时间                                      |
-| end_time         | timestamp    | 任务结束时间                                      |
-| process_status   | varchar(10)  | 执行状态(DOING-执行中,SUCCESS-成功,FAIL-失败) |
-| created_by       | bigint       | 创建人                                            |
-| creation_time    | timestamp    | 创建时间                                          |
-| last_updated_by  | bigint       | 最后更新人                                        |
-| last_update_time | timestamp    | 最后更新时间                                      |
-| version          | bigint       | 版本号                                            |
-| delete_flag      | tinyint      | 逻辑删除标志(0-未删除,1-已删除)                |
-
-
-
 ### 订阅源表
 
 表名:subscription_source
@@ -378,6 +360,49 @@
 
 
 
+### 订阅源与定时任务配置表
+
+表名:subscription_task_config
+
+| 字段                   | 类型         | 描述                                |
+| ---------------------- | ------------ | ----------------------------------- |
+| id                     | bigint       | 主键                                |
+| task_code              | varchar(30)  | 定时任务编码                        |
+| task_name              | varchar(100) | 定时任务名称                        |
+| subscription_source_id | bigint       | 订阅源ID                            |
+| execute_option         | varchar(10)  | 执行选项(ENABLE-开启、DISABLE-关闭) |
+| created_by             | bigint       | 创建人                              |
+| creation_time          | timestamp    | 创建时间                            |
+| last_updated_by        | bigint       | 最后更新人                          |
+| last_update_time       | timestamp    | 最后更新时间                        |
+| version                | bigint       | 版本号                              |
+| delete_flag            | tinyint      | 逻辑删除标志(0-未删除,1-已删除)  |
+
+
+
+### 定时任务执行记录表
+
+表名:sys_schedule_task_log
+
+| 字段             | 类型         | 描述                                                |
+| ---------------- | ------------ | --------------------------------------------------- |
+| id               | bigint       | 主键                                                |
+| task_code        | varchar(100) | 定时任务编码                                        |
+| task_name        | varchar(100) | 定时任务名称                                        |
+| launch_method    | varchar(10)  | 启动方式(AUTO-自动,MANUAL-手动)                  |
+| start_time       | timestamp    | 任务开始时间                                        |
+| end_time         | timestamp    | 任务结束时间                                        |
+| process_status   | varchar(10)  | 执行状态(RUNNING-执行中,SUCCESS-成功,FAIL-失败) |
+| error_message    | varchar(300) | 错误信息                                            |
+| created_by       | bigint       | 创建人                                              |
+| creation_time    | timestamp    | 创建时间                                            |
+| last_updated_by  | bigint       | 最后更新人                                          |
+| last_update_time | timestamp    | 最后更新时间                                        |
+| version          | bigint       | 版本号                                              |
+| delete_flag      | tinyint      | 逻辑删除标志(0-未删除,1-已删除)                  |
+
+
+
 ### 用户的订阅日志表
 
 表名:subscription_user_log