Przeglądaj źródła

1.后端框架搭建

GouGengquan 9 miesięcy temu
commit
0b1f33a612
37 zmienionych plików z 1962 dodań i 0 usunięć
  1. 48 0
      .gitignore
  2. 73 0
      biz-base/pom.xml
  3. 15 0
      biz-base/src/main/java/com/dayou/BaseApplication.java
  4. 39 0
      biz-base/src/main/java/com/dayou/controller/AuthController.java
  5. 71 0
      biz-base/src/main/java/com/dayou/controller/UserController.java
  6. 65 0
      biz-base/src/main/java/com/dayou/handler/GlobalException.java
  7. 65 0
      biz-base/src/main/resources/application-local.yaml
  8. 0 0
      biz-base/src/main/resources/application-prod.yaml
  9. 0 0
      biz-base/src/main/resources/application-test.yaml
  10. 5 0
      biz-base/src/main/resources/application.yaml
  11. 27 0
      biz-base/src/test/java/com/dayou/BaseApplicationTests.java
  12. 74 0
      common/pom.xml
  13. 17 0
      common/src/main/java/com/dayou/auth/SaTokenConfigure.java
  14. 87 0
      common/src/main/java/com/dayou/result/Result.java
  15. 35 0
      common/src/main/java/com/dayou/result/Status.java
  16. 58 0
      dao/pom.xml
  17. 16 0
      dao/src/main/java/com/dayou/mapper/UserMapper.java
  18. 23 0
      dao/src/main/resources/mapper/UserMapper.xml
  19. 47 0
      domain/pom.xml
  20. 33 0
      domain/src/main/java/com/dayou/common/BaseEntity.java
  21. 38 0
      domain/src/main/java/com/dayou/dto/LoginByOADTO.java
  22. 48 0
      domain/src/main/java/com/dayou/entity/User.java
  23. 19 0
      domain/src/main/java/com/dayou/vo/UserVO.java
  24. 82 0
      gen/pom.xml
  25. 193 0
      gen/src/main/java/com/dayou/CodeGenerator.java
  26. 92 0
      gen/src/main/resources/template/controller.java.vm
  27. 165 0
      gen/src/main/resources/template/entity.java.vm
  28. 20 0
      gen/src/main/resources/template/mapper.java.vm
  29. 39 0
      gen/src/main/resources/template/mapper.xml.vm
  30. 35 0
      gen/src/main/resources/template/service.java.vm
  31. 69 0
      gen/src/main/resources/template/serviceImpl.java.vm
  32. 145 0
      pom.xml
  33. 55 0
      service/pom.xml
  34. 15 0
      service/src/main/java/com/dayou/service/AuthService.java
  35. 28 0
      service/src/main/java/com/dayou/service/UserService.java
  36. 63 0
      service/src/main/java/com/dayou/service/impl/AuthServiceImpl.java
  37. 58 0
      service/src/main/java/com/dayou/service/impl/UserServiceImpl.java

+ 48 - 0
.gitignore

@@ -0,0 +1,48 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### 自定义忽略文件 ###
+/target/
+.tags
+.tags_sorted_by_file
+.pyc
+__pycache__
+.cache
+.DS_Store
+*.pid
+*Help
+target
+log.*
+log.home_IS_UNDEFINED
+doc/api_doc

+ 73 - 0
biz-base/pom.xml

@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>productivity-platform</artifactId>
+        <groupId>com.dayou</groupId>
+        <version>1.0-PRODUCTIVITY-PLATFORM</version>
+    </parent>
+
+    <artifactId>biz-base</artifactId>
+    <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+    <name>biz-base</name>
+    <description>biz-base</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.dayou</groupId>
+            <artifactId>service</artifactId>
+            <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 15 - 0
biz-base/src/main/java/com/dayou/BaseApplication.java

@@ -0,0 +1,15 @@
+package com.dayou;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@MapperScan("com.dayou.mapper")
+@SpringBootApplication
+public class BaseApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BaseApplication.class, args);
+    }
+
+}

+ 39 - 0
biz-base/src/main/java/com/dayou/controller/AuthController.java

@@ -0,0 +1,39 @@
+package com.dayou.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.dayou.dto.LoginByOADTO;
+import com.dayou.result.Result;
+import com.dayou.result.Status;
+import com.dayou.service.AuthService;
+import com.dayou.vo.UserVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/auth")
+@Slf4j
+public class AuthController {
+
+    @Autowired
+    private AuthService authService;
+
+    /**
+     * 通过oa系统的信息登录到生产力平台,并同步用户信息
+     * @param loginByOADTO 登录信息
+     * @return Result<UserVO>
+     */
+    @PostMapping("/loginByOAInfo")
+    public Result<UserVO> loginByOAInfo(@RequestBody LoginByOADTO loginByOADTO){
+        UserVO userVO = authService.loginByOAInfo(loginByOADTO);
+        if (ObjectUtil.isNotNull(userVO)){
+            return Result.build(Status.SUCCESS, userVO);
+        }else {
+            return Result.build(Status.NOT_LOGIN);
+        }
+    }
+
+}

+ 71 - 0
biz-base/src/main/java/com/dayou/controller/UserController.java

