Compare commits

...

12 Commits

Author SHA1 Message Date
xiaojunnuo
66f9b08fcf v1.26.2 2024-10-11 13:38:21 +08:00
xiaojunnuo
fcaf891a90 build: prepare to build 2024-10-11 13:36:48 +08:00
xiaojunnuo
3b1f3e8a3f chore: 2024-10-11 03:40:24 +08:00
xiaojunnuo
d8d9f9b99c chore: 2024-10-11 03:24:33 +08:00
xiaojunnuo
126e548510 chore: 商业版隐藏版权信息 2024-10-11 03:23:03 +08:00
xiaojunnuo
91fc1cd735 fix: 修复某些情况下bindUrl失败的bug 2024-10-11 03:13:34 +08:00
xiaojunnuo
4244569211 perf: 邮箱设置改为系统设置,普通用户无需配置发件邮箱 2024-10-11 02:54:42 +08:00
xiaojunnuo
f23c4af2ad chore: doc 2024-10-11 01:27:02 +08:00
xiaojunnuo
809bde9d20 chore: doc 2024-10-11 01:22:38 +08:00
xiaojunnuo
52bf8a1bb6 chore: doc 2024-10-11 00:48:24 +08:00
xiaojunnuo
614ce97898 build: publish 2024-10-11 00:32:52 +08:00
xiaojunnuo
5aacd18320 build: trigger build image 2024-10-11 00:32:38 +08:00
54 changed files with 383 additions and 212 deletions

View File

@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
### Bug Fixes
* 修复某些情况下bindUrl失败的bug ([91fc1cd](https://github.com/certd/certd/commit/91fc1cd7353be4a22be951239ed70b38baebc74e))
### Performance Improvements
* 邮箱设置改为系统设置,普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package root **Note:** Version bump only for package root

View File

@@ -29,11 +29,11 @@ https://certd.handsfree.work/
## 三、使用教程 ## 三、使用教程
本案例演示如何配置自动申请证书并部署到阿里云CDN然后快要到期前自动更新证书并重新部署 本案例演示如何配置自动申请证书并部署到阿里云CDN然后快要到期前自动更新证书并重新部署
![演示](packages/ui/certd-client/public/statics/doc/images/5-view.png) ![演示](packages/ui/certd-client/public/static/doc/images/5-view.png)
![演示](packages/ui/certd-client/public/statics/doc/images/9-start.png) ![演示](packages/ui/certd-client/public/static/doc/images/9-start.png)
![演示](packages/ui/certd-client/public/statics/doc/images/10-1-log.png) ![演示](packages/ui/certd-client/public/static/doc/images/10-1-log.png)
![演示](packages/ui/certd-client/public/statics/doc/images/13-3-download.png) ![演示](packages/ui/certd-client/public/static/doc/images/13-3-download.png)
![演示](packages/ui/certd-client/public/statics/doc/images/13-1-result.png) ![演示](packages/ui/certd-client/public/static/doc/images/13-1-result.png)
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
-------> [点我查看详细使用步骤演示](./step.md) <-------- -------> [点我查看详细使用步骤演示](./step.md) <--------

View File

@@ -1 +1 @@
02:06 00:32

View File

@@ -1,8 +1,7 @@
# 腾讯云 # 腾讯云
## DNSPOD 授权设置 ## DNSPOD 授权设置【已废弃请使用腾讯云API】
目前腾讯云管理的域名的dns暂时只支持从DNSPOD进行设置
打开 https://console.dnspod.cn/account/token/apikey 打开 https://console.dnspod.cn/account/token/apikey
然后按如下方式获取DNSPOD的授权 然后按如下方式获取DNSPOD的授权
![](./dnspod-token.png) ![](./dnspod-token.png)
@@ -13,4 +12,4 @@
腾讯云其他部署需要API密钥需要在腾讯云控制台进行设置 腾讯云其他部署需要API密钥需要在腾讯云控制台进行设置
打开 https://console.cloud.tencent.com/cam/capi 打开 https://console.cloud.tencent.com/cam/capi
然后按如下方式获取腾讯云的API密钥 然后按如下方式获取腾讯云的API密钥
![](./tencent-access.png) ![](./tencent-access.png)

View File

@@ -1,7 +1,7 @@
version: '3.3' # 兼容旧版docker-compose version: '3.3' # 兼容旧版docker-compose
services: services:
certd: certd:
# 镜像 # ↓↓↓↓↓ --- 镜像版本号,建议改成固定版本号 # 镜像 # ↓↓↓↓↓ ---- 镜像版本号,建议改成固定版本号
image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
container_name: certd # 容器名 container_name: certd # 容器名
restart: unless-stopped # 自动重启 restart: unless-stopped # 自动重启
@@ -23,18 +23,28 @@ services:
# - "localdomain.comm:192.168.1.3" # - "localdomain.comm:192.168.1.3"
environment: # 环境变量 environment: # 环境变量
- TZ=Asia/Shanghai - TZ=Asia/Shanghai
#- HTTPS_PROXY=http://xxxxxx:xx
#- HTTP_PROXY=http://xxxxxx:xx
# ↑↑↑↑↑ ------------------------------------- 这里可以设置http代理
- certd_system_resetAdminPasswd=false
# ↑↑↑↑↑--------------------------- 如果忘记管理员密码可以设置为true重启之后管理员密码将改成123456然后请及时修改回false
- certd_cron_immediateTriggerOnce=false
# ↑↑↑↑↑--------------------------- 如果设置为true启动后所有配置了cron的流水线任务都将被立即触发一次
- certd_site_icp_no=
# ↑↑↑↑↑ ----------------------------------------- 这里可以设置备案号
#- certd_koa_key=./data/ssl/cert.key
#- certd_koa_cert=./data/ssl/cert.crt
# ↑↑↑↑↑ ----------------------------------------- 配置证书和key则表示https方式启动使用https协议访问https://your.domain:7001
# 设置环境变量即可自定义certd配置 # 设置环境变量即可自定义certd配置
# 配置项见: packages/ui/certd-server/src/config/config.default.ts # 配置项见: packages/ui/certd-server/src/config/config.default.ts
# 配置规则: certd_ + 配置项, 点号用_代替 # 配置规则: certd_ + 配置项, 点号用_代替
# ↓↓↓↓ ------------------------------------ 这里可以设置http代理
#- HTTPS_PROXY=http://xxxxxx:xx
#- HTTP_PROXY=http://xxxxxx:xx
# ↓↓↓↓ ----------------------------- 如果忘记管理员密码可以设置为true重启之后管理员密码将改成123456然后请及时修改回false
- certd_system_resetAdminPasswd=false
# ↓↓↓↓ -------------------------- 如果设置为true启动后所有配置了cron的流水线任务都将被立即触发一次
- certd_cron_immediateTriggerOnce=false
# ↓↓↓↓ -------------------------------- 配置证书和key则表示https方式启动使用https协议访问https://your.domain:7001
#- certd_koa_key=./data/ssl/cert.key
#- certd_koa_cert=./data/ssl/cert.crt
# ↓↓↓↓ ------------------------------- 使用postgresql数据库
# - certd_flyway_scriptDir=./db/migration-pg # 升级脚本目录
# - certd_typeorm_dataSource_default_type=postgres # 数据库类型
# - certd_typeorm_dataSource_default_host=localhost # 数据库地址
# - certd_typeorm_dataSource_default_port=5433 # 数据库端口
# - certd_typeorm_dataSource_default_username=postgres # 用户名
# - certd_typeorm_dataSource_default_password=yourpasswd # 密码
# - certd_typeorm_dataSource_default_database=certd # 数据库名

View File

@@ -9,5 +9,5 @@
} }
}, },
"npmClient": "pnpm", "npmClient": "pnpm",
"version": "1.26.1" "version": "1.26.2"
} }

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/publishlab/node-acme-client/compare/v1.26.1...v1.26.2) (2024-10-11)
**Note:** Version bump only for package @certd/acme-client
## [1.26.1](https://github.com/publishlab/node-acme-client/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/publishlab/node-acme-client/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/acme-client **Note:** Version bump only for package @certd/acme-client

