chore: header menu 初步

pull/229/head
xiaojunnuo 2024-10-25 23:56:24 +08:00
parent c4164c66e2
commit a7414047ee
9 changed files with 221 additions and 5 deletions

View File

@ -102,3 +102,20 @@ export class SysSiteEnv {
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[];
}

View File

@ -32,6 +32,16 @@ export type SysPublicSetting = {
export type SysInstallInfo = {
siteId: string;
};
export type MenuItem = {
id: string;
title: string;
icon?: string;
path?: string;
children?: MenuItem[];
};
export type HeaderMenus = {
menus: MenuItem[];
};
export type AllSettings = {
sysPublic: SysPublicSetting;
@ -39,6 +49,7 @@ export type AllSettings = {
plusInfo: PlusInfo;
siteInfo: SiteInfo;
siteEnv: SiteEnv;
headerMenus: HeaderMenus;
};
export async function loadAllSettings(): Promise<AllSettings> {

View File

@ -47,7 +47,7 @@ export const sysResources = [
title: "邮箱设置",
name: "EmailSetting",
path: "/sys/settings/email",
component: "/sys/settings/email-setting.vue",
component: "/sys/settings/email/index.vue",
meta: {
permission: "sys:settings:view",
icon: "ion:mail-outline",
@ -68,6 +68,20 @@ export const sysResources = [
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: "系统级授权",
name: "SysAccess",

View File

@ -5,7 +5,7 @@ import _ from "lodash-es";
import { LocalStorage } from "/src/utils/util.storage";
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 { mitter } from "/@/utils/util.mitt";
import { env } from "/@/utils/util.env";
@ -36,6 +36,7 @@ export interface SettingState {
siteInfo: SiteInfo;
plusInfo?: PlusInfo;
siteEnv?: SiteEnv;
headerMenus?: HeaderMenus;
inited?: boolean;
}
@ -85,6 +86,9 @@ export const useSettingStore = defineStore({
contactLink: ""
}
},
headerMenus: {
menus: []
},
inited: false
}),
getters: {

View File

@ -78,8 +78,8 @@
<script setup lang="ts">
import { reactive } from "vue";
import * as api from "./api";
import { SettingKeys } from "./api";
import * as api from "../api";
import { SettingKeys } from "../api";
import * as emailApi from "./api.email";
import { notification } from "ant-design-vue";
import { useSettingStore } from "/src/store/modules/settings";

View File

@ -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
}
}
}
}
};
}

View File

@ -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>

View File

@ -1,5 +1,5 @@
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';
/**
@ -30,6 +30,10 @@ export class BasicSettingsController extends BaseController {
return await this.sysSettingsService.getSetting(SysSiteInfo);
}
public async getHeaderMenus() {
return await this.sysSettingsService.getSetting(SysHeaderMenus);
}
public async getSiteEnv() {
const env: SysSiteEnv = {
agent: this.agentConfig,
@ -48,12 +52,14 @@ export class BasicSettingsController extends BaseController {
const siteInfo = await this.getSiteInfo();
const siteEnv = await this.getSiteEnv();
const plusInfo = await this.plusInfo();
const headerMenus = await this.getHeaderMenus();
return this.ok({
sysPublic,
installInfo,
siteInfo,
siteEnv,
plusInfo,
headerMenus,
});
}
}