diff --git a/commitlint.config.js b/commitlint.config.js index 3871078..58a200f 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -12,7 +12,7 @@ export default { "subject-empty": [2, "never"], "type-empty": [2, "never"], "subject-case": [0], - "type-enum": [2, "always", ["feat", "fix", "media", "docs", "style", "refactor", "perf", "test", "build", "ci", "chore", "revert", "wip", "workflow", "types", "release"]] + "type-enum": [2, "always", ["init", "optimize", "feat", "fix", "media", "docs", "style", "refactor", "perf", "test", "build", "ci", "chore", "revert", "wip", "workflow", "types", "release"]] }, prompt: { messages: { @@ -28,6 +28,8 @@ export default { confirmCommit: "是否提交或修改commit ?" }, types: [ + { value: "init", name: "初始化: ⏳ 初始化项目", emoji: "⏳" }, + { value: "optimize", name: "优化代码: ♻️ 优化项目代码", emoji: "♻️" }, { value: "feat", name: "特性: 🚀 新增功能", emoji: "🚀" }, { value: "media", name: "媒体: 🎁 新增媒体资源", emoji: "🎁" }, { value: "fix", name: "修复: 🧩 修复缺陷", emoji: "🧩" }, diff --git a/locales/en.yaml b/locales/en.yaml index 4830124..1f4d0f3 100644 --- a/locales/en.yaml +++ b/locales/en.yaml @@ -180,10 +180,7 @@ menus: pureMindMap: Mind Map pureMenuOverflow: Menu Overflow Show Tooltip Text pureChildMenuOverflow: Child Menu Overflow Show Tooltip Text - bills: Ledger management - billRecord: Billing record - billHistory: Billing History - billCount: Billing Count + systemctlTest: Systemctl lTest status: pureLoad: Loading... pureMessage: Message @@ -233,4 +230,6 @@ login: purePassWordRuleReg: The password format should be any combination of 8-18 digits purePassWordSureReg: Please enter confirm password purePassWordDifferentReg: The two passwords do not match! - purePassWordUpdateReg: Password has been updated \ No newline at end of file + purePassWordUpdateReg: Password has been updated +table: + tableNumber: Table Number diff --git a/locales/zh-CN.yaml b/locales/zh-CN.yaml index 2c9fe07..195d86a 100644 --- a/locales/zh-CN.yaml +++ b/locales/zh-CN.yaml @@ -180,10 +180,7 @@ menus: pureMindMap: 思维导图 pureMenuOverflow: 目录超出显示 Tooltip 文字提示 pureChildMenuOverflow: 菜单超出显示 Tooltip 文字提示 - bills: 台账管理 - billRecord: 账单记录 - billHistory: 历史账单 - billCount: 账单统计 + systemctlTest: 系统测试 status: pureLoad: 加载中... pureMessage: 消息 @@ -234,3 +231,5 @@ login: purePassWordSureReg: 请输入确认密码 purePassWordDifferentReg: 两次密码不一致! purePassWordUpdateReg: 修改密码成功 +table: + tableNumber: 序号 diff --git a/mock/asyncRoutes.ts b/mock/asyncRoutes.ts index 79c4f31..3e0ee67 100644 --- a/mock/asyncRoutes.ts +++ b/mock/asyncRoutes.ts @@ -1,6 +1,6 @@ // 模拟后端动态生成路由 import { defineFakeRoute } from "vite-plugin-fake-server/client"; -import { bills, frame, monitor, permission, system, tabs } from "@/router/enums"; +import { frame, monitor, permission, system } from "@/router/enums"; /** * roles:页面级别权限,这里模拟二种 "admin"、"common" @@ -102,6 +102,16 @@ const systemMonitorRouter = { title: "menus.pureSystemLog", roles: ["admin"] } + }, + { + path: "/monitor/system-test", + component: "monitor/test/index", + name: "SystemTest", + meta: { + icon: "ri:file-search-line", + title: "menus.systemctlTest", + roles: ["admin"] + } } ] }; @@ -257,48 +267,6 @@ const frameRouter = { ] }; -const tabsRouter = { - path: "/tabs", - meta: { - icon: "ri:bookmark-2-line", - title: "menus.pureTabs", - rank: tabs - }, - children: [ - { - path: "/tabs/index", - name: "Tabs", - meta: { - title: "menus.pureTabs", - roles: ["admin", "common"] - } - }, - // query 传参模式 - { - path: "/tabs/query-detail", - name: "TabQueryDetail", - meta: { - // 不在menu菜单中显示 - showLink: false, - activePath: "/tabs/index", - roles: ["admin", "common"] - } - }, - // params 传参模式 - { - path: "/tabs/params-detail/:id", - component: "params-detail", - name: "TabParamsDetail", - meta: { - // 不在menu菜单中显示 - showLink: false, - activePath: "/tabs/index", - roles: ["admin", "common"] - } - } - ] -}; - const about = { path: "/about", meta: { @@ -324,7 +292,7 @@ export default defineFakeRoute([ response: () => { return { success: true, - data: [systemManagementRouter, systemMonitorRouter, permissionRouter, frameRouter, about, /*tabsRouter*/] + data: [systemManagementRouter, systemMonitorRouter, permissionRouter, frameRouter, about] }; } } diff --git a/src/components/ReVxeTableBar/index.ts b/src/components/ReVxeTableBar/index.ts deleted file mode 100644 index 6ffa7e2..0000000 --- a/src/components/ReVxeTableBar/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import vxeTableBar from "./src/bar"; -import { withInstall } from "@pureadmin/utils"; - -/** 配合 `vxe-table` 实现快速便捷的表格操作 */ -export const VxeTableBar = withInstall(vxeTableBar); diff --git a/src/components/ReVxeTableBar/src/bar.tsx b/src/components/ReVxeTableBar/src/bar.tsx deleted file mode 100644 index 05eb688..0000000 --- a/src/components/ReVxeTableBar/src/bar.tsx +++ /dev/null @@ -1,251 +0,0 @@ -import Sortable from "sortablejs"; -import { transformI18n } from "@/plugins/i18n"; -import { useEpThemeStoreHook } from "@/store/modules/epTheme"; -import { cloneDeep, delay, getKeyList } from "@pureadmin/utils"; -import { computed, defineComponent, getCurrentInstance, nextTick, type PropType, ref, unref } from "vue"; - -import DragIcon from "@/assets/table-bar/drag.svg?component"; -import ExpandIcon from "@/assets/table-bar/expand.svg?component"; -import RefreshIcon from "@/assets/table-bar/refresh.svg?component"; -import SettingIcon from "@/assets/table-bar/settings.svg?component"; -import CollapseIcon from "@/assets/table-bar/collapse.svg?component"; - -const props = { - /** 头部最左边的标题 */ - title: { - type: String, - default: "列表" - }, - vxeTableRef: { - type: Object as PropType - }, - /** 需要展示的列 */ - columns: { - type: Array as PropType, - default: () => [] - }, - /** 是否为树列表 */ - tree: { - type: Boolean, - default: false - }, - isExpandAll: { - type: Boolean, - default: true - }, - tableKey: { - type: [String, Number] as PropType, - default: "0" - } -}; - -export default defineComponent({ - name: "VxeTableBar", - props, - emits: ["refresh"], - setup(props, { emit, slots, attrs }) { - const size = ref("small"); - const loading = ref(false); - const checkAll = ref(true); - const isIndeterminate = ref(false); - const instance = getCurrentInstance()!; - const isExpandAll = ref(props.isExpandAll); - let checkColumnList = getKeyList(cloneDeep(props?.columns), "title"); - const checkedColumns = ref(getKeyList(cloneDeep(props?.columns), "title")); - const dynamicColumns = ref(cloneDeep(props?.columns)); - - const getDropdownItemStyle = computed(() => { - return s => { - return { - background: s === size.value ? useEpThemeStoreHook().epThemeColor : "", - color: s === size.value ? "#fff" : "var(--el-text-color-primary)" - }; - }; - }); - - const iconClass = computed(() => { - return ["text-black", "dark:text-white", "duration-100", "hover:!text-primary", "cursor-pointer", "outline-none"]; - }); - - const topClass = computed(() => { - return ["flex", "justify-between", "pt-[3px]", "px-[11px]", "border-b-[1px]", "border-solid", "border-[#dcdfe6]", "dark:border-[#303030]"]; - }); - - function onReFresh() { - loading.value = true; - emit("refresh"); - delay(500).then(() => (loading.value = false)); - } - - function onExpand() { - isExpandAll.value = !isExpandAll.value; - isExpandAll.value ? props.vxeTableRef.setAllTreeExpand(true) : props.vxeTableRef.clearTreeExpand(); - props.vxeTableRef.refreshColumn(); - } - - function reloadColumn() { - const curCheckedColumns = cloneDeep(dynamicColumns.value).filter(item => checkedColumns.value.includes(item.title)); - props.vxeTableRef.reloadColumn(curCheckedColumns); - } - - function handleCheckAllChange(val: boolean) { - checkedColumns.value = val ? checkColumnList : []; - isIndeterminate.value = false; - reloadColumn(); - } - - function handleCheckedColumnsChange(value: string[]) { - checkedColumns.value = value; - const checkedCount = value.length; - checkAll.value = checkedCount === checkColumnList.length; - isIndeterminate.value = checkedCount > 0 && checkedCount < checkColumnList.length; - } - - async function onReset() { - checkAll.value = true; - isIndeterminate.value = false; - dynamicColumns.value = cloneDeep(props?.columns); - checkColumnList = []; - checkColumnList = await getKeyList(cloneDeep(props?.columns), "title"); - checkedColumns.value = getKeyList(cloneDeep(props?.columns), "title"); - props.vxeTableRef.refreshColumn(); - } - - function changeSize(curSize: string) { - size.value = curSize; - props.vxeTableRef.refreshColumn(); - } - - const dropdown = { - dropdown: () => ( - - changeSize("medium")}> - 宽松 - - changeSize("small")}> - 默认 - - changeSize("mini")}> - 紧凑 - - - ) - }; - - /** 列展示拖拽排序 */ - const rowDrop = (event: { preventDefault: () => void }) => { - event.preventDefault(); - nextTick(() => { - const wrapper: HTMLElement = (instance?.proxy?.$refs[`VxeGroupRef${unref(props.tableKey)}`] as any).$el.firstElementChild; - Sortable.create(wrapper, { - animation: 300, - handle: ".drag-btn", - onEnd: ({ newIndex, oldIndex, item }) => { - const targetThElem = item; - const wrapperElem = targetThElem.parentNode as HTMLElement; - const oldColumn = dynamicColumns.value[oldIndex]; - const newColumn = dynamicColumns.value[newIndex]; - if (oldColumn?.fixed || newColumn?.fixed) { - // 当前列存在fixed属性 则不可拖拽 - const oldThElem = wrapperElem.children[oldIndex] as HTMLElement; - if (newIndex > oldIndex) { - wrapperElem.insertBefore(targetThElem, oldThElem); - } else { - wrapperElem.insertBefore(targetThElem, oldThElem ? oldThElem.nextElementSibling : oldThElem); - } - return; - } - const currentRow = dynamicColumns.value.splice(oldIndex, 1)[0]; - dynamicColumns.value.splice(newIndex, 0, currentRow); - reloadColumn(); - } - }); - }); - }; - - const isFixedColumn = (title: string) => { - return dynamicColumns.value.filter(item => transformI18n(item.title) === transformI18n(title))[0].fixed ? true : false; - }; - - const rendTippyProps = (content: string) => { - // https://vue-tippy.netlify.app/props - return { - content, - offset: [0, 18], - duration: [300, 0], - followCursor: true, - hideOnClick: "toggle" - }; - }; - - const reference = { - reference: () => - }; - - return () => ( - <> -
-
- {slots?.title ? slots.title() :

{props.title}

} -
- {slots?.buttons ?
{slots.buttons()}
: null} - {props.tree ? ( - <> - onExpand()} - /> - - - ) : null} - onReFresh()} /> - - - - - - - -
- handleCheckAllChange(value)} /> - onReset()}> - 重置 - -
- -
- - handleCheckedColumnsChange(value)}> - - {checkColumnList.map((item, index) => { - return ( -
- void }) => rowDrop(event)} /> - - - {transformI18n(item)} - - -
- ); - })} -
-
-
-
-
-
-
- {slots.default({ - size: size.value, - dynamicColumns: dynamicColumns.value - })} -
- - ); - } -}); diff --git a/src/components/TableBar/src/TablePlus.vue b/src/components/TableBar/src/TablePlus.vue new file mode 100644 index 0000000..4956cea --- /dev/null +++ b/src/components/TableBar/src/TablePlus.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/components/TableBar/src/TablePlusBar.vue b/src/components/TableBar/src/TablePlusBar.vue new file mode 100644 index 0000000..6bfe673 --- /dev/null +++ b/src/components/TableBar/src/TablePlusBar.vue @@ -0,0 +1,282 @@ + + + + + diff --git a/src/components/TableBar/src/TablePlusPage.vue b/src/components/TableBar/src/TablePlusPage.vue new file mode 100644 index 0000000..f442ab3 --- /dev/null +++ b/src/components/TableBar/src/TablePlusPage.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/components/TableBar/src/TablePlusQuery.vue b/src/components/TableBar/src/TablePlusQuery.vue new file mode 100644 index 0000000..0b70965 --- /dev/null +++ b/src/components/TableBar/src/TablePlusQuery.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/src/components/TableBar/src/bar.tsx b/src/components/TableBar/src/bar.tsx index 918a1fa..b9fd0f8 100644 --- a/src/components/TableBar/src/bar.tsx +++ b/src/components/TableBar/src/bar.tsx @@ -188,7 +188,7 @@ export default defineComponent({ }; const isFixedColumn = (label: string) => { - return !!dynamicColumns.value.filter(item => transformI18n(item.label) === transformI18n(label))[0].fixed; + return dynamicColumns.value.filter(item => transformI18n(item.label) === transformI18n(label))[0].fixed; }; const rendTippyProps = (content: string) => { @@ -244,7 +244,7 @@ export default defineComponent({
handleCheckedColumnsChange(value)}> - + {checkColumnList.map((item, index) => { return (
@@ -271,24 +271,6 @@ export default defineComponent({ size: size.value, dynamicColumns: dynamicColumns.value })} - {/**/}
); diff --git a/src/components/TableBar/utils/tableConfig.ts b/src/components/TableBar/utils/tableConfig.ts new file mode 100644 index 0000000..2dd62ce --- /dev/null +++ b/src/components/TableBar/utils/tableConfig.ts @@ -0,0 +1,7 @@ +export const rendTipProps = (content: string) => ({ + content, + offset: [0, 18], + duration: [300, 0], + followCursor: true, + hideOnClick: "toggle" +}); diff --git a/src/components/TableBar/utils/tableStyle.ts b/src/components/TableBar/utils/tableStyle.ts new file mode 100644 index 0000000..3a72483 --- /dev/null +++ b/src/components/TableBar/utils/tableStyle.ts @@ -0,0 +1,11 @@ +/** + * * 表格头部样式 + */ +export const cellHeaderStyle = () => ({ + background: "var(--el-fill-color-light)", + color: "var(--el-text-color-primary)" +}); + +export const iconClass = () => "text-black dark:text-white duration-100 hover:!text-primary cursor-pointer outline-none"; + +export const topClass = () => "flex justify-between pt-[3px] px-[11px] border-b-[1px] border-solid border-[#dcdfe6] dark:border-[#303030]"; diff --git a/src/layout/components/lay-notice/index.vue b/src/layout/components/lay-notice/index.vue index d85cf0f..4bee108 100644 --- a/src/layout/components/lay-notice/index.vue +++ b/src/layout/components/lay-notice/index.vue @@ -1,6 +1,6 @@ -