mirror of https://github.com/certd/certd
chore: header menu 初步
parent
c4164c66e2
commit
a7414047ee
|
@ -102,3 +102,20 @@ export class SysSiteEnv {
|
||||||
contactLink?: string;
|
contactLink?: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type MenuItem = {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
icon: string;
|
||||||
|
link: string;
|
||||||
|
auth: boolean;
|
||||||
|
permission?: string;
|
||||||
|
children?: MenuItem[];
|
||||||
|
};
|
||||||
|
export class SysHeaderMenus extends BaseSettings {
|
||||||
|
static __title__ = '顶部菜单';
|
||||||
|
static __key__ = 'sys.header.menus';
|
||||||
|
static __access__ = 'public';
|
||||||
|
|
||||||
|
menus: MenuItem[];
|
||||||
|
}
|
||||||
|
|
|
@ -32,6 +32,16 @@ export type SysPublicSetting = {
|
||||||
export type SysInstallInfo = {
|
export type SysInstallInfo = {
|
||||||
siteId: string;
|
siteId: string;
|
||||||
};
|
};
|
||||||
|
export type MenuItem = {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
icon?: string;
|
||||||
|
path?: string;
|
||||||
|
children?: MenuItem[];
|
||||||
|
};
|
||||||
|
export type HeaderMenus = {
|
||||||
|
menus: MenuItem[];
|
||||||
|
};
|
||||||
|
|
||||||
export type AllSettings = {
|
export type AllSettings = {
|
||||||
sysPublic: SysPublicSetting;
|
sysPublic: SysPublicSetting;
|
||||||
|
@ -39,6 +49,7 @@ export type AllSettings = {
|
||||||
plusInfo: PlusInfo;
|
plusInfo: PlusInfo;
|
||||||
siteInfo: SiteInfo;
|
siteInfo: SiteInfo;
|
||||||
siteEnv: SiteEnv;
|
siteEnv: SiteEnv;
|
||||||
|
headerMenus: HeaderMenus;
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function loadAllSettings(): Promise<AllSettings> {
|
export async function loadAllSettings(): Promise<AllSettings> {
|
||||||
|
|
|
@ -47,7 +47,7 @@ export const sysResources = [
|
||||||
title: "邮箱设置",
|
title: "邮箱设置",
|
||||||
name: "EmailSetting",
|
name: "EmailSetting",
|
||||||
path: "/sys/settings/email",
|
path: "/sys/settings/email",
|
||||||
component: "/sys/settings/email-setting.vue",
|
component: "/sys/settings/email/index.vue",
|
||||||
meta: {
|
meta: {
|
||||||
permission: "sys:settings:view",
|
permission: "sys:settings:view",
|
||||||
icon: "ion:mail-outline",
|
icon: "ion:mail-outline",
|
||||||
|
@ -68,6 +68,20 @@ export const sysResources = [
|
||||||
permission: "sys:settings:view"
|
permission: "sys:settings:view"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// title: "顶部菜单设置",
|
||||||
|
// name: "HeaderMenus",
|
||||||
|
// path: "/sys/settings/header-menus",
|
||||||
|
// component: "/sys/settings/header-menus/index.vue",
|
||||||
|
// meta: {
|
||||||
|
// show: () => {
|
||||||
|
// const settingStore = useSettingStore();
|
||||||
|
// return settingStore.isComm;
|
||||||
|
// },
|
||||||
|
// icon: "ion:document-text-outline",
|
||||||
|
// permission: "sys:settings:view"
|
||||||
|
// }
|
||||||
|
// },
|
||||||
{
|
{
|
||||||
title: "系统级授权",
|
title: "系统级授权",
|
||||||
name: "SysAccess",
|
name: "SysAccess",
|
||||||
|
|
|
@ -5,7 +5,7 @@ import _ from "lodash-es";
|
||||||
import { LocalStorage } from "/src/utils/util.storage";
|
import { LocalStorage } from "/src/utils/util.storage";
|
||||||
|
|
||||||
import * as basicApi from "/@/api/modules/api.basic";
|
import * as basicApi from "/@/api/modules/api.basic";
|
||||||
import { PlusInfo, SiteEnv, SiteInfo, SysInstallInfo, SysPublicSetting } from "/@/api/modules/api.basic";
|
import { HeaderMenus, PlusInfo, SiteEnv, SiteInfo, SysInstallInfo, SysPublicSetting } from "/@/api/modules/api.basic";
|
||||||
import { useUserStore } from "/@/store/modules/user";
|
import { useUserStore } from "/@/store/modules/user";
|
||||||
import { mitter } from "/@/utils/util.mitt";
|
import { mitter } from "/@/utils/util.mitt";
|
||||||
import { env } from "/@/utils/util.env";
|
import { env } from "/@/utils/util.env";
|
||||||
|
@ -36,6 +36,7 @@ export interface SettingState {
|
||||||
siteInfo: SiteInfo;
|
siteInfo: SiteInfo;
|
||||||
plusInfo?: PlusInfo;
|
plusInfo?: PlusInfo;
|
||||||
siteEnv?: SiteEnv;
|
siteEnv?: SiteEnv;
|
||||||
|
headerMenus?: HeaderMenus;
|
||||||
inited?: boolean;
|
inited?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +86,9 @@ export const useSettingStore = defineStore({
|
||||||
contactLink: ""
|
contactLink: ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
headerMenus: {
|
||||||
|
menus: []
|
||||||
|
},
|
||||||
inited: false
|
inited: false
|
||||||
}),
|
}),
|
||||||
getters: {
|
getters: {
|
||||||
|
|
|
@ -78,8 +78,8 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { reactive } from "vue";
|
import { reactive } from "vue";
|
||||||
import * as api from "./api";
|
import * as api from "../api";
|
||||||
import { SettingKeys } from "./api";
|
import { SettingKeys } from "../api";
|
||||||
import * as emailApi from "./api.email";
|
import * as emailApi from "./api.email";
|
||||||
import { notification } from "ant-design-vue";
|
import { notification } from "ant-design-vue";
|
||||||
import { useSettingStore } from "/src/store/modules/settings";
|
import { useSettingStore } from "/src/store/modules/settings";
|
|
@ -0,0 +1,137 @@
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
import { Ref, ref } from "vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
import { compute, CreateCrudOptionsProps, CreateCrudOptionsRet } from "@fast-crud/fast-crud";
|
||||||
|
import { useSettingStore } from "/@/store/modules/settings";
|
||||||
|
import { cloneDeep } from "lodash-es";
|
||||||
|
import { nanoid } from "nanoid";
|
||||||
|
|
||||||
|
export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
|
||||||
|
const { crudBinding } = crudExpose;
|
||||||
|
const router = useRouter();
|
||||||
|
const { t } = useI18n();
|
||||||
|
const settingStore = useSettingStore();
|
||||||
|
const menusRef = ref(cloneDeep(settingStore.headerMenus?.menus || []));
|
||||||
|
|
||||||
|
const selectedRowKeys: Ref<any[]> = ref([]);
|
||||||
|
context.selectedRowKeys = selectedRowKeys;
|
||||||
|
|
||||||
|
return {
|
||||||
|
crudOptions: {
|
||||||
|
settings: {
|
||||||
|
plugins: {
|
||||||
|
//这里使用行选择插件,生成行选择crudOptions配置,最终会与crudOptions合并
|
||||||
|
rowSelection: {
|
||||||
|
enabled: true,
|
||||||
|
order: -2,
|
||||||
|
before: true,
|
||||||
|
// handle: (pluginProps,useCrudProps)=>CrudOptions,
|
||||||
|
props: {
|
||||||
|
multiple: true,
|
||||||
|
crossPage: true,
|
||||||
|
selectedRowKeys
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
actionbar: {
|
||||||
|
buttons: {
|
||||||
|
add: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
addRow: {
|
||||||
|
show: true,
|
||||||
|
click: () => {
|
||||||
|
crudBinding.value.data.push({ id: nanoid() });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
save: {
|
||||||
|
text: "保存菜单",
|
||||||
|
type: "primary",
|
||||||
|
click: async () => {
|
||||||
|
await settingStore.saveHeaderMenus({ menus: menusRef.value });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
search: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
toolbar: {
|
||||||
|
buttons: {
|
||||||
|
refresh: {
|
||||||
|
show: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mode: {
|
||||||
|
name: "local",
|
||||||
|
isMergeWhenUpdate: true,
|
||||||
|
isAppendWhenAdd: true
|
||||||
|
},
|
||||||
|
table: {
|
||||||
|
defaultExpandAllRows: true,
|
||||||
|
expandRowByClick: true,
|
||||||
|
editable: {
|
||||||
|
enabled: true,
|
||||||
|
mode: "row",
|
||||||
|
activeDefault: true,
|
||||||
|
showAction: true,
|
||||||
|
rowKey: "id"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
pagination: { show: false, pageSize: 9999999 },
|
||||||
|
rowHandle: {
|
||||||
|
width: 300,
|
||||||
|
fixed: "right",
|
||||||
|
group: {
|
||||||
|
editRow: {
|
||||||
|
addChild: {
|
||||||
|
text: "添加子菜单",
|
||||||
|
click: ({ row }) => {
|
||||||
|
if (row.children == null) {
|
||||||
|
row.children = [];
|
||||||
|
}
|
||||||
|
row.children.push({ id: nanoid() });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
columns: {
|
||||||
|
id: {
|
||||||
|
title: "ID",
|
||||||
|
key: "id",
|
||||||
|
type: "text",
|
||||||
|
column: {
|
||||||
|
width: 200
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
show: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
title: "菜单标题",
|
||||||
|
type: "text",
|
||||||
|
column: {
|
||||||
|
width: 300
|
||||||
|
}
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
title: "图标",
|
||||||
|
type: "text",
|
||||||
|
column: {
|
||||||
|
width: 300
|
||||||
|
}
|
||||||
|
},
|
||||||
|
link: {
|
||||||
|
title: "链接",
|
||||||
|
type: "text",
|
||||||
|
column: {
|
||||||
|
width: 300
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
<template>
|
||||||
|
<fs-page class="page-cert">
|
||||||
|
<template #header>
|
||||||
|
<div class="title">顶部菜单配置</div>
|
||||||
|
</template>
|
||||||
|
<fs-crud ref="crudRef" v-bind="crudBinding"> </fs-crud>
|
||||||
|
</fs-page>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { onMounted } from "vue";
|
||||||
|
import { useFs } from "@fast-crud/fast-crud";
|
||||||
|
import createCrudOptions from "./crud";
|
||||||
|
import { useSettingStore } from "/@/store/modules/settings";
|
||||||
|
import { cloneDeep } from "lodash-es";
|
||||||
|
defineOptions({
|
||||||
|
name: "SettingsHeaderMenus"
|
||||||
|
});
|
||||||
|
const { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });
|
||||||
|
|
||||||
|
const settingStore = useSettingStore();
|
||||||
|
// 页面打开后获取列表数据
|
||||||
|
onMounted(() => {
|
||||||
|
crudBinding.value.data = cloneDeep(settingStore.headerMenus.menus || []);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="less"></style>
|
|
@ -1,5 +1,5 @@
|
||||||
import { 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 { BaseController, Constants, SysHeaderMenus, SysInstallInfo, SysPublicSettings, SysSettingsService, SysSiteEnv, SysSiteInfo } from '@certd/lib-server';
|
||||||
import { AppKey, getPlusInfo } from '@certd/pipeline';
|
import { AppKey, getPlusInfo } from '@certd/pipeline';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -30,6 +30,10 @@ export class BasicSettingsController extends BaseController {
|
||||||
return await this.sysSettingsService.getSetting(SysSiteInfo);
|
return await this.sysSettingsService.getSetting(SysSiteInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getHeaderMenus() {
|
||||||
|
return await this.sysSettingsService.getSetting(SysHeaderMenus);
|
||||||
|
}
|
||||||
|
|
||||||
public async getSiteEnv() {
|
public async getSiteEnv() {
|
||||||
const env: SysSiteEnv = {
|
const env: SysSiteEnv = {
|
||||||
agent: this.agentConfig,
|
agent: this.agentConfig,
|
||||||
|
@ -48,12 +52,14 @@ export class BasicSettingsController extends BaseController {
|
||||||
const siteInfo = await this.getSiteInfo();
|
const siteInfo = await this.getSiteInfo();
|
||||||
const siteEnv = await this.getSiteEnv();
|
const siteEnv = await this.getSiteEnv();
|
||||||
const plusInfo = await this.plusInfo();
|
const plusInfo = await this.plusInfo();
|
||||||
|
const headerMenus = await this.getHeaderMenus();
|
||||||
return this.ok({
|
return this.ok({
|
||||||
sysPublic,
|
sysPublic,
|
||||||
installInfo,
|
installInfo,
|
||||||
siteInfo,
|
siteInfo,
|
||||||
siteEnv,
|
siteEnv,
|
||||||
plusInfo,
|
plusInfo,
|
||||||
|
headerMenus,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue