diff --git a/apps/vue/src/locales/lang/en/routes/basic.ts b/apps/vue/src/locales/lang/en/routes/basic.ts
index b6faa00ef..693e2394c 100644
--- a/apps/vue/src/locales/lang/en/routes/basic.ts
+++ b/apps/vue/src/locales/lang/en/routes/basic.ts
@@ -1,4 +1,6 @@
export default {
login: 'Login',
errorLogList: 'Error Log',
+ accountSetting: 'Account Setting',
+ accountCenter: 'Account Center'
};
diff --git a/apps/vue/src/locales/lang/zh-CN/routes/basic.ts b/apps/vue/src/locales/lang/zh-CN/routes/basic.ts
index 3d03e8ef1..85357ee33 100644
--- a/apps/vue/src/locales/lang/zh-CN/routes/basic.ts
+++ b/apps/vue/src/locales/lang/zh-CN/routes/basic.ts
@@ -1,4 +1,6 @@
export default {
login: '登录',
errorLogList: '错误日志列表',
+ accountSetting: '个人设置',
+ accountCenter: '个人中心'
};
diff --git a/apps/vue/src/router/routes/basic.ts b/apps/vue/src/router/routes/basic.ts
index 58db49448..01ad0504c 100644
--- a/apps/vue/src/router/routes/basic.ts
+++ b/apps/vue/src/router/routes/basic.ts
@@ -76,3 +76,38 @@ export const ERROR_LOG_ROUTE: AppRouteRecordRaw = {
},
],
};
+
+export const ACCOUNT_CENTER_ROUTE: AppRouteRecordRaw = {
+ path: '/account',
+ name: 'Account',
+ component: LAYOUT,
+ redirect: '/account/center',
+ meta: {
+ title: 'Account',
+ hideMenu: true,
+ ignoreAuth: true,
+ },
+ children: [
+ {
+ path: 'settings',
+ name: 'ASettings',
+ component: () => import('/@/views/account/setting/index.vue'),
+ meta: {
+ title: t('routes.basic.accountSetting'),
+ hideMenu: true,
+ ignoreAuth: true,
+ },
+ },
+ {
+ path: 'center',
+ name: 'ACenter',
+ component: () => import('/@/views/account/center/index.vue'),
+ meta: {
+ title: t('routes.basic.accountCenter'),
+ hideMenu: true,
+ ignoreAuth: true,
+ },
+ },
+ ],
+};
+
diff --git a/apps/vue/src/router/routes/index.ts b/apps/vue/src/router/routes/index.ts
index 149ec42a0..a50217d46 100644
--- a/apps/vue/src/router/routes/index.ts
+++ b/apps/vue/src/router/routes/index.ts
@@ -1,6 +1,6 @@
import type { AppRouteRecordRaw, AppRouteModule } from '/@/router/types';
-import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '/@/router/routes/basic';
+import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE, ACCOUNT_CENTER_ROUTE } from '/@/router/routes/basic';
import { mainOutRoutes } from './mainOut';
import { PageEnum } from '/@/enums/pageEnum';
@@ -40,6 +40,7 @@ export const LoginRoute: AppRouteRecordRaw = {
export const basicRoutes = [
LoginRoute,
RootRoute,
+ ACCOUNT_CENTER_ROUTE,
...mainOutRoutes,
REDIRECT_ROUTE,
PAGE_NOT_FOUND_ROUTE,
diff --git a/apps/vue/src/views/platform/dataDic/components/DataItemTable.vue b/apps/vue/src/views/platform/dataDic/components/DataItemTable.vue
index 80697d4c4..0408e7c8f 100644
--- a/apps/vue/src/views/platform/dataDic/components/DataItemTable.vue
+++ b/apps/vue/src/views/platform/dataDic/components/DataItemTable.vue
@@ -104,7 +104,7 @@
});
},
handleAppendItem() {
- this.openModal(true, {} as DataItem, true);
+ this.openModal(true, {}, true);
},
handleEdit(record: Recordable) {
// 克隆对象过去,解决清除表单值后再次编辑为空值
diff --git a/apps/vue/src/views/platform/dataDic/components/DataTree.vue b/apps/vue/src/views/platform/dataDic/components/DataTree.vue
index 3af16b25b..f8dece6d0 100644
--- a/apps/vue/src/views/platform/dataDic/components/DataTree.vue
+++ b/apps/vue/src/views/platform/dataDic/components/DataTree.vue
@@ -23,7 +23,7 @@
diff --git a/apps/vue/src/views/platform/menu/hooks/useMenuFormContext.ts b/apps/vue/src/views/platform/menu/hooks/useMenuFormContext.ts
index 22fa4d1c4..b2474f50f 100644
--- a/apps/vue/src/views/platform/menu/hooks/useMenuFormContext.ts
+++ b/apps/vue/src/views/platform/menu/hooks/useMenuFormContext.ts
@@ -23,7 +23,8 @@ export function useMenuFormContext({ menuModel, formElRef }: UseMenuFormContext)
const { L } = useLocalization('AppPlatform');
function getMetaFormSchemas(meta: DataItem[]): TabFormSchema[] {
- return meta.map((item) => {
+ return meta.sort((pre, next) => pre.name.localeCompare(next.name))
+ .map((item) => {
const schema: TabFormSchema = {
tab: L('DisplayName:Meta'),
field: 'meta.'.concat(item.name),
@@ -31,6 +32,11 @@ export function useMenuFormContext({ menuModel, formElRef }: UseMenuFormContext)
colProps: { span: 24 },
required: !item.allowBeNull,
component: 'Input',
+ componentProps: {
+ style: {
+ width: '100%',
+ },
+ }
};
switch (item.valueType) {
case ValueType.Boolean:
@@ -46,7 +52,7 @@ export function useMenuFormContext({ menuModel, formElRef }: UseMenuFormContext)
onChange: (e: ChangeEvent) => {
model[field] = e.target.checked.toString();
},
- });
+ }, () => item.displayName);
};
break;
case ValueType.Date:
diff --git a/apps/vue/src/views/task-management/background-jobs/components/BackgroundJobInfoDetail.vue b/apps/vue/src/views/task-management/background-jobs/components/BackgroundJobInfoDetail.vue
new file mode 100644
index 000000000..018a7cdb7
--- /dev/null
+++ b/apps/vue/src/views/task-management/background-jobs/components/BackgroundJobInfoDetail.vue
@@ -0,0 +1,120 @@
+
+
+
+
+ 作业详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.runTime }}
+
+
+ {{ item.exception ?? item.message }}
+
+
+
+
+
+
+
+
+
diff --git a/apps/vue/src/views/task-management/background-jobs/components/BackgroundJobInfoTable.vue b/apps/vue/src/views/task-management/background-jobs/components/BackgroundJobInfoTable.vue
index c9467fc15..bb54fdc5c 100644
--- a/apps/vue/src/views/task-management/background-jobs/components/BackgroundJobInfoTable.vue
+++ b/apps/vue/src/views/task-management/background-jobs/components/BackgroundJobInfoTable.vue
@@ -26,6 +26,9 @@
+
+ {{ record.name }}
+
{{ JobStatusMap[record.status] }}
@@ -88,6 +91,7 @@
import { Switch, Modal, Tag, Tooltip, message } from 'ant-design-vue';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { usePermission } from '/@/hooks/web/usePermission';
+ import { useGo } from '/@/hooks/web/usePage';
import { useModal } from '/@/components/Modal';
import { BasicTable, TableAction, useTable } from '/@/components/Table';
import { formatPagedRequest } from '/@/utils/http/abp/helper';
@@ -98,6 +102,7 @@
import { JobStatusMap, JobStatusColor, JobTypeMap, JobPriorityMap, JobPriorityColor } from '../datas/typing';
import BackgroundJobInfoModal from './BackgroundJobInfoModal.vue';
+ const go = useGo();
const { L } = useLocalization('TaskManagement');
const { hasPermission } = usePermission();
const [registerModal, { openModal }] = useModal();
@@ -149,6 +154,10 @@
openModal(true, record);
}
+ function handleDetail(record) {
+ go(`/task-management/background-jobs/${record.id}`);
+ }
+
function handlePause(record) {
pause(record.id).then(() => {
message.success(L('Successful'));
diff --git a/apps/vue/src/views/task-management/background-jobs/datas/DescriptionData.ts b/apps/vue/src/views/task-management/background-jobs/datas/DescriptionData.ts
new file mode 100644
index 000000000..213a35180
--- /dev/null
+++ b/apps/vue/src/views/task-management/background-jobs/datas/DescriptionData.ts
@@ -0,0 +1,88 @@
+import { DescItem } from "/@/components/Description";
+import { useLocalization } from '/@/hooks/abp/useLocalization';
+
+const { L } = useLocalization('TaskManagement');
+
+export function getDescriptionSchemas() : DescItem[] {
+ return [
+ {
+ label: L('DisplayName:Group'),
+ field: 'group',
+ },
+ {
+ label: L('DisplayName:Name'),
+ field: 'name',
+ },
+ {
+ label: L('DisplayName:Type'),
+ field: 'type',
+ },
+ {
+ label: L('DisplayName:CreationTime'),
+ field: 'creationTime',
+ },
+ {
+ label: L('DisplayName:BeginTime'),
+ field: 'beginTime',
+ },
+ {
+ label: L('DisplayName:EndTime'),
+ field: 'endTime',
+ },
+ {
+ label: L('DisplayName:LockTimeOut'),
+ field: 'lockTimeOut',
+ span: 1,
+ },
+ {
+ label: L('DisplayName:Description'),
+ field: 'description',
+ span: 2,
+ },
+ {
+ label: L('DisplayName:LastRunTime'),
+ field: 'lastRunTime',
+ span: 1.5,
+ },
+ {
+ label: L('DisplayName:NextRunTime'),
+ field: 'nextRunTime',
+ span: 1.5,
+ },
+ {
+ label: L('DisplayName:Status'),
+ field: 'status',
+ span: 1,
+ },
+ {
+ label: L('DisplayName:JobType'),
+ field: 'jobType',
+ span: 1,
+ },
+ {
+ label: L('DisplayName:Priority'),
+ field: 'priority',
+ span: 1,
+ },
+ {
+ label: L('DisplayName:TriggerCount'),
+ field: 'triggerCount',
+ span: 0.75,
+ },
+ {
+ label: L('DisplayName:MaxCount'),
+ field: 'maxCount',
+ span: 0.75,
+ },
+ {
+ label: L('DisplayName:TryCount'),
+ field: 'tryCount',
+ span: 0.75,
+ },
+ {
+ label: L('DisplayName:MaxTryCount'),
+ field: 'maxTryCount',
+ span: 0.75,
+ },
+ ];
+}
diff --git a/apps/vue/src/views/task-management/background-jobs/datas/TableData.ts b/apps/vue/src/views/task-management/background-jobs/datas/TableData.ts
index 102739e2e..ca73a67cd 100644
--- a/apps/vue/src/views/task-management/background-jobs/datas/TableData.ts
+++ b/apps/vue/src/views/task-management/background-jobs/datas/TableData.ts
@@ -27,6 +27,9 @@ export function getDataColumns(): BasicColumn[] {
width: 300,
sorter: true,
fixed: 'left',
+ slots: {
+ customRender: 'name',
+ }
},
{
title: L('DisplayName:Description'),
@@ -125,3 +128,56 @@ export function getDataColumns(): BasicColumn[] {
},
];
}
+
+export function getLogDataColumns(): BasicColumn[] {
+ return [
+ {
+ title: 'id',
+ dataIndex: 'id',
+ width: 1,
+ ifShow: false,
+ },
+ {
+ title: L('DisplayName:Group'),
+ dataIndex: 'jobGroup',
+ align: 'left',
+ width: 150,
+ sorter: true,
+ },
+ {
+ title: L('DisplayName:Name'),
+ dataIndex: 'jobName',
+ align: 'left',
+ width: 150,
+ sorter: true,
+ },
+ {
+ title: L('DisplayName:Type'),
+ dataIndex: 'jobType',
+ align: 'left',
+ width: 150,
+ sorter: true,
+ },
+ {
+ title: L('DisplayName:LastRunTime'),
+ dataIndex: 'runTime',
+ align: 'left',
+ width: 150,
+ sorter: true,
+ },
+ {
+ title: L('DisplayName:Result'),
+ dataIndex: 'message',
+ align: 'left',
+ width: 150,
+ sorter: true,
+ },
+ {
+ title: L('DisplayName:Exception'),
+ dataIndex: 'exception',
+ align: 'left',
+ width: 150,
+ sorter: true,
+ },
+ ];
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json
index 632e177b2..cca6d1218 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json
@@ -67,6 +67,8 @@
"DisplayName:AboveNormal": "Above Normal",
"DisplayName:High": "High",
"BackgroundJobs": "Jobs",
+ "BackgroundJobDetail": "Job Detail",
+ "BackgroundJobLogs": "Job Logs",
"BackgroundJobs:AddNew": "New Job",
"BackgroundJobs:Edit": "Edit Job",
"BackgroundJobs:AddNewArg": "New Args",
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json
index 63d921064..6d271d47a 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json
@@ -67,6 +67,8 @@
"DisplayName:AboveNormal": "高于正常",
"DisplayName:High": "高",
"BackgroundJobs": "作业列表",
+ "BackgroundJobDetail": "作业详情",
+ "BackgroundJobLogs": "作业日志",
"BackgroundJobs:AddNew": "新建作业",
"BackgroundJobs:Edit": "编辑作业",
"BackgroundJobs:AddNewArg": "添加参数",
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobLogRepository.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobLogRepository.cs
index 63339b51e..28a56a39a 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobLogRepository.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobLogRepository.cs
@@ -56,7 +56,7 @@ public class EfCoreBackgroundJobLogRepository :
.WhereIf(filter.HasExceptions.HasValue, x => !string.IsNullOrWhiteSpace(x.Exception))
.WhereIf(filter.BeginRunTime.HasValue, x => x.RunTime.CompareTo(filter.BeginRunTime.Value) >= 0)
.WhereIf(filter.EndRunTime.HasValue, x => x.RunTime.CompareTo(filter.EndRunTime.Value) <= 0)
- .OrderBy(sorting ?? nameof(BackgroundJobInfo.Name))
+ .OrderBy(sorting ?? $"{nameof(BackgroundJobLog.RunTime)} DESC")
.PageBy(skipCount, maxResultCount)
.ToListAsync(GetCancellationToken(cancellationToken));
}