@@ -0,0 +1,71 @@
+package com.dayou.controller;
+
+import com.dayou.result.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.web.bind.annotation.RestController;
+import com.dayou.service.UserService;
+import com.dayou.entity.User;
+import org.springframework.web.bind.annotation.*;
+/**
+ * 
+ *
+ * @author mybatis-plus-generator
+ * @since 2024-10-14
+ */
+@RestController
+@RequestMapping("user")
+@Slf4j
+public class UserController {
+    @Autowired
+    private UserService userService;
+
+    /**
+    * 列表
+    */
+    @GetMapping("/page")
+    public Result<Page<User>> page(User user, Page page){
+        Page<User> pages=userService.selectPage(page,user);
+        return Result.build(pages);
+    }
+
+    /**
+     * 详情
+     */
+    @GetMapping("/detail/{id}")
+    public Result<User> detail(@PathVariable Long id){
+        User xUser =userService.detail(id);
+        return Result.build(xUser);
+     }
+
+    /**
+     * 新增
+     */
+    @PostMapping("/save")
+    public Result<Boolean> save(@RequestBody User user) {
+        Boolean ret = userService.add(user);
+        return Result.build(ret);
+    }
+
+    /**
+     * 更新
+     */
+    @PutMapping("/update")
+    public Result<Boolean> update(@RequestBody User user) {
+        Boolean ret = userService.update(user);
+        return Result.build(ret);
+    }
+
+    /**
+     * 删除
+     */
+    @DeleteMapping("/delete/{id}")
+    public Result<Boolean> delete(@PathVariable Long id) {
+        Boolean ret = userService.delete(id);
+        return Result.build(ret);
+    }
+
+}
+

+ 65 - 0
biz-base/src/main/java/com/dayou/handler/GlobalException.java

@@ -0,0 +1,65 @@
+package com.dayou.handler;
+
+import cn.dev33.satoken.exception.DisableServiceException;
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.exception.NotPermissionException;
+import cn.dev33.satoken.exception.NotRoleException;
+import com.dayou.result.Result;
+import com.dayou.result.Status;
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.MyBatisSystemException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 全局异常处理
+ */
+@ControllerAdvice // 可指定包前缀,比如:(basePackages = "com.xx.xxxx")
+@Slf4j
+public class GlobalException {
+
+    // 在当前类每个方法进入之前触发的操作
+    @ModelAttribute
+    public void get(HttpServletRequest request) throws IOException {
+
+    }
+
+    @ResponseBody
+    @ExceptionHandler
+    public Result handlerException(Exception e, HttpServletRequest request, HttpServletResponse response)
+            throws Exception {
+        if (e instanceof NotLoginException) {
+            // 未登录
+            log.error(e.getMessage());
+            return Result.build(Status.NOT_LOGIN);
+        } else if(e instanceof NotRoleException) {
+            // 无角色
+            log.error(e.getMessage());
+            return Result.build(Status.NOT_ROLE);
+        } else if(e instanceof NotPermissionException) {
+            // 无权限
+            log.error(e.getMessage());
+            return Result.build(Status.NOT_PERMISSION);
+        } else if(e instanceof HttpRequestMethodNotSupportedException) {
+            // 请求异常
+            log.error("Exception Message:",e);
+            return Result.build(Status.REQUEST_ERROR);
+        } else if(e instanceof MyBatisSystemException) {
+            // MyBatis抛出异常
+            log.error("Exception Message:",e);
+            return Result.build(Status.MYBATIS_ERROR);
+        }
+        else {
+            // 其他异常
+            log.error("Exception Message:",e);
+            return Result.build(Status.SYSTEM_ERROR,"请联系开发人员处理!", e.getMessage());
+        }
+    }
+}

+ 65 - 0
biz-base/src/main/resources/application-local.yaml

@@ -0,0 +1,65 @@
+server:
+  port: 9080
+  servlet:
+    context-path: /productivity-platform/
+  error:
+    include-exception: true
+spring:
+  servlet:
+    #文件上传配置
+    multipart:
+      enabled: true
+      max-file-size: 50MB
+      max-request-size: 100MB
+  datasource:
+    username: root
+    password: 914851221
+    url: jdbc:mysql://localhost:3306/productivity-platform?autoReconnect=true&useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.alibaba.druid.pool.DruidDataSource
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+  mvc:
+    static-path-pattern: /**
+mybatis-plus:
+  mapper-locations: classpath*:mapper/**/*Mapper.xml
+  type-aliases-package: com.dayou.entity
+  #debug
+  configuration:
+    #关闭日志:org.apache.ibatis.logging.nologging.NoLoggingImpl 开启日志:org.apache.ibatis.logging.stdout.StdOutImpl
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    # mybatis映射到实体的驼峰命名
+    mapUnderscoreToCamelCase: true
+  global-config:
+    db-config:
+      id-type: auto
+      logic-delete-field: deleted
+      logic-delete-value: 1
+      logic-not-delete-value: 0
+#分页插件
+pagehelper:
+  helperDialect: mysql
+  reasonable: true
+  supportMethodsArguments: true
+  pageSizeZero: false
+  params: count=countSql
+
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
+sa-token:
+  # token 名称(同时也是 cookie 名称)
+  token-name: token
+  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
+  timeout: 86400
+  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
+  active-timeout: -1
+  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
+  is-concurrent: true
+  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
+  is-share: true
+  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
+  token-style: random-64
+  # 是否输出操作日志
+  is-log: true
+
+# oa系统的api url
+oa-api-url: localhost:8088/api/

+ 0 - 0
biz-base/src/main/resources/application-prod.yaml


+ 0 - 0
biz-base/src/main/resources/application-test.yaml


+ 5 - 0
biz-base/src/main/resources/application.yaml

@@ -0,0 +1,5 @@
+spring:
+  profiles:
+    active: local
+  application:
+    name: productivity-platform

+ 27 - 0
biz-base/src/test/java/com/dayou/BaseApplicationTests.java

