diff --git a/README.md b/README.md
index f4512524dafdcfa39318b0ac1747527e1f1bb307..0f84a3e4b240d52c2bc6764e8dc7eb733358f358 100644
--- a/README.md
+++ b/README.md
@@ -1,43 +1,68 @@
# playground V3 新手体验项目
-* [v3 前端项目 使用文档](https://www.diboot.com)
+> Diboot v3.x版本 基础功能+Devtools 体验环境
-> Diboot v3.0.0版本体验环境(该版本代码生成功能尚未发布,敬请期待)
-
-## 项目启动配置
-> 环境配置:
+## 项目启动与devtools等配置说明
+### 0. playground 项目说明
+> 依赖环境:
* JDK 8
- * MySQL 8
+ * MySQL 8 (或Postgres等其他数据库)
* Node v16
* pnpm
-> 项目代码说明:
-* demo项目为后端接口项目示例(Spring boot + Diboot v3),配置启动步骤:
- * 修改 `application-dev.yml` 中的数据库连接信息,改为本地连接
- * 配置IDEA服务(`DemoApplication`为启动类),运行demo后台程序,此时diboot各starter会自动执行初始化SQL
+> 项目目录说明:
+ * demo:项目的后端接口示例(Spring boot + Diboot v3)
+ * demo/libs:devtools 开发工具包
+ * diboot-admin-ui:PC端前端项目(Vue3+TypeScript+Vite+Pinia+ElementPlus)
+ * diboot-mobile-ui:移动端前端项目(Vant4)
+
+### 1. 项目配置说明
+
+* 配置demo应用的相关参数:
+ * demo为后端接口项目,配置启动步骤:
+ * 修改 `application-dev.yml` 中的数据库连接信息,改为本地连接
+ * 配置 devtools 代码生成相关参数:
+ * 将 `diboot.init-sql` 设置为 true ,以开启自动初始化
+ * 配置 `diboot.file.storage-directory` 本地文件存储路径
+ * 配置 `diboot.iam.anon-urls` 中加入 `/diboot/**` 配置项,以放行devtools接口免登录
+ * 配置 `diboot.lcdp.devtools` 相关参数,说明(application-dev.yml中已有配置好的示例):
+ * license: 订阅用户配置该项,非订阅用户不配置
+ * codes-author: 开发者姓名
+ * codes-copyright: 代码版权归属
+ * codes-version: 代码版本
+ * output-path: 后端代码生成路径
+ * output-path-admin-ui: 前端代码生成路径
+
+### 2. 项目启动与初始化
-* diboot-admin-ui为PC端前端项目(Vue3+TypeScript+Vite+Pinia+ElementPlus),配置启动步骤:
- * 切换到 diboot-admin-ui 目录下,
- 执行install命令安装依赖组件
+* 2.1 启动后端项目:
+ * 配置IDEA服务(`DemoApplication`为启动类),运行demo后台程序,此时diboot各starter会自动执行初始化SQL。
+* 前端项目:
+ *
+* 2.2 启动 diboot-admin-ui PC端前端项目,步骤:
+ * 命令行切换到 diboot-admin-ui 目录下, 执行install命令安装依赖组件
```cmd
pnpm install
```
- 执行run dev命令运行
+ 执行 run dev 命令运行
```cmd
pnpm run dev
```
* 前端启动后登录系统(默认管理员登录账号: `admin` 密码:`123456`)
-* diboot-mobile-ui为移动端前端项目(Vue3 + Vant4),配置启动步骤:
- * 切换到 diboot-mobile-ui 目录下,
- 执行install命令安装依赖组件
- ```cmd
- pnpm install
- ```
- 执行run dev命令运行
- ```cmd
- pnpm run dev
- ```
- * 前端启动后登录系统(默认管理员登录账号:`admin` 密码:`123456`,此示例项目中以H5登录公用后端登录接口)
+ > 如需启动移动端前端,切换至 diboot-mobile-ui 移动端前端项目下,参考以上步骤操作即可。
+
+### 3. devtools 开发工具使用
+* 项目启动完毕,可以在控制台看到打印的 devtools 的入口链接,点击链接即可进入devtools。
+~~~
+-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+-- Diboot devtools v3.x.x 初始化完成:
+-> URL: http://localhost:8080/api/diboot/index.html
+-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+~~~
+> 注:如您为订阅用户,请配置 `diboot.lcdp.devtools.license` 以便使用devtools全部功能。
+
+## 其他参考文档
+* [V3 技术文档](http://v3.diboot.com)
## 技术交流:
* **VIP技术支持QQ群**(捐助/付费用户尊享): [931266830]()
diff --git a/demo/libs/diboot-lcdp-devtools-3.1.0.jar b/demo/libs/diboot-lcdp-devtools-3.1.0.jar
new file mode 100644
index 0000000000000000000000000000000000000000..83a38466b4a3ea5f6eb5422d069c04b38b3ca38f
Binary files /dev/null and b/demo/libs/diboot-lcdp-devtools-3.1.0.jar differ
diff --git a/demo/pom.xml b/demo/pom.xml
index 379f11e3c937648fdb6f6315ad1401df253cf2bc..a9268d07673a170c4d94fe58aa1d1bb92b43aed8 100644
--- a/demo/pom.xml
+++ b/demo/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.7.12
+ 2.7.15
com.example
@@ -16,7 +16,7 @@
1.8
- 3.0.0
+ 3.1.0
@@ -26,10 +26,10 @@
provided
true
-
com.mysql
mysql-connector-j
+ 8.1.0
-
+
+
+ com.diboot
+ lcdp-devtools
+ ${diboot.version}
+ system
+ ${project.basedir}/libs/diboot-lcdp-devtools-3.1.0.jar
+
+
+ org.mybatis.dynamic-sql
+ mybatis-dynamic-sql
+ 1.5.0
+ provided
+
+
+
org.springframework.boot
spring-boot-maven-plugin
-
-
+
+
com.diboot
- diboot-devtools-spring-boot-starter
+ lcdp-devtools-starter
+
+
+ org.mybatis.dynamic-sql
+ mybatis-dynamic-sql
diff --git a/demo/src/main/java/com/example/demo/controller/iam/AuthTokenController.java b/demo/src/main/java/com/example/demo/controller/iam/AuthTokenController.java
index 17e4764dc2244df1191d7bc07533d3631ff52fce..153abd16848d2e068f9a79faf4ffe746f128517a 100644
--- a/demo/src/main/java/com/example/demo/controller/iam/AuthTokenController.java
+++ b/demo/src/main/java/com/example/demo/controller/iam/AuthTokenController.java
@@ -2,7 +2,9 @@ package com.example.demo.controller.iam;
import com.diboot.core.cache.BaseCacheManager;
import com.diboot.core.controller.BaseController;
+import com.diboot.core.exception.BusinessException;
import com.diboot.core.vo.JsonResult;
+import com.diboot.core.vo.Status;
import com.diboot.iam.annotation.BindPermission;
import com.diboot.iam.annotation.Log;
import com.diboot.iam.auth.AuthServiceFactory;
@@ -20,9 +22,15 @@ import com.diboot.iam.util.TokenUtils;
import com.pig4cloud.captcha.ArithmeticCaptcha;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
+import javax.crypto.Cipher;
import javax.servlet.http.HttpServletResponse;
+import java.security.KeyFactory;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -50,6 +58,9 @@ public class AuthTokenController extends BaseController {
@Autowired
private BaseCacheManager baseCacheManager;
+ @Value("${rsa-encryptor.private-key}")
+ private String rsaPrivateKey;
+
/**
* 获取验证码
*/
@@ -85,9 +96,32 @@ public class AuthTokenController extends BaseController {
if (verCode == null || !verCode.trim().toLowerCase().equals(captcha)) {
return JsonResult.FAIL_VALIDATION("验证码错误");
}
+ credential.setPassword(decrypt(credential.getPassword()));
return JsonResult.OK(AuthServiceFactory.getAuthService(Cons.DICTCODE_AUTH_TYPE.PWD.name()).applyToken(credential));
}
+ /**
+ * RSA 解密
+ *
+ * @param content
+ * @return
+ */
+ private String decrypt(String content) {
+ try {
+ byte[] decode = Base64.getDecoder().decode(content);
+ // base64编码的私钥
+ byte[] decoded = Base64.getDecoder().decode(rsaPrivateKey);
+ RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA")
+ .generatePrivate(new PKCS8EncodedKeySpec(decoded));
+ // RSA解密
+ Cipher cipher = Cipher.getInstance("RSA");
+ cipher.init(Cipher.DECRYPT_MODE, priKey);
+ return new String(cipher.doFinal(decode));
+ } catch (Exception e) {
+ throw new BusinessException(Status.FAIL_OPERATION, "解密数据失败!");
+ }
+ }
+
/**
* 注销/退出
*
@@ -144,4 +178,4 @@ public class AuthTokenController extends BaseController {
public JsonResult> ping() {
return JsonResult.OK();
}
-}
\ No newline at end of file
+}
diff --git a/demo/src/main/resources/application-dev.yml b/demo/src/main/resources/application-dev.yml
index 805b42018a58947de290ec36e89a52315e14872b..eabad70a1e43c9ea0e6839be0ad676bc533a813a 100644
--- a/demo/src/main/resources/application-dev.yml
+++ b/demo/src/main/resources/application-dev.yml
@@ -7,9 +7,9 @@ spring:
#datasource config
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://localhost:3306/playground_v3?characterEncoding=utf8&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
+ url: jdbc:mysql://localhost:3306/playground_v3?characterEncoding=utf8&serverTimezone=GMT%2B8
username: diboot
- password: 123456
+ password: diboot
hikari:
maximum-pool-size: 5
max-lifetime: 60000 # 连接的最大生命周期
@@ -32,24 +32,31 @@ logging:
_org:
springframework: info
com:
+ diboot:
+ lcdp: info
zaxxer:
hikari: info
# Diboot Configuration
diboot:
-# id:
-# data-center-id: 3
- init-sql: true
+ init-sql: true #自动初始化SQL,开发环境下初次启动开启,初始化后可关闭
file:
- # upload path
+ # 文件存储路径(本地存储方式)
storage-directory: D:/temp/playground
-
iam:
# token-expires-minutes: 60
- enable-permission-check: true
- # Shiro的匿名urls,用逗号分隔,开发环境可配置/**,方便调试
+ # Shiro的匿名urls,用逗号分隔
anon-urls:
- /swagger**/**
- /webjars/**
- /v3/**
- - /doc.html
\ No newline at end of file
+ - /doc.html
+ - /diboot/** # 允许devtools直接访问
+ lcdp:
+ #license: 订阅用户配置该项
+ devtools:
+ codes-author: MyName
+ codes-copyright: MyCorp
+ codes-version: 1.0
+ output-path: demo/src/main/java/com/example/demo/
+ output-path-admin-ui: diboot-admin-ui/
\ No newline at end of file
diff --git a/demo/src/main/resources/application-prod.yml b/demo/src/main/resources/application-prod.yml
index e7001cf56f79b81fc0e9bc8af86936b1a9c34ebc..7b26e60a7a294584d4d5ea544903059a8a1e364a 100644
--- a/demo/src/main/resources/application-prod.yml
+++ b/demo/src/main/resources/application-prod.yml
@@ -15,24 +15,29 @@ spring:
max-lifetime: 60000 # 连接的最大生命周期
# Redis config
- redis:
- database: 0
- port: 6379
- host: localhost
- password:
+# redis:
+# database: 0
+# port: 6379
+# host: localhost
+# password:
logging:
level:
root: info
+ file:
+ name: /www/logs/app.log
+ logback:
+ rollingpolicy:
+ max-history: 10
+ max-file-size: 20MB
# Diboot Configuration
diboot:
- init-sql: false
+ init-sql: false #生产环境需关闭
file:
- # upload path
+ # 文件存储路径(本地存储方式)
storage-directory: /temp/playground
-
iam:
# token-expires-minutes: 60
- # Shiro的匿名urls,用逗号分隔,开发环境可配置/**,方便调试
+ # Shiro的匿名urls,用逗号分隔
anon-urls:
diff --git a/demo/src/main/resources/application.yml b/demo/src/main/resources/application.yml
index c2d6758c562820ff93e22fcd795284f1e21c8fb9..da72967ee971825381bab702118770d0ac11dd2f 100644
--- a/demo/src/main/resources/application.yml
+++ b/demo/src/main/resources/application.yml
@@ -23,4 +23,7 @@ mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
- logic-not-delete-value: 0
\ No newline at end of file
+ logic-not-delete-value: 0
+
+rsa-encryptor:
+ private-key: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDM/LVRzDOBFPx1FSkBbQd7JW8iLiJyqLB0FkyuHzn60kRn8BeMQtHOXz2bZkqgwd+gwORqOjEl5ovkhX1SlSX7VGpa9aqBgvSvzn0XIN42D2SIwB8CnIijCoWpy0PHuTvuMOikG9xfwXSyGXpJS0RW73q1zv4WuM/g4bBcl4H5vTg7ZIJXiYfGzxNGftiwugDXSaM82exfROJiTNIZQ/8Tk4Ri3+LE3A7+ULpN0Uz09dFpOMXvp7mofDqSwlTviZvcD39lAJvifNXDXnFPEhoCcNfv4WqcKCm7brJcwu1VfIRroJS8GMssGV4n9zIe5SKvsZi61/kvK4gQk8RaCdkHAgMBAAECggEBAKX28MMSZpzbJe+Ru0p5QPZWf50X5zIYHA1RRLIxfBr0hQf2HsqkCwRgnhukfUWc0ndv1T+gb8x01cymu6nSMhdD6HxOrMcBBSUWNLc2GFOCsO37RuAxZntC+KdZeD5LXhdip+i+2fT5R4cvE5AmDWWprRtoRNaWuVAkykqdLFHKio0ztfCqbkWmeRyGL6ImlP8EaeLvOO4NdS0/FHxHSuPRthc2VhLUjx6HLngaouuawSnYBdptuL/CvFaQs6tbWYkPj2ohOQqO5G8F+2yAHJzh3T5ol1jxDmw8jylzB4H0CamlSYV9uNPSHcUktrpjO3qpIKjyBAufa/bzOQFnDOkCgYEA+BzZ+rtTmED7pXrOREUp9KTjicexpkXzRV31ppNz2Fl+0l4dk837YcN6+T2l0fVDmBqtcMTSTEiDtk7weAFHWPgRhEY6O4nqCEiSNNhwDsy57XmtOaPDsiROd/dDK/Ok4wFYAd/SXH9guA5lqtf2YwQbHgVgdtaEQrcnzm5HYtUCgYEA04DmU8+jtzgHpaaGL1eo91eG+ZgVE8bQzxak2RKhfJD2X3vhzWNo22pniQ12dIce1lEepkqYqPxaqyekykYHTMiwZMf+9XeGGDfw2SLk3oiiG0ph650TGky9X81FbjrMeRZqxlNuzGtpE/1GQ8Uxiqchufbci/aq6SEhvRfmYmsCgYEAg2/VUew2xqt2JB3Ac44oQb+wAmdVhv37d73kyo/GiNAwTQUqqgguqYXC+ZJc67MAUe2f/+NkfKDVlZiP7yLORyVzMh1579yJrEW1nmUiR9TQkispRyWoIBD3uLm2TexOZytpEeUeLX4VIKwP08eAcMfWDbtPdOUDP8yDO+pTytkCgYEAjDD0erk3G0rYRsSKTPcd2FT78pUL43/1CE9KFVh0Ec1EgSXsFee+qTFuTznNOpAVsJk0Z6Uqa1haAPjWEf04+XxM74BhTvNavtLVoheu/JI0YUJ8hWAoOVaEb+vwCZCP1/Mz8yF6X6USkV1gJaufmvgNMuaeaWenAcAkTOJ6ouECgYA6mUjax2Kv7cFj0L4XcghiAsLVWmCdx8rK9BbV7ZWw1Y0CWtvRIDgaT88QDD2bhszgaB9kM1xNqIfizUUz2Oks7sKKe3O7bYW7zjOwJg1VfvLfWLlnUVVdQjEhBl9z/qOxEiAk4/+I9H+RckgGsg5z2hXOQgqtp26knoJY+/N6bQ==
diff --git a/diboot-admin-ui/index.html b/diboot-admin-ui/index.html
index b72755251801e7fbb7f8920a5173feccc7ecd09c..4b8247eef4654858b493663698594ca5f30e3216 100644
--- a/diboot-admin-ui/index.html
+++ b/diboot-admin-ui/index.html
@@ -126,7 +126,7 @@
'There will be no regret and sorrow if you fight with all your strength.',
'Don`t let dream just be your dream.'
]
- const index = Math.floor(Math.random() * 20)
+ const index = Math.floor(Math.random() * list.length)
document.getElementById('content').innerText = list[index]