diff --git a/ui/.env b/ui/.env
new file mode 100644
index 0000000..d1ff296
--- /dev/null
+++ b/ui/.env
@@ -0,0 +1,11 @@
+# port
+VITE_PORT = 8001
+
+# spa-title
+VITE_GLOB_APP_TITLE = GoFrame+NaiveUI版
+
+# spa shortname
+VITE_GLOB_APP_SHORT_NAME = EasyGoAdmin
+
+# 生产环境 开启mock
+VITE_GLOB_PROD_MOCK = true
diff --git a/ui/components.d.ts b/ui/components.d.ts
new file mode 100644
index 0000000..eaa6983
--- /dev/null
+++ b/ui/components.d.ts
@@ -0,0 +1,119 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+export {}
+
+declare module 'vue' {
+ export interface GlobalComponents {
+ Application: typeof import('./src/components/Application/Application.vue')['default']
+ AppSearch: typeof import('./src/components/Application/search/AppSearch.vue')['default']
+ Authority: typeof import('./src/components/Authority/src/Authority.vue')['default']
+ BasicForm: typeof import('./src/components/Form/src/BasicForm.vue')['default']
+ BasicModal: typeof import('./src/components/Modal/src/basicModal.vue')['default']
+ BasicSelect: typeof import('./src/components/Select/src/BasicSelect.vue')['default']
+ BasicUpload: typeof import('./src/components/Upload/src/BasicUpload.vue')['default']
+ ChinaArea: typeof import('./src/components/ChinaArea/index.vue')['default']
+ ColumnSetting: typeof import('./src/components/Table/src/components/settings/ColumnSetting.vue')['default']
+ CountTo: typeof import('./src/components/CountTo/CountTo.vue')['default']
+ Cropper: typeof import('./src/components/Cropper/src/Cropper.vue')['default']
+ CropperImage: typeof import('./src/components/Cropper/src/CropperImage.vue')['default']
+ CropperModal: typeof import('./src/components/Cropper/src/CropperModal.vue')['default']
+ EditableCell: typeof import('./src/components/Table/src/components/editable/EditableCell.vue')['default']
+ File: typeof import('./src/components/Upload/file.vue')['default']
+ Image: typeof import('./src/components/Upload/Image.vue')['default']
+ ImagePreview: typeof import('./src/components/Upload/src/ImagePreview.vue')['default']
+ Images: typeof import('./src/components/Upload/Images.vue')['default']
+ ImageUpload: typeof import('./src/components/Upload/src/ImageUpload.vue')['default']
+ ImportExcel: typeof import('./src/components/Excel/src/ImportExcel.vue')['default']
+ ImportFile: typeof import('./src/components/importFile/index.vue')['default']
+ Intensity: typeof import('./src/components/Password/src/components/Intensity.vue')['default']
+ Loading: typeof import('./src/components/Loading/src/Loading.vue')['default']
+ Lockscreen: typeof import('./src/components/Lockscreen/Lockscreen.vue')['default']
+ NAlert: typeof import('naive-ui')['NAlert']
+ NAutoComplete: typeof import('naive-ui')['NAutoComplete']
+ NAvatar: typeof import('naive-ui')['NAvatar']
+ NBackTop: typeof import('naive-ui')['NBackTop']
+ NBadge: typeof import('naive-ui')['NBadge']
+ NBreadcrumb: typeof import('naive-ui')['NBreadcrumb']
+ NBreadcrumbItem: typeof import('naive-ui')['NBreadcrumbItem']
+ NButton: typeof import('naive-ui')['NButton']
+ NCard: typeof import('naive-ui')['NCard']
+ NCascader: typeof import('naive-ui')['NCascader']
+ NCheckbox: typeof import('naive-ui')['NCheckbox']
+ NCheckboxGroup: typeof import('naive-ui')['NCheckboxGroup']
+ NCode: typeof import('naive-ui')['NCode']
+ NCol: typeof import('naive-ui')['NCol']
+ NConfigProvider: typeof import('naive-ui')['NConfigProvider']
+ NDataTable: typeof import('naive-ui')['NDataTable']
+ NDatePicker: typeof import('naive-ui')['NDatePicker']
+ NDescriptions: typeof import('naive-ui')['NDescriptions']
+ NDescriptionsItem: typeof import('naive-ui')['NDescriptionsItem']
+ NDivider: typeof import('naive-ui')['NDivider']
+ NDrawer: typeof import('naive-ui')['NDrawer']
+ NDrawerContent: typeof import('naive-ui')['NDrawerContent']
+ NDropdown: typeof import('naive-ui')['NDropdown']
+ NEl: typeof import('naive-ui')['NEl']
+ NEllipsis: typeof import('naive-ui')['NEllipsis']
+ NEmpty: typeof import('naive-ui')['NEmpty']
+ NForm: typeof import('naive-ui')['NForm']
+ NFormItem: typeof import('naive-ui')['NFormItem']
+ NGi: typeof import('naive-ui')['NGi']
+ NGrid: typeof import('naive-ui')['NGrid']
+ NGridItem: typeof import('naive-ui')['NGridItem']
+ NIcon: typeof import('naive-ui')['NIcon']
+ NImage: typeof import('naive-ui')['NImage']
+ NInput: typeof import('naive-ui')['NInput']
+ NInputNumber: typeof import('naive-ui')['NInputNumber']
+ NLayout: typeof import('naive-ui')['NLayout']
+ NLayoutHeader: typeof import('naive-ui')['NLayoutHeader']
+ NLayoutSider: typeof import('naive-ui')['NLayoutSider']
+ NList: typeof import('naive-ui')['NList']
+ NListItem: typeof import('naive-ui')['NListItem']
+ NMenu: typeof import('naive-ui')['NMenu']
+ NModal: typeof import('naive-ui')['NModal']
+ NPagination: typeof import('naive-ui')['NPagination']
+ NPopconfirm: typeof import('naive-ui')['NPopconfirm']
+ NPopover: typeof import('naive-ui')['NPopover']
+ NProgress: typeof import('naive-ui')['NProgress']
+ NRadio: typeof import('naive-ui')['NRadio']
+ NRadioGroup: typeof import('naive-ui')['NRadioGroup']
+ NRow: typeof import('naive-ui')['NRow']
+ NScrollbar: typeof import('naive-ui')['NScrollbar']
+ NSelect: typeof import('naive-ui')['NSelect']
+ NSkeleton: typeof import('naive-ui')['NSkeleton']
+ NSpace: typeof import('naive-ui')['NSpace']
+ NSpin: typeof import('naive-ui')['NSpin']
+ NSwitch: typeof import('naive-ui')['NSwitch']
+ NTabPane: typeof import('naive-ui')['NTabPane']
+ NTabs: typeof import('naive-ui')['NTabs']
+ NTag: typeof import('naive-ui')['NTag']
+ NThing: typeof import('naive-ui')['NThing']
+ NTimePicker: typeof import('naive-ui')['NTimePicker']
+ NTooltip: typeof import('naive-ui')['NTooltip']
+ NTree: typeof import('naive-ui')['NTree']
+ NTreeSelect: typeof import('naive-ui')['NTreeSelect']
+ NumberInput: typeof import('./src/components/numberInput/index.vue')['default']
+ NUpload: typeof import('naive-ui')['NUpload']
+ NUploadDragger: typeof import('naive-ui')['NUploadDragger']
+ NWatermark: typeof import('naive-ui')['NWatermark']
+ PageFooter: typeof import('./src/components/Page/src/PageFooter.vue')['default']
+ PageWrapper: typeof import('./src/components/Page/src/PageWrapper.vue')['default']
+ Pagination: typeof import('./src/components/pagination/index.vue')['default']
+ Password: typeof import('./src/components/Password/src/Password.vue')['default']
+ Picker: typeof import('./src/components/icon/picker.vue')['default']
+ Qrcode: typeof import('./src/components/Qrcode/src/Qrcode.vue')['default']
+ Recharge: typeof import('./src/components/Lockscreen/Recharge.vue')['default']
+ Region: typeof import('./src/components/Region/src/Region.vue')['default']
+ Render: typeof import('./src/components/Render/src/Render.vue')['default']
+ RouterLink: typeof import('vue-router')['RouterLink']
+ RouterView: typeof import('vue-router')['RouterView']
+ Table: typeof import('./src/components/Table/src/Table.vue')['default']
+ TableAction: typeof import('./src/components/Table/src/components/TableAction.vue')['default']
+ TableImg: typeof import('./src/components/TableImg/src/TableImg.vue')['default']
+ TableSelect: typeof import('./src/components/TableSelect/src/TableSelect.vue')['default']
+ Tinymce: typeof import('./src/components/Editor/tinymce.vue')['default']
+ Websocket: typeof import('./src/components/Websocket/index.vue')['default']
+ }
+}
diff --git a/ui/src/layout/components/Main/index.ts b/ui/src/layout/components/Main/index.ts
new file mode 100644
index 0000000..f63218e
--- /dev/null
+++ b/ui/src/layout/components/Main/index.ts
@@ -0,0 +1,3 @@
+import MainView from './index.vue';
+
+export { MainView };
diff --git a/ui/src/layout/components/Main/index.vue b/ui/src/layout/components/Main/index.vue
new file mode 100644
index 0000000..a95d9a0
--- /dev/null
+++ b/ui/src/layout/components/Main/index.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/monitor/job/log/columns.ts b/ui/src/views/monitor/job/log/columns.ts
new file mode 100644
index 0000000..5595da7
--- /dev/null
+++ b/ui/src/views/monitor/job/log/columns.ts
@@ -0,0 +1,85 @@
+import { h } from 'vue';
+
+export const columns = [
+ {
+ type: 'selection',
+ width: 50,
+ fixed: 'left',
+ },
+ {
+ title: 'ID',
+ key: 'id',
+ fixed: 'left',
+ width: 100,
+ },
+ {
+ title: '任务名称',
+ key: 'jobName',
+ width: 200,
+ },
+ {
+ title: '任务组名',
+ key: 'jobGroup',
+ width: 100,
+ },
+ {
+ title: '任务触发器',
+ key: 'jobTrigger',
+ width: 200,
+ },
+ {
+ title: '任务日志信息',
+ key: 'jobMessage',
+ width: 300,
+ },
+ {
+ title: '执行表达式',
+ key: 'cronExpression',
+ width: 150,
+ },
+ {
+ title: '执行状态',
+ key: 'status',
+ width: 100,
+ render(record) {
+ let typeText = '';
+ switch (record.status) {
+ case 0:
+ typeText = '未发布';
+ break;
+ case 1:
+ typeText = '运行中';
+ break;
+ case 2:
+ typeText = '暂停';
+ break;
+ case 3:
+ typeText = '删除';
+ break;
+ default:
+ break;
+ }
+ return h('span', typeText || '-');
+ },
+ },
+ {
+ title: '任务开始时间',
+ key: 'startTime',
+ width: 180,
+ },
+ {
+ title: '任务结束时间',
+ key: 'endTime',
+ width: 180,
+ },
+ {
+ title: '任务执行时间',
+ key: 'createTime',
+ width: 180,
+ },
+ {
+ title: '任务执行耗时',
+ key: 'consumeTime',
+ width: 120,
+ },
+];
diff --git a/ui/src/views/monitor/job/log/edit.vue b/ui/src/views/monitor/job/log/edit.vue
new file mode 100644
index 0000000..43311f9
--- /dev/null
+++ b/ui/src/views/monitor/job/log/edit.vue
@@ -0,0 +1,116 @@
+
+
+
+
+ {{ formData.jobName }}
+ {{ formData.jobGroup }}
+ {{ formData.jobTrigger }}
+ {{ formData.jobMessage }}
+ {{
+ formData.cronExpression
+ }}
+
+ {{
+ formData.status ? '异常' : '正常'
+ }}
+
+ {{ formData.startTime }}
+ {{ formData.endTime }}
+ {{ formData.createTime }}
+ {{ formData.consumeTime }}ms
+ {{
+ formData.exceptionInfo
+ }}
+
+
+
+ 取消
+
+
+
+
diff --git a/ui/src/views/monitor/job/log/index.vue b/ui/src/views/monitor/job/log/index.vue
new file mode 100644
index 0000000..e7bbb56
--- /dev/null
+++ b/ui/src/views/monitor/job/log/index.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/monitor/job/log/querySchemas.ts b/ui/src/views/monitor/job/log/querySchemas.ts
new file mode 100644
index 0000000..859c66c
--- /dev/null
+++ b/ui/src/views/monitor/job/log/querySchemas.ts
@@ -0,0 +1,30 @@
+import { FormSchema } from '@/components/Form/index';
+export const schemas: FormSchema[] = [
+ {
+ field: 'jobName',
+ component: 'NInput',
+ label: '任务名称',
+ componentProps: {
+ placeholder: '请输入数据源名称',
+ },
+ },
+ {
+ field: 'status',
+ component: 'NSelect',
+ label: '任务状态',
+ componentProps: {
+ placeholder: '请选择任务状态',
+ clearable: true,
+ options: [
+ {
+ label: '正常',
+ value: 0,
+ },
+ {
+ label: '失败',
+ value: 1,
+ },
+ ],
+ },
+ },
+];