@@ -0,0 +1,27 @@
+package com.dayou;
+
+import cn.hutool.core.lang.Console;
+import cn.hutool.http.Header;
+import cn.hutool.http.HttpRequest;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class BaseApplicationTests {
+
+    @Test
+    void contextLoads() {
+
+    }
+
+    @Test
+    void hutoolPostTest(){
+        //链式构建请求
+        String result = HttpRequest.post("localhost:8088/api/auth/checkOaToken?token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNzI5MDc1MTI5LCJpYXQiOjE3Mjg5ODg3Mjl9.KC1n8xRJBfvJL4C0wQXZ9xRQX_opisIznyDkWHW3NxyDvEEM3K-bm7cnJ7BLYNCroOEbaEj6V5OdQ-YK2RGERg")
+                .timeout(20000)//超时,毫秒
+                .execute().body();
+        Boolean tokenStatus = Boolean.valueOf(result);
+        Console.log(tokenStatus);
+    }
+
+}

+ 74 - 0
common/pom.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>productivity-platform</artifactId>
+        <groupId>com.dayou</groupId>
+        <version>1.0-PRODUCTIVITY-PLATFORM</version>
+    </parent>
+
+    <artifactId>common</artifactId>
+    <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+    <name>common</name>
+    <description>common</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+
+        <!--模板代码生成-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+
+        <!--权限框架-->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+
+    </build>
+
+</project>

+ 17 - 0
common/src/main/java/com/dayou/auth/SaTokenConfigure.java

@@ -0,0 +1,17 @@
+package com.dayou.auth;
+
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class SaTokenConfigure implements WebMvcConfigurer {
+    // 注册 Sa-Token 拦截器,打开注解式鉴权功能
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        // 注册 Sa-Token 拦截器,打开注解式鉴权功能
+        registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
+    }
+}
+

+ 87 - 0
common/src/main/java/com/dayou/result/Result.java

@@ -0,0 +1,87 @@
+package com.dayou.result;
+
+public class Result<T> {
+    //状态码
+    private Integer code;
+    //错误的状态信息
+    private String message;
+    //数据
+    private T data;
+
+    //get方法:获取状态码
+    public Integer getCode() {
+        return code;
+    }
+    //get方法:获取错误状态信息
+    public String getMessage() {
+        return message;
+    }
+    //get方法:获取数据内容
+    public T getData() {
+        return data;
+    }
+    /**
+     * 构造器(私有化),这里写了3个构造器。根据实际发开需要添加即可
+     */
+    private Result(Integer code,String message,T data){
+        this.code=code;
+        this.message=message;
+        this.data=data;
+    }
+    private Result(Integer code,String message){
+        this.code=code;
+        this.message=message;
+    }
+    private Result(String message){
+        this.message=message;
+    }
+
+    //下面就是根据需要返回不同参数格式的方法
+    /**
+     * 返回《状态码》《状态信息》《数据》
+     * 状态码来自--->>枚举
+     * 状态信息来自--->>开发人员
+     * 数据来自--->>开发人员
+     */
+    public static <T> Result<T> build(Status code,String message,T data){
+        return new Result<T>(code.getCode(),message,data);
+
+    }
+
+    /**
+     * 返回《状态码》《状态信息》《状态信息》
+     * 状态码来自--->>枚举
+     * 状态信息来自--->>开发人员
+     */
+    public static <T> Result<T> build(Status code,String message){
+        return new Result<T>(code.getCode(),message);
+    }
+    /**
+     * 返回《状态码》《状态信息》《数据》
+     * 状态码来自--->>枚举
+     * 状态信息来自--->>枚举
+     * 数据来自--->>开发人员
+     */
+    public static <T> Result<T> build(Status code,T data){
+        return new Result<T>(code.getCode(),code.getMessage(),data);
+    }
+    /**
+     * 返回《状态码》《状态信息》《数据》
+     * 状态码来自--->>枚举
+     * 状态信息来自--->>枚举
+     * 数据来自--->>开发人员
+     */
+    public static <T> Result<T> build(Status code){
+        return new Result<T>(code.getCode(),code.getMessage());
+    }
+
+    /**
+     * 返回《状态码》《状态信息》《数据》
+     * 状态码来自--->>枚举
+     * 状态信息来自--->>枚举
+     * 数据来自--->>开发人员
+     */
+    public static <T> Result<T> build(T data){
+        return new Result<T>(Status.SUCCESS.getCode(), Status.SUCCESS.getMessage(),data);
+    }
+}

+ 35 - 0
common/src/main/java/com/dayou/result/Status.java

@@ -0,0 +1,35 @@
+package com.dayou.result;
+
+public enum Status {
+    SUCCESS(200,"请求成功"),
+    PARAM_ERROR(201,"参数异常"),
+    SYSTEM_ERROR(500,"系统异常"),
+    MYBATIS_ERROR(501,"SQL语句或数据库连接异常"),
+    REQUEST_ERROR(502,"请求异常"),
+    NOT_LOGIN(701,"用户未登录"),
+    NOT_ROLE(702,"用户无角色"),
+    NOT_PERMISSION(703,"用户无权限")
+    ;
+    //状态码
+    private Integer code;
+    //错误信息
+    private String message;
+    //构造器
+    Status(Integer code,String message){
+        this.code=code;
+        this.message=message;
+    }
+    //只需要添加get方法就行
+    public Integer getCode() {
+        return code;
+    }
+    public String getMessage() {
+        return message;
+    }
+
+    @Override
+    public String toString() {
+        return code+":"+message;
+    }
+}
+

+ 58 - 0
dao/pom.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>productivity-platform</artifactId>
+        <groupId>com.dayou</groupId>
+        <version>1.0-PRODUCTIVITY-PLATFORM</version>
+    </parent>
+
+    <artifactId>dao</artifactId>
+    <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+    <name>dao</name>
+    <description>dao</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.dayou</groupId>
+            <artifactId>domain</artifactId>
+            <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+
+    </build>
+
+</project>

