Compare commits

...

21 Commits

Author SHA1 Message Date
xiaojunnuo
4343fb1b30 v1.26.3 2024-10-12 15:05:35 +08:00
xiaojunnuo
64e6c74bb6 build: prepare to build 2024-10-12 15:04:24 +08:00
xiaojunnuo
73962536d5 perf: 优化系统设置加载时机 2024-10-12 14:59:12 +08:00
xiaojunnuo
38be8d84b2 chore: agent 2024-10-11 15:43:26 +08:00
xiaojunnuo
8ab632c97c build: publish 2024-10-11 13:39:57 +08:00
xiaojunnuo
903edf12df build: trigger build image 2024-10-11 13:39:39 +08:00
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
xiaojunnuo
daf575e7c3 v1.26.1 2024-10-11 00:31:11 +08:00
xiaojunnuo
70ce2b96e3 build: prepare to build 2024-10-11 00:29:41 +08:00
xiaojunnuo
0b5b3b7444 chore: 2024-10-11 00:29:30 +08:00
66 changed files with 665 additions and 396 deletions

View File

@@ -3,6 +3,26 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
### Performance Improvements
* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))
## [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)
**Note:** Version bump only for package root
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
### Bug Fixes

View File

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

View File

@@ -1 +1 @@
02:06
13:39

View File

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

View File

@@ -1,7 +1,7 @@
version: '3.3' # 兼容旧版docker-compose
services:
certd:
# 镜像 # ↓↓↓↓↓ --- 镜像版本号,建议改成固定版本号
# 镜像 # ↓↓↓↓↓ ---- 镜像版本号,建议改成固定版本号
image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
container_name: certd # 容器名
restart: unless-stopped # 自动重启
@@ -23,18 +23,28 @@ services:
# - "localdomain.comm:192.168.1.3"
environment: # 环境变量
- 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配置
# 配置项见: packages/ui/certd-server/src/config/config.default.ts
# 配置规则: 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",
"version": "1.26.0"
"version": "1.26.3"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/publishlab/node-acme-client/compare/v1.26.2...v1.26.3) (2024-10-12)
**Note:** Version bump only for package @certd/acme-client
## [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)
**Note:** Version bump only for package @certd/acme-client
# [1.26.0](https://github.com/publishlab/node-acme-client/compare/v1.25.9...v1.26.0) (2024-10-10)
### Features

View File

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

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
**Note:** Version bump only for package @certd/basic
## [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)
**Note:** Version bump only for package @certd/basic
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
### Performance Improvements

View File

@@ -1 +1 @@
00:24
15:04

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/basic",
"private": false,
"version": "1.26.0",
"version": "1.26.3",
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -64,5 +64,5 @@
"vite": "^4.3.8",
"vue-tsc": "^1.6.5"
},
"gitHead": "afa8155fda10f9a32427b351454b460897295a2c"
"gitHead": "66f9b08fcf5035577eafc609fd634d6490bc9cae"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
**Note:** Version bump only for package @certd/pipeline
## [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)
**Note:** Version bump only for package @certd/pipeline
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
### Bug Fixes

View File

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

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
**Note:** Version bump only for package @certd/lib-huawei
## [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)
**Note:** Version bump only for package @certd/lib-huawei
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
**Note:** Version bump only for package @certd/lib-huawei

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/lib-huawei",
"private": false,
"version": "1.26.0",
"version": "1.26.3",
"main": "./dist/bundle.js",
"module": "./dist/bundle.js",
"types": "./dist/d/index.d.ts",
@@ -17,5 +17,5 @@
"rimraf": "^5.0.5",
"rollup": "^3.7.4"
},
"gitHead": "afa8155fda10f9a32427b351454b460897295a2c"
"gitHead": "66f9b08fcf5035577eafc609fd634d6490bc9cae"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
**Note:** Version bump only for package @certd/lib-iframe
## [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)
**Note:** Version bump only for package @certd/lib-iframe
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
**Note:** Version bump only for package @certd/lib-iframe

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/lib-iframe",
"private": false,
"version": "1.26.0",
"version": "1.26.3",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -39,5 +39,5 @@
"tslib": "^2.5.2",
"typescript": "^5.4.2"
},
"gitHead": "afa8155fda10f9a32427b351454b460897295a2c"
"gitHead": "66f9b08fcf5035577eafc609fd634d6490bc9cae"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
**Note:** Version bump only for package @certd/lib-jdcloud
## [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)
**Note:** Version bump only for package @certd/lib-jdcloud
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
**Note:** Version bump only for package @certd/lib-jdcloud

View File

@@ -1,7 +1,7 @@
{
"name": "@certd/lib-jdcloud",
"private": false,
"version": "1.26.0",
"version": "1.26.3",
"main": "./dist/bundle.mjs",
"module": "./dist/bundle.mjs",
"types": "./dist/d/index.d.ts",
@@ -27,5 +27,5 @@
"rimraf": "^5.0.5",
"rollup": "^3.7.4"
},
"gitHead": "afa8155fda10f9a32427b351454b460897295a2c"
"gitHead": "66f9b08fcf5035577eafc609fd634d6490bc9cae"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
**Note:** Version bump only for package @certd/lib-k8s
## [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)
**Note:** Version bump only for package @certd/lib-k8s
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
**Note:** Version bump only for package @certd/lib-k8s

View File

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

View File

@@ -3,6 +3,26 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
### Performance Improvements
* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))
## [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)
**Note:** Version bump only for package @certd/lib-server
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
### Bug Fixes

View File

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

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 { logger } from '@certd/basic';
import { SysInstallInfo, SysLicenseInfo, SysSettingsService } from '../../settings/index.js';
@@ -11,26 +11,26 @@ export class PlusService {
@Config('plus.server.baseUrls')
plusServerBaseUrls: string[];
plusRequestService: PlusRequestService;
@Init()
async init() {
async getPlusRequestService() {
const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
this.plusRequestService = new PlusRequestService({
return new PlusRequestService({
plusServerBaseUrls: this.plusServerBaseUrls,
subjectId: installInfo.siteId,
});
}
async requestWithoutSign(config: any) {
return await this.plusRequestService.requestWithoutSign(config);
const plusRequestService = await this.getPlusRequestService();
return await plusRequestService.requestWithoutSign(config);
}
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 }) {
return await this.plusRequestService.requestWithoutSign({
const plusRequestService = await this.getPlusRequestService();
return await plusRequestService.requestWithoutSign({
url: '/activation/active',
method: 'post',
data: formData,
@@ -55,16 +55,18 @@ export class PlusService {
const licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);
const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
const plusRequestService = await this.getPlusRequestService();
return await verify({
subjectId: installInfo.siteId,
license: licenseInfo.license,
plusRequestService: this.plusRequestService,
plusRequestService: plusRequestService,
bindUrl: installInfo?.bindUrl,
});
}
async bindUrl(subjectId: string, url: string) {
return await this.plusRequestService.request({
const plusRequestService = await this.getPlusRequestService();
return await plusRequestService.request({
url: '/activation/subject/urlBind',
data: {
subjectId,

View File

@@ -45,6 +45,26 @@ export class SysLicenseInfo extends BaseSettings {
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 {
static __title__ = '站点信息';
static __key__ = 'sys.site';

View File

@@ -6,7 +6,7 @@ import { CacheManager } from '@midwayjs/cache';
import { BaseSettings, SysPrivateSettings, SysPublicSettings } from './models.js';
import * as _ from 'lodash-es';
import { BaseService } from '../../../basic/index.js';
import { checkComm } from '@certd/pipeline';
import { isComm } from '@certd/pipeline';
/**
* 设置
@@ -40,8 +40,8 @@ export class SysSettingsService extends BaseService<SysSettingsEntity> {
if (!key) {
return null;
}
if (key === 'sys.site') {
checkComm();
if (key === 'sys.site' && isComm()) {
return null;
}
return await this.repository.findOne({
where: {
@@ -83,6 +83,7 @@ export class SysSettingsService extends BaseService<SysSettingsEntity> {
let newSetting: T = new type();
const savedSettings = await this.getSettingByKey(key);
newSetting = _.merge(newSetting, savedSettings);
await this.saveSetting(newSetting);
await this.cache.set(cacheKey, newSetting);
return newSetting;
}
@@ -95,6 +96,7 @@ export class SysSettingsService extends BaseService<SysSettingsEntity> {
const entity = await this.getByKey(key);
if (entity) {
entity.setting = JSON.stringify(bean);
entity.access = type.__access__;
await this.repository.save(entity);
} else {
const newEntity = new SysSettingsEntity();

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
**Note:** Version bump only for package @certd/midway-flyway-js
## [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)
**Note:** Version bump only for package @certd/midway-flyway-js
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
### Performance Improvements

View File

@@ -1,6 +1,6 @@
{
"name": "@certd/midway-flyway-js",
"version": "1.26.0",
"version": "1.26.3",
"description": "midway with flyway, sql upgrade way ",
"private": false,
"type": "module",
@@ -56,5 +56,5 @@
"typeorm": "^0.3.11",
"typescript": "^5.4.2"
},
"gitHead": "afa8155fda10f9a32427b351454b460897295a2c"
"gitHead": "66f9b08fcf5035577eafc609fd634d6490bc9cae"
}

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
**Note:** Version bump only for package @certd/plugin-cert
## [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)
**Note:** Version bump only for package @certd/plugin-cert
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
### Features

View File

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

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
### Performance Improvements
* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))
## [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)
**Note:** Version bump only for package @certd/ui-client
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
### Bug Fixes

View File

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

View File

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

View File

@@ -48,7 +48,6 @@ export default {
const pageStore = usePageStore();
pageStore.init();
const settingStore = useSettingStore();
settingStore.init();
return {
routerEnabled,

View File

@@ -1,6 +1,28 @@
import { request } from "../service";
import { SiteEnv, SiteInfo } from "/@/store/modules/settings";
export type SiteEnv = {
agent?: {
enabled?: boolean;
contactText?: string;
contactLink?: string;
};
};
export type SiteInfo = {
title: string;
slogan: string;
logo: string;
loginLogo: string;
icpNo: string;
licenseTo?: string;
licenseToUrl?: string;
};
export type PlusInfo = {
vipType?: string;
expireTime?: number;
isPlus: boolean;
isComm?: boolean;
};
export type SysPublicSetting = {
registerEnabled: boolean;
managerOtherUserPipeline: boolean;
@@ -11,29 +33,17 @@ export type SysInstallInfo = {
siteId: string;
};
export async function getSysPublicSettings(): Promise<SysPublicSetting> {
return await request({
url: "/basic/settings/public",
method: "get"
});
}
export type AllSettings = {
sysPublic: SysPublicSetting;
installInfo: SysInstallInfo;
plusInfo: PlusInfo;
siteInfo: SiteInfo;
siteEnv: SiteEnv;
};
export async function getInstallInfo(): Promise<SysInstallInfo> {
export async function loadAllSettings(): Promise<AllSettings> {
return await request({
url: "/basic/settings/install",
method: "get"
});
}
export async function getSiteInfo(): Promise<SiteInfo> {
return await request({
url: "/basic/settings/siteInfo",
method: "get"
});
}
export async function getSiteEnv(): Promise<SiteEnv> {
return await request({
url: "/basic/settings/siteEnv",
url: "/basic/settings/all",
method: "get"
});
}
@@ -45,10 +55,3 @@ export async function bindUrl(data: any): Promise<any> {
data
});
}
export async function getPlusInfo() {
return await request({
url: "/basic/settings/plusInfo",
method: "get"
});
}

View File

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

View File

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

View File

@@ -3,6 +3,9 @@
<div class="fs-user-info">您好{{ userStore.getUserInfo?.nickName }}</div>
<template #overlay>
<a-menu>
<a-menu-item>
<div @click="goUserProfile">账号信息</div>
</a-menu-item>
<a-menu-item>
<div @click="doLogout">注销登录</div>
</a-menu-item>
@@ -10,31 +13,33 @@
</template>
</a-dropdown>
</template>
<script lang="ts">
import { defineComponent } from "vue";
<script lang="ts" setup>
import { useUserStore } from "/src/store/modules/user";
import { Modal } from "ant-design-vue";
import { useI18n } from "vue-i18n";
export default defineComponent({
name: "FsUserInfo",
setup() {
const userStore = useUserStore();
console.log("user", userStore);
const { t } = useI18n();
function doLogout() {
Modal.confirm({
iconType: "warning",
title: t("app.login.logoutTip"),
content: t("app.login.logoutMessage"),
onOk: async () => {
await userStore.logout(true);
}
});
}
return {
userStore,
doLogout
};
}
import { useRouter } from "vue-router";
defineOptions({
name: "FsUserInfo"
});
const userStore = useUserStore();
console.log("user", userStore);
const { t } = useI18n();
const router = useRouter();
function goUserProfile() {
console.log("goUserProfile");
router.push("/certd/mine/user-profile");
}
function doLogout() {
Modal.confirm({
iconType: "warning",
title: t("app.login.logoutTip"),
content: t("app.login.logoutMessage"),
onOk: async () => {
await userStore.logout(true);
}
});
}
</script>

View File

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

View File

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

View File

@@ -7,6 +7,8 @@ import { site } from "../utils/util.site";
import { routes } from "./resolve";
import { useResourceStore } from "../store/modules/resource";
import { useUserStore } from "../store/modules/user";
import { useSettingStore } from "/@/store/modules/settings";
const router = createRouter({
history: createWebHashHistory(),
routes
@@ -18,6 +20,8 @@ const router = createRouter({
router.beforeEach(async (to, from, next) => {
// 进度条
NProgress.start();
const settingStore = useSettingStore();
await settingStore.initOnce();
// 修复三级以上路由页面无法缓存的问题
if (to.matched && to.matched.length > 2) {
to.matched.splice(1, to.matched.length - 2);

View File

@@ -27,8 +27,7 @@ export const frameworkResource = [
}
},
//...crudResources,
...certdResources,
...sysResources
...certdResources
]
}
];

View File

@@ -1,3 +1,5 @@
import { sysResources } from "/@/router/source/modules/sys";
export const certdResources = [
{
title: "证书自动化",
@@ -56,16 +58,16 @@ export const certdResources = [
auth: true
}
},
{
title: "邮箱设置",
name: "EmailSetting",
path: "/certd/settings/email",
component: "/certd/settings/email-setting.vue",
meta: {
icon: "ion:mail-outline",
auth: true
}
},
// {
// title: "邮箱设置",
// name: "EmailSetting",
// path: "/certd/settings/email",
// component: "/certd/settings/email-setting.vue",
// meta: {
// icon: "ion:mail-outline",
// auth: true
// }
// },
{
title: "账号信息",
name: "UserProfile",
@@ -73,9 +75,11 @@ export const certdResources = [
component: "/certd/mine/user-profile.vue",
meta: {
icon: "ion:person-outline",
auth: true
auth: true,
isMenu: false
}
}
},
...sysResources
]
}
];

View File

@@ -13,40 +13,6 @@ export const sysResources = [
permission: "sys"
},
children: [
{
title: "权限管理",
name: "AuthorityManager",
path: "/sys/authority",
redirect: "/sys/authority/permission",
meta: {
icon: "ion:ribbon-outline",
//需要校验权限
permission: "sys:auth"
},
children: [
{
title: "权限资源管理",
name: "PermissionManager",
path: "/sys/authority/permission",
component: "/sys/authority/permission/index.vue",
meta: {
icon: "ion:list-outline",
//需要校验权限
permission: "sys:auth:per:view"
}
},
{
title: "角色管理",
name: "RoleManager",
path: "/sys/authority/role",
component: "/sys/authority/role/index.vue",
meta: {
icon: "ion:people-outline",
permission: "sys:auth:role:view"
}
}
]
},
{
title: "用户管理",
name: "UserManager",
@@ -77,6 +43,17 @@ export const sysResources = [
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: "站点个性化",
name: "SiteSetting",
@@ -91,6 +68,38 @@ export const sysResources = [
permission: "sys:settings:view"
}
},
{
title: "账号绑定",
name: "AccountBind",
path: "/sys/account",
component: "/sys/account/index.vue",
meta: {
icon: "ion:golf-outline",
permission: "sys:settings:view"
}
},
{
title: "权限管理",
name: "PermissionManager",
path: "/sys/authority/permission",
component: "/sys/authority/permission/index.vue",
meta: {
icon: "ion:list-outline",
//需要校验权限
permission: "sys:auth:per:view"
}
},
{
title: "角色管理",
name: "RoleManager",
path: "/sys/authority/role",
component: "/sys/authority/role/index.vue",
meta: {
icon: "ion:people-outline",
permission: "sys:auth:role:view"
}
}
// {
// title: "商业版设置",
// name: "SysCommercial",
@@ -118,16 +127,6 @@ export const sysResources = [
// }
// ]
// }
{
title: "账号绑定",
name: "AccountBind",
path: "/sys/account",
component: "/sys/account/index.vue",
meta: {
icon: "ion:golf-outline",
permission: "sys:settings:view"
}
}
]
}
];

View File

@@ -5,7 +5,7 @@ import _ from "lodash-es";
import { LocalStorage } from "/src/utils/util.storage";
import * as basicApi from "/@/api/modules/api.basic";
import { SysInstallInfo, SysPublicSetting } from "/@/api/modules/api.basic";
import { PlusInfo, SiteEnv, SiteInfo, SysInstallInfo, SysPublicSetting } from "/@/api/modules/api.basic";
import { useUserStore } from "/@/store/modules/user";
import { mitter } from "/@/utils/util.mitt";
import { env } from "/@/utils/util.env";
@@ -36,31 +36,7 @@ export interface SettingState {
siteInfo: SiteInfo;
plusInfo?: PlusInfo;
siteEnv?: SiteEnv;
}
export type SiteEnv = {
agent?: {
enabled?: boolean;
contactText?: string;
contactLink?: string;
};
};
export type SiteInfo = {
title: string;
slogan: string;
logo: string;
loginLogo: string;
warningOff: boolean;
icpNo: string;
licenseTo?: string;
licenseToUrl?: string;
};
interface PlusInfo {
vipType?: string;
expireTime?: number;
isPlus: boolean;
isComm?: boolean;
inited?: boolean;
}
const defaultThemeConfig = {
@@ -73,7 +49,6 @@ const defaultSiteInfo = {
slogan: env.SLOGAN || "让你的证书永不过期",
logo: env.LOGO || "/static/images/logo/logo.svg",
loginLogo: env.LOGIN_LOGO || "/static/images/logo/rect-block.svg",
warningOff: false,
icpNo: env.ICP_NO,
licenseTo: "",
licenseToUrl: ""
@@ -88,7 +63,8 @@ export const useSettingStore = defineStore({
},
plusInfo: {
isPlus: false,
vipType: "free"
vipType: "free",
isComm: false
},
sysPublic: {
registerEnabled: false,
@@ -109,7 +85,8 @@ export const useSettingStore = defineStore({
contactText: "",
contactLink: ""
}
}
},
inited: false
}),
getters: {
getThemeConfig(): any {
@@ -127,6 +104,12 @@ export const useSettingStore = defineStore({
isComm(): boolean {
return this.plusInfo?.isComm && this.plusInfo?.expireTime > new Date().getTime();
},
isAgent(): boolean {
return this.siteEnv?.agent?.enabled === true;
},
isCommOrAgent() {
return this.isComm || this.isAgent;
},
vipLabel(): string {
const vipLabelMap: any = {
free: "免费版",
@@ -146,33 +129,18 @@ export const useSettingStore = defineStore({
}
},
async loadSysSettings() {
await this.loadSysPublicSettings();
await this.loadSiteEnv();
await this.loadInstallInfo();
await this.loadPlusInfo();
await this.loadSiteInfo();
const allSettings = await basicApi.loadAllSettings();
_.merge(this.sysPublic, allSettings.sysPublic || {});
_.merge(this.installInfo, allSettings.installInfo || {});
_.merge(this.siteEnv, allSettings.siteEnv || {});
_.merge(this.plusInfo, allSettings.plusInfo || {});
//@ts-ignore
this.initSiteInfo(allSettings.siteInfo || {});
await this.checkUrlBound();
},
async loadSysPublicSettings() {
const settings = await basicApi.getSysPublicSettings();
_.merge(this.sysPublic, settings);
},
async loadInstallInfo() {
const installInfo = await basicApi.getInstallInfo();
_.merge(this.installInfo, installInfo);
},
async loadSiteEnv() {
const siteEnv = await basicApi.getSiteEnv();
_.merge(this.siteEnv, siteEnv);
},
async loadPlusInfo() {
this.plusInfo = await basicApi.getPlusInfo();
},
async loadSiteInfo() {
const isComm = this.isComm;
let siteInfo: SiteInfo;
if (isComm) {
siteInfo = await basicApi.getSiteInfo();
initSiteInfo(siteInfo: SiteInfo) {
//@ts-ignore
if (this.isComm) {
if (siteInfo.logo) {
siteInfo.logo = `/api/basic/file/download?key=${siteInfo.logo}`;
}
@@ -205,8 +173,9 @@ export const useSettingStore = defineStore({
const doBindUrl = async (url: string) => {
await basicApi.bindUrl({ url });
await this.loadInstallInfo();
await this.loadSysSettings();
};
const baseUrl = getBaseUrl();
if (!bindUrl) {
//绑定url
@@ -269,6 +238,13 @@ export const useSettingStore = defineStore({
async init() {
await this.setThemeConfig(this.getThemeConfig);
await this.loadSysSettings();
},
async initOnce() {
if (this.inited) {
return;
}
await this.init();
this.inited = true;
}
}
});

View File

@@ -1,7 +1,7 @@
import * as envs from "./util.env";
import * as sites from "./util.site";
import * as storages from "./util.storage";
import * as commons from "./util.common";
import commons from "./util.common";
import * as mitt from "./util.mitt";
export const util = {
...envs,

View File

@@ -29,5 +29,9 @@ export default {
array.push(item);
}
return array;
},
async sleep(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
};

View File

@@ -5,7 +5,7 @@
</template>
<div class="p-10">
<a-descriptions title="" bordered>
<a-descriptions-item label="用户名">{{ userInfo.userInfoname }}</a-descriptions-item>
<a-descriptions-item label="用户名">{{ userInfo.username }}</a-descriptions-item>
<a-descriptions-item label="昵称">{{ userInfo.nickName }}</a-descriptions-item>
<a-descriptions-item label="邮箱">{{ userInfo.email }}</a-descriptions-item>
<a-descriptions-item label="手机号">{{ userInfo.phoneCode }}{{ userInfo.mobile }}</a-descriptions-item>

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

@@ -6,7 +6,7 @@
</div>
</div>
<p class="d2-page-cover__sub-title">{{ siteInfo.slogan }}</p>
<div v-if="siteInfo.warningOff !== true && settingStore.siteEnv?.agent?.enabled === false" class="warning">
<div v-if="!settingStore.isCommOrAgent" class="warning">
<a-alert type="warning" show-icon>
<template #description>
<div class="flex">
@@ -17,10 +17,10 @@
</template>
</a-alert>
</div>
<div class="content">
<div v-if="!settingStore.isCommOrAgent" class="content">
<img src="/static/images/preview.png" class="preview_img" />
</div>
<div class="footer_box">
<div v-if="!settingStore.isCommOrAgent" class="footer_box">
<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://github.com/certd/certd" target="_blank"><img alt="GitHub stars" src="https://img.shields.io/github/stars/certd/certd?logo=github" /></a>
@@ -29,7 +29,8 @@
</template>
<script lang="ts" setup>
import { computed, ref, Ref } from "vue";
import { SiteInfo, useSettingStore } from "/@/store/modules/settings";
import { useSettingStore } from "/@/store/modules/settings";
import { SiteInfo } from "/@/api/modules/api.basic";
const version = ref(import.meta.env.VITE_APP_VERSION);
const settingStore = useSettingStore();

View File

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

View File

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

View File

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

View File

@@ -54,11 +54,13 @@ defineOptions({
interface FormState {
registerEnabled: boolean;
managerOtherUserPipeline: boolean;
icpNo: string;
}
const formState = reactive<Partial<FormState>>({
registerEnabled: false,
managerOtherUserPipeline: false
managerOtherUserPipeline: false,
icpNo: ""
});
async function loadSysPublicSettings() {

View File

@@ -37,9 +37,6 @@
:build-url="buildUrl"
/>
</a-form-item>
<a-form-item label="关闭首页告警" name="warningOff">
<a-switch v-model:checked="formState.warningOff" />
</a-form-item>
<a-form-item label="你的主体名称" name="licenseTo">
<a-input v-model:value="formState.licenseTo" />
<div class="helper">将会显示在底部</div>
@@ -77,7 +74,6 @@ interface FormState {
slogan: string;
logo: string;
loginLogo: string;
warningOff: boolean;
licenseTo: string;
licenseToUrl: string;
}

View File

@@ -21,19 +21,20 @@ typeorm:
dataSource:
default:
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:
# server:
# baseUrls: ['http://127.0.0.1:11007']
# baseUrls: ['https://api.ai.handsfree.work', 'https://api.ai.docmirror.cn']
#
#account:
# 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
# database: postgres
#typeorm:
# dataSource:
# default:
# database: './data/db-comm.sqlite'
typeorm:
dataSource:
default:
database: './data/db.sqlite'
plus:
server:
baseUrls: ['https://api.ai.handsfree.work', 'https://api.ai.docmirror.cn']

View File

@@ -3,6 +3,26 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
### Performance Improvements
* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))
## [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)
**Note:** Version bump only for package @certd/ui-server
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
### Bug Fixes

View File

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

View File

@@ -89,7 +89,7 @@ export class MainConfiguration {
this.app.getMiddleware().insertFirst(async (ctx: IMidwayKoaContext, next: NextFunction) => {
await next();
if (ctx.path === '/' || ctx.path === '/index.html') {
ctx.response.set('Cache-Control', 'public,max-age=180');
ctx.response.set('Cache-Control', 'public,max-age=60');
}
});

View File

@@ -1,4 +1,4 @@
import { ALL, Body, Config, Controller, Get, Inject, Provide } from '@midwayjs/core';
import { Config, Controller, Get, Inject, Provide } from '@midwayjs/core';
import { BaseController, Constants, SysInstallInfo, SysPublicSettings, SysSettingsService, SysSiteEnv, SysSiteInfo } from '@certd/lib-server';
import { AppKey, getPlusInfo } from '@certd/pipeline';
@@ -15,39 +15,45 @@ export class BasicSettingsController extends BaseController {
@Config('agent')
agentConfig: SysSiteEnv['agent'];
@Get('/public', { summary: Constants.per.guest })
public async getSysPublic() {
const settings = await this.sysSettingsService.getSetting(SysPublicSettings);
return this.ok(settings);
return await this.sysSettingsService.getSetting(SysPublicSettings);
}
@Get('/install', { summary: Constants.per.guest })
public async getInstallInfo() {
const settings: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);
settings.accountServerBaseUrl = this.accountServerBaseUrl;
settings.appKey = AppKey;
return this.ok(settings);
return settings;
}
@Get('/siteInfo', { summary: Constants.per.guest })
public async getSiteInfo() {
const settings: SysSiteInfo = await this.sysSettingsService.getSetting(SysSiteInfo);
return this.ok(settings);
return await this.sysSettingsService.getSetting(SysSiteInfo);
}
@Get('/siteEnv', { summary: Constants.per.guest })
public async getSiteEnv() {
const env: SysSiteEnv = {
agent: this.agentConfig,
};
return this.ok(env);
return env;
}
@Get('/plusInfo', { summary: Constants.per.guest })
async plusInfo(@Body(ALL) body: any) {
const info = getPlusInfo();
async plusInfo() {
return getPlusInfo();
}
@Get('/all', { summary: Constants.per.guest })
async getAllSettings() {
const sysPublic = await this.getSysPublic();
const installInfo = await this.getInstallInfo();
const siteInfo = await this.getSiteInfo();
const siteEnv = await this.getSiteEnv();
const plusInfo = await this.plusInfo();
return this.ok({
...info,
sysPublic,
installInfo,
siteInfo,
siteEnv,
plusInfo,
});
}
}

View File

@@ -1,11 +1,11 @@
import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
import type { EmailSend } from '@certd/pipeline';
import { IEmailService, isPlus } from '@certd/pipeline';
import { IEmailService, isPlus, logger } from '@certd/pipeline';
import nodemailer from 'nodemailer';
import type SMTPConnection from 'nodemailer/lib/smtp-connection';
import { logger } from '@certd/pipeline';
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 = {
host: string;
@@ -27,6 +27,9 @@ export type EmailConfig = {
export class EmailService implements IEmailService {
@Inject()
settingsService: UserSettingsService;
@Inject()
sysSettingsService: SysSettingsService;
@Inject()
plusService: PlusService;
@@ -55,21 +58,22 @@ export class EmailService implements IEmailService {
/**
*/
async send(email: EmailSend) {
console.log('sendEmail', email);
logger.info('sendEmail', email);
const emailConfigEntity = await this.settingsService.getByKey('email', email.userId);
if (emailConfigEntity == null || !emailConfigEntity.setting) {
const emailConf = await getEmailSettings(this.sysSettingsService, this.settingsService);
if (!emailConf.host && emailConf.usePlus == null) {
if (isPlus()) {
//自动使用plus发邮件
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);
}
await this.sendByCustom(emailConfig, email);
await this.sendByCustom(emailConf, email);
logger.info('sendEmail complete: ', email);
}

View File

@@ -1,10 +1,10 @@
import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';
import { CrudController } from '@certd/lib-server';
import { SysSettingsService } from '@certd/lib-server';
import { CrudController, SysPublicSettings, SysSettingsService } from '@certd/lib-server';
import { SysSettingsEntity } from '../entity/sys-settings.js';
import { SysPublicSettings } from '@certd/lib-server';
import * as _ from 'lodash-es';
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()
service: SysSettingsService;
@Inject()
userSettingsService: UserSettingsService;
@Inject()
pipelineService: PipelineService;
getService() {
@@ -68,6 +70,13 @@ export class SysSettingsController extends CrudController<SysSettingsService> {
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
@Post('/savePublicSettings', { summary: 'sys:settings:edit' })
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. 创建证书申请部署流水线
![创建证书申请任务](packages/ui/certd-client/public/statics/doc/images/1-add.png)
![创建证书申请任务](packages/ui/certd-client/public/static/doc/images/1-add.png)
需要添加域名的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
![](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. 任务详情界面
![](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任务
点击添加任务
![](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任务配置成功
### 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、用户名、密码只需添加一次后续其他任务可以复用
![](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. 手动触发执行任务,测试一下
![](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/statics/doc/images/11-2-error.png)
![](packages/ui/certd-client/public/static/doc/images/11-1-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. 查看证书部署效果
可以看到证书已经部署到CDN成功
![](packages/ui/certd-client/public/statics/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-1-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. 定时触发
配置定时触发,以后每天定时执行
cron格式例如 `0 0 3 * * *` 表示每天凌晨3点执行
到期前20天会自动申请新证书并部署没到期前不会重复申请
![](packages/ui/certd-client/public/statics/doc/images/14-timer.png)
![](packages/ui/certd-client/public/static/doc/images/14-timer.png)
### 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)