diff --git a/docker/run/docker-compose.yaml b/docker/run/docker-compose.yaml index 420cf0b1..cae99632 100644 --- a/docker/run/docker-compose.yaml +++ b/docker/run/docker-compose.yaml @@ -23,7 +23,7 @@ services: # extra_hosts: # ↓↓↓↓ ---------------------------------------------------------- 这里可以配置自定义hosts,外网域名可以指向本地局域网ip地址 # - "localdomain.comm:192.168.1.3" - environment: # 环境变量 + environment: - TZ=Asia/Shanghai # 设置环境变量即可自定义certd配置 # 配置项见: packages/ui/certd-server/src/config/config.default.ts @@ -35,7 +35,6 @@ services: #- certd_https_cert=./data/ssl/cert.crt #- certd_https_enabled=true #- certd_https_port=7002 - - # ↓↓↓↓ ------------------------------- 使用postgresql数据库 # - certd_flyway_scriptDir=./db/migration-pg # 升级脚本目录 # - certd_typeorm_dataSource_default_type=postgres # 数据库类型 diff --git a/packages/ui/certd-client/src/components/vip-button/index.vue b/packages/ui/certd-client/src/components/vip-button/index.vue index 4f501770..fbf10423 100644 --- a/packages/ui/certd-client/src/components/vip-button/index.vue +++ b/packages/ui/certd-client/src/components/vip-button/index.vue @@ -105,7 +105,7 @@ const vipTypeDefine = { comm: { title: "商业版", type: "comm", - privilege: ["拥有专业版所有特权", "允许商用", "修改logo、标题", "多用户无限制", "支持用户支付(敬请期待)"] + privilege: ["拥有专业版所有特权", "允许商用,可修改logo、标题", "数据统计", "插件管理", "多用户无限制", "支持用户支付(敬请期待)"] } }; @@ -256,7 +256,7 @@ function openUpgrade() { padding: 10px; border: 1px solid #eee; border-radius: 5px; - height: 160px; + height: 170px; //background-color: rgba(250, 237, 167, 0.79); &.current { border-color: green; diff --git a/packages/ui/certd-client/src/router/source/modules/sys.ts b/packages/ui/certd-client/src/router/source/modules/sys.ts index c7bff716..8b6d8e63 100644 --- a/packages/ui/certd-client/src/router/source/modules/sys.ts +++ b/packages/ui/certd-client/src/router/source/modules/sys.ts @@ -13,6 +13,20 @@ export const sysResources = [ permission: "sys:settings:view" }, children: [ + { + title: "控制台", + name: "SysConsole", + path: "/sys/console", + component: "/sys/console/index.vue", + meta: { + show: () => { + const settingStore = useSettingStore(); + return settingStore.isComm; + }, + icon: "ion:speedometer-outline", + permission: "sys:auth:user:view" + } + }, { title: "用户管理", name: "UserManager", diff --git a/packages/ui/certd-client/src/views/certd/mine/user-profile.vue b/packages/ui/certd-client/src/views/certd/mine/user-profile.vue index 309a1ca6..d87718bd 100644 --- a/packages/ui/certd-client/src/views/certd/mine/user-profile.vue +++ b/packages/ui/certd-client/src/views/certd/mine/user-profile.vue @@ -6,6 +6,12 @@
{{ userInfo.username }} + + + + {{ userInfo.username }} + + {{ userInfo.nickName }} {{ userInfo.email }} {{ userInfo.phoneCode }}{{ userInfo.mobile }} diff --git a/packages/ui/certd-client/src/views/framework/home/dashboard/charts/day-count.vue b/packages/ui/certd-client/src/views/framework/home/dashboard/charts/day-count.vue index 50e4ae63..9e110270 100644 --- a/packages/ui/certd-client/src/views/framework/home/dashboard/charts/day-count.vue +++ b/packages/ui/certd-client/src/views/framework/home/dashboard/charts/day-count.vue @@ -1,5 +1,5 @@ + diff --git a/packages/ui/certd-server/src/controller/dashboard/statistic-controller.ts b/packages/ui/certd-server/src/controller/dashboard/statistic-controller.ts index f22cf863..1b68e749 100644 --- a/packages/ui/certd-server/src/controller/dashboard/statistic-controller.ts +++ b/packages/ui/certd-server/src/controller/dashboard/statistic-controller.ts @@ -1,4 +1,4 @@ -import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core'; +import { Controller, Inject, Post, Provide } from '@midwayjs/core'; import { BaseController, Constants } from '@certd/lib-server'; import { UserService } from '../../modules/sys/authority/service/user-service.js'; import { RoleService } from '../../modules/sys/authority/service/role-service.js'; @@ -12,7 +12,7 @@ export type ChartItem = { export type UserStatisticCount = { pipelineCount?: number; pipelineStatusCount?: ChartItem[]; - runningCount: ChartItem[]; + historyCountPerDay: ChartItem[]; expiringList: any[]; }; /** @@ -33,36 +33,15 @@ export class StatisticController extends BaseController { @Post('/count', { summary: Constants.per.authOnly }) public async count() { const pipelineCount = await this.pipelineService.count({ userId: this.getUserId() }); - let pipelineStatusCount = await this.pipelineService.statusCount({ userId: this.getUserId() }); - pipelineStatusCount = pipelineStatusCount.map(item => { - return { - name: item.status, - value: item.count, - }; - }); - - const historyCount = await this.historyService.dayCount({ userId: this.getUserId(), days: 7 }); - const runningCount = historyCount.map(item => { - return { - name: item.date, - value: item.count, - }; - }); - + const pipelineStatusCount = await this.pipelineService.statusCount({ userId: this.getUserId() }); + const historyCount = await this.historyService.countPerDay({ userId: this.getUserId(), days: 7 }); const expiringList = await this.pipelineService.latestExpiringList({ userId: this.getUserId(), count: 5 }); const count: UserStatisticCount = { pipelineCount, pipelineStatusCount, - runningCount, + historyCountPerDay: historyCount, expiringList, }; return this.ok(count); } - - @Post('/changePassword', { summary: Constants.per.authOnly }) - public async changePassword(@Body(ALL) body: any) { - const userId = this.getUserId(); - await this.userService.changePassword(userId, body); - return this.ok({}); - } } diff --git a/packages/ui/certd-server/src/controller/sys/console/statistic-controller.ts b/packages/ui/certd-server/src/controller/sys/console/statistic-controller.ts new file mode 100644 index 00000000..1b6d39e0 --- /dev/null +++ b/packages/ui/certd-server/src/controller/sys/console/statistic-controller.ts @@ -0,0 +1,51 @@ +import { Controller, Inject, Post, Provide } from '@midwayjs/core'; +import { BaseController } from '@certd/lib-server'; +import { UserService } from '../../../modules/sys/authority/service/user-service.js'; +import { RoleService } from '../../../modules/sys/authority/service/role-service.js'; +import { PipelineService } from '../../../modules/pipeline/service/pipeline-service.js'; +import { HistoryService } from '../../../modules/pipeline/service/history-service.js'; + +export type ChartItem = { + name: string; + value: number; +}; +export type SysStatisticCount = { + userCount: number; + pipelineCount?: number; + historyCountPerDay: ChartItem[]; + userRegisterCountPerDay: ChartItem[]; + pipelineCreateCountPerDay: ChartItem[]; +}; +/** + */ +@Provide() +@Controller('/api/sys/statistic/') +export class SysStatisticController extends BaseController { + @Inject() + userService: UserService; + @Inject() + roleService: RoleService; + + @Inject() + pipelineService: PipelineService; + @Inject() + historyService: HistoryService; + + @Post('/count', { summary: 'sys:settings:view' }) + public async count() { + const userCount = await this.userService.count(); + const userRegisterCountPerDay = await this.userService.registerCountPerDay({ days: 7 }); + const pipelineCreateCountPerDay = await this.pipelineService.createCountPerDay({ days: 7 }); + const pipelineCount = await this.pipelineService.count({}); + const historyCountPerDay = await this.historyService.countPerDay({ days: 7 }); + + const count: SysStatisticCount = { + userCount, + userRegisterCountPerDay, + pipelineCount, + pipelineCreateCountPerDay, + historyCountPerDay, + }; + return this.ok(count); + } +} diff --git a/packages/ui/certd-server/src/modules/pipeline/service/history-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/history-service.ts index 884a4fd5..9fa64f34 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/history-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/history-service.ts @@ -175,17 +175,21 @@ export class HistoryService extends BaseService { } } - async dayCount(param: { days: number; userId: any }) { + async countPerDay(param: { days: number; userId?: any }) { const todayEnd = dayjs().endOf('day'); + const where: any = { + // 0点 + // userId: param.userId, + createTime: MoreThan(todayEnd.add(-param.days, 'day').toDate()), + }; + if (param.userId > 0) { + where.userId = param.userId; + } const result = await this.getRepository() .createQueryBuilder('main') .select('date(main.createTime) AS date') // 将UNIX时间戳转换为日期 .addSelect('COUNT(*) AS count') - .where({ - // 0点 - userId: param.userId, - createTime: MoreThan(todayEnd.add(-param.days, 'day').toDate()), - }) + .where(where) .groupBy('date') .getRawMany(); diff --git a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts index b2770e99..e68de62c 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts @@ -1,6 +1,6 @@ import { Config, Inject, Provide, Scope, ScopeEnum, sleep } from '@midwayjs/core'; import { InjectEntityModel } from '@midwayjs/typeorm'; -import { In, Repository } from 'typeorm'; +import { In, MoreThan, Repository } from 'typeorm'; import { BaseService, NeedVIPException, PageReq, SysPublicSettings, SysSettingsService } from '@certd/lib-server'; import { PipelineEntity } from '../entity/pipeline.js'; import { PipelineDetail } from '../entity/vo/pipeline-detail.js'; @@ -19,6 +19,7 @@ import { AccessGetter } from './access-getter.js'; import { CnameRecordService } from '../../cname/service/cname-record-service.js'; import { CnameProxyService } from './cname-proxy-service.js'; import { PluginConfigGetter } from '../../plugin/service/plugin-config-getter.js'; +import dayjs from 'dayjs'; const runningTasks: Map = new Map(); const freeCount = 10; @@ -473,7 +474,7 @@ export class PipelineService extends BaseService { await this.historyLogService.addOrUpdate(logEntity); } - async count(param: { userId: any }) { + async count(param: { userId?: any }) { const count = await this.repository.count({ where: { userId: param.userId, @@ -482,7 +483,7 @@ export class PipelineService extends BaseService { return count; } - async statusCount(param: { userId: any }) { + async statusCount(param: { userId?: any } = {}) { const statusCount = await this.repository .createQueryBuilder() .select('status') @@ -516,4 +517,20 @@ export class PipelineService extends BaseService { return list.slice(0, 5); } + + async createCountPerDay(param: { days: number } = { days: 7 }) { + const todayEnd = dayjs().endOf('day'); + const result = await this.getRepository() + .createQueryBuilder('main') + .select('date(main.createTime) AS date') // 将UNIX时间戳转换为日期 + .addSelect('COUNT(*) AS count') + .where({ + // 0点 + createTime: MoreThan(todayEnd.add(-param.days, 'day').toDate()), + }) + .groupBy('date') + .getRawMany(); + + return result; + } } diff --git a/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts b/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts index 5748a6f4..34725564 100644 --- a/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts +++ b/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts @@ -1,6 +1,6 @@ import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core'; import { InjectEntityModel } from '@midwayjs/typeorm'; -import { Repository } from 'typeorm'; +import { MoreThan, Repository } from 'typeorm'; import { UserEntity } from '../entity/user.js'; import * as _ from 'lodash-es'; import md5 from 'md5'; @@ -15,6 +15,7 @@ import bcrypt from 'bcryptjs'; import { SysSettingsService } from '@certd/lib-server'; import { SysInstallInfo } from '@certd/lib-server'; import { RandomUtil } from '../../../../utils/random.js'; +import dayjs from 'dayjs'; /** * 系统用户 @@ -245,4 +246,29 @@ export class UserService extends BaseService { status, }); } + + async count(param: { userId?: any } = {}) { + const count = await this.repository.count({ + where: { + id: param.userId, + }, + }); + return count; + } + + async registerCountPerDay(param: { days: number } = { days: 7 }) { + const todayEnd = dayjs().endOf('day'); + const result = await this.getRepository() + .createQueryBuilder('main') + .select('date(main.createTime) AS date') // 将UNIX时间戳转换为日期 + .addSelect('COUNT(*) AS count') + .where({ + // 0点 + createTime: MoreThan(todayEnd.add(-param.days, 'day').toDate()), + }) + .groupBy('date') + .getRawMany(); + + return result; + } }