+ 16 - 0
dao/src/main/java/com/dayou/mapper/UserMapper.java

@@ -0,0 +1,16 @@
+package com.dayou.mapper;
+
+import com.dayou.entity.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author mybatis-plus-generator
+ * @since 2024-10-14
+ */
+public interface UserMapper extends BaseMapper<User> {
+
+}

+ 23 - 0
dao/src/main/resources/mapper/UserMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dayou.mapper.UserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.dayou.entity.User">
+        <result column="id" property="id" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="name" property="name" />
+        <result column="staff_no" property="staffNo" />
+        <result column="delete_status" property="deleteStatus" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,
+        create_time,
+        update_time,
+        name, staff_no, delete_status
+    </sql>
+
+</mapper>

+ 47 - 0
domain/pom.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>productivity-platform</artifactId>
+        <groupId>com.dayou</groupId>
+        <version>1.0-PRODUCTIVITY-PLATFORM</version>
+    </parent>
+
+    <artifactId>domain</artifactId>
+    <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+    <name>domain</name>
+    <description>domain</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.dayou</groupId>
+            <artifactId>common</artifactId>
+            <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+
+    </build>
+
+</project>

+ 33 - 0
domain/src/main/java/com/dayou/common/BaseEntity.java

@@ -0,0 +1,33 @@
+package com.dayou.common;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class BaseEntity {
+
+    /**
+     * 主键自增id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    protected Long id;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+
+    /**
+     * 标志位
+     */
+    private Boolean deleteStatus;
+
+}

+ 38 - 0
domain/src/main/java/com/dayou/dto/LoginByOADTO.java

@@ -0,0 +1,38 @@
+package com.dayou.dto;
+
+import lombok.Data;
+
+@Data
+public class LoginByOADTO {
+
+    /**
+     * 用户在oa系统中的userId
+     */
+    private Long userOaId;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 员工工号
+     */
+    private String staffNo;
+
+    /**
+     * 部门id
+     */
+    private String departmentIds;
+
+    /**
+     * 岗位id
+     */
+    private String postIds;
+
+    /**
+     * oa系统token
+     */
+    private String oaToken;
+
+}

+ 48 - 0
domain/src/main/java/com/dayou/entity/User.java

@@ -0,0 +1,48 @@
+package com.dayou.entity;
+import com.dayou.common.BaseEntity;
+
+import java.io.Serializable;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author mybatis-plus-generator
+ * @since 2024-10-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class User extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 用户在oa系统中的userId
+     */
+    private Long userOaId;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 员工工号
+     */
+    private String staffNo;
+
+    /**
+     * 部门id
+     */
+    private String departmentIds;
+
+    /**
+     * 岗位id
+     */
+    private String postIds;
+
+
+}

+ 19 - 0
domain/src/main/java/com/dayou/vo/UserVO.java

@@ -0,0 +1,19 @@
+package com.dayou.vo;
+
+import com.dayou.entity.User;
+import lombok.Data;
+
+@Data
+public class UserVO extends User {
+
+    /**
+     * token名字
+     */
+    private String tokenName;
+
+    /**
+     * token值
+     */
+    private String tokenValue;
+
+}

+ 82 - 0
gen/pom.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>productivity-platform</artifactId>
+        <groupId>com.dayou</groupId>
+        <version>1.0-PRODUCTIVITY-PLATFORM</version>
+    </parent>
+
+    <artifactId>gen</artifactId>
+    <version>1.0-PRODUCTIVITY-PLATFORM</version>
+    <name>gen</name>
+    <description>gen</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+    <dependencies>
+
+        <dependency>
+            <groupId>com.dayou</groupId>
+            <artifactId>domain</artifactId>
+            <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.smallbun.screw</groupId>
+            <artifactId>screw-core</artifactId>
+            <version>1.0.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.11</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.3.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!--模板代码生成-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+
+    </build>
+
+</project>

+ 193 - 0
gen/src/main/java/com/dayou/CodeGenerator.java

@@ -0,0 +1,193 @@
+package com.dayou;
+
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
+import com.dayou.common.BaseEntity;
+
+import java.util.*;
+
+/**
+ * 代码生成器 基于mybatis-plus
+ */
+public class CodeGenerator {
+    /**
+     * <p>
+     * 读取控制台内容
+     * </p>
+     */
+    public static String scanner(String tip) {
+        Scanner scanner = new Scanner(System.in);
+        StringBuilder help = new StringBuilder();
+        help.append("请输入" + tip + ":");
+        System.out.println(help.toString());
+        if (scanner.hasNext()) {
+            String ipt = scanner.next();
+            if (StringUtils.isNotEmpty(ipt)) {
+                return ipt;
+            }
+        }
+        throw new MybatisPlusException("请输入正确的" + tip + "!");
+    }
+
+    public static void main(String[] args) {
+        // 代码生成器
+        AutoGenerator mpg = new AutoGenerator();
+
+        // 全局配置
+        GlobalConfig gc = new GlobalConfig();
+        final String projectPath = System.getProperty("user.dir");
+        //如果需要额外生成一个备份,则设置输出路径,否则直接设为null,因为下面每个模块已经单独设置了输出目录
+        //gc.setOutputDir(projectPath+"/gen");
+        gc.setOutputDir(null);
+        gc.setAuthor("mybatis-plus-generator");
+        gc.setOpen(true);
+        gc.setBaseResultMap(true);
+        gc.setBaseColumnList(true);
+        gc.setServiceName("%sService");  // 去掉 Service 接口的首字母 I
+        mpg.setGlobalConfig(gc);
+
+        // 数据源配置
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://localhost:3306/productivity-platform?autoReconnect=true&useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true");
+        // dsc.setSchemaName("public");
+        dsc.setDriverName("com.mysql.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("914851221");
+        mpg.setDataSource(dsc);
+
+
+        // 包配置
+        final PackageConfig pc = new PackageConfig();
+//        pc.setController(".controller.gen");
+        pc.setController("controller");
+//        pc.setModuleName(scanner("模块名"));
+        String basePkg = "com.dayou";
+        pc.setParent(basePkg);
+        mpg.setPackageInfo(pc);
+
+
+        // 自定义配置
+        /*InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // to do nothing
+                Map<String, Object> map = new HashMap<>();
+                map.put("resp", basePkg + ".common.RestResponse");
+                map.put("pullDownModel", basePkg + ".common.PullDownModel");
+                map.put("basePkg", basePkg);
+                this.setMap(map);
+            }
+        };*/
+
+        // 如果模板引擎是 freemarker
+//        String templatePath = "/templates/mapper.xml.ftl";
+        // 如果模板引擎是 velocity
+        String templatePath = "template/mapper.xml.vm";
+        String entityTemplatePath = "template/entity.java.vm";
+        String serviceTemplatePath = "template/service.java.vm";
+        String serviceImplTemplatePath = "template/serviceImpl.java.vm";
+        String controllerTemplatePath = "template/controller.java.vm";
+        String mapperTemplatePath = "template/mapper.java.vm";
+
+        // 自定义输出配置,输出的文件不会覆盖现有文件
+        List<FileOutConfig> focList = new ArrayList<>();
+
+        // 自定义配置会被优先输出
+        focList.add(new FileOutConfig(templatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return projectPath + "/dao" + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+            }
+        });
+
+        String basePkgPath = "/com/dayou";
+        focList.add(new FileOutConfig(entityTemplatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return projectPath + "/domain" + "/src/main/java" + basePkgPath + "/entity/" + tableInfo.getEntityName() + StringPool.DOT_JAVA;
+            }
+        });
+        focList.add(new FileOutConfig(serviceTemplatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return projectPath + "/service" + "/src/main/java" + basePkgPath + "/service/" + tableInfo.getServiceName() + StringPool.DOT_JAVA;
+            }
+        });
+        focList.add(new FileOutConfig(serviceImplTemplatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return projectPath + "/service" + "/src/main/java" + basePkgPath + "/service/impl/" + tableInfo.getServiceImplName() + StringPool.DOT_JAVA;
+            }
+        });
+        focList.add(new FileOutConfig(controllerTemplatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return projectPath + "/biz-base" + "/src/main/java" + basePkgPath + "/controller/" + tableInfo.getControllerName() + StringPool.DOT_JAVA;
+                //return projectPath + "/biz-custom/biz-education" + "/src/main/java" + basePkgPath + "/controller/" + tableInfo.getControllerName() + StringPool.DOT_JAVA;
+            }
+        });
+        focList.add(new FileOutConfig(mapperTemplatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return projectPath + "/dao" + "/src/main/java" + basePkgPath + "/mapper/" + tableInfo.getMapperName() + StringPool.DOT_JAVA;
+            }
+        });
+        /*
+        cfg.setFileCreate(new IFileCreate() {
+            @Override
+            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
+                // 判断自定义文件夹是否需要创建
+                checkDir("调用默认方法创建的目录");
+                return false;
+            }
+        });
+        */
+        /*cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);*/
+
+        // 配置模板
+        TemplateConfig templateConfig = new TemplateConfig();
+        // 配置自定义输出模板
+        //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
+        templateConfig.setEntity("template/entity.java");
+        templateConfig.setService("template/service.java");
+        templateConfig.setServiceImpl("template/serviceImpl.java");
+        templateConfig.setController("template/controller.java");
+        templateConfig.setXml("template/mapper.xml");
+        templateConfig.setMapper("template/mapper.java");
+        mpg.setTemplate(templateConfig);
+
+        // 策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setSuperEntityClass(BaseEntity.class);
+        strategy.setSuperMapperClass("com.baomidou.mybatisplus.core.mapper.BaseMapper");
+        strategy.setEntityLombokModel(true);
+        strategy.setRestControllerStyle(true);
+        strategy.setControllerMappingHyphenStyle(true);
+        // 公共父类
+//        strategy.setSuperControllerClass(basePkg + ".controller.BaseController");
+        // 写于父类中的公共字段
+        strategy.setSuperEntityColumns("id", "create_time", "update_time", "delete_status");
+        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
+        strategy.setControllerMappingHyphenStyle(true);
+        strategy.setTablePrefix(pc.getModuleName() + "_");
+        mpg.setStrategy(strategy);
+        mpg.setTemplateEngine(new VelocityTemplateEngine());
+        mpg.execute();
+    }
+}

+ 92 - 0
gen/src/main/resources/template/controller.java.vm

@@ -0,0 +1,92 @@
+package ${package.Controller};
+
+import com.dayou.result.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+#if(${restControllerStyle})
+import org.springframework.web.bind.annotation.RestController;
+#else
+import org.springframework.stereotype.Controller;
+#end
+#if(${superControllerClassPackage})
+import ${superControllerClassPackage};
+#end
+import ${package.Service}.${table.serviceName};
+import ${package.Entity}.${table.entityName};
+import org.springframework.web.bind.annotation.*;
+/**
+ * $!{table.comment}
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${restControllerStyle})
+@RestController
+#else
+@Controller
+#end
+##@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
+@RequestMapping("${table.entityPath}")
+@Slf4j
+#if(${kotlin})
+class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end
+
+#else
+#if(${superControllerClass})
+public class ${table.controllerName} extends ${superControllerClass} {
+#else
+public class ${table.controllerName} {
+#end
+    @Autowired
+    private ${table.serviceName} ${table.entityPath}Service;
+
+    /**
+    * $!{table.comment}列表
+    */
+    @GetMapping("/page")
+    public Result<Page<${table.entityName}>> page(${table.entityName} ${table.entityPath}, Page page){
+        Page<${table.entityName}> pages=${table.entityPath}Service.selectPage(page,${table.entityPath});
+        return Result.build(pages);
+    }
+
+    /**
+     * $!{table.comment}详情
+     */
+    @GetMapping("/detail/{id}")
+    public Result<${table.entityName}> detail(@PathVariable Long id){
+        ${table.entityName} x${table.entityName} =${table.entityPath}Service.detail(id);
+        return Result.build(x${table.entityName});
+     }
+
+    /**
+     * $!{table.comment}新增
+     */
+    @PostMapping("/save")
+    public Result<Boolean> save(@RequestBody ${table.entityName} ${table.entityPath}) {
+        Boolean ret = ${table.entityPath}Service.add(${table.entityPath});
+        return Result.build(ret);
+    }
+
+    /**
+     * $!{table.comment}更新
+     */
+    @PutMapping("/update")
+    public Result<Boolean> update(@RequestBody ${table.entityName} ${table.entityPath}) {
+        Boolean ret = ${table.entityPath}Service.update(${table.entityPath});
+        return Result.build(ret);
+    }
+
+    /**
+     * $!{table.comment}删除
+     */
+    @DeleteMapping("/delete/{id}")
+    public Result<Boolean> delete(@PathVariable Long id) {
+        Boolean ret = ${table.entityPath}Service.delete(id);
+        return Result.build(ret);
+    }
+
+}
+
+#end

+ 165 - 0
gen/src/main/resources/template/entity.java.vm

@@ -0,0 +1,165 @@
+package ${package.Entity};
+#foreach($field in ${table.fields})
+  #if(${field.name.equals("name")})
+    #set($hasName=true)
+  #end
+#end
+#foreach($pkg in ${table.importPackages})
+import ${pkg};
+#end
+
+import java.io.Serializable;
+
+#if(${swagger2})
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+#end
+#if(${entityLombokModel})
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+#if(${chainModel})
+import lombok.experimental.Accessors;
+#end
+#end
+/**
+ * <p>
+ * $!{table.comment}
+ * </p>
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${entityLombokModel})
+@Data
+  #if(${superEntityClass})
+@EqualsAndHashCode(callSuper = true)
+  #else
+@EqualsAndHashCode(callSuper = false)
+  #end
+  #if(${chainModel})
+@Accessors(chain = true)
+  #end
+#end
+#if(${table.convert})
+@TableName("${table.name}")
+#end
+#if(${swagger2})
+@ApiModel(value="${entity}对象", description="$!{table.comment}")
+#end
+#if(${superEntityClass})
+public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end implements Serializable {
+#elseif(${activeRecord})
+public class ${entity} extends Model<${entity}> {
+#else
+public class ${entity} implements Serializable {
+#end
+
+#if(${entitySerialVersionUID})
+    private static final long serialVersionUID=1L;
+#end
+## ----------  BEGIN 字段循环遍历  ----------
+#foreach($field in ${table.fields})
+
+#if(${field.keyFlag})
+#set($keyPropertyName=${field.propertyName})
+#end
+#if("$!field.comment" != "")
+  #if(${swagger2})
+    @ApiModelProperty(value = "${field.comment}")
+  #else
+    /**
+     * ${field.comment}
+     */
+  #end
+#end
+#if(${field.keyFlag})
+## 主键
+  #if(${field.keyIdentityFlag})
+    @TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)
+  #elseif(!$null.isNull(${idType}) && "$!idType" != "")
+    @TableId(value = "${field.annotationColumnName}", type = IdType.${idType})
+  #elseif(${field.convert})
+    @TableId("${field.annotationColumnName}")
+  #end
+## 普通字段
+#elseif(${field.fill})
+## -----   存在字段填充设置   -----
+  #if(${field.convert})
+    @TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})
+  #else
+    @TableField(fill = FieldFill.${field.fill})
+  #end
+#elseif(${field.convert})
+    @TableField("${field.annotationColumnName}")
+#end
+## 乐观锁注解
+#if(${versionFieldName}==${field.name})
+    @Version
+#end
+## 逻辑删除注解
+#if(${logicDeleteFieldName}==${field.name})
+    @TableLogic
+#end
+    private ${field.propertyType} ${field.propertyName};
+#end
+## ----------  END 字段循环遍历  ----------
+
+#if(!${entityLombokModel})
+#foreach($field in ${table.fields})
+  #if(${field.propertyType.equals("boolean")})
+    #set($getprefix="is")
+  #else
+    #set($getprefix="get")
+  #end
+
+    public ${field.propertyType} ${getprefix}${field.capitalName}() {
+        return ${field.propertyName};
+    }
+
+  #if(${chainModel})
+    public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+  #else
+    public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+  #end
+        this.${field.propertyName} = ${field.propertyName};
+  #if(${chainModel})
+        return this;
+  #end
+    }
+#end
+## --foreach end---
+#end
+## --end of #if(!${entityLombokModel})--
+
+#if(${entityColumnConstant})
+  #foreach($field in ${table.fields})
+    public static final String ${field.name.toUpperCase()} = "${field.name}";
+
+  #end
+#end
+#if(${activeRecord})
+    @Override
+    protected Serializable pkVal() {
+  #if(${keyPropertyName})
+        return this.${keyPropertyName};
+  #else
+        return null;
+  #end
+    }
+
+#end
+#if(!${entityLombokModel})
+    @Override
+    public String toString() {
+        return "${entity}{" +
+  #foreach($field in ${table.fields})
+    #if($!{foreach.index}==0)
+        "${field.propertyName}=" + ${field.propertyName} +
+    #else
+        ", ${field.propertyName}=" + ${field.propertyName} +
+    #end
+  #end
+        "}";
+    }
+#end
+}

+ 20 - 0
gen/src/main/resources/template/mapper.java.vm

@@ -0,0 +1,20 @@
+package ${package.Mapper};
+
+import ${package.Entity}.${entity};
+import ${superMapperClassPackage};
+
+/**
+ * <p>
+ * $!{table.comment} Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${kotlin})
+interface ${table.mapperName} : ${superMapperClass}<${entity}>
+#else
+public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
+
+}
+#end

+ 39 - 0
gen/src/main/resources/template/mapper.xml.vm

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="${package.Mapper}.${table.mapperName}">
+
+#if(${enableCache})
+    <!-- 开启二级缓存 -->
+    <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
+
+#end
+#if(${baseResultMap})
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
+#foreach($field in ${table.fields})
+#if(${field.keyFlag})##生成主键排在第一位
+        <id column="${field.name}" property="${field.propertyName}" />
+#end
+#end
+#foreach($field in ${table.commonFields})##生成公共字段
+        <result column="${field.name}" property="${field.propertyName}" />
+#end
+#foreach($field in ${table.fields})
+#if(!${field.keyFlag})##生成普通字段
+        <result column="${field.name}" property="${field.propertyName}" />
+#end
+#end
+    </resultMap>
+
+#end
+#if(${baseColumnList})
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+#foreach($field in ${table.commonFields})
+        ${field.columnName},
+#end
+        ${table.fieldNames}
+    </sql>
+
+#end
+</mapper>

+ 35 - 0
gen/src/main/resources/template/service.java.vm

@@ -0,0 +1,35 @@
+package ${package.Service};
+#foreach($field in ${table.fields})
+        #if(${field.name.equals("name")})
+                #set($hasName=true)
+        #end
+#end
+import ${package.Entity}.${entity};
+import ${superServiceClassPackage};
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+/**
+ * <p>
+ * $!{table.comment} 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${kotlin})
+interface ${table.serviceName} : ${superServiceClass}<${entity}>
+#else
+public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {
+
+        Page<${table.entityName}> selectPage(Page page,${table.entityName} ${table.entityPath});
+
+        ${table.entityName} detail(Long id);
+
+        Boolean add(${table.entityName} ${table.entityPath});
+
+        Boolean update(${table.entityName} ${table.entityPath});
+
+        Boolean delete(Long id);
+
+}
+#end

+ 69 - 0
gen/src/main/resources/template/serviceImpl.java.vm

@@ -0,0 +1,69 @@
+package ${package.ServiceImpl};
+
+import ${package.Entity}.${entity};
+import ${package.Mapper}.${table.mapperName};
+import ${package.Service}.${table.serviceName};
+import ${superServiceImplClassPackage};
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import java.util.List;
+import java.util.ArrayList;
+import org.springframework.transaction.annotation.Transactional;
+#foreach($field in ${table.fields})
+    #if(${field.name.equals("name")})
+        #set($hasName=true)
+    #end
+#end
+
+/**
+ * <p>
+ * $!{table.comment} 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+@Service
+#if(${kotlin})
+open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} {
+
+}
+#else
+public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {
+
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Page<${table.entityName}> selectPage(Page page,${table.entityName} ${table.entityPath}){
+        return this.page(page, new QueryWrapper<${table.entityName}>(${table.entityPath}));
+    }
+
+
+    @Override
+    public ${table.entityName} detail(Long id){
+        return this.getById(id);
+    }
+
+    @Override
+    public Boolean add(${table.entityName} ${table.entityPath}){
+        return  this.save(${table.entityPath});
+    }
+
+    @Override
+    public Boolean update(${table.entityName} ${table.entityPath}){
+        return  this.updateById(${table.entityPath});
+    }
+
+    @Override
+    public Boolean delete(Long id){
+        //逻辑删除
+        return this.removeById(id);
+    }
+}
+#end

+ 145 - 0
pom.xml

@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.dayou</groupId>
+    <artifactId>productivity-platform</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0-PRODUCTIVITY-PLATFORM</version>
+
+    <modules>
+        <module>biz-base</module>
+        <module>common</module>
+        <module>dao</module>
+        <module>domain</module>
+        <module>service</module>
+        <module>gen</module>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+        <java.version>1.8</java.version>
+        <spring-boot.version>2.3.1.RELEASE</spring-boot.version>
+        <druid.version>1.2.23</druid.version>
+        <mysql-connector.version>8.0.16</mysql-connector.version>
+        <mybatis-plus.version>3.3.2</mybatis-plus.version>
+        <lombok.version>1.18.34</lombok.version>
+        <hutool.version>5.8.32</hutool.version>
+        <fastjson2.version>2.0.53</fastjson2.version>
+        <pagehelper.version>2.1.0</pagehelper.version>
+        <commons-fileupload.version>1.5</commons-fileupload.version>
+        <sa-token.version>1.39.0</sa-token.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid-spring-boot-starter</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+
+            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql-connector.version}</version>
+            </dependency>
+
+            <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+
+            <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+
+            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+                <scope>provided</scope>
+            </dependency>
+
+            <!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
+            <dependency>
+                <groupId>com.alibaba.fastjson2</groupId>
+                <artifactId>fastjson2</artifactId>
+                <version>${fastjson2.version}</version>
+            </dependency>
+
+            <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
+            <dependency>
+                <groupId>com.github.pagehelper</groupId>
+                <artifactId>pagehelper-spring-boot-starter</artifactId>
+                <version>${pagehelper.version}</version>
+            </dependency>
+
+            <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
+            <dependency>
+                <groupId>commons-fileupload</groupId>
+                <artifactId>commons-fileupload</artifactId>
+                <version>${commons-fileupload.version}</version>
+            </dependency>
+
+            <!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
+            <dependency>
+                <groupId>cn.dev33</groupId>
+                <artifactId>sa-token-spring-boot-starter</artifactId>
+                <version>${sa-token.version}</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <mainClass>com.dayou.BaseApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 55 - 0
service/pom.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>productivity-platform</artifactId>
+        <groupId>com.dayou</groupId>
+        <version>1.0-PRODUCTIVITY-PLATFORM</version>
+    </parent>
+
+    <artifactId>service</artifactId>
+    <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+    <name>service</name>
+    <description>service</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.dayou</groupId>
+            <artifactId>dao</artifactId>
+            <version>0.0.1-PRODUCTIVITY-PLATFORM</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+
+    </build>
+
+</project>

+ 15 - 0
service/src/main/java/com/dayou/service/AuthService.java

@@ -0,0 +1,15 @@
+package com.dayou.service;
+
+import com.dayou.dto.LoginByOADTO;
+import com.dayou.vo.UserVO;
+
+public interface AuthService {
+
+    /**
+     * 通过oa系统的信息登录到生产力平台,并同步用户信息
+     * @param loginByOADTO 登录信息
+     * @return UserVO
+     */
+    UserVO loginByOAInfo(LoginByOADTO loginByOADTO);
+
+}

+ 28 - 0
service/src/main/java/com/dayou/service/UserService.java

@@ -0,0 +1,28 @@
+package com.dayou.service;
+
+import com.dayou.entity.User;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author mybatis-plus-generator
+ * @since 2024-10-14
+ */
+public interface UserService extends IService<User> {
+
+    Page<User> selectPage(Page page, User user);
+
+    User detail(Long id);
+
+    Boolean add(User user);
+
+    Boolean update(User user);
+
+    Boolean delete(Long id);
+
+}

+ 63 - 0
service/src/main/java/com/dayou/service/impl/AuthServiceImpl.java

@@ -0,0 +1,63 @@
+package com.dayou.service.impl;
+
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.http.Header;
+import cn.hutool.http.HttpRequest;
+import com.dayou.dto.LoginByOADTO;
+import com.dayou.entity.User;
+import com.dayou.mapper.UserMapper;
+import com.dayou.service.AuthService;
+import com.dayou.vo.UserVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AuthServiceImpl implements AuthService {
+
+    @Value("${oa-api-url}")
+    private String oaApiUrl;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    /**
+     * 通过oa系统的信息登录到生产力平台,并同步用户信息
+     * @param loginByOADTO 登录信息
+     * @return UserVO
+     */
+    @Override
+    public UserVO loginByOAInfo(LoginByOADTO loginByOADTO) {
+
+        // 带上oa系统的token,调用oa系统判断token合法性的接口(返回Boolean)
+        // TODO:改成OA返回用户信息,生产力平台保存,只需要前端提交token
+        String result = HttpRequest.post(oaApiUrl + "/auth/checkOaToken?token=" + loginByOADTO.getOaToken())
+                .timeout(20000)//超时,毫秒
+                .execute().body();
+        boolean tokenStatus = Boolean.parseBoolean(result);
+
+        // 判断token是否过期(true:过期或无效,false:未过期)
+        if (tokenStatus){
+            // 同步oa的user信息
+            User user = BeanUtil.copyProperties(loginByOADTO, User.class);
+            userMapper.insert(user);
+
+            // 在生产力平台登录
+            StpUtil.login(loginByOADTO.getUserOaId(), new SaLoginModel()
+                    .setDevice("PC")                // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
+                    .setIsLastingCookie(true)        // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
+                    .setToken(loginByOADTO.getOaToken()) // 指定此次登录生成的Token(使用oa系统的token)
+                    .setIsWriteHeader(false)         // 是否在登录后将 Token 写入到响应头
+                    .setActiveTimeout(86400)           // 指定此次登录token的最低活跃频率, 单位:秒,设置此参数需要在配置文件打开dynamicActiveTimeout=true
+            );
+            UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
+            userVO.setTokenName(StpUtil.getTokenName());
+            userVO.setTokenValue(StpUtil.getTokenValue());
+            return userVO;
+        }else {
+            return null;
+        }
+    }
+}

+ 58 - 0
service/src/main/java/com/dayou/service/impl/UserServiceImpl.java

@@ -0,0 +1,58 @@
+package com.dayou.service.impl;
+
+import com.dayou.entity.User;
+import com.dayou.mapper.UserMapper;
+import com.dayou.service.UserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import java.util.List;
+import java.util.ArrayList;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author mybatis-plus-generator
+ * @since 2024-10-14
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
+
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Page<User> selectPage(Page page,User user){
+        return this.page(page, new QueryWrapper<User>(user));
+    }
+
+
+    @Override
+    public User detail(Long id){
+        return this.getById(id);
+    }
+
+    @Override
+    public Boolean add(User user){
+        return  this.save(user);
+    }
+
+    @Override
+    public Boolean update(User user){
+        return  this.updateById(user);
+    }
+
+    @Override
+    public Boolean delete(Long id){
+        //逻辑删除
+        return this.removeById(id);
+    }
+}