View File

@@ -3,7 +3,7 @@
"description": "Simple and unopinionated ACME client", "description": "Simple and unopinionated ACME client",
"private": false, "private": false,
"author": "nmorsman", "author": "nmorsman",
"version": "1.26.1", "version": "1.26.2",
"main": "src/index.js", "main": "src/index.js",
"types": "types/index.d.ts", "types": "types/index.d.ts",
"license": "MIT", "license": "MIT",
@@ -59,5 +59,5 @@
"bugs": { "bugs": {
"url": "https://github.com/publishlab/node-acme-client/issues" "url": "https://github.com/publishlab/node-acme-client/issues"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
**Note:** Version bump only for package @certd/basic
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/basic **Note:** Version bump only for package @certd/basic

View File

@@ -1 +1 @@
00:29 13:36

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/basic", "name": "@certd/basic",
"private": false, "private": false,
"version": "1.26.1", "version": "1.26.2",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -64,5 +64,5 @@
"vite": "^4.3.8", "vite": "^4.3.8",
"vue-tsc": "^1.6.5" "vue-tsc": "^1.6.5"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
**Note:** Version bump only for package @certd/pipeline
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/pipeline **Note:** Version bump only for package @certd/pipeline

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/pipeline", "name": "@certd/pipeline",
"private": false, "private": false,
"version": "1.26.1", "version": "1.26.2",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
@@ -15,8 +15,8 @@
"test": "mocha --loader=ts-node/esm" "test": "mocha --loader=ts-node/esm"
}, },
"dependencies": { "dependencies": {
"@certd/basic": "^1.26.1", "@certd/basic": "^1.26.2",
"@certd/plus-core": "^1.26.1", "@certd/plus-core": "^1.26.2",
"axios": "^1.7.2", "axios": "^1.7.2",
"dayjs": "^1.11.7", "dayjs": "^1.11.7",
"fix-path": "^4.0.0", "fix-path": "^4.0.0",
@@ -66,5 +66,5 @@
"vite": "^4.3.8", "vite": "^4.3.8",
"vue-tsc": "^1.6.5" "vue-tsc": "^1.6.5"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
**Note:** Version bump only for package @certd/lib-huawei
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/lib-huawei **Note:** Version bump only for package @certd/lib-huawei

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/lib-huawei", "name": "@certd/lib-huawei",
"private": false, "private": false,
"version": "1.26.1", "version": "1.26.2",
"main": "./dist/bundle.js", "main": "./dist/bundle.js",
"module": "./dist/bundle.js", "module": "./dist/bundle.js",
"types": "./dist/d/index.d.ts", "types": "./dist/d/index.d.ts",
@@ -17,5 +17,5 @@
"rimraf": "^5.0.5", "rimraf": "^5.0.5",
"rollup": "^3.7.4" "rollup": "^3.7.4"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
**Note:** Version bump only for package @certd/lib-iframe
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/lib-iframe **Note:** Version bump only for package @certd/lib-iframe

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/lib-iframe", "name": "@certd/lib-iframe",
"private": false, "private": false,
"version": "1.26.1", "version": "1.26.2",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
@@ -39,5 +39,5 @@
"tslib": "^2.5.2", "tslib": "^2.5.2",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
**Note:** Version bump only for package @certd/lib-jdcloud
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/lib-jdcloud **Note:** Version bump only for package @certd/lib-jdcloud

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/lib-jdcloud", "name": "@certd/lib-jdcloud",
"private": false, "private": false,
"version": "1.26.1", "version": "1.26.2",
"main": "./dist/bundle.mjs", "main": "./dist/bundle.mjs",
"module": "./dist/bundle.mjs", "module": "./dist/bundle.mjs",
"types": "./dist/d/index.d.ts", "types": "./dist/d/index.d.ts",
@@ -27,5 +27,5 @@
"rimraf": "^5.0.5", "rimraf": "^5.0.5",
"rollup": "^3.7.4" "rollup": "^3.7.4"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
**Note:** Version bump only for package @certd/lib-k8s
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/lib-k8s **Note:** Version bump only for package @certd/lib-k8s

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/lib-k8s", "name": "@certd/lib-k8s",
"private": false, "private": false,
"version": "1.26.1", "version": "1.26.2",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
@@ -18,7 +18,7 @@
"@kubernetes/client-node": "0.21.0" "@kubernetes/client-node": "0.21.0"
}, },
"devDependencies": { "devDependencies": {
"@certd/pipeline": "^1.26.1", "@certd/pipeline": "^1.26.2",
"@rollup/plugin-commonjs": "^23.0.4", "@rollup/plugin-commonjs": "^23.0.4",
"@rollup/plugin-json": "^6.0.0", "@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-node-resolve": "^15.0.1", "@rollup/plugin-node-resolve": "^15.0.1",
@@ -40,5 +40,5 @@
"tslib": "^2.5.2", "tslib": "^2.5.2",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
### Bug Fixes
* 修复某些情况下bindUrl失败的bug ([91fc1cd](https://github.com/certd/certd/commit/91fc1cd7353be4a22be951239ed70b38baebc74e))
### Performance Improvements
* 邮箱设置改为系统设置,普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/lib-server **Note:** Version bump only for package @certd/lib-server

View File

@@ -1,6 +1,6 @@
{ {
"name": "@certd/lib-server", "name": "@certd/lib-server",
"version": "1.26.1", "version": "1.26.2",
"description": "midway with flyway, sql upgrade way ", "description": "midway with flyway, sql upgrade way ",
"private": false, "private": false,
"type": "module", "type": "module",
@@ -26,8 +26,8 @@
], ],
"license": "AGPL", "license": "AGPL",
"dependencies": { "dependencies": {
"@certd/basic": "^1.26.1", "@certd/basic": "^1.26.2",
"@certd/pipeline": "^1.26.1", "@certd/pipeline": "^1.26.2",
"@midwayjs/cache": "~3.14.0", "@midwayjs/cache": "~3.14.0",
"@midwayjs/core": "~3.17.1", "@midwayjs/core": "~3.17.1",
"@midwayjs/i18n": "~3.17.3", "@midwayjs/i18n": "~3.17.3",
@@ -68,5 +68,5 @@
"typeorm": "^0.3.11", "typeorm": "^0.3.11",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -1,4 +1,4 @@
import { Config, Init, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core'; import { Config, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
import { AppKey, PlusRequestService, verify } from '@certd/pipeline'; import { AppKey, PlusRequestService, verify } from '@certd/pipeline';
import { logger } from '@certd/basic'; import { logger } from '@certd/basic';
import { SysInstallInfo, SysLicenseInfo, SysSettingsService } from '../../settings/index.js'; import { SysInstallInfo, SysLicenseInfo, SysSettingsService } from '../../settings/index.js';
@@ -11,26 +11,26 @@ export class PlusService {
@Config('plus.server.baseUrls') @Config('plus.server.baseUrls')
plusServerBaseUrls: string[]; plusServerBaseUrls: string[];
plusRequestService: PlusRequestService; async getPlusRequestService() {
@Init()
async init() {
const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo); const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
this.plusRequestService = new PlusRequestService({ return new PlusRequestService({
plusServerBaseUrls: this.plusServerBaseUrls, plusServerBaseUrls: this.plusServerBaseUrls,
subjectId: installInfo.siteId, subjectId: installInfo.siteId,
}); });
} }
async requestWithoutSign(config: any) { async requestWithoutSign(config: any) {
return await this.plusRequestService.requestWithoutSign(config); const plusRequestService = await this.getPlusRequestService();
return await plusRequestService.requestWithoutSign(config);
} }
async request(config: any) { async request(config: any) {
return await this.plusRequestService.request(config); const plusRequestService = await this.getPlusRequestService();
return await plusRequestService.request(config);
} }
async active(formData: { code: any; appKey: string; subjectId: string }) { async active(formData: { code: any; appKey: string; subjectId: string }) {
return await this.plusRequestService.requestWithoutSign({ const plusRequestService = await this.getPlusRequestService();
return await plusRequestService.requestWithoutSign({
url: '/activation/active', url: '/activation/active',
method: 'post', method: 'post',
data: formData, data: formData,
@@ -55,16 +55,18 @@ export class PlusService {
const licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo); const licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);
const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo); const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
const plusRequestService = await this.getPlusRequestService();
return await verify({ return await verify({
subjectId: installInfo.siteId, subjectId: installInfo.siteId,
license: licenseInfo.license, license: licenseInfo.license,
plusRequestService: this.plusRequestService, plusRequestService: plusRequestService,
bindUrl: installInfo?.bindUrl, bindUrl: installInfo?.bindUrl,
}); });
} }
async bindUrl(subjectId: string, url: string) { async bindUrl(subjectId: string, url: string) {
return await this.plusRequestService.request({ const plusRequestService = await this.getPlusRequestService();
return await plusRequestService.request({
url: '/activation/subject/urlBind', url: '/activation/subject/urlBind',
data: { data: {
subjectId, subjectId,

View File

@@ -45,6 +45,26 @@ export class SysLicenseInfo extends BaseSettings {
license?: string; license?: string;
} }
export class SysEmailConf extends BaseSettings {
static __title__ = '邮箱配置';
static __key__ = 'sys.email';
static __access__ = 'private';
host: string;
port: number;
auth: {
user: string;
pass: string;
};
secure: boolean; // use TLS
tls: {
// do not fail on invalid certs
rejectUnauthorized: boolean;
};
sender: string;
usePlus?: boolean;
}
export class SysSiteInfo extends BaseSettings { export class SysSiteInfo extends BaseSettings {
static __title__ = '站点信息'; static __title__ = '站点信息';
static __key__ = 'sys.site'; static __key__ = 'sys.site';

View File

@@ -83,6 +83,7 @@ export class SysSettingsService extends BaseService<SysSettingsEntity> {
let newSetting: T = new type(); let newSetting: T = new type();
const savedSettings = await this.getSettingByKey(key); const savedSettings = await this.getSettingByKey(key);
newSetting = _.merge(newSetting, savedSettings); newSetting = _.merge(newSetting, savedSettings);
await this.saveSetting(newSetting);
await this.cache.set(cacheKey, newSetting); await this.cache.set(cacheKey, newSetting);
return newSetting; return newSetting;
} }
@@ -95,6 +96,7 @@ export class SysSettingsService extends BaseService<SysSettingsEntity> {
const entity = await this.getByKey(key); const entity = await this.getByKey(key);
if (entity) { if (entity) {
entity.setting = JSON.stringify(bean); entity.setting = JSON.stringify(bean);
entity.access = type.__access__;
await this.repository.save(entity); await this.repository.save(entity);
} else { } else {
const newEntity = new SysSettingsEntity(); const newEntity = new SysSettingsEntity();

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/midway-flyway-js **Note:** Version bump only for package @certd/midway-flyway-js

View File

@@ -1,6 +1,6 @@
{ {
"name": "@certd/midway-flyway-js", "name": "@certd/midway-flyway-js",
"version": "1.26.1", "version": "1.26.2",
"description": "midway with flyway, sql upgrade way ", "description": "midway with flyway, sql upgrade way ",
"private": false, "private": false,
"type": "module", "type": "module",
@@ -56,5 +56,5 @@
"typeorm": "^0.3.11", "typeorm": "^0.3.11",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
**Note:** Version bump only for package @certd/plugin-cert
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/plugin-cert **Note:** Version bump only for package @certd/plugin-cert

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/plugin-cert", "name": "@certd/plugin-cert",
"private": false, "private": false,
"version": "1.26.1", "version": "1.26.2",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
@@ -15,9 +15,9 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"@certd/acme-client": "^1.26.1", "@certd/acme-client": "^1.26.2",
"@certd/basic": "^1.26.1", "@certd/basic": "^1.26.2",
"@certd/pipeline": "^1.26.1", "@certd/pipeline": "^1.26.2",
"@google-cloud/publicca": "^1.3.0", "@google-cloud/publicca": "^1.3.0",
"dayjs": "^1.11.7", "dayjs": "^1.11.7",
"jszip": "^3.10.1", "jszip": "^3.10.1",
@@ -57,5 +57,5 @@
"vite": "^3.1.0", "vite": "^3.1.0",
"vue-tsc": "^0.38.9" "vue-tsc": "^0.38.9"
}, },
"gitHead": "46b810822986f7144bb4f67ae5c4a239dbb3691b" "gitHead": "daf575e7c3b808e6b7db48e50c62ebd9fa213b0a"
} }

View File

@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
### Performance Improvements
* 邮箱设置改为系统设置,普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/ui-client **Note:** Version bump only for package @certd/ui-client

View File

@@ -15,9 +15,9 @@
<div class="fs-bootstrap__loading"></div> <div class="fs-bootstrap__loading"></div>
</div> </div>
<div class="fs-bootstrap__footer"> <div class="fs-bootstrap__footer">
<a href="https://github.com/certd/certd" target="_blank"> <!-- <a href="https://github.com/certd/certd" target="_blank">-->
https://github.com/certd/certd <!-- https://github.com/certd/certd-->
</a> <!-- </a>-->
</div> </div>
</div> </div>

View File

@@ -1,6 +1,6 @@
{ {
"name": "@certd/ui-client", "name": "@certd/ui-client",
"version": "1.26.1", "version": "1.26.2",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite --open", "dev": "vite --open",
@@ -61,8 +61,8 @@
"vuedraggable": "^4.1.0" "vuedraggable": "^4.1.0"
}, },
"devDependencies": { "devDependencies": {
"@certd/lib-iframe": "^1.26.1", "@certd/lib-iframe": "^1.26.2",
"@certd/pipeline": "^1.26.1", "@certd/pipeline": "^1.26.2",
"@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-node-resolve": "^15.2.3",
"@types/chai": "^4.3.12", "@types/chai": "^4.3.12",

View File

@@ -1,6 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from "vue"; import { ref } from "vue";
import TutorialSteps from "/@/components/tutorial/tutorial-steps.vue"; import TutorialSteps from "/@/components/tutorial/tutorial-steps.vue";
import { useSettingStore } from "/@/store/modules/settings";
const openedRef = ref(false); const openedRef = ref(false);
function open() { function open() {
openedRef.value = true; openedRef.value = true;
@@ -14,10 +15,12 @@ function prev() {
function next() { function next() {
console.log("next"); console.log("next");
} }
const settingStore = useSettingStore();
</script> </script>
<template> <template>
<div class="tutorial-button" @click="open"> <div v-if="!settingStore.isComm" class="tutorial-button" @click="open">
<fs-icon icon="mingcute:question-line"></fs-icon> <fs-icon icon="mingcute:question-line"></fs-icon>
<div class="ml-5">使用教程</div> <div class="ml-5">使用教程</div>
<a-modal v-model:open="openedRef" class="tutorial-modal" width="90%"> <a-modal v-model:open="openedRef" class="tutorial-modal" width="90%">

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="layout-vip isPlus" @click="openUpgrade"> <div v-if="!settingStore.isComm || userStore.isAdmin" class="layout-vip isPlus" @click="openUpgrade">
<contextHolder /> <contextHolder />
<fs-icon icon="mingcute:vip-1-line" :title="text.title" /> <fs-icon icon="mingcute:vip-1-line" :title="text.title" />

View File

@@ -32,7 +32,7 @@
<!-- Button--> <!-- Button-->
<!-- </button>--> <!-- </button>-->
<fs-menu <fs-menu
v-if="settingStore?.siteEnv?.agent?.enabled === false" v-if="settingStore?.siteEnv?.agent?.enabled === false && !settingStore.isComm"
class="header-menu" class="header-menu"
mode="horizontal" mode="horizontal"
:expand-selected="false" :expand-selected="false"
@@ -67,19 +67,22 @@
</a-layout-content> </a-layout-content>
<a-layout-footer class="fs-framework-footer"> <a-layout-footer class="fs-framework-footer">
<div> <div>
<span>Powered by</span> <span v-if="!settingStore.isComm">
<a> handsfree.work </a> <span>Powered by</span>
<a> handsfree.work </a>
</span>
<template v-if="siteInfo.licenseTo">
<a-divider type="vertical" />
<a :href="siteInfo.licenseToUrl || ''">{{ siteInfo.licenseTo }}</a>
</template>
<template v-if="siteInfo.icpNo"> <template v-if="siteInfo.icpNo">
<a-divider type="vertical" /> <a-divider type="vertical" />
<span> <span>
<a href="https://beian.miit.gov.cn/" target="_blank">{{ siteInfo.icpNo }}</a> <a href="https://beian.miit.gov.cn/" target="_blank">{{ siteInfo.icpNo }}</a>
</span> </span>
</template> </template>
<template v-if="siteInfo.licenseTo">
<a-divider type="vertical" />
<a :href="siteInfo.licenseToUrl || ''">{{ siteInfo.licenseTo }}</a>
</template>
</div> </div>
<div>v{{ version }}</div> <div>v{{ version }}</div>

View File

@@ -13,26 +13,24 @@
<router-view /> <router-view />
<div class="footer"> <div class="footer">
<!-- <div class="links">-->
<!-- <a href="_self">帮助</a>-->
<!-- <a href="_self">隐私</a>-->
<!-- <a href="_self">条款</a>-->
<!-- </div>-->
<div class="copyright"> <div class="copyright">
<span>Copyright</span> <span v-if="!settingStore.isComm">
<span>&copy;</span> <span>Copyright</span>
<span>{{ envRef.COPYRIGHT_YEAR }}</span> <span>&copy;</span>
<span> <span>{{ envRef.COPYRIGHT_YEAR }}</span>
<a :href="envRef.COPYRIGHT_URL" target="_blank">{{ envRef.COPYRIGHT_NAME }}</a> <span>
<a :href="envRef.COPYRIGHT_URL" target="_blank">{{ envRef.COPYRIGHT_NAME }}</a>
</span>
</span>
<span v-if="siteInfo.licenseTo">
<a-divider type="vertical" />
<a :href="siteInfo.licenseToUrl" target="_blank">{{ siteInfo.licenseTo }}</a>
</span> </span>
<span v-if="siteInfo.icpNo"> <span v-if="siteInfo.icpNo">
<a-divider type="vertical" /> <a-divider type="vertical" />
<a href="https://beian.miit.gov.cn/" target="_blank">{{ siteInfo.icpNo }}</a> <a href="https://beian.miit.gov.cn/" target="_blank">{{ siteInfo.icpNo }}</a>
</span> </span>
<span v-if="siteInfo.licenseTo">
<a-divider type="vertical" />
<a :href="siteInfo.licenseToUrl" target="_blank">{{ siteInfo.licenseTo }}</a>
</span>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -56,16 +56,16 @@ export const certdResources = [
auth: true auth: true
} }
}, },
{ // {
title: "邮箱设置", // title: "邮箱设置",
name: "EmailSetting", // name: "EmailSetting",
path: "/certd/settings/email", // path: "/certd/settings/email",
component: "/certd/settings/email-setting.vue", // component: "/certd/settings/email-setting.vue",
meta: { // meta: {
icon: "ion:mail-outline", // icon: "ion:mail-outline",
auth: true // auth: true
} // }
}, // },
{ {
title: "账号信息", title: "账号信息",
name: "UserProfile", name: "UserProfile",

View File

@@ -77,6 +77,17 @@ export const sysResources = [
permission: "sys:settings:view" permission: "sys:settings:view"
} }
}, },
{
title: "邮箱设置",
name: "EmailSetting",
path: "/sys/settings/email",
component: "/sys/settings/email-setting.vue",
meta: {
permission: "sys:settings:view",
icon: "ion:mail-outline",
auth: true
}
},
{ {
title: "站点个性化", title: "站点个性化",
name: "SiteSetting", name: "SiteSetting",
@@ -91,6 +102,7 @@ export const sysResources = [
permission: "sys:settings:view" permission: "sys:settings:view"
} }
}, },
// { // {
// title: "商业版设置", // title: "商业版设置",
// name: "SysCommercial", // name: "SysCommercial",

View File

@@ -170,7 +170,7 @@ export const useSettingStore = defineStore({
}, },
async loadSiteInfo() { async loadSiteInfo() {
const isComm = this.isComm; const isComm = this.isComm;
let siteInfo: SiteInfo; let siteInfo: SiteInfo = {};
if (isComm) { if (isComm) {
siteInfo = await basicApi.getSiteInfo(); siteInfo = await basicApi.getSiteInfo();
if (siteInfo.logo) { if (siteInfo.logo) {

View File

@@ -1,26 +0,0 @@
import { request } from "/@/api/service";
const apiPrefix = "/user/settings";
export const SettingKeys = {
Email: "email"
};
export async function SettingsGet(key: string) {
return await request({
url: apiPrefix + "/get",
method: "post",
params: {
key
}
});
}
export async function SettingsSave(key: string, setting: any) {
await request({
url: apiPrefix + "/save",
method: "post",
data: {
key,
setting: JSON.stringify(setting)
}
});
}

View File

@@ -20,7 +20,7 @@
<div class="content"> <div class="content">
<img src="/static/images/preview.png" class="preview_img" /> <img src="/static/images/preview.png" class="preview_img" />
</div> </div>
<div class="footer_box"> <div v-if="!settingStore.isComm" class="footer_box">
<div>如果觉得好用请不要吝啬你的star哟</div> <div>如果觉得好用请不要吝啬你的star哟</div>
<a href="https://gitee.com/certd/certd" target="_blank"><img src="https://gitee.com/certd/certd/badge/star.svg?theme=dark" alt="star" /></a> <a href="https://gitee.com/certd/certd" target="_blank"><img src="https://gitee.com/certd/certd/badge/star.svg?theme=dark" alt="star" /></a>
<a href="https://github.com/certd/certd" target="_blank"><img alt="GitHub stars" src="https://img.shields.io/github/stars/certd/certd?logo=github" /></a> <a href="https://github.com/certd/certd" target="_blank"><img alt="GitHub stars" src="https://img.shields.io/github/stars/certd/certd?logo=github" /></a>

View File

@@ -1,4 +1,4 @@
import { request } from "/@/api/service"; import { request } from "/src/api/service";
const apiPrefix = "/basic/email"; const apiPrefix = "/basic/email";
export async function TestSend(receiver: string) { export async function TestSend(receiver: string) {

View File

@@ -4,7 +4,8 @@ const apiPrefix = "/sys/settings";
export const SettingKeys = { export const SettingKeys = {
SysPublic: "sys.public", SysPublic: "sys.public",
SysPrivate: "sys.private" SysPrivate: "sys.private",
SysEmail: "sys.email"
}; };
export async function SettingsGet(key: string) { export async function SettingsGet(key: string) {
return await request({ return await request({
@@ -17,7 +18,7 @@ export async function SettingsGet(key: string) {
} }
export async function SettingsSave(key: string, setting: any) { export async function SettingsSave(key: string, setting: any) {
await request({ return await request({
url: apiPrefix + "/save", url: apiPrefix + "/save",
method: "post", method: "post",
data: { data: {
@@ -27,8 +28,15 @@ export async function SettingsSave(key: string, setting: any) {
}); });
} }
export async function EmailSettingsGet() {
return await request({
url: apiPrefix + "/getEmailSettings",
method: "post"
});
}
export async function PublicSettingsSave(setting: any) { export async function PublicSettingsSave(setting: any) {
await request({ return await request({
url: apiPrefix + "/savePublicSettings", url: apiPrefix + "/savePublicSettings",
method: "post", method: "post",
data: setting data: setting
@@ -36,7 +44,7 @@ export async function PublicSettingsSave(setting: any) {
} }
export async function stopOtherUserTimer() { export async function stopOtherUserTimer() {
await request({ return await request({
url: apiPrefix + "/stopOtherUserTimer", url: apiPrefix + "/stopOtherUserTimer",
method: "post" method: "post"
}); });

View File

@@ -82,8 +82,8 @@ import * as api from "./api";
import { SettingKeys } from "./api"; import { SettingKeys } from "./api";
import * as emailApi from "./api.email"; import * as emailApi from "./api.email";
import { notification } from "ant-design-vue"; import { notification } from "ant-design-vue";
import { useSettingStore } from "/@/store/modules/settings"; import { useSettingStore } from "/src/store/modules/settings";
import _ from "lodash-es";
defineOptions({ defineOptions({
name: "EmailSetting" name: "EmailSetting"
}); });
@@ -114,19 +114,15 @@ const formState = reactive<Partial<FormState>>({
}); });
async function load() { async function load() {
const data: any = await api.SettingsGet(SettingKeys.Email); const data: any = await api.EmailSettingsGet();
if (!data?.setting) { _.merge(formState, data);
return;
}
const setting = JSON.parse(data.setting);
Object.assign(formState, setting);
} }
load(); load();
const onFinish = async (form: any) => { const onFinish = async (form: any) => {
console.log("Success:", form); console.log("Success:", form);
await api.SettingsSave(SettingKeys.Email, form); await api.SettingsSave(SettingKeys.SysEmail, form);
notification.success({ notification.success({
message: "保存成功" message: "保存成功"
}); });
@@ -137,7 +133,7 @@ const onFinishFailed = (errorInfo: any) => {
}; };
async function onUsePlusChanged() { async function onUsePlusChanged() {
await api.SettingsSave(SettingKeys.Email, formState); await api.SettingsSave(SettingKeys.SysEmail, formState);
} }
interface TestFormState { interface TestFormState {

View File

@@ -21,19 +21,20 @@ typeorm:
dataSource: dataSource:
default: default:
database: './data/db-comm.sqlite' database: './data/db-comm.sqlite'
plus:
server:
baseUrls: ['https://api.ai.handsfree.work', 'https://api.ai.docmirror.cn']
account:
server:
baseUrl: 'https://ai.handsfree.work/subject'
#plus: #plus:
# server: # server:
# baseUrls: ['http://127.0.0.1:11007'] # baseUrls: ['https://api.ai.handsfree.work', 'https://api.ai.docmirror.cn']
# #
#account: #account:
# server: # server:
# baseUrl: 'http://127.0.0.1:1017/subject' # baseUrl: 'https://ai.handsfree.work/subject'
plus:
server:
baseUrls: ['http://127.0.0.1:11007']
account:
server:
baseUrl: 'http://127.0.0.1:1017/subject'

View File

@@ -0,0 +1,40 @@
# key: ./data/ssl/cert.key
# cert: ./data/ssl/cert.crt
#plus:
# server:
# baseUrl: 'http://127.0.0.1:11007'
#flyway:
# scriptDir: './db/migration-pg'
#typeorm:
# dataSource:
# default:
# type: postgres
# host: localhost
# port: 5433
# username: postgres
# password: root
# database: postgres
typeorm:
dataSource:
default:
database: './data/db-comm-pro.sqlite'
plus:
server:
baseUrls: ['https://api.ai.handsfree.work', 'https://api.ai.docmirror.cn']
account:
server:
baseUrl: 'https://ai.handsfree.work/subject'
#
#plus:
# server:
# baseUrls: ['http://127.0.0.1:11007']
#
#account:
# server:
# baseUrl: 'http://127.0.0.1:1017/subject'

View File

@@ -17,10 +17,10 @@
# password: root # password: root
# database: postgres # database: postgres
#typeorm: typeorm:
# dataSource: dataSource:
# default: default:
# database: './data/db-comm.sqlite' database: './data/db.sqlite'
plus: plus:
server: server:
baseUrls: ['https://api.ai.handsfree.work', 'https://api.ai.docmirror.cn'] baseUrls: ['https://api.ai.handsfree.work', 'https://api.ai.docmirror.cn']

View File

@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
### Bug Fixes
* 修复某些情况下bindUrl失败的bug ([91fc1cd](https://github.com/certd/certd/commit/91fc1cd7353be4a22be951239ed70b38baebc74e))
### Performance Improvements
* 邮箱设置改为系统设置,普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10) ## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package @certd/ui-server **Note:** Version bump only for package @certd/ui-server

View File

@@ -1,6 +1,6 @@
{ {
"name": "@certd/ui-server", "name": "@certd/ui-server",
"version": "1.26.1", "version": "1.26.2",
"description": "fast-server base midway", "description": "fast-server base midway",
"private": true, "private": true,
"type": "module", "type": "module",
@@ -8,6 +8,7 @@
"start": "cross-env NODE_ENV=production node ./bootstrap.js", "start": "cross-env NODE_ENV=production node ./bootstrap.js",
"dev": "cross-env NODE_ENV=local mwtsc --watch --run @midwayjs/mock/app", "dev": "cross-env NODE_ENV=local mwtsc --watch --run @midwayjs/mock/app",
"commdev": "cross-env NODE_ENV=commdev mwtsc --watch --run @midwayjs/mock/app", "commdev": "cross-env NODE_ENV=commdev mwtsc --watch --run @midwayjs/mock/app",
"commpro": "cross-env NODE_ENV=commpro mwtsc --watch --run @midwayjs/mock/app",
"pgdev": "cross-env NODE_ENV=pgdev mwtsc --watch --run @midwayjs/mock/app", "pgdev": "cross-env NODE_ENV=pgdev mwtsc --watch --run @midwayjs/mock/app",
"test": "cross-env NODE_ENV=unittest mocha", "test": "cross-env NODE_ENV=unittest mocha",
"cov": "cross-env c8 --all --reporter=text --reporter=lcovonly npm run test", "cov": "cross-env c8 --all --reporter=text --reporter=lcovonly npm run test",
@@ -23,17 +24,17 @@
}, },
"dependencies": { "dependencies": {
"@alicloud/pop-core": "^1.7.10", "@alicloud/pop-core": "^1.7.10",
"@certd/acme-client": "^1.26.1", "@certd/acme-client": "^1.26.2",
"@certd/commercial-core": "^1.26.1", "@certd/commercial-core": "^1.26.2",
"@certd/lib-huawei": "^1.26.1", "@certd/lib-huawei": "^1.26.2",
"@certd/lib-jdcloud": "^1.26.1", "@certd/lib-jdcloud": "^1.26.2",
"@certd/lib-k8s": "^1.26.1", "@certd/lib-k8s": "^1.26.2",
"@certd/lib-server": "^1.26.1", "@certd/lib-server": "^1.26.2",
"@certd/midway-flyway-js": "^1.26.1", "@certd/midway-flyway-js": "^1.26.2",
"@certd/pipeline": "^1.26.1", "@certd/pipeline": "^1.26.2",
"@certd/plugin-cert": "^1.26.1", "@certd/plugin-cert": "^1.26.2",
"@certd/plugin-plus": "^1.26.1", "@certd/plugin-plus": "^1.26.2",
"@certd/plus-core": "^1.26.1", "@certd/plus-core": "^1.26.2",
"@koa/cors": "^5.0.0", "@koa/cors": "^5.0.0",
"@midwayjs/bootstrap": "~3.17.1", "@midwayjs/bootstrap": "~3.17.1",
"@midwayjs/cache": "~3.14.0", "@midwayjs/cache": "~3.14.0",

View File

@@ -1,11 +1,11 @@
import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core'; import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
import type { EmailSend } from '@certd/pipeline'; import type { EmailSend } from '@certd/pipeline';
import { IEmailService, isPlus } from '@certd/pipeline'; import { IEmailService, isPlus, logger } from '@certd/pipeline';
import nodemailer from 'nodemailer'; import nodemailer from 'nodemailer';
import type SMTPConnection from 'nodemailer/lib/smtp-connection'; import type SMTPConnection from 'nodemailer/lib/smtp-connection';
import { logger } from '@certd/pipeline';
import { UserSettingsService } from '../../mine/service/user-settings-service.js'; import { UserSettingsService } from '../../mine/service/user-settings-service.js';
import { PlusService } from '@certd/lib-server'; import { PlusService, SysSettingsService } from '@certd/lib-server';
import { getEmailSettings } from '../../sys/settings/fix.js';
export type EmailConfig = { export type EmailConfig = {
host: string; host: string;
@@ -27,6 +27,9 @@ export type EmailConfig = {
export class EmailService implements IEmailService { export class EmailService implements IEmailService {
@Inject() @Inject()
settingsService: UserSettingsService; settingsService: UserSettingsService;
@Inject()
sysSettingsService: SysSettingsService;
@Inject() @Inject()
plusService: PlusService; plusService: PlusService;
@@ -55,21 +58,22 @@ export class EmailService implements IEmailService {
/** /**
*/ */
async send(email: EmailSend) { async send(email: EmailSend) {
console.log('sendEmail', email); logger.info('sendEmail', email);
const emailConfigEntity = await this.settingsService.getByKey('email', email.userId); const emailConf = await getEmailSettings(this.sysSettingsService, this.settingsService);
if (emailConfigEntity == null || !emailConfigEntity.setting) {
if (!emailConf.host && emailConf.usePlus == null) {
if (isPlus()) { if (isPlus()) {
//自动使用plus发邮件 //自动使用plus发邮件
return await this.sendByPlus(email); return await this.sendByPlus(email);
} }
throw new Error('email settings 未设置'); throw new Error('email settings 未设置');
} }
const emailConfig = JSON.parse(emailConfigEntity.setting) as EmailConfig;
if (emailConfig.usePlus && isPlus()) { if (emailConf.usePlus && isPlus()) {
return await this.sendByPlus(email); return await this.sendByPlus(email);
} }
await this.sendByCustom(emailConfig, email); await this.sendByCustom(emailConf, email);
logger.info('sendEmail complete: ', email); logger.info('sendEmail complete: ', email);
} }

View File

@@ -1,10 +1,10 @@
import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core'; import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';
import { CrudController } from '@certd/lib-server'; import { CrudController, SysPublicSettings, SysSettingsService } from '@certd/lib-server';
import { SysSettingsService } from '@certd/lib-server';
import { SysSettingsEntity } from '../entity/sys-settings.js'; import { SysSettingsEntity } from '../entity/sys-settings.js';
import { SysPublicSettings } from '@certd/lib-server';
import * as _ from 'lodash-es'; import * as _ from 'lodash-es';
import { PipelineService } from '../../../pipeline/service/pipeline-service.js'; import { PipelineService } from '../../../pipeline/service/pipeline-service.js';
import { UserSettingsService } from '../../../mine/service/user-settings-service.js';
import { getEmailSettings } from '../fix.js';
/** /**
*/ */
@@ -14,6 +14,8 @@ export class SysSettingsController extends CrudController<SysSettingsService> {
@Inject() @Inject()
service: SysSettingsService; service: SysSettingsService;
@Inject() @Inject()
userSettingsService: UserSettingsService;
@Inject()
pipelineService: PipelineService; pipelineService: PipelineService;
getService() { getService() {
@@ -68,6 +70,13 @@ export class SysSettingsController extends CrudController<SysSettingsService> {
return this.ok(entity); return this.ok(entity);
} }
// savePublicSettings
@Post('/getEmailSettings', { summary: 'sys:settings:edit' })
async getEmailSettings(@Body(ALL) body) {
const conf = await getEmailSettings(this.service, this.userSettingsService);
return this.ok(conf);
}
// savePublicSettings // savePublicSettings
@Post('/savePublicSettings', { summary: 'sys:settings:edit' }) @Post('/savePublicSettings', { summary: 'sys:settings:edit' })
async savePublicSettings(@Body(ALL) body) { async savePublicSettings(@Body(ALL) body) {

View File

@@ -0,0 +1,17 @@
import { SysEmailConf, SysSettingsService } from '@certd/lib-server';
import * as _ from 'lodash-es';
import { UserSettingsService } from '../../mine/service/user-settings-service.js';
export async function getEmailSettings(sysSettingService: SysSettingsService, userSettingsService: UserSettingsService): Promise<SysEmailConf> {
let conf = await sysSettingService.getSetting<SysEmailConf>(SysEmailConf);
if (!conf.host || conf.usePlus == null) {
//到userSetting里面去找
const adminEmailSetting = await userSettingsService.getByKey('email', 1);
if (adminEmailSetting) {
const setting = JSON.parse(adminEmailSetting.setting);
conf = _.merge(conf, setting);
await sysSettingService.saveSetting(conf);
}
}
return conf;
}

54
step.md
View File

@@ -13,19 +13,19 @@
## 自动化流水线创建 ## 自动化流水线创建
### 1. 创建证书申请部署流水线 ### 1. 创建证书申请部署流水线
![创建证书申请任务](packages/ui/certd-client/public/statics/doc/images/1-add.png) ![创建证书申请任务](packages/ui/certd-client/public/static/doc/images/1-add.png)
需要添加域名的DNS解析服务商的授权 需要添加域名的DNS解析服务商的授权
![添加域名的DNS解析服务商的授权](packages/ui/certd-client/public/statics/doc/images/2-access-provider.png) ![添加域名的DNS解析服务商的授权](packages/ui/certd-client/public/static/doc/images/2-access-provider.png)
填写accessKey和accessSecret 填写accessKey和accessSecret
![](packages/ui/certd-client/public/statics/doc/images/3-add-access.png) ![](packages/ui/certd-client/public/static/doc/images/3-add-access.png)
流水线创建成功 流水线创建成功
![](packages/ui/certd-client/public/statics/doc/images/4-add-success.png) ![](packages/ui/certd-client/public/static/doc/images/4-add-success.png)
### 2. 任务详情界面 ### 2. 任务详情界面
![](packages/ui/certd-client/public/statics/doc/images/5-view.png) ![](packages/ui/certd-client/public/static/doc/images/5-view.png)
到这一步申请证书就已经配置完成了。 到这一步申请证书就已经配置完成了。
点击手动触发,就可以申请证书了。 点击手动触发,就可以申请证书了。
@@ -34,72 +34,72 @@
### 3. 添加部署到阿里云CDN任务 ### 3. 添加部署到阿里云CDN任务
点击添加任务 点击添加任务
![](packages/ui/certd-client/public/statics/doc/images/6-1-add-task.png) ![](packages/ui/certd-client/public/static/doc/images/6-1-add-task.png)
选择任务类型 选择任务类型
![](packages/ui/certd-client/public/statics/doc/images/6-2-add-task.png) ![](packages/ui/certd-client/public/static/doc/images/6-2-add-task.png)
填写任务参数 填写任务参数
![](packages/ui/certd-client/public/statics/doc/images/6-3-add-task.png) ![](packages/ui/certd-client/public/static/doc/images/6-3-add-task.png)
点击确定部署到CDN任务配置成功 点击确定部署到CDN任务配置成功
### 4. 添加部署到服务器主机任务 ### 4. 添加部署到服务器主机任务
点击新任务,弹出添加任务界面 点击新任务,弹出添加任务界面
![](packages/ui/certd-client/public/statics/doc/images/7-1-add-host-task.png) ![](packages/ui/certd-client/public/static/doc/images/7-1-add-host-task.png)
先选择上传到主机任务 先选择上传到主机任务
填写任务参数,比如证书保存路径 填写任务参数,比如证书保存路径
![](packages/ui/certd-client/public/statics/doc/images/7-2-add-host-task.png) ![](packages/ui/certd-client/public/static/doc/images/7-2-add-host-task.png)
需要添加主机ip、用户名、密码只需添加一次后续其他任务可以复用 需要添加主机ip、用户名、密码只需添加一次后续其他任务可以复用
![](packages/ui/certd-client/public/statics/doc/images/7-3-add-host-task.png) ![](packages/ui/certd-client/public/static/doc/images/7-3-add-host-task.png)
然后添加第二个任务,执行主机命令,部署证书 然后添加第二个任务,执行主机命令,部署证书
![](packages/ui/certd-client/public/statics/doc/images/8-1-add-host-task.png) ![](packages/ui/certd-client/public/static/doc/images/8-1-add-host-task.png)
选择执行脚本命令任务 选择执行脚本命令任务
![](packages/ui/certd-client/public/statics/doc/images/8-2-add-host-task.png) ![](packages/ui/certd-client/public/static/doc/images/8-2-add-host-task.png)
编写脚本,选择之前添加的主机 编写脚本,选择之前添加的主机
![](packages/ui/certd-client/public/statics/doc/images/8-4-add-host-task.png) ![](packages/ui/certd-client/public/static/doc/images/8-4-add-host-task.png)
点击确定,部署到主机任务配置成功 点击确定,部署到主机任务配置成功
![](packages/ui/certd-client/public/statics/doc/images/8-5-add-host-task.png) ![](packages/ui/certd-client/public/static/doc/images/8-5-add-host-task.png)
### 5. 手动触发执行任务,测试一下 ### 5. 手动触发执行任务,测试一下
![](packages/ui/certd-client/public/statics/doc/images/9-start.png) ![](packages/ui/certd-client/public/static/doc/images/9-start.png)
点击任务可以查看状态和日志 点击任务可以查看状态和日志
![](packages/ui/certd-client/public/statics/doc/images/10-1-log.png) ![](packages/ui/certd-client/public/static/doc/images/10-1-log.png)
这里执行失败,可以查看错误日志 这里执行失败,可以查看错误日志
![](packages/ui/certd-client/public/statics/doc/images/11-1-error.png) ![](packages/ui/certd-client/public/static/doc/images/11-1-error.png)
![](packages/ui/certd-client/public/statics/doc/images/11-2-error.png) ![](packages/ui/certd-client/public/static/doc/images/11-2-error.png)
修改正确后,重新执行 修改正确后,重新执行
![](packages/ui/certd-client/public/statics/doc/images/12-1-log-success.png) ![](packages/ui/certd-client/public/static/doc/images/12-1-log-success.png)
可以看到前面执行过的就会跳过,不会重复执行 可以看到前面执行过的就会跳过,不会重复执行
![](packages/ui/certd-client/public/statics/doc/images/12-2-skip-log.png) ![](packages/ui/certd-client/public/static/doc/images/12-2-skip-log.png)
### 6. 查看证书部署效果 ### 6. 查看证书部署效果
可以看到证书已经部署到CDN成功 可以看到证书已经部署到CDN成功
![](packages/ui/certd-client/public/statics/doc/images/13-1-result.png) ![](packages/ui/certd-client/public/static/doc/images/13-1-result.png)
![](packages/ui/certd-client/public/statics/doc/images/13-2-result.png) ![](packages/ui/certd-client/public/static/doc/images/13-2-result.png)
也可以手动下载证书 也可以手动下载证书
![](packages/ui/certd-client/public/statics/doc/images/13-3-download.png) ![](packages/ui/certd-client/public/static/doc/images/13-3-download.png)
### 7. 定时触发 ### 7. 定时触发
配置定时触发,以后每天定时执行 配置定时触发,以后每天定时执行
cron格式例如 `0 0 3 * * *` 表示每天凌晨3点执行 cron格式例如 `0 0 3 * * *` 表示每天凌晨3点执行
到期前20天会自动申请新证书并部署没到期前不会重复申请 到期前20天会自动申请新证书并部署没到期前不会重复申请
![](packages/ui/certd-client/public/statics/doc/images/14-timer.png) ![](packages/ui/certd-client/public/static/doc/images/14-timer.png)
### 8. 邮件通知 ### 8. 邮件通知
可以接收邮件通知(支持时机:开始、成功、失败、失败转成功) 可以接收邮件通知(支持时机:开始、成功、失败、失败转成功)
![](packages/ui/certd-client/public/statics/doc/images/15-1-email.png) ![](packages/ui/certd-client/public/static/doc/images/15-1-email.png)
需要配置邮件服务器 需要配置邮件服务器
![](packages/ui/certd-client/public/statics/doc/images/15-2-email.png) ![](packages/ui/certd-client/public/static/doc/images/15-2-email.png)