@okiss/oms 0.0.104 → 0.0.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.es.js +192 -164
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","names":["h","getCurrentInstance","createVNode","_createVNode","ElRow","ElCol","ElCard","merge","VForm","VTable","isObject","isArray","test","props","components","regComponents","comps","Object","keys","forEach","k","defaultSchema","type","class","shadow","afterReset","syncUrl","pathNodeParse","node","_node","assign","part","split","reverse","span","tmp","i","length","item","children","nodesParse","_nodes","root","gutter","style","colProps","indexOf","push","transChildren","_children","globalComps","comp","default","map","render","appContext","nodes","values","schema","input","select","number","numberRange","xswitch","subForm","radio","checkbox","code","json","upload","iconSelect","template","baseSchema","xenum","$router","$router","$route"],"sources":["../src/init.ts","../src/utils/token.ts","../src/store/http.ts","../src/default.ts","../src/store/modules/settings.ts","../src/store/modules/user.ts","../src/store/modules/app.ts","../src/store/modules/builderSchema.ts","../src/store/index.ts","../src/composables/useThemeMode.ts","../src/App.vue","../src/App.vue","../src/mock/types.ts","../src/mock/data/example.ts","../src/mock/apis/user.ts","../src/mock/apis/index.ts","../src/mock/index.ts","../src/plugins/element-plus.ts","../src/utils/request/cache.ts","../src/router/guard/nprogress.ts","../src/router/guard/func.ts","../src/utils/sso/base.ts","../src/utils/sso/github.ts","../src/utils/sso/dingtalk.ts","../src/utils/sso/index.ts","../src/router/guard/permission.ts","../src/types.ts","../src/components/VLoading.vue","../src/components/notice/VNotice.vue","../src/components/PageLoad.vue","../src/components/PageLoad.vue","../src/scaffold/table.vue","../src/scaffold/form.vue","../src/components/VTree.vue","../src/scaffold/tree.vue","../src/scaffold/container.vue","../src/components/report/option.ts","../src/components/report/NumberPanel.vue","../src/components/report/part.vue","../src/components/report/part.vue","../src/components/report/index.vue","../src/components/report/index.vue","../src/scaffold/report.vue","../src/render/index.tsx","../src/scaffold/custom.vue","../src/router/remote.ts","../src/scaffold/layout/components/Breadcrumb/index.vue","../src/scaffold/layout/components/Hamburger/index.vue","../src/scaffold/devtool/DevLayout.vue","../src/scaffold/devtool/formBuilder/ctrls/input.js","../src/scaffold/devtool/formBuilder/ctrls/number.js","../src/scaffold/devtool/formBuilder/ctrls/number-range.js","../src/scaffold/devtool/formBuilder/ctrls/select.js","../src/scaffold/devtool/formBuilder/ctrls/radio.js","../src/scaffold/devtool/formBuilder/ctrls/switch.js","../src/scaffold/devtool/formBuilder/ctrls/code.js","../src/scaffold/devtool/formBuilder/ctrls/json.js","../src/scaffold/devtool/formBuilder/ctrls/upload.js","../src/scaffold/devtool/formBuilder/ctrls/template.js","../src/scaffold/devtool/formBuilder/ctrls/icon-select.js","../src/scaffold/devtool/formBuilder/ctrls/sub-form.js","../src/scaffold/devtool/formBuilder/ctrls/checkbox.js","../src/scaffold/devtool/formBuilder/form.js","../src/scaffold/devtool/formBuilder/index.vue","../src/scaffold/devtool/tableBuilder/ctrls/input.js","../src/scaffold/devtool/tableBuilder/ctrls/select.js","../src/scaffold/devtool/tableBuilder/ctrls/date.js","../src/scaffold/devtool/tableBuilder/table.js","../src/scaffold/devtool/base.js","../src/scaffold/devtool/tableBuilder/columns/span.js","../src/scaffold/devtool/tableBuilder/columns/emum.js","../src/scaffold/devtool/tableBuilder/columns/html.js","../src/scaffold/devtool/tableBuilder/columns/icon.js","../src/scaffold/devtool/tableBuilder/columns/image.js","../src/scaffold/devtool/tableBuilder/columns/json.js","../src/scaffold/devtool/tableBuilder/columns/link.js","../src/scaffold/devtool/tableBuilder/columns/rich.js","../src/scaffold/devtool/tableBuilder/columns/tpl.js","../src/scaffold/devtool/tableBuilder/columns/index.js","../src/scaffold/devtool/tableBuilder/btn/jump.js","../src/scaffold/devtool/tableBuilder/btn/api.js","../src/scaffold/devtool/tableBuilder/btn/form.js","../src/scaffold/devtool/tableBuilder/btn/table.js","../src/scaffold/devtool/tableBuilder/btn/index.js","../src/scaffold/devtool/tableBuilder/index.vue","../src/scaffold/devtool/tableBuilder/index.vue","../src/scaffold/layout/components/PageEditor.vue","../src/scaffold/layout/components/Navbar.vue","../src/scaffold/layout/components/Navbar.vue","../src/scaffold/layout/components/Sidebar/Logo.vue","../src/scaffold/layout/components/Sidebar/Logo.vue","../src/scaffold/layout/components/Sidebar/Link.vue","../src/scaffold/layout/components/Sidebar/FixiOSBug.ts","../src/scaffold/layout/components/Sidebar/MenuContent.vue","../src/scaffold/layout/components/Sidebar/MenuContent.vue","../src/scaffold/layout/components/Sidebar/SidebarItem.vue","../src/scaffold/layout/components/Sidebar/SearchMenu.vue","../src/scaffold/layout/components/Sidebar/SearchMenu.vue","../src/scaffold/layout/components/Sidebar/index.vue","../src/scaffold/layout/components/Sidebar/index.vue","../src/scaffold/layout/components/AppMain.vue","../src/scaffold/layout/index.vue","../src/router/permission.ts","../src/utils/jwt.ts","../src/router/guard/remote-routes.ts","../src/router/guard/set-page-title.ts","../src/router/guard/index.ts","../src/utils/container/index.ts","../src/scaffold/dashboard.vue","../src/scaffold/dashboard.vue","../src/scaffold/login.vue","../src/scaffold/login.vue","../src/scaffold/404.vue","../src/router/router.ts","../src/router/index.ts","../src/utils/request/interceptors.ts","../src/utils/request/index.ts","../src/directive/outClick.ts","../src/plugins/eventBus.ts","../src/directive/rightClick.ts","../src/directive/resize.ts","../src/directive/devtool.ts","../src/directive/index.ts","../src/admin.ts"],"sourcesContent":["/* eslint-disable */\ninterface String {\n format(...replacements: string[]): string;\n}\n\nif (!String.prototype.format) {\n String.prototype.format = function () {\n const args = arguments\n return this.replace(/{(\\d+)}/g, function (match, number) {\n return typeof args[number] !== 'undefined'\n ? args[number]\n : match\n })\n }\n}\n","import Cookies from 'js-cookie'\nimport { pinia, useSettingsStore } from '../store'\n\nconst TokenKey = 'oms:token'\n\nexport function getToken(): string {\n return Cookies.get(TokenKey) || ''\n}\n\nexport function setToken(token: string) {\n const settings = useSettingsStore(pinia)\n const expires = new Date(new Date().getTime() + (settings.tokenExpire || 24 * 60 * 60 * 1000))\n return Cookies.set(TokenKey, token, { expires })\n}\n\nexport function removeToken() {\n return Cookies.remove(TokenKey)\n}\n","import type { AxiosInstance } from 'axios'\n\nlet httpClient: AxiosInstance | null = null\n\nexport function setHttp(http: AxiosInstance) { httpClient = http }\nexport function getHttp(): AxiosInstance | null { return httpClient }\n\n","import zhCn from 'element-plus/es/locale/lang/zh-cn'\nimport { AxiosRequestConfig } from 'axios'\nimport { OmsOptions } from './types'\nimport { Settings } from './types'\n\nconst defaultAxios: AxiosRequestConfig = {\n baseURL: '/api',\n withCredentials: true,\n cacheEnable: true\n}\n\nexport const defaultSettings: Settings = {\n title: 'oms',\n fixedHeader: false,\n sidebarLogo: true,\n logo: '',\n closeNavNotice: false,\n navBarNotice: '',\n hasNewMessage: true,\n showPageJsonSchema: false,\n loginTips: '',\n sso: {},\n ElementPlus: {\n size: 'default',\n zIndex: 3000,\n locale: zhCn\n },\n nav: [],\n whiteRoutes: ['/login'],\n tokenExpire: 7 * 24 * 60 * 60 * 1000,\n defaultAvatar: '',\n envColor: {\n 'uat': 'gray',\n 'pre': 'green'\n },\n serviceOffLineNotice: '当前页面功能正在维护, 请稍后再试~~~',\n formMutex: true,\n captcha: true,\n themeMode: 'light'\n}\n\nexport const defaultOptions: OmsOptions = {\n axios: defaultAxios,\n settings: defaultSettings,\n plugins: [],\n mock: false\n}\n","import { defineStore } from 'pinia'\nimport { Settings } from '../../types'\nimport { defaultSettings } from '../../default'\nimport { cloneDeep, merge } from 'lodash'\n\nexport const settings: Settings = cloneDeep(defaultSettings)\n\nexport const useSettingsStore = defineStore('settings', {\n state: (): Settings => ({ ...settings }),\n actions: {\n updateSettings(newSettings: Settings) {\n // merge into reactive state\n merge(this, newSettings)\n }\n }\n})\n\nexport default useSettingsStore\n","import { defineStore } from 'pinia'\nimport { strOrNum, User } from '../types'\nimport { LoginForm, LoginTicket, RemoteModule, Settings, UserInfo } from '../../types'\nimport { ApiResponse } from '../../utils/request/types'\nimport { getToken, removeToken, setToken } from '../../utils/token'\nimport { RouteRecordRaw } from 'vue-router'\nimport Cookies from 'js-cookie'\nimport { getHttp } from '../http'\nimport { useSettingsStore } from './settings'\n\nexport const userState: User = {\n name: '',\n nickname: '',\n avatar: '',\n token: getToken(),\n customRouter: [],\n remoteRouter: [],\n menuRoutes: [],\n isLodeRemoteRoutes: false,\n resource: {},\n roleIds: [],\n path: '',\n env: '',\n expired: false\n}\n\nconst getRouteKey = (route: RouteRecordRaw): string => {\n return typeof route.name === 'string' ? route.name : route.path\n}\n\nexport const useUserStore = defineStore('user', {\n state: (): User => ({ ...userState }),\n actions: {\n updateToken(token: string) {\n this.token = token\n setToken(token)\n },\n removeToken() {\n this.token = ''\n removeToken()\n },\n updateRemoteRouter(routes: RemoteModule[]) {\n this.remoteRouter = routes\n this.isLodeRemoteRoutes = true\n },\n setCustomRoutes(routes: RouteRecordRaw[]) {\n const existed = new Set(this.customRouter.map(route => getRouteKey(route)))\n const append = routes.filter(route => !existed.has(getRouteKey(route)))\n if (append.length) {\n this.customRouter = this.customRouter.concat(append)\n }\n },\n updateState<K extends keyof User>({ key, value }: { key: K, value: any }) {\n // @ts-ignore\n this[key] = value\n },\n resetUser() {\n const fresh: User = { ...userState, token: getToken() }\n Object.assign(this, fresh)\n },\n SET_EXPIRED() {\n this.expired = !this.expired\n },\n\n // async actions\n login(data: LoginForm | LoginTicket): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n const http = getHttp()\n if (!http) {\n reject('http client not init')\n return\n }\n http.request<UserInfo, ApiResponse<UserInfo>>({\n url: '/user/login',\n method: 'POST',\n data\n }).then((response: ApiResponse<UserInfo>) => {\n this.updateToken(response.data?.token || '')\n resolve(true)\n }).catch(error => reject(error))\n })\n },\n logout() {\n this.removeToken()\n this.resetUser()\n },\n info(): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n const http = getHttp()\n if (!http) {\n reject('http client not init')\n return\n }\n http.request<UserInfo, ApiResponse<UserInfo>>({\n url: '/user/info',\n method: 'GET'\n }).then((response: ApiResponse<UserInfo>) => {\n const roleIds: strOrNum[] = response.data?.role_ids || []\n this.updateState({ key: 'name', value: response.data?.name })\n this.updateState({ key: 'nickname', value: response.data?.nickname })\n this.updateState({ key: 'roleIds', value: roleIds })\n this.updateState({ key: 'env', value: response.data?.env })\n const website = (response.data?.website || {}) as Settings\n useSettingsStore().updateSettings(website)\n // @ts-ignore\n !Cookies.get('username') && Cookies.set('username', response.data?.name)\n // We cannot directly import settings store here without circular concerns in some flows.\n resolve(true)\n }).catch(error => reject(error))\n })\n },\n loadRemoteRoutes(): Promise<RemoteModule[]> {\n return new Promise<RemoteModule[]>((resolve, reject) => {\n const http = getHttp()\n http?.request<RemoteModule, ApiResponse<RemoteModule[]>>({\n url: '/user/routes',\n method: 'get'\n }).then((response: ApiResponse<RemoteModule[]>) => {\n if (response.code === 0) {\n const resource: RemoteModule[] = response.data || []\n resolve(resource)\n } else {\n reject('error')\n }\n }).catch(error => {\n console.log(error)\n reject(error)\n })\n })\n },\n SetExpired() {\n this.SET_EXPIRED()\n }\n }\n})\n\nexport default useUserStore\n","import { defineStore } from 'pinia'\nimport { App, PageSchema, Sidebar } from '../types'\nimport Cookies from 'js-cookie'\n\nconst SIDEBAR_STATUS_KEY = 'sidebarStatus'\n\nfunction getStoredSidebarStatus() {\n if (typeof window === 'undefined')\n return undefined\n const local = window.localStorage.getItem(SIDEBAR_STATUS_KEY)\n if (local !== null)\n return local === '1'\n const cookie = Cookies.get(SIDEBAR_STATUS_KEY)\n if (cookie !== undefined)\n return !!cookie\n}\n\nfunction persistSidebarStatus(opened: boolean) {\n if (typeof window !== 'undefined')\n window.localStorage.setItem(SIDEBAR_STATUS_KEY, opened ? '1' : '0')\n Cookies.set(SIDEBAR_STATUS_KEY, opened ? '1' : '0')\n}\n\nexport const appState: App = {\n sidebar: {\n opened: getStoredSidebarStatus() ?? true,\n withoutAnimation: false\n },\n device: 'desktop',\n pages: {},\n currentRouteMeta: {},\n builderSchema: {},\n baseURL: ''\n}\n\nexport const useAppStore = defineStore('app', {\n state: (): App => ({ ...appState }),\n actions: {\n TOGGLE_SIDEBAR() {\n this.sidebar.opened = !this.sidebar.opened\n this.sidebar.withoutAnimation = false\n persistSidebarStatus(this.sidebar.opened)\n },\n CLOSE_SIDEBAR(withoutAnimation: boolean) {\n this.sidebar.opened = false\n persistSidebarStatus(this.sidebar.opened)\n this.sidebar.withoutAnimation = withoutAnimation\n },\n TOGGLE_DEVICE(device: string) {\n this.device = device\n },\n SET_PAGE_JSON_SCHEMA({ page, json }: PageSchema) {\n this.pages[page] = json\n },\n SET_CURRENT_META(data: Record<string, any>) {\n this.currentRouteMeta = data\n },\n SET_BUILDER_SCHEMA(data: Record<string, any>) {\n this.builderSchema = data\n },\n SET_BASE_API(data: string) {\n this.baseURL = data\n },\n\n // Vuex-compat method names\n toggleSideBar() { this.TOGGLE_SIDEBAR() },\n closeSideBar({ withoutAnimation }: Sidebar) { this.CLOSE_SIDEBAR(withoutAnimation) },\n toggleDevice(device: string) { this.TOGGLE_DEVICE(device) },\n setPageJsonSchema(data: PageSchema) { this.SET_PAGE_JSON_SCHEMA(data) },\n setCurrentMeta(data: Record<string, any>) { this.SET_CURRENT_META(data) },\n setBuilderSchema(data: Record<string, any>) { this.SET_BUILDER_SCHEMA(data) },\n setBaseAPI(data: string) { this.SET_BASE_API(data) }\n }\n})\n\nexport default useAppStore\n","/**\n * BuilderSchema\n * 存储pageEditor 编辑模式下时子组件联动相关的状态数据\n */\n\nimport { defineStore } from 'pinia'\nimport { BuilderSchema } from '../types'\n\nexport const builderSchemaState: BuilderSchema = {\n currentCellItem: {} // form/sub-form 当前单元格编辑数据\n}\n\nexport const useBuilderSchemaStore = defineStore('builderSchema', {\n state: (): BuilderSchema => ({ ...builderSchemaState }),\n actions: {\n SET_CURRENT_CELLITEM(data: Record<string, any>) {\n this.currentCellItem = data\n },\n setCurrentCellItem(data: Record<string, any>) {\n this.SET_CURRENT_CELLITEM(data)\n }\n }\n})\n\nexport default useBuilderSchemaStore\n","import type { App } from 'vue'\nimport { createPinia } from 'pinia'\n\nexport const pinia = createPinia()\n\nexport function setupStore(app: App<Element>) {\n app.use(pinia)\n}\n\nexport * from './modules/user'\nexport * from './modules/app'\nexport * from './modules/settings'\nexport * from './modules/builderSchema'\nexport * from './http'\n\nexport default pinia\n","import { computed, ref, watch } from 'vue'\nimport { useSettingsStore } from '../store'\nimport {\n applyDocumentTheme,\n dispatchThemeChange,\n getDocumentTheme,\n normalizeTheme,\n type ThemeMode\n} from '@okiss/utils'\n\nconst THEME_STORAGE_KEY = 'oms-theme'\n\nconst themeMode = ref<ThemeMode>('light')\nlet initialized = false\nlet stopWatch: (() => void) | null = null\nlet stopSystemListener: (() => void) | null = null\n\nfunction detectInitialTheme(storeMode: unknown): ThemeMode {\n const fromStore = normalizeTheme((storeMode as string) ?? undefined)\n if (typeof window === 'undefined') {\n return fromStore\n }\n const cached = window.localStorage?.getItem(THEME_STORAGE_KEY)\n if (cached === 'dark' || cached === 'light') {\n return cached\n }\n if (storeMode === 'dark' || storeMode === 'light') {\n return storeMode\n }\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction persistTheme(mode: ThemeMode) {\n if (typeof window !== 'undefined') {\n window.localStorage?.setItem(THEME_STORAGE_KEY, mode)\n }\n}\n\nfunction applyTheme(mode: ThemeMode) {\n const normalized = normalizeTheme(mode)\n themeMode.value = normalized\n applyDocumentTheme(normalized)\n dispatchThemeChange(normalized)\n persistTheme(normalized)\n}\n\nfunction setupSystemThemeListener(onChange: (mode: ThemeMode) => void) {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n stopSystemListener = null\n return\n }\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const listener = (event: MediaQueryListEvent) => {\n const matches = event.matches ?? mediaQuery.matches\n onChange(matches ? 'dark' : 'light')\n }\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', listener)\n } else {\n mediaQuery.addListener(listener)\n }\n stopSystemListener = () => {\n if (typeof mediaQuery.removeEventListener === 'function') {\n mediaQuery.removeEventListener('change', listener)\n } else {\n mediaQuery.removeListener(listener)\n }\n stopSystemListener = null\n }\n}\n\nexport function useThemeMode() {\n const settingsStore = useSettingsStore()\n\n const setTheme = (next: ThemeMode) => {\n const normalized = normalizeTheme(next)\n if (settingsStore.themeMode !== normalized) {\n settingsStore.updateSettings({ themeMode: normalized } as any)\n } else {\n applyTheme(normalized)\n }\n }\n\n if (!initialized) {\n initialized = true\n const resolved = detectInitialTheme(settingsStore.themeMode)\n if (normalizeTheme(settingsStore.themeMode as string) !== resolved) {\n settingsStore.updateSettings({ themeMode: resolved } as any)\n } else {\n applyTheme(resolved)\n }\n stopWatch = watch(\n () => settingsStore.themeMode,\n (mode) => {\n applyTheme(normalizeTheme(mode as string))\n },\n { immediate: true }\n )\n stopSystemListener?.()\n setupSystemThemeListener((mode) => {\n setTheme(mode)\n })\n }\n\n const mode = computed(() => themeMode.value)\n const isDark = computed(() => mode.value === 'dark')\n\n const toggleTheme = () => {\n setTheme(isDark.value ? 'light' : 'dark')\n }\n\n return {\n themeMode: mode,\n isDark,\n setTheme,\n toggleTheme\n }\n}\n\nexport function getThemeMode(): ThemeMode {\n if (!initialized) {\n return normalizeTheme(getDocumentTheme())\n }\n return themeMode.value\n}\n\nexport function stopThemeWatcher() {\n stopWatch?.()\n stopWatch = null\n stopSystemListener?.()\n stopSystemListener = null\n initialized = false\n}\n","<template>\n <router-view />\n</template>\n\n<script setup lang=\"ts\">\nimport { addNewStyle, addNewStyleTag } from '@okiss/utils'\nimport { provide } from 'vue'\nimport { useThemeMode } from './composables/useThemeMode'\n\nuseThemeMode()\n\nonBeforeMount(() => {\n const loading = document.getElementById('preloader')\n if (loading !== null) {\n document.body.removeChild(loading)\n document.getElementById('preloader')?.remove()\n addNewStyle('test-icon', '//at.alicdn.com/t/font_2246548_zclaqxwmzq8.css')\n\n const css = `.iconfont {\n font-size: 19px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n font-family: iconfont !important;\n }`\n\n addNewStyleTag(css)\n }\n})\n\nif (window?.OmsOptions?.form?.vsPath) {\n provide('vsPath', window?.OmsOptions?.form?.vsPath)\n}\n</script>\n","<template>\n <router-view />\n</template>\n\n<script setup lang=\"ts\">\nimport { addNewStyle, addNewStyleTag } from '@okiss/utils'\nimport { provide } from 'vue'\nimport { useThemeMode } from './composables/useThemeMode'\n\nuseThemeMode()\n\nonBeforeMount(() => {\n const loading = document.getElementById('preloader')\n if (loading !== null) {\n document.body.removeChild(loading)\n document.getElementById('preloader')?.remove()\n addNewStyle('test-icon', '//at.alicdn.com/t/font_2246548_zclaqxwmzq8.css')\n\n const css = `.iconfont {\n font-size: 19px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n font-family: iconfont !important;\n }`\n\n addNewStyleTag(css)\n }\n})\n\nif (window?.OmsOptions?.form?.vsPath) {\n provide('vsPath', window?.OmsOptions?.form?.vsPath)\n}\n</script>\n","export enum MockHttpMethod {\n GET = 'get',\n POST = 'post',\n DELETE = 'delete',\n FETCH = 'fetch',\n OPTION = 'option',\n PUT = 'put'\n}\n\nexport interface MockOption {\n query: Record<string, any>,\n data: Record<string, any>\n}\n\nexport interface MockApi {\n method: MockHttpMethod,\n url: string | RegExp,\n baseURL?: string,\n response: (options: MockOption) => Record<string, any>\n}\n\nexport interface MockApiMap {\n [key: string]: MockApi\n}\n","import _ from 'lodash'\n\nconst form = {\n saveApi: '/save',\n afterSubmit: '',\n afterReset: 'goback',\n options: {\n column: 3,\n submitButton: {\n text: '提交'\n },\n cancelButton: {\n text: '取消',\n on: {\n click: '() => console.error(33333333)'\n }\n }\n },\n formItems: [\n {\n type: 'radio',\n field: 'radio',\n label: '单选框',\n info:\n '表单控件支持提示信息, 可写html <a class=\"el-link el-link--primary is-underline\" target=\"_blank\" href=\"http://github.com/daodao97\">文档</a>',\n options: [\n {\n value: 1,\n label: '选项1'\n },\n {\n value: 2,\n label: '选项2'\n }\n ],\n value: 1,\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n field: 'input',\n label: '输入框',\n value: 5,\n props: {\n maxlength: 10,\n suffixIcon: 'el-icon-date',\n slots: {\n prepend: '前缀'\n },\n showCopy: true,\n prefixIcon: 'el-icon-search'\n },\n rules: [{ required: true, message: '该项为必填项' }],\n depend: {\n field: 'radio',\n value: 1\n },\n computed: [\n {\n when: 'aaa',\n set: {\n checkbox: {\n value: [1]\n }\n }\n },\n {\n when: 'bbb',\n set: {\n checkbox: {\n value: [2, 3]\n }\n }\n }\n ],\n info: '当前控件依赖 单选框 的值, 仅在 选项1 下显示',\n col: {\n span: 12\n }\n },\n {\n type: 'number',\n field: 'number',\n label: '数字',\n props: {\n step: 2\n },\n computed: {\n // when: [\"$self\", \">\", 10],\n // when: [\">\", 3],\n when: 4,\n set: {\n range_number: {\n label: '数字区间2'\n }\n }\n },\n col: {\n span: 12\n },\n value: 4\n },\n {\n type: 'number-range',\n field: 'range_number',\n label: '数字区间',\n col: {\n span: 12\n }\n },\n {\n type: 'checkbox',\n field: 'checkbox',\n label: '复选框',\n value: [],\n options: [\n { value: 1, label: '复选框1' },\n { value: 2, label: '复选框2' },\n { value: 3, label: '复选框3' }\n ],\n info: '动态计算, 当 输入框 字段的值 为 aaa 时, 复选框1将被选中, 为 bbb 时, 复选框2,3 将被选中',\n col: {\n span: 8\n }\n },\n {\n type: 'date',\n field: 'date',\n label: '日期',\n props: {\n disabled: true\n },\n info: '禁用控件',\n col: {\n span: 8\n }\n },\n {\n type: 'date',\n field: 'date_range',\n label: '日期范围',\n value: '',\n props: {\n type: 'daterange',\n rangeSeparator: '~',\n startPlaceholder: '开始日期',\n endPlaceholder: '结束日期'\n },\n col: {\n span: 8\n }\n },\n {\n type: 'time',\n field: 'time',\n label: '时间'\n },\n {\n type: 'time',\n field: 'time_range',\n label: '时间范围',\n props: {\n isRange: true\n }\n },\n {\n type: 'datetime',\n field: 'datetime',\n label: '日期时间'\n },\n {\n type: 'datetime',\n field: 'datetime_range',\n label: '日期时间范围',\n props: {\n type: 'datetimerange'\n }\n },\n {\n type: 'select',\n field: 'select',\n label: '下拉框',\n options: [\n { value: 1, label: '选项1' },\n { value: 2, label: '选项2' },\n { value: 3, label: '选项3' },\n { value: 4, label: '选项4' }\n ],\n props: {\n selectApi: '/user/select'\n }\n },\n {\n type: 'switch',\n field: 'switch',\n label: '开关'\n },\n {\n type: 'slider',\n field: 'slider',\n label: '滑块'\n },\n {\n type: 'upload',\n field: 'upload',\n label: '上传',\n value: 'http://qupinapptest.oss-cn-beijing.aliyuncs.com/1/202002/d81d3c9dc7c3df7590d333f783a97995.jpeg',\n props: {}\n },\n {\n type: 'upload',\n field: 'upload_multiple',\n label: '上传多张',\n props: {\n limit: 3\n }\n },\n {\n type: 'transfer',\n field: 'transfer',\n label: '穿梭框',\n options: [\n { value: 1, label: '备选项1' },\n { value: 2, label: '备选项2' },\n { value: 3, label: '备选项3' }\n ],\n value: []\n },\n {\n type: 'color',\n field: 'color',\n label: '颜色'\n },\n {\n type: 'rate',\n field: 'rate',\n label: '评分',\n value: 3\n },\n {\n type: 'sub-form',\n field: 'sub_form',\n label: '多项子表单',\n props: {\n repeat: true,\n formItems: [\n {\n type: 'input',\n field: 'sub_input',\n label: '输入框',\n rules: [\n {\n required: true,\n message: '子表单的校验将在上层表单校验通过后执行'\n }\n ],\n info: 'input 输入框支持 mask',\n props: {\n mask: '99-9999999'\n }\n },\n {\n type: 'input',\n field: 'sub_input_1',\n label: '输入框1'\n }\n ]\n }\n },\n {\n type: 'sub-form',\n field: 'sub_form_not_repeat',\n label: '子表单',\n props: {\n options: {\n inline: true\n },\n formItems: [\n {\n type: 'input',\n field: 'sub_input',\n label: '输入框',\n rules: [\n {\n required: true,\n message: '子表单的校验将在上层表单校验通过后执行'\n }\n ]\n },\n {\n type: 'input',\n field: 'sub_input_1',\n label: '输入框1'\n }\n ]\n }\n },\n {\n type: 'icon-select',\n field: 'icon',\n label: '图标'\n },\n {\n type: 'json',\n field: 'json',\n label: 'json',\n value: '{\"a\":1}'\n },\n {\n type: 'rule',\n field: 'rule',\n label: 'rule',\n value: [],\n props: {\n factorOptions: [{ label: 'A', value: 'A' }, { label: 'B', value: 'B' }, { label: 'C', value: 'C' }],\n symbolOptions: [{ label: '大于', value: '>' }, { label: '等于', value: '=' }, { label: '小于', value: '<' }]\n }\n },\n {\n type: 'template',\n field: 'p3',\n label: '自定义',\n comp: {\n inject: ['formData'],\n template: '<div>{{ msg }}<br/>当前的表单数据是:<pre>{{JSON.stringify(formData, null, 2)}}</pre><el-button @click=\"onclick\">click</el-button></div>',\n data: {\n msg: 'this is custom data'\n },\n methods: {\n onclick: '() => { console.log(this)}'\n }\n },\n info: '在通用表单控件无法满足需求时, 可以编写 `template` 模板组件'\n }\n ]\n}\n\nconst buttons = [\n {\n type: 'jump',\n text: '跳转',\n target: 'http://github.com/daodao97'\n },\n {\n type: 'api',\n text: '请求接口',\n target: '/test_api',\n extra: {\n method: 'POST',\n url: '/test_api'\n },\n props: {\n type: 'warning'\n }\n },\n {\n type: 'table',\n text: '表格',\n extra: {\n infoApi: '/student/list_info',\n listApi: '/student/list'\n },\n props: {\n type: 'info'\n }\n },\n [\n {\n type: 'jump',\n text: '跳转',\n target: 'http://github.com/daodao97'\n },\n {\n type: 'api',\n text: '请求接口',\n extra: {\n method: 'POST',\n url: '/test_api'\n }\n }\n ],\n {\n type: 'form',\n text: '表单',\n extra: {\n infoApi: '/form',\n saveApi: '/save'\n },\n props: {\n type: 'success'\n }\n }\n]\n\nconst table = {\n exportAble: true,\n filter: [\n {\n field: 'name',\n type: 'input',\n label: '姓名'\n },\n {\n field: 'sex',\n type: 'select',\n label: '性别',\n options: [\n { value: 1, label: '男' },\n { value: 0, label: '女' }\n ]\n }\n ],\n headers: [\n {\n field: 'name',\n label: '姓名',\n info: '表头提示'\n },\n {\n field: 'sex',\n type: 'enum',\n label: '性别',\n options: [\n { value: 1, label: '男' },\n { value: 0, label: '女' }\n ],\n state: {\n 1: 'info',\n 0: 'warning'\n },\n props: {\n sortable: true\n }\n },\n {\n field: 'github',\n type: 'link',\n label: '主页'\n },\n {\n field: 'html',\n type: 'html',\n label: 'HTML'\n },\n {\n field: 'image',\n type: 'image',\n label: '头像'\n },\n {\n field: 'json',\n type: 'json',\n label: '信息'\n },\n {\n field: 'richText',\n type: 'rich-text',\n label: '信息'\n }\n ],\n batchButton: buttons,\n rowButton: [\n {\n type: 'jump',\n text: '编辑',\n target: '/user/{id}'\n },\n {\n type: 'form',\n extra: {\n infoApi: '/user/{id}',\n saveApi: '/user/{id}'\n },\n props: {\n icon: 'el-icon-edit',\n type: 'success'\n }\n },\n {\n type: 'api',\n extra: {\n method: 'POST',\n url: '/student/{id}'\n },\n props: {\n icon: 'el-icon-delete',\n type: 'danger'\n }\n }\n ],\n normalButton: [\n ..._.cloneDeep(buttons),\n {\n type: 'jump',\n target: '/user/form',\n props: {\n icon: 'el-icon-plus',\n type: 'primary'\n }\n }\n ],\n selectedNotice: '当前共勾选: {selectedCount} 条',\n listApi: '/user/list'\n}\n\nconst listMock = {\n code: 0,\n data: {\n 'list|0-100': [\n {\n 'id|0-1000': 1,\n name: '@cname',\n 'sex|0-1': 1,\n 'score|0-100': 60,\n link: 'http://github.com/daodao97',\n image: 'http://qupinapptest.oss-cn-beijing.aliyuncs.com/1/202002/d81d3c9dc7c3df7590d333f783a97995.jpeg',\n html: '<S>显示删除线1</S>',\n json: { slogan: '左手代码右手诗' },\n richText: '在一段文本中<突出|black|yellow>显示某些<文字|#ffffff|#000000>'\n }\n ],\n page: {\n 'count|1-10': 2,\n 'page|1-5': 2\n }\n }\n}\n\nconst layoutForm = {\n afterSubmit: '',\n afterReset: 'goback',\n formItems: [\n {\n type: 'input',\n label: 'span12-1',\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n label: 'span12-1',\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n label: 'span6-1',\n col: {\n span: 6\n }\n },\n {\n type: 'input',\n label: 'span6-1',\n col: {\n span: 6\n }\n },\n {\n type: 'input',\n label: 'span'\n }\n ]\n}\n\nconst layoutSection = {\n afterSubmit: '',\n afterReset: '',\n formItems: [\n {\n type: 'input',\n label: 'span12-1',\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n label: 'span12-1',\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n label: 'span6-1',\n section: '表单片段1',\n col: {\n span: 6\n }\n },\n {\n type: 'input',\n label: 'span6-1',\n col: {\n span: 6\n }\n },\n {\n section: '表单片段2',\n type: 'input',\n label: 'span'\n }\n ]\n}\n\nexport default { form, table, listMock, layoutForm, layoutSection }\n\n","import { MockApi, MockHttpMethod, MockOption } from '../types'\nimport menu from '../data/menu'\nimport role from '../data/role'\nimport example from '../data/example'\n\nconst userApis: MockApi[] = [\n {\n method: MockHttpMethod.POST,\n url: '/login',\n response(options: MockOption) {\n return {\n code: 0,\n data: {\n name: 'daodao97',\n token: 'xxxxxxx'\n }\n }\n }\n },\n {\n method: MockHttpMethod.GET,\n url: '/user/info',\n response(options: MockOption) {\n return {\n code: 0,\n data: {\n role_ids: [1],\n resource: [[0, 20, 'formItems', 'radio'], [0, 1, 2]]\n }\n }\n }\n },\n {\n url: '/user/routes',\n method: MockHttpMethod.GET,\n response: (options: MockOption) => {\n return {\n code: 0,\n data: [\n {\n id: 0,\n label: '',\n routes: []\n }\n ]\n }\n }\n },\n {\n url: '/user/list',\n method: MockHttpMethod.GET,\n response: (options: MockOption) => {\n return example.listMock\n }\n }\n]\n\nexport default userApis\n","import user from './user'\nimport { MockApi } from '../types'\n\nconst apis: MockApi[] = [\n ...user\n]\n\nexport default apis\n","import Mock from 'mockjs'\nimport { MockApi, MockApiMap } from './types'\nimport apis from './apis'\nimport { logGroup, queryParams } from '@okiss/utils'\nimport { defaultOptions } from '../default'\n\nconst uniqueApis: MockApiMap = {}\n\nexport function regMockApis(apis: MockApi[]) {\n apis.forEach(item => {\n const key = realUrl(item)\n uniqueApis[`${item.method}::${key}`] = item\n })\n}\n\nregMockApis(apis)\n\nfunction realUrl(api: MockApi) {\n let url = api.url\n let baseUrl = api.baseURL || defaultOptions.axios?.baseURL\n if (!baseUrl) {\n baseUrl = ''\n }\n if (typeof url === 'string') {\n url = ('/' + baseUrl + url).split('/').filter(v => v).join('/')\n url += '(|\\\\?.*)$'\n return new RegExp(url)\n }\n return url\n}\n\nexport function startMock() {\n Object.keys(uniqueApis).forEach(k => {\n const api = uniqueApis[k]\n const url = realUrl(api)\n Mock.mock(url, api.method, function(options: { url: string, body: any, type: string }) {\n const { url, type, body } = options\n const query = queryParams(url)\n const data = body ? JSON.parse(body) : {}\n const mock = api.response({ query, data })\n const response = Mock.mock(mock)\n logGroup(url, { type, query, data, response })\n return Mock.mock(response)\n })\n })\n console.log(`%c ApiMock is stared! `, 'background: #606060; color: #fff; padding: 4px 5px; border-radius: 1px;')\n}\n","import ElementPlus, { ElMessage, ElMessageBox } from 'element-plus'\nimport '../styles/element/index.scss'\nimport 'element-plus/theme-chalk/src/index.scss'\nimport 'element-plus/theme-chalk/src/dark/css-vars.scss'\nimport 'dayjs/locale/zh-cn'\n\nexport const Message = ElMessage\nexport const MessageBox = ElMessageBox\n\nexport default ElementPlus\n","import { InterceptorUse } from './types'\nimport axios, { AxiosError, AxiosInstance, AxiosResponse, Canceler, AxiosRequestConfig } from 'axios'\n// @ts-ignore\nimport qs from 'qs'\n\nconst CancelToken = axios.CancelToken\n\nconst task = {\n taskList: {} as Record<string, any>,\n cacheList: new Map(),\n uniqueId(config: AxiosRequestConfig) {\n return `${location.href}|${config.method}|${config.url}|`\n // + qs.stringify(config.params)\n },\n addTask(config: AxiosRequestConfig, cancelfun: Canceler) {\n const key = this.uniqueId(config)\n this.taskList[key] = cancelfun\n },\n delTask(config: AxiosRequestConfig) {\n const key = this.uniqueId(config)\n const c = this.taskList[key]\n c && c(config)\n },\n pending(config: AxiosRequestConfig) {\n const key = this.uniqueId(config)\n return !!this.taskList[key]\n },\n cache(config: AxiosRequestConfig) {\n const key = this.uniqueId(config)\n const c = this.cacheList.get(key)\n if (!c) {\n return undefined\n }\n if (c.expirationTime < (new Date()).getTime()) {\n this.delCache(config)\n return undefined\n }\n console.log('getcache', key, c.response)\n return c.response\n },\n addCache(config: AxiosRequestConfig, response: any) {\n const key = this.uniqueId(config)\n const cacheTime = config.cacheTime || 0\n if (cacheTime) {\n this.cacheList.set(key, { response, expirationTime: (new Date()).getTime() + cacheTime })\n }\n },\n delCache(config: AxiosRequestConfig) {\n const key = this.uniqueId(config)\n return this.cacheList.delete(key)\n }\n}\n\nexport const cacheAdapter: (config: AxiosRequestConfig, instance: AxiosInstance) => Promise<any> = (config: AxiosRequestConfig, instance: AxiosInstance) => {\n return new Promise((resolve, reject) => {\n if (config.method !== 'get') {\n delete config.adapter\n resolve(instance(config))\n return\n }\n const cache = task.cache(config)\n if (!cache) {\n delete config.adapter\n resolve(instance(config))\n return\n }\n resolve({ data: cache, config: config })\n })\n}\n\nexport const cancelRequestInterceptor: InterceptorUse<AxiosRequestConfig, AxiosError> = {\n onFulfilled: function(config: AxiosRequestConfig) {\n if (config.cacheEnable === false) {\n return config\n }\n if (task.pending(config)) {\n task.delTask(config)\n }\n config.cancelToken = new CancelToken((cancel) => {\n task.addTask(config, cancel)\n })\n return config\n },\n onRejected(error: AxiosError) {\n return Promise.reject(error)\n }\n}\n\nexport const cancelResponseInterceptor: InterceptorUse<AxiosResponse, AxiosError> = {\n onFulfilled: function(response: AxiosResponse) {\n // @ts-ignore\n if (response.config.cacheEnable === false) {\n return response\n }\n if (response.config.method === 'get' && Object.keys(response.data as Record<string, any>).length > 0) {\n task.addCache(response.config, response.data)\n }\n return response\n },\n onRejected(error: AxiosError) {\n return Promise.reject(error)\n }\n}\n","import { Router } from 'vue-router'\nimport NProgress from 'nprogress'\nimport 'nprogress/nprogress.css'\nimport { pinia, useUserStore } from '../../store'\n\nNProgress.configure({ showSpinner: false })\n\nexport default function(router: Router) {\n router.beforeEach((to, from, next) => {\n NProgress.start()\n to.preHash = location.hash.replace('#', '')\n next()\n })\n router.afterEach((to) => {\n const user = useUserStore(pinia)\n if (to.matched.length > 0) {\n user.updateState({\n key: 'path',\n value: to.matched[to.matched.length - 1].path.replace('(\\\\d+)', '')\n })\n }\n NProgress.done()\n })\n}\n","import { pinia, useUserStore, useSettingsStore } from '../../store'\n\nexport function isLodeRemoteRoutes(): boolean {\n return useUserStore(pinia).isLodeRemoteRoutes\n}\n\nexport function getWhiteRoutes(): Array<string | RegExp> {\n return useSettingsStore(pinia).whiteRoutes || []\n}\n\nexport function getToken() {\n return useUserStore(pinia).token\n}\n","import { NavigationGuardNext } from 'vue-router'\nimport type { LoginTicket } from '@/types'\n\nexport type SsoType = 'jump' | 'qrcode'\n\nexport interface Sso {\n flag(): LoginTicket | undefined,\n\n type: SsoType,\n\n jumpToLoginPage(next: NavigationGuardNext, path: string): void,\n\n showQrCode(): void\n\n qrCodeUrl?: string,\n appid?: string,\n style?: string,\n redirectUri?: string,\n elId?: string\n}\n\nexport class BaseSso implements Sso {\n type: SsoType = 'qrcode'\n\n flag(): LoginTicket | undefined {\n return undefined\n }\n\n jumpToLoginPage(next: NavigationGuardNext, path: string): void {\n next(path)\n }\n\n showQrCode(): void {\n }\n}\n","import { NavigationGuardNext } from 'vue-router'\nimport { BaseSso, SsoType } from './index'\nimport { getQueryParam } from '@okiss/utils'\nimport type { LoginTicket } from '@/types'\n\nexport class Github extends BaseSso {\n type: SsoType = 'jump'\n\n client_id: string = ''\n\n constructor(options: Record<string, any>) {\n super()\n this.client_id = options.client_id\n }\n\n flag(): LoginTicket | undefined {\n const code = getQueryParam('code')\n if (code) {\n return {\n ticket: code,\n key: 'github'\n }\n }\n return undefined\n }\n\n jumpToLoginPage(next: NavigationGuardNext, path: string) {\n const redirect = encodeURIComponent(location.href)\n location.replace(`https://github.com/login/oauth/authorize?client_id=${this.client_id}&redirect_uri${redirect}`)\n }\n}\n","import { getQueryParam, obj2Param, strVarReplace, createIFrame } from '@okiss/utils'\nimport { BaseSso, SsoType } from './index'\nimport type { LoginTicket } from '@/types'\n\nexport class DingTalk extends BaseSso {\n type: SsoType = 'qrcode'\n qrCodeUrl = 'https://login.dingtalk.com/login/qrcode.htm?goto={goto}&style={style}'\n reloadUrl = 'https://oapi.dingtalk.com/connect/oauth2/sns_authorize?response_type=code&scope=snsapi_login&state=&appid={appid}&redirect_uri={redirect_uri}'\n\n elId: string = ''\n appid: string = ''\n iframe: HTMLIFrameElement = new HTMLIFrameElement()\n redirectUri: string = ''\n style: string = ''\n\n constructor(options: Record<string, any>) {\n super()\n }\n\n flag(): LoginTicket | undefined {\n const code = getQueryParam('code')\n if (code) {\n return {\n ticket: code,\n key: 'dingtalk'\n }\n }\n return undefined\n }\n\n showQrCode(): void {\n const getReloadUrl = (extra?: Record<string, any>) => {\n const data = {\n appid: this.appid,\n redirect_uri: encodeURIComponent(this.redirectUri)\n }\n return strVarReplace(this.reloadUrl, data) + '&' + obj2Param(extra || {})\n }\n const getQrCodeUrl = () => {\n const data = {\n goto: encodeURIComponent(getReloadUrl()),\n style: encodeURIComponent(this.style)\n }\n return strVarReplace(this.qrCodeUrl, data)\n }\n const onScanSuccess = (event: any) => {\n const { origin, data } = event\n if (origin === 'https://login.dingtalk.com') {\n window.location.href = getReloadUrl({ loginTmpCode: data })\n }\n }\n\n this.iframe.src = getQrCodeUrl()\n createIFrame({ elId: this.elId, attrs: this.iframe })\n if (typeof window.addEventListener !== 'undefined') {\n window.addEventListener(\n 'message',\n event => onScanSuccess(event),\n false\n )\n // @ts-ignore\n } else if (typeof window.attachEvent !== 'undefined') {\n // @ts-ignore\n window.attachEvent('onmessage', event => this.onScanSuccess(event))\n }\n }\n}\n","import { BaseSso } from './base'\nimport type { SsoType, Sso } from './base'\nimport { Github } from './github'\nimport { DingTalk } from './dingtalk'\nimport { pinia, useSettingsStore } from '../../store'\nimport { newSso } from '../../types'\nimport { merge } from 'lodash'\n\nexport { BaseSso, SsoType, Sso, Github, DingTalk }\n\nconst defaultSso: Record<string, newSso> = {}\n\nexport function allSso(): Record<string, newSso> {\n return merge(useSettingsStore(pinia).sso || {}, defaultSso)\n}\n\nexport default function(): Sso | undefined {\n const sso = allSso()\n const key = useSettingsStore(pinia).activeSsoKey || ''\n console.log(sso, key)\n const active = sso[key]\n if (active !== undefined) {\n return active()\n }\n return undefined\n}\n","import { Router } from 'vue-router'\nimport { pinia, useUserStore } from '../../store'\nimport { getToken, getWhiteRoutes } from './func'\nimport sso from '../../utils/sso'\nimport { isObject } from 'lodash'\n\nexport default function(router: Router) {\n router.beforeEach(async(to, form, next) => {\n if (getWhiteRoutes().indexOf(to.path) !== -1) {\n next()\n return\n }\n\n const token = getToken()\n if (token) {\n if (to.query?.redirect) {\n next(to.query?.redirect as string)\n } else {\n next()\n }\n return\n }\n const redirect = to.query.redirect || to.path\n\n const s = sso()\n if (!s) {\n next(`/login?redirect=${redirect}`)\n return\n }\n\n const flag = s.flag()\n const user = useUserStore(pinia)\n if (flag && await user.login(isObject(flag) ? flag : { ticket: flag })) {\n next()\n return\n }\n s.jumpToLoginPage(next, `/login?redirect=${redirect}`)\n })\n}\n","import type { AxiosRequestConfig } from 'axios'\nimport type { RouteRecordRaw, Router } from 'vue-router'\nimport { Component, Directive, Plugin } from 'vue'\nimport { MockApi } from './mock/types'\nimport { Sso } from './utils/sso'\n\nexport interface Nav {\n}\n\nexport type newSso = () => Sso\n\nexport interface Settings {\n title?: string,\n fixedHeader?: boolean,\n sidebarLogo?: boolean,\n logo?: string,\n closeNavNotice?: boolean,\n navBarNotice?: string,\n hasNewMessage?: boolean,\n showPageJsonSchema?: boolean,\n loginTips?: string,\n sso?: Record<string, newSso>,\n activeSsoKey?: string,\n ElementPlus?: Object,\n nav?: Nav[],\n whiteRoutes?: Array<string | RegExp>,\n tokenExpire?: number,\n defaultAvatar?: string,\n envColor?: Record<string, string>,\n serviceOffLineNotice?: string,\n formMutex?: boolean\n captcha?: boolean\n themeMode?: 'light' | 'dark'\n}\n\nexport type UsePlugin = Plugin | [Plugin, any]\n\nexport interface OmsPlugin {\n use?: UsePlugin[],\n components?: Record<string, Component>,\n directives?: Record<string, Directive>,\n mockApis?: MockApi[],\n routes?: RouteRecordRaw[],\n // Pinia does not support dynamic registration like Vuex modules;\n // this field is deprecated and ignored in Pinia migration.\n // Kept for backward compatibility with type 'any'.\n storeModules?: Record<string, any>\n}\n\nexport interface OmsOptions {\n axios?: AxiosRequestConfig,\n settings?: Settings,\n plugins?: OmsPlugin[],\n mock?: boolean,\n form?: FormOptions,\n router?: Router\n}\n\nexport interface FormOptions {\n vsPath: string\n}\n\nexport interface LoginForm {\n username: string,\n password: string\n}\n\nexport interface LoginTicket {\n ticket: string,\n key: string\n}\n\nexport type ResourceIds = Array<Array<string>>\n\nexport interface UserInfo {\n id: number,\n name: string,\n token: string,\n avatar: string,\n nickname: string,\n role_ids: Array<string>,\n resource: ResourceIds\n env: string,\n website?: any\n}\n\nexport type Resource = Record<string, boolean | Record<string, boolean>>\n\n// eslint-disable-next-line no-unused-vars\nexport enum PageType { custom, list, form, customSchema, localComp, tree, report, entity }\n// eslint-disable-next-line no-unused-vars\nexport enum MenuType { hidden = 0, dir = 1, menu = 2, page = 3 }\n\nexport interface PageInfo {\n module_id: number,\n module_name?: string\n id: number,\n pid: number,\n name: string,\n path: string,\n icon?: string,\n view?: string,\n is_show: number,\n type: number,\n page_type: PageType,\n role?: string,\n children?: PageInfo[],\n code: string\n}\n\nexport interface RemoteModule {\n id: number,\n label: string,\n routes: PageInfo[]\n}\n\nexport interface OmsModule {\n id: number,\n label: string,\n routes: RouteRecordRaw[]\n}\n\nexport interface ImportMetaEnv {\n VITE_BASE_API?: string\n VITE_BASE?: string\n}\n","<template>\n <div class=\"loading preloader\">\n <div class=\"preloader-inner\" />\n </div>\n</template>\n<style>\n.loading {\n width: 100%;\n min-height: calc(100vh - 50px);\n text-align: center;\n line-height: calc(100vh - 50px);\n}\n</style>\n","<template>\n <div>\n <el-alert\n v-if=\"hasNotice\"\n v-bind=\"noticeProps\"\n />\n </div>\n</template>\n\n<script>\nexport default {\n name: 'VNotice',\n props: {\n dataApi: {\n type: String,\n default: ''\n },\n notice: {\n type: Object,\n default: () => {}\n }\n },\n data() {\n return {\n noticeProps: {},\n hasNotice: false\n }\n },\n mounted() {\n console.log('dataApi', !!this.$props.dataApi)\n if (this.$props.dataApi) {\n this.$http.get(this.$props.dataApi).then(({ data }) => {\n this.noticeProps = data\n this.hasNotice = !!data\n })\n return\n } else {\n this.hasNotice = Object.keys(this.$props.notice).length > 0\n this.noticeProps = this.$props.notice\n }\n }\n}\n</script>\n","<template>\n <el-alert\n v-if=\"owners.length > 0\"\n :title=\"`该页面功能对应开发: [ ${owners.join(', ')} ] 有问题可直接企微反馈`\"\n type=\"info\"\n style=\"margin: 0 0 20px 0\"\n :closable=\"false\"\n />\n <template v-if=\"env === 'prod' && serviceOffLine\">\n <div\n class=\"offline-notice\"\n v-html=\"serviceOffLine === true ? setting.serviceOffLineNotice : serviceOffLine\"\n />\n </template>\n <template v-else>\n <VNotice\n v-if=\"haveNotice\"\n :notice=\"notice\"\n style=\"margin: 0 0 20px 0\"\n :data-api=\"noticeApi\"\n />\n <VLoading v-if=\"loading\" />\n <template v-else>\n <slot v-bind=\"schema\" />\n </template>\n </template>\n\n</template>\n<script lang=\"ts\" setup>\nimport VLoading from './VLoading.vue'\nimport { isObject, isString, isArray } from '@okiss/utils'\nimport VNotice from './notice/VNotice.vue'\nimport { useAppStore, useSettingsStore, useUserStore } from '../store'\nimport { useRoute } from 'vue-router'\n\nconst props = withDefaults(defineProps<{ schemaHandler?: (val: any, project: string) => any, schemaApi?: string }>(), {\n schemaHandler: (val: any) => val,\n schemaApi: ''\n})\nconst appStore = useAppStore(); const settingsStore = useSettingsStore(); const userStore = useUserStore()\nconst route = useRoute()\nconst loading = ref(true)\nconst haveNotice = ref(false)\nconst notice = ref<any>({})\nconst noticeApi = ref('')\nconst schema = ref<any>({})\nconst owners = ref<string[]>([])\nconst serviceOffLine = ref<boolean | string>(false)\n\nconst env = computed(() => userStore.env)\nconst setting = computed(() => settingsStore)\n\nonBeforeMount(() => {\n const token = route.path.split('/').filter(item => item)\n const project = token.length > 1 ? token.slice(0, token.length - 1).join('/') : token[0]\n const api = '/schema' + (route.meta as any).path\n const conf = { params: route.params }\n // @ts-ignore\n const http = window?.App?.config?.globalProperties?.$http\n http.get(props.schemaApi || api, conf).then(({ data }) => {\n loading.value = false\n if (isObject(data)) {\n if (data.notice !== undefined) {\n haveNotice.value = true\n if (isString(data.notice)) {\n notice.value = { title: data.notice }\n } else if (isObject(data.notice)) {\n notice.value = data.notice\n // @ts-ignore\n noticeApi.value = data.notice.noticeApi\n }\n delete data['notice']\n }\n owners.value = data.ownerNames || []\n serviceOffLine.value = data.serviceOffLine || false\n }\n schema.value = props.schemaHandler(data, project)\n appStore.SET_PAGE_JSON_SCHEMA({ page: route.path, json: schema.value })\n })\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.offline-notice {\n text-align: center;\n color: red;\n font-size: 250%;\n height: 300px;\n line-height: 300px;\n}\n</style>\n","<template>\n <el-alert\n v-if=\"owners.length > 0\"\n :title=\"`该页面功能对应开发: [ ${owners.join(', ')} ] 有问题可直接企微反馈`\"\n type=\"info\"\n style=\"margin: 0 0 20px 0\"\n :closable=\"false\"\n />\n <template v-if=\"env === 'prod' && serviceOffLine\">\n <div\n class=\"offline-notice\"\n v-html=\"serviceOffLine === true ? setting.serviceOffLineNotice : serviceOffLine\"\n />\n </template>\n <template v-else>\n <VNotice\n v-if=\"haveNotice\"\n :notice=\"notice\"\n style=\"margin: 0 0 20px 0\"\n :data-api=\"noticeApi\"\n />\n <VLoading v-if=\"loading\" />\n <template v-else>\n <slot v-bind=\"schema\" />\n </template>\n </template>\n\n</template>\n<script lang=\"ts\" setup>\nimport VLoading from './VLoading.vue'\nimport { isObject, isString, isArray } from '@okiss/utils'\nimport VNotice from './notice/VNotice.vue'\nimport { useAppStore, useSettingsStore, useUserStore } from '../store'\nimport { useRoute } from 'vue-router'\n\nconst props = withDefaults(defineProps<{ schemaHandler?: (val: any, project: string) => any, schemaApi?: string }>(), {\n schemaHandler: (val: any) => val,\n schemaApi: ''\n})\nconst appStore = useAppStore(); const settingsStore = useSettingsStore(); const userStore = useUserStore()\nconst route = useRoute()\nconst loading = ref(true)\nconst haveNotice = ref(false)\nconst notice = ref<any>({})\nconst noticeApi = ref('')\nconst schema = ref<any>({})\nconst owners = ref<string[]>([])\nconst serviceOffLine = ref<boolean | string>(false)\n\nconst env = computed(() => userStore.env)\nconst setting = computed(() => settingsStore)\n\nonBeforeMount(() => {\n const token = route.path.split('/').filter(item => item)\n const project = token.length > 1 ? token.slice(0, token.length - 1).join('/') : token[0]\n const api = '/schema' + (route.meta as any).path\n const conf = { params: route.params }\n // @ts-ignore\n const http = window?.App?.config?.globalProperties?.$http\n http.get(props.schemaApi || api, conf).then(({ data }) => {\n loading.value = false\n if (isObject(data)) {\n if (data.notice !== undefined) {\n haveNotice.value = true\n if (isString(data.notice)) {\n notice.value = { title: data.notice }\n } else if (isObject(data.notice)) {\n notice.value = data.notice\n // @ts-ignore\n noticeApi.value = data.notice.noticeApi\n }\n delete data['notice']\n }\n owners.value = data.ownerNames || []\n serviceOffLine.value = data.serviceOffLine || false\n }\n schema.value = props.schemaHandler(data, project)\n appStore.SET_PAGE_JSON_SCHEMA({ page: route.path, json: schema.value })\n })\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.offline-notice {\n text-align: center;\n color: red;\n font-size: 250%;\n height: 300px;\n line-height: 300px;\n}\n</style>\n","<template>\n <PageLoad :schema-handler=\"schemaHandler\">\n <template #default=\"slotProps\">\n <VTable v-bind=\"slotProps\" />\n </template>\n </PageLoad>\n</template>\n<script setup name=\"ScaffoldName\">\nimport { VTable } from '@okiss/vbtf'\nimport PageLoad from '../components/PageLoad.vue'\nimport { merge } from 'lodash'\n\nconst schemaHandler = (schema, project) => {\n if (schema.orderBy) {\n const defaultSort = {\n prop: schema.orderBy.field,\n order: schema.orderBy.mod === 'desc' ? 'descending' : 'ascending'\n }\n schema.tableProps = merge(schema.tableProps, { defaultSort })\n }\n const allowedProps = Object.keys(VTable.props)\n Object.keys(schema).forEach(key => {\n if (allowedProps.indexOf(key) === -1) {\n delete schema[key]\n }\n })\n if (schema.listApi === undefined) {\n schema.listApi = `/${project}/list`\n }\n\n return schema\n}\n</script>\n","<template>\n <PageLoad :schema-handler=\"schemaHandler\">\n <template #default=\"slotProps\">\n <VForm v-bind=\"slotProps\" />\n </template>\n </PageLoad>\n</template>\n<script setup name=\"ScaffoldForm\">\nimport { VForm } from '@okiss/vbtf'\nimport PageLoad from '../components/PageLoad.vue'\nimport { strVarReplace } from '@okiss/utils'\nimport { merge } from 'lodash'\nimport { useRoute, useRouter } from 'vue-router'\nimport { onMounted, onUnmounted } from 'vue'\nimport http from '../utils/request'\nimport { ElMessageBox } from 'element-plus'\nimport { useSettingsStore } from '../store'\n\nconst route = useRoute()\nconst router = useRouter()\n\nconst schemaHandler = (schema, project) => {\n const allowedProps = Object.keys(VForm.props)\n Object.keys(schema).forEach(key => {\n if (allowedProps.indexOf(key) === -1) {\n delete schema[key]\n return\n }\n\n if (/.*Api$/.test(key)) {\n schema[key] = strVarReplace(schema[key], route.params)\n }\n })\n\n if (schema.saveApi === undefined) {\n if (route.params.id !== undefined) {\n schema.saveApi = `/${project}/update/${route.params.id}`\n if (!schema.getApi) {\n schema.getApi = `/${project}/get/${route.params.id}`\n }\n } else {\n delete schema['getApi']\n schema.saveApi = `/${project}/create`\n }\n }\n\n schema = merge({\n saveApi: project + '/save',\n afterSubmit: 'goback',\n afterReset: 'goback',\n mod: route.params.id ? 'edit' : 'create'\n }, schema)\n\n return schema\n}\n\nconst mutexId = ref(0)\nconst mutex = () => {\n http.request({\n url: '/form_mutex',\n method: 'get',\n params: {\n path: route.fullPath\n }\n }).then(res => {\n console.log(res)\n if (res.data) {\n clearInterval(mutexId.value)\n ElMessageBox.alert(`${res.data}`, '操作提醒', {\n showClose: false,\n showCancelButton: true,\n confirmButtonText: '返回',\n cancelButtonText: '刷新',\n callback: (action) => {\n if (action === 'cancel') {\n location.reload()\n } else {\n goBack()\n }\n }\n })\n }\n })\n}\n\nonMounted(() => {\n const settings = useSettingsStore()\n if (route.params.id !== undefined && settings.formMutex) {\n mutex()\n mutexId.value = setInterval(mutex, 2000)\n }\n})\nonUnmounted(() => {\n clearInterval(mutexId.value)\n})\n\nfunction goBack() {\n if (route.query?.goback) {\n router.push(route.query?.goback)\n } else {\n history.state.back && history.back()\n }\n}\n</script>\n","<template>\n <el-row\n class=\"tree-box\"\n :gutter=\"20\"\n >\n <el-col\n :span=\"8\"\n class=\"tree-tree\"\n >\n <el-card shadow=\"never\">\n <template #header>\n <div class=\"card-header\">\n <span>列表</span>\n <el-button\n type=\"text\"\n @click=\"() => appendNew()\"\n >添加</el-button>\n </div>\n </template>\n <el-tree\n v-if=\"(treeData || []).length > 0\"\n style=\"height: 100vh\"\n :data=\"treeData\"\n node-key=\"id\"\n v-bind=\"localTreeProps\"\n draggable\n :allow-drag=\"allowDrap\"\n :allow-drop=\"allowDrop\"\n @node-drag-end=\"handleDragEnd\"\n >\n <template #default=\"{ node, data }\">\n <span class=\"tree-action\">\n <span v-if=\"data[localTreeProps.props.label]\">{{ data[localTreeProps.props.label] }}</span>\n <span\n v-else\n style=\"color: #E6A23C\"\n >请在右侧表单中修改 --> </span>\n <span>\n <el-button\n v-if=\"data[localTreeProps.props.label]\"\n class=\"button\"\n type=\"text\"\n @click=\"() => onclick(data)\"\n >编辑</el-button>\n <el-button\n v-if=\"canAppend(data, node)\"\n class=\"button\"\n type=\"text\"\n @click=\"() => append(data, node)\"\n >添加</el-button>\n <el-button\n v-if=\"data.children === undefined || data.children.length === 0\"\n class=\"button\"\n type=\"text\"\n @click=\"() => remove(data)\"\n >删除</el-button>\n </span>\n </span>\n </template>\n </el-tree>\n </el-card>\n </el-col>\n <el-col\n :span=\"16\"\n class=\"tree-form\"\n >\n <el-card\n v-if=\"type\"\n shadow=\"never\"\n >\n <template #header>\n <div class=\"card-header\">\n <span>{{ formType }}</span>\n </div>\n </template>\n <v-form\n :key=\"formkey\"\n v-model=\"formData\"\n v-bind=\"formProps\"\n @submit=\"submit\"\n />\n </el-card>\n </el-col>\n </el-row>\n</template>\n<script lang=\"js\">\nimport { VForm } from '@okiss/vbtf'\nimport { strVarReplace, effectDataTrans } from '@okiss/utils'\nimport { merge } from 'lodash'\n\nexport default defineComponent({\n name: 'VTree',\n components: {\n VForm\n },\n props: {\n treeApi: {\n type: String,\n default: '',\n require: true\n },\n getApi: {\n type: String,\n default: '',\n require: true\n },\n saveApi: {\n type: String,\n default: '',\n require: true\n },\n createApi: {\n type: String,\n default: '',\n require: true\n },\n deleteApi: {\n type: String,\n default: '',\n require: true\n },\n formItems: {\n type: Array,\n default: () => {\n return []\n }\n },\n treeProps: {\n type: Object,\n default: () => {}\n },\n maxDepth: {\n type: Number,\n default: 3\n },\n props: {\n type: Object,\n default: () => {}\n }\n },\n data() {\n return {\n type: 0, // 1 新增, 2 编辑\n treeData: [],\n formData: {},\n localTreeProps: merge({\n 'default-expand-all': true,\n 'expand-on-click-node': false,\n props: {\n children: 'children',\n label: 'label'\n }\n }, this.$props.treeProps),\n formkey: 0,\n tablekey: 0,\n menuOptions: {}\n }\n },\n computed: {\n formType() {\n const m = ['', '新建', '编辑']\n return m[this.type]\n },\n formProps() {\n let saveApi = strVarReplace(this.$props.saveApi, this.formData)\n if (this.type === 1) {\n saveApi = this.$props.createApi\n }\n return {\n saveApi: saveApi,\n getApi: this.$props.getApi,\n formItems: this.$props.formItems\n }\n }\n },\n created() {\n this.loadTree()\n },\n methods: {\n loadTree() {\n this.$http.request({\n method: 'GET',\n url: this.$props.treeApi\n }).then(({ data }) => {\n this.treeData = data\n })\n },\n onclick(data) {\n this.type = 2\n this.formData = data\n this.formkey++\n },\n append(data, node) {\n this.type = 1\n\n const newChild = { pid: data.id, [this.$props.props?.levelKey ?? 'level']: node.level + 1, ...effectDataTrans(this.$props.props?.effectData, data) }\n console.log(111, newChild)\n if (!data.children) {\n data.children = []\n }\n this.formData = newChild\n this.formkey++\n data.children.push(newChild)\n this.treeData = [...this.treeData]\n },\n canAppend(data, node) {\n if (!data[this.localTreeProps.props.label]) {\n return false\n }\n return node.level < this.$props.maxDepth\n },\n appendNew() {\n this.type = 1\n const newChild = { pid: 0, [this.$props.props?.levelKey ?? 'level']: 1 }\n this.formData = newChild\n this.formkey++\n this.tablekey++\n this.treeData = [...this.treeData, newChild]\n },\n remove(data) {\n this.$http.request({\n method: 'DELETE',\n url: strVarReplace(this.$props.deleteApi, data)\n }).then(({ code }) => {\n if (code !== 0) {\n this.$message.error('操作失败')\n } else {\n this.loadTree()\n }\n })\n },\n submit() {\n setTimeout(() => {\n this.loadTree()\n this.formData = {}\n this.tablekey++\n this.type = 0\n }, 200)\n },\n allowDrap(draggingNode) {\n return true\n },\n allowDrop(draggingNode, dropNode, type) {\n console.log(type)\n return type === 'inner'\n },\n handleDragEnd(draggingNode, dropNode, dropType, ev) {\n const form = draggingNode.data\n form.pid = dropNode.data.id\n this.$http.request({\n method: 'POST',\n url: strVarReplace(this.$props.saveApi, form),\n data: form\n }).then(({ code }) => {\n if (code !== 0) {\n this.$message.error('操作失败')\n }\n })\n }\n }\n})\n</script>\n<style lang=\"scss\">\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.tree-box {\n height: 100%;\n}\n.tree-tree .tree-form {\n height: 100%;\n}\n.tree-action {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n padding-right: 8px;\n}\n\n</style>\n","<template>\n <PageLoad :schema-handler=\"schemaHandler\">\n <template #default=\"slotProps\">\n <VTree v-bind=\"slotProps\" />\n </template>\n </PageLoad>\n</template>\n<script setup>\nimport VTree from '../components/VTree.vue'\nimport PageLoad from '../components/PageLoad.vue'\nconst schemaHandler = (schema, project) => {\n const allowedProps = Object.keys(VTree.props)\n Object.keys(schema).forEach(key => {\n if (allowedProps.indexOf(key) === -1) {\n delete schema[key]\n }\n })\n\n return schema\n}\n</script>\n","<template>\n <router-view />\n</template>\n<script setup>\nimport { onBeforeRouteUpdate } from 'vue-router'\nconst key = ref(0)\nonBeforeRouteUpdate(() => {\n key.value++\n})\n</script>\n","// @ts-nocheck\nimport { cloneDeep, merge } from 'lodash'\nimport { isObject, isString } from '@okiss/utils'\n\nconst pie = {\n title: {\n text: 'Referer of a Website',\n left: 'center'\n },\n tooltip: {\n trigger: 'item',\n formatter: '{b} : {c} ({d}%)'\n },\n legend: {\n orient: 'vertical',\n left: 'bottom'\n },\n series: [\n {\n name: 'Access From',\n type: 'pie',\n radius: '50%',\n data: [\n { value: 1048, name: 'Search Engine' },\n { value: 735, name: 'Direct' },\n { value: 580, name: 'Email' },\n { value: 484, name: 'Union Ads' },\n { value: 300, name: 'Video Ads' }\n ],\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)'\n }\n }\n }\n ]\n}\n\nconst lienOption = {\n title: {\n text: ''\n },\n tooltip: {\n trigger: 'axis'\n },\n grid: {\n left: '2%',\n right: '2%',\n bottom: '5%',\n containLabel: true\n },\n toolbox: {\n feature: {\n saveAsImage: {}\n }\n },\n legend: {\n data: []\n },\n xAxis: {\n type: 'category'\n },\n yAxis: {\n type: 'value'\n },\n series: []\n}\n\nexport function makeOption(id: string, config: Object|string, data: Array<Record<string, any>>) {\n if (data.length === 0) {\n return {}\n }\n let opt = merge({}, lienOption)\n opt.title.text = id\n if (isString(config)) {\n const xAxisData = []\n const keys = Object.keys(data[0])\n let xkey = keys[0]\n let ykeys = keys.filter((v, i) => i > 0)\n let type = config\n if (config.indexOf(':') > -1) {\n const token = config.split(':')\n const _keys = token[1].split(',')\n type = token[0]\n xkey = _keys[0]\n ykeys = _keys.filter((v, i) => i > 0)\n }\n ykeys.forEach(key => {\n const seriesData = []\n data.forEach(each => {\n seriesData.push(each[key])\n })\n opt.series.push({\n name: key,\n type: type,\n smooth: true,\n data: seriesData\n })\n opt.legend.data.push(key)\n })\n\n data.forEach(each => {\n xAxisData.push(each[xkey])\n })\n\n opt.xAxis.data = xAxisData\n }\n\n if (isObject(config)) {\n opt = merge(opt, config)\n }\n // const _pie = cloneDeep(pie)\n // _pie.title.text = id\n // _pie.series[0].data = data\n //\n // return _pie\n console.log(111, opt)\n return opt\n}\n","<template>\n <span\n v-for=\"(each, i) in dataList\"\n :key=\"i\"\n >\n <div class=\"number-panel-title\">\n <div\n v-for=\"(item, index) in Object.keys(each)\"\n :key=\"index\"\n class=\"title-inner\"\n >\n <p class=\"number\">{{ each[item] }}</p>\n <p class=\"name\">{{ item }}</p>\n </div>\n </div>\n </span>\n</template>\n\n<script>\nexport default defineComponent({\n name: 'NumberPanel',\n props: {\n dataList: {\n type: Array,\n default: _ => []\n }\n },\n data() {\n return {\n }\n }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.number-panel-title {\n padding: 20px;\n text-align: center;\n .title-inner {\n display: inline-block;\n width: 20%;\n position: relative;\n text-align: center;\n border-right: 1px solid #e8e8e8;\n &:last-child {\n border: none;\n }\n }\n .el-divider {\n position: absolute;\n right: 0;\n top: 10px;\n }\n .name {\n font-size: 12px;\n color: #666;\n }\n .number {\n font-size: 20px;\n line-height: 30px;\n }\n}\n</style>\n","<template>\n <ElCard\n v-resize=\"true\"\n shadow=\"never\"\n class=\"part\"\n >\n <component\n :is=\"comptype()\"\n v-bind=\"compprops(option)\"\n />\n </ElCard>\n</template>\n<script lang=\"ts\">\nimport { makeOption } from './option'\nimport { VTable, VChart, JsonView } from '@okiss/vbtf'\nimport NumberPanel from './NumberPanel.vue'\n// @ts-ignore\nimport Markdown from 'vue3-markdown-it'\nimport { isArray } from '@okiss/utils'\n\nexport default {\n components: {\n Chart: VChart,\n Md: Markdown,\n Json: JsonView,\n Table: VTable,\n Number: NumberPanel,\n Html: ''\n },\n props: {\n option: {\n type: Object,\n default: () => {}\n }\n },\n setup(props: Record<string, any>) {\n const comptype = () => {\n if (props.option.chart === 'num') {\n return 'number'\n }\n return props.option.type\n }\n const compprops = (item: Record<string, any>) => {\n const type = comptype()\n if (type === 'number') {\n return {\n dataList: item.data\n }\n }\n if (type === 'chart') {\n return {\n options: makeOption(item.id, item.chart, item.data)\n }\n }\n if (type === 'md') {\n return {\n source: item.data\n }\n }\n\n if (type === 'table') {\n if (!isArray(item.data)) {\n return { showPagination: false }\n }\n const headers: { field: string; label: string }[] = []\n item.data[0] && Object.keys(item.data[0]).forEach((key, index) => {\n headers.push({ field: key, label: key })\n })\n return {\n headers: headers,\n list: item.data,\n showPagination: false\n }\n }\n return {}\n }\n\n return {\n compprops,\n comptype\n }\n }\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.part {\n //height: 350px;\n width: auto;\n margin-bottom: 15px;\n :last-child {\n margin-bottom: 0;\n }\n}\n::v-deep(.el-card__header) {\n padding: 5px;\n}\n::v-deep(.el-card__body) {\n padding: 5px;\n}\n</style>\n","<template>\n <ElCard\n v-resize=\"true\"\n shadow=\"never\"\n class=\"part\"\n >\n <component\n :is=\"comptype()\"\n v-bind=\"compprops(option)\"\n />\n </ElCard>\n</template>\n<script lang=\"ts\">\nimport { makeOption } from './option'\nimport { VTable, VChart, JsonView } from '@okiss/vbtf'\nimport NumberPanel from './NumberPanel.vue'\n// @ts-ignore\nimport Markdown from 'vue3-markdown-it'\nimport { isArray } from '@okiss/utils'\n\nexport default {\n components: {\n Chart: VChart,\n Md: Markdown,\n Json: JsonView,\n Table: VTable,\n Number: NumberPanel,\n Html: ''\n },\n props: {\n option: {\n type: Object,\n default: () => {}\n }\n },\n setup(props: Record<string, any>) {\n const comptype = () => {\n if (props.option.chart === 'num') {\n return 'number'\n }\n return props.option.type\n }\n const compprops = (item: Record<string, any>) => {\n const type = comptype()\n if (type === 'number') {\n return {\n dataList: item.data\n }\n }\n if (type === 'chart') {\n return {\n options: makeOption(item.id, item.chart, item.data)\n }\n }\n if (type === 'md') {\n return {\n source: item.data\n }\n }\n\n if (type === 'table') {\n if (!isArray(item.data)) {\n return { showPagination: false }\n }\n const headers: { field: string; label: string }[] = []\n item.data[0] && Object.keys(item.data[0]).forEach((key, index) => {\n headers.push({ field: key, label: key })\n })\n return {\n headers: headers,\n list: item.data,\n showPagination: false\n }\n }\n return {}\n }\n\n return {\n compprops,\n comptype\n }\n }\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.part {\n //height: 350px;\n width: auto;\n margin-bottom: 15px;\n :last-child {\n margin-bottom: 0;\n }\n}\n::v-deep(.el-card__header) {\n padding: 5px;\n}\n::v-deep(.el-card__body) {\n padding: 5px;\n}\n</style>\n","<template>\n <el-row>\n <el-col\n v-if=\"_filter.length > 0\"\n :span=\"24\"\n >\n <ElCard\n shadow=\"never\"\n class=\"part-filter\"\n >\n <VForm\n v-model=\"formData\"\n :form-items=\"_filter\"\n :options=\"formOptions\"\n @submit=\"onsubmit\"\n />\n </ElCard>\n </el-col>\n <el-col :span=\"24\">\n <el-row :gutter=\"20\">\n <el-col\n v-for=\"(item,index) in _dataPart\"\n :key=\"index\"\n :span=\"item.col || 24\"\n >\n <Part\n v-if=\"!item.errMsg\"\n :key=\"key\"\n :option=\"item\"\n />\n <el-alert\n v-else\n :title=\"item.id+' 片段执行出错'\"\n type=\"error\"\n >{{ item.errMsg }}</el-alert>\n </el-col>\n </el-row>\n </el-col>\n </el-row>\n</template>\n<script lang=\"ts\" setup>\nimport { VForm } from '@okiss/vbtf'\nimport Part from './part.vue'\n// import store from '../../store'\nimport http from '../../utils/request'\nimport { useRoute } from 'vue-router'\n\nconst route = useRoute()\n\nonMounted(() => {\n // store.dispatch('app/toggleSideBar')\n})\n\nconst props = defineProps({\n filter: {\n type: Array,\n default: () => []\n },\n dataPart: {\n type: Array,\n default: () => []\n }\n})\n\nconst formData = ref<Record<string, any>>({})\nonBeforeMount(() => {\n props.filter?.forEach((item: any) => {\n if (item.default !== null) {\n formData.value[item.field] = item.default\n }\n })\n})\nconst formOptions = {\n inline: true,\n labelPosition: 'right',\n labelWidth: 'auto',\n submitButton: {\n text: '查询'\n },\n cancelButton: {\n text: '重置'\n }\n}\nconst key = ref(1)\nconst _filter = ref(props.filter)\nconst _dataPart = ref(props.dataPart)\n\nconst schemaapi = computed(() => {\n let id = route.params.id\n if (!id) {\n const token = route.path.split('/')\n id = token[token.length - 1]\n }\n return '/focusbi_report/view/' + id\n})\n\nconst onsubmit = (data: any) => {\n http.get(schemaapi.value, { params: data }).then(({ data }) => {\n _filter.value = data.filter\n _dataPart.value = data.dataPart\n key.value++\n })\n}\n</script>\n\n<style lang=\"scss\">\n.part-filter {\n margin-bottom: 15px;\n}\n\n</style>\n","<template>\n <el-row>\n <el-col\n v-if=\"_filter.length > 0\"\n :span=\"24\"\n >\n <ElCard\n shadow=\"never\"\n class=\"part-filter\"\n >\n <VForm\n v-model=\"formData\"\n :form-items=\"_filter\"\n :options=\"formOptions\"\n @submit=\"onsubmit\"\n />\n </ElCard>\n </el-col>\n <el-col :span=\"24\">\n <el-row :gutter=\"20\">\n <el-col\n v-for=\"(item,index) in _dataPart\"\n :key=\"index\"\n :span=\"item.col || 24\"\n >\n <Part\n v-if=\"!item.errMsg\"\n :key=\"key\"\n :option=\"item\"\n />\n <el-alert\n v-else\n :title=\"item.id+' 片段执行出错'\"\n type=\"error\"\n >{{ item.errMsg }}</el-alert>\n </el-col>\n </el-row>\n </el-col>\n </el-row>\n</template>\n<script lang=\"ts\" setup>\nimport { VForm } from '@okiss/vbtf'\nimport Part from './part.vue'\n// import store from '../../store'\nimport http from '../../utils/request'\nimport { useRoute } from 'vue-router'\n\nconst route = useRoute()\n\nonMounted(() => {\n // store.dispatch('app/toggleSideBar')\n})\n\nconst props = defineProps({\n filter: {\n type: Array,\n default: () => []\n },\n dataPart: {\n type: Array,\n default: () => []\n }\n})\n\nconst formData = ref<Record<string, any>>({})\nonBeforeMount(() => {\n props.filter?.forEach((item: any) => {\n if (item.default !== null) {\n formData.value[item.field] = item.default\n }\n })\n})\nconst formOptions = {\n inline: true,\n labelPosition: 'right',\n labelWidth: 'auto',\n submitButton: {\n text: '查询'\n },\n cancelButton: {\n text: '重置'\n }\n}\nconst key = ref(1)\nconst _filter = ref(props.filter)\nconst _dataPart = ref(props.dataPart)\n\nconst schemaapi = computed(() => {\n let id = route.params.id\n if (!id) {\n const token = route.path.split('/')\n id = token[token.length - 1]\n }\n return '/focusbi_report/view/' + id\n})\n\nconst onsubmit = (data: any) => {\n http.get(schemaapi.value, { params: data }).then(({ data }) => {\n _filter.value = data.filter\n _dataPart.value = data.dataPart\n key.value++\n })\n}\n</script>\n\n<style lang=\"scss\">\n.part-filter {\n margin-bottom: 15px;\n}\n\n</style>\n","<template>\n <PageLoad :schema-api=\"schemaapi\">\n <template #default=\"slotProps\">\n <Report v-bind=\"slotProps\" />\n </template>\n </PageLoad>\n</template>\n<script setup>\nimport PageLoad from '../components/PageLoad.vue'\nimport Report from '../components/report/index.vue'\nimport { useRoute } from 'vue-router'\nconst route = useRoute()\n\nconst schemaapi = computed(() => {\n let id = route.params.id\n if (!id) {\n const token = route.path.split('/')\n id = token[token.length - 1]\n }\n return '/focusbi_report/view/' + id\n})\n</script>\n","import { h, getCurrentInstance, Component } from 'vue'\nimport { ElRow, ElCol, ElCard } from 'element-plus'\nimport { merge } from 'lodash'\nimport { VForm, VTable } from '@okiss/vbtf'\nimport { isObject, isArray } from '@okiss/utils'\n\nimport './index.scss'\n\ntype CompProps = Record<string, any>\n\nconst test = (props: CompProps) => <div>{props.test}</div>\n\nconst components: Record<string, any> = {\n 'card': ElCard,\n 'form': VForm,\n 'table': VTable,\n 'test': test,\n 'row': ElRow,\n 'col': ElCol\n}\n\nexport function regComponents(comps: Record<string, any>) {\n Object.keys(comps).forEach(k => {\n components[k] = comps[k]\n })\n}\n\nconst defaultSchema: Record<string, Node> = {\n 'card': {\n type: 'card',\n props: {\n class: 'render-card',\n shadow: 'never'\n }\n },\n 'form': {\n type: 'form',\n props: {\n afterReset: ''\n }\n },\n 'table': {\n type: 'table',\n props: {\n syncUrl: false\n }\n }\n}\n\nexport interface Node {\n type: string,\n props?: Record<string, string | number | boolean | any>\n children?: Node[] | Node\n span?: number\n}\n\nexport interface Props {\n schema: Node[]\n}\n\nfunction pathNodeParse(node: Node): Node[] {\n const _node = Object.assign({}, node)\n const part = _node.type.split('.').reverse()\n const span = _node.span || 24\n delete _node.span\n let tmp = { ..._node, type: part[0] }\n for (let i = 1; i < part.length; i++) {\n const item = part[i]\n tmp = { type: item, children: [tmp] }\n }\n tmp.span = span\n\n return nodesParse([tmp])\n}\n\nfunction nodesParse(_nodes: Node[]): Node[] {\n const root: Node = { type: 'row', props: { gutter: 20, class: 'render-row' }, children: [] }\n _nodes.forEach(_node => {\n let node = Object.assign({}, _node)\n if (isObject(node.props?.style)) {\n let style = ''\n Object.keys(node.props?.style).forEach(k => {\n style += k + ':' + node.props?.style[k] + ';'\n })\n node.props!.style = style\n }\n const colProps = { span: node.span ?? 24, class: 'render-col' }\n delete node.span\n if (node.type.indexOf('.') > 0) {\n (root.children! as Node[]).push({\n type: 'col',\n props: colProps,\n children: pathNodeParse(node)\n })\n return\n }\n node = merge({ props: {}}, defaultSchema[node.type] || {}, node)\n const children = transChildren(node.children)\n if (children.length) {\n node.children = nodesParse(children)\n }\n (root.children! as Node[]).push({\n type: 'col',\n props: colProps,\n children: [\n node\n ]\n })\n })\n\n return [root]\n}\n\nfunction transChildren(children : Node[] | Node | undefined) : Node[] {\n const _children : Node[] = isArray(children) ? children! as Node[] : (isObject(children) ? [children! as Node] : [])\n return _children\n}\n\nlet globalComps : Record<string, Component> = {}\n\nconst createVNode = (node: Node) => {\n const comp = components[node.type] || globalComps[node.type] || node.type\n return h(comp, node.props, { default: () => transChildren(node.children).map(item => createVNode(item)) })\n}\n\nexport const render = (props: Props) => {\n if (Object.keys(globalComps).length === 0) {\n globalComps = getCurrentInstance()!.appContext.components\n }\n const nodes: Node[] = nodesParse(Object.values(props.schema))\n return nodes.map(item => createVNode(item))\n}\n","<template>\n <PageLoad :schema-handler=\"schemaHandler\">\n <render :schema=\"schema\" />\n </PageLoad>\n</template>\n<script setup name=\"Custom\">\nimport PageLoad from '../components/PageLoad.vue'\nimport { render } from '../render'\nimport { toRaw } from 'vue'\nconst schema = ref([])\nconst schemaHandler = (_schema, project) => {\n schema.value = toRaw(_schema)\n return _schema\n}\n</script>\n","import type { RouteRecordRaw } from 'vue-router'\nimport { MenuType, OmsModule, PageInfo, PageType, RemoteModule } from '../types'\nimport { Component } from 'vue'\nimport { Container, Form, Report, Table, Tree, Custom } from '../scaffold'\n\nlet bu: Record<string, any> = {}\nexport function regViews(_bu: Record<string, any>) {\n bu = _bu\n}\n\nconst getComponent = (item: PageInfo): Component => {\n const loadCustom = (path: string): any => {\n const _path = './views/' + path + '.vue'\n if (bu && bu[_path] && bu[_path].default) {\n return bu[_path].default\n }\n console.error(`自定义组件不存在 ${item.name} ${item.view}`)\n return Container\n }\n if (item.path === '#') {\n return Container\n }\n switch (item.page_type) {\n case PageType.list:\n return Table\n case PageType.form:\n return Form\n case PageType.custom:\n case PageType.localComp:\n return loadCustom(item.view || '')\n case PageType.tree:\n return Tree\n case PageType.report:\n return Report\n case PageType.customSchema:\n return Custom\n }\n return Container\n}\n\nfunction getPath(item: PageInfo) {\n let path = item.path\n if (item.type === MenuType.menu && item.page_type === PageType.entity) {\n path = '#'\n }\n // :id 默认转换为数字型匹配模式\n if (path.indexOf(':id') > -1 && path.indexOf(':id') + 3 === path.length) {\n path = path.replace(':id', ':id(\\\\d+)')\n }\n return path === '#'\n ? '/' + item.id + '_DIR_' + item.name\n : path[0] !== '/'\n ? '/' + path\n : path\n}\n\nfunction getName(item: PageInfo): string {\n return (item.path + item.name).split('/').filter(v => v).join('_')\n}\n\nconst transRoute = (item: PageInfo): RouteRecordRaw => {\n const isShow = item.type !== MenuType.page\n const route: RouteRecordRaw = {\n path: getPath(item),\n name: item.id + '_' + getName(item) + '_' + item.path.replaceAll('/', '_'),\n component: getComponent(item),\n meta: {\n id: item.id,\n pageId: item.id,\n title: item.name,\n icon: item.icon,\n hidden: !isShow,\n path: item.path,\n menuType: item.type,\n keepAlive: false,\n role: item.role\n },\n children: item.children ? item.children.map(each => transRoute(each)) : []\n }\n if (item.page_type === PageType.entity) {\n const createList = item.path + '/list'\n const createForm = item.path + '/form'\n const createEdit = item.path + '/:id'\n const children : Array<RouteRecordRaw> = [{\n path: createList,\n name: item.name + '列表' + item.id,\n component: Table,\n meta: {\n id: item.id + 99999,\n title: '列表',\n hidden: true,\n menuType: MenuType.hidden,\n keepAlive: false,\n pageId: item.id,\n path: item.path\n }\n }, {\n path: createForm,\n name: item.name + '新建' + item.id,\n component: Form,\n meta: {\n id: item.id + 99999 + 1,\n title: '新建',\n hidden: true,\n menuType: MenuType.hidden,\n keepAlive: false,\n pageId: item.id,\n path: item.path\n }\n }, {\n path: createEdit,\n name: item.name + '编辑' + item.id,\n component: Form,\n meta: {\n id: item.id + 99999 + 2,\n title: '编辑',\n hidden: true,\n menuType: MenuType.hidden,\n keepAlive: false,\n pageId: item.id,\n path: item.path\n }\n }]\n route.children = [...children, ...route.children as RouteRecordRaw[]]\n }\n if (route.children && route.children.length > 0) {\n let allChildHidden = true\n route.children.forEach(each => {\n if (each.meta && !each.meta.hidden) {\n allChildHidden = false\n }\n })\n if (route.meta) {\n route.meta.menuType = isShow ? MenuType.dir : MenuType.hidden\n }\n if (allChildHidden) {\n if (route.meta) {\n route.meta.menuType = MenuType.menu\n }\n let redirect = '/'\n for (let i = 0; i < route.children.length; i++) {\n if (route.children[i].path.indexOf('/:') === -1) {\n redirect = route.children[i].path\n break\n }\n }\n route.redirect = redirect\n route.path = '/' + item.id + '_DIR' + route.redirect.replaceAll('/', '_').toUpperCase()\n }\n }\n\n return route\n}\n\nexport const transRemoteModules = (data: RemoteModule[]): OmsModule[] => {\n const vueRouteModule: OmsModule[] = []\n data.forEach(item => {\n const m: OmsModule = {\n id: item.id,\n label: item.label,\n routes: []\n }\n item.routes.forEach(each => {\n m.routes.push(transRoute(each))\n })\n vueRouteModule.push(m)\n })\n\n return vueRouteModule\n}\n","<template>\n <el-breadcrumb\n class=\"app-breadcrumb\"\n separator=\"/\"\n >\n <transition-group name=\"breadcrumb\">\n <el-breadcrumb-item\n v-for=\"(item, index) in levelList\"\n :key=\"item.path\"\n >\n <span\n v-if=\"(item.path.indexOf('/DIR_') === 0 && item.redirect === undefined) || index === levelList.length - 1\"\n class=\"no-redirect\"\n >{{ item.meta.title }}</span> <a\n v-else\n @click=\"handleLink(item)\"\n >{{ item.meta.title }}</a>\n </el-breadcrumb-item>\n </transition-group>\n </el-breadcrumb>\n</template>\n\n<script>\nimport * as pathToRegexp from 'path-to-regexp'\n\nexport default {\n data() {\n return {\n levelList: null\n }\n },\n watch: {\n $route() {\n this.getBreadcrumb()\n }\n },\n created() {\n this.getBreadcrumb()\n },\n methods: {\n getBreadcrumb() {\n // only show routes with meta.title\n let matched = this.$route.matched.filter(\n item => item.meta && item.meta.title\n )\n const first = matched[0]\n\n if (!this.isDashboard(first)) {\n matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(\n matched\n )\n }\n\n this.levelList = matched.filter(\n item => item.meta && item.meta.title && item.meta.breadcrumb !== false\n )\n },\n isDashboard(route) {\n const name = route && route.name\n if (!name) {\n return false\n }\n return (\n name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()\n )\n },\n pathCompile(path) {\n // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561\n const { params } = this.$route\n const toPath = pathToRegexp.compile(path)\n return toPath(params)\n },\n handleLink(item) {\n const { redirect, path } = item\n if (redirect) {\n this.$router.push(redirect)\n return\n }\n this.$router.push(this.pathCompile(path))\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-breadcrumb.el-breadcrumb {\n display: inline-block;\n font-size: 14px;\n line-height: 50px;\n margin-left: 8px;\n\n .no-redirect {\n color: #97a8be;\n cursor: text;\n }\n}\n</style>\n","<template>\n <div\n style=\"padding: 0 15px;\"\n @click=\"toggleClick\"\n >\n <v-icon\n :class=\"{ 'is-active': isActive }\"\n name=\"ra-leftalignment\"\n />\n </div>\n</template>\n\n<script>\nexport default {\n name: 'Hamburger',\n props: {\n isActive: {\n type: Boolean,\n default: false\n }\n },\n emits: ['toggle-click'],\n methods: {\n toggleClick() {\n this.$emit('toggle-click')\n }\n }\n}\n</script>\n","<template>\n <el-container style=\"width: 100%;height: 100%\">\n <el-row class=\"aside\">\n <slot name=\"left-aside\" />\n </el-row>\n <el-main\n class=\"main\"\n style=\"margin: 0 10px\"\n >\n <slot name=\"main\" />\n </el-main>\n <el-aside\n class=\"aside\"\n width=\"350px\"\n style=\"padding: 20px\"\n >\n <slot name=\"right-aside\" />\n </el-aside>\n </el-container>\n</template>\n<style scoped>\n.main {\n border: 1px solid #ebebeb;\n border-radius: 3px;\n transition: .2s;\n min-height: calc(100vh - 50px);\n width: 100%;\n position: relative;\n}\n.aside {\n padding-top: 20px;\n border: 1px solid #ebebeb;\n border-radius: 3px;\n transition: .2s;\n}\n</style>\n","export default {\n type: 'input',\n name: '文本框',\n default: {\n type: 'input',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'number',\n field: 'maxlength',\n label: '最大字符数'\n },\n\n {\n type: 'icon-select',\n field: 'prefixIcon',\n label: '前置ICON'\n },\n {\n type: 'icon-select',\n field: 'suffixIcon',\n label: '后置ICON'\n },\n {\n type: 'switch',\n field: 'showCopy',\n label: '复制'\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n },\n {\n type: 'switch',\n field: 'showWordLimit',\n label: '显示限制词数'\n },\n {\n type: 'input',\n field: 'mask',\n label: 'mask',\n info: '<a href=\"https://github.com/RobinHerbots/Inputmask\" target=\"_blank\" class=\"el-link el-link--primary\">文档</a>'\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'number',\n name: '数字',\n default: {\n type: 'number',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'number',\n field: 'min',\n label: '最小值'\n },\n {\n type: 'number',\n field: 'man',\n label: '最大值'\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'number-range',\n name: '数字区间',\n default: {\n type: 'number-range',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'unit',\n label: '单位'\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n }\n ]\n }\n }\n ]\n}\n","import { cloneDeep } from 'lodash'\n\nexport default {\n type: 'select',\n name: '下拉框',\n default: {\n type: 'select',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'radio',\n field: 'optionType',\n label: '备选项类型',\n value: 0,\n options: [\n { value: 0, label: 'local' },\n { value: 1, label: 'remote' }\n ]\n },\n {\n type: 'sub-form',\n field: 'options',\n label: '备选项',\n props: {\n repeat: true,\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'value',\n label: 'value'\n },\n {\n type: 'input',\n field: 'label',\n label: 'label'\n }\n ]\n },\n depend: {\n field: 'optionType',\n value: 0\n }\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'selectApi',\n label: '备选项接口',\n depend: {\n field: '.optionType',\n value: 1\n }\n },\n {\n type: 'switch',\n field: 'multiple',\n label: '多选'\n },\n {\n type: 'number',\n field: 'multipleLimit',\n label: '最大选中数',\n depend: {\n field: 'multiple',\n value: true\n }\n },\n {\n type: 'switch',\n field: 'allowCreate',\n label: '允许创建'\n },\n {\n type: 'switch',\n field: 'filterable',\n label: '允许过滤'\n }\n ]\n }\n }\n ],\n trans(item) {\n const tmp = cloneDeep(item)\n if (item.optionType === 0) {\n if (tmp.props && tmp.props.selectApi !== undefined) {\n delete tmp.props.selectApi\n }\n } else if (item.optionType === 1) {\n if (tmp.options) {\n delete tmp.options\n }\n }\n delete tmp.optionType\n return tmp\n }\n}\n","export default {\n type: 'radio',\n name: '单选框',\n default: {\n type: 'radio',\n label: 'label',\n field: 'field_name',\n options: []\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'options',\n label: '备选项',\n props: {\n formItems: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'value',\n label: '字段值'\n }\n ],\n repeat: true\n }\n },\n {\n type: 'input',\n field: 'default',\n label: '默认值'\n }\n ]\n}\n","export default {\n type: 'switch',\n name: '开关',\n default: {\n type: 'switch',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'activeText',\n label: '打开时的文字描述'\n },\n {\n type: 'input',\n field: 'inactiveText',\n label: '关闭时的文字描述'\n },\n {\n type: 'color',\n field: 'activeColor',\n label: '打开时的背景色'\n },\n {\n type: 'color',\n field: 'inactiveColor',\n label: '关闭时的背景色'\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'code',\n name: 'Code',\n default: {\n type: 'code',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'json',\n name: 'json',\n default: {\n type: 'json',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'upload',\n name: '上传',\n default: {\n type: 'upload',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'template',\n name: '自定义组件',\n default: {\n type: 'template',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'icon-select',\n name: '图标选择器',\n default: {\n type: 'icon-select',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'sub-form',\n name: '子表单',\n default: {\n type: 'sub-form',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'switch',\n field: 'repeat',\n label: '可重复'\n },\n {\n type: 'sub-form',\n field: 'form-items',\n label: '子表单控件',\n props: {\n options: {\n labelPosition: 'top'\n },\n repeat: true,\n formItems: [\n {\n type: 'input',\n field: 'label',\n label: 'label'\n },\n {\n type: 'select',\n field: 'type',\n label: '类型',\n options: [\n { value: 'input', label: '文本框' }\n ]\n }\n ]\n }\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'checkbox',\n name: '复选框',\n default: {\n type: 'checkbox',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'number',\n field: 'max',\n label: '最大选中数'\n },\n {\n type: 'number',\n field: 'min',\n label: '最小选中数'\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n }\n ]\n }\n }\n ]\n}\n","import input from './ctrls/input'\nimport number from './ctrls/number'\nimport numberRange from './ctrls/number-range'\nimport select from './ctrls/select'\nimport radio from './ctrls/radio'\nimport xswitch from './ctrls/switch'\nimport code from './ctrls/code'\nimport json from './ctrls/json'\nimport upload from './ctrls/upload'\nimport template from './ctrls/template'\nimport iconSelect from './ctrls/icon-select'\nimport subForm from './ctrls/sub-form'\nimport checkbox from './ctrls/checkbox'\n\nconst ctrlMaps = {}\n\nexport function regCtrl(options) {\n ctrlMaps[options.type] = options\n}\n\nregCtrl(input)\nregCtrl(select)\nregCtrl(number)\nregCtrl(numberRange)\nregCtrl(xswitch)\nregCtrl(subForm)\nregCtrl(radio)\nregCtrl(checkbox)\nregCtrl(code)\nregCtrl(json)\nregCtrl(upload)\nregCtrl(iconSelect)\nregCtrl(template)\n\nexport const ctrls = ctrlMaps\n\nexport const baseSchema = {\n options: {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n },\n formItems: [\n {\n type: 'input',\n field: 'saveApi',\n label: '保存接口'\n },\n {\n type: 'switch',\n field: 'inline',\n label: '行布局'\n },\n {\n type: 'radio',\n field: 'labelPosition',\n label: 'label位置',\n options: [\n { value: 'right', label: '右' },\n { value: 'left', label: '左' },\n { value: 'top', label: '上' }\n ]\n },\n {\n type: 'input',\n field: 'labelWidth',\n label: 'label宽度',\n value: '100px'\n },\n {\n type: 'switch',\n field: 'showSubmitButton',\n label: '显示提交按钮',\n value: true\n },\n {\n type: 'sub-form',\n field: 'submitButton',\n label: '提交按钮',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'text',\n label: '文案',\n value: '提交'\n },\n {\n type: 'select',\n field: 'type',\n label: '按钮类型',\n options: [\n { value: 'primary', label: 'primary' }\n ]\n }\n ]\n }\n },\n {\n type: 'switch',\n field: 'showCancelButton',\n label: '显示取消按钮',\n value: true\n },\n {\n type: 'sub-form',\n field: 'cancelButton',\n label: '取消按钮',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'text',\n label: '文案',\n value: '取消'\n },\n {\n type: 'select',\n field: 'type',\n label: '按钮类型',\n options: [\n { value: 'primary', label: 'primary' }\n ]\n }\n ]\n }\n }\n ]\n}\n\nexport const ctrlFormDefaultOptions = {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n}\n","<template>\n <dev-layout>\n <template #main>\n <v-form\n v-if=\"builderSchema.formItems\"\n ref=\"form\"\n :key=\"key\"\n :dev=\"true\"\n v-bind=\"builderSchema\"\n />\n <el-divider />\n <ElButton\n type=\"primary\"\n @click=\"saveSchema\"\n >保存页面配置</ElButton>\n \n <VButton\n text=\"PageSchema\"\n type=\"modal\"\n >\n <JsonView :data=\"getSaveSchema\" />\n </VButton>\n </template>\n <template #right-aside>\n <el-form v-if=\"activeIndex\">\n <el-form-item label=\"控件类型\">\n <el-select v-model=\"currentCtrlType\">\n <el-option\n v-for=\"(item,index) in types\"\n :key=\"index\"\n :label=\"item.label\"\n :value=\"item.value\"\n />\n </el-select>\n </el-form-item>\n </el-form>\n <v-form\n :key=\"ctrlKey\"\n v-model=\"ctrlOptions\"\n v-bind=\"ctrlSchema\"\n />\n </template>\n </dev-layout>\n</template>\n<script>\nimport DevLayout from '../DevLayout.vue'\nimport { VForm, VBtn as VButton, JsonView } from '@okiss/vbtf'\nimport { compactObject } from '@okiss/utils'\nimport { cloneDeep, get, merge, set, unset } from 'lodash'\nimport { baseSchema, ctrls } from './form'\nimport { eventBus } from '../../../index'\n\nexport const ctrlFormDefaultOptions = {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n}\n\nconst typs = []\n\nObject.keys(ctrls).forEach(item => {\n typs.push({ value: item, label: ctrls[item].name })\n})\n\nconst sqlSchema = {\n options: {\n submitButton: false,\n cancelButton: false\n },\n formItems: [\n {\n type: 'sub-form',\n field: 'columns',\n props: {\n repeat: true,\n formItems: [\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'select',\n field: 'type',\n label: '类型',\n options: cloneDeep(typs)\n },\n {\n type: 'input',\n field: 'label',\n label: '字段label'\n }\n ]\n }\n }\n ]\n}\n\nexport default {\n components: { DevLayout, VForm, VButton, JsonView },\n props: {\n schema: {\n type: Object,\n default: _ => {}\n }\n },\n data() {\n return {\n sqlOptions: {},\n sqlSchema: sqlSchema,\n baseSchema: baseSchema,\n activeTab: 'base',\n builderSchema: Object.assign(\n {},\n this.$props.schema,\n {\n options: {\n submitButton: false,\n cancelButton: false\n }\n }\n ),\n baseOptions: {},\n key: 0,\n ctrlKey: 0,\n activeCtrl: undefined,\n ctrlOptions: {},\n ctrlSchema: {},\n ctrlName: '',\n activeIndex: undefined,\n ctrlMap: ctrls,\n activeIndexReg: /(formItems)?\\[(\\d+)\\]/,\n tableStruct: '',\n activeName: '1',\n currentCtrlType: 'input',\n types: cloneDeep(typs)\n }\n },\n computed: {\n getSaveSchema() {\n return {\n formItems: this.builderSchema.formItems\n }\n }\n },\n watch: {\n baseOptions: {\n deep: true,\n immediate: true,\n handler(val) {\n const tmp = cloneDeep(val)\n if (val.showSubmitButton === false) {\n tmp.submitButton = false\n }\n if (val.cancelSubmitButton === false) {\n tmp.cancelButton = false\n }\n delete tmp.showSubmitButton\n delete tmp.showCancelButton\n if (Object.keys(tmp).length > 0) {\n this.builderSchema = merge(this.builderSchema, { options: tmp })\n this.key++\n }\n }\n },\n ctrlOptions: {\n deep: true,\n // immediate: true,\n handler(val) {\n const current = get(this.builderSchema, this.activeIndex)\n if (!current) {\n return\n }\n const type = current ? current.type : ''\n const ctrl = this.ctrlMap[type]\n const transData = ctrl.trans ? ctrl.trans(val) : val\n if (transData && Object.keys(transData).length > 0) {\n transData.type = type\n // update `builderSchema` nested data\n if (this.activeIndex.indexOf('[') > -1) {\n // format like: `headers[0]`\n const [_, key, keyIndex] = this.activeIndex.match(/(\\w+)\\[(\\d+)\\]/)\n _\n this.builderSchema[key][keyIndex] = { ...transData }\n } else {\n this.builderSchema[this.activeIndex] = transData\n }\n // set(this.builderSchema, this.activeIndex, transData)\n this.key++\n }\n }\n },\n currentCtrlType: {\n handler(val) {\n const ctrl = this.ctrlMap[val]\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n const sourceCtrlOptions = get(this.builderSchema, this.activeIndex)\n this.ctrlOptions = cloneDeep(sourceCtrlOptions)\n this.ctrlOptions.type = val\n this.ctrlKey++\n this.key++\n }\n }\n },\n beforeCreate() {\n eventBus.on('dev-action', ({ event, data }) => {\n this.onDevAction(data.type, data.devId)\n })\n },\n unmounted() {\n eventBus.off('dev-action')\n },\n methods: {\n onDevAction(btnType, path) {\n this.activeIndex = 'formItems' + path\n if (btnType === 'edit') {\n this.activeTab = 'ctrl'\n this.clicklabel()\n }\n if (btnType === 'del') {\n this.activeTab = 'base'\n this.removeOne()\n }\n this.ctrlKey++\n },\n push(name) {\n const target = 'formItems'\n this.ctrlOptions = {}\n this.builderSchema[target] = this.builderSchema[target] || []\n const ctrl = this.ctrlMap[name]\n this.activeCtrl = ctrl\n this.builderSchema[target].push(cloneDeep(ctrl.default))\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n this.ctrlKey++\n this.key++\n this.activeIndex = `${target}[${this.builderSchema[target].length - 1}]`\n this.activeTab = 'ctrl'\n },\n removeOne() {\n unset(this.builderSchema, this.activeIndex)\n this.builderSchema = cloneDeep(compactObject(this.builderSchema))\n this.activeIndex = ''\n this.ctrlOptions = {}\n this.ctrlSchema = {}\n this.key++\n this.ctrlKey++\n },\n clicklabel() {\n const p = this.activeIndex\n const m = p.match(this.activeIndexReg)\n if (m) {\n const ctrlOptions = cloneDeep(get(this.builderSchema, p))\n const type = ctrlOptions.type\n const ctrl = this.ctrlMap[type]\n if (!ctrl) {\n this.$message({ type: 'warning', message: '尚未支持该组件的UI编辑' })\n return\n }\n this.currentCtrlType = type\n this.ctrlOptions = ctrlOptions\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n this.ctrlKey++\n }\n },\n saveSchema() {\n this.$http.request({\n method: 'POST',\n url: '/devtool/page_schema',\n data: { formItems: this.builderSchema.formItems }\n }).then(({ data }) => {\n if (data) {\n this.$message({ type: 'success', message: '保存成功, 请刷新页面查看效果' })\n }\n })\n }\n }\n}\n</script>\n<style lang=\"scss\" scoped>\n.title {\n size: 2em;\n padding: 5px 20px;\n}\n.ctrl {\n padding: 5px 20px;\n .ctrl-btn {\n width: 100%;\n }\n}\n</style>\n","export default {\n type: 'input',\n name: '文本框',\n default: {\n type: 'input',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'number',\n field: 'maxlength',\n label: '最大字符数'\n },\n {\n type: 'switch',\n field: 'showWordLimit',\n label: '显示限制词数'\n },\n {\n type: 'input',\n field: 'mask',\n label: 'mask',\n info: '<a href=\"https://github.com/RobinHerbots/Inputmask\" target=\"_blank\" class=\"el-link el-link--primary\">文档</a>'\n }\n ]\n }\n }\n ]\n}\n","import { cloneDeep } from 'lodash'\n\nexport default {\n type: 'select',\n name: '下拉框',\n default: {\n type: 'select',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'radio',\n field: 'optionType',\n label: '备选项类型',\n value: 0,\n options: [\n { value: 0, label: 'local' },\n { value: 1, label: 'remote' }\n ]\n },\n {\n type: 'sub-form',\n field: 'options',\n label: '备选项',\n props: {\n repeat: true,\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'value',\n label: 'value'\n },\n {\n type: 'input',\n field: 'label',\n label: 'label'\n }\n ]\n },\n depend: {\n field: 'optionType',\n value: 0\n }\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'selectApi',\n label: '备选项接口',\n depend: {\n field: '.optionType',\n value: 1\n }\n },\n {\n type: 'switch',\n field: 'multiple',\n label: '多选'\n },\n {\n type: 'number',\n field: 'multipleLimit',\n label: '最大选中数',\n depend: {\n field: 'multiple',\n value: true\n }\n },\n {\n type: 'switch',\n field: 'filterable',\n label: '允许过滤'\n }\n ]\n }\n }\n ],\n trans(item) {\n const tmp = cloneDeep(item)\n if (item.optionType === 0) {\n if (tmp.props && tmp.props.selectApi !== undefined) {\n delete tmp.props.selectApi\n }\n } else if (item.optionType === 1) {\n if (tmp.options) {\n delete tmp.options\n }\n }\n delete tmp.optionType\n return tmp\n }\n}\n","export default {\n type: 'date',\n name: '日期',\n default: {\n type: 'date',\n label: '时间',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export const baseSchema = {\n options: {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n },\n formItems: [\n {\n type: 'switch',\n field: 'showFilter',\n label: '搜索条件',\n value: true\n },\n {\n type: 'switch',\n field: 'showPagination',\n label: '页码',\n value: true\n },\n {\n type: 'switch',\n field: 'exportAble',\n label: '导出按钮'\n }\n ]\n}\n","export const ctrlFormDefaultOptions = {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n}\n","export default {\n type: 'span',\n name: '文本',\n default: {\n type: 'span',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n },\n {\n type: 'switch',\n field: 'sortable',\n label: '排序'\n }\n ]\n}\n","export default {\n type: 'enum',\n name: '标签',\n default: {\n type: 'enum',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n },\n {\n type: 'sub-form',\n field: 'options',\n label: '映射',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'value',\n label: 'value'\n },\n {\n type: 'input',\n field: 'label',\n label: 'label'\n }\n ]\n },\n value: []\n }\n ],\n trans(val) {\n val.options = val.options || []\n if (!val.label) {\n val.label = '表头'\n }\n return val\n }\n}\n","export default {\n type: 'html',\n name: 'HTML',\n default: {\n type: 'html',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'icon',\n name: '图标',\n default: {\n type: 'icon',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'image',\n name: '图片',\n default: {\n type: 'image',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'json',\n name: 'JSON',\n default: {\n type: 'json',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'link',\n name: '链接',\n default: {\n type: 'link',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'rich',\n name: '富文本',\n default: {\n type: 'rich',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'tpl',\n name: '模板',\n default: {\n type: 'tpl',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n },\n {\n type: 'input',\n field: 'tpl',\n label: '模板',\n info: '例如 <code>姓名: {name} 年龄:{age}</code>'\n }\n ]\n}\n","import span from './span'\nimport xenum from './emum'\nimport html from './html'\nimport icon from './icon'\nimport image from './image'\nimport json from './json'\nimport link from './link'\nimport rich from './rich'\nimport tpl from './tpl'\n\nexport default {\n span,\n enum: xenum,\n html,\n icon,\n image,\n json,\n link,\n rich,\n tpl\n}\n","export default {\n type: 'jump',\n name: '跳转',\n default: {\n type: 'jump',\n target: '',\n text: '按钮'\n },\n builder: [\n {\n type: 'input',\n field: 'target',\n label: '跳转地址',\n info: '可以是本地路由, 也可以是url'\n },\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'icon-select',\n field: 'icon',\n label: '图标'\n },\n {\n type: 'select',\n field: 'type',\n label: '类型',\n options: [\n { value: 'primary', label: 'primary' },\n { value: 'info', label: 'info' }\n ]\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'api',\n name: '接口请求',\n default: {\n type: 'api',\n target: '',\n text: '请求'\n },\n builder: [\n {\n type: 'input',\n field: 'target',\n label: 'API地址',\n info: '此处填写接口path即可'\n },\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'icon-select',\n field: 'icon',\n label: '图标'\n },\n {\n type: 'select',\n field: 'type',\n label: '类型',\n options: [\n { value: 'primary', label: 'primary' },\n { value: 'info', label: 'info' }\n ]\n },\n {\n type: 'input',\n field: 'api',\n label: 'API地址',\n info: '此处填写接口path即可'\n },\n {\n type: 'select',\n field: 'method',\n label: '请求类型',\n options: [\n { value: 'GET', label: 'GET' },\n { value: 'POST', label: 'POST' },\n { value: 'DELETE', label: 'DELETE' },\n { value: 'PUT', label: 'PUT' }\n ]\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'form',\n name: '弹框表单',\n default: {\n type: 'form',\n target: '',\n text: '弹框表单'\n },\n builder: [\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'radio',\n field: 'container',\n label: '模式',\n options: [\n { value: 'dialog', label: '模态框' },\n { value: 'drawer', label: '抽屉' }\n ],\n value: 'dialog'\n },\n {\n type: 'radio',\n field: 'schema_type',\n label: '表单类型',\n options: [\n { value: 0, label: '本地' },\n { value: 1, label: '远程' }\n ],\n value: 1\n },\n {\n type: 'input',\n field: 'infoApi',\n label: 'formSchema接口',\n depend: {\n field: 'schema_type',\n value: 1\n }\n },\n {\n type: 'json',\n field: 'form-items',\n label: '表单控件'\n },\n {\n type: 'input',\n field: 'saveApi',\n label: '保存接口'\n }\n ]\n}\n","export default {\n type: 'table',\n name: '弹框列表',\n default: {\n type: 'form',\n target: '',\n text: '弹框表单'\n },\n builder: [\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'radio',\n field: 'container',\n label: '模式',\n options: [\n { value: 'dialog', label: '模态框' },\n { value: 'drawer', label: '抽屉' }\n ],\n value: 'dialog'\n },\n {\n type: 'radio',\n field: 'schema_type',\n label: '表单类型',\n options: [\n { value: 0, label: '本地' },\n { value: 1, label: '远程' }\n ],\n value: 1\n },\n {\n type: 'input',\n field: 'infoApi',\n label: 'formSchema接口',\n depend: {\n field: 'schema_type',\n value: 1\n }\n },\n {\n type: 'json',\n field: 'form-items',\n label: '表单控件'\n },\n {\n type: 'input',\n field: 'saveApi',\n label: '保存接口'\n }\n ]\n}\n","import jump from './jump'\nimport api from './api'\nimport form from './form'\nimport table from './table'\n\nexport default {\n jump,\n api,\n form,\n table\n}\n","<template>\n <dev-layout>\n <template #left-aside>\n <el-row style=\"width: 200px\">\n <el-row>\n <el-col\n class=\"title\"\n :data-id=\"22222\"\n >添加搜索条件</el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('input')\"\n >文本框</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('select')\"\n >下拉框</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('date')\"\n >日期</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加列表项</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.headers)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushHeaders(ctrlMap.headers[item].type)\"\n >{{ ctrlMap.headers[item].name }}</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加行按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushRowButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加常规按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushNormalButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button class=\"ctrl-btn\">按钮组</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加批量按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushBatchButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button class=\"ctrl-btn\">按钮组</el-button>\n </el-col>\n </el-row>\n </el-row>\n </template>\n <template #main>\n <v-table\n ref=\"table\"\n :key=\"key\"\n :dev=\"true\"\n v-bind=\"builderSchema\"\n />\n <el-divider />\n <ElButton\n type=\"primary\"\n @click=\"saveSchema\"\n >保存页面配置</ElButton>\n \n <VButton\n text=\"PageSchema\"\n type=\"modal\"\n >\n <JsonView :data=\"getSaveSchema\" />\n </VButton>\n </template>\n <template #right-aside>\n <el-form v-if=\"activeIndex\">\n <el-form-item label=\"控件类型\">\n <el-select v-model=\"currentCtrlType\">\n <el-option\n v-for=\"(item,index) in types\"\n :key=\"index\"\n :label=\"item.label\"\n :value=\"item.value\"\n />\n </el-select>\n </el-form-item>\n </el-form>\n <v-form\n :key=\"ctrlKey\"\n v-model=\"ctrlOptions\"\n v-bind=\"ctrlSchema\"\n />\n </template>\n </dev-layout>\n</template>\n<script lang=\"ts\">\nimport DevLayout from '../DevLayout.vue'\nimport { VTable, VForm, VBtn as VButton, JsonView } from '@okiss/vbtf'\nimport { compactObject } from '@okiss/utils'\nimport input from './ctrls/input'\nimport select from './ctrls/select'\nimport date from './ctrls/date'\nimport { cloneDeep, merge, get, unset } from 'lodash'\nimport { baseSchema } from './table'\nimport { ctrlFormDefaultOptions } from '../base'\nimport columns from './columns'\nimport buttons from './btn'\nimport { eventBus } from '../../../index'\n\nexport default {\n components: { JsonView, DevLayout, VTable, VForm, VButton },\n props: {\n schema: {\n type: Object,\n default: _ => {}\n }\n },\n data() {\n const schema = toRefs(this.$props.schema)\n delete schema.listApi\n schema.list = [{}]\n return {\n baseSchema: baseSchema,\n activeTab: 'base',\n builderSchema: Object.assign(\n {},\n baseSchema,\n schema\n ),\n baseOptions: {},\n key: 0,\n ctrlKey: 0,\n activeCtrl: undefined,\n activeBrick: undefined,\n ctrlOptions: {},\n ctrlSchema: {},\n ctrlName: '',\n activeIndex: undefined,\n ctrlMap: {\n filter: { input, select, date },\n headers: columns,\n buttons: buttons\n },\n activeIndexReg: /(filter|headers|normalButton|batchButton|rowButton)?\\[(\\d+)\\]/,\n currentCtrlType: 'input'\n }\n },\n computed: {\n types() {\n const typs = []\n const ctrls = this.ctrlMap[this.activeBrick]\n Object.keys(ctrls).forEach(item => {\n typs.push({ value: item, label: ctrls[item].name })\n })\n\n return typs\n },\n getSaveSchema() {\n return {\n filter: this.builderSchema.filter,\n headers: this.builderSchema.headers,\n rowButton: this.builderSchema.rowButton,\n normalButton: this.builderSchema.normalButton,\n batchButton: this.builderSchema.batchButton\n }\n },\n currentBuilderSchema() {\n // @ts-ignore\n return this.$pinia?.state?.value?.app?.builderSchema\n }\n },\n watch: {\n baseOptions: {\n deep: true,\n immediate: true,\n handler(val) {\n this.builderSchema = merge(this.builderSchema, val)\n this.key++\n this.updateBuilderSchema()\n }\n },\n ctrlOptions: {\n deep: true,\n // immediate: true,\n handler(val) {\n const m = this.activeIndex.match(this.activeIndexReg)\n if (!m) {\n return\n }\n let type = this.builderSchema[m[1]][parseInt(m[2])].type\n\n if (m[1] === 'headers' && type === undefined) {\n type = 'span'\n }\n const ctrl = this.ctrlMap[this.activeBrick][type]\n if (!ctrl) {\n return\n }\n\n const transData = ctrl.trans ? ctrl.trans(val) : val\n if (transData && Object.keys(transData).length > 0) {\n transData.type = type\n\n // update `builderSchema` nested data\n if (this.activeIndex.indexOf('[') > -1) {\n // format like: `headers[0]`\n const [_, key, keyIndex] = this.activeIndex.match(/(\\w+)\\[(\\d+)\\]/)\n _\n this.builderSchema[key][keyIndex] = { ...transData }\n } else {\n this.builderSchema[this.activeIndex] = transData\n }\n this.key++\n }\n\n this.updateBuilderSchema()\n }\n },\n currentCtrlType: {\n handler(val) {\n const ctrl = this.ctrlMap[this.activeBrick][val]\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n const sourceCtrlOptions = get(this.builderSchema, this.activeIndex)\n sourceCtrlOptions.type = val\n const ctrlOptions = cloneDeep(sourceCtrlOptions)\n this.ctrlOptions = ctrlOptions\n if (ctrlOptions.text) {\n this.ctrlOptions.text = ctrlOptions.text\n this.ctrlOptions.props = ctrlOptions.props || {}\n }\n this.ctrlKey++\n this.key++\n this.updateBuilderSchema()\n }\n }\n },\n beforeCreate() {\n eventBus.on('dev-action', ({ event, data }) => {\n this.onDevAction(data.type, data.devId)\n })\n },\n unmounted() {\n eventBus.off('dev-action')\n },\n methods: {\n updateBuilderSchema() {\n // Using Pinia app store\n // @ts-ignore\n const appStore = (this as any).$pinia?._s?.get('app') || null\n if (appStore && appStore.setBuilderSchema) {\n appStore.setBuilderSchema(this.builderSchema)\n }\n },\n onDevAction(btnType, path) {\n this.activeIndex = path\n if (btnType === 'edit') {\n this.activeTab = 'ctrl'\n this.clicklabel()\n }\n if (btnType === 'del') {\n this.activeTab = 'base'\n this.removeOne()\n }\n this.ctrlKey++\n },\n pushFilter(name) {\n this.push(name, 'filter', 'filter', 'filter')\n },\n pushHeaders(name) {\n this.push(name, 'headers', 'headers', 'headers')\n },\n pushNormalButton(name) {\n this.push(name, 'normalButton', 'buttons', 'buttons')\n },\n pushBatchButton(name) {\n this.push(name, 'batchButton', 'buttons', 'buttons')\n },\n pushRowButton(name) {\n this.push(name, 'rowButton', 'buttons', 'buttons')\n },\n push(name, target, ctrlMapName, brick) {\n const ctrl = this.ctrlMap[ctrlMapName]\n if (!ctrl[name]) {\n this.$message({ type: 'warning', message: '尚未支持此组件的UI编辑' })\n return\n }\n this.activeCtrl = ctrl[name]\n this.activeBrick = brick\n this.ctrlOptions = {}\n this.builderSchema[target] = this.builderSchema[target] || []\n this.builderSchema[target].push(cloneDeep(ctrl[name].default))\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl[name].builder)\n })\n this.key++\n this.ctrlKey++\n this.activeIndex = `${target}[${this.builderSchema[target].length - 1}]`\n this.activeTab = 'ctrl'\n },\n removeOne() {\n unset(this.builderSchema, this.activeIndex)\n this.builderSchema = cloneDeep(compactObject(this.builderSchema))\n this.activeIndex = ''\n this.ctrlOptions = {}\n this.ctrlSchema = {}\n this.key++\n this.ctrlKey++\n },\n clicklabel() {\n const p = this.activeIndex\n const m = p.match(this.activeIndexReg)\n if (m) {\n const ctrlOptions = cloneDeep(get(this.builderSchema, p))\n this.activeBrick = m[1]\n if (['normalButton', 'batchButton', 'rowButton'].indexOf(m[1]) > -1) {\n this.activeBrick = 'buttons'\n }\n let type = this.builderSchema[m[1]][parseInt(m[2])].type\n if (m[1] === 'headers' && type === undefined) {\n type = 'span'\n }\n const ctrl = this.ctrlMap[this.activeBrick][type]\n if (!ctrl) {\n console.log(this.activeBrick, type, m)\n this.$message({ type: 'warning', message: '尚未支持此组件的UI编辑' })\n return\n }\n this.ctrlOptions = ctrlOptions\n this.currentCtrlType = type\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n this.ctrlKey++\n }\n },\n saveSchema() {\n const { filter, headers, rowButton, normalButton, batchButton } = this.currentBuilderSchema\n this.$http.request({\n method: 'POST',\n url: '/devtool/page_schema',\n data: {\n filter,\n headers,\n rowButton,\n normalButton,\n batchButton\n }\n }).then(({ data }) => {\n if (data) {\n this.$message({ type: 'success', message: '保存成功, 请刷新页面查看效果' })\n }\n })\n }\n }\n}\n</script>\n<style lang=\"scss\" scoped>\n.title {\n size: 2em;\n padding: 5px 20px;\n}\n.ctrl {\n padding: 5px 20px;\n .ctrl-btn {\n width: 100%;\n }\n}\n</style>\n","<template>\n <dev-layout>\n <template #left-aside>\n <el-row style=\"width: 200px\">\n <el-row>\n <el-col\n class=\"title\"\n :data-id=\"22222\"\n >添加搜索条件</el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('input')\"\n >文本框</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('select')\"\n >下拉框</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('date')\"\n >日期</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加列表项</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.headers)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushHeaders(ctrlMap.headers[item].type)\"\n >{{ ctrlMap.headers[item].name }}</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加行按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushRowButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加常规按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushNormalButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button class=\"ctrl-btn\">按钮组</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加批量按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushBatchButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button class=\"ctrl-btn\">按钮组</el-button>\n </el-col>\n </el-row>\n </el-row>\n </template>\n <template #main>\n <v-table\n ref=\"table\"\n :key=\"key\"\n :dev=\"true\"\n v-bind=\"builderSchema\"\n />\n <el-divider />\n <ElButton\n type=\"primary\"\n @click=\"saveSchema\"\n >保存页面配置</ElButton>\n \n <VButton\n text=\"PageSchema\"\n type=\"modal\"\n >\n <JsonView :data=\"getSaveSchema\" />\n </VButton>\n </template>\n <template #right-aside>\n <el-form v-if=\"activeIndex\">\n <el-form-item label=\"控件类型\">\n <el-select v-model=\"currentCtrlType\">\n <el-option\n v-for=\"(item,index) in types\"\n :key=\"index\"\n :label=\"item.label\"\n :value=\"item.value\"\n />\n </el-select>\n </el-form-item>\n </el-form>\n <v-form\n :key=\"ctrlKey\"\n v-model=\"ctrlOptions\"\n v-bind=\"ctrlSchema\"\n />\n </template>\n </dev-layout>\n</template>\n<script lang=\"ts\">\nimport DevLayout from '../DevLayout.vue'\nimport { VTable, VForm, VBtn as VButton, JsonView } from '@okiss/vbtf'\nimport { compactObject } from '@okiss/utils'\nimport input from './ctrls/input'\nimport select from './ctrls/select'\nimport date from './ctrls/date'\nimport { cloneDeep, merge, get, unset } from 'lodash'\nimport { baseSchema } from './table'\nimport { ctrlFormDefaultOptions } from '../base'\nimport columns from './columns'\nimport buttons from './btn'\nimport { eventBus } from '../../../index'\n\nexport default {\n components: { JsonView, DevLayout, VTable, VForm, VButton },\n props: {\n schema: {\n type: Object,\n default: _ => {}\n }\n },\n data() {\n const schema = toRefs(this.$props.schema)\n delete schema.listApi\n schema.list = [{}]\n return {\n baseSchema: baseSchema,\n activeTab: 'base',\n builderSchema: Object.assign(\n {},\n baseSchema,\n schema\n ),\n baseOptions: {},\n key: 0,\n ctrlKey: 0,\n activeCtrl: undefined,\n activeBrick: undefined,\n ctrlOptions: {},\n ctrlSchema: {},\n ctrlName: '',\n activeIndex: undefined,\n ctrlMap: {\n filter: { input, select, date },\n headers: columns,\n buttons: buttons\n },\n activeIndexReg: /(filter|headers|normalButton|batchButton|rowButton)?\\[(\\d+)\\]/,\n currentCtrlType: 'input'\n }\n },\n computed: {\n types() {\n const typs = []\n const ctrls = this.ctrlMap[this.activeBrick]\n Object.keys(ctrls).forEach(item => {\n typs.push({ value: item, label: ctrls[item].name })\n })\n\n return typs\n },\n getSaveSchema() {\n return {\n filter: this.builderSchema.filter,\n headers: this.builderSchema.headers,\n rowButton: this.builderSchema.rowButton,\n normalButton: this.builderSchema.normalButton,\n batchButton: this.builderSchema.batchButton\n }\n },\n currentBuilderSchema() {\n // @ts-ignore\n return this.$pinia?.state?.value?.app?.builderSchema\n }\n },\n watch: {\n baseOptions: {\n deep: true,\n immediate: true,\n handler(val) {\n this.builderSchema = merge(this.builderSchema, val)\n this.key++\n this.updateBuilderSchema()\n }\n },\n ctrlOptions: {\n deep: true,\n // immediate: true,\n handler(val) {\n const m = this.activeIndex.match(this.activeIndexReg)\n if (!m) {\n return\n }\n let type = this.builderSchema[m[1]][parseInt(m[2])].type\n\n if (m[1] === 'headers' && type === undefined) {\n type = 'span'\n }\n const ctrl = this.ctrlMap[this.activeBrick][type]\n if (!ctrl) {\n return\n }\n\n const transData = ctrl.trans ? ctrl.trans(val) : val\n if (transData && Object.keys(transData).length > 0) {\n transData.type = type\n\n // update `builderSchema` nested data\n if (this.activeIndex.indexOf('[') > -1) {\n // format like: `headers[0]`\n const [_, key, keyIndex] = this.activeIndex.match(/(\\w+)\\[(\\d+)\\]/)\n _\n this.builderSchema[key][keyIndex] = { ...transData }\n } else {\n this.builderSchema[this.activeIndex] = transData\n }\n this.key++\n }\n\n this.updateBuilderSchema()\n }\n },\n currentCtrlType: {\n handler(val) {\n const ctrl = this.ctrlMap[this.activeBrick][val]\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n const sourceCtrlOptions = get(this.builderSchema, this.activeIndex)\n sourceCtrlOptions.type = val\n const ctrlOptions = cloneDeep(sourceCtrlOptions)\n this.ctrlOptions = ctrlOptions\n if (ctrlOptions.text) {\n this.ctrlOptions.text = ctrlOptions.text\n this.ctrlOptions.props = ctrlOptions.props || {}\n }\n this.ctrlKey++\n this.key++\n this.updateBuilderSchema()\n }\n }\n },\n beforeCreate() {\n eventBus.on('dev-action', ({ event, data }) => {\n this.onDevAction(data.type, data.devId)\n })\n },\n unmounted() {\n eventBus.off('dev-action')\n },\n methods: {\n updateBuilderSchema() {\n // Using Pinia app store\n // @ts-ignore\n const appStore = (this as any).$pinia?._s?.get('app') || null\n if (appStore && appStore.setBuilderSchema) {\n appStore.setBuilderSchema(this.builderSchema)\n }\n },\n onDevAction(btnType, path) {\n this.activeIndex = path\n if (btnType === 'edit') {\n this.activeTab = 'ctrl'\n this.clicklabel()\n }\n if (btnType === 'del') {\n this.activeTab = 'base'\n this.removeOne()\n }\n this.ctrlKey++\n },\n pushFilter(name) {\n this.push(name, 'filter', 'filter', 'filter')\n },\n pushHeaders(name) {\n this.push(name, 'headers', 'headers', 'headers')\n },\n pushNormalButton(name) {\n this.push(name, 'normalButton', 'buttons', 'buttons')\n },\n pushBatchButton(name) {\n this.push(name, 'batchButton', 'buttons', 'buttons')\n },\n pushRowButton(name) {\n this.push(name, 'rowButton', 'buttons', 'buttons')\n },\n push(name, target, ctrlMapName, brick) {\n const ctrl = this.ctrlMap[ctrlMapName]\n if (!ctrl[name]) {\n this.$message({ type: 'warning', message: '尚未支持此组件的UI编辑' })\n return\n }\n this.activeCtrl = ctrl[name]\n this.activeBrick = brick\n this.ctrlOptions = {}\n this.builderSchema[target] = this.builderSchema[target] || []\n this.builderSchema[target].push(cloneDeep(ctrl[name].default))\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl[name].builder)\n })\n this.key++\n this.ctrlKey++\n this.activeIndex = `${target}[${this.builderSchema[target].length - 1}]`\n this.activeTab = 'ctrl'\n },\n removeOne() {\n unset(this.builderSchema, this.activeIndex)\n this.builderSchema = cloneDeep(compactObject(this.builderSchema))\n this.activeIndex = ''\n this.ctrlOptions = {}\n this.ctrlSchema = {}\n this.key++\n this.ctrlKey++\n },\n clicklabel() {\n const p = this.activeIndex\n const m = p.match(this.activeIndexReg)\n if (m) {\n const ctrlOptions = cloneDeep(get(this.builderSchema, p))\n this.activeBrick = m[1]\n if (['normalButton', 'batchButton', 'rowButton'].indexOf(m[1]) > -1) {\n this.activeBrick = 'buttons'\n }\n let type = this.builderSchema[m[1]][parseInt(m[2])].type\n if (m[1] === 'headers' && type === undefined) {\n type = 'span'\n }\n const ctrl = this.ctrlMap[this.activeBrick][type]\n if (!ctrl) {\n console.log(this.activeBrick, type, m)\n this.$message({ type: 'warning', message: '尚未支持此组件的UI编辑' })\n return\n }\n this.ctrlOptions = ctrlOptions\n this.currentCtrlType = type\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n this.ctrlKey++\n }\n },\n saveSchema() {\n const { filter, headers, rowButton, normalButton, batchButton } = this.currentBuilderSchema\n this.$http.request({\n method: 'POST',\n url: '/devtool/page_schema',\n data: {\n filter,\n headers,\n rowButton,\n normalButton,\n batchButton\n }\n }).then(({ data }) => {\n if (data) {\n this.$message({ type: 'success', message: '保存成功, 请刷新页面查看效果' })\n }\n })\n }\n }\n}\n</script>\n<style lang=\"scss\" scoped>\n.title {\n size: 2em;\n padding: 5px 20px;\n}\n.ctrl {\n padding: 5px 20px;\n .ctrl-btn {\n width: 100%;\n }\n}\n</style>\n","<template>\n <VIcon\n name=\"ra-set\"\n @click=\"show = !show\"\n />\n <el-drawer\n v-model=\"show\"\n title=\"页面设计\"\n class=\"my-drawer\"\n :direction=\"direction\"\n size=\"90%\"\n destroy-on-close\n append-to-body\n >\n <form-builder\n v-if=\"pageSchema.formItems !== undefined\"\n :schema=\"pageSchema\"\n />\n <table-builder\n v-if=\"pageSchema.headers !== undefined\"\n :schema=\"pageSchema\"\n />\n </el-drawer>\n</template>\n<script setup>\nimport FormBuilder from '../../devtool/formBuilder/index.vue'\nimport TableBuilder from '../../devtool/tableBuilder/index.vue'\nimport { useAppStore } from '../../../store'\nimport { useRoute } from 'vue-router'\n\nconst show = ref(false)\nconst key = ref(1)\nconst direction = 'rtl'\nconst route = useRoute()\nconst appStore = useAppStore()\nconst pageSchema = computed(() => appStore.pages[route.path])\n</script>\n","<template>\n <el-row ref=\"header\" class=\"navbar\" :style=\"navbarStyle\">\n <el-col :span=\"16\">\n <hamburger :is-active=\"sidebar.opened\" class=\"hamburger-container\" @toggleClick=\"toggleSideBar\" />\n <breadcrumb v-if=\"device !== 'mobile'\" class=\"breadcrumb-container\" />\n </el-col>\n <el-col :span=\"8\">\n <div class=\"right-content\">\n <div v-if=\"showPageJsonSchemaIcon\" class=\"right-item\">\n <PageEditor />\n </div>\n <div class=\"right-item-button\" style=\"padding: 0\">\n <v-button :buttons=\"nav\" />\n </div>\n <el-tooltip placement=\"bottom\" :content=\"isDark ? '切换为明亮模式' : '切换为暗黑模式'\">\n <div class=\"right-item theme-toggle\" role=\"button\" tabindex=\"0\" @click=\"toggleTheme\"\n @keydown.enter.prevent=\"toggleTheme\" @keydown.space.prevent=\"toggleTheme\">\n <el-icon>\n <component :is=\"isDark ? Moon : Sunny\" />\n </el-icon>\n </div>\n </el-tooltip>\n <el-dropdown class=\"right-item\" trigger=\"click\">\n <div class=\"user-info\">\n <el-avatar class=\"user-avatar\" :size=\"32\" :src=\"currentAvatar || undefined\" @error=\"handleAvatarError\">{{\n avatarFallback }}</el-avatar>\n <span class=\"user-name\">{{ nickname || name }}</span>\n </div>\n <template #dropdown>\n <el-dropdown-menu class=\"user-dropdown\">\n <el-dropdown-item icon=\"oms-icon-index\" @click=\"$router.push('/')\">首页</el-dropdown-item>\n <el-dropdown-item divided icon=\"el-icon-switch-button\" @click=\"logout\">退出登录</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n </div>\n </el-col>\n <el-drawer v-if=\"showJsonSchema\" :with-header=\"false\" size=\"50%\" />\n </el-row>\n</template>\n\n<script setup lang=\"ts\">\nimport Breadcrumb from './Breadcrumb/index.vue'\nimport Hamburger from './Hamburger/index.vue'\nimport PageEditor from './PageEditor.vue'\nimport { showEleByClassName, Cache, waterMarker } from '@okiss/utils'\nimport { VBtn as VButton } from '@okiss/vbtf'\nimport { useAppStore, useSettingsStore, useUserStore } from '../../../store'\nimport { useThemeMode } from '../../../composables/useThemeMode'\nimport { computed, ref, onMounted, watch } from 'vue'\nimport { Sunny, Moon } from '@element-plus/icons-vue'\n\nconst appStore = useAppStore()\nconst settingsStore = useSettingsStore()\nconst userStore = useUserStore()\n\nconst showExportPop = ref(false)\nconst showJsonSchema = ref(false)\nconst json = ref('')\nconst key = ref(0)\nconst defaultAvatar = computed(() => settingsStore.defaultAvatar)\nconst sidebar = computed(() => appStore.sidebar)\nconst device = computed(() => appStore.device)\nconst avatar = computed(() => userStore.avatar)\nconst name = computed(() => userStore.name)\nconst nickname = computed(() => userStore.nickname)\nconst nav = computed(() => (settingsStore as any).nav)\nconst setting = computed(() => settingsStore)\nconst user = computed(() => userStore)\nconst showPageJsonSchemaIcon = computed(() => settingsStore.showPageJsonSchema || false)\nconst { isDark, toggleTheme } = useThemeMode()\n\nconst navbarStyle = computed(() => {\n const envColor = setting.value.envColor?.[user.value.env]\n if (isDark.value) {\n return {\n background: 'linear-gradient(135deg, rgba(var(--el-color-primary-rgb, 0, 176, 116), 0.15) 0%, rgba(2, 6, 23, 0.95) 100%)',\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n color: 'var(--sidebar-text-color)'\n }\n }\n if (envColor) {\n return {\n background: `linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(243, 244, 248, 0.9) 60%, ${envColor} 100%)`,\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 1px 4px rgba(0, 0, 0, 0.05)',\n color: 'var(--sidebar-text-color)'\n }\n }\n return {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(243, 244, 248, 0.95) 70%, #ffffff 100%)',\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 1px 10px rgba(0, 0, 0, 0.03)',\n color: 'var(--sidebar-text-color)'\n }\n})\n\nonMounted(() => {\n showEleByClassName('el-submenu is-active')\n const noticeStr = getSetting('navBarNotice') || ''\n if (noticeStr.length > 0 && !getSetting('closeNavNotice') && showNotice(noticeStr)) {\n // @ts-ignore\n window?.App?.config?.globalProperties?.$notify({\n title: '提示',\n message: noticeStr,\n dangerouslyUseHTMLString: true,\n duration: 0,\n onClose: closeNavBarNotice\n })\n }\n if (setting.value.envColor?.[user.value.env]) {\n // @ts-ignore\n waterMarker({\n elRef: header.value.$el,\n waterMark: user.value.env,\n color: 'skyblue',\n size: '20'\n })\n }\n})\n\nconst header = ref()\nconst currentAvatar = ref('')\nconst avatarError = ref(false)\n\nwatch([avatar, defaultAvatar], () => {\n avatarError.value = false\n currentAvatar.value = avatar.value || defaultAvatar.value || ''\n}, { immediate: true })\n\nconst avatarFallback = computed(() => {\n const text = nickname.value || name.value || settingsStore.title || '用户'\n return text ? text.toString().trim().charAt(0).toUpperCase() : '用'\n})\nfunction toggleSideBar() { appStore.toggleSideBar() }\nasync function logout() {\n await userStore.logout()\n // @ts-ignore\n const route = window?.App?.config?.globalProperties?.$router?.currentRoute?.value\n location.reload(`${location.origin}/#/login?redirect=${route?.fullPath || '/'}`)\n}\nfunction getSetting(name: string): any { return (settingsStore as any)[name] }\nasync function closeNavBarNotice() {\n settingsStore.updateSettings({ closeNavNotice: true } as any)\n closeNotice(getSetting('navBarNotice'))\n}\nfunction showPopover() { showExportPop.value = true }\nfunction showNotice(text: string) {\n const key = 'dismiss:navbar_notice'\n if (!Cache.exist(key)) return true\n return Cache.get(key) !== text\n}\nfunction closeNotice(text: string) {\n const key = 'dismiss:navbar_notice'\n Cache.set(key, text)\n}\nfunction gotoMenuEdit() {\n // @ts-ignore\n const route = window?.App?.config?.globalProperties?.$router?.currentRoute?.value\n if (route?.meta?.pageId) {\n window.open(location.origin + location.pathname + '#/menu/' + route?.meta?.pageId)\n }\n}\n\nfunction handleAvatarError() {\n if (avatarError.value)\n return\n avatarError.value = true\n currentAvatar.value = ''\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.el-dropdown-link {\n cursor: pointer;\n color: #409eff;\n}\n\n.el-icon-arrow-down {\n font-size: 12px;\n}\n\n.navbar {\n display: flex;\n height: 50px;\n /*overflow: hidden;*/\n position: relative;\n background: var(--sidebar-bg, #fff);\n box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);\n color: var(--sidebar-text-color);\n\n .hamburger-container {\n line-height: 50px;\n height: 100%;\n float: left;\n cursor: pointer;\n transition: background 0.3s;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: var(--sidebar-hover-bg, rgba(0, 0, 0, 0.025));\n }\n }\n\n .breadcrumb-container {\n float: left;\n }\n}\n\n.notice-setting {\n left: 50%;\n top: 50%;\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.right-content {\n float: right;\n height: 100%;\n padding-right: 20px;\n color: inherit;\n display: flex;\n\n .icon {\n font-size: 18px;\n\n &:focus {\n outline: none;\n }\n }\n\n .right-item {\n padding: 0 12px;\n height: 100%;\n transition: all 0.3s;\n cursor: pointer;\n display: flex;\n align-items: center;\n\n &:hover {\n background: var(--sidebar-hover-bg, rgba(0, 0, 0, 0.025));\n }\n }\n\n .theme-toggle {\n justify-content: center;\n\n .el-icon {\n font-size: 18px;\n }\n }\n\n .right-item-button {\n height: 100%;\n transition: all 0.3s;\n cursor: pointer;\n display: flex;\n align-items: center;\n }\n\n .user-info {\n height: 50px;\n line-height: 50px;\n display: inline-flex;\n align-items: center;\n }\n\n .user-avatar {\n margin: 0 10px 0 0;\n color: #fff;\n background: var(--el-color-primary, #1890ff);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .user-name {\n vertical-align: middle;\n }\n}\n</style>\n","<template>\n <el-row ref=\"header\" class=\"navbar\" :style=\"navbarStyle\">\n <el-col :span=\"16\">\n <hamburger :is-active=\"sidebar.opened\" class=\"hamburger-container\" @toggleClick=\"toggleSideBar\" />\n <breadcrumb v-if=\"device !== 'mobile'\" class=\"breadcrumb-container\" />\n </el-col>\n <el-col :span=\"8\">\n <div class=\"right-content\">\n <div v-if=\"showPageJsonSchemaIcon\" class=\"right-item\">\n <PageEditor />\n </div>\n <div class=\"right-item-button\" style=\"padding: 0\">\n <v-button :buttons=\"nav\" />\n </div>\n <el-tooltip placement=\"bottom\" :content=\"isDark ? '切换为明亮模式' : '切换为暗黑模式'\">\n <div class=\"right-item theme-toggle\" role=\"button\" tabindex=\"0\" @click=\"toggleTheme\"\n @keydown.enter.prevent=\"toggleTheme\" @keydown.space.prevent=\"toggleTheme\">\n <el-icon>\n <component :is=\"isDark ? Moon : Sunny\" />\n </el-icon>\n </div>\n </el-tooltip>\n <el-dropdown class=\"right-item\" trigger=\"click\">\n <div class=\"user-info\">\n <el-avatar class=\"user-avatar\" :size=\"32\" :src=\"currentAvatar || undefined\" @error=\"handleAvatarError\">{{\n avatarFallback }}</el-avatar>\n <span class=\"user-name\">{{ nickname || name }}</span>\n </div>\n <template #dropdown>\n <el-dropdown-menu class=\"user-dropdown\">\n <el-dropdown-item icon=\"oms-icon-index\" @click=\"$router.push('/')\">首页</el-dropdown-item>\n <el-dropdown-item divided icon=\"el-icon-switch-button\" @click=\"logout\">退出登录</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n </div>\n </el-col>\n <el-drawer v-if=\"showJsonSchema\" :with-header=\"false\" size=\"50%\" />\n </el-row>\n</template>\n\n<script setup lang=\"ts\">\nimport Breadcrumb from './Breadcrumb/index.vue'\nimport Hamburger from './Hamburger/index.vue'\nimport PageEditor from './PageEditor.vue'\nimport { showEleByClassName, Cache, waterMarker } from '@okiss/utils'\nimport { VBtn as VButton } from '@okiss/vbtf'\nimport { useAppStore, useSettingsStore, useUserStore } from '../../../store'\nimport { useThemeMode } from '../../../composables/useThemeMode'\nimport { computed, ref, onMounted, watch } from 'vue'\nimport { Sunny, Moon } from '@element-plus/icons-vue'\n\nconst appStore = useAppStore()\nconst settingsStore = useSettingsStore()\nconst userStore = useUserStore()\n\nconst showExportPop = ref(false)\nconst showJsonSchema = ref(false)\nconst json = ref('')\nconst key = ref(0)\nconst defaultAvatar = computed(() => settingsStore.defaultAvatar)\nconst sidebar = computed(() => appStore.sidebar)\nconst device = computed(() => appStore.device)\nconst avatar = computed(() => userStore.avatar)\nconst name = computed(() => userStore.name)\nconst nickname = computed(() => userStore.nickname)\nconst nav = computed(() => (settingsStore as any).nav)\nconst setting = computed(() => settingsStore)\nconst user = computed(() => userStore)\nconst showPageJsonSchemaIcon = computed(() => settingsStore.showPageJsonSchema || false)\nconst { isDark, toggleTheme } = useThemeMode()\n\nconst navbarStyle = computed(() => {\n const envColor = setting.value.envColor?.[user.value.env]\n if (isDark.value) {\n return {\n background: 'linear-gradient(135deg, rgba(var(--el-color-primary-rgb, 0, 176, 116), 0.15) 0%, rgba(2, 6, 23, 0.95) 100%)',\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n color: 'var(--sidebar-text-color)'\n }\n }\n if (envColor) {\n return {\n background: `linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(243, 244, 248, 0.9) 60%, ${envColor} 100%)`,\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 1px 4px rgba(0, 0, 0, 0.05)',\n color: 'var(--sidebar-text-color)'\n }\n }\n return {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(243, 244, 248, 0.95) 70%, #ffffff 100%)',\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 1px 10px rgba(0, 0, 0, 0.03)',\n color: 'var(--sidebar-text-color)'\n }\n})\n\nonMounted(() => {\n showEleByClassName('el-submenu is-active')\n const noticeStr = getSetting('navBarNotice') || ''\n if (noticeStr.length > 0 && !getSetting('closeNavNotice') && showNotice(noticeStr)) {\n // @ts-ignore\n window?.App?.config?.globalProperties?.$notify({\n title: '提示',\n message: noticeStr,\n dangerouslyUseHTMLString: true,\n duration: 0,\n onClose: closeNavBarNotice\n })\n }\n if (setting.value.envColor?.[user.value.env]) {\n // @ts-ignore\n waterMarker({\n elRef: header.value.$el,\n waterMark: user.value.env,\n color: 'skyblue',\n size: '20'\n })\n }\n})\n\nconst header = ref()\nconst currentAvatar = ref('')\nconst avatarError = ref(false)\n\nwatch([avatar, defaultAvatar], () => {\n avatarError.value = false\n currentAvatar.value = avatar.value || defaultAvatar.value || ''\n}, { immediate: true })\n\nconst avatarFallback = computed(() => {\n const text = nickname.value || name.value || settingsStore.title || '用户'\n return text ? text.toString().trim().charAt(0).toUpperCase() : '用'\n})\nfunction toggleSideBar() { appStore.toggleSideBar() }\nasync function logout() {\n await userStore.logout()\n // @ts-ignore\n const route = window?.App?.config?.globalProperties?.$router?.currentRoute?.value\n location.reload(`${location.origin}/#/login?redirect=${route?.fullPath || '/'}`)\n}\nfunction getSetting(name: string): any { return (settingsStore as any)[name] }\nasync function closeNavBarNotice() {\n settingsStore.updateSettings({ closeNavNotice: true } as any)\n closeNotice(getSetting('navBarNotice'))\n}\nfunction showPopover() { showExportPop.value = true }\nfunction showNotice(text: string) {\n const key = 'dismiss:navbar_notice'\n if (!Cache.exist(key)) return true\n return Cache.get(key) !== text\n}\nfunction closeNotice(text: string) {\n const key = 'dismiss:navbar_notice'\n Cache.set(key, text)\n}\nfunction gotoMenuEdit() {\n // @ts-ignore\n const route = window?.App?.config?.globalProperties?.$router?.currentRoute?.value\n if (route?.meta?.pageId) {\n window.open(location.origin + location.pathname + '#/menu/' + route?.meta?.pageId)\n }\n}\n\nfunction handleAvatarError() {\n if (avatarError.value)\n return\n avatarError.value = true\n currentAvatar.value = ''\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.el-dropdown-link {\n cursor: pointer;\n color: #409eff;\n}\n\n.el-icon-arrow-down {\n font-size: 12px;\n}\n\n.navbar {\n display: flex;\n height: 50px;\n /*overflow: hidden;*/\n position: relative;\n background: var(--sidebar-bg, #fff);\n box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);\n color: var(--sidebar-text-color);\n\n .hamburger-container {\n line-height: 50px;\n height: 100%;\n float: left;\n cursor: pointer;\n transition: background 0.3s;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: var(--sidebar-hover-bg, rgba(0, 0, 0, 0.025));\n }\n }\n\n .breadcrumb-container {\n float: left;\n }\n}\n\n.notice-setting {\n left: 50%;\n top: 50%;\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.right-content {\n float: right;\n height: 100%;\n padding-right: 20px;\n color: inherit;\n display: flex;\n\n .icon {\n font-size: 18px;\n\n &:focus {\n outline: none;\n }\n }\n\n .right-item {\n padding: 0 12px;\n height: 100%;\n transition: all 0.3s;\n cursor: pointer;\n display: flex;\n align-items: center;\n\n &:hover {\n background: var(--sidebar-hover-bg, rgba(0, 0, 0, 0.025));\n }\n }\n\n .theme-toggle {\n justify-content: center;\n\n .el-icon {\n font-size: 18px;\n }\n }\n\n .right-item-button {\n height: 100%;\n transition: all 0.3s;\n cursor: pointer;\n display: flex;\n align-items: center;\n }\n\n .user-info {\n height: 50px;\n line-height: 50px;\n display: inline-flex;\n align-items: center;\n }\n\n .user-avatar {\n margin: 0 10px 0 0;\n color: #fff;\n background: var(--el-color-primary, #1890ff);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .user-name {\n vertical-align: middle;\n }\n}\n</style>\n","<template>\n <div class=\"sidebar-logo-container\" :class=\"{ collapse: collapse }\">\n <transition name=\"sidebarLogoFade\">\n <router-link v-if=\"collapse\" key=\"collapse\" class=\"sidebar-logo-link\" to=\"/\">\n <el-image v-if=\"showLogoImage\" :src=\"logo || ''\" fit=\"contain\" class=\"sidebar-logo\" @error=\"handleLogoError\">\n <template #error>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n </el-image>\n <template v-else>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n <div class=\"sidebar-subtitle\">系统</div>\n </router-link>\n <router-link v-else key=\"expand\" class=\"sidebar-logo-link\" to=\"/\">\n <el-image v-if=\"showLogoImage\" :src=\"logo || ''\" fit=\"contain\" class=\"sidebar-logo\" @error=\"handleLogoError\">\n <template #error>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n </el-image>\n <template v-else>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n <h1 class=\"sidebar-title\">{{ title }}</h1>\n </router-link>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSettingsStore } from '../../../../store'\nimport { computed, ref, watch } from 'vue'\n\ndefineProps<{ collapse: boolean }>()\nconst settings = useSettingsStore()\nconst title = computed(() => settings.title as any)\nconst logo = computed(() => settings.logo as any)\nconst logoError = ref(false)\n\nconst showLogoImage = computed(() => !!logo.value && !logoError.value)\nconst logoFallback = computed(() => {\n const text = title.value || 'OMS'\n return text ? text.toString().trim().charAt(0).toUpperCase() : 'O'\n})\n\nwatch(logo, () => {\n logoError.value = false\n}, { immediate: true })\n\nfunction handleLogoError() {\n logoError.value = true\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.sidebarLogoFade-enter-active {\n transition: opacity 1.5s;\n}\n\n.sidebarLogoFade-enter,\n.sidebarLogoFade-leave-to {\n opacity: 0;\n}\n\n.sidebar-logo-container {\n position: relative;\n width: 100%;\n height: 50px;\n line-height: 50px;\n background: var(--sidebar-bg, #ffffff);\n text-align: center;\n color: var(--sidebar-logo-text-color, #00b074);\n overflow: hidden;\n\n & .sidebar-logo-link {\n height: 100%;\n width: 100%;\n\n & .sidebar-logo {\n width: 32px;\n height: 32px;\n vertical-align: middle;\n margin-right: 12px;\n }\n\n & .sidebar-title {\n display: inline-block;\n margin: 0;\n color: var(--sidebar-logo-text-color, #00b074);\n font-weight: 700;\n line-height: 50px;\n font-size: 20px;\n font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;\n vertical-align: middle;\n }\n\n & .sidebar-logo-fallback {\n width: 32px;\n height: 32px;\n line-height: 32px;\n border-radius: 6px;\n background: rgba(var(--el-color-primary-rgb, 0, 176, 116), 0.1);\n color: var(--el-color-primary, #00b074);\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n }\n\n & .sidebar-subtitle {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.78);\n }\n }\n\n &.collapse {\n .sidebar-logo {\n margin-right: 0px;\n }\n\n .sidebar-logo-fallback {\n margin-right: 0px;\n }\n }\n}\n</style>\n","<template>\n <div class=\"sidebar-logo-container\" :class=\"{ collapse: collapse }\">\n <transition name=\"sidebarLogoFade\">\n <router-link v-if=\"collapse\" key=\"collapse\" class=\"sidebar-logo-link\" to=\"/\">\n <el-image v-if=\"showLogoImage\" :src=\"logo || ''\" fit=\"contain\" class=\"sidebar-logo\" @error=\"handleLogoError\">\n <template #error>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n </el-image>\n <template v-else>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n <div class=\"sidebar-subtitle\">系统</div>\n </router-link>\n <router-link v-else key=\"expand\" class=\"sidebar-logo-link\" to=\"/\">\n <el-image v-if=\"showLogoImage\" :src=\"logo || ''\" fit=\"contain\" class=\"sidebar-logo\" @error=\"handleLogoError\">\n <template #error>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n </el-image>\n <template v-else>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n <h1 class=\"sidebar-title\">{{ title }}</h1>\n </router-link>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSettingsStore } from '../../../../store'\nimport { computed, ref, watch } from 'vue'\n\ndefineProps<{ collapse: boolean }>()\nconst settings = useSettingsStore()\nconst title = computed(() => settings.title as any)\nconst logo = computed(() => settings.logo as any)\nconst logoError = ref(false)\n\nconst showLogoImage = computed(() => !!logo.value && !logoError.value)\nconst logoFallback = computed(() => {\n const text = title.value || 'OMS'\n return text ? text.toString().trim().charAt(0).toUpperCase() : 'O'\n})\n\nwatch(logo, () => {\n logoError.value = false\n}, { immediate: true })\n\nfunction handleLogoError() {\n logoError.value = true\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.sidebarLogoFade-enter-active {\n transition: opacity 1.5s;\n}\n\n.sidebarLogoFade-enter,\n.sidebarLogoFade-leave-to {\n opacity: 0;\n}\n\n.sidebar-logo-container {\n position: relative;\n width: 100%;\n height: 50px;\n line-height: 50px;\n background: var(--sidebar-bg, #ffffff);\n text-align: center;\n color: var(--sidebar-logo-text-color, #00b074);\n overflow: hidden;\n\n & .sidebar-logo-link {\n height: 100%;\n width: 100%;\n\n & .sidebar-logo {\n width: 32px;\n height: 32px;\n vertical-align: middle;\n margin-right: 12px;\n }\n\n & .sidebar-title {\n display: inline-block;\n margin: 0;\n color: var(--sidebar-logo-text-color, #00b074);\n font-weight: 700;\n line-height: 50px;\n font-size: 20px;\n font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;\n vertical-align: middle;\n }\n\n & .sidebar-logo-fallback {\n width: 32px;\n height: 32px;\n line-height: 32px;\n border-radius: 6px;\n background: rgba(var(--el-color-primary-rgb, 0, 176, 116), 0.1);\n color: var(--el-color-primary, #00b074);\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n }\n\n & .sidebar-subtitle {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.78);\n }\n }\n\n &.collapse {\n .sidebar-logo {\n margin-right: 0px;\n }\n\n .sidebar-logo-fallback {\n margin-right: 0px;\n }\n }\n}\n</style>\n","<template>\n <component\n :is=\"compType(to)\"\n v-bind=\"linkProps(to)\"\n >\n <slot />\n </component>\n</template>\n\n<script>\nimport { isExternal } from '@okiss/utils'\n\nexport default {\n props: {\n to: {\n type: String,\n required: true\n },\n newTab: {\n type: Boolean,\n required: false\n }\n },\n methods: {\n compType(url) {\n if (isExternal(url) || this.newTab) {\n return 'a'\n } else {\n return 'router-link'\n }\n },\n linkProps(url) {\n if (isExternal(url)) {\n return {\n is: 'a',\n href: url,\n target: '_blank',\n rel: 'noopener'\n }\n }\n if (this.newTab) {\n const routeData = this.$router.resolve(url)\n return {\n is: 'a',\n href: routeData.href,\n target: '_blank',\n rel: 'noopener'\n }\n }\n return {\n is: 'router-link',\n to: url\n }\n }\n }\n}\n</script>\n","export default {\n computed: {\n // @ts-ignore\n device() {\n // Access device from Pinia state without importing\n // @ts-ignore\n return this.$pinia?.state?.value?.app?.device || 'desktop'\n }\n },\n mounted() {\n // In order to fix the click on menu on the ios device will trigger the mouseleave bug\n // https://github.com/PanJiaChen/vue-element-admin/issues/1135\n // @ts-ignore\n this.fixBugIniOS()\n },\n methods: {\n fixBugIniOS() {\n // @ts-ignore\n const $subMenu = this.$refs.subMenu\n if ($subMenu) {\n const handleMouseleave = $subMenu.handleMouseleave\n // @ts-ignore\n $subMenu.handleMouseleave = e => {\n // @ts-ignore\n if (this.device === 'mobile') {\n return\n }\n handleMouseleave(e)\n }\n }\n }\n }\n}\n","<template>\n <VIcon :name=\"meta.icon || 'ra-all'\" />\n <span class=\"menu-content\">{{ meta.title }}</span>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps({\n meta: {\n type: Object,\n default: () => {\n return {\n icon: '',\n title: ''\n }\n }\n }\n})\n</script>\n","<template>\n <VIcon :name=\"meta.icon || 'ra-all'\" />\n <span class=\"menu-content\">{{ meta.title }}</span>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps({\n meta: {\n type: Object,\n default: () => {\n return {\n icon: '',\n title: ''\n }\n }\n }\n})\n</script>\n","<template>\n <div\n v-if=\"item.hidden !== false\"\n class=\"menu-wrapper\"\n >\n <!-- 没有子菜单 -->\n <template v-if=\"item.meta && item.meta.menuType === 2\">\n <el-tooltip\n :disabled=\"!isCollapse\"\n effect=\"dark\"\n placement=\"right\"\n :content=\"item.meta?.title\"\n >\n <app-link\n v-if=\"item.meta\"\n :to=\"to\"\n :new-tab=\"item.meta.newTab\"\n >\n <el-menu-item\n :index=\"to\"\n :class=\"{ 'submenu-title-noDropdown': !isNest }\"\n @click=\"itemClick\"\n >\n <menu-content :meta=\"item.meta\" />\n </el-menu-item>\n </app-link>\n </el-tooltip>\n </template>\n <!-- 有子菜单 -->\n <el-tooltip\n v-else-if=\"item.meta && item.meta.menuType === 1\"\n :disabled=\"!isCollapse\"\n effect=\"dark\"\n placement=\"right\"\n :content=\"item.meta?.title\"\n >\n <el-sub-menu\n ref=\"subMenu\"\n :index=\"to\"\n :class=\"{ 'submenu-title-noDropdown': !isNest }\"\n >\n <template #title>\n <app-link\n v-if=\"item.redirect && item.redirect !== '#'\"\n :to=\"to\"\n >\n <menu-content :meta=\"item.meta\" />\n </app-link>\n <menu-content\n v-else\n :meta=\"item.meta\"\n />\n </template>\n <sidebar-item\n v-for=\"child in item.children\"\n :key=\"child.path\"\n :is-nest=\"true\"\n :item=\"child\"\n :to=\"getTo(child)\"\n class=\"nest-menu\"\n />\n </el-sub-menu>\n </el-tooltip>\n </div>\n</template>\n\n<script>\nimport AppLink from './Link.vue'\nimport FixiOSBug from './FixiOSBug'\nimport MenuContent from './MenuContent.vue'\nimport { Cache } from '@okiss/utils'\n\nexport default {\n name: 'SidebarItem',\n components: {\n AppLink,\n MenuContent\n },\n mixins: [FixiOSBug],\n props: {\n // route object\n item: {\n type: Object,\n required: true\n },\n isNest: {\n type: Boolean,\n default: false\n },\n to: {\n type: String,\n default: ''\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n methods: {\n itemClick() {\n Cache.remove('table_filter:' + this.$props.to)\n },\n getTo(child) {\n try {\n const to = this.$router.resolve(child.redirect ? child.redirect : child)\n return to.fullPath\n } catch (e) {\n console.error('路由解析错误')\n return '/'\n }\n }\n }\n}\n</script>\n","<template>\n <el-select v-model=\"selected\" filterable placeholder=\"搜索菜单...\" class=\"search-menu\" @change=\"onselected\">\n <template v-for=\"group in filterRoutes\" :key=\"group.path\">\n <template v-if=\"group.children !== undefined\">\n <el-option-group v-if=\"group.meta.menuType !== 0\" :key=\"group.path + '-'\" :label=\"group.meta.title\">\n <template v-for=\"(item, index) in group.children\" :key=\"item.path\">\n <el-option v-if=\"group.meta.menuType !== 0\"\n :label=\"(index === (group.children.length - 1) ? '└─' : '├─') + item.meta.title\"\n :value=\"getJumpPath(item)\" />\n </template>\n </el-option-group>\n </template>\n <template v-else>\n <el-option :label=\"'' + group.meta.title\" :value=\"getJumpPath(group)\" />\n </template>\n </template>\n </el-select>\n</template>\n<script setup lang=\"ts\">\nimport { cloneDeep } from 'lodash'\nimport { useUserStore } from '../../../../store'\nimport { useRouter } from 'vue-router'\nconst userStore = useUserStore()\n\nfunction filterHidden(arr: any[]) {\n return arr.filter((each: any) => {\n if (each.meta?.menuType === 0) {\n return false\n }\n if (each.children) {\n each.children = filterHidden(each.children)\n if (each.children.length === 0) {\n delete each.children\n }\n }\n return true\n })\n}\n\nconst selected = ref('')\nconst remoteRouter = computed(() => userStore.remoteRouter)\nconst router = useRouter()\n\nconst filterRoutes = computed(() => {\n let routes: any[] = []\n remoteRouter.value.forEach(item => { routes = routes.concat(cloneDeep(item.routes)) })\n return filterHidden(routes)\n})\n\nfunction getJumpPath(route: any) {\n let _route = route\n if (route.meta.menuType === 1 && route.children && route.children.length > 0) {\n for (let i = 0; i < route.children.length; i++) {\n if (route.children[i].path.indexOf('/:') === -1) {\n _route = route.children[i]\n break\n }\n }\n }\n return router.resolve(_route.redirect ? _route.redirect : _route).fullPath\n}\nfunction onselected(to: string) { router.push(to); selected.value = '' }\n</script>\n<style lang=\"scss\" scoped>\n.search-menu {\n width: 100%;\n padding: 10px 20px;\n\n ::v-deep(.el-select__wrapper) {\n background-color: transparent;\n border: 1.5px solid var(--border-color);\n border-radius: 12px;\n box-shadow: none;\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color);\n background-color: var(--sidebar-hover-bg);\n }\n }\n\n //::v-deep(.el-input__wrapper:hover) {\n // box-shadow: none;\n //}\n //::v-deep(.el-input__wrapper:focus) {\n // box-shadow: none;\n //}\n //::v-deep(.is-focus) {\n // border: none;\n // box-shadow: none;\n //}\n}\n\n.filter-tree {\n max-height: 500px;\n}\n</style>\n","<template>\n <el-select v-model=\"selected\" filterable placeholder=\"搜索菜单...\" class=\"search-menu\" @change=\"onselected\">\n <template v-for=\"group in filterRoutes\" :key=\"group.path\">\n <template v-if=\"group.children !== undefined\">\n <el-option-group v-if=\"group.meta.menuType !== 0\" :key=\"group.path + '-'\" :label=\"group.meta.title\">\n <template v-for=\"(item, index) in group.children\" :key=\"item.path\">\n <el-option v-if=\"group.meta.menuType !== 0\"\n :label=\"(index === (group.children.length - 1) ? '└─' : '├─') + item.meta.title\"\n :value=\"getJumpPath(item)\" />\n </template>\n </el-option-group>\n </template>\n <template v-else>\n <el-option :label=\"'' + group.meta.title\" :value=\"getJumpPath(group)\" />\n </template>\n </template>\n </el-select>\n</template>\n<script setup lang=\"ts\">\nimport { cloneDeep } from 'lodash'\nimport { useUserStore } from '../../../../store'\nimport { useRouter } from 'vue-router'\nconst userStore = useUserStore()\n\nfunction filterHidden(arr: any[]) {\n return arr.filter((each: any) => {\n if (each.meta?.menuType === 0) {\n return false\n }\n if (each.children) {\n each.children = filterHidden(each.children)\n if (each.children.length === 0) {\n delete each.children\n }\n }\n return true\n })\n}\n\nconst selected = ref('')\nconst remoteRouter = computed(() => userStore.remoteRouter)\nconst router = useRouter()\n\nconst filterRoutes = computed(() => {\n let routes: any[] = []\n remoteRouter.value.forEach(item => { routes = routes.concat(cloneDeep(item.routes)) })\n return filterHidden(routes)\n})\n\nfunction getJumpPath(route: any) {\n let _route = route\n if (route.meta.menuType === 1 && route.children && route.children.length > 0) {\n for (let i = 0; i < route.children.length; i++) {\n if (route.children[i].path.indexOf('/:') === -1) {\n _route = route.children[i]\n break\n }\n }\n }\n return router.resolve(_route.redirect ? _route.redirect : _route).fullPath\n}\nfunction onselected(to: string) { router.push(to); selected.value = '' }\n</script>\n<style lang=\"scss\" scoped>\n.search-menu {\n width: 100%;\n padding: 10px 20px;\n\n ::v-deep(.el-select__wrapper) {\n background-color: transparent;\n border: 1.5px solid var(--border-color);\n border-radius: 12px;\n box-shadow: none;\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color);\n background-color: var(--sidebar-hover-bg);\n }\n }\n\n //::v-deep(.el-input__wrapper:hover) {\n // box-shadow: none;\n //}\n //::v-deep(.el-input__wrapper:focus) {\n // box-shadow: none;\n //}\n //::v-deep(.is-focus) {\n // border: none;\n // box-shadow: none;\n //}\n}\n\n.filter-tree {\n max-height: 500px;\n}\n</style>\n","<template>\n <div :class=\"{ 'has-logo': showLogo }\">\n <logo\n v-if=\"showLogo\"\n :collapse=\"isCollapse\"\n />\n <el-scrollbar wrap-class=\"scrollbar-wrapper\">\n <search-menu v-if=\"!isCollapse\" />\n <el-menu\n :default-active=\"activeMenu\"\n :collapse=\"isCollapse\"\n :unique-opened=\"false\"\n :collapse-transition=\"false\"\n mode=\"vertical\"\n >\n <template\n v-for=\"(item, index) in routes\"\n :key=\"index + '-module'\"\n >\n <!-- <div v-if=\"item.routes.length > 0 && item.label\" class=\"menu-section\">{{ item.label }}</div>-->\n <sidebar-item\n v-for=\"route in filterRoute(item.routes)\"\n :key=\"route.path\"\n :item=\"route\"\n :to=\"$router.resolve(route.redirect ? route.redirect : route).fullPath\"\n :is-collapse=\"isCollapse\"\n />\n </template>\n </el-menu>\n </el-scrollbar>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Logo from './Logo.vue'\nimport SidebarItem from './SidebarItem.vue'\nimport SearchMenu from './SearchMenu.vue'\nimport { cloneDeep } from 'lodash'\nimport { MenuType } from '../../../../types'\nimport { showEleByClassName } from '@okiss/utils'\nimport { useAppStore, useUserStore, useSettingsStore } from '../../../../store'\nimport { useRouter, useRoute } from 'vue-router'\n\nconst appStore = useAppStore()\nconst userStore = useUserStore()\nconst settingsStore = useSettingsStore()\n\nconst sidebar = computed(() => appStore.sidebar)\nconst remoteRouter = computed(() => userStore.remoteRouter)\nconst customRouter = computed(() => userStore.customRouter)\n\nconst router = useRouter()\nconst route = useRoute()\n\nconst routes = computed(() => {\n let localRoutes: any[] = []\n router.options.routes.concat(customRouter.value || []).forEach(item => {\n if (item.path === '/') {\n localRoutes = localRoutes.concat(item.children || [])\n } else {\n localRoutes.push(item)\n }\n })\n return cloneDeep([\n { label: '', routes: localRoutes },\n ...remoteRouter.value\n ])\n})\n\nconst activeMenu = computed(() => {\n const m = route.matched\n for (let i = m.length - 1; i >= 0; i--) {\n const tmp = m[i]\n if (tmp.meta.menuType === MenuType.menu) {\n showActive()\n return router.resolve(tmp.redirect ? tmp.redirect : tmp).fullPath\n }\n }\n return ''\n})\n\nconst showLogo = computed(() => settingsStore.sidebarLogo)\nconst isCollapse = computed(() => !sidebar.value.opened)\n\nonMounted(() => showActive())\nfunction showActive() { showEleByClassName('is-active', 200) }\nfunction filterRoute(arr: any[]) {\n return arr.filter(item => [MenuType.dir, MenuType.menu].indexOf(item.meta.menuType) !== -1)\n .map(item => {\n item = Object.assign({}, item)\n if (item.children) item.children = filterRoute(item.children)\n return item\n })\n}\n</script>\n<style scoped>\n::v-deep(.el-scrollbar__wrap) {\n overflow: scroll;\n}\n\n.menu-section {\n height: 30px;\n font-size: 14px;\n display: table-cell;\n vertical-align: bottom;\n padding-left: 20px;\n color: #97a8be;\n padding-top: 5px;\n}\n</style>\n","<template>\n <div :class=\"{ 'has-logo': showLogo }\">\n <logo\n v-if=\"showLogo\"\n :collapse=\"isCollapse\"\n />\n <el-scrollbar wrap-class=\"scrollbar-wrapper\">\n <search-menu v-if=\"!isCollapse\" />\n <el-menu\n :default-active=\"activeMenu\"\n :collapse=\"isCollapse\"\n :unique-opened=\"false\"\n :collapse-transition=\"false\"\n mode=\"vertical\"\n >\n <template\n v-for=\"(item, index) in routes\"\n :key=\"index + '-module'\"\n >\n <!-- <div v-if=\"item.routes.length > 0 && item.label\" class=\"menu-section\">{{ item.label }}</div>-->\n <sidebar-item\n v-for=\"route in filterRoute(item.routes)\"\n :key=\"route.path\"\n :item=\"route\"\n :to=\"$router.resolve(route.redirect ? route.redirect : route).fullPath\"\n :is-collapse=\"isCollapse\"\n />\n </template>\n </el-menu>\n </el-scrollbar>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Logo from './Logo.vue'\nimport SidebarItem from './SidebarItem.vue'\nimport SearchMenu from './SearchMenu.vue'\nimport { cloneDeep } from 'lodash'\nimport { MenuType } from '../../../../types'\nimport { showEleByClassName } from '@okiss/utils'\nimport { useAppStore, useUserStore, useSettingsStore } from '../../../../store'\nimport { useRouter, useRoute } from 'vue-router'\n\nconst appStore = useAppStore()\nconst userStore = useUserStore()\nconst settingsStore = useSettingsStore()\n\nconst sidebar = computed(() => appStore.sidebar)\nconst remoteRouter = computed(() => userStore.remoteRouter)\nconst customRouter = computed(() => userStore.customRouter)\n\nconst router = useRouter()\nconst route = useRoute()\n\nconst routes = computed(() => {\n let localRoutes: any[] = []\n router.options.routes.concat(customRouter.value || []).forEach(item => {\n if (item.path === '/') {\n localRoutes = localRoutes.concat(item.children || [])\n } else {\n localRoutes.push(item)\n }\n })\n return cloneDeep([\n { label: '', routes: localRoutes },\n ...remoteRouter.value\n ])\n})\n\nconst activeMenu = computed(() => {\n const m = route.matched\n for (let i = m.length - 1; i >= 0; i--) {\n const tmp = m[i]\n if (tmp.meta.menuType === MenuType.menu) {\n showActive()\n return router.resolve(tmp.redirect ? tmp.redirect : tmp).fullPath\n }\n }\n return ''\n})\n\nconst showLogo = computed(() => settingsStore.sidebarLogo)\nconst isCollapse = computed(() => !sidebar.value.opened)\n\nonMounted(() => showActive())\nfunction showActive() { showEleByClassName('is-active', 200) }\nfunction filterRoute(arr: any[]) {\n return arr.filter(item => [MenuType.dir, MenuType.menu].indexOf(item.meta.menuType) !== -1)\n .map(item => {\n item = Object.assign({}, item)\n if (item.children) item.children = filterRoute(item.children)\n return item\n })\n}\n</script>\n<style scoped>\n::v-deep(.el-scrollbar__wrap) {\n overflow: scroll;\n}\n\n.menu-section {\n height: 30px;\n font-size: 14px;\n display: table-cell;\n vertical-align: bottom;\n padding-left: 20px;\n color: #97a8be;\n padding-top: 5px;\n}\n</style>\n","<template>\n <section class=\"app-main\">\n <router-view :key=\"$route.fullPath + key\" />\n <el-backtop :bottom=\"50\" />\n </section>\n</template>\n\n<script setup>\nimport { useRoute, onBeforeRouteLeave } from 'vue-router'\nconst route = useRoute()\nconst include = []\nconst key = ref(0)\nonBeforeRouteLeave(() => {\n if (route.meta?.keepAlive) {\n !!include.indexOf(route.name) && include.push(route.name)\n }\n key.value++\n})\n</script>\n\n<style scoped>\n.app-main {\n /*50 = navbar */\n min-height: calc(100vh - 50px);\n width: 100%;\n position: relative;\n overflow: hidden;\n padding: 20px;\n}\n\n.fixed-header + .app-main {\n padding-top: 50px;\n}\n</style>\n","<template>\n <div :class=\"classObj\" class=\"app-wrapper\">\n <div v-if=\"device === 'mobile' && sidebar.opened\" class=\"drawer-bg\" @click=\"handleClickOutside\" />\n <Sidebar class=\"sidebar-container\" />\n <div class=\"main-container\">\n <div :class=\"{ 'fixed-header': fixedHeader }\">\n <Navbar />\n </div>\n <AppMain />\n </div>\n </div>\n</template>\n\n<script setup>\nimport { Navbar, Sidebar, AppMain } from './components'\nimport { useEventListener } from '@vueuse/core'\nimport { useAppStore, useSettingsStore } from '../../store'\nimport { useRoute } from 'vue-router'\nimport { watch } from 'vue'\n\nconst { body } = document\nconst WIDTH = 992 // refer to Bootstrap's responsive design\n\nconst appStore = useAppStore()\nconst settingsStore = useSettingsStore()\nconst route = useRoute()\n\nconst sidebar = computed(() => appStore.sidebar)\nconst device = computed(() => appStore.device)\nconst fixedHeader = computed(() => settingsStore.fixedHeader)\n\nconst classObj = computed(() => {\n return {\n hideSidebar: !sidebar.value.opened,\n openSidebar: sidebar.value.opened,\n withoutAnimation: sidebar.value.withoutAnimation,\n mobile: device.value === 'mobile'\n }\n})\n\nconst isMobile = () => {\n const rect = body.getBoundingClientRect()\n return rect.width - 1 < WIDTH\n}\n\nconst resizeHandler = () => {\n if (!document.hidden) {\n const ismobile = isMobile()\n appStore.toggleDevice(ismobile ? 'mobile' : 'desktop')\n if (ismobile) appStore.closeSideBar({ withoutAnimation: true })\n }\n}\n\nresizeHandler()\n\nuseEventListener(window, 'resize', () => resizeHandler())\n\nwatch(route, () => {\n if (device.value === 'mobile' && sidebar.value.opened) {\n appStore.closeSideBar({ withoutAnimation: false })\n }\n})\n\nconst handleClickOutside = () => appStore.closeSideBar({ withoutAnimation: false })\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"../../styles/mixin\" as *;\n@use \"../../styles/variables\" as *;\n\n.app-wrapper {\n @include clearfix;\n\n &.mobile.openSidebar {\n position: fixed;\n top: 0;\n }\n}\n\n.drawer-bg {\n background: #000;\n opacity: 0.3;\n width: 100%;\n top: 0;\n height: 100%;\n position: fixed;\n z-index: 999;\n}\n\n.fixed-header {\n position: fixed;\n top: 0;\n right: 0;\n z-index: 9;\n width: calc(100% - #{$sideBarWidth});\n transition: width 0.28s;\n}\n\n.hideSidebar .fixed-header {\n width: calc(100% - 54px);\n}\n\n.mobile .fixed-header {\n width: 100%;\n}\n</style>\n","import type { RouteRecordRaw } from 'vue-router'\n\nconst SUPER_ROLE = 'root'\n\nconst splitRoles = (roleValue: string | undefined): string[] => {\n if (!roleValue) {\n return []\n }\n return roleValue\n .split(',')\n .map(item => item.trim())\n .filter(item => !!item)\n}\n\nconst getRouteRoles = (route: RouteRecordRaw): string[] => {\n const directRole = typeof (route as any).role === 'string' ? (route as any).role : ''\n const metaRole = route.meta && typeof (route.meta as any).role === 'string' ? (route.meta as any).role : ''\n const roles = [...splitRoles(directRole), ...splitRoles(metaRole)]\n if (!roles.length && route.children && route.children.length) {\n return []\n }\n return Array.from(new Set(roles))\n}\n\nconst cloneRoute = (route: RouteRecordRaw): RouteRecordRaw => {\n const cloned: RouteRecordRaw = { ...route }\n if (route.meta) {\n cloned.meta = { ...route.meta }\n }\n if (route.children && route.children.length) {\n cloned.children = route.children.map(item => cloneRoute(item))\n }\n return cloned\n}\n\nconst hasPermission = (routeRoles: string[], userRoles: string[]): boolean => {\n if (!routeRoles.length) {\n return true\n }\n if (!userRoles.length) {\n return false\n }\n return routeRoles.some(role => userRoles.includes(role))\n}\n\nexport const filterRoutesByRole = (routes: RouteRecordRaw[] = [], userRoles: string[]): RouteRecordRaw[] => {\n console.log(\"routes\", routes, userRoles )\n if (userRoles.includes(SUPER_ROLE)) {\n return routes.map(route => cloneRoute(route))\n }\n return routes.reduce<RouteRecordRaw[]>((acc, route) => {\n console.log(acc, route)\n const routeRoles = getRouteRoles(route)\n if (!hasPermission(routeRoles, userRoles)) {\n return acc\n }\n const cloned: RouteRecordRaw = { ...route }\n if (route.meta) {\n cloned.meta = { ...route.meta }\n }\n if (route.children && route.children.length) {\n const children = filterRoutesByRole(route.children, userRoles)\n if (!children.length) {\n // 如果子路由全部被过滤,父路由不再保留,避免注册空壳路由阻挡后续权限变更时的注册\n return acc\n }\n cloned.children = children\n }\n acc.push(cloned)\n return acc\n }, [])\n}\n","const decodeWithAtob = (input: string): string => {\n const binary = (globalThis.atob as (data: string) => string)(input)\n let output = ''\n for (let i = 0; i < binary.length; i++) {\n const code = binary.charCodeAt(i).toString(16).padStart(2, '0')\n output += '%' + code\n }\n try {\n return decodeURIComponent(output)\n } catch (error) {\n return decodeURIComponent(encodeURIComponent(binary))\n }\n}\n\nconst base64UrlDecode = (input: string): string => {\n const base64 = input.replace(/-/g, '+').replace(/_/g, '/')\n const padding = 4 - (base64.length % 4)\n const padded = base64 + (padding < 4 ? '='.repeat(padding) : '')\n if (typeof globalThis.atob === 'function') {\n return decodeWithAtob(padded)\n }\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(padded, 'base64').toString('utf-8')\n }\n return ''\n}\n\nexport const decodeJwtPayload = (token: string): Record<string, any> | null => {\n if (!token) {\n return null\n }\n const segments = token.split('.')\n if (segments.length < 2) {\n return null\n }\n try {\n const decoded = base64UrlDecode(segments[1])\n return decoded ? JSON.parse(decoded) : null\n } catch (error) {\n return null\n }\n}\n\nexport const getRolesFromJwt = (token: string): string[] => {\n const payload = decodeJwtPayload(token)\n const role = payload && typeof payload.role === 'string' ? payload.role : ''\n return role\n .split(',')\n .map(item => item.trim())\n .filter(item => !!item)\n}\n","import { Router } from 'vue-router'\nimport { pinia, useUserStore } from '../../store'\nimport { OmsModule, RemoteModule } from '../../types'\nimport { transRemoteModules } from '../remote'\nimport Layout from '../../scaffold/layout/index.vue'\nimport { getWhiteRoutes, isLodeRemoteRoutes } from './func'\nimport { filterRoutesByRole } from '../permission'\nimport { getRolesFromJwt, getToken } from '../../utils'\n\nexport default function(router: Router) {\n router.beforeEach(async(to, form, next) => {\n if (getWhiteRoutes().indexOf(to.path) !== -1) {\n next()\n return\n }\n if (isLodeRemoteRoutes()) {\n next()\n return\n }\n const user = useUserStore(pinia)\n await user.info()\n const remoteRoute: RemoteModule[] = await user.loadRemoteRoutes()\n const routeModules: OmsModule[] = transRemoteModules(remoteRoute)\n const userRoles = getRolesFromJwt(getToken())\n const filteredModules: OmsModule[] = routeModules.map(item => {\n const permittedRoutes = filterRoutesByRole(item.routes, userRoles)\n return {\n ...item,\n routes: permittedRoutes\n }\n }).filter(item => item.routes.length > 0)\n\n filteredModules.forEach(item => {\n item.routes.forEach(each => {\n router.addRoute({\n path: '/',\n component: Layout,\n children: [each]\n })\n })\n })\n router.addRoute({ name: '404', path: '/:pathMatch(.*)*', redirect: '/404', hidden: true })\n user.updateRemoteRouter(filteredModules)\n await router.replace(to)\n next()\n })\n}\n","import { Router } from 'vue-router'\nimport { pinia, useAppStore, useSettingsStore } from '../../store'\n\nexport default function(router: Router) {\n router.beforeEach(async(to, from, next) => {\n const settings = useSettingsStore(pinia)\n const tokens: string[] = [settings.title || '']\n const len = to.matched.length\n for (let i = len; i > len - 3; i--) {\n const item = to.matched[i - 1]\n if (item?.meta?.title) {\n tokens.push(item.meta.title + '')\n }\n }\n if (tokens.length > 1) {\n document.title = tokens.reverse().join('-')\n }\n next()\n })\n router.afterEach(async(to, from, failure) => {\n const app = useAppStore(pinia)\n if (Object.keys(to.meta).length > 0) {\n await app.setCurrentMeta(to.meta)\n }\n })\n}\n","import { Router } from 'vue-router'\nimport nprogress from './nprogress'\nimport permission from './permission'\nimport remoteRoutes from './remote-routes'\nimport setPageTitle from './set-page-title'\n\nexport default function(router: Router) {\n permission(router)\n nprogress(router)\n remoteRoutes(router)\n setPageTitle(router)\n}\n","import { Component } from 'vue'\n\nconst defaultMap: Record<string, Component> = {}\n\nexport function setCmp(name: string, cmp: Component) {\n defaultMap[name] = cmp\n}\n\nexport function getCmp(name: string) {\n return defaultMap[name]\n}\n","<script lang=\"jsx\">\nimport { useUserStore } from '../store'\nimport { getCmp } from '../utils/container'\nimport { computed } from 'vue'\n\nexport default defineComponent({\n name: 'Dashboard',\n setup() {\n // use global store shim\n // const roleIds = computed(() => store.state.settings.loginTips)\n const custom = getCmp('dashboard')\n if (custom) {\n return () => <span>\n <custom/>\n </span>\n }\n const name = computed(() => useUserStore().name)\n return () => <div class='dashboard-container'>\n <div class='dashboard-text'>Hi { name.value } 😄</div>\n </div>\n }\n})\n</script>\n","<script lang=\"jsx\">\nimport { useUserStore } from '../store'\nimport { getCmp } from '../utils/container'\nimport { computed } from 'vue'\n\nexport default defineComponent({\n name: 'Dashboard',\n setup() {\n // use global store shim\n // const roleIds = computed(() => store.state.settings.loginTips)\n const custom = getCmp('dashboard')\n if (custom) {\n return () => <span>\n <custom/>\n </span>\n }\n const name = computed(() => useUserStore().name)\n return () => <div class='dashboard-container'>\n <div class='dashboard-text'>Hi { name.value } 😄</div>\n </div>\n }\n})\n</script>\n","<template>\n <div class=\"login-container\">\n <div class=\"login-background\">\n <div class=\"shape shape-1\" />\n <div class=\"shape shape-2\" />\n <div class=\"shape shape-3\" />\n </div>\n\n <transition name=\"fade-scale\" appear>\n <div class=\"login-card-wrapper\">\n <el-card class=\"login-card\" shadow=\"never\">\n <div class=\"login-header\">\n <div class=\"logo-wrapper\">\n <img v-if=\"settingsStore.logo\" :src=\"settingsStore.logo\" alt=\"Logo\" class=\"logo-img\">\n <div v-else class=\"logo-fallback\">{{ logoFallback }}</div>\n </div>\n <h1 class=\"login-title\">{{ settingsStore.title || 'OMS' }}</h1>\n <p class=\"login-subtitle\">欢迎回来,请登录您的账户</p>\n </div>\n\n <el-form\n ref=\"loginForm\"\n :model=\"data\"\n class=\"login-form\"\n size=\"large\"\n @submit.prevent=\"login\"\n >\n <el-form-item prop=\"username\">\n <el-input\n v-model=\"data.username\"\n placeholder=\"用户名\"\n prefix-icon=\"User\"\n class=\"custom-input\"\n />\n </el-form-item>\n\n <el-form-item prop=\"password\">\n <el-input\n v-model=\"data.password\"\n type=\"password\"\n placeholder=\"密码\"\n show-password\n prefix-icon=\"Lock\"\n class=\"custom-input\"\n />\n </el-form-item>\n\n <el-form-item v-if=\"captcha\" prop=\"captcha\">\n <div class=\"captcha-wrapper\">\n <el-input\n v-model=\"data.captcha\"\n placeholder=\"验证码\"\n prefix-icon=\"Key\"\n class=\"custom-input captcha-input\"\n />\n <div class=\"captcha-img-box\" @click=\"onCaptchaClick\">\n <img\n :src=\"baseAPI + '/user/captcha?ts=' + ts\"\n title=\"点击刷新\"\n class=\"captcha-img\"\n >\n </div>\n </div>\n </el-form-item>\n\n <div v-if=\"tips\" class=\"login-tips\">\n <el-icon><InfoFilled /></el-icon>\n <span>{{ tips }}</span>\n </div>\n\n <el-button\n class=\"submit-button\"\n type=\"primary\"\n :loading=\"loading\"\n :disabled=\"!onReady\"\n native-type=\"submit\"\n @click=\"login\"\n >\n 登 录\n </el-button>\n\n <div v-if=\"Object.keys(settingsStore.sso || {}).length > 0\" class=\"sso-divider\">\n <span>其他登录方式</span>\n </div>\n\n <div class=\"sso-container\">\n <div id=\"sso-qrcode\" />\n <!-- SSO items logic conserved -->\n </div>\n </el-form>\n </el-card>\n <div class=\"login-footer\">\n © {{ new Date().getFullYear() }} {{ settingsStore.title || 'OMS' }}. All rights reserved.\n </div>\n </div>\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useRouter, useRoute } from 'vue-router'\nimport { useSettingsStore, useAppStore, useUserStore } from '../store'\nimport CryptoJS from 'crypto-js'\nimport { computed, ref } from 'vue'\nimport { User, Lock, Key, InfoFilled } from '@element-plus/icons-vue'\nimport { ElMessage } from 'element-plus'\n\nconst router = useRouter()\nconst route = useRoute()\nconst settingsStore = useSettingsStore()\nconst appStore = useAppStore()\nconst userStore = useUserStore()\n\nconst tips = computed(() => settingsStore.loginTips)\nconst captcha = computed(() => settingsStore.captcha)\nconst baseAPI = computed(() => appStore.baseURL)\n\nconst ts = ref(0)\nconst loading = ref(false)\n\nconst data = ref({\n username: '',\n password: '',\n captcha: '',\n sing: ''\n})\n\nconst logoFallback = computed(() => {\n const text = settingsStore.title || 'OMS'\n return text ? text.toString().trim().charAt(0).toUpperCase() : 'O'\n})\n\nconst onCaptchaClick = () => {\n ts.value++\n}\n\nconst onReady = computed(() => {\n return data.value.username.length > 0 &&\n data.value.password.length >= 4 &&\n (captcha.value ? data.value.captcha.length === 4 : true)\n})\n\nconst login = () => {\n if (loading.value) return\n if (!onReady.value) {\n ElMessage.error('请填写完整的登录信息')\n return\n }\n\n if (captcha.value) {\n data.value.sing = CryptoJS.MD5(`${data.value.username}${data.value.password}${data.value.captcha}`).toString()\n }\n\n loading.value = true\n userStore.login(data.value).then(res => {\n router.push({ path: route.query?.redirect as string || '/' })\n }).catch(e => {\n ts.value++\n // Error handling is handled by store/interceptors usually, but we refresh captcha\n }).finally(() => {\n loading.value = false\n })\n}\n</script>\n\n<style lang=\"scss\">\n.login-container {\n position: relative;\n width: 100vw;\n height: 100vh;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--app-bg);\n}\n\n.login-background {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 1;\n\n .shape {\n position: absolute;\n filter: blur(100px);\n opacity: 0.15;\n border-radius: 50%;\n z-index: 1;\n }\n\n .shape-1 {\n top: -10%;\n left: -10%;\n width: 40%;\n height: 40%;\n background: #00b074; // Mint\n animation: float 20s infinite alternate;\n }\n\n .shape-2 {\n bottom: -15%;\n right: -5%;\n width: 50%;\n height: 50%;\n background: #00b074;\n animation: float 25s infinite alternate-reverse;\n }\n}\n\n@keyframes float {\n 0% { transform: translate(0, 0) rotate(0deg); }\n 100% { transform: translate(10%, 10%) rotate(10deg); }\n}\n\n.login-card-wrapper {\n position: relative;\n z-index: 10;\n width: 100%;\n max-width: 460px;\n padding: 20px;\n}\n\n.login-card {\n background: var(--card-bg) !important;\n border: none !important;\n border-radius: 24px !important;\n padding: 48px 40px !important;\n box-shadow: var(--card-shadow) !important;\n\n .el-card__body {\n padding: 0;\n }\n}\n\n.login-header {\n text-align: center;\n margin-bottom: 40px;\n\n .logo-wrapper {\n margin-bottom: 24px;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .logo-img {\n height: 72px;\n width: auto;\n }\n\n .logo-fallback {\n width: 72px;\n height: 72px;\n background: #e6f7f1;\n color: #00b074;\n font-size: 36px;\n font-weight: 800;\n border-radius: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n .login-title {\n font-size: 32px;\n font-weight: 800;\n color: var(--sidebar-text-color);\n margin: 0 0 8px 0;\n letter-spacing: -0.02em;\n }\n\n .login-subtitle {\n font-size: 15px;\n color: var(--sidebar-text-color);\n opacity: 0.7;\n margin: 0;\n }\n}\n\n.custom-input {\n .el-input__wrapper {\n background-color: var(--input-bg) !important;\n box-shadow: none !important;\n border: 1.5px solid var(--border-color) !important;\n border-radius: 16px !important;\n padding: 0 16px !important;\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color) !important;\n background-color: var(--input-bg) !important;\n }\n\n &.is-focus {\n border-color: var(--sidebar-active-text-color) !important;\n background-color: var(--input-bg) !important;\n box-shadow: 0 0 0 4px rgba(0, 176, 116, 0.1) !important;\n }\n }\n\n .el-input__inner {\n color: var(--sidebar-text-color) !important;\n height: 56px !important;\n background-color: transparent !important;\n\n &::placeholder {\n color: #b0b0b0 !important;\n }\n }\n\n .el-input__prefix-icon {\n color: #00b074 !important;\n font-size: 20px;\n }\n\n // Ensure password input eye icon has proper color in dark mode\n .el-input__suffix-inner {\n color: var(--sidebar-text-color) !important;\n opacity: 0.6;\n\n &:hover {\n opacity: 1;\n }\n }\n}\n\n.captcha-wrapper {\n display: flex;\n gap: 12px;\n align-items: stretch;\n\n .captcha-input {\n flex: 1;\n }\n\n .captcha-img-box {\n width: 140px;\n height: 56px;\n background: var(--input-bg);\n border-radius: 16px;\n overflow: hidden;\n cursor: pointer;\n border: 1.5px solid var(--border-color);\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color);\n }\n\n .captcha-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.login-tips {\n display: flex;\n align-items: center;\n gap: 10px;\n color: #00b074;\n font-size: 14px;\n margin-bottom: 28px;\n padding: 14px 18px;\n background: #e6f7f1;\n border-radius: 14px;\n font-weight: 500;\n}\n\n.submit-button {\n width: 100%;\n height: 58px !important;\n border-radius: 18px !important;\n font-size: 17px !important;\n font-weight: 700 !important;\n background: #00b074 !important;\n box-shadow: 0 8px 20px rgba(0, 176, 116, 0.25) !important;\n border: none !important;\n margin-top: 16px;\n transition: all 0.3s ease !important;\n\n &:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 12px 25px rgba(0, 176, 116, 0.35) !important;\n background: #009663 !important;\n }\n\n &:active:not(:disabled) {\n transform: translateY(0);\n }\n \n &:disabled {\n opacity: 0.5;\n background: #b0b0b0 !important;\n box-shadow: none !important;\n }\n}\n\n.sso-divider {\n display: flex;\n align-items: center;\n margin: 40px 0 20px;\n color: #b0b0b0;\n font-size: 14px;\n\n &::before,\n &::after {\n content: \"\";\n flex: 1;\n height: 1px;\n background: var(--border-color);\n }\n\n span {\n padding: 0 16px;\n }\n}\n\n.login-footer {\n text-align: center;\n margin-top: 40px;\n color: #b0b0b0;\n font-size: 13px;\n font-weight: 500;\n}\n</style>\n","<template>\n <div class=\"login-container\">\n <div class=\"login-background\">\n <div class=\"shape shape-1\" />\n <div class=\"shape shape-2\" />\n <div class=\"shape shape-3\" />\n </div>\n\n <transition name=\"fade-scale\" appear>\n <div class=\"login-card-wrapper\">\n <el-card class=\"login-card\" shadow=\"never\">\n <div class=\"login-header\">\n <div class=\"logo-wrapper\">\n <img v-if=\"settingsStore.logo\" :src=\"settingsStore.logo\" alt=\"Logo\" class=\"logo-img\">\n <div v-else class=\"logo-fallback\">{{ logoFallback }}</div>\n </div>\n <h1 class=\"login-title\">{{ settingsStore.title || 'OMS' }}</h1>\n <p class=\"login-subtitle\">欢迎回来,请登录您的账户</p>\n </div>\n\n <el-form\n ref=\"loginForm\"\n :model=\"data\"\n class=\"login-form\"\n size=\"large\"\n @submit.prevent=\"login\"\n >\n <el-form-item prop=\"username\">\n <el-input\n v-model=\"data.username\"\n placeholder=\"用户名\"\n prefix-icon=\"User\"\n class=\"custom-input\"\n />\n </el-form-item>\n\n <el-form-item prop=\"password\">\n <el-input\n v-model=\"data.password\"\n type=\"password\"\n placeholder=\"密码\"\n show-password\n prefix-icon=\"Lock\"\n class=\"custom-input\"\n />\n </el-form-item>\n\n <el-form-item v-if=\"captcha\" prop=\"captcha\">\n <div class=\"captcha-wrapper\">\n <el-input\n v-model=\"data.captcha\"\n placeholder=\"验证码\"\n prefix-icon=\"Key\"\n class=\"custom-input captcha-input\"\n />\n <div class=\"captcha-img-box\" @click=\"onCaptchaClick\">\n <img\n :src=\"baseAPI + '/user/captcha?ts=' + ts\"\n title=\"点击刷新\"\n class=\"captcha-img\"\n >\n </div>\n </div>\n </el-form-item>\n\n <div v-if=\"tips\" class=\"login-tips\">\n <el-icon><InfoFilled /></el-icon>\n <span>{{ tips }}</span>\n </div>\n\n <el-button\n class=\"submit-button\"\n type=\"primary\"\n :loading=\"loading\"\n :disabled=\"!onReady\"\n native-type=\"submit\"\n @click=\"login\"\n >\n 登 录\n </el-button>\n\n <div v-if=\"Object.keys(settingsStore.sso || {}).length > 0\" class=\"sso-divider\">\n <span>其他登录方式</span>\n </div>\n\n <div class=\"sso-container\">\n <div id=\"sso-qrcode\" />\n <!-- SSO items logic conserved -->\n </div>\n </el-form>\n </el-card>\n <div class=\"login-footer\">\n © {{ new Date().getFullYear() }} {{ settingsStore.title || 'OMS' }}. All rights reserved.\n </div>\n </div>\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useRouter, useRoute } from 'vue-router'\nimport { useSettingsStore, useAppStore, useUserStore } from '../store'\nimport CryptoJS from 'crypto-js'\nimport { computed, ref } from 'vue'\nimport { User, Lock, Key, InfoFilled } from '@element-plus/icons-vue'\nimport { ElMessage } from 'element-plus'\n\nconst router = useRouter()\nconst route = useRoute()\nconst settingsStore = useSettingsStore()\nconst appStore = useAppStore()\nconst userStore = useUserStore()\n\nconst tips = computed(() => settingsStore.loginTips)\nconst captcha = computed(() => settingsStore.captcha)\nconst baseAPI = computed(() => appStore.baseURL)\n\nconst ts = ref(0)\nconst loading = ref(false)\n\nconst data = ref({\n username: '',\n password: '',\n captcha: '',\n sing: ''\n})\n\nconst logoFallback = computed(() => {\n const text = settingsStore.title || 'OMS'\n return text ? text.toString().trim().charAt(0).toUpperCase() : 'O'\n})\n\nconst onCaptchaClick = () => {\n ts.value++\n}\n\nconst onReady = computed(() => {\n return data.value.username.length > 0 &&\n data.value.password.length >= 4 &&\n (captcha.value ? data.value.captcha.length === 4 : true)\n})\n\nconst login = () => {\n if (loading.value) return\n if (!onReady.value) {\n ElMessage.error('请填写完整的登录信息')\n return\n }\n\n if (captcha.value) {\n data.value.sing = CryptoJS.MD5(`${data.value.username}${data.value.password}${data.value.captcha}`).toString()\n }\n\n loading.value = true\n userStore.login(data.value).then(res => {\n router.push({ path: route.query?.redirect as string || '/' })\n }).catch(e => {\n ts.value++\n // Error handling is handled by store/interceptors usually, but we refresh captcha\n }).finally(() => {\n loading.value = false\n })\n}\n</script>\n\n<style lang=\"scss\">\n.login-container {\n position: relative;\n width: 100vw;\n height: 100vh;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--app-bg);\n}\n\n.login-background {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 1;\n\n .shape {\n position: absolute;\n filter: blur(100px);\n opacity: 0.15;\n border-radius: 50%;\n z-index: 1;\n }\n\n .shape-1 {\n top: -10%;\n left: -10%;\n width: 40%;\n height: 40%;\n background: #00b074; // Mint\n animation: float 20s infinite alternate;\n }\n\n .shape-2 {\n bottom: -15%;\n right: -5%;\n width: 50%;\n height: 50%;\n background: #00b074;\n animation: float 25s infinite alternate-reverse;\n }\n}\n\n@keyframes float {\n 0% { transform: translate(0, 0) rotate(0deg); }\n 100% { transform: translate(10%, 10%) rotate(10deg); }\n}\n\n.login-card-wrapper {\n position: relative;\n z-index: 10;\n width: 100%;\n max-width: 460px;\n padding: 20px;\n}\n\n.login-card {\n background: var(--card-bg) !important;\n border: none !important;\n border-radius: 24px !important;\n padding: 48px 40px !important;\n box-shadow: var(--card-shadow) !important;\n\n .el-card__body {\n padding: 0;\n }\n}\n\n.login-header {\n text-align: center;\n margin-bottom: 40px;\n\n .logo-wrapper {\n margin-bottom: 24px;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .logo-img {\n height: 72px;\n width: auto;\n }\n\n .logo-fallback {\n width: 72px;\n height: 72px;\n background: #e6f7f1;\n color: #00b074;\n font-size: 36px;\n font-weight: 800;\n border-radius: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n .login-title {\n font-size: 32px;\n font-weight: 800;\n color: var(--sidebar-text-color);\n margin: 0 0 8px 0;\n letter-spacing: -0.02em;\n }\n\n .login-subtitle {\n font-size: 15px;\n color: var(--sidebar-text-color);\n opacity: 0.7;\n margin: 0;\n }\n}\n\n.custom-input {\n .el-input__wrapper {\n background-color: var(--input-bg) !important;\n box-shadow: none !important;\n border: 1.5px solid var(--border-color) !important;\n border-radius: 16px !important;\n padding: 0 16px !important;\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color) !important;\n background-color: var(--input-bg) !important;\n }\n\n &.is-focus {\n border-color: var(--sidebar-active-text-color) !important;\n background-color: var(--input-bg) !important;\n box-shadow: 0 0 0 4px rgba(0, 176, 116, 0.1) !important;\n }\n }\n\n .el-input__inner {\n color: var(--sidebar-text-color) !important;\n height: 56px !important;\n background-color: transparent !important;\n\n &::placeholder {\n color: #b0b0b0 !important;\n }\n }\n\n .el-input__prefix-icon {\n color: #00b074 !important;\n font-size: 20px;\n }\n\n // Ensure password input eye icon has proper color in dark mode\n .el-input__suffix-inner {\n color: var(--sidebar-text-color) !important;\n opacity: 0.6;\n\n &:hover {\n opacity: 1;\n }\n }\n}\n\n.captcha-wrapper {\n display: flex;\n gap: 12px;\n align-items: stretch;\n\n .captcha-input {\n flex: 1;\n }\n\n .captcha-img-box {\n width: 140px;\n height: 56px;\n background: var(--input-bg);\n border-radius: 16px;\n overflow: hidden;\n cursor: pointer;\n border: 1.5px solid var(--border-color);\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color);\n }\n\n .captcha-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.login-tips {\n display: flex;\n align-items: center;\n gap: 10px;\n color: #00b074;\n font-size: 14px;\n margin-bottom: 28px;\n padding: 14px 18px;\n background: #e6f7f1;\n border-radius: 14px;\n font-weight: 500;\n}\n\n.submit-button {\n width: 100%;\n height: 58px !important;\n border-radius: 18px !important;\n font-size: 17px !important;\n font-weight: 700 !important;\n background: #00b074 !important;\n box-shadow: 0 8px 20px rgba(0, 176, 116, 0.25) !important;\n border: none !important;\n margin-top: 16px;\n transition: all 0.3s ease !important;\n\n &:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 12px 25px rgba(0, 176, 116, 0.35) !important;\n background: #009663 !important;\n }\n\n &:active:not(:disabled) {\n transform: translateY(0);\n }\n \n &:disabled {\n opacity: 0.5;\n background: #b0b0b0 !important;\n box-shadow: none !important;\n }\n}\n\n.sso-divider {\n display: flex;\n align-items: center;\n margin: 40px 0 20px;\n color: #b0b0b0;\n font-size: 14px;\n\n &::before,\n &::after {\n content: \"\";\n flex: 1;\n height: 1px;\n background: var(--border-color);\n }\n\n span {\n padding: 0 16px;\n }\n}\n\n.login-footer {\n text-align: center;\n margin-top: 40px;\n color: #b0b0b0;\n font-size: 13px;\n font-weight: 500;\n}\n</style>\n","<template>\n <div class=\"not-found\">\n <svg\n width=\"380px\"\n height=\"500px\"\n viewBox=\"0 0 837 1045\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\"\n >\n <g\n id=\"Page-1\"\n stroke=\"none\"\n stroke-width=\"1\"\n fill=\"none\"\n fill-rule=\"evenodd\"\n sketch:type=\"MSPage\"\n >\n <path\n id=\"Polygon-1\"\n d=\"M353,9 L626.664028,170 L626.664028,487 L353,642 L79.3359724,487 L79.3359724,170 L353,9 Z\"\n stroke=\"#007FB2\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n <path\n id=\"Polygon-2\"\n d=\"M78.5,529 L147,569.186414 L147,648.311216 L78.5,687 L10,648.311216 L10,569.186414 L78.5,529 Z\"\n stroke=\"#EF4A5B\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n <path\n id=\"Polygon-3\"\n d=\"M773,186 L827,217.538705 L827,279.636651 L773,310 L719,279.636651 L719,217.538705 L773,186 Z\"\n stroke=\"#795D9C\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n <path\n id=\"Polygon-4\"\n d=\"M639,529 L773,607.846761 L773,763.091627 L639,839 L505,763.091627 L505,607.846761 L639,529 Z\"\n stroke=\"#F2773F\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n <path\n id=\"Polygon-5\"\n d=\"M281,801 L383,861.025276 L383,979.21169 L281,1037 L179,979.21169 L179,861.025276 L281,801 Z\"\n stroke=\"#36B455\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n </g>\n </svg>\n <div class=\"message-box\">\n <h1>404</h1>\n <p>Page not found</p>\n <div class=\"buttons-con\">\n <div class=\"action-link-wrap\">\n <!--<a onclick=\"history.back(-2)\" class=\"link-button link-back-button\">Go Back</a>-->\n <a\n href=\"\"\n class=\"link-button\"\n >Go to Home Page</a>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: 'NotFoundPage'\n}\n</script>\n\n<style scoped>\n.not-found {\n background-color: #2F3242;\n width: 100%;\n height: 100%;\n}\n\nsvg {\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -250px;\n margin-left: -400px;\n}\n\n.message-box {\n height: 200px;\n width: 380px;\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -100px;\n margin-left: 50px;\n color: #FFF;\n font-family: Roboto;\n font-weight: 300;\n}\n\n.message-box h1 {\n font-size: 60px;\n line-height: 46px;\n margin-bottom: 40px;\n}\n\n.buttons-con .action-link-wrap {\n margin-top: 40px;\n}\n\n.buttons-con .action-link-wrap a {\n background: #68c950;\n padding: 8px 25px;\n border-radius: 4px;\n color: #FFF;\n font-weight: bold;\n font-size: 14px;\n transition: all 0.3s linear;\n cursor: pointer;\n text-decoration: none;\n margin-right: 10px\n}\n\n.buttons-con .action-link-wrap a:hover {\n background: #5A5C6C;\n color: #fff;\n}\n\n#Polygon-1, #Polygon-2, #Polygon-3, #Polygon-4, #Polygon-4, #Polygon-5 {\n animation: float 1s infinite ease-in-out alternate;\n}\n\n#Polygon-2 {\n animation-delay: .2s;\n}\n\n#Polygon-3 {\n animation-delay: .4s;\n}\n\n#Polygon-4 {\n animation-delay: .6s;\n}\n\n#Polygon-5 {\n animation-delay: .8s;\n}\n\n@keyframes float {\n 100% {\n transform: translateY(20px);\n }\n}\n\n@media (max-width: 450px) {\n svg {\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -250px;\n margin-left: -190px;\n }\n\n .message-box {\n top: 50%;\n left: 50%;\n margin-top: -100px;\n margin-left: -190px;\n text-align: center;\n }\n}\n</style>\n","import { createRouter, createWebHashHistory, type RouteRecordRaw, type RouterHistory } from 'vue-router'\nimport Dashboard from '../scaffold/dashboard.vue'\nimport Layout from '../scaffold/layout/index.vue'\nimport Login from '../scaffold/login.vue'\nimport NotFoundPage from '../scaffold/404.vue'\n\nexport const defaultRoutes: RouteRecordRaw[] = [\n {\n path: '/',\n component: Layout,\n redirect: '/dashboard',\n name: 'Root',\n meta: {\n menuType: 1\n },\n children: [\n {\n path: 'dashboard',\n name: 'Dashboard',\n component: Dashboard,\n meta: { title: 'Dashboard', icon: 'el-icon-help', menuType: 2, keepAlive: true },\n }\n ]\n },\n {\n path: '/login',\n component: Login,\n meta: { title: '用户登录', menuType: 0 },\n hidden: true\n },\n {\n path: '/404',\n component: NotFoundPage,\n meta: { menuType: 0 },\n hidden: true\n }\n]\n\nexport function createOmsRouter(history: RouterHistory = createWebHashHistory()) {\n return createRouter({\n history,\n routes: defaultRoutes\n })\n}\n\nexport default createOmsRouter\n","import type { Router } from 'vue-router'\nimport guard from './guard'\nimport createOmsRouter from './router'\n\nconst guardedRouters = new WeakSet<Router>()\nlet defaultRouter: Router | null = null\nlet activeRouter: Router | null = null\n\nexport function ensureOmsRouterGuards(router: Router): Router {\n if (!guardedRouters.has(router)) {\n guard(router)\n guardedRouters.add(router)\n }\n return router\n}\n\nexport function getDefaultOmsRouter(): Router {\n if (!defaultRouter) {\n defaultRouter = ensureOmsRouterGuards(createOmsRouter())\n }\n return defaultRouter\n}\n\nexport function resolveOmsRouter(router?: Router | null): Router {\n return ensureOmsRouterGuards(router || getDefaultOmsRouter())\n}\n\nexport function setActiveOmsRouter(router: Router) {\n activeRouter = router\n}\n\nexport function getActiveOmsRouter(): Router {\n return activeRouter || getDefaultOmsRouter()\n}\n\nexport { createOmsRouter }\n\nexport default getDefaultOmsRouter()\n","import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'\nimport { pinia, useUserStore } from '../../store'\nimport { Interceptor, InterceptorUse } from './types'\nimport { Message, MessageBox } from '../../plugins/element-plus'\nimport { removeToken } from '../token'\nimport { cancelRequestInterceptor, cancelResponseInterceptor } from './cache'\nimport { isString } from '@okiss/utils'\nimport { getActiveOmsRouter } from '../../router'\n\nfunction getToken() {\n return useUserStore(pinia).token\n}\n\nfunction expired() {\n return useUserStore(pinia).expired\n}\n\nfunction errMsg(message: string) {\n Message({\n message: message,\n type: 'error',\n duration: 5 * 1000,\n grouping: true\n })\n}\n\nconst baseRequestInterceptor: InterceptorUse<AxiosRequestConfig, AxiosError> = {\n onFulfilled: function(config: AxiosRequestConfig) {\n config.headers = config.headers || {}\n const token = getToken()\n if (token) {\n config.headers['X-Token'] = token\n }\n const router = getActiveOmsRouter()\n if (router.currentRoute.value.meta?.path) {\n config.headers['X-Path'] = router.currentRoute.value.meta.path\n }\n return config\n }\n}\n\nconst baseResponseInterceptor: InterceptorUse<AxiosResponse, AxiosError> = {\n onFulfilled(response) {\n const notHoldApiErr = response.config?.notHoldApiErr !== undefined && response.config?.notHoldApiErr === true\n if (!notHoldApiErr && response.data.code !== 0) {\n const message = response.data.message || `接口请求错误 ${response.config.method}::${response.config.url?.split('?')[0]}`\n if (response.data.code === 401) {\n if (expired()) {\n return\n }\n useUserStore(pinia).SetExpired()\n MessageBox.alert('登录信息已过期或未登录, 是否跳转登录', '操作提醒', {\n showClose: false,\n confirmButtonText: '重新登录',\n showCancelButton: true,\n cancelButtonText: '取消',\n callback: (action: string) => {\n if (action === 'confirm') {\n removeToken()\n // location.href = location.origin + location.pathname\n location.href = location.origin + location.pathname + location.hash.replace('#', '#/?redirect=')\n location.reload()\n }\n useUserStore(pinia).SetExpired()\n }\n })\n return\n } else {\n errMsg(message)\n }\n return Promise.reject(message)\n }\n\n let _message_box = response.data?.data?._message_box\n if (_message_box !== undefined) {\n if (isString(_message_box)) {\n _message_box = {\n message: response.data?.data?._message_box\n }\n }\n MessageBox({\n title: '提示',\n type: 'success',\n grouping: true,\n ..._message_box\n })\n }\n\n return response.data\n },\n onRejected(error: AxiosError) {\n if (axios.isCancel(error)) {\n return Promise.reject('')\n }\n errMsg(`${error.message} ${error.config.method}::${error.config.url?.split('?')[0]}`)\n return Promise.reject(error)\n }\n}\n\nexport const interceptors: Interceptor[] = [\n {\n request: cancelRequestInterceptor,\n response: cancelResponseInterceptor\n },\n {\n request: baseRequestInterceptor,\n response: baseResponseInterceptor\n }\n]\n\nexport function addInterceptor(newInterceptor: Interceptor) {\n interceptors.push(newInterceptor)\n}\n","import axios, { AxiosRequestConfig } from 'axios'\nimport { defaultOptions } from '../../default'\nimport { merge } from 'lodash'\nimport { interceptors } from './interceptors'\n\nexport function instance(conf: AxiosRequestConfig = {}) {\n const defaultConf: AxiosRequestConfig = defaultOptions.axios || {}\n const c = merge(defaultConf, conf || {})\n const service = axios.create({\n ...c\n // adapter: (c) => cacheAdapter(c, defaultAxios)\n })\n\n interceptors.forEach(item => {\n service.interceptors.request.use(item.request.onFulfilled, item.request.onRejected)\n service.interceptors.response.use(item.response.onFulfilled, item.response.onRejected)\n })\n\n return service\n}\n\nexport default instance()\n","import type { ObjectDirective } from 'vue'\n\nconst outClick: ObjectDirective = {\n beforeMount(el, binding) {\n el.clickOutsideEvent = function(event: Event) {\n if (!(el === event.target || el.contains(event.target))) {\n binding.value(event, el)\n }\n }\n document.body.addEventListener('click', el.clickOutsideEvent)\n },\n unmounted(el) {\n document.body.removeEventListener('click', el.clickOutsideEvent)\n }\n}\n\nexport default outClick\n","import mitt from 'mitt'\nimport type { App } from 'vue'\n\nconst eventBus = mitt()\n\nconst defaultOptions = {\n global: true,\n inject: true,\n globalPropertyName: '$eventBus',\n injectName: '$eventBus'\n}\n\n// eventBus.install = install\nexport default eventBus\nexport const bus = eventBus\n\nexport function install(app: App, options = {}) {\n const opt = {\n ...defaultOptions,\n ...options\n }\n if (opt.global) {\n app.config.globalProperties[opt.globalPropertyName] = eventBus\n }\n if (opt.inject) {\n app.provide(opt.injectName, eventBus)\n }\n return eventBus\n}\n","import bus from '../plugins/eventBus'\nimport type { ObjectDirective } from 'vue'\n\nconst rightClient: ObjectDirective = {\n mounted: (el, binding) => {\n if (el === null) {\n return\n }\n if (binding.value) {\n // el.style.border = '1px solid red'\n }\n el.oncontextmenu = (e: Event) => {\n e.preventDefault()\n e.stopPropagation()\n e.cancelBubble = true\n binding.value && bus.emit('right-click', { event: e, data: binding.value })\n }\n }\n}\n\nexport default rightClient\n","import type { ObjectDirective } from 'vue'\n\nconst resize: ObjectDirective = {\n mounted(el) {\n // console.log(8888, el.style)\n }\n}\n\nexport default resize\n","import type { ObjectDirective } from 'vue'\nimport bus from '../plugins/eventBus'\n\nfunction getElementPosition(element: HTMLElement | any, key: 'Top' | 'Left' | 'Right' | 'Botton') {\n let result = element[`offset${key}`]\n let current = element.offsetParent\n\n while (current) {\n result += current[`offset${key}`]\n current = current.offsetParent\n }\n\n return result\n}\n\nconst devtool: ObjectDirective = {\n mounted: (el, binding) => {\n if (el === null || !binding.value.dev) {\n return\n }\n let target : HTMLElement = el\n if (binding.value.parent) {\n for (let i = 0; i < binding.value.parent; i++) {\n if (target.parentElement) {\n target = target.parentElement\n }\n }\n }\n\n target.classList.add('devtool-hover')\n\n // button wrapper\n const wrapper = document.createElement('i')\n wrapper.className = 'devtool-item-wrapper'\n\n target.onmouseover = () => {\n wrapper.style.height = (target.offsetHeight + 30) + 'px'\n wrapper.style.width = (target.offsetWidth + 30) + 'px'\n wrapper.style.top = (getElementPosition(target, 'Top') - 15) + 'px'\n wrapper.style.left = (getElementPosition(target, 'Left') - 15) + 'px'\n }\n\n // create edit button\n const editBtn = document.createElement('span')\n editBtn.className = 'dev-action-edit'\n editBtn.title = '编辑'\n const editIcon = document.createElement('i')\n editIcon.className = 'iconfont ra-editor1'\n editBtn.appendChild(editIcon)\n editBtn.onclick = (ev) => {\n bus.emit('dev-action', { event: ev, data: { type: 'edit', devId: binding.value.devId }})\n }\n wrapper.appendChild(editBtn)\n\n // create delete button\n const delBtn = document.createElement('span')\n delBtn.className = 'dev-action-del'\n delBtn.title = '删除'\n const delIcon = document.createElement('i')\n delIcon.className = 'iconfont ra-cut'\n delBtn.appendChild(delIcon)\n delBtn.onclick = (ev) => {\n bus.emit('dev-action', { event: ev, data: { type: 'del', devId: binding.value.devId }})\n }\n wrapper.appendChild(delBtn)\n\n // append wrapper as first child\n target.insertBefore(wrapper, target.firstChild)\n\n return\n }\n}\n\nexport default devtool\n","export { default as outClick } from './outClick'\nexport { default as rightClick } from './rightClick'\nexport { default as resize } from './resize'\nexport { default as devtool } from './devtool'\n","import { createApp, watch, type App, type Component, type Directive } from 'vue'\nimport type { RouteRecordRaw, Router } from 'vue-router'\nimport type { OmsOptions, OmsPlugin, UsePlugin } from './types'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\n// Vuex Module removed in Pinia migration\n\nimport AppComp from './App.vue'\nimport { startMock, regMockApis } from './mock'\nimport { instance } from './utils/request'\nimport { isObject } from '@okiss/utils'\nimport { VIcon, setUploadHeaderHandle } from '@okiss/vbtf'\nimport { getRolesFromJwt, getToken } from './utils'\nimport { merge } from 'lodash'\n\nimport 'normalize.css/normalize.css'\nimport './styles/index.scss'\nimport '@okiss/vbtf/style.css'\n\nimport ElementPlus from './plugins/element-plus'\nimport zhCn from 'element-plus/es/locale/lang/zh-cn'\n\nimport { setupStore, pinia, useAppStore, useSettingsStore, useUserStore, setHttp } from './store'\nimport { resolveOmsRouter, setActiveOmsRouter } from './router'\nimport { filterRoutesByRole } from './router/permission'\nimport * as directives from './directive'\nimport { defaultOptions } from './default'\n\nexport let http: AxiosInstance\n\ninterface RouteState {\n pendingRoutes: RouteRecordRaw[]\n registeredRouteKeys: Set<string>\n}\n\nconst routeStateMap = new WeakMap<Router, RouteState>()\n\nconst getRouteKey = (route: RouteRecordRaw): string => {\n return typeof route.name === 'string' ? route.name : route.path\n}\n\nfunction getRouteState(router: Router): RouteState {\n let state = routeStateMap.get(router)\n if (!state) {\n state = {\n pendingRoutes: [],\n registeredRouteKeys: new Set<string>()\n }\n routeStateMap.set(router, state)\n }\n return state\n}\n\nexport function useHttp(options?: AxiosRequestConfig): AxiosInstance {\n return options ? instance((merge(defaultOptions.axios, options))) : http\n}\n\nexport function createAdmin(omsOptions?: OmsOptions) {\n const options = merge(defaultOptions, omsOptions)\n const router = resolveOmsRouter(options.router)\n const app: App = createApp(AppComp)\n const omsPlugin = createOmsPlugin(options, router)\n const plugins = options.plugins || []\n plugins.unshift(omsPlugin)\n plugins.forEach(item => {\n regPlugin(app, item, router)\n })\n if (options?.mock) {\n startMock()\n }\n http = instance(options.axios)\n // install pinia\n setupStore(app)\n const appStore = useAppStore(pinia)\n const settingsStore = useSettingsStore(pinia)\n const userStore = useUserStore(pinia)\n setHttp(http)\n settingsStore.updateSettings(omsOptions?.settings || {})\n appStore.setBaseAPI(options?.axios.baseURL as any)\n app.config.globalProperties.$http = http\n app.config.globalProperties.$router = router\n setActiveOmsRouter(router)\n window.App = app\n window.OmsOptions = options\n setUploadHeaderHandle(() => {\n return {\n 'X-Token': getToken()\n }\n })\n watch(() => userStore.token, () => {\n syncRoutesWithRoles(router)\n }, { immediate: true })\n router.isReady().then(() => app.mount('#app'))\n}\n\nfunction regComponents(app: App, components: Record<string, Component> = {}) {\n Object.keys(components).forEach((item: string) => {\n app.component(item, components[item])\n })\n}\n\nfunction syncRoutesWithRoles(router: Router) {\n const routeState = getRouteState(router)\n const userRoles = getRolesFromJwt(getToken())\n const permittedRoutes = filterRoutesByRole(routeState.pendingRoutes, userRoles)\n const userStore = useUserStore(pinia)\n const existedKeys = new Set(userStore.customRouter.map(item => getRouteKey(item)))\n const newRoutes = permittedRoutes.filter(route => {\n const key = getRouteKey(route)\n if (routeState.registeredRouteKeys.has(key) || existedKeys.has(key)) {\n return false\n }\n routeState.registeredRouteKeys.add(key)\n return true\n })\n newRoutes.forEach(item => {\n router.addRoute(item)\n })\n if (newRoutes.length) {\n userStore.setCustomRoutes(newRoutes)\n }\n}\n\nfunction regRoutes(router: Router, routes: RouteRecordRaw[] = []) {\n getRouteState(router).pendingRoutes.push(...routes)\n syncRoutesWithRoles(router)\n}\n\nfunction regUse(app: App, use: UsePlugin[]) {\n use.forEach(item => {\n if (isObject(item)) {\n // @ts-ignore\n item = [item]\n }\n // @ts-ignore\n app.use(...item)\n })\n}\n\nfunction regDirective(app: App, directives: Record<string, Directive> = {}) {\n Object.keys(directives).forEach(item => {\n app.directive(item, directives[item])\n })\n}\n\nfunction regStoreModule(modules: Record<string, any> = {}) {\n const keepModuleNames = ['app', 'settings', 'user']\n Object.keys(modules).forEach(item => {\n if (keepModuleNames.indexOf(item) !== -1) {\n console.warn(`storeModule name [${item}] is use by base, please change it!`)\n return\n }\n // Pinia does not support dynamic Vuex-style module registration\n console.warn('[store] plugin storeModules are not supported under Pinia. Ignored:', item)\n })\n}\n\nexport function regPlugin(app: App, plugin: OmsPlugin, router: Router = resolveOmsRouter()) {\n regComponents(app, plugin.components || {})\n regRoutes(router, plugin.routes || [])\n regUse(app, plugin.use || [])\n regDirective(app, plugin.directives || {})\n regStoreModule(plugin.storeModules || {})\n regMockApis(plugin.mockApis || [])\n}\n\nexport function createOmsPlugin(options: OmsOptions, router: Router = resolveOmsRouter(options.router)): OmsPlugin {\n return {\n components: { VIcon },\n directives: directives,\n use: [\n router,\n [ElementPlus, { locale: zhCn, ...options.settings?.ElementPlus }]\n ]\n }\n}\n"],"mappings":"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,EACL,MAAM,GACP;GACD,UAAU;IAGR,MAAM;IACN,KAAK,EACH,cAAc,EACZ,OAAO,SACR,EACF;IACF;GACD,KAAK,EACH,MAAM,IACP;GACD,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,KAAK,EACH,MAAM,IACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EAAE;GACT,SAAS;IACP;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC3B;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC3B;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC5B;GACD,MAAM;GACN,KAAK,EACH,MAAM,GACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EACL,UAAU,IACX;GACD,MAAM;GACN,KAAK,EACH,MAAM,GACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,OAAO;IACL,MAAM;IACN,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;IACjB;GACD,KAAK,EACH,MAAM,GACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EACL,SAAS,IACV;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EACL,MAAM,iBACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,SAAS;IACP;KAAE,OAAO;KAAG,OAAO;KAAO;IAC1B;KAAE,OAAO;KAAG,OAAO;KAAO;IAC1B;KAAE,OAAO;KAAG,OAAO;KAAO;IAC1B;KAAE,OAAO;KAAG,OAAO;KAAO;IAC3B;GACD,OAAO,EACL,WAAW,gBACZ;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,OAAO,EAAE;GACV;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EACL,OAAO,GACR;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,SAAS;IACP;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC3B;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC3B;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC5B;GACD,OAAO,EAAE;GACV;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,QAAQ;IACR,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO,CACL;MACE,UAAU;MACV,SAAS;MACV,CACF;KACD,MAAM;KACN,OAAO,EACL,MAAM,cACP;KACF,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,QAAQ,IACT;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO,CACL;MACE,UAAU;MACV,SAAS;MACV,CACF;KACF,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EAAE;GACT,OAAO;IACL,eAAe;KAAC;MAAE,OAAO;MAAK,OAAO;MAAK;KAAE;MAAE,OAAO;MAAK,OAAO;MAAK;KAAE;MAAE,OAAO;MAAK,OAAO;MAAK;KAAC;IACnG,eAAe;KAAC;MAAE,OAAO;MAAM,OAAO;MAAK;KAAE;MAAE,OAAO;MAAM,OAAO;MAAK;KAAE;MAAE,OAAO;MAAM,OAAO;MAAK;KAAC;IACvG;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,MAAM;IACJ,QAAQ,CAAC,WAAW;IACpB,UAAU;IACV,MAAM,EACJ,KAAK,uBACN;IACD,SAAS,EACP,SAAS,8BACV;IACF;GACD,MAAM;GACP;EACF;CACF,EAEK,KAAU;CACd;EACE,MAAM;EACN,MAAM;EACN,QAAQ;EACT;CACD;EACE,MAAM;EACN,MAAM;EACN,QAAQ;EACR,OAAO;GACL,QAAQ;GACR,KAAK;GACN;EACD,OAAO,EACL,MAAM,WACP;EACF;CACD;EACE,MAAM;EACN,MAAM;EACN,OAAO;GACL,SAAS;GACT,SAAS;GACV;EACD,OAAO,EACL,MAAM,QACP;EACF;CACD,CACE;EACE,MAAM;EACN,MAAM;EACN,QAAQ;EACT,EACD;EACE,MAAM;EACN,MAAM;EACN,OAAO;GACL,QAAQ;GACR,KAAK;GACN;EACF,CACF;CACD;EACE,MAAM;EACN,MAAM;EACN,OAAO;GACL,SAAS;GACT,SAAS;GACV;EACD,OAAO,EACL,MAAM,WACP;EACF;CACF,EAwND,KAAe;CAAE;CAAM,OAtNT;EACZ,YAAY;EACZ,QAAQ,CACN;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACR,EACD;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS,CACP;IAAE,OAAO;IAAG,OAAO;IAAK,EACxB;IAAE,OAAO;IAAG,OAAO;IAAK,CACzB;GACF,CACF;EACD,SAAS;GACP;IACE,OAAO;IACP,OAAO;IACP,MAAM;IACP;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS,CACP;KAAE,OAAO;KAAG,OAAO;KAAK,EACxB;KAAE,OAAO;KAAG,OAAO;KAAK,CACzB;IACD,OAAO;KACL,GAAG;KACH,GAAG;KACJ;IACD,OAAO,EACL,UAAU,IACX;IACF;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACF;EACD,aAAa;EACb,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,QAAQ;IACT;GACD;IACE,MAAM;IACN,OAAO;KACL,SAAS;KACT,SAAS;KACV;IACD,OAAO;KACL,MAAM;KACN,MAAM;KACP;IACF;GACD;IACE,MAAM;IACN,OAAO;KACL,QAAQ;KACR,KAAK;KACN;IACD,OAAO;KACL,MAAM;KACN,MAAM;KACP;IACF;GACF;EACD,cAAc,CACZ,GAAG,GAAE,UAAU,GAAQ,EACvB;GACE,MAAM;GACN,QAAQ;GACR,OAAO;IACL,MAAM;IACN,MAAM;IACP;GACF,CACF;EACD,gBAAgB;EAChB,SAAS;EACV;CAyG6B,UAvGb;EACf,MAAM;EACN,MAAM;GACJ,cAAc,CACZ;IACE,aAAa;IACb,MAAM;IACN,WAAW;IACX,eAAe;IACf,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM,EAAE,QAAQ,WAAW;IAC3B,UAAU;IACX,CACF;GACD,MAAM;IACJ,cAAc;IACd,YAAY;IACb;GACF;EACF;CAkFuC,YAhFrB;EACjB,aAAa;EACb,YAAY;EACZ,WAAW;GACT;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,IACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,IACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,GACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,GACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACR;GACF;EACF;CA2CmD,eAzC9B;EACpB,aAAa;EACb,YAAY;EACZ,WAAW;GACT;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,IACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,IACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,SAAS;IACT,KAAK,EACH,MAAM,GACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,GACP;IACF;GACD;IACE,SAAS;IACT,MAAM;IACN,OAAO;IACR;GACF;EACF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AO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,MAAM;MACP;KACF;IACF;GACF;EACF;CACF,ECrED,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACF;EACF;CACF,EC1CD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACF;EACF;CACF,ECvCD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,SAAS,CACP;IAAE,OAAO;IAAG,OAAO;IAAS,EAC5B;IAAE,OAAO;IAAG,OAAO;IAAU,CAC9B;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,QAAQ;IACR,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACD,QAAQ;IACN,OAAO;IACP,OAAO;IACR;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,QAAQ;OACN,OAAO;OACP,OAAO;OACR;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,QAAQ;OACN,OAAO;OACP,OAAO;OACR;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACF;IACF;GACF;EACF;CACD,MAAM,GAAM;EACV,IAAM,IAAM,EAAU,EAAK;AAW3B,SAVI,EAAK,eAAe,IAClB,EAAI,SAAS,EAAI,MAAM,cAAc,KAAA,KACvC,OAAO,EAAI,MAAM,YAEV,EAAK,eAAe,KACzB,EAAI,WACN,OAAO,EAAI,SAGf,OAAO,EAAI,YACJ;;CAEV,ECtHD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACP,SAAS,EAAE;EACZ;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACD,QAAQ;IACT;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACF;CACF,EC9CD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACF;IACF;GACF;EACF;CACF,ECxDD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,OAAO;OACL,SAAS,EACP,eAAe,OAChB;OACD,QAAQ;OACR,WAAW,CACT;QACE,MAAM;QACN,OAAO;QACP,OAAO;QACR,EACD;QACE,MAAM;QACN,OAAO;QACP,OAAO;QACP,SAAS,CACP;SAAE,OAAO;SAAS,OAAO;SAAO,CACjC;QACF,CACF;OACF;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACF;IACF;GACF;EACF;CACF,ECpED,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACF;IACF;GACF;EACF;CACF,EChCK,KAAW,EAAE;AAEnB,SAAgB,EAAQ,GAAS;AAC/B,IAAS,EAAQ,QAAQ;;AAG3B,EAAQqB,GAAM,EACd,EAAQC,GAAO,EACf,EAAQC,GAAO,EACf,EAAQC,GAAY,EACpB,EAAQC,GAAQ,EAChB,EAAQC,GAAQ,EAChB,EAAQC,GAAM,EACd,EAAQC,GAAS,EACjB,EAAQC,GAAK,EACb,EAAQC,GAAK,EACb,EAAQC,GAAO,EACf,EAAQC,GAAW,EACnB,EAAQC,GAAS;AAEjB,IAAa,KAAQ,IAERC,KAAa;CACxB,SAAS;EACP,eAAe;EACf,cAAc;EACd,cAAc;EACf;CACD,WAAW;EACT;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,SAAS;IACP;KAAE,OAAO;KAAS,OAAO;KAAK;IAC9B;KAAE,OAAO;KAAQ,OAAO;KAAK;IAC7B;KAAE,OAAO;KAAO,OAAO;KAAK;IAC7B;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACP,SAAS,CACP;MAAE,OAAO;MAAW,OAAO;MAAW,CACvC;KACF,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACP,SAAS,CACP;MAAE,OAAO;MAAW,OAAO;MAAW,CACvC;KACF,CACF;IACF;GACF;EACF;CACF,EClFY,KAAyB;CACpC,eAAe;CACf,cAAc;CACd,cAAc;CAChB,EAEM,KAAO,EAAC;AAEd,OAAO,KAAK,GAAM,CAAC,SAAQ,MAAQ;AACjC,IAAK,KAAK;EAAE,OAAO;EAAM,OAAO,GAAM,GAAM;EAAM,CAAA;EACnD;AAED,IAAM,KAAY;CAChB,SAAS;EACP,cAAc;EACd,cAAc;EACf;CACD,WAAW,CACT;EACE,MAAM;EACN,OAAO;EACP,OAAO;GACL,QAAQ;GACR,WAAW;IACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR;IACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACP,SAAS,EAAU,GAAI;KACxB;IACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACT;IACF;GACF;EACF,CACF;CACF,EAEK,KAAU;CACb,YAAY;EAAE,WAAA;EAAW;EAAO,SAAA;EAAS;EAAU;CACnD,OAAO,EACL,QAAQ;EACN,MAAM;EACN,UAAS,MAAK;EAChB,EACD;CACD,OAAO;AACL,SAAO;GACL,YAAY,EAAE;GACH;GACX,YAAY;GACZ,WAAW;GACX,eAAe,OAAO,OACpB,EAAE,EACF,KAAK,OAAO,QACZ,EACE,SAAS;IACP,cAAc;IACd,cAAc;IAChB,EACF,CACD;GACD,aAAa,EAAE;GACf,KAAK;GACL,SAAS;GACT,YAAY,KAAA;GACZ,aAAa,EAAE;GACf,YAAY,EAAE;GACd,UAAU;GACV,aAAa,KAAA;GACb,SAAS;GACT,gBAAgB;GAChB,aAAa;GACb,YAAY;GACZ,iBAAiB;GACjB,OAAO,EAAU,GAAI;GACvB;;CAEF,UAAU,EACR,gBAAgB;AACd,SAAO,EACL,WAAW,KAAK,cAAc,WAChC;IAEH;CACD,OAAO;EACL,aAAa;GACX,MAAM;GACN,WAAW;GACX,QAAQ,GAAK;IACX,IAAM,IAAM,EAAU,EAAG;AASzB,IARI,EAAI,qBAAqB,OAC3B,EAAI,eAAe,KAEjB,EAAI,uBAAuB,OAC7B,EAAI,eAAe,KAErB,OAAO,EAAI,kBACX,OAAO,EAAI,kBACP,OAAO,KAAK,EAAI,CAAC,SAAS,MAC5B,KAAK,gBAAgB,EAAM,KAAK,eAAe,EAAE,SAAS,GAAK,CAAA,EAC/D,KAAK;;GAGV;EACD,aAAa;GACX,MAAM;GAEN,QAAQ,GAAK;IACX,IAAM,IAAU,EAAI,KAAK,eAAe,KAAK,YAAW;AACxD,QAAI,CAAC,EACH;IAEF,IAAM,IAAO,IAAU,EAAQ,OAAO,IAChC,IAAO,KAAK,QAAQ,IACpB,IAAY,EAAK,QAAQ,EAAK,MAAM,EAAG,GAAI;AACjD,QAAI,KAAa,OAAO,KAAK,EAAU,CAAC,SAAS,GAAG;AAGlD,SAFA,EAAU,OAAO,GAEb,KAAK,YAAY,QAAQ,IAAG,GAAI,IAAI;MAEtC,IAAM,CAAC,GAAG,GAAK,KAAY,KAAK,YAAY,MAAM,iBAAgB;AAElE,WAAK,cAAc,GAAK,KAAY,EAAE,GAAG,GAAU;WAEnD,MAAK,cAAc,KAAK,eAAe;AAGzC,UAAK;;;GAGV;EACD,iBAAiB,EACf,QAAQ,GAAK;GACX,IAAM,IAAO,KAAK,QAAQ;AAS1B,GARA,KAAK,aAAa,EAAU;IAC1B,SAAS,EAAU,GAAuB;IAC1C,WAAW,EAAU,EAAK,QAAO;IAClC,CAAA,EAED,KAAK,cAAc,EADO,EAAI,KAAK,eAAe,KAAK,YAAW,CACpB,EAC9C,KAAK,YAAY,OAAO,GACxB,KAAK,WACL,KAAK;KAET;EACD;CACD,eAAe;AACb,IAAS,GAAG,eAAe,EAAE,UAAO,cAAW;AAC7C,QAAK,YAAY,EAAK,MAAM,EAAK,MAAK;IACvC;;CAEH,YAAY;AACV,IAAS,IAAI,aAAY;;CAE3B,SAAS;EACP,YAAY,GAAS,GAAM;AAUzB,GATA,KAAK,cAAc,cAAc,GAC7B,MAAY,WACd,KAAK,YAAY,QACjB,KAAK,YAAW,GAEd,MAAY,UACd,KAAK,YAAY,QACjB,KAAK,WAAU,GAEjB,KAAK;;EAEP,KAAK,GAAM;GACT,IAAM,IAAS;AAEf,GADA,KAAK,cAAc,EAAC,EACpB,KAAK,cAAc,KAAU,KAAK,cAAc,MAAW,EAAC;GAC5D,IAAM,IAAO,KAAK,QAAQ;AAU1B,GATA,KAAK,aAAa,GAClB,KAAK,cAAc,GAAQ,KAAK,EAAU,EAAK,QAAQ,CAAA,EACvD,KAAK,aAAa,EAAU;IAC1B,SAAS,EAAU,GAAuB;IAC1C,WAAW,EAAU,EAAK,QAAO;IAClC,CAAA,EACD,KAAK,WACL,KAAK,OACL,KAAK,cAAc,GAAG,EAAO,GAAG,KAAK,cAAc,GAAQ,SAAS,EAAE,IACtE,KAAK,YAAY;;EAEnB,YAAY;AAOV,GANA,GAAM,KAAK,eAAe,KAAK,YAAW,EAC1C,KAAK,gBAAgB,EAAU,GAAc,KAAK,cAAc,CAAA,EAChE,KAAK,cAAc,IACnB,KAAK,cAAc,EAAC,EACpB,KAAK,aAAa,EAAC,EACnB,KAAK,OACL,KAAK;;EAEP,aAAa;GACX,IAAM,IAAI,KAAK;AAEf,OADU,EAAE,MAAM,KAAK,eAAc,EAC9B;IACL,IAAM,IAAc,EAAU,EAAI,KAAK,eAAe,EAAE,CAAA,EAClD,IAAO,EAAY,MACnB,IAAO,KAAK,QAAQ;AAC1B,QAAI,CAAC,GAAM;AACT,UAAK,SAAS;MAAE,MAAM;MAAW,SAAS;MAAgB,CAAA;AAC1D;;AAQF,IANA,KAAK,kBAAkB,GACvB,KAAK,cAAc,GACnB,KAAK,aAAa,EAAU;KAC1B,SAAS,EAAU,GAAuB;KAC1C,WAAW,EAAU,EAAK,QAAO;KAClC,CAAA,EACD,KAAK;;;EAGT,aAAa;AACX,QAAK,MAAM,QAAQ;IACjB,QAAQ;IACR,KAAK;IACL,MAAM,EAAE,WAAW,KAAK,cAAc,WAAU;IACjD,CAAC,CAAC,MAAM,EAAE,cAAW;AACpB,IAAI,KACF,KAAK,SAAS;KAAE,MAAM;KAAW,SAAS;KAAmB,CAAA;KAEhE;;EAEL;CACF;;;aA5RE,EAyCa,GAAA,MAAA;EAxCA,MAAI,QAOX;GALM,EAAA,cAAc,aAAA,GAAA,EADtB,EAME,GANF,EAME;IAJA,KAAI;IACH,KAAK,EAAA;IACL,KAAK;MACE,EAAA,cAAa,EAAA,MAAA,GAAA,IAAA,EAAA,IAAA,GAAA;GAEvB,EAAc,EAAA;GACd,EAGkB,GAAA;IAFhB,MAAK;IACJ,SAAO,EAAA;;qBACH,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAN,UAAM,GAAA,CAAA,CAAA,CAAA;;;cAAW,cAElB,GAAA;GAAA,EAKU,GAAA;IAJR,MAAK;IACL,MAAK;;qBAE6B,CAAlC,EAAkC,GAAA,EAAvB,MAAM,EAAA,eAAa,EAAA,MAAA,GAAA,CAAA,OAAA,CAAA,CAAA,CAAA;;;;EAGvB,eAAW,QAYV,CAXK,EAAA,eAAA,GAAA,EAAf,EAWU,GAAA,EAAA,KAAA,GAAA,EAAA;oBADO,CATf,EASe,GAAA,EATD,OAAM,QAAM,EAAA;qBAQZ,CAPZ,EAOY,GAAA;iBAPQ,EAAA;4CAAA,EAAA,kBAAe;;sBAEF,EAAA,EAAA,GAAA,EAD/B,EAKE,GAAA,MAAA,EAJuB,EAAA,QAAf,GAAK,YADf,EAKE,GAAA;MAHC,KAAK;MACL,OAAO,EAAK;MACZ,OAAO,EAAK;;;;;;;yBAKrB,EAIE,GAJF,EAIE;GAHC,KAAK,EAAA;eACG,EAAA;0CAAA,EAAA,cAAW;KACZ,EAAA,WAAU,EAAA,MAAA,IAAA,CAAA,aAAA,CAAA,EAAA,CAAA;;;;oFCvC1B,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,MAAM;MACP;KACF;IACF;GACF;EACF;CACF,EC9CD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,SAAS,CACP;IAAE,OAAO;IAAG,OAAO;IAAS,EAC5B;IAAE,OAAO;IAAG,OAAO;IAAU,CAC9B;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,QAAQ;IACR,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACD,QAAQ;IACN,OAAO;IACP,OAAO;IACR;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,QAAQ;OACN,OAAO;OACP,OAAO;OACR;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,QAAQ;OACN,OAAO;OACP,OAAO;OACR;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACF;IACF;GACF;EACF;CACD,MAAM,GAAM;EACV,IAAM,IAAM,EAAU,EAAK;AAW3B,SAVI,EAAK,eAAe,IAClB,EAAI,SAAS,EAAI,MAAM,cAAc,KAAA,KACvC,OAAO,EAAI,MAAM,YAEV,EAAK,eAAe,KACzB,EAAI,WACN,OAAO,EAAI,SAGf,OAAO,EAAI,YACJ;;CAEV,ECjHD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBY,KAAa;CACxB,SAAS;EACP,eAAe;EACf,cAAc;EACd,cAAc;EACf;CACD,WAAW;EACT;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACF;CACF,ECzBY,KAAyB;CACpC,eAAe;CACf,cAAc;CACd,cAAc;CACf,EUMD,KAAe;CACb,MTXa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CSlBC,MRZa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;KACL,SAAS,EACP,eAAe,OAChB;KACD,WAAW,CACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR,EACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR,CACF;KACF;IACD,OAAO,EAAE;IACV;GACF;EACD,MAAM,GAAK;AAKT,UAJA,EAAI,UAAU,EAAI,WAAW,EAAE,EAC/B,AACE,EAAI,UAAQ,MAEP;;EAEV;CQ1CC,MPba;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;COXC,MNda;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CMVC,OLfa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CKTC,MJhBa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CIRC,MHjBa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CGPC,MFlBa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CENC,KDnBa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACP;GACF;EACF;CCXA,EKfD,KAAe;CACb,MJNa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,QAAQ;GACR,MAAM;GACP;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACP;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;KACL,SAAS,EACP,eAAe,OAChB;KACD,WAAW,CACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MAC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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","names":["h","getCurrentInstance","createVNode","_createVNode","ElRow","ElCol","ElCard","merge","VForm","VTable","isObject","isArray","test","props","components","regComponents","comps","Object","keys","forEach","k","defaultSchema","type","class","shadow","afterReset","syncUrl","pathNodeParse","node","_node","assign","part","split","reverse","span","tmp","i","length","item","children","nodesParse","_nodes","root","gutter","style","colProps","indexOf","push","transChildren","_children","globalComps","comp","default","map","render","appContext","nodes","values","schema","input","select","number","numberRange","xswitch","subForm","radio","checkbox","code","json","upload","iconSelect","template","baseSchema","xenum","$router","$router","$route"],"sources":["../src/init.ts","../src/utils/token.ts","../src/store/http.ts","../src/default.ts","../src/store/modules/settings.ts","../src/store/modules/user.ts","../src/store/modules/app.ts","../src/store/modules/builderSchema.ts","../src/store/index.ts","../src/composables/useThemeMode.ts","../src/App.vue","../src/App.vue","../src/mock/types.ts","../src/mock/data/example.ts","../src/mock/apis/user.ts","../src/mock/apis/index.ts","../src/mock/index.ts","../src/plugins/element-plus.ts","../src/utils/request/cache.ts","../src/router/guard/nprogress.ts","../src/router/guard/func.ts","../src/utils/sso/base.ts","../src/utils/sso/github.ts","../src/utils/sso/dingtalk.ts","../src/utils/sso/index.ts","../src/router/guard/permission.ts","../src/types.ts","../src/components/VLoading.vue","../src/components/notice/VNotice.vue","../src/components/PageLoad.vue","../src/components/PageLoad.vue","../src/scaffold/table.vue","../src/scaffold/form.vue","../src/components/VTree.vue","../src/scaffold/tree.vue","../src/scaffold/container.vue","../src/components/report/option.ts","../src/components/report/NumberPanel.vue","../src/components/report/part.vue","../src/components/report/part.vue","../src/components/report/index.vue","../src/components/report/index.vue","../src/scaffold/report.vue","../src/render/index.tsx","../src/scaffold/custom.vue","../src/router/remote.ts","../src/scaffold/layout/components/Breadcrumb/index.vue","../src/scaffold/layout/components/Hamburger/index.vue","../src/scaffold/devtool/DevLayout.vue","../src/scaffold/devtool/formBuilder/ctrls/input.js","../src/scaffold/devtool/formBuilder/ctrls/number.js","../src/scaffold/devtool/formBuilder/ctrls/number-range.js","../src/scaffold/devtool/formBuilder/ctrls/select.js","../src/scaffold/devtool/formBuilder/ctrls/radio.js","../src/scaffold/devtool/formBuilder/ctrls/switch.js","../src/scaffold/devtool/formBuilder/ctrls/code.js","../src/scaffold/devtool/formBuilder/ctrls/json.js","../src/scaffold/devtool/formBuilder/ctrls/upload.js","../src/scaffold/devtool/formBuilder/ctrls/template.js","../src/scaffold/devtool/formBuilder/ctrls/icon-select.js","../src/scaffold/devtool/formBuilder/ctrls/sub-form.js","../src/scaffold/devtool/formBuilder/ctrls/checkbox.js","../src/scaffold/devtool/formBuilder/form.js","../src/scaffold/devtool/formBuilder/index.vue","../src/scaffold/devtool/tableBuilder/ctrls/input.js","../src/scaffold/devtool/tableBuilder/ctrls/select.js","../src/scaffold/devtool/tableBuilder/ctrls/date.js","../src/scaffold/devtool/tableBuilder/table.js","../src/scaffold/devtool/base.js","../src/scaffold/devtool/tableBuilder/columns/span.js","../src/scaffold/devtool/tableBuilder/columns/emum.js","../src/scaffold/devtool/tableBuilder/columns/html.js","../src/scaffold/devtool/tableBuilder/columns/icon.js","../src/scaffold/devtool/tableBuilder/columns/image.js","../src/scaffold/devtool/tableBuilder/columns/json.js","../src/scaffold/devtool/tableBuilder/columns/link.js","../src/scaffold/devtool/tableBuilder/columns/rich.js","../src/scaffold/devtool/tableBuilder/columns/tpl.js","../src/scaffold/devtool/tableBuilder/columns/index.js","../src/scaffold/devtool/tableBuilder/btn/jump.js","../src/scaffold/devtool/tableBuilder/btn/api.js","../src/scaffold/devtool/tableBuilder/btn/form.js","../src/scaffold/devtool/tableBuilder/btn/table.js","../src/scaffold/devtool/tableBuilder/btn/index.js","../src/scaffold/devtool/tableBuilder/index.vue","../src/scaffold/devtool/tableBuilder/index.vue","../src/scaffold/layout/components/PageEditor.vue","../src/scaffold/layout/components/Navbar.vue","../src/scaffold/layout/components/Navbar.vue","../src/scaffold/layout/components/Sidebar/Logo.vue","../src/scaffold/layout/components/Sidebar/Logo.vue","../src/scaffold/layout/components/Sidebar/Link.vue","../src/scaffold/layout/components/Sidebar/FixiOSBug.ts","../src/scaffold/layout/components/Sidebar/MenuContent.vue","../src/scaffold/layout/components/Sidebar/MenuContent.vue","../src/scaffold/layout/components/Sidebar/SidebarItem.vue","../src/scaffold/layout/components/Sidebar/SearchMenu.vue","../src/scaffold/layout/components/Sidebar/SearchMenu.vue","../src/scaffold/layout/components/Sidebar/index.vue","../src/scaffold/layout/components/Sidebar/index.vue","../src/scaffold/layout/components/AppMain.vue","../src/scaffold/layout/index.vue","../src/router/permission.ts","../src/utils/jwt.ts","../src/router/guard/remote-routes.ts","../src/router/guard/set-page-title.ts","../src/router/guard/index.ts","../src/utils/container/index.ts","../src/scaffold/dashboard.vue","../src/scaffold/dashboard.vue","../src/scaffold/login.vue","../src/scaffold/login.vue","../src/scaffold/404.vue","../src/router/router.ts","../src/router/index.ts","../src/utils/request/interceptors.ts","../src/utils/request/index.ts","../src/directive/outClick.ts","../src/plugins/eventBus.ts","../src/directive/rightClick.ts","../src/directive/resize.ts","../src/directive/devtool.ts","../src/directive/index.ts","../src/admin.ts"],"sourcesContent":["/* eslint-disable */\ninterface String {\n format(...replacements: string[]): string;\n}\n\nif (!String.prototype.format) {\n String.prototype.format = function () {\n const args = arguments\n return this.replace(/{(\\d+)}/g, function (match, number) {\n return typeof args[number] !== 'undefined'\n ? args[number]\n : match\n })\n }\n}\n","import Cookies from 'js-cookie'\nimport { pinia, useSettingsStore } from '../store'\n\nconst TokenKey = 'oms:token'\n\nexport function getToken(): string {\n return Cookies.get(TokenKey) || ''\n}\n\nexport function setToken(token: string) {\n const settings = useSettingsStore(pinia)\n const expires = new Date(new Date().getTime() + (settings.tokenExpire || 24 * 60 * 60 * 1000))\n return Cookies.set(TokenKey, token, { expires })\n}\n\nexport function removeToken() {\n return Cookies.remove(TokenKey)\n}\n","import type { AxiosInstance } from 'axios'\n\nlet httpClient: AxiosInstance | null = null\n\nexport function setHttp(http: AxiosInstance) { httpClient = http }\nexport function getHttp(): AxiosInstance | null { return httpClient }\n\n","import zhCn from 'element-plus/es/locale/lang/zh-cn'\nimport { AxiosRequestConfig } from 'axios'\nimport { OmsOptions } from './types'\nimport { Settings } from './types'\n\nconst defaultAxios: AxiosRequestConfig = {\n baseURL: '/api',\n withCredentials: true,\n cacheEnable: true\n}\n\nexport const defaultSettings: Settings = {\n title: 'oms',\n fixedHeader: false,\n sidebarLogo: true,\n logo: '',\n closeNavNotice: false,\n navBarNotice: '',\n hasNewMessage: true,\n showPageJsonSchema: false,\n loginTips: '',\n sso: {},\n ElementPlus: {\n size: 'default',\n zIndex: 3000,\n locale: zhCn\n },\n nav: [],\n whiteRoutes: ['/login'],\n tokenExpire: 7 * 24 * 60 * 60 * 1000,\n defaultAvatar: '',\n envColor: {\n 'uat': 'gray',\n 'pre': 'green'\n },\n serviceOffLineNotice: '当前页面功能正在维护, 请稍后再试~~~',\n formMutex: true,\n captcha: true,\n themeMode: 'light'\n}\n\nexport const defaultOptions: OmsOptions = {\n axios: defaultAxios,\n settings: defaultSettings,\n plugins: [],\n mock: false\n}\n","import { defineStore } from 'pinia'\nimport { Settings } from '../../types'\nimport { defaultSettings } from '../../default'\nimport { cloneDeep, merge } from 'lodash'\n\nexport const settings: Settings = cloneDeep(defaultSettings)\n\nexport const useSettingsStore = defineStore('settings', {\n state: (): Settings => ({ ...settings }),\n actions: {\n updateSettings(newSettings: Settings) {\n // merge into reactive state\n merge(this, newSettings)\n }\n }\n})\n\nexport default useSettingsStore\n","import { defineStore } from 'pinia'\nimport { strOrNum, User } from '../types'\nimport { LoginForm, LoginTicket, RemoteModule, Settings, UserInfo } from '../../types'\nimport { ApiResponse } from '../../utils/request/types'\nimport { getToken, removeToken, setToken } from '../../utils/token'\nimport { RouteRecordRaw } from 'vue-router'\nimport Cookies from 'js-cookie'\nimport { getHttp } from '../http'\nimport { useSettingsStore } from './settings'\n\nexport const userState: User = {\n name: '',\n nickname: '',\n avatar: '',\n token: getToken(),\n customRouter: [],\n remoteRouter: [],\n menuRoutes: [],\n isLodeRemoteRoutes: false,\n resource: {},\n roleIds: [],\n path: '',\n env: '',\n expired: false\n}\n\nconst getRouteKey = (route: RouteRecordRaw): string => {\n return typeof route.name === 'string' ? route.name : route.path\n}\n\nexport const useUserStore = defineStore('user', {\n state: (): User => ({ ...userState }),\n actions: {\n updateToken(token: string) {\n this.token = token\n setToken(token)\n },\n removeToken() {\n this.token = ''\n removeToken()\n },\n updateRemoteRouter(routes: RemoteModule[]) {\n this.remoteRouter = routes\n this.isLodeRemoteRoutes = true\n },\n setCustomRoutes(routes: RouteRecordRaw[]) {\n const existed = new Set(this.customRouter.map(route => getRouteKey(route)))\n const append = routes.filter(route => !existed.has(getRouteKey(route)))\n if (append.length) {\n this.customRouter = this.customRouter.concat(append)\n }\n },\n updateState<K extends keyof User>({ key, value }: { key: K, value: any }) {\n // @ts-ignore\n this[key] = value\n },\n resetUser() {\n const fresh: User = { ...userState, token: getToken() }\n Object.assign(this, fresh)\n },\n SET_EXPIRED() {\n this.expired = !this.expired\n },\n\n // async actions\n login(data: LoginForm | LoginTicket): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n const http = getHttp()\n if (!http) {\n reject('http client not init')\n return\n }\n http.request<UserInfo, ApiResponse<UserInfo>>({\n url: '/user/login',\n method: 'POST',\n data\n }).then((response: ApiResponse<UserInfo>) => {\n this.updateToken(response.data?.token || '')\n resolve(true)\n }).catch(error => reject(error))\n })\n },\n logout() {\n this.removeToken()\n this.resetUser()\n },\n info(): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n const http = getHttp()\n if (!http) {\n reject('http client not init')\n return\n }\n http.request<UserInfo, ApiResponse<UserInfo>>({\n url: '/user/info',\n method: 'GET'\n }).then((response: ApiResponse<UserInfo>) => {\n const roleIds: strOrNum[] = response.data?.role_ids || []\n this.updateState({ key: 'name', value: response.data?.name })\n this.updateState({ key: 'nickname', value: response.data?.nickname })\n this.updateState({ key: 'roleIds', value: roleIds })\n this.updateState({ key: 'env', value: response.data?.env })\n const website = (response.data?.website || {}) as Settings\n useSettingsStore().updateSettings(website)\n // @ts-ignore\n !Cookies.get('username') && Cookies.set('username', response.data?.name)\n // We cannot directly import settings store here without circular concerns in some flows.\n resolve(true)\n }).catch(error => reject(error))\n })\n },\n loadRemoteRoutes(): Promise<RemoteModule[]> {\n return new Promise<RemoteModule[]>((resolve, reject) => {\n const http = getHttp()\n http?.request<RemoteModule, ApiResponse<RemoteModule[]>>({\n url: '/user/routes',\n method: 'get'\n }).then((response: ApiResponse<RemoteModule[]>) => {\n if (response.code === 0) {\n const resource: RemoteModule[] = response.data || []\n resolve(resource)\n } else {\n reject('error')\n }\n }).catch(error => {\n console.log(error)\n reject(error)\n })\n })\n },\n SetExpired() {\n this.SET_EXPIRED()\n }\n }\n})\n\nexport default useUserStore\n","import { defineStore } from 'pinia'\nimport { App, PageSchema, Sidebar } from '../types'\nimport Cookies from 'js-cookie'\n\nconst SIDEBAR_STATUS_KEY = 'sidebarStatus'\n\nfunction getStoredSidebarStatus() {\n if (typeof window === 'undefined')\n return undefined\n const local = window.localStorage.getItem(SIDEBAR_STATUS_KEY)\n if (local !== null)\n return local === '1'\n const cookie = Cookies.get(SIDEBAR_STATUS_KEY)\n if (cookie !== undefined)\n return !!cookie\n}\n\nfunction persistSidebarStatus(opened: boolean) {\n if (typeof window !== 'undefined')\n window.localStorage.setItem(SIDEBAR_STATUS_KEY, opened ? '1' : '0')\n Cookies.set(SIDEBAR_STATUS_KEY, opened ? '1' : '0')\n}\n\nexport const appState: App = {\n sidebar: {\n opened: getStoredSidebarStatus() ?? true,\n withoutAnimation: false\n },\n device: 'desktop',\n pages: {},\n currentRouteMeta: {},\n builderSchema: {},\n baseURL: ''\n}\n\nexport const useAppStore = defineStore('app', {\n state: (): App => ({ ...appState }),\n actions: {\n TOGGLE_SIDEBAR() {\n this.sidebar.opened = !this.sidebar.opened\n this.sidebar.withoutAnimation = false\n persistSidebarStatus(this.sidebar.opened)\n },\n CLOSE_SIDEBAR(withoutAnimation: boolean) {\n this.sidebar.opened = false\n persistSidebarStatus(this.sidebar.opened)\n this.sidebar.withoutAnimation = withoutAnimation\n },\n TOGGLE_DEVICE(device: string) {\n this.device = device\n },\n SET_PAGE_JSON_SCHEMA({ page, json }: PageSchema) {\n this.pages[page] = json\n },\n SET_CURRENT_META(data: Record<string, any>) {\n this.currentRouteMeta = data\n },\n SET_BUILDER_SCHEMA(data: Record<string, any>) {\n this.builderSchema = data\n },\n SET_BASE_API(data: string) {\n this.baseURL = data\n },\n\n // Vuex-compat method names\n toggleSideBar() { this.TOGGLE_SIDEBAR() },\n closeSideBar({ withoutAnimation }: Sidebar) { this.CLOSE_SIDEBAR(withoutAnimation) },\n toggleDevice(device: string) { this.TOGGLE_DEVICE(device) },\n setPageJsonSchema(data: PageSchema) { this.SET_PAGE_JSON_SCHEMA(data) },\n setCurrentMeta(data: Record<string, any>) { this.SET_CURRENT_META(data) },\n setBuilderSchema(data: Record<string, any>) { this.SET_BUILDER_SCHEMA(data) },\n setBaseAPI(data: string) { this.SET_BASE_API(data) }\n }\n})\n\nexport default useAppStore\n","/**\n * BuilderSchema\n * 存储pageEditor 编辑模式下时子组件联动相关的状态数据\n */\n\nimport { defineStore } from 'pinia'\nimport { BuilderSchema } from '../types'\n\nexport const builderSchemaState: BuilderSchema = {\n currentCellItem: {} // form/sub-form 当前单元格编辑数据\n}\n\nexport const useBuilderSchemaStore = defineStore('builderSchema', {\n state: (): BuilderSchema => ({ ...builderSchemaState }),\n actions: {\n SET_CURRENT_CELLITEM(data: Record<string, any>) {\n this.currentCellItem = data\n },\n setCurrentCellItem(data: Record<string, any>) {\n this.SET_CURRENT_CELLITEM(data)\n }\n }\n})\n\nexport default useBuilderSchemaStore\n","import type { App } from 'vue'\nimport { createPinia } from 'pinia'\n\nexport const pinia = createPinia()\n\nexport function setupStore(app: App<Element>) {\n app.use(pinia)\n}\n\nexport * from './modules/user'\nexport * from './modules/app'\nexport * from './modules/settings'\nexport * from './modules/builderSchema'\nexport * from './http'\n\nexport default pinia\n","import { computed, ref, watch } from 'vue'\nimport { useSettingsStore } from '../store'\nimport {\n applyDocumentTheme,\n dispatchThemeChange,\n getDocumentTheme,\n normalizeTheme,\n type ThemeMode\n} from '@okiss/utils'\n\nconst THEME_STORAGE_KEY = 'oms-theme'\n\nconst themeMode = ref<ThemeMode>('light')\nlet initialized = false\nlet stopWatch: (() => void) | null = null\nlet stopSystemListener: (() => void) | null = null\n\nfunction detectInitialTheme(storeMode: unknown): ThemeMode {\n const fromStore = normalizeTheme((storeMode as string) ?? undefined)\n if (typeof window === 'undefined') {\n return fromStore\n }\n const cached = window.localStorage?.getItem(THEME_STORAGE_KEY)\n if (cached === 'dark' || cached === 'light') {\n return cached\n }\n if (storeMode === 'dark' || storeMode === 'light') {\n return storeMode\n }\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction persistTheme(mode: ThemeMode) {\n if (typeof window !== 'undefined') {\n window.localStorage?.setItem(THEME_STORAGE_KEY, mode)\n }\n}\n\nfunction applyTheme(mode: ThemeMode) {\n const normalized = normalizeTheme(mode)\n themeMode.value = normalized\n applyDocumentTheme(normalized)\n dispatchThemeChange(normalized)\n persistTheme(normalized)\n}\n\nfunction setupSystemThemeListener(onChange: (mode: ThemeMode) => void) {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n stopSystemListener = null\n return\n }\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const listener = (event: MediaQueryListEvent) => {\n const matches = event.matches ?? mediaQuery.matches\n onChange(matches ? 'dark' : 'light')\n }\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', listener)\n } else {\n mediaQuery.addListener(listener)\n }\n stopSystemListener = () => {\n if (typeof mediaQuery.removeEventListener === 'function') {\n mediaQuery.removeEventListener('change', listener)\n } else {\n mediaQuery.removeListener(listener)\n }\n stopSystemListener = null\n }\n}\n\nexport function useThemeMode() {\n const settingsStore = useSettingsStore()\n\n const setTheme = (next: ThemeMode) => {\n const normalized = normalizeTheme(next)\n if (settingsStore.themeMode !== normalized) {\n settingsStore.updateSettings({ themeMode: normalized } as any)\n } else {\n applyTheme(normalized)\n }\n }\n\n if (!initialized) {\n initialized = true\n const resolved = detectInitialTheme(settingsStore.themeMode)\n if (normalizeTheme(settingsStore.themeMode as string) !== resolved) {\n settingsStore.updateSettings({ themeMode: resolved } as any)\n } else {\n applyTheme(resolved)\n }\n stopWatch = watch(\n () => settingsStore.themeMode,\n (mode) => {\n applyTheme(normalizeTheme(mode as string))\n },\n { immediate: true }\n )\n stopSystemListener?.()\n setupSystemThemeListener((mode) => {\n setTheme(mode)\n })\n }\n\n const mode = computed(() => themeMode.value)\n const isDark = computed(() => mode.value === 'dark')\n\n const toggleTheme = () => {\n setTheme(isDark.value ? 'light' : 'dark')\n }\n\n return {\n themeMode: mode,\n isDark,\n setTheme,\n toggleTheme\n }\n}\n\nexport function getThemeMode(): ThemeMode {\n if (!initialized) {\n return normalizeTheme(getDocumentTheme())\n }\n return themeMode.value\n}\n\nexport function stopThemeWatcher() {\n stopWatch?.()\n stopWatch = null\n stopSystemListener?.()\n stopSystemListener = null\n initialized = false\n}\n","<template>\n <router-view :key=\"viewKey\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { addNewStyle, addNewStyleTag } from '@okiss/utils'\nimport { provide } from 'vue'\nimport { useRoute } from 'vue-router'\nimport { useThemeMode } from './composables/useThemeMode'\n\nuseThemeMode()\nconst route = useRoute()\nconst viewKey = computed(() => route.matched.map(item => item.name || item.path).join('|') || route.fullPath)\n\nonBeforeMount(() => {\n const loading = document.getElementById('preloader')\n if (loading !== null) {\n document.body.removeChild(loading)\n document.getElementById('preloader')?.remove()\n addNewStyle('test-icon', '//at.alicdn.com/t/font_2246548_zclaqxwmzq8.css')\n\n const css = `.iconfont {\n font-size: 19px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n font-family: iconfont !important;\n }`\n\n addNewStyleTag(css)\n }\n})\n\nif (window?.OmsOptions?.form?.vsPath) {\n provide('vsPath', window?.OmsOptions?.form?.vsPath)\n}\n</script>\n","<template>\n <router-view :key=\"viewKey\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { addNewStyle, addNewStyleTag } from '@okiss/utils'\nimport { provide } from 'vue'\nimport { useRoute } from 'vue-router'\nimport { useThemeMode } from './composables/useThemeMode'\n\nuseThemeMode()\nconst route = useRoute()\nconst viewKey = computed(() => route.matched.map(item => item.name || item.path).join('|') || route.fullPath)\n\nonBeforeMount(() => {\n const loading = document.getElementById('preloader')\n if (loading !== null) {\n document.body.removeChild(loading)\n document.getElementById('preloader')?.remove()\n addNewStyle('test-icon', '//at.alicdn.com/t/font_2246548_zclaqxwmzq8.css')\n\n const css = `.iconfont {\n font-size: 19px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n font-family: iconfont !important;\n }`\n\n addNewStyleTag(css)\n }\n})\n\nif (window?.OmsOptions?.form?.vsPath) {\n provide('vsPath', window?.OmsOptions?.form?.vsPath)\n}\n</script>\n","export enum MockHttpMethod {\n GET = 'get',\n POST = 'post',\n DELETE = 'delete',\n FETCH = 'fetch',\n OPTION = 'option',\n PUT = 'put'\n}\n\nexport interface MockOption {\n query: Record<string, any>,\n data: Record<string, any>\n}\n\nexport interface MockApi {\n method: MockHttpMethod,\n url: string | RegExp,\n baseURL?: string,\n response: (options: MockOption) => Record<string, any>\n}\n\nexport interface MockApiMap {\n [key: string]: MockApi\n}\n","import _ from 'lodash'\n\nconst form = {\n saveApi: '/save',\n afterSubmit: '',\n afterReset: 'goback',\n options: {\n column: 3,\n submitButton: {\n text: '提交'\n },\n cancelButton: {\n text: '取消',\n on: {\n click: '() => console.error(33333333)'\n }\n }\n },\n formItems: [\n {\n type: 'radio',\n field: 'radio',\n label: '单选框',\n info:\n '表单控件支持提示信息, 可写html <a class=\"el-link el-link--primary is-underline\" target=\"_blank\" href=\"http://github.com/daodao97\">文档</a>',\n options: [\n {\n value: 1,\n label: '选项1'\n },\n {\n value: 2,\n label: '选项2'\n }\n ],\n value: 1,\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n field: 'input',\n label: '输入框',\n value: 5,\n props: {\n maxlength: 10,\n suffixIcon: 'el-icon-date',\n slots: {\n prepend: '前缀'\n },\n showCopy: true,\n prefixIcon: 'el-icon-search'\n },\n rules: [{ required: true, message: '该项为必填项' }],\n depend: {\n field: 'radio',\n value: 1\n },\n computed: [\n {\n when: 'aaa',\n set: {\n checkbox: {\n value: [1]\n }\n }\n },\n {\n when: 'bbb',\n set: {\n checkbox: {\n value: [2, 3]\n }\n }\n }\n ],\n info: '当前控件依赖 单选框 的值, 仅在 选项1 下显示',\n col: {\n span: 12\n }\n },\n {\n type: 'number',\n field: 'number',\n label: '数字',\n props: {\n step: 2\n },\n computed: {\n // when: [\"$self\", \">\", 10],\n // when: [\">\", 3],\n when: 4,\n set: {\n range_number: {\n label: '数字区间2'\n }\n }\n },\n col: {\n span: 12\n },\n value: 4\n },\n {\n type: 'number-range',\n field: 'range_number',\n label: '数字区间',\n col: {\n span: 12\n }\n },\n {\n type: 'checkbox',\n field: 'checkbox',\n label: '复选框',\n value: [],\n options: [\n { value: 1, label: '复选框1' },\n { value: 2, label: '复选框2' },\n { value: 3, label: '复选框3' }\n ],\n info: '动态计算, 当 输入框 字段的值 为 aaa 时, 复选框1将被选中, 为 bbb 时, 复选框2,3 将被选中',\n col: {\n span: 8\n }\n },\n {\n type: 'date',\n field: 'date',\n label: '日期',\n props: {\n disabled: true\n },\n info: '禁用控件',\n col: {\n span: 8\n }\n },\n {\n type: 'date',\n field: 'date_range',\n label: '日期范围',\n value: '',\n props: {\n type: 'daterange',\n rangeSeparator: '~',\n startPlaceholder: '开始日期',\n endPlaceholder: '结束日期'\n },\n col: {\n span: 8\n }\n },\n {\n type: 'time',\n field: 'time',\n label: '时间'\n },\n {\n type: 'time',\n field: 'time_range',\n label: '时间范围',\n props: {\n isRange: true\n }\n },\n {\n type: 'datetime',\n field: 'datetime',\n label: '日期时间'\n },\n {\n type: 'datetime',\n field: 'datetime_range',\n label: '日期时间范围',\n props: {\n type: 'datetimerange'\n }\n },\n {\n type: 'select',\n field: 'select',\n label: '下拉框',\n options: [\n { value: 1, label: '选项1' },\n { value: 2, label: '选项2' },\n { value: 3, label: '选项3' },\n { value: 4, label: '选项4' }\n ],\n props: {\n selectApi: '/user/select'\n }\n },\n {\n type: 'switch',\n field: 'switch',\n label: '开关'\n },\n {\n type: 'slider',\n field: 'slider',\n label: '滑块'\n },\n {\n type: 'upload',\n field: 'upload',\n label: '上传',\n value: 'http://qupinapptest.oss-cn-beijing.aliyuncs.com/1/202002/d81d3c9dc7c3df7590d333f783a97995.jpeg',\n props: {}\n },\n {\n type: 'upload',\n field: 'upload_multiple',\n label: '上传多张',\n props: {\n limit: 3\n }\n },\n {\n type: 'transfer',\n field: 'transfer',\n label: '穿梭框',\n options: [\n { value: 1, label: '备选项1' },\n { value: 2, label: '备选项2' },\n { value: 3, label: '备选项3' }\n ],\n value: []\n },\n {\n type: 'color',\n field: 'color',\n label: '颜色'\n },\n {\n type: 'rate',\n field: 'rate',\n label: '评分',\n value: 3\n },\n {\n type: 'sub-form',\n field: 'sub_form',\n label: '多项子表单',\n props: {\n repeat: true,\n formItems: [\n {\n type: 'input',\n field: 'sub_input',\n label: '输入框',\n rules: [\n {\n required: true,\n message: '子表单的校验将在上层表单校验通过后执行'\n }\n ],\n info: 'input 输入框支持 mask',\n props: {\n mask: '99-9999999'\n }\n },\n {\n type: 'input',\n field: 'sub_input_1',\n label: '输入框1'\n }\n ]\n }\n },\n {\n type: 'sub-form',\n field: 'sub_form_not_repeat',\n label: '子表单',\n props: {\n options: {\n inline: true\n },\n formItems: [\n {\n type: 'input',\n field: 'sub_input',\n label: '输入框',\n rules: [\n {\n required: true,\n message: '子表单的校验将在上层表单校验通过后执行'\n }\n ]\n },\n {\n type: 'input',\n field: 'sub_input_1',\n label: '输入框1'\n }\n ]\n }\n },\n {\n type: 'icon-select',\n field: 'icon',\n label: '图标'\n },\n {\n type: 'json',\n field: 'json',\n label: 'json',\n value: '{\"a\":1}'\n },\n {\n type: 'rule',\n field: 'rule',\n label: 'rule',\n value: [],\n props: {\n factorOptions: [{ label: 'A', value: 'A' }, { label: 'B', value: 'B' }, { label: 'C', value: 'C' }],\n symbolOptions: [{ label: '大于', value: '>' }, { label: '等于', value: '=' }, { label: '小于', value: '<' }]\n }\n },\n {\n type: 'template',\n field: 'p3',\n label: '自定义',\n comp: {\n inject: ['formData'],\n template: '<div>{{ msg }}<br/>当前的表单数据是:<pre>{{JSON.stringify(formData, null, 2)}}</pre><el-button @click=\"onclick\">click</el-button></div>',\n data: {\n msg: 'this is custom data'\n },\n methods: {\n onclick: '() => { console.log(this)}'\n }\n },\n info: '在通用表单控件无法满足需求时, 可以编写 `template` 模板组件'\n }\n ]\n}\n\nconst buttons = [\n {\n type: 'jump',\n text: '跳转',\n target: 'http://github.com/daodao97'\n },\n {\n type: 'api',\n text: '请求接口',\n target: '/test_api',\n extra: {\n method: 'POST',\n url: '/test_api'\n },\n props: {\n type: 'warning'\n }\n },\n {\n type: 'table',\n text: '表格',\n extra: {\n infoApi: '/student/list_info',\n listApi: '/student/list'\n },\n props: {\n type: 'info'\n }\n },\n [\n {\n type: 'jump',\n text: '跳转',\n target: 'http://github.com/daodao97'\n },\n {\n type: 'api',\n text: '请求接口',\n extra: {\n method: 'POST',\n url: '/test_api'\n }\n }\n ],\n {\n type: 'form',\n text: '表单',\n extra: {\n infoApi: '/form',\n saveApi: '/save'\n },\n props: {\n type: 'success'\n }\n }\n]\n\nconst table = {\n exportAble: true,\n filter: [\n {\n field: 'name',\n type: 'input',\n label: '姓名'\n },\n {\n field: 'sex',\n type: 'select',\n label: '性别',\n options: [\n { value: 1, label: '男' },\n { value: 0, label: '女' }\n ]\n }\n ],\n headers: [\n {\n field: 'name',\n label: '姓名',\n info: '表头提示'\n },\n {\n field: 'sex',\n type: 'enum',\n label: '性别',\n options: [\n { value: 1, label: '男' },\n { value: 0, label: '女' }\n ],\n state: {\n 1: 'info',\n 0: 'warning'\n },\n props: {\n sortable: true\n }\n },\n {\n field: 'github',\n type: 'link',\n label: '主页'\n },\n {\n field: 'html',\n type: 'html',\n label: 'HTML'\n },\n {\n field: 'image',\n type: 'image',\n label: '头像'\n },\n {\n field: 'json',\n type: 'json',\n label: '信息'\n },\n {\n field: 'richText',\n type: 'rich-text',\n label: '信息'\n }\n ],\n batchButton: buttons,\n rowButton: [\n {\n type: 'jump',\n text: '编辑',\n target: '/user/{id}'\n },\n {\n type: 'form',\n extra: {\n infoApi: '/user/{id}',\n saveApi: '/user/{id}'\n },\n props: {\n icon: 'el-icon-edit',\n type: 'success'\n }\n },\n {\n type: 'api',\n extra: {\n method: 'POST',\n url: '/student/{id}'\n },\n props: {\n icon: 'el-icon-delete',\n type: 'danger'\n }\n }\n ],\n normalButton: [\n ..._.cloneDeep(buttons),\n {\n type: 'jump',\n target: '/user/form',\n props: {\n icon: 'el-icon-plus',\n type: 'primary'\n }\n }\n ],\n selectedNotice: '当前共勾选: {selectedCount} 条',\n listApi: '/user/list'\n}\n\nconst listMock = {\n code: 0,\n data: {\n 'list|0-100': [\n {\n 'id|0-1000': 1,\n name: '@cname',\n 'sex|0-1': 1,\n 'score|0-100': 60,\n link: 'http://github.com/daodao97',\n image: 'http://qupinapptest.oss-cn-beijing.aliyuncs.com/1/202002/d81d3c9dc7c3df7590d333f783a97995.jpeg',\n html: '<S>显示删除线1</S>',\n json: { slogan: '左手代码右手诗' },\n richText: '在一段文本中<突出|black|yellow>显示某些<文字|#ffffff|#000000>'\n }\n ],\n page: {\n 'count|1-10': 2,\n 'page|1-5': 2\n }\n }\n}\n\nconst layoutForm = {\n afterSubmit: '',\n afterReset: 'goback',\n formItems: [\n {\n type: 'input',\n label: 'span12-1',\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n label: 'span12-1',\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n label: 'span6-1',\n col: {\n span: 6\n }\n },\n {\n type: 'input',\n label: 'span6-1',\n col: {\n span: 6\n }\n },\n {\n type: 'input',\n label: 'span'\n }\n ]\n}\n\nconst layoutSection = {\n afterSubmit: '',\n afterReset: '',\n formItems: [\n {\n type: 'input',\n label: 'span12-1',\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n label: 'span12-1',\n col: {\n span: 12\n }\n },\n {\n type: 'input',\n label: 'span6-1',\n section: '表单片段1',\n col: {\n span: 6\n }\n },\n {\n type: 'input',\n label: 'span6-1',\n col: {\n span: 6\n }\n },\n {\n section: '表单片段2',\n type: 'input',\n label: 'span'\n }\n ]\n}\n\nexport default { form, table, listMock, layoutForm, layoutSection }\n\n","import { MockApi, MockHttpMethod, MockOption } from '../types'\nimport menu from '../data/menu'\nimport role from '../data/role'\nimport example from '../data/example'\n\nconst userApis: MockApi[] = [\n {\n method: MockHttpMethod.POST,\n url: '/login',\n response(options: MockOption) {\n return {\n code: 0,\n data: {\n name: 'daodao97',\n token: 'xxxxxxx'\n }\n }\n }\n },\n {\n method: MockHttpMethod.GET,\n url: '/user/info',\n response(options: MockOption) {\n return {\n code: 0,\n data: {\n role_ids: [1],\n resource: [[0, 20, 'formItems', 'radio'], [0, 1, 2]]\n }\n }\n }\n },\n {\n url: '/user/routes',\n method: MockHttpMethod.GET,\n response: (options: MockOption) => {\n return {\n code: 0,\n data: [\n {\n id: 0,\n label: '',\n routes: []\n }\n ]\n }\n }\n },\n {\n url: '/user/list',\n method: MockHttpMethod.GET,\n response: (options: MockOption) => {\n return example.listMock\n }\n }\n]\n\nexport default userApis\n","import user from './user'\nimport { MockApi } from '../types'\n\nconst apis: MockApi[] = [\n ...user\n]\n\nexport default apis\n","import Mock from 'mockjs'\nimport { MockApi, MockApiMap } from './types'\nimport apis from './apis'\nimport { logGroup, queryParams } from '@okiss/utils'\nimport { defaultOptions } from '../default'\n\nconst uniqueApis: MockApiMap = {}\n\nexport function regMockApis(apis: MockApi[]) {\n apis.forEach(item => {\n const key = realUrl(item)\n uniqueApis[`${item.method}::${key}`] = item\n })\n}\n\nregMockApis(apis)\n\nfunction realUrl(api: MockApi) {\n let url = api.url\n let baseUrl = api.baseURL || defaultOptions.axios?.baseURL\n if (!baseUrl) {\n baseUrl = ''\n }\n if (typeof url === 'string') {\n url = ('/' + baseUrl + url).split('/').filter(v => v).join('/')\n url += '(|\\\\?.*)$'\n return new RegExp(url)\n }\n return url\n}\n\nexport function startMock() {\n Object.keys(uniqueApis).forEach(k => {\n const api = uniqueApis[k]\n const url = realUrl(api)\n Mock.mock(url, api.method, function(options: { url: string, body: any, type: string }) {\n const { url, type, body } = options\n const query = queryParams(url)\n const data = body ? JSON.parse(body) : {}\n const mock = api.response({ query, data })\n const response = Mock.mock(mock)\n logGroup(url, { type, query, data, response })\n return Mock.mock(response)\n })\n })\n console.log(`%c ApiMock is stared! `, 'background: #606060; color: #fff; padding: 4px 5px; border-radius: 1px;')\n}\n","import ElementPlus, { ElMessage, ElMessageBox } from 'element-plus'\nimport '../styles/element/index.scss'\nimport 'element-plus/theme-chalk/src/index.scss'\nimport 'element-plus/theme-chalk/src/dark/css-vars.scss'\nimport 'dayjs/locale/zh-cn'\n\nexport const Message = ElMessage\nexport const MessageBox = ElMessageBox\n\nexport default ElementPlus\n","import { InterceptorUse } from './types'\nimport axios, { AxiosError, AxiosInstance, AxiosResponse, Canceler, AxiosRequestConfig } from 'axios'\n// @ts-ignore\nimport qs from 'qs'\n\nconst CancelToken = axios.CancelToken\n\nconst task = {\n taskList: {} as Record<string, any>,\n cacheList: new Map(),\n uniqueId(config: AxiosRequestConfig) {\n return `${location.href}|${config.method}|${config.url}|`\n // + qs.stringify(config.params)\n },\n addTask(config: AxiosRequestConfig, cancelfun: Canceler) {\n const key = this.uniqueId(config)\n this.taskList[key] = cancelfun\n },\n delTask(config: AxiosRequestConfig) {\n const key = this.uniqueId(config)\n const c = this.taskList[key]\n c && c(config)\n },\n pending(config: AxiosRequestConfig) {\n const key = this.uniqueId(config)\n return !!this.taskList[key]\n },\n cache(config: AxiosRequestConfig) {\n const key = this.uniqueId(config)\n const c = this.cacheList.get(key)\n if (!c) {\n return undefined\n }\n if (c.expirationTime < (new Date()).getTime()) {\n this.delCache(config)\n return undefined\n }\n console.log('getcache', key, c.response)\n return c.response\n },\n addCache(config: AxiosRequestConfig, response: any) {\n const key = this.uniqueId(config)\n const cacheTime = config.cacheTime || 0\n if (cacheTime) {\n this.cacheList.set(key, { response, expirationTime: (new Date()).getTime() + cacheTime })\n }\n },\n delCache(config: AxiosRequestConfig) {\n const key = this.uniqueId(config)\n return this.cacheList.delete(key)\n }\n}\n\nexport const cacheAdapter: (config: AxiosRequestConfig, instance: AxiosInstance) => Promise<any> = (config: AxiosRequestConfig, instance: AxiosInstance) => {\n return new Promise((resolve, reject) => {\n if (config.method !== 'get') {\n delete config.adapter\n resolve(instance(config))\n return\n }\n const cache = task.cache(config)\n if (!cache) {\n delete config.adapter\n resolve(instance(config))\n return\n }\n resolve({ data: cache, config: config })\n })\n}\n\nexport const cancelRequestInterceptor: InterceptorUse<AxiosRequestConfig, AxiosError> = {\n onFulfilled: function(config: AxiosRequestConfig) {\n if (config.cacheEnable === false) {\n return config\n }\n if (task.pending(config)) {\n task.delTask(config)\n }\n config.cancelToken = new CancelToken((cancel) => {\n task.addTask(config, cancel)\n })\n return config\n },\n onRejected(error: AxiosError) {\n return Promise.reject(error)\n }\n}\n\nexport const cancelResponseInterceptor: InterceptorUse<AxiosResponse, AxiosError> = {\n onFulfilled: function(response: AxiosResponse) {\n // @ts-ignore\n if (response.config.cacheEnable === false) {\n return response\n }\n if (response.config.method === 'get' && Object.keys(response.data as Record<string, any>).length > 0) {\n task.addCache(response.config, response.data)\n }\n return response\n },\n onRejected(error: AxiosError) {\n return Promise.reject(error)\n }\n}\n","import { Router } from 'vue-router'\nimport NProgress from 'nprogress'\nimport 'nprogress/nprogress.css'\nimport { pinia, useUserStore } from '../../store'\n\nNProgress.configure({ showSpinner: false })\n\nexport default function(router: Router) {\n router.beforeEach((to, from, next) => {\n NProgress.start()\n to.preHash = location.hash.replace('#', '')\n next()\n })\n router.afterEach((to) => {\n const user = useUserStore(pinia)\n if (to.matched.length > 0) {\n user.updateState({\n key: 'path',\n value: to.matched[to.matched.length - 1].path.replace('(\\\\d+)', '')\n })\n }\n NProgress.done()\n })\n}\n","import { pinia, useUserStore, useSettingsStore } from '../../store'\n\nexport function isLodeRemoteRoutes(): boolean {\n return useUserStore(pinia).isLodeRemoteRoutes\n}\n\nexport function getWhiteRoutes(): Array<string | RegExp> {\n return useSettingsStore(pinia).whiteRoutes || []\n}\n\nexport function getToken() {\n return useUserStore(pinia).token\n}\n","import { NavigationGuardNext } from 'vue-router'\nimport type { LoginTicket } from '@/types'\n\nexport type SsoType = 'jump' | 'qrcode'\n\nexport interface Sso {\n flag(): LoginTicket | undefined,\n\n type: SsoType,\n\n jumpToLoginPage(next: NavigationGuardNext, path: string): void,\n\n showQrCode(): void\n\n qrCodeUrl?: string,\n appid?: string,\n style?: string,\n redirectUri?: string,\n elId?: string\n}\n\nexport class BaseSso implements Sso {\n type: SsoType = 'qrcode'\n\n flag(): LoginTicket | undefined {\n return undefined\n }\n\n jumpToLoginPage(next: NavigationGuardNext, path: string): void {\n next(path)\n }\n\n showQrCode(): void {\n }\n}\n","import { NavigationGuardNext } from 'vue-router'\nimport { BaseSso, SsoType } from './index'\nimport { getQueryParam } from '@okiss/utils'\nimport type { LoginTicket } from '@/types'\n\nexport class Github extends BaseSso {\n type: SsoType = 'jump'\n\n client_id: string = ''\n\n constructor(options: Record<string, any>) {\n super()\n this.client_id = options.client_id\n }\n\n flag(): LoginTicket | undefined {\n const code = getQueryParam('code')\n if (code) {\n return {\n ticket: code,\n key: 'github'\n }\n }\n return undefined\n }\n\n jumpToLoginPage(next: NavigationGuardNext, path: string) {\n const redirect = encodeURIComponent(location.href)\n location.replace(`https://github.com/login/oauth/authorize?client_id=${this.client_id}&redirect_uri${redirect}`)\n }\n}\n","import { getQueryParam, obj2Param, strVarReplace, createIFrame } from '@okiss/utils'\nimport { BaseSso, SsoType } from './index'\nimport type { LoginTicket } from '@/types'\n\nexport class DingTalk extends BaseSso {\n type: SsoType = 'qrcode'\n qrCodeUrl = 'https://login.dingtalk.com/login/qrcode.htm?goto={goto}&style={style}'\n reloadUrl = 'https://oapi.dingtalk.com/connect/oauth2/sns_authorize?response_type=code&scope=snsapi_login&state=&appid={appid}&redirect_uri={redirect_uri}'\n\n elId: string = ''\n appid: string = ''\n iframe: HTMLIFrameElement = new HTMLIFrameElement()\n redirectUri: string = ''\n style: string = ''\n\n constructor(options: Record<string, any>) {\n super()\n }\n\n flag(): LoginTicket | undefined {\n const code = getQueryParam('code')\n if (code) {\n return {\n ticket: code,\n key: 'dingtalk'\n }\n }\n return undefined\n }\n\n showQrCode(): void {\n const getReloadUrl = (extra?: Record<string, any>) => {\n const data = {\n appid: this.appid,\n redirect_uri: encodeURIComponent(this.redirectUri)\n }\n return strVarReplace(this.reloadUrl, data) + '&' + obj2Param(extra || {})\n }\n const getQrCodeUrl = () => {\n const data = {\n goto: encodeURIComponent(getReloadUrl()),\n style: encodeURIComponent(this.style)\n }\n return strVarReplace(this.qrCodeUrl, data)\n }\n const onScanSuccess = (event: any) => {\n const { origin, data } = event\n if (origin === 'https://login.dingtalk.com') {\n window.location.href = getReloadUrl({ loginTmpCode: data })\n }\n }\n\n this.iframe.src = getQrCodeUrl()\n createIFrame({ elId: this.elId, attrs: this.iframe })\n if (typeof window.addEventListener !== 'undefined') {\n window.addEventListener(\n 'message',\n event => onScanSuccess(event),\n false\n )\n // @ts-ignore\n } else if (typeof window.attachEvent !== 'undefined') {\n // @ts-ignore\n window.attachEvent('onmessage', event => this.onScanSuccess(event))\n }\n }\n}\n","import { BaseSso } from './base'\nimport type { SsoType, Sso } from './base'\nimport { Github } from './github'\nimport { DingTalk } from './dingtalk'\nimport { pinia, useSettingsStore } from '../../store'\nimport { newSso } from '../../types'\nimport { merge } from 'lodash'\n\nexport { BaseSso, SsoType, Sso, Github, DingTalk }\n\nconst defaultSso: Record<string, newSso> = {}\n\nexport function allSso(): Record<string, newSso> {\n return merge(useSettingsStore(pinia).sso || {}, defaultSso)\n}\n\nexport default function(): Sso | undefined {\n const sso = allSso()\n const key = useSettingsStore(pinia).activeSsoKey || ''\n console.log(sso, key)\n const active = sso[key]\n if (active !== undefined) {\n return active()\n }\n return undefined\n}\n","import { Router } from 'vue-router'\nimport { pinia, useUserStore } from '../../store'\nimport { getToken, getWhiteRoutes } from './func'\nimport sso from '../../utils/sso'\nimport { isObject } from 'lodash'\n\nexport default function(router: Router) {\n router.beforeEach(async(to, form, next) => {\n if (getWhiteRoutes().indexOf(to.path) !== -1) {\n next()\n return\n }\n\n const token = getToken()\n if (token) {\n if (to.query?.redirect) {\n next(to.query?.redirect as string)\n } else {\n next()\n }\n return\n }\n const redirect = to.query.redirect || to.path\n\n const s = sso()\n if (!s) {\n next(`/login?redirect=${redirect}`)\n return\n }\n\n const flag = s.flag()\n const user = useUserStore(pinia)\n if (flag && await user.login(isObject(flag) ? flag : { ticket: flag })) {\n next()\n return\n }\n s.jumpToLoginPage(next, `/login?redirect=${redirect}`)\n })\n}\n","import type { AxiosRequestConfig } from 'axios'\nimport type { RouteRecordRaw, Router } from 'vue-router'\nimport { Component, Directive, Plugin } from 'vue'\nimport { MockApi } from './mock/types'\nimport { Sso } from './utils/sso'\n\nexport interface Nav {\n}\n\nexport type newSso = () => Sso\n\nexport interface Settings {\n title?: string,\n fixedHeader?: boolean,\n sidebarLogo?: boolean,\n logo?: string,\n closeNavNotice?: boolean,\n navBarNotice?: string,\n hasNewMessage?: boolean,\n showPageJsonSchema?: boolean,\n loginTips?: string,\n sso?: Record<string, newSso>,\n activeSsoKey?: string,\n ElementPlus?: Object,\n nav?: Nav[],\n whiteRoutes?: Array<string | RegExp>,\n tokenExpire?: number,\n defaultAvatar?: string,\n envColor?: Record<string, string>,\n serviceOffLineNotice?: string,\n formMutex?: boolean\n captcha?: boolean\n themeMode?: 'light' | 'dark'\n}\n\nexport type UsePlugin = Plugin | [Plugin, any]\n\nexport interface OmsPlugin {\n use?: UsePlugin[],\n components?: Record<string, Component>,\n directives?: Record<string, Directive>,\n mockApis?: MockApi[],\n routes?: RouteRecordRaw[],\n // Pinia does not support dynamic registration like Vuex modules;\n // this field is deprecated and ignored in Pinia migration.\n // Kept for backward compatibility with type 'any'.\n storeModules?: Record<string, any>\n}\n\nexport interface OmsOptions {\n axios?: AxiosRequestConfig,\n settings?: Settings,\n plugins?: OmsPlugin[],\n mock?: boolean,\n form?: FormOptions,\n router?: Router\n}\n\nexport interface FormOptions {\n vsPath: string\n}\n\nexport interface LoginForm {\n username: string,\n password: string\n}\n\nexport interface LoginTicket {\n ticket: string,\n key: string\n}\n\nexport type ResourceIds = Array<Array<string>>\n\nexport interface UserInfo {\n id: number,\n name: string,\n token: string,\n avatar: string,\n nickname: string,\n role_ids: Array<string>,\n resource: ResourceIds\n env: string,\n website?: any\n}\n\nexport type Resource = Record<string, boolean | Record<string, boolean>>\n\n// eslint-disable-next-line no-unused-vars\nexport enum PageType { custom, list, form, customSchema, localComp, tree, report, entity }\n// eslint-disable-next-line no-unused-vars\nexport enum MenuType { hidden = 0, dir = 1, menu = 2, page = 3 }\n\nexport interface PageInfo {\n module_id: number,\n module_name?: string\n id: number,\n pid: number,\n name: string,\n path: string,\n icon?: string,\n view?: string,\n is_show: number,\n type: number,\n page_type: PageType,\n role?: string,\n children?: PageInfo[],\n code: string\n}\n\nexport interface RemoteModule {\n id: number,\n label: string,\n routes: PageInfo[]\n}\n\nexport interface OmsModule {\n id: number,\n label: string,\n routes: RouteRecordRaw[]\n}\n\nexport interface ImportMetaEnv {\n VITE_BASE_API?: string\n VITE_BASE?: string\n}\n","<template>\n <div class=\"loading preloader\">\n <div class=\"preloader-inner\" />\n </div>\n</template>\n<style>\n.loading {\n width: 100%;\n min-height: calc(100vh - 50px);\n text-align: center;\n line-height: calc(100vh - 50px);\n}\n</style>\n","<template>\n <div>\n <el-alert\n v-if=\"hasNotice\"\n v-bind=\"noticeProps\"\n />\n </div>\n</template>\n\n<script>\nexport default {\n name: 'VNotice',\n props: {\n dataApi: {\n type: String,\n default: ''\n },\n notice: {\n type: Object,\n default: () => {}\n }\n },\n data() {\n return {\n noticeProps: {},\n hasNotice: false\n }\n },\n mounted() {\n console.log('dataApi', !!this.$props.dataApi)\n if (this.$props.dataApi) {\n this.$http.get(this.$props.dataApi).then(({ data }) => {\n this.noticeProps = data\n this.hasNotice = !!data\n })\n return\n } else {\n this.hasNotice = Object.keys(this.$props.notice).length > 0\n this.noticeProps = this.$props.notice\n }\n }\n}\n</script>\n","<template>\n <el-alert\n v-if=\"owners.length > 0\"\n :title=\"`该页面功能对应开发: [ ${owners.join(', ')} ] 有问题可直接企微反馈`\"\n type=\"info\"\n style=\"margin: 0 0 20px 0\"\n :closable=\"false\"\n />\n <template v-if=\"env === 'prod' && serviceOffLine\">\n <div\n class=\"offline-notice\"\n v-html=\"serviceOffLine === true ? setting.serviceOffLineNotice : serviceOffLine\"\n />\n </template>\n <template v-else>\n <VNotice\n v-if=\"haveNotice\"\n :notice=\"notice\"\n style=\"margin: 0 0 20px 0\"\n :data-api=\"noticeApi\"\n />\n <VLoading v-if=\"loading\" />\n <template v-else>\n <slot v-bind=\"schema\" />\n </template>\n </template>\n\n</template>\n<script lang=\"ts\" setup>\nimport VLoading from './VLoading.vue'\nimport { isObject, isString, isArray } from '@okiss/utils'\nimport VNotice from './notice/VNotice.vue'\nimport { useAppStore, useSettingsStore, useUserStore } from '../store'\nimport { useRoute } from 'vue-router'\n\nconst props = withDefaults(defineProps<{ schemaHandler?: (val: any, project: string) => any, schemaApi?: string }>(), {\n schemaHandler: (val: any) => val,\n schemaApi: ''\n})\nconst appStore = useAppStore(); const settingsStore = useSettingsStore(); const userStore = useUserStore()\nconst route = useRoute()\nconst loading = ref(true)\nconst haveNotice = ref(false)\nconst notice = ref<any>({})\nconst noticeApi = ref('')\nconst schema = ref<any>({})\nconst owners = ref<string[]>([])\nconst serviceOffLine = ref<boolean | string>(false)\nconst requestId = ref(0)\n\nconst env = computed(() => userStore.env)\nconst setting = computed(() => settingsStore)\n\nfunction resetState() {\n loading.value = true\n haveNotice.value = false\n notice.value = {}\n noticeApi.value = ''\n schema.value = {}\n owners.value = []\n serviceOffLine.value = false\n}\n\nfunction loadSchema() {\n const currentRequestId = ++requestId.value\n resetState()\n const token = route.path.split('/').filter(item => item)\n const project = token.length > 1 ? token.slice(0, token.length - 1).join('/') : token[0]\n const api = '/schema' + (route.meta as any).path\n const conf = { params: route.params }\n // @ts-ignore\n const http = window?.App?.config?.globalProperties?.$http\n http.get(props.schemaApi || api, conf).then(({ data }) => {\n if (currentRequestId !== requestId.value) {\n return\n }\n loading.value = false\n if (isObject(data)) {\n if (data.notice !== undefined) {\n haveNotice.value = true\n if (isString(data.notice)) {\n notice.value = { title: data.notice }\n } else if (isObject(data.notice)) {\n notice.value = data.notice\n // @ts-ignore\n noticeApi.value = data.notice.noticeApi\n }\n delete data['notice']\n }\n owners.value = data.ownerNames || []\n serviceOffLine.value = data.serviceOffLine || false\n }\n schema.value = props.schemaHandler(data, project)\n appStore.SET_PAGE_JSON_SCHEMA({ page: route.path, json: schema.value })\n })\n}\n\nwatch(\n () => [route.fullPath, (route.meta as any)?.path, props.schemaApi],\n () => {\n loadSchema()\n },\n { immediate: true }\n)\n</script>\n\n<style lang=\"scss\" scoped>\n.offline-notice {\n text-align: center;\n color: red;\n font-size: 250%;\n height: 300px;\n line-height: 300px;\n}\n</style>\n","<template>\n <el-alert\n v-if=\"owners.length > 0\"\n :title=\"`该页面功能对应开发: [ ${owners.join(', ')} ] 有问题可直接企微反馈`\"\n type=\"info\"\n style=\"margin: 0 0 20px 0\"\n :closable=\"false\"\n />\n <template v-if=\"env === 'prod' && serviceOffLine\">\n <div\n class=\"offline-notice\"\n v-html=\"serviceOffLine === true ? setting.serviceOffLineNotice : serviceOffLine\"\n />\n </template>\n <template v-else>\n <VNotice\n v-if=\"haveNotice\"\n :notice=\"notice\"\n style=\"margin: 0 0 20px 0\"\n :data-api=\"noticeApi\"\n />\n <VLoading v-if=\"loading\" />\n <template v-else>\n <slot v-bind=\"schema\" />\n </template>\n </template>\n\n</template>\n<script lang=\"ts\" setup>\nimport VLoading from './VLoading.vue'\nimport { isObject, isString, isArray } from '@okiss/utils'\nimport VNotice from './notice/VNotice.vue'\nimport { useAppStore, useSettingsStore, useUserStore } from '../store'\nimport { useRoute } from 'vue-router'\n\nconst props = withDefaults(defineProps<{ schemaHandler?: (val: any, project: string) => any, schemaApi?: string }>(), {\n schemaHandler: (val: any) => val,\n schemaApi: ''\n})\nconst appStore = useAppStore(); const settingsStore = useSettingsStore(); const userStore = useUserStore()\nconst route = useRoute()\nconst loading = ref(true)\nconst haveNotice = ref(false)\nconst notice = ref<any>({})\nconst noticeApi = ref('')\nconst schema = ref<any>({})\nconst owners = ref<string[]>([])\nconst serviceOffLine = ref<boolean | string>(false)\nconst requestId = ref(0)\n\nconst env = computed(() => userStore.env)\nconst setting = computed(() => settingsStore)\n\nfunction resetState() {\n loading.value = true\n haveNotice.value = false\n notice.value = {}\n noticeApi.value = ''\n schema.value = {}\n owners.value = []\n serviceOffLine.value = false\n}\n\nfunction loadSchema() {\n const currentRequestId = ++requestId.value\n resetState()\n const token = route.path.split('/').filter(item => item)\n const project = token.length > 1 ? token.slice(0, token.length - 1).join('/') : token[0]\n const api = '/schema' + (route.meta as any).path\n const conf = { params: route.params }\n // @ts-ignore\n const http = window?.App?.config?.globalProperties?.$http\n http.get(props.schemaApi || api, conf).then(({ data }) => {\n if (currentRequestId !== requestId.value) {\n return\n }\n loading.value = false\n if (isObject(data)) {\n if (data.notice !== undefined) {\n haveNotice.value = true\n if (isString(data.notice)) {\n notice.value = { title: data.notice }\n } else if (isObject(data.notice)) {\n notice.value = data.notice\n // @ts-ignore\n noticeApi.value = data.notice.noticeApi\n }\n delete data['notice']\n }\n owners.value = data.ownerNames || []\n serviceOffLine.value = data.serviceOffLine || false\n }\n schema.value = props.schemaHandler(data, project)\n appStore.SET_PAGE_JSON_SCHEMA({ page: route.path, json: schema.value })\n })\n}\n\nwatch(\n () => [route.fullPath, (route.meta as any)?.path, props.schemaApi],\n () => {\n loadSchema()\n },\n { immediate: true }\n)\n</script>\n\n<style lang=\"scss\" scoped>\n.offline-notice {\n text-align: center;\n color: red;\n font-size: 250%;\n height: 300px;\n line-height: 300px;\n}\n</style>\n","<template>\n <PageLoad :schema-handler=\"schemaHandler\">\n <template #default=\"slotProps\">\n <VTable v-bind=\"slotProps\" />\n </template>\n </PageLoad>\n</template>\n<script setup name=\"ScaffoldName\">\nimport { VTable } from '@okiss/vbtf'\nimport PageLoad from '../components/PageLoad.vue'\nimport { merge } from 'lodash'\n\nconst schemaHandler = (schema, project) => {\n if (schema.orderBy) {\n const defaultSort = {\n prop: schema.orderBy.field,\n order: schema.orderBy.mod === 'desc' ? 'descending' : 'ascending'\n }\n schema.tableProps = merge(schema.tableProps, { defaultSort })\n }\n const allowedProps = Object.keys(VTable.props)\n Object.keys(schema).forEach(key => {\n if (allowedProps.indexOf(key) === -1) {\n delete schema[key]\n }\n })\n if (schema.listApi === undefined) {\n schema.listApi = `/${project}/list`\n }\n\n return schema\n}\n</script>\n","<template>\n <PageLoad :schema-handler=\"schemaHandler\">\n <template #default=\"slotProps\">\n <VForm v-bind=\"slotProps\" />\n </template>\n </PageLoad>\n</template>\n<script setup name=\"ScaffoldForm\">\nimport { VForm } from '@okiss/vbtf'\nimport PageLoad from '../components/PageLoad.vue'\nimport { strVarReplace } from '@okiss/utils'\nimport { merge } from 'lodash'\nimport { useRoute, useRouter } from 'vue-router'\nimport { onMounted, onUnmounted } from 'vue'\nimport http from '../utils/request'\nimport { ElMessageBox } from 'element-plus'\nimport { useSettingsStore } from '../store'\n\nconst route = useRoute()\nconst router = useRouter()\n\nconst schemaHandler = (schema, project) => {\n const allowedProps = Object.keys(VForm.props)\n Object.keys(schema).forEach(key => {\n if (allowedProps.indexOf(key) === -1) {\n delete schema[key]\n return\n }\n\n if (/.*Api$/.test(key)) {\n schema[key] = strVarReplace(schema[key], route.params)\n }\n })\n\n if (schema.saveApi === undefined) {\n if (route.params.id !== undefined) {\n schema.saveApi = `/${project}/update/${route.params.id}`\n if (!schema.getApi) {\n schema.getApi = `/${project}/get/${route.params.id}`\n }\n } else {\n delete schema['getApi']\n schema.saveApi = `/${project}/create`\n }\n }\n\n schema = merge({\n saveApi: project + '/save',\n afterSubmit: 'goback',\n afterReset: 'goback',\n mod: route.params.id ? 'edit' : 'create'\n }, schema)\n\n return schema\n}\n\nconst mutexId = ref(0)\nconst mutex = () => {\n http.request({\n url: '/form_mutex',\n method: 'get',\n params: {\n path: route.fullPath\n }\n }).then(res => {\n console.log(res)\n if (res.data) {\n clearInterval(mutexId.value)\n ElMessageBox.alert(`${res.data}`, '操作提醒', {\n showClose: false,\n showCancelButton: true,\n confirmButtonText: '返回',\n cancelButtonText: '刷新',\n callback: (action) => {\n if (action === 'cancel') {\n location.reload()\n } else {\n goBack()\n }\n }\n })\n }\n })\n}\n\nonMounted(() => {\n const settings = useSettingsStore()\n if (route.params.id !== undefined && settings.formMutex) {\n mutex()\n mutexId.value = setInterval(mutex, 2000)\n }\n})\nonUnmounted(() => {\n clearInterval(mutexId.value)\n})\n\nfunction goBack() {\n if (route.query?.goback) {\n router.push(route.query?.goback)\n } else {\n history.state.back && history.back()\n }\n}\n</script>\n","<template>\n <el-row\n class=\"tree-box\"\n :gutter=\"20\"\n >\n <el-col\n :span=\"8\"\n class=\"tree-tree\"\n >\n <el-card shadow=\"never\">\n <template #header>\n <div class=\"card-header\">\n <span>列表</span>\n <el-button\n type=\"text\"\n @click=\"() => appendNew()\"\n >添加</el-button>\n </div>\n </template>\n <el-tree\n v-if=\"(treeData || []).length > 0\"\n style=\"height: 100vh\"\n :data=\"treeData\"\n node-key=\"id\"\n v-bind=\"localTreeProps\"\n draggable\n :allow-drag=\"allowDrap\"\n :allow-drop=\"allowDrop\"\n @node-drag-end=\"handleDragEnd\"\n >\n <template #default=\"{ node, data }\">\n <span class=\"tree-action\">\n <span v-if=\"data[localTreeProps.props.label]\">{{ data[localTreeProps.props.label] }}</span>\n <span\n v-else\n style=\"color: #E6A23C\"\n >请在右侧表单中修改 --> </span>\n <span>\n <el-button\n v-if=\"data[localTreeProps.props.label]\"\n class=\"button\"\n type=\"text\"\n @click=\"() => onclick(data)\"\n >编辑</el-button>\n <el-button\n v-if=\"canAppend(data, node)\"\n class=\"button\"\n type=\"text\"\n @click=\"() => append(data, node)\"\n >添加</el-button>\n <el-button\n v-if=\"data.children === undefined || data.children.length === 0\"\n class=\"button\"\n type=\"text\"\n @click=\"() => remove(data)\"\n >删除</el-button>\n </span>\n </span>\n </template>\n </el-tree>\n </el-card>\n </el-col>\n <el-col\n :span=\"16\"\n class=\"tree-form\"\n >\n <el-card\n v-if=\"type\"\n shadow=\"never\"\n >\n <template #header>\n <div class=\"card-header\">\n <span>{{ formType }}</span>\n </div>\n </template>\n <v-form\n :key=\"formkey\"\n v-model=\"formData\"\n v-bind=\"formProps\"\n @submit=\"submit\"\n />\n </el-card>\n </el-col>\n </el-row>\n</template>\n<script lang=\"js\">\nimport { VForm } from '@okiss/vbtf'\nimport { strVarReplace, effectDataTrans } from '@okiss/utils'\nimport { merge } from 'lodash'\n\nexport default defineComponent({\n name: 'VTree',\n components: {\n VForm\n },\n props: {\n treeApi: {\n type: String,\n default: '',\n require: true\n },\n getApi: {\n type: String,\n default: '',\n require: true\n },\n saveApi: {\n type: String,\n default: '',\n require: true\n },\n createApi: {\n type: String,\n default: '',\n require: true\n },\n deleteApi: {\n type: String,\n default: '',\n require: true\n },\n formItems: {\n type: Array,\n default: () => {\n return []\n }\n },\n treeProps: {\n type: Object,\n default: () => {}\n },\n maxDepth: {\n type: Number,\n default: 3\n },\n props: {\n type: Object,\n default: () => {}\n }\n },\n data() {\n return {\n type: 0, // 1 新增, 2 编辑\n treeData: [],\n formData: {},\n localTreeProps: merge({\n 'default-expand-all': true,\n 'expand-on-click-node': false,\n props: {\n children: 'children',\n label: 'label'\n }\n }, this.$props.treeProps),\n formkey: 0,\n tablekey: 0,\n menuOptions: {}\n }\n },\n computed: {\n formType() {\n const m = ['', '新建', '编辑']\n return m[this.type]\n },\n formProps() {\n let saveApi = strVarReplace(this.$props.saveApi, this.formData)\n if (this.type === 1) {\n saveApi = this.$props.createApi\n }\n return {\n saveApi: saveApi,\n getApi: this.$props.getApi,\n formItems: this.$props.formItems\n }\n }\n },\n created() {\n this.loadTree()\n },\n methods: {\n loadTree() {\n this.$http.request({\n method: 'GET',\n url: this.$props.treeApi\n }).then(({ data }) => {\n this.treeData = data\n })\n },\n onclick(data) {\n this.type = 2\n this.formData = data\n this.formkey++\n },\n append(data, node) {\n this.type = 1\n\n const newChild = { pid: data.id, [this.$props.props?.levelKey ?? 'level']: node.level + 1, ...effectDataTrans(this.$props.props?.effectData, data) }\n console.log(111, newChild)\n if (!data.children) {\n data.children = []\n }\n this.formData = newChild\n this.formkey++\n data.children.push(newChild)\n this.treeData = [...this.treeData]\n },\n canAppend(data, node) {\n if (!data[this.localTreeProps.props.label]) {\n return false\n }\n return node.level < this.$props.maxDepth\n },\n appendNew() {\n this.type = 1\n const newChild = { pid: 0, [this.$props.props?.levelKey ?? 'level']: 1 }\n this.formData = newChild\n this.formkey++\n this.tablekey++\n this.treeData = [...this.treeData, newChild]\n },\n remove(data) {\n this.$http.request({\n method: 'DELETE',\n url: strVarReplace(this.$props.deleteApi, data)\n }).then(({ code }) => {\n if (code !== 0) {\n this.$message.error('操作失败')\n } else {\n this.loadTree()\n }\n })\n },\n submit() {\n setTimeout(() => {\n this.loadTree()\n this.formData = {}\n this.tablekey++\n this.type = 0\n }, 200)\n },\n allowDrap(draggingNode) {\n return true\n },\n allowDrop(draggingNode, dropNode, type) {\n console.log(type)\n return type === 'inner'\n },\n handleDragEnd(draggingNode, dropNode, dropType, ev) {\n const form = draggingNode.data\n form.pid = dropNode.data.id\n this.$http.request({\n method: 'POST',\n url: strVarReplace(this.$props.saveApi, form),\n data: form\n }).then(({ code }) => {\n if (code !== 0) {\n this.$message.error('操作失败')\n }\n })\n }\n }\n})\n</script>\n<style lang=\"scss\">\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.tree-box {\n height: 100%;\n}\n.tree-tree .tree-form {\n height: 100%;\n}\n.tree-action {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n padding-right: 8px;\n}\n\n</style>\n","<template>\n <PageLoad :schema-handler=\"schemaHandler\">\n <template #default=\"slotProps\">\n <VTree v-bind=\"slotProps\" />\n </template>\n </PageLoad>\n</template>\n<script setup>\nimport VTree from '../components/VTree.vue'\nimport PageLoad from '../components/PageLoad.vue'\nconst schemaHandler = (schema, project) => {\n const allowedProps = Object.keys(VTree.props)\n Object.keys(schema).forEach(key => {\n if (allowedProps.indexOf(key) === -1) {\n delete schema[key]\n }\n })\n\n return schema\n}\n</script>\n","<template>\n <router-view />\n</template>\n<script setup>\nimport { onBeforeRouteUpdate } from 'vue-router'\nconst key = ref(0)\nonBeforeRouteUpdate(() => {\n key.value++\n})\n</script>\n","// @ts-nocheck\nimport { cloneDeep, merge } from 'lodash'\nimport { isObject, isString } from '@okiss/utils'\n\nconst pie = {\n title: {\n text: 'Referer of a Website',\n left: 'center'\n },\n tooltip: {\n trigger: 'item',\n formatter: '{b} : {c} ({d}%)'\n },\n legend: {\n orient: 'vertical',\n left: 'bottom'\n },\n series: [\n {\n name: 'Access From',\n type: 'pie',\n radius: '50%',\n data: [\n { value: 1048, name: 'Search Engine' },\n { value: 735, name: 'Direct' },\n { value: 580, name: 'Email' },\n { value: 484, name: 'Union Ads' },\n { value: 300, name: 'Video Ads' }\n ],\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)'\n }\n }\n }\n ]\n}\n\nconst lienOption = {\n title: {\n text: ''\n },\n tooltip: {\n trigger: 'axis'\n },\n grid: {\n left: '2%',\n right: '2%',\n bottom: '5%',\n containLabel: true\n },\n toolbox: {\n feature: {\n saveAsImage: {}\n }\n },\n legend: {\n data: []\n },\n xAxis: {\n type: 'category'\n },\n yAxis: {\n type: 'value'\n },\n series: []\n}\n\nexport function makeOption(id: string, config: Object|string, data: Array<Record<string, any>>) {\n if (data.length === 0) {\n return {}\n }\n let opt = merge({}, lienOption)\n opt.title.text = id\n if (isString(config)) {\n const xAxisData = []\n const keys = Object.keys(data[0])\n let xkey = keys[0]\n let ykeys = keys.filter((v, i) => i > 0)\n let type = config\n if (config.indexOf(':') > -1) {\n const token = config.split(':')\n const _keys = token[1].split(',')\n type = token[0]\n xkey = _keys[0]\n ykeys = _keys.filter((v, i) => i > 0)\n }\n ykeys.forEach(key => {\n const seriesData = []\n data.forEach(each => {\n seriesData.push(each[key])\n })\n opt.series.push({\n name: key,\n type: type,\n smooth: true,\n data: seriesData\n })\n opt.legend.data.push(key)\n })\n\n data.forEach(each => {\n xAxisData.push(each[xkey])\n })\n\n opt.xAxis.data = xAxisData\n }\n\n if (isObject(config)) {\n opt = merge(opt, config)\n }\n // const _pie = cloneDeep(pie)\n // _pie.title.text = id\n // _pie.series[0].data = data\n //\n // return _pie\n console.log(111, opt)\n return opt\n}\n","<template>\n <span\n v-for=\"(each, i) in dataList\"\n :key=\"i\"\n >\n <div class=\"number-panel-title\">\n <div\n v-for=\"(item, index) in Object.keys(each)\"\n :key=\"index\"\n class=\"title-inner\"\n >\n <p class=\"number\">{{ each[item] }}</p>\n <p class=\"name\">{{ item }}</p>\n </div>\n </div>\n </span>\n</template>\n\n<script>\nexport default defineComponent({\n name: 'NumberPanel',\n props: {\n dataList: {\n type: Array,\n default: _ => []\n }\n },\n data() {\n return {\n }\n }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.number-panel-title {\n padding: 20px;\n text-align: center;\n .title-inner {\n display: inline-block;\n width: 20%;\n position: relative;\n text-align: center;\n border-right: 1px solid #e8e8e8;\n &:last-child {\n border: none;\n }\n }\n .el-divider {\n position: absolute;\n right: 0;\n top: 10px;\n }\n .name {\n font-size: 12px;\n color: #666;\n }\n .number {\n font-size: 20px;\n line-height: 30px;\n }\n}\n</style>\n","<template>\n <ElCard\n v-resize=\"true\"\n shadow=\"never\"\n class=\"part\"\n >\n <component\n :is=\"comptype()\"\n v-bind=\"compprops(option)\"\n />\n </ElCard>\n</template>\n<script lang=\"ts\">\nimport { makeOption } from './option'\nimport { VTable, VChart, JsonView } from '@okiss/vbtf'\nimport NumberPanel from './NumberPanel.vue'\n// @ts-ignore\nimport Markdown from 'vue3-markdown-it'\nimport { isArray } from '@okiss/utils'\n\nexport default {\n components: {\n Chart: VChart,\n Md: Markdown,\n Json: JsonView,\n Table: VTable,\n Number: NumberPanel,\n Html: ''\n },\n props: {\n option: {\n type: Object,\n default: () => {}\n }\n },\n setup(props: Record<string, any>) {\n const comptype = () => {\n if (props.option.chart === 'num') {\n return 'number'\n }\n return props.option.type\n }\n const compprops = (item: Record<string, any>) => {\n const type = comptype()\n if (type === 'number') {\n return {\n dataList: item.data\n }\n }\n if (type === 'chart') {\n return {\n options: makeOption(item.id, item.chart, item.data)\n }\n }\n if (type === 'md') {\n return {\n source: item.data\n }\n }\n\n if (type === 'table') {\n if (!isArray(item.data)) {\n return { showPagination: false }\n }\n const headers: { field: string; label: string }[] = []\n item.data[0] && Object.keys(item.data[0]).forEach((key, index) => {\n headers.push({ field: key, label: key })\n })\n return {\n headers: headers,\n list: item.data,\n showPagination: false\n }\n }\n return {}\n }\n\n return {\n compprops,\n comptype\n }\n }\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.part {\n //height: 350px;\n width: auto;\n margin-bottom: 15px;\n :last-child {\n margin-bottom: 0;\n }\n}\n::v-deep(.el-card__header) {\n padding: 5px;\n}\n::v-deep(.el-card__body) {\n padding: 5px;\n}\n</style>\n","<template>\n <ElCard\n v-resize=\"true\"\n shadow=\"never\"\n class=\"part\"\n >\n <component\n :is=\"comptype()\"\n v-bind=\"compprops(option)\"\n />\n </ElCard>\n</template>\n<script lang=\"ts\">\nimport { makeOption } from './option'\nimport { VTable, VChart, JsonView } from '@okiss/vbtf'\nimport NumberPanel from './NumberPanel.vue'\n// @ts-ignore\nimport Markdown from 'vue3-markdown-it'\nimport { isArray } from '@okiss/utils'\n\nexport default {\n components: {\n Chart: VChart,\n Md: Markdown,\n Json: JsonView,\n Table: VTable,\n Number: NumberPanel,\n Html: ''\n },\n props: {\n option: {\n type: Object,\n default: () => {}\n }\n },\n setup(props: Record<string, any>) {\n const comptype = () => {\n if (props.option.chart === 'num') {\n return 'number'\n }\n return props.option.type\n }\n const compprops = (item: Record<string, any>) => {\n const type = comptype()\n if (type === 'number') {\n return {\n dataList: item.data\n }\n }\n if (type === 'chart') {\n return {\n options: makeOption(item.id, item.chart, item.data)\n }\n }\n if (type === 'md') {\n return {\n source: item.data\n }\n }\n\n if (type === 'table') {\n if (!isArray(item.data)) {\n return { showPagination: false }\n }\n const headers: { field: string; label: string }[] = []\n item.data[0] && Object.keys(item.data[0]).forEach((key, index) => {\n headers.push({ field: key, label: key })\n })\n return {\n headers: headers,\n list: item.data,\n showPagination: false\n }\n }\n return {}\n }\n\n return {\n compprops,\n comptype\n }\n }\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.part {\n //height: 350px;\n width: auto;\n margin-bottom: 15px;\n :last-child {\n margin-bottom: 0;\n }\n}\n::v-deep(.el-card__header) {\n padding: 5px;\n}\n::v-deep(.el-card__body) {\n padding: 5px;\n}\n</style>\n","<template>\n <el-row>\n <el-col\n v-if=\"_filter.length > 0\"\n :span=\"24\"\n >\n <ElCard\n shadow=\"never\"\n class=\"part-filter\"\n >\n <VForm\n v-model=\"formData\"\n :form-items=\"_filter\"\n :options=\"formOptions\"\n @submit=\"onsubmit\"\n />\n </ElCard>\n </el-col>\n <el-col :span=\"24\">\n <el-row :gutter=\"20\">\n <el-col\n v-for=\"(item,index) in _dataPart\"\n :key=\"index\"\n :span=\"item.col || 24\"\n >\n <Part\n v-if=\"!item.errMsg\"\n :key=\"key\"\n :option=\"item\"\n />\n <el-alert\n v-else\n :title=\"item.id+' 片段执行出错'\"\n type=\"error\"\n >{{ item.errMsg }}</el-alert>\n </el-col>\n </el-row>\n </el-col>\n </el-row>\n</template>\n<script lang=\"ts\" setup>\nimport { VForm } from '@okiss/vbtf'\nimport Part from './part.vue'\n// import store from '../../store'\nimport http from '../../utils/request'\nimport { useRoute } from 'vue-router'\n\nconst route = useRoute()\n\nonMounted(() => {\n // store.dispatch('app/toggleSideBar')\n})\n\nconst props = defineProps({\n filter: {\n type: Array,\n default: () => []\n },\n dataPart: {\n type: Array,\n default: () => []\n }\n})\n\nconst formData = ref<Record<string, any>>({})\nonBeforeMount(() => {\n props.filter?.forEach((item: any) => {\n if (item.default !== null) {\n formData.value[item.field] = item.default\n }\n })\n})\nconst formOptions = {\n inline: true,\n labelPosition: 'right',\n labelWidth: 'auto',\n submitButton: {\n text: '查询'\n },\n cancelButton: {\n text: '重置'\n }\n}\nconst key = ref(1)\nconst _filter = ref(props.filter)\nconst _dataPart = ref(props.dataPart)\n\nconst schemaapi = computed(() => {\n let id = route.params.id\n if (!id) {\n const token = route.path.split('/')\n id = token[token.length - 1]\n }\n return '/focusbi_report/view/' + id\n})\n\nconst onsubmit = (data: any) => {\n http.get(schemaapi.value, { params: data }).then(({ data }) => {\n _filter.value = data.filter\n _dataPart.value = data.dataPart\n key.value++\n })\n}\n</script>\n\n<style lang=\"scss\">\n.part-filter {\n margin-bottom: 15px;\n}\n\n</style>\n","<template>\n <el-row>\n <el-col\n v-if=\"_filter.length > 0\"\n :span=\"24\"\n >\n <ElCard\n shadow=\"never\"\n class=\"part-filter\"\n >\n <VForm\n v-model=\"formData\"\n :form-items=\"_filter\"\n :options=\"formOptions\"\n @submit=\"onsubmit\"\n />\n </ElCard>\n </el-col>\n <el-col :span=\"24\">\n <el-row :gutter=\"20\">\n <el-col\n v-for=\"(item,index) in _dataPart\"\n :key=\"index\"\n :span=\"item.col || 24\"\n >\n <Part\n v-if=\"!item.errMsg\"\n :key=\"key\"\n :option=\"item\"\n />\n <el-alert\n v-else\n :title=\"item.id+' 片段执行出错'\"\n type=\"error\"\n >{{ item.errMsg }}</el-alert>\n </el-col>\n </el-row>\n </el-col>\n </el-row>\n</template>\n<script lang=\"ts\" setup>\nimport { VForm } from '@okiss/vbtf'\nimport Part from './part.vue'\n// import store from '../../store'\nimport http from '../../utils/request'\nimport { useRoute } from 'vue-router'\n\nconst route = useRoute()\n\nonMounted(() => {\n // store.dispatch('app/toggleSideBar')\n})\n\nconst props = defineProps({\n filter: {\n type: Array,\n default: () => []\n },\n dataPart: {\n type: Array,\n default: () => []\n }\n})\n\nconst formData = ref<Record<string, any>>({})\nonBeforeMount(() => {\n props.filter?.forEach((item: any) => {\n if (item.default !== null) {\n formData.value[item.field] = item.default\n }\n })\n})\nconst formOptions = {\n inline: true,\n labelPosition: 'right',\n labelWidth: 'auto',\n submitButton: {\n text: '查询'\n },\n cancelButton: {\n text: '重置'\n }\n}\nconst key = ref(1)\nconst _filter = ref(props.filter)\nconst _dataPart = ref(props.dataPart)\n\nconst schemaapi = computed(() => {\n let id = route.params.id\n if (!id) {\n const token = route.path.split('/')\n id = token[token.length - 1]\n }\n return '/focusbi_report/view/' + id\n})\n\nconst onsubmit = (data: any) => {\n http.get(schemaapi.value, { params: data }).then(({ data }) => {\n _filter.value = data.filter\n _dataPart.value = data.dataPart\n key.value++\n })\n}\n</script>\n\n<style lang=\"scss\">\n.part-filter {\n margin-bottom: 15px;\n}\n\n</style>\n","<template>\n <PageLoad :schema-api=\"schemaapi\">\n <template #default=\"slotProps\">\n <Report v-bind=\"slotProps\" />\n </template>\n </PageLoad>\n</template>\n<script setup>\nimport PageLoad from '../components/PageLoad.vue'\nimport Report from '../components/report/index.vue'\nimport { useRoute } from 'vue-router'\nconst route = useRoute()\n\nconst schemaapi = computed(() => {\n let id = route.params.id\n if (!id) {\n const token = route.path.split('/')\n id = token[token.length - 1]\n }\n return '/focusbi_report/view/' + id\n})\n</script>\n","import { h, getCurrentInstance, Component } from 'vue'\nimport { ElRow, ElCol, ElCard } from 'element-plus'\nimport { merge } from 'lodash'\nimport { VForm, VTable } from '@okiss/vbtf'\nimport { isObject, isArray } from '@okiss/utils'\n\nimport './index.scss'\n\ntype CompProps = Record<string, any>\n\nconst test = (props: CompProps) => <div>{props.test}</div>\n\nconst components: Record<string, any> = {\n 'card': ElCard,\n 'form': VForm,\n 'table': VTable,\n 'test': test,\n 'row': ElRow,\n 'col': ElCol\n}\n\nexport function regComponents(comps: Record<string, any>) {\n Object.keys(comps).forEach(k => {\n components[k] = comps[k]\n })\n}\n\nconst defaultSchema: Record<string, Node> = {\n 'card': {\n type: 'card',\n props: {\n class: 'render-card',\n shadow: 'never'\n }\n },\n 'form': {\n type: 'form',\n props: {\n afterReset: ''\n }\n },\n 'table': {\n type: 'table',\n props: {\n syncUrl: false\n }\n }\n}\n\nexport interface Node {\n type: string,\n props?: Record<string, string | number | boolean | any>\n children?: Node[] | Node\n span?: number\n}\n\nexport interface Props {\n schema: Node[]\n}\n\nfunction pathNodeParse(node: Node): Node[] {\n const _node = Object.assign({}, node)\n const part = _node.type.split('.').reverse()\n const span = _node.span || 24\n delete _node.span\n let tmp = { ..._node, type: part[0] }\n for (let i = 1; i < part.length; i++) {\n const item = part[i]\n tmp = { type: item, children: [tmp] }\n }\n tmp.span = span\n\n return nodesParse([tmp])\n}\n\nfunction nodesParse(_nodes: Node[]): Node[] {\n const root: Node = { type: 'row', props: { gutter: 20, class: 'render-row' }, children: [] }\n _nodes.forEach(_node => {\n let node = Object.assign({}, _node)\n if (isObject(node.props?.style)) {\n let style = ''\n Object.keys(node.props?.style).forEach(k => {\n style += k + ':' + node.props?.style[k] + ';'\n })\n node.props!.style = style\n }\n const colProps = { span: node.span ?? 24, class: 'render-col' }\n delete node.span\n if (node.type.indexOf('.') > 0) {\n (root.children! as Node[]).push({\n type: 'col',\n props: colProps,\n children: pathNodeParse(node)\n })\n return\n }\n node = merge({ props: {}}, defaultSchema[node.type] || {}, node)\n const children = transChildren(node.children)\n if (children.length) {\n node.children = nodesParse(children)\n }\n (root.children! as Node[]).push({\n type: 'col',\n props: colProps,\n children: [\n node\n ]\n })\n })\n\n return [root]\n}\n\nfunction transChildren(children : Node[] | Node | undefined) : Node[] {\n const _children : Node[] = isArray(children) ? children! as Node[] : (isObject(children) ? [children! as Node] : [])\n return _children\n}\n\nlet globalComps : Record<string, Component> = {}\n\nconst createVNode = (node: Node) => {\n const comp = components[node.type] || globalComps[node.type] || node.type\n return h(comp, node.props, { default: () => transChildren(node.children).map(item => createVNode(item)) })\n}\n\nexport const render = (props: Props) => {\n if (Object.keys(globalComps).length === 0) {\n globalComps = getCurrentInstance()!.appContext.components\n }\n const nodes: Node[] = nodesParse(Object.values(props.schema))\n return nodes.map(item => createVNode(item))\n}\n","<template>\n <PageLoad :schema-handler=\"schemaHandler\">\n <render :schema=\"schema\" />\n </PageLoad>\n</template>\n<script setup name=\"Custom\">\nimport PageLoad from '../components/PageLoad.vue'\nimport { render } from '../render'\nimport { toRaw } from 'vue'\nconst schema = ref([])\nconst schemaHandler = (_schema, project) => {\n schema.value = toRaw(_schema)\n return _schema\n}\n</script>\n","import type { RouteRecordRaw } from 'vue-router'\nimport { MenuType, OmsModule, PageInfo, PageType, RemoteModule } from '../types'\nimport { Component } from 'vue'\nimport { Container, Form, Report, Table, Tree, Custom } from '../scaffold'\n\nlet bu: Record<string, any> = {}\nexport function regViews(_bu: Record<string, any>) {\n bu = _bu\n}\n\nconst getComponent = (item: PageInfo): Component => {\n const loadCustom = (path: string): any => {\n const _path = './views/' + path + '.vue'\n if (bu && bu[_path] && bu[_path].default) {\n return bu[_path].default\n }\n console.error(`自定义组件不存在 ${item.name} ${item.view}`)\n return Container\n }\n if (item.path === '#') {\n return Container\n }\n switch (item.page_type) {\n case PageType.list:\n return Table\n case PageType.form:\n return Form\n case PageType.custom:\n case PageType.localComp:\n return loadCustom(item.view || '')\n case PageType.tree:\n return Tree\n case PageType.report:\n return Report\n case PageType.customSchema:\n return Custom\n }\n return Container\n}\n\nfunction getPath(item: PageInfo) {\n let path = item.path\n if (item.type === MenuType.menu && item.page_type === PageType.entity) {\n path = '#'\n }\n // :id 默认转换为数字型匹配模式\n if (path.indexOf(':id') > -1 && path.indexOf(':id') + 3 === path.length) {\n path = path.replace(':id', ':id(\\\\d+)')\n }\n return path === '#'\n ? '/' + item.id + '_DIR_' + item.name\n : path[0] !== '/'\n ? '/' + path\n : path\n}\n\nfunction getName(item: PageInfo): string {\n return (item.path + item.name).split('/').filter(v => v).join('_')\n}\n\nconst transRoute = (item: PageInfo): RouteRecordRaw => {\n const isShow = item.type !== MenuType.page\n const route: RouteRecordRaw = {\n path: getPath(item),\n name: item.id + '_' + getName(item) + '_' + item.path.replaceAll('/', '_'),\n component: getComponent(item),\n meta: {\n id: item.id,\n pageId: item.id,\n title: item.name,\n icon: item.icon,\n hidden: !isShow,\n path: item.path,\n menuType: item.type,\n keepAlive: false,\n role: item.role\n },\n children: item.children ? item.children.map(each => transRoute(each)) : []\n }\n if (item.page_type === PageType.entity) {\n const createList = item.path + '/list'\n const createForm = item.path + '/form'\n const createEdit = item.path + '/:id'\n const children : Array<RouteRecordRaw> = [{\n path: createList,\n name: item.name + '列表' + item.id,\n component: Table,\n meta: {\n id: item.id + 99999,\n title: '列表',\n hidden: true,\n menuType: MenuType.hidden,\n keepAlive: false,\n pageId: item.id,\n path: item.path\n }\n }, {\n path: createForm,\n name: item.name + '新建' + item.id,\n component: Form,\n meta: {\n id: item.id + 99999 + 1,\n title: '新建',\n hidden: true,\n menuType: MenuType.hidden,\n keepAlive: false,\n pageId: item.id,\n path: item.path\n }\n }, {\n path: createEdit,\n name: item.name + '编辑' + item.id,\n component: Form,\n meta: {\n id: item.id + 99999 + 2,\n title: '编辑',\n hidden: true,\n menuType: MenuType.hidden,\n keepAlive: false,\n pageId: item.id,\n path: item.path\n }\n }]\n route.children = [...children, ...route.children as RouteRecordRaw[]]\n }\n if (route.children && route.children.length > 0) {\n let allChildHidden = true\n route.children.forEach(each => {\n if (each.meta && !each.meta.hidden) {\n allChildHidden = false\n }\n })\n if (route.meta) {\n route.meta.menuType = isShow ? MenuType.dir : MenuType.hidden\n }\n if (allChildHidden) {\n if (route.meta) {\n route.meta.menuType = MenuType.menu\n }\n let redirect = '/'\n for (let i = 0; i < route.children.length; i++) {\n if (route.children[i].path.indexOf('/:') === -1) {\n redirect = route.children[i].path\n break\n }\n }\n route.redirect = redirect\n route.path = '/' + item.id + '_DIR' + route.redirect.replaceAll('/', '_').toUpperCase()\n }\n }\n\n return route\n}\n\nexport const transRemoteModules = (data: RemoteModule[]): OmsModule[] => {\n const vueRouteModule: OmsModule[] = []\n data.forEach(item => {\n const m: OmsModule = {\n id: item.id,\n label: item.label,\n routes: []\n }\n item.routes.forEach(each => {\n m.routes.push(transRoute(each))\n })\n vueRouteModule.push(m)\n })\n\n return vueRouteModule\n}\n","<template>\n <el-breadcrumb\n class=\"app-breadcrumb\"\n separator=\"/\"\n >\n <transition-group name=\"breadcrumb\">\n <el-breadcrumb-item\n v-for=\"(item, index) in levelList\"\n :key=\"item.path\"\n >\n <span\n v-if=\"(item.path.indexOf('/DIR_') === 0 && item.redirect === undefined) || index === levelList.length - 1\"\n class=\"no-redirect\"\n >{{ item.meta.title }}</span> <a\n v-else\n @click=\"handleLink(item)\"\n >{{ item.meta.title }}</a>\n </el-breadcrumb-item>\n </transition-group>\n </el-breadcrumb>\n</template>\n\n<script>\nimport * as pathToRegexp from 'path-to-regexp'\n\nexport default {\n data() {\n return {\n levelList: null\n }\n },\n watch: {\n $route() {\n this.getBreadcrumb()\n }\n },\n created() {\n this.getBreadcrumb()\n },\n methods: {\n getBreadcrumb() {\n // only show routes with meta.title\n let matched = this.$route.matched.filter(\n item => item.meta && item.meta.title\n )\n const first = matched[0]\n\n if (!this.isDashboard(first)) {\n matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(\n matched\n )\n }\n\n this.levelList = matched.filter(\n item => item.meta && item.meta.title && item.meta.breadcrumb !== false\n )\n },\n isDashboard(route) {\n const name = route && route.name\n if (!name) {\n return false\n }\n return (\n name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()\n )\n },\n pathCompile(path) {\n // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561\n const { params } = this.$route\n const toPath = pathToRegexp.compile(path)\n return toPath(params)\n },\n handleLink(item) {\n const { redirect, path } = item\n if (redirect) {\n this.$router.push(redirect)\n return\n }\n this.$router.push(this.pathCompile(path))\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-breadcrumb.el-breadcrumb {\n display: inline-block;\n font-size: 14px;\n line-height: 50px;\n margin-left: 8px;\n\n .no-redirect {\n color: #97a8be;\n cursor: text;\n }\n}\n</style>\n","<template>\n <div\n style=\"padding: 0 15px;\"\n @click=\"toggleClick\"\n >\n <v-icon\n :class=\"{ 'is-active': isActive }\"\n name=\"ra-leftalignment\"\n />\n </div>\n</template>\n\n<script>\nexport default {\n name: 'Hamburger',\n props: {\n isActive: {\n type: Boolean,\n default: false\n }\n },\n emits: ['toggle-click'],\n methods: {\n toggleClick() {\n this.$emit('toggle-click')\n }\n }\n}\n</script>\n","<template>\n <el-container style=\"width: 100%;height: 100%\">\n <el-row class=\"aside\">\n <slot name=\"left-aside\" />\n </el-row>\n <el-main\n class=\"main\"\n style=\"margin: 0 10px\"\n >\n <slot name=\"main\" />\n </el-main>\n <el-aside\n class=\"aside\"\n width=\"350px\"\n style=\"padding: 20px\"\n >\n <slot name=\"right-aside\" />\n </el-aside>\n </el-container>\n</template>\n<style scoped>\n.main {\n border: 1px solid #ebebeb;\n border-radius: 3px;\n transition: .2s;\n min-height: calc(100vh - 50px);\n width: 100%;\n position: relative;\n}\n.aside {\n padding-top: 20px;\n border: 1px solid #ebebeb;\n border-radius: 3px;\n transition: .2s;\n}\n</style>\n","export default {\n type: 'input',\n name: '文本框',\n default: {\n type: 'input',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'number',\n field: 'maxlength',\n label: '最大字符数'\n },\n\n {\n type: 'icon-select',\n field: 'prefixIcon',\n label: '前置ICON'\n },\n {\n type: 'icon-select',\n field: 'suffixIcon',\n label: '后置ICON'\n },\n {\n type: 'switch',\n field: 'showCopy',\n label: '复制'\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n },\n {\n type: 'switch',\n field: 'showWordLimit',\n label: '显示限制词数'\n },\n {\n type: 'input',\n field: 'mask',\n label: 'mask',\n info: '<a href=\"https://github.com/RobinHerbots/Inputmask\" target=\"_blank\" class=\"el-link el-link--primary\">文档</a>'\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'number',\n name: '数字',\n default: {\n type: 'number',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'number',\n field: 'min',\n label: '最小值'\n },\n {\n type: 'number',\n field: 'man',\n label: '最大值'\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'number-range',\n name: '数字区间',\n default: {\n type: 'number-range',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'unit',\n label: '单位'\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n }\n ]\n }\n }\n ]\n}\n","import { cloneDeep } from 'lodash'\n\nexport default {\n type: 'select',\n name: '下拉框',\n default: {\n type: 'select',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'radio',\n field: 'optionType',\n label: '备选项类型',\n value: 0,\n options: [\n { value: 0, label: 'local' },\n { value: 1, label: 'remote' }\n ]\n },\n {\n type: 'sub-form',\n field: 'options',\n label: '备选项',\n props: {\n repeat: true,\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'value',\n label: 'value'\n },\n {\n type: 'input',\n field: 'label',\n label: 'label'\n }\n ]\n },\n depend: {\n field: 'optionType',\n value: 0\n }\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'selectApi',\n label: '备选项接口',\n depend: {\n field: '.optionType',\n value: 1\n }\n },\n {\n type: 'switch',\n field: 'multiple',\n label: '多选'\n },\n {\n type: 'number',\n field: 'multipleLimit',\n label: '最大选中数',\n depend: {\n field: 'multiple',\n value: true\n }\n },\n {\n type: 'switch',\n field: 'allowCreate',\n label: '允许创建'\n },\n {\n type: 'switch',\n field: 'filterable',\n label: '允许过滤'\n }\n ]\n }\n }\n ],\n trans(item) {\n const tmp = cloneDeep(item)\n if (item.optionType === 0) {\n if (tmp.props && tmp.props.selectApi !== undefined) {\n delete tmp.props.selectApi\n }\n } else if (item.optionType === 1) {\n if (tmp.options) {\n delete tmp.options\n }\n }\n delete tmp.optionType\n return tmp\n }\n}\n","export default {\n type: 'radio',\n name: '单选框',\n default: {\n type: 'radio',\n label: 'label',\n field: 'field_name',\n options: []\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'options',\n label: '备选项',\n props: {\n formItems: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'value',\n label: '字段值'\n }\n ],\n repeat: true\n }\n },\n {\n type: 'input',\n field: 'default',\n label: '默认值'\n }\n ]\n}\n","export default {\n type: 'switch',\n name: '开关',\n default: {\n type: 'switch',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'activeText',\n label: '打开时的文字描述'\n },\n {\n type: 'input',\n field: 'inactiveText',\n label: '关闭时的文字描述'\n },\n {\n type: 'color',\n field: 'activeColor',\n label: '打开时的背景色'\n },\n {\n type: 'color',\n field: 'inactiveColor',\n label: '关闭时的背景色'\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'code',\n name: 'Code',\n default: {\n type: 'code',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'json',\n name: 'json',\n default: {\n type: 'json',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'upload',\n name: '上传',\n default: {\n type: 'upload',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'template',\n name: '自定义组件',\n default: {\n type: 'template',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'icon-select',\n name: '图标选择器',\n default: {\n type: 'icon-select',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export default {\n type: 'sub-form',\n name: '子表单',\n default: {\n type: 'sub-form',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'switch',\n field: 'repeat',\n label: '可重复'\n },\n {\n type: 'sub-form',\n field: 'form-items',\n label: '子表单控件',\n props: {\n options: {\n labelPosition: 'top'\n },\n repeat: true,\n formItems: [\n {\n type: 'input',\n field: 'label',\n label: 'label'\n },\n {\n type: 'select',\n field: 'type',\n label: '类型',\n options: [\n { value: 'input', label: '文本框' }\n ]\n }\n ]\n }\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'checkbox',\n name: '复选框',\n default: {\n type: 'checkbox',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'number',\n field: 'max',\n label: '最大选中数'\n },\n {\n type: 'number',\n field: 'min',\n label: '最小选中数'\n },\n {\n type: 'switch',\n field: 'disabled',\n label: '禁用'\n }\n ]\n }\n }\n ]\n}\n","import input from './ctrls/input'\nimport number from './ctrls/number'\nimport numberRange from './ctrls/number-range'\nimport select from './ctrls/select'\nimport radio from './ctrls/radio'\nimport xswitch from './ctrls/switch'\nimport code from './ctrls/code'\nimport json from './ctrls/json'\nimport upload from './ctrls/upload'\nimport template from './ctrls/template'\nimport iconSelect from './ctrls/icon-select'\nimport subForm from './ctrls/sub-form'\nimport checkbox from './ctrls/checkbox'\n\nconst ctrlMaps = {}\n\nexport function regCtrl(options) {\n ctrlMaps[options.type] = options\n}\n\nregCtrl(input)\nregCtrl(select)\nregCtrl(number)\nregCtrl(numberRange)\nregCtrl(xswitch)\nregCtrl(subForm)\nregCtrl(radio)\nregCtrl(checkbox)\nregCtrl(code)\nregCtrl(json)\nregCtrl(upload)\nregCtrl(iconSelect)\nregCtrl(template)\n\nexport const ctrls = ctrlMaps\n\nexport const baseSchema = {\n options: {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n },\n formItems: [\n {\n type: 'input',\n field: 'saveApi',\n label: '保存接口'\n },\n {\n type: 'switch',\n field: 'inline',\n label: '行布局'\n },\n {\n type: 'radio',\n field: 'labelPosition',\n label: 'label位置',\n options: [\n { value: 'right', label: '右' },\n { value: 'left', label: '左' },\n { value: 'top', label: '上' }\n ]\n },\n {\n type: 'input',\n field: 'labelWidth',\n label: 'label宽度',\n value: '100px'\n },\n {\n type: 'switch',\n field: 'showSubmitButton',\n label: '显示提交按钮',\n value: true\n },\n {\n type: 'sub-form',\n field: 'submitButton',\n label: '提交按钮',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'text',\n label: '文案',\n value: '提交'\n },\n {\n type: 'select',\n field: 'type',\n label: '按钮类型',\n options: [\n { value: 'primary', label: 'primary' }\n ]\n }\n ]\n }\n },\n {\n type: 'switch',\n field: 'showCancelButton',\n label: '显示取消按钮',\n value: true\n },\n {\n type: 'sub-form',\n field: 'cancelButton',\n label: '取消按钮',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'text',\n label: '文案',\n value: '取消'\n },\n {\n type: 'select',\n field: 'type',\n label: '按钮类型',\n options: [\n { value: 'primary', label: 'primary' }\n ]\n }\n ]\n }\n }\n ]\n}\n\nexport const ctrlFormDefaultOptions = {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n}\n","<template>\n <dev-layout>\n <template #main>\n <v-form\n v-if=\"builderSchema.formItems\"\n ref=\"form\"\n :key=\"key\"\n :dev=\"true\"\n v-bind=\"builderSchema\"\n />\n <el-divider />\n <ElButton\n type=\"primary\"\n @click=\"saveSchema\"\n >保存页面配置</ElButton>\n \n <VButton\n text=\"PageSchema\"\n type=\"modal\"\n >\n <JsonView :data=\"getSaveSchema\" />\n </VButton>\n </template>\n <template #right-aside>\n <el-form v-if=\"activeIndex\">\n <el-form-item label=\"控件类型\">\n <el-select v-model=\"currentCtrlType\">\n <el-option\n v-for=\"(item,index) in types\"\n :key=\"index\"\n :label=\"item.label\"\n :value=\"item.value\"\n />\n </el-select>\n </el-form-item>\n </el-form>\n <v-form\n :key=\"ctrlKey\"\n v-model=\"ctrlOptions\"\n v-bind=\"ctrlSchema\"\n />\n </template>\n </dev-layout>\n</template>\n<script>\nimport DevLayout from '../DevLayout.vue'\nimport { VForm, VBtn as VButton, JsonView } from '@okiss/vbtf'\nimport { compactObject } from '@okiss/utils'\nimport { cloneDeep, get, merge, set, unset } from 'lodash'\nimport { baseSchema, ctrls } from './form'\nimport { eventBus } from '../../../index'\n\nexport const ctrlFormDefaultOptions = {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n}\n\nconst typs = []\n\nObject.keys(ctrls).forEach(item => {\n typs.push({ value: item, label: ctrls[item].name })\n})\n\nconst sqlSchema = {\n options: {\n submitButton: false,\n cancelButton: false\n },\n formItems: [\n {\n type: 'sub-form',\n field: 'columns',\n props: {\n repeat: true,\n formItems: [\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'select',\n field: 'type',\n label: '类型',\n options: cloneDeep(typs)\n },\n {\n type: 'input',\n field: 'label',\n label: '字段label'\n }\n ]\n }\n }\n ]\n}\n\nexport default {\n components: { DevLayout, VForm, VButton, JsonView },\n props: {\n schema: {\n type: Object,\n default: _ => {}\n }\n },\n data() {\n return {\n sqlOptions: {},\n sqlSchema: sqlSchema,\n baseSchema: baseSchema,\n activeTab: 'base',\n builderSchema: Object.assign(\n {},\n this.$props.schema,\n {\n options: {\n submitButton: false,\n cancelButton: false\n }\n }\n ),\n baseOptions: {},\n key: 0,\n ctrlKey: 0,\n activeCtrl: undefined,\n ctrlOptions: {},\n ctrlSchema: {},\n ctrlName: '',\n activeIndex: undefined,\n ctrlMap: ctrls,\n activeIndexReg: /(formItems)?\\[(\\d+)\\]/,\n tableStruct: '',\n activeName: '1',\n currentCtrlType: 'input',\n types: cloneDeep(typs)\n }\n },\n computed: {\n getSaveSchema() {\n return {\n formItems: this.builderSchema.formItems\n }\n }\n },\n watch: {\n baseOptions: {\n deep: true,\n immediate: true,\n handler(val) {\n const tmp = cloneDeep(val)\n if (val.showSubmitButton === false) {\n tmp.submitButton = false\n }\n if (val.cancelSubmitButton === false) {\n tmp.cancelButton = false\n }\n delete tmp.showSubmitButton\n delete tmp.showCancelButton\n if (Object.keys(tmp).length > 0) {\n this.builderSchema = merge(this.builderSchema, { options: tmp })\n this.key++\n }\n }\n },\n ctrlOptions: {\n deep: true,\n // immediate: true,\n handler(val) {\n const current = get(this.builderSchema, this.activeIndex)\n if (!current) {\n return\n }\n const type = current ? current.type : ''\n const ctrl = this.ctrlMap[type]\n const transData = ctrl.trans ? ctrl.trans(val) : val\n if (transData && Object.keys(transData).length > 0) {\n transData.type = type\n // update `builderSchema` nested data\n if (this.activeIndex.indexOf('[') > -1) {\n // format like: `headers[0]`\n const [_, key, keyIndex] = this.activeIndex.match(/(\\w+)\\[(\\d+)\\]/)\n _\n this.builderSchema[key][keyIndex] = { ...transData }\n } else {\n this.builderSchema[this.activeIndex] = transData\n }\n // set(this.builderSchema, this.activeIndex, transData)\n this.key++\n }\n }\n },\n currentCtrlType: {\n handler(val) {\n const ctrl = this.ctrlMap[val]\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n const sourceCtrlOptions = get(this.builderSchema, this.activeIndex)\n this.ctrlOptions = cloneDeep(sourceCtrlOptions)\n this.ctrlOptions.type = val\n this.ctrlKey++\n this.key++\n }\n }\n },\n beforeCreate() {\n eventBus.on('dev-action', ({ event, data }) => {\n this.onDevAction(data.type, data.devId)\n })\n },\n unmounted() {\n eventBus.off('dev-action')\n },\n methods: {\n onDevAction(btnType, path) {\n this.activeIndex = 'formItems' + path\n if (btnType === 'edit') {\n this.activeTab = 'ctrl'\n this.clicklabel()\n }\n if (btnType === 'del') {\n this.activeTab = 'base'\n this.removeOne()\n }\n this.ctrlKey++\n },\n push(name) {\n const target = 'formItems'\n this.ctrlOptions = {}\n this.builderSchema[target] = this.builderSchema[target] || []\n const ctrl = this.ctrlMap[name]\n this.activeCtrl = ctrl\n this.builderSchema[target].push(cloneDeep(ctrl.default))\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n this.ctrlKey++\n this.key++\n this.activeIndex = `${target}[${this.builderSchema[target].length - 1}]`\n this.activeTab = 'ctrl'\n },\n removeOne() {\n unset(this.builderSchema, this.activeIndex)\n this.builderSchema = cloneDeep(compactObject(this.builderSchema))\n this.activeIndex = ''\n this.ctrlOptions = {}\n this.ctrlSchema = {}\n this.key++\n this.ctrlKey++\n },\n clicklabel() {\n const p = this.activeIndex\n const m = p.match(this.activeIndexReg)\n if (m) {\n const ctrlOptions = cloneDeep(get(this.builderSchema, p))\n const type = ctrlOptions.type\n const ctrl = this.ctrlMap[type]\n if (!ctrl) {\n this.$message({ type: 'warning', message: '尚未支持该组件的UI编辑' })\n return\n }\n this.currentCtrlType = type\n this.ctrlOptions = ctrlOptions\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n this.ctrlKey++\n }\n },\n saveSchema() {\n this.$http.request({\n method: 'POST',\n url: '/devtool/page_schema',\n data: { formItems: this.builderSchema.formItems }\n }).then(({ data }) => {\n if (data) {\n this.$message({ type: 'success', message: '保存成功, 请刷新页面查看效果' })\n }\n })\n }\n }\n}\n</script>\n<style lang=\"scss\" scoped>\n.title {\n size: 2em;\n padding: 5px 20px;\n}\n.ctrl {\n padding: 5px 20px;\n .ctrl-btn {\n width: 100%;\n }\n}\n</style>\n","export default {\n type: 'input',\n name: '文本框',\n default: {\n type: 'input',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'number',\n field: 'maxlength',\n label: '最大字符数'\n },\n {\n type: 'switch',\n field: 'showWordLimit',\n label: '显示限制词数'\n },\n {\n type: 'input',\n field: 'mask',\n label: 'mask',\n info: '<a href=\"https://github.com/RobinHerbots/Inputmask\" target=\"_blank\" class=\"el-link el-link--primary\">文档</a>'\n }\n ]\n }\n }\n ]\n}\n","import { cloneDeep } from 'lodash'\n\nexport default {\n type: 'select',\n name: '下拉框',\n default: {\n type: 'select',\n label: 'label',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'radio',\n field: 'optionType',\n label: '备选项类型',\n value: 0,\n options: [\n { value: 0, label: 'local' },\n { value: 1, label: 'remote' }\n ]\n },\n {\n type: 'sub-form',\n field: 'options',\n label: '备选项',\n props: {\n repeat: true,\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'value',\n label: 'value'\n },\n {\n type: 'input',\n field: 'label',\n label: 'label'\n }\n ]\n },\n depend: {\n field: 'optionType',\n value: 0\n }\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'selectApi',\n label: '备选项接口',\n depend: {\n field: '.optionType',\n value: 1\n }\n },\n {\n type: 'switch',\n field: 'multiple',\n label: '多选'\n },\n {\n type: 'number',\n field: 'multipleLimit',\n label: '最大选中数',\n depend: {\n field: 'multiple',\n value: true\n }\n },\n {\n type: 'switch',\n field: 'filterable',\n label: '允许过滤'\n }\n ]\n }\n }\n ],\n trans(item) {\n const tmp = cloneDeep(item)\n if (item.optionType === 0) {\n if (tmp.props && tmp.props.selectApi !== undefined) {\n delete tmp.props.selectApi\n }\n } else if (item.optionType === 1) {\n if (tmp.options) {\n delete tmp.options\n }\n }\n delete tmp.optionType\n return tmp\n }\n}\n","export default {\n type: 'date',\n name: '日期',\n default: {\n type: 'date',\n label: '时间',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n }\n ]\n}\n","export const baseSchema = {\n options: {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n },\n formItems: [\n {\n type: 'switch',\n field: 'showFilter',\n label: '搜索条件',\n value: true\n },\n {\n type: 'switch',\n field: 'showPagination',\n label: '页码',\n value: true\n },\n {\n type: 'switch',\n field: 'exportAble',\n label: '导出按钮'\n }\n ]\n}\n","export const ctrlFormDefaultOptions = {\n labelPosition: 'top',\n submitButton: false,\n cancelButton: false\n}\n","export default {\n type: 'span',\n name: '文本',\n default: {\n type: 'span',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n },\n {\n type: 'switch',\n field: 'sortable',\n label: '排序'\n }\n ]\n}\n","export default {\n type: 'enum',\n name: '标签',\n default: {\n type: 'enum',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n },\n {\n type: 'sub-form',\n field: 'options',\n label: '映射',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'value',\n label: 'value'\n },\n {\n type: 'input',\n field: 'label',\n label: 'label'\n }\n ]\n },\n value: []\n }\n ],\n trans(val) {\n val.options = val.options || []\n if (!val.label) {\n val.label = '表头'\n }\n return val\n }\n}\n","export default {\n type: 'html',\n name: 'HTML',\n default: {\n type: 'html',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'icon',\n name: '图标',\n default: {\n type: 'icon',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'image',\n name: '图片',\n default: {\n type: 'image',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'json',\n name: 'JSON',\n default: {\n type: 'json',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'link',\n name: '链接',\n default: {\n type: 'link',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'rich',\n name: '富文本',\n default: {\n type: 'rich',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n }\n ]\n}\n","export default {\n type: 'tpl',\n name: '模板',\n default: {\n type: 'tpl',\n label: '表头',\n field: 'field_name'\n },\n builder: [\n {\n type: 'input',\n field: 'label',\n label: '字段名'\n },\n {\n type: 'input',\n field: 'field',\n label: '字段key'\n },\n {\n type: 'input',\n field: 'info',\n label: '提示'\n },\n {\n type: 'input',\n field: 'tpl',\n label: '模板',\n info: '例如 <code>姓名: {name} 年龄:{age}</code>'\n }\n ]\n}\n","import span from './span'\nimport xenum from './emum'\nimport html from './html'\nimport icon from './icon'\nimport image from './image'\nimport json from './json'\nimport link from './link'\nimport rich from './rich'\nimport tpl from './tpl'\n\nexport default {\n span,\n enum: xenum,\n html,\n icon,\n image,\n json,\n link,\n rich,\n tpl\n}\n","export default {\n type: 'jump',\n name: '跳转',\n default: {\n type: 'jump',\n target: '',\n text: '按钮'\n },\n builder: [\n {\n type: 'input',\n field: 'target',\n label: '跳转地址',\n info: '可以是本地路由, 也可以是url'\n },\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'icon-select',\n field: 'icon',\n label: '图标'\n },\n {\n type: 'select',\n field: 'type',\n label: '类型',\n options: [\n { value: 'primary', label: 'primary' },\n { value: 'info', label: 'info' }\n ]\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'api',\n name: '接口请求',\n default: {\n type: 'api',\n target: '',\n text: '请求'\n },\n builder: [\n {\n type: 'input',\n field: 'target',\n label: 'API地址',\n info: '此处填写接口path即可'\n },\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'sub-form',\n field: 'props',\n label: '属性',\n props: {\n options: {\n labelPosition: 'top'\n },\n formItems: [\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'icon-select',\n field: 'icon',\n label: '图标'\n },\n {\n type: 'select',\n field: 'type',\n label: '类型',\n options: [\n { value: 'primary', label: 'primary' },\n { value: 'info', label: 'info' }\n ]\n },\n {\n type: 'input',\n field: 'api',\n label: 'API地址',\n info: '此处填写接口path即可'\n },\n {\n type: 'select',\n field: 'method',\n label: '请求类型',\n options: [\n { value: 'GET', label: 'GET' },\n { value: 'POST', label: 'POST' },\n { value: 'DELETE', label: 'DELETE' },\n { value: 'PUT', label: 'PUT' }\n ]\n }\n ]\n }\n }\n ]\n}\n","export default {\n type: 'form',\n name: '弹框表单',\n default: {\n type: 'form',\n target: '',\n text: '弹框表单'\n },\n builder: [\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'radio',\n field: 'container',\n label: '模式',\n options: [\n { value: 'dialog', label: '模态框' },\n { value: 'drawer', label: '抽屉' }\n ],\n value: 'dialog'\n },\n {\n type: 'radio',\n field: 'schema_type',\n label: '表单类型',\n options: [\n { value: 0, label: '本地' },\n { value: 1, label: '远程' }\n ],\n value: 1\n },\n {\n type: 'input',\n field: 'infoApi',\n label: 'formSchema接口',\n depend: {\n field: 'schema_type',\n value: 1\n }\n },\n {\n type: 'json',\n field: 'form-items',\n label: '表单控件'\n },\n {\n type: 'input',\n field: 'saveApi',\n label: '保存接口'\n }\n ]\n}\n","export default {\n type: 'table',\n name: '弹框列表',\n default: {\n type: 'form',\n target: '',\n text: '弹框表单'\n },\n builder: [\n {\n type: 'input',\n field: 'text',\n label: '文案'\n },\n {\n type: 'radio',\n field: 'container',\n label: '模式',\n options: [\n { value: 'dialog', label: '模态框' },\n { value: 'drawer', label: '抽屉' }\n ],\n value: 'dialog'\n },\n {\n type: 'radio',\n field: 'schema_type',\n label: '表单类型',\n options: [\n { value: 0, label: '本地' },\n { value: 1, label: '远程' }\n ],\n value: 1\n },\n {\n type: 'input',\n field: 'infoApi',\n label: 'formSchema接口',\n depend: {\n field: 'schema_type',\n value: 1\n }\n },\n {\n type: 'json',\n field: 'form-items',\n label: '表单控件'\n },\n {\n type: 'input',\n field: 'saveApi',\n label: '保存接口'\n }\n ]\n}\n","import jump from './jump'\nimport api from './api'\nimport form from './form'\nimport table from './table'\n\nexport default {\n jump,\n api,\n form,\n table\n}\n","<template>\n <dev-layout>\n <template #left-aside>\n <el-row style=\"width: 200px\">\n <el-row>\n <el-col\n class=\"title\"\n :data-id=\"22222\"\n >添加搜索条件</el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('input')\"\n >文本框</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('select')\"\n >下拉框</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('date')\"\n >日期</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加列表项</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.headers)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushHeaders(ctrlMap.headers[item].type)\"\n >{{ ctrlMap.headers[item].name }}</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加行按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushRowButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加常规按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushNormalButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button class=\"ctrl-btn\">按钮组</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加批量按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushBatchButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button class=\"ctrl-btn\">按钮组</el-button>\n </el-col>\n </el-row>\n </el-row>\n </template>\n <template #main>\n <v-table\n ref=\"table\"\n :key=\"key\"\n :dev=\"true\"\n v-bind=\"builderSchema\"\n />\n <el-divider />\n <ElButton\n type=\"primary\"\n @click=\"saveSchema\"\n >保存页面配置</ElButton>\n \n <VButton\n text=\"PageSchema\"\n type=\"modal\"\n >\n <JsonView :data=\"getSaveSchema\" />\n </VButton>\n </template>\n <template #right-aside>\n <el-form v-if=\"activeIndex\">\n <el-form-item label=\"控件类型\">\n <el-select v-model=\"currentCtrlType\">\n <el-option\n v-for=\"(item,index) in types\"\n :key=\"index\"\n :label=\"item.label\"\n :value=\"item.value\"\n />\n </el-select>\n </el-form-item>\n </el-form>\n <v-form\n :key=\"ctrlKey\"\n v-model=\"ctrlOptions\"\n v-bind=\"ctrlSchema\"\n />\n </template>\n </dev-layout>\n</template>\n<script lang=\"ts\">\nimport DevLayout from '../DevLayout.vue'\nimport { VTable, VForm, VBtn as VButton, JsonView } from '@okiss/vbtf'\nimport { compactObject } from '@okiss/utils'\nimport input from './ctrls/input'\nimport select from './ctrls/select'\nimport date from './ctrls/date'\nimport { cloneDeep, merge, get, unset } from 'lodash'\nimport { baseSchema } from './table'\nimport { ctrlFormDefaultOptions } from '../base'\nimport columns from './columns'\nimport buttons from './btn'\nimport { eventBus } from '../../../index'\n\nexport default {\n components: { JsonView, DevLayout, VTable, VForm, VButton },\n props: {\n schema: {\n type: Object,\n default: _ => {}\n }\n },\n data() {\n const schema = toRefs(this.$props.schema)\n delete schema.listApi\n schema.list = [{}]\n return {\n baseSchema: baseSchema,\n activeTab: 'base',\n builderSchema: Object.assign(\n {},\n baseSchema,\n schema\n ),\n baseOptions: {},\n key: 0,\n ctrlKey: 0,\n activeCtrl: undefined,\n activeBrick: undefined,\n ctrlOptions: {},\n ctrlSchema: {},\n ctrlName: '',\n activeIndex: undefined,\n ctrlMap: {\n filter: { input, select, date },\n headers: columns,\n buttons: buttons\n },\n activeIndexReg: /(filter|headers|normalButton|batchButton|rowButton)?\\[(\\d+)\\]/,\n currentCtrlType: 'input'\n }\n },\n computed: {\n types() {\n const typs = []\n const ctrls = this.ctrlMap[this.activeBrick]\n Object.keys(ctrls).forEach(item => {\n typs.push({ value: item, label: ctrls[item].name })\n })\n\n return typs\n },\n getSaveSchema() {\n return {\n filter: this.builderSchema.filter,\n headers: this.builderSchema.headers,\n rowButton: this.builderSchema.rowButton,\n normalButton: this.builderSchema.normalButton,\n batchButton: this.builderSchema.batchButton\n }\n },\n currentBuilderSchema() {\n // @ts-ignore\n return this.$pinia?.state?.value?.app?.builderSchema\n }\n },\n watch: {\n baseOptions: {\n deep: true,\n immediate: true,\n handler(val) {\n this.builderSchema = merge(this.builderSchema, val)\n this.key++\n this.updateBuilderSchema()\n }\n },\n ctrlOptions: {\n deep: true,\n // immediate: true,\n handler(val) {\n const m = this.activeIndex.match(this.activeIndexReg)\n if (!m) {\n return\n }\n let type = this.builderSchema[m[1]][parseInt(m[2])].type\n\n if (m[1] === 'headers' && type === undefined) {\n type = 'span'\n }\n const ctrl = this.ctrlMap[this.activeBrick][type]\n if (!ctrl) {\n return\n }\n\n const transData = ctrl.trans ? ctrl.trans(val) : val\n if (transData && Object.keys(transData).length > 0) {\n transData.type = type\n\n // update `builderSchema` nested data\n if (this.activeIndex.indexOf('[') > -1) {\n // format like: `headers[0]`\n const [_, key, keyIndex] = this.activeIndex.match(/(\\w+)\\[(\\d+)\\]/)\n _\n this.builderSchema[key][keyIndex] = { ...transData }\n } else {\n this.builderSchema[this.activeIndex] = transData\n }\n this.key++\n }\n\n this.updateBuilderSchema()\n }\n },\n currentCtrlType: {\n handler(val) {\n const ctrl = this.ctrlMap[this.activeBrick][val]\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n const sourceCtrlOptions = get(this.builderSchema, this.activeIndex)\n sourceCtrlOptions.type = val\n const ctrlOptions = cloneDeep(sourceCtrlOptions)\n this.ctrlOptions = ctrlOptions\n if (ctrlOptions.text) {\n this.ctrlOptions.text = ctrlOptions.text\n this.ctrlOptions.props = ctrlOptions.props || {}\n }\n this.ctrlKey++\n this.key++\n this.updateBuilderSchema()\n }\n }\n },\n beforeCreate() {\n eventBus.on('dev-action', ({ event, data }) => {\n this.onDevAction(data.type, data.devId)\n })\n },\n unmounted() {\n eventBus.off('dev-action')\n },\n methods: {\n updateBuilderSchema() {\n // Using Pinia app store\n // @ts-ignore\n const appStore = (this as any).$pinia?._s?.get('app') || null\n if (appStore && appStore.setBuilderSchema) {\n appStore.setBuilderSchema(this.builderSchema)\n }\n },\n onDevAction(btnType, path) {\n this.activeIndex = path\n if (btnType === 'edit') {\n this.activeTab = 'ctrl'\n this.clicklabel()\n }\n if (btnType === 'del') {\n this.activeTab = 'base'\n this.removeOne()\n }\n this.ctrlKey++\n },\n pushFilter(name) {\n this.push(name, 'filter', 'filter', 'filter')\n },\n pushHeaders(name) {\n this.push(name, 'headers', 'headers', 'headers')\n },\n pushNormalButton(name) {\n this.push(name, 'normalButton', 'buttons', 'buttons')\n },\n pushBatchButton(name) {\n this.push(name, 'batchButton', 'buttons', 'buttons')\n },\n pushRowButton(name) {\n this.push(name, 'rowButton', 'buttons', 'buttons')\n },\n push(name, target, ctrlMapName, brick) {\n const ctrl = this.ctrlMap[ctrlMapName]\n if (!ctrl[name]) {\n this.$message({ type: 'warning', message: '尚未支持此组件的UI编辑' })\n return\n }\n this.activeCtrl = ctrl[name]\n this.activeBrick = brick\n this.ctrlOptions = {}\n this.builderSchema[target] = this.builderSchema[target] || []\n this.builderSchema[target].push(cloneDeep(ctrl[name].default))\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl[name].builder)\n })\n this.key++\n this.ctrlKey++\n this.activeIndex = `${target}[${this.builderSchema[target].length - 1}]`\n this.activeTab = 'ctrl'\n },\n removeOne() {\n unset(this.builderSchema, this.activeIndex)\n this.builderSchema = cloneDeep(compactObject(this.builderSchema))\n this.activeIndex = ''\n this.ctrlOptions = {}\n this.ctrlSchema = {}\n this.key++\n this.ctrlKey++\n },\n clicklabel() {\n const p = this.activeIndex\n const m = p.match(this.activeIndexReg)\n if (m) {\n const ctrlOptions = cloneDeep(get(this.builderSchema, p))\n this.activeBrick = m[1]\n if (['normalButton', 'batchButton', 'rowButton'].indexOf(m[1]) > -1) {\n this.activeBrick = 'buttons'\n }\n let type = this.builderSchema[m[1]][parseInt(m[2])].type\n if (m[1] === 'headers' && type === undefined) {\n type = 'span'\n }\n const ctrl = this.ctrlMap[this.activeBrick][type]\n if (!ctrl) {\n console.log(this.activeBrick, type, m)\n this.$message({ type: 'warning', message: '尚未支持此组件的UI编辑' })\n return\n }\n this.ctrlOptions = ctrlOptions\n this.currentCtrlType = type\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n this.ctrlKey++\n }\n },\n saveSchema() {\n const { filter, headers, rowButton, normalButton, batchButton } = this.currentBuilderSchema\n this.$http.request({\n method: 'POST',\n url: '/devtool/page_schema',\n data: {\n filter,\n headers,\n rowButton,\n normalButton,\n batchButton\n }\n }).then(({ data }) => {\n if (data) {\n this.$message({ type: 'success', message: '保存成功, 请刷新页面查看效果' })\n }\n })\n }\n }\n}\n</script>\n<style lang=\"scss\" scoped>\n.title {\n size: 2em;\n padding: 5px 20px;\n}\n.ctrl {\n padding: 5px 20px;\n .ctrl-btn {\n width: 100%;\n }\n}\n</style>\n","<template>\n <dev-layout>\n <template #left-aside>\n <el-row style=\"width: 200px\">\n <el-row>\n <el-col\n class=\"title\"\n :data-id=\"22222\"\n >添加搜索条件</el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('input')\"\n >文本框</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('select')\"\n >下拉框</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushFilter('date')\"\n >日期</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加列表项</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.headers)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushHeaders(ctrlMap.headers[item].type)\"\n >{{ ctrlMap.headers[item].name }}</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加行按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushRowButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加常规按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushNormalButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button class=\"ctrl-btn\">按钮组</el-button>\n </el-col>\n </el-row>\n <el-row>\n <el-col class=\"title\">添加批量按钮</el-col>\n <el-col\n v-for=\"(item, index) in Object.keys(ctrlMap.buttons)\"\n :key=\"`column-${index}`\"\n class=\"ctrl\"\n >\n <el-button\n class=\"ctrl-btn\"\n @click=\"pushBatchButton(ctrlMap.buttons[item].type)\"\n >{{ ctrlMap.buttons[item].name }}</el-button>\n </el-col>\n <el-col class=\"ctrl\">\n <el-button class=\"ctrl-btn\">按钮组</el-button>\n </el-col>\n </el-row>\n </el-row>\n </template>\n <template #main>\n <v-table\n ref=\"table\"\n :key=\"key\"\n :dev=\"true\"\n v-bind=\"builderSchema\"\n />\n <el-divider />\n <ElButton\n type=\"primary\"\n @click=\"saveSchema\"\n >保存页面配置</ElButton>\n \n <VButton\n text=\"PageSchema\"\n type=\"modal\"\n >\n <JsonView :data=\"getSaveSchema\" />\n </VButton>\n </template>\n <template #right-aside>\n <el-form v-if=\"activeIndex\">\n <el-form-item label=\"控件类型\">\n <el-select v-model=\"currentCtrlType\">\n <el-option\n v-for=\"(item,index) in types\"\n :key=\"index\"\n :label=\"item.label\"\n :value=\"item.value\"\n />\n </el-select>\n </el-form-item>\n </el-form>\n <v-form\n :key=\"ctrlKey\"\n v-model=\"ctrlOptions\"\n v-bind=\"ctrlSchema\"\n />\n </template>\n </dev-layout>\n</template>\n<script lang=\"ts\">\nimport DevLayout from '../DevLayout.vue'\nimport { VTable, VForm, VBtn as VButton, JsonView } from '@okiss/vbtf'\nimport { compactObject } from '@okiss/utils'\nimport input from './ctrls/input'\nimport select from './ctrls/select'\nimport date from './ctrls/date'\nimport { cloneDeep, merge, get, unset } from 'lodash'\nimport { baseSchema } from './table'\nimport { ctrlFormDefaultOptions } from '../base'\nimport columns from './columns'\nimport buttons from './btn'\nimport { eventBus } from '../../../index'\n\nexport default {\n components: { JsonView, DevLayout, VTable, VForm, VButton },\n props: {\n schema: {\n type: Object,\n default: _ => {}\n }\n },\n data() {\n const schema = toRefs(this.$props.schema)\n delete schema.listApi\n schema.list = [{}]\n return {\n baseSchema: baseSchema,\n activeTab: 'base',\n builderSchema: Object.assign(\n {},\n baseSchema,\n schema\n ),\n baseOptions: {},\n key: 0,\n ctrlKey: 0,\n activeCtrl: undefined,\n activeBrick: undefined,\n ctrlOptions: {},\n ctrlSchema: {},\n ctrlName: '',\n activeIndex: undefined,\n ctrlMap: {\n filter: { input, select, date },\n headers: columns,\n buttons: buttons\n },\n activeIndexReg: /(filter|headers|normalButton|batchButton|rowButton)?\\[(\\d+)\\]/,\n currentCtrlType: 'input'\n }\n },\n computed: {\n types() {\n const typs = []\n const ctrls = this.ctrlMap[this.activeBrick]\n Object.keys(ctrls).forEach(item => {\n typs.push({ value: item, label: ctrls[item].name })\n })\n\n return typs\n },\n getSaveSchema() {\n return {\n filter: this.builderSchema.filter,\n headers: this.builderSchema.headers,\n rowButton: this.builderSchema.rowButton,\n normalButton: this.builderSchema.normalButton,\n batchButton: this.builderSchema.batchButton\n }\n },\n currentBuilderSchema() {\n // @ts-ignore\n return this.$pinia?.state?.value?.app?.builderSchema\n }\n },\n watch: {\n baseOptions: {\n deep: true,\n immediate: true,\n handler(val) {\n this.builderSchema = merge(this.builderSchema, val)\n this.key++\n this.updateBuilderSchema()\n }\n },\n ctrlOptions: {\n deep: true,\n // immediate: true,\n handler(val) {\n const m = this.activeIndex.match(this.activeIndexReg)\n if (!m) {\n return\n }\n let type = this.builderSchema[m[1]][parseInt(m[2])].type\n\n if (m[1] === 'headers' && type === undefined) {\n type = 'span'\n }\n const ctrl = this.ctrlMap[this.activeBrick][type]\n if (!ctrl) {\n return\n }\n\n const transData = ctrl.trans ? ctrl.trans(val) : val\n if (transData && Object.keys(transData).length > 0) {\n transData.type = type\n\n // update `builderSchema` nested data\n if (this.activeIndex.indexOf('[') > -1) {\n // format like: `headers[0]`\n const [_, key, keyIndex] = this.activeIndex.match(/(\\w+)\\[(\\d+)\\]/)\n _\n this.builderSchema[key][keyIndex] = { ...transData }\n } else {\n this.builderSchema[this.activeIndex] = transData\n }\n this.key++\n }\n\n this.updateBuilderSchema()\n }\n },\n currentCtrlType: {\n handler(val) {\n const ctrl = this.ctrlMap[this.activeBrick][val]\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n const sourceCtrlOptions = get(this.builderSchema, this.activeIndex)\n sourceCtrlOptions.type = val\n const ctrlOptions = cloneDeep(sourceCtrlOptions)\n this.ctrlOptions = ctrlOptions\n if (ctrlOptions.text) {\n this.ctrlOptions.text = ctrlOptions.text\n this.ctrlOptions.props = ctrlOptions.props || {}\n }\n this.ctrlKey++\n this.key++\n this.updateBuilderSchema()\n }\n }\n },\n beforeCreate() {\n eventBus.on('dev-action', ({ event, data }) => {\n this.onDevAction(data.type, data.devId)\n })\n },\n unmounted() {\n eventBus.off('dev-action')\n },\n methods: {\n updateBuilderSchema() {\n // Using Pinia app store\n // @ts-ignore\n const appStore = (this as any).$pinia?._s?.get('app') || null\n if (appStore && appStore.setBuilderSchema) {\n appStore.setBuilderSchema(this.builderSchema)\n }\n },\n onDevAction(btnType, path) {\n this.activeIndex = path\n if (btnType === 'edit') {\n this.activeTab = 'ctrl'\n this.clicklabel()\n }\n if (btnType === 'del') {\n this.activeTab = 'base'\n this.removeOne()\n }\n this.ctrlKey++\n },\n pushFilter(name) {\n this.push(name, 'filter', 'filter', 'filter')\n },\n pushHeaders(name) {\n this.push(name, 'headers', 'headers', 'headers')\n },\n pushNormalButton(name) {\n this.push(name, 'normalButton', 'buttons', 'buttons')\n },\n pushBatchButton(name) {\n this.push(name, 'batchButton', 'buttons', 'buttons')\n },\n pushRowButton(name) {\n this.push(name, 'rowButton', 'buttons', 'buttons')\n },\n push(name, target, ctrlMapName, brick) {\n const ctrl = this.ctrlMap[ctrlMapName]\n if (!ctrl[name]) {\n this.$message({ type: 'warning', message: '尚未支持此组件的UI编辑' })\n return\n }\n this.activeCtrl = ctrl[name]\n this.activeBrick = brick\n this.ctrlOptions = {}\n this.builderSchema[target] = this.builderSchema[target] || []\n this.builderSchema[target].push(cloneDeep(ctrl[name].default))\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl[name].builder)\n })\n this.key++\n this.ctrlKey++\n this.activeIndex = `${target}[${this.builderSchema[target].length - 1}]`\n this.activeTab = 'ctrl'\n },\n removeOne() {\n unset(this.builderSchema, this.activeIndex)\n this.builderSchema = cloneDeep(compactObject(this.builderSchema))\n this.activeIndex = ''\n this.ctrlOptions = {}\n this.ctrlSchema = {}\n this.key++\n this.ctrlKey++\n },\n clicklabel() {\n const p = this.activeIndex\n const m = p.match(this.activeIndexReg)\n if (m) {\n const ctrlOptions = cloneDeep(get(this.builderSchema, p))\n this.activeBrick = m[1]\n if (['normalButton', 'batchButton', 'rowButton'].indexOf(m[1]) > -1) {\n this.activeBrick = 'buttons'\n }\n let type = this.builderSchema[m[1]][parseInt(m[2])].type\n if (m[1] === 'headers' && type === undefined) {\n type = 'span'\n }\n const ctrl = this.ctrlMap[this.activeBrick][type]\n if (!ctrl) {\n console.log(this.activeBrick, type, m)\n this.$message({ type: 'warning', message: '尚未支持此组件的UI编辑' })\n return\n }\n this.ctrlOptions = ctrlOptions\n this.currentCtrlType = type\n this.ctrlSchema = cloneDeep({\n options: cloneDeep(ctrlFormDefaultOptions),\n formItems: cloneDeep(ctrl.builder)\n })\n this.ctrlKey++\n }\n },\n saveSchema() {\n const { filter, headers, rowButton, normalButton, batchButton } = this.currentBuilderSchema\n this.$http.request({\n method: 'POST',\n url: '/devtool/page_schema',\n data: {\n filter,\n headers,\n rowButton,\n normalButton,\n batchButton\n }\n }).then(({ data }) => {\n if (data) {\n this.$message({ type: 'success', message: '保存成功, 请刷新页面查看效果' })\n }\n })\n }\n }\n}\n</script>\n<style lang=\"scss\" scoped>\n.title {\n size: 2em;\n padding: 5px 20px;\n}\n.ctrl {\n padding: 5px 20px;\n .ctrl-btn {\n width: 100%;\n }\n}\n</style>\n","<template>\n <VIcon\n name=\"ra-set\"\n @click=\"show = !show\"\n />\n <el-drawer\n v-model=\"show\"\n title=\"页面设计\"\n class=\"my-drawer\"\n :direction=\"direction\"\n size=\"90%\"\n destroy-on-close\n append-to-body\n >\n <form-builder\n v-if=\"pageSchema.formItems !== undefined\"\n :schema=\"pageSchema\"\n />\n <table-builder\n v-if=\"pageSchema.headers !== undefined\"\n :schema=\"pageSchema\"\n />\n </el-drawer>\n</template>\n<script setup>\nimport FormBuilder from '../../devtool/formBuilder/index.vue'\nimport TableBuilder from '../../devtool/tableBuilder/index.vue'\nimport { useAppStore } from '../../../store'\nimport { useRoute } from 'vue-router'\n\nconst show = ref(false)\nconst key = ref(1)\nconst direction = 'rtl'\nconst route = useRoute()\nconst appStore = useAppStore()\nconst pageSchema = computed(() => appStore.pages[route.path])\n</script>\n","<template>\n <el-row ref=\"header\" class=\"navbar\" :style=\"navbarStyle\">\n <el-col :span=\"16\">\n <hamburger :is-active=\"sidebar.opened\" class=\"hamburger-container\" @toggleClick=\"toggleSideBar\" />\n <breadcrumb v-if=\"device !== 'mobile'\" class=\"breadcrumb-container\" />\n </el-col>\n <el-col :span=\"8\">\n <div class=\"right-content\">\n <div v-if=\"showPageJsonSchemaIcon\" class=\"right-item\">\n <PageEditor />\n </div>\n <div class=\"right-item-button\" style=\"padding: 0\">\n <v-button :buttons=\"nav\" />\n </div>\n <el-tooltip placement=\"bottom\" :content=\"isDark ? '切换为明亮模式' : '切换为暗黑模式'\">\n <div class=\"right-item theme-toggle\" role=\"button\" tabindex=\"0\" @click=\"toggleTheme\"\n @keydown.enter.prevent=\"toggleTheme\" @keydown.space.prevent=\"toggleTheme\">\n <el-icon>\n <component :is=\"isDark ? Moon : Sunny\" />\n </el-icon>\n </div>\n </el-tooltip>\n <el-dropdown class=\"right-item\" trigger=\"click\">\n <div class=\"user-info\">\n <el-avatar class=\"user-avatar\" :size=\"32\" :src=\"currentAvatar || undefined\" @error=\"handleAvatarError\">{{\n avatarFallback }}</el-avatar>\n <span class=\"user-name\">{{ nickname || name }}</span>\n </div>\n <template #dropdown>\n <el-dropdown-menu class=\"user-dropdown\">\n <el-dropdown-item icon=\"oms-icon-index\" @click=\"$router.push('/')\">首页</el-dropdown-item>\n <el-dropdown-item divided icon=\"el-icon-switch-button\" @click=\"logout\">退出登录</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n </div>\n </el-col>\n <el-drawer v-if=\"showJsonSchema\" :with-header=\"false\" size=\"50%\" />\n </el-row>\n</template>\n\n<script setup lang=\"ts\">\nimport Breadcrumb from './Breadcrumb/index.vue'\nimport Hamburger from './Hamburger/index.vue'\nimport PageEditor from './PageEditor.vue'\nimport { showEleByClassName, Cache, waterMarker } from '@okiss/utils'\nimport { VBtn as VButton } from '@okiss/vbtf'\nimport { useAppStore, useSettingsStore, useUserStore } from '../../../store'\nimport { useThemeMode } from '../../../composables/useThemeMode'\nimport { computed, ref, onMounted, watch } from 'vue'\nimport { Sunny, Moon } from '@element-plus/icons-vue'\n\nconst appStore = useAppStore()\nconst settingsStore = useSettingsStore()\nconst userStore = useUserStore()\n\nconst showExportPop = ref(false)\nconst showJsonSchema = ref(false)\nconst json = ref('')\nconst key = ref(0)\nconst defaultAvatar = computed(() => settingsStore.defaultAvatar)\nconst sidebar = computed(() => appStore.sidebar)\nconst device = computed(() => appStore.device)\nconst avatar = computed(() => userStore.avatar)\nconst name = computed(() => userStore.name)\nconst nickname = computed(() => userStore.nickname)\nconst nav = computed(() => (settingsStore as any).nav)\nconst setting = computed(() => settingsStore)\nconst user = computed(() => userStore)\nconst showPageJsonSchemaIcon = computed(() => settingsStore.showPageJsonSchema || false)\nconst { isDark, toggleTheme } = useThemeMode()\n\nconst navbarStyle = computed(() => {\n const envColor = setting.value.envColor?.[user.value.env]\n if (isDark.value) {\n return {\n background: 'linear-gradient(135deg, rgba(var(--el-color-primary-rgb, 0, 176, 116), 0.15) 0%, rgba(2, 6, 23, 0.95) 100%)',\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n color: 'var(--sidebar-text-color)'\n }\n }\n if (envColor) {\n return {\n background: `linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(243, 244, 248, 0.9) 60%, ${envColor} 100%)`,\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 1px 4px rgba(0, 0, 0, 0.05)',\n color: 'var(--sidebar-text-color)'\n }\n }\n return {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(243, 244, 248, 0.95) 70%, #ffffff 100%)',\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 1px 10px rgba(0, 0, 0, 0.03)',\n color: 'var(--sidebar-text-color)'\n }\n})\n\nonMounted(() => {\n showEleByClassName('el-submenu is-active')\n const noticeStr = getSetting('navBarNotice') || ''\n if (noticeStr.length > 0 && !getSetting('closeNavNotice') && showNotice(noticeStr)) {\n // @ts-ignore\n window?.App?.config?.globalProperties?.$notify({\n title: '提示',\n message: noticeStr,\n dangerouslyUseHTMLString: true,\n duration: 0,\n onClose: closeNavBarNotice\n })\n }\n if (setting.value.envColor?.[user.value.env]) {\n // @ts-ignore\n waterMarker({\n elRef: header.value.$el,\n waterMark: user.value.env,\n color: 'skyblue',\n size: '20'\n })\n }\n})\n\nconst header = ref()\nconst currentAvatar = ref('')\nconst avatarError = ref(false)\n\nwatch([avatar, defaultAvatar], () => {\n avatarError.value = false\n currentAvatar.value = avatar.value || defaultAvatar.value || ''\n}, { immediate: true })\n\nconst avatarFallback = computed(() => {\n const text = nickname.value || name.value || settingsStore.title || '用户'\n return text ? text.toString().trim().charAt(0).toUpperCase() : '用'\n})\nfunction toggleSideBar() { appStore.toggleSideBar() }\nasync function logout() {\n await userStore.logout()\n // @ts-ignore\n const route = window?.App?.config?.globalProperties?.$router?.currentRoute?.value\n location.reload(`${location.origin}/#/login?redirect=${route?.fullPath || '/'}`)\n}\nfunction getSetting(name: string): any { return (settingsStore as any)[name] }\nasync function closeNavBarNotice() {\n settingsStore.updateSettings({ closeNavNotice: true } as any)\n closeNotice(getSetting('navBarNotice'))\n}\nfunction showPopover() { showExportPop.value = true }\nfunction showNotice(text: string) {\n const key = 'dismiss:navbar_notice'\n if (!Cache.exist(key)) return true\n return Cache.get(key) !== text\n}\nfunction closeNotice(text: string) {\n const key = 'dismiss:navbar_notice'\n Cache.set(key, text)\n}\nfunction gotoMenuEdit() {\n // @ts-ignore\n const route = window?.App?.config?.globalProperties?.$router?.currentRoute?.value\n if (route?.meta?.pageId) {\n window.open(location.origin + location.pathname + '#/menu/' + route?.meta?.pageId)\n }\n}\n\nfunction handleAvatarError() {\n if (avatarError.value)\n return\n avatarError.value = true\n currentAvatar.value = ''\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.el-dropdown-link {\n cursor: pointer;\n color: #409eff;\n}\n\n.el-icon-arrow-down {\n font-size: 12px;\n}\n\n.navbar {\n display: flex;\n height: 50px;\n /*overflow: hidden;*/\n position: relative;\n background: var(--sidebar-bg, #fff);\n box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);\n color: var(--sidebar-text-color);\n\n .hamburger-container {\n line-height: 50px;\n height: 100%;\n float: left;\n cursor: pointer;\n transition: background 0.3s;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: var(--sidebar-hover-bg, rgba(0, 0, 0, 0.025));\n }\n }\n\n .breadcrumb-container {\n float: left;\n }\n}\n\n.notice-setting {\n left: 50%;\n top: 50%;\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.right-content {\n float: right;\n height: 100%;\n padding-right: 20px;\n color: inherit;\n display: flex;\n\n .icon {\n font-size: 18px;\n\n &:focus {\n outline: none;\n }\n }\n\n .right-item {\n padding: 0 12px;\n height: 100%;\n transition: all 0.3s;\n cursor: pointer;\n display: flex;\n align-items: center;\n\n &:hover {\n background: var(--sidebar-hover-bg, rgba(0, 0, 0, 0.025));\n }\n }\n\n .theme-toggle {\n justify-content: center;\n\n .el-icon {\n font-size: 18px;\n }\n }\n\n .right-item-button {\n height: 100%;\n transition: all 0.3s;\n cursor: pointer;\n display: flex;\n align-items: center;\n }\n\n .user-info {\n height: 50px;\n line-height: 50px;\n display: inline-flex;\n align-items: center;\n }\n\n .user-avatar {\n margin: 0 10px 0 0;\n color: #fff;\n background: var(--el-color-primary, #1890ff);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .user-name {\n vertical-align: middle;\n }\n}\n</style>\n","<template>\n <el-row ref=\"header\" class=\"navbar\" :style=\"navbarStyle\">\n <el-col :span=\"16\">\n <hamburger :is-active=\"sidebar.opened\" class=\"hamburger-container\" @toggleClick=\"toggleSideBar\" />\n <breadcrumb v-if=\"device !== 'mobile'\" class=\"breadcrumb-container\" />\n </el-col>\n <el-col :span=\"8\">\n <div class=\"right-content\">\n <div v-if=\"showPageJsonSchemaIcon\" class=\"right-item\">\n <PageEditor />\n </div>\n <div class=\"right-item-button\" style=\"padding: 0\">\n <v-button :buttons=\"nav\" />\n </div>\n <el-tooltip placement=\"bottom\" :content=\"isDark ? '切换为明亮模式' : '切换为暗黑模式'\">\n <div class=\"right-item theme-toggle\" role=\"button\" tabindex=\"0\" @click=\"toggleTheme\"\n @keydown.enter.prevent=\"toggleTheme\" @keydown.space.prevent=\"toggleTheme\">\n <el-icon>\n <component :is=\"isDark ? Moon : Sunny\" />\n </el-icon>\n </div>\n </el-tooltip>\n <el-dropdown class=\"right-item\" trigger=\"click\">\n <div class=\"user-info\">\n <el-avatar class=\"user-avatar\" :size=\"32\" :src=\"currentAvatar || undefined\" @error=\"handleAvatarError\">{{\n avatarFallback }}</el-avatar>\n <span class=\"user-name\">{{ nickname || name }}</span>\n </div>\n <template #dropdown>\n <el-dropdown-menu class=\"user-dropdown\">\n <el-dropdown-item icon=\"oms-icon-index\" @click=\"$router.push('/')\">首页</el-dropdown-item>\n <el-dropdown-item divided icon=\"el-icon-switch-button\" @click=\"logout\">退出登录</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n </div>\n </el-col>\n <el-drawer v-if=\"showJsonSchema\" :with-header=\"false\" size=\"50%\" />\n </el-row>\n</template>\n\n<script setup lang=\"ts\">\nimport Breadcrumb from './Breadcrumb/index.vue'\nimport Hamburger from './Hamburger/index.vue'\nimport PageEditor from './PageEditor.vue'\nimport { showEleByClassName, Cache, waterMarker } from '@okiss/utils'\nimport { VBtn as VButton } from '@okiss/vbtf'\nimport { useAppStore, useSettingsStore, useUserStore } from '../../../store'\nimport { useThemeMode } from '../../../composables/useThemeMode'\nimport { computed, ref, onMounted, watch } from 'vue'\nimport { Sunny, Moon } from '@element-plus/icons-vue'\n\nconst appStore = useAppStore()\nconst settingsStore = useSettingsStore()\nconst userStore = useUserStore()\n\nconst showExportPop = ref(false)\nconst showJsonSchema = ref(false)\nconst json = ref('')\nconst key = ref(0)\nconst defaultAvatar = computed(() => settingsStore.defaultAvatar)\nconst sidebar = computed(() => appStore.sidebar)\nconst device = computed(() => appStore.device)\nconst avatar = computed(() => userStore.avatar)\nconst name = computed(() => userStore.name)\nconst nickname = computed(() => userStore.nickname)\nconst nav = computed(() => (settingsStore as any).nav)\nconst setting = computed(() => settingsStore)\nconst user = computed(() => userStore)\nconst showPageJsonSchemaIcon = computed(() => settingsStore.showPageJsonSchema || false)\nconst { isDark, toggleTheme } = useThemeMode()\n\nconst navbarStyle = computed(() => {\n const envColor = setting.value.envColor?.[user.value.env]\n if (isDark.value) {\n return {\n background: 'linear-gradient(135deg, rgba(var(--el-color-primary-rgb, 0, 176, 116), 0.15) 0%, rgba(2, 6, 23, 0.95) 100%)',\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n color: 'var(--sidebar-text-color)'\n }\n }\n if (envColor) {\n return {\n background: `linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(243, 244, 248, 0.9) 60%, ${envColor} 100%)`,\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 1px 4px rgba(0, 0, 0, 0.05)',\n color: 'var(--sidebar-text-color)'\n }\n }\n return {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(243, 244, 248, 0.95) 70%, #ffffff 100%)',\n borderBottom: '1px solid var(--border-color)',\n boxShadow: '0 1px 10px rgba(0, 0, 0, 0.03)',\n color: 'var(--sidebar-text-color)'\n }\n})\n\nonMounted(() => {\n showEleByClassName('el-submenu is-active')\n const noticeStr = getSetting('navBarNotice') || ''\n if (noticeStr.length > 0 && !getSetting('closeNavNotice') && showNotice(noticeStr)) {\n // @ts-ignore\n window?.App?.config?.globalProperties?.$notify({\n title: '提示',\n message: noticeStr,\n dangerouslyUseHTMLString: true,\n duration: 0,\n onClose: closeNavBarNotice\n })\n }\n if (setting.value.envColor?.[user.value.env]) {\n // @ts-ignore\n waterMarker({\n elRef: header.value.$el,\n waterMark: user.value.env,\n color: 'skyblue',\n size: '20'\n })\n }\n})\n\nconst header = ref()\nconst currentAvatar = ref('')\nconst avatarError = ref(false)\n\nwatch([avatar, defaultAvatar], () => {\n avatarError.value = false\n currentAvatar.value = avatar.value || defaultAvatar.value || ''\n}, { immediate: true })\n\nconst avatarFallback = computed(() => {\n const text = nickname.value || name.value || settingsStore.title || '用户'\n return text ? text.toString().trim().charAt(0).toUpperCase() : '用'\n})\nfunction toggleSideBar() { appStore.toggleSideBar() }\nasync function logout() {\n await userStore.logout()\n // @ts-ignore\n const route = window?.App?.config?.globalProperties?.$router?.currentRoute?.value\n location.reload(`${location.origin}/#/login?redirect=${route?.fullPath || '/'}`)\n}\nfunction getSetting(name: string): any { return (settingsStore as any)[name] }\nasync function closeNavBarNotice() {\n settingsStore.updateSettings({ closeNavNotice: true } as any)\n closeNotice(getSetting('navBarNotice'))\n}\nfunction showPopover() { showExportPop.value = true }\nfunction showNotice(text: string) {\n const key = 'dismiss:navbar_notice'\n if (!Cache.exist(key)) return true\n return Cache.get(key) !== text\n}\nfunction closeNotice(text: string) {\n const key = 'dismiss:navbar_notice'\n Cache.set(key, text)\n}\nfunction gotoMenuEdit() {\n // @ts-ignore\n const route = window?.App?.config?.globalProperties?.$router?.currentRoute?.value\n if (route?.meta?.pageId) {\n window.open(location.origin + location.pathname + '#/menu/' + route?.meta?.pageId)\n }\n}\n\nfunction handleAvatarError() {\n if (avatarError.value)\n return\n avatarError.value = true\n currentAvatar.value = ''\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.el-dropdown-link {\n cursor: pointer;\n color: #409eff;\n}\n\n.el-icon-arrow-down {\n font-size: 12px;\n}\n\n.navbar {\n display: flex;\n height: 50px;\n /*overflow: hidden;*/\n position: relative;\n background: var(--sidebar-bg, #fff);\n box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);\n color: var(--sidebar-text-color);\n\n .hamburger-container {\n line-height: 50px;\n height: 100%;\n float: left;\n cursor: pointer;\n transition: background 0.3s;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: var(--sidebar-hover-bg, rgba(0, 0, 0, 0.025));\n }\n }\n\n .breadcrumb-container {\n float: left;\n }\n}\n\n.notice-setting {\n left: 50%;\n top: 50%;\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.right-content {\n float: right;\n height: 100%;\n padding-right: 20px;\n color: inherit;\n display: flex;\n\n .icon {\n font-size: 18px;\n\n &:focus {\n outline: none;\n }\n }\n\n .right-item {\n padding: 0 12px;\n height: 100%;\n transition: all 0.3s;\n cursor: pointer;\n display: flex;\n align-items: center;\n\n &:hover {\n background: var(--sidebar-hover-bg, rgba(0, 0, 0, 0.025));\n }\n }\n\n .theme-toggle {\n justify-content: center;\n\n .el-icon {\n font-size: 18px;\n }\n }\n\n .right-item-button {\n height: 100%;\n transition: all 0.3s;\n cursor: pointer;\n display: flex;\n align-items: center;\n }\n\n .user-info {\n height: 50px;\n line-height: 50px;\n display: inline-flex;\n align-items: center;\n }\n\n .user-avatar {\n margin: 0 10px 0 0;\n color: #fff;\n background: var(--el-color-primary, #1890ff);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .user-name {\n vertical-align: middle;\n }\n}\n</style>\n","<template>\n <div class=\"sidebar-logo-container\" :class=\"{ collapse: collapse }\">\n <transition name=\"sidebarLogoFade\">\n <router-link v-if=\"collapse\" key=\"collapse\" class=\"sidebar-logo-link\" to=\"/\">\n <el-image v-if=\"showLogoImage\" :src=\"logo || ''\" fit=\"contain\" class=\"sidebar-logo\" @error=\"handleLogoError\">\n <template #error>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n </el-image>\n <template v-else>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n <div class=\"sidebar-subtitle\">系统</div>\n </router-link>\n <router-link v-else key=\"expand\" class=\"sidebar-logo-link\" to=\"/\">\n <el-image v-if=\"showLogoImage\" :src=\"logo || ''\" fit=\"contain\" class=\"sidebar-logo\" @error=\"handleLogoError\">\n <template #error>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n </el-image>\n <template v-else>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n <h1 class=\"sidebar-title\">{{ title }}</h1>\n </router-link>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSettingsStore } from '../../../../store'\nimport { computed, ref, watch } from 'vue'\n\ndefineProps<{ collapse: boolean }>()\nconst settings = useSettingsStore()\nconst title = computed(() => settings.title as any)\nconst logo = computed(() => settings.logo as any)\nconst logoError = ref(false)\n\nconst showLogoImage = computed(() => !!logo.value && !logoError.value)\nconst logoFallback = computed(() => {\n const text = title.value || 'OMS'\n return text ? text.toString().trim().charAt(0).toUpperCase() : 'O'\n})\n\nwatch(logo, () => {\n logoError.value = false\n}, { immediate: true })\n\nfunction handleLogoError() {\n logoError.value = true\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.sidebarLogoFade-enter-active {\n transition: opacity 1.5s;\n}\n\n.sidebarLogoFade-enter,\n.sidebarLogoFade-leave-to {\n opacity: 0;\n}\n\n.sidebar-logo-container {\n position: relative;\n width: 100%;\n height: 50px;\n line-height: 50px;\n background: var(--sidebar-bg, #ffffff);\n text-align: center;\n color: var(--sidebar-logo-text-color, #00b074);\n overflow: hidden;\n\n & .sidebar-logo-link {\n height: 100%;\n width: 100%;\n\n & .sidebar-logo {\n width: 32px;\n height: 32px;\n vertical-align: middle;\n margin-right: 12px;\n }\n\n & .sidebar-title {\n display: inline-block;\n margin: 0;\n color: var(--sidebar-logo-text-color, #00b074);\n font-weight: 700;\n line-height: 50px;\n font-size: 20px;\n font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;\n vertical-align: middle;\n }\n\n & .sidebar-logo-fallback {\n width: 32px;\n height: 32px;\n line-height: 32px;\n border-radius: 6px;\n background: rgba(var(--el-color-primary-rgb, 0, 176, 116), 0.1);\n color: var(--el-color-primary, #00b074);\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n }\n\n & .sidebar-subtitle {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.78);\n }\n }\n\n &.collapse {\n .sidebar-logo {\n margin-right: 0px;\n }\n\n .sidebar-logo-fallback {\n margin-right: 0px;\n }\n }\n}\n</style>\n","<template>\n <div class=\"sidebar-logo-container\" :class=\"{ collapse: collapse }\">\n <transition name=\"sidebarLogoFade\">\n <router-link v-if=\"collapse\" key=\"collapse\" class=\"sidebar-logo-link\" to=\"/\">\n <el-image v-if=\"showLogoImage\" :src=\"logo || ''\" fit=\"contain\" class=\"sidebar-logo\" @error=\"handleLogoError\">\n <template #error>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n </el-image>\n <template v-else>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n <div class=\"sidebar-subtitle\">系统</div>\n </router-link>\n <router-link v-else key=\"expand\" class=\"sidebar-logo-link\" to=\"/\">\n <el-image v-if=\"showLogoImage\" :src=\"logo || ''\" fit=\"contain\" class=\"sidebar-logo\" @error=\"handleLogoError\">\n <template #error>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n </el-image>\n <template v-else>\n <div class=\"sidebar-logo-fallback\">{{ logoFallback }}</div>\n </template>\n <h1 class=\"sidebar-title\">{{ title }}</h1>\n </router-link>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSettingsStore } from '../../../../store'\nimport { computed, ref, watch } from 'vue'\n\ndefineProps<{ collapse: boolean }>()\nconst settings = useSettingsStore()\nconst title = computed(() => settings.title as any)\nconst logo = computed(() => settings.logo as any)\nconst logoError = ref(false)\n\nconst showLogoImage = computed(() => !!logo.value && !logoError.value)\nconst logoFallback = computed(() => {\n const text = title.value || 'OMS'\n return text ? text.toString().trim().charAt(0).toUpperCase() : 'O'\n})\n\nwatch(logo, () => {\n logoError.value = false\n}, { immediate: true })\n\nfunction handleLogoError() {\n logoError.value = true\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.sidebarLogoFade-enter-active {\n transition: opacity 1.5s;\n}\n\n.sidebarLogoFade-enter,\n.sidebarLogoFade-leave-to {\n opacity: 0;\n}\n\n.sidebar-logo-container {\n position: relative;\n width: 100%;\n height: 50px;\n line-height: 50px;\n background: var(--sidebar-bg, #ffffff);\n text-align: center;\n color: var(--sidebar-logo-text-color, #00b074);\n overflow: hidden;\n\n & .sidebar-logo-link {\n height: 100%;\n width: 100%;\n\n & .sidebar-logo {\n width: 32px;\n height: 32px;\n vertical-align: middle;\n margin-right: 12px;\n }\n\n & .sidebar-title {\n display: inline-block;\n margin: 0;\n color: var(--sidebar-logo-text-color, #00b074);\n font-weight: 700;\n line-height: 50px;\n font-size: 20px;\n font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;\n vertical-align: middle;\n }\n\n & .sidebar-logo-fallback {\n width: 32px;\n height: 32px;\n line-height: 32px;\n border-radius: 6px;\n background: rgba(var(--el-color-primary-rgb, 0, 176, 116), 0.1);\n color: var(--el-color-primary, #00b074);\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n }\n\n & .sidebar-subtitle {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.78);\n }\n }\n\n &.collapse {\n .sidebar-logo {\n margin-right: 0px;\n }\n\n .sidebar-logo-fallback {\n margin-right: 0px;\n }\n }\n}\n</style>\n","<template>\n <component\n :is=\"compType(to)\"\n v-bind=\"linkProps(to)\"\n >\n <slot />\n </component>\n</template>\n\n<script>\nimport { isExternal } from '@okiss/utils'\n\nexport default {\n props: {\n to: {\n type: String,\n required: true\n },\n newTab: {\n type: Boolean,\n required: false\n }\n },\n methods: {\n compType(url) {\n if (isExternal(url) || this.newTab) {\n return 'a'\n } else {\n return 'router-link'\n }\n },\n linkProps(url) {\n if (isExternal(url)) {\n return {\n is: 'a',\n href: url,\n target: '_blank',\n rel: 'noopener'\n }\n }\n if (this.newTab) {\n const routeData = this.$router.resolve(url)\n return {\n is: 'a',\n href: routeData.href,\n target: '_blank',\n rel: 'noopener'\n }\n }\n return {\n is: 'router-link',\n to: url\n }\n }\n }\n}\n</script>\n","export default {\n computed: {\n // @ts-ignore\n device() {\n // Access device from Pinia state without importing\n // @ts-ignore\n return this.$pinia?.state?.value?.app?.device || 'desktop'\n }\n },\n mounted() {\n // In order to fix the click on menu on the ios device will trigger the mouseleave bug\n // https://github.com/PanJiaChen/vue-element-admin/issues/1135\n // @ts-ignore\n this.fixBugIniOS()\n },\n methods: {\n fixBugIniOS() {\n // @ts-ignore\n const $subMenu = this.$refs.subMenu\n if ($subMenu) {\n const handleMouseleave = $subMenu.handleMouseleave\n // @ts-ignore\n $subMenu.handleMouseleave = e => {\n // @ts-ignore\n if (this.device === 'mobile') {\n return\n }\n handleMouseleave(e)\n }\n }\n }\n }\n}\n","<template>\n <VIcon :name=\"meta.icon || 'ra-all'\" />\n <span class=\"menu-content\">{{ meta.title }}</span>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps({\n meta: {\n type: Object,\n default: () => {\n return {\n icon: '',\n title: ''\n }\n }\n }\n})\n</script>\n","<template>\n <VIcon :name=\"meta.icon || 'ra-all'\" />\n <span class=\"menu-content\">{{ meta.title }}</span>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps({\n meta: {\n type: Object,\n default: () => {\n return {\n icon: '',\n title: ''\n }\n }\n }\n})\n</script>\n","<template>\n <div\n v-if=\"item.hidden !== false\"\n class=\"menu-wrapper\"\n >\n <!-- 没有子菜单 -->\n <template v-if=\"item.meta && item.meta.menuType === 2\">\n <el-tooltip\n :disabled=\"!isCollapse\"\n effect=\"dark\"\n placement=\"right\"\n :content=\"item.meta?.title\"\n >\n <app-link\n v-if=\"item.meta\"\n :to=\"to\"\n :new-tab=\"item.meta.newTab\"\n >\n <el-menu-item\n :index=\"to\"\n :class=\"{ 'submenu-title-noDropdown': !isNest }\"\n @click=\"itemClick\"\n >\n <menu-content :meta=\"item.meta\" />\n </el-menu-item>\n </app-link>\n </el-tooltip>\n </template>\n <!-- 有子菜单 -->\n <el-tooltip\n v-else-if=\"item.meta && item.meta.menuType === 1\"\n :disabled=\"!isCollapse\"\n effect=\"dark\"\n placement=\"right\"\n :content=\"item.meta?.title\"\n >\n <el-sub-menu\n ref=\"subMenu\"\n :index=\"to\"\n :class=\"{ 'submenu-title-noDropdown': !isNest }\"\n >\n <template #title>\n <app-link\n v-if=\"item.redirect && item.redirect !== '#'\"\n :to=\"to\"\n >\n <menu-content :meta=\"item.meta\" />\n </app-link>\n <menu-content\n v-else\n :meta=\"item.meta\"\n />\n </template>\n <sidebar-item\n v-for=\"child in item.children\"\n :key=\"child.path\"\n :is-nest=\"true\"\n :item=\"child\"\n :to=\"getTo(child)\"\n class=\"nest-menu\"\n />\n </el-sub-menu>\n </el-tooltip>\n </div>\n</template>\n\n<script>\nimport AppLink from './Link.vue'\nimport FixiOSBug from './FixiOSBug'\nimport MenuContent from './MenuContent.vue'\nimport { Cache } from '@okiss/utils'\n\nexport default {\n name: 'SidebarItem',\n components: {\n AppLink,\n MenuContent\n },\n mixins: [FixiOSBug],\n props: {\n // route object\n item: {\n type: Object,\n required: true\n },\n isNest: {\n type: Boolean,\n default: false\n },\n to: {\n type: String,\n default: ''\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n methods: {\n itemClick() {\n Cache.remove('table_filter:' + this.$props.to)\n },\n getTo(child) {\n try {\n const to = this.$router.resolve(child.redirect ? child.redirect : child)\n return to.fullPath\n } catch (e) {\n console.error('路由解析错误')\n return '/'\n }\n }\n }\n}\n</script>\n","<template>\n <el-select v-model=\"selected\" filterable placeholder=\"搜索菜单...\" class=\"search-menu\" @change=\"onselected\">\n <template v-for=\"group in filterRoutes\" :key=\"group.path\">\n <template v-if=\"group.children !== undefined\">\n <el-option-group v-if=\"group.meta.menuType !== 0\" :key=\"group.path + '-'\" :label=\"group.meta.title\">\n <template v-for=\"(item, index) in group.children\" :key=\"item.path\">\n <el-option v-if=\"group.meta.menuType !== 0\"\n :label=\"(index === (group.children.length - 1) ? '└─' : '├─') + item.meta.title\"\n :value=\"getJumpPath(item)\" />\n </template>\n </el-option-group>\n </template>\n <template v-else>\n <el-option :label=\"'' + group.meta.title\" :value=\"getJumpPath(group)\" />\n </template>\n </template>\n </el-select>\n</template>\n<script setup lang=\"ts\">\nimport { cloneDeep } from 'lodash'\nimport { useUserStore } from '../../../../store'\nimport { useRouter } from 'vue-router'\nconst userStore = useUserStore()\n\nfunction filterHidden(arr: any[]) {\n return arr.filter((each: any) => {\n if (each.meta?.menuType === 0) {\n return false\n }\n if (each.children) {\n each.children = filterHidden(each.children)\n if (each.children.length === 0) {\n delete each.children\n }\n }\n return true\n })\n}\n\nconst selected = ref('')\nconst remoteRouter = computed(() => userStore.remoteRouter)\nconst router = useRouter()\n\nconst filterRoutes = computed(() => {\n let routes: any[] = []\n remoteRouter.value.forEach(item => { routes = routes.concat(cloneDeep(item.routes)) })\n return filterHidden(routes)\n})\n\nfunction getJumpPath(route: any) {\n let _route = route\n if (route.meta.menuType === 1 && route.children && route.children.length > 0) {\n for (let i = 0; i < route.children.length; i++) {\n if (route.children[i].path.indexOf('/:') === -1) {\n _route = route.children[i]\n break\n }\n }\n }\n return router.resolve(_route.redirect ? _route.redirect : _route).fullPath\n}\nfunction onselected(to: string) { router.push(to); selected.value = '' }\n</script>\n<style lang=\"scss\" scoped>\n.search-menu {\n width: 100%;\n padding: 10px 20px;\n\n ::v-deep(.el-select__wrapper) {\n background-color: transparent;\n border: 1.5px solid var(--border-color);\n border-radius: 12px;\n box-shadow: none;\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color);\n background-color: var(--sidebar-hover-bg);\n }\n }\n\n //::v-deep(.el-input__wrapper:hover) {\n // box-shadow: none;\n //}\n //::v-deep(.el-input__wrapper:focus) {\n // box-shadow: none;\n //}\n //::v-deep(.is-focus) {\n // border: none;\n // box-shadow: none;\n //}\n}\n\n.filter-tree {\n max-height: 500px;\n}\n</style>\n","<template>\n <el-select v-model=\"selected\" filterable placeholder=\"搜索菜单...\" class=\"search-menu\" @change=\"onselected\">\n <template v-for=\"group in filterRoutes\" :key=\"group.path\">\n <template v-if=\"group.children !== undefined\">\n <el-option-group v-if=\"group.meta.menuType !== 0\" :key=\"group.path + '-'\" :label=\"group.meta.title\">\n <template v-for=\"(item, index) in group.children\" :key=\"item.path\">\n <el-option v-if=\"group.meta.menuType !== 0\"\n :label=\"(index === (group.children.length - 1) ? '└─' : '├─') + item.meta.title\"\n :value=\"getJumpPath(item)\" />\n </template>\n </el-option-group>\n </template>\n <template v-else>\n <el-option :label=\"'' + group.meta.title\" :value=\"getJumpPath(group)\" />\n </template>\n </template>\n </el-select>\n</template>\n<script setup lang=\"ts\">\nimport { cloneDeep } from 'lodash'\nimport { useUserStore } from '../../../../store'\nimport { useRouter } from 'vue-router'\nconst userStore = useUserStore()\n\nfunction filterHidden(arr: any[]) {\n return arr.filter((each: any) => {\n if (each.meta?.menuType === 0) {\n return false\n }\n if (each.children) {\n each.children = filterHidden(each.children)\n if (each.children.length === 0) {\n delete each.children\n }\n }\n return true\n })\n}\n\nconst selected = ref('')\nconst remoteRouter = computed(() => userStore.remoteRouter)\nconst router = useRouter()\n\nconst filterRoutes = computed(() => {\n let routes: any[] = []\n remoteRouter.value.forEach(item => { routes = routes.concat(cloneDeep(item.routes)) })\n return filterHidden(routes)\n})\n\nfunction getJumpPath(route: any) {\n let _route = route\n if (route.meta.menuType === 1 && route.children && route.children.length > 0) {\n for (let i = 0; i < route.children.length; i++) {\n if (route.children[i].path.indexOf('/:') === -1) {\n _route = route.children[i]\n break\n }\n }\n }\n return router.resolve(_route.redirect ? _route.redirect : _route).fullPath\n}\nfunction onselected(to: string) { router.push(to); selected.value = '' }\n</script>\n<style lang=\"scss\" scoped>\n.search-menu {\n width: 100%;\n padding: 10px 20px;\n\n ::v-deep(.el-select__wrapper) {\n background-color: transparent;\n border: 1.5px solid var(--border-color);\n border-radius: 12px;\n box-shadow: none;\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color);\n background-color: var(--sidebar-hover-bg);\n }\n }\n\n //::v-deep(.el-input__wrapper:hover) {\n // box-shadow: none;\n //}\n //::v-deep(.el-input__wrapper:focus) {\n // box-shadow: none;\n //}\n //::v-deep(.is-focus) {\n // border: none;\n // box-shadow: none;\n //}\n}\n\n.filter-tree {\n max-height: 500px;\n}\n</style>\n","<template>\n <div :class=\"{ 'has-logo': showLogo }\">\n <logo\n v-if=\"showLogo\"\n :collapse=\"isCollapse\"\n />\n <el-scrollbar wrap-class=\"scrollbar-wrapper\">\n <search-menu v-if=\"!isCollapse\" />\n <el-menu\n :default-active=\"activeMenu\"\n :collapse=\"isCollapse\"\n :unique-opened=\"false\"\n :collapse-transition=\"false\"\n mode=\"vertical\"\n >\n <template\n v-for=\"(item, index) in routes\"\n :key=\"index + '-module'\"\n >\n <!-- <div v-if=\"item.routes.length > 0 && item.label\" class=\"menu-section\">{{ item.label }}</div>-->\n <sidebar-item\n v-for=\"route in filterRoute(item.routes)\"\n :key=\"route.path\"\n :item=\"route\"\n :to=\"$router.resolve(route.redirect ? route.redirect : route).fullPath\"\n :is-collapse=\"isCollapse\"\n />\n </template>\n </el-menu>\n </el-scrollbar>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Logo from './Logo.vue'\nimport SidebarItem from './SidebarItem.vue'\nimport SearchMenu from './SearchMenu.vue'\nimport { cloneDeep } from 'lodash'\nimport { MenuType } from '../../../../types'\nimport { showEleByClassName } from '@okiss/utils'\nimport { useAppStore, useUserStore, useSettingsStore } from '../../../../store'\nimport { useRouter, useRoute } from 'vue-router'\n\nconst appStore = useAppStore()\nconst userStore = useUserStore()\nconst settingsStore = useSettingsStore()\n\nconst sidebar = computed(() => appStore.sidebar)\nconst remoteRouter = computed(() => userStore.remoteRouter)\nconst customRouter = computed(() => userStore.customRouter)\n\nconst router = useRouter()\nconst route = useRoute()\n\nconst routes = computed(() => {\n let localRoutes: any[] = []\n router.options.routes.concat(customRouter.value || []).forEach(item => {\n if (item.path === '/') {\n localRoutes = localRoutes.concat(item.children || [])\n } else {\n localRoutes.push(item)\n }\n })\n return cloneDeep([\n { label: '', routes: localRoutes },\n ...remoteRouter.value\n ])\n})\n\nconst activeMenu = computed(() => {\n const m = route.matched\n for (let i = m.length - 1; i >= 0; i--) {\n const tmp = m[i]\n if (tmp.meta.menuType === MenuType.menu) {\n showActive()\n return router.resolve(tmp.redirect ? tmp.redirect : tmp).fullPath\n }\n }\n return ''\n})\n\nconst showLogo = computed(() => settingsStore.sidebarLogo)\nconst isCollapse = computed(() => !sidebar.value.opened)\n\nonMounted(() => showActive())\nfunction showActive() { showEleByClassName('is-active', 200) }\nfunction filterRoute(arr: any[]) {\n return arr.filter(item => [MenuType.dir, MenuType.menu].indexOf(item.meta.menuType) !== -1)\n .map(item => {\n item = Object.assign({}, item)\n if (item.children) item.children = filterRoute(item.children)\n return item\n })\n}\n</script>\n<style scoped>\n::v-deep(.el-scrollbar__wrap) {\n overflow: scroll;\n}\n\n.menu-section {\n height: 30px;\n font-size: 14px;\n display: table-cell;\n vertical-align: bottom;\n padding-left: 20px;\n color: #97a8be;\n padding-top: 5px;\n}\n</style>\n","<template>\n <div :class=\"{ 'has-logo': showLogo }\">\n <logo\n v-if=\"showLogo\"\n :collapse=\"isCollapse\"\n />\n <el-scrollbar wrap-class=\"scrollbar-wrapper\">\n <search-menu v-if=\"!isCollapse\" />\n <el-menu\n :default-active=\"activeMenu\"\n :collapse=\"isCollapse\"\n :unique-opened=\"false\"\n :collapse-transition=\"false\"\n mode=\"vertical\"\n >\n <template\n v-for=\"(item, index) in routes\"\n :key=\"index + '-module'\"\n >\n <!-- <div v-if=\"item.routes.length > 0 && item.label\" class=\"menu-section\">{{ item.label }}</div>-->\n <sidebar-item\n v-for=\"route in filterRoute(item.routes)\"\n :key=\"route.path\"\n :item=\"route\"\n :to=\"$router.resolve(route.redirect ? route.redirect : route).fullPath\"\n :is-collapse=\"isCollapse\"\n />\n </template>\n </el-menu>\n </el-scrollbar>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Logo from './Logo.vue'\nimport SidebarItem from './SidebarItem.vue'\nimport SearchMenu from './SearchMenu.vue'\nimport { cloneDeep } from 'lodash'\nimport { MenuType } from '../../../../types'\nimport { showEleByClassName } from '@okiss/utils'\nimport { useAppStore, useUserStore, useSettingsStore } from '../../../../store'\nimport { useRouter, useRoute } from 'vue-router'\n\nconst appStore = useAppStore()\nconst userStore = useUserStore()\nconst settingsStore = useSettingsStore()\n\nconst sidebar = computed(() => appStore.sidebar)\nconst remoteRouter = computed(() => userStore.remoteRouter)\nconst customRouter = computed(() => userStore.customRouter)\n\nconst router = useRouter()\nconst route = useRoute()\n\nconst routes = computed(() => {\n let localRoutes: any[] = []\n router.options.routes.concat(customRouter.value || []).forEach(item => {\n if (item.path === '/') {\n localRoutes = localRoutes.concat(item.children || [])\n } else {\n localRoutes.push(item)\n }\n })\n return cloneDeep([\n { label: '', routes: localRoutes },\n ...remoteRouter.value\n ])\n})\n\nconst activeMenu = computed(() => {\n const m = route.matched\n for (let i = m.length - 1; i >= 0; i--) {\n const tmp = m[i]\n if (tmp.meta.menuType === MenuType.menu) {\n showActive()\n return router.resolve(tmp.redirect ? tmp.redirect : tmp).fullPath\n }\n }\n return ''\n})\n\nconst showLogo = computed(() => settingsStore.sidebarLogo)\nconst isCollapse = computed(() => !sidebar.value.opened)\n\nonMounted(() => showActive())\nfunction showActive() { showEleByClassName('is-active', 200) }\nfunction filterRoute(arr: any[]) {\n return arr.filter(item => [MenuType.dir, MenuType.menu].indexOf(item.meta.menuType) !== -1)\n .map(item => {\n item = Object.assign({}, item)\n if (item.children) item.children = filterRoute(item.children)\n return item\n })\n}\n</script>\n<style scoped>\n::v-deep(.el-scrollbar__wrap) {\n overflow: scroll;\n}\n\n.menu-section {\n height: 30px;\n font-size: 14px;\n display: table-cell;\n vertical-align: bottom;\n padding-left: 20px;\n color: #97a8be;\n padding-top: 5px;\n}\n</style>\n","<template>\n <section class=\"app-main\">\n <router-view :key=\"$route.fullPath + key\" />\n <el-backtop :bottom=\"50\" />\n </section>\n</template>\n\n<script setup>\nimport { useRoute, onBeforeRouteLeave } from 'vue-router'\nconst route = useRoute()\nconst include = []\nconst key = ref(0)\nonBeforeRouteLeave(() => {\n if (route.meta?.keepAlive) {\n !!include.indexOf(route.name) && include.push(route.name)\n }\n key.value++\n})\n</script>\n\n<style scoped>\n.app-main {\n /*50 = navbar */\n min-height: calc(100vh - 50px);\n width: 100%;\n position: relative;\n overflow: hidden;\n padding: 20px;\n}\n\n.fixed-header + .app-main {\n padding-top: 50px;\n}\n</style>\n","<template>\n <div :class=\"classObj\" class=\"app-wrapper\">\n <div v-if=\"device === 'mobile' && sidebar.opened\" class=\"drawer-bg\" @click=\"handleClickOutside\" />\n <Sidebar class=\"sidebar-container\" />\n <div class=\"main-container\">\n <div :class=\"{ 'fixed-header': fixedHeader }\">\n <Navbar />\n </div>\n <AppMain />\n </div>\n </div>\n</template>\n\n<script setup>\nimport { Navbar, Sidebar, AppMain } from './components'\nimport { useEventListener } from '@vueuse/core'\nimport { useAppStore, useSettingsStore } from '../../store'\nimport { useRoute } from 'vue-router'\nimport { watch } from 'vue'\n\nconst { body } = document\nconst WIDTH = 992 // refer to Bootstrap's responsive design\n\nconst appStore = useAppStore()\nconst settingsStore = useSettingsStore()\nconst route = useRoute()\n\nconst sidebar = computed(() => appStore.sidebar)\nconst device = computed(() => appStore.device)\nconst fixedHeader = computed(() => settingsStore.fixedHeader)\n\nconst classObj = computed(() => {\n return {\n hideSidebar: !sidebar.value.opened,\n openSidebar: sidebar.value.opened,\n withoutAnimation: sidebar.value.withoutAnimation,\n mobile: device.value === 'mobile'\n }\n})\n\nconst isMobile = () => {\n const rect = body.getBoundingClientRect()\n return rect.width - 1 < WIDTH\n}\n\nconst resizeHandler = () => {\n if (!document.hidden) {\n const ismobile = isMobile()\n appStore.toggleDevice(ismobile ? 'mobile' : 'desktop')\n if (ismobile) appStore.closeSideBar({ withoutAnimation: true })\n }\n}\n\nresizeHandler()\n\nuseEventListener(window, 'resize', () => resizeHandler())\n\nwatch(route, () => {\n if (device.value === 'mobile' && sidebar.value.opened) {\n appStore.closeSideBar({ withoutAnimation: false })\n }\n})\n\nconst handleClickOutside = () => appStore.closeSideBar({ withoutAnimation: false })\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"../../styles/mixin\" as *;\n@use \"../../styles/variables\" as *;\n\n.app-wrapper {\n @include clearfix;\n\n &.mobile.openSidebar {\n position: fixed;\n top: 0;\n }\n}\n\n.drawer-bg {\n background: #000;\n opacity: 0.3;\n width: 100%;\n top: 0;\n height: 100%;\n position: fixed;\n z-index: 999;\n}\n\n.fixed-header {\n position: fixed;\n top: 0;\n right: 0;\n z-index: 9;\n width: calc(100% - #{$sideBarWidth});\n transition: width 0.28s;\n}\n\n.hideSidebar .fixed-header {\n width: calc(100% - 54px);\n}\n\n.mobile .fixed-header {\n width: 100%;\n}\n</style>\n","import type { RouteRecordRaw } from 'vue-router'\n\nconst SUPER_ROLE = 'root'\n\nconst splitRoles = (roleValue: string | undefined): string[] => {\n if (!roleValue) {\n return []\n }\n return roleValue\n .split(',')\n .map(item => item.trim())\n .filter(item => !!item)\n}\n\nconst getRouteRoles = (route: RouteRecordRaw): string[] => {\n const directRole = typeof (route as any).role === 'string' ? (route as any).role : ''\n const metaRole = route.meta && typeof (route.meta as any).role === 'string' ? (route.meta as any).role : ''\n const roles = [...splitRoles(directRole), ...splitRoles(metaRole)]\n if (!roles.length && route.children && route.children.length) {\n return []\n }\n return Array.from(new Set(roles))\n}\n\nconst cloneRoute = (route: RouteRecordRaw): RouteRecordRaw => {\n const cloned: RouteRecordRaw = { ...route }\n if (route.meta) {\n cloned.meta = { ...route.meta }\n }\n if (route.children && route.children.length) {\n cloned.children = route.children.map(item => cloneRoute(item))\n }\n return cloned\n}\n\nconst hasPermission = (routeRoles: string[], userRoles: string[]): boolean => {\n if (!routeRoles.length) {\n return true\n }\n if (!userRoles.length) {\n return false\n }\n return routeRoles.some(role => userRoles.includes(role))\n}\n\nexport const filterRoutesByRole = (routes: RouteRecordRaw[] = [], userRoles: string[]): RouteRecordRaw[] => {\n console.log(\"routes\", routes, userRoles )\n if (userRoles.includes(SUPER_ROLE)) {\n return routes.map(route => cloneRoute(route))\n }\n return routes.reduce<RouteRecordRaw[]>((acc, route) => {\n console.log(acc, route)\n const routeRoles = getRouteRoles(route)\n if (!hasPermission(routeRoles, userRoles)) {\n return acc\n }\n const cloned: RouteRecordRaw = { ...route }\n if (route.meta) {\n cloned.meta = { ...route.meta }\n }\n if (route.children && route.children.length) {\n const children = filterRoutesByRole(route.children, userRoles)\n if (!children.length) {\n // 如果子路由全部被过滤,父路由不再保留,避免注册空壳路由阻挡后续权限变更时的注册\n return acc\n }\n cloned.children = children\n }\n acc.push(cloned)\n return acc\n }, [])\n}\n","const decodeWithAtob = (input: string): string => {\n const binary = (globalThis.atob as (data: string) => string)(input)\n let output = ''\n for (let i = 0; i < binary.length; i++) {\n const code = binary.charCodeAt(i).toString(16).padStart(2, '0')\n output += '%' + code\n }\n try {\n return decodeURIComponent(output)\n } catch (error) {\n return decodeURIComponent(encodeURIComponent(binary))\n }\n}\n\nconst base64UrlDecode = (input: string): string => {\n const base64 = input.replace(/-/g, '+').replace(/_/g, '/')\n const padding = 4 - (base64.length % 4)\n const padded = base64 + (padding < 4 ? '='.repeat(padding) : '')\n if (typeof globalThis.atob === 'function') {\n return decodeWithAtob(padded)\n }\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(padded, 'base64').toString('utf-8')\n }\n return ''\n}\n\nexport const decodeJwtPayload = (token: string): Record<string, any> | null => {\n if (!token) {\n return null\n }\n const segments = token.split('.')\n if (segments.length < 2) {\n return null\n }\n try {\n const decoded = base64UrlDecode(segments[1])\n return decoded ? JSON.parse(decoded) : null\n } catch (error) {\n return null\n }\n}\n\nexport const getRolesFromJwt = (token: string): string[] => {\n const payload = decodeJwtPayload(token)\n const role = payload && typeof payload.role === 'string' ? payload.role : ''\n return role\n .split(',')\n .map(item => item.trim())\n .filter(item => !!item)\n}\n","import { Router } from 'vue-router'\nimport { pinia, useUserStore } from '../../store'\nimport { OmsModule, RemoteModule } from '../../types'\nimport { transRemoteModules } from '../remote'\nimport Layout from '../../scaffold/layout/index.vue'\nimport { getWhiteRoutes, isLodeRemoteRoutes } from './func'\nimport { filterRoutesByRole } from '../permission'\nimport { getRolesFromJwt, getToken } from '../../utils'\n\nexport default function(router: Router) {\n router.beforeEach(async(to, form, next) => {\n if (getWhiteRoutes().indexOf(to.path) !== -1) {\n next()\n return\n }\n if (isLodeRemoteRoutes()) {\n next()\n return\n }\n const user = useUserStore(pinia)\n await user.info()\n const remoteRoute: RemoteModule[] = await user.loadRemoteRoutes()\n const routeModules: OmsModule[] = transRemoteModules(remoteRoute)\n const userRoles = getRolesFromJwt(getToken())\n const filteredModules: OmsModule[] = routeModules.map(item => {\n const permittedRoutes = filterRoutesByRole(item.routes, userRoles)\n return {\n ...item,\n routes: permittedRoutes\n }\n }).filter(item => item.routes.length > 0)\n\n filteredModules.forEach(item => {\n item.routes.forEach(each => {\n router.addRoute({\n path: '/',\n component: Layout,\n children: [each]\n })\n })\n })\n router.addRoute({ name: '404', path: '/:pathMatch(.*)*', redirect: '/404', hidden: true })\n user.updateRemoteRouter(filteredModules)\n await router.replace(to)\n next()\n })\n}\n","import { Router } from 'vue-router'\nimport { pinia, useAppStore, useSettingsStore } from '../../store'\n\nexport default function(router: Router) {\n router.beforeEach(async(to, from, next) => {\n const settings = useSettingsStore(pinia)\n const tokens: string[] = [settings.title || '']\n const len = to.matched.length\n for (let i = len; i > len - 3; i--) {\n const item = to.matched[i - 1]\n if (item?.meta?.title) {\n tokens.push(item.meta.title + '')\n }\n }\n if (tokens.length > 1) {\n document.title = tokens.reverse().join('-')\n }\n next()\n })\n router.afterEach(async(to, from, failure) => {\n const app = useAppStore(pinia)\n if (Object.keys(to.meta).length > 0) {\n await app.setCurrentMeta(to.meta)\n }\n })\n}\n","import { Router } from 'vue-router'\nimport nprogress from './nprogress'\nimport permission from './permission'\nimport remoteRoutes from './remote-routes'\nimport setPageTitle from './set-page-title'\n\nexport default function(router: Router) {\n permission(router)\n nprogress(router)\n remoteRoutes(router)\n setPageTitle(router)\n}\n","import { Component } from 'vue'\n\nconst defaultMap: Record<string, Component> = {}\n\nexport function setCmp(name: string, cmp: Component) {\n defaultMap[name] = cmp\n}\n\nexport function getCmp(name: string) {\n return defaultMap[name]\n}\n","<script lang=\"jsx\">\nimport { useUserStore } from '../store'\nimport { getCmp } from '../utils/container'\nimport { computed } from 'vue'\n\nexport default defineComponent({\n name: 'Dashboard',\n setup() {\n // use global store shim\n // const roleIds = computed(() => store.state.settings.loginTips)\n const custom = getCmp('dashboard')\n if (custom) {\n return () => <span>\n <custom/>\n </span>\n }\n const name = computed(() => useUserStore().name)\n return () => <div class='dashboard-container'>\n <div class='dashboard-text'>Hi { name.value } 😄</div>\n </div>\n }\n})\n</script>\n","<script lang=\"jsx\">\nimport { useUserStore } from '../store'\nimport { getCmp } from '../utils/container'\nimport { computed } from 'vue'\n\nexport default defineComponent({\n name: 'Dashboard',\n setup() {\n // use global store shim\n // const roleIds = computed(() => store.state.settings.loginTips)\n const custom = getCmp('dashboard')\n if (custom) {\n return () => <span>\n <custom/>\n </span>\n }\n const name = computed(() => useUserStore().name)\n return () => <div class='dashboard-container'>\n <div class='dashboard-text'>Hi { name.value } 😄</div>\n </div>\n }\n})\n</script>\n","<template>\n <div class=\"login-container\">\n <div class=\"login-background\">\n <div class=\"shape shape-1\" />\n <div class=\"shape shape-2\" />\n <div class=\"shape shape-3\" />\n </div>\n\n <transition name=\"fade-scale\" appear>\n <div class=\"login-card-wrapper\">\n <el-card class=\"login-card\" shadow=\"never\">\n <div class=\"login-header\">\n <div class=\"logo-wrapper\">\n <img v-if=\"settingsStore.logo\" :src=\"settingsStore.logo\" alt=\"Logo\" class=\"logo-img\">\n <div v-else class=\"logo-fallback\">{{ logoFallback }}</div>\n </div>\n <h1 class=\"login-title\">{{ settingsStore.title || 'OMS' }}</h1>\n <p class=\"login-subtitle\">欢迎回来,请登录您的账户</p>\n </div>\n\n <el-form\n ref=\"loginForm\"\n :model=\"data\"\n class=\"login-form\"\n size=\"large\"\n @submit.prevent=\"login\"\n >\n <el-form-item prop=\"username\">\n <el-input\n v-model=\"data.username\"\n placeholder=\"用户名\"\n prefix-icon=\"User\"\n class=\"custom-input\"\n />\n </el-form-item>\n\n <el-form-item prop=\"password\">\n <el-input\n v-model=\"data.password\"\n type=\"password\"\n placeholder=\"密码\"\n show-password\n prefix-icon=\"Lock\"\n class=\"custom-input\"\n />\n </el-form-item>\n\n <el-form-item v-if=\"captcha\" prop=\"captcha\">\n <div class=\"captcha-wrapper\">\n <el-input\n v-model=\"data.captcha\"\n placeholder=\"验证码\"\n prefix-icon=\"Key\"\n class=\"custom-input captcha-input\"\n />\n <div class=\"captcha-img-box\" @click=\"onCaptchaClick\">\n <img\n :src=\"baseAPI + '/user/captcha?ts=' + ts\"\n title=\"点击刷新\"\n class=\"captcha-img\"\n >\n </div>\n </div>\n </el-form-item>\n\n <div v-if=\"tips\" class=\"login-tips\">\n <el-icon><InfoFilled /></el-icon>\n <span>{{ tips }}</span>\n </div>\n\n <el-button\n class=\"submit-button\"\n type=\"primary\"\n :loading=\"loading\"\n :disabled=\"!onReady\"\n native-type=\"submit\"\n @click=\"login\"\n >\n 登 录\n </el-button>\n\n <div v-if=\"Object.keys(settingsStore.sso || {}).length > 0\" class=\"sso-divider\">\n <span>其他登录方式</span>\n </div>\n\n <div class=\"sso-container\">\n <div id=\"sso-qrcode\" />\n <!-- SSO items logic conserved -->\n </div>\n </el-form>\n </el-card>\n <div class=\"login-footer\">\n © {{ new Date().getFullYear() }} {{ settingsStore.title || 'OMS' }}. All rights reserved.\n </div>\n </div>\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useRouter, useRoute } from 'vue-router'\nimport { useSettingsStore, useAppStore, useUserStore } from '../store'\nimport CryptoJS from 'crypto-js'\nimport { computed, ref } from 'vue'\nimport { User, Lock, Key, InfoFilled } from '@element-plus/icons-vue'\nimport { ElMessage } from 'element-plus'\n\nconst router = useRouter()\nconst route = useRoute()\nconst settingsStore = useSettingsStore()\nconst appStore = useAppStore()\nconst userStore = useUserStore()\n\nconst tips = computed(() => settingsStore.loginTips)\nconst captcha = computed(() => settingsStore.captcha)\nconst baseAPI = computed(() => appStore.baseURL)\n\nconst ts = ref(0)\nconst loading = ref(false)\n\nconst data = ref({\n username: '',\n password: '',\n captcha: '',\n sing: ''\n})\n\nconst logoFallback = computed(() => {\n const text = settingsStore.title || 'OMS'\n return text ? text.toString().trim().charAt(0).toUpperCase() : 'O'\n})\n\nconst onCaptchaClick = () => {\n ts.value++\n}\n\nconst onReady = computed(() => {\n return data.value.username.length > 0 &&\n data.value.password.length >= 4 &&\n (captcha.value ? data.value.captcha.length === 4 : true)\n})\n\nconst login = () => {\n if (loading.value) return\n if (!onReady.value) {\n ElMessage.error('请填写完整的登录信息')\n return\n }\n\n if (captcha.value) {\n data.value.sing = CryptoJS.MD5(`${data.value.username}${data.value.password}${data.value.captcha}`).toString()\n }\n\n loading.value = true\n userStore.login(data.value).then(res => {\n router.push({ path: route.query?.redirect as string || '/' })\n }).catch(e => {\n ts.value++\n // Error handling is handled by store/interceptors usually, but we refresh captcha\n }).finally(() => {\n loading.value = false\n })\n}\n</script>\n\n<style lang=\"scss\">\n.login-container {\n position: relative;\n width: 100vw;\n height: 100vh;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--app-bg);\n}\n\n.login-background {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 1;\n\n .shape {\n position: absolute;\n filter: blur(100px);\n opacity: 0.15;\n border-radius: 50%;\n z-index: 1;\n }\n\n .shape-1 {\n top: -10%;\n left: -10%;\n width: 40%;\n height: 40%;\n background: #00b074; // Mint\n animation: float 20s infinite alternate;\n }\n\n .shape-2 {\n bottom: -15%;\n right: -5%;\n width: 50%;\n height: 50%;\n background: #00b074;\n animation: float 25s infinite alternate-reverse;\n }\n}\n\n@keyframes float {\n 0% { transform: translate(0, 0) rotate(0deg); }\n 100% { transform: translate(10%, 10%) rotate(10deg); }\n}\n\n.login-card-wrapper {\n position: relative;\n z-index: 10;\n width: 100%;\n max-width: 460px;\n padding: 20px;\n}\n\n.login-card {\n background: var(--card-bg) !important;\n border: none !important;\n border-radius: 24px !important;\n padding: 48px 40px !important;\n box-shadow: var(--card-shadow) !important;\n\n .el-card__body {\n padding: 0;\n }\n}\n\n.login-header {\n text-align: center;\n margin-bottom: 40px;\n\n .logo-wrapper {\n margin-bottom: 24px;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .logo-img {\n height: 72px;\n width: auto;\n }\n\n .logo-fallback {\n width: 72px;\n height: 72px;\n background: #e6f7f1;\n color: #00b074;\n font-size: 36px;\n font-weight: 800;\n border-radius: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n .login-title {\n font-size: 32px;\n font-weight: 800;\n color: var(--sidebar-text-color);\n margin: 0 0 8px 0;\n letter-spacing: -0.02em;\n }\n\n .login-subtitle {\n font-size: 15px;\n color: var(--sidebar-text-color);\n opacity: 0.7;\n margin: 0;\n }\n}\n\n.custom-input {\n .el-input__wrapper {\n background-color: var(--input-bg) !important;\n box-shadow: none !important;\n border: 1.5px solid var(--border-color) !important;\n border-radius: 16px !important;\n padding: 0 16px !important;\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color) !important;\n background-color: var(--input-bg) !important;\n }\n\n &.is-focus {\n border-color: var(--sidebar-active-text-color) !important;\n background-color: var(--input-bg) !important;\n box-shadow: 0 0 0 4px rgba(0, 176, 116, 0.1) !important;\n }\n }\n\n .el-input__inner {\n color: var(--sidebar-text-color) !important;\n height: 56px !important;\n background-color: transparent !important;\n\n &::placeholder {\n color: #b0b0b0 !important;\n }\n }\n\n .el-input__prefix-icon {\n color: #00b074 !important;\n font-size: 20px;\n }\n\n // Ensure password input eye icon has proper color in dark mode\n .el-input__suffix-inner {\n color: var(--sidebar-text-color) !important;\n opacity: 0.6;\n\n &:hover {\n opacity: 1;\n }\n }\n}\n\n.captcha-wrapper {\n display: flex;\n gap: 12px;\n align-items: stretch;\n\n .captcha-input {\n flex: 1;\n }\n\n .captcha-img-box {\n width: 140px;\n height: 56px;\n background: var(--input-bg);\n border-radius: 16px;\n overflow: hidden;\n cursor: pointer;\n border: 1.5px solid var(--border-color);\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color);\n }\n\n .captcha-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.login-tips {\n display: flex;\n align-items: center;\n gap: 10px;\n color: #00b074;\n font-size: 14px;\n margin-bottom: 28px;\n padding: 14px 18px;\n background: #e6f7f1;\n border-radius: 14px;\n font-weight: 500;\n}\n\n.submit-button {\n width: 100%;\n height: 58px !important;\n border-radius: 18px !important;\n font-size: 17px !important;\n font-weight: 700 !important;\n background: #00b074 !important;\n box-shadow: 0 8px 20px rgba(0, 176, 116, 0.25) !important;\n border: none !important;\n margin-top: 16px;\n transition: all 0.3s ease !important;\n\n &:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 12px 25px rgba(0, 176, 116, 0.35) !important;\n background: #009663 !important;\n }\n\n &:active:not(:disabled) {\n transform: translateY(0);\n }\n \n &:disabled {\n opacity: 0.5;\n background: #b0b0b0 !important;\n box-shadow: none !important;\n }\n}\n\n.sso-divider {\n display: flex;\n align-items: center;\n margin: 40px 0 20px;\n color: #b0b0b0;\n font-size: 14px;\n\n &::before,\n &::after {\n content: \"\";\n flex: 1;\n height: 1px;\n background: var(--border-color);\n }\n\n span {\n padding: 0 16px;\n }\n}\n\n.login-footer {\n text-align: center;\n margin-top: 40px;\n color: #b0b0b0;\n font-size: 13px;\n font-weight: 500;\n}\n</style>\n","<template>\n <div class=\"login-container\">\n <div class=\"login-background\">\n <div class=\"shape shape-1\" />\n <div class=\"shape shape-2\" />\n <div class=\"shape shape-3\" />\n </div>\n\n <transition name=\"fade-scale\" appear>\n <div class=\"login-card-wrapper\">\n <el-card class=\"login-card\" shadow=\"never\">\n <div class=\"login-header\">\n <div class=\"logo-wrapper\">\n <img v-if=\"settingsStore.logo\" :src=\"settingsStore.logo\" alt=\"Logo\" class=\"logo-img\">\n <div v-else class=\"logo-fallback\">{{ logoFallback }}</div>\n </div>\n <h1 class=\"login-title\">{{ settingsStore.title || 'OMS' }}</h1>\n <p class=\"login-subtitle\">欢迎回来,请登录您的账户</p>\n </div>\n\n <el-form\n ref=\"loginForm\"\n :model=\"data\"\n class=\"login-form\"\n size=\"large\"\n @submit.prevent=\"login\"\n >\n <el-form-item prop=\"username\">\n <el-input\n v-model=\"data.username\"\n placeholder=\"用户名\"\n prefix-icon=\"User\"\n class=\"custom-input\"\n />\n </el-form-item>\n\n <el-form-item prop=\"password\">\n <el-input\n v-model=\"data.password\"\n type=\"password\"\n placeholder=\"密码\"\n show-password\n prefix-icon=\"Lock\"\n class=\"custom-input\"\n />\n </el-form-item>\n\n <el-form-item v-if=\"captcha\" prop=\"captcha\">\n <div class=\"captcha-wrapper\">\n <el-input\n v-model=\"data.captcha\"\n placeholder=\"验证码\"\n prefix-icon=\"Key\"\n class=\"custom-input captcha-input\"\n />\n <div class=\"captcha-img-box\" @click=\"onCaptchaClick\">\n <img\n :src=\"baseAPI + '/user/captcha?ts=' + ts\"\n title=\"点击刷新\"\n class=\"captcha-img\"\n >\n </div>\n </div>\n </el-form-item>\n\n <div v-if=\"tips\" class=\"login-tips\">\n <el-icon><InfoFilled /></el-icon>\n <span>{{ tips }}</span>\n </div>\n\n <el-button\n class=\"submit-button\"\n type=\"primary\"\n :loading=\"loading\"\n :disabled=\"!onReady\"\n native-type=\"submit\"\n @click=\"login\"\n >\n 登 录\n </el-button>\n\n <div v-if=\"Object.keys(settingsStore.sso || {}).length > 0\" class=\"sso-divider\">\n <span>其他登录方式</span>\n </div>\n\n <div class=\"sso-container\">\n <div id=\"sso-qrcode\" />\n <!-- SSO items logic conserved -->\n </div>\n </el-form>\n </el-card>\n <div class=\"login-footer\">\n © {{ new Date().getFullYear() }} {{ settingsStore.title || 'OMS' }}. All rights reserved.\n </div>\n </div>\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useRouter, useRoute } from 'vue-router'\nimport { useSettingsStore, useAppStore, useUserStore } from '../store'\nimport CryptoJS from 'crypto-js'\nimport { computed, ref } from 'vue'\nimport { User, Lock, Key, InfoFilled } from '@element-plus/icons-vue'\nimport { ElMessage } from 'element-plus'\n\nconst router = useRouter()\nconst route = useRoute()\nconst settingsStore = useSettingsStore()\nconst appStore = useAppStore()\nconst userStore = useUserStore()\n\nconst tips = computed(() => settingsStore.loginTips)\nconst captcha = computed(() => settingsStore.captcha)\nconst baseAPI = computed(() => appStore.baseURL)\n\nconst ts = ref(0)\nconst loading = ref(false)\n\nconst data = ref({\n username: '',\n password: '',\n captcha: '',\n sing: ''\n})\n\nconst logoFallback = computed(() => {\n const text = settingsStore.title || 'OMS'\n return text ? text.toString().trim().charAt(0).toUpperCase() : 'O'\n})\n\nconst onCaptchaClick = () => {\n ts.value++\n}\n\nconst onReady = computed(() => {\n return data.value.username.length > 0 &&\n data.value.password.length >= 4 &&\n (captcha.value ? data.value.captcha.length === 4 : true)\n})\n\nconst login = () => {\n if (loading.value) return\n if (!onReady.value) {\n ElMessage.error('请填写完整的登录信息')\n return\n }\n\n if (captcha.value) {\n data.value.sing = CryptoJS.MD5(`${data.value.username}${data.value.password}${data.value.captcha}`).toString()\n }\n\n loading.value = true\n userStore.login(data.value).then(res => {\n router.push({ path: route.query?.redirect as string || '/' })\n }).catch(e => {\n ts.value++\n // Error handling is handled by store/interceptors usually, but we refresh captcha\n }).finally(() => {\n loading.value = false\n })\n}\n</script>\n\n<style lang=\"scss\">\n.login-container {\n position: relative;\n width: 100vw;\n height: 100vh;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--app-bg);\n}\n\n.login-background {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 1;\n\n .shape {\n position: absolute;\n filter: blur(100px);\n opacity: 0.15;\n border-radius: 50%;\n z-index: 1;\n }\n\n .shape-1 {\n top: -10%;\n left: -10%;\n width: 40%;\n height: 40%;\n background: #00b074; // Mint\n animation: float 20s infinite alternate;\n }\n\n .shape-2 {\n bottom: -15%;\n right: -5%;\n width: 50%;\n height: 50%;\n background: #00b074;\n animation: float 25s infinite alternate-reverse;\n }\n}\n\n@keyframes float {\n 0% { transform: translate(0, 0) rotate(0deg); }\n 100% { transform: translate(10%, 10%) rotate(10deg); }\n}\n\n.login-card-wrapper {\n position: relative;\n z-index: 10;\n width: 100%;\n max-width: 460px;\n padding: 20px;\n}\n\n.login-card {\n background: var(--card-bg) !important;\n border: none !important;\n border-radius: 24px !important;\n padding: 48px 40px !important;\n box-shadow: var(--card-shadow) !important;\n\n .el-card__body {\n padding: 0;\n }\n}\n\n.login-header {\n text-align: center;\n margin-bottom: 40px;\n\n .logo-wrapper {\n margin-bottom: 24px;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .logo-img {\n height: 72px;\n width: auto;\n }\n\n .logo-fallback {\n width: 72px;\n height: 72px;\n background: #e6f7f1;\n color: #00b074;\n font-size: 36px;\n font-weight: 800;\n border-radius: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n .login-title {\n font-size: 32px;\n font-weight: 800;\n color: var(--sidebar-text-color);\n margin: 0 0 8px 0;\n letter-spacing: -0.02em;\n }\n\n .login-subtitle {\n font-size: 15px;\n color: var(--sidebar-text-color);\n opacity: 0.7;\n margin: 0;\n }\n}\n\n.custom-input {\n .el-input__wrapper {\n background-color: var(--input-bg) !important;\n box-shadow: none !important;\n border: 1.5px solid var(--border-color) !important;\n border-radius: 16px !important;\n padding: 0 16px !important;\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color) !important;\n background-color: var(--input-bg) !important;\n }\n\n &.is-focus {\n border-color: var(--sidebar-active-text-color) !important;\n background-color: var(--input-bg) !important;\n box-shadow: 0 0 0 4px rgba(0, 176, 116, 0.1) !important;\n }\n }\n\n .el-input__inner {\n color: var(--sidebar-text-color) !important;\n height: 56px !important;\n background-color: transparent !important;\n\n &::placeholder {\n color: #b0b0b0 !important;\n }\n }\n\n .el-input__prefix-icon {\n color: #00b074 !important;\n font-size: 20px;\n }\n\n // Ensure password input eye icon has proper color in dark mode\n .el-input__suffix-inner {\n color: var(--sidebar-text-color) !important;\n opacity: 0.6;\n\n &:hover {\n opacity: 1;\n }\n }\n}\n\n.captcha-wrapper {\n display: flex;\n gap: 12px;\n align-items: stretch;\n\n .captcha-input {\n flex: 1;\n }\n\n .captcha-img-box {\n width: 140px;\n height: 56px;\n background: var(--input-bg);\n border-radius: 16px;\n overflow: hidden;\n cursor: pointer;\n border: 1.5px solid var(--border-color);\n transition: all 0.3s ease;\n\n &:hover {\n border-color: var(--sidebar-active-text-color);\n }\n\n .captcha-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.login-tips {\n display: flex;\n align-items: center;\n gap: 10px;\n color: #00b074;\n font-size: 14px;\n margin-bottom: 28px;\n padding: 14px 18px;\n background: #e6f7f1;\n border-radius: 14px;\n font-weight: 500;\n}\n\n.submit-button {\n width: 100%;\n height: 58px !important;\n border-radius: 18px !important;\n font-size: 17px !important;\n font-weight: 700 !important;\n background: #00b074 !important;\n box-shadow: 0 8px 20px rgba(0, 176, 116, 0.25) !important;\n border: none !important;\n margin-top: 16px;\n transition: all 0.3s ease !important;\n\n &:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 12px 25px rgba(0, 176, 116, 0.35) !important;\n background: #009663 !important;\n }\n\n &:active:not(:disabled) {\n transform: translateY(0);\n }\n \n &:disabled {\n opacity: 0.5;\n background: #b0b0b0 !important;\n box-shadow: none !important;\n }\n}\n\n.sso-divider {\n display: flex;\n align-items: center;\n margin: 40px 0 20px;\n color: #b0b0b0;\n font-size: 14px;\n\n &::before,\n &::after {\n content: \"\";\n flex: 1;\n height: 1px;\n background: var(--border-color);\n }\n\n span {\n padding: 0 16px;\n }\n}\n\n.login-footer {\n text-align: center;\n margin-top: 40px;\n color: #b0b0b0;\n font-size: 13px;\n font-weight: 500;\n}\n</style>\n","<template>\n <div class=\"not-found\">\n <svg\n width=\"380px\"\n height=\"500px\"\n viewBox=\"0 0 837 1045\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\"\n >\n <g\n id=\"Page-1\"\n stroke=\"none\"\n stroke-width=\"1\"\n fill=\"none\"\n fill-rule=\"evenodd\"\n sketch:type=\"MSPage\"\n >\n <path\n id=\"Polygon-1\"\n d=\"M353,9 L626.664028,170 L626.664028,487 L353,642 L79.3359724,487 L79.3359724,170 L353,9 Z\"\n stroke=\"#007FB2\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n <path\n id=\"Polygon-2\"\n d=\"M78.5,529 L147,569.186414 L147,648.311216 L78.5,687 L10,648.311216 L10,569.186414 L78.5,529 Z\"\n stroke=\"#EF4A5B\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n <path\n id=\"Polygon-3\"\n d=\"M773,186 L827,217.538705 L827,279.636651 L773,310 L719,279.636651 L719,217.538705 L773,186 Z\"\n stroke=\"#795D9C\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n <path\n id=\"Polygon-4\"\n d=\"M639,529 L773,607.846761 L773,763.091627 L639,839 L505,763.091627 L505,607.846761 L639,529 Z\"\n stroke=\"#F2773F\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n <path\n id=\"Polygon-5\"\n d=\"M281,801 L383,861.025276 L383,979.21169 L281,1037 L179,979.21169 L179,861.025276 L281,801 Z\"\n stroke=\"#36B455\"\n stroke-width=\"6\"\n sketch:type=\"MSShapeGroup\"\n />\n </g>\n </svg>\n <div class=\"message-box\">\n <h1>404</h1>\n <p>Page not found</p>\n <div class=\"buttons-con\">\n <div class=\"action-link-wrap\">\n <!--<a onclick=\"history.back(-2)\" class=\"link-button link-back-button\">Go Back</a>-->\n <a\n href=\"\"\n class=\"link-button\"\n >Go to Home Page</a>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: 'NotFoundPage'\n}\n</script>\n\n<style scoped>\n.not-found {\n background-color: #2F3242;\n width: 100%;\n height: 100%;\n}\n\nsvg {\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -250px;\n margin-left: -400px;\n}\n\n.message-box {\n height: 200px;\n width: 380px;\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -100px;\n margin-left: 50px;\n color: #FFF;\n font-family: Roboto;\n font-weight: 300;\n}\n\n.message-box h1 {\n font-size: 60px;\n line-height: 46px;\n margin-bottom: 40px;\n}\n\n.buttons-con .action-link-wrap {\n margin-top: 40px;\n}\n\n.buttons-con .action-link-wrap a {\n background: #68c950;\n padding: 8px 25px;\n border-radius: 4px;\n color: #FFF;\n font-weight: bold;\n font-size: 14px;\n transition: all 0.3s linear;\n cursor: pointer;\n text-decoration: none;\n margin-right: 10px\n}\n\n.buttons-con .action-link-wrap a:hover {\n background: #5A5C6C;\n color: #fff;\n}\n\n#Polygon-1, #Polygon-2, #Polygon-3, #Polygon-4, #Polygon-4, #Polygon-5 {\n animation: float 1s infinite ease-in-out alternate;\n}\n\n#Polygon-2 {\n animation-delay: .2s;\n}\n\n#Polygon-3 {\n animation-delay: .4s;\n}\n\n#Polygon-4 {\n animation-delay: .6s;\n}\n\n#Polygon-5 {\n animation-delay: .8s;\n}\n\n@keyframes float {\n 100% {\n transform: translateY(20px);\n }\n}\n\n@media (max-width: 450px) {\n svg {\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -250px;\n margin-left: -190px;\n }\n\n .message-box {\n top: 50%;\n left: 50%;\n margin-top: -100px;\n margin-left: -190px;\n text-align: center;\n }\n}\n</style>\n","import { createRouter, createWebHashHistory, type RouteRecordRaw, type RouterHistory } from 'vue-router'\nimport Dashboard from '../scaffold/dashboard.vue'\nimport Layout from '../scaffold/layout/index.vue'\nimport Login from '../scaffold/login.vue'\nimport NotFoundPage from '../scaffold/404.vue'\n\nexport const defaultRoutes: RouteRecordRaw[] = [\n {\n path: '/',\n component: Layout,\n redirect: '/dashboard',\n name: 'Root',\n meta: {\n menuType: 1\n },\n children: [\n {\n path: 'dashboard',\n name: 'Dashboard',\n component: Dashboard,\n meta: { title: 'Dashboard', icon: 'el-icon-help', menuType: 2, keepAlive: true },\n }\n ]\n },\n {\n path: '/login',\n component: Login,\n meta: { title: '用户登录', menuType: 0 },\n hidden: true\n },\n {\n path: '/404',\n component: NotFoundPage,\n meta: { menuType: 0 },\n hidden: true\n }\n]\n\nexport function createOmsRouter(history: RouterHistory = createWebHashHistory()) {\n return createRouter({\n history,\n routes: defaultRoutes\n })\n}\n\nexport default createOmsRouter\n","import type { Router } from 'vue-router'\nimport guard from './guard'\nimport createOmsRouter from './router'\n\nconst guardedRouters = new WeakSet<Router>()\nlet defaultRouter: Router | null = null\nlet activeRouter: Router | null = null\n\nexport function ensureOmsRouterGuards(router: Router): Router {\n if (!guardedRouters.has(router)) {\n guard(router)\n guardedRouters.add(router)\n }\n return router\n}\n\nexport function getDefaultOmsRouter(): Router {\n if (!defaultRouter) {\n defaultRouter = ensureOmsRouterGuards(createOmsRouter())\n }\n return defaultRouter\n}\n\nexport function resolveOmsRouter(router?: Router | null): Router {\n return ensureOmsRouterGuards(router || getDefaultOmsRouter())\n}\n\nexport function setActiveOmsRouter(router: Router) {\n activeRouter = router\n}\n\nexport function getActiveOmsRouter(): Router {\n return activeRouter || getDefaultOmsRouter()\n}\n\nexport { createOmsRouter }\n\nexport default getDefaultOmsRouter()\n","import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'\nimport { pinia, useUserStore } from '../../store'\nimport { Interceptor, InterceptorUse } from './types'\nimport { Message, MessageBox } from '../../plugins/element-plus'\nimport { removeToken } from '../token'\nimport { cancelRequestInterceptor, cancelResponseInterceptor } from './cache'\nimport { isString } from '@okiss/utils'\nimport { getActiveOmsRouter } from '../../router'\n\nfunction getToken() {\n return useUserStore(pinia).token\n}\n\nfunction expired() {\n return useUserStore(pinia).expired\n}\n\nfunction errMsg(message: string) {\n Message({\n message: message,\n type: 'error',\n duration: 5 * 1000,\n grouping: true\n })\n}\n\nconst baseRequestInterceptor: InterceptorUse<AxiosRequestConfig, AxiosError> = {\n onFulfilled: function(config: AxiosRequestConfig) {\n config.headers = config.headers || {}\n const token = getToken()\n if (token) {\n config.headers['X-Token'] = token\n }\n const router = getActiveOmsRouter()\n if (router.currentRoute.value.meta?.path) {\n config.headers['X-Path'] = router.currentRoute.value.meta.path\n }\n return config\n }\n}\n\nconst baseResponseInterceptor: InterceptorUse<AxiosResponse, AxiosError> = {\n onFulfilled(response) {\n const notHoldApiErr = response.config?.notHoldApiErr !== undefined && response.config?.notHoldApiErr === true\n if (!notHoldApiErr && response.data.code !== 0) {\n const message = response.data.message || `接口请求错误 ${response.config.method}::${response.config.url?.split('?')[0]}`\n if (response.data.code === 401) {\n if (expired()) {\n return\n }\n useUserStore(pinia).SetExpired()\n MessageBox.alert('登录信息已过期或未登录, 是否跳转登录', '操作提醒', {\n showClose: false,\n confirmButtonText: '重新登录',\n showCancelButton: true,\n cancelButtonText: '取消',\n callback: (action: string) => {\n if (action === 'confirm') {\n removeToken()\n // location.href = location.origin + location.pathname\n location.href = location.origin + location.pathname + location.hash.replace('#', '#/?redirect=')\n location.reload()\n }\n useUserStore(pinia).SetExpired()\n }\n })\n return\n } else {\n errMsg(message)\n }\n return Promise.reject(message)\n }\n\n let _message_box = response.data?.data?._message_box\n if (_message_box !== undefined) {\n if (isString(_message_box)) {\n _message_box = {\n message: response.data?.data?._message_box\n }\n }\n MessageBox({\n title: '提示',\n type: 'success',\n grouping: true,\n ..._message_box\n })\n }\n\n return response.data\n },\n onRejected(error: AxiosError) {\n if (axios.isCancel(error)) {\n return Promise.reject('')\n }\n errMsg(`${error.message} ${error.config.method}::${error.config.url?.split('?')[0]}`)\n return Promise.reject(error)\n }\n}\n\nexport const interceptors: Interceptor[] = [\n {\n request: cancelRequestInterceptor,\n response: cancelResponseInterceptor\n },\n {\n request: baseRequestInterceptor,\n response: baseResponseInterceptor\n }\n]\n\nexport function addInterceptor(newInterceptor: Interceptor) {\n interceptors.push(newInterceptor)\n}\n","import axios, { AxiosRequestConfig } from 'axios'\nimport { defaultOptions } from '../../default'\nimport { merge } from 'lodash'\nimport { interceptors } from './interceptors'\n\nexport function instance(conf: AxiosRequestConfig = {}) {\n const defaultConf: AxiosRequestConfig = defaultOptions.axios || {}\n const c = merge(defaultConf, conf || {})\n const service = axios.create({\n ...c\n // adapter: (c) => cacheAdapter(c, defaultAxios)\n })\n\n interceptors.forEach(item => {\n service.interceptors.request.use(item.request.onFulfilled, item.request.onRejected)\n service.interceptors.response.use(item.response.onFulfilled, item.response.onRejected)\n })\n\n return service\n}\n\nexport default instance()\n","import type { ObjectDirective } from 'vue'\n\nconst outClick: ObjectDirective = {\n beforeMount(el, binding) {\n el.clickOutsideEvent = function(event: Event) {\n if (!(el === event.target || el.contains(event.target))) {\n binding.value(event, el)\n }\n }\n document.body.addEventListener('click', el.clickOutsideEvent)\n },\n unmounted(el) {\n document.body.removeEventListener('click', el.clickOutsideEvent)\n }\n}\n\nexport default outClick\n","import mitt from 'mitt'\nimport type { App } from 'vue'\n\nconst eventBus = mitt()\n\nconst defaultOptions = {\n global: true,\n inject: true,\n globalPropertyName: '$eventBus',\n injectName: '$eventBus'\n}\n\n// eventBus.install = install\nexport default eventBus\nexport const bus = eventBus\n\nexport function install(app: App, options = {}) {\n const opt = {\n ...defaultOptions,\n ...options\n }\n if (opt.global) {\n app.config.globalProperties[opt.globalPropertyName] = eventBus\n }\n if (opt.inject) {\n app.provide(opt.injectName, eventBus)\n }\n return eventBus\n}\n","import bus from '../plugins/eventBus'\nimport type { ObjectDirective } from 'vue'\n\nconst rightClient: ObjectDirective = {\n mounted: (el, binding) => {\n if (el === null) {\n return\n }\n if (binding.value) {\n // el.style.border = '1px solid red'\n }\n el.oncontextmenu = (e: Event) => {\n e.preventDefault()\n e.stopPropagation()\n e.cancelBubble = true\n binding.value && bus.emit('right-click', { event: e, data: binding.value })\n }\n }\n}\n\nexport default rightClient\n","import type { ObjectDirective } from 'vue'\n\nconst resize: ObjectDirective = {\n mounted(el) {\n // console.log(8888, el.style)\n }\n}\n\nexport default resize\n","import type { ObjectDirective } from 'vue'\nimport bus from '../plugins/eventBus'\n\nfunction getElementPosition(element: HTMLElement | any, key: 'Top' | 'Left' | 'Right' | 'Botton') {\n let result = element[`offset${key}`]\n let current = element.offsetParent\n\n while (current) {\n result += current[`offset${key}`]\n current = current.offsetParent\n }\n\n return result\n}\n\nconst devtool: ObjectDirective = {\n mounted: (el, binding) => {\n if (el === null || !binding.value.dev) {\n return\n }\n let target : HTMLElement = el\n if (binding.value.parent) {\n for (let i = 0; i < binding.value.parent; i++) {\n if (target.parentElement) {\n target = target.parentElement\n }\n }\n }\n\n target.classList.add('devtool-hover')\n\n // button wrapper\n const wrapper = document.createElement('i')\n wrapper.className = 'devtool-item-wrapper'\n\n target.onmouseover = () => {\n wrapper.style.height = (target.offsetHeight + 30) + 'px'\n wrapper.style.width = (target.offsetWidth + 30) + 'px'\n wrapper.style.top = (getElementPosition(target, 'Top') - 15) + 'px'\n wrapper.style.left = (getElementPosition(target, 'Left') - 15) + 'px'\n }\n\n // create edit button\n const editBtn = document.createElement('span')\n editBtn.className = 'dev-action-edit'\n editBtn.title = '编辑'\n const editIcon = document.createElement('i')\n editIcon.className = 'iconfont ra-editor1'\n editBtn.appendChild(editIcon)\n editBtn.onclick = (ev) => {\n bus.emit('dev-action', { event: ev, data: { type: 'edit', devId: binding.value.devId }})\n }\n wrapper.appendChild(editBtn)\n\n // create delete button\n const delBtn = document.createElement('span')\n delBtn.className = 'dev-action-del'\n delBtn.title = '删除'\n const delIcon = document.createElement('i')\n delIcon.className = 'iconfont ra-cut'\n delBtn.appendChild(delIcon)\n delBtn.onclick = (ev) => {\n bus.emit('dev-action', { event: ev, data: { type: 'del', devId: binding.value.devId }})\n }\n wrapper.appendChild(delBtn)\n\n // append wrapper as first child\n target.insertBefore(wrapper, target.firstChild)\n\n return\n }\n}\n\nexport default devtool\n","export { default as outClick } from './outClick'\nexport { default as rightClick } from './rightClick'\nexport { default as resize } from './resize'\nexport { default as devtool } from './devtool'\n","import { createApp, watch, type App, type Component, type Directive } from 'vue'\nimport type { RouteRecordRaw, Router } from 'vue-router'\nimport type { OmsOptions, OmsPlugin, UsePlugin } from './types'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\n// Vuex Module removed in Pinia migration\n\nimport AppComp from './App.vue'\nimport { startMock, regMockApis } from './mock'\nimport { instance } from './utils/request'\nimport { isObject } from '@okiss/utils'\nimport { VIcon, setUploadHeaderHandle } from '@okiss/vbtf'\nimport { getRolesFromJwt, getToken } from './utils'\nimport { merge } from 'lodash'\nimport Layout from './scaffold/layout/index.vue'\n\nimport 'normalize.css/normalize.css'\nimport './styles/index.scss'\nimport '@okiss/vbtf/style.css'\n\nimport ElementPlus from './plugins/element-plus'\nimport zhCn from 'element-plus/es/locale/lang/zh-cn'\n\nimport { setupStore, pinia, useAppStore, useSettingsStore, useUserStore, setHttp } from './store'\nimport { resolveOmsRouter, setActiveOmsRouter } from './router'\nimport { filterRoutesByRole } from './router/permission'\nimport * as directives from './directive'\nimport { defaultOptions } from './default'\n\nexport let http: AxiosInstance\n\ninterface RouteState {\n pendingRoutes: RouteRecordRaw[]\n registeredRouteKeys: Set<string>\n}\n\nconst routeStateMap = new WeakMap<Router, RouteState>()\n\nconst getRouteKey = (route: RouteRecordRaw): string => {\n if (route.path === '/' && !route.name && route.children && route.children.length === 1) {\n const child = route.children[0]\n return typeof child.name === 'string' ? `layout:${child.name}` : `layout:${child.path}`\n }\n return typeof route.name === 'string' ? route.name : route.path\n}\n\nfunction normalizePluginRoute(route: RouteRecordRaw): RouteRecordRaw {\n const normalized = { ...route }\n const isLayoutRoot = normalized.path === '/' && Array.isArray(normalized.children)\n if (isLayoutRoot) {\n return normalized\n }\n return {\n path: '/',\n component: Layout,\n children: [normalized]\n }\n}\n\nfunction getRouteState(router: Router): RouteState {\n let state = routeStateMap.get(router)\n if (!state) {\n state = {\n pendingRoutes: [],\n registeredRouteKeys: new Set<string>()\n }\n routeStateMap.set(router, state)\n }\n return state\n}\n\nexport function useHttp(options?: AxiosRequestConfig): AxiosInstance {\n return options ? instance((merge(defaultOptions.axios, options))) : http\n}\n\nexport function createAdmin(omsOptions?: OmsOptions) {\n const options = merge(defaultOptions, omsOptions)\n const router = resolveOmsRouter(options.router)\n const app: App = createApp(AppComp)\n const omsPlugin = createOmsPlugin(options, router)\n const plugins = options.plugins || []\n plugins.unshift(omsPlugin)\n plugins.forEach(item => {\n regPlugin(app, item, router)\n })\n if (options?.mock) {\n startMock()\n }\n http = instance(options.axios)\n // install pinia\n setupStore(app)\n const appStore = useAppStore(pinia)\n const settingsStore = useSettingsStore(pinia)\n const userStore = useUserStore(pinia)\n setHttp(http)\n settingsStore.updateSettings(omsOptions?.settings || {})\n appStore.setBaseAPI(options?.axios.baseURL as any)\n app.config.globalProperties.$http = http\n app.config.globalProperties.$router = router\n setActiveOmsRouter(router)\n window.App = app\n window.OmsOptions = options\n setUploadHeaderHandle(() => {\n return {\n 'X-Token': getToken()\n }\n })\n watch(() => userStore.token, () => {\n syncRoutesWithRoles(router)\n }, { immediate: true })\n router.isReady().then(() => app.mount('#app'))\n}\n\nfunction regComponents(app: App, components: Record<string, Component> = {}) {\n Object.keys(components).forEach((item: string) => {\n app.component(item, components[item])\n })\n}\n\nfunction syncRoutesWithRoles(router: Router) {\n const routeState = getRouteState(router)\n const userRoles = getRolesFromJwt(getToken())\n const permittedRoutes = filterRoutesByRole(routeState.pendingRoutes, userRoles)\n const userStore = useUserStore(pinia)\n const existedKeys = new Set(userStore.customRouter.map(item => getRouteKey(item)))\n const newRoutes = permittedRoutes.filter(route => {\n const key = getRouteKey(route)\n if (routeState.registeredRouteKeys.has(key) || existedKeys.has(key)) {\n return false\n }\n routeState.registeredRouteKeys.add(key)\n return true\n })\n newRoutes.forEach(item => {\n router.addRoute(item)\n })\n if (newRoutes.length) {\n userStore.setCustomRoutes(newRoutes)\n }\n}\n\nfunction regRoutes(router: Router, routes: RouteRecordRaw[] = []) {\n getRouteState(router).pendingRoutes.push(...routes.map(normalizePluginRoute))\n syncRoutesWithRoles(router)\n}\n\nfunction regUse(app: App, use: UsePlugin[]) {\n use.forEach(item => {\n if (isObject(item)) {\n // @ts-ignore\n item = [item]\n }\n // @ts-ignore\n app.use(...item)\n })\n}\n\nfunction regDirective(app: App, directives: Record<string, Directive> = {}) {\n Object.keys(directives).forEach(item => {\n app.directive(item, directives[item])\n })\n}\n\nfunction regStoreModule(modules: Record<string, any> = {}) {\n const keepModuleNames = ['app', 'settings', 'user']\n Object.keys(modules).forEach(item => {\n if (keepModuleNames.indexOf(item) !== -1) {\n console.warn(`storeModule name [${item}] is use by base, please change it!`)\n return\n }\n // Pinia does not support dynamic Vuex-style module registration\n console.warn('[store] plugin storeModules are not supported under Pinia. Ignored:', item)\n })\n}\n\nexport function regPlugin(app: App, plugin: OmsPlugin, router: Router = resolveOmsRouter()) {\n regComponents(app, plugin.components || {})\n regRoutes(router, plugin.routes || [])\n regUse(app, plugin.use || [])\n regDirective(app, plugin.directives || {})\n regStoreModule(plugin.storeModules || {})\n regMockApis(plugin.mockApis || [])\n}\n\nexport function createOmsPlugin(options: OmsOptions, router: Router = resolveOmsRouter(options.router)): OmsPlugin {\n return {\n components: { VIcon },\n directives: directives,\n use: [\n router,\n [ElementPlus, { locale: zhCn, ...options.settings?.ElementPlus }]\n ]\n }\n}\n"],"mappings":"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,EACH,UAAU,EACR,OAAO,CAAC,GAAG,EAAE,EACd,EACF;IACF,CACF;GACD,MAAM;GACN,KAAK,EACH,MAAM,IACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EACL,MAAM,GACP;GACD,UAAU;IAGR,MAAM;IACN,KAAK,EACH,cAAc,EACZ,OAAO,SACR,EACF;IACF;GACD,KAAK,EACH,MAAM,IACP;GACD,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,KAAK,EACH,MAAM,IACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EAAE;GACT,SAAS;IACP;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC3B;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC3B;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC5B;GACD,MAAM;GACN,KAAK,EACH,MAAM,GACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EACL,UAAU,IACX;GACD,MAAM;GACN,KAAK,EACH,MAAM,GACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,OAAO;IACL,MAAM;IACN,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;IACjB;GACD,KAAK,EACH,MAAM,GACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EACL,SAAS,IACV;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EACL,MAAM,iBACP;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,SAAS;IACP;KAAE,OAAO;KAAG,OAAO;KAAO;IAC1B;KAAE,OAAO;KAAG,OAAO;KAAO;IAC1B;KAAE,OAAO;KAAG,OAAO;KAAO;IAC1B;KAAE,OAAO;KAAG,OAAO;KAAO;IAC3B;GACD,OAAO,EACL,WAAW,gBACZ;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,OAAO,EAAE;GACV;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EACL,OAAO,GACR;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,SAAS;IACP;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC3B;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC3B;KAAE,OAAO;KAAG,OAAO;KAAQ;IAC5B;GACD,OAAO,EAAE;GACV;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,QAAQ;IACR,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO,CACL;MACE,UAAU;MACV,SAAS;MACV,CACF;KACD,MAAM;KACN,OAAO,EACL,MAAM,cACP;KACF,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,QAAQ,IACT;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO,CACL;MACE,UAAU;MACV,SAAS;MACV,CACF;KACF,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,EAAE;GACT,OAAO;IACL,eAAe;KAAC;MAAE,OAAO;MAAK,OAAO;MAAK;KAAE;MAAE,OAAO;MAAK,OAAO;MAAK;KAAE;MAAE,OAAO;MAAK,OAAO;MAAK;KAAC;IACnG,eAAe;KAAC;MAAE,OAAO;MAAM,OAAO;MAAK;KAAE;MAAE,OAAO;MAAM,OAAO;MAAK;KAAE;MAAE,OAAO;MAAM,OAAO;MAAK;KAAC;IACvG;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,MAAM;IACJ,QAAQ,CAAC,WAAW;IACpB,UAAU;IACV,MAAM,EACJ,KAAK,uBACN;IACD,SAAS,EACP,SAAS,8BACV;IACF;GACD,MAAM;GACP;EACF;CACF,EAEK,KAAU;CACd;EACE,MAAM;EACN,MAAM;EACN,QAAQ;EACT;CACD;EACE,MAAM;EACN,MAAM;EACN,QAAQ;EACR,OAAO;GACL,QAAQ;GACR,KAAK;GACN;EACD,OAAO,EACL,MAAM,WACP;EACF;CACD;EACE,MAAM;EACN,MAAM;EACN,OAAO;GACL,SAAS;GACT,SAAS;GACV;EACD,OAAO,EACL,MAAM,QACP;EACF;CACD,CACE;EACE,MAAM;EACN,MAAM;EACN,QAAQ;EACT,EACD;EACE,MAAM;EACN,MAAM;EACN,OAAO;GACL,QAAQ;GACR,KAAK;GACN;EACF,CACF;CACD;EACE,MAAM;EACN,MAAM;EACN,OAAO;GACL,SAAS;GACT,SAAS;GACV;EACD,OAAO,EACL,MAAM,WACP;EACF;CACF,EAwND,KAAe;CAAE;CAAM,OAtNT;EACZ,YAAY;EACZ,QAAQ,CACN;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACR,EACD;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS,CACP;IAAE,OAAO;IAAG,OAAO;IAAK,EACxB;IAAE,OAAO;IAAG,OAAO;IAAK,CACzB;GACF,CACF;EACD,SAAS;GACP;IACE,OAAO;IACP,OAAO;IACP,MAAM;IACP;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS,CACP;KAAE,OAAO;KAAG,OAAO;KAAK,EACxB;KAAE,OAAO;KAAG,OAAO;KAAK,CACzB;IACD,OAAO;KACL,GAAG;KACH,GAAG;KACJ;IACD,OAAO,EACL,UAAU,IACX;IACF;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACD;IACE,OAAO;IACP,MAAM;IACN,OAAO;IACR;GACF;EACD,aAAa;EACb,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,QAAQ;IACT;GACD;IACE,MAAM;IACN,OAAO;KACL,SAAS;KACT,SAAS;KACV;IACD,OAAO;KACL,MAAM;KACN,MAAM;KACP;IACF;GACD;IACE,MAAM;IACN,OAAO;KACL,QAAQ;KACR,KAAK;KACN;IACD,OAAO;KACL,MAAM;KACN,MAAM;KACP;IACF;GACF;EACD,cAAc,CACZ,GAAG,GAAE,UAAU,GAAQ,EACvB;GACE,MAAM;GACN,QAAQ;GACR,OAAO;IACL,MAAM;IACN,MAAM;IACP;GACF,CACF;EACD,gBAAgB;EAChB,SAAS;EACV;CAyG6B,UAvGb;EACf,MAAM;EACN,MAAM;GACJ,cAAc,CACZ;IACE,aAAa;IACb,MAAM;IACN,WAAW;IACX,eAAe;IACf,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM,EAAE,QAAQ,WAAW;IAC3B,UAAU;IACX,CACF;GACD,MAAM;IACJ,cAAc;IACd,YAAY;IACb;GACF;EACF;CAkFuC,YAhFrB;EACjB,aAAa;EACb,YAAY;EACZ,WAAW;GACT;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,IACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,IACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,GACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,GACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACR;GACF;EACF;CA2CmD,eAzC9B;EACpB,aAAa;EACb,YAAY;EACZ,WAAW;GACT;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,IACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP,KAAK,EACH,MAAM,IACP;IACF;GACD;IACE,MAAM;IACN,OAAO;IACP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A,CAAA,CAAA;;;;;;;oFChBjC,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KAED;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,MAAM;MACP;KACF;IACF;GACF;EACF;CACF,ECrED,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACF;EACF;CACF,EC1CD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACF;EACF;CACF,ECvCD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,SAAS,CACP;IAAE,OAAO;IAAG,OAAO;IAAS,EAC5B;IAAE,OAAO;IAAG,OAAO;IAAU,CAC9B;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,QAAQ;IACR,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACD,QAAQ;IACN,OAAO;IACP,OAAO;IACR;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,QAAQ;OACN,OAAO;OACP,OAAO;OACR;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,QAAQ;OACN,OAAO;OACP,OAAO;OACR;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACF;IACF;GACF;EACF;CACD,MAAM,GAAM;EACV,IAAM,IAAM,EAAU,EAAK;AAW3B,SAVI,EAAK,eAAe,IAClB,EAAI,SAAS,EAAI,MAAM,cAAc,KAAA,KACvC,OAAO,EAAI,MAAM,YAEV,EAAK,eAAe,KACzB,EAAI,WACN,OAAO,EAAI,SAGf,OAAO,EAAI,YACJ;;CAEV,ECtHD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACP,SAAS,EAAE;EACZ;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACD,QAAQ;IACT;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACF;CACF,EC9CD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACF;IACF;GACF;EACF;CACF,ECxDD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,OAAO;OACL,SAAS,EACP,eAAe,OAChB;OACD,QAAQ;OACR,WAAW,CACT;QACE,MAAM;QACN,OAAO;QACP,OAAO;QACR,EACD;QACE,MAAM;QACN,OAAO;QACP,OAAO;QACP,SAAS,CACP;SAAE,OAAO;SAAS,OAAO;SAAO,CACjC;QACF,CACF;OACF;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACF;IACF;GACF;EACF;CACF,ECpED,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,M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;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS;EACP;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,SAAS,CACP;IAAE,OAAO;IAAG,OAAO;IAAS,EAC5B;IAAE,OAAO;IAAG,OAAO;IAAU,CAC9B;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,QAAQ;IACR,SAAS,EACP,eAAe,OAChB;IACD,WAAW,CACT;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACP,OAAO;KACR,CACF;IACF;GACD,QAAQ;IACN,OAAO;IACP,OAAO;IACR;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;IACL,SAAS,EACP,eAAe,OAChB;IACD,WAAW;KACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,QAAQ;OACN,OAAO;OACP,OAAO;OACR;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,QAAQ;OACN,OAAO;OACP,OAAO;OACR;MACF;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR;KACF;IACF;GACF;EACF;CACD,MAAM,GAAM;EACV,IAAM,IAAM,EAAU,EAAK;AAW3B,SAVI,EAAK,eAAe,IAClB,EAAI,SAAS,EAAI,MAAM,cAAc,KAAA,KACvC,OAAO,EAAI,MAAM,YAEV,EAAK,eAAe,KACzB,EAAI,WACN,OAAO,EAAI,SAGf,OAAO,EAAI,YACJ;;CAEV,ECjHD,KAAe;CACb,MAAM;CACN,MAAM;CACN,SAAS;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACR;CACD,SAAS,CACP;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF;CACF,ECpBY,KAAa;CACxB,SAAS;EACP,eAAe;EACf,cAAc;EACd,cAAc;EACf;CACD,WAAW;EACT;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACR;EACD;GACE,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACF;CACF,ECzBY,KAAyB;CACpC,eAAe;CACf,cAAc;CACd,cAAc;CACf,EUMD,KAAe;CACb,MTXa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CSlBC,MRZa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;KACL,SAAS,EACP,eAAe,OAChB;KACD,WAAW,CACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR,EACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR,CACF;KACF;IACD,OAAO,EAAE;IACV;GACF;EACD,MAAM,GAAK;AAKT,UAJA,EAAI,UAAU,EAAI,WAAW,EAAE,EAC/B,AACE,EAAI,UAAQ,MAEP;;EAEV;CQ1CC,MPba;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;COXC,MNda;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CMVC,OLfa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CKTC,MJhBa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CIRC,MHjBa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CGPC,MFlBa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACF;EACF;CENC,KDnBa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACP;GACF;EACF;CCXA,EKfD,KAAe;CACb,MJNa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,QAAQ;GACR,MAAM;GACP;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACP;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;KACL,SAAS,EACP,eAAe,OAChB;KACD,WAAW,CACT;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACR,EACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,SAAS,CACP;OAAE,OAAO;OAAW,OAAO;OAAW,EACtC;OAAE,OAAO;OAAQ,OAAO;OAAQ,CACjC;MACF,CACF;KACF;IACF;GACF;EACF;CIxCC,KHPa;EACb,MAAM;EACN,MAAM;EACN,SAAS;GACP,MAAM;GACN,QAAQ;GACR,MAAM;GACP;EACD,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACP;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACR;GACD;IACE,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;KACL,SAAS,EACP,eAAe,OAChB;KACD,WAAW;MACT;OACE,MAAM;OACN,OAAO;OACP,OAAO;OACR;MACD;OACE,MAAM;OACN,OAAO;OACP,OAAO;OACR;MACD;OACE,MAAM;OACN,OAAO;OACP,OAAO;OACP,SAAS,CACP;QAAE,OAAO;QAAW,OAAO;QAAW,EACtC;QAAE,OAAO;QAAQ,OAAO;QAAQ,CACjC;OACF;MACD;OACE,MAAM;OACN,OAAO;OACP,OAAO;OACP,MAAM;OACP;MACD;OACE,MAAM;OACN,OAAO;OACP,OAAO;OACP,SAAS;QACP;SAAE,OAAO;SAAO,OAAO;SAAO;QAC9B;SAAE,OAAO;SAAQ,OAAO;SA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"}
|