diff --git a/src/common/router/index.ts b/src/common/router/index.ts index a013e0f..09998c5 100644 --- a/src/common/router/index.ts +++ b/src/common/router/index.ts @@ -76,7 +76,7 @@ router.beforeEach((to, from) => { } else { return { replace: true, - name: 'role', + path: to.fullPath, } } } @@ -109,6 +109,7 @@ export function reloadRouter() { routNames.push('menus') routNames.push('user') routNames.push('role') + routNames.push('dict') if (Colls.isEmpty(routNames)) { return false diff --git a/src/components/a-icon/AIcon.tsx b/src/components/a-icon/AIcon.tsx new file mode 100644 index 0000000..68f1a27 --- /dev/null +++ b/src/components/a-icon/AIcon.tsx @@ -0,0 +1,30 @@ +import '@/components/a-icon/iconfont.css' +import { + type IconName, + icons, +} from '@/components/a-icon/iconfont.ts' + +import { + computed, + defineComponent, +} from 'vue' + +export default defineComponent( + (props, {attrs}) => { + const prefixText = icons.css_prefix_text + const fontFamily = icons.font_family + const icon = computed(() => { + return props.name == null ? [] : [ fontFamily, prefixText + props.name ] + }) + return () => (<>) + }, + { + props: { + name: { + type: String as PropType, + required: false, + validator: (_: string) => true, + }, + }, + name: 'AIcon', + }) diff --git a/src/components/a-icon/iconfont.css b/src/components/a-icon/iconfont.css new file mode 100644 index 0000000..1c67050 --- /dev/null +++ b/src/components/a-icon/iconfont.css @@ -0,0 +1,107 @@ +@font-face { + font-family: "iconfont"; /* Project id 4985351 */ + src: url('@/components/a-icon/iconfont.woff2?t=1764810386158') format('woff2'), + url('@/components/a-icon/iconfont.woff?t=1764810386158') format('woff'), + url('@/components/a-icon/iconfont.ttf?t=1764810386158') format('truetype'); +} + +.iconfont { + font-family: "iconfont", serif !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-bianji:before { + content: "\e604"; +} + +.icon-koukuanliebiao:before { + content: "\e63b"; +} + +.icon-yuechongzhi:before { + content: "\e8f5"; +} + +.icon-shanchudingdan-mian:before { + content: "\e6d7"; +} + +.icon-quxiaodingdan:before { + content: "\e64a"; +} + +.icon-lishiguiji-lan:before { + content: "\e672"; +} + +.icon-guobangdanju:before { + content: "\e66c"; +} + +.icon-dianzixiaopiao:before { + content: "\e64d"; +} + +.icon-xiangqing:before { + content: "\e611"; +} + +.icon-guanliandanju:before { + content: "\e61d"; +} + +.icon-track:before { + content: "\e603"; +} + +.icon-guanliandanxuan:before { + content: "\e68f"; +} + +.icon-dingdanxiangqing:before { + content: "\e6bf"; +} + +.icon-tongzhi:before { + content: "\e86a"; +} + +.icon-yujingguanli:before { + content: "\e61b"; +} + +.icon-shujuguanli:before { + content: "\e70c"; +} + +.icon-jiaoseguanli:before { + content: "\e62f"; +} + +.icon-yingyongyonghuguanli:before { + content: "\e6aa"; +} + +.icon-shangpinguanli:before { + content: "\fcf3"; +} + +.icon-xitongguanli:before { + content: "\e85c"; +} + +.icon-pinleiguanli:before { + content: "\e63d"; +} + +.icon-qiyezhuce:before { + content: "\e6a1"; +} + +.icon-shenheguanli:before { + content: "\e639"; +} + diff --git a/src/components/a-icon/iconfont.ts b/src/components/a-icon/iconfont.ts new file mode 100644 index 0000000..6bce07d --- /dev/null +++ b/src/components/a-icon/iconfont.ts @@ -0,0 +1,181 @@ +export const icons = { + 'id': '4985351', + 'name': '再昇云', + 'font_family': 'iconfont', + 'css_prefix_text': 'icon-', + 'description': '', + 'glyphs': [ + { + 'icon_id': '8582929', + 'name': '编辑/修改', + 'font_class': 'bianji', + 'unicode': 'e604', + 'unicode_decimal': 58884, + }, + { + 'icon_id': '41408341', + 'name': '扣款', + 'font_class': 'koukuanliebiao', + 'unicode': 'e63b', + 'unicode_decimal': 58939, + }, + { + 'icon_id': '33376724', + 'name': '余额充值', + 'font_class': 'yuechongzhi', + 'unicode': 'e8f5', + 'unicode_decimal': 59637, + }, + { + 'icon_id': '6949389', + 'name': '删除订单;报表;清单', + 'font_class': 'shanchudingdan-mian', + 'unicode': 'e6d7', + 'unicode_decimal': 59095, + }, + { + 'icon_id': '16695459', + 'name': '取消订单', + 'font_class': 'quxiaodingdan', + 'unicode': 'e64a', + 'unicode_decimal': 58954, + }, + { + 'icon_id': '14443392', + 'name': '历史轨迹-蓝', + 'font_class': 'lishiguiji-lan', + 'unicode': 'e672', + 'unicode_decimal': 58994, + }, + { + 'icon_id': '44180887', + 'name': '过磅单据', + 'font_class': 'guobangdanju', + 'unicode': 'e66c', + 'unicode_decimal': 58988, + }, + { + 'icon_id': '26397534', + 'name': '电子小票', + 'font_class': 'dianzixiaopiao', + 'unicode': 'e64d', + 'unicode_decimal': 58957, + }, + { + 'icon_id': '12814001', + 'name': '详情', + 'font_class': 'xiangqing', + 'unicode': 'e611', + 'unicode_decimal': 58897, + }, + { + 'icon_id': '9777840', + 'name': '关联单据', + 'font_class': 'guanliandanju', + 'unicode': 'e61d', + 'unicode_decimal': 58909, + }, + { + 'icon_id': '28095045', + 'name': '准运证', + 'font_class': 'track', + 'unicode': 'e603', + 'unicode_decimal': 58883, + }, + { + 'icon_id': '18446165', + 'name': '关联单选', + 'font_class': 'guanliandanxuan', + 'unicode': 'e68f', + 'unicode_decimal': 59023, + }, + { + 'icon_id': '8725687', + 'name': '订单详情', + 'font_class': 'dingdanxiangqing', + 'unicode': 'e6bf', + 'unicode_decimal': 59071, + }, + { + 'icon_id': '23500943', + 'name': '通知', + 'font_class': 'tongzhi', + 'unicode': 'e86a', + 'unicode_decimal': 59498, + }, + { + 'icon_id': '27250248', + 'name': '预警管理', + 'font_class': 'yujingguanli', + 'unicode': 'e61b', + 'unicode_decimal': 58907, + }, + { + 'icon_id': '25301786', + 'name': '字典管理', + 'font_class': 'shujuguanli', + 'unicode': 'e70c', + 'unicode_decimal': 59148, + }, + { + 'icon_id': '3590945', + 'name': '角色管理', + 'font_class': 'jiaoseguanli', + 'unicode': 'e62f', + 'unicode_decimal': 58927, + }, + { + 'icon_id': '20853364', + 'name': '用户管理', + 'font_class': 'yingyongyonghuguanli', + 'unicode': 'e6aa', + 'unicode_decimal': 59050, + }, + { + 'icon_id': '25007161', + 'name': '品类管理', + 'font_class': 'shangpinguanli', + 'unicode': 'fcf3', + 'unicode_decimal': 64755, + }, + { + 'icon_id': '9206620', + 'name': '系统管理', + 'font_class': 'xitongguanli', + 'unicode': 'e85c', + 'unicode_decimal': 59484, + }, + { + 'icon_id': '20136570', + 'name': '菜单管理', + 'font_class': 'pinleiguanli', + 'unicode': 'e63d', + 'unicode_decimal': 58941, + }, + { + 'icon_id': '15689628', + 'name': '公司审核', + 'font_class': 'qiyezhuce', + 'unicode': 'e6a1', + 'unicode_decimal': 59041, + }, + { + 'icon_id': '5468041', + 'name': '审核管理', + 'font_class': 'shenheguanli', + 'unicode': 'e639', + 'unicode_decimal': 58937, + }, + ], +} as const + +export type IconName = (typeof icons.glyphs)[number]['font_class'] + +export interface IconGlyphs { + icon_id: string + name: string + font_class: IconName + unicode: string + unicode_decimal: number +} + diff --git a/src/components/a-icon/iconfont.ttf b/src/components/a-icon/iconfont.ttf new file mode 100644 index 0000000..7688a3e Binary files /dev/null and b/src/components/a-icon/iconfont.ttf differ diff --git a/src/components/a-icon/iconfont.woff b/src/components/a-icon/iconfont.woff new file mode 100644 index 0000000..91d3001 Binary files /dev/null and b/src/components/a-icon/iconfont.woff differ diff --git a/src/components/a-icon/iconfont.woff2 b/src/components/a-icon/iconfont.woff2 new file mode 100644 index 0000000..2ca6850 Binary files /dev/null and b/src/components/a-icon/iconfont.woff2 differ diff --git a/src/components/page/Page.vue b/src/components/page/Page.vue index 18d4080..b007303 100644 --- a/src/components/page/Page.vue +++ b/src/components/page/Page.vue @@ -14,8 +14,9 @@ width 100%; overflow auto padding 16px + box-sizing border-box - box-shadow: rgba(0, 0, 0, 0.12) 0px 0px 12px 0px; + box-shadow: rgba(30, 35, 43, 0.16) 0px 2px 10px 0px; background-color: white; display flex flex-direction column diff --git a/src/dts/components.d.ts b/src/dts/components.d.ts index fde5433..ea0a151 100644 --- a/src/dts/components.d.ts +++ b/src/dts/components.d.ts @@ -17,9 +17,11 @@ declare module 'vue' { ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup'] ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] + ElCollapse: typeof import('element-plus/es')['ElCollapse'] ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] ElContainer: typeof import('element-plus/es')['ElContainer'] ElDialog: typeof import('element-plus/es')['ElDialog'] + ElDivider: typeof import('element-plus/es')['ElDivider'] ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElEmpty: typeof import('element-plus/es')['ElEmpty'] ElForm: typeof import('element-plus/es')['ElForm'] @@ -34,6 +36,7 @@ declare module 'vue' { ElMain: typeof import('element-plus/es')['ElMain'] ElOption: typeof import('element-plus/es')['ElOption'] ElPagination: typeof import('element-plus/es')['ElPagination'] + ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTable: typeof import('element-plus/es')['ElTable'] @@ -61,9 +64,11 @@ declare global { const ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup'] const ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] const ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] + const ElCollapse: typeof import('element-plus/es')['ElCollapse'] const ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] const ElContainer: typeof import('element-plus/es')['ElContainer'] const ElDialog: typeof import('element-plus/es')['ElDialog'] + const ElDivider: typeof import('element-plus/es')['ElDivider'] const ElDropdown: typeof import('element-plus/es')['ElDropdown'] const ElEmpty: typeof import('element-plus/es')['ElEmpty'] const ElForm: typeof import('element-plus/es')['ElForm'] @@ -78,6 +83,7 @@ declare global { const ElMain: typeof import('element-plus/es')['ElMain'] const ElOption: typeof import('element-plus/es')['ElOption'] const ElPagination: typeof import('element-plus/es')['ElPagination'] + const ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm'] const ElSelect: typeof import('element-plus/es')['ElSelect'] const ElSwitch: typeof import('element-plus/es')['ElSwitch'] const ElTable: typeof import('element-plus/es')['ElTable'] diff --git a/src/pages/a-frame/AAside.tsx b/src/pages/a-frame/AAside.tsx index 7f9583a..e6c7a54 100644 --- a/src/pages/a-frame/AAside.tsx +++ b/src/pages/a-frame/AAside.tsx @@ -8,6 +8,9 @@ import { type MenuItemRegistered, } from 'element-plus' import { elIcons } from '@/common/element/element.ts' +import AIcon from '@/components/a-icon/AIcon.tsx' +import type { IconName } from '@/components/a-icon/iconfont.ts' +import styles from '@/pages/a-frame/aaside.module.styl' export interface Menu extends G.TreeNode { // Id @@ -35,7 +38,7 @@ export interface Menu extends G.TreeNode { } export default defineComponent( - ({menus}, {emit}) => { + (props, {emit}) => { const onMenuClick = (it: MenuItemRegistered) => emit('menuClick', it.index) const renderMenu = (it: Menu) => { let renderChildNode: (() => VNode[] | undefined) | undefined = undefined @@ -47,7 +50,10 @@ export default defineComponent( case 'Catalog': { currentNode = ( {{ - title: () => {it.title}, + title: () => (<> + + {it.title} + ), default: renderChildNode, }} ) @@ -64,7 +70,8 @@ export default defineComponent( case 'Page': { currentNode = ( {{ - default: () => {it.title}, + title: () => {it.title}, + default: () => , }} ) break @@ -77,12 +84,12 @@ export default defineComponent( const isCollapse = ref(false) return () => (<> - + {{ - default: () => menus.map(renderMenu), + default: () => props.menus.map(renderMenu), }} - { + { isCollapse.value = !isCollapse.value }}> diff --git a/src/pages/a-frame/AFrame.vue b/src/pages/a-frame/AFrame.vue index 1198a1c..085eabc 100644 --- a/src/pages/a-frame/AFrame.vue +++ b/src/pages/a-frame/AFrame.vue @@ -70,13 +70,15 @@ onUnmounted(() => { height 100% width 100%; overflow hidden + box-shadow: inset rgba(0, 0, 0, 0.12) 0px 0px 12px 0px; + background-color #F7F9FC & > header { display flex justify-content space-between border-bottom 1px solid #E5E7EB; height 60px - + background-color white & > div:first-child { height: 100%; display: flex; @@ -109,10 +111,10 @@ onUnmounted(() => { & > main { height 100% width calc(100% - 300px) - padding 8px + padding 5px overflow auto background-color #F7F9FC - box-shadow: inset rgba(0, 0, 0, 0.12) 0px 0px 12px 0px; + //box-shadow: inset rgba(0, 0, 0, 0.12) 0px 0px 12px 0px; } } } diff --git a/src/pages/a-frame/aaside.module.styl b/src/pages/a-frame/aaside.module.styl new file mode 100644 index 0000000..4f50796 --- /dev/null +++ b/src/pages/a-frame/aaside.module.styl @@ -0,0 +1,11 @@ +.a-menus { +} + +.a-icon { + vertical-align: middle; + margin-right: 5px; + width: var(--el-menu-icon-width); + text-align: center; + font-size: 18px; + flex-shrink: 0; +} diff --git a/src/pages/sys/dict/DictCategory.vue b/src/pages/sys/dict/DictCategory.vue new file mode 100644 index 0000000..972115c --- /dev/null +++ b/src/pages/sys/dict/DictCategory.vue @@ -0,0 +1,203 @@ + + + diff --git a/src/pages/sys/menus/MenuForm.vue b/src/pages/sys/menus/MenuForm.vue index d1d5c92..965f601 100644 --- a/src/pages/sys/menus/MenuForm.vue +++ b/src/pages/sys/menus/MenuForm.vue @@ -50,30 +50,48 @@ - + - + readonly> + + @@ -86,7 +104,6 @@ style="width: 100%" /> -