diff --git a/API-Document.md b/API-Document.md
index d838f9a..b535785 100644
--- a/API-Document.md
+++ b/API-Document.md
@@ -1,4 +1,4 @@
-# Dscape Restful API文档
+# DscapeAPI文档
这里是Dscape服务端的API文档。这里定义了该服务的接口以及调用方式。
@@ -14,20 +14,45 @@
---
-## 0. 通用信息(非http状态码)
+# 目录
+- [DscapeAPI文档](#dscapeapi文档)
+- [目录](#目录)
+ - [通用状态码](#通用状态码)
+ - [登录认证](#登录认证)
+ - [用户登录](#用户登录)
+ - [用户注册(公共)](#用户注册公共)
+ - [计算相关](#计算相关)
+ - [请求计算](#请求计算)
+ - [计算记录查询](#计算记录查询)
+ - [计算记录删除](#计算记录删除)
+ - [计算状态查询](#计算状态查询)
+ - [用户管理相关](#用户管理相关)
+ - [添加用户](#添加用户)
+ - [修改密码](#修改密码)
+ - [封禁、删除用户](#封禁删除用户)
+ - [管理员获取待审批注册用户](#管理员获取待审批注册用户)
+ - [审核用户注册](#审核用户注册)
-| code | 信息 |
-| --- | --- |
-| 20000 | 成功 |
-| 30000 | 参数错误 |
-| 30001 | token过期 |
-| 40300 | 权限不足 |
-| 40000 | 非法请求 |
+---
+
+## 通用状态码
+
+这里的状态码是所有接口都有可能会返回的状态码
+
+| code | 信息 |
+| ----- | -------------- |
+| 20000 | 成功 |
+| 30000 | 非法请求 |
+| 30001 | 参数错误 |
+| 40000 | 权限不足 |
+| 40001 | token过期 |
+| 40002 | token无效 |
| 50000 | 服务器内部错误 |
+| 0 | 接口未实现 |
---
-## 1. 登录认证
+## 登录认证
### 用户登录
@@ -36,10 +61,10 @@
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | userName | string | false |用户登录名,非空 |
- | password | string | false |用户登录密码,非空,其值为明文密码两次sha256加密 |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | -------- | ------ | ----- | ------------------------------------------------ |
+ | userName | string | false | 用户登录名,非空 |
+ | password | string | false | 用户登录密码,非空,其值为明文密码两次sha256加密 |
例如:
``` json
@@ -51,13 +76,13 @@
- 返回数据
- | 参数 | 值类型 | 说明 |
- | --- | --- | --- |
- | uid | string | 用户对应的uid |
- | role | int | 用户权限类型,0:普通用户,1:管理员 |
- | access_token | string | 本次登录得到的token,过期后应当用refresh_token重新获取 |
- | refresh_token | string | 刷新用的token,过期后应当重新登录 |
- | expired | long | access_token过期时间 |
+ | 参数 | 值类型 | 说明 |
+ | ------------- | ------ | ------------------------------------------------------ |
+ | uid | string | 用户对应的uid |
+ | role | int | 用户权限类型,0:普通用户,1:管理员 |
+ | access_token | string | 本次登录得到的token,过期后应当用refresh_token重新获取 |
+ | refresh_token | string | 刷新用的token,过期后应当重新登录 |
+ | expired | long | access_token过期时间 |
例如:(token为精简过的jwt)
``` json
@@ -75,10 +100,10 @@
```
- 错误信息
- | code | 错误 |
- | --- | --- |
- | 40301 | 用户名或密码错误 |
- | 40302 | 用户已被封禁 |
+ | code | 错误 |
+ | ----- | ---------------------- |
+ | 40301 | 用户名或密码错误 |
+ | 40302 | 用户已被封禁 |
| 40305 | 上级管理员未认证该用户 |
---
@@ -94,11 +119,11 @@
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | userName | string | false | 用户登录名,非空 |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | -------- | ------ | ----- | ------------------------------------------------ |
+ | userName | string | false | 用户登录名,非空 |
| password | string | false | 用户登录密码,非空,其值为明文密码两次sha256加密 |
- | superior | string | true | 上级管理员用户名 |
+ | superior | string | true | 上级管理员用户名 |
例如:
``` json
@@ -111,9 +136,9 @@
- 返回数据
- | 参数 | 值类型 | 说明 |
- | --- | --- | --- |
- | uid | string | 用户对应的uid |
+ | 参数 | 值类型 | 说明 |
+ | ---- | ------ | ------------- |
+ | uid | string | 用户对应的uid |
例如:
``` json
@@ -128,16 +153,16 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
- | 40300 | 权限不足 |
+ | code | 错误 |
+ | ----- | ---------- |
+ | 40300 | 权限不足 |
| 20001 | 用户已存在 |
> 管理员添加用户,详见[添加用户](#添加用户)
---
-## 2. 计算相关
+## 计算相关
### 请求计算
@@ -146,12 +171,12 @@
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | pid | string | false | 患者数据id |
- | ctdna | int | false | 患者ctDNA长度 |
- | cpg | int | false | 患者甲基化位点数 |
- | token | string(header) | false |请求token,必须提供 |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | ----- | -------------- | ----- | ------------------- |
+ | pid | string | false | 患者数据id |
+ | ctdna | int | false | 患者ctDNA长度 |
+ | cpg | int | false | 患者甲基化位点数 |
+ | token | string(header) | false | 请求token,必须提供 |
例如:
``` json
@@ -164,9 +189,9 @@
- 返回数据
- | 参数 | 值类型 | 说明 |
- | --- | --- | --- |
- | id | string | 本次计算请求的任务id |
+ | 参数 | 值类型 | 说明 |
+ | ---- | ------ | -------------------- |
+ | id | string | 本次计算请求的任务id |
例如:
``` json
@@ -183,10 +208,10 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
- | 40300 | 权限不足 |
- | 40303 | 计算请求的ip已被封禁 |
+ | code | 错误 |
+ | ----- | ---------------------- |
+ | 40300 | 权限不足 |
+ | 40303 | 计算请求的ip已被封禁 |
| 40304 | 计算请求的用户已被封禁 |
| 40305 | 用户的计算配额到达上限 |
@@ -199,13 +224,13 @@
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | uid | string(url) | false | 需要获取记录的用户uid |
- | offset | int(url) | false | 分页数据偏移量 |
- | limit | int(url) | false | 每页数据数量 |
- | page | int(url) | false | 分页页码 |
- | token | string(header) | false | 请求token,必须提供 |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | ------ | -------------- | ----- | --------------------- |
+ | uid | string(url) | false | 需要获取记录的用户uid |
+ | offset | int(url) | false | 分页数据偏移量 |
+ | limit | int(url) | false | 每页数据数量 |
+ | page | int(url) | false | 分页页码 |
+ | token | string(header) | false | 请求token,必须提供 |
例如,需要获取用户uid为`9a6d777c-997d-a7e5-35f4-8471b7582ac0`记录的第三页数据,每页10条数据:
```
@@ -216,15 +241,15 @@
> data部分以数组的形式返回
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | id | int | 数据id |
- | pid | int | 患者id |
- | ctdna | int | 患者ctDNA长度 |
- | cpg | int | 患者甲基化位点数 |
- | hcc | boolean | 患者是否为HCC |
- | hcc_infer | boolean | 推算得出的HCC状态 |
- | time | datetime(string) | 时间 |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | --------- | ---------------- | ----------------- | ---- |
+ | id | int | 数据id |
+ | pid | int | 患者id |
+ | ctdna | int | 患者ctDNA长度 |
+ | cpg | int | 患者甲基化位点数 |
+ | hcc | boolean | 患者是否为HCC |
+ | hcc_infer | boolean | 推算得出的HCC状态 |
+ | time | datetime(string) | 时间 |
例如:
``` json
@@ -258,8 +283,8 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
+ | code | 错误 |
+ | ----- | -------- |
| 40300 | 权限不足 |
---
@@ -271,10 +296,10 @@
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | rid | int(url) | false | 欲删除的计算历史记录 |
- | token | string(header) | false |当前登录用户的token |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | ----- | -------------- | ----- | -------------------- |
+ | rid | int(url) | false | 欲删除的计算历史记录 |
+ | token | string(header) | false | 当前登录用户的token |
例如,需要获取id为`1145`的记录:
```
@@ -296,8 +321,8 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
+ | code | 错误 |
+ | ----- | -------- |
| 40300 | 权限不足 |
---
@@ -309,9 +334,9 @@
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | tid | string | false | 计算任务的id |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | ----- | -------------- | ----- | ------------------- |
+ | tid | string | false | 计算任务的id |
| token | string(header) | false | 当前登录用户的token |
例如:
@@ -321,10 +346,10 @@
- 返回数据
- | 参数 | 值类型 | 说明 |
- | --- | --- | --- |
- | id | string | 本次计算请求的任务id |
- | status | int | 计算状态,0:完成,1:计算中,3:排队中,4:已被终止或未被运行 |
+ | 参数 | 值类型 | 说明 |
+ | ------ | ------ | -------------------------------------------------------------- |
+ | id | string | 本次计算请求的任务id |
+ | status | int | 计算状态,0:完成,1:计算中,3:排队中,4:已被终止或未被运行 |
例如:
``` json
@@ -340,13 +365,13 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
+ | code | 错误 |
+ | ----- | -------- |
| 40300 | 权限不足 |
---
-## 3. 用户管理相关
+## 用户管理相关
> 这部分的的大部分接口只能由管理员调用使用
@@ -357,12 +382,12 @@
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | userName | string | false | 用户登录名,非空 |
- | password | string | false | 用户登录密码,非空,其值为明文密码两次sha256加密 |
- | role | int | true | 用户角色 |
- | token | string(header) | 管理员的access_token |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | -------- | -------------- | -------------------- | ------------------------------------------------ |
+ | userName | string | false | 用户登录名,非空 |
+ | password | string | false | 用户登录密码,非空,其值为明文密码两次sha256加密 |
+ | role | int | true | 用户角色 |
+ | token | string(header) | 管理员的access_token |
例如:
``` json
@@ -375,10 +400,10 @@
- 返回数据
- | 字段 | 值类型 | 说明 |
- | --- | --- | --- |
- | uid | string | 用户对应的uid |
- | role | int | 用户权限类型,0:普通用户,1:管理员 |
+ | 字段 | 值类型 | 说明 |
+ | ---- | ------ | ------------------------------------ |
+ | uid | string | 用户对应的uid |
+ | role | int | 用户权限类型,0:普通用户,1:管理员 |
例如:
@@ -395,9 +420,9 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
- | 40300 | 权限不足 |
+ | code | 错误 |
+ | ----- | ---------- |
+ | 40300 | 权限不足 |
| 20001 | 用户已存在 |
---
@@ -411,12 +436,12 @@
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | uid | string(url) | false |欲修改密码的用户uid |
- | old_password | string | true |原始密码,其值为明文密码两次sha256加密,若不提供,则token拥有者应当为管理员 |
- | new_password | string | false | 新密码,其值为明文密码两次sha256加密 |
- | token | string(header) | false | 当前对应用户的uid |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | ------------ | -------------- | ----- | --------------------------------------------------------------------------- |
+ | uid | string(url) | false | 欲修改密码的用户uid |
+ | old_password | string | true | 原始密码,其值为明文密码两次sha256加密,若不提供,则token拥有者应当为管理员 |
+ | new_password | string | false | 新密码,其值为明文密码两次sha256加密 |
+ | token | string(header) | false | 当前对应用户的uid |
例如:
``` json
@@ -441,8 +466,8 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
+ | code | 错误 |
+ | ----- | -------- |
| 40300 | 权限不足 |
---
@@ -454,11 +479,11 @@
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | uid | string(url) | false | 欲修改状态的用户uid |
- | status | int | false |修改状态,0:正常;1:彻底封禁(无法登录);2:注销(销号);3:计算封禁 |
- | token | string(header) | 当前对应用户的uid |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | ------ | -------------- | ----------------- | ------------------------------------------------------------------------ |
+ | uid | string(url) | false | 欲修改状态的用户uid |
+ | status | int | false | 修改状态,0:正常;1:彻底封禁(无法登录);2:注销(销号);3:计算封禁 |
+ | token | string(header) | 当前对应用户的uid |
例如:
``` json
@@ -483,25 +508,25 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
+ | code | 错误 |
+ | ----- | -------- |
| 40300 | 权限不足 |
---
### 管理员获取待审批注册用户
-- URL路径:`/user/admin/application/list?offset={offset}&limit={limit}&page={page}`
+- URL路径:`/user/admin/applications/list?offset={offset}&limit={limit}&page={page}`
- 方法:`GET`
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | offset | int(url) | false | 分页数据偏移量 |
- | limit | int(url) | false | 每页数据数量 |
- | page | int(url) | false | 分页页码 |
- | token | string(header) | false | 请求token,必须提供 |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | ------ | -------------- | ----- | ------------------- |
+ | offset | int(url) | false | 分页数据偏移量 |
+ | limit | int(url) | false | 每页数据数量 |
+ | page | int(url) | false | 分页页码 |
+ | token | string(header) | false | 请求token,必须提供 |
例如,需要第三页数据,每页10条数据:
```
@@ -512,13 +537,13 @@
> data部分以数组的形式返回
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | id | int | 审批记录id |
- | uid | string | 待审批用户uid |
- | name | string | 待审批用户名 |
- | ip | string | 用户发送审批时的ip |
- | time | datetime(string) | 申请时间 |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | ---- | ---------------- | ------------------ | ---- |
+ | id | int | 审批记录id |
+ | uid | string | 待审批用户uid |
+ | name | string | 待审批用户名 |
+ | ip | string | 用户发送审批时的ip |
+ | time | datetime(string) | 申请时间 |
例如:
``` json
@@ -548,23 +573,23 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
+ | code | 错误 |
+ | ----- | -------- |
| 40300 | 权限不足 |
---
### 审核用户注册
-- URL路径:`/user/admin/application/deal/{uid}`
+- URL路径:`/user/admin/applications/deal/{uid}`
- 方法:`POST`
- 请求参数:
- | 参数 | 值类型 | 可空 | 说明 |
- | --- | --- | --- | --- |
- | uid | string(url) | false | 处理的用户uid |
- | idea | boolean | false | 处理意见,true:通过;false:拒绝 |
+ | 参数 | 值类型 | 可空 | 说明 |
+ | ----- | -------------- | ----------------- | --------------------------------- |
+ | uid | string(url) | false | 处理的用户uid |
+ | idea | boolean | false | 处理意见,true:通过;false:拒绝 |
| token | string(header) | 当前对应用户的uid |
例如:
@@ -590,8 +615,8 @@
- 错误信息
- | code | 错误 |
- | --- | --- |
+ | code | 错误 |
+ | ----- | -------- |
| 40300 | 权限不足 |
---
diff --git a/pom.xml b/pom.xml
index cc96e0e..6fc0353 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,12 @@
compile
+
+ cn.dev33
+ sa-token-spring-boot-starter
+ 1.30.0
+
+
com.baomidou
mybatis-plus-boot-starter
@@ -116,6 +122,11 @@
0.4
+
+ org.projectlombok
+ lombok
+
+
diff --git a/src/main/java/net/lensfrex/dscape/ServerMain.java b/src/main/java/net/lensfrex/dscape/ServerMain.java
index d03bb0f..5ca5704 100644
--- a/src/main/java/net/lensfrex/dscape/ServerMain.java
+++ b/src/main/java/net/lensfrex/dscape/ServerMain.java
@@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
-@MapperScan("net.lensfrex.dscape.dao.mappers")
+@MapperScan("net.lensfrex.dscape.module.dao.mappers")
public class ServerMain extends SpringBootServletInitializer {
public static void main(String[] args) {
diff --git a/src/main/java/net/lensfrex/dscape/auth/StpInterfaceImpl.java b/src/main/java/net/lensfrex/dscape/auth/StpInterfaceImpl.java
new file mode 100644
index 0000000..b1720cc
--- /dev/null
+++ b/src/main/java/net/lensfrex/dscape/auth/StpInterfaceImpl.java
@@ -0,0 +1,19 @@
+package net.lensfrex.dscape.auth;
+
+import cn.dev33.satoken.stp.StpInterface;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class StpInterfaceImpl implements StpInterface {
+ @Override
+ public List getPermissionList(Object loginId, String loginType) {
+ return null;
+ }
+
+ @Override
+ public List getRoleList(Object loginId, String loginType) {
+ return null;
+ }
+}
diff --git a/src/main/java/net/lensfrex/dscape/configure/MybatisPlusConfigure.java b/src/main/java/net/lensfrex/dscape/configure/MybatisPlusConfigure.java
new file mode 100644
index 0000000..c4c661d
--- /dev/null
+++ b/src/main/java/net/lensfrex/dscape/configure/MybatisPlusConfigure.java
@@ -0,0 +1,49 @@
+package net.lensfrex.dscape.configure;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.Resource;
+
+/**
+ * 分页功能的配置类
+ */
+@Slf4j
+@Configuration
+public class MybatisPlusConfigure {
+ @Resource
+ DataSourceProperties dataSourceProperties;
+
+ @Bean
+ public PaginationInnerInterceptor paginationInnerInterceptor() {
+ return new PaginationInnerInterceptor();
+ }
+
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ String databaseDriverName = dataSourceProperties.getDriverClassName();
+
+ PaginationInnerInterceptor paginationInnerInterceptor;
+ if (databaseDriverName.contains("mariadb")) {
+ log.info("使用Mariadb作为数据库");
+ paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MARIADB);
+ } else if (databaseDriverName.contains("mysql")) {
+ log.info("使用Mysql作为数据库");
+ paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
+ } else {
+ paginationInnerInterceptor = new PaginationInnerInterceptor();
+ log.warn("使用了可能不受支持的数据库:" + databaseDriverName);
+ }
+ paginationInnerInterceptor.setOptimizeJoin(true);
+
+ interceptor.addInnerInterceptor(paginationInnerInterceptor);
+ return interceptor;
+ }
+
+}
diff --git a/src/main/java/net/lensfrex/dscape/configure/RedisConfigure.java b/src/main/java/net/lensfrex/dscape/configure/RedisConfigure.java
new file mode 100644
index 0000000..f03bc2e
--- /dev/null
+++ b/src/main/java/net/lensfrex/dscape/configure/RedisConfigure.java
@@ -0,0 +1,29 @@
+package net.lensfrex.dscape.configure;
+
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+@EnableCaching
+public class RedisConfigure extends CachingConfigurerSupport {
+ @Bean
+ public RedisTemplate redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
+ RedisTemplate redisTemplate = new RedisTemplate<>();
+ redisTemplate.setConnectionFactory(redisConnectionFactory);
+ Jackson2JsonRedisSerializer