mirror of https://github.com/certd/certd
chore: header menu 初步
parent
c4164c66e2
commit
a7414047ee
|
@ -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[];
|
||||
}
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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";
|
|
@ -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 { 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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue