diff --git a/src/api/infra/fileConfig/index.ts b/src/api/infra/fileConfig/index.ts index e88f825f162643e3938eafc55ba19f62e1c03af4..cd1dbe6ca6681bd9b8fba0ec8b495f5a04ce86b9 100644 --- a/src/api/infra/fileConfig/index.ts +++ b/src/api/infra/fileConfig/index.ts @@ -13,6 +13,7 @@ export interface FileClientConfig { accessSecret?: string enablePathStyleAccess?: boolean enablePublicAccess?: boolean + region?: string domain: string } diff --git a/src/api/system/shortlink/index.ts b/src/api/system/shortlink/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c578f86fad54e87173ae90c5802574e8ed5ae897 --- /dev/null +++ b/src/api/system/shortlink/index.ts @@ -0,0 +1,145 @@ +import request from '@/config/axios' + +export interface ShortLinkVO { + id?: number + originalUrl: string + shortCode?: string + shortUrl?: string + title?: string + description?: string + expireTime?: number + status?: boolean + forever?: boolean + clickCount?: number + createTime?: Date + updateTime?: Date +} + +export interface ShortLinkPageReqVO extends PageParam { + originalUrl?: string + shortCode?: string + title?: string + status?: boolean + createTime?: Date[] +} + +export interface ShortLinkStatisticsVO { + id: number + shortCode: string + originalUrl: string + title: string + clickCount: number + todayClickCount: number + weekClickCount: number + monthClickCount: number + lastClickTime?: Date +} + +export interface ShortLinkClickLogVO { + id: number + shortCode: string + clickTime: Date + userIp: string + userAgent: string + referer?: string + country?: string + province?: string + city?: string +} + +export interface ShortLinkClickLogPageReqVO extends PageParam { + shortCode?: string + userIp?: string + clickTime?: Date[] +} + +// 查询短链列表 +export const getShortLinkPage = async (params: ShortLinkPageReqVO) => { + return await request.get({ url: `/system/short-link/page`, params }) +} + +// 查询短链详情 +export const getShortLink = async (id: number) => { + return await request.get({ url: `/system/short-link/get?id=` + id }) +} + +// 新增短链 +export const createShortLink = async (data: ShortLinkVO) => { + return await request.post({ url: `/system/short-link/create`, data }) +} + +// 修改短链 +export const updateShortLink = async (data: ShortLinkVO) => { + return await request.put({ url: `/system/short-link/update`, data }) +} + +// 删除短链 +export const deleteShortLink = async (id: number) => { + return await request.delete({ url: `/system/short-link/delete?id=` + id }) +} + +// 批量删除短链 +export const deleteShortLinkBatch = async (ids: number[]) => { + return await request.delete({ url: `/system/short-link/delete-batch`, data: ids }) +} + +// 更新短链状态 +export const updateShortLinkStatus = async (id: number, status: boolean) => { + const v = status ? 1 : 0 + return await request.put({ url: `/system/short-link/update-status?id=` + id + `&status=` + v }) +} + +// 导出短链 Excel +export const exportShortLink = async (params: ShortLinkPageReqVO) => { + return await request.download({ url: `/system/short-link/export-excel`, params }) +} + +// 批量生成短链 +export const batchCreateShortLink = async (urls: string[]) => { + return await request.post({ url: `/system/short-link/batch-create`, data: { urls } }) +} + +// 获取短链访问日志分页 +export const getShortLinkAccessLogPage = async (params: ShortLinkClickLogPageReqVO) => { + return await request.get({ url: `/system/short-link/access-log/page`, params }) +} + +// 获取短链主域名 +export const getShortLinkDomain = async () => { + return await request.get({ url: `/system/short-link/domain` }) +} + +// 修改短链主域名 +export const updateShortLinkDomain = async (newDomain: string) => { + return await request.put({ url: `/system/short-link/domain`, params: { newDomain } }) +} + +// 获取短链概览统计 +export const getShortLinkOverviewStats = async (params: { startTime?: string; endTime?: string }) => { + return await request.get({ url: `/system/short-link/statistics/overview`, params }) +} + +// 获取短链趋势统计 +export const getShortLinkTrendStats = async (days: number) => { + return await request.get({ url: `/system/short-link/statistics/trend`, params: { days } }) +} + +// 获取短链状态分布统计 +export const getShortLinkStatusStats = async () => { + return await request.get({ url: `/system/short-link/statistics/status` }) +} + +// 获取短链地域访问统计 +export const getShortLinkRegionStats = async (params: { startTime?: string; endTime?: string }) => { + return await request.get({ url: `/system/short-link/statistics/region`, params }) +} + +// 获取短链设备类型统计 +export const getShortLinkDeviceStats = async (params: { startTime?: string; endTime?: string }) => { + return await request.get({ url: `/system/short-link/statistics/device`, params }) +} + +// 获取短链访问时段统计 +export const getShortLinkHourStats = async (date?: string) => { + return await request.get({ url: `/system/short-link/statistics/hour`, params: { date } }) +} diff --git a/src/api/system/social/client/index.ts b/src/api/system/social/client/index.ts index bf13ab49f30518d39553c2256703f4fff8f5451c..32398229612704e4c1d2a2d322098481bbd3c135 100644 --- a/src/api/system/social/client/index.ts +++ b/src/api/system/social/client/index.ts @@ -8,6 +8,7 @@ export interface SocialClientVO { clientId: string clientSecret: string agentId: string + publicKey: string status: number } diff --git a/src/components/bpmnProcessDesigner/package/designer/plugins/palette/CustomPalette.js b/src/components/bpmnProcessDesigner/package/designer/plugins/palette/CustomPalette.js index 126838717a3cd46a2cbdaafbb9bf2f38fd6d8a43..788e4d163f9204814f2e8c4713e4fd4e4aba4f8c 100644 --- a/src/components/bpmnProcessDesigner/package/designer/plugins/palette/CustomPalette.js +++ b/src/components/bpmnProcessDesigner/package/designer/plugins/palette/CustomPalette.js @@ -89,7 +89,6 @@ F.prototype.getPaletteEntries = function () { create.start(event, elementFactory.createParticipantShape()) } - assign(actions, { 'hand-tool': { group: 'tools', diff --git a/src/components/bpmnProcessDesigner/package/designer/plugins/palette/paletteProvider.js b/src/components/bpmnProcessDesigner/package/designer/plugins/palette/paletteProvider.js index 8a5858887435ac235f6a7ecb56917c9d526104da..304875cedf18f65dda714f56a3e368df78e239bc 100644 --- a/src/components/bpmnProcessDesigner/package/designer/plugins/palette/paletteProvider.js +++ b/src/components/bpmnProcessDesigner/package/designer/plugins/palette/paletteProvider.js @@ -96,7 +96,6 @@ PaletteProvider.prototype.getPaletteEntries = function () { create.start(event, elementFactory.createParticipantShape()) } - assign(actions, { 'hand-tool': { group: 'tools', diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index 794778cad18ed8850aa9694b585eac503305138f..775c873b02de8b679d2a1ff8b9d77b47b26db51e 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -50,6 +50,29 @@ const remainingRouter: AppRouteRecordRaw[] = [ noTagsView: true } }, + { + path: '/system', + component: Layout, + name: 'SystemHidden', + meta: { + hidden: true + }, + children: [ + { + path: 'shortlink/statistics', + component: () => import('@/views/system/shortlink/statistics.vue'), + name: 'SystemShortLinkStatistics', + meta: { + noCache: true, + hidden: true, + canTo: true, + icon: 'ep:data-analysis', + title: '短链统计', + activeMenu: '/system/shortlink' + } + } + ] + }, { path: '/', component: Layout, diff --git a/src/views/bpm/processInstance/detail/PrintDialog.vue b/src/views/bpm/processInstance/detail/PrintDialog.vue index ab17f8c0ffef2a5141538f2d62faef84876aabba..fb8cd8bcb33e9eeddbffd71a6b9a4d2a48398543 100644 --- a/src/views/bpm/processInstance/detail/PrintDialog.vue +++ b/src/views/bpm/processInstance/detail/PrintDialog.vue @@ -30,7 +30,11 @@ const open = async (id: string) => { defineExpose({ open }) const parseFormFields = () => { - const formFieldsObj = decodeFields(printData.value.processInstance.processDefinition.formFields) + if (!printData.value) return + + const formFieldsObj = decodeFields( + printData.value.processInstance.processDefinition?.formFields || [] + ) const processVariables = printData.value.processInstance.formVariables let res: any = [] for (const item of formFieldsObj) { diff --git a/src/views/infra/fileConfig/FileConfigForm.vue b/src/views/infra/fileConfig/FileConfigForm.vue index 1b774ca65549ebf0f0026515897fef246b0e858b..34691d924a6e345e878e81357ccf8bcff04b463f 100644 --- a/src/views/infra/fileConfig/FileConfigForm.vue +++ b/src/views/infra/fileConfig/FileConfigForm.vue @@ -103,6 +103,10 @@ 私有 + + + + diff --git a/src/views/system/shortlink/AccessLogDialog.vue b/src/views/system/shortlink/AccessLogDialog.vue new file mode 100644 index 0000000000000000000000000000000000000000..91fdd2798e0bc2e9be6e41bf1a2819d2423a5ba8 --- /dev/null +++ b/src/views/system/shortlink/AccessLogDialog.vue @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + 搜索 + + + + 重置 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/system/shortlink/BatchCreateDialog.vue b/src/views/system/shortlink/BatchCreateDialog.vue new file mode 100644 index 0000000000000000000000000000000000000000..a156034fd535615302248a048a6e840349fc4871 --- /dev/null +++ b/src/views/system/shortlink/BatchCreateDialog.vue @@ -0,0 +1,231 @@ + + + + + + + 每行输入一个URL,最多支持100个链接 + + + + 解析链接 + + 共解析到 {{ parsedUrls.length }} 个有效链接 + + + + + + + 解析结果预览 + + + + + + 有效 + 无效 + + + + + + + + + 生成结果 + + + + + + + {{ scope.row.shortUrl }} + + 生成失败 + + + + + 成功 + 失败 + + + + + + + + 导出结果 + + + + + + + 生成短链 + + 取 消 + + + + + \ No newline at end of file diff --git a/src/views/system/shortlink/DomainDialog.vue b/src/views/system/shortlink/DomainDialog.vue new file mode 100644 index 0000000000000000000000000000000000000000..53b967b2f66f8ea4f183f3480a39c6fe76fc21bd --- /dev/null +++ b/src/views/system/shortlink/DomainDialog.vue @@ -0,0 +1,51 @@ + + + + + + + + + 取消 + 确定 + + + + + diff --git a/src/views/system/shortlink/ShortLinkForm.vue b/src/views/system/shortlink/ShortLinkForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..73476f647a84e560622c980ec29657b7c5f79a60 --- /dev/null +++ b/src/views/system/shortlink/ShortLinkForm.vue @@ -0,0 +1,195 @@ + + + + + + + + + + 短码只能包含字母、数字、下划线和连字符,长度3-20位 + + + + + + + + + + + + + + + + + + + + 确 定 + 取 消 + + + + + diff --git a/src/views/system/shortlink/StatisticsDialog.vue b/src/views/system/shortlink/StatisticsDialog.vue new file mode 100644 index 0000000000000000000000000000000000000000..4341ba3313ec1a0d1329f642d81ce7a2c02e92b8 --- /dev/null +++ b/src/views/system/shortlink/StatisticsDialog.vue @@ -0,0 +1,403 @@ + + + + + + + + + {{ statistics.clickCount || 0 }} + 总点击量 + + + + + + + {{ statistics.todayClickCount || 0 }} + 今日点击 + + + + + + + {{ statistics.weekClickCount || 0 }} + 本周点击 + + + + + + + {{ statistics.monthClickCount || 0 }} + 本月点击 + + + + + + + + + + + + 点击趋势 + + + + + + + + + + + + + + 地域分布 + + + + + + + + + + + 设备统计 + + + + + + + + 最近访问记录 + + + + + {{ formatDate(scope.row.clickTime) }} + + + + + + {{ scope.row.province }}{{ scope.row.city }} + + + + + + + + + + + + + 访问日志 + + 导出日志 + + + + + + + {{ formatDate(scope.row.clickTime) }} + + + + + + {{ scope.row.country }} {{ scope.row.province }} {{ scope.row.city }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/system/shortlink/index.vue b/src/views/system/shortlink/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..29c6e123589db69f5334af5b07b91cc7a7764dfd --- /dev/null +++ b/src/views/system/shortlink/index.vue @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + 新增 + + + 导出 + + + 批量生成 + + + 统计 + + + 修改主域名 + + + + + + + + + + + + + + {{ scope.row.shortCode }} + + + + + + + {{ scope.row.domain + '/' + scope.row.shortCode }} + + + + + + + {{ scope.row.originalUrl }} + + + + + + + + {{ scope.row.clickCount || 0 }} + + + + + {{ scope.row.status ? '开启' : '关闭' }} + + + + + {{ formatDate(scope.row.expireTime) }} + 永久有效 + + + + + + + 编辑 + + + 访问日志 + + + 删除 + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/system/shortlink/statistics.vue b/src/views/system/shortlink/statistics.vue new file mode 100644 index 0000000000000000000000000000000000000000..2a50ac4c92e6ecb1682daef8a3bf09a3ab64e8e6 --- /dev/null +++ b/src/views/system/shortlink/statistics.vue @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + { loadRegion(); loadDevice(); }" + /> + + + + + + 刷新全部 + + + + + + + + + 总短链数 + {{ overview.totalLinks || 0 }} + + + + + 总点击量 + {{ overview.totalClicks || 0 }} + + + + + 活跃短链 + {{ overview.activeLinks || 0 }} + + + + + 平均点击率 + {{ (overview.avgClickRate || 0).toFixed(2) }}% + + + + + 区间新增 + {{ overview.todayNewLinks || 0 }} + + + + + 区间点击 + {{ overview.todayClicks || 0 }} + + + + + + + + + + + 短链趋势 + + + + + + + + 状态分布 + + + + + + + + 地域访问 Top10 + + + + + + + + 设备类型分布 + + + + + + + + 访问时段 + + + + + + + + + + + + diff --git a/src/views/system/social/client/SocialClientForm.vue b/src/views/system/social/client/SocialClientForm.vue index cbfe195b509d0767da958b377c81a1d36b9b4631..dd83bb4183d5bed0b198172cd567183afc9cb11b 100644 --- a/src/views/system/social/client/SocialClientForm.vue +++ b/src/views/system/social/client/SocialClientForm.vue @@ -44,6 +44,9 @@ + + + { userType: undefined, clientId: undefined, clientSecret: undefined, + publicKey: undefined, agentId: undefined, status: 0 }