@yxhl/specter-pui-vtk 1.0.113 → 1.0.115
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specter-pui.es.js","sources":["../src/commons/storage.js","../src/stores/message.js","../src/components/message/index.js","../src/commons/request.js","../src/components/assembly/VtkArea.vue","../src/components/assembly/VtkAreaTabs.vue","../src/components/assembly/VtkBreadcrumb.vue","../src/components/assembly/VtkCheckbox.vue","../src/components/assembly/VtkCount.vue","../src/components/assembly/VtkDatePicker.vue","../src/components/assembly/VtkDatePanelHeader.vue","../src/components/assembly/VtkDateSelector.vue","../src/components/assembly/VtkDateTimePicker.vue","../src/components/assembly/VtkTimePicker.vue","../src/components/assembly/VtkDept.vue","../src/components/assembly/VtkEmpty.vue","../src/assets/img/empty.svg","../src/components/assembly/VtkEmptyNew.vue","../src/components/assembly/VtkFab.vue","../src/components/assembly/VtkFormItem.vue","../src/components/assembly/VtkImg.vue","../src/components/assembly/VtkPage.vue","../src/components/assembly/VtkPdf.vue","../src/composables/usePage.js","../src/components/assembly/VtkProj.vue","../src/components/assembly/VtkRadio.vue","../src/components/assembly/VtkSearch.vue","../src/components/assembly/VtkSelect.vue","../src/components/assembly/VtkSinglePage.vue","../src/components/assembly/VtkStepper.vue","../src/components/assembly/VtkUpload.vue","../src/commons/location.js","../src/commons/filters/dictionary.js","../src/commons/filters/format.js","../src/commons/filters/mask.js","../node_modules/vuetify/lib/util/colors.js","../src/commons/themes.js","../src/commons/validation.js","../src/components/message/alert.vue","../src/components/message/confirm.vue","../src/components/message/loading.vue","../src/components/message/prompt.vue","../src/components/message/toast.vue","../src/components/message/vtkMessage.vue","../src/index.js"],"sourcesContent":["const Storage = {};\r\n/** 获取Storage对象 */\r\nconst storage = (type = 'local') => {\r\n return type == \"local\" ? window.localStorage : window.sessionStorage;\r\n}\r\n/**\r\n * 获取对应缓存值JSON对象\r\n * @param {string} key 键\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n * @return {object} 对应的值JSON对象\r\n */\r\nStorage.get = (key, type = 'local') => {\r\n var js = storage(type).getItem(key);\r\n return /^[\\\\{|\\\\[].+[\\\\}|\\\\]]$/.test(js) ? JSON.parse(js) : js;\r\n};\r\n/**\r\n * 设置存储缓存取对象JSON\r\n * @param {string} key 键\r\n * @param {string} value 值(JSON对象)\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.set = (key, value, type = 'local') => {\r\n value = (value.constructor === Object) ? JSON.stringify(value) : value\r\n storage(type).setItem(key, value);\r\n};\r\n/**\r\n * 删除对应的缓存对象JSON\r\n * @param {string} key 键\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.remove = (key, type = 'local') => {\r\n storage(type).removeItem(key);\r\n};\r\n/**\r\n * 清空所有的缓存对象JSON\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.clear = (type = 'local') => {\r\n storage(type).clear();\r\n};\r\n\r\nexport default Storage;\r\n","// stores/message.js\r\nimport { defineStore } from 'pinia'\r\n\r\nexport const useMessageStore = defineStore('message', {\r\n state: () => ({\r\n alert: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 500\r\n }\r\n },\r\n confirm: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 400,\r\n cancelText: '取消',\r\n confirmText: '确定'\r\n }\r\n },\r\n loading: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 300,\r\n indeterminate: true,\r\n value: 0,\r\n progressColor: 'primary',\r\n size: 64,\r\n circleWidth: 6\r\n }\r\n },\r\n prompt: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 500,\r\n label: '',\r\n placeholder: '',\r\n inputType: 'text',\r\n cancelText: '取消',\r\n confirmText: '确定'\r\n }\r\n },\r\n toast: {\r\n isActive: false,\r\n options: {\r\n text: '',\r\n color: '',\r\n timeout: 3000,\r\n position: 'top'\r\n }\r\n }\r\n }),\r\n \r\n actions: {\r\n hide(type) {\r\n if (this[type]) {\r\n this[type].isActive = false\r\n }\r\n },\r\n \r\n show(type, options) {\r\n if (this[type]) {\r\n this[type] = {\r\n isActive: true,\r\n options: options\r\n }\r\n }\r\n }\r\n }\r\n})","// components/message/index.js\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst Message = {\r\n // 显示 alert\r\n alert(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('alert', options)\r\n },\r\n \r\n // 显示 confirm\r\n confirm(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('confirm', options)\r\n },\r\n \r\n // loading 对象,包含 show 和 hide 方法\r\n loading: {\r\n show(options = {}) {\r\n const messageStore = useMessageStore()\r\n const defaultOptions = {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 120,\r\n indeterminate: true,\r\n progressColor: 'primary',\r\n size: 64,\r\n circleWidth: 6\r\n }\r\n messageStore.show('loading', { ...defaultOptions, ...options })\r\n },\r\n hide() {\r\n const messageStore = useMessageStore()\r\n messageStore.hide('loading')\r\n }\r\n },\r\n \r\n // 显示 prompt\r\n prompt(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('prompt', options)\r\n },\r\n \r\n // 显示 toast\r\n toast(text, options = {}) {\r\n \r\n const messageStore = useMessageStore()\r\n // 确保传入的是字符串时正确处理\r\n const toastOptions = typeof text === 'string' \r\n ? { text, ...options }\r\n : text\r\n messageStore.show('toast', toastOptions)\r\n },\r\n \r\n // 隐藏指定类型的消息\r\n hide(type) {\r\n const messageStore = useMessageStore()\r\n messageStore.hide(type)\r\n }\r\n}\r\n\r\nexport default Message","import axios from \"axios\";\r\nimport Storage from \"./storage.js\";\r\nimport Message from \"../components/message/index.js\";\r\n\r\n// create an axios instance\r\nconst service = axios.create({\r\n baseURL: window.VITE_APP_API_URL || import.meta.env.VITE_APP_API_URL || \"\",\r\n headers: {\r\n \"X-Requested-With\": \"XMLHttpRequest\",\r\n },\r\n withCredentials: false,\r\n timeout: 30000,\r\n});\r\n\r\n// request interceptor\r\nservice.interceptors.request.use(\r\n (config) => {\r\n // 获取配置的键名,如果没有配置则使用默认值\r\n const tokenKey = window.VTK_CONFIG?.storageKeys?.token || '_mis_acis_token';\r\n if (Storage.get(tokenKey)) {\r\n config.headers[\"X-Token\"] = \"1b0679be72ad976ad5d491ad57a5eec0\";\r\n config.headers[\"Authorization\"] = \"Bearer \" + Storage.get(tokenKey);\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n Message.toast(error.message || \"请求错误\");\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// response interceptor\r\nservice.interceptors.response.use(\r\n (response) => {\r\n let res = response.data;\r\n let header = response.headers[\"content-disposition\"];\r\n\r\n if (header != undefined && header.split(\";\")[0] == \"attachment\") {\r\n res = response;\r\n }\r\n if (response.status !== 200) {\r\n Message.toast(res.message || \"请求失败\", { color: \"error\" });\r\n return Promise.reject(new Error(res.message || \"请求失败\"));\r\n } else {\r\n // 检查登录过期\r\n if (\r\n res.meta &&\r\n !res.meta.success &&\r\n res.meta.message === \"specter_authorize_exception\"\r\n ) {\r\n Storage.clear(); //清除所有缓存\r\n const handleRedirect = () => {\r\n const url = window.location.href;\r\n const index = url.indexOf(\"#\");\r\n let newUrl;\r\n\r\n if (index > -1) {\r\n newUrl = url.substring(0, index) + \"#/\";\r\n } else {\r\n newUrl = url + \"#/\";\r\n }\r\n\r\n window.location.href = newUrl;\r\n };\r\n\r\n Message.confirm({\r\n title: \"提示\",\r\n text: \"对不起,您的登录信息过期!\",\r\n onConfirm: handleRedirect,\r\n onCancel: handleRedirect,\r\n });\r\n }\r\n return Promise.resolve(res);\r\n }\r\n },\r\n (error) => {\r\n console.log(\"err\" + error);\r\n Message.toast(error.message || \"网络错误\", { color: \"error\" });\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nconst Request = {};\r\n\r\nRequest.http = (\r\n url,\r\n data = {},\r\n method = \"GET\",\r\n headers = { \"content-type\": \"application/x-www-form-urlencoded\" },\r\n responseType = null\r\n) => {\r\n if (headers[\"content-type\"] === \"application/x-www-form-urlencoded\") {\r\n return service({\r\n url: url,\r\n params: data,\r\n method: method,\r\n headers: headers,\r\n responseType: responseType,\r\n });\r\n } else {\r\n return service({\r\n url: url,\r\n data: data,\r\n method: method,\r\n headers: headers,\r\n responseType: responseType,\r\n });\r\n }\r\n};\r\n\r\nRequest.getForm = (url, data = {}) => {\r\n return Request.http(url, data);\r\n};\r\n\r\nRequest.postForm = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\");\r\n};\r\n\r\nRequest.getJson = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"content-type\": \"application/json\",\r\n });\r\n};\r\n\r\nRequest.postJson = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"content-type\": \"application/json\",\r\n });\r\n};\r\n\r\nRequest.imp = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"Content-Type\": \"multipart/form-data\",\r\n });\r\n};\r\n\r\nRequest.exp = (url, data = {}) => {\r\n return Request.http(\r\n url,\r\n data,\r\n \"POST\",\r\n { \"content-Type\": \"application/json\" },\r\n \"blob\"\r\n );\r\n};\r\n\r\nexport default Request;\r\n","<template>\r\n\t<div class=\"d-inline-block d-flex\">\r\n\t\t<VSelect\r\n\t\t\tv-model=\"entity.area2\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area2, 1)\"\r\n\t\t\t@click:clear=\"clear(1)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 2 ? entity.name2 : '---省级---'\"\r\n\t\t\t:items=\"areaData.area2\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box mr-3\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 2\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 4\"\r\n\t\t\tv-model=\"entity.area4\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area4, 2)\"\r\n\t\t\t@click:clear=\"clear(2)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 4 ? entity.name4 : '---市级---'\"\r\n\t\t\t:items=\"areaData.area4\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 4 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 4\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 6\"\r\n\t\t\tv-model=\"entity.area6\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area6, 3)\"\r\n\t\t\t@click:clear=\"clear(3)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 6 ? entity.name6 : '---区/县---'\"\r\n\t\t\t:items=\"areaData.area6\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 6 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 6\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 9\"\r\n\t\t\tv-model=\"entity.area9\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area9, 4)\"\r\n\t\t\t@click:clear=\"clear(4)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 9 ? entity.name9 : '---街/镇---'\"\r\n\t\t\t:items=\"areaData.area9\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 9 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 9\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 12\"\r\n\t\t\tv-model=\"entity.area12\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area12, 5)\"\r\n\t\t\t@click:clear=\"clear(5)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 12 ? entity.name12 : '---村/社---'\"\r\n\t\t\t:items=\"areaData.area12\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block\"\r\n\t\t\tstyle=\"width: 188px\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 12\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t</div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, reactive, onMounted, getCurrentInstance } from 'vue';\r\n\r\nimport Request from \"../../commons/request\"\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n\tname: \"VtkArea\",\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n\tmaxArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: 12,\r\n\t},\r\n\tminArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaStyle: {\r\n\t\ttype: String,\r\n\t\tdefault: \"\",\r\n\t},\r\n});\r\n\r\n// 定义emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 响应式数据\r\nconst entity = reactive({\r\n\tarea2: null,\r\n\tarea4: null,\r\n\tarea6: null,\r\n\tarea9: null,\r\n\tarea12: null,\r\n\tname2: '',\r\n\tname4: '',\r\n\tname6: '',\r\n\tname9: '',\r\n\tname12: ''\r\n});\r\n\r\nconst user = ref({ areacode: \"\" });\r\nconst areaData = reactive({\r\n\tarea2: [],\r\n\tarea4: [],\r\n\tarea6: [],\r\n\tarea9: [],\r\n\tarea12: []\r\n});\r\n\r\n// 安全获取 vtk 对象\r\nconst getVtk = () => {\r\n if (typeof window !== 'undefined' && window.$vtk) {\r\n return window.$vtk;\r\n }\r\n return null;\r\n};\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\t// 获取配置的键名,如果没有配置则使用默认值\r\n\tconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\n\tuser.value = typeof(proxy.$vtk.storage.get(userKey)) != 'object' ? JSON.parse(proxy.$vtk.storage.get(userKey)) : proxy.$vtk.storage.get(userKey) || '';\r\n\tif (user.value) {\r\n\t\tarea();\r\n\t}\r\n});\r\n\r\n// 所属地区\r\nconst area = () => {\r\n try {\r\n proxy.$vtk.message.loading.show();\r\n Request.postForm(`/dict/area/show/${user.value.areacode}`).then((res) => {\r\n proxy.$vtk.message.loading.hide();\r\n if (res.meta.success) {\r\n entity[`area${res.data.areaLeve}`] = res.data.areaCode;\r\n entity.name2 = res.data.province;\r\n entity.name4 = res.data.city;\r\n entity.name6 = res.data.district;\r\n entity.name9 = res.data?.town;\r\n entity.name12 = res.data?.village;\r\n nextArea(user.value.areacode);\r\n } else {\r\n proxy.$vtk.message.toast(res.meta.message);\r\n }\r\n }).catch(error => {\r\n proxy.$vtk.message.loading.hide();\r\n proxy.$vtk.message.toast('加载区域数据失败');\r\n });\r\n } catch (error) {\r\n console.error('初始化区域数据失败:', error);\r\n if (proxy.$vtk.message?.loading?.hide) {\r\n proxy.$vtk.message.loading.hide();\r\n }\r\n }\r\n};\r\n\r\n// 下一级地区列表\r\nconst nextArea = (areaCode, index) => {\r\n\tinputFn(areaCode);\r\n \r\n\tif (areaCode?.length < 12) {\r\n\t\tRequest.postForm(`/dict/area/next/${areaCode}`).then((res) => {\r\n\t\t\tproxy.$vtk.message.loading.hide();\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\tif (index) {\r\n\t\t\t\t\tObject.keys(areaData)\r\n\t\t\t\t\t\t.slice(index, 5)\r\n\t\t\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\t\t\tareaData[e] = [];\r\n\t\t\t\t\t\t\tentity[e] = null;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tareaData[`area${res.data[0].areaLeve}`] = res.data;\r\n\t\t\t} else {\r\n\t\t\t\tproxy.$vtk.message.toast(res.meta.message);\r\n\t\t\t}\r\n\t\t}).catch(error => {\r\n console.error('加载下级区域数据失败:', error);\r\n proxy.$vtk.message.toast('加载下级区域数据失败');\r\n });\r\n\t}\r\n};\r\n\r\n// 清除\r\nconst clear = (index) => {\r\n\tlet arr = Object.keys(areaData);\r\n\tinputFn(entity[arr[index - 2]]);\r\n\tarr.slice(index, 5).forEach((e) => {\r\n\t\tareaData[e] = [];\r\n\t\tentity[e] = null;\r\n\t});\r\n};\r\n\r\n// 输入事件\r\nconst inputFn = (e) => {\r\n\te && emit(\"update:modelValue\", e);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.sel_box {\r\n\twidth: 164px;\r\n}\r\n</style>","<template>\r\n\t<v-menu v-model=\"menu\" :close-on-content-click=\"false\" max-width=\"520\" min-width=\"520\">\r\n\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t<v-btn\r\n\t\t\t\tv-bind=\"props\"\r\n\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\tcolor=\"primary\"\r\n\t\t\t\tclass=\"area-select-btn\"\r\n\t\t\t\t:style=\"$attrs.styles\"\r\n\t\t\t>\r\n\t\t\t\t<span class=\"btn-text\">{{ itemText || '选择地区' }}</span>\r\n\t\t\t\t<v-icon v-if=\"itemText\" size=\"small\" @click.stop=\"textClear\" class=\"ml-2\">mdi-close-circle</v-icon>\r\n\t\t\t</v-btn>\r\n\t\t</template>\r\n\t\t<v-card elevation=\"0\" style=\"width: 350px;\">\r\n\t\t\t<p class=\"pt-3 px-3\">\r\n\t\t\t\t<v-icon color=\"primary\" class=\"mr-1\" size=\"20\">mdi-map-marker-radius</v-icon>\r\n\t\t\t\t<span v-for=\"link in entity\" :key=\"link.areaCode\" class=\"link text-body-2 text-primary\">{{ link.areaName }}</span>\r\n\t\t\t</p>\r\n\t\t\t<v-sheet class=\"rounded-lg mx-3 mt-2\" color=\"#b1b1b117\">\r\n\t\t\t\t<v-tabs v-model=\"tab\" @update:model-value=\"tabArea\" class=\"pt-2 px-1\">\r\n\t\t\t\t\t<v-tab\r\n\t\t\t\t\t\tv-for=\"(item, index) in tabItems\"\r\n\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\tclass=\"mx-1\"\r\n\t\t\t\t\t\t:style=\"tab == index && 'color:white;opacity:1'\"\r\n\t\t\t\t\t\t:disabled=\"areaStorage.length <= index + 1\"\r\n\t\t\t\t\t\tv-show=\"minArea ? minArea >= item.leve : true\"\r\n\t\t\t\t\t>{{ item.text }}</v-tab>\r\n\t\t\t\t</v-tabs>\r\n\t\t\t\t<v-sheet\r\n\t\t\t\t\tv-show=\"index == tab\"\r\n\t\t\t\t\tv-for=\"(item, index) in tabItems\"\r\n\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\tclass=\"px-3 py-1\"\r\n\t\t\t\t\tmin-height=\"100\"\r\n\t\t\t\t\tcolor=\"rgba(0,0,0,0)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<v-chip-group v-model=\"current\" selected-class=\"chipActive\" column>\r\n\t\t\t\t\t\t<v-chip\r\n\t\t\t\t\t\t\tv-for=\"area in areaItems\"\r\n\t\t\t\t\t\t\t:key=\"area.id\"\r\n\t\t\t\t\t\t\t@click=\"areaChange(area, index)\"\r\n\t\t\t\t\t\t\tclass=\"rounded\"\r\n\t\t\t\t\t\t\t:class=\"area.areaCode == user.areacode && 'active'\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{{ area.areaName }}\r\n\t\t\t\t\t\t</v-chip>\r\n\t\t\t\t\t</v-chip-group>\r\n\t\t\t\t</v-sheet>\r\n\t\t\t</v-sheet>\r\n\r\n\t\t\t<v-card-actions class=\"pr-0 py-3\">\r\n\t\t\t\t<v-spacer />\r\n\t\t\t\t<v-btn @click=\"close\" elevation=\"0\" size=\"small\"><v-icon class=\"pt-1 pr-1\">mdi-progress-close</v-icon> 取消</v-btn>\r\n\t\t\t\t<v-btn @click=\"save\" class=\"text-white mr-3\" color=\"primary\" elevation=\"0\" size=\"small\"><v-icon class=\"pt-1 pr-1\">mdi-progress-check</v-icon> 确定</v-btn>\r\n\t\t\t</v-card-actions>\r\n\t\t</v-card>\r\n\t</v-menu>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onMounted, getCurrentInstance, nextTick } from 'vue';\r\n\r\nconst props = defineProps({\r\n\tmodelValue: {\r\n\t\ttype: [String, Object],\r\n\t\tdefault: null,\r\n\t},\r\n\tminArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaNode: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaCode: {\r\n\t\ttype: String,\r\n\t\tdefault: null,\r\n\t},\r\n\treturnObj: {\r\n\t\ttype: Boolean,\r\n\t\tdefault: false,\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits(['update:modelValue', 'change']);\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\nconst menu = ref(false);\r\nconst user = ref({});\r\nconst tab = ref(0);\r\nconst tabItems = ref([]);\r\nconst areaStorage = ref([]); //存储个级别地区数据\r\nconst areaItems = ref([]); //当前选择地区的所有列\r\nconst entity = ref([]); //存储选中的数据\r\nconst current = ref(null); //回显值选中\r\nconst itemValue = ref(\"\"); //传值:最终选择值\r\nconst itemText = ref(\"\"); //最终选择值\r\n\r\n// 值回显\r\nconst view = (code) => {\r\n\tproxy.$vtk.request.getForm(`/dict/area/show/${code}`).then((res) => {\r\n\t\tlet province = res.data.province ? `${res.data.province}` : \"\";\r\n\t\tlet city = res.data.city ? `/${res.data.city}` : \"\";\r\n\t\tlet district = res.data.district ? `/${res.data.district}` : \"\";\r\n\t\tlet town = res.data.town ? `/${res.data.town}` : \"\";\r\n\t\tlet village = res.data.village ? `/${res.data.village}` : \"\";\r\n\t\titemText.value = `${province}${city}${district}${town}${village}`;\r\n\t\tif (props.areaNode && props.areaNode > 0) {\r\n\t\t\titemText.value = itemText.value.split(\"/\").slice(-props.areaNode).join(\"/\");\r\n\t\t}\r\n\t});\r\n};\r\n\r\n// 切换Tab地区级别\r\nconst tabArea = (index) => {\r\n\tareaItems.value = [...areaStorage.value[index]];\r\n\tif (index < entity.value.length) {\r\n\t\tcurrent.value = areaItems.value.findIndex((e) => e.areaCode == entity.value[index].areaCode);\r\n\t} else {\r\n\t\tcurrent.value = null;\r\n\t}\r\n};\r\n\r\n//选择地区\r\nconst areaChange = (item, index) => {\r\n\tentity.value = entity.value.slice(0, index);\r\n\tentity.value.push(item);\r\n\tareaStorage.value = areaStorage.value.slice(0, index + 1);\r\n\tif (tabItems.value.length > tab.value + 1 && (props.minArea ? props.minArea > item.areaCode.length : true)) {\r\n\t\tgetTree(item.areaCode);\r\n\t\ttab.value++;\r\n\t}\r\n};\r\n\r\n// 加载下级地区\r\nconst getTree = (code) => {\r\n\tproxy.$vtk.request.getForm(`/dict/area/next/${code}`).then((res) => {\r\n\t\tareaItems.value = res.data;\r\n\t\tareaStorage.value.push(res.data);\r\n\t\tcurrent.value = null;\r\n\t\tnextTick(); //Vue 3中替代$forceUpdate\r\n\t});\r\n};\r\n\r\n// 加载第一个地区,用户所在地区\r\nconst getAreaName = (code) => {\r\n\tentity.value = [];\r\n\ttabItems.value = [\r\n\t\t{ text: \"省级\", leve: \"2\" },\r\n\t\t{ text: \"市级\", leve: \"4\" },\r\n\t\t{ text: \"区县\", leve: \"6\" },\r\n\t\t{ text: \"街镇\", leve: \"9\" },\r\n\t\t{ text: \"村社\", leve: \"12\" },\r\n\t].filter((e) => e.leve >= (props.areaCode || user.value?.areacode || user.value?.areaCode || '').length);\r\n\tareaStorage.value = [];\r\n\r\n\tproxy.$vtk.request.getForm(`/dict/area/show/${code}`).then((res) => {\r\n\t\tareaItems.value = [{ areaName: res.data.areaName, areaCode: res.data.areaCode }];\r\n\t\tareaStorage.value.push(areaItems.value);\r\n\t\tentity.value.push(areaItems.value[0]);\r\n\t});\r\n};\r\n\r\n//确认保存\r\nconst save = () => {\r\n\tlet text = [];\r\n\tlet val = [];\r\n\tentity.value.forEach((e) => {\r\n\t\ttext.push(e.areaName);\r\n\t\tval.push(e.areaCode);\r\n\t\titemValue.value = e.areaCode;\r\n\t});\r\n\tif (props.areaNode && props.areaNode > 0) {\r\n\t\ttext = text.slice(-props.areaNode);\r\n\t}\r\n\titemText.value = text.join().replace(/,/g, \"/\");\r\n\tconst lastItem = entity.value[entity.value.length - 1];\r\n\temit(\"update:modelValue\", props.returnObj ? { areaCode: lastItem?.areaCode, areaName: lastItem?.areaName } : itemValue.value);\r\n\temit(\"change\");\r\n\tclose();\r\n};\r\n\r\n// 清空\r\nconst textClear = () => {\r\n\ttab.value = 0;\r\n\tconst initCode = props.areaCode || user.value?.areacode || user.value?.areaCode;\r\n\tgetAreaName(initCode);\r\n\titemValue.value = initCode;\r\n\temit(\"update:modelValue\", itemValue.value);\r\n\temit(\"change\");\r\n};\r\n\r\n// 关闭弹窗\r\nconst close = () => {\r\n\tmenu.value = false;\r\n};\r\n\r\n// Watch modelValue\r\nwatch(() => props.modelValue, (newVal, oldVal) => {\r\n\tif (newVal && newVal != oldVal) {\r\n\t\tconst code = typeof newVal === 'object' ? newVal.areaCode : newVal;\r\n\t\tif (code) view(code);\r\n\t}\r\n});\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\t// 获取配置的键名,如果没有配置则使用默认值\r\n\tconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\n\tuser.value = proxy.$vtk.storage.get(userKey) && JSON.parse(proxy.$vtk.storage.get(userKey));\r\n\tconst initCode = props.areaCode || user.value?.areacode || user.value?.areaCode;\r\n\tif (initCode) {\r\n\t\tgetAreaName(initCode);\r\n\t}\r\n\tif (props.modelValue) {\r\n\t\tconst code = typeof props.modelValue === 'object' ? props.modelValue.areaCode : props.modelValue;\r\n\t\tif (code) view(code);\r\n\t}\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// 圆形按钮样式\r\n.area-select-btn {\r\n\tborder-radius: 20px !important;\r\n\tpadding: 6px 20px !important;\r\n\tmin-width: 120px;\r\n\theight: 36px !important;\r\n\ttext-transform: none;\r\n\tletter-spacing: normal;\r\n\r\n\t.btn-text {\r\n\t\tfont-size: 14px;\r\n\t\tcolor: inherit;\r\n\t}\r\n\r\n\t&:hover {\r\n\t\tbackground-color: rgba(var(--v-theme-primary), 0.08);\r\n\t}\r\n}\r\n:deep(.v-tab__slider) {\r\n\theight: 0px !important;\r\n}\r\n\r\n.link::after {\r\n\tcontent: \" / \";\r\n\tfont-size: 14px;\r\n\tcolor: #999;\r\n}\r\n.link:last-of-type::after {\r\n\tcontent: \"\";\r\n}\r\n:deep(.v-chip:not(.v-chip--selected)) {\r\n\tbackground: #e0e0e000;\r\n}\r\n// Vuetify 3 tabs container styling\r\n:deep(.v-tabs) {\r\n\theight: 40px;\r\n}\r\n// Tab button styling\r\n:deep(.v-tab) {\r\n\tmin-width: 90px;\r\n\theight: 32px !important;\r\n\tborder-radius: 6px !important;\r\n\tcolor: rgba(0, 0, 0, .6);\r\n\ttransition: all 0.3s ease;\r\n\tz-index: 1;\r\n}\r\n// Active/selected tab styling\r\n:deep(.v-tab--selected) {\r\n\tbackground-color: rgb(var(--v-theme-primary));\r\n\tcolor: white !important;\r\n\topacity: 1;\r\n}\r\n// Hover effect\r\n:deep(.v-tab:hover) {\r\n\tbackground-color: rgba(var(--v-theme-primary), 0.9);\r\n\tcolor: white;\r\n}\r\n.tabActive {\r\n\tcolor: #fff;\r\n}\r\n.chipActive {\r\n\tcolor: #0095ff !important;\r\n\tbackground-color: #008eff05 !important;\r\n}\r\n.active {\r\n\tcolor: #0095ff !important;\r\n\tbackground-color: #008eff20 !important;\r\n}\r\n:deep(.v-slide-group__next),\r\n:deep(.v-slide-group__prev) {\r\n\tdisplay: none;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"vtk-breadcrumb-wrapper d-flex align-center justify-space-between\">\r\n <!-- 左侧面包屑 -->\r\n <v-breadcrumbs :items=\"breadcrumbItems\" class=\"pa-0\">\r\n <template v-slot:divider>\r\n <v-icon>mdi-chevron-right</v-icon>\r\n </template>\r\n <template v-slot:item=\"{ item }\">\r\n <v-breadcrumbs-item\r\n :title=\"item.title\"\r\n :to=\"item.to\"\r\n :disabled=\"item.disabled\"\r\n :class=\"{ 'text-primary': !item.disabled }\"\r\n >\r\n {{ item.title }}\r\n </v-breadcrumbs-item>\r\n </template>\r\n </v-breadcrumbs>\r\n\r\n <!-- 右侧返回按钮 -->\r\n <v-btn\r\n v-if=\"showBack\"\r\n variant=\"text\"\r\n color=\"primary\"\r\n prepend-icon=\"mdi-arrow-left\"\r\n @click=\"handleBack\"\r\n style=\"height: 36px;\"\r\n >\r\n {{ backText }}\r\n </v-btn>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, inject, getCurrentInstance } from 'vue'\r\n\r\nconst props = defineProps({\r\n // 面包屑项目数组\r\n items: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否显示返回按钮\r\n showBack: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 返回按钮文字\r\n backText: {\r\n type: String,\r\n default: '返回'\r\n },\r\n // 自定义返回路径,不传则返回上一级\r\n backTo: {\r\n type: [String, Object],\r\n default: null\r\n }\r\n})\r\n\r\nconst emit = defineEmits(['back'])\r\n\r\n// 使用inject安全地获取router和route\r\nconst router = inject('router', null)\r\nconst route = inject('route', null)\r\n\r\n// 处理面包屑数据\r\nconst breadcrumbItems = computed(() => {\r\n if (props.items && props.items.length > 0) {\r\n return props.items.map((item, index) => ({\r\n title: item.title || item.text || item.name,\r\n to: item.to || item.path || item.href,\r\n disabled: item.disabled !== undefined ? item.disabled : index === props.items.length - 1\r\n }))\r\n }\r\n\r\n // 如果route不可用,返回空数组\r\n if (!route) {\r\n return []\r\n }\r\n\r\n // 如果没有传入items,尝试从路由meta中获取\r\n const matched = route.matched?.filter(r => r.meta && r.meta.breadcrumb) || []\r\n if (matched.length > 0) {\r\n return matched.map((r, index) => ({\r\n title: r.meta.breadcrumb,\r\n to: r.path,\r\n disabled: index === matched.length - 1\r\n }))\r\n }\r\n\r\n // 默认返回当前路由路径生成的面包屑\r\n const pathArray = route.path?.split('/').filter(p => p) || []\r\n return pathArray.map((path, index) => {\r\n const routePath = '/' + pathArray.slice(0, index + 1).join('/')\r\n return {\r\n title: path.charAt(0).toUpperCase() + path.slice(1),\r\n to: routePath,\r\n disabled: index === pathArray.length - 1\r\n }\r\n })\r\n})\r\n\r\n// 处理返回按钮点击\r\nconst handleBack = () => {\r\n // 触发back事件\r\n emit('back')\r\n\r\n // 如果router不可用,仅触发事件\r\n if (!router) {\r\n return\r\n }\r\n\r\n // 如果传入了backTo参数,跳转到指定路径\r\n if (props.backTo) {\r\n if (typeof props.backTo === 'string') {\r\n router.push(props.backTo)\r\n } else {\r\n router.push(props.backTo)\r\n }\r\n } else {\r\n // 默认返回上一级\r\n router.back()\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-breadcrumb-wrapper {\r\n width: 100%;\r\n padding: 12px 0;\r\n\r\n :deep(.v-breadcrumbs) {\r\n flex-grow: 1;\r\n height: 36px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-item) {\r\n font-size: 14px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-divider) {\r\n padding: 0 8px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-item--disabled) {\r\n opacity: 0.6;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <VInput \r\n v-bind=\"inputAttrs\" \r\n :model-value=\"inputValue\"\r\n >\r\n <div class=\"checkGroup\" :class=\"inline ? 'd-flex flex-wrap align-top' : 'd-inline-block'\">\r\n <VCheckbox\r\n v-for=\"item in items\"\r\n hide-details\r\n :key=\"item.id || item.code\"\r\n :label=\"item.codeValue\"\r\n :value=\"item.code\"\r\n v-model=\"localValue\"\r\n v-bind=\"checkboxAttrs\"\r\n :class=\"inline ? 'mr-4' : ''\"\r\n />\r\n </div>\r\n </VInput>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs, computed, watch } from 'vue';\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkCheckbox\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n /**\r\n * 字典来源:\r\n * - 若为静态数据,格式如:\"0:否/1:是\"\r\n * - 若为字典键,格式如:\"DISABLE_TYPE\"\r\n */\r\n list: {\r\n type: String,\r\n required: true,\r\n },\r\n /**\r\n * 是否横向排列\r\n */\r\n inline: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 绑定值\r\n */\r\n modelValue: {\r\n type: [Array, String],\r\n default: () => []\r\n }\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 本地选中值\r\nconst localValue = ref([]);\r\n\r\n// 防止递归更新的标志位\r\nconst isUpdatingLocal = ref(false);\r\nconst isUpdatingModel = ref(false);\r\n\r\n// 同步外部 modelValue 到本地值\r\nwatch(() => props.modelValue, (newVal) => {\r\n if (isUpdatingModel.value) {\r\n isUpdatingModel.value = false;\r\n return;\r\n }\r\n \r\n isUpdatingLocal.value = true;\r\n if (Array.isArray(newVal)) {\r\n localValue.value = [...newVal];\r\n } else if (typeof newVal === 'string') {\r\n localValue.value = newVal ? [newVal] : [];\r\n } else {\r\n localValue.value = [];\r\n }\r\n}, { immediate: true });\r\n\r\n// 同步本地值到外部 modelValue\r\nwatch(localValue, (newVal) => {\r\n if (isUpdatingLocal.value) {\r\n isUpdatingLocal.value = false;\r\n return;\r\n }\r\n \r\n isUpdatingModel.value = true;\r\n emit('update:modelValue', newVal);\r\n}, { deep: true });\r\n\r\n// 获取透传属性\r\nconst attrs = useAttrs();\r\n\r\n// 分离传递给 input 和传递给 checkbox 的属性\r\nconst inputAttrs = computed(() => {\r\n const { list, inline, modelValue, ...rest } = attrs;\r\n return rest;\r\n});\r\n\r\nconst checkboxAttrs = computed(() => {\r\n // 移除表单验证相关属性,避免重复应用\r\n const { \r\n list, \r\n inline, \r\n modelValue,\r\n error, \r\n 'error-messages': errorMessages, \r\n rules, \r\n hint, \r\n 'persistent-hint': persistentHint,\r\n ...rest \r\n } = attrs;\r\n return rest;\r\n});\r\n\r\n// 为 v-input 提供一个值\r\nconst inputValue = computed(() => {\r\n return localValue.value && localValue.value.length > 0 ? localValue.value : null;\r\n});\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 处理静态数据(如 \"0:否/1:是\")\r\nconst statc = () => {\r\n props.list.split('/').forEach(it => {\r\n const [code, codeValue] = it.split(':');\r\n items.value.push({ code, codeValue });\r\n });\r\n};\r\n\r\n// 请求远程字典数据\r\nconst miscs = async () => {\r\n try {\r\n const res = await Request.getForm(`dict/misc/list/${props.list}`);\r\n items.value = res.data || [];\r\n } catch (error) {\r\n console.error('[VtkCheckbox] Failed to load dictionary:', error);\r\n items.value = [];\r\n }\r\n};\r\n\r\n// 组件挂载时初始化数据\r\nonMounted(() => {\r\n if (props.list.includes(':')) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n:deep(.v-checkbox .v-selection-control) {\r\n margin: 0;\r\n padding: 0;\r\n min-height: 32px;\r\n}\r\n\r\n:deep(.v-input__details) {\r\n padding-inline: 16px;\r\n}\r\n</style>","<!-- \r\n\r\n// 基础用法\r\n <VtkCount :start=\"0\" :end=\"12345\" :duration=\"3000\" suffix=\"次\" />\r\n \r\n//带前缀和分隔符\r\n <VtkCount \r\n :start=\"0\" \r\n :end=\"999999\" \r\n :duration=\"2000\" \r\n prefix=\"¥\" \r\n suffix=\"元\" \r\n :separator=\"true\" \r\n />\r\n \r\n//手动控制\r\n <VtkCount \r\n ref=\"countRef\" \r\n :start=\"0\" \r\n :end=\"100\" \r\n :autoplay=\"false\" \r\n @complete=\"onComplete\"\r\n />\r\n <VBtn @click=\"startCount\">开始计数</VBtn>\r\n -->\r\n\r\n<template>\r\n <div class=\"vtk-count\" :class=\"containerClass\">\r\n <div class=\"count-display\" :style=\"{ color: color }\">\r\n <!-- 前缀 -->\r\n <span v-if=\"prefix\" class=\"prefix\">{{ prefix }}</span>\r\n \r\n <!-- 数字容器 -->\r\n <div class=\"digits-container\">\r\n <div \r\n v-for=\"(digitChar, index) in maxDigitString\" \r\n :key=\"`digit-${index}-${digitKey}`\"\r\n class=\"digit-wrapper\"\r\n :class=\"{ 'digit-separator': isNaN(digitChar) }\"\r\n >\r\n <div \r\n v-if=\"!isNaN(digitChar)\" \r\n class=\"digit-scroll\"\r\n >\r\n <div \r\n v-for=\"n in 10\" \r\n :key=\"n\" \r\n class=\"digit-item\"\r\n :style=\"getDigitStyle(getCurrentDigit(index), n-1)\"\r\n >\r\n {{ n-1 }}\r\n </div>\r\n </div>\r\n <div v-else class=\"separator\">{{ digitChar }}</div>\r\n </div>\r\n </div>\r\n \r\n <!-- 后缀 -->\r\n <span v-if=\"suffix\" class=\"suffix\">{{ suffix }}</span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, onMounted, watch, nextTick } from 'vue'\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkCount\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 初始值\r\n start: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 目标值\r\n end: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 动画持续时间(毫秒)\r\n duration: {\r\n type: Number,\r\n default: 2000\r\n },\r\n // 是否自动开始动画\r\n autoplay: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 数字前缀\r\n prefix: {\r\n type: String,\r\n default: ''\r\n },\r\n // 数字后缀\r\n suffix: {\r\n type: String,\r\n default: ''\r\n },\r\n // 容器自定义类名\r\n containerClass: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否使用分隔符(千分位)\r\n separator: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 小数位数\r\n decimals: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 文字颜色\r\n color: {\r\n type: String,\r\n default: '#1976d2'\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['complete'])\r\n\r\n// 当前显示的数值\r\nconst currentNumber = ref(props.start)\r\n\r\n// 当前每个位置的数字值\r\nconst currentDigits = ref([])\r\n\r\n// 用于强制重新渲染的key\r\nconst digitKey = ref(0)\r\n\r\n// 是否正在动画中\r\nconst isAnimating = ref(false)\r\n\r\n// 格式化数字(处理小数和分隔符)\r\nconst formatNumber = (num) => {\r\n let result = num.toFixed(props.decimals)\r\n if (props.separator && props.decimals === 0) {\r\n result = result.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\r\n }\r\n return result\r\n}\r\n\r\n// 获取目标数字字符串\r\nconst targetNumberString = computed(() => {\r\n return formatNumber(props.end)\r\n})\r\n\r\n// 获取起始数字字符串\r\nconst startNumberString = computed(() => {\r\n return formatNumber(props.start)\r\n})\r\n\r\n// 获取最大位数的字符串(用于保持DOM结构稳定)\r\nconst maxDigitString = computed(() => {\r\n const target = targetNumberString.value\r\n const start = startNumberString.value\r\n return target.length >= start.length ? target : start\r\n})\r\n\r\n// 获取当前指定位置的数字\r\nconst getCurrentDigit = (index) => {\r\n if (index < currentDigits.value.length) {\r\n return currentDigits.value[index]\r\n }\r\n return '0'\r\n}\r\n\r\n// 初始化数字数组\r\nconst initDigitsArray = () => {\r\n const targetStr = targetNumberString.value\r\n const startStr = startNumberString.value\r\n \r\n // 初始化currentDigits数组,确保长度与maxDigitString一致\r\n currentDigits.value = maxDigitString.value.split('').map((char, index) => {\r\n if (isNaN(char)) {\r\n return char // 分隔符保持原样\r\n }\r\n \r\n // 从起始字符串对应位置获取数字\r\n if (index < startStr.length) {\r\n const startChar = startStr[index]\r\n return isNaN(startChar) ? '0' : startChar\r\n }\r\n return '0'\r\n })\r\n}\r\n\r\n// 获取数字样式\r\nconst getDigitStyle = (currentValue, digitValue) => {\r\n // 如果是分隔符,直接返回\r\n if (isNaN(currentValue) || isNaN(digitValue)) {\r\n return {\r\n transform: 'translateY(0)'\r\n }\r\n }\r\n \r\n const current = parseInt(currentValue) || 0\r\n const target = digitValue\r\n const offset = target - current\r\n \r\n // 处理循环滚动(9->0 或 0->9)\r\n let translateY\r\n if (offset > 5) {\r\n // 向下滚动(如 9->0)\r\n translateY = -(10 - offset) * 100\r\n } else if (offset < -5) {\r\n // 向上滚动(如 0->9)\r\n translateY = (10 + offset) * 100\r\n } else {\r\n translateY = -offset * 100\r\n }\r\n \r\n return {\r\n transform: `translateY(${translateY}%)`,\r\n transition: isAnimating.value ? 'transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)' : 'none',\r\n color: props.color\r\n }\r\n}\r\n\r\n// 开始数字动画\r\nconst startAnimation = () => {\r\n if (isAnimating.value) return\r\n \r\n isAnimating.value = true\r\n const startTime = performance.now()\r\n const startValue = props.start\r\n const endValue = props.end\r\n const diff = endValue - startValue\r\n \r\n // 初始化数字数组\r\n initDigitsArray()\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime\r\n const progress = Math.min(elapsed / props.duration, 1)\r\n \r\n // 使用缓动函数使动画更自然\r\n const easeOutQuart = 1 - Math.pow(1 - progress, 4)\r\n currentNumber.value = startValue + diff * easeOutQuart\r\n \r\n // 更新每个数字位的当前值\r\n updateDigitArray(currentNumber.value)\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate)\r\n } else {\r\n currentNumber.value = endValue\r\n // 确保最终值准确\r\n updateDigitArray(endValue)\r\n isAnimating.value = false\r\n emit('complete')\r\n }\r\n }\r\n \r\n requestAnimationFrame(animate)\r\n}\r\n\r\n// 更新数字数组\r\nconst updateDigitArray = (value) => {\r\n const valueStr = formatNumber(value)\r\n const maxStr = maxDigitString.value\r\n \r\n // 保持数组长度不变,只更新值\r\n for (let i = 0; i < maxStr.length; i++) {\r\n if (i < valueStr.length) {\r\n currentDigits.value[i] = valueStr[i]\r\n } else {\r\n // 超出部分保持为'0'或分隔符\r\n currentDigits.value[i] = isNaN(maxStr[i]) ? maxStr[i] : '0'\r\n }\r\n }\r\n}\r\n\r\n// 监听 end 值变化,重新开始动画\r\nwatch(() => props.end, (newVal, oldVal) => {\r\n if (newVal !== oldVal) {\r\n // 当位数可能发生变化时,更新key强制重新渲染\r\n const newStr = formatNumber(newVal)\r\n const oldStr = formatNumber(oldVal)\r\n if (newStr.length !== oldStr.length) {\r\n digitKey.value += 1\r\n nextTick(() => {\r\n startAnimation()\r\n })\r\n } else {\r\n startAnimation()\r\n }\r\n }\r\n})\r\n\r\n// 组件挂载时开始动画\r\nonMounted(() => {\r\n if (props.autoplay) {\r\n // 检查初始值和目标值位数是否不同,如果不同则更新key\r\n const startStr = startNumberString.value\r\n const endStr = targetNumberString.value\r\n if (startStr.length !== endStr.length) {\r\n digitKey.value += 1\r\n }\r\n \r\n nextTick(() => {\r\n startAnimation()\r\n })\r\n }\r\n})\r\n\r\n// 提供外部调用方法\r\ndefineExpose({\r\n startAnimation\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-count {\r\n display: inline-block;\r\n}\r\n\r\n.count-display {\r\n display: flex;\r\n align-items: center;\r\n font-family: 'Roboto Mono', monospace;\r\n font-size: 24px;\r\n font-weight: bold;\r\n}\r\n\r\n.digits-container {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.digit-wrapper {\r\n position: relative;\r\n width: 1em;\r\n height: 1em;\r\n overflow: hidden;\r\n text-align: center;\r\n margin: 0 1px;\r\n}\r\n\r\n.digit-wrapper.digit-separator {\r\n width: auto;\r\n animation: none;\r\n}\r\n\r\n.digit-scroll {\r\n position: relative;\r\n height: 100%;\r\n}\r\n\r\n.digit-item {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.separator {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n font-weight: normal;\r\n}\r\n\r\n.prefix, .suffix {\r\n font-size: 0.8em;\r\n align-self: flex-end;\r\n margin-bottom: 0.1em;\r\n}\r\n\r\n.prefix {\r\n margin-right: 4px;\r\n}\r\n\r\n.suffix {\r\n margin-left: 4px;\r\n}\r\n\r\n/* 响应式设计 */\r\n@media (max-width: 768px) {\r\n .count-display {\r\n font-size: 20px;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .count-display {\r\n font-size: 18px;\r\n }\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-date-range-picker\">\r\n <VMenu\r\n v-model=\"menu\"\r\n :close-on-content-click=\"false\"\r\n transition=\"scale-transition\"\r\n offset-y\r\n min-width=\"auto\"\r\n eager\r\n >\r\n <template #activator=\"{ props: activatorProps }\">\r\n <VTextField\r\n v-bind=\"{ ...activatorProps, ...textFieldProps }\"\r\n v-model=\"displayValue\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n readonly\r\n clearable\r\n density=\"compact\"\r\n variant=\"outlined\"\r\n @click:clear=\"clearValue\"\r\n >\r\n <template #prepend-inner>\r\n <VIcon size=\"small\">mdi-calendar</VIcon>\r\n </template>\r\n </VTextField>\r\n </template>\r\n \r\n <VCard style=\"width: 650px;\">\r\n <VCardText class=\"pa-0\">\r\n <div class=\"date-picker-container\">\r\n <VDatePicker\r\n v-model=\"startDateRange\"\r\n hide-header\r\n :min=\"minDate\"\r\n :max=\"maxDate\"\r\n :show-current=\"showCurrent\"\r\n @update:model-value=\"onStartDateChange\"\r\n class=\"date-picker-item\"\r\n />\r\n <VDatePicker\r\n v-model=\"endDateRange\"\r\n hide-header\r\n :min=\"minDate\"\r\n :max=\"maxDate\"\r\n :show-current=\"showCurrent\"\r\n @update:model-value=\"onEndDateChange\"\r\n class=\"date-picker-item\"\r\n />\r\n </div>\r\n </VCardText>\r\n \r\n <VDivider></VDivider>\r\n \r\n <VCardActions>\r\n <VSpacer></VSpacer>\r\n <VBtn text @click=\"cancel\">取消</VBtn>\r\n <VBtn color=\"primary\" variant=\"tonal\" @click=\"confirm\">确定</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VMenu>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, useAttrs } from 'vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkDatePicker\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n // v-model绑定值\r\n modelValue: {\r\n type: [Array, String],\r\n default: () => []\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: '请选择日期范围'\r\n },\r\n // 禁用状态\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最小日期\r\n min: {\r\n type: String,\r\n default: undefined\r\n },\r\n // 最大日期\r\n max: {\r\n type: String,\r\n default: undefined\r\n },\r\n // 是否显示当前日期\r\n showCurrent: {\r\n type: [Boolean, String],\r\n default: true\r\n },\r\n // 显示格式\r\n format: {\r\n type: String,\r\n default: 'YYYY-MM-DD'\r\n },\r\n // 分隔符\r\n separator: {\r\n type: String,\r\n default: ' 至 '\r\n }\r\n});\r\n\r\n// 定义emit事件\r\nconst emit = defineEmits(['update:modelValue', 'change']);\r\n\r\n// 获取透传属性\r\nconst attrs = useAttrs();\r\n\r\n// 菜单显示控制\r\nconst menu = ref(false);\r\n\r\n// 日期范围值\r\nconst dateRange = ref([]);\r\n\r\n// 为了横向排列,需要分别管理开始和结束日期选择器的值\r\nconst startDateRange = ref(null);\r\nconst endDateRange = ref(null);\r\n\r\n\r\n// 显示值\r\nconst displayValue = computed(() => {\r\n if (!dateRange.value || dateRange.value.length === 0) {\r\n return '';\r\n }\r\n \r\n if (dateRange.value.length === 1) {\r\n return formatDate(dateRange.value[0]);\r\n }\r\n \r\n return `${formatDate(dateRange.value[0])}${props.separator}${formatDate(dateRange.value[1])}`;\r\n});\r\n\r\n// 文本框属性\r\nconst textFieldProps = computed(() => {\r\n // 排除我们自己使用的属性\r\n const { \r\n modelValue, \r\n placeholder, \r\n disabled, \r\n min, \r\n max, \r\n showCurrent, \r\n format,\r\n separator,\r\n ...rest \r\n } = attrs;\r\n \r\n return rest;\r\n});\r\n\r\n// 格式化日期\r\nconst formatDate = (date) => {\r\n if (!date) return '';\r\n \r\n // 如果是字符串直接返回\r\n if (typeof date === 'string') {\r\n return date;\r\n }\r\n \r\n // 如果是 Date 对象\r\n if (date instanceof Date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n \r\n return date;\r\n};\r\n\r\n// 最小日期\r\nconst minDate = computed(() => props.min);\r\n\r\n// 最大日期\r\nconst maxDate = computed(() => props.max);\r\n\r\n// 监听外部modelValue变化\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (Array.isArray(newValue) && newValue.length > 0) {\r\n dateRange.value = [...newValue];\r\n // 同步到单独的日期选择器\r\n if (newValue[0]) startDateRange.value = newValue[0];\r\n if (newValue[1]) endDateRange.value = newValue[1];\r\n } else if (typeof newValue === 'string' && newValue) {\r\n // 处理字符串形式的日期范围,如 \"2023-01-01 至 2023-01-31\"\r\n const dates = newValue.split(props.separator);\r\n if (dates.length === 2) {\r\n dateRange.value = [dates[0].trim(), dates[1].trim()];\r\n startDateRange.value = dates[0].trim();\r\n endDateRange.value = dates[1].trim();\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n },\r\n { immediate: true }\r\n);\r\n\r\n\r\n// 开始日期变化处理\r\nconst onStartDateChange = (value) => {\r\n // 更新日期范围的第一个值\r\n if (value) {\r\n dateRange.value = [value, dateRange.value[1] || null];\r\n } else {\r\n // 如果开始日期被清除,清除整个范围或只清除开始日期\r\n if (dateRange.value.length > 0) {\r\n dateRange.value = [null, dateRange.value[1] || null];\r\n }\r\n }\r\n};\r\n\r\n// 结束日期变化处理\r\nconst onEndDateChange = (value) => {\r\n // 更新日期范围的第二个值\r\n if (value) {\r\n dateRange.value = [dateRange.value[0] || null, value];\r\n } else {\r\n // 如果结束日期被清除,只清除结束日期\r\n if (dateRange.value.length > 1) {\r\n dateRange.value = [dateRange.value[0] || null, null];\r\n }\r\n }\r\n};\r\n\r\n// 清除值\r\nconst clearValue = () => {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n emit('update:modelValue', []);\r\n emit('change', []);\r\n menu.value = false;\r\n};\r\n\r\n// 取消\r\nconst cancel = () => {\r\n // 恢复到原始值\r\n if (Array.isArray(props.modelValue)) {\r\n dateRange.value = [...props.modelValue];\r\n if (props.modelValue[0]) startDateRange.value = props.modelValue[0];\r\n if (props.modelValue[1]) endDateRange.value = props.modelValue[1];\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n menu.value = false;\r\n};\r\n\r\n// 确认\r\nconst confirm = () => {\r\n // 确保日期按顺序排列\r\n let sortedRange = [...dateRange.value].filter(date => date !== null);\r\n if (sortedRange.length === 2) {\r\n const date1 = new Date(sortedRange[0]);\r\n const date2 = new Date(sortedRange[1]);\r\n if (date1 > date2) {\r\n sortedRange = [sortedRange[1], sortedRange[0]];\r\n }\r\n } else if (sortedRange.length === 1) {\r\n // 如果只有一个日期,复制为范围\r\n sortedRange = [sortedRange[0], sortedRange[0]];\r\n }\r\n \r\n emit('update:modelValue', sortedRange);\r\n emit('change', sortedRange);\r\n menu.value = false;\r\n};\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-date-range-picker {\r\n width: 100%;\r\n}\r\n\r\n.date-picker-container {\r\n display: flex;\r\n flex-direction: row;\r\n gap: 0;\r\n}\r\n\r\n.date-picker-item {\r\n flex: 1;\r\n max-width: 50%;\r\n}\r\n\r\n.date-picker-item:first-child {\r\n border-right: 1px solid rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n:deep(.v-picker) {\r\n border-radius: 0;\r\n}\r\n\r\n:deep(.v-date-picker-month__day--adjacent) {\r\n opacity: 0.5;\r\n}\r\n\r\n:deep(.v-date-picker-title) {\r\n display: none;\r\n}\r\n</style>","<template>\n <div ref=\"headerRef\" class=\"panel-header\" @keydown.esc.stop=\"closePicker\">\n <button type=\"button\" class=\"panel-nav\" aria-label=\"上一周期\" @click=\"handleNavigate('prev')\">‹</button>\n\n <div class=\"panel-title\">\n <button type=\"button\" class=\"title-trigger\" :class=\"{ active: openPicker === 'year' }\"\n :aria-expanded=\"openPicker === 'year'\" aria-label=\"选择年份\" @click.stop=\"togglePicker('year')\">\n {{ year }}年\n </button>\n <button v-if=\"showMonth\" type=\"button\" class=\"title-trigger month-trigger\"\n :class=\"{ active: openPicker === 'month' }\" :aria-expanded=\"openPicker === 'month'\" aria-label=\"选择月份\"\n @click.stop=\"togglePicker('month')\">\n {{ month + 1 }}月\n </button>\n </div>\n\n <button type=\"button\" class=\"panel-nav\" aria-label=\"下一周期\" @click=\"handleNavigate('next')\">›</button>\n\n <div v-if=\"openPicker\" class=\"panel-popover\" @click.stop>\n <template v-if=\"openPicker === 'year'\">\n <div class=\"picker-navigation\">\n <button type=\"button\" class=\"picker-nav\" aria-label=\"上一组年份\" @click=\"shiftYearPage(-YEAR_PAGE_SIZE)\">\n ‹\n </button>\n <span class=\"picker-range\">{{ yearPage[0] }} - {{ yearPage[yearPage.length - 1] }}</span>\n <button type=\"button\" class=\"picker-nav\" :disabled=\"!canShowNextYearPage\" aria-label=\"下一组年份\"\n @click=\"shiftYearPage(YEAR_PAGE_SIZE)\">\n ›\n </button>\n </div>\n <div class=\"picker-grid year-picker-grid\">\n <button v-for=\"item in yearPage\" :key=\"item\" type=\"button\" class=\"picker-option\"\n :class=\"{ selected: item === year }\" :disabled=\"isYearDisabled(item)\" @click=\"selectYear(item)\">\n {{ item }}\n </button>\n </div>\n </template>\n\n <template v-else>\n <div class=\"picker-caption\">{{ year }}年</div>\n <div class=\"picker-grid month-picker-grid\">\n <button v-for=\"(item, index) in MONTHS\" :key=\"item\" type=\"button\" class=\"picker-option\"\n :class=\"{ selected: index === month }\" :disabled=\"isMonthDisabled(index)\" @click=\"selectMonth(index)\">\n {{ item }}\n </button>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkDatePanelHeader',\n});\n\nconst props = defineProps({\n year: {\n type: Number,\n required: true\n },\n month: {\n type: Number,\n default: 0\n },\n showMonth: {\n type: Boolean,\n default: true\n },\n maxYear: {\n type: Number,\n default: null\n },\n maxMonth: {\n type: Number,\n default: 11\n }\n});\n\nconst emit = defineEmits(['update:year', 'update:month', 'prev', 'next']);\n\nconst YEAR_PAGE_SIZE = 12;\nconst YEAR_PAGE_CENTER_OFFSET = 4;\nconst MONTHS = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\n\nconst getYearPageStart = (year) => year - YEAR_PAGE_CENTER_OFFSET;\n\nconst openPicker = ref(null);\nconst yearPageStart = ref(getYearPageStart(props.year));\nconst headerRef = ref(null);\n\nconst yearPage = computed(() =>\n Array.from({ length: YEAR_PAGE_SIZE }, (_, index) => yearPageStart.value + index)\n);\n\nconst canShowNextYearPage = computed(() =>\n props.maxYear === null || yearPageStart.value + YEAR_PAGE_SIZE <= props.maxYear\n);\n\nconst isYearDisabled = (year) => props.maxYear !== null && year > props.maxYear;\n\nconst isMonthDisabled = (month) => {\n if (props.maxYear === null || props.year < props.maxYear) return false;\n if (props.year > props.maxYear) return true;\n return month > props.maxMonth;\n};\n\nconst togglePicker = (type) => {\n if (openPicker.value === type) {\n closePicker();\n return;\n }\n\n if (type === 'year') {\n yearPageStart.value = getYearPageStart(props.year);\n }\n openPicker.value = type;\n};\n\nconst closePicker = () => {\n openPicker.value = null;\n};\n\nconst shiftYearPage = (offset) => {\n const nextStart = yearPageStart.value + offset;\n if (offset > 0 && props.maxYear !== null && nextStart > props.maxYear) return;\n yearPageStart.value = nextStart;\n};\n\nconst selectYear = (year) => {\n if (isYearDisabled(year)) return;\n\n emit('update:year', year);\n if (props.showMonth) {\n if (props.maxYear !== null && year === props.maxYear && props.month > props.maxMonth) {\n emit('update:month', props.maxMonth);\n }\n openPicker.value = 'month';\n } else {\n closePicker();\n }\n};\n\nconst selectMonth = (month) => {\n if (isMonthDisabled(month)) return;\n emit('update:month', month);\n closePicker();\n};\n\nconst handleNavigate = (direction) => {\n closePicker();\n emit(direction);\n};\n\nconst handleOutsideClick = (event) => {\n if (openPicker.value && !headerRef.value?.contains(event.target)) {\n closePicker();\n }\n};\n\nwatch(() => props.year, (year) => {\n if (openPicker.value !== 'year') {\n yearPageStart.value = getYearPageStart(year);\n }\n});\n\nonMounted(() => document.addEventListener('click', handleOutsideClick));\nonBeforeUnmount(() => document.removeEventListener('click', handleOutsideClick));\n</script>\n\n<style scoped>\n.panel-header {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 30px;\n margin-bottom: 4px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 112px;\n}\n\n.title-trigger,\n.panel-nav,\n.picker-nav,\n.picker-option {\n border: 0;\n outline: none;\n font: inherit;\n}\n\n.title-trigger {\n position: relative;\n padding: 5px 17px 5px 7px;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.title-trigger::after {\n position: absolute;\n top: 10px;\n right: 7px;\n width: 5px;\n height: 5px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n content: '';\n transform: rotate(45deg);\n transition: transform 0.18s ease;\n}\n\n.title-trigger:hover,\n.title-trigger.active {\n background: rgb(var(--v-theme-primary), 0.1);\n color: rgb(var(--v-theme-primary));\n}\n\n.title-trigger.active::after {\n top: 12px;\n transform: rotate(225deg);\n}\n\n.month-trigger {\n margin-left: 1px;\n}\n\n.panel-nav,\n.picker-nav {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface), 0.55);\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.panel-nav {\n width: 24px;\n height: 24px;\n font-size: 17px;\n}\n\n.panel-nav:hover,\n.picker-nav:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n color: rgb(var(--v-theme-on-surface));\n}\n\n.panel-popover {\n position: absolute;\n z-index: 5;\n top: 34px;\n left: 50%;\n width: 204px;\n padding: 10px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 8px;\n background: rgb(var(--v-theme-surface));\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16);\n transform: translateX(-50%);\n}\n\n.picker-navigation {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.picker-range,\n.picker-caption {\n color: rgb(var(--v-theme-on-surface), 0.72);\n font-size: 12px;\n font-weight: 600;\n}\n\n.picker-caption {\n margin-bottom: 8px;\n text-align: center;\n}\n\n.picker-nav {\n width: 24px;\n height: 24px;\n font-size: 16px;\n}\n\n.picker-nav:disabled {\n color: rgb(var(--v-theme-on-surface), 0.22);\n cursor: not-allowed;\n}\n\n.picker-grid {\n display: grid;\n gap: 6px;\n}\n\n.year-picker-grid,\n.month-picker-grid {\n grid-template-columns: repeat(4, 1fr);\n}\n\n.picker-option {\n min-width: 0;\n padding: 7px 2px;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface), 0.82);\n font-size: 12px;\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.picker-option:hover:not(:disabled) {\n background: rgb(var(--v-theme-primary), 0.1);\n color: rgb(var(--v-theme-primary));\n}\n\n.picker-option.selected {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n font-weight: 600;\n}\n\n.picker-option:disabled {\n color: rgb(var(--v-theme-on-surface), 0.24);\n cursor: not-allowed;\n}\n</style>\n","<template>\r\n <div class=\"vtk-date-selector\" :style=\"rootStyle\">\r\n <VMenu\r\n v-if=\"!inline\"\r\n v-model=\"showPicker\"\r\n :attach=\"menuAttach\"\r\n :location=\"menuLocation\"\r\n :origin=\"menuOrigin\"\r\n offset=\"4\"\r\n :close-on-content-click=\"false\"\r\n >\r\n <template #activator=\"{ props: menuProps }\">\r\n <div class=\"date-input\">\r\n <VTextField :model-value=\"displayValue\" :label=\"label || undefined\" :placeholder=\"placeholder\"\r\n :disabled=\"disabled\" density=\"compact\" variant=\"outlined\" hide-details readonly v-bind=\"menuProps\"\r\n :clearable=\"!!displayValue && !disabled\" clear-icon=\"mdi-close-circle\" persistent-clear\r\n class=\"date-input-field\" @click:clear.stop=\"clearValue\">\r\n <template #append-inner>\r\n <span class=\"date-icon\" aria-hidden=\"true\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" class=\"date-icon-svg\">\r\n <path\r\n d=\"M7 2.75a.75.75 0 0 1 .75.75V5h8.5V3.5a.75.75 0 0 1 1.5 0V5h.75A2.5 2.5 0 0 1 21 7.5v10A2.5 2.5 0 0 1 18.5 20h-13A2.5 2.5 0 0 1 3 17.5v-10A2.5 2.5 0 0 1 5.5 5h.75V3.5A.75.75 0 0 1 7 2.75ZM4.5 10v7.5c0 .552.448 1 1 1h13c.552 0 1-.448 1-1V10h-15Zm1-3.5c-.552 0-1 .448-1 1v1h15v-1c0-.552-.448-1-1-1h-.75v1a.75.75 0 0 1-1.5 0v-1h-8.5v1a.75.75 0 0 1-1.5 0v-1H5.5Zm2.25 5.75a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm-8.5 3.75a.75.75 0 0 1 .75.75V17a.75.75 0 0 1-1.5 0v-.25a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75V17a.75.75 0 0 1-1.5 0v-.25a.75.75 0 0 1 .75-.75Z\"\r\n fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n </template>\r\n </VTextField>\r\n </div>\r\n </template>\r\n <div class=\"date-picker-dropdown\" :style=\"popupStyle\" @click.stop @mousedown.stop>\r\n <!-- 头部控制区(非日期/月份范围选择模式时显示) -->\r\n <div v-if=\"!(mode === 'range' && (displayMode === 'day' || displayMode === 'month'))\" class=\"picker-header\">\r\n <button class=\"nav-btn\" @click=\"prevPeriod\">‹</button>\r\n <div class=\"header-title\">\r\n <span @click=\"changeViewMode('year')\" class=\"clickable\">{{ currentYear }}年</span>\r\n <span v-if=\"displayMode !== 'year' && viewMode !== 'month'\" @click=\"changeViewMode('month')\"\r\n class=\"clickable\">{{\r\n currentMonth + 1\r\n }}月</span>\r\n </div>\r\n <button class=\"nav-btn\" @click=\"nextPeriod\">›</button>\r\n </div>\r\n\r\n <!-- 年份选择视图 -->\r\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\r\n <div class=\"year-grid\">\r\n <div v-for=\"year in yearList\" :key=\"year\"\r\n :class=\"['year-item', { 'selected': isYearSelected(year), 'in-range': isYearInRange(year), 'disabled': isFutureYear(year) }]\"\r\n @click=\"selectYear(year)\">\r\n {{ year }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 月份选择视图 -->\r\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个年份的月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" :show-month=\"false\"\r\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYear\" @next=\"nextYearLeft\" />\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" :show-month=\"false\"\r\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYearRight\" @next=\"nextYear\" />\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelectedRight(index), 'in-range': isMonthInRangeRight(index), 'disabled': isFutureMonth(index, rightYear) }]\"\r\n @click=\"selectMonthRight(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个年份的月份 -->\r\n <div v-else>\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 周选择视图 -->\r\n <div v-else-if=\"viewMode === 'week'\" class=\"picker-body\">\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"week-grid\">\r\n <div v-for=\"week in weekList\" :key=\"week.weekNumber\"\r\n :class=\"['week-row', { 'selected': isWeekSelected(week), 'in-range': isWeekInRange(week) }]\"\r\n @click=\"selectWeek(week)\">\r\n <div class=\"week-number\">W{{ week.weekNumber }}</div>\r\n <div v-for=\"day in week.days\" :key=\"day.date\"\r\n :class=\"['day-cell', { 'other-month': day.otherMonth, 'today': day.isToday }]\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 日期选择视图(默认) -->\r\n <div v-else class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" v-model:month=\"currentMonth\"\r\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonth\"\r\n @next=\"nextMonthLeft\" />\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" v-model:month=\"rightMonth\"\r\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonthRight\"\r\n @next=\"nextMonth\" />\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in nextMonthDayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个月份 -->\r\n <div v-else>\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"mode === 'range' && (displayMode === 'day' || displayMode === 'month')\" class=\"range-display\">\r\n <span class=\"range-text\">\r\n <template v-if=\"tempValue && Array.isArray(tempValue) && tempValue.length > 0\">\r\n {{ tempValue[0] || (displayMode === 'month' ? '开始月份' : '开始日期') }}\r\n <span class=\"range-separator\"> - </span>\r\n {{ tempValue[1] || (displayMode === 'month' ? '结束月份' : '结束日期') }}\r\n </template>\r\n <template v-else>\r\n <span class=\"placeholder-text\">{{ displayMode === 'month' ? '请选择月份范围' : '请选择日期范围' }}</span>\r\n </template>\r\n </span>\r\n </div>\r\n <div class=\"picker-footer\">\r\n <button class=\"btn btn-text\" @click=\"handleCancel\">取消</button>\r\n <button class=\"btn btn-primary\" @click=\"handleConfirm\">确定</button>\r\n </div>\r\n </div>\r\n </VMenu>\r\n <div v-if=\"inline\" class=\"date-picker-dropdown inline-mode\" :style=\"popupStyle\" @click.stop @mousedown.stop>\r\n <!-- 头部控制区(非日期/月份范围选择模式时显示) -->\r\n <div v-if=\"!(mode === 'range' && (displayMode === 'day' || displayMode === 'month'))\" class=\"picker-header\">\r\n <button class=\"nav-btn\" @click=\"prevPeriod\">‹</button>\r\n <div class=\"header-title\">\r\n <span @click=\"changeViewMode('year')\" class=\"clickable\">{{ currentYear }}年</span>\r\n <span v-if=\"displayMode !== 'year' && viewMode !== 'month'\" @click=\"changeViewMode('month')\"\r\n class=\"clickable\">{{\r\n currentMonth + 1\r\n }}月</span>\r\n </div>\r\n <button class=\"nav-btn\" @click=\"nextPeriod\">›</button>\r\n </div>\r\n\r\n <!-- 年份选择视图 -->\r\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\r\n <div class=\"year-grid\">\r\n <div v-for=\"year in yearList\" :key=\"year\"\r\n :class=\"['year-item', { 'selected': isYearSelected(year), 'in-range': isYearInRange(year), 'disabled': isFutureYear(year) }]\"\r\n @click=\"selectYear(year)\">\r\n {{ year }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 月份选择视图 -->\r\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个年份的月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" :show-month=\"false\"\r\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYear\" @next=\"nextYearLeft\" />\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" :show-month=\"false\"\r\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYearRight\" @next=\"nextYear\" />\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelectedRight(index), 'in-range': isMonthInRangeRight(index), 'disabled': isFutureMonth(index, rightYear) }]\"\r\n @click=\"selectMonthRight(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个年份的月份 -->\r\n <div v-else>\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 周选择视图 -->\r\n <div v-else-if=\"viewMode === 'week'\" class=\"picker-body\">\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"week-grid\">\r\n <div v-for=\"week in weekList\" :key=\"week.weekNumber\"\r\n :class=\"['week-row', { 'selected': isWeekSelected(week), 'in-range': isWeekInRange(week) }]\"\r\n @click=\"selectWeek(week)\">\r\n <div class=\"week-number\">W{{ week.weekNumber }}</div>\r\n <div v-for=\"day in week.days\" :key=\"day.date\"\r\n :class=\"['day-cell', { 'other-month': day.otherMonth, 'today': day.isToday }]\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 日期选择视图(默认) -->\r\n <div v-else class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" v-model:month=\"currentMonth\"\r\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonth\"\r\n @next=\"nextMonthLeft\" />\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" v-model:month=\"rightMonth\"\r\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonthRight\"\r\n @next=\"nextMonth\" />\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in nextMonthDayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个月份 -->\r\n <div v-else>\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"mode === 'range' && (displayMode === 'day' || displayMode === 'month')\" class=\"range-display\">\r\n <span class=\"range-text\">\r\n <template v-if=\"tempValue && Array.isArray(tempValue) && tempValue.length > 0\">\r\n {{ tempValue[0] || (displayMode === 'month' ? '开始月份' : '开始日期') }}\r\n <span class=\"range-separator\"> - </span>\r\n {{ tempValue[1] || (displayMode === 'month' ? '结束月份' : '结束日期') }}\r\n </template>\r\n <template v-else>\r\n <span class=\"placeholder-text\">{{ displayMode === 'month' ? '请选择月份范围' : '请选择日期范围' }}</span>\r\n </template>\r\n </span>\r\n </div>\r\n <div class=\"picker-footer\">\r\n <button class=\"btn btn-text\" @click=\"handleCancel\">取消</button>\r\n <button class=\"btn btn-primary\" @click=\"handleConfirm\">确定</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch } from 'vue';\r\nimport VtkDatePanelHeader from './VtkDatePanelHeader.vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: 'VtkDateSelector',\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // v-model 绑定值\r\n modelValue: {\r\n type: [String, Array],\r\n default: null\r\n },\r\n // 显示模式: 'day' | 'week' | 'month' | 'year'\r\n displayMode: {\r\n type: String,\r\n default: 'day',\r\n validator: (value) => ['day', 'week', 'month', 'year'].includes(value)\r\n },\r\n // 选择模式: 'single' | 'range'\r\n mode: {\r\n type: String,\r\n default: 'single',\r\n validator: (value) => ['single', 'range'].includes(value)\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: '请选择日期'\r\n },\r\n // 输入框标签\r\n label: {\r\n type: String,\r\n default: ''\r\n },\r\n // 输入框宽度,数字按 px 处理,也支持 100%、12rem 等 CSS 宽度\r\n width: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n // 日期弹层宽度,数字按 px 处理,也支持 100%、24rem 等 CSS 宽度\r\n popupWidth: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n // 禁用状态\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 日期格式\r\n format: {\r\n type: String,\r\n default: 'YYYY-MM-DD'\r\n },\r\n // 范围分隔符\r\n separator: {\r\n type: String,\r\n default: ' 至 '\r\n },\r\n // 内联模式(直接显示选择器,不需要点击输入框)\r\n inline: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 单面板模式(范围选择时只显示一个面板)\r\n singlePanel: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 禁用未来日期(大于当前日期的都置灰不可选)\r\n disableFuture: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义取消方法\r\n onCancel: {\r\n type: Function,\r\n default: null\r\n },\r\n // 自定义确认方法\r\n onConfirm: {\r\n type: Function,\r\n default: null\r\n },\r\n // 禁用 Teleport 时,弹层保留在当前 DOM 树内\r\n noTeleport: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 下拉框对齐方式: 'left' | 'right'\r\n placement: {\r\n type: String,\r\n default: 'left',\r\n validator: (value) => ['left', 'right'].includes(value)\r\n }\r\n});\r\n\r\n// 定义 emit\r\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\r\n\r\n// 响应式数据\r\nconst showPicker = ref(false);\r\nconst viewMode = ref(props.displayMode);\r\nconst currentYear = ref(new Date().getFullYear());\r\nconst currentMonth = ref(new Date().getMonth());\r\nconst rightYear = ref(new Date().getFullYear());\r\nconst rightMonth = ref(new Date().getMonth() + 1);\r\nconst selectedValue = ref(null);\r\nconst tempValue = ref(null);\r\n\r\n// 当前日期(用于判断未来日期)\r\nconst today = new Date();\r\nconst todayYear = today.getFullYear();\r\nconst todayMonth = today.getMonth();\r\nconst todayDate = today.getDate();\r\n\r\n// 年份面板固定展示 12 个年份,并尽量让锚点年份落在中间偏前位置\r\nconst YEAR_PANEL_SIZE = 12;\r\nconst YEAR_PANEL_CENTER_OFFSET = 4;\r\n\r\n// 周和月份名称\r\nconst weekDays = ['日', '一', '二', '三', '四', '五', '六'];\r\nconst monthList = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\r\n\r\n// 显示值\r\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\r\n\r\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\r\n\r\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\r\n\r\nconst normalizeCssSize = (value) => {\r\n if (value === null || value === undefined || value === '') return '';\r\n if (typeof value === 'number') return `${value}px`;\r\n const nextValue = String(value).trim();\r\n return /^\\d+(\\.\\d+)?$/.test(nextValue) ? `${nextValue}px` : nextValue;\r\n};\r\n\r\nconst rootStyle = computed(() => {\r\n const width = normalizeCssSize(props.width);\r\n return width ? { width } : {};\r\n});\r\n\r\nconst popupStyle = computed(() => {\r\n const width = normalizeCssSize(props.popupWidth);\r\n return width ? { width } : {};\r\n});\r\n\r\nconst displayValue = computed(() => {\r\n if (!selectedValue.value) return '';\r\n\r\n if (props.mode === 'range' && Array.isArray(selectedValue.value)) {\r\n if (selectedValue.value.length === 2) {\r\n return `${formatDisplay(selectedValue.value[0])}${props.separator}${formatDisplay(selectedValue.value[1])}`;\r\n }\r\n return '';\r\n }\r\n\r\n return formatDisplay(selectedValue.value);\r\n});\r\n\r\n// 格式化显示\r\nconst formatDisplay = (value) => {\r\n if (!value) return '';\r\n\r\n if (props.displayMode === 'year') {\r\n return `${value}年`;\r\n } else if (props.displayMode === 'month') {\r\n const [year, month] = value.split('-');\r\n return `${year}年${month}月`;\r\n } else if (props.displayMode === 'week') {\r\n const [year, week] = value.split('-W');\r\n return `${year}年第${week}周`;\r\n }\r\n\r\n return value;\r\n};\r\n\r\n// 年份列表(显示12年)\r\nconst yearList = computed(() => {\r\n // 年份面板打开时,以当前锚点年份为中心生成 12 个年份选项\r\n const startYear = currentYear.value - YEAR_PANEL_CENTER_OFFSET;\r\n return Array.from({ length: YEAR_PANEL_SIZE }, (_, i) => startYear + i);\r\n});\r\n\r\n// 周列表\r\nconst weekList = computed(() => {\r\n const weeks = [];\r\n const firstDay = new Date(currentYear.value, currentMonth.value, 1);\r\n const lastDay = new Date(currentYear.value, currentMonth.value + 1, 0);\r\n\r\n let currentDate = new Date(firstDay);\r\n currentDate.setDate(currentDate.getDate() - currentDate.getDay());\r\n\r\n let weekNumber = getWeekNumber(currentDate);\r\n\r\n while (currentDate <= lastDay || currentDate.getDay() !== 0) {\r\n const week = {\r\n weekNumber: weekNumber,\r\n startDate: new Date(currentDate),\r\n days: []\r\n };\r\n\r\n for (let i = 0; i < 7; i++) {\r\n const day = {\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== currentMonth.value,\r\n isToday: isToday(currentDate)\r\n };\r\n week.days.push(day);\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n weeks.push(week);\r\n weekNumber++;\r\n\r\n if (currentDate > lastDay && currentDate.getDay() === 0) break;\r\n }\r\n\r\n return weeks;\r\n});\r\n\r\n// 日期列表\r\nconst dayList = computed(() => {\r\n const days = [];\r\n const firstDay = new Date(currentYear.value, currentMonth.value, 1);\r\n const lastDay = new Date(currentYear.value, currentMonth.value + 1, 0);\r\n\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n\r\n const endDate = new Date(lastDay);\r\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\r\n\r\n let currentDate = new Date(startDate);\r\n\r\n while (currentDate <= endDate) {\r\n days.push({\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== currentMonth.value,\r\n isToday: isToday(currentDate)\r\n });\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n return days;\r\n});\r\n\r\n// 右侧日历的年份和月份(独立状态)\r\nconst nextMonthYear = computed(() => rightYear.value);\r\nconst nextMonthMonth = computed(() => rightMonth.value);\r\n\r\n// 下个月的日期列表\r\nconst nextMonthDayList = computed(() => {\r\n const days = [];\r\n const firstDay = new Date(nextMonthYear.value, nextMonthMonth.value, 1);\r\n const lastDay = new Date(nextMonthYear.value, nextMonthMonth.value + 1, 0);\r\n\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n\r\n const endDate = new Date(lastDay);\r\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\r\n\r\n let currentDate = new Date(startDate);\r\n\r\n while (currentDate <= endDate) {\r\n days.push({\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== nextMonthMonth.value,\r\n isToday: isToday(currentDate)\r\n });\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n return days;\r\n});\r\n\r\n// 工具函数\r\nconst formatDate = (date) => {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n};\r\n\r\nconst isToday = (date) => {\r\n const today = new Date();\r\n return date.getDate() === today.getDate() &&\r\n date.getMonth() === today.getMonth() &&\r\n date.getFullYear() === today.getFullYear();\r\n};\r\n\r\nconst getWeekNumber = (date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d - yearStart) / 86400000) + 1) / 7);\r\n};\r\n\r\n// 选择判断\r\nconst isYearSelected = (year) => {\r\n if (!tempValue.value) return false;\r\n if (props.mode === 'single') {\r\n return tempValue.value === year.toString();\r\n }\r\n if (Array.isArray(tempValue.value) && tempValue.value.length > 0) {\r\n return tempValue.value.some(v => v && v.startsWith(year.toString()));\r\n }\r\n return false;\r\n};\r\n\r\nconst isYearInRange = (year) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const [start, end] = tempValue.value.map(v => parseInt(v));\r\n return year > start && year < end;\r\n};\r\n\r\nconst isMonthSelected = (month) => {\r\n if (!tempValue.value) return false;\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n return tempValue.value === monthStr;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(monthStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isMonthInRange = (month) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n return monthStr > tempValue.value[0] && monthStr < tempValue.value[1];\r\n};\r\n\r\nconst isWeekSelected = (week) => {\r\n if (!tempValue.value) return false;\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n return tempValue.value === weekStr;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(weekStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isWeekInRange = (week) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n return weekStr > tempValue.value[0] && weekStr < tempValue.value[1];\r\n};\r\n\r\nconst isDaySelected = (day) => {\r\n if (!tempValue.value) return false;\r\n if (props.mode === 'single') {\r\n return tempValue.value === day.date;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(day.date);\r\n }\r\n return false;\r\n};\r\n\r\nconst isDayInRange = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n return day.date > tempValue.value[0] && day.date < tempValue.value[1];\r\n};\r\n\r\nconst isDayRangeStart = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length === 0) {\r\n return false;\r\n }\r\n return day.date === tempValue.value[0];\r\n};\r\n\r\nconst isDayRangeEnd = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length < 2) {\r\n return false;\r\n }\r\n return day.date === tempValue.value[1];\r\n};\r\n\r\n// 判断是否是未来日期/月份/年份\r\nconst isFutureYear = (year) => {\r\n if (!props.disableFuture) return false;\r\n return year > todayYear;\r\n};\r\n\r\nconst isFutureMonth = (month, year) => {\r\n if (!props.disableFuture) return false;\r\n if (year > todayYear) return true;\r\n if (year === todayYear && month > todayMonth) return true;\r\n return false;\r\n};\r\n\r\nconst isFutureDay = (day) => {\r\n if (!props.disableFuture) return false;\r\n const [year, month, date] = day.date.split('-').map(Number);\r\n if (year > todayYear) return true;\r\n if (year === todayYear && month - 1 > todayMonth) return true;\r\n if (year === todayYear && month - 1 === todayMonth && date > todayDate) return true;\r\n return false;\r\n};\r\n\r\n// 选择操作\r\nconst selectYear = (year) => {\r\n // 如果是未来年份且禁用未来日期,则不允许选择\r\n if (isFutureYear(year)) return;\r\n\r\n const yearStr = year.toString();\r\n\r\n // 如果 displayMode 是 'year',则选择年份作为值\r\n if (props.displayMode === 'year') {\r\n if (props.mode === 'single') {\r\n tempValue.value = yearStr;\r\n if (props.inline) {\r\n // 内联模式直接确认\r\n confirm();\r\n }\r\n } else {\r\n // 范围选择\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [yearStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= yearStr ? [first, yearStr] : [yearStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [yearStr];\r\n }\r\n }\r\n } else {\r\n // 如果 displayMode 不是 'year',则只是切换年份,然后返回到原来的视图\r\n currentYear.value = year;\r\n // 切换回原来的显示模式\r\n viewMode.value = props.displayMode;\r\n }\r\n};\r\n\r\nconst selectMonth = (month) => {\r\n // 如果是未来月份且禁用未来日期,则不允许选择\r\n if (isFutureMonth(month, currentYear.value)) return;\r\n\r\n if (props.displayMode !== 'month') {\r\n currentMonth.value = month;\r\n viewMode.value = props.displayMode;\r\n return;\r\n }\r\n\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n tempValue.value = monthStr;\r\n if (props.displayMode === 'month' || props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [monthStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= monthStr ? [first, monthStr] : [monthStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [monthStr];\r\n }\r\n }\r\n};\r\n\r\nconst selectMonthRight = (month) => {\r\n // 如果是未来月份且禁用未来日期,则不允许选择\r\n if (isFutureMonth(month, rightYear.value)) return;\r\n\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [monthStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= monthStr ? [first, monthStr] : [monthStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [monthStr];\r\n }\r\n};\r\n\r\nconst isMonthSelectedRight = (month) => {\r\n if (!tempValue.value) return false;\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(monthStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isMonthInRangeRight = (month) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n return monthStr > tempValue.value[0] && monthStr < tempValue.value[1];\r\n};\r\n\r\nconst selectWeek = (week) => {\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n tempValue.value = weekStr;\r\n confirm();\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [weekStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= weekStr ? [first, weekStr] : [weekStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [weekStr];\r\n }\r\n }\r\n};\r\n\r\nconst selectDay = (day) => {\r\n // 如果是未来日期且禁用未来日期,则不允许选择\r\n if (isFutureDay(day)) return;\r\n\r\n if (props.mode === 'single') {\r\n tempValue.value = day.date;\r\n // 内联模式下单选直接确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [day.date];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= day.date ? [first, day.date] : [day.date, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [day.date];\r\n }\r\n }\r\n};\r\n\r\n// 导航操作\r\nconst prevPeriod = () => {\r\n if (viewMode.value === 'year') {\r\n currentYear.value -= 12;\r\n } else if (viewMode.value === 'month') {\r\n currentYear.value -= 1;\r\n } else {\r\n if (currentMonth.value === 0) {\r\n currentMonth.value = 11;\r\n currentYear.value -= 1;\r\n } else {\r\n currentMonth.value -= 1;\r\n }\r\n }\r\n};\r\n\r\nconst nextPeriod = () => {\r\n if (viewMode.value === 'year') {\r\n currentYear.value += 12;\r\n } else if (viewMode.value === 'month') {\r\n currentYear.value += 1;\r\n } else {\r\n if (currentMonth.value === 11) {\r\n currentMonth.value = 0;\r\n currentYear.value += 1;\r\n } else {\r\n currentMonth.value += 1;\r\n }\r\n }\r\n};\r\n\r\n// 月份导航(用于双日历)\r\nconst prevMonth = () => {\r\n // 只控制左侧日历\r\n if (currentMonth.value === 0) {\r\n currentMonth.value = 11;\r\n currentYear.value -= 1;\r\n } else {\r\n currentMonth.value -= 1;\r\n }\r\n};\r\n\r\nconst nextMonthLeft = () => {\r\n // 增加左侧日历月份\r\n if (currentMonth.value === 11) {\r\n currentMonth.value = 0;\r\n currentYear.value += 1;\r\n } else {\r\n currentMonth.value += 1;\r\n }\r\n};\r\n\r\nconst prevMonthRight = () => {\r\n // 减少右侧日历月份\r\n if (rightMonth.value === 0) {\r\n rightMonth.value = 11;\r\n rightYear.value -= 1;\r\n } else {\r\n rightMonth.value -= 1;\r\n }\r\n};\r\n\r\nconst nextMonth = () => {\r\n // 只控制右侧日历\r\n if (rightMonth.value === 11) {\r\n rightMonth.value = 0;\r\n rightYear.value += 1;\r\n } else {\r\n rightMonth.value += 1;\r\n }\r\n};\r\n\r\n// 年份导航(用于双月份面板)\r\nconst prevYear = () => {\r\n // 只控制左侧年份\r\n currentYear.value -= 1;\r\n};\r\n\r\nconst nextYearLeft = () => {\r\n // 增加左侧年份\r\n currentYear.value += 1;\r\n};\r\n\r\nconst prevYearRight = () => {\r\n // 减少右侧年份\r\n rightYear.value -= 1;\r\n};\r\n\r\nconst nextYear = () => {\r\n // 只控制右侧年份\r\n rightYear.value += 1;\r\n};\r\n\r\nconst changeViewMode = (mode) => {\r\n if (props.displayMode === 'year' && mode !== 'year') return;\r\n if (props.displayMode === 'month' && !['year', 'month'].includes(mode)) return;\r\n viewMode.value = mode;\r\n};\r\n\r\n// 面板操作\r\nconst parseCalendarValue = (value) => {\r\n if (typeof value !== 'string') return null;\r\n\r\n const match = value.match(/^(\\d{4})(?:-(\\d{2}))?/);\r\n if (!match) return null;\r\n\r\n const month = match[2] ? Number(match[2]) - 1 : null;\r\n return {\r\n year: Number(match[1]),\r\n month: month !== null && month >= 0 && month <= 11 ? month : null\r\n };\r\n};\r\n\r\nconst setRightPanelToNextMonth = () => {\r\n if (currentMonth.value === 11) {\r\n rightYear.value = currentYear.value + 1;\r\n rightMonth.value = 0;\r\n } else {\r\n rightYear.value = currentYear.value;\r\n rightMonth.value = currentMonth.value + 1;\r\n }\r\n};\r\n\r\nconst syncCalendarPanels = () => {\r\n const values = Array.isArray(selectedValue.value) ? selectedValue.value : [selectedValue.value];\r\n const start = parseCalendarValue(values[0]);\r\n const end = parseCalendarValue(values[1]);\r\n\r\n if (start) {\r\n currentYear.value = start.year;\r\n if (start.month !== null) currentMonth.value = start.month;\r\n }\r\n\r\n if (props.displayMode === 'year') return;\r\n\r\n if (props.displayMode === 'month') {\r\n rightYear.value = end && end.year !== currentYear.value ? end.year : currentYear.value + 1;\r\n return;\r\n }\r\n\r\n const endUsesDifferentMonth = end && end.month !== null &&\r\n (end.year !== currentYear.value || end.month !== currentMonth.value);\r\n\r\n if (props.mode === 'range' && endUsesDifferentMonth) {\r\n rightYear.value = end.year;\r\n rightMonth.value = end.month;\r\n } else {\r\n setRightPanelToNextMonth();\r\n }\r\n};\r\n\r\nconst initializePicker = () => {\r\n tempValue.value = selectedValue.value ?\r\n (Array.isArray(selectedValue.value) ? [...selectedValue.value] : selectedValue.value) :\r\n (props.mode === 'range' ? [] : null);\r\n viewMode.value = props.displayMode;\r\n syncCalendarPanels();\r\n};\r\n\r\nwatch(showPicker, (isOpen) => {\r\n if (isOpen) {\r\n initializePicker();\r\n }\r\n});\r\n\r\nwatch(() => props.modelValue, (newValue) => {\r\n selectedValue.value = newValue;\r\n if (props.inline) initializePicker();\r\n}, { immediate: true });\r\n\r\nconst closePicker = () => {\r\n showPicker.value = false;\r\n};\r\n\r\nconst clearValue = () => {\r\n selectedValue.value = props.mode === 'range' ? [] : null;\r\n emit('update:modelValue', selectedValue.value);\r\n emit('change', selectedValue.value);\r\n};\r\n\r\nconst confirm = () => {\r\n selectedValue.value = tempValue.value;\r\n emit('update:modelValue', selectedValue.value);\r\n emit('change', selectedValue.value);\r\n closePicker();\r\n};\r\n\r\n// 自定义取消和确认处理\r\nconst handleCancel = () => {\r\n if (props.onCancel) {\r\n props.onCancel();\r\n } else {\r\n emit('cancel');\r\n closePicker();\r\n }\r\n};\r\n\r\nconst handleConfirm = () => {\r\n if (props.onConfirm) {\r\n props.onConfirm(tempValue.value);\r\n } else {\r\n emit('confirm', tempValue.value);\r\n confirm();\r\n }\r\n};\r\n\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-date-selector {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.date-input {\r\n width: 100%;\r\n}\r\n\r\n.date-input-field {\r\n cursor: pointer;\r\n}\r\n\r\n:deep(.date-input-field .v-field),\r\n:deep(.date-input-field input) {\r\n cursor: pointer;\r\n}\r\n\r\n.date-icon {\r\n margin-left: 8px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.date-icon-svg {\r\n width: 16px;\r\n height: 16px;\r\n display: block;\r\n}\r\n\r\n.clear-icon {\r\n margin-left: 4px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-size: 18px;\r\n line-height: 1;\r\n cursor: pointer;\r\n padding: 2px;\r\n}\r\n\r\n.clear-icon:hover {\r\n color: rgb(var(--v-theme-on-surface), 0.87);\r\n}\r\n\r\n.date-picker-dropdown {\r\n box-sizing: border-box;\r\n max-width: calc(100vw - 24px);\r\n overflow-x: auto;\r\n background: rgb(var(--v-theme-surface));\r\n border-radius: 8px;\r\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\r\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.date-picker-dropdown.inline-mode {\r\n box-shadow: none;\r\n width: fit-content;\r\n border: none;\r\n}\r\n\r\n.picker-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.header-title {\r\n font-size: 16px;\r\n font-weight: 500;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.clickable {\r\n cursor: pointer;\r\n padding: 4px 8px;\r\n border-radius: 4px;\r\n transition: background 0.2s;\r\n}\r\n\r\n.clickable:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.nav-btn {\r\n border: none;\r\n background: none;\r\n font-size: 20px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n cursor: pointer;\r\n padding: 4px 12px;\r\n border-radius: 4px;\r\n transition: background 0.2s;\r\n}\r\n\r\n.nav-btn:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.picker-body {\r\n padding: 8px;\r\n min-height: 200px;\r\n}\r\n\r\n.dual-calendar {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.calendar-divider {\r\n width: 1px;\r\n background: rgb(var(--v-theme-on-surface), 0.12);\r\n margin: 0 6px;\r\n}\r\n\r\n.calendar-panel {\r\n flex: 0 0 210px;\r\n width: 210px;\r\n min-width: 210px;\r\n max-width: 210px;\r\n}\r\n\r\n/* 单面板模式:放大以匹配底部范围显示的宽度 */\r\n.calendar-panel:only-child {\r\n flex: 0 0 340px;\r\n width: 340px;\r\n min-width: 340px;\r\n max-width: 340px;\r\n}\r\n\r\n.year-grid,\r\n.month-grid {\r\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: 6px;\r\n}\r\n\r\n.year-item,\r\n.month-item {\r\n padding: 6px;\r\n text-align: center;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n border: 1px solid transparent;\r\n color: rgb(var(--v-theme-on-surface));\r\n font-size: 12px;\r\n}\r\n\r\n.year-item:hover,\r\n.month-item:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.year-item.selected,\r\n.month-item.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.year-item.in-range,\r\n.month-item.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n/* 禁用状态样式 */\r\n.year-item.disabled,\r\n.month-item.disabled,\r\n.day-item.disabled {\r\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\r\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\r\n cursor: not-allowed !important;\r\n pointer-events: none;\r\n opacity: 0.5;\r\n}\r\n\r\n.year-item.disabled:hover,\r\n.month-item.disabled:hover,\r\n.day-item.disabled:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\r\n}\r\n\r\n.week-header {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 2px;\r\n margin-bottom: 6px;\r\n}\r\n\r\n.week-day {\r\n text-align: center;\r\n padding: 6px 0;\r\n font-size: 12px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-weight: 500;\r\n}\r\n\r\n.week-grid {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.week-row {\r\n display: grid;\r\n grid-template-columns: 40px repeat(7, 1fr);\r\n gap: 4px;\r\n padding: 4px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: background 0.2s;\r\n}\r\n\r\n.week-row:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.week-row.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.week-row.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n.week-number {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 12px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-weight: 500;\r\n}\r\n\r\n.day-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 2px;\r\n}\r\n\r\n.day-item,\r\n.day-cell {\r\n aspect-ratio: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n font-size: 13px;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.day-item:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.day-item.other-month,\r\n.day-cell.other-month {\r\n color: rgb(var(--v-theme-on-surface), 0.38);\r\n}\r\n\r\n.day-item.today,\r\n.day-cell.today {\r\n color: rgb(var(--v-theme-primary));\r\n font-weight: 600;\r\n}\r\n\r\n.day-item.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.day-item.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n.day-item.range-start,\r\n.day-item.range-end {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.range-display {\r\n padding: 12px 16px;\r\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n text-align: center;\r\n}\r\n\r\n.range-text {\r\n font-size: 14px;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.range-separator {\r\n margin: 0 8px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n}\r\n\r\n.placeholder-text {\r\n color: rgb(var(--v-theme-on-surface), 0.38);\r\n}\r\n\r\n.picker-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n padding: 12px 16px;\r\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.btn {\r\n padding: 8px 16px;\r\n border-radius: 4px;\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n border: none;\r\n outline: none;\r\n}\r\n\r\n.btn-text {\r\n background: none;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n}\r\n\r\n.btn-text:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.btn-primary {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.btn-primary:hover {\r\n opacity: 0.9;\r\n}\r\n</style>\r\n","<template>\n <div class=\"vtk-date-time-picker\">\n <VMenu\n v-if=\"!inline\"\n v-model=\"showPicker\"\n :attach=\"menuAttach\"\n :location=\"menuLocation\"\n :origin=\"menuOrigin\"\n :width=\"menuWidth\"\n :min-width=\"menuWidth\"\n offset=\"4\"\n :close-on-content-click=\"false\"\n >\n <template #activator=\"{ props: menuProps }\">\n <div class=\"date-time-input\">\n <VTextField\n :model-value=\"displayValue\"\n :placeholder=\"placeholder\"\n :label=\"label\"\n :disabled=\"disabled\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n readonly\n v-bind=\"menuProps\"\n :clearable=\"clearable && !!displayValue && !disabled\"\n clear-icon=\"mdi-close-circle\"\n persistent-clear\n class=\"date-time-input-field\"\n @click:clear.stop=\"clearValue\"\n >\n <template #append-inner>\n <VIcon size=\"16\" class=\"date-time-icon\">mdi-clock-outline</VIcon>\n </template>\n </VTextField>\n </div>\n </template>\n\n <div\n class=\"date-time-picker-dropdown\"\n :class=\"{ 'range-mode': isRange }\"\n :style=\"dropdownStyle\"\n @click.stop\n @mousedown.stop\n >\n <template v-if=\"isRange\">\n <div class=\"range-input-row\">\n <input class=\"range-date-input\" :value=\"formatDatePart(tempRange[0])\" readonly placeholder=\"开始日期\" />\n <button\n class=\"range-time-input\"\n type=\"button\"\n :class=\"{ active: activeTimeSide === 'start' }\"\n @click=\"openRangeTime('start')\"\n >\n {{ formatTimePart(tempRange[0]) || defaultStartTime }}\n </button>\n <span class=\"range-arrow\">›</span>\n <input class=\"range-date-input\" :value=\"formatDatePart(tempRange[1])\" readonly placeholder=\"结束日期\" />\n <button\n class=\"range-time-input\"\n type=\"button\"\n :class=\"{ active: activeTimeSide === 'end' }\"\n @click=\"openRangeTime('end')\"\n >\n {{ formatTimePart(tempRange[1]) || defaultEndTime }}\n </button>\n\n <div v-if=\"activeTimeSide\" :class=\"['range-time-popover', activeTimeSide]\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === activeRangeHour }]\"\n @click=\"selectRangeTime('hour', hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === activeRangeMinute }]\"\n @click=\"selectRangeTime('minute', minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === activeRangeSecond }]\"\n @click=\"selectRangeTime('second', second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeTimeSide = null\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeTimeSide = null\">确定</button>\n </div>\n </div>\n </div>\n\n <div class=\"range-calendar-shell\">\n <div class=\"calendar-panel\">\n <div class=\"calendar-header\">\n <button class=\"nav-btn-small\" type=\"button\" @click=\"prevLeftMonth\">‹</button>\n <span class=\"month-title\">{{ leftYear }} 年 {{ leftMonth + 1 }} 月</span>\n <button class=\"nav-btn-small invisible\" type=\"button\">›</button>\n </div>\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in leftDayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"rangeDayClass(day)\"\n @click=\"selectRangeDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <div class=\"calendar-panel\">\n <div class=\"calendar-header\">\n <button class=\"nav-btn-small invisible\" type=\"button\">‹</button>\n <span class=\"month-title\">{{ rightYear }} 年 {{ rightMonth + 1 }} 月</span>\n <button class=\"nav-btn-small\" type=\"button\" @click=\"nextRightMonth\">›</button>\n </div>\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in rightDayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"rangeDayClass(day)\"\n @click=\"selectRangeDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <template v-else>\n <div class=\"single-input-row\">\n <input class=\"single-date-input\" :value=\"formatDatePart(tempDate)\" readonly placeholder=\"请选择日期\" />\n <button\n class=\"single-time-input\"\n type=\"button\"\n :class=\"{ active: activeSingleTime }\"\n @click=\"activeSingleTime = true\"\n >\n {{ singleTimeValue }}\n </button>\n\n <div v-if=\"activeSingleTime\" class=\"single-time-popover\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === selectedHour, disabled: isTimePartDisabled(hour, selectedMinute, selectedSecond) }]\"\n @click=\"selectHour(hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === selectedMinute, disabled: isTimePartDisabled(selectedHour, minute, selectedSecond) }]\"\n @click=\"selectMinute(minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === selectedSecond, disabled: isTimePartDisabled(selectedHour, selectedMinute, second) }]\"\n @click=\"selectSecond(second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeSingleTime = false\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeSingleTime = false\">确定</button>\n </div>\n </div>\n </div>\n\n <div class=\"single-calendar-panel\">\n <div class=\"picker-header single-header\">\n <button class=\"nav-btn\" type=\"button\" @click=\"prevPeriod\">‹</button>\n <div class=\"header-title\">\n <span class=\"clickable\" @click=\"changeViewMode('year')\">{{ currentYear }} 年</span>\n <span v-if=\"viewMode !== 'year'\" class=\"clickable\" @click=\"changeViewMode('month')\">\n {{ currentMonth + 1 }} 月\n </span>\n </div>\n <button class=\"nav-btn\" type=\"button\" @click=\"nextPeriod\">›</button>\n </div>\n\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\n <div class=\"year-grid\">\n <button\n v-for=\"year in yearList\"\n :key=\"year\"\n type=\"button\"\n :class=\"['year-item', { selected: year === currentYear, disabled: isYearDisabled(year) }]\"\n @click=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n </div>\n </div>\n\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\n <div class=\"month-grid\">\n <button\n v-for=\"(month, index) in monthList\"\n :key=\"month\"\n type=\"button\"\n :class=\"['month-item', { selected: index === currentMonth, disabled: isMonthDisabled(index) }]\"\n @click=\"selectMonth(index)\"\n >\n {{ month }}\n </button>\n </div>\n </div>\n\n <div v-else class=\"picker-body\">\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in dayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"['day-item', {\n 'other-month': day.otherMonth,\n selected: isDaySelected(day),\n today: day.isToday,\n disabled: isDayDisabled(day)\n }]\"\n @click=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <div class=\"picker-footer\">\n <button v-if=\"!isRange\" class=\"btn btn-text\" type=\"button\" @click=\"handleNow\">此刻</button>\n <button v-if=\"isRange\" class=\"btn btn-text\" type=\"button\" @click=\"clearTempRange\">清空</button>\n <span class=\"footer-spacer\"></span>\n <button class=\"btn btn-text\" type=\"button\" @click=\"handleCancel\">取消</button>\n <button class=\"btn btn-primary\" type=\"button\" :disabled=\"!canConfirm\" @click=\"handleConfirm\">确定</button>\n </div>\n </div>\n </VMenu>\n\n <div v-if=\"inline\" class=\"date-time-picker-dropdown inline-mode\" :class=\"{ 'range-mode': isRange }\" @click.stop @mousedown.stop>\n <div class=\"inline-message\">内联模式请使用默认单选面板。</div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkDateTimePicker',\n});\n\nconst props = defineProps({\n modelValue: {\n type: [String, Date, Number, Array],\n default: null\n },\n mode: {\n type: String,\n default: 'single',\n validator: (value) => ['single', 'range'].includes(value)\n },\n placeholder: {\n type: String,\n default: '请选择日期时间'\n },\n label: {\n type: String,\n default: ''\n },\n scale: {\n type: Number,\n default: 1,\n validator: (value) => value > 0 && value <= 5\n },\n disabled: {\n type: Boolean,\n default: false\n },\n clearable: {\n type: Boolean,\n default: true\n },\n format: {\n type: String,\n default: 'YYYY-MM-DD HH:mm:ss'\n },\n valueFormat: {\n type: String,\n default: 'YYYY-MM-DD HH:mm:ss'\n },\n separator: {\n type: String,\n default: ' 至 '\n },\n min: {\n type: [String, Date, Number],\n default: null\n },\n max: {\n type: [String, Date, Number],\n default: null\n },\n disableFuture: {\n type: Boolean,\n default: false\n },\n minuteStep: {\n type: Number,\n default: 1\n },\n secondStep: {\n type: Number,\n default: 1\n },\n showSeconds: {\n type: Boolean,\n default: true\n },\n inline: {\n type: Boolean,\n default: false\n },\n placement: {\n type: String,\n default: 'left',\n validator: (value) => ['left', 'right'].includes(value)\n },\n noTeleport: {\n type: Boolean,\n default: false\n },\n onCancel: {\n type: Function,\n default: null\n },\n onConfirm: {\n type: Function,\n default: null\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\n\nconst showPicker = ref(false);\nconst selectedDateTime = ref(null);\nconst selectedRange = ref([]);\nconst tempDate = ref(null);\nconst tempRange = ref([null, null]);\nconst currentYear = ref(new Date().getFullYear());\nconst currentMonth = ref(new Date().getMonth());\nconst leftYear = ref(new Date().getFullYear());\nconst leftMonth = ref(new Date().getMonth());\nconst rightYear = ref(new Date().getMonth() === 11 ? new Date().getFullYear() + 1 : new Date().getFullYear());\nconst rightMonth = ref(new Date().getMonth() === 11 ? 0 : new Date().getMonth() + 1);\nconst viewMode = ref('day');\nconst selectedHour = ref(0);\nconst selectedMinute = ref(0);\nconst selectedSecond = ref(0);\nconst activeRangeSide = ref('start');\nconst activeTimeSide = ref(null);\nconst activeSingleTime = ref(false);\n\nconst weekDays = ['日', '一', '二', '三', '四', '五', '六'];\nconst monthList = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];\nconst defaultStartTime = '00:00:00';\nconst defaultEndTime = '23:59:59';\n\nconst isRange = computed(() => props.mode === 'range');\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\nconst menuWidth = computed(() => Math.round((isRange.value ? 646 : 360) * props.scale));\nconst dropdownStyle = computed(() => (props.scale !== 1 ? { zoom: props.scale } : undefined));\nconst minDateTime = computed(() => parseValue(props.min));\nconst maxDateTime = computed(() => parseValue(props.max));\nconst hourOptions = computed(() => Array.from({ length: 24 }, (_, index) => index));\nconst minuteOptions = computed(() => buildStepOptions(props.minuteStep));\nconst secondOptions = computed(() => buildStepOptions(props.secondStep));\n\nconst yearList = computed(() => {\n const startYear = Math.floor(currentYear.value / 12) * 12;\n return Array.from({ length: 12 }, (_, index) => startYear + index);\n});\n\nconst dayList = computed(() => getDayList(currentYear.value, currentMonth.value));\nconst leftDayList = computed(() => getDayList(leftYear.value, leftMonth.value));\nconst rightDayList = computed(() => getDayList(rightYear.value, rightMonth.value));\n\nconst displayValue = computed(() => {\n if (isRange.value) {\n if (!selectedRange.value.length) return '';\n const [start, end] = selectedRange.value;\n return [start, end].filter(Boolean).map(date => formatByPattern(date, props.format)).join(props.separator);\n }\n return selectedDateTime.value ? formatByPattern(selectedDateTime.value, props.format) : '';\n});\n\nconst previewValue = computed(() => tempDate.value ? formatByPattern(buildTempDateTime(), props.format) : '');\nconst singleTimeValue = computed(() => {\n const pattern = props.showSeconds ? 'HH:mm:ss' : 'HH:mm';\n const date = buildTempDateTime() || new Date(2000, 0, 1, selectedHour.value, selectedMinute.value, selectedSecond.value);\n return formatByPattern(date, pattern);\n});\n\nconst canConfirm = computed(() => {\n if (isRange.value) {\n const [start, end] = tempRange.value;\n return !!start && !!end && start <= end && !isDateTimeDisabled(start) && !isDateTimeDisabled(end);\n }\n if (!tempDate.value) return false;\n return !isDateTimeDisabled(buildTempDateTime());\n});\n\nconst activeRangeDate = computed(() => {\n return activeTimeSide.value === 'end' ? tempRange.value[1] : tempRange.value[0];\n});\n\nconst activeRangeHour = computed(() => activeRangeDate.value ? activeRangeDate.value.getHours() : 0);\nconst activeRangeMinute = computed(() => activeRangeDate.value ? activeRangeDate.value.getMinutes() : 0);\nconst activeRangeSecond = computed(() => activeRangeDate.value ? activeRangeDate.value.getSeconds() : 0);\n\nconst buildStepOptions = (step) => {\n const normalizedStep = Number.isFinite(step) && step > 0 ? Math.max(1, Math.floor(step)) : 1;\n const options = [];\n for (let value = 0; value < 60; value += normalizedStep) {\n options.push(value);\n }\n return options;\n};\n\nconst getDayList = (year, month) => {\n const firstDay = new Date(year, month, 1);\n const startDay = firstDay.getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n const today = new Date();\n const days = [];\n\n for (let index = startDay - 1; index >= 0; index -= 1) {\n days.push(createDay(new Date(year, month - 1, daysInPrevMonth - index), true, today));\n }\n for (let day = 1; day <= daysInMonth; day += 1) {\n days.push(createDay(new Date(year, month, day), false, today));\n }\n for (let day = 1; days.length < 42; day += 1) {\n days.push(createDay(new Date(year, month + 1, day), true, today));\n }\n\n return days;\n};\n\nconst createDay = (date, otherMonth, today) => ({\n date: formatByPattern(date, 'YYYY-MM-DD'),\n day: date.getDate(),\n year: date.getFullYear(),\n month: date.getMonth(),\n otherMonth,\n isToday: isSameDate(date, today)\n});\n\nconst padTime = (value) => String(value).padStart(2, '0');\n\nconst formatByPattern = (date, pattern) => {\n if (!(date instanceof Date) || Number.isNaN(date.getTime())) return '';\n const replacements = {\n YYYY: date.getFullYear(),\n MM: padTime(date.getMonth() + 1),\n DD: padTime(date.getDate()),\n HH: padTime(date.getHours()),\n mm: padTime(date.getMinutes()),\n ss: padTime(date.getSeconds())\n };\n return Object.keys(replacements).reduce((result, token) => {\n return result.replace(new RegExp(token, 'g'), replacements[token]);\n }, pattern);\n};\n\nconst formatDatePart = (date) => date ? formatByPattern(date, 'YYYY-MM-DD') : '';\nconst formatTimePart = (date) => date ? formatByPattern(date, props.showSeconds ? 'HH:mm:ss' : 'HH:mm') : '';\n\nconst parseValue = (value) => {\n if (!value && value !== 0) return null;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : new Date(value.getTime());\n if (typeof value === 'number') {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n if (typeof value !== 'string') return null;\n\n const normalized = value.trim().replace(/\\//g, '-');\n const match = normalized.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[ T](\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?)?/);\n if (!match) {\n const fallback = new Date(value);\n return Number.isNaN(fallback.getTime()) ? null : fallback;\n }\n\n const [, year, month, day, hour = '0', minute = '0', second = '0'] = match;\n const date = new Date(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second));\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst parseRangeValue = (value) => {\n if (Array.isArray(value)) return value.map(parseValue).filter(Boolean).slice(0, 2);\n if (typeof value === 'string' && value.includes(props.separator)) {\n return value.split(props.separator).map(item => parseValue(item.trim())).filter(Boolean).slice(0, 2);\n }\n return [];\n};\n\nconst toModelValue = (date) => {\n if (!date) return null;\n if (props.valueFormat === 'timestamp') return date.getTime();\n if (props.valueFormat === 'Date') return new Date(date.getTime());\n return formatByPattern(date, props.valueFormat);\n};\n\nconst toModelRange = (range) => range.map(date => toModelValue(date));\n\nconst isSameDate = (left, right) => {\n return left.getFullYear() === right.getFullYear()\n && left.getMonth() === right.getMonth()\n && left.getDate() === right.getDate();\n};\n\nconst buildTempDateTime = (hour = selectedHour.value, minute = selectedMinute.value, second = selectedSecond.value) => {\n if (!tempDate.value) return null;\n return new Date(tempDate.value.getFullYear(), tempDate.value.getMonth(), tempDate.value.getDate(), hour, minute, props.showSeconds ? second : 0);\n};\n\nconst isDateTimeDisabled = (date) => {\n if (!date) return true;\n if (minDateTime.value && date < minDateTime.value) return true;\n if (maxDateTime.value && date > maxDateTime.value) return true;\n if (props.disableFuture && date > new Date()) return true;\n return false;\n};\n\nconst isYearDisabled = (year) => {\n const start = new Date(year, 0, 1, 0, 0, 0);\n const end = new Date(year, 11, 31, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isMonthDisabled = (month) => {\n const start = new Date(currentYear.value, month, 1, 0, 0, 0);\n const end = new Date(currentYear.value, month + 1, 0, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isDayDisabled = (day) => {\n const start = new Date(day.year, day.month, day.day, 0, 0, 0);\n const end = new Date(day.year, day.month, day.day, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isTimePartDisabled = (hour, minute, second) => {\n if (!tempDate.value) return false;\n return isDateTimeDisabled(buildTempDateTime(hour, minute, second));\n};\n\nconst isDaySelected = (day) => {\n if (!tempDate.value) return false;\n return tempDate.value.getFullYear() === day.year\n && tempDate.value.getMonth() === day.month\n && tempDate.value.getDate() === day.day;\n};\n\nconst isRangeDaySelected = (day, side) => {\n const date = tempRange.value[side === 'start' ? 0 : 1];\n return !!date && date.getFullYear() === day.year && date.getMonth() === day.month && date.getDate() === day.day;\n};\n\nconst isRangeDayInRange = (day) => {\n const [start, end] = tempRange.value;\n if (!start || !end) return false;\n const date = new Date(day.year, day.month, day.day, 12, 0, 0);\n return date > start && date < end;\n};\n\nconst rangeDayClass = (day) => ['day-item', {\n 'other-month': day.otherMonth,\n today: day.isToday,\n disabled: isDayDisabled(day),\n selected: isRangeDaySelected(day, 'start') || isRangeDaySelected(day, 'end'),\n 'range-start': isRangeDaySelected(day, 'start'),\n 'range-end': isRangeDaySelected(day, 'end'),\n 'in-range': isRangeDayInRange(day)\n}];\n\nconst setSinglePanelFromDate = (date) => {\n if (!date) return;\n currentYear.value = date.getFullYear();\n currentMonth.value = date.getMonth();\n tempDate.value = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n selectedHour.value = date.getHours();\n selectedMinute.value = date.getMinutes();\n selectedSecond.value = date.getSeconds();\n};\n\nconst setRangePanelsFromDate = (date) => {\n const base = date || new Date();\n leftYear.value = base.getFullYear();\n leftMonth.value = base.getMonth();\n const right = new Date(base.getFullYear(), base.getMonth() + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n};\n\nconst initializePicker = () => {\n if (isRange.value) {\n tempRange.value = selectedRange.value.length ? selectedRange.value.map(date => new Date(date.getTime())) : [null, null];\n setRangePanelsFromDate(tempRange.value[0] || new Date());\n activeRangeSide.value = tempRange.value[0] && !tempRange.value[1] ? 'end' : 'start';\n activeTimeSide.value = null;\n return;\n }\n setSinglePanelFromDate(selectedDateTime.value || new Date());\n viewMode.value = 'day';\n activeSingleTime.value = false;\n};\n\nconst prevPeriod = () => {\n if (viewMode.value === 'year') currentYear.value -= 12;\n else if (viewMode.value === 'month') currentYear.value -= 1;\n else if (currentMonth.value === 0) {\n currentMonth.value = 11;\n currentYear.value -= 1;\n } else currentMonth.value -= 1;\n};\n\nconst nextPeriod = () => {\n if (viewMode.value === 'year') currentYear.value += 12;\n else if (viewMode.value === 'month') currentYear.value += 1;\n else if (currentMonth.value === 11) {\n currentMonth.value = 0;\n currentYear.value += 1;\n } else currentMonth.value += 1;\n};\n\nconst prevLeftMonth = () => {\n const left = new Date(leftYear.value, leftMonth.value - 1, 1);\n leftYear.value = left.getFullYear();\n leftMonth.value = left.getMonth();\n const right = new Date(leftYear.value, leftMonth.value + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n};\n\nconst nextRightMonth = () => {\n const right = new Date(rightYear.value, rightMonth.value + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n const left = new Date(rightYear.value, rightMonth.value - 1, 1);\n leftYear.value = left.getFullYear();\n leftMonth.value = left.getMonth();\n};\n\nconst changeViewMode = (mode) => {\n viewMode.value = mode;\n};\n\nconst selectYear = (year) => {\n if (isYearDisabled(year)) return;\n currentYear.value = year;\n viewMode.value = 'month';\n};\n\nconst selectMonth = (month) => {\n if (isMonthDisabled(month)) return;\n currentMonth.value = month;\n viewMode.value = 'day';\n};\n\nconst selectDay = (day) => {\n if (isDayDisabled(day)) return;\n tempDate.value = new Date(day.year, day.month, day.day);\n};\n\nconst selectRangeDay = (day) => {\n if (isDayDisabled(day)) return;\n const selected = new Date(day.year, day.month, day.day);\n if (activeRangeSide.value === 'start' || !tempRange.value[0] || (tempRange.value[0] && tempRange.value[1])) {\n const currentStart = tempRange.value[0];\n selected.setHours(currentStart?.getHours() ?? 0, currentStart?.getMinutes() ?? 0, props.showSeconds ? currentStart?.getSeconds() ?? 0 : 0, 0);\n tempRange.value = [selected, null];\n activeRangeSide.value = 'end';\n } else {\n const currentEnd = tempRange.value[1];\n selected.setHours(currentEnd?.getHours() ?? 23, currentEnd?.getMinutes() ?? 59, props.showSeconds ? currentEnd?.getSeconds() ?? 59 : 0, 0);\n const start = tempRange.value[0];\n tempRange.value = start <= selected ? [start, selected] : [selected, start];\n activeRangeSide.value = 'start';\n }\n};\n\nconst selectHour = (hour) => {\n if (isTimePartDisabled(hour, selectedMinute.value, selectedSecond.value)) return;\n selectedHour.value = hour;\n};\n\nconst selectMinute = (minute) => {\n if (isTimePartDisabled(selectedHour.value, minute, selectedSecond.value)) return;\n selectedMinute.value = minute;\n};\n\nconst selectSecond = (second) => {\n if (isTimePartDisabled(selectedHour.value, selectedMinute.value, second)) return;\n selectedSecond.value = second;\n};\n\nconst openRangeTime = (side) => {\n activeTimeSide.value = side;\n activeRangeSide.value = side;\n const index = side === 'start' ? 0 : 1;\n if (!tempRange.value[index]) {\n const base = new Date();\n base.setHours(side === 'start' ? 0 : 23, side === 'start' ? 0 : 59, props.showSeconds ? side === 'start' ? 0 : 59 : 0, 0);\n tempRange.value[index] = base;\n }\n};\n\nconst selectRangeTime = (part, value) => {\n const index = activeTimeSide.value === 'end' ? 1 : 0;\n const fallback = new Date();\n const date = tempRange.value[index] ? new Date(tempRange.value[index].getTime()) : fallback;\n if (part === 'hour') date.setHours(value);\n if (part === 'minute') date.setMinutes(value);\n if (part === 'second') date.setSeconds(value);\n if (!props.showSeconds) date.setSeconds(0);\n date.setMilliseconds(0);\n tempRange.value[index] = date;\n};\n\nconst closePicker = () => {\n showPicker.value = false;\n activeSingleTime.value = false;\n};\n\nconst clearTempRange = () => {\n tempRange.value = [null, null];\n activeRangeSide.value = 'start';\n activeTimeSide.value = null;\n};\n\nconst clearValue = () => {\n if (isRange.value) {\n selectedRange.value = [];\n tempRange.value = [null, null];\n emit('update:modelValue', []);\n emit('change', []);\n } else {\n selectedDateTime.value = null;\n tempDate.value = null;\n emit('update:modelValue', null);\n emit('change', null);\n }\n};\n\nconst confirm = () => {\n if (!canConfirm.value) return;\n if (isRange.value) {\n selectedRange.value = tempRange.value.map(date => new Date(date.getTime()));\n const modelValue = toModelRange(selectedRange.value);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n return;\n }\n const nextValue = buildTempDateTime();\n selectedDateTime.value = nextValue;\n const modelValue = toModelValue(nextValue);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n};\n\nconst handleCancel = () => {\n if (props.onCancel) {\n props.onCancel();\n } else {\n emit('cancel');\n closePicker();\n }\n};\n\nconst handleConfirm = () => {\n const value = isRange.value ? toModelRange(tempRange.value) : toModelValue(buildTempDateTime());\n if (props.onConfirm) {\n props.onConfirm(value);\n } else {\n emit('confirm', value);\n confirm();\n }\n};\n\nconst handleNow = () => {\n const now = new Date();\n if (isDateTimeDisabled(now)) return;\n setSinglePanelFromDate(now);\n};\n\nwatch(showPicker, (isOpen) => {\n if (isOpen) initializePicker();\n});\n\nwatch(() => props.modelValue, (newValue) => {\n if (isRange.value) {\n selectedRange.value = parseRangeValue(newValue);\n } else {\n selectedDateTime.value = parseValue(newValue);\n }\n}, { immediate: true });\n</script>\n\n<style scoped>\n.vtk-date-time-picker {\n position: relative;\n width: 100%;\n}\n\n.date-time-input {\n width: 100%;\n}\n\n.date-time-input-field {\n cursor: pointer;\n}\n\n:deep(.date-time-input-field .v-field),\n:deep(.date-time-input-field input) {\n cursor: pointer;\n}\n\n.date-time-icon {\n margin-left: 8px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n}\n\n.date-time-picker-dropdown {\n background: rgb(var(--v-theme-surface));\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n overflow: visible;\n}\n\n.date-time-picker-dropdown.range-mode {\n width: 646px;\n min-width: 646px;\n max-width: 646px;\n}\n\n.date-time-picker-dropdown:not(.range-mode) {\n width: 360px;\n min-width: 360px;\n max-width: none;\n}\n\n.date-time-picker-dropdown.inline-mode {\n box-shadow: none;\n width: fit-content;\n border: none;\n}\n\n\n.picker-shell,\n.range-calendar-shell {\n display: flex;\n align-items: stretch;\n flex-wrap: nowrap;\n}\n\n.date-panel {\n width: 288px;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.calendar-panel {\n flex: 0 0 322px;\n width: 322px;\n min-width: 322px;\n max-width: 322px;\n padding: 12px 16px 16px;\n box-sizing: border-box;\n}\n\n.calendar-divider {\n flex: 0 0 1px;\n width: 1px;\n background: rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-header,\n.calendar-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.picker-header {\n padding: 12px 16px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-header.single-header {\n border-bottom: none;\n padding: 14px 16px 8px;\n}\n\n.calendar-header {\n height: 36px;\n margin-bottom: 8px;\n}\n\n.header-title,\n.month-title {\n font-size: 16px;\n font-weight: 500;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.clickable {\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background 0.2s;\n}\n\n.clickable:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.nav-btn,\n.nav-btn-small {\n border: none;\n background: none;\n color: rgb(var(--v-theme-on-surface), 0.6);\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.2s;\n}\n\n.nav-btn {\n font-size: 20px;\n padding: 4px 12px;\n}\n\n.nav-btn-small {\n font-size: 18px;\n padding: 4px 8px;\n}\n\n.nav-btn:hover,\n.nav-btn-small:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.nav-btn-small.invisible {\n visibility: hidden;\n}\n\n.picker-body {\n padding: 10px 16px 16px;\n min-height: 250px;\n}\n\n.year-grid,\n.month-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n\n.year-item,\n.month-item {\n height: 42px;\n border: 1px solid transparent;\n background: transparent;\n text-align: center;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n}\n\n.year-item:hover,\n.month-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.year-item.selected,\n.month-item.selected {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.week-header {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n margin-bottom: 6px;\n}\n\n.week-day {\n text-align: center;\n padding: 6px 0;\n font-size: 12px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-weight: 500;\n}\n\n.day-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n}\n\n.day-item {\n aspect-ratio: 1;\n border: 1px solid transparent;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 13px;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.day-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.day-item.other-month {\n color: rgb(var(--v-theme-on-surface), 0.38);\n}\n\n.day-item.today {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n}\n\n.day-item.selected,\n.day-item.range-start,\n.day-item.range-end {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.day-item.in-range {\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.year-item.disabled,\n.month-item.disabled,\n.day-item.disabled,\n.time-item.disabled {\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\n cursor: not-allowed !important;\n pointer-events: none;\n opacity: 0.5;\n}\n\n.time-panel {\n width: 156px;\n}\n\n.time-header {\n height: 49px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 500;\n color: rgb(var(--v-theme-on-surface));\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.time-columns {\n display: flex;\n height: 250px;\n}\n\n.time-columns.compact {\n height: 192px;\n}\n\n.time-column {\n flex: 1;\n overflow-y: auto;\n padding: 6px 0;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.08);\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.time-column::-webkit-scrollbar {\n width: 0;\n height: 0;\n}\n\n.time-column:last-child {\n border-right: none;\n}\n\n.time-item {\n width: 100%;\n height: 28px;\n border: none;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n cursor: pointer;\n font-size: 13px;\n transition: all 0.2s;\n}\n\n.time-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.time-item.selected {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.range-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.single-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 9px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.single-date-input,\n.single-time-input {\n flex: 0 0 auto;\n width: 150px;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n padding: 0 12px;\n outline: none;\n}\n\n.single-time-input {\n text-align: left;\n cursor: pointer;\n}\n\n.single-time-input.active,\n.single-time-input:focus,\n.single-date-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.single-calendar-panel {\n width: 360px;\n}\n\n.range-date-input,\n.range-time-input {\n flex: 0 0 auto;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n padding: 0 12px;\n outline: none;\n}\n\n.range-date-input {\n width: 144px;\n}\n\n.range-time-input {\n width: 132px;\n text-align: left;\n cursor: pointer;\n}\n\n.range-time-input.active,\n.range-time-input:focus,\n.range-date-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.range-arrow {\n flex: 0 0 16px;\n width: 16px;\n text-align: center;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-size: 22px;\n}\n\n.range-time-popover {\n position: absolute;\n top: 45px;\n width: 180px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.single-time-popover {\n position: absolute;\n top: 45px;\n left: 156px;\n width: 180px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.range-time-popover.start {\n left: 162px;\n}\n\n.range-time-popover.end {\n left: 430px;\n}\n\n.time-popover-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.selected-display {\n padding: 10px 16px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n text-align: center;\n}\n\n.selected-text {\n font-size: 14px;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.placeholder-text,\n.inline-message {\n font-size: 14px;\n color: rgb(var(--v-theme-on-surface), 0.38);\n}\n\n.inline-message {\n padding: 16px;\n}\n\n.picker-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.footer-spacer {\n flex: 1;\n}\n\n.btn {\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n outline: none;\n}\n\n.btn.small {\n padding: 4px 8px;\n font-size: 12px;\n}\n\n.btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.btn-text {\n background: none;\n color: rgb(var(--v-theme-primary));\n}\n\n.btn-text:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.btn-primary {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n}\n</style>\n","<template>\n <div class=\"vtk-time-picker\">\n <VMenu\n v-if=\"!inline\"\n v-model=\"showPicker\"\n :attach=\"menuAttach\"\n :location=\"menuLocation\"\n :origin=\"menuOrigin\"\n :width=\"menuWidth\"\n :min-width=\"menuWidth\"\n offset=\"4\"\n :close-on-content-click=\"false\"\n >\n <template #activator=\"{ props: menuProps }\">\n <div class=\"time-input\">\n <VTextField\n :model-value=\"displayValue\"\n :label=\"label || undefined\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n readonly\n v-bind=\"menuProps\"\n :clearable=\"clearable && !!displayValue && !disabled\"\n clear-icon=\"mdi-close-circle\"\n persistent-clear\n class=\"time-input-field\"\n @click:clear.stop=\"clearValue\"\n >\n <template #append-inner>\n <VIcon size=\"16\" class=\"time-icon\">mdi-clock-outline</VIcon>\n </template>\n </VTextField>\n </div>\n </template>\n\n <div\n class=\"time-picker-dropdown\"\n :class=\"{ 'range-mode': isRange }\"\n :style=\"{ width: menuWidth + 'px', minWidth: menuWidth + 'px' }\"\n @click.stop\n @mousedown.stop\n >\n <template v-if=\"isRange\">\n <div class=\"range-input-row\">\n <div class=\"range-time-wrap\" :class=\"{ active: activeTimeSide === 'start' }\">\n <button class=\"range-time-input\" type=\"button\" @click=\"openRangeTime('start')\">\n {{ formatTimePart(tempRange[0]) || defaultStartTime }}\n </button>\n <div v-if=\"activeTimeSide === 'start'\" class=\"range-time-popover\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === activeRangeHour, disabled: isRangeTimeDisabled('start', 'hour', hour) }]\"\n @click=\"selectRangeTime('hour', hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === activeRangeMinute, disabled: isRangeTimeDisabled('start', 'minute', minute) }]\"\n @click=\"selectRangeTime('minute', minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === activeRangeSecond, disabled: isRangeTimeDisabled('start', 'second', second) }]\"\n @click=\"selectRangeTime('second', second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeTimeSide = null\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeTimeSide = null\">确定</button>\n </div>\n </div>\n </div>\n\n <span class=\"range-arrow\">›</span>\n\n <div class=\"range-time-wrap\" :class=\"{ active: activeTimeSide === 'end' }\">\n <button class=\"range-time-input\" type=\"button\" @click=\"openRangeTime('end')\">\n {{ formatTimePart(tempRange[1]) || defaultEndTime }}\n </button>\n <div v-if=\"activeTimeSide === 'end'\" class=\"range-time-popover\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === activeRangeHour, disabled: isRangeTimeDisabled('end', 'hour', hour) }]\"\n @click=\"selectRangeTime('hour', hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === activeRangeMinute, disabled: isRangeTimeDisabled('end', 'minute', minute) }]\"\n @click=\"selectRangeTime('minute', minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === activeRangeSecond, disabled: isRangeTimeDisabled('end', 'second', second) }]\"\n @click=\"selectRangeTime('second', second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeTimeSide = null\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeTimeSide = null\">确定</button>\n </div>\n </div>\n </div>\n </div>\n </template>\n\n <template v-else>\n <div class=\"single-time-panel\">\n <div class=\"time-columns\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === selectedHour, disabled: isTimePartDisabled(hour, selectedMinute, selectedSecond) }]\"\n @click=\"selectHour(hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === selectedMinute, disabled: isTimePartDisabled(selectedHour, minute, selectedSecond) }]\"\n @click=\"selectMinute(minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === selectedSecond, disabled: isTimePartDisabled(selectedHour, selectedMinute, second) }]\"\n @click=\"selectSecond(second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <div class=\"picker-footer\">\n <button v-if=\"!isRange\" class=\"btn btn-text\" type=\"button\" @click=\"handleNow\">此刻</button>\n <button v-if=\"isRange\" class=\"btn btn-text\" type=\"button\" @click=\"clearTempRange\">清空</button>\n <span class=\"footer-spacer\"></span>\n <button class=\"btn btn-text\" type=\"button\" @click=\"handleCancel\">取消</button>\n <button class=\"btn btn-primary\" type=\"button\" :disabled=\"!canConfirm\" @click=\"handleConfirm\">确定</button>\n </div>\n </div>\n </VMenu>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkTimePicker',\n});\n\nconst props = defineProps({\n modelValue: {\n type: [String, Date, Number, Array],\n default: null\n },\n mode: {\n type: String,\n default: 'single',\n validator: (value) => ['single', 'range'].includes(value)\n },\n label: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: '请选择时间'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n clearable: {\n type: Boolean,\n default: true\n },\n format: {\n type: String,\n default: 'HH:mm:ss'\n },\n valueFormat: {\n type: String,\n default: 'HH:mm:ss'\n },\n separator: {\n type: String,\n default: ' 至 '\n },\n min: {\n type: String,\n default: null\n },\n max: {\n type: String,\n default: null\n },\n minuteStep: {\n type: Number,\n default: 1\n },\n secondStep: {\n type: Number,\n default: 1\n },\n showSeconds: {\n type: Boolean,\n default: true\n },\n inline: {\n type: Boolean,\n default: false\n },\n placement: {\n type: String,\n default: 'left',\n validator: (value) => ['left', 'right'].includes(value)\n },\n noTeleport: {\n type: Boolean,\n default: false\n },\n onCancel: {\n type: Function,\n default: null\n },\n onConfirm: {\n type: Function,\n default: null\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\n\nconst showPicker = ref(false);\nconst selectedTime = ref(null);\nconst selectedRange = ref([]);\nconst tempRange = ref([null, null]);\nconst selectedHour = ref(0);\nconst selectedMinute = ref(0);\nconst selectedSecond = ref(0);\nconst activeTimeSide = ref(null);\n\nconst defaultStartTime = '00:00:00';\nconst defaultEndTime = '23:59:59';\n\nconst isRange = computed(() => props.mode === 'range');\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\nconst menuWidth = computed(() => isRange.value ? 320 : 240);\nconst minTime = computed(() => parseTime(props.min));\nconst maxTime = computed(() => parseTime(props.max));\nconst hourOptions = computed(() => Array.from({ length: 24 }, (_, index) => index));\nconst minuteOptions = computed(() => buildStepOptions(props.minuteStep));\nconst secondOptions = computed(() => buildStepOptions(props.secondStep));\n\nconst displayValue = computed(() => {\n if (isRange.value) {\n if (!selectedRange.value.length) return '';\n const [start, end] = selectedRange.value;\n return [start, end].filter(Boolean).map(date => formatByPattern(date, props.format)).join(props.separator);\n }\n return selectedTime.value ? formatByPattern(selectedTime.value, props.format) : '';\n});\n\nconst canConfirm = computed(() => {\n if (isRange.value) {\n const [start, end] = tempRange.value;\n if (!start || !end) return false;\n if (start > end) return false;\n return !isTimeDisabled(start.getHours(), start.getMinutes(), start.getSeconds())\n && !isTimeDisabled(end.getHours(), end.getMinutes(), end.getSeconds());\n }\n return !isTimeDisabled(selectedHour.value, selectedMinute.value, props.showSeconds ? selectedSecond.value : 0);\n});\n\nconst activeRangeDate = computed(() => {\n return activeTimeSide.value === 'end' ? tempRange.value[1] : tempRange.value[0];\n});\n\nconst activeRangeHour = computed(() => activeRangeDate.value ? activeRangeDate.value.getHours() : 0);\nconst activeRangeMinute = computed(() => activeRangeDate.value ? activeRangeDate.value.getMinutes() : 0);\nconst activeRangeSecond = computed(() => activeRangeDate.value ? activeRangeDate.value.getSeconds() : 0);\n\nconst buildStepOptions = (step) => {\n const normalizedStep = Number.isFinite(step) && step > 0 ? Math.max(1, Math.floor(step)) : 1;\n const options = [];\n for (let value = 0; value < 60; value += normalizedStep) {\n options.push(value);\n }\n return options;\n};\n\nconst padTime = (value) => String(value).padStart(2, '0');\n\nconst formatByPattern = (date, pattern) => {\n if (!(date instanceof Date) || Number.isNaN(date.getTime())) return '';\n const replacements = {\n HH: padTime(date.getHours()),\n mm: padTime(date.getMinutes()),\n ss: padTime(date.getSeconds())\n };\n return Object.keys(replacements).reduce((result, token) => {\n return result.replace(new RegExp(token, 'g'), replacements[token]);\n }, pattern);\n};\n\nconst formatTimePart = (date) => date ? formatByPattern(date, props.showSeconds ? 'HH:mm:ss' : 'HH:mm') : '';\n\nconst parseTime = (value) => {\n if (!value && value !== 0) return null;\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) return null;\n return new Date(2000, 0, 1, value.getHours(), value.getMinutes(), value.getSeconds());\n }\n if (typeof value === 'number') {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return new Date(2000, 0, 1, date.getHours(), date.getMinutes(), date.getSeconds());\n }\n if (typeof value !== 'string') return null;\n\n const match = value.trim().match(/(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?/);\n if (!match) return null;\n const [, hour, minute, second = '0'] = match;\n const date = new Date(2000, 0, 1, Math.min(23, Number(hour)), Math.min(59, Number(minute)), Math.min(59, Number(second)));\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst parseRangeValue = (value) => {\n if (Array.isArray(value)) return value.map(parseTime).filter(Boolean).slice(0, 2);\n if (typeof value === 'string' && value.includes(props.separator)) {\n return value.split(props.separator).map(item => parseTime(item.trim())).filter(Boolean).slice(0, 2);\n }\n return [];\n};\n\nconst toModelValue = (date) => {\n if (!date) return null;\n if (props.valueFormat === 'timestamp') return date.getTime();\n if (props.valueFormat === 'Date') return new Date(date.getTime());\n return formatByPattern(date, props.valueFormat);\n};\n\nconst toModelRange = (range) => range.map(date => toModelValue(date));\n\nconst buildTempTime = (hour = selectedHour.value, minute = selectedMinute.value, second = selectedSecond.value) => {\n return new Date(2000, 0, 1, hour, minute, props.showSeconds ? second : 0);\n};\n\nconst isTimeDisabled = (hour, minute, second) => {\n const date = new Date(2000, 0, 1, hour, minute, props.showSeconds ? second : 0);\n if (minTime.value && date < minTime.value) return true;\n if (maxTime.value && date > maxTime.value) return true;\n return false;\n};\n\nconst isTimePartDisabled = (hour, minute, second) => isTimeDisabled(hour, minute, second);\n\nconst isRangeTimeDisabled = (side, part, value) => {\n const index = side === 'end' ? 1 : 0;\n const otherIndex = 1 - index;\n const current = tempRange.value[index];\n const other = tempRange.value[otherIndex];\n const hour = part === 'hour' ? value : (current ? current.getHours() : 0);\n const minute = part === 'minute' ? value : (current ? current.getMinutes() : 0);\n const second = part === 'second' ? value : (current ? current.getSeconds() : 0);\n const date = new Date(2000, 0, 1, hour, minute, props.showSeconds ? second : 0);\n if (side === 'start') {\n if (other && date > other) return true;\n if (maxTime.value && date > maxTime.value) return true;\n } else {\n if (other && date < other) return true;\n if (minTime.value && date < minTime.value) return true;\n }\n return false;\n};\n\nconst selectHour = (hour) => {\n if (isTimePartDisabled(hour, selectedMinute.value, selectedSecond.value)) return;\n selectedHour.value = hour;\n};\n\nconst selectMinute = (minute) => {\n if (isTimePartDisabled(selectedHour.value, minute, selectedSecond.value)) return;\n selectedMinute.value = minute;\n};\n\nconst selectSecond = (second) => {\n if (isTimePartDisabled(selectedHour.value, selectedMinute.value, second)) return;\n selectedSecond.value = second;\n};\n\nconst openRangeTime = (side) => {\n activeTimeSide.value = side;\n const index = side === 'start' ? 0 : 1;\n if (!tempRange.value[index]) {\n const base = new Date(2000, 0, 1);\n base.setHours(side === 'start' ? 0 : 23, side === 'start' ? 0 : 59, props.showSeconds ? (side === 'start' ? 0 : 59) : 0, 0);\n tempRange.value[index] = base;\n }\n};\n\nconst selectRangeTime = (part, value) => {\n const index = activeTimeSide.value === 'end' ? 1 : 0;\n const date = tempRange.value[index] ? new Date(tempRange.value[index].getTime()) : new Date(2000, 0, 1);\n if (part === 'hour') date.setHours(value);\n if (part === 'minute') date.setMinutes(value);\n if (part === 'second') date.setSeconds(value);\n if (!props.showSeconds) date.setSeconds(0);\n date.setMilliseconds(0);\n tempRange.value[index] = date;\n};\n\nconst setSingleFromTime = (date) => {\n if (!date) return;\n selectedHour.value = date.getHours();\n selectedMinute.value = date.getMinutes();\n selectedSecond.value = date.getSeconds();\n};\n\nconst initializePicker = () => {\n if (isRange.value) {\n tempRange.value = selectedRange.value.length ? selectedRange.value.map(date => new Date(date.getTime())) : [null, null];\n activeTimeSide.value = null;\n return;\n }\n setSingleFromTime(selectedTime.value || new Date());\n};\n\nconst closePicker = () => {\n showPicker.value = false;\n activeTimeSide.value = null;\n};\n\nconst clearTempRange = () => {\n tempRange.value = [null, null];\n activeTimeSide.value = null;\n};\n\nconst clearValue = () => {\n if (isRange.value) {\n selectedRange.value = [];\n tempRange.value = [null, null];\n emit('update:modelValue', []);\n emit('change', []);\n } else {\n selectedTime.value = null;\n emit('update:modelValue', null);\n emit('change', null);\n }\n};\n\nconst confirm = () => {\n if (!canConfirm.value) return;\n if (isRange.value) {\n selectedRange.value = tempRange.value.map(date => new Date(date.getTime()));\n const modelValue = toModelRange(selectedRange.value);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n return;\n }\n const nextValue = buildTempTime();\n selectedTime.value = nextValue;\n const modelValue = toModelValue(nextValue);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n};\n\nconst handleCancel = () => {\n if (props.onCancel) {\n props.onCancel();\n } else {\n emit('cancel');\n closePicker();\n }\n};\n\nconst handleConfirm = () => {\n const value = isRange.value ? toModelRange(tempRange.value) : toModelValue(buildTempTime());\n if (props.onConfirm) {\n props.onConfirm(value);\n } else {\n emit('confirm', value);\n confirm();\n }\n};\n\nconst handleNow = () => {\n const now = new Date();\n if (isTimeDisabled(now.getHours(), now.getMinutes(), now.getSeconds())) return;\n setSingleFromTime(now);\n};\n\nwatch(showPicker, (isOpen) => {\n if (isOpen) initializePicker();\n});\n\nwatch(() => props.modelValue, (newValue) => {\n if (isRange.value) {\n selectedRange.value = parseRangeValue(newValue);\n } else {\n selectedTime.value = parseTime(newValue);\n }\n}, { immediate: true });\n</script>\n\n<style scoped>\n.vtk-time-picker {\n position: relative;\n width: 100%;\n}\n\n.time-input {\n width: 100%;\n}\n\n.time-input-field {\n cursor: pointer;\n}\n\n:deep(.time-input-field .v-field),\n:deep(.time-input-field input) {\n cursor: pointer;\n}\n\n.time-icon {\n margin-left: 8px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n}\n\n.time-picker-dropdown {\n background: rgb(var(--v-theme-surface));\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n overflow: visible;\n}\n\n.time-columns {\n display: flex;\n height: 260px;\n}\n\n.time-columns.compact {\n height: 192px;\n}\n\n.time-column {\n flex: 1;\n overflow-y: auto;\n padding: 6px 0;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.08);\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.time-column::-webkit-scrollbar {\n width: 0;\n height: 0;\n}\n\n.time-column:last-child {\n border-right: none;\n}\n\n.time-item {\n width: 100%;\n height: 28px;\n border: none;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n cursor: pointer;\n font-size: 13px;\n transition: all 0.2s;\n}\n\n.time-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.time-item.selected {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.time-item.disabled {\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\n cursor: not-allowed !important;\n pointer-events: none;\n opacity: 0.5;\n}\n\n.single-time-panel {\n padding: 8px 0;\n}\n\n.range-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n gap: 10px;\n padding: 10px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.range-time-wrap {\n position: relative;\n flex: 0 0 auto;\n}\n\n.range-time-input {\n width: 124px;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n text-align: left;\n padding: 0 12px;\n outline: none;\n cursor: pointer;\n}\n\n.range-time-input.active,\n.range-time-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.range-arrow {\n flex: 0 0 16px;\n width: 16px;\n text-align: center;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-size: 22px;\n}\n\n.range-time-popover {\n position: absolute;\n top: 40px;\n left: 0;\n width: 190px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.time-popover-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.footer-spacer {\n flex: 1;\n}\n\n.btn {\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n white-space: nowrap;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n outline: none;\n}\n\n.btn.small {\n padding: 4px 8px;\n font-size: 12px;\n}\n\n.btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.btn-text {\n background: none;\n color: rgb(var(--v-theme-primary));\n}\n\n.btn-text:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.btn-primary {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n}\n</style>\n","<script setup>\r\nimport { ref, computed, reactive, onMounted, getCurrentInstance, watch, nextTick } from \"vue\";\r\nconst { proxy } = getCurrentInstance();\r\n// 获取配置的键名,如果没有配置则使用默认值\r\nconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\nconst user = JSON.parse(proxy.$vtk.storage.get(userKey));\r\n\r\nconsole.log('window.VTK_CONFIG=', window.VTK_CONFIG)\r\nconsole.log('window.VTK_CONFIG?.storageKeys?.user', window.VTK_CONFIG?.storageKeys?.user)\r\nconsole.log('user', user)\r\nconst pause = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\r\n\r\n// 字段命名兼容:不同环境的用户信息 / 接口返回可能是 areacode 或 areaCode\r\nconst pickAreaCode = (obj) => obj?.areaCode || obj?.areacode || '';\r\nconst pickAreaName = (obj) => obj?.areaName || obj?.areaname || '';\r\n\r\n// 定义 props - 控制是否支持多选\r\nconst props = defineProps({\r\n multiple: {\r\n type: Boolean,\r\n default: false // 默认单选\r\n }\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['selected']);\r\n\r\n// 定义响应式数据\r\nconst dialog = ref(false);\r\n\r\n\r\n// 地区列表\r\nconst areaData = ref([]);\r\nconst areaSelectedData = ref([]);\r\nconst areaActivatedData = ref([]);\r\n\r\nwatch(areaActivatedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.areaCode) {\r\n getDeptList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\nwatch(areaSelectedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.areaCode) {\r\n getDeptList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\n// 获取地区列表\r\nconst getAreaList = () => {\r\n const userAreaCode = pickAreaCode(user);\r\n if (userAreaCode) {\r\n proxy.$vtk.request.getForm(`/dict/area/show/${userAreaCode}`).then((res) => {\r\n if (res && res.data) {\r\n areaData.value = [{\r\n areaCode: pickAreaCode(res.data),\r\n areaName: pickAreaName(res.data),\r\n children: []\r\n }];\r\n }\r\n });\r\n }\r\n};\r\n\r\n// 获取下级地区列表\r\nconst getAreaNextList = async (item) => {\r\n await pause(300);\r\n const parentCode = pickAreaCode(item);\r\n proxy.$vtk.request.getForm(`/dict/area/next/${parentCode}`).then((res) => {\r\n if (res && res.data) {\r\n res.data.forEach((it) => {\r\n // 统一成 areaCode / areaName,避免后端返回 areacode 时树取值取不到\r\n it.areaCode = pickAreaCode(it);\r\n it.areaName = pickAreaName(it);\r\n it.areaLeve < 12 && (it.children = []);\r\n item.children.push(it);\r\n });\r\n }\r\n });\r\n};\r\n\r\n// 部门列表\r\nconst deptData = ref([]);\r\nconst deptSelectedData = ref([]);\r\nconst deptActivatedData = ref([]);\r\n\r\nwatch(deptSelectedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.id) {\r\n getPersonList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\nwatch(deptActivatedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.id) {\r\n getPersonList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\n// 点击叶子节点时调用的方法\r\nconst getDeptList = (node) => {\r\n const selectAreaCode = node[0].areaCode;\r\n const params = { codex: { area: selectAreaCode, type: \"0\" } };\r\n deptData.value = [];\r\n proxy.$vtk.request.postJson('/bizp/supported/dept/list', params).then((res) => {\r\n res.data.forEach((it) => {\r\n it.children = [];\r\n deptData.value.push(it);\r\n });\r\n });\r\n};\r\n\r\nconst getDepNextList = async (item) => {\r\n await pause(300);\r\n const selectAreaCode = item.areaCode;\r\n const selectPid = item.id;\r\n const params = { codex: { area: selectAreaCode, pid: selectPid } };\r\n proxy.$vtk.request.postJson('/bizp/supported/dept/list', params).then((res) => {\r\n if (res && res.data) {\r\n res.data.forEach((it) => {\r\n it.children = [];\r\n item.children.push(it);\r\n });\r\n }\r\n });\r\n};\r\n\r\n// 人员列表\r\nconst personData = ref([]);\r\nconst selectedPersonData = ref([]);\r\n// 全局已选人员列表(跨部门保存,用于去重和持久化选中状态)\r\nconst allSelectedPersons = ref([]);\r\n// 标记是否正在恢复选中状态(避免触发 watch 循环)\r\nconst isRestoringSelection = ref(false);\r\n\r\n// 已选中的人员列表(用于右侧显示)- 去重后的列表\r\nconst selectedPersonList = computed(() => {\r\n // 使用 Map 去重,key 为人员 id\r\n const uniqueMap = new Map();\r\n allSelectedPersons.value.forEach(person => {\r\n if (person && person.id) {\r\n uniqueMap.set(person.id, person);\r\n }\r\n });\r\n\r\n return Array.from(uniqueMap.values());\r\n});\r\n\r\n// 监听当前部门选中人员的变化\r\nwatch(selectedPersonData, (newVal, oldVal) => {\r\n // 如果正在恢复选中状态,不处理\r\n if (isRestoringSelection.value) {\r\n return;\r\n }\r\n\r\n // 单选模式:直接替换全局列表\r\n if (!props.multiple) {\r\n if (newVal && newVal.length > 0) {\r\n // 单选模式下只保留最新选中的一个\r\n allSelectedPersons.value = [newVal[0]];\r\n } else {\r\n // 取消选中时清空\r\n allSelectedPersons.value = [];\r\n }\r\n return;\r\n }\r\n\r\n // 多选模式:累加到全局列表\r\n // 处理新选中的人员\r\n if (newVal && newVal.length > 0) {\r\n newVal.forEach(person => {\r\n const exists = allSelectedPersons.value.some(p => p.id === person.id);\r\n if (!exists) {\r\n allSelectedPersons.value.push(person);\r\n }\r\n });\r\n }\r\n\r\n // 处理取消选中的人员\r\n if (oldVal && oldVal.length > 0) {\r\n oldVal.forEach(oldPerson => {\r\n const stillSelected = newVal?.some(p => p.id === oldPerson.id);\r\n if (!stillSelected) {\r\n // 从全局列表中移除\r\n const index = allSelectedPersons.value.findIndex(p => p.id === oldPerson.id);\r\n if (index > -1) {\r\n allSelectedPersons.value.splice(index, 1);\r\n }\r\n }\r\n });\r\n }\r\n}, { deep: true });\r\n\r\n// 监听部门切换,同步选中状态\r\nwatch(personData, async (newPersonData) => {\r\n if (!newPersonData || newPersonData.length === 0) {\r\n isRestoringSelection.value = true;\r\n selectedPersonData.value = [];\r\n await nextTick();\r\n isRestoringSelection.value = false;\r\n return;\r\n }\r\n\r\n // 等待 DOM 更新\r\n await nextTick();\r\n\r\n // 标记正在恢复选中状态\r\n isRestoringSelection.value = true;\r\n\r\n // 当人员列表更新时,恢复之前选中的状态\r\n const currentSelected = [];\r\n newPersonData.forEach(person => {\r\n const isSelected = allSelectedPersons.value.some(p => p.id === person.id);\r\n if (isSelected) {\r\n currentSelected.push(person);\r\n }\r\n });\r\n\r\n selectedPersonData.value = currentSelected;\r\n\r\n // 等待状态更新完成\r\n await nextTick();\r\n isRestoringSelection.value = false;\r\n}, { deep: true });\r\n\r\n// 移除已选中的人员\r\nconst removeSelectedPerson = (personId) => {\r\n // 从全局列表中移除\r\n const globalIndex = allSelectedPersons.value.findIndex(person => person.id === personId);\r\n if (globalIndex > -1) {\r\n allSelectedPersons.value.splice(globalIndex, 1);\r\n }\r\n\r\n // 从当前显示的选中列表中移除\r\n const currentIndex = selectedPersonData.value.findIndex(person => person.id === personId);\r\n if (currentIndex > -1) {\r\n selectedPersonData.value.splice(currentIndex, 1);\r\n }\r\n};\r\n\r\n\r\n// 点击叶子节点时调用的方法\r\n// \r\nconst getPersonList = (node) => {\r\n const selectAreaID = node[0].id;\r\n const params = { codex: { dept: selectAreaID } };\r\n\r\n proxy.$vtk.request.postJson('/bizp/supported/user/list', params).then((res) => {\r\n if (res && res.meta.success && res.data.length > 0) {\r\n personData.value = res.data\r\n } else {\r\n personData.value = null\r\n }\r\n });\r\n};\r\nconst add = () => {\r\n dialog.value = true;\r\n};\r\n\r\nconst close = () => {\r\n // 先设置标记,避免触发 watch\r\n isRestoringSelection.value = true;\r\n\r\n // 关闭对话框\r\n dialog.value = false;\r\n\r\n // 清空选中状态\r\n selectedPersonData.value = [];\r\n allSelectedPersons.value = [];\r\n areaSelectedData.value = [];\r\n areaActivatedData.value = [];\r\n deptSelectedData.value = [];\r\n deptActivatedData.value = [];\r\n personData.value = [];\r\n deptData.value = [];\r\n\r\n // 重置标记\r\n nextTick(() => {\r\n isRestoringSelection.value = false;\r\n });\r\n};\r\n\r\n// 确认选择\r\nconst confirm = () => {\r\n // 返回选中的人员列表给父组件\r\n const selectedPersons = selectedPersonList.value;\r\n // 通过 emit 将选中的人员传递给父组件\r\n emit('selected', selectedPersons);\r\n close();\r\n};\r\n\r\nonMounted(() => {\r\n // 获取地区列表\r\n getAreaList();\r\n});\r\n\r\n// 使组件方法可以被父组件调用\r\ndefineExpose({\r\n close,\r\n add,\r\n});\r\n</script>\r\n\r\n<template>\r\n <v-dialog v-model=\"dialog\" persistent width=\"1000\">\r\n <v-card>\r\n <v-card-title class=\"d-flex align-center\">\r\n <span class=\"text-h6\">人员选择</span>\r\n <v-spacer></v-spacer>\r\n <v-btn class=\"g-no-shadow\" icon @click=\"close\" size=\"small\">\r\n <v-icon>mdi-close</v-icon>\r\n </v-btn>\r\n </v-card-title>\r\n <v-divider />\r\n <v-card-text class=\"pb-0 mb-0 pl-0 pr-0\" style=\"height: 600px;\">\r\n <v-row style=\"margin-top:-16px; height: 100%;\">\r\n <v-col md=\"3\" class=\"pr-0 \" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">地区</span>\r\n </v-card-title>\r\n <v-sheet height=\"500\" style=\"overflow: auto\" class=\"mt-2 pl-2\">\r\n <v-treeview item-value=\"id\" item-title=\"areaName\" return-object :items=\"areaData\" density=\"compact\"\r\n color=\"primary\" item-props activatable v-model:selected=\"areaSelectedData\"\r\n v-model:activated=\"areaActivatedData\" :load-children=\"getAreaNextList\">\r\n <template v-slot:title=\"{ item }\">\r\n <span :title=\"item.areaName\">{{ item.areaName }}</span>\r\n </template>\r\n </v-treeview>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">部门</span>\r\n </v-card-title>\r\n <v-sheet height=\"500\" style=\"overflow: auto\" class=\"mt-2 pl-2\">\r\n <v-treeview v-if=\"deptData && deptData.length > 0\" item-value=\"id\" item-title=\"name\" return-object :items=\"deptData\" density=\"compact\"\r\n color=\"primary\" item-props activatable v-model:selected=\"deptSelectedData\"\r\n v-model:activated=\"deptActivatedData\" :load-children=\"getDepNextList\">\r\n <template v-slot:title=\"{ item }\">\r\n <span :title=\"item.name\">{{ item.name }}</span>\r\n </template>\r\n </v-treeview>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-office-building-outline\r\n </v-icon>\r\n <div class=\"text-grey\">暂无</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">人员</span>\r\n </v-card-title>\r\n <v-sheet height=\"550\" style=\"overflow: auto;\" class=\"mt-2\">\r\n <v-treeview v-if=\"personData && personData.length > 0\"\r\n item-value=\"id\"\r\n item-title=\"username\"\r\n return-object\r\n :items=\"personData\"\r\n density=\"compact\"\r\n color=\"primary\"\r\n item-props\r\n selectable\r\n :select-strategy=\"multiple ? 'leaf' : 'single-leaf'\"\r\n v-model:selected=\"selectedPersonData\">\r\n <template v-slot:title=\"{ item }\">\r\n <div class=\"d-flex align-center\" :title=\"item.username\">\r\n <v-avatar size=\"24\" class=\"mr-2\">\r\n <v-img v-if=\"item.avatar\" :src=\"item.avatar\"></v-img>\r\n <v-icon v-else size=\"20\">mdi-account-circle</v-icon>\r\n </v-avatar>\r\n <span>{{ item.username }}</span>\r\n </div>\r\n </template>\r\n </v-treeview>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-account-group\r\n </v-icon>\r\n <div class=\"text-grey\">暂无</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">已选中人员 ({{ selectedPersonList.length }})</span>\r\n </v-card-title>\r\n <v-sheet height=\"550\" style=\"overflow: auto\" class=\"mt-2 px-2\">\r\n <v-list v-if=\"selectedPersonList.length > 0\" density=\"compact\">\r\n <v-list-item\r\n v-for=\"person in selectedPersonList\"\r\n :key=\"person.id\"\r\n :title=\"person.username\"\r\n class=\"px-2 mb-1 mr-2\"\r\n rounded=\"lg\"\r\n color=\"primary\"\r\n variant=\"tonal\">\r\n <template v-slot:prepend>\r\n <v-avatar size=\"32\">\r\n <v-img v-if=\"person.avatar\" :src=\"person.avatar\"></v-img>\r\n <v-icon v-else>mdi-account-circle</v-icon>\r\n </v-avatar>\r\n </template>\r\n <template v-slot:append>\r\n <v-btn\r\n icon\r\n size=\"x-small\"\r\n variant=\"text\"\r\n @click=\"removeSelectedPerson(person.id)\">\r\n <v-icon size=\"16\">mdi-close</v-icon>\r\n </v-btn>\r\n </template>\r\n </v-list-item>\r\n </v-list>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-account\r\n </v-icon>\r\n <div class=\"text-grey\">暂无选中</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n </v-row>\r\n </v-card-text>\r\n <v-divider />\r\n <v-card-actions>\r\n <v-spacer></v-spacer>\r\n <v-btn color=\"darken-1\" text @click=\"close\">取消</v-btn>\r\n <v-btn color=\"blue darken-1\" text @click=\"confirm\">确定</v-btn>\r\n </v-card-actions>\r\n </v-card>\r\n </v-dialog>\r\n</template>\r\n\r\n<style scoped>\r\n:deep() .v-sheet[style*=\"overflow: auto\"] {\r\n &::-webkit-scrollbar {\r\n width: 5px;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background: #ccc;\r\n border-radius: 4px;\r\n }\r\n}\r\n</style>","<!-- 空页面 -->\r\n<template>\r\n <v-empty-state\r\n :headline=\"headline\"\r\n :title=\"title\"\r\n :text=\"text\"\r\n :image=\"image\"\r\n :icon=\"icon\"\r\n :rounded=\"rounded\"\r\n :elevation=\"elevation\"\r\n >\r\n <!-- 图像插槽 -->\r\n <template v-if=\"$slots.media\" #media>\r\n <slot name=\"media\"></slot>\r\n </template>\r\n\r\n <!-- 标题插槽 -->\r\n <template v-if=\"$slots.title\" #title>\r\n <slot name=\"title\"></slot>\r\n </template>\r\n\r\n <!-- 文本插槽 -->\r\n <template v-if=\"$slots.text\" #text>\r\n <slot name=\"text\"></slot>\r\n </template>\r\n\r\n <!-- 操作按钮插槽 -->\r\n <template v-if=\"$slots.actions\" #actions>\r\n <slot name=\"actions\"></slot>\r\n </template>\r\n\r\n <!-- 底部插槽 -->\r\n <template v-if=\"$slots.bottom\" #bottom>\r\n <slot name=\"bottom\"></slot>\r\n </template>\r\n </v-empty-state>\r\n</template>\r\n\r\n<script setup>\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkEmpty\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 标题\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n // 副标题/文本\r\n text: {\r\n type: String,\r\n default: ''\r\n },\r\n // 头部文本(更大字体)\r\n headline: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图标\r\n icon: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图像\r\n image: {\r\n type: String,\r\n default: ''\r\n },\r\n // 圆角\r\n rounded: {\r\n type: [Boolean, String, Number],\r\n default: 'circle'\r\n },\r\n // 阴影\r\n elevation: {\r\n type: [Number, String],\r\n default: 0\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* 可以添加自定义样式 */\r\n:deep(.v-empty-state) {\r\n padding: 24px;\r\n}\r\n\r\n:deep(.v-empty-state__media) {\r\n margin-bottom: 16px;\r\n}\r\n\r\n:deep(.v-empty-state__headline) {\r\n margin-bottom: 8px;\r\n}\r\n\r\n:deep(.v-empty-state__title) {\r\n margin-bottom: 8px;\r\n}\r\n\r\n:deep(.v-empty-state__actions) {\r\n margin-top: 16px;\r\n}\r\n</style>","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1749629552703'%20class='icon'%20viewBox='0%200%201396%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='13768'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='272.65625'%20height='200'%3e%3cpath%20d='M1264.425891%20814.340655c-6.050909-42.7008-33.233455-84.433455-74.202764-97.540655a199.028364%20199.028364%200%200%201%202.373818%20136.443345c-5.9392%2017.072873-14.373236%2035.439709-8.154763%2052.410182a44.274036%2044.274036%200%200%200%2023.021382%2023.514764%20132.096%20132.096%200%200%200%2032.423563%209.309091l2.169018%201.7408c16.5888-39.880145%2028.429964-83.232582%2022.369746-125.877527z'%20fill='%23F4F4F4'%20p-id='13769'%3e%3c/path%3e%3cpath%20d='M1191.666036%20718.773527c25.488291%2026.242327%2041.630255%2059.466473%2046.145164%2094.952728%201.089164%207.633455%200.893673%2015.378618-0.577164%2022.956218a41.648873%2041.648873%200%200%201-10.593745%2019.642182%2088.175709%2088.175709%200%200%200-13.898473%2016.27229%2024.669091%2024.669091%200%200%200-0.902982%2021.00131c3.723636%208.192%209.141527%2015.5648%2015.946473%2021.69949a66.187636%2066.187636%200%200%201%2017.7152%2024.315346c0.335127%201.135709%202.215564%200.539927%201.880436-0.651636-5.697164-16.821527-22.788655-26.158545-31.390254-41.239273a24.920436%2024.920436%200%200%201-2.215564-22.788655%2067.323345%2067.323345%200%200%201%2013.7216-16.877382%2043.976145%2043.976145%200%200%200%2011.394328-18.878836%2065.619782%2065.619782%200%200%200%201.42429-22.844509%20157.947345%20157.947345%200%200%200-13.6192-49.915345%20171.4176%20171.4176%200%200%200-33.540654-49.319564c-0.856436-0.930909-2.169018%200.539927-1.312582%201.461527l-0.176873%200.214109z'%20fill='%23FFFFFF'%20p-id='13770'%3e%3c/path%3e%3cpath%20d='M1228.418327%20845.460945c-8.033745-5.678545-14.038109-14.838691-16.821527-25.674472-0.279273-1.098473-1.629091-0.502691-1.387055%200.549236%202.913745%2011.282618%209.197382%2020.815127%2017.594182%2026.679855%200.8192%200.539927%201.424291-1.005382%200.6144-1.554619z'%20fill='%23FFFFFF'%20p-id='13771'%3e%3c/path%3e%3cpath%20d='M1070.545455%20804.770909l1.954909%201.135709c8.759855%204.980364%2017.035636%2010.630982%2024.734254%2016.886691%200.642327%200.437527%201.238109%200.912291%201.796655%201.4336a184.813382%20184.813382%200%200%201%2044.776727%2053.573818c4.421818%208.043055%208.154764%2016.384%2011.170909%2024.939055%204.189091%2011.803927%207.68%2024.687709%2015.685818%2034.564654%200.837818%201.014691%201.722182%201.992145%202.671709%202.913746l70.814255-1.135709H1247.418182a12.241455%2012.241455%200%200%200-0.381673-1.3312%203.351273%203.351273%200%200%200%200-0.791273%201.926982%201.926982%200%200%201%200-0.539927%201.303273%201.303273%200%200%201%200-0.446837c-0.763345-2.615855-1.582545-5.231709-2.345891-7.801018a246.225455%20246.225455%200%200%200-26.959127-58.963782%20166.288291%20166.288291%200%200%200-17.221818-22.760727%20137.746618%20137.746618%200%200%200-45.921746-33.978182c-25.013527-12.269382-54.346473-15.173818-81.696582-8.098909l-2.34589%200.400291z'%20fill='%23F4F4F4'%20p-id='13772'%3e%3c/path%3e%3cpath%20d='M1071.904582%20802.425018c35.169745%206.022982%2067.444364%2022.341818%2092.243782%2046.685091a69.678545%2069.678545%200%200%201%2013.451636%2017.594182c3.165091%206.395345%204.468364%2013.479564%203.742255%2020.517236a78.941091%2078.941091%200%200%200-0.651637%2019.893528c1.303273%206.823564%205.659927%2012.790691%2011.943564%2016.365381%207.7824%204.189091%2016.384%206.8608%2025.283491%207.847564a67.397818%2067.397818%200%200%201%2028.048291%208.722618c0.977455%200.670255%202.066618-0.8192%201.033309-1.536-14.270836-9.746618-33.093818-7.335564-48.835491-14.112582-7.493818-2.774109-13.2096-8.685382-15.453091-16.002327a60.229818%2060.229818%200%200%201%200-20.200727%2040.001164%2040.001164%200%200%200-2.885818-20.265891%2064.260655%2064.260655%200%200%200-12.6976-17.957236%20164.9664%20164.9664%200%200%200-40.364218-30.366255A180.140218%20180.140218%200%200%200%201071.522909%20800.581818c-1.247418%200-1.359127%201.582545%200%201.796655l0.372364%200.046545z'%20fill='%23FFFFFF'%20p-id='13773'%3e%3c/path%3e%3cpath%20d='M1148.220509%20837.520291c8.620218-8.145455%208.052364-19.725964-1.3312-27.387346-0.912291-0.7168-2.541382%200.316509-1.582545%201.03331%208.8064%207.121455%209.271855%2017.938618%201.098472%2025.451054-0.847127%200.809891%200.968145%201.675636%201.815273%200.902982z'%20fill='%23FFFFFF'%20p-id='13774'%3e%3c/path%3e%3cpath%20d='M269.963636%20102.4m20.107637%200l248.366545%200q20.107636%200%2020.107637%2020.107636l0%2080.802909q0%2020.107636-20.107637%2020.107637l-248.366545%200q-20.107636%200-20.107637-20.107637l0-80.802909q0-20.107636%2020.107637-20.107636Z'%20fill='%23F4F4F4'%20p-id='13775'%3e%3c/path%3e%3cpath%20d='M339.781818%20162.909091m-23.272727%200a23.272727%2023.272727%200%201%200%2046.545454%200%2023.272727%2023.272727%200%201%200-46.545454%200Z'%20fill='%23FFFFFF'%20p-id='13776'%3e%3c/path%3e%3cpath%20d='M513.889745%20158.217309H387.872582C384.372364%20157.789091%20381.672727%20153.767564%20381.672727%20148.945455s2.690327-8.843636%206.199855-9.271855h126.017163c2.569309-0.316509%205.045527%201.377745%206.404655%204.375273%201.349818%203.006836%201.349818%206.795636%200%209.793163-1.359127%202.997527-3.835345%204.691782-6.404655%204.375273zM477.435345%20195.490909h-89.125236c-3.667782%200-6.637382-4.170473-6.637382-9.309091s2.978909-9.309091%206.637382-9.309091h89.125236c3.667782%200%206.637382%204.170473%206.637382%209.309091s-2.978909%209.309091-6.637382%209.309091z'%20fill='%23FFFFFF'%20p-id='13777'%3e%3c/path%3e%3cpath%20d='M111.709091%20605.090909m20.107636%200l183.202909%200q20.107636%200%2020.107637%2020.107636l0%2090.112q0%2020.107636-20.107637%2020.107637l-183.202909%200q-20.107636%200-20.107636-20.107637l0-90.112q0-20.107636%2020.107636-20.107636Z'%20fill='%23E1EDFF'%20p-id='13778'%3e%3c/path%3e%3cpath%20d='M162.909091%20665.6m-23.272727%200a23.272727%2023.272727%200%201%200%2046.545454%200%2023.272727%2023.272727%200%201%200-46.545454%200Z'%20fill='%23FFFFFF'%20p-id='13779'%3e%3c/path%3e%3cpath%20d='M251.997091%20660.908218h-30.608291C217.264873%20660.489309%20214.109091%20656.477091%20214.109091%20651.636364s3.165091-8.852945%207.279709-9.271855h30.608291c2.997527-0.3072%205.892655%201.396364%207.4752%204.384582%201.582545%202.997527%201.582545%206.777018%200%209.774545-1.582545%202.997527-4.477673%204.691782-7.4752%204.384582zM282.0096%20698.181818h-61.328291c-3.723636-0.418909-6.572218-4.468364-6.572218-9.309091s2.848582-8.890182%206.572218-9.309091h61.328291c3.723636%200.418909%206.572218%204.468364%206.572218%209.309091s-2.848582%208.890182-6.572218%209.309091z'%20fill='%23FFFFFF'%20p-id='13780'%3e%3c/path%3e%3cpath%20d='M269.963636%20944.872727h1014.690909'%20fill='%2366676D'%20p-id='13781'%3e%3c/path%3e%3cpath%20d='M269.963636%20940.218182h1014.690909v9.309091H269.963636z'%20fill='%23E1EDFF'%20p-id='13782'%3e%3c/path%3e%3cpath%20d='M996.072727%20232.727273m-27.927272%200a27.927273%2027.927273%200%201%200%2055.854545%200%2027.927273%2027.927273%200%201%200-55.854545%200Z'%20fill='%23F4F4F4'%20p-id='13783'%3e%3c/path%3e%3cpath%20d='M1181.305018%20866.117818c-1.508073%203.956364-4.431127%206.656-7.7824%207.177309-0.893673%200-0.633018%201.8432%200%201.759418%203.695709-0.6144%206.925964-3.584%208.610909-7.940654a1.098473%201.098473%200%200%200%200.055855-0.865746c-0.093091-0.279273-0.297891-0.465455-0.539927-0.50269-0.232727-0.027927-0.465455%200.111709-0.605091%200.372363h0.260654z'%20fill='%23FFFFFF'%20p-id='13784'%3e%3c/path%3e%3cpath%20d='M1196.218182%20358.4m-32.581818%200a32.581818%2032.581818%200%201%200%2065.163636%200%2032.581818%2032.581818%200%201%200-65.163636%200Z'%20fill='%23FEDAC2'%20p-id='13785'%3e%3c/path%3e%3cpath%20d='M1027.537455%20679.563636H846.196364a26.437818%2026.437818%200%200%200-26.372655%2026.5216v11.347782c0%2010.426182-8.406109%2018.878836-18.776436%2018.878837H642.234182a18.832291%2018.832291%200%200%201-18.776437-18.822982v-11.403637A26.437818%2026.437818%200%200%200%20597.085091%20679.563636H415.529891c-8.415418%200-15.238982%206.8608-15.238982%2015.332073v239.299491A15.341382%2015.341382%200%200%200%20415.529891%20949.527273h611.849309a15.341382%2015.341382%200%200%200%2015.238982-15.332073V694.895709c0-8.406109-6.730473-15.248291-15.080727-15.332073z%20m7.382109%20254.585019c0%204.105309-3.295418%207.447273-7.382109%207.4752H415.688145a7.456582%207.456582%200%200%201-7.382109-7.4752V694.895709a7.186618%207.186618%200%200%201%202.169019-5.306182%207.316945%207.316945%200%200%201%205.268945-2.178327h181.341091a18.832291%2018.832291%200%200%201%2018.720582%2018.888145v11.347782a26.763636%2026.763636%200%200%200%2026.633309%2026.512291H801.047273a26.763636%2026.763636%200%200%200%2026.633309-26.512291v-11.357091c0-10.398255%208.378182-18.850909%2018.729891-18.878836h181.341091a7.456582%207.456582%200%200%201%207.3728%207.484509l-0.2048%20239.243636z'%20fill='%23D3D3D3'%20p-id='13786'%3e%3c/path%3e%3cpath%20d='M527.145891%20260.654545H934.632727c13.833309%200.977455%2024.417745%2013.163055%2024.203637%2027.368728l-0.046546%201.163636L958.836364%20684.218182h-6.460509l-0.046546-395.226764c0.6144-10.835782-6.944582-20.200727-16.905309-21.466763l-1.005382-0.093091-407.058618-0.009309c-10.333091%200.726109-18.255127%209.755927-18.208582%2020.666181l0.037237%201.098473%200.046545%20395.031273h-6.460509l-0.037236-394.835782c-0.791273-14.522182%209.4208-27.052218%2023.272727-28.625455l1.135709-0.1024z'%20fill='%23CACACC'%20p-id='13787'%3e%3c/path%3e%3cpath%20d='M823.975564%20381.672727H712.024436c-7.7824-0.446836-13.842618-6.572218-13.842618-13.963636s6.060218-13.5168%2013.842618-13.963636h111.951128c7.7824%200.446836%2013.842618%206.572218%2013.842618%2013.963636s-6.060218%2013.5168-13.842618%2013.963636zM878.964364%20381.672727h-17.128728c-8.266473-0.446836-14.708364-6.572218-14.708363-13.963636s6.441891-13.5168%2014.708363-13.963636h17.128728c8.266473%200.446836%2014.708364%206.572218%2014.708363%2013.963636s-6.441891%2013.5168-14.708363%2013.963636z'%20fill='%23F4F4F4'%20p-id='13788'%3e%3c/path%3e%3cpath%20d='M650.724073%20357.338764h-30.72V326.190545A10.333091%2010.333091%200%200%200%20609.745455%20316.509091a10.333091%2010.333091%200%200%200-10.24931%209.681454v31.148219h-30.72c-5.650618%200-10.230691%204.645236-10.23069%2010.370327%200%205.725091%204.580073%2010.370327%2010.221381%2010.370327h30.72v31.157527A10.333091%2010.333091%200%200%200%20609.745455%20418.909091a10.333091%2010.333091%200%200%200%2010.249309-9.681455v-31.148218h30.72c5.650618%200%2010.230691-4.645236%2010.230691-10.370327%200-5.725091-4.580073-10.370327-10.221382-10.370327z'%20fill='%231E73F7'%20p-id='13789'%3e%3c/path%3e%3cpath%20d='M558.545455%20474.763636m20.107636%200l304.221091%200q20.107636%200%2020.107636%2020.107637l0%2024.948363q0%2020.107636-20.107636%2020.107637l-304.221091%200q-20.107636%200-20.107636-20.107637l0-24.948363q0-20.107636%2020.107636-20.107637Z'%20fill='%23E1EDFF'%20p-id='13790'%3e%3c/path%3e%3cpath%20d='M558.545455%20549.236364m20.107636%200l118.039273%200q20.107636%200%2020.107636%2020.107636l0%2024.948364q0%2020.107636-20.107636%2020.107636l-118.039273%200q-20.107636%200-20.107636-20.107636l0-24.948364q0-20.107636%2020.107636-20.107636Z'%20fill='%23E1EDFF'%20p-id='13791'%3e%3c/path%3e%3cpath%20d='M251.345455%20437.527273m-18.618182%200a18.618182%2018.618182%200%201%200%2037.236363%200%2018.618182%2018.618182%200%201%200-37.236363%200Z'%20fill='%23E1EDFF'%20p-id='13792'%3e%3c/path%3e%3cpath%20d='M1079.854545%20539.927273m-9.30909%200a9.309091%209.309091%200%201%200%2018.618181%200%209.309091%209.309091%200%201%200-18.618181%200Z'%20fill='%23E1EDFF'%20p-id='13793'%3e%3c/path%3e%3cpath%20d='M558.545455%20810.942836v53.750691h5.920581V820.503273h0.214109l29.29571%2044.190254h6.060218v-53.750691h-5.911273v43.734109h-0.223418l-29.146764-43.734109zM632.943709%20809.890909c-7.791709%200-13.851927%202.708945-18.3296%208.126836-4.254255%205.12-6.3488%2011.748073-6.3488%2019.87491%200%208.052364%202.094545%2014.680436%206.3488%2019.800436%204.468364%205.343418%2010.537891%208.052364%2018.255127%208.052364%207.726545%200%2013.861236-2.708945%2018.338909-8.052364%204.189091-5.12%206.3488-11.6736%206.3488-19.800436%200-8.201309-2.169018-14.829382-6.358109-19.949382-4.468364-5.417891-10.603055-8.052364-18.245818-8.052364z%20m0%205.492364c5.920582%200%2010.537891%202.038691%2013.861236%206.171927%203.165091%204.068073%204.831418%209.495273%204.831419%2016.337455%200%206.777018-1.657018%2012.120436-4.840728%2016.188509-3.314036%204.058764-8.005818%206.171927-13.9264%206.171927-5.911273%200-10.603055-2.113164-13.9264-6.330182-3.165091-4.058764-4.756945-9.402182-4.756945-16.030254%200-6.702545%201.582545-12.045964%204.756945-16.104728%203.397818-4.291491%208.0896-6.404655%2014.000873-6.404654zM689.803636%20810.942836v53.750691h17.901382c8.080291%200%2014.289455-2.485527%2018.618182-7.382109%204.114618-4.663855%206.209164-11.217455%206.209164-19.493236%200-8.434036-1.954909-14.987636-5.771637-19.493237-4.189091-4.971055-10.323782-7.382109-18.478545-7.382109h-18.469237z%20m5.920582%205.343419h11.617746c6.795636%200%2011.692218%201.805964%2014.866618%205.492363%202.960291%203.472291%204.477673%208.815709%204.477673%2016.039564%200%207.000436-1.657018%2012.343855-4.840728%2015.955782-3.388509%203.695709-8.434036%205.576145-15.145891%205.576145h-10.975418v-43.063854zM755.842327%20810.942836l-20.2752%2053.750691h6.3488l5.483055-15.0528h23.663709l5.492364%2015.0528h6.423272l-20.284509-53.750691h-6.851491z%20m-6.572218%2033.503419l9.886255-26.875346h0.288581l9.746619%2026.875346h-19.921455zM784.197818%20810.942836v5.343419h18.189964v48.407272h5.846109v-48.407272h18.180654v-5.343419zM847.918545%20810.942836l-20.2752%2053.750691h6.3488l5.492364-15.0528h23.663709l5.492364%2015.0528H875.054545l-20.2752-53.750691h-6.8608z%20m-6.562909%2033.503419l9.886255-26.875346h0.279273l9.746618%2026.875346h-19.921455z'%20fill='%23E1EDFF'%20p-id='13794'%3e%3c/path%3e%3cpath%20d='M959.860364%20543.222691l-0.791273%201.954909-4.635927%204.244945%2077.367854%20123.233746c1.973527%203.146473%203.025455%206.814255%203.006837%2010.556509v251.308218a7.354182%207.354182%200%200%201-2.048%205.110691%206.907345%206.907345%200%200%201-4.961746%202.122473H415.371636a7.391418%207.391418%200%200%201-7.2704-7.512437V683.2128c0-3.751564%201.061236-7.419345%203.053382-10.556509L507.345455%20535.272727l-2.532073-10.873018-100.258909%20143.741673c-2.792727%204.440436-4.282182%209.616291-4.263564%2014.903854V922.344727c0%2015.015564%2011.803927%2027.191855%2026.372655%2027.191855h589.321309c14.605964%200%2026.484364-12.129745%2026.624-27.191855V683.045236c0-5.213091-1.4336-10.333091-4.161164-14.736291l-78.587345-125.086254z'%20fill='%23D3D3D3'%20p-id='13795'%3e%3c/path%3e%3c/svg%3e\"","<template>\n <v-card class=\"pa-4 mx-auto text-center pt-10\" color=\"transparent\" elevation=\"0\" style=\"border: none !important;box-shadow: none !important;\">\n <v-img contain width=\"120\" class=\"mx-auto\" :src=\"emptyImg\" alt=\"\" />\n <p class=\"text-grey mt-1\">{{ text || \"暂无数据\" }}</p>\n </v-card>\n</template>\n\n<script setup>\nimport emptyImg from '@/assets/img/empty.svg';\n\n// 定义 props\ndefineProps({\n text: {\n type: String,\n default: null,\n },\r\n items: {\r\n type: Array,\r\n default: null,\r\n },\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped></style>\n","<!-- 悬浮按钮 -->\r\n<template>\r\n <transition name=\"slide-up\">\r\n <v-fab\r\n v-if=\"showFab\"\r\n :class=\"fabClass\"\r\n color=\"primary\"\r\n icon=\"mdi-arrow-up\"\r\n @click=\"scrollToTop\"\r\n ></v-fab>\r\n </transition>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, onBeforeUnmount } from 'vue'\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkFab\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 控制悬浮按钮显示状态\r\nconst showFab = ref(false)\r\n// 自定义类名用于样式调整\r\nconst fabClass = ref('scroll-to-top-fab')\r\n\r\n// 监听滚动事件\r\nconst handleScroll = () => {\r\n showFab.value = window.scrollY > 100\r\n}\r\n\r\n// 滚动到顶部\r\nconst scrollToTop = () => {\r\n window.scrollTo({\r\n top: 0,\r\n behavior: 'smooth'\r\n })\r\n}\r\n\r\n// 组件挂载时添加滚动监听\r\nonMounted(() => {\r\n window.addEventListener('scroll', handleScroll)\r\n})\r\n\r\n// 组件卸载前移除监听\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('scroll', handleScroll)\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.scroll-to-top-fab {\r\n position: fixed;\r\n bottom: 24px;\r\n right: 24px;\r\n z-index: 1004;\r\n}\r\n\r\n/* 滑动动画 */\r\n.slide-up-enter-active {\r\n transition: all 0.2s ease-out;\r\n}\r\n\r\n.slide-up-leave-active {\r\n transition: all 0.2s ease-in;\r\n}\r\n\r\n.slide-up-enter-from {\r\n opacity: 0;\r\n transform: translateY(30px);\r\n}\r\n\r\n.slide-up-leave-to {\r\n opacity: 0;\r\n transform: translateY(30px);\r\n}\r\n</style>","<template>\r\n <div\r\n class=\"box\"\r\n :class=\"{\r\n 'form-item--vertical': top,\r\n 'form-item--horizontal': !top\r\n }\"\r\n style=\"position: relative\"\r\n >\r\n <!-- label 在上方 (top模式) -->\r\n <div\r\n v-if=\"label && top\"\r\n class=\"pb-2 text-left\"\r\n >\r\n <span v-if=\"must\" class=\"text-red mr-1\">*</span>\r\n <span>{{ label }}</span>\r\n </div>\r\n\r\n <!-- label 在左侧 (默认模式) -->\r\n <div\r\n v-if=\"label && !top\"\r\n :class=\"left ? '' : 'vtk-width-2'\"\r\n class=\"d-inline-block text-right\"\r\n :style=\"Tstyle\"\r\n style=\"min-width: 120px !important;vertical-align: top;padding-top: 11px;\"\r\n >\r\n <span v-if=\"must\" class=\"text-red\">*</span>\r\n <span>{{ label }}</span>\r\n </div>\r\n\r\n <!-- 输入框容器 (top模式) -->\r\n <div\r\n v-if=\"top\"\r\n :style=\"contentStyles\"\r\n >\r\n <slot></slot>\r\n </div>\r\n\r\n <!-- 输入框容器 (默认模式) -->\r\n <div\r\n v-if=\"!top\"\r\n class=\"d-inline-block vtk-width-7 \"\r\n style=\"min-width: 350px;\"\r\n >\r\n <slot></slot>\r\n </div>\r\n\r\n <!-- help提示 (仅left模式) -->\r\n <div\r\n v-if=\"left && help && !top\"\r\n class=\"box_help tips py-3 px-4\"\r\n style=\"width: calc(30% - 160px)\"\r\n >\r\n <p class=\"mb-2 font-weight-bold text-body-1\">{{ label }}</p>\r\n <span v-html=\"help\"></span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n name: \"VtkFormItem\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n label: {\r\n type: String,\r\n default: null\r\n },\r\n must: {\r\n type: Boolean,\r\n default: false\r\n },\r\n left: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 标签在上方的垂直布局\r\n top: {\r\n type: Boolean,\r\n default: false\r\n },\r\n Tstyle: {\r\n type: String,\r\n default: null\r\n },\r\n help: {\r\n type: String,\r\n default: null\r\n },\r\n // 控制top模式下内容的最大宽度\r\n maxWidth: {\r\n type: [String, Number],\r\n default: '100%'\r\n }\r\n});\r\n\r\n// 处理maxWidth属性\r\nconst processedMaxWidth = computed(() => {\r\n if (typeof props.maxWidth === 'number') {\r\n return props.maxWidth + 'px';\r\n }\r\n return props.maxWidth;\r\n});\r\n\r\n// 内容样式(仅在top模式下应用maxWidth)\r\nconst contentStyles = computed(() => {\r\n const styles = {};\r\n\r\n // 在top模式下应用maxWidth\r\n if (props.top && props.maxWidth) {\r\n styles.maxWidth = processedMaxWidth.value;\r\n }\r\n\r\n return styles;\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.box:hover > .box_help {\r\n display: inline-block !important;\r\n border-top-right-radius: 24px;\r\n border-bottom-left-radius: 24px;\r\n}\r\n\r\n.box_help {\r\n display: none;\r\n}\r\n\r\n.tips {\r\n position: absolute;\r\n right: 8px;\r\n top: 0;\r\n border: 1px rgba(175, 175, 175, 0.341) solid;\r\n}\r\n\r\n.form-item--vertical {\r\n display: block;\r\n margin-bottom: 1rem;\r\n}\r\n\r\n.form-item--horizontal {\r\n display: block;\r\n margin-bottom: 0.5rem;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"vtk-img-container\">\r\n <VCard \r\n :class=\"['vtk-img-card', { 'vtk-img-card--preview': preview }]\"\r\n @click=\"openPreview\"\r\n >\r\n <!-- 超大图片守卫:先读文件头拿尺寸,再决定是否内嵌解码渲染 -->\r\n <template v-if=\"imgState === 'preview'\">\r\n <v-img\r\n v-bind=\"$attrs\"\r\n :src=\"srcWithToken\"\r\n class=\"vtk-img\"\r\n :aspect-ratio=\"aspectRatio\"\r\n cover\r\n >\r\n <template v-slot:placeholder>\r\n <div class=\"d-flex align-center justify-center fill-height\">\r\n <v-progress-circular indeterminate color=\"grey-lighten-1\"></v-progress-circular>\r\n </div>\r\n </template>\r\n </v-img>\r\n </template>\r\n <template v-else-if=\"imgState === 'oversize'\">\r\n <div class=\"vtk-img-guard\" :style=\"{ aspectRatio }\">\r\n <v-icon class=\"guard-icon\">mdi-image-size-select-large</v-icon>\r\n <span class=\"guard-text\">图片分辨率过大</span>\r\n </div>\r\n </template>\r\n <template v-else-if=\"imgState === 'unknown'\">\r\n <div class=\"vtk-img-guard\" :style=\"{ aspectRatio }\">\r\n <v-icon class=\"guard-icon\">mdi-image-broken-variant</v-icon>\r\n <span class=\"guard-text\">点击打开</span>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <div class=\"vtk-img-guard vtk-img-guard--loading\" :style=\"{ aspectRatio }\">\r\n <v-progress-circular indeterminate color=\"grey-lighten-1\"></v-progress-circular>\r\n </div>\r\n </template>\r\n \r\n <!-- 图片标题和描述 -->\r\n <div class=\"vtk-img-info\" v-if=\"showTitle || showDescription\">\r\n <VCardTitle v-if=\"showTitle\" class=\"vtk-img-title text-subtitle-2 pa-2\">\r\n {{ title }}\r\n </VCardTitle>\r\n <v-card-subtitle v-if=\"showDescription\" class=\"vtk-img-description text-caption pa-2\">\r\n {{ description }}\r\n </v-card-subtitle>\r\n </div>\r\n </VCard>\r\n \r\n <!-- 使用 v-dialog 的图片预览 -->\r\n <VDialog \r\n v-model=\"showPreview\" \r\n max-width=\"90%\" \r\n fullscreen\r\n @click:outside=\"closePreview\"\r\n >\r\n <VCard class=\"image-viewer-card\">\r\n <v-toolbar dark color=\"primary\">\r\n <v-toolbar-title>{{ currentImageTitle }}</v-toolbar-title>\r\n <VSpacer></VSpacer>\r\n <v-toolbar-items>\r\n <VBtn icon dark title=\"新窗口打开\" @click=\"openCurrentImageInNewWindow\">\r\n <VIcon>mdi-open-in-new</VIcon>\r\n </VBtn>\r\n <VBtn icon dark title=\"下载图片\" @click=\"downloadCurrentImage\">\r\n <VIcon>mdi-download</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"zoomImage(-0.3)\">\r\n <VIcon>mdi-magnify-minus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"zoomImage(0.3)\">\r\n <VIcon>mdi-magnify-plus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"rotateImage(-90)\">\r\n <VIcon>mdi-rotate-left</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"rotateImage(90)\">\r\n <VIcon>mdi-rotate-right</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"resetImageTransform\">\r\n <VIcon>mdi-refresh</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </v-toolbar-items>\r\n </v-toolbar>\r\n \r\n <div class=\"image-viewer-content\">\r\n <VBtn \r\n v-if=\"hasPrev\" \r\n icon \r\n class=\"nav-button prev-button\" \r\n @click=\"prevImage\"\r\n >\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n \r\n <div class=\"image-container\" @wheel.prevent=\"handleImageWheel\">\r\n <template v-if=\"viewerImgState === 'preview'\">\r\n <v-img\r\n :src=\"currentImageUrl\"\r\n class=\"viewer-image\"\r\n :class=\"{ 'viewer-image--draggable': imageScale > 1 }\"\r\n :style=\"viewerImageStyle\"\r\n draggable=\"false\"\r\n @pointerdown=\"startImageDrag\"\r\n />\r\n </template>\r\n <template v-else-if=\"viewerImgState === 'oversize'\">\r\n <div class=\"viewer-guard\" @click=\"openViewerOversize\">\r\n <v-icon size=\"48\">mdi-image-size-select-large</v-icon>\r\n <span>图片过大,点击在新窗口打开</span>\r\n </div>\r\n </template>\r\n <template v-else-if=\"viewerImgState === 'unknown'\">\r\n <div class=\"viewer-guard\" @click=\"openViewerOversize\">\r\n <v-icon size=\"48\">mdi-image-broken-variant</v-icon>\r\n <span>图片无法内嵌预览,点击在新窗口打开</span>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <div class=\"viewer-guard viewer-guard--loading\">\r\n <v-progress-circular indeterminate color=\"grey-lighten-2\"></v-progress-circular>\r\n </div>\r\n </template>\r\n </div>\r\n \r\n <VBtn \r\n v-if=\"hasNext\" \r\n icon \r\n class=\"nav-button next-button\" \r\n @click=\"nextImage\"\r\n >\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n </div>\r\n \r\n <div class=\"image-info\">\r\n <p class=\"text-center\">{{ currentImageDescription }}</p>\r\n <p class=\"text-center text--secondary\">{{ currentIndex + 1 }} / {{ imageList.length }}</p>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, getCurrentInstance } from 'vue';\r\n\r\ndefineOptions({\r\n name: 'VtkImg',\r\n inheritAttrs: true\r\n});\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\nconst props = defineProps({\r\n src: {\r\n type: String,\r\n default: null,\r\n },\r\n downloadSrc: {\r\n type: String,\r\n default: '',\r\n },\r\n error: {\r\n type: String,\r\n default: new URL('../../assets/img/wxsq.png', import.meta.url).href,\r\n },\r\n preview: {\r\n type: Boolean,\r\n default: true\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n description: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图片列表,用于导航功能\r\n imageList: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 当前图片索引\r\n index: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 是否显示标题\r\n showTitle: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示描述\r\n showDescription: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 图片宽高比\r\n aspectRatio: {\r\n type: [String, Number],\r\n default: 16/9\r\n },\r\n // 超大图片像素阈值:超过则不内嵌解码渲染\r\n maxPixels: {\r\n type: Number,\r\n default: 50_000_000\r\n },\r\n // 是否开启超大图片尺寸守卫(关闭时退回原行为)\r\n sizeGuard: {\r\n type: Boolean,\r\n default: true\r\n }\r\n});\r\n\r\n// 预览状态\r\nconst showPreview = ref(false);\r\n// 图片旋转角度\r\nconst imageRotation = ref(0);\r\n// 图片缩放和拖动位置\r\nconst imageScale = ref(1);\r\nconst imageTranslateX = ref(0);\r\nconst imageTranslateY = ref(0);\r\nconst imageDragState = ref(null);\r\n// 当前图片索引(预览模式下使用)\r\nconst currentIndex = ref(0);\r\n\r\n// 取本地 token:$vtk.storage 优先,回退 localStorage\r\nconst getLocalToken = () => {\r\n try {\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n return window.$vtk.storage.get('_mis_acis_token') || '';\r\n }\r\n return localStorage.getItem('_mis_acis_token') || '';\r\n } catch (error) {\r\n console.warn('VtkImg: Failed to get token', error);\r\n return '';\r\n }\r\n};\r\n\r\n// 追加 stoken:\r\n// - 已带 stoken(通常是服务端签发的)不再追加,避免污染签名\r\n// - 已有其它查询参数时用 & 拼接,避免拼出 \"...?a=1?stoken=x\" 这种非法 URL\r\nconst withToken = (url) => {\r\n if (!url) return url;\r\n if (/[?&]stoken=/.test(url)) return url;\r\n const token = getLocalToken();\r\n if (!token) return url;\r\n return `${url}${url.includes('?') ? '&' : '?'}stoken=${token}`;\r\n};\r\n\r\n// 使用计算属性处理带token的URL\r\nconst srcWithToken = computed(() => withToken(props.src));\r\n\r\n// 当前预览图片的URL\r\nconst currentImageUrl = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n // 支持 imageList 项为字符串(直接是URL)或对象(含 url 属性)\r\n const url = typeof currentImage === 'string' ? currentImage : currentImage?.url;\r\n if (url) return withToken(url);\r\n }\r\n return srcWithToken.value;\r\n});\r\n\r\n// ===== 超大图片尺寸守卫:读文件头拿宽高,超过阈值不内嵌解码 =====\r\nconst imageMeta = ref({}); // 主图尺寸 { w, h }\r\nconst headerState = ref('loading'); // 主图头部读取状态:loading | done | error\r\n\r\nconst imgState = computed(() => {\r\n if (!props.sizeGuard) return 'preview';\r\n if (headerState.value === 'loading') return 'loading';\r\n // 只有「明确读到尺寸且超过阈值」才拦截;读不出尺寸(解析失败 / 格式不支持 /\r\n // 网络失败 / SVG 等矢量图)一律正常展示——探测只决定要不要拦截,不该有否决权。\r\n const { w, h } = imageMeta.value;\r\n if (w && h && w * h > props.maxPixels) return 'oversize';\r\n return 'preview';\r\n});\r\n\r\nconst viewerMeta = ref({}); // 预览弹窗当前图尺寸 { w, h }\r\nconst viewerHeaderState = ref('loading');\r\nconst headerMetaCache = ref({}); // imageList 各 URL -> { w, h } 缓存,避免重复请求\r\n\r\nconst viewerImgState = computed(() => {\r\n if (!props.sizeGuard) return 'preview';\r\n if (viewerHeaderState.value === 'loading') return 'loading';\r\n // 与 imgState 同策略:读不出尺寸就正常展示,只有明确超阈值才拦截\r\n const { w, h } = viewerMeta.value;\r\n if (w && h && w * h > props.maxPixels) return 'oversize';\r\n return 'preview';\r\n});\r\n\r\nconst readUInt16BE = (bytes, offset) => (bytes[offset] << 8) | bytes[offset + 1];\r\nconst readUInt16LE = (bytes, offset) => bytes[offset] | (bytes[offset + 1] << 8);\r\nconst readUInt32BE = (bytes, offset) => (\r\n ((bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3]) >>> 0\r\n);\r\n\r\n// SVG 是文本矢量格式,不产生\"解压炸弹\",识别出直接放行(不参与像素守卫)。\r\n// 要求以 '<' 开头(跳过 BOM/空白),避免二进制图里恰好含 \"<svg\" 造成假阳性绕过守卫。\r\nconst isSvgBytes = (bytes) => {\r\n try {\r\n const head = new TextDecoder('utf-8', { fatal: false })\r\n .decode(bytes.subarray(0, 1024))\r\n .replace(/^/, '')\r\n .trimStart()\r\n .toLowerCase();\r\n return head.startsWith('<') && head.includes('<svg');\r\n } catch (error) {\r\n return false;\r\n }\r\n};\r\n\r\n// 按字节解析图片文件头的宽高(PNG / JPEG / GIF / WEBP / SVG)\r\nconst parseImageDimensions = (bytes) => {\r\n const length = bytes.length;\r\n\r\n if (isSvgBytes(bytes)) return { w: 0, h: 0, vector: true };\r\n\r\n if (length < 24) return { w: 0, h: 0 };\r\n\r\n // PNG:魔数 89 50 4E 47,IHDR 后宽 16 / 高 20(大端 uint32)\r\n if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {\r\n return { w: readUInt32BE(bytes, 16), h: readUInt32BE(bytes, 20) };\r\n }\r\n\r\n // GIF:魔数 GIF8,宽 6-7 / 高 8-9(小端 uint16)\r\n if (bytes[0] === 0x47 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x38) {\r\n return { w: readUInt16LE(bytes, 6), h: readUInt16LE(bytes, 8) };\r\n }\r\n\r\n // JPEG:扫 SOF 段(0xC0–0xCF,排除 C4/C8/CC),以 marker 为基准:高在 +4、宽在 +6(大端 uint16)\r\n if (bytes[0] === 0xff && bytes[1] === 0xd8) {\r\n const sofMarkers = new Set([\r\n 0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf,\r\n ]);\r\n let offset = 2;\r\n while (offset + 9 < length) {\r\n if (bytes[offset] !== 0xff) { offset += 1; continue; }\r\n let p = offset;\r\n while (p < length && bytes[p] === 0xff) p += 1; // 跳过填充 0xFF,p 落在 marker 上\r\n if (p >= length - 1) break;\r\n const marker = bytes[p];\r\n if (marker === 0x00 || marker === 0xd8 || marker === 0xd9) { offset = p + 1; continue; }\r\n if (sofMarkers.has(marker)) {\r\n // 段结构 [FF][marker][len:2][precision:1][height:2][width:2],一律以 marker 为基准\r\n return { w: readUInt16BE(bytes, p + 6), h: readUInt16BE(bytes, p + 4) };\r\n }\r\n if (p + 2 >= length) break;\r\n // 段长字段在 marker 之后的 p+1 / p+2\r\n const segLength = readUInt16BE(bytes, p + 1);\r\n if (segLength < 2) break;\r\n offset = p + 1 + segLength;\r\n }\r\n }\r\n\r\n // WEBP:RIFF....WEBP\r\n if (\r\n length >= 30\r\n && bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46\r\n && bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50\r\n ) {\r\n const fourcc = String.fromCharCode(bytes[12], bytes[13], bytes[14], bytes[15]);\r\n if (fourcc === 'VP8X') {\r\n return {\r\n w: 1 + (bytes[24] | (bytes[25] << 8) | (bytes[26] << 16)),\r\n h: 1 + (bytes[27] | (bytes[28] << 8) | (bytes[29] << 16)),\r\n };\r\n }\r\n if (fourcc === 'VP8 ') {\r\n return {\r\n w: bytes[26] | ((bytes[27] & 0x3f) << 8),\r\n h: bytes[28] | ((bytes[29] & 0x3f) << 8),\r\n };\r\n }\r\n if (fourcc === 'VP8L' && length >= 25) {\r\n // VP8L:width-1 占低 14 位,height-1 占次 14 位(小端 32 位)\r\n const bits = (bytes[21] | (bytes[22] << 8) | (bytes[23] << 16) | ((bytes[24] << 24) >>> 0)) >>> 0;\r\n return { w: 1 + (bits & 0x3fff), h: 1 + ((bits >> 14) & 0x3fff) };\r\n }\r\n }\r\n\r\n return { w: 0, h: 0 };\r\n};\r\n\r\n// 头部读取上限:64KB,覆盖带大 EXIF 缩略图的 JPEG(SOF 段可能远离文件头)\r\nconst HEADER_BYTES = 64 * 1024;\r\n\r\n// 只取前 N 字节:即使服务端忽略 Range 返回整张图,也不会把整图读进内存\r\nconst readFirstBytes = async (response, maxBytes) => {\r\n const reader = response.body?.getReader?.();\r\n if (!reader) {\r\n const buffer = await response.arrayBuffer();\r\n return new Uint8Array(buffer, 0, Math.min(buffer.byteLength, maxBytes));\r\n }\r\n\r\n const chunks = [];\r\n let total = 0;\r\n while (total < maxBytes) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n chunks.push(value);\r\n total += value.length;\r\n }\r\n // 读够了就取消剩余下载\r\n try { await reader.cancel(); } catch (error) { /* 忽略取消失败 */ }\r\n\r\n const out = new Uint8Array(Math.min(total, maxBytes));\r\n let offset = 0;\r\n for (const chunk of chunks) {\r\n if (offset >= out.length) break;\r\n const take = Math.min(chunk.length, out.length - offset);\r\n out.set(chunk.subarray(0, take), offset);\r\n offset += take;\r\n }\r\n return out;\r\n};\r\n\r\n// 只拉头部,每次尝试 5 秒超时;拿不到尺寸返回 null(绝不回退全量解码)\r\n// 先带 Range 只取头部;个别服务端/网关对 Range 请求处理异常导致 fetch 直接失败,\r\n// 此时退回普通 GET —— readFirstBytes 仍把读取量限制在 64KB,不会把整图读进内存。\r\nconst fetchImageMeta = async (url) => {\r\n if (!url) return null;\r\n\r\n const attempts = [\r\n { mode: 'cors', headers: { Range: `bytes=0-${HEADER_BYTES - 1}` } },\r\n { mode: 'cors' },\r\n ];\r\n\r\n let lastError = null;\r\n for (const options of attempts) {\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), 5000);\r\n try {\r\n const response = await fetch(url, { ...options, signal: controller.signal });\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\r\n const bytes = await readFirstBytes(response, HEADER_BYTES);\r\n const { w, h, vector } = parseImageDimensions(bytes);\r\n if (vector) return { w: 0, h: 0, vector: true };\r\n if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) return null;\r\n return { w, h };\r\n } catch (error) {\r\n lastError = error;\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n throw lastError || new Error('Failed to read image header');\r\n};\r\n\r\n// 取图片头部尺寸(唯一入口):命中缓存直接返回;同一 URL 的并发请求合并为一次。\r\n// 主图和弹窗可能同时需要同一个 URL,没有这层去重会发两次请求。\r\nconst inflightMeta = new Map();\r\nconst getImageMeta = (url) => {\r\n if (!url) return Promise.resolve(null);\r\n\r\n const cached = headerMetaCache.value[url];\r\n if (cached) return Promise.resolve(cached);\r\n\r\n if (!inflightMeta.has(url)) {\r\n const task = fetchImageMeta(url)\r\n .then((meta) => {\r\n if (meta) headerMetaCache.value[url] = meta;\r\n return meta;\r\n })\r\n .finally(() => inflightMeta.delete(url));\r\n inflightMeta.set(url, task);\r\n }\r\n\r\n return inflightMeta.get(url);\r\n};\r\n\r\n// 主图源变化时读头部\r\nwatch(srcWithToken, async (url) => {\r\n imageMeta.value = {};\r\n headerState.value = 'loading';\r\n if (!props.sizeGuard || !url) { headerState.value = 'done'; return; }\r\n try {\r\n const meta = await getImageMeta(url);\r\n if (srcWithToken.value !== url) return; // 已被更新的图取代,丢弃过期结果\r\n imageMeta.value = meta || {};\r\n headerState.value = 'done';\r\n } catch (error) {\r\n if (srcWithToken.value !== url) return;\r\n headerState.value = 'error';\r\n console.warn('VtkImg: 图片尺寸读取失败,按未知处理', error);\r\n }\r\n}, { immediate: true });\r\n\r\n// 弹窗当前图读头部(覆盖 imageList 照片墙模式)。\r\n// 只在弹窗打开时才取:弹窗未打开时这笔请求没有意义(弹窗内切换才需要)。\r\nwatch([currentImageUrl, showPreview], async ([url, open]) => {\r\n if (!props.sizeGuard || !url || !open) {\r\n viewerHeaderState.value = 'done';\r\n viewerMeta.value = {};\r\n return;\r\n }\r\n viewerMeta.value = {};\r\n viewerHeaderState.value = 'loading';\r\n try {\r\n const meta = await getImageMeta(url);\r\n // 已切走或弹窗已关闭:丢弃过期结果,否则会把超大图误判成可渲染\r\n if (currentImageUrl.value !== url || !showPreview.value) return;\r\n viewerMeta.value = meta || {};\r\n viewerHeaderState.value = 'done';\r\n } catch (error) {\r\n if (currentImageUrl.value !== url || !showPreview.value) return;\r\n viewerHeaderState.value = 'error';\r\n console.warn('VtkImg: 预览图片尺寸读取失败,按未知处理', error);\r\n }\r\n}, { immediate: true });\r\n\r\n// 超大/未知图点击:直接新窗口打开原图,绝不进 v-dialog(内部 v-img 同样会全量解码)\r\nconst openViewerOversize = () => {\r\n if (currentImageUrl.value) window.open(currentImageUrl.value, '_blank', 'noopener');\r\n};\r\n\r\nconst currentImageRawUrl = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n const url = typeof currentImage === 'string' ? currentImage : currentImage?.url;\r\n return url || props.src;\r\n }\r\n\r\n return props.src;\r\n});\r\n\r\nconst currentImageDownloadUrl = computed(() => {\r\n if (props.downloadSrc) return props.downloadSrc;\r\n\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n if (currentImage && typeof currentImage === 'object') {\r\n return currentImage.downloadUrl || currentImage.downloadSrc || currentImage.url || props.src;\r\n }\r\n }\r\n\r\n return currentImageRawUrl.value;\r\n});\r\n\r\n// 当前图片标题\r\nconst currentImageTitle = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n return currentImage?.title || '';\r\n }\r\n return props.title;\r\n});\r\n\r\n// 当前图片描述\r\nconst currentImageDescription = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n return currentImage?.description || '';\r\n }\r\n return props.description;\r\n});\r\n\r\n// 是否有上一张图片\r\nconst hasPrev = computed(() => {\r\n return props.imageList.length > 1 && currentIndex.value > 0;\r\n});\r\n\r\n// 是否有下一张图片\r\nconst hasNext = computed(() => {\r\n return props.imageList.length > 1 && currentIndex.value < props.imageList.length - 1;\r\n});\r\n\r\nconst viewerImageStyle = computed(() => ({\r\n transform: `translate(${imageTranslateX.value}px, ${imageTranslateY.value}px) scale(${imageScale.value}) rotate(${imageRotation.value}deg)`,\r\n}));\r\n\r\nconst openCurrentImageInNewWindow = () => {\r\n if (!currentImageRawUrl.value) return;\r\n\r\n window.open(currentImageRawUrl.value, '_blank', 'noopener');\r\n};\r\n\r\nconst imageMimeExtensionMap = {\r\n 'image/bmp': 'bmp',\r\n 'image/gif': 'gif',\r\n 'image/jpeg': 'jpg',\r\n 'image/png': 'png',\r\n 'image/svg+xml': 'svg',\r\n 'image/webp': 'webp',\r\n};\r\n\r\nconst imageExtensionMimeMap = {\r\n bmp: 'image/bmp',\r\n gif: 'image/gif',\r\n jpeg: 'image/jpeg',\r\n jpg: 'image/jpeg',\r\n png: 'image/png',\r\n svg: 'image/svg+xml',\r\n webp: 'image/webp',\r\n};\r\n\r\nconst getImageFileExtension = (blob) => {\r\n const mimeType = blob?.type?.split(';')[0]?.toLowerCase();\r\n\r\n if (mimeType && imageMimeExtensionMap[mimeType]) {\r\n return imageMimeExtensionMap[mimeType];\r\n }\r\n\r\n try {\r\n const { pathname } = new URL(currentImageRawUrl.value, window.location.href);\r\n const matched = pathname.match(/\\.([a-z0-9]+)$/i);\r\n return matched?.[1]?.toLowerCase() || 'png';\r\n } catch (error) {\r\n return 'png';\r\n }\r\n};\r\n\r\nconst getCurrentImageFileName = (blob) => {\r\n const extension = getImageFileExtension(blob);\r\n const titleName = currentImageTitle.value?.trim();\r\n\r\n if (titleName) {\r\n const safeTitle = titleName.replace(/[\\\\/:*?\"<>|]/g, '_').replace(/\\.[a-z0-9]+$/i, '');\r\n return `${safeTitle}.${extension}`;\r\n }\r\n\r\n try {\r\n const { pathname } = new URL(currentImageRawUrl.value, window.location.href);\r\n const urlName = decodeURIComponent(pathname.split('/').pop() || '')\r\n .replace(/[\\\\/:*?\"<>|]/g, '_')\r\n .replace(/\\.[a-z0-9]+$/i, '');\r\n return urlName ? `${urlName}.${extension}` : `image.${extension}`;\r\n } catch (error) {\r\n return `image.${extension}`;\r\n }\r\n};\r\n\r\nconst isDownloadRiskWebView = () => {\r\n const ua = window.navigator?.userAgent || '';\r\n const hasEmbeddedBridge = typeof window.dd !== 'undefined' || typeof window.AlipayJSBridge !== 'undefined';\r\n return hasEmbeddedBridge\r\n || /DingTalk|AliApp\\(DingTalk|zjzwfw|zzd|ZJGovernment|ZhejiangGovernment|GovDing|Electron|WebView|; wv\\)/i.test(ua);\r\n};\r\n\r\nconst getDownloadFailureReason = (error) => {\r\n const message = error?.message || '';\r\n const name = error?.name || '';\r\n\r\n if (name === 'AbortError') return '已取消下载';\r\n if (name === 'NotAllowedError' || name === 'SecurityError') return '当前客户端阻止了文件保存';\r\n if (name === 'QuotaExceededError') return '存储空间不足或客户端限制写入';\r\n if (/Failed to fetch|NetworkError|Load failed/i.test(message)) {\r\n return '图片地址不允许跨域读取,或当前网络无法访问图片';\r\n }\r\n if (/HTTP error! status:\\s*(\\d+)/i.test(message)) {\r\n return `图片请求失败,状态码 ${message.match(/HTTP error! status:\\s*(\\d+)/i)?.[1]}`;\r\n }\r\n if (/Response is not an image/i.test(message)) return '下载地址返回的不是图片文件';\r\n if (/Downloaded image is empty/i.test(message)) return '下载到的图片文件为空';\r\n if (/Downloaded file is not an image/i.test(message)) return '下载到的文件不是图片格式';\r\n if (/Downloaded image cannot be decoded/i.test(message)) return '下载到的图片无法被浏览器解析';\r\n\r\n return message || '未知错误';\r\n};\r\n\r\nconst validateImageBlob = async (blob) => {\r\n if (!blob || blob.size <= 0) {\r\n throw new Error('Downloaded image is empty');\r\n }\r\n\r\n const extension = getImageFileExtension(blob);\r\n const mimeType = blob.type?.split(';')[0]?.trim().toLowerCase();\r\n if (mimeType && !mimeType.startsWith('image/')) {\r\n throw new Error(`Downloaded file is not an image: ${mimeType}`);\r\n }\r\n\r\n if (typeof window.createImageBitmap === 'function' && mimeType !== 'image/svg+xml') {\r\n try {\r\n const bitmap = await window.createImageBitmap(blob);\r\n bitmap.close?.();\r\n return;\r\n } catch (error) {\r\n console.warn('VtkImg: createImageBitmap validation failed, fallback to Image validation', error);\r\n }\r\n }\r\n\r\n if (extension === 'svg') return;\r\n\r\n await new Promise((resolve, reject) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const image = new Image();\r\n\r\n image.onload = () => {\r\n window.URL.revokeObjectURL(url);\r\n resolve();\r\n };\r\n image.onerror = () => {\r\n window.URL.revokeObjectURL(url);\r\n reject(new Error('Downloaded image cannot be decoded'));\r\n };\r\n image.src = url;\r\n });\r\n};\r\n\r\nconst triggerBrowserDownload = (blob, fileName) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n setTimeout(() => window.URL.revokeObjectURL(url), 60 * 1000);\r\n};\r\n\r\nconst triggerBrowserUrlDownload = (url, fileName) => {\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.target = '_blank';\r\n link.rel = 'noopener';\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n};\r\n\r\nconst showDownloadToast = (message, color = 'info') => {\r\n try {\r\n const toast = proxy?.$vtk?.message?.toast || window.$vtk?.message?.toast;\r\n if (typeof toast === 'function') {\r\n toast(message, { color });\r\n return;\r\n }\r\n } catch (error) {\r\n console.warn('VtkImg: failed to show message toast', error);\r\n }\r\n\r\n if (color === 'error' || color === 'warning') {\r\n window.alert?.(message);\r\n }\r\n};\r\n\r\nconst getDownloadFileHandle = async (fileName, blob) => {\r\n if (isDownloadRiskWebView()) {\r\n return null;\r\n }\r\n\r\n if (typeof window.showSaveFilePicker !== 'function') {\r\n showDownloadToast('当前浏览器不支持选择保存目录,将使用默认下载方式。', 'warning');\r\n return null;\r\n }\r\n\r\n const extension = getImageFileExtension(blob);\r\n const mimeType = imageExtensionMimeMap[extension] || blob?.type || 'image/png';\r\n\r\n try {\r\n return await window.showSaveFilePicker({\r\n suggestedName: fileName,\r\n types: [\r\n {\r\n description: '图片文件',\r\n accept: {\r\n [mimeType]: [`.${extension}`],\r\n },\r\n },\r\n ],\r\n });\r\n } catch (error) {\r\n if (error?.name === 'AbortError') {\r\n showDownloadToast('已取消下载。');\r\n return false;\r\n }\r\n\r\n console.warn('VtkImg: showSaveFilePicker unavailable, fallback to browser download', error);\r\n return null;\r\n }\r\n};\r\n\r\nconst isImageResponse = (response, blob, url) => {\r\n const contentType = response.headers.get('content-type')?.split(';')[0]?.trim().toLowerCase();\r\n\r\n if (contentType?.startsWith('image/')) return true;\r\n if (blob.type?.startsWith('image/')) return true;\r\n\r\n const canFallbackToExtension = !contentType\r\n || contentType === 'application/octet-stream'\r\n || contentType === 'binary/octet-stream';\r\n if (!canFallbackToExtension) return false;\r\n\r\n try {\r\n const { pathname } = new URL(url, window.location.href);\r\n const extension = pathname.match(/\\.([a-z0-9]+)$/i)?.[1]?.toLowerCase();\r\n return Boolean(extension && imageExtensionMimeMap[extension]);\r\n } catch (error) {\r\n return false;\r\n }\r\n};\r\n\r\nconst fetchImageBlob = async (url) => {\r\n const response = await fetch(url, { mode: 'cors' });\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n if (!isImageResponse(response, blob, url)) {\r\n const contentType = response.headers.get('content-type') || blob.type || 'unknown';\r\n throw new Error(`Response is not an image: ${contentType}`);\r\n }\r\n\r\n return blob;\r\n};\r\n\r\nconst fetchCurrentImageBlob = async () => {\r\n if (!currentImageDownloadUrl.value) {\r\n throw new Error('Image download url is empty');\r\n }\r\n\r\n return fetchImageBlob(currentImageDownloadUrl.value);\r\n};\r\n\r\nconst downloadCurrentImage = async () => {\r\n const downloadUrl = currentImageDownloadUrl.value;\r\n\r\n if (!downloadUrl) {\r\n showDownloadToast('暂无可下载的图片地址。', 'warning');\r\n return;\r\n }\r\n\r\n try {\r\n const blob = await fetchCurrentImageBlob();\r\n await validateImageBlob(blob);\r\n const fileName = getCurrentImageFileName(blob);\r\n const fileHandle = await getDownloadFileHandle(fileName, blob);\r\n if (fileHandle === false) return;\r\n\r\n if (fileHandle) {\r\n const writable = await fileHandle.createWritable();\r\n await writable.write(blob);\r\n await writable.close();\r\n showDownloadToast('图片下载成功。', 'success');\r\n return;\r\n }\r\n\r\n triggerBrowserDownload(blob, fileName);\r\n if (isDownloadRiskWebView()) {\r\n showDownloadToast('已使用兼容方式下载图片,如文件仍不可用,请在系统浏览器中打开后保存。');\r\n return;\r\n }\r\n\r\n showDownloadToast('图片已开始下载。', 'success');\r\n } catch (error) {\r\n const failureReason = getDownloadFailureReason(error);\r\n console.error(`下载图片失败:${failureReason}`, error);\r\n triggerBrowserUrlDownload(downloadUrl, getCurrentImageFileName());\r\n if (isDownloadRiskWebView()) {\r\n showDownloadToast(`下载失败:${failureReason}。已打开原图,请在系统浏览器中保存。`, 'warning');\r\n return;\r\n }\r\n\r\n showDownloadToast(`下载失败:${failureReason}。已切换为浏览器下载。`, 'warning');\r\n }\r\n};\r\n\r\nconst resetImageTransform = () => {\r\n imageRotation.value = 0;\r\n imageScale.value = 1;\r\n imageTranslateX.value = 0;\r\n imageTranslateY.value = 0;\r\n imageDragState.value = null;\r\n};\r\n\r\n// 监听预览状态变化\r\nwatch(showPreview, (newVal) => {\r\n if (newVal) {\r\n // 打开预览时重置旋转角度和当前索引\r\n resetImageTransform();\r\n currentIndex.value = props.index;\r\n }\r\n});\r\n\r\n// 打开预览\r\nconst openPreview = () => {\r\n if (!props.preview) return;\r\n // 超大/未知尺寸图:不进入 v-dialog(内部 v-img 全量解码会卡死),直接新窗口打开原图\r\n if (props.sizeGuard && (imgState.value === 'oversize' || imgState.value === 'unknown')) {\r\n if (srcWithToken.value) window.open(srcWithToken.value, '_blank', 'noopener');\r\n return;\r\n }\r\n showPreview.value = true;\r\n};\r\n\r\n// 关闭预览\r\nconst closePreview = () => {\r\n showPreview.value = false;\r\n};\r\n\r\n// 上一张图片\r\nconst prevImage = () => {\r\n if (hasPrev.value) {\r\n currentIndex.value--;\r\n resetImageTransform();\r\n }\r\n};\r\n\r\n// 下一张图片\r\nconst nextImage = () => {\r\n if (hasNext.value) {\r\n currentIndex.value++;\r\n resetImageTransform();\r\n }\r\n};\r\n\r\n// 旋转图片\r\nconst rotateImage = (degrees) => {\r\n imageRotation.value += degrees;\r\n};\r\n\r\nconst zoomImage = (step) => {\r\n const nextScale = Number((imageScale.value + step).toFixed(2));\r\n imageScale.value = Math.min(3, Math.max(0.2, nextScale));\r\n if (imageScale.value <= 1) {\r\n imageTranslateX.value = 0;\r\n imageTranslateY.value = 0;\r\n }\r\n};\r\n\r\nconst handleImageWheel = (event) => {\r\n zoomImage(event.deltaY < 0 ? 0.2 : -0.2);\r\n};\r\n\r\nconst startImageDrag = (event) => {\r\n if (imageScale.value <= 1) return;\r\n event.preventDefault();\r\n const target = event.currentTarget;\r\n imageDragState.value = {\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startY: event.clientY,\r\n translateX: imageTranslateX.value,\r\n translateY: imageTranslateY.value,\r\n };\r\n target.setPointerCapture?.(event.pointerId);\r\n target.addEventListener('pointermove', moveImageDrag);\r\n target.addEventListener('pointerup', endImageDrag, { once: true });\r\n target.addEventListener('pointercancel', endImageDrag, { once: true });\r\n};\r\n\r\nconst moveImageDrag = (event) => {\r\n const state = imageDragState.value;\r\n if (!state || state.pointerId !== event.pointerId) return;\r\n imageTranslateX.value = state.translateX + event.clientX - state.startX;\r\n imageTranslateY.value = state.translateY + event.clientY - state.startY;\r\n};\r\n\r\nconst endImageDrag = (event) => {\r\n event.currentTarget?.releasePointerCapture?.(event.pointerId);\r\n event.currentTarget?.removeEventListener('pointermove', moveImageDrag);\r\n imageDragState.value = null;\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-img-container {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.vtk-img-card {\r\n height: 100%;\r\n}\r\n\r\n.vtk-img-card--preview {\r\n cursor: pointer;\r\n transition: transform 0.2s ease-in-out;\r\n}\r\n\r\n.vtk-img-card--preview:hover {\r\n transform: translateY(-5px);\r\n}\r\n\r\n.vtk-img {\r\n width: 100%;\r\n}\r\n\r\n/* 超大图片守卫占位 */\r\n.vtk-img-guard {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 8px;\r\n min-height: 160px;\r\n background: rgb(var(--v-theme-on-surface), 0.05);\r\n border-radius: 4px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n cursor: pointer;\r\n}\r\n\r\n.vtk-img-guard--loading {\r\n cursor: default;\r\n}\r\n\r\n.vtk-img-guard .guard-icon {\r\n font-size: 40px;\r\n}\r\n\r\n.vtk-img-guard .guard-text {\r\n font-size: 13px;\r\n}\r\n\r\n.vtk-img-info {\r\n padding: 0;\r\n}\r\n\r\n.vtk-img-title {\r\n word-break: break-word;\r\n}\r\n\r\n.vtk-img-description {\r\n word-break: break-word;\r\n}\r\n\r\n/* 图片查看器样式 */\r\n.image-viewer-card {\r\n background-color: rgba(0, 0, 0, 0.3);\r\n color: white;\r\n}\r\n\r\n.image-viewer-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: calc(100vh - 150px);\r\n position: relative;\r\n}\r\n\r\n.image-container {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n}\r\n\r\n.viewer-image {\r\n max-width: 90%;\r\n max-height: 80vh;\r\n transform-origin: center center;\r\n transition: transform 0.3s ease;\r\n user-select: none;\r\n touch-action: none;\r\n}\r\n\r\n.viewer-image--draggable {\r\n cursor: grab;\r\n}\r\n\r\n.viewer-guard {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 12px;\r\n padding: 24px;\r\n color: rgba(255, 255, 255, 0.85);\r\n font-size: 15px;\r\n text-align: center;\r\n cursor: pointer;\r\n}\r\n\r\n.viewer-guard--loading {\r\n cursor: default;\r\n}\r\n\r\n.viewer-image--draggable:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.nav-button {\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n z-index: 10;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n color: white;\r\n width: 50px;\r\n height: 50px;\r\n}\r\n\r\n.prev-button {\r\n left: 20px;\r\n}\r\n\r\n.next-button {\r\n right: 20px;\r\n}\r\n\r\n.image-info {\r\n padding: 20px;\r\n background-color: rgba(0, 0, 0, 0.7);\r\n}\r\n\r\n.image-info p {\r\n margin: 5px 0;\r\n}\r\n\r\n:deep(.v-img__img) {\r\n background: v-bind('props.error') no-repeat center;\r\n background-size: cover;\r\n}\r\n\r\n:deep(.v-img__placeholder) {\r\n filter: blur(0px);\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"m_pagination\">\r\n <VRow v-if=\"pageDatas.rowCount > 0\" class=\"pagination box\" align=\"center\">\r\n <span class=\"page-total d-none d-md-flex align-center\">共{{ pageDatas.rowCount }}条</span>\r\n <VSelect\r\n v-model=\"pagination.limit\"\r\n :items=\"pageSizeObjs\"\r\n variant=\"outlined\"\r\n density=\"compact\"\r\n :menu-props=\"{ offsetY: true }\"\r\n hide-details\r\n class=\"page-select ml-2 d-none d-md-flex\"\r\n @update:model-value=\"pageSizeChange()\"\r\n />\r\n <span class=\"my-2\">\r\n <v-pagination\r\n v-model=\"pageDatas.pageno\"\r\n :total-visible=\"5\"\r\n :length=\"pageDatas.pageCount\"\r\n size=\"small\"\r\n @update:model-value=\"pageChange()\"\r\n />\r\n </span>\r\n <span class=\"page-total ml-1 d-none d-md-flex align-center\">到</span>\r\n <VTextField\r\n v-model=\"pagination.pageno\"\r\n variant=\"outlined\"\r\n density=\"compact\"\r\n hide-details\r\n class=\"page-go ml-2 d-none d-md-flex\"\r\n @keyup.enter=\"toPage()\"\r\n />\r\n <span class=\"page-total ml-2 d-none d-md-flex align-center\">页</span>\r\n </VRow>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, reactive, computed, watch, onMounted } from 'vue';\r\n\r\nconst props = defineProps({\r\n pageData: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n pageSizes: {\r\n type: Array,\r\n default: () => [10, 20, 30]\r\n }\r\n});\r\n\r\nconst emit = defineEmits(['pageChange']);\r\n\r\nconst pagination = reactive({\r\n pageno: 1,\r\n limit: 10\r\n});\r\n\r\nconst pageSizeObjs = ref([]);\r\nconst pageDatas = ref({ ...props.pageData });\r\n\r\nconst paginationChange = computed(() => pageDatas.value.pageno);\r\n\r\nwatch(paginationChange, () => {\r\n pagination.pageno = pageDatas.value.pageno;\r\n});\r\n\r\nwatch(() => props.pageData, (newVal) => {\r\n pageDatas.value = { ...newVal };\r\n if (newVal.rowCount < 1 && newVal.rows > 0) {\r\n pageDatas.value.pageno = newVal.pageno - 1;\r\n pageChange();\r\n }\r\n}, { deep: true });\r\n\r\nonMounted(() => {\r\n pageSizeFormat();\r\n});\r\n\r\nconst toPage = () => {\r\n const re = /^[0-9]+$/;\r\n if (re.test(pagination.pageno) && pagination.pageno <= pageDatas.value.pageCount) {\r\n pageDatas.value.pageno = parseInt(pagination.pageno);\r\n pageChange();\r\n } else {\r\n pagination.pageno = pageDatas.value.pageno;\r\n }\r\n};\r\n\r\nconst pageSizeChange = () => {\r\n pageDatas.value.pageCount = 1;\r\n pageChange();\r\n};\r\n\r\nconst pageSizeFormat = () => {\r\n const temp = props.pageSizes;\r\n temp.forEach((value) => {\r\n const obj = {\r\n title: value + \"条/页\",\r\n value: value\r\n };\r\n pageSizeObjs.value.push(obj);\r\n });\r\n pagination.limit = temp[0];\r\n};\r\n\r\nconst pageChange = () => {\r\n const page = {\r\n pageno: pageDatas.value.pageno,\r\n limit: pagination.limit\r\n };\r\n emit('pageChange', page);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.mt-1 {\r\n margin-top: 11px !important;\r\n}\r\n.my-5 {\r\n margin-top: 20px !important;\r\n margin-bottom: 20px !important;\r\n}\r\n.m_pagination {\r\n width: 100%;\r\n min-height: 52px;\r\n display: flex;\r\n align-items: center;\r\n .box {\r\n position: absolute;\r\n right: 32px;\r\n }\r\n}\r\n.page-total {\r\n display: flex;\r\n align-items: center;\r\n height: 36px;\r\n font-size: 13px;\r\n padding-top: 4px;\r\n}\r\n.page-select {\r\n padding-top: 4px;\r\n max-width: 120px;\r\n :deep(.v-input__control) {\r\n min-height: 36px !important;\r\n height: 36px !important;\r\n }\r\n :deep(.v-field) {\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n :deep(.v-field__input) {\r\n padding-top: 6px !important;\r\n padding-bottom: 6px !important;\r\n min-height: 36px !important;\r\n }\r\n}\r\n.page-go {\r\n max-width: 75px;\r\n padding-top: 4px;\r\n :deep(.v-input__control) {\r\n min-height: 36px !important;\r\n height: 36px !important;\r\n }\r\n :deep(.v-field) {\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n :deep(.v-field__input) {\r\n padding-top: 6px !important;\r\n padding-bottom: 6px !important;\r\n min-height: 36px !important;\r\n }\r\n}\r\n\r\n// 分页按钮缩小\r\n.my-2 {\r\n :deep(.v-pagination__item),\r\n :deep(.v-pagination__prev),\r\n :deep(.v-pagination__next) {\r\n min-width: 32px !important;\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-pdf-container\">\r\n <VCard \r\n :class=\"['vtk-pdf-card', { 'vtk-pdf-card--preview': preview }]\"\r\n @click=\"openPreview\"\r\n >\r\n <!-- PDF封面或默认图标 -->\r\n <div class=\"vtk-pdf-cover\" :style=\"{ aspectRatio: aspectRatio }\">\r\n <VIcon size=\"48\" color=\"red\">mdi-file-pdf-box</VIcon>\r\n <div class=\"vtk-pdf-label\">PDF</div>\r\n </div>\r\n \r\n <!-- PDF标题和描述 -->\r\n <div class=\"vtk-pdf-info\" v-if=\"showTitle || showDescription\">\r\n <VCardTitle v-if=\"showTitle\" class=\"vtk-pdf-title text-subtitle-2 pa-2\">\r\n {{ title }}\r\n </VCardTitle>\r\n <v-card-subtitle v-if=\"showDescription\" class=\"vtk-pdf-description text-caption pa-2\">\r\n {{ description }}\r\n </v-card-subtitle>\r\n </div>\r\n </VCard>\r\n \r\n <!-- 使用 v-dialog 的PDF预览 -->\r\n <VDialog \r\n v-model=\"showPreview\" \r\n max-width=\"90%\" \r\n fullscreen\r\n @click:outside=\"closePreview\"\r\n >\r\n <VCard class=\"pdf-viewer-card\">\r\n <v-toolbar dark color=\"red darken-1\">\r\n <VBtn icon dark @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n <v-toolbar-title>{{ title }}</v-toolbar-title>\r\n <VSpacer></VSpacer>\r\n <v-toolbar-items>\r\n <VBtn icon dark @click=\"downloadPdf\">\r\n <VIcon>mdi-download</VIcon>\r\n </VBtn>\r\n </v-toolbar-items>\r\n </v-toolbar>\r\n \r\n <div class=\"pdf-viewer-content\">\r\n <div class=\"pdf-container\" ref=\"pdfContainer\">\r\n <!-- PDF内容将通过PDF.js渲染 -->\r\n <div id=\"pdf-viewer\"></div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"pdf-viewer-footer\" v-if=\"pdfLoaded\">\r\n <VRow align=\"center\" justify=\"center\">\r\n <VCol cols=\"12\" sm=\"6\" class=\"d-flex justify-center\">\r\n <VBtn icon @click=\"prevPage\" :disabled=\"currentPage <= 1\">\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n <div class=\"mx-4\">\r\n <span>第 {{ currentPage }} 页 / 共 {{ pageCount }} 页</span>\r\n </div>\r\n <VBtn icon @click=\"nextPage\" :disabled=\"currentPage >= pageCount\">\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n </VCol>\r\n <VCol cols=\"12\" sm=\"6\" class=\"d-flex justify-center\">\r\n <VSlider\r\n v-model=\"currentPage\"\r\n :min=\"1\"\r\n :max=\"pageCount\"\r\n hide-details\r\n class=\"mx-4\"\r\n ></VSlider>\r\n </VCol>\r\n </VRow>\r\n </div>\r\n \r\n <div class=\"pdf-loading\" v-if=\"loading\">\r\n <v-progress-circular indeterminate color=\"red\"></v-progress-circular>\r\n <p class=\"mt-2\">正在加载PDF...</p>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, onMounted, onBeforeUnmount } from 'vue';\r\n// import * as pdfjsLib from 'pdfjs-dist';\r\n// 注意:在实际项目中,您需要安装 pdfjs-dist 库\r\n// npm install pdfjs-dist\r\n// import * as pdfjsLib from 'pdfjs-dist';\r\n\r\ndefineOptions({\r\n name: 'VtkPdf',\r\n inheritAttrs: true\r\n});\r\n\r\nconst props = defineProps({\r\n src: {\r\n type: String,\r\n default: null,\r\n },\r\n preview: {\r\n type: Boolean,\r\n default: true\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n description: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否显示标题\r\n showTitle: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示描述\r\n showDescription: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 封面宽高比\r\n aspectRatio: {\r\n type: [String, Number],\r\n default: 16/9\r\n }\r\n});\r\n\r\n// 预览状态\r\nconst showPreview = ref(false);\r\n// PDF相关状态\r\nconst loading = ref(false);\r\nconst pdfLoaded = ref(false);\r\nconst currentPage = ref(1);\r\nconst pageCount = ref(0);\r\nconst pdfContainer = ref(null);\r\n\r\n// PDF对象(实际使用时需要引入pdfjsLib)\r\nlet pdfDoc = null;\r\n\r\n// 使用计算属性处理带token的URL\r\nconst srcWithToken = computed(() => {\r\n if (!props.src) return props.src;\r\n \r\n try {\r\n // 首先尝试使用 $vtk.storage\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n const token = window.$vtk.storage.get('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n // 如果 $vtk 不存在,尝试从 localStorage 获取 token\r\n else {\r\n const token = localStorage.getItem('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n } catch (error) {\r\n // 发生错误时返回原始src\r\n console.warn('VtkPdf: Failed to get token, using src without token', error);\r\n return props.src;\r\n }\r\n});\r\n\r\n// 打开预览\r\nconst openPreview = () => {\r\n if (props.preview) {\r\n showPreview.value = true;\r\n // 延迟加载PDF以确保DOM已准备好\r\n setTimeout(() => {\r\n loadPdf();\r\n }, 300);\r\n }\r\n};\r\n\r\n// 关闭预览\r\nconst closePreview = () => {\r\n showPreview.value = false;\r\n // 清理PDF对象\r\n pdfDoc = null;\r\n pdfLoaded.value = false;\r\n currentPage.value = 1;\r\n pageCount.value = 0;\r\n};\r\n\r\n// 加载PDF(示例实现,实际使用需要PDF.js库)\r\nconst loadPdf = async () => {\r\n if (!srcWithToken.value) return;\r\n \r\n loading.value = true;\r\n \r\n try {\r\n // 模拟PDF加载(实际实现需要使用PDF.js)\r\n /*\r\n // 实际使用时的代码示例:\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '//cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.worker.min.js';\r\n \r\n const loadingTask = pdfjsLib.getDocument(srcWithToken.value);\r\n pdfDoc = await loadingTask.promise;\r\n pageCount.value = pdfDoc.numPages;\r\n pdfLoaded.value = true;\r\n \r\n // 渲染第一页\r\n renderPage(currentPage.value);\r\n */\r\n \r\n // 模拟加载过程\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n pageCount.value = 10; // 模拟10页PDF\r\n pdfLoaded.value = true;\r\n } catch (error) {\r\n console.error('加载PDF失败:', error);\r\n } finally {\r\n loading.value = false;\r\n }\r\n};\r\n\r\n// 渲染PDF页面(示例实现)\r\nconst renderPage = async (pageNum) => {\r\n if (!pdfDoc || !pdfContainer.value) return;\r\n \r\n try {\r\n /*\r\n // 实际使用时的代码示例:\r\n const page = await pdfDoc.getPage(pageNum);\r\n const viewport = page.getViewport({ scale: 1.5 });\r\n \r\n // 准备canvas\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d');\r\n canvas.height = viewport.height;\r\n canvas.width = viewport.width;\r\n \r\n // 清空容器\r\n pdfContainer.value.innerHTML = '';\r\n pdfContainer.value.appendChild(canvas);\r\n \r\n // 渲染页面\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport: viewport\r\n };\r\n await page.render(renderContext).promise;\r\n */\r\n } catch (error) {\r\n console.error('渲染PDF页面失败:', error);\r\n }\r\n};\r\n\r\n// 上一页\r\nconst prevPage = () => {\r\n if (currentPage.value > 1) {\r\n currentPage.value--;\r\n renderPage(currentPage.value);\r\n }\r\n};\r\n\r\n// 下一页\r\nconst nextPage = () => {\r\n if (currentPage.value < pageCount.value) {\r\n currentPage.value++;\r\n renderPage(currentPage.value);\r\n }\r\n};\r\n\r\n// 下载PDF\r\nconst downloadPdf = async () => {\r\n if (!srcWithToken.value) return;\r\n \r\n try {\r\n // 获取PDF文件的二进制数据\r\n const response = await fetch(srcWithToken.value);\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n \r\n const blob = await response.blob();\r\n const fileName = props.title && props.title.trim() !== '' \r\n ? `${props.title}.pdf` \r\n : 'document.pdf';\r\n \r\n // 创建下载链接\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n \r\n // 清理\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n } catch (error) {\r\n console.error('下载PDF失败:', error);\r\n // 备用方案:在新窗口打开\r\n window.open(srcWithToken.value, '_blank');\r\n }\r\n};\r\n\r\n// 监听页码变化\r\nconst handlePageChange = (newPage) => {\r\n if (newPage >= 1 && newPage <= pageCount.value) {\r\n renderPage(newPage);\r\n }\r\n};\r\n\r\n// 监听 currentPage 变化\r\n// 在实际实现中,您需要使用 watch 监听 currentPage 变化\r\n// watch(currentPage, handlePageChange);\r\n\r\n// 组件销毁前清理\r\nonBeforeUnmount(() => {\r\n pdfDoc = null;\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-pdf-container {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.vtk-pdf-card {\r\n height: 100%;\r\n}\r\n\r\n.vtk-pdf-card--preview {\r\n cursor: pointer;\r\n transition: transform 0.2s ease-in-out;\r\n}\r\n\r\n.vtk-pdf-card--preview:hover {\r\n transform: translateY(-5px);\r\n}\r\n\r\n.vtk-pdf-cover {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #f5f5f5;\r\n border: 1px solid #ddd;\r\n width: 100%;\r\n}\r\n\r\n.vtk-pdf-label {\r\n margin-top: 8px;\r\n font-weight: 500;\r\n color: #666;\r\n}\r\n\r\n.vtk-pdf-info {\r\n padding: 0;\r\n}\r\n\r\n.vtk-pdf-title {\r\n word-break: break-word;\r\n}\r\n\r\n.vtk-pdf-description {\r\n word-break: break-word;\r\n}\r\n\r\n/* PDF查看器样式 */\r\n.pdf-viewer-card {\r\n background-color: #e0e0e0;\r\n color: #333;\r\n}\r\n\r\n.pdf-viewer-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: calc(100vh - 150px);\r\n position: relative;\r\n background-color: #555;\r\n overflow: auto;\r\n}\r\n\r\n.pdf-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n#pdf-viewer {\r\n max-width: 100%;\r\n max-height: 100%;\r\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\r\n background-color: white;\r\n /* 实际PDF内容将在此处渲染 */\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 500px;\r\n min-width: 400px;\r\n}\r\n\r\n.pdf-viewer-footer {\r\n padding: 16px;\r\n background-color: #f5f5f5;\r\n border-top: 1px solid #ddd;\r\n}\r\n\r\n.pdf-loading {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: rgba(255, 255, 255, 0.9);\r\n padding: 20px;\r\n border-radius: 8px;\r\n z-index: 100;\r\n}\r\n</style>","// composables/useMixins.js\r\nimport { ref, reactive } from 'vue'\r\nimport Request from '../commons/request.js'\r\nimport Message from '../components/message/index.js'\r\nimport storage from '../commons/storage.js'\r\n\r\n/**\r\n * 通用 mixins composable\r\n * @param {Object} urlConfig - URL 配置对象\r\n * @returns {Object} 包含所有状态和方法的对象\r\n */\r\nexport function useMixins(urlConfig = {}) {\r\n // 响应式数据\r\n const queryParam = reactive({})\r\n const desserts = ref([])\r\n const loading = ref(false)\r\n const superQueryParams = ref('')\r\n const page = reactive({\r\n pageno: 1,\r\n limit: 10\r\n })\r\n const pageData = ref({})\r\n const sumup = ref({})\r\n const pageDataCopy = ref([])\r\n const overlay = ref(false)\r\n const user = ref({})\r\n\r\n // URL 配置\r\n const url = reactive(urlConfig)\r\n\r\n /**\r\n * 获取查询参数\r\n * @returns {Object} 查询参数对象\r\n */\r\n const getQueryParams = () => {\r\n user.value = storage.get('_mis_acis_users')\r\n if (!queryParam.areaCode) {\r\n queryParam.areaCode = user.value?.areacode\r\n }\r\n const codex = Object.assign({}, queryParam)\r\n const params = {\r\n pageno: page.pageno,\r\n limit: page.limit,\r\n codex: codex\r\n }\r\n return params\r\n }\r\n\r\n /**\r\n * 加载页面数据\r\n */\r\n const loadPage = () => {\r\n if (!url.list) {\r\n Message.toast('请先设置url.list属性', { color: 'warning' })\r\n return\r\n }\r\n const params = getQueryParams()\r\n loading.value = true\r\n\r\n // 兼容处理 vtk 对象\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.show()\r\n }\r\n\r\n Request.postJson(url.list, params)\r\n .then((res) => {\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n\r\n if (res.meta.success || res.data) {\r\n desserts.value = res.data?.rows || []\r\n pageData.value = res.data\r\n sumup.value = res.data.sumup ? res.data.sumup : {}\r\n pageDataCopy.value = res.data\r\n }\r\n loading.value = false\r\n })\r\n .catch((error) => {\r\n console.error('加载页面数据失败:', error)\r\n loading.value = false\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 搜索查询\r\n */\r\n const searchQuery = () => {\r\n page.pageno = 1\r\n page.limit ??= 10\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 分页变化处理\r\n * @param {Object} pageInfo - 分页信息\r\n */\r\n const getListPage = (pageInfo) => {\r\n page.pageno = pageInfo.pageno\r\n page.limit = pageInfo.limit\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 删除项\r\n * @param {string|number} id - 要删除的项ID\r\n * @param {string} text - 确认提示文本\r\n */\r\n const deleteItem = (id, text) => {\r\n if (!url.delete) {\r\n Message.toast('请设置url.delete属性!', { color: 'warning' })\r\n return\r\n }\r\n\r\n Message.confirm(\r\n { title: '确认删除', text: text ? text : '是否删除?' },\r\n (result) => {\r\n if (result) {\r\n Request.getForm(url.delete, { id: id })\r\n .then((res) => {\r\n if (res.meta.success) {\r\n Message.toast('删除成功', { color: 'success' })\r\n loadPage()\r\n } else {\r\n Message.toast('删除失败', { color: 'warning' })\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('删除失败:', error)\r\n Message.toast('删除失败', { color: 'warning' })\r\n })\r\n }\r\n }\r\n )\r\n }\r\n\r\n /**\r\n * 复制项\r\n * @param {string|number} id - 要复制的项ID\r\n * @param {string} text - 确认提示文本\r\n */\r\n const copyItem = (id, text) => {\r\n if (!url.copy) {\r\n Message.toast('请设置url.copy!', { color: 'warning' })\r\n return\r\n }\r\n\r\n Message.confirm(\r\n { title: '拷贝', text: text ? text : '是否确认拷贝当前数据?' },\r\n (result) => {\r\n if (result) {\r\n Request.getForm(url.copy, { id: id })\r\n .then((res) => {\r\n if (res.meta.success) {\r\n Message.toast('拷贝成功', { color: 'success' })\r\n loadPage()\r\n } else {\r\n Message.toast('拷贝失败', { color: 'warning' })\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('拷贝失败:', error)\r\n Message.toast('拷贝失败', { color: 'warning' })\r\n })\r\n }\r\n }\r\n )\r\n }\r\n\r\n /**\r\n * 编辑项\r\n * @param {Object} record - 要编辑的记录\r\n * @param {Object} modalFormRef - 模态框引用\r\n */\r\n const edit = (record, modalFormRef) => {\r\n if (modalFormRef?.value) {\r\n modalFormRef.value.edit(record)\r\n }\r\n }\r\n\r\n /**\r\n * 添加新项\r\n * @param {Object} modalFormRef - 模态框引用\r\n */\r\n const add = (modalFormRef) => {\r\n if (modalFormRef?.value) {\r\n modalFormRef.value.add()\r\n }\r\n }\r\n\r\n /**\r\n * 模态框确认回调\r\n */\r\n const modalFormOk = () => {\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 导出数据\r\n */\r\n const expData = () => {\r\n overlay.value = true\r\n\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.show()\r\n }\r\n\r\n const params = getQueryParams()\r\n Request.exp(url.exp, params)\r\n .then((res) => {\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n\r\n if (res) {\r\n const disposition = res.headers['content-disposition']\r\n const filename = decodeURI(\r\n disposition.substring(\r\n disposition.indexOf('filename=') + 9,\r\n disposition.length\r\n )\r\n )\r\n const blob = new Blob([res.data], {\r\n type: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n })\r\n\r\n if (window.navigator.msSaveOrOpenBlob) {\r\n navigator.msSaveBlob(blob)\r\n } else {\r\n const link = document.createElement('a')\r\n link.style.display = 'none'\r\n link.href = URL.createObjectURL(blob)\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n }\r\n }\r\n overlay.value = false\r\n })\r\n .catch((error) => {\r\n console.error('导出数据失败:', error)\r\n overlay.value = false\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 重置查询参数\r\n */\r\n const resetQueryParams = () => {\r\n Object.keys(queryParam).forEach(key => {\r\n delete queryParam[key]\r\n })\r\n }\r\n\r\n /**\r\n * 重置分页\r\n */\r\n const resetPage = () => {\r\n page.pageno = 1\r\n page.limit = 10\r\n }\r\n\r\n /**\r\n * 更新 URL 配置\r\n * @param {Object} newUrlConfig - 新的 URL 配置\r\n */\r\n const updateUrlConfig = (newUrlConfig) => {\r\n Object.assign(url, newUrlConfig)\r\n }\r\n\r\n // 返回所有状态和方法\r\n return {\r\n // 响应式数据\r\n queryParam,\r\n desserts,\r\n loading,\r\n superQueryParams,\r\n page,\r\n pageData,\r\n sumup,\r\n pageDataCopy,\r\n overlay,\r\n user,\r\n url,\r\n\r\n // 方法\r\n getQueryParams,\r\n loadPage,\r\n searchQuery,\r\n getListPage,\r\n deleteItem,\r\n copyItem,\r\n edit,\r\n add,\r\n modalFormOk,\r\n expData,\r\n resetQueryParams,\r\n resetPage,\r\n updateUrlConfig\r\n }\r\n}\r\n\r\n// 默认导出保持向后兼容\r\nexport default useMixins","<template>\r\n\t<VContainer fluid class=\"vtk-height pa-0\">\r\n\t\t<VTabs v-model=\"examType\" bg-color=\"transparent\" height=\"38\" style=\"width: 100%\">\r\n\t\t\t<VTab @click=\"examAll()\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-clipboard-arrow-up</VIcon>全部</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"list\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-star-circle</VIcon>审核</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-hand-heart</VIcon>实施</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-comment-minus</VIcon>评价</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-credit-card-check</VIcon>支付</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VSpacer />\r\n\t\t</VTabs>\r\n\t\t<VCard elevation=\"0\" style=\"min-height: calc(100% - 38px)\">\r\n\t\t\t<VCardTitle style=\"height: 88px\">\r\n\t\t\t\t<VMenu v-if=\"examType == '0' && (expShow || user.grole >= 2)\" offset-y :close-on-content-click=\"false\" location=\"bottom\">\r\n\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t<VBtn @click=\"exv\" v-bind=\"props\" class=\"bg-orange text-white mr-3\" elevation=\"0\">\r\n\t\t\t\t\t\t\t<VIcon>mdi-export-variant</VIcon> 导出\r\n\t\t\t\t\t\t</VBtn>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<VCard class=\"pa-3\" width=\"300\">\r\n\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t<p class=\"mb-2 font-weight-bold\">公共字段</p>\r\n\t\t\t\t\t\t\t<p class=\"text-caption\">\r\n\t\t\t\t\t\t\t\t服务事项\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属区县\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属镇街\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属社区\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人证件号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人姓名\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t残疾人证号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t性别\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人手机号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t补助金额\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t开户银行\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t银行卡号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t收款人姓名\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t收款人证件号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t状态\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t<VDivider />\r\n\t\t\t\t\t\t\t<div v-if=\"queryParam.servState == '1' && projName\">\r\n\t\t\t\t\t\t\t\t<VCardTitle class=\"pa-0 text-body-1 mb-2 pt-3\">\r\n\t\t\t\t\t\t\t\t\t<VCheckbox @update:model-value=\"chkAll\" v-model=\"select\" class=\"mt-n1\" hide-details>\r\n\t\t\t\t\t\t\t\t\t\t<template v-slot:append>\r\n\t\t\t\t\t\t\t\t\t\t\t<VIcon class=\"active\" style=\"display: none\" size=\"18\">mdi-check-circle</VIcon>\r\n\t\t\t\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t\t\t</VCheckbox>\r\n\t\t\t\t\t\t\t\t\t<span class=\"font-weight-bold ml-n2\">拓展字段</span>\r\n\t\t\t\t\t\t\t\t\t<VSpacer />\r\n\t\t\t\t\t\t\t\t</VCardTitle>\r\n\t\t\t\t\t\t\t\t<p v-if=\"formArr?.length > 0\" class=\"mb-0 expBox\">\r\n\t\t\t\t\t\t\t\t\t<VCheckbox\r\n\t\t\t\t\t\t\t\t\t\tv-for=\"(item, index) in formArr\"\r\n\t\t\t\t\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\t\t\t\t\tv-model=\"expArr\"\r\n\t\t\t\t\t\t\t\t\t\t:label=\"item.label\"\r\n\t\t\t\t\t\t\t\t\t\t:value=\"{ name: item.name, valu: `${item.label}${item.valu && item.valu.includes('/') && item.valu.includes(':') ? `(${item.valu})` : ''}` }\"\r\n\t\t\t\t\t\t\t\t\t\tclass=\"mt-2\"\r\n\t\t\t\t\t\t\t\t\t\tmultiple\r\n\t\t\t\t\t\t\t\t\t\thide-details>\r\n\t\t\t\t\t\t\t\t\t\t<template v-slot:append>\r\n\t\t\t\t\t\t\t\t\t\t\t<VIcon class=\"active\" style=\"display: none\" size=\"18\">mdi-check-circle</VIcon>\r\n\t\t\t\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t\t\t</VCheckbox>\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p v-else class=\"text-red text-body-2 mb-2\">{{ projTip }}</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div v-else>\r\n\t\t\t\t\t\t\t\t<p class=\"mb-3 pt-3 font-weight-bold\">导出提示</p>\r\n\t\t\t\t\t\t\t\t<p :class=\"queryParam.servState == '1' ? 'text-green' : 'text-red'\" class=\"mb-3 text-body-2\">\r\n\t\t\t\t\t\t\t\t\t<VIcon size=\"20\" :color=\"queryParam.servState == '1' ? 'green' : 'red'\">{{ queryParam.servState == \"1\" ? \"mdi-progress-check\" : \"mdi-progress-close\" }}</VIcon>\r\n\t\t\t\t\t\t\t\t\t导出数据仅限已服务信息\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p class=\"mb-2 text-body-2\" :class=\"projName ? 'text-green' : 'text-red'\">\r\n\t\t\t\t\t\t\t\t\t<VIcon size=\"20\" :color=\"projName ? 'green' : 'red'\">{{ projName ? \"mdi-progress-check\" : \"mdi-progress-close\" }}</VIcon>\r\n\t\t\t\t\t\t\t\t\t至少选择一个服务事项导出\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<VBtn @click=\"exp\" :disabled=\"!(projName && queryParam.servState == '1')\" elevation=\"0\" color=\"primary\" class=\"vtk-width mt-3\" size=\"small\">确认导出</VBtn>\r\n\t\t\t\t\t</VCard>\r\n\t\t\t\t</VMenu>\r\n\t\t\t\t<VSpacer />\r\n\t\t\t\t<vtk-search v-model=\"queryParam\" @search=\"searchQuery\" placeholder=\"输入姓名/身份证查询\" :styles=\"'width:320px'\">\r\n\t\t\t\t\t<VTextField @click=\"searchProj\" v-model=\"projName\" :title=\"projName\" clearable readonly variant=\"outlined\" placeholder=\"服务事项\" density=\"compact\" hide-details class=\"my-3\"></VTextField>\r\n\t\t\t\t\t<vtk-area-tabs v-model=\"queryParam.areaCode\" :styles=\"'width:100%'\" />\r\n\t\t\t\t\t<div v-if=\"examType == 0\" style=\"width: 400px\">\r\n\t\t\t\t\t\t<vtk-select v-model=\"queryParam.servState\" @change=\"searchQuery\" placeholder=\"服务状态\" list=\"0:服务中/1:已服务\" class=\"mt-3 d-inline-block mr-3 mb-3\" style=\"width: calc(50% - 6px)\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t\t<vtk-select v-model=\"queryParam.rateState\" @change=\"searchQuery\" placeholder=\"是否评价\" list=\"0:未评价/1:已评价\" class=\"mt-3 d-inline-block\" style=\"width: calc(50% - 6px)\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t\t<VMenu v-model=\"menu\" :close-on-content-click=\"false\" transition=\"scale-transition\" location=\"bottom\" max-width=\"290px\" min-width=\"auto\">\r\n\t\t\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t\t\t<VTextField v-model=\"queryParam.servFtime0\" placeholder=\"开始时间\" persistent-hint append-icon=\"mdi-calendar\" class=\"d-inline-block\" style=\"width: calc(50% - 16px)\" hide-details variant=\"outlined\" density=\"compact\" v-bind=\"props\"></VTextField>\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t<VDatePicker v-model=\"queryParam.servFtime0\" title=\"\" @update:model-value=\"menu = false\" view-mode=\"month\" :max=\"queryParam.servFtime1\"></VDatePicker>\r\n\t\t\t\t\t\t</VMenu>\r\n\t\t\t\t\t\t<span class=\"mx-2\">至</span>\r\n\t\t\t\t\t\t<VMenu v-model=\"menu1\" :close-on-content-click=\"false\" transition=\"scale-transition\" location=\"bottom\" max-width=\"290px\" min-width=\"auto\">\r\n\t\t\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t\t\t<VTextField v-model=\"queryParam.servFtime1\" placeholder=\"结束时间\" persistent-hint append-icon=\"mdi-calendar\" class=\"d-inline-block\" style=\"width: calc(50% - 15px)\" hide-details variant=\"outlined\" density=\"compact\" v-bind=\"props\"></VTextField>\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t<VDatePicker v-model=\"queryParam.servFtime1\" title=\"\" @update:model-value=\"menu1 = false\" view-mode=\"month\" :min=\"queryParam.servFtime0\"></VDatePicker>\r\n\t\t\t\t\t\t</VMenu>\r\n\t\t\t\t\t\t<vtk-select v-if=\"queryParam.servState == '1'\" @change=\"searchQuery\" v-model=\"queryParam.state\" class=\"mt-3\" placeholder=\"状态\" list=\"1:已通过/0:未通过\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</vtk-search>\r\n\t\t\t</VCardTitle>\r\n\t\t\t<VCardText>\r\n\t\t\t\t<VDataTable :headers=\"headers\" :items=\"desserts\" :loading=\"loading\" disable-pagination loading-text=\"数据加载中...\" class=\"elevation-0\" hide-default-footer>\r\n\t\t\t\t\t<template v-slot:[`item.objsName`]=\"{ item }\">\r\n\t\t\t\t\t\t<div class=\"py-3\" @click=\"toView(item)\">\r\n\t\t\t\t\t\t\t<p class=\"vtk-cursor-pointer text-body-1 font-weight-bold mb-2\">\r\n\t\t\t\t\t\t\t\t{{ item.objsName }}<span class=\"ml-3 text-grey\">{{ formatIdCard(item.objsCode) }} </span>\r\n\t\t\t\t\t\t\t\t<VChip class=\"ml-2\" :class=\"getServStateClass(item.servState)\" size=\"small\" label>{{ getServStateText(item.servState) }} </VChip>\r\n\t\t\t\t\t\t\t\t<VChip class=\"ml-2\" :class=\"getRateStateClass(item.rateState)\" size=\"small\" label>{{ getRateStateText(item.rateState) }} </VChip>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t<VChip class=\"bg-orange-lighten-5 text-orange\" size=\"small\" label> 事项编码:{{ item.projCode }} </VChip>\r\n\t\t\t\t\t\t\t\t<VChip class=\"text-primary ml-2\" size=\"small\" label> 办件编号:{{ item.inst }} </VChip>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<div class=\"mb-0 mt-2 text-grey\">\r\n\t\t\t\t\t\t\t\t<div class=\"d-inline-block\" style=\"min-width: 320px\">\r\n\t\t\t\t\t\t\t\t\t服务名称:<span class=\"text-blue\">{{ item.projName }}</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<span>补助金额:{{ item.servAmts }}元</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<VRow class=\"py-2\" style=\"color: #979797c2\">\r\n\t\t\t\t\t\t\t\t<VCol style=\"max-width: 320px\">\r\n\t\t\t\t\t\t\t\t\t<span :title=\"item.name\" class=\"d-block\" style=\"color: #979797c2\">申请途径:{{ getServFromText(item.servFrom) }}</span>\r\n\t\t\t\t\t\t\t\t</VCol>\r\n\t\t\t\t\t\t\t\t<VCol>\r\n\t\t\t\t\t\t\t\t\t<span :title=\"item.name\" class=\"d-block\" style=\"color: #979797c2\">申请时间:{{ formatDate(item.servCtime) }}</span>\r\n\t\t\t\t\t\t\t\t</VCol>\r\n\t\t\t\t\t\t\t</VRow>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-slot:[`item.actions`]=\"{ item }\">\r\n\t\t\t\t\t\t<a v-if=\"item.state != 0 && user.areacode?.length == 6 && item.servState == '1'\" @click=\"del(item)\" class=\"text-error\" text>作废</a>\r\n\t\t\t\t\t\t<div v-if=\"item.state == 0\" class=\"state_btg text-right\"></div>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-slot:no-data>\r\n\t\t\t\t\t\t<vtk-empty />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</VDataTable>\r\n\t\t\t\t<vtk-page :page-sizes=\"[10, 20]\" :page-data=\"pageData\" @pageChange=\"getListPage\" />\r\n\t\t\t</VCardText>\r\n\t\t</VCard>\r\n\t\t<!-- 服务事项 -->\r\n\t\t<vtk-proj ref=\"MprojRef\" @toPage=\"toPage\" />\r\n\t\t<!-- 删除服务 -->\r\n\t\t<VDialog v-model=\"dialog\" persistent max-width=\"500\">\r\n\t\t\t<VCard>\r\n\t\t\t\t<VCardTitle>作废</VCardTitle>\r\n\t\t\t\t<VCardText class=\"pb-0\">\r\n\t\t\t\t\t服务作废后将无法恢复,请谨慎操作!!!\r\n\t\t\t\t\t<VTextarea v-model=\"delNote\" variant=\"outlined\" label=\"请填写作废原因\" class=\"mt-3\" hide-details density=\"compact\"></VTextarea>\r\n\t\t\t\t</VCardText>\r\n\t\t\t\t<VCardActions>\r\n\t\t\t\t\t<VSpacer />\r\n\t\t\t\t\t<VBtn @click=\"dialog = false\" variant=\"text\">取消</VBtn>\r\n\t\t\t\t\t<VBtn @click=\"delSave(true)\" variant=\"text\">确定</VBtn>\r\n\t\t\t\t</VCardActions>\r\n\t\t\t</VCard>\r\n\t\t</VDialog>\r\n\t</VContainer>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onActivated } from 'vue';\r\nimport { useMixins } from '../../composables/useMixins'\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件选项\r\ndefineOptions({\r\n\tname: 'VtkProj',\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 表单列表 URL 配置\r\nconst urlConfig = {\r\n\tlist: '/kudas/xfwez/page',\r\n\texp: '/kudas/xfwez/exp',\r\n\tdelete: '/kudas/xfwez/delete'\r\n};\r\n\r\n// 使用 mixins composable\r\nconst {\r\n\tpageData,\r\n\tgetListPage,\r\n\tloadPage,\r\n\texpData,\r\n\tdesserts,\r\n\tloading,\r\n\tqueryParam: mixinQueryParam,\r\n\turl\r\n} = useMixins(urlConfig);\r\n\r\n// 合并 queryParam\r\nObject.assign(mixinQueryParam, {});\r\nconst queryParam = mixinQueryParam;\r\n\r\n// 响应式数据\r\nconst user = ref({});\r\nconst examType = ref(1);\r\n\r\nconst headers = ref([\r\n\t{ title: '事项', key: 'objsName', sortable: false },\r\n\t{ title: '状态', key: 'actions', sortable: false, align: 'end' },\r\n]);\r\n\r\n// 主题筛选\r\nconst permits = ref([]);\r\nconst projName = ref('');\r\nconst projTip = ref('');\r\nconst bizType = ref('');\r\nconst expShow = ref(false);\r\nconst menu = ref(false);\r\nconst menu1 = ref(false);\r\n\r\n// 导出\r\nconst expArr = ref([]);\r\nconst formArr = ref([]);\r\nconst select = ref(false);\r\nconst selectAll = ref([]);\r\n\r\n// 删除\r\nconst dialog = ref(false);\r\nconst delItem = ref({});\r\nconst delNote = ref('');\r\n\r\n// ref\r\nconst MprojRef = ref(null);\r\n\r\n// 监听器\r\nwatch(expArr, (newVal) => {\r\n\tif (newVal.length < selectAll.value.length) {\r\n\t\tselect.value = false;\r\n\t}\r\n}, { deep: true });\r\n\r\n// 生命周期\r\nonActivated(() => {\r\n\talert('onActivated');\r\n\tlist();\r\n\t// 监听接收消息,刷新页面\r\n\twindow.addEventListener('storage', (event) => {\r\n\t\tif (JSON.parse(event?.newValue)?.fwez) {\r\n\t\t\texamType.value == '0' ? examAll() : loadPage();\r\n\t\t}\r\n\t});\r\n});\r\n\r\n// 方法\r\n// 全选\r\nconst chkAll = (e) => {\r\n\texpArr.value = e ? selectAll.value : [];\r\n};\r\n\r\nconst list = () => {\r\n\tbizType.value = '';\r\n\texpShow.value = false;\r\n\tuser.value = getUserInfo();\r\n\tpermits.value = [];\r\n\tuser.value.permits?.forEach((e) => {\r\n\t\tif (e.permNkey.includes('biz_type')) {\r\n\t\t\tpermits.value.push(e);\r\n\t\t\tbizType.value = bizType.value + e.permNkey.slice(9) + ',';\r\n\t\t} else if (e.permNkey == 'btn_expo') {\r\n\t\t\texpShow.value = true;\r\n\t\t}\r\n\t});\r\n\tqueryParam.bizType = bizType.value;\r\n\texamWait();\r\n};\r\n\r\n// 获取用户信息\r\nconst getUserInfo = () => {\r\n\ttry {\r\n\t\t// 实际项目中从存储或状态管理获取\r\n\t\treturn window.$vtk?.storage?.get('_mis_acis_users') || {};\r\n\t} catch (error) {\r\n\t\tconsole.warn('获取用户信息失败:', error);\r\n\t\treturn {};\r\n\t}\r\n};\r\n\r\n// 待审\r\nconst examWait = () => {\r\n\texamType.value = 1;\r\n\tqueryParam.operateLeve = user.value.areacode?.length;\r\n\tqueryParam.servState = '0';\r\n\tloadPage();\r\n};\r\n\r\n// 全部审核\r\nconst examAll = () => {\r\n\texamType.value = 0;\r\n\tdelete queryParam.operateLeve;\r\n\tdelete queryParam.servState;\r\n\tloadPage();\r\n};\r\n\r\n// 审核\r\nconst toView = (item) => {\r\n\tconst url = item.servState == 1\r\n\t\t? `#/mino/suse/view/${item.inst}?ddtab=true`\r\n\t\t: `#/mino/suse/exam/${item.inst}?ddtab=true`;\r\n\twindow.open(url);\r\n};\r\n\r\n// 服务事项查询/筛选\r\nconst searchProj = () => {\r\n\tMprojRef.value?.add(queryParam.projCode);\r\n};\r\n\r\nconst toPage = (param) => {\r\n\tprojName.value = param.projName;\r\n\tqueryParam.projCode = param.projCode;\r\n\tdelete queryParam.bizType;\r\n\tsearchQuery();\r\n};\r\n\r\nconst searchQuery = () => {\r\n\t// 搜索查询逻辑\r\n\tloadPage();\r\n};\r\n\r\n// 导出相关\r\nconst exv = () => {\r\n\tif (projName.value && queryParam.servState == '1') {\r\n\t\texpArr.value = [];\r\n\t\tformArr.value = [];\r\n\t\t// 显示加载状态\r\n\t\tRequest.postJson('/kudas/xfwez/exv', { codex: queryParam }).then((res) => {\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\tJSON.parse(res.data.formJson).forEach((item) => {\r\n\t\t\t\t\tif (['text', 'radio', 'number', 'time', 'checkbox', 'textarea', 'select'].includes(item.type)) {\r\n\t\t\t\t\t\titem.value = {\r\n\t\t\t\t\t\t\tname: item.name,\r\n\t\t\t\t\t\t\tvalu: `${item.label}${item.valu && item.valu.includes('/') && item.valu.includes(':') ? `(${item.valu})` : ''}`\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tformArr.value.push(item);\r\n\t\t\t\t\t\tselectAll.value.push(item.value);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tprojTip.value = res.meta.message;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n};\r\n\r\nconst exp = () => {\r\n\tqueryParam.fields = expArr.value;\r\n\texpData();\r\n};\r\n\r\n// 服务作废\r\nconst del = (item) => {\r\n\tdialog.value = true;\r\n\tdelItem.value = item;\r\n\tdelNote.value = '';\r\n};\r\n\r\nconst delSave = () => {\r\n\tif (delNote.value) {\r\n\t\tRequest.postForm(url.delete, { id: delItem.value.id, note: delNote.value }).then((res) => {\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\t// 显示成功消息\r\n\t\t\t\tdialog.value = false;\r\n\t\t\t\tloadPage();\r\n\t\t\t} else {\r\n\t\t\t\t// 显示失败消息\r\n\t\t\t}\r\n\t\t});\r\n\t} else {\r\n\t\t// 显示错误消息\r\n\t}\r\n};\r\n\r\n// 提示\r\nconst tip = () => {\r\n\t// 显示应用开发中的消息\r\n};\r\n\r\n// 工具函数\r\nconst formatIdCard = (idcard) => {\r\n\tif (!idcard) return '';\r\n\treturn idcard.replace(/^(.{6})(?:\\d+)(.{4})$/, '$1********$2');\r\n};\r\n\r\nconst formatDate = (dateStr) => {\r\n\tif (!dateStr) return '';\r\n\tconst date = new Date(dateStr);\r\n\treturn `${date.getFullYear()}年${String(date.getMonth() + 1).padStart(2, '0')}月${String(date.getDate()).padStart(2, '0')}日 ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;\r\n};\r\n\r\nconst getServStateClass = (state) => {\r\n\treturn state == '0' ? 'bg-blue-lighten-5 text-blue' : 'bg-green-lighten-5 text-green';\r\n};\r\n\r\nconst getServStateText = (state) => {\r\n\treturn state == '0' ? '服务中' : '已服务';\r\n};\r\n\r\nconst getRateStateClass = (state) => {\r\n\treturn state == '0' ? 'bg-orange-lighten-5 text-orange' : 'bg-blue-lighten-5 text-blue';\r\n};\r\n\r\nconst getRateStateText = (state) => {\r\n\treturn state == '0' ? '未评价' : '已评价';\r\n};\r\n\r\nconst getServFromText = (from) => {\r\n\tconst fromMap = {\r\n\t\t'100': '特殊渠道',\r\n\t\t'101': '移动端代办',\r\n\t\t'102': '窗口端通办',\r\n\t\t'200': '特殊渠道',\r\n\t\t'210': '浙里办App',\r\n\t\t'211': '浙里办微信小程序',\r\n\t\t'212': '浙里办支付宝小程序',\r\n\t\t'230': '微信小程序',\r\n\t\t'240': '支付宝小程序',\r\n\t\t'250': '自助机',\r\n\t\t'300': '特殊渠道',\r\n\t\t'310': '服务外包代办'\r\n\t};\r\n\treturn fromMap[from] || from;\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.state_btg {\r\n\tpadding-right: 0;\r\n\theight: 100%;\r\n\tbackground: url(../../assets/img/objs_btg.png) no-repeat;\r\n\tbackground-size: 80px;\r\n\tbackground-position: 100% 100%;\r\n}\r\n\r\n:deep(.v-tab) {\r\n\tbackground: url(../../assets/img/tab-2.png) no-repeat;\r\n\tbackground-size: 100% 100%;\r\n\twidth: 150px;\r\n\tmargin-left: -11px;\r\n\tborder-top-left-radius: 20px;\r\n\tborder-top-right-radius: 20px;\r\n\tspan {\r\n\t\tz-index: 99;\r\n\t}\r\n}\r\n\r\n/* Dark theme */\r\n.v-theme--dark {\r\n\t:deep(.v-tab) {\r\n\t\tbackground: url(../../assets/img/tab-4.png) no-repeat;\r\n\t\tbackground-size: 100% 100%;\r\n\t}\r\n\r\n\t:deep(.v-tabs__slider) {\r\n\t\tbackground: url(../../assets/img/tab-3.png) no-repeat !important;\r\n\t\tbackground-size: 100% 100% !important;\r\n\t}\r\n}\r\n\r\n:deep(.v-tab::before),\r\n:deep(.v-tab:focus::before),\r\n:deep(.v-tab:hover::before) {\r\n\tbackground-color: transparent !important;\r\n\topacity: 0 !important;\r\n}\r\n\r\n:deep(.v-tabs__slider) {\r\n\theight: 38px !important;\r\n\tbackground: url(../../assets/img/tab-1.png) no-repeat;\r\n\tbackground-size: 100% 100%;\r\n}\r\n\r\n.expBox {\r\n\t:deep(td) {\r\n\t\tborder-bottom: thin solid rgba(123, 123, 123, 0.22);\r\n\t}\r\n\r\n\t:deep(.v-data-table__empty-wrapper td) {\r\n\t\tborder: none;\r\n\t}\r\n\r\n\t:deep(.v-checkbox.v-selection-control--dirty) {\r\n\t\tbackground-color: rgba(33, 149, 243, 0.06) !important;\r\n\r\n\t\t.v-label {\r\n\t\t\tcolor: rgb(33, 150, 243) !important;\r\n\t\t}\r\n\r\n\t\t.active {\r\n\t\t\tcolor: rgb(33, 150, 243);\r\n\t\t\tdisplay: inline-block !important;\r\n\t\t}\r\n\t}\r\n\r\n\t:deep(.v-selection-control__input) {\r\n\t\tdisplay: none;\r\n\t}\r\n\r\n\t:deep(.v-checkbox) {\r\n\t\tpadding: 4px 8px 4px 10px;\r\n\t\tborder-radius: 6px;\r\n\t\tbackground-color: rgba(117, 117, 117, 0.06);\r\n\r\n\t\t.v-label {\r\n\t\t\tmargin-top: 3px;\r\n\t\t\tfont-size: 12px;\r\n\t\t}\r\n\t}\r\n}\r\n</style>\r\n","<template>\r\n <VRadioGroup v-bind=\"attrs\" :modelValue=\"modelValue\" @update:modelValue=\"onUpdate\">\r\n <VRadio\r\n v-for=\"item in items\"\r\n :key=\"item.id || item.code\"\r\n :label=\"item.codeValue\"\r\n :value=\"item.code\"\r\n />\r\n </VRadioGroup>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs } from 'vue';\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkRadio\",\r\n inheritAttrs: false,\r\n});\r\n// 定义 props\r\nconst props = defineProps({\r\n /**\r\n * 字典来源:\r\n * - 静态数据,如:\"0:否/1:是\"\r\n * - 字典键名,如:\"DISABLE_TYPE\"\r\n */\r\n list: {\r\n type: String,\r\n required: true,\r\n },\r\n modelValue: {\r\n type: [String, Number],\r\n default: null,\r\n },\r\n});\r\n\r\n// 定义 emit 事件\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 获取透传属性(替代 $attrs)\r\nconst attrs = useAttrs();\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 处理静态数据\r\nconst statc = () => {\r\n props.list.split('/').forEach(it => {\r\n const [code, codeValue] = it.split(':');\r\n items.value.push({ code, codeValue });\r\n });\r\n};\r\n\r\n// 请求远程字典\r\nconst miscs = async () => {\r\n try {\r\n const res = await Request.getForm(`dict/misc/list/${props.list}`);\r\n items.value = res.data || [];\r\n } catch (error) {\r\n console.error('[VtkRadio] Failed to load dictionary:', error);\r\n items.value = [];\r\n }\r\n};\r\n\r\n// 更新 v-model 值\r\nconst onUpdate = (val) => {\r\n emit('update:modelValue', val);\r\n};\r\n\r\n// 初始化数据\r\nonMounted(() => {\r\n if (props.list.includes(':')) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n</style>","<template>\r\n <div class=\"search\">\r\n <VMenu\r\n v-model=\"menu\"\r\n @update:model-value=\"obtain\"\r\n location=\"bottom end\"\r\n origin=\"top end\"\r\n offset=\"12\"\r\n :close-on-content-click=\"false\"\r\n >\r\n <template v-slot:activator=\"{ props }\">\r\n <VTextField\r\n v-model=\"queryParam.condition\"\r\n :placeholder=\"$attrs.placeholder || '请输入查询内容'\"\r\n :style=\"$attrs.styles\"\r\n class=\"box\"\r\n density=\"compact\"\r\n variant=\"outlined\"\r\n hide-details\r\n @click:append=\"search\"\r\n @keyup.enter=\"search\"\r\n @click:clear=\"(queryParam.condition = ''), search()\"\r\n clearable\r\n >\r\n <template v-slot:append-inner>\r\n <span class=\"search-trigger\" @click.stop=\"search\">\r\n <VIcon class=\"search-icon\" size=\"small\">mdi-magnify</VIcon>\r\n </span>\r\n <span v-bind=\"props\" class=\"search-advanced\">\r\n <span class=\"search-divider\"></span>\r\n <VBadge\r\n dot\r\n :content=\"initialIndex\"\r\n :model-value=\"initialIndex > 0\"\r\n color=\"error\"\r\n class=\"advanced-badge\"\r\n >\r\n <span\r\n class=\"pl-1 text-blue vtk-cursor-pointer d-inline-flex align-center text-body-2\"\r\n >\r\n 高级\r\n </span>\r\n </VBadge>\r\n </span>\r\n </template>\r\n </VTextField>\r\n </template>\r\n\r\n <VCard class=\"search-panel\">\r\n <VCardTitle class=\"pr-3 d-flex justify-space-between align-center pb-5\">\r\n <span>高级搜索</span>\r\n <VBtn class=\"mx-0\" variant=\"text\" icon @click=\"close\" size=\"small\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </VCardTitle>\r\n\r\n <VCardText class=\"search-panel__body\">\r\n <div class=\"search-panel__content\" :style=\"contentStyle\">\r\n <slot :query-param=\"queryParam\"></slot>\r\n </div>\r\n </VCardText>\r\n\r\n <VCardActions class=\"pt-0 px-4 pb-3\">\r\n <slot name=\"actions\"></slot>\r\n <VSpacer />\r\n <VBtn @click=\"search\" variant=\"flat\" color=\"primary\">\r\n <VIcon class=\"mr-1\">mdi-magnify</VIcon>搜索\r\n </VBtn>\r\n <VBtn @click=\"handleResetClick\" variant=\"flat\" color=\"error\">\r\n <VIcon class=\"mr-1\">mdi-sync</VIcon>重置\r\n </VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VMenu>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, getCurrentInstance, onMounted, ref, watch } from 'vue';\r\n\r\ndefineOptions({\r\n name: \"VtkSearch\"\r\n});\r\n\r\nconst props = defineProps({\r\n value: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n contentMinHeight: {\r\n type: [Number, String],\r\n default: 0\r\n },\r\n contentMaxHeight: {\r\n type: [Number, String],\r\n default: 360\r\n }\r\n});\r\n\r\nconst emit = defineEmits(['update:value', 'search', 'reset']);\r\nconst instance = getCurrentInstance();\r\n\r\nconst user = ref({});\r\nconst menu = ref(false);\r\n\r\nconst cloneValue = (val) => {\r\n if (Array.isArray(val)) return [...val];\r\n if (val && typeof val === 'object') return { ...val };\r\n return val;\r\n};\r\n\r\nconst cloneQueryParam = (source = {}) => {\r\n return Object.fromEntries(Object.entries(source || {}).map(([key, val]) => [key, cloneValue(val)]));\r\n};\r\n\r\nconst isSameValue = (a, b) => {\r\n if (\r\n Array.isArray(a) ||\r\n Array.isArray(b) ||\r\n (a && typeof a === 'object') ||\r\n (b && typeof b === 'object')\r\n ) {\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n }\r\n\r\n return a === b;\r\n};\r\n\r\nconst queryParam = ref(cloneQueryParam(props.value));\r\nconst initialQueryParam = ref(cloneQueryParam(props.value));\r\nconst externalQueryParam = ref(cloneQueryParam(props.value));\r\n\r\nconst initialIndex = computed(() => {\r\n return Object.entries(queryParam.value).filter(([key, val]) => {\r\n if (key === 'condition') return false;\r\n const initVal = initialQueryParam.value[key];\r\n return !isSameValue(val, initVal);\r\n }).length;\r\n});\r\n\r\nconst contentStyle = computed(() => {\r\n const minValue = props.contentMinHeight;\r\n const maxValue = props.contentMaxHeight;\r\n const minHeight = typeof minValue === 'number' ? `${minValue}px` : minValue;\r\n const maxHeight = typeof maxValue === 'number' ? `${maxValue}px` : maxValue;\r\n\r\n return {\r\n ...(minValue ? { minHeight } : {}),\r\n maxHeight,\r\n };\r\n});\r\n\r\nwatch(\r\n () => props.value,\r\n (newVal = {}) => {\r\n const nextExternalQueryParam = cloneQueryParam(newVal);\r\n const nextQueryParam = { ...queryParam.value };\r\n\r\n Object.entries(nextExternalQueryParam).forEach(([key, val]) => {\r\n if (!isSameValue(val, externalQueryParam.value[key])) {\r\n nextQueryParam[key] = cloneValue(val);\r\n }\r\n });\r\n\r\n Object.keys(externalQueryParam.value).forEach((key) => {\r\n if (!(key in nextExternalQueryParam)) {\r\n delete nextQueryParam[key];\r\n }\r\n });\r\n\r\n queryParam.value = nextQueryParam;\r\n externalQueryParam.value = nextExternalQueryParam;\r\n },\r\n { deep: true }\r\n);\r\n\r\nonMounted(() => {\r\n user.value = JSON.parse(localStorage.getItem(\"_mis_acis_users\") || \"{}\");\r\n});\r\n\r\nconst obtain = () => {};\r\n\r\nconst close = () => {\r\n menu.value = false;\r\n obtain();\r\n};\r\n\r\nconst filterNull = (obj) => {\r\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== null && v !== undefined));\r\n};\r\n\r\nconst search = () => {\r\n close();\r\n emit('update:value', filterNull(queryParam.value));\r\n emit(\"search\");\r\n};\r\n\r\nconst reset = () => {\r\n queryParam.value = {\r\n ...initialQueryParam.value,\r\n condition: ''\r\n };\r\n emit('update:value', filterNull(queryParam.value));\r\n emit(\"search\");\r\n menu.value = false;\r\n};\r\n\r\nconst handleResetClick = () => {\r\n const hasParentResetHandler = Boolean(instance?.vnode.props?.onReset);\r\n\r\n if (hasParentResetHandler) {\r\n emit('reset', { ...queryParam.value });\r\n return;\r\n }\r\n\r\n reset();\r\n};\r\n\r\ndefineExpose({ search, reset });\r\n\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.search {\r\n position: relative;\r\n min-width: 380px;\r\n min-height: 40px;\r\n}\r\n\r\n.box {\r\n min-width: 380px;\r\n min-height: 40px;\r\n}\r\n\r\n.search-panel {\r\n width: 380px;\r\n margin-right: -13px;\r\n overflow: visible;\r\n}\r\n\r\n.search-panel__body {\r\n overflow: visible;\r\n}\r\n\r\n.search-panel__content {\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n scrollbar-gutter: stable;\r\n scrollbar-color: rgb(var(--v-theme-primary)) transparent;\r\n scrollbar-width: thin;\r\n}\r\n\r\n\r\n.search-panel__content::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n.search-panel__content::-webkit-scrollbar-thumb {\r\n background: rgb(var(--v-theme-primary));\r\n}\r\n\r\n:deep(.box .v-field__append-inner) {\r\n cursor: pointer;\r\n padding-left: 4px !important;\r\n min-width: 50px;\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n:deep(.advanced-badge .v-badge__badge) {\r\n transform: translate(8px, -2px);\r\n}\r\n\r\n.search-trigger {\r\n flex-shrink: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n align-self: stretch;\r\n /* 搜索热区铺满「放大镜 → 竖线」整段:右侧 10px 即图标与竖线之间的空白,\r\n 竖线的左边距已并入此处,点击该区域执行搜索(不再落到高级弹窗热区) */\r\n padding: 1px 10px 0 0;\r\n cursor: pointer;\r\n}\r\n\r\n.search-advanced {\r\n flex-shrink: 0;\r\n white-space: nowrap;\r\n display: inline-flex;\r\n align-items: center;\r\n align-self: stretch;\r\n /* 高级热区从竖线开始:右侧 12px 补 .v-field--appended 的 padding-inline-end,\r\n 负外边距抵消 padding,视觉与布局保持原样 */\r\n padding: 1px 12px 0 0;\r\n margin-right: -12px;\r\n cursor: pointer;\r\n}\r\n\r\n.search-divider {\r\n width: 1px;\r\n align-self: stretch;\r\n margin: 0 8px 0 0;\r\n background: #cccccc88;\r\n flex-shrink: 0;\r\n}\r\n\r\n.search-icon {\r\n transition: color 0.2s;\r\n}\r\n\r\n.search-trigger:hover .search-icon {\r\n color: rgb(var(--v-theme-primary));\r\n}\r\n</style>\r\n","<template>\r\n <VSelect \r\n v-bind=\"filteredAttrs\" \r\n :items=\"items\" \r\n item-title=\"codeValue\" \r\n item-value=\"code\" \r\n :multiple=\"multi\"\r\n :menu-props=\"{ offsetY: true }\" \r\n @update:model-value=\"$emit('update:modelValue', $event)\"\r\n />\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs, computed } from 'vue'\r\nimport Request from \"../../commons/request\";\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n name: \"VtkSelect\",\r\n inheritAttrs: false\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 数据库字段名字(DISABLE_TYPE) 或 静态的字段(0:否/1:是)\r\n list: {\r\n type: String,\r\n default: null,\r\n },\r\n multi: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 获取所有传递的属性\r\nconst attrs = useAttrs();\r\n\r\n// 过滤属性,排除组件内部使用的属性\r\nconst filteredAttrs = computed(() => {\r\n const { list, multi, ...rest } = attrs;\r\n return rest;\r\n});\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 方法定义\r\nconst miscs = () => {\r\n Request.getForm(`dict/misc/list/${props.list}`).then((res) => {\r\n items.value = res.data;\r\n });\r\n};\r\n\r\nconst statc = () => {\r\n if (!props.list) return;\r\n \r\n props.list.split(\"/\").forEach((it) => {\r\n const its = it.split(\":\");\r\n items.value.push({ code: its[0], codeValue: its[1] });\r\n });\r\n};\r\n\r\n// 生命周期钩子\r\nonMounted(() => {\r\n if (props.list) {\r\n if (props.list.includes(\":\")) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n }\r\n});\r\n\r\n// 使用方式\r\n// <vtk-select\r\n// v-model=\"value\"\r\n// list=\"YOUR_LIST\"\r\n// variant=\"outlined\" <!-- 样式变体 -->\r\n// density=\"compact\" <!-- 密度 'default' | 'comfortable' | 'compact' -->\r\n// clearable <!-- 可清除 -->\r\n// placeholder=\"请选择\" <!-- 占位符 -->\r\n// :rules=\"rules\" <!-- 验证规则 -->\r\n// disabled <!-- 禁用状态 -->\r\n// readonly <!-- 只读状态 -->\r\n// hide-details <!-- 隐藏详情信息 -->\r\n// />\r\n\r\n</script>\r\n\r\n<style scoped>\r\n::-webkit-scrollbar {\r\n width: 6px;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n border-radius: 3px;\r\n height: 100px;\r\n background-color: #007acc;\r\n}\r\n</style>","<template>\n <div class=\"vtk-single-page\">\n <v-row class=\"pagination-row ma-0\" align=\"center\" justify=\"end\">\n <template v-if=\"hasTotal\">\n <span class=\"page-total d-none d-md-flex\">共 {{ rowCount }} 条</span>\n\n <v-select\n v-model=\"pagination.limit\"\n :items=\"pageSizeItems\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n class=\"page-select ml-2 d-none d-md-flex\"\n @update:model-value=\"handlePageSizeChange\"\n />\n\n <v-pagination\n v-model=\"currentPage\"\n :length=\"pageCount\"\n :total-visible=\"6\"\n density=\"comfortable\"\n size=\"small\"\n class=\"page-pagination\"\n @update:model-value=\"emitPageChange\"\n />\n\n <span class=\"page-total ml-2 d-none d-md-flex\">到</span>\n <v-text-field\n v-model=\"pagination.pageno\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n inputmode=\"numeric\"\n class=\"page-go ml-2 d-none d-md-flex\"\n @keyup.enter=\"goToPage\"\n />\n <span class=\"page-total ml-2 d-none d-md-flex\">页</span>\n </template>\n\n <template v-else>\n <span class=\"page-total d-none d-md-flex\">第 {{ currentPage }} 页</span>\n\n <v-select\n v-model=\"pagination.limit\"\n :items=\"pageSizeItems\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n class=\"page-select ml-2 d-none d-md-flex\"\n @update:model-value=\"handlePageSizeChange\"\n />\n\n <div class=\"d-flex\">\n <v-btn\n variant=\"outlined\"\n size=\"small\"\n height=\"36\"\n\t\t\tclass=\"mr-2\"\n :disabled=\"currentPage <= 1\"\n @click=\"previousPage\"\n >\n 上一页\n </v-btn>\n <v-btn\n variant=\"outlined\"\n size=\"small\"\n height=\"36\"\n :disabled=\"!hasNextPage\"\n @click=\"nextPage\"\n >\n 下一页\n </v-btn>\n </div>\n </template>\n </v-row>\n </div>\n</template>\n\n<script setup>\nimport { computed, reactive, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkSinglePage'\n});\n\nconst props = defineProps({\n pageData: {\n type: Object,\n default: () => ({})\n },\n pageSizes: {\n type: Array,\n default: () => [15, 20, 30]\n }\n});\n\nconst emit = defineEmits(['pageChange']);\n\nconst normalizePositiveInteger = (value, fallback = 1) => {\n const parsedValue = Number.parseInt(value, 10);\n return Number.isInteger(parsedValue) && parsedValue > 0 ? parsedValue : fallback;\n};\n\nconst initialLimit = computed(() => normalizePositiveInteger(props.pageSizes[0], 15));\nconst currentPage = ref(normalizePositiveInteger(props.pageData.pageno));\nconst pagination = reactive({\n pageno: currentPage.value,\n limit: normalizePositiveInteger(props.pageData.limit, initialLimit.value)\n});\n\nconst rowCount = computed(() => Math.max(0, Number(props.pageData.rowCount) || 0));\nconst pageCount = computed(() => normalizePositiveInteger(props.pageData.pageCount));\nconst hasTotal = computed(() => rowCount.value > 0);\nconst pageSizeItems = computed(() => props.pageSizes.map(value => ({\n title: `${value} 条/页`,\n value\n})));\nconst rowLength = computed(() => {\n if (Array.isArray(props.pageData.rows)) {\n return props.pageData.rows.length;\n }\n\n return Number.isFinite(Number(props.pageData.rows))\n ? Number(props.pageData.rows)\n : null;\n});\nconst hasNextPage = computed(() => (\n rowLength.value === null || rowLength.value >= Number(pagination.limit)\n));\n\nwatch(\n () => props.pageData,\n newValue => {\n currentPage.value = normalizePositiveInteger(newValue.pageno, currentPage.value);\n pagination.pageno = currentPage.value;\n\n if (newValue.limit != null) {\n pagination.limit = normalizePositiveInteger(newValue.limit, pagination.limit);\n }\n },\n { deep: true }\n);\n\nwatch(currentPage, value => {\n pagination.pageno = value;\n});\n\nwatch(\n () => props.pageSizes,\n values => {\n if (!values.some(value => Number(value) === Number(pagination.limit))) {\n pagination.limit = initialLimit.value;\n }\n },\n { deep: true }\n);\n\nconst emitPageChange = () => {\n emit('pageChange', {\n pageno: currentPage.value,\n limit: Number(pagination.limit)\n });\n};\n\nconst goToPage = () => {\n const targetPage = Number(pagination.pageno);\n\n if (Number.isInteger(targetPage) && targetPage >= 1 && targetPage <= pageCount.value) {\n currentPage.value = targetPage;\n emitPageChange();\n return;\n }\n\n pagination.pageno = currentPage.value;\n};\n\nconst handlePageSizeChange = () => {\n currentPage.value = 1;\n emitPageChange();\n};\n\nconst previousPage = () => {\n if (currentPage.value <= 1) return;\n\n currentPage.value -= 1;\n emitPageChange();\n};\n\nconst nextPage = () => {\n if (!hasNextPage.value) return;\n\n currentPage.value += 1;\n emitPageChange();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.vtk-single-page {\n width: 100%;\n min-height: 60px;\n}\n\n.pagination-row {\n min-height: 60px;\n padding: 8px 16px;\n}\n\n.page-total {\n align-items: center;\n min-height: 36px;\n color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));\n font-size: 13px;\n}\n\n.page-select {\n max-width: 120px;\n}\n\n.page-go {\n max-width: 72px;\n}\n\n.page-select,\n.page-go {\n :deep(.v-input__control),\n :deep(.v-field) {\n min-height: 36px;\n height: 36px;\n font-size: 13px;\n }\n\n :deep(.v-field__input) {\n min-height: 36px;\n padding-top: 4px;\n padding-bottom: 4px;\n }\n}\n\n.page-pagination {\n :deep(.v-pagination__item),\n :deep(.v-pagination__prev),\n :deep(.v-pagination__next) {\n font-size: 13px;\n }\n}\n</style>\n","<template>\r\n\t<VStepper class=\"elevation-0\" v-model=\"stepIndex\">\r\n\t\t<VStepperHeader class=\"elevation-0\" style=\"overflow: hidden;\">\r\n\t\t\t<VRow class=\"stepList\">\r\n\t\t\t\t<VCol class=\"pl-0 colItem\" v-for=\"(item, index) in step\" :key=\"index\" style=\"\">\r\n\t\t\t\t\t<div class=\"first-box1 last-box pl-10 py-5 stepItem\" :class=\"stepIndex > index? 'selected' : ''\"\r\n\t\t\t\t\t\t:complete=\"stepIndex > index\" :step=\"index + 1\">\r\n\t\t\t\t\t\t{{ item }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</VCol>\r\n\t\t\t</VRow>\r\n\t\t</VStepperHeader>\r\n\r\n\t\t<VStepperWindow>\r\n\t\t\t<VStepperWindowItem v-for=\"(item, index) in list\" :key=\"index\" :value=\"index + 1\">\r\n\t\t\t\t<slot :name=\"index + 1\"></slot>\r\n\t\t\t</VStepperWindowItem>\r\n\t\t\t<slot></slot>\r\n\t\t</VStepperWindow>\r\n\t</VStepper>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onMounted } from 'vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n\tname: \"VtkStepper\",\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n\tlist: {\r\n\t\ttype: String,\r\n\t\tdefault: null,\r\n\t},\r\n\tel: {\r\n\t\ttype: Number,\r\n\t\tdefault: 1,\r\n\t},\r\n});\r\n\r\n// 响应式数据\r\nconst stepIndex = ref(props.el);\r\nconst step = ref([]);\r\n\r\n// 监听el属性变化\r\nwatch(() => props.el, (val) => {\r\n\tstepIndex.value = val;\r\n});\r\n\r\n// 处理内容\r\nconst content = () => {\r\n\tif (props.list) {\r\n\t\tstep.value = props.list.split(\",\");\r\n\t}\r\n};\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\tcontent();\r\n});\r\n\r\n// 监听list变化\r\nwatch(() => props.list, () => {\r\n\tcontent();\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// 颜色变量定义\r\n$color-background: #c7ccd538;\r\n$color-selected: #165dff;\r\n$color-white: #fff;\r\n$color-light-bg: #f2f3f5;\r\n$color-dark-bg: #1e1e1e;\r\n\r\n.v-stepper__step {\r\n\tbackground: $color-background;\r\n\tposition: relative;\r\n}\r\n\r\n// 隐藏步骤数字\r\n:deep(.v-stepper__step__step) {\r\n\tdisplay: none !important;\r\n}\r\n\r\n.stepItem {\r\n\talign-items: center;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tpadding: 24px;\r\n\tposition: relative;\r\n\tbackground: $color-background;\r\n\r\n\t// 暗色主题样式\r\n\t.v-theme--dark & {\r\n\t\tcolor: rgba(255, 255, 255, 0.5);\r\n\t}\r\n\r\n\t// 选中状态\r\n\t&.selected {\r\n\t\tbackground: $color-selected;\r\n\t\tcolor: $color-white !important;\r\n\r\n\t\t&.last-box::after {\r\n\t\t\tborder-color: transparent transparent transparent $color-selected;\r\n\t\t}\r\n\r\n\t\t:deep(.v-stepper__label) {\r\n\t\t\tcolor: $color-white !important;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.colItem {\r\n\t&:first-child .first-box1::before {\r\n\t\tborder-color: transparent !important;\r\n\t}\r\n\r\n\t&:last-child .last-box::after {\r\n\t\tborder-color: transparent !important;\r\n\t}\r\n}\r\n\r\n.first-box1::before {\r\n\tposition: absolute;\r\n\tleft: 0;\r\n\tcontent: \"\";\r\n\twidth: 0;\r\n\theight: 0;\r\n\tz-index: 0;\r\n\tborder: 30px solid;\r\n\tborder-color: transparent transparent transparent rgb(var(--v-theme-surface));\r\n\r\n\t.v-theme--dark & {\r\n\t\tborder-color: transparent transparent transparent rgb(var(--v-theme-surface));\r\n\t}\r\n}\r\n\r\n.last-box::after {\r\n\tposition: absolute;\r\n\tright: -70px;\r\n\tcontent: \"\";\r\n\tz-index: 1;\r\n\twidth: 0;\r\n\theight: 0;\r\n\tborder: 35px solid;\r\n\tborder-color: transparent transparent transparent $color-light-bg;\r\n\r\n\t.v-theme--dark & {\r\n\t\tborder-color: transparent transparent transparent $color-background;\r\n\t}\r\n}\r\n\r\n.theme--dark.v-stepper {\r\n\tbackground: transparent;\r\n}\r\n</style>","<template>\n <div class=\"vtk-upload\">\n <!-- 拖拽 / 点击上传区域 -->\n <div\n v-if=\"listType !== 'picture-card' && !detail\"\n :class=\"['vtk-upload__dragger', { 'is-dragover': isDragover, 'is-disabled': disabled }]\"\n title=\"点击上传\"\n @click=\"!disabled && triggerInput()\"\n @dragover.prevent=\"onDragover\"\n @dragleave.prevent=\"isDragover = false\"\n @drop.prevent=\"onDrop\"\n >\n <slot>\n <div class=\"vtk-upload__dragger-inner\">\n <VIcon size=\"40\" color=\"grey-lighten-1\">mdi-cloud-upload-outline</VIcon>\n <div class=\"text-body-2 mt-2 text-grey\">将文件拖到此处,或 <span class=\"text-primary\" style=\"cursor:pointer\">点击上传</span></div>\n <div v-if=\"tip\" class=\"text-caption text-grey-lighten-1 mt-1\">{{ tip }}</div>\n </div>\n </slot>\n </div>\n\n <!-- picture-card 模式 -->\n <div v-if=\"listType === 'picture-card'\" class=\"vtk-upload__picture-card-wrap\">\n <div\n v-for=\"file in fileList\"\n :key=\"file.uid\"\n class=\"vtk-upload__picture-card-item\"\n >\n <v-img :key=\"file.url || file.preview || file.uid\" :src=\"file.url || file.preview\" cover class=\"fill-height\" />\n <div class=\"vtk-upload__picture-card-mask\">\n <VBtn icon size=\"x-small\" variant=\"text\" color=\"white\" title=\"查看\" @click.stop=\"handlePreview(file)\">\n <VIcon>mdi-eye</VIcon>\n </VBtn>\n <VBtn v-if=\"!disabled && !detail\" icon size=\"x-small\" variant=\"text\" color=\"white\" title=\"删除\" @click.stop=\"handleRemove(file)\">\n <VIcon>mdi-delete</VIcon>\n </VBtn>\n </div>\n <!-- 上传进度 -->\n <div v-if=\"file.status === 'uploading'\" class=\"vtk-upload__picture-card-progress\">\n <v-progress-circular :model-value=\"file.percentage\" size=\"36\" color=\"white\" />\n </div>\n </div>\n\n <!-- 添加按钮 -->\n <div\n v-if=\"!disabled && !detail && (limit === 0 || fileList.length < limit)\"\n :class=\"['vtk-upload__picture-card-add', { 'is-dragover': isDragover }]\"\n title=\"添加文件\"\n @click=\"triggerInput()\"\n @dragover.prevent=\"onDragover\"\n @dragleave.prevent=\"isDragover = false\"\n @drop.prevent=\"onDrop\"\n >\n <VIcon size=\"28\" color=\"grey-lighten-1\">mdi-plus</VIcon>\n </div>\n </div>\n\n <!-- 隐藏的 input -->\n <input\n ref=\"inputRef\"\n type=\"file\"\n class=\"vtk-upload__input\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n @change=\"onInputChange\"\n />\n\n <!-- 文件列表 (非 picture-card) -->\n <div v-if=\"showFileList && listType !== 'picture-card' && fileList.length > 0\" class=\"vtk-upload__list mt-2\">\n <div\n v-for=\"file in fileList\"\n :key=\"file.uid\"\n :class=\"['vtk-upload__list-item', `is-${file.status}`]\"\n style=\"cursor: pointer;\"\n >\n <VIcon size=\"18\" class=\"mr-1\" :color=\"file.status === 'error' ? 'error' : 'primary'\">\n {{ fileIcon(file) }}\n </VIcon>\n <span class=\"vtk-upload__list-item-name flex-grow-1 text-truncate\" @click=\"handlePreview(file)\" :title=\"file.name\">{{ file.name }}</span>\n <span v-if=\"file.status === 'uploading'\" class=\"text-caption text-grey ml-2\">{{ file.percentage }}%</span>\n <VBtn\n v-if=\"!disabled && !detail\"\n icon\n size=\"x-small\"\n variant=\"text\"\n color=\"grey\"\n class=\"ml-1\"\n title=\"删除\"\n @click=\"handleRemove(file)\"\n >\n <VIcon size=\"16\">mdi-close</VIcon>\n </VBtn>\n <!-- 进度条 -->\n <v-progress-linear\n v-if=\"file.status === 'uploading'\"\n :model-value=\"file.percentage\"\n color=\"primary\"\n class=\"vtk-upload__list-progress\"\n height=\"2\"\n />\n </div>\n </div>\n\n <!-- 预览 Dialog -->\n <VDialog v-model=\"previewVisible\" fullscreen scrollable @click:outside=\"closePreview\">\n <VCard class=\"vtk-upload__preview-card\">\n <v-toolbar color=\"primary\" density=\"comfortable\">\n <v-toolbar-title class=\"text-truncate\">{{ previewFile?.name }}</v-toolbar-title>\n <VSpacer />\n <VBtn icon variant=\"text\" title=\"新窗口打开\" @click=\"openCurrentPreview\">\n <VIcon>mdi-open-in-new</VIcon>\n </VBtn>\n <template v-if=\"isImage(previewFile)\">\n <VBtn icon variant=\"text\" :disabled=\"!hasPreviewPrev\" title=\"上一张\" @click=\"switchPreviewImage(-1)\">\n <VIcon>mdi-chevron-left</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" :disabled=\"!hasPreviewNext\" title=\"下一张\" @click=\"switchPreviewImage(1)\">\n <VIcon>mdi-chevron-right</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"缩小\" @click=\"zoomPreview(-0.3)\">\n <VIcon>mdi-magnify-minus-outline</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"放大\" @click=\"zoomPreview(0.3)\">\n <VIcon>mdi-magnify-plus-outline</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"向左旋转\" @click=\"rotatePreview(-90)\">\n <VIcon>mdi-rotate-left</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"向右旋转\" @click=\"rotatePreview(90)\">\n <VIcon>mdi-rotate-right</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"重置\" @click=\"resetPreviewTransform\">\n <VIcon>mdi-refresh</VIcon>\n </VBtn>\n </template>\n <VBtn icon variant=\"text\" title=\"关闭\" @click=\"closePreview\">\n <VIcon>mdi-close</VIcon>\n </VBtn>\n </v-toolbar>\n <div class=\"vtk-upload__preview-body\">\n <VBtn\n v-if=\"isImage(previewFile) && hasPreviewPrev\"\n icon\n class=\"vtk-upload__preview-nav vtk-upload__preview-nav--prev\"\n title=\"上一张\"\n @click.stop=\"switchPreviewImage(-1)\"\n >\n <VIcon size=\"36\">mdi-chevron-left</VIcon>\n </VBtn>\n <VBtn\n v-if=\"isImage(previewFile) && hasPreviewNext\"\n icon\n class=\"vtk-upload__preview-nav vtk-upload__preview-nav--next\"\n title=\"下一张\"\n @click.stop=\"switchPreviewImage(1)\"\n >\n <VIcon size=\"36\">mdi-chevron-right</VIcon>\n </VBtn>\n <div v-if=\"isImage(previewFile)\" class=\"vtk-upload__preview-image-wrap\">\n <img\n class=\"vtk-upload__preview-image\"\n :src=\"previewFile?._previewSrc\"\n :alt=\"previewFile?.name\"\n :style=\"previewImageStyle\"\n draggable=\"false\"\n @pointerdown=\"startPreviewDrag\"\n />\n </div>\n <div v-else class=\"vtk-upload__preview-empty\">\n <VIcon size=\"64\">{{ isExcel(previewFile) ? 'mdi-microsoft-excel' : 'mdi-file-outline' }}</VIcon>\n <div class=\"mt-2\">{{ previewFile?.name }}</div>\n <div class=\"text-caption mt-1\">This file cannot be previewed online.</div>\n </div>\n </div>\n </VCard>\n </VDialog>\n </div>\n</template>\n\n<script setup>\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\nimport Request from '../../commons/request.js';\n\ndefineOptions({\n name: 'VtkUpload',\n inheritAttrs: false,\n});\n\nconst props = defineProps({\n /** v-model 文件列表 */\n modelValue: {\n type: Array,\n default: () => [],\n },\n /** 上传地址 */\n action: {\n type: String,\n default: '',\n },\n /** 接受的文件类型,同原生 accept */\n accept: {\n type: String,\n default: '',\n },\n /** 是否多选 */\n multiple: {\n type: Boolean,\n default: false,\n },\n /** 最大上传数量,0 表示不限制 */\n limit: {\n type: Number,\n default: 0,\n },\n /** 单文件最大体积,单位 MB,0 表示不限制 */\n maxSize: {\n type: Number,\n default: 0,\n },\n /** 单张图片最大像素(宽*高),超过则拒绝上传;传 0 表示不限制 */\n maxPixels: {\n type: Number,\n default: 50_000_000,\n },\n /** 列表类型:text | picture | picture-card */\n listType: {\n type: String,\n default: 'text',\n validator: (v) => ['text', 'picture', 'picture-card'].includes(v),\n },\n /** 是否显示文件列表 */\n showFileList: {\n type: Boolean,\n default: true,\n },\n /** 是否自动上传 */\n autoUpload: {\n type: Boolean,\n default: true,\n },\n /** 是否禁用 */\n disabled: {\n type: Boolean,\n default: false,\n },\n /** 详情模式:隐藏上传和删除入口,仅展示已上传文件并保留查看 */\n detail: {\n type: Boolean,\n default: false,\n },\n /** 附加请求头 */\n headers: {\n type: Object,\n default: () => ({}),\n },\n /** 附加请求数据 */\n data: {\n type: Object,\n default: () => ({}),\n },\n /** 文件字段名 */\n name: {\n type: String,\n default: 'file',\n },\n /** 提示文字 */\n tip: {\n type: String,\n default: '',\n },\n /** 上传前钩子,返回 false 或 rejected Promise 则停止上传 */\n beforeUpload: {\n type: Function,\n default: null,\n },\n /** 移除前钩子 */\n beforeRemove: {\n type: Function,\n default: null,\n },\n});\n\nconst emit = defineEmits([\n 'update:modelValue',\n 'change',\n 'success',\n 'error',\n 'progress',\n 'remove',\n 'exceed',\n 'preview',\n]);\n\n/* -------------------- 内部状态 -------------------- */\nconst inputRef = ref(null);\nconst isDragover = ref(false);\nconst previewVisible = ref(false);\nconst previewFile = ref(null);\nconst previewScale = ref(1);\nconst previewRotation = ref(0);\nconst previewTranslateX = ref(0);\nconst previewTranslateY = ref(0);\nconst previewDragState = ref(null);\n\n// 内部维护文件列表\nconst fileList = ref([]);\nlet isSyncingModel = false;\nconst localPreviewUrls = new Set();\n\nwatch(\n () => props.modelValue,\n (val) => {\n if (isSyncingModel) {\n isSyncingModel = false;\n return;\n }\n\n // Accept external URL lists or file object lists.\n revokeAllLocalPreviews();\n fileList.value = normalizeFileList(val || []);\n },\n);\n\n/* -------------------- 工具函数 -------------------- */\nlet uidCounter = 0;\nconst genUid = () => `vtk-upload-${Date.now()}-${uidCounter++}`;\n\nconst getFileNameFromUrl = (url) => {\n const cleanUrl = String(url || '').split('?')[0].split('#')[0];\n const name = cleanUrl.substring(cleanUrl.lastIndexOf('/') + 1);\n try {\n return decodeURIComponent(name || cleanUrl || 'file');\n } catch (e) {\n return name || cleanUrl || 'file';\n }\n};\n\nconst isImageUrl = (url) => {\n const value = String(url || '');\n const cleanUrl = value.split('?')[0].split('#')[0];\n return /^data:image\\//i.test(value) || /\\.(png|jpg|jpeg|gif|bmp|webp|svg)$/i.test(cleanUrl);\n};\n\nconst readUInt16BE = (bytes, offset) => (bytes[offset] << 8) | bytes[offset + 1];\nconst readUInt16LE = (bytes, offset) => bytes[offset] | (bytes[offset + 1] << 8);\nconst readUInt32BE = (bytes, offset) => (\n ((bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3]) >>> 0\n);\n\n// 按字节解析图片头部宽高(PNG / JPEG / GIF / WEBP),禁止整图解码。\n// 与 VtkImg.vue 的解析保持同一套实现,避免两处漂移。\nconst parseDimensions = (bytes) => {\n const length = bytes.length;\n if (length < 24) return { w: 0, h: 0 };\n\n // PNG:魔数 89 50 4E 47,IHDR 后宽 16 / 高 20(大端 uint32)\n if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {\n return { w: readUInt32BE(bytes, 16), h: readUInt32BE(bytes, 20) };\n }\n\n // GIF:魔数 GIF8,宽 6-7 / 高 8-9(小端 uint16)\n if (bytes[0] === 0x47 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x38) {\n return { w: readUInt16LE(bytes, 6), h: readUInt16LE(bytes, 8) };\n }\n\n // JPEG:扫 SOF 段(0xC0–0xCF,排除 C4/C8/CC),以 marker 为基准:高在 +4、宽在 +6(大端 uint16)\n if (bytes[0] === 0xff && bytes[1] === 0xd8) {\n const sofMarkers = new Set([\n 0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf,\n ]);\n let offset = 2;\n while (offset + 9 < length) {\n if (bytes[offset] !== 0xff) { offset += 1; continue; }\n let p = offset;\n while (p < length && bytes[p] === 0xff) p += 1; // 跳过填充 0xFF,p 落在 marker 上\n if (p >= length - 1) break;\n const marker = bytes[p];\n if (marker === 0x00 || marker === 0xd8 || marker === 0xd9) { offset = p + 1; continue; }\n if (sofMarkers.has(marker)) {\n // 段结构 [FF][marker][len:2][precision:1][height:2][width:2],一律以 marker 为基准\n return { w: readUInt16BE(bytes, p + 6), h: readUInt16BE(bytes, p + 4) };\n }\n if (p + 2 >= length) break;\n // 段长字段在 marker 之后的 p+1 / p+2\n const segLength = readUInt16BE(bytes, p + 1);\n if (segLength < 2) break;\n offset = p + 1 + segLength;\n }\n }\n\n // WEBP:RIFF....WEBP\n if (\n length >= 30\n && bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46\n && bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50\n ) {\n const fourcc = String.fromCharCode(bytes[12], bytes[13], bytes[14], bytes[15]);\n if (fourcc === 'VP8X') {\n return {\n w: 1 + (bytes[24] | (bytes[25] << 8) | (bytes[26] << 16)),\n h: 1 + (bytes[27] | (bytes[28] << 8) | (bytes[29] << 16)),\n };\n }\n if (fourcc === 'VP8 ') {\n return {\n w: bytes[26] | ((bytes[27] & 0x3f) << 8),\n h: bytes[28] | ((bytes[29] & 0x3f) << 8),\n };\n }\n if (fourcc === 'VP8L' && length >= 25) {\n // VP8L:width-1 占低 14 位,height-1 占次 14 位(小端 32 位)\n const bits = (bytes[21] | (bytes[22] << 8) | (bytes[23] << 16) | ((bytes[24] << 24) >>> 0)) >>> 0;\n return { w: 1 + (bits & 0x3fff), h: 1 + ((bits >> 14) & 0x3fff) };\n }\n }\n\n return { w: 0, h: 0 };\n};\n\n// 只读本地文件头部 64KB 拿尺寸;解析不出(非以上格式 / 字节不足)返回 null\nconst parseImageSizeFromFile = async (raw) => {\n if (!(raw instanceof Blob)) return null;\n try {\n const buffer = await raw.slice(0, 64 * 1024).arrayBuffer();\n const { w, h } = parseDimensions(new Uint8Array(buffer));\n if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) return null;\n return { w, h };\n } catch (error) {\n return null;\n }\n};\n\n// 像素数格式化:1234万 / 5亿 / 5000万\nconst formatPixelCount = (value) => {\n if (value >= 1e8) return `${Number((value / 1e8).toFixed(1))}亿`;\n if (value >= 1e4) return `${Math.round(value / 1e4)}万`;\n return String(value);\n};\n\n// 拦截反馈:优先用全局 toast,找不到则降级 alert\nconst showBlockMessage = (message) => {\n try {\n const toast = window.$vtk?.message?.toast;\n if (typeof toast === 'function') {\n toast(message, { color: 'error' });\n return;\n }\n } catch (error) {\n console.warn('VtkUpload: failed to show message toast', error);\n }\n window.alert?.(message);\n};\n\nconst normalizeFileList = (value) => {\n if (!Array.isArray(value)) return [];\n\n return value\n .filter((item) => item)\n .map((item) => {\n if (typeof item === 'string') {\n return {\n uid: genUid(),\n name: getFileNameFromUrl(item),\n size: 0,\n type: props.listType === 'picture-card' || isImageUrl(item) ? 'image/*' : '',\n status: 'success',\n percentage: 100,\n raw: null,\n url: item,\n preview: '',\n response: null,\n };\n }\n\n return {\n uid: item.uid || genUid(),\n name: item.name || getFileNameFromUrl(item.url || item.preview),\n size: item.size || 0,\n type: item.type || (props.listType === 'picture-card' && (item.url || item.preview) ? 'image/*' : ''),\n status: item.status || 'success',\n percentage: item.percentage ?? 100,\n raw: item.raw || null,\n url: item.url || '',\n preview: item.preview || '',\n response: item.response || null,\n ...item,\n };\n });\n};\n\nfileList.value = normalizeFileList(props.modelValue || []);\n\nconst isImage = (file) => {\n if (!file) return false;\n return /image\\//.test(file.type) || isImageUrl(file.name) || isImageUrl(file.url) || isImageUrl(file.preview);\n};\n\nconst fileIcon = (file) => {\n if (file.status === 'error') return 'mdi-file-alert-outline';\n if (isImage(file)) return 'mdi-file-image-outline';\n return 'mdi-file-outline';\n};\n\nconst getPreviewSrc = (file) => file?.url || file?.preview || '';\n\nconst revokeLocalPreview = (file) => {\n const preview = file?.preview;\n if (preview && localPreviewUrls.has(preview)) {\n URL.revokeObjectURL(preview);\n localPreviewUrls.delete(preview);\n }\n};\n\nconst revokeAllLocalPreviews = () => {\n fileList.value.forEach(revokeLocalPreview);\n localPreviewUrls.forEach((url) => URL.revokeObjectURL(url));\n localPreviewUrls.clear();\n};\n\nconst previewImageList = computed(() => fileList.value.filter((file) => isImage(file) && getPreviewSrc(file)));\n\nconst previewImageIndex = computed(() => {\n if (!previewFile.value) return -1;\n return previewImageList.value.findIndex((file) => file.uid === previewFile.value.uid);\n});\n\nconst hasPreviewPrev = computed(() => previewImageIndex.value > 0);\nconst hasPreviewNext = computed(() => previewImageIndex.value >= 0 && previewImageIndex.value < previewImageList.value.length - 1);\n\nconst previewImageStyle = computed(() => ({\n transform: `translate(${previewTranslateX.value}px, ${previewTranslateY.value}px) scale(${previewScale.value}) rotate(${previewRotation.value}deg)`,\n}));\n\n/* -------------------- 触发 input -------------------- */\nconst triggerInput = () => {\n inputRef.value && inputRef.value.click();\n};\n\n/* -------------------- 拖拽 -------------------- */\nconst onDragover = () => {\n if (!props.disabled && !props.detail) isDragover.value = true;\n};\n\nconst onDrop = (e) => {\n isDragover.value = false;\n if (props.disabled || props.detail) return;\n processFiles(Array.from(e.dataTransfer.files));\n};\n\n/* -------------------- input change -------------------- */\nconst onInputChange = (e) => {\n if (props.disabled || props.detail) return;\n processFiles(Array.from(e.target.files));\n // 清空,允许重复选同一文件\n e.target.value = '';\n};\n\n/* -------------------- 文件处理 -------------------- */\n// 逐个文件顺序处理:分辨率检查里有 await,用 forEach 会导致\"谁先解析完谁先进列表\",\n// 与用户选择顺序不一致。\nconst processFiles = async (rawFiles) => {\n if (!rawFiles.length) return;\n\n // 数量限制检查\n if (props.limit > 0 && fileList.value.length + rawFiles.length > props.limit) {\n emit('exceed', rawFiles, fileList.value);\n return;\n }\n\n for (const raw of rawFiles) {\n // 体积检查\n if (props.maxSize > 0 && raw.size / 1024 / 1024 > props.maxSize) {\n const errFile = buildFile(raw, 'error');\n emit('error', new Error(`文件 ${raw.name} 超过最大限制 ${props.maxSize}MB`), errFile, fileList.value);\n continue;\n }\n\n // 分辨率检查:只读图片头部字节。\n // 读到且超阈值 → 拦截;读不出尺寸(格式不支持 / 字节不足)→ 直接放行。\n if (props.maxPixels > 0 && isImage(raw)) {\n const dims = await parseImageSizeFromFile(raw);\n if (dims && dims.w * dims.h > props.maxPixels) {\n const errFile = buildFile(raw, 'error');\n const message = `图片 ${raw.name} 分辨率 ${dims.w}×${dims.h},超出允许上限(${formatPixelCount(props.maxPixels)} 像素以内)`;\n showBlockMessage(message);\n emit('error', new Error(message), errFile, fileList.value);\n continue;\n }\n }\n\n const file = buildFile(raw, 'ready');\n\n // 生成本地预览地址,保证 picture-card 选图后立即回显缩略图。\n if (isImage(raw)) {\n if (typeof URL !== 'undefined' && URL.createObjectURL) {\n file.preview = URL.createObjectURL(raw);\n localPreviewUrls.add(file.preview);\n } else {\n const reader = new FileReader();\n reader.onload = (e) => {\n file.preview = e.target.result;\n emit('change', file, fileList.value);\n };\n reader.readAsDataURL(raw);\n }\n }\n\n const beforeHook = props.beforeUpload ? props.beforeUpload(raw) : true;\n Promise.resolve(beforeHook).then((result) => {\n if (result === false) return;\n addFile(file);\n if (props.autoUpload && props.action) {\n uploadFile(file);\n }\n }).catch(() => {});\n }\n};\n\nconst buildFile = (raw, status) => ({\n uid: genUid(),\n name: raw.name,\n size: raw.size,\n type: raw.type,\n status,\n percentage: 0,\n raw,\n url: '',\n preview: '',\n response: null,\n});\n\nconst addFile = (file) => {\n fileList.value.push(file);\n syncModel();\n emit('change', file, fileList.value);\n};\n\nconst syncModel = () => {\n const urls = fileList.value\n .filter((f) => f.status === 'success' && f.url)\n .map((f) => String(f.url));\n isSyncingModel = true;\n emit('update:modelValue', urls);\n nextTick(() => {\n isSyncingModel = false;\n });\n};\n\n/* -------------------- 上传逻辑 -------------------- */\nconst uploadFile = (file) => {\n file.status = 'uploading';\n const formData = new FormData();\n formData.append(props.name, file.raw);\n Object.entries(props.data).forEach(([k, v]) => formData.append(k, v));\n\n // 使用 axios 直接调,以获得 onUploadProgress\n const tokenKey = window.VTK_CONFIG?.storageKeys?.token || '_mis_acis_token';\n const token = window.$vtk?.storage?.get(tokenKey) || localStorage.getItem(tokenKey);\n\n const headers = {\n 'content-type': 'multipart/form-data',\n ...props.headers,\n };\n if (token) headers['Authorization'] = `Bearer ${token}`;\n\n Request.http(props.action, formData, 'POST', headers).then((res) => {\n file.status = 'success';\n file.response = res;\n // 兼容 { data: 'url' } 和 { data: { url: '...' } } 两种结构\n const url = typeof res?.data === 'string' ? res.data : (res?.data?.url || res?.url || '');\n if (url) {\n file.url = url;\n revokeLocalPreview(file);\n }\n console.log('[VtkUpload] res:', res, '| file.url:', file.url, '| fileList:', JSON.parse(JSON.stringify(fileList.value)));\n syncModel();\n emit('success', res, file, fileList.value);\n emit('change', file, fileList.value);\n }).catch((err) => {\n file.status = 'error';\n syncModel();\n emit('error', err, file, fileList.value);\n emit('change', file, fileList.value);\n });\n};\n\n/* -------------------- 移除文件 -------------------- */\nconst handleRemove = (file) => {\n const doRemove = () => {\n revokeLocalPreview(file);\n fileList.value = fileList.value.filter((f) => f.uid !== file.uid);\n syncModel();\n emit('remove', file, fileList.value);\n };\n\n if (props.beforeRemove) {\n Promise.resolve(props.beforeRemove(file, fileList.value)).then((result) => {\n if (result !== false) doRemove();\n }).catch(() => {});\n } else {\n doRemove();\n }\n};\n\n/* -------------------- 预览 -------------------- */\nconst isExcel = (file) => /\\.(xlsx|xls)$/i.test(file?.name || '');\n\nconst resetPreviewTransform = () => {\n previewScale.value = 1;\n previewRotation.value = 0;\n previewTranslateX.value = 0;\n previewTranslateY.value = 0;\n};\n\nconst closePreview = () => {\n previewVisible.value = false;\n};\n\nconst rotatePreview = (degrees) => {\n previewRotation.value += degrees;\n};\n\nconst zoomPreview = (step) => {\n const nextScale = Number((previewScale.value + step).toFixed(2));\n previewScale.value = Math.min(3, Math.max(0.2, nextScale));\n};\n\nconst setImagePreviewFile = (file) => {\n previewFile.value = {\n ...file,\n _previewSrc: getPreviewSrc(file),\n };\n resetPreviewTransform();\n};\n\nconst switchPreviewImage = (step) => {\n if (!isImage(previewFile.value)) return;\n\n const index = previewImageIndex.value;\n const nextFile = previewImageList.value[index + step];\n if (!nextFile) return;\n\n emit('preview', nextFile);\n setImagePreviewFile(nextFile);\n};\n\nconst handlePreviewKeydown = (event) => {\n if (!previewVisible.value || !isImage(previewFile.value)) return;\n\n if (event.key === 'ArrowLeft' && hasPreviewPrev.value) {\n event.preventDefault();\n switchPreviewImage(-1);\n }\n\n if (event.key === 'ArrowRight' && hasPreviewNext.value) {\n event.preventDefault();\n switchPreviewImage(1);\n }\n};\n\nconst startPreviewDrag = (event) => {\n if (previewScale.value <= 1) return;\n event.preventDefault();\n const target = event.currentTarget;\n previewDragState.value = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n translateX: previewTranslateX.value,\n translateY: previewTranslateY.value,\n };\n target.setPointerCapture?.(event.pointerId);\n target.addEventListener('pointermove', movePreviewDrag);\n target.addEventListener('pointerup', endPreviewDrag, { once: true });\n target.addEventListener('pointercancel', endPreviewDrag, { once: true });\n};\n\nconst movePreviewDrag = (event) => {\n const state = previewDragState.value;\n if (!state || state.pointerId !== event.pointerId) return;\n previewTranslateX.value = state.translateX + event.clientX - state.startX;\n previewTranslateY.value = state.translateY + event.clientY - state.startY;\n};\n\nconst endPreviewDrag = (event) => {\n event.currentTarget?.releasePointerCapture?.(event.pointerId);\n event.currentTarget?.removeEventListener('pointermove', movePreviewDrag);\n previewDragState.value = null;\n};\n\nconst openFileInNewTab = (file, fileUrl) => {\n if (fileUrl) {\n window.open(fileUrl, '_blank');\n return;\n }\n\n if (file.raw instanceof File || file.raw instanceof Blob) {\n const blobUrl = URL.createObjectURL(file.raw);\n const win = window.open(blobUrl, '_blank');\n win?.addEventListener('unload', () => URL.revokeObjectURL(blobUrl));\n }\n};\n\nconst openCurrentPreview = () => {\n if (!previewFile.value) return;\n openFileInNewTab(previewFile.value, previewFile.value._previewSrc || previewFile.value.url || previewFile.value.preview);\n};\n\nconst handlePreview = (file) => {\n emit('preview', file);\n\n const fileUrl = getPreviewSrc(file);\n\n // Non-image files open in a new tab.\n if (!isImage(file) && !isExcel(file)) {\n openFileInNewTab(file, fileUrl);\n return;\n }\n\n // Excel:Office Online 查看器(需要文件有公网 URL)\n if (isExcel(file)) {\n if (fileUrl && /^https?:\\/\\//.test(fileUrl)) {\n window.open(`https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(fileUrl)}`, '_blank');\n } else {\n // Excel without a public URL falls back to the dialog hint.\n previewFile.value = { ...file, _previewSrc: fileUrl };\n resetPreviewTransform();\n previewVisible.value = true;\n }\n return;\n }\n\n // Images preview inside the dialog.\n setImagePreviewFile(file);\n previewVisible.value = true;\n};\n\nwatch(previewVisible, (visible) => {\n if (visible) {\n window.addEventListener('keydown', handlePreviewKeydown);\n return;\n }\n\n window.removeEventListener('keydown', handlePreviewKeydown);\n resetPreviewTransform();\n});\n\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', handlePreviewKeydown);\n revokeAllLocalPreviews();\n});\n\n/* -------------------- 对外暴露方法 -------------------- */\n/** 手动触发未上传文件的上传 */\nconst submit = () => {\n fileList.value\n .filter((f) => f.status === 'ready' && props.action)\n .forEach(uploadFile);\n};\n\n/** 清空文件列表 */\nconst clearFiles = () => {\n revokeAllLocalPreviews();\n fileList.value = [];\n syncModel();\n};\n\n/** 手动移除某个文件 */\nconst remove = (file) => handleRemove(file);\n\ndefineExpose({ submit, clearFiles, remove });\n</script>\n\n<style lang=\"scss\" scoped>\n.vtk-upload {\n width: 100%;\n}\n\n/* ---- 拖拽区域 ---- */\n.vtk-upload__dragger {\n border: 1px dashed rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n padding: 24px 16px;\n text-align: center;\n cursor: pointer;\n transition: border-color 0.2s, background 0.2s;\n background: transparent;\n\n &:hover:not(.is-disabled) {\n border-color: rgb(var(--v-theme-primary));\n }\n\n &.is-dragover {\n border-color: rgb(var(--v-theme-primary));\n background: rgba(var(--v-theme-primary), 0.05);\n }\n\n &.is-disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n}\n\n/* ---- 文件列表 ---- */\n.vtk-upload__list {\n border-top: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n.vtk-upload__list-item {\n position: relative;\n display: flex;\n align-items: center;\n padding: 4px 4px 4px 8px;\n border-radius: 4px;\n font-size: 13px;\n transition: background 0.15s;\n\n &:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n\n &.is-error {\n color: rgb(var(--v-theme-error));\n }\n\n &.is-success .vtk-upload__list-item-name {\n cursor: pointer;\n &:hover { color: rgb(var(--v-theme-primary)); }\n }\n}\n\n.vtk-upload__list-item-name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 500px;\n}\n\n.vtk-upload__list-progress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n/* ---- picture-card ---- */\n.vtk-upload__picture-card-wrap {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.vtk-upload__picture-card-item,\n.vtk-upload__picture-card-add {\n width: 100px;\n height: 100px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.vtk-upload__picture-card-item {\n position: relative;\n border: 1px solid rgba(0, 0, 0, 0.12);\n\n &:hover .vtk-upload__picture-card-mask {\n opacity: 1;\n }\n}\n\n.vtk-upload__picture-card-mask {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.08);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n}\n\n.vtk-upload__picture-card-progress {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vtk-upload__picture-card-add {\n border: 1px dashed rgba(0, 0, 0, 0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: border-color 0.2s, background 0.2s;\n\n &:hover, &.is-dragover {\n border-color: rgb(var(--v-theme-primary));\n background: rgba(var(--v-theme-primary), 0.04);\n }\n}\n\n/* ---- 隐藏 input ---- */\n.vtk-upload__input {\n display: none;\n}\n\n/* ---- preview ---- */\n.vtk-upload__preview-card {\n --vtk-upload-preview-bg: rgba(0, 0, 0, 0.3);\n\n height: 100vh;\n background: var(--vtk-upload-preview-bg);\n}\n\n.vtk-upload__preview-body {\n height: calc(100vh - 64px);\n overflow: auto;\n background: var(--vtk-upload-preview-bg);\n position: relative;\n}\n\n.vtk-upload__preview-nav {\n position: fixed;\n top: 50%;\n z-index: 10;\n width: 50px;\n height: 50px;\n color: #fff;\n background: rgba(0, 0, 0, 0.5);\n transform: translateY(-50%);\n}\n\n.vtk-upload__preview-nav--prev {\n left: 20px;\n}\n\n.vtk-upload__preview-nav--next {\n right: 20px;\n}\n\n.vtk-upload__preview-image-wrap {\n min-width: 100%;\n min-height: 100%;\n padding: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vtk-upload__preview-image {\n display: block;\n max-width: 90vw;\n max-height: calc(100vh - 128px);\n object-fit: contain;\n transform-origin: center center;\n transition: transform 0.2s ease;\n user-select: none;\n cursor: grab;\n touch-action: none;\n\n &:active {\n cursor: grabbing;\n }\n}\n\n.vtk-upload__preview-empty {\n min-height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px;\n color: rgba(var(--v-theme-on-surface), 0.72);\n text-align: center;\n}\n</style>\n","import Request from \"./request.js\";\r\nimport Storage from \"./storage.js\";\r\nimport Message from \"../components/message/index.js\";\r\n\r\nfunction isAid(value) {\r\n const str = String(value || \"\");\r\n return !!str && !/^(https?:)?\\/\\//i.test(str) && !str.includes(\"/\") && !str.includes(\"?\");\r\n\r\n \r\n}\r\n\r\nfunction getLinkFromResponse(data) {\r\n if (!data) {\r\n return \"\";\r\n }\r\n\r\n if (typeof data === \"string\") {\r\n return data;\r\n }\r\n\r\n return data.puri || \"\";\r\n}\r\n\r\nfunction buildUrlWithParams(target, appendParams) {\r\n const queryString = target.includes(\"?\") ? target.split(\"?\")[1] : \"\";\r\n const queryParams = new URLSearchParams(queryString);\r\n const newParams = [];\r\n\r\n Object.entries(appendParams).forEach(([key, value]) => {\r\n if (!key || value === undefined || value === null || value === \"\") {\r\n return;\r\n }\r\n\r\n if (!queryParams.has(key)) {\r\n newParams.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\r\n }\r\n });\r\n\r\n if (!newParams.length) {\r\n return target;\r\n }\r\n\r\n const joinSymbol = target.includes(\"?\") ? \"&\" : \"?\";\r\n return `${target}${joinSymbol}${newParams.join(\"&\")}`;\r\n}\r\n\r\nfunction appendParamsToUrl(targetUrl, appendParams) {\r\n const hashIndex = targetUrl.indexOf(\"#\");\r\n\r\n if (hashIndex === -1) {\r\n return buildUrlWithParams(targetUrl, appendParams);\r\n }\r\n\r\n const baseUrl = targetUrl.slice(0, hashIndex);\r\n const hashRoute = targetUrl.slice(hashIndex + 1);\r\n const newHashRoute = buildUrlWithParams(hashRoute, appendParams);\r\n return `${baseUrl}#${newHashRoute}`;\r\n}\r\n\r\nasync function resolveAidUrl(aid) {\r\n if (!aid) {\r\n return aid;\r\n }\r\n\r\n try {\r\n const res = await Request.postForm(\"/kudas/xfwez/apps\", { aid });\r\n const realUrl = res?.meta?.success ? getLinkFromResponse(res.data) : \"\";\r\n return realUrl || aid;\r\n } catch (error) {\r\n return aid;\r\n }\r\n}\r\n\r\nfunction buildAppendParams(sobject, sroute, stokenKey) {\r\n const appendParams = {};\r\n const storageKey = stokenKey || \"_mis_acis_token\";\r\n const stoken = Storage.get(storageKey);\r\n\r\n if (stoken !== undefined && stoken !== null && stoken !== \"\") {\r\n appendParams.stoken = stoken;\r\n }\r\n\r\n if (sroute) {\r\n appendParams.sroute = sroute;\r\n }\r\n\r\n if (sobject && typeof sobject === \"object\" && Object.keys(sobject).length) {\r\n appendParams.sobject = btoa(encodeURIComponent(JSON.stringify(sobject)));\r\n }\r\n\r\n return appendParams;\r\n}\r\n\r\n/**\r\n * 解析地址中的指定参数值。\r\n * @param {string} name 参数名。\r\n * @param {string} url 要解析的地址,不传时默认使用当前地址。\r\n * @return {string} 参数值;未找到时返回空字符串。\r\n */\r\nexport function GetQueryString(name, url = window.location.href) {\r\n const reg = new RegExp(`[?&]${name}=([^&^#^/]*)`, \"i\");\r\n const res = String(url || \"\").match(reg);\r\n return res ? decodeURIComponent(res[1]) : \"\";\r\n}\r\n\r\n/**\r\n * 追加应用访问参数。\r\n * @param {string} url 链接地址或应用 aid;不传时默认取当前地址。\r\n * @param {Object} sobject 参数对象;会按 `btoa(encodeURIComponent(JSON.stringify(sobject)))` 编码后追加为 `sobject` 参数。\r\n * @param {string} sroute 页面路由标识;传值后会在最终地址中追加 `sroute=xxx`。\r\n * @param {string} stokenKey 取 `stoken` 的存储键名,默认 `_mis_acis_token`。\r\n * @return {Promise<string>} 拼接后的链接地址。\r\n */\r\nexport async function appendAppParams(url, sobject = {}, sroute = \"\", stokenKey = \"_mis_acis_token\") {\r\n if (url === undefined || url === null || url === \"\" || url === 0 || url === \"0\") {\r\n Message.toast(\"应用标识错误\", { color: \"error\" });\r\n return \"\";\r\n }\r\n\r\n const source = url || window.location.href;\r\n\r\n if (!source) {\r\n return \"\";\r\n }\r\n\r\n const targetUrl = isAid(source) ? await resolveAidUrl(source) : source;\r\n return appendParamsToUrl(targetUrl, buildAppendParams(sobject, sroute, stokenKey));\r\n}\r\n","/**\r\n * 将数值转换成中文 '0:未启/1:已启'\r\n * \r\n * @param {*} val 数值\r\n * @param {*} map 值对\r\n * @return {string} 中文值\r\n */\r\nexport function dict(val, map) {\r\n let value = \"\";\r\n if (val && val.includes(\",\")) {\r\n value = val.split(\",\").map(item => pre(item, map)).join();\r\n } else {\r\n value = pre(val, map)\r\n }\r\n return value;\r\n}\r\n\r\nfunction pre(value, map) {\r\n if (value) {\r\n var val = Array.isArray(value) ? value : value.split(\",\");\r\n var maps = map?.split(\"/\");\r\n var results = []; // 创建一个空数组,用于存储匹配到的值\r\n // 遍历 val 数组\r\n for (var j = 0; j < val?.length; j++) {\r\n var currentVal = val[j]; // 获取当前要查找的键\r\n for (var i in maps) {\r\n var kv = maps[i].split(\":\");\r\n if (kv[0] == currentVal) {\r\n results.push(kv[1]); // 将匹配到的值添加到结果数组中\r\n break; // 找到匹配项后,跳出内层循环\r\n }\r\n }\r\n }\r\n return results.length > 0 ? results.join() : \"其他\";\r\n }\r\n\r\n}\r\n\r\n\r\n/**\r\n * 1,2字符残疾类别转换\r\n * \r\n * @param {*} val 数值\r\n * @return {string} 中文值\r\n */\r\nexport function analyType(val) {\r\n if (!val) {\r\n return ''\r\n }\r\n let newVal = ''\r\n let arr = ['视力', '听力', '言语', '肢体', '智力', '精神', '多重']\r\n for (let i = 1; i < 8; i++) {\r\n if (i === 1) {\r\n newVal = val.replace(i.toString(), arr[i - 1])\r\n } else {\r\n newVal = newVal.replace(i.toString(), arr[i - 1])\r\n }\r\n }\r\n return newVal;\r\n}\r\nexport function analyLevel(val) {\r\n if (!val) {\r\n return ''\r\n }\r\n let newVal = ''\r\n let arr = ['一级', '二级', '三级', '四级', '不限等级']\r\n for (let i = 1; i < 7; i++) {\r\n if (i === 1) {\r\n newVal = val.replace(i.toString(), arr[i - 1])\r\n } else {\r\n newVal = newVal.replace(i.toString(), arr[i - 1])\r\n }\r\n }\r\n return newVal;\r\n}","/**\r\n * \r\n * @param {*} value 需格式化的时间\r\n * @param {*} fmt 格式\r\n */\r\nexport function date(value, fmt) {\r\n if (!value || value == '无' || value == null) {\r\n fmt = '无';\r\n return fmt;\r\n }\r\n let getDate = new Date(value)\r\n let o = {\r\n 'M+': getDate.getMonth() + 1,\r\n 'd+': getDate.getDate(),\r\n 'H+': getDate.getHours(),\r\n 'h+': getDate.getHours(),\r\n 'm+': getDate.getMinutes(),\r\n 's+': getDate.getSeconds(),\r\n 'q+': Math.floor((getDate.getMonth() + 3) / 3),\r\n 'S': getDate.getMilliseconds()\r\n }\r\n if (/(y+)/.test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (getDate.getFullYear() + '').substr(4 - RegExp.$1.length))\r\n }\r\n for (let k in o) {\r\n if (new RegExp('(' + k + ')').test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))\r\n }\r\n }\r\n return fmt\r\n\r\n}\r\n\r\n\r\n/**\r\n * 数字格式化 '0,000.00'\r\n * @param {*} val 数值\r\n * @param {*} fmt 格式\r\n * @return {string} 数字字符串\r\n */\r\nexport function num(val, fmt) {\r\n if (isNaN(val) || val === '' || val === null) {\r\n return val;\r\n }\r\n\r\n // 移除了对Strings和Datetime的依赖,这些在当前上下文中未定义\r\n var numValue = parseFloat(val);\r\n var neg = numValue < 0 ? \"-\" : \"\"; // 正负数\r\n var absValue = Math.abs(numValue);\r\n\r\n // 解析格式字符串,确定小数位数\r\n var fix = 0;\r\n if (fmt && fmt.includes('.')) {\r\n fix = fmt.length - fmt.lastIndexOf('.') - 1;\r\n }\r\n\r\n // 是否需要千分位分隔符\r\n var needSep = fmt && fmt.includes(',');\r\n\r\n // 处理小数部分\r\n var xs = fix > 0 ? absValue.toFixed(fix) : Math.round(absValue);\r\n var decimalPart = fix > 0 ? '.' + xs.toString().split('.')[1] : '';\r\n\r\n // 处理整数部分\r\n var integerPart = fix > 0 ? Math.floor(absValue).toString() : xs.toString();\r\n\r\n // 添加千分位分隔符\r\n if (needSep && integerPart.length > 3) {\r\n integerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n }\r\n\r\n return neg + integerPart + decimalPart;\r\n}\r\n\r\n\r\n/**\r\n * 年龄\r\n * @param {*} val 时间 yyyy-MM-dd\r\n * @return {string} 年龄\r\n */\r\nexport function age(val) {\r\n let birthdays = new Date(val.slice(0, 10).replace(/-/g, \"/\"));\r\n let d = new Date();\r\n let age = d.getFullYear() - birthdays.getFullYear() - ((d.getMonth() < birthdays.getMonth() || (d.getMonth() === birthdays.getMonth() && d.getDate() < birthdays.getDate())) ? 1 : 0);\r\n return age;\r\n}\r\n\r\n/**\r\n * 指定中文大于len,用...省略号表示,达到美观效果\r\n * @param {*} val 需格式的中文\r\n * @param {*} len 需格式的长度\r\n */\r\nexport function txt(val, len) {\r\n if (val?.length > len) {\r\n return val.slice(0, len) + \"...\";\r\n } else {\r\n return val;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * 取数据绝对值\r\n * @param {*} val 手机号\r\n */\r\nexport function abs(val) {\r\n return isNaN(val) ? 0 : Math.abs(val)\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/**\r\n * 脱敏手机号码\r\n * @param {*} val 手机号\r\n * @return {string} 手机号码\r\n */\r\nexport function mobile(val) {\r\n return val.replace(/(\\d{3})\\d{4}(\\d{4})/, \"$1****$2\");\r\n}\r\n\r\n\r\n/**\r\n * 脱敏身份证号\r\n * @param {*} val 身份证号\r\n * @return {string} 身份证号\r\n */\r\nexport function idcard(val) {\r\n if (val) {\r\n return val.replace(/^(.{4})(?:\\d+)(.{4})$/, \"$1** **** ****$2\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","export const red = {\n base: '#f44336',\n lighten5: '#ffebee',\n lighten4: '#ffcdd2',\n lighten3: '#ef9a9a',\n lighten2: '#e57373',\n lighten1: '#ef5350',\n darken1: '#e53935',\n darken2: '#d32f2f',\n darken3: '#c62828',\n darken4: '#b71c1c',\n accent1: '#ff8a80',\n accent2: '#ff5252',\n accent3: '#ff1744',\n accent4: '#d50000'\n};\nexport const pink = {\n base: '#e91e63',\n lighten5: '#fce4ec',\n lighten4: '#f8bbd0',\n lighten3: '#f48fb1',\n lighten2: '#f06292',\n lighten1: '#ec407a',\n darken1: '#d81b60',\n darken2: '#c2185b',\n darken3: '#ad1457',\n darken4: '#880e4f',\n accent1: '#ff80ab',\n accent2: '#ff4081',\n accent3: '#f50057',\n accent4: '#c51162'\n};\nexport const purple = {\n base: '#9c27b0',\n lighten5: '#f3e5f5',\n lighten4: '#e1bee7',\n lighten3: '#ce93d8',\n lighten2: '#ba68c8',\n lighten1: '#ab47bc',\n darken1: '#8e24aa',\n darken2: '#7b1fa2',\n darken3: '#6a1b9a',\n darken4: '#4a148c',\n accent1: '#ea80fc',\n accent2: '#e040fb',\n accent3: '#d500f9',\n accent4: '#aa00ff'\n};\nexport const deepPurple = {\n base: '#673ab7',\n lighten5: '#ede7f6',\n lighten4: '#d1c4e9',\n lighten3: '#b39ddb',\n lighten2: '#9575cd',\n lighten1: '#7e57c2',\n darken1: '#5e35b1',\n darken2: '#512da8',\n darken3: '#4527a0',\n darken4: '#311b92',\n accent1: '#b388ff',\n accent2: '#7c4dff',\n accent3: '#651fff',\n accent4: '#6200ea'\n};\nexport const indigo = {\n base: '#3f51b5',\n lighten5: '#e8eaf6',\n lighten4: '#c5cae9',\n lighten3: '#9fa8da',\n lighten2: '#7986cb',\n lighten1: '#5c6bc0',\n darken1: '#3949ab',\n darken2: '#303f9f',\n darken3: '#283593',\n darken4: '#1a237e',\n accent1: '#8c9eff',\n accent2: '#536dfe',\n accent3: '#3d5afe',\n accent4: '#304ffe'\n};\nexport const blue = {\n base: '#2196f3',\n lighten5: '#e3f2fd',\n lighten4: '#bbdefb',\n lighten3: '#90caf9',\n lighten2: '#64b5f6',\n lighten1: '#42a5f5',\n darken1: '#1e88e5',\n darken2: '#1976d2',\n darken3: '#1565c0',\n darken4: '#0d47a1',\n accent1: '#82b1ff',\n accent2: '#448aff',\n accent3: '#2979ff',\n accent4: '#2962ff'\n};\nexport const lightBlue = {\n base: '#03a9f4',\n lighten5: '#e1f5fe',\n lighten4: '#b3e5fc',\n lighten3: '#81d4fa',\n lighten2: '#4fc3f7',\n lighten1: '#29b6f6',\n darken1: '#039be5',\n darken2: '#0288d1',\n darken3: '#0277bd',\n darken4: '#01579b',\n accent1: '#80d8ff',\n accent2: '#40c4ff',\n accent3: '#00b0ff',\n accent4: '#0091ea'\n};\nexport const cyan = {\n base: '#00bcd4',\n lighten5: '#e0f7fa',\n lighten4: '#b2ebf2',\n lighten3: '#80deea',\n lighten2: '#4dd0e1',\n lighten1: '#26c6da',\n darken1: '#00acc1',\n darken2: '#0097a7',\n darken3: '#00838f',\n darken4: '#006064',\n accent1: '#84ffff',\n accent2: '#18ffff',\n accent3: '#00e5ff',\n accent4: '#00b8d4'\n};\nexport const teal = {\n base: '#009688',\n lighten5: '#e0f2f1',\n lighten4: '#b2dfdb',\n lighten3: '#80cbc4',\n lighten2: '#4db6ac',\n lighten1: '#26a69a',\n darken1: '#00897b',\n darken2: '#00796b',\n darken3: '#00695c',\n darken4: '#004d40',\n accent1: '#a7ffeb',\n accent2: '#64ffda',\n accent3: '#1de9b6',\n accent4: '#00bfa5'\n};\nexport const green = {\n base: '#4caf50',\n lighten5: '#e8f5e9',\n lighten4: '#c8e6c9',\n lighten3: '#a5d6a7',\n lighten2: '#81c784',\n lighten1: '#66bb6a',\n darken1: '#43a047',\n darken2: '#388e3c',\n darken3: '#2e7d32',\n darken4: '#1b5e20',\n accent1: '#b9f6ca',\n accent2: '#69f0ae',\n accent3: '#00e676',\n accent4: '#00c853'\n};\nexport const lightGreen = {\n base: '#8bc34a',\n lighten5: '#f1f8e9',\n lighten4: '#dcedc8',\n lighten3: '#c5e1a5',\n lighten2: '#aed581',\n lighten1: '#9ccc65',\n darken1: '#7cb342',\n darken2: '#689f38',\n darken3: '#558b2f',\n darken4: '#33691e',\n accent1: '#ccff90',\n accent2: '#b2ff59',\n accent3: '#76ff03',\n accent4: '#64dd17'\n};\nexport const lime = {\n base: '#cddc39',\n lighten5: '#f9fbe7',\n lighten4: '#f0f4c3',\n lighten3: '#e6ee9c',\n lighten2: '#dce775',\n lighten1: '#d4e157',\n darken1: '#c0ca33',\n darken2: '#afb42b',\n darken3: '#9e9d24',\n darken4: '#827717',\n accent1: '#f4ff81',\n accent2: '#eeff41',\n accent3: '#c6ff00',\n accent4: '#aeea00'\n};\nexport const yellow = {\n base: '#ffeb3b',\n lighten5: '#fffde7',\n lighten4: '#fff9c4',\n lighten3: '#fff59d',\n lighten2: '#fff176',\n lighten1: '#ffee58',\n darken1: '#fdd835',\n darken2: '#fbc02d',\n darken3: '#f9a825',\n darken4: '#f57f17',\n accent1: '#ffff8d',\n accent2: '#ffff00',\n accent3: '#ffea00',\n accent4: '#ffd600'\n};\nexport const amber = {\n base: '#ffc107',\n lighten5: '#fff8e1',\n lighten4: '#ffecb3',\n lighten3: '#ffe082',\n lighten2: '#ffd54f',\n lighten1: '#ffca28',\n darken1: '#ffb300',\n darken2: '#ffa000',\n darken3: '#ff8f00',\n darken4: '#ff6f00',\n accent1: '#ffe57f',\n accent2: '#ffd740',\n accent3: '#ffc400',\n accent4: '#ffab00'\n};\nexport const orange = {\n base: '#ff9800',\n lighten5: '#fff3e0',\n lighten4: '#ffe0b2',\n lighten3: '#ffcc80',\n lighten2: '#ffb74d',\n lighten1: '#ffa726',\n darken1: '#fb8c00',\n darken2: '#f57c00',\n darken3: '#ef6c00',\n darken4: '#e65100',\n accent1: '#ffd180',\n accent2: '#ffab40',\n accent3: '#ff9100',\n accent4: '#ff6d00'\n};\nexport const deepOrange = {\n base: '#ff5722',\n lighten5: '#fbe9e7',\n lighten4: '#ffccbc',\n lighten3: '#ffab91',\n lighten2: '#ff8a65',\n lighten1: '#ff7043',\n darken1: '#f4511e',\n darken2: '#e64a19',\n darken3: '#d84315',\n darken4: '#bf360c',\n accent1: '#ff9e80',\n accent2: '#ff6e40',\n accent3: '#ff3d00',\n accent4: '#dd2c00'\n};\nexport const brown = {\n base: '#795548',\n lighten5: '#efebe9',\n lighten4: '#d7ccc8',\n lighten3: '#bcaaa4',\n lighten2: '#a1887f',\n lighten1: '#8d6e63',\n darken1: '#6d4c41',\n darken2: '#5d4037',\n darken3: '#4e342e',\n darken4: '#3e2723'\n};\nexport const blueGrey = {\n base: '#607d8b',\n lighten5: '#eceff1',\n lighten4: '#cfd8dc',\n lighten3: '#b0bec5',\n lighten2: '#90a4ae',\n lighten1: '#78909c',\n darken1: '#546e7a',\n darken2: '#455a64',\n darken3: '#37474f',\n darken4: '#263238'\n};\nexport const grey = {\n base: '#9e9e9e',\n lighten5: '#fafafa',\n lighten4: '#f5f5f5',\n lighten3: '#eeeeee',\n lighten2: '#e0e0e0',\n lighten1: '#bdbdbd',\n darken1: '#757575',\n darken2: '#616161',\n darken3: '#424242',\n darken4: '#212121'\n};\nexport const shades = {\n black: '#000000',\n white: '#ffffff',\n transparent: '#ffffff00'\n};\nexport default {\n red,\n pink,\n purple,\n deepPurple,\n indigo,\n blue,\n lightBlue,\n cyan,\n teal,\n green,\n lightGreen,\n lime,\n yellow,\n amber,\n orange,\n deepOrange,\n brown,\n blueGrey,\n grey,\n shades\n};\n//# sourceMappingURL=colors.js.map","import colors from 'vuetify/lib/util/colors';\r\n\r\nconst theme_colors = [\r\n {\r\n name: 'Blue-light',\r\n scheme: 'md-blue-500-scheme',\r\n dark: true,\r\n primary: colors.blue.base,\r\n secondary: colors.blue.lighten4, // #FFCDD2\r\n accent: colors.blue.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Yellow-light',\r\n scheme: 'md-amber-a700-scheme',\r\n dark: true,\r\n primary: colors.amber.darken1,\r\n secondary: colors.amber.lighten4, // #FFCDD2\r\n accent: colors.amber.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Red-light',\r\n scheme: 'md-red-a400-scheme',\r\n dark: true,\r\n primary: colors.red.accent3,\r\n secondary: colors.red.lighten4, // #FFCDD2\r\n accent: colors.red.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Pink-light',\r\n dark: false,\r\n scheme: 'md-pink-a100-scheme',\r\n primary: colors.pink.accent1,\r\n secondary: colors.pink.lighten4, // #FFCDD2\r\n accent: colors.pink.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Purple-light',\r\n dark: false,\r\n scheme: 'md-purple-a700-scheme',\r\n primary: colors.purple.accent4,\r\n secondary: colors.purple.lighten4, // #FFCDD2\r\n accent: colors.purple.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'DeepPurple-light',\r\n dark: false,\r\n scheme: 'md-deep-purple-a700-scheme',\r\n primary: colors.deepPurple.base,\r\n secondary: colors.deepPurple.lighten4, // #FFCDD2\r\n accent: colors.deepPurple.accent2, // #3F51B5\r\n }\r\n];\r\n\r\nconst navi_colors = [\r\n {\r\n name: 'black',\r\n class: 'black'\r\n },\r\n {\r\n name: 'red-pink',\r\n class: 'gradient-red-pink'\r\n },\r\n {\r\n name: 'blue-grey-blue',\r\n class: 'gradient-blue-grey-blue'\r\n },\r\n {\r\n name: 'green-teal',\r\n class: 'gradient-green-teal'\r\n },\r\n {\r\n name: 'purple-deep-purple',\r\n class: 'gradient-purple-deep-purple'\r\n },\r\n {\r\n name: 'purple-amber',\r\n class: 'gradient-purple-amber'\r\n },\r\n {\r\n name: 'indigo-purple',\r\n class: 'gradient-indigo-purple'\r\n },\r\n {\r\n name: 'deep-purple-blue',\r\n class: 'gradient-deep-purple-blue'\r\n },\r\n {\r\n name: 'deep-orange-orange',\r\n class: 'gradient-deep-orange-orange'\r\n },\r\n {\r\n name: 'light-blue-cyan',\r\n class: 'gradient-light-blue-cyan'\r\n },\r\n {\r\n name: 'timber',\r\n class: 'gradient-timber'\r\n },\r\n {\r\n name: 'strawberry',\r\n class: 'gradient-strawberry'\r\n },\r\n {\r\n name: 'orange',\r\n class: 'gradient-orange'\r\n },\r\n {\r\n name: 'pomegranate',\r\n class: 'gradient-pomegranate'\r\n },\r\n {\r\n name: 'green-tea',\r\n class: 'gradient-green-tea'\r\n },\r\n {\r\n name: 'blackberry',\r\n class: 'gradient-blackberry'\r\n },\r\n {\r\n name: 'plum',\r\n class: 'gradient-plum'\r\n },\r\n {\r\n name: 'passion-fruit',\r\n class: 'gradient-passion-fruit'\r\n },\r\n {\r\n name: 'sublime-vivid',\r\n class: 'gradient-sublime-vivid'\r\n },\r\n {\r\n name: 'summer',\r\n class: 'gradient-summer'\r\n },\r\n {\r\n name: 'crystal-clear',\r\n class: 'gradient-crystal-clear'\r\n },\r\n {\r\n name: 'dawn',\r\n class: 'gradient-dawn'\r\n },\r\n {\r\n name: 'grapefruit-sunset',\r\n class: 'gradient-grapefruit-sunset'\r\n },\r\n {\r\n name: 'man-of-steel',\r\n class: 'gradient-man-of-steel'\r\n }\r\n]\r\n\r\nexport default { theme_colors, navi_colors }\r\n","/** https://github.com/shadowOfCode/bee.js */\r\nconst Validation = {\r\n //手机号码\r\n isMobile: function (input) {\r\n return /^(?:\\+86)?(?:13\\d|14[57]|15[0-35-9]|17[35-8]|18\\d)\\d{8}$|^(?:\\+86)?170[057-9]\\d{7}$/.test(input);\r\n },\r\n //手机号码简单校验,只校验长度\r\n isMobileSize: function (input) {\r\n return /^(?:\\+86)?1\\d{10}$/.test(input);\r\n },\r\n isPhone: function (input) {\r\n return /^(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?$/.test(input);\r\n },\r\n isCall: (input) => {\r\n return this.isPhone(input) || this.isMobile(input);\r\n },\r\n //邮箱格式校验\r\n isEmail: function (input) {\r\n return /^[-\\w+]+(?:\\.[-\\w]+)*@[-a-z0-9]+(?:\\.[a-z0-9]+)*(?:\\.[a-z]{2,})$/i.test(input);\r\n },\r\n //18位身份证简单校验\r\n isIdCardSimple: function (idCard) {\r\n return /^(?:1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5])\\d{4}(?:1[89]|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}(?:\\d|[xX])$/.test(idCard);\r\n },\r\n // 真实姓名校验\r\n isName: function (input) {\r\n return /^([\\u4e00-\\u9fa5]{1,20}|[a-zA-Z.\\s]{1,20})$/.test(input);\r\n },\r\n //\r\n //18位身份证严格校验\r\n isIdCard: function (idCard) {\r\n let checkCode = (input) => {\r\n var multiplier = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\r\n var ids = input.split(\"\");\r\n var len = 17, sum = 0;\r\n for (var i = 0; i < len; i++) {\r\n sum += ids[i] * multiplier[i];\r\n }\r\n var remainder = sum % 11;\r\n var checkCodeArr = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\r\n var result = checkCodeArr[remainder];\r\n return result === input[17];\r\n }\r\n //先校验格式\r\n if (this.isIdCardSimple(idCard)) {\r\n //校验日期时间是否合法\r\n var dateStr = idCard.substr(6, 8);\r\n var dateStrNew = dateStr.replace(/(\\d{4})(\\d{2})(\\d{2})/, \"$1/$2/$3\");\r\n var dateObj = new Date(dateStrNew);\r\n var month = dateObj.getMonth() + 1;\r\n if (parseInt(dateStr.substr(4, 2)) === month) {\r\n return checkCode(idCard);\r\n }\r\n }\r\n return false;\r\n },\r\n getFromIdCard: (idCard) => {\r\n var area = idCard.substr(0, 6);\r\n var birth = idCard.substr(6, 8).replace(/(\\d{4})(\\d{2})(\\d{2})/, '$1年$2月$3日');\r\n var age = new Date().getFullYear() - idCard.substr(6, 4) + 1;\r\n var sex = (idCard.substr(16, 1) % 2 === 0) ? '女' : '男';\r\n\r\n return {\r\n 'area': area,\r\n 'birth': birth,\r\n 'age': age,\r\n 'sex': sex\r\n };\r\n }\r\n};\r\n\r\nexport default Validation;","<template>\r\n <VDialog v-model=\"isActive\" persistent :width=\"options.width\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText v-if=\"options.text\">\r\n {{ options.text }}\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"close_modal\">确定</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js' // 根据实际路径调整\r\n\r\nconst messageStore = useMessageStore()\r\n\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.alert?.isActive || false)\r\nconst options = computed(() => messageStore.alert?.options || {})\r\n\r\n// 关闭模态框方法\r\nconst close_modal = () => {\r\n messageStore.hide('alert')\r\n}\r\n</script>","<template>\r\n <VDialog v-model=\"isActive\" persistent :max-width=\"options.width || 400\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText v-if=\"options.text\">\r\n {{ options.text }}\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"cancel\">{{ options.cancelText || '取消' }}</VBtn>\r\n <VBtn text @click=\"confirm\">{{ options.confirmText || '确定' }}</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.confirm?.isActive || false)\r\nconst options = computed(() => messageStore.confirm?.options || {})\r\n\r\n// 确认操作\r\nconst confirm = () => {\r\n // 如果 options.onConfirm 存在则执行回调\r\n if (typeof options.value.onConfirm === 'function') {\r\n options.value.onConfirm()\r\n }\r\n messageStore.hide('confirm')\r\n}\r\n\r\n// 取消操作\r\nconst cancel = () => {\r\n // 如果 options.onCancel 存在则执行回调\r\n if (typeof options.value.onCancel === 'function') {\r\n options.value.onCancel()\r\n }\r\n messageStore.hide('confirm')\r\n}\r\n</script>","<template>\r\n <v-overlay v-model=\"isActive\" persistent class=\"align-center justify-center\" :style=\"{ zIndex: 9999 }\">\r\n <v-progress-circular indeterminate size=\"64\" width=\"6\" color=\"primary\"></v-progress-circular>\r\n </v-overlay>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\n\r\nconst isActive = computed(() => messageStore.loading?.isActive || false)\r\n</script>\r\n","<template>\r\n <VDialog v-model=\"isActive\" persistent :width=\"options.width\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText>\r\n <VTextField\r\n v-model=\"inputValue\"\r\n :label=\"options.label\"\r\n :placeholder=\"options.placeholder\"\r\n :type=\"options.inputType || 'text'\"\r\n outlined\r\n dense\r\n />\r\n <div v-if=\"options.text\" class=\"mt-2\">\r\n {{ options.text }}\r\n </div>\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"cancel\">{{ options.cancelText || '取消' }}</VBtn>\r\n <VBtn text @click=\"confirm\">{{ options.confirmText || '确定' }}</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\nconst inputValue = ref('')\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.prompt?.isActive || false)\r\nconst options = computed(() => messageStore.prompt?.options || {})\r\n\r\n// 确认操作\r\nconst confirm = () => {\r\n // 如果 options.onConfirm 存在则执行回调\r\n if (typeof options.value.onConfirm === 'function') {\r\n options.value.onConfirm(inputValue.value)\r\n }\r\n messageStore.hide('prompt')\r\n inputValue.value = '' // 清空输入值\r\n}\r\n\r\n// 取消操作\r\nconst cancel = () => {\r\n // 如果 options.onCancel 存在则执行回调\r\n if (typeof options.value.onCancel === 'function') {\r\n options.value.onCancel()\r\n }\r\n messageStore.hide('prompt')\r\n inputValue.value = '' // 清空输入值\r\n}\r\n</script>","<template>\r\n\t<VSnackbar v-model=\"isActive\" :timeout=\"options.timeout > 0 ? options.timeout : 3000\" :color=\"options.color\" centered @update:modelValue=\"onModelUpdate\">\r\n\t\t{{ options.text }}\r\n\t\t<template v-slot:actions>\r\n\t\t\t<VBtn text icon @click=\"close_modal()\">\r\n\t\t\t\t<VIcon>mdi-close</VIcon>\r\n\t\t\t</VBtn>\r\n\t\t</template>\r\n\t</VSnackbar>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from \"vue\";\r\nimport { useMessageStore } from \"../../stores/message.js\";\r\n\r\nconst messageStore = useMessageStore();\r\n\r\nconst isActive = computed({\r\n\tget: () => messageStore.toast?.isActive || false,\r\n\tset: (value) => {\r\n\t\tif (messageStore.toast) {\r\n\t\t\tmessageStore.toast.isActive = value;\r\n\t\t}\r\n\t},\r\n});\r\n\r\nconst options = computed(() => messageStore.toast?.options || {});\r\n\r\nconst close_modal = () => {\r\n\tmessageStore.hide(\"toast\");\r\n};\r\n\r\n// 监听模型值更新\r\nconst onModelUpdate = (value) => {\r\n\tif (!value) {\r\n\t\t// Snackbar 关闭时确保 store 状态同步\r\n\t\tmessageStore.hide(\"toast\");\r\n\t}\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n:deep(.v-snackbar__wrapper) {\r\n\ttop: 24px;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"text-center\">\r\n <vtk-alert />\r\n <vtk-confirm />\r\n <vtk-loading />\r\n <vtk-prompt />\r\n <vtk-toast />\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport vtkAlert from \"./alert.vue\";\r\nimport vtkConfirm from \"./confirm.vue\";\r\nimport vtkLoading from \"./loading.vue\";\r\nimport vtkPrompt from \"./prompt.vue\";\r\nimport vtkToast from \"./toast.vue\";\r\nexport default {\r\n name: \"vtkMessage\",\r\n components: {\r\n vtkAlert,\r\n vtkConfirm,\r\n vtkLoading,\r\n vtkPrompt,\r\n vtkToast,\r\n },\r\n};\r\n</script>","/**\r\n * Specter PUI - Vue 3 组件库\r\n */\r\n\r\nexport { default as VtkArea } from \"./components/assembly/VtkArea.vue\";\r\nexport { default as VtkAreaTabs } from \"./components/assembly/VtkAreaTabs.vue\";\r\nexport { default as VtkBreadcrumb } from \"./components/assembly/VtkBreadcrumb.vue\";\r\nexport { default as VtkCheckbox } from \"./components/assembly/VtkCheckbox.vue\";\r\nexport { default as VtkCount } from \"./components/assembly/VtkCount.vue\";\r\nexport { default as VtkDatePicker } from \"./components/assembly/VtkDatePicker.vue\";\r\nexport { default as VtkDateSelector } from \"./components/assembly/VtkDateSelector.vue\";\r\nexport { default as VtkDateTimePicker } from \"./components/assembly/VtkDateTimePicker.vue\";\r\nexport { default as VtkTimePicker } from \"./components/assembly/VtkTimePicker.vue\";\r\nexport { default as VtkDept } from \"./components/assembly/VtkDept.vue\";\r\nexport { default as VtkEmpty } from \"./components/assembly/VtkEmpty.vue\";\r\nexport { default as VtkEmptyNew } from \"./components/assembly/VtkEmptyNew.vue\";\r\nexport { default as VtkFab } from \"./components/assembly/VtkFab.vue\";\r\nexport { default as VtkFormItem } from \"./components/assembly/VtkFormItem.vue\";\r\nexport { default as VtkImg } from \"./components/assembly/VtkImg.vue\";\r\nexport { default as VtkPage } from \"./components/assembly/VtkPage.vue\";\r\nexport { default as VtkPdf } from \"./components/assembly/VtkPdf.vue\";\r\nexport { default as VtkProj } from \"./components/assembly/VtkProj.vue\";\r\nexport { default as VtkRadio } from \"./components/assembly/VtkRadio.vue\";\r\nexport { default as VtkSearch } from \"./components/assembly/VtkSearch.vue\";\r\nexport { default as VtkSelect } from \"./components/assembly/VtkSelect.vue\";\r\nexport { default as VtkSinglePage } from \"./components/assembly/VtkSinglePage.vue\";\r\nexport { default as VtkStepper } from \"./components/assembly/VtkStepper.vue\";\r\nexport { default as VtkUpload } from \"./components/assembly/VtkUpload.vue\";\r\n\r\nexport * from \"./commons/location.js\";\r\nexport * from \"./commons/filters/dictionary.js\";\r\nexport * from \"./commons/filters/format.js\";\r\nexport * from \"./commons/filters/mask.js\";\r\nexport { default as request } from \"./commons/request.js\";\r\nexport { default as storage } from \"./commons/storage.js\";\r\nexport { default as themes } from \"./commons/themes.js\";\r\nexport * from \"./commons/validation.js\";\r\n\r\nexport { useMixins } from \"./composables/usePage.js\";\r\nexport { default as vtkMessage } from \"./components/message/index.js\";\r\n\r\nimport vtkMessage from \"./components/message/index.js\";\r\nimport storage from \"./commons/storage.js\";\r\nimport themes from \"./commons/themes.js\";\r\nimport request from \"./commons/request.js\";\r\nimport * as location from \"./commons/location.js\";\r\nimport Validation from \"./commons/validation.js\";\r\nimport * as dictionary from \"./commons/filters/dictionary.js\";\r\nimport * as mask from \"./commons/filters/mask.js\";\r\nimport * as format from \"./commons/filters/format.js\";\r\n\r\nimport VtkArea from \"./components/assembly/VtkArea.vue\";\r\nimport VtkAreaTabs from \"./components/assembly/VtkAreaTabs.vue\";\r\nimport VtkBreadcrumb from \"./components/assembly/VtkBreadcrumb.vue\";\r\nimport VtkCheckbox from \"./components/assembly/VtkCheckbox.vue\";\r\nimport VtkCount from \"./components/assembly/VtkCount.vue\";\r\nimport VtkDatePicker from \"./components/assembly/VtkDatePicker.vue\";\r\nimport VtkDateSelector from \"./components/assembly/VtkDateSelector.vue\";\r\nimport VtkDateTimePicker from \"./components/assembly/VtkDateTimePicker.vue\";\r\nimport VtkTimePicker from \"./components/assembly/VtkTimePicker.vue\";\r\nimport VtkDept from \"./components/assembly/VtkDept.vue\";\r\nimport VtkEmpty from \"./components/assembly/VtkEmpty.vue\";\r\nimport VtkEmptyNew from \"./components/assembly/VtkEmptyNew.vue\";\r\nimport VtkFab from \"./components/assembly/VtkFab.vue\";\r\nimport VtkFormItem from \"./components/assembly/VtkFormItem.vue\";\r\nimport VtkImg from \"./components/assembly/VtkImg.vue\";\r\nimport VtkPage from \"./components/assembly/VtkPage.vue\";\r\nimport VtkPdf from \"./components/assembly/VtkPdf.vue\";\r\nimport VtkProj from \"./components/assembly/VtkProj.vue\";\r\nimport VtkRadio from \"./components/assembly/VtkRadio.vue\";\r\nimport VtkSearch from \"./components/assembly/VtkSearch.vue\";\r\nimport VtkSelect from \"./components/assembly/VtkSelect.vue\";\r\nimport VtkSinglePage from \"./components/assembly/VtkSinglePage.vue\";\r\nimport VtkStepper from \"./components/assembly/VtkStepper.vue\";\r\nimport VtkUpload from \"./components/assembly/VtkUpload.vue\";\r\nimport VtkMessageComponent from \"./components/message/vtkMessage.vue\";\r\n\r\nfunction install(app, options = {}) {\r\n const components = {\r\n VtkArea,\r\n VtkAreaTabs,\r\n VtkBreadcrumb,\r\n VtkCheckbox,\r\n VtkCount,\r\n VtkDatePicker,\r\n VtkDateSelector,\r\n VtkDateTimePicker,\r\n VtkTimePicker,\r\n VtkDept,\r\n VtkEmpty,\r\n VtkEmptyNew,\r\n VtkFab,\r\n VtkFormItem,\r\n VtkImg,\r\n VtkPage,\r\n VtkPdf,\r\n VtkProj,\r\n VtkRadio,\r\n VtkSearch,\r\n VtkSelect,\r\n VtkSinglePage,\r\n VtkStepper,\r\n VtkUpload,\r\n VtkMessage: VtkMessageComponent\r\n };\r\n\r\n Object.keys(components).forEach(name => {\r\n app.component(name, components[name]);\r\n });\r\n\r\n app.config.globalProperties.$vtk = {\r\n message: vtkMessage,\r\n request,\r\n storage,\r\n themes,\r\n location,\r\n Validation,\r\n filters: {\r\n ...dictionary,\r\n ...mask,\r\n ...format\r\n },\r\n ...options\r\n };\r\n\r\n return app;\r\n}\r\n\r\nexport default {\r\n install,\r\n VtkArea,\r\n VtkAreaTabs,\r\n VtkBreadcrumb,\r\n VtkCheckbox,\r\n VtkCount,\r\n VtkDatePicker,\r\n VtkDateSelector,\r\n VtkDateTimePicker,\r\n VtkTimePicker,\r\n VtkDept,\r\n VtkEmpty,\r\n VtkEmptyNew,\r\n VtkFab,\r\n VtkFormItem,\r\n VtkImg,\r\n VtkPage,\r\n VtkPdf,\r\n VtkProj,\r\n VtkRadio,\r\n VtkSearch,\r\n VtkSelect,\r\n VtkSinglePage,\r\n VtkStepper,\r\n VtkUpload,\r\n request,\r\n storage,\r\n themes,\r\n vtkMessage\r\n};\r\n"],"names":["Storage","storage","type","key","js","value","useMessageStore","defineStore","options","Message","messageStore","defaultOptions","text","toastOptions","service","axios","config","tokenKey","_b","_a","error","response","res","header","handleRedirect","url","index","newUrl","Request","data","method","headers","responseType","proxy","getCurrentInstance","emit","__emit","entity","reactive","user","ref","areaData","onMounted","userKey","area","nextArea","areaCode","inputFn","e","clear","arr","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_VSelect","_cache","$event","__props","_createBlock","_c","_normalizeClass","_d","_e","_f","_g","_h","_i","_normalizeStyle","_j","props","menu","tab","tabItems","areaStorage","areaItems","current","itemValue","itemText","view","code","province","city","district","town","village","tabArea","areaChange","item","getTree","nextTick","getAreaName","save","val","lastItem","close","textClear","initCode","watch","newVal","oldVal","_component_v_menu","_withCtx","_component_v_btn","_mergeProps","$attrs","_createElementVNode","_toDisplayString","_component_v_icon","_component_v_card","_hoisted_2","_Fragment","_renderList","link","_component_v_sheet","_component_v_tabs","_component_v_tab","_createTextVNode","_vShow","_component_v_chip_group","_component_v_chip","_component_v_card_actions","_component_v_spacer","router","inject","route","breadcrumbItems","computed","matched","r","pathArray","p","path","routePath","handleBack","_component_v_breadcrumbs","_component_v_breadcrumbs_item","localValue","isUpdatingLocal","isUpdatingModel","attrs","useAttrs","inputAttrs","list","inline","modelValue","rest","checkboxAttrs","errorMessages","rules","hint","persistentHint","inputValue","items","statc","it","codeValue","miscs","_component_VInput","_component_VCheckbox","currentNumber","currentDigits","digitKey","isAnimating","formatNumber","num","result","targetNumberString","startNumberString","maxDigitString","target","start","getCurrentDigit","initDigitsArray","startStr","char","startChar","getDigitStyle","currentValue","digitValue","offset","translateY","startAnimation","startTime","startValue","endValue","diff","animate","currentTime","elapsed","progress","easeOutQuart","updateDigitArray","valueStr","maxStr","i","newStr","oldStr","endStr","__expose","digitChar","_hoisted_4","_hoisted_3","n","_hoisted_5","dateRange","startDateRange","endDateRange","displayValue","formatDate","textFieldProps","placeholder","disabled","min","max","showCurrent","format","separator","date","year","month","day","minDate","maxDate","newValue","dates","onStartDateChange","onEndDateChange","clearValue","cancel","confirm","sortedRange","date1","date2","_component_VMenu","activatorProps","_component_VTextField","_component_VIcon","_component_VCard","_component_VCardText","_component_VDatePicker","_component_VDivider","_component_VCardActions","_component_VSpacer","_component_VBtn","YEAR_PAGE_SIZE","YEAR_PAGE_CENTER_OFFSET","MONTHS","getYearPageStart","openPicker","yearPageStart","headerRef","yearPage","_","canShowNextYearPage","isYearDisabled","isMonthDisabled","togglePicker","closePicker","shiftYearPage","nextStart","selectYear","selectMonth","handleNavigate","direction","handleOutsideClick","event","onBeforeUnmount","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","YEAR_PANEL_SIZE","YEAR_PANEL_CENTER_OFFSET","showPicker","viewMode","currentYear","currentMonth","rightYear","rightMonth","selectedValue","tempValue","today","todayYear","todayMonth","todayDate","weekDays","monthList","menuAttach","menuLocation","menuOrigin","normalizeCssSize","nextValue","rootStyle","width","popupStyle","formatDisplay","week","yearList","startYear","weekList","weeks","firstDay","lastDay","currentDate","weekNumber","getWeekNumber","isToday","dayList","days","startDate","endDate","nextMonthYear","nextMonthMonth","nextMonthDayList","d","dayNum","yearStart","isYearSelected","v","isYearInRange","end","isMonthSelected","monthStr","isMonthInRange","isWeekSelected","weekStr","isWeekInRange","isDaySelected","isDayInRange","isDayRangeStart","isDayRangeEnd","isFutureYear","isFutureMonth","isFutureDay","yearStr","first","selectMonthRight","isMonthSelectedRight","isMonthInRangeRight","selectWeek","selectDay","prevPeriod","nextPeriod","prevMonth","nextMonthLeft","prevMonthRight","nextMonth","prevYear","nextYearLeft","prevYearRight","nextYear","changeViewMode","mode","parseCalendarValue","match","setRightPanelToNextMonth","syncCalendarPanels","values","endUsesDifferentMonth","initializePicker","isOpen","handleCancel","handleConfirm","menuProps","VtkDatePanelHeader","_unref","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","defaultStartTime","defaultEndTime","selectedDateTime","selectedRange","tempDate","tempRange","leftYear","leftMonth","selectedHour","selectedMinute","selectedSecond","activeRangeSide","activeTimeSide","activeSingleTime","isRange","menuWidth","dropdownStyle","minDateTime","parseValue","maxDateTime","hourOptions","minuteOptions","buildStepOptions","secondOptions","getDayList","leftDayList","rightDayList","formatByPattern","buildTempDateTime","singleTimeValue","pattern","canConfirm","isDateTimeDisabled","activeRangeDate","activeRangeHour","activeRangeMinute","activeRangeSecond","step","normalizedStep","startDay","daysInMonth","daysInPrevMonth","createDay","otherMonth","isSameDate","padTime","replacements","token","formatDatePart","formatTimePart","fallback","hour","minute","second","parseRangeValue","toModelValue","toModelRange","range","left","right","isDayDisabled","isTimePartDisabled","isRangeDaySelected","side","isRangeDayInRange","rangeDayClass","setSinglePanelFromDate","setRangePanelsFromDate","base","prevLeftMonth","nextRightMonth","selectRangeDay","selected","currentStart","currentEnd","selectHour","selectMinute","selectSecond","openRangeTime","selectRangeTime","part","clearTempRange","handleNow","now","_hoisted_21","selectedTime","minTime","parseTime","maxTime","isTimeDisabled","buildTempTime","isRangeTimeDisabled","otherIndex","other","setSingleFromTime","pause","ms","resolve","pickAreaCode","obj","pickAreaName","dialog","areaSelectedData","areaActivatedData","getDeptList","getAreaList","userAreaCode","getAreaNextList","parentCode","deptData","deptSelectedData","deptActivatedData","getPersonList","node","params","getDepNextList","selectAreaCode","selectPid","personData","selectedPersonData","allSelectedPersons","isRestoringSelection","selectedPersonList","uniqueMap","person","oldPerson","newPersonData","currentSelected","removeSelectedPerson","personId","globalIndex","currentIndex","add","selectedPersons","_component_v_dialog","_component_v_card_title","_component_v_divider","_component_v_card_text","_component_v_row","_component_v_col","_component_v_treeview","_component_v_avatar","_component_v_img","_component_v_list","_component_v_list_item","_component_v_empty_state","$slots","_renderSlot","_ctx","emptyImg","showFab","fabClass","handleScroll","scrollToTop","_Transition","_component_v_fab","processedMaxWidth","contentStyles","styles","HEADER_BYTES","showPreview","imageRotation","imageScale","imageTranslateX","imageTranslateY","imageDragState","getLocalToken","withToken","srcWithToken","currentImageUrl","currentImage","imageMeta","headerState","imgState","w","h","viewerMeta","viewerHeaderState","headerMetaCache","viewerImgState","readUInt16BE","bytes","readUInt16LE","readUInt32BE","isSvgBytes","head","parseImageDimensions","length","sofMarkers","marker","segLength","fourcc","bits","readFirstBytes","maxBytes","reader","buffer","chunks","total","done","out","chunk","take","fetchImageMeta","attempts","lastError","controller","timer","vector","inflightMeta","getImageMeta","cached","task","meta","open","openViewerOversize","currentImageRawUrl","currentImageDownloadUrl","currentImageTitle","currentImageDescription","hasPrev","hasNext","viewerImageStyle","openCurrentImageInNewWindow","imageMimeExtensionMap","imageExtensionMimeMap","getImageFileExtension","blob","mimeType","pathname","getCurrentImageFileName","extension","titleName","urlName","isDownloadRiskWebView","ua","getDownloadFailureReason","message","name","validateImageBlob","bitmap","reject","image","triggerBrowserDownload","fileName","triggerBrowserUrlDownload","showDownloadToast","color","toast","getDownloadFileHandle","isImageResponse","contentType","fetchImageBlob","fetchCurrentImageBlob","downloadCurrentImage","downloadUrl","fileHandle","writable","failureReason","resetImageTransform","openPreview","closePreview","prevImage","nextImage","rotateImage","degrees","zoomImage","nextScale","handleImageWheel","startImageDrag","moveImageDrag","endImageDrag","state","_component_v_progress_circular","_component_VCardTitle","_component_v_card_subtitle","_component_VDialog","_component_v_toolbar","_component_v_toolbar_title","_component_v_toolbar_items","pagination","pageSizeObjs","pageDatas","paginationChange","pageChange","pageSizeFormat","toPage","pageSizeChange","temp","page","_component_VRow","_component_v_pagination","loading","pdfLoaded","currentPage","pageCount","pdfContainer","pdfDoc","loadPdf","renderPage","pageNum","prevPage","nextPage","downloadPdf","_component_VCol","_component_VSlider","useMixins","urlConfig","queryParam","desserts","superQueryParams","pageData","sumup","pageDataCopy","overlay","getQueryParams","codex","loadPage","pageInfo","id","record","modalFormRef","disposition","filename","newUrlConfig","getListPage","expData","mixinQueryParam","examType","permits","projName","projTip","bizType","expShow","menu1","expArr","formArr","select","selectAll","delItem","delNote","MprojRef","onActivated","examAll","chkAll","getUserInfo","examWait","toView","searchProj","param","searchQuery","exv","exp","del","delSave","tip","formatIdCard","idcard","dateStr","getServStateClass","getServStateText","getRateStateClass","getRateStateText","getServFromText","from","_component_VContainer","_component_VTabs","_component_VTab","_component_vtk_search","_component_vtk_area_tabs","_component_vtk_select","_component_VDataTable","_component_VChip","_component_vtk_empty","_component_vtk_page","_component_vtk_proj","_component_VTextarea","onUpdate","_component_VRadioGroup","_component_VRadio","instance","cloneValue","cloneQueryParam","source","isSameValue","a","b","initialQueryParam","externalQueryParam","initialIndex","initVal","contentStyle","minValue","maxValue","minHeight","maxHeight","nextExternalQueryParam","nextQueryParam","obtain","filterNull","search","reset","handleResetClick","_component_VBadge","filteredAttrs","multi","its","$emit","normalizePositiveInteger","parsedValue","initialLimit","rowCount","hasTotal","pageSizeItems","rowLength","hasNextPage","emitPageChange","goToPage","targetPage","handlePageSizeChange","previousPage","_component_v_select","_component_v_text_field","stepIndex","content","_component_VStepper","_component_VStepperHeader","_component_VStepperWindow","_component_VStepperWindowItem","inputRef","isDragover","previewVisible","previewFile","previewScale","previewRotation","previewTranslateX","previewTranslateY","previewDragState","fileList","isSyncingModel","localPreviewUrls","revokeAllLocalPreviews","normalizeFileList","uidCounter","genUid","getFileNameFromUrl","cleanUrl","isImageUrl","parseDimensions","parseImageSizeFromFile","raw","formatPixelCount","showBlockMessage","isImage","file","fileIcon","getPreviewSrc","revokeLocalPreview","preview","previewImageList","previewImageIndex","hasPreviewPrev","hasPreviewNext","previewImageStyle","triggerInput","onDragover","onDrop","processFiles","onInputChange","rawFiles","errFile","buildFile","dims","beforeHook","addFile","uploadFile","status","syncModel","urls","f","formData","k","err","handleRemove","doRemove","isExcel","resetPreviewTransform","rotatePreview","zoomPreview","setImagePreviewFile","switchPreviewImage","nextFile","handlePreviewKeydown","startPreviewDrag","movePreviewDrag","endPreviewDrag","openFileInNewTab","fileUrl","blobUrl","win","openCurrentPreview","handlePreview","visible","_withModifiers","_component_v_progress_linear","isAid","str","getLinkFromResponse","buildUrlWithParams","appendParams","queryString","queryParams","newParams","joinSymbol","appendParamsToUrl","targetUrl","hashIndex","baseUrl","hashRoute","newHashRoute","resolveAidUrl","aid","buildAppendParams","sobject","sroute","stokenKey","storageKey","stoken","GetQueryString","reg","appendAppParams","dict","map","pre","maps","results","j","currentVal","kv","analyType","analyLevel","fmt","getDate","o","numValue","neg","absValue","fix","needSep","xs","decimalPart","integerPart","age","birthdays","txt","len","abs","mobile","red","pink","purple","deepPurple","blue","amber","colors","theme_colors","navi_colors","themes","Validation","input","this","idCard","checkCode","multiplier","ids","sum","remainder","checkCodeArr","dateStrNew","dateObj","birth","sex","isActive","close_modal","_component_v_overlay","onModelUpdate","_component_VSnackbar","_sfc_main","vtkAlert","vtkConfirm","vtkLoading","vtkPrompt","vtkToast","_component_vtk_alert","_component_vtk_confirm","_component_vtk_loading","_component_vtk_prompt","_component_vtk_toast","install","app","components","VtkArea","VtkAreaTabs","VtkBreadcrumb","VtkCheckbox","VtkCount","VtkDatePicker","VtkDateSelector","VtkDateTimePicker","VtkTimePicker","VtkDept","VtkEmpty","VtkEmptyNew","VtkFab","VtkFormItem","VtkImg","VtkPage","VtkPdf","VtkProj","VtkRadio","VtkSearch","VtkSelect","VtkSinglePage","VtkStepper","VtkUpload","VtkMessageComponent","vtkMessage","request","location","dictionary","mask"],"mappings":"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","x_google_ignoreList":[35]}
|
|
1
|
+
{"version":3,"file":"specter-pui.es.js","sources":["../src/commons/storage.js","../src/stores/message.js","../src/components/message/index.js","../src/commons/request.js","../src/components/assembly/VtkArea.vue","../src/components/assembly/VtkAreaTabs.vue","../src/components/assembly/VtkBreadcrumb.vue","../src/components/assembly/VtkCheckbox.vue","../src/components/assembly/VtkCount.vue","../src/components/assembly/VtkDatePicker.vue","../src/components/assembly/VtkDatePanelHeader.vue","../src/components/assembly/VtkDateSelector.vue","../src/components/assembly/VtkDateTimePicker.vue","../src/components/assembly/VtkTimePicker.vue","../src/components/assembly/VtkDept.vue","../src/components/assembly/VtkEmpty.vue","../src/assets/img/empty.svg","../src/components/assembly/VtkEmptyNew.vue","../src/components/assembly/VtkFab.vue","../src/components/assembly/VtkFormItem.vue","../src/components/assembly/VtkImg.vue","../src/components/assembly/VtkPage.vue","../src/components/assembly/VtkPdf.vue","../src/composables/usePage.js","../src/components/assembly/VtkProj.vue","../src/components/assembly/VtkRadio.vue","../src/components/assembly/VtkSearch.vue","../src/components/assembly/VtkSelect.vue","../src/components/assembly/VtkSinglePage.vue","../src/components/assembly/VtkStepper.vue","../src/components/assembly/VtkUpload.vue","../src/commons/location.js","../src/commons/filters/dictionary.js","../src/commons/filters/format.js","../src/commons/filters/mask.js","../node_modules/vuetify/lib/util/colors.js","../src/commons/themes.js","../src/commons/validation.js","../src/components/message/alert.vue","../src/components/message/confirm.vue","../src/components/message/loading.vue","../src/components/message/prompt.vue","../src/components/message/toast.vue","../src/components/message/vtkMessage.vue","../src/index.js"],"sourcesContent":["const Storage = {};\r\n/** 获取Storage对象 */\r\nconst storage = (type = 'local') => {\r\n return type == \"local\" ? window.localStorage : window.sessionStorage;\r\n}\r\n/**\r\n * 获取对应缓存值JSON对象\r\n * @param {string} key 键\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n * @return {object} 对应的值JSON对象\r\n */\r\nStorage.get = (key, type = 'local') => {\r\n var js = storage(type).getItem(key);\r\n return /^[\\\\{|\\\\[].+[\\\\}|\\\\]]$/.test(js) ? JSON.parse(js) : js;\r\n};\r\n/**\r\n * 设置存储缓存取对象JSON\r\n * @param {string} key 键\r\n * @param {string} value 值(JSON对象)\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.set = (key, value, type = 'local') => {\r\n value = (value.constructor === Object) ? JSON.stringify(value) : value\r\n storage(type).setItem(key, value);\r\n};\r\n/**\r\n * 删除对应的缓存对象JSON\r\n * @param {string} key 键\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.remove = (key, type = 'local') => {\r\n storage(type).removeItem(key);\r\n};\r\n/**\r\n * 清空所有的缓存对象JSON\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.clear = (type = 'local') => {\r\n storage(type).clear();\r\n};\r\n\r\nexport default Storage;\r\n","// stores/message.js\r\nimport { defineStore } from 'pinia'\r\n\r\nexport const useMessageStore = defineStore('message', {\r\n state: () => ({\r\n alert: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 500\r\n }\r\n },\r\n confirm: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 400,\r\n cancelText: '取消',\r\n confirmText: '确定'\r\n }\r\n },\r\n loading: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 300,\r\n indeterminate: true,\r\n value: 0,\r\n progressColor: 'primary',\r\n size: 64,\r\n circleWidth: 6\r\n }\r\n },\r\n prompt: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 500,\r\n label: '',\r\n placeholder: '',\r\n inputType: 'text',\r\n cancelText: '取消',\r\n confirmText: '确定'\r\n }\r\n },\r\n toast: {\r\n isActive: false,\r\n options: {\r\n text: '',\r\n color: '',\r\n timeout: 3000,\r\n position: 'top'\r\n }\r\n }\r\n }),\r\n \r\n actions: {\r\n hide(type) {\r\n if (this[type]) {\r\n this[type].isActive = false\r\n }\r\n },\r\n \r\n show(type, options) {\r\n if (this[type]) {\r\n this[type] = {\r\n isActive: true,\r\n options: options\r\n }\r\n }\r\n }\r\n }\r\n})","// components/message/index.js\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst Message = {\r\n // 显示 alert\r\n alert(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('alert', options)\r\n },\r\n \r\n // 显示 confirm\r\n confirm(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('confirm', options)\r\n },\r\n \r\n // loading 对象,包含 show 和 hide 方法\r\n loading: {\r\n show(options = {}) {\r\n const messageStore = useMessageStore()\r\n const defaultOptions = {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 120,\r\n indeterminate: true,\r\n progressColor: 'primary',\r\n size: 64,\r\n circleWidth: 6\r\n }\r\n messageStore.show('loading', { ...defaultOptions, ...options })\r\n },\r\n hide() {\r\n const messageStore = useMessageStore()\r\n messageStore.hide('loading')\r\n }\r\n },\r\n \r\n // 显示 prompt\r\n prompt(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('prompt', options)\r\n },\r\n \r\n // 显示 toast\r\n toast(text, options = {}) {\r\n \r\n const messageStore = useMessageStore()\r\n // 确保传入的是字符串时正确处理\r\n const toastOptions = typeof text === 'string' \r\n ? { text, ...options }\r\n : text\r\n messageStore.show('toast', toastOptions)\r\n },\r\n \r\n // 隐藏指定类型的消息\r\n hide(type) {\r\n const messageStore = useMessageStore()\r\n messageStore.hide(type)\r\n }\r\n}\r\n\r\nexport default Message","import axios from \"axios\";\r\nimport Storage from \"./storage.js\";\r\nimport Message from \"../components/message/index.js\";\r\n\r\n// create an axios instance\r\nconst service = axios.create({\r\n baseURL: window.VITE_APP_API_URL || import.meta.env.VITE_APP_API_URL || \"\",\r\n headers: {\r\n \"X-Requested-With\": \"XMLHttpRequest\",\r\n },\r\n withCredentials: false,\r\n timeout: 30000,\r\n});\r\n\r\n// request interceptor\r\nservice.interceptors.request.use(\r\n (config) => {\r\n // 获取配置的键名,如果没有配置则使用默认值\r\n const tokenKey = window.VTK_CONFIG?.storageKeys?.token || '_mis_acis_token';\r\n if (Storage.get(tokenKey)) {\r\n config.headers[\"X-Token\"] = \"1b0679be72ad976ad5d491ad57a5eec0\";\r\n config.headers[\"Authorization\"] = \"Bearer \" + Storage.get(tokenKey);\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n Message.toast(error.message || \"请求错误\");\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// response interceptor\r\nservice.interceptors.response.use(\r\n (response) => {\r\n let res = response.data;\r\n let header = response.headers[\"content-disposition\"];\r\n\r\n if (header != undefined && header.split(\";\")[0] == \"attachment\") {\r\n res = response;\r\n }\r\n if (response.status !== 200) {\r\n Message.toast(res.message || \"请求失败\", { color: \"error\" });\r\n return Promise.reject(new Error(res.message || \"请求失败\"));\r\n } else {\r\n // 检查登录过期\r\n if (\r\n res.meta &&\r\n !res.meta.success &&\r\n res.meta.message === \"specter_authorize_exception\"\r\n ) {\r\n Storage.clear(); //清除所有缓存\r\n const handleRedirect = () => {\r\n const url = window.location.href;\r\n const index = url.indexOf(\"#\");\r\n let newUrl;\r\n\r\n if (index > -1) {\r\n newUrl = url.substring(0, index) + \"#/\";\r\n } else {\r\n newUrl = url + \"#/\";\r\n }\r\n\r\n window.location.href = newUrl;\r\n };\r\n\r\n Message.confirm({\r\n title: \"提示\",\r\n text: \"对不起,您的登录信息过期!\",\r\n onConfirm: handleRedirect,\r\n onCancel: handleRedirect,\r\n });\r\n }\r\n return Promise.resolve(res);\r\n }\r\n },\r\n (error) => {\r\n console.log(\"err\" + error);\r\n Message.toast(error.message || \"网络错误\", { color: \"error\" });\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nconst Request = {};\r\n\r\nRequest.http = (\r\n url,\r\n data = {},\r\n method = \"GET\",\r\n headers = { \"content-type\": \"application/x-www-form-urlencoded\" },\r\n responseType = null\r\n) => {\r\n if (headers[\"content-type\"] === \"application/x-www-form-urlencoded\") {\r\n return service({\r\n url: url,\r\n params: data,\r\n method: method,\r\n headers: headers,\r\n responseType: responseType,\r\n });\r\n } else {\r\n return service({\r\n url: url,\r\n data: data,\r\n method: method,\r\n headers: headers,\r\n responseType: responseType,\r\n });\r\n }\r\n};\r\n\r\nRequest.getForm = (url, data = {}) => {\r\n return Request.http(url, data);\r\n};\r\n\r\nRequest.postForm = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\");\r\n};\r\n\r\nRequest.getJson = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"content-type\": \"application/json\",\r\n });\r\n};\r\n\r\nRequest.postJson = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"content-type\": \"application/json\",\r\n });\r\n};\r\n\r\nRequest.imp = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"Content-Type\": \"multipart/form-data\",\r\n });\r\n};\r\n\r\nRequest.exp = (url, data = {}) => {\r\n return Request.http(\r\n url,\r\n data,\r\n \"POST\",\r\n { \"content-Type\": \"application/json\" },\r\n \"blob\"\r\n );\r\n};\r\n\r\nexport default Request;\r\n","<template>\r\n\t<div class=\"d-inline-block d-flex\">\r\n\t\t<VSelect\r\n\t\t\tv-model=\"entity.area2\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area2, 1)\"\r\n\t\t\t@click:clear=\"clear(1)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 2 ? entity.name2 : '---省级---'\"\r\n\t\t\t:items=\"areaData.area2\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box mr-3\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 2\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 4\"\r\n\t\t\tv-model=\"entity.area4\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area4, 2)\"\r\n\t\t\t@click:clear=\"clear(2)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 4 ? entity.name4 : '---市级---'\"\r\n\t\t\t:items=\"areaData.area4\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 4 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 4\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 6\"\r\n\t\t\tv-model=\"entity.area6\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area6, 3)\"\r\n\t\t\t@click:clear=\"clear(3)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 6 ? entity.name6 : '---区/县---'\"\r\n\t\t\t:items=\"areaData.area6\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 6 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 6\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 9\"\r\n\t\t\tv-model=\"entity.area9\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area9, 4)\"\r\n\t\t\t@click:clear=\"clear(4)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 9 ? entity.name9 : '---街/镇---'\"\r\n\t\t\t:items=\"areaData.area9\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 9 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 9\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 12\"\r\n\t\t\tv-model=\"entity.area12\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area12, 5)\"\r\n\t\t\t@click:clear=\"clear(5)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 12 ? entity.name12 : '---村/社---'\"\r\n\t\t\t:items=\"areaData.area12\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block\"\r\n\t\t\tstyle=\"width: 188px\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 12\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t</div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, reactive, onMounted, getCurrentInstance } from 'vue';\r\n\r\nimport Request from \"../../commons/request\"\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n\tname: \"VtkArea\",\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n\tmaxArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: 12,\r\n\t},\r\n\tminArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaStyle: {\r\n\t\ttype: String,\r\n\t\tdefault: \"\",\r\n\t},\r\n});\r\n\r\n// 定义emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 响应式数据\r\nconst entity = reactive({\r\n\tarea2: null,\r\n\tarea4: null,\r\n\tarea6: null,\r\n\tarea9: null,\r\n\tarea12: null,\r\n\tname2: '',\r\n\tname4: '',\r\n\tname6: '',\r\n\tname9: '',\r\n\tname12: ''\r\n});\r\n\r\nconst user = ref({ areacode: \"\" });\r\nconst areaData = reactive({\r\n\tarea2: [],\r\n\tarea4: [],\r\n\tarea6: [],\r\n\tarea9: [],\r\n\tarea12: []\r\n});\r\n\r\n// 安全获取 vtk 对象\r\nconst getVtk = () => {\r\n if (typeof window !== 'undefined' && window.$vtk) {\r\n return window.$vtk;\r\n }\r\n return null;\r\n};\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\t// 获取配置的键名,如果没有配置则使用默认值\r\n\tconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\n\tuser.value = typeof(proxy.$vtk.storage.get(userKey)) != 'object' ? JSON.parse(proxy.$vtk.storage.get(userKey)) : proxy.$vtk.storage.get(userKey) || '';\r\n\tif (user.value) {\r\n\t\tarea();\r\n\t}\r\n});\r\n\r\n// 所属地区\r\nconst area = () => {\r\n try {\r\n proxy.$vtk.message.loading.show();\r\n Request.postForm(`/dict/area/show/${user.value.areacode}`).then((res) => {\r\n proxy.$vtk.message.loading.hide();\r\n if (res.meta.success) {\r\n entity[`area${res.data.areaLeve}`] = res.data.areaCode;\r\n entity.name2 = res.data.province;\r\n entity.name4 = res.data.city;\r\n entity.name6 = res.data.district;\r\n entity.name9 = res.data?.town;\r\n entity.name12 = res.data?.village;\r\n nextArea(user.value.areacode);\r\n } else {\r\n proxy.$vtk.message.toast(res.meta.message);\r\n }\r\n }).catch(error => {\r\n proxy.$vtk.message.loading.hide();\r\n proxy.$vtk.message.toast('加载区域数据失败');\r\n });\r\n } catch (error) {\r\n console.error('初始化区域数据失败:', error);\r\n if (proxy.$vtk.message?.loading?.hide) {\r\n proxy.$vtk.message.loading.hide();\r\n }\r\n }\r\n};\r\n\r\n// 下一级地区列表\r\nconst nextArea = (areaCode, index) => {\r\n\tinputFn(areaCode);\r\n \r\n\tif (areaCode?.length < 12) {\r\n\t\tRequest.postForm(`/dict/area/next/${areaCode}`).then((res) => {\r\n\t\t\tproxy.$vtk.message.loading.hide();\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\tif (index) {\r\n\t\t\t\t\tObject.keys(areaData)\r\n\t\t\t\t\t\t.slice(index, 5)\r\n\t\t\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\t\t\tareaData[e] = [];\r\n\t\t\t\t\t\t\tentity[e] = null;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tareaData[`area${res.data[0].areaLeve}`] = res.data;\r\n\t\t\t} else {\r\n\t\t\t\tproxy.$vtk.message.toast(res.meta.message);\r\n\t\t\t}\r\n\t\t}).catch(error => {\r\n console.error('加载下级区域数据失败:', error);\r\n proxy.$vtk.message.toast('加载下级区域数据失败');\r\n });\r\n\t}\r\n};\r\n\r\n// 清除\r\nconst clear = (index) => {\r\n\tlet arr = Object.keys(areaData);\r\n\tinputFn(entity[arr[index - 2]]);\r\n\tarr.slice(index, 5).forEach((e) => {\r\n\t\tareaData[e] = [];\r\n\t\tentity[e] = null;\r\n\t});\r\n};\r\n\r\n// 输入事件\r\nconst inputFn = (e) => {\r\n\te && emit(\"update:modelValue\", e);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.sel_box {\r\n\twidth: 164px;\r\n}\r\n</style>","<template>\r\n\t<v-menu v-model=\"menu\" :close-on-content-click=\"false\" max-width=\"520\" min-width=\"520\">\r\n\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t<v-btn\r\n\t\t\t\tv-bind=\"props\"\r\n\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\tcolor=\"primary\"\r\n\t\t\t\tclass=\"area-select-btn\"\r\n\t\t\t\t:style=\"$attrs.styles\"\r\n\t\t\t>\r\n\t\t\t\t<span class=\"btn-text\">{{ itemText || '选择地区' }}</span>\r\n\t\t\t\t<v-icon v-if=\"itemText\" size=\"small\" @click.stop=\"textClear\" class=\"ml-2\">mdi-close-circle</v-icon>\r\n\t\t\t</v-btn>\r\n\t\t</template>\r\n\t\t<v-card elevation=\"0\" style=\"width: 350px;\">\r\n\t\t\t<p class=\"pt-3 px-3\">\r\n\t\t\t\t<v-icon color=\"primary\" class=\"mr-1\" size=\"20\">mdi-map-marker-radius</v-icon>\r\n\t\t\t\t<span v-for=\"link in entity\" :key=\"link.areaCode\" class=\"link text-body-2 text-primary\">{{ link.areaName }}</span>\r\n\t\t\t</p>\r\n\t\t\t<v-sheet class=\"rounded-lg mx-3 mt-2\" color=\"#b1b1b117\">\r\n\t\t\t\t<v-tabs v-model=\"tab\" @update:model-value=\"tabArea\" class=\"pt-2 px-1\">\r\n\t\t\t\t\t<v-tab\r\n\t\t\t\t\t\tv-for=\"(item, index) in tabItems\"\r\n\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\tclass=\"mx-1\"\r\n\t\t\t\t\t\t:style=\"tab == index && 'color:white;opacity:1'\"\r\n\t\t\t\t\t\t:disabled=\"areaStorage.length <= index + 1\"\r\n\t\t\t\t\t\tv-show=\"minArea ? minArea >= item.leve : true\"\r\n\t\t\t\t\t>{{ item.text }}</v-tab>\r\n\t\t\t\t</v-tabs>\r\n\t\t\t\t<v-sheet\r\n\t\t\t\t\tv-show=\"index == tab\"\r\n\t\t\t\t\tv-for=\"(item, index) in tabItems\"\r\n\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\tclass=\"px-3 py-1\"\r\n\t\t\t\t\tmin-height=\"100\"\r\n\t\t\t\t\tcolor=\"rgba(0,0,0,0)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<v-chip-group v-model=\"current\" selected-class=\"chipActive\" column>\r\n\t\t\t\t\t\t<v-chip\r\n\t\t\t\t\t\t\tv-for=\"area in areaItems\"\r\n\t\t\t\t\t\t\t:key=\"area.id\"\r\n\t\t\t\t\t\t\t@click=\"areaChange(area, index)\"\r\n\t\t\t\t\t\t\tclass=\"rounded\"\r\n\t\t\t\t\t\t\t:class=\"area.areaCode == user.areacode && 'active'\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{{ area.areaName }}\r\n\t\t\t\t\t\t</v-chip>\r\n\t\t\t\t\t</v-chip-group>\r\n\t\t\t\t</v-sheet>\r\n\t\t\t</v-sheet>\r\n\r\n\t\t\t<v-card-actions class=\"pr-0 py-3\">\r\n\t\t\t\t<v-spacer />\r\n\t\t\t\t<v-btn @click=\"close\" elevation=\"0\" size=\"small\"><v-icon class=\"pt-1 pr-1\">mdi-progress-close</v-icon> 取消</v-btn>\r\n\t\t\t\t<v-btn @click=\"save\" class=\"text-white mr-3\" color=\"primary\" elevation=\"0\" size=\"small\"><v-icon class=\"pt-1 pr-1\">mdi-progress-check</v-icon> 确定</v-btn>\r\n\t\t\t</v-card-actions>\r\n\t\t</v-card>\r\n\t</v-menu>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onMounted, getCurrentInstance, nextTick } from 'vue';\r\n\r\nconst props = defineProps({\r\n\tmodelValue: {\r\n\t\ttype: [String, Object],\r\n\t\tdefault: null,\r\n\t},\r\n\tminArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaNode: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaCode: {\r\n\t\ttype: String,\r\n\t\tdefault: null,\r\n\t},\r\n\treturnObj: {\r\n\t\ttype: Boolean,\r\n\t\tdefault: false,\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits(['update:modelValue', 'change']);\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\nconst menu = ref(false);\r\nconst user = ref({});\r\nconst tab = ref(0);\r\nconst tabItems = ref([]);\r\nconst areaStorage = ref([]); //存储个级别地区数据\r\nconst areaItems = ref([]); //当前选择地区的所有列\r\nconst entity = ref([]); //存储选中的数据\r\nconst current = ref(null); //回显值选中\r\nconst itemValue = ref(\"\"); //传值:最终选择值\r\nconst itemText = ref(\"\"); //最终选择值\r\n\r\n// 值回显\r\nconst view = (code) => {\r\n\tproxy.$vtk.request.getForm(`/dict/area/show/${code}`).then((res) => {\r\n\t\tlet province = res.data.province ? `${res.data.province}` : \"\";\r\n\t\tlet city = res.data.city ? `/${res.data.city}` : \"\";\r\n\t\tlet district = res.data.district ? `/${res.data.district}` : \"\";\r\n\t\tlet town = res.data.town ? `/${res.data.town}` : \"\";\r\n\t\tlet village = res.data.village ? `/${res.data.village}` : \"\";\r\n\t\titemText.value = `${province}${city}${district}${town}${village}`;\r\n\t\tif (props.areaNode && props.areaNode > 0) {\r\n\t\t\titemText.value = itemText.value.split(\"/\").slice(-props.areaNode).join(\"/\");\r\n\t\t}\r\n\t});\r\n};\r\n\r\n// 切换Tab地区级别\r\nconst tabArea = (index) => {\r\n\tareaItems.value = [...areaStorage.value[index]];\r\n\tif (index < entity.value.length) {\r\n\t\tcurrent.value = areaItems.value.findIndex((e) => e.areaCode == entity.value[index].areaCode);\r\n\t} else {\r\n\t\tcurrent.value = null;\r\n\t}\r\n};\r\n\r\n//选择地区\r\nconst areaChange = (item, index) => {\r\n\tentity.value = entity.value.slice(0, index);\r\n\tentity.value.push(item);\r\n\tareaStorage.value = areaStorage.value.slice(0, index + 1);\r\n\tif (tabItems.value.length > tab.value + 1 && (props.minArea ? props.minArea > item.areaCode.length : true)) {\r\n\t\tgetTree(item.areaCode);\r\n\t\ttab.value++;\r\n\t}\r\n};\r\n\r\n// 加载下级地区\r\nconst getTree = (code) => {\r\n\tproxy.$vtk.request.getForm(`/dict/area/next/${code}`).then((res) => {\r\n\t\tareaItems.value = res.data;\r\n\t\tareaStorage.value.push(res.data);\r\n\t\tcurrent.value = null;\r\n\t\tnextTick(); //Vue 3中替代$forceUpdate\r\n\t});\r\n};\r\n\r\n// 加载第一个地区,用户所在地区\r\nconst getAreaName = (code) => {\r\n\tentity.value = [];\r\n\ttabItems.value = [\r\n\t\t{ text: \"省级\", leve: \"2\" },\r\n\t\t{ text: \"市级\", leve: \"4\" },\r\n\t\t{ text: \"区县\", leve: \"6\" },\r\n\t\t{ text: \"街镇\", leve: \"9\" },\r\n\t\t{ text: \"村社\", leve: \"12\" },\r\n\t].filter((e) => e.leve >= (props.areaCode || user.value?.areacode || user.value?.areaCode || '').length);\r\n\tareaStorage.value = [];\r\n\r\n\tproxy.$vtk.request.getForm(`/dict/area/show/${code}`).then((res) => {\r\n\t\tareaItems.value = [{ areaName: res.data.areaName, areaCode: res.data.areaCode }];\r\n\t\tareaStorage.value.push(areaItems.value);\r\n\t\tentity.value.push(areaItems.value[0]);\r\n\t});\r\n};\r\n\r\n//确认保存\r\nconst save = () => {\r\n\tlet text = [];\r\n\tlet val = [];\r\n\tentity.value.forEach((e) => {\r\n\t\ttext.push(e.areaName);\r\n\t\tval.push(e.areaCode);\r\n\t\titemValue.value = e.areaCode;\r\n\t});\r\n\tif (props.areaNode && props.areaNode > 0) {\r\n\t\ttext = text.slice(-props.areaNode);\r\n\t}\r\n\titemText.value = text.join().replace(/,/g, \"/\");\r\n\tconst lastItem = entity.value[entity.value.length - 1];\r\n\temit(\"update:modelValue\", props.returnObj ? { areaCode: lastItem?.areaCode, areaName: lastItem?.areaName } : itemValue.value);\r\n\temit(\"change\");\r\n\tclose();\r\n};\r\n\r\n// 清空\r\nconst textClear = () => {\r\n\ttab.value = 0;\r\n\tconst initCode = props.areaCode || user.value?.areacode || user.value?.areaCode;\r\n\tgetAreaName(initCode);\r\n\titemValue.value = initCode;\r\n\temit(\"update:modelValue\", itemValue.value);\r\n\temit(\"change\");\r\n};\r\n\r\n// 关闭弹窗\r\nconst close = () => {\r\n\tmenu.value = false;\r\n};\r\n\r\n// Watch modelValue\r\nwatch(() => props.modelValue, (newVal, oldVal) => {\r\n\tif (newVal && newVal != oldVal) {\r\n\t\tconst code = typeof newVal === 'object' ? newVal.areaCode : newVal;\r\n\t\tif (code) view(code);\r\n\t}\r\n});\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\t// 获取配置的键名,如果没有配置则使用默认值\r\n\tconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\n\tuser.value = proxy.$vtk.storage.get(userKey) && JSON.parse(proxy.$vtk.storage.get(userKey));\r\n\tconst initCode = props.areaCode || user.value?.areacode || user.value?.areaCode;\r\n\tif (initCode) {\r\n\t\tgetAreaName(initCode);\r\n\t}\r\n\tif (props.modelValue) {\r\n\t\tconst code = typeof props.modelValue === 'object' ? props.modelValue.areaCode : props.modelValue;\r\n\t\tif (code) view(code);\r\n\t}\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// 圆形按钮样式\r\n.area-select-btn {\r\n\tborder-radius: 20px !important;\r\n\tpadding: 6px 20px !important;\r\n\tmin-width: 120px;\r\n\theight: 36px !important;\r\n\ttext-transform: none;\r\n\tletter-spacing: normal;\r\n\r\n\t.btn-text {\r\n\t\tfont-size: 14px;\r\n\t\tcolor: inherit;\r\n\t}\r\n\r\n\t&:hover {\r\n\t\tbackground-color: rgba(var(--v-theme-primary), 0.08);\r\n\t}\r\n}\r\n:deep(.v-tab__slider) {\r\n\theight: 0px !important;\r\n}\r\n\r\n.link::after {\r\n\tcontent: \" / \";\r\n\tfont-size: 14px;\r\n\tcolor: #999;\r\n}\r\n.link:last-of-type::after {\r\n\tcontent: \"\";\r\n}\r\n:deep(.v-chip:not(.v-chip--selected)) {\r\n\tbackground: #e0e0e000;\r\n}\r\n// Vuetify 3 tabs container styling\r\n:deep(.v-tabs) {\r\n\theight: 40px;\r\n}\r\n// Tab button styling\r\n:deep(.v-tab) {\r\n\tmin-width: 90px;\r\n\theight: 32px !important;\r\n\tborder-radius: 6px !important;\r\n\tcolor: rgba(0, 0, 0, .6);\r\n\ttransition: all 0.3s ease;\r\n\tz-index: 1;\r\n}\r\n// Active/selected tab styling\r\n:deep(.v-tab--selected) {\r\n\tbackground-color: rgb(var(--v-theme-primary));\r\n\tcolor: white !important;\r\n\topacity: 1;\r\n}\r\n// Hover effect\r\n:deep(.v-tab:hover) {\r\n\tbackground-color: rgba(var(--v-theme-primary), 0.9);\r\n\tcolor: white;\r\n}\r\n.tabActive {\r\n\tcolor: #fff;\r\n}\r\n.chipActive {\r\n\tcolor: #0095ff !important;\r\n\tbackground-color: #008eff05 !important;\r\n}\r\n.active {\r\n\tcolor: #0095ff !important;\r\n\tbackground-color: #008eff20 !important;\r\n}\r\n:deep(.v-slide-group__next),\r\n:deep(.v-slide-group__prev) {\r\n\tdisplay: none;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"vtk-breadcrumb-wrapper d-flex align-center justify-space-between\">\r\n <!-- 左侧面包屑 -->\r\n <v-breadcrumbs :items=\"breadcrumbItems\" class=\"pa-0\">\r\n <template v-slot:divider>\r\n <v-icon>mdi-chevron-right</v-icon>\r\n </template>\r\n <template v-slot:item=\"{ item }\">\r\n <v-breadcrumbs-item\r\n :title=\"item.title\"\r\n :to=\"item.to\"\r\n :disabled=\"item.disabled\"\r\n :class=\"{ 'text-primary': !item.disabled }\"\r\n >\r\n {{ item.title }}\r\n </v-breadcrumbs-item>\r\n </template>\r\n </v-breadcrumbs>\r\n\r\n <!-- 右侧返回按钮 -->\r\n <v-btn\r\n v-if=\"showBack\"\r\n variant=\"text\"\r\n color=\"primary\"\r\n prepend-icon=\"mdi-arrow-left\"\r\n @click=\"handleBack\"\r\n style=\"height: 36px;\"\r\n >\r\n {{ backText }}\r\n </v-btn>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, inject, getCurrentInstance } from 'vue'\r\n\r\nconst props = defineProps({\r\n // 面包屑项目数组\r\n items: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否显示返回按钮\r\n showBack: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 返回按钮文字\r\n backText: {\r\n type: String,\r\n default: '返回'\r\n },\r\n // 自定义返回路径,不传则返回上一级\r\n backTo: {\r\n type: [String, Object],\r\n default: null\r\n }\r\n})\r\n\r\nconst emit = defineEmits(['back'])\r\n\r\n// 使用inject安全地获取router和route\r\nconst router = inject('router', null)\r\nconst route = inject('route', null)\r\n\r\n// 处理面包屑数据\r\nconst breadcrumbItems = computed(() => {\r\n if (props.items && props.items.length > 0) {\r\n return props.items.map((item, index) => ({\r\n title: item.title || item.text || item.name,\r\n to: item.to || item.path || item.href,\r\n disabled: item.disabled !== undefined ? item.disabled : index === props.items.length - 1\r\n }))\r\n }\r\n\r\n // 如果route不可用,返回空数组\r\n if (!route) {\r\n return []\r\n }\r\n\r\n // 如果没有传入items,尝试从路由meta中获取\r\n const matched = route.matched?.filter(r => r.meta && r.meta.breadcrumb) || []\r\n if (matched.length > 0) {\r\n return matched.map((r, index) => ({\r\n title: r.meta.breadcrumb,\r\n to: r.path,\r\n disabled: index === matched.length - 1\r\n }))\r\n }\r\n\r\n // 默认返回当前路由路径生成的面包屑\r\n const pathArray = route.path?.split('/').filter(p => p) || []\r\n return pathArray.map((path, index) => {\r\n const routePath = '/' + pathArray.slice(0, index + 1).join('/')\r\n return {\r\n title: path.charAt(0).toUpperCase() + path.slice(1),\r\n to: routePath,\r\n disabled: index === pathArray.length - 1\r\n }\r\n })\r\n})\r\n\r\n// 处理返回按钮点击\r\nconst handleBack = () => {\r\n // 触发back事件\r\n emit('back')\r\n\r\n // 如果router不可用,仅触发事件\r\n if (!router) {\r\n return\r\n }\r\n\r\n // 如果传入了backTo参数,跳转到指定路径\r\n if (props.backTo) {\r\n if (typeof props.backTo === 'string') {\r\n router.push(props.backTo)\r\n } else {\r\n router.push(props.backTo)\r\n }\r\n } else {\r\n // 默认返回上一级\r\n router.back()\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-breadcrumb-wrapper {\r\n width: 100%;\r\n padding: 12px 0;\r\n\r\n :deep(.v-breadcrumbs) {\r\n flex-grow: 1;\r\n height: 36px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-item) {\r\n font-size: 14px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-divider) {\r\n padding: 0 8px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-item--disabled) {\r\n opacity: 0.6;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <VInput \r\n v-bind=\"inputAttrs\" \r\n :model-value=\"inputValue\"\r\n >\r\n <div class=\"checkGroup\" :class=\"inline ? 'd-flex flex-wrap align-top' : 'd-inline-block'\">\r\n <VCheckbox\r\n v-for=\"item in items\"\r\n hide-details\r\n :key=\"item.id || item.code\"\r\n :label=\"item.codeValue\"\r\n :value=\"item.code\"\r\n v-model=\"localValue\"\r\n v-bind=\"checkboxAttrs\"\r\n :class=\"inline ? 'mr-4' : ''\"\r\n />\r\n </div>\r\n </VInput>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs, computed, watch } from 'vue';\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkCheckbox\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n /**\r\n * 字典来源:\r\n * - 若为静态数据,格式如:\"0:否/1:是\"\r\n * - 若为字典键,格式如:\"DISABLE_TYPE\"\r\n */\r\n list: {\r\n type: String,\r\n required: true,\r\n },\r\n /**\r\n * 是否横向排列\r\n */\r\n inline: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 绑定值\r\n */\r\n modelValue: {\r\n type: [Array, String],\r\n default: () => []\r\n }\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 本地选中值\r\nconst localValue = ref([]);\r\n\r\n// 防止递归更新的标志位\r\nconst isUpdatingLocal = ref(false);\r\nconst isUpdatingModel = ref(false);\r\n\r\n// 同步外部 modelValue 到本地值\r\nwatch(() => props.modelValue, (newVal) => {\r\n if (isUpdatingModel.value) {\r\n isUpdatingModel.value = false;\r\n return;\r\n }\r\n \r\n isUpdatingLocal.value = true;\r\n if (Array.isArray(newVal)) {\r\n localValue.value = [...newVal];\r\n } else if (typeof newVal === 'string') {\r\n localValue.value = newVal ? [newVal] : [];\r\n } else {\r\n localValue.value = [];\r\n }\r\n}, { immediate: true });\r\n\r\n// 同步本地值到外部 modelValue\r\nwatch(localValue, (newVal) => {\r\n if (isUpdatingLocal.value) {\r\n isUpdatingLocal.value = false;\r\n return;\r\n }\r\n \r\n isUpdatingModel.value = true;\r\n emit('update:modelValue', newVal);\r\n}, { deep: true });\r\n\r\n// 获取透传属性\r\nconst attrs = useAttrs();\r\n\r\n// 分离传递给 input 和传递给 checkbox 的属性\r\nconst inputAttrs = computed(() => {\r\n const { list, inline, modelValue, ...rest } = attrs;\r\n return rest;\r\n});\r\n\r\nconst checkboxAttrs = computed(() => {\r\n // 移除表单验证相关属性,避免重复应用\r\n const { \r\n list, \r\n inline, \r\n modelValue,\r\n error, \r\n 'error-messages': errorMessages, \r\n rules, \r\n hint, \r\n 'persistent-hint': persistentHint,\r\n ...rest \r\n } = attrs;\r\n return rest;\r\n});\r\n\r\n// 为 v-input 提供一个值\r\nconst inputValue = computed(() => {\r\n return localValue.value && localValue.value.length > 0 ? localValue.value : null;\r\n});\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 处理静态数据(如 \"0:否/1:是\")\r\nconst statc = () => {\r\n props.list.split('/').forEach(it => {\r\n const [code, codeValue] = it.split(':');\r\n items.value.push({ code, codeValue });\r\n });\r\n};\r\n\r\n// 请求远程字典数据\r\nconst miscs = async () => {\r\n try {\r\n const res = await Request.getForm(`dict/misc/list/${props.list}`);\r\n items.value = res.data || [];\r\n } catch (error) {\r\n console.error('[VtkCheckbox] Failed to load dictionary:', error);\r\n items.value = [];\r\n }\r\n};\r\n\r\n// 组件挂载时初始化数据\r\nonMounted(() => {\r\n if (props.list.includes(':')) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n:deep(.v-checkbox .v-selection-control) {\r\n margin: 0;\r\n padding: 0;\r\n min-height: 32px;\r\n}\r\n\r\n:deep(.v-input__details) {\r\n padding-inline: 16px;\r\n}\r\n</style>","<!-- \r\n\r\n// 基础用法\r\n <VtkCount :start=\"0\" :end=\"12345\" :duration=\"3000\" suffix=\"次\" />\r\n \r\n//带前缀和分隔符\r\n <VtkCount \r\n :start=\"0\" \r\n :end=\"999999\" \r\n :duration=\"2000\" \r\n prefix=\"¥\" \r\n suffix=\"元\" \r\n :separator=\"true\" \r\n />\r\n \r\n//手动控制\r\n <VtkCount \r\n ref=\"countRef\" \r\n :start=\"0\" \r\n :end=\"100\" \r\n :autoplay=\"false\" \r\n @complete=\"onComplete\"\r\n />\r\n <VBtn @click=\"startCount\">开始计数</VBtn>\r\n -->\r\n\r\n<template>\r\n <div class=\"vtk-count\" :class=\"containerClass\">\r\n <div class=\"count-display\" :style=\"{ color: color }\">\r\n <!-- 前缀 -->\r\n <span v-if=\"prefix\" class=\"prefix\">{{ prefix }}</span>\r\n \r\n <!-- 数字容器 -->\r\n <div class=\"digits-container\">\r\n <div \r\n v-for=\"(digitChar, index) in maxDigitString\" \r\n :key=\"`digit-${index}-${digitKey}`\"\r\n class=\"digit-wrapper\"\r\n :class=\"{ 'digit-separator': isNaN(digitChar) }\"\r\n >\r\n <div \r\n v-if=\"!isNaN(digitChar)\" \r\n class=\"digit-scroll\"\r\n >\r\n <div \r\n v-for=\"n in 10\" \r\n :key=\"n\" \r\n class=\"digit-item\"\r\n :style=\"getDigitStyle(getCurrentDigit(index), n-1)\"\r\n >\r\n {{ n-1 }}\r\n </div>\r\n </div>\r\n <div v-else class=\"separator\">{{ digitChar }}</div>\r\n </div>\r\n </div>\r\n \r\n <!-- 后缀 -->\r\n <span v-if=\"suffix\" class=\"suffix\">{{ suffix }}</span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, onMounted, watch, nextTick } from 'vue'\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkCount\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 初始值\r\n start: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 目标值\r\n end: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 动画持续时间(毫秒)\r\n duration: {\r\n type: Number,\r\n default: 2000\r\n },\r\n // 是否自动开始动画\r\n autoplay: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 数字前缀\r\n prefix: {\r\n type: String,\r\n default: ''\r\n },\r\n // 数字后缀\r\n suffix: {\r\n type: String,\r\n default: ''\r\n },\r\n // 容器自定义类名\r\n containerClass: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否使用分隔符(千分位)\r\n separator: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 小数位数\r\n decimals: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 文字颜色\r\n color: {\r\n type: String,\r\n default: '#1976d2'\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['complete'])\r\n\r\n// 当前显示的数值\r\nconst currentNumber = ref(props.start)\r\n\r\n// 当前每个位置的数字值\r\nconst currentDigits = ref([])\r\n\r\n// 用于强制重新渲染的key\r\nconst digitKey = ref(0)\r\n\r\n// 是否正在动画中\r\nconst isAnimating = ref(false)\r\n\r\n// 格式化数字(处理小数和分隔符)\r\nconst formatNumber = (num) => {\r\n let result = num.toFixed(props.decimals)\r\n if (props.separator && props.decimals === 0) {\r\n result = result.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\r\n }\r\n return result\r\n}\r\n\r\n// 获取目标数字字符串\r\nconst targetNumberString = computed(() => {\r\n return formatNumber(props.end)\r\n})\r\n\r\n// 获取起始数字字符串\r\nconst startNumberString = computed(() => {\r\n return formatNumber(props.start)\r\n})\r\n\r\n// 获取最大位数的字符串(用于保持DOM结构稳定)\r\nconst maxDigitString = computed(() => {\r\n const target = targetNumberString.value\r\n const start = startNumberString.value\r\n return target.length >= start.length ? target : start\r\n})\r\n\r\n// 获取当前指定位置的数字\r\nconst getCurrentDigit = (index) => {\r\n if (index < currentDigits.value.length) {\r\n return currentDigits.value[index]\r\n }\r\n return '0'\r\n}\r\n\r\n// 初始化数字数组\r\nconst initDigitsArray = () => {\r\n const targetStr = targetNumberString.value\r\n const startStr = startNumberString.value\r\n \r\n // 初始化currentDigits数组,确保长度与maxDigitString一致\r\n currentDigits.value = maxDigitString.value.split('').map((char, index) => {\r\n if (isNaN(char)) {\r\n return char // 分隔符保持原样\r\n }\r\n \r\n // 从起始字符串对应位置获取数字\r\n if (index < startStr.length) {\r\n const startChar = startStr[index]\r\n return isNaN(startChar) ? '0' : startChar\r\n }\r\n return '0'\r\n })\r\n}\r\n\r\n// 获取数字样式\r\nconst getDigitStyle = (currentValue, digitValue) => {\r\n // 如果是分隔符,直接返回\r\n if (isNaN(currentValue) || isNaN(digitValue)) {\r\n return {\r\n transform: 'translateY(0)'\r\n }\r\n }\r\n \r\n const current = parseInt(currentValue) || 0\r\n const target = digitValue\r\n const offset = target - current\r\n \r\n // 处理循环滚动(9->0 或 0->9)\r\n let translateY\r\n if (offset > 5) {\r\n // 向下滚动(如 9->0)\r\n translateY = -(10 - offset) * 100\r\n } else if (offset < -5) {\r\n // 向上滚动(如 0->9)\r\n translateY = (10 + offset) * 100\r\n } else {\r\n translateY = -offset * 100\r\n }\r\n \r\n return {\r\n transform: `translateY(${translateY}%)`,\r\n transition: isAnimating.value ? 'transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)' : 'none',\r\n color: props.color\r\n }\r\n}\r\n\r\n// 开始数字动画\r\nconst startAnimation = () => {\r\n if (isAnimating.value) return\r\n \r\n isAnimating.value = true\r\n const startTime = performance.now()\r\n const startValue = props.start\r\n const endValue = props.end\r\n const diff = endValue - startValue\r\n \r\n // 初始化数字数组\r\n initDigitsArray()\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime\r\n const progress = Math.min(elapsed / props.duration, 1)\r\n \r\n // 使用缓动函数使动画更自然\r\n const easeOutQuart = 1 - Math.pow(1 - progress, 4)\r\n currentNumber.value = startValue + diff * easeOutQuart\r\n \r\n // 更新每个数字位的当前值\r\n updateDigitArray(currentNumber.value)\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate)\r\n } else {\r\n currentNumber.value = endValue\r\n // 确保最终值准确\r\n updateDigitArray(endValue)\r\n isAnimating.value = false\r\n emit('complete')\r\n }\r\n }\r\n \r\n requestAnimationFrame(animate)\r\n}\r\n\r\n// 更新数字数组\r\nconst updateDigitArray = (value) => {\r\n const valueStr = formatNumber(value)\r\n const maxStr = maxDigitString.value\r\n \r\n // 保持数组长度不变,只更新值\r\n for (let i = 0; i < maxStr.length; i++) {\r\n if (i < valueStr.length) {\r\n currentDigits.value[i] = valueStr[i]\r\n } else {\r\n // 超出部分保持为'0'或分隔符\r\n currentDigits.value[i] = isNaN(maxStr[i]) ? maxStr[i] : '0'\r\n }\r\n }\r\n}\r\n\r\n// 监听 end 值变化,重新开始动画\r\nwatch(() => props.end, (newVal, oldVal) => {\r\n if (newVal !== oldVal) {\r\n // 当位数可能发生变化时,更新key强制重新渲染\r\n const newStr = formatNumber(newVal)\r\n const oldStr = formatNumber(oldVal)\r\n if (newStr.length !== oldStr.length) {\r\n digitKey.value += 1\r\n nextTick(() => {\r\n startAnimation()\r\n })\r\n } else {\r\n startAnimation()\r\n }\r\n }\r\n})\r\n\r\n// 组件挂载时开始动画\r\nonMounted(() => {\r\n if (props.autoplay) {\r\n // 检查初始值和目标值位数是否不同,如果不同则更新key\r\n const startStr = startNumberString.value\r\n const endStr = targetNumberString.value\r\n if (startStr.length !== endStr.length) {\r\n digitKey.value += 1\r\n }\r\n \r\n nextTick(() => {\r\n startAnimation()\r\n })\r\n }\r\n})\r\n\r\n// 提供外部调用方法\r\ndefineExpose({\r\n startAnimation\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-count {\r\n display: inline-block;\r\n}\r\n\r\n.count-display {\r\n display: flex;\r\n align-items: center;\r\n font-family: 'Roboto Mono', monospace;\r\n font-size: 24px;\r\n font-weight: bold;\r\n}\r\n\r\n.digits-container {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.digit-wrapper {\r\n position: relative;\r\n width: 1em;\r\n height: 1em;\r\n overflow: hidden;\r\n text-align: center;\r\n margin: 0 1px;\r\n}\r\n\r\n.digit-wrapper.digit-separator {\r\n width: auto;\r\n animation: none;\r\n}\r\n\r\n.digit-scroll {\r\n position: relative;\r\n height: 100%;\r\n}\r\n\r\n.digit-item {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.separator {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n font-weight: normal;\r\n}\r\n\r\n.prefix, .suffix {\r\n font-size: 0.8em;\r\n align-self: flex-end;\r\n margin-bottom: 0.1em;\r\n}\r\n\r\n.prefix {\r\n margin-right: 4px;\r\n}\r\n\r\n.suffix {\r\n margin-left: 4px;\r\n}\r\n\r\n/* 响应式设计 */\r\n@media (max-width: 768px) {\r\n .count-display {\r\n font-size: 20px;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .count-display {\r\n font-size: 18px;\r\n }\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-date-range-picker\">\r\n <VMenu\r\n v-model=\"menu\"\r\n :close-on-content-click=\"false\"\r\n transition=\"scale-transition\"\r\n offset-y\r\n min-width=\"auto\"\r\n eager\r\n >\r\n <template #activator=\"{ props: activatorProps }\">\r\n <VTextField\r\n v-bind=\"{ ...activatorProps, ...textFieldProps }\"\r\n v-model=\"displayValue\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n readonly\r\n clearable\r\n density=\"compact\"\r\n variant=\"outlined\"\r\n @click:clear=\"clearValue\"\r\n >\r\n <template #prepend-inner>\r\n <VIcon size=\"small\">mdi-calendar</VIcon>\r\n </template>\r\n </VTextField>\r\n </template>\r\n \r\n <VCard style=\"width: 650px;\">\r\n <VCardText class=\"pa-0\">\r\n <div class=\"date-picker-container\">\r\n <VDatePicker\r\n v-model=\"startDateRange\"\r\n hide-header\r\n :min=\"minDate\"\r\n :max=\"maxDate\"\r\n :show-current=\"showCurrent\"\r\n @update:model-value=\"onStartDateChange\"\r\n class=\"date-picker-item\"\r\n />\r\n <VDatePicker\r\n v-model=\"endDateRange\"\r\n hide-header\r\n :min=\"minDate\"\r\n :max=\"maxDate\"\r\n :show-current=\"showCurrent\"\r\n @update:model-value=\"onEndDateChange\"\r\n class=\"date-picker-item\"\r\n />\r\n </div>\r\n </VCardText>\r\n \r\n <VDivider></VDivider>\r\n \r\n <VCardActions>\r\n <VSpacer></VSpacer>\r\n <VBtn text @click=\"cancel\">取消</VBtn>\r\n <VBtn color=\"primary\" variant=\"tonal\" @click=\"confirm\">确定</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VMenu>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, useAttrs } from 'vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkDatePicker\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n // v-model绑定值\r\n modelValue: {\r\n type: [Array, String],\r\n default: () => []\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: '请选择日期范围'\r\n },\r\n // 禁用状态\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最小日期\r\n min: {\r\n type: String,\r\n default: undefined\r\n },\r\n // 最大日期\r\n max: {\r\n type: String,\r\n default: undefined\r\n },\r\n // 是否显示当前日期\r\n showCurrent: {\r\n type: [Boolean, String],\r\n default: true\r\n },\r\n // 显示格式\r\n format: {\r\n type: String,\r\n default: 'YYYY-MM-DD'\r\n },\r\n // 分隔符\r\n separator: {\r\n type: String,\r\n default: ' 至 '\r\n }\r\n});\r\n\r\n// 定义emit事件\r\nconst emit = defineEmits(['update:modelValue', 'change']);\r\n\r\n// 获取透传属性\r\nconst attrs = useAttrs();\r\n\r\n// 菜单显示控制\r\nconst menu = ref(false);\r\n\r\n// 日期范围值\r\nconst dateRange = ref([]);\r\n\r\n// 为了横向排列,需要分别管理开始和结束日期选择器的值\r\nconst startDateRange = ref(null);\r\nconst endDateRange = ref(null);\r\n\r\n\r\n// 显示值\r\nconst displayValue = computed(() => {\r\n if (!dateRange.value || dateRange.value.length === 0) {\r\n return '';\r\n }\r\n \r\n if (dateRange.value.length === 1) {\r\n return formatDate(dateRange.value[0]);\r\n }\r\n \r\n return `${formatDate(dateRange.value[0])}${props.separator}${formatDate(dateRange.value[1])}`;\r\n});\r\n\r\n// 文本框属性\r\nconst textFieldProps = computed(() => {\r\n // 排除我们自己使用的属性\r\n const { \r\n modelValue, \r\n placeholder, \r\n disabled, \r\n min, \r\n max, \r\n showCurrent, \r\n format,\r\n separator,\r\n ...rest \r\n } = attrs;\r\n \r\n return rest;\r\n});\r\n\r\n// 格式化日期\r\nconst formatDate = (date) => {\r\n if (!date) return '';\r\n \r\n // 如果是字符串直接返回\r\n if (typeof date === 'string') {\r\n return date;\r\n }\r\n \r\n // 如果是 Date 对象\r\n if (date instanceof Date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n \r\n return date;\r\n};\r\n\r\n// 最小日期\r\nconst minDate = computed(() => props.min);\r\n\r\n// 最大日期\r\nconst maxDate = computed(() => props.max);\r\n\r\n// 监听外部modelValue变化\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (Array.isArray(newValue) && newValue.length > 0) {\r\n dateRange.value = [...newValue];\r\n // 同步到单独的日期选择器\r\n if (newValue[0]) startDateRange.value = newValue[0];\r\n if (newValue[1]) endDateRange.value = newValue[1];\r\n } else if (typeof newValue === 'string' && newValue) {\r\n // 处理字符串形式的日期范围,如 \"2023-01-01 至 2023-01-31\"\r\n const dates = newValue.split(props.separator);\r\n if (dates.length === 2) {\r\n dateRange.value = [dates[0].trim(), dates[1].trim()];\r\n startDateRange.value = dates[0].trim();\r\n endDateRange.value = dates[1].trim();\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n },\r\n { immediate: true }\r\n);\r\n\r\n\r\n// 开始日期变化处理\r\nconst onStartDateChange = (value) => {\r\n // 更新日期范围的第一个值\r\n if (value) {\r\n dateRange.value = [value, dateRange.value[1] || null];\r\n } else {\r\n // 如果开始日期被清除,清除整个范围或只清除开始日期\r\n if (dateRange.value.length > 0) {\r\n dateRange.value = [null, dateRange.value[1] || null];\r\n }\r\n }\r\n};\r\n\r\n// 结束日期变化处理\r\nconst onEndDateChange = (value) => {\r\n // 更新日期范围的第二个值\r\n if (value) {\r\n dateRange.value = [dateRange.value[0] || null, value];\r\n } else {\r\n // 如果结束日期被清除,只清除结束日期\r\n if (dateRange.value.length > 1) {\r\n dateRange.value = [dateRange.value[0] || null, null];\r\n }\r\n }\r\n};\r\n\r\n// 清除值\r\nconst clearValue = () => {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n emit('update:modelValue', []);\r\n emit('change', []);\r\n menu.value = false;\r\n};\r\n\r\n// 取消\r\nconst cancel = () => {\r\n // 恢复到原始值\r\n if (Array.isArray(props.modelValue)) {\r\n dateRange.value = [...props.modelValue];\r\n if (props.modelValue[0]) startDateRange.value = props.modelValue[0];\r\n if (props.modelValue[1]) endDateRange.value = props.modelValue[1];\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n menu.value = false;\r\n};\r\n\r\n// 确认\r\nconst confirm = () => {\r\n // 确保日期按顺序排列\r\n let sortedRange = [...dateRange.value].filter(date => date !== null);\r\n if (sortedRange.length === 2) {\r\n const date1 = new Date(sortedRange[0]);\r\n const date2 = new Date(sortedRange[1]);\r\n if (date1 > date2) {\r\n sortedRange = [sortedRange[1], sortedRange[0]];\r\n }\r\n } else if (sortedRange.length === 1) {\r\n // 如果只有一个日期,复制为范围\r\n sortedRange = [sortedRange[0], sortedRange[0]];\r\n }\r\n \r\n emit('update:modelValue', sortedRange);\r\n emit('change', sortedRange);\r\n menu.value = false;\r\n};\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-date-range-picker {\r\n width: 100%;\r\n}\r\n\r\n.date-picker-container {\r\n display: flex;\r\n flex-direction: row;\r\n gap: 0;\r\n}\r\n\r\n.date-picker-item {\r\n flex: 1;\r\n max-width: 50%;\r\n}\r\n\r\n.date-picker-item:first-child {\r\n border-right: 1px solid rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n:deep(.v-picker) {\r\n border-radius: 0;\r\n}\r\n\r\n:deep(.v-date-picker-month__day--adjacent) {\r\n opacity: 0.5;\r\n}\r\n\r\n:deep(.v-date-picker-title) {\r\n display: none;\r\n}\r\n</style>","<template>\n <div ref=\"headerRef\" class=\"panel-header\" @keydown.esc.stop=\"closePicker\">\n <button type=\"button\" class=\"panel-nav\" aria-label=\"上一周期\" @click=\"handleNavigate('prev')\">‹</button>\n\n <div class=\"panel-title\">\n <button type=\"button\" class=\"title-trigger\" :class=\"{ active: openPicker === 'year' }\"\n :aria-expanded=\"openPicker === 'year'\" aria-label=\"选择年份\" @click.stop=\"togglePicker('year')\">\n {{ year }}年\n </button>\n <button v-if=\"showMonth\" type=\"button\" class=\"title-trigger month-trigger\"\n :class=\"{ active: openPicker === 'month' }\" :aria-expanded=\"openPicker === 'month'\" aria-label=\"选择月份\"\n @click.stop=\"togglePicker('month')\">\n {{ month + 1 }}月\n </button>\n </div>\n\n <button type=\"button\" class=\"panel-nav\" aria-label=\"下一周期\" @click=\"handleNavigate('next')\">›</button>\n\n <div v-if=\"openPicker\" class=\"panel-popover\" @click.stop>\n <template v-if=\"openPicker === 'year'\">\n <div class=\"picker-navigation\">\n <button type=\"button\" class=\"picker-nav\" aria-label=\"上一组年份\" @click=\"shiftYearPage(-YEAR_PAGE_SIZE)\">\n ‹\n </button>\n <span class=\"picker-range\">{{ yearPage[0] }} - {{ yearPage[yearPage.length - 1] }}</span>\n <button type=\"button\" class=\"picker-nav\" :disabled=\"!canShowNextYearPage\" aria-label=\"下一组年份\"\n @click=\"shiftYearPage(YEAR_PAGE_SIZE)\">\n ›\n </button>\n </div>\n <div class=\"picker-grid year-picker-grid\">\n <button v-for=\"item in yearPage\" :key=\"item\" type=\"button\" class=\"picker-option\"\n :class=\"{ selected: item === year }\" :disabled=\"isYearDisabled(item)\" @click=\"selectYear(item)\">\n {{ item }}\n </button>\n </div>\n </template>\n\n <template v-else>\n <div class=\"picker-caption\">{{ year }}年</div>\n <div class=\"picker-grid month-picker-grid\">\n <button v-for=\"(item, index) in MONTHS\" :key=\"item\" type=\"button\" class=\"picker-option\"\n :class=\"{ selected: index === month }\" :disabled=\"isMonthDisabled(index)\" @click=\"selectMonth(index)\">\n {{ item }}\n </button>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkDatePanelHeader',\n});\n\nconst props = defineProps({\n year: {\n type: Number,\n required: true\n },\n month: {\n type: Number,\n default: 0\n },\n showMonth: {\n type: Boolean,\n default: true\n },\n maxYear: {\n type: Number,\n default: null\n },\n maxMonth: {\n type: Number,\n default: 11\n }\n});\n\nconst emit = defineEmits(['update:year', 'update:month', 'prev', 'next']);\n\nconst YEAR_PAGE_SIZE = 12;\nconst YEAR_PAGE_CENTER_OFFSET = 4;\nconst MONTHS = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\n\nconst getYearPageStart = (year) => year - YEAR_PAGE_CENTER_OFFSET;\n\nconst openPicker = ref(null);\nconst yearPageStart = ref(getYearPageStart(props.year));\nconst headerRef = ref(null);\n\nconst yearPage = computed(() =>\n Array.from({ length: YEAR_PAGE_SIZE }, (_, index) => yearPageStart.value + index)\n);\n\nconst canShowNextYearPage = computed(() =>\n props.maxYear === null || yearPageStart.value + YEAR_PAGE_SIZE <= props.maxYear\n);\n\nconst isYearDisabled = (year) => props.maxYear !== null && year > props.maxYear;\n\nconst isMonthDisabled = (month) => {\n if (props.maxYear === null || props.year < props.maxYear) return false;\n if (props.year > props.maxYear) return true;\n return month > props.maxMonth;\n};\n\nconst togglePicker = (type) => {\n if (openPicker.value === type) {\n closePicker();\n return;\n }\n\n if (type === 'year') {\n yearPageStart.value = getYearPageStart(props.year);\n }\n openPicker.value = type;\n};\n\nconst closePicker = () => {\n openPicker.value = null;\n};\n\nconst shiftYearPage = (offset) => {\n const nextStart = yearPageStart.value + offset;\n if (offset > 0 && props.maxYear !== null && nextStart > props.maxYear) return;\n yearPageStart.value = nextStart;\n};\n\nconst selectYear = (year) => {\n if (isYearDisabled(year)) return;\n\n emit('update:year', year);\n if (props.showMonth) {\n if (props.maxYear !== null && year === props.maxYear && props.month > props.maxMonth) {\n emit('update:month', props.maxMonth);\n }\n openPicker.value = 'month';\n } else {\n closePicker();\n }\n};\n\nconst selectMonth = (month) => {\n if (isMonthDisabled(month)) return;\n emit('update:month', month);\n closePicker();\n};\n\nconst handleNavigate = (direction) => {\n closePicker();\n emit(direction);\n};\n\nconst handleOutsideClick = (event) => {\n if (openPicker.value && !headerRef.value?.contains(event.target)) {\n closePicker();\n }\n};\n\nwatch(() => props.year, (year) => {\n if (openPicker.value !== 'year') {\n yearPageStart.value = getYearPageStart(year);\n }\n});\n\nonMounted(() => document.addEventListener('click', handleOutsideClick));\nonBeforeUnmount(() => document.removeEventListener('click', handleOutsideClick));\n</script>\n\n<style scoped>\n.panel-header {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 30px;\n margin-bottom: 4px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 112px;\n}\n\n.title-trigger,\n.panel-nav,\n.picker-nav,\n.picker-option {\n border: 0;\n outline: none;\n font: inherit;\n}\n\n.title-trigger {\n position: relative;\n padding: 5px 17px 5px 7px;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.title-trigger::after {\n position: absolute;\n top: 10px;\n right: 7px;\n width: 5px;\n height: 5px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n content: '';\n transform: rotate(45deg);\n transition: transform 0.18s ease;\n}\n\n.title-trigger:hover,\n.title-trigger.active {\n background: rgb(var(--v-theme-primary), 0.1);\n color: rgb(var(--v-theme-primary));\n}\n\n.title-trigger.active::after {\n top: 12px;\n transform: rotate(225deg);\n}\n\n.month-trigger {\n margin-left: 1px;\n}\n\n.panel-nav,\n.picker-nav {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface), 0.55);\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.panel-nav {\n width: 24px;\n height: 24px;\n font-size: 17px;\n}\n\n.panel-nav:hover,\n.picker-nav:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n color: rgb(var(--v-theme-on-surface));\n}\n\n.panel-popover {\n position: absolute;\n z-index: 5;\n top: 34px;\n left: 50%;\n width: 204px;\n padding: 10px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 8px;\n background: rgb(var(--v-theme-surface));\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16);\n transform: translateX(-50%);\n}\n\n.picker-navigation {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.picker-range,\n.picker-caption {\n color: rgb(var(--v-theme-on-surface), 0.72);\n font-size: 12px;\n font-weight: 600;\n}\n\n.picker-caption {\n margin-bottom: 8px;\n text-align: center;\n}\n\n.picker-nav {\n width: 24px;\n height: 24px;\n font-size: 16px;\n}\n\n.picker-nav:disabled {\n color: rgb(var(--v-theme-on-surface), 0.22);\n cursor: not-allowed;\n}\n\n.picker-grid {\n display: grid;\n gap: 6px;\n}\n\n.year-picker-grid,\n.month-picker-grid {\n grid-template-columns: repeat(4, 1fr);\n}\n\n.picker-option {\n min-width: 0;\n padding: 7px 2px;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface), 0.82);\n font-size: 12px;\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.picker-option:hover:not(:disabled) {\n background: rgb(var(--v-theme-primary), 0.1);\n color: rgb(var(--v-theme-primary));\n}\n\n.picker-option.selected {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n font-weight: 600;\n}\n\n.picker-option:disabled {\n color: rgb(var(--v-theme-on-surface), 0.24);\n cursor: not-allowed;\n}\n</style>\n","<template>\r\n <div class=\"vtk-date-selector\" :style=\"rootStyle\">\r\n <VMenu\r\n v-if=\"!inline\"\r\n v-model=\"showPicker\"\r\n :attach=\"menuAttach\"\r\n :location=\"menuLocation\"\r\n :origin=\"menuOrigin\"\r\n offset=\"4\"\r\n :close-on-content-click=\"false\"\r\n >\r\n <template #activator=\"{ props: menuProps }\">\r\n <div class=\"date-input\">\r\n <VTextField :model-value=\"displayValue\" :label=\"label || undefined\" :placeholder=\"placeholder\"\r\n :disabled=\"disabled\" density=\"compact\" variant=\"outlined\" hide-details readonly v-bind=\"menuProps\"\r\n :clearable=\"!!displayValue && !disabled\" clear-icon=\"mdi-close-circle\" persistent-clear\r\n class=\"date-input-field\" @click:clear.stop=\"clearValue\">\r\n <template #append-inner>\r\n <span class=\"date-icon\" aria-hidden=\"true\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" class=\"date-icon-svg\">\r\n <path\r\n d=\"M7 2.75a.75.75 0 0 1 .75.75V5h8.5V3.5a.75.75 0 0 1 1.5 0V5h.75A2.5 2.5 0 0 1 21 7.5v10A2.5 2.5 0 0 1 18.5 20h-13A2.5 2.5 0 0 1 3 17.5v-10A2.5 2.5 0 0 1 5.5 5h.75V3.5A.75.75 0 0 1 7 2.75ZM4.5 10v7.5c0 .552.448 1 1 1h13c.552 0 1-.448 1-1V10h-15Zm1-3.5c-.552 0-1 .448-1 1v1h15v-1c0-.552-.448-1-1-1h-.75v1a.75.75 0 0 1-1.5 0v-1h-8.5v1a.75.75 0 0 1-1.5 0v-1H5.5Zm2.25 5.75a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm-8.5 3.75a.75.75 0 0 1 .75.75V17a.75.75 0 0 1-1.5 0v-.25a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75V17a.75.75 0 0 1-1.5 0v-.25a.75.75 0 0 1 .75-.75Z\"\r\n fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n </template>\r\n </VTextField>\r\n </div>\r\n </template>\r\n <div class=\"date-picker-dropdown\" :style=\"popupStyle\" @click.stop @mousedown.stop>\r\n <!-- 头部控制区(非日期/月份范围选择模式时显示) -->\r\n <div v-if=\"!(mode === 'range' && (displayMode === 'day' || displayMode === 'month'))\" class=\"picker-header\">\r\n <button class=\"nav-btn\" @click=\"prevPeriod\">‹</button>\r\n <div class=\"header-title\">\r\n <span @click=\"changeViewMode('year')\" class=\"clickable\">{{ currentYear }}年</span>\r\n <span v-if=\"displayMode !== 'year' && viewMode !== 'month'\" @click=\"changeViewMode('month')\"\r\n class=\"clickable\">{{\r\n currentMonth + 1\r\n }}月</span>\r\n </div>\r\n <button class=\"nav-btn\" @click=\"nextPeriod\">›</button>\r\n </div>\r\n\r\n <!-- 年份选择视图 -->\r\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\r\n <div class=\"year-grid\">\r\n <div v-for=\"year in yearList\" :key=\"year\"\r\n :class=\"['year-item', { 'selected': isYearSelected(year), 'in-range': isYearInRange(year), 'disabled': isFutureYear(year) }]\"\r\n @click=\"selectYear(year)\">\r\n {{ year }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 月份选择视图 -->\r\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个年份的月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" :show-month=\"false\"\r\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYear\" @next=\"nextYearLeft\" />\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" :show-month=\"false\"\r\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYearRight\" @next=\"nextYear\" />\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelectedRight(index), 'in-range': isMonthInRangeRight(index), 'disabled': isFutureMonth(index, rightYear) }]\"\r\n @click=\"selectMonthRight(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个年份的月份 -->\r\n <div v-else>\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 周选择视图 -->\r\n <div v-else-if=\"viewMode === 'week'\" class=\"picker-body\">\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"week-grid\">\r\n <div v-for=\"week in weekList\" :key=\"week.weekNumber\"\r\n :class=\"['week-row', { 'selected': isWeekSelected(week), 'in-range': isWeekInRange(week) }]\"\r\n @click=\"selectWeek(week)\">\r\n <div class=\"week-number\">W{{ week.weekNumber }}</div>\r\n <div v-for=\"day in week.days\" :key=\"day.date\"\r\n :class=\"['day-cell', { 'other-month': day.otherMonth, 'today': day.isToday }]\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 日期选择视图(默认) -->\r\n <div v-else class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" v-model:month=\"currentMonth\"\r\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonth\"\r\n @next=\"nextMonthLeft\" />\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" v-model:month=\"rightMonth\"\r\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonthRight\"\r\n @next=\"nextMonth\" />\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in nextMonthDayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个月份 -->\r\n <div v-else>\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"mode === 'range' && (displayMode === 'day' || displayMode === 'month')\" class=\"range-display\">\r\n <span class=\"range-text\">\r\n <template v-if=\"tempValue && Array.isArray(tempValue) && tempValue.length > 0\">\r\n {{ tempValue[0] || (displayMode === 'month' ? '开始月份' : '开始日期') }}\r\n <span class=\"range-separator\"> - </span>\r\n {{ tempValue[1] || (displayMode === 'month' ? '结束月份' : '结束日期') }}\r\n </template>\r\n <template v-else>\r\n <span class=\"placeholder-text\">{{ displayMode === 'month' ? '请选择月份范围' : '请选择日期范围' }}</span>\r\n </template>\r\n </span>\r\n </div>\r\n <div class=\"picker-footer\">\r\n <button class=\"btn btn-text\" @click=\"handleCancel\">取消</button>\r\n <button class=\"btn btn-primary\" @click=\"handleConfirm\">确定</button>\r\n </div>\r\n </div>\r\n </VMenu>\r\n <div v-if=\"inline\" class=\"date-picker-dropdown inline-mode\" :style=\"popupStyle\" @click.stop @mousedown.stop>\r\n <!-- 头部控制区(非日期/月份范围选择模式时显示) -->\r\n <div v-if=\"!(mode === 'range' && (displayMode === 'day' || displayMode === 'month'))\" class=\"picker-header\">\r\n <button class=\"nav-btn\" @click=\"prevPeriod\">‹</button>\r\n <div class=\"header-title\">\r\n <span @click=\"changeViewMode('year')\" class=\"clickable\">{{ currentYear }}年</span>\r\n <span v-if=\"displayMode !== 'year' && viewMode !== 'month'\" @click=\"changeViewMode('month')\"\r\n class=\"clickable\">{{\r\n currentMonth + 1\r\n }}月</span>\r\n </div>\r\n <button class=\"nav-btn\" @click=\"nextPeriod\">›</button>\r\n </div>\r\n\r\n <!-- 年份选择视图 -->\r\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\r\n <div class=\"year-grid\">\r\n <div v-for=\"year in yearList\" :key=\"year\"\r\n :class=\"['year-item', { 'selected': isYearSelected(year), 'in-range': isYearInRange(year), 'disabled': isFutureYear(year) }]\"\r\n @click=\"selectYear(year)\">\r\n {{ year }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 月份选择视图 -->\r\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个年份的月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" :show-month=\"false\"\r\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYear\" @next=\"nextYearLeft\" />\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" :show-month=\"false\"\r\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYearRight\" @next=\"nextYear\" />\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelectedRight(index), 'in-range': isMonthInRangeRight(index), 'disabled': isFutureMonth(index, rightYear) }]\"\r\n @click=\"selectMonthRight(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个年份的月份 -->\r\n <div v-else>\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 周选择视图 -->\r\n <div v-else-if=\"viewMode === 'week'\" class=\"picker-body\">\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"week-grid\">\r\n <div v-for=\"week in weekList\" :key=\"week.weekNumber\"\r\n :class=\"['week-row', { 'selected': isWeekSelected(week), 'in-range': isWeekInRange(week) }]\"\r\n @click=\"selectWeek(week)\">\r\n <div class=\"week-number\">W{{ week.weekNumber }}</div>\r\n <div v-for=\"day in week.days\" :key=\"day.date\"\r\n :class=\"['day-cell', { 'other-month': day.otherMonth, 'today': day.isToday }]\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 日期选择视图(默认) -->\r\n <div v-else class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" v-model:month=\"currentMonth\"\r\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonth\"\r\n @next=\"nextMonthLeft\" />\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" v-model:month=\"rightMonth\"\r\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonthRight\"\r\n @next=\"nextMonth\" />\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in nextMonthDayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个月份 -->\r\n <div v-else>\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"mode === 'range' && (displayMode === 'day' || displayMode === 'month')\" class=\"range-display\">\r\n <span class=\"range-text\">\r\n <template v-if=\"tempValue && Array.isArray(tempValue) && tempValue.length > 0\">\r\n {{ tempValue[0] || (displayMode === 'month' ? '开始月份' : '开始日期') }}\r\n <span class=\"range-separator\"> - </span>\r\n {{ tempValue[1] || (displayMode === 'month' ? '结束月份' : '结束日期') }}\r\n </template>\r\n <template v-else>\r\n <span class=\"placeholder-text\">{{ displayMode === 'month' ? '请选择月份范围' : '请选择日期范围' }}</span>\r\n </template>\r\n </span>\r\n </div>\r\n <div class=\"picker-footer\">\r\n <button class=\"btn btn-text\" @click=\"handleCancel\">取消</button>\r\n <button class=\"btn btn-primary\" @click=\"handleConfirm\">确定</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch } from 'vue';\r\nimport VtkDatePanelHeader from './VtkDatePanelHeader.vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: 'VtkDateSelector',\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // v-model 绑定值\r\n modelValue: {\r\n type: [String, Array],\r\n default: null\r\n },\r\n // 显示模式: 'day' | 'week' | 'month' | 'year'\r\n displayMode: {\r\n type: String,\r\n default: 'day',\r\n validator: (value) => ['day', 'week', 'month', 'year'].includes(value)\r\n },\r\n // 选择模式: 'single' | 'range'\r\n mode: {\r\n type: String,\r\n default: 'single',\r\n validator: (value) => ['single', 'range'].includes(value)\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: '请选择日期'\r\n },\r\n // 输入框标签\r\n label: {\r\n type: String,\r\n default: ''\r\n },\r\n // 输入框宽度,数字按 px 处理,也支持 100%、12rem 等 CSS 宽度\r\n width: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n // 日期弹层宽度,数字按 px 处理,也支持 100%、24rem 等 CSS 宽度\r\n popupWidth: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n // 禁用状态\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 日期格式\r\n format: {\r\n type: String,\r\n default: 'YYYY-MM-DD'\r\n },\r\n // 范围分隔符\r\n separator: {\r\n type: String,\r\n default: ' 至 '\r\n },\r\n // 内联模式(直接显示选择器,不需要点击输入框)\r\n inline: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 单面板模式(范围选择时只显示一个面板)\r\n singlePanel: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 禁用未来日期(大于当前日期的都置灰不可选)\r\n disableFuture: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义取消方法\r\n onCancel: {\r\n type: Function,\r\n default: null\r\n },\r\n // 自定义确认方法\r\n onConfirm: {\r\n type: Function,\r\n default: null\r\n },\r\n // 禁用 Teleport 时,弹层保留在当前 DOM 树内\r\n noTeleport: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 下拉框对齐方式: 'left' | 'right'\r\n placement: {\r\n type: String,\r\n default: 'left',\r\n validator: (value) => ['left', 'right'].includes(value)\r\n }\r\n});\r\n\r\n// 定义 emit\r\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\r\n\r\n// 响应式数据\r\nconst showPicker = ref(false);\r\nconst viewMode = ref(props.displayMode);\r\nconst currentYear = ref(new Date().getFullYear());\r\nconst currentMonth = ref(new Date().getMonth());\r\nconst rightYear = ref(new Date().getFullYear());\r\nconst rightMonth = ref(new Date().getMonth() + 1);\r\nconst selectedValue = ref(null);\r\nconst tempValue = ref(null);\r\n\r\n// 当前日期(用于判断未来日期)\r\nconst today = new Date();\r\nconst todayYear = today.getFullYear();\r\nconst todayMonth = today.getMonth();\r\nconst todayDate = today.getDate();\r\n\r\n// 年份面板固定展示 12 个年份,并尽量让锚点年份落在中间偏前位置\r\nconst YEAR_PANEL_SIZE = 12;\r\nconst YEAR_PANEL_CENTER_OFFSET = 4;\r\n\r\n// 周和月份名称\r\nconst weekDays = ['日', '一', '二', '三', '四', '五', '六'];\r\nconst monthList = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\r\n\r\n// 显示值\r\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\r\n\r\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\r\n\r\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\r\n\r\nconst normalizeCssSize = (value) => {\r\n if (value === null || value === undefined || value === '') return '';\r\n if (typeof value === 'number') return `${value}px`;\r\n const nextValue = String(value).trim();\r\n return /^\\d+(\\.\\d+)?$/.test(nextValue) ? `${nextValue}px` : nextValue;\r\n};\r\n\r\nconst rootStyle = computed(() => {\r\n const width = normalizeCssSize(props.width);\r\n return width ? { width } : {};\r\n});\r\n\r\nconst popupStyle = computed(() => {\r\n const width = normalizeCssSize(props.popupWidth);\r\n return width ? { width } : {};\r\n});\r\n\r\nconst displayValue = computed(() => {\r\n if (!selectedValue.value) return '';\r\n\r\n if (props.mode === 'range' && Array.isArray(selectedValue.value)) {\r\n if (selectedValue.value.length === 2) {\r\n return `${formatDisplay(selectedValue.value[0])}${props.separator}${formatDisplay(selectedValue.value[1])}`;\r\n }\r\n return '';\r\n }\r\n\r\n return formatDisplay(selectedValue.value);\r\n});\r\n\r\n// 格式化显示\r\nconst formatDisplay = (value) => {\r\n if (!value) return '';\r\n\r\n if (props.displayMode === 'year') {\r\n return `${value}年`;\r\n } else if (props.displayMode === 'month') {\r\n const [year, month] = value.split('-');\r\n return `${year}年${month}月`;\r\n } else if (props.displayMode === 'week') {\r\n const [year, week] = value.split('-W');\r\n return `${year}年第${week}周`;\r\n }\r\n\r\n return value;\r\n};\r\n\r\n// 年份列表(显示12年)\r\nconst yearList = computed(() => {\r\n // 年份面板打开时,以当前锚点年份为中心生成 12 个年份选项\r\n const startYear = currentYear.value - YEAR_PANEL_CENTER_OFFSET;\r\n return Array.from({ length: YEAR_PANEL_SIZE }, (_, i) => startYear + i);\r\n});\r\n\r\n// 周列表\r\nconst weekList = computed(() => {\r\n const weeks = [];\r\n const firstDay = new Date(currentYear.value, currentMonth.value, 1);\r\n const lastDay = new Date(currentYear.value, currentMonth.value + 1, 0);\r\n\r\n let currentDate = new Date(firstDay);\r\n currentDate.setDate(currentDate.getDate() - currentDate.getDay());\r\n\r\n let weekNumber = getWeekNumber(currentDate);\r\n\r\n while (currentDate <= lastDay || currentDate.getDay() !== 0) {\r\n const week = {\r\n weekNumber: weekNumber,\r\n startDate: new Date(currentDate),\r\n days: []\r\n };\r\n\r\n for (let i = 0; i < 7; i++) {\r\n const day = {\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== currentMonth.value,\r\n isToday: isToday(currentDate)\r\n };\r\n week.days.push(day);\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n weeks.push(week);\r\n weekNumber++;\r\n\r\n if (currentDate > lastDay && currentDate.getDay() === 0) break;\r\n }\r\n\r\n return weeks;\r\n});\r\n\r\n// 日期列表\r\nconst dayList = computed(() => {\r\n const days = [];\r\n const firstDay = new Date(currentYear.value, currentMonth.value, 1);\r\n const lastDay = new Date(currentYear.value, currentMonth.value + 1, 0);\r\n\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n\r\n const endDate = new Date(lastDay);\r\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\r\n\r\n let currentDate = new Date(startDate);\r\n\r\n while (currentDate <= endDate) {\r\n days.push({\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== currentMonth.value,\r\n isToday: isToday(currentDate)\r\n });\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n return days;\r\n});\r\n\r\n// 右侧日历的年份和月份(独立状态)\r\nconst nextMonthYear = computed(() => rightYear.value);\r\nconst nextMonthMonth = computed(() => rightMonth.value);\r\n\r\n// 下个月的日期列表\r\nconst nextMonthDayList = computed(() => {\r\n const days = [];\r\n const firstDay = new Date(nextMonthYear.value, nextMonthMonth.value, 1);\r\n const lastDay = new Date(nextMonthYear.value, nextMonthMonth.value + 1, 0);\r\n\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n\r\n const endDate = new Date(lastDay);\r\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\r\n\r\n let currentDate = new Date(startDate);\r\n\r\n while (currentDate <= endDate) {\r\n days.push({\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== nextMonthMonth.value,\r\n isToday: isToday(currentDate)\r\n });\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n return days;\r\n});\r\n\r\n// 工具函数\r\nconst formatDate = (date) => {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n};\r\n\r\nconst isToday = (date) => {\r\n const today = new Date();\r\n return date.getDate() === today.getDate() &&\r\n date.getMonth() === today.getMonth() &&\r\n date.getFullYear() === today.getFullYear();\r\n};\r\n\r\nconst getWeekNumber = (date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d - yearStart) / 86400000) + 1) / 7);\r\n};\r\n\r\n// 选择判断\r\nconst isYearSelected = (year) => {\r\n if (!tempValue.value) return false;\r\n if (props.mode === 'single') {\r\n return tempValue.value === year.toString();\r\n }\r\n if (Array.isArray(tempValue.value) && tempValue.value.length > 0) {\r\n return tempValue.value.some(v => v && v.startsWith(year.toString()));\r\n }\r\n return false;\r\n};\r\n\r\nconst isYearInRange = (year) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const [start, end] = tempValue.value.map(v => parseInt(v));\r\n return year > start && year < end;\r\n};\r\n\r\nconst isMonthSelected = (month) => {\r\n if (!tempValue.value) return false;\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n return tempValue.value === monthStr;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(monthStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isMonthInRange = (month) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n return monthStr > tempValue.value[0] && monthStr < tempValue.value[1];\r\n};\r\n\r\nconst isWeekSelected = (week) => {\r\n if (!tempValue.value) return false;\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n return tempValue.value === weekStr;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(weekStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isWeekInRange = (week) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n return weekStr > tempValue.value[0] && weekStr < tempValue.value[1];\r\n};\r\n\r\nconst isDaySelected = (day) => {\r\n if (!tempValue.value) return false;\r\n if (props.mode === 'single') {\r\n return tempValue.value === day.date;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(day.date);\r\n }\r\n return false;\r\n};\r\n\r\nconst isDayInRange = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n return day.date > tempValue.value[0] && day.date < tempValue.value[1];\r\n};\r\n\r\nconst isDayRangeStart = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length === 0) {\r\n return false;\r\n }\r\n return day.date === tempValue.value[0];\r\n};\r\n\r\nconst isDayRangeEnd = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length < 2) {\r\n return false;\r\n }\r\n return day.date === tempValue.value[1];\r\n};\r\n\r\n// 判断是否是未来日期/月份/年份\r\nconst isFutureYear = (year) => {\r\n if (!props.disableFuture) return false;\r\n return year > todayYear;\r\n};\r\n\r\nconst isFutureMonth = (month, year) => {\r\n if (!props.disableFuture) return false;\r\n if (year > todayYear) return true;\r\n if (year === todayYear && month > todayMonth) return true;\r\n return false;\r\n};\r\n\r\nconst isFutureDay = (day) => {\r\n if (!props.disableFuture) return false;\r\n const [year, month, date] = day.date.split('-').map(Number);\r\n if (year > todayYear) return true;\r\n if (year === todayYear && month - 1 > todayMonth) return true;\r\n if (year === todayYear && month - 1 === todayMonth && date > todayDate) return true;\r\n return false;\r\n};\r\n\r\n// 选择操作\r\nconst selectYear = (year) => {\r\n // 如果是未来年份且禁用未来日期,则不允许选择\r\n if (isFutureYear(year)) return;\r\n\r\n const yearStr = year.toString();\r\n\r\n // 如果 displayMode 是 'year',则选择年份作为值\r\n if (props.displayMode === 'year') {\r\n if (props.mode === 'single') {\r\n tempValue.value = yearStr;\r\n if (props.inline) {\r\n // 内联模式直接确认\r\n confirm();\r\n }\r\n } else {\r\n // 范围选择\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [yearStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= yearStr ? [first, yearStr] : [yearStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [yearStr];\r\n }\r\n }\r\n } else {\r\n // 如果 displayMode 不是 'year',则只是切换年份,然后返回到原来的视图\r\n currentYear.value = year;\r\n // 切换回原来的显示模式\r\n viewMode.value = props.displayMode;\r\n }\r\n};\r\n\r\nconst selectMonth = (month) => {\r\n // 如果是未来月份且禁用未来日期,则不允许选择\r\n if (isFutureMonth(month, currentYear.value)) return;\r\n\r\n if (props.displayMode !== 'month') {\r\n currentMonth.value = month;\r\n viewMode.value = props.displayMode;\r\n return;\r\n }\r\n\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n tempValue.value = monthStr;\r\n if (props.displayMode === 'month' || props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [monthStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= monthStr ? [first, monthStr] : [monthStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [monthStr];\r\n }\r\n }\r\n};\r\n\r\nconst selectMonthRight = (month) => {\r\n // 如果是未来月份且禁用未来日期,则不允许选择\r\n if (isFutureMonth(month, rightYear.value)) return;\r\n\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [monthStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= monthStr ? [first, monthStr] : [monthStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [monthStr];\r\n }\r\n};\r\n\r\nconst isMonthSelectedRight = (month) => {\r\n if (!tempValue.value) return false;\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(monthStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isMonthInRangeRight = (month) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n return monthStr > tempValue.value[0] && monthStr < tempValue.value[1];\r\n};\r\n\r\nconst selectWeek = (week) => {\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n tempValue.value = weekStr;\r\n confirm();\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [weekStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= weekStr ? [first, weekStr] : [weekStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [weekStr];\r\n }\r\n }\r\n};\r\n\r\nconst selectDay = (day) => {\r\n // 如果是未来日期且禁用未来日期,则不允许选择\r\n if (isFutureDay(day)) return;\r\n\r\n if (props.mode === 'single') {\r\n tempValue.value = day.date;\r\n // 内联模式下单选直接确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [day.date];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= day.date ? [first, day.date] : [day.date, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [day.date];\r\n }\r\n }\r\n};\r\n\r\n// 导航操作\r\nconst prevPeriod = () => {\r\n if (viewMode.value === 'year') {\r\n currentYear.value -= 12;\r\n } else if (viewMode.value === 'month') {\r\n currentYear.value -= 1;\r\n } else {\r\n if (currentMonth.value === 0) {\r\n currentMonth.value = 11;\r\n currentYear.value -= 1;\r\n } else {\r\n currentMonth.value -= 1;\r\n }\r\n }\r\n};\r\n\r\nconst nextPeriod = () => {\r\n if (viewMode.value === 'year') {\r\n currentYear.value += 12;\r\n } else if (viewMode.value === 'month') {\r\n currentYear.value += 1;\r\n } else {\r\n if (currentMonth.value === 11) {\r\n currentMonth.value = 0;\r\n currentYear.value += 1;\r\n } else {\r\n currentMonth.value += 1;\r\n }\r\n }\r\n};\r\n\r\n// 月份导航(用于双日历)\r\nconst prevMonth = () => {\r\n // 只控制左侧日历\r\n if (currentMonth.value === 0) {\r\n currentMonth.value = 11;\r\n currentYear.value -= 1;\r\n } else {\r\n currentMonth.value -= 1;\r\n }\r\n};\r\n\r\nconst nextMonthLeft = () => {\r\n // 增加左侧日历月份\r\n if (currentMonth.value === 11) {\r\n currentMonth.value = 0;\r\n currentYear.value += 1;\r\n } else {\r\n currentMonth.value += 1;\r\n }\r\n};\r\n\r\nconst prevMonthRight = () => {\r\n // 减少右侧日历月份\r\n if (rightMonth.value === 0) {\r\n rightMonth.value = 11;\r\n rightYear.value -= 1;\r\n } else {\r\n rightMonth.value -= 1;\r\n }\r\n};\r\n\r\nconst nextMonth = () => {\r\n // 只控制右侧日历\r\n if (rightMonth.value === 11) {\r\n rightMonth.value = 0;\r\n rightYear.value += 1;\r\n } else {\r\n rightMonth.value += 1;\r\n }\r\n};\r\n\r\n// 年份导航(用于双月份面板)\r\nconst prevYear = () => {\r\n // 只控制左侧年份\r\n currentYear.value -= 1;\r\n};\r\n\r\nconst nextYearLeft = () => {\r\n // 增加左侧年份\r\n currentYear.value += 1;\r\n};\r\n\r\nconst prevYearRight = () => {\r\n // 减少右侧年份\r\n rightYear.value -= 1;\r\n};\r\n\r\nconst nextYear = () => {\r\n // 只控制右侧年份\r\n rightYear.value += 1;\r\n};\r\n\r\nconst changeViewMode = (mode) => {\r\n if (props.displayMode === 'year' && mode !== 'year') return;\r\n if (props.displayMode === 'month' && !['year', 'month'].includes(mode)) return;\r\n viewMode.value = mode;\r\n};\r\n\r\n// 面板操作\r\nconst parseCalendarValue = (value) => {\r\n if (typeof value !== 'string') return null;\r\n\r\n const match = value.match(/^(\\d{4})(?:-(\\d{2}))?/);\r\n if (!match) return null;\r\n\r\n const month = match[2] ? Number(match[2]) - 1 : null;\r\n return {\r\n year: Number(match[1]),\r\n month: month !== null && month >= 0 && month <= 11 ? month : null\r\n };\r\n};\r\n\r\nconst setRightPanelToNextMonth = () => {\r\n if (currentMonth.value === 11) {\r\n rightYear.value = currentYear.value + 1;\r\n rightMonth.value = 0;\r\n } else {\r\n rightYear.value = currentYear.value;\r\n rightMonth.value = currentMonth.value + 1;\r\n }\r\n};\r\n\r\nconst syncCalendarPanels = () => {\r\n const values = Array.isArray(selectedValue.value) ? selectedValue.value : [selectedValue.value];\r\n const start = parseCalendarValue(values[0]);\r\n const end = parseCalendarValue(values[1]);\r\n\r\n if (start) {\r\n currentYear.value = start.year;\r\n if (start.month !== null) currentMonth.value = start.month;\r\n }\r\n\r\n if (props.displayMode === 'year') return;\r\n\r\n if (props.displayMode === 'month') {\r\n rightYear.value = end && end.year !== currentYear.value ? end.year : currentYear.value + 1;\r\n return;\r\n }\r\n\r\n const endUsesDifferentMonth = end && end.month !== null &&\r\n (end.year !== currentYear.value || end.month !== currentMonth.value);\r\n\r\n if (props.mode === 'range' && endUsesDifferentMonth) {\r\n rightYear.value = end.year;\r\n rightMonth.value = end.month;\r\n } else {\r\n setRightPanelToNextMonth();\r\n }\r\n};\r\n\r\nconst initializePicker = () => {\r\n tempValue.value = selectedValue.value ?\r\n (Array.isArray(selectedValue.value) ? [...selectedValue.value] : selectedValue.value) :\r\n (props.mode === 'range' ? [] : null);\r\n viewMode.value = props.displayMode;\r\n syncCalendarPanels();\r\n};\r\n\r\nwatch(showPicker, (isOpen) => {\r\n if (isOpen) {\r\n initializePicker();\r\n }\r\n});\r\n\r\nwatch(() => props.modelValue, (newValue) => {\r\n selectedValue.value = newValue;\r\n if (props.inline) initializePicker();\r\n}, { immediate: true });\r\n\r\nconst closePicker = () => {\r\n showPicker.value = false;\r\n};\r\n\r\nconst clearValue = () => {\r\n selectedValue.value = props.mode === 'range' ? [] : null;\r\n emit('update:modelValue', selectedValue.value);\r\n emit('change', selectedValue.value);\r\n};\r\n\r\nconst confirm = () => {\r\n selectedValue.value = tempValue.value;\r\n emit('update:modelValue', selectedValue.value);\r\n emit('change', selectedValue.value);\r\n closePicker();\r\n};\r\n\r\n// 自定义取消和确认处理\r\nconst handleCancel = () => {\r\n if (props.onCancel) {\r\n props.onCancel();\r\n } else {\r\n emit('cancel');\r\n closePicker();\r\n }\r\n};\r\n\r\nconst handleConfirm = () => {\r\n if (props.onConfirm) {\r\n props.onConfirm(tempValue.value);\r\n } else {\r\n emit('confirm', tempValue.value);\r\n confirm();\r\n }\r\n};\r\n\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-date-selector {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.date-input {\r\n width: 100%;\r\n}\r\n\r\n.date-input-field {\r\n cursor: pointer;\r\n}\r\n\r\n:deep(.date-input-field .v-field),\r\n:deep(.date-input-field input) {\r\n cursor: pointer;\r\n}\r\n\r\n.date-icon {\r\n margin-left: 8px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.date-icon-svg {\r\n width: 16px;\r\n height: 16px;\r\n display: block;\r\n}\r\n\r\n.clear-icon {\r\n margin-left: 4px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-size: 18px;\r\n line-height: 1;\r\n cursor: pointer;\r\n padding: 2px;\r\n}\r\n\r\n.clear-icon:hover {\r\n color: rgb(var(--v-theme-on-surface), 0.87);\r\n}\r\n\r\n.date-picker-dropdown {\r\n box-sizing: border-box;\r\n max-width: calc(100vw - 24px);\r\n overflow-x: auto;\r\n background: rgb(var(--v-theme-surface));\r\n border-radius: 8px;\r\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\r\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.date-picker-dropdown.inline-mode {\r\n box-shadow: none;\r\n width: fit-content;\r\n border: none;\r\n}\r\n\r\n.picker-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.header-title {\r\n font-size: 16px;\r\n font-weight: 500;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.clickable {\r\n cursor: pointer;\r\n padding: 4px 8px;\r\n border-radius: 4px;\r\n transition: background 0.2s;\r\n}\r\n\r\n.clickable:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.nav-btn {\r\n border: none;\r\n background: none;\r\n font-size: 20px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n cursor: pointer;\r\n padding: 4px 12px;\r\n border-radius: 4px;\r\n transition: background 0.2s;\r\n}\r\n\r\n.nav-btn:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.picker-body {\r\n padding: 8px;\r\n min-height: 200px;\r\n}\r\n\r\n.dual-calendar {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.calendar-divider {\r\n width: 1px;\r\n background: rgb(var(--v-theme-on-surface), 0.12);\r\n margin: 0 6px;\r\n}\r\n\r\n.calendar-panel {\r\n flex: 0 0 210px;\r\n width: 210px;\r\n min-width: 210px;\r\n max-width: 210px;\r\n}\r\n\r\n/* 单面板模式:放大以匹配底部范围显示的宽度 */\r\n.calendar-panel:only-child {\r\n flex: 0 0 340px;\r\n width: 340px;\r\n min-width: 340px;\r\n max-width: 340px;\r\n}\r\n\r\n.year-grid,\r\n.month-grid {\r\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: 6px;\r\n}\r\n\r\n.year-item,\r\n.month-item {\r\n padding: 6px;\r\n text-align: center;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n border: 1px solid transparent;\r\n color: rgb(var(--v-theme-on-surface));\r\n font-size: 12px;\r\n}\r\n\r\n.year-item:hover,\r\n.month-item:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.year-item.selected,\r\n.month-item.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.year-item.in-range,\r\n.month-item.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n/* 禁用状态样式 */\r\n.year-item.disabled,\r\n.month-item.disabled,\r\n.day-item.disabled {\r\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\r\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\r\n cursor: not-allowed !important;\r\n pointer-events: none;\r\n opacity: 0.5;\r\n}\r\n\r\n.year-item.disabled:hover,\r\n.month-item.disabled:hover,\r\n.day-item.disabled:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\r\n}\r\n\r\n.week-header {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 2px;\r\n margin-bottom: 6px;\r\n}\r\n\r\n.week-day {\r\n text-align: center;\r\n padding: 6px 0;\r\n font-size: 12px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-weight: 500;\r\n}\r\n\r\n.week-grid {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.week-row {\r\n display: grid;\r\n grid-template-columns: 40px repeat(7, 1fr);\r\n gap: 4px;\r\n padding: 4px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: background 0.2s;\r\n}\r\n\r\n.week-row:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.week-row.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.week-row.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n.week-number {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 12px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-weight: 500;\r\n}\r\n\r\n.day-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 2px;\r\n}\r\n\r\n.day-item,\r\n.day-cell {\r\n aspect-ratio: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n font-size: 13px;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.day-item:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.day-item.other-month,\r\n.day-cell.other-month {\r\n color: rgb(var(--v-theme-on-surface), 0.38);\r\n}\r\n\r\n.day-item.today,\r\n.day-cell.today {\r\n color: rgb(var(--v-theme-primary));\r\n font-weight: 600;\r\n}\r\n\r\n.day-item.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.day-item.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n.day-item.range-start,\r\n.day-item.range-end {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.range-display {\r\n padding: 12px 16px;\r\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n text-align: center;\r\n}\r\n\r\n.range-text {\r\n font-size: 14px;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.range-separator {\r\n margin: 0 8px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n}\r\n\r\n.placeholder-text {\r\n color: rgb(var(--v-theme-on-surface), 0.38);\r\n}\r\n\r\n.picker-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n padding: 12px 16px;\r\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.btn {\r\n padding: 8px 16px;\r\n border-radius: 4px;\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n border: none;\r\n outline: none;\r\n}\r\n\r\n.btn-text {\r\n background: none;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n}\r\n\r\n.btn-text:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.btn-primary {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.btn-primary:hover {\r\n opacity: 0.9;\r\n}\r\n</style>\r\n","<template>\n <div class=\"vtk-date-time-picker\">\n <VMenu\n v-if=\"!inline\"\n v-model=\"showPicker\"\n :attach=\"menuAttach\"\n :location=\"menuLocation\"\n :origin=\"menuOrigin\"\n :width=\"menuWidth\"\n :min-width=\"menuWidth\"\n offset=\"4\"\n :close-on-content-click=\"false\"\n >\n <template #activator=\"{ props: menuProps }\">\n <div class=\"date-time-input\">\n <VTextField\n :model-value=\"displayValue\"\n :placeholder=\"placeholder\"\n :label=\"label\"\n :disabled=\"disabled\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n readonly\n v-bind=\"menuProps\"\n :clearable=\"clearable && !!displayValue && !disabled\"\n clear-icon=\"mdi-close-circle\"\n persistent-clear\n class=\"date-time-input-field\"\n @click:clear.stop=\"clearValue\"\n >\n <template #append-inner>\n <VIcon size=\"16\" class=\"date-time-icon\">mdi-clock-outline</VIcon>\n </template>\n </VTextField>\n </div>\n </template>\n\n <div\n class=\"date-time-picker-dropdown\"\n :class=\"{ 'range-mode': isRange }\"\n :style=\"dropdownStyle\"\n @click.stop\n @mousedown.stop\n >\n <template v-if=\"isRange\">\n <div class=\"range-input-row\">\n <input class=\"range-date-input\" :value=\"formatDatePart(tempRange[0])\" readonly placeholder=\"开始日期\" />\n <button\n class=\"range-time-input\"\n type=\"button\"\n :class=\"{ active: activeTimeSide === 'start' }\"\n @click=\"openRangeTime('start')\"\n >\n {{ formatTimePart(tempRange[0]) || defaultStartTime }}\n </button>\n <span class=\"range-arrow\">›</span>\n <input class=\"range-date-input\" :value=\"formatDatePart(tempRange[1])\" readonly placeholder=\"结束日期\" />\n <button\n class=\"range-time-input\"\n type=\"button\"\n :class=\"{ active: activeTimeSide === 'end' }\"\n @click=\"openRangeTime('end')\"\n >\n {{ formatTimePart(tempRange[1]) || defaultEndTime }}\n </button>\n\n <div v-if=\"activeTimeSide\" :class=\"['range-time-popover', activeTimeSide]\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === activeRangeHour }]\"\n @click=\"selectRangeTime('hour', hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === activeRangeMinute }]\"\n @click=\"selectRangeTime('minute', minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === activeRangeSecond }]\"\n @click=\"selectRangeTime('second', second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeTimeSide = null\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeTimeSide = null\">确定</button>\n </div>\n </div>\n </div>\n\n <div class=\"range-calendar-shell\">\n <div class=\"calendar-panel\">\n <div class=\"calendar-header\">\n <button class=\"nav-btn-small\" type=\"button\" @click=\"prevLeftMonth\">‹</button>\n <span class=\"month-title\">{{ leftYear }} 年 {{ leftMonth + 1 }} 月</span>\n <button class=\"nav-btn-small invisible\" type=\"button\">›</button>\n </div>\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in leftDayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"rangeDayClass(day)\"\n @click=\"selectRangeDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <div class=\"calendar-panel\">\n <div class=\"calendar-header\">\n <button class=\"nav-btn-small invisible\" type=\"button\">‹</button>\n <span class=\"month-title\">{{ rightYear }} 年 {{ rightMonth + 1 }} 月</span>\n <button class=\"nav-btn-small\" type=\"button\" @click=\"nextRightMonth\">›</button>\n </div>\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in rightDayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"rangeDayClass(day)\"\n @click=\"selectRangeDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <template v-else>\n <div class=\"single-input-row\">\n <input class=\"single-date-input\" :value=\"formatDatePart(tempDate)\" readonly placeholder=\"请选择日期\" />\n <button\n class=\"single-time-input\"\n type=\"button\"\n :class=\"{ active: activeSingleTime }\"\n @click=\"activeSingleTime = true\"\n >\n {{ singleTimeValue }}\n </button>\n\n <div v-if=\"activeSingleTime\" class=\"single-time-popover\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === selectedHour, disabled: isTimePartDisabled(hour, selectedMinute, selectedSecond) }]\"\n @click=\"selectHour(hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === selectedMinute, disabled: isTimePartDisabled(selectedHour, minute, selectedSecond) }]\"\n @click=\"selectMinute(minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === selectedSecond, disabled: isTimePartDisabled(selectedHour, selectedMinute, second) }]\"\n @click=\"selectSecond(second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeSingleTime = false\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeSingleTime = false\">确定</button>\n </div>\n </div>\n </div>\n\n <div class=\"single-calendar-panel\">\n <div class=\"picker-header single-header\">\n <button class=\"nav-btn\" type=\"button\" @click=\"prevPeriod\">‹</button>\n <div class=\"header-title\">\n <span class=\"clickable\" @click=\"changeViewMode('year')\">{{ currentYear }} 年</span>\n <span v-if=\"viewMode !== 'year'\" class=\"clickable\" @click=\"changeViewMode('month')\">\n {{ currentMonth + 1 }} 月\n </span>\n </div>\n <button class=\"nav-btn\" type=\"button\" @click=\"nextPeriod\">›</button>\n </div>\n\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\n <div class=\"year-grid\">\n <button\n v-for=\"year in yearList\"\n :key=\"year\"\n type=\"button\"\n :class=\"['year-item', { selected: year === currentYear, disabled: isYearDisabled(year) }]\"\n @click=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n </div>\n </div>\n\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\n <div class=\"month-grid\">\n <button\n v-for=\"(month, index) in monthList\"\n :key=\"month\"\n type=\"button\"\n :class=\"['month-item', { selected: index === currentMonth, disabled: isMonthDisabled(index) }]\"\n @click=\"selectMonth(index)\"\n >\n {{ month }}\n </button>\n </div>\n </div>\n\n <div v-else class=\"picker-body\">\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in dayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"['day-item', {\n 'other-month': day.otherMonth,\n selected: isDaySelected(day),\n today: day.isToday,\n disabled: isDayDisabled(day)\n }]\"\n @click=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <div class=\"picker-footer\">\n <button v-if=\"!isRange\" class=\"btn btn-text\" type=\"button\" @click=\"handleNow\">此刻</button>\n <button v-if=\"isRange\" class=\"btn btn-text\" type=\"button\" @click=\"clearTempRange\">清空</button>\n <span class=\"footer-spacer\"></span>\n <button class=\"btn btn-text\" type=\"button\" @click=\"handleCancel\">取消</button>\n <button class=\"btn btn-primary\" type=\"button\" :disabled=\"!canConfirm\" @click=\"handleConfirm\">确定</button>\n </div>\n </div>\n </VMenu>\n\n <div v-if=\"inline\" class=\"date-time-picker-dropdown inline-mode\" :class=\"{ 'range-mode': isRange }\" @click.stop @mousedown.stop>\n <div class=\"inline-message\">内联模式请使用默认单选面板。</div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkDateTimePicker',\n});\n\nconst props = defineProps({\n modelValue: {\n type: [String, Date, Number, Array],\n default: null\n },\n mode: {\n type: String,\n default: 'single',\n validator: (value) => ['single', 'range'].includes(value)\n },\n placeholder: {\n type: String,\n default: '请选择日期时间'\n },\n label: {\n type: String,\n default: ''\n },\n scale: {\n type: Number,\n default: 1,\n validator: (value) => value > 0 && value <= 5\n },\n disabled: {\n type: Boolean,\n default: false\n },\n clearable: {\n type: Boolean,\n default: true\n },\n format: {\n type: String,\n default: 'YYYY-MM-DD HH:mm:ss'\n },\n valueFormat: {\n type: String,\n default: 'YYYY-MM-DD HH:mm:ss'\n },\n separator: {\n type: String,\n default: ' 至 '\n },\n min: {\n type: [String, Date, Number],\n default: null\n },\n max: {\n type: [String, Date, Number],\n default: null\n },\n disableFuture: {\n type: Boolean,\n default: false\n },\n minuteStep: {\n type: Number,\n default: 1\n },\n secondStep: {\n type: Number,\n default: 1\n },\n showSeconds: {\n type: Boolean,\n default: true\n },\n inline: {\n type: Boolean,\n default: false\n },\n placement: {\n type: String,\n default: 'left',\n validator: (value) => ['left', 'right'].includes(value)\n },\n noTeleport: {\n type: Boolean,\n default: false\n },\n onCancel: {\n type: Function,\n default: null\n },\n onConfirm: {\n type: Function,\n default: null\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\n\nconst showPicker = ref(false);\nconst selectedDateTime = ref(null);\nconst selectedRange = ref([]);\nconst tempDate = ref(null);\nconst tempRange = ref([null, null]);\nconst currentYear = ref(new Date().getFullYear());\nconst currentMonth = ref(new Date().getMonth());\nconst leftYear = ref(new Date().getFullYear());\nconst leftMonth = ref(new Date().getMonth());\nconst rightYear = ref(new Date().getMonth() === 11 ? new Date().getFullYear() + 1 : new Date().getFullYear());\nconst rightMonth = ref(new Date().getMonth() === 11 ? 0 : new Date().getMonth() + 1);\nconst viewMode = ref('day');\nconst selectedHour = ref(0);\nconst selectedMinute = ref(0);\nconst selectedSecond = ref(0);\nconst activeRangeSide = ref('start');\nconst activeTimeSide = ref(null);\nconst activeSingleTime = ref(false);\n\nconst weekDays = ['日', '一', '二', '三', '四', '五', '六'];\nconst monthList = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];\nconst defaultStartTime = '00:00:00';\nconst defaultEndTime = '23:59:59';\n\nconst isRange = computed(() => props.mode === 'range');\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\nconst menuWidth = computed(() => Math.round((isRange.value ? 646 : 360) * props.scale));\nconst dropdownStyle = computed(() => (props.scale !== 1 ? { zoom: props.scale } : undefined));\nconst minDateTime = computed(() => parseValue(props.min));\nconst maxDateTime = computed(() => parseValue(props.max));\nconst hourOptions = computed(() => Array.from({ length: 24 }, (_, index) => index));\nconst minuteOptions = computed(() => buildStepOptions(props.minuteStep));\nconst secondOptions = computed(() => buildStepOptions(props.secondStep));\n\nconst yearList = computed(() => {\n const startYear = Math.floor(currentYear.value / 12) * 12;\n return Array.from({ length: 12 }, (_, index) => startYear + index);\n});\n\nconst dayList = computed(() => getDayList(currentYear.value, currentMonth.value));\nconst leftDayList = computed(() => getDayList(leftYear.value, leftMonth.value));\nconst rightDayList = computed(() => getDayList(rightYear.value, rightMonth.value));\n\nconst displayValue = computed(() => {\n if (isRange.value) {\n if (!selectedRange.value.length) return '';\n const [start, end] = selectedRange.value;\n return [start, end].filter(Boolean).map(date => formatByPattern(date, props.format)).join(props.separator);\n }\n return selectedDateTime.value ? formatByPattern(selectedDateTime.value, props.format) : '';\n});\n\nconst previewValue = computed(() => tempDate.value ? formatByPattern(buildTempDateTime(), props.format) : '');\nconst singleTimeValue = computed(() => {\n const pattern = props.showSeconds ? 'HH:mm:ss' : 'HH:mm';\n const date = buildTempDateTime() || new Date(2000, 0, 1, selectedHour.value, selectedMinute.value, selectedSecond.value);\n return formatByPattern(date, pattern);\n});\n\nconst canConfirm = computed(() => {\n if (isRange.value) {\n const [start, end] = tempRange.value;\n return !!start && !!end && start <= end && !isDateTimeDisabled(start) && !isDateTimeDisabled(end);\n }\n if (!tempDate.value) return false;\n return !isDateTimeDisabled(buildTempDateTime());\n});\n\nconst activeRangeDate = computed(() => {\n return activeTimeSide.value === 'end' ? tempRange.value[1] : tempRange.value[0];\n});\n\nconst activeRangeHour = computed(() => activeRangeDate.value ? activeRangeDate.value.getHours() : 0);\nconst activeRangeMinute = computed(() => activeRangeDate.value ? activeRangeDate.value.getMinutes() : 0);\nconst activeRangeSecond = computed(() => activeRangeDate.value ? activeRangeDate.value.getSeconds() : 0);\n\nconst buildStepOptions = (step) => {\n const normalizedStep = Number.isFinite(step) && step > 0 ? Math.max(1, Math.floor(step)) : 1;\n const options = [];\n for (let value = 0; value < 60; value += normalizedStep) {\n options.push(value);\n }\n return options;\n};\n\nconst getDayList = (year, month) => {\n const firstDay = new Date(year, month, 1);\n const startDay = firstDay.getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n const today = new Date();\n const days = [];\n\n for (let index = startDay - 1; index >= 0; index -= 1) {\n days.push(createDay(new Date(year, month - 1, daysInPrevMonth - index), true, today));\n }\n for (let day = 1; day <= daysInMonth; day += 1) {\n days.push(createDay(new Date(year, month, day), false, today));\n }\n for (let day = 1; days.length < 42; day += 1) {\n days.push(createDay(new Date(year, month + 1, day), true, today));\n }\n\n return days;\n};\n\nconst createDay = (date, otherMonth, today) => ({\n date: formatByPattern(date, 'YYYY-MM-DD'),\n day: date.getDate(),\n year: date.getFullYear(),\n month: date.getMonth(),\n otherMonth,\n isToday: isSameDate(date, today)\n});\n\nconst padTime = (value) => String(value).padStart(2, '0');\n\nconst formatByPattern = (date, pattern) => {\n if (!(date instanceof Date) || Number.isNaN(date.getTime())) return '';\n const replacements = {\n YYYY: date.getFullYear(),\n MM: padTime(date.getMonth() + 1),\n DD: padTime(date.getDate()),\n HH: padTime(date.getHours()),\n mm: padTime(date.getMinutes()),\n ss: padTime(date.getSeconds())\n };\n return Object.keys(replacements).reduce((result, token) => {\n return result.replace(new RegExp(token, 'g'), replacements[token]);\n }, pattern);\n};\n\nconst formatDatePart = (date) => date ? formatByPattern(date, 'YYYY-MM-DD') : '';\nconst formatTimePart = (date) => date ? formatByPattern(date, props.showSeconds ? 'HH:mm:ss' : 'HH:mm') : '';\n\nconst parseValue = (value) => {\n if (!value && value !== 0) return null;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : new Date(value.getTime());\n if (typeof value === 'number') {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n if (typeof value !== 'string') return null;\n\n const normalized = value.trim().replace(/\\//g, '-');\n const match = normalized.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[ T](\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?)?/);\n if (!match) {\n const fallback = new Date(value);\n return Number.isNaN(fallback.getTime()) ? null : fallback;\n }\n\n const [, year, month, day, hour = '0', minute = '0', second = '0'] = match;\n const date = new Date(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second));\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst parseRangeValue = (value) => {\n if (Array.isArray(value)) return value.map(parseValue).filter(Boolean).slice(0, 2);\n if (typeof value === 'string' && value.includes(props.separator)) {\n return value.split(props.separator).map(item => parseValue(item.trim())).filter(Boolean).slice(0, 2);\n }\n return [];\n};\n\nconst toModelValue = (date) => {\n if (!date) return null;\n if (props.valueFormat === 'timestamp') return date.getTime();\n if (props.valueFormat === 'Date') return new Date(date.getTime());\n return formatByPattern(date, props.valueFormat);\n};\n\nconst toModelRange = (range) => range.map(date => toModelValue(date));\n\nconst isSameDate = (left, right) => {\n return left.getFullYear() === right.getFullYear()\n && left.getMonth() === right.getMonth()\n && left.getDate() === right.getDate();\n};\n\nconst buildTempDateTime = (hour = selectedHour.value, minute = selectedMinute.value, second = selectedSecond.value) => {\n if (!tempDate.value) return null;\n return new Date(tempDate.value.getFullYear(), tempDate.value.getMonth(), tempDate.value.getDate(), hour, minute, props.showSeconds ? second : 0);\n};\n\nconst isDateTimeDisabled = (date) => {\n if (!date) return true;\n if (minDateTime.value && date < minDateTime.value) return true;\n if (maxDateTime.value && date > maxDateTime.value) return true;\n if (props.disableFuture && date > new Date()) return true;\n return false;\n};\n\nconst isYearDisabled = (year) => {\n const start = new Date(year, 0, 1, 0, 0, 0);\n const end = new Date(year, 11, 31, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isMonthDisabled = (month) => {\n const start = new Date(currentYear.value, month, 1, 0, 0, 0);\n const end = new Date(currentYear.value, month + 1, 0, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isDayDisabled = (day) => {\n const start = new Date(day.year, day.month, day.day, 0, 0, 0);\n const end = new Date(day.year, day.month, day.day, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isTimePartDisabled = (hour, minute, second) => {\n if (!tempDate.value) return false;\n return isDateTimeDisabled(buildTempDateTime(hour, minute, second));\n};\n\nconst isDaySelected = (day) => {\n if (!tempDate.value) return false;\n return tempDate.value.getFullYear() === day.year\n && tempDate.value.getMonth() === day.month\n && tempDate.value.getDate() === day.day;\n};\n\nconst isRangeDaySelected = (day, side) => {\n const date = tempRange.value[side === 'start' ? 0 : 1];\n return !!date && date.getFullYear() === day.year && date.getMonth() === day.month && date.getDate() === day.day;\n};\n\nconst isRangeDayInRange = (day) => {\n const [start, end] = tempRange.value;\n if (!start || !end) return false;\n const date = new Date(day.year, day.month, day.day, 12, 0, 0);\n return date > start && date < end;\n};\n\nconst rangeDayClass = (day) => ['day-item', {\n 'other-month': day.otherMonth,\n today: day.isToday,\n disabled: isDayDisabled(day),\n selected: isRangeDaySelected(day, 'start') || isRangeDaySelected(day, 'end'),\n 'range-start': isRangeDaySelected(day, 'start'),\n 'range-end': isRangeDaySelected(day, 'end'),\n 'in-range': isRangeDayInRange(day)\n}];\n\nconst setSinglePanelFromDate = (date) => {\n if (!date) return;\n currentYear.value = date.getFullYear();\n currentMonth.value = date.getMonth();\n tempDate.value = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n selectedHour.value = date.getHours();\n selectedMinute.value = date.getMinutes();\n selectedSecond.value = date.getSeconds();\n};\n\nconst setRangePanelsFromDate = (date) => {\n const base = date || new Date();\n leftYear.value = base.getFullYear();\n leftMonth.value = base.getMonth();\n const right = new Date(base.getFullYear(), base.getMonth() + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n};\n\nconst initializePicker = () => {\n if (isRange.value) {\n tempRange.value = selectedRange.value.length ? selectedRange.value.map(date => new Date(date.getTime())) : [null, null];\n setRangePanelsFromDate(tempRange.value[0] || new Date());\n activeRangeSide.value = tempRange.value[0] && !tempRange.value[1] ? 'end' : 'start';\n activeTimeSide.value = null;\n return;\n }\n setSinglePanelFromDate(selectedDateTime.value || new Date());\n viewMode.value = 'day';\n activeSingleTime.value = false;\n};\n\nconst prevPeriod = () => {\n if (viewMode.value === 'year') currentYear.value -= 12;\n else if (viewMode.value === 'month') currentYear.value -= 1;\n else if (currentMonth.value === 0) {\n currentMonth.value = 11;\n currentYear.value -= 1;\n } else currentMonth.value -= 1;\n};\n\nconst nextPeriod = () => {\n if (viewMode.value === 'year') currentYear.value += 12;\n else if (viewMode.value === 'month') currentYear.value += 1;\n else if (currentMonth.value === 11) {\n currentMonth.value = 0;\n currentYear.value += 1;\n } else currentMonth.value += 1;\n};\n\nconst prevLeftMonth = () => {\n const left = new Date(leftYear.value, leftMonth.value - 1, 1);\n leftYear.value = left.getFullYear();\n leftMonth.value = left.getMonth();\n const right = new Date(leftYear.value, leftMonth.value + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n};\n\nconst nextRightMonth = () => {\n const right = new Date(rightYear.value, rightMonth.value + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n const left = new Date(rightYear.value, rightMonth.value - 1, 1);\n leftYear.value = left.getFullYear();\n leftMonth.value = left.getMonth();\n};\n\nconst changeViewMode = (mode) => {\n viewMode.value = mode;\n};\n\nconst selectYear = (year) => {\n if (isYearDisabled(year)) return;\n currentYear.value = year;\n viewMode.value = 'month';\n};\n\nconst selectMonth = (month) => {\n if (isMonthDisabled(month)) return;\n currentMonth.value = month;\n viewMode.value = 'day';\n};\n\nconst selectDay = (day) => {\n if (isDayDisabled(day)) return;\n tempDate.value = new Date(day.year, day.month, day.day);\n};\n\nconst selectRangeDay = (day) => {\n if (isDayDisabled(day)) return;\n const selected = new Date(day.year, day.month, day.day);\n if (activeRangeSide.value === 'start' || !tempRange.value[0] || (tempRange.value[0] && tempRange.value[1])) {\n const currentStart = tempRange.value[0];\n selected.setHours(currentStart?.getHours() ?? 0, currentStart?.getMinutes() ?? 0, props.showSeconds ? currentStart?.getSeconds() ?? 0 : 0, 0);\n tempRange.value = [selected, null];\n activeRangeSide.value = 'end';\n } else {\n const currentEnd = tempRange.value[1];\n selected.setHours(currentEnd?.getHours() ?? 23, currentEnd?.getMinutes() ?? 59, props.showSeconds ? currentEnd?.getSeconds() ?? 59 : 0, 0);\n const start = tempRange.value[0];\n tempRange.value = start <= selected ? [start, selected] : [selected, start];\n activeRangeSide.value = 'start';\n }\n};\n\nconst selectHour = (hour) => {\n if (isTimePartDisabled(hour, selectedMinute.value, selectedSecond.value)) return;\n selectedHour.value = hour;\n};\n\nconst selectMinute = (minute) => {\n if (isTimePartDisabled(selectedHour.value, minute, selectedSecond.value)) return;\n selectedMinute.value = minute;\n};\n\nconst selectSecond = (second) => {\n if (isTimePartDisabled(selectedHour.value, selectedMinute.value, second)) return;\n selectedSecond.value = second;\n};\n\nconst openRangeTime = (side) => {\n activeTimeSide.value = side;\n activeRangeSide.value = side;\n const index = side === 'start' ? 0 : 1;\n if (!tempRange.value[index]) {\n const base = new Date();\n base.setHours(side === 'start' ? 0 : 23, side === 'start' ? 0 : 59, props.showSeconds ? side === 'start' ? 0 : 59 : 0, 0);\n tempRange.value[index] = base;\n }\n};\n\nconst selectRangeTime = (part, value) => {\n const index = activeTimeSide.value === 'end' ? 1 : 0;\n const fallback = new Date();\n const date = tempRange.value[index] ? new Date(tempRange.value[index].getTime()) : fallback;\n if (part === 'hour') date.setHours(value);\n if (part === 'minute') date.setMinutes(value);\n if (part === 'second') date.setSeconds(value);\n if (!props.showSeconds) date.setSeconds(0);\n date.setMilliseconds(0);\n tempRange.value[index] = date;\n};\n\nconst closePicker = () => {\n showPicker.value = false;\n activeSingleTime.value = false;\n};\n\nconst clearTempRange = () => {\n tempRange.value = [null, null];\n activeRangeSide.value = 'start';\n activeTimeSide.value = null;\n};\n\nconst clearValue = () => {\n if (isRange.value) {\n selectedRange.value = [];\n tempRange.value = [null, null];\n emit('update:modelValue', []);\n emit('change', []);\n } else {\n selectedDateTime.value = null;\n tempDate.value = null;\n emit('update:modelValue', null);\n emit('change', null);\n }\n};\n\nconst confirm = () => {\n if (!canConfirm.value) return;\n if (isRange.value) {\n selectedRange.value = tempRange.value.map(date => new Date(date.getTime()));\n const modelValue = toModelRange(selectedRange.value);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n return;\n }\n const nextValue = buildTempDateTime();\n selectedDateTime.value = nextValue;\n const modelValue = toModelValue(nextValue);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n};\n\nconst handleCancel = () => {\n if (props.onCancel) {\n props.onCancel();\n } else {\n emit('cancel');\n closePicker();\n }\n};\n\nconst handleConfirm = () => {\n const value = isRange.value ? toModelRange(tempRange.value) : toModelValue(buildTempDateTime());\n if (props.onConfirm) {\n props.onConfirm(value);\n } else {\n emit('confirm', value);\n confirm();\n }\n};\n\nconst handleNow = () => {\n const now = new Date();\n if (isDateTimeDisabled(now)) return;\n setSinglePanelFromDate(now);\n};\n\nwatch(showPicker, (isOpen) => {\n if (isOpen) initializePicker();\n});\n\nwatch(() => props.modelValue, (newValue) => {\n if (isRange.value) {\n selectedRange.value = parseRangeValue(newValue);\n } else {\n selectedDateTime.value = parseValue(newValue);\n }\n}, { immediate: true });\n</script>\n\n<style scoped>\n.vtk-date-time-picker {\n position: relative;\n width: 100%;\n}\n\n.date-time-input {\n width: 100%;\n}\n\n.date-time-input-field {\n cursor: pointer;\n}\n\n:deep(.date-time-input-field .v-field),\n:deep(.date-time-input-field input) {\n cursor: pointer;\n}\n\n.date-time-icon {\n margin-left: 8px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n}\n\n.date-time-picker-dropdown {\n background: rgb(var(--v-theme-surface));\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n overflow: visible;\n}\n\n.date-time-picker-dropdown.range-mode {\n width: 646px;\n min-width: 646px;\n max-width: 646px;\n}\n\n.date-time-picker-dropdown:not(.range-mode) {\n width: 360px;\n min-width: 360px;\n max-width: none;\n}\n\n.date-time-picker-dropdown.inline-mode {\n box-shadow: none;\n width: fit-content;\n border: none;\n}\n\n\n.picker-shell,\n.range-calendar-shell {\n display: flex;\n align-items: stretch;\n flex-wrap: nowrap;\n}\n\n.date-panel {\n width: 288px;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.calendar-panel {\n flex: 0 0 322px;\n width: 322px;\n min-width: 322px;\n max-width: 322px;\n padding: 12px 16px 16px;\n box-sizing: border-box;\n}\n\n.calendar-divider {\n flex: 0 0 1px;\n width: 1px;\n background: rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-header,\n.calendar-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.picker-header {\n padding: 12px 16px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-header.single-header {\n border-bottom: none;\n padding: 14px 16px 8px;\n}\n\n.calendar-header {\n height: 36px;\n margin-bottom: 8px;\n}\n\n.header-title,\n.month-title {\n font-size: 16px;\n font-weight: 500;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.clickable {\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background 0.2s;\n}\n\n.clickable:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.nav-btn,\n.nav-btn-small {\n border: none;\n background: none;\n color: rgb(var(--v-theme-on-surface), 0.6);\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.2s;\n}\n\n.nav-btn {\n font-size: 20px;\n padding: 4px 12px;\n}\n\n.nav-btn-small {\n font-size: 18px;\n padding: 4px 8px;\n}\n\n.nav-btn:hover,\n.nav-btn-small:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.nav-btn-small.invisible {\n visibility: hidden;\n}\n\n.picker-body {\n padding: 10px 16px 16px;\n min-height: 250px;\n}\n\n.year-grid,\n.month-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n\n.year-item,\n.month-item {\n height: 42px;\n border: 1px solid transparent;\n background: transparent;\n text-align: center;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n}\n\n.year-item:hover,\n.month-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.year-item.selected,\n.month-item.selected {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.week-header {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n margin-bottom: 6px;\n}\n\n.week-day {\n text-align: center;\n padding: 6px 0;\n font-size: 12px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-weight: 500;\n}\n\n.day-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n}\n\n.day-item {\n aspect-ratio: 1;\n border: 1px solid transparent;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 13px;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.day-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.day-item.other-month {\n color: rgb(var(--v-theme-on-surface), 0.38);\n}\n\n.day-item.today {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n}\n\n.day-item.selected,\n.day-item.range-start,\n.day-item.range-end {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.day-item.in-range {\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.year-item.disabled,\n.month-item.disabled,\n.day-item.disabled,\n.time-item.disabled {\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\n cursor: not-allowed !important;\n pointer-events: none;\n opacity: 0.5;\n}\n\n.time-panel {\n width: 156px;\n}\n\n.time-header {\n height: 49px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 500;\n color: rgb(var(--v-theme-on-surface));\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.time-columns {\n display: flex;\n height: 250px;\n}\n\n.time-columns.compact {\n height: 192px;\n}\n\n.time-column {\n flex: 1;\n overflow-y: auto;\n padding: 6px 0;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.08);\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.time-column::-webkit-scrollbar {\n width: 0;\n height: 0;\n}\n\n.time-column:last-child {\n border-right: none;\n}\n\n.time-item {\n width: 100%;\n height: 28px;\n border: none;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n cursor: pointer;\n font-size: 13px;\n transition: all 0.2s;\n}\n\n.time-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.time-item.selected {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.range-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.single-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 9px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.single-date-input,\n.single-time-input {\n flex: 0 0 auto;\n width: 150px;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n padding: 0 12px;\n outline: none;\n}\n\n.single-time-input {\n text-align: left;\n cursor: pointer;\n}\n\n.single-time-input.active,\n.single-time-input:focus,\n.single-date-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.single-calendar-panel {\n width: 360px;\n}\n\n.range-date-input,\n.range-time-input {\n flex: 0 0 auto;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n padding: 0 12px;\n outline: none;\n}\n\n.range-date-input {\n width: 144px;\n}\n\n.range-time-input {\n width: 132px;\n text-align: left;\n cursor: pointer;\n}\n\n.range-time-input.active,\n.range-time-input:focus,\n.range-date-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.range-arrow {\n flex: 0 0 16px;\n width: 16px;\n text-align: center;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-size: 22px;\n}\n\n.range-time-popover {\n position: absolute;\n top: 45px;\n width: 180px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.single-time-popover {\n position: absolute;\n top: 45px;\n left: 156px;\n width: 180px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.range-time-popover.start {\n left: 162px;\n}\n\n.range-time-popover.end {\n left: 430px;\n}\n\n.time-popover-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.selected-display {\n padding: 10px 16px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n text-align: center;\n}\n\n.selected-text {\n font-size: 14px;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.placeholder-text,\n.inline-message {\n font-size: 14px;\n color: rgb(var(--v-theme-on-surface), 0.38);\n}\n\n.inline-message {\n padding: 16px;\n}\n\n.picker-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.footer-spacer {\n flex: 1;\n}\n\n.btn {\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n outline: none;\n}\n\n.btn.small {\n padding: 4px 8px;\n font-size: 12px;\n}\n\n.btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.btn-text {\n background: none;\n color: rgb(var(--v-theme-primary));\n}\n\n.btn-text:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.btn-primary {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n}\n</style>\n","<template>\n <div class=\"vtk-time-picker\">\n <VMenu\n v-if=\"!inline\"\n v-model=\"showPicker\"\n :attach=\"menuAttach\"\n :location=\"menuLocation\"\n :origin=\"menuOrigin\"\n :width=\"menuWidth\"\n :min-width=\"menuWidth\"\n offset=\"4\"\n :close-on-content-click=\"false\"\n >\n <template #activator=\"{ props: menuProps }\">\n <div class=\"time-input\">\n <VTextField\n :model-value=\"displayValue\"\n :label=\"label || undefined\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n readonly\n v-bind=\"menuProps\"\n :clearable=\"clearable && !!displayValue && !disabled\"\n clear-icon=\"mdi-close-circle\"\n persistent-clear\n class=\"time-input-field\"\n @click:clear.stop=\"clearValue\"\n >\n <template #append-inner>\n <VIcon size=\"16\" class=\"time-icon\">mdi-clock-outline</VIcon>\n </template>\n </VTextField>\n </div>\n </template>\n\n <div\n class=\"time-picker-dropdown\"\n :class=\"{ 'range-mode': isRange }\"\n :style=\"{ width: menuWidth + 'px', minWidth: menuWidth + 'px' }\"\n @click.stop\n @mousedown.stop\n >\n <template v-if=\"isRange\">\n <div class=\"range-input-row\">\n <div class=\"range-time-wrap\" :class=\"{ active: activeTimeSide === 'start' }\">\n <button class=\"range-time-input\" type=\"button\" @click=\"openRangeTime('start')\">\n {{ formatTimePart(tempRange[0]) || defaultStartTime }}\n </button>\n <div v-if=\"activeTimeSide === 'start'\" class=\"range-time-popover\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === activeRangeHour, disabled: isRangeTimeDisabled('start', 'hour', hour) }]\"\n @click=\"selectRangeTime('hour', hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === activeRangeMinute, disabled: isRangeTimeDisabled('start', 'minute', minute) }]\"\n @click=\"selectRangeTime('minute', minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === activeRangeSecond, disabled: isRangeTimeDisabled('start', 'second', second) }]\"\n @click=\"selectRangeTime('second', second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeTimeSide = null\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeTimeSide = null\">确定</button>\n </div>\n </div>\n </div>\n\n <span class=\"range-arrow\">›</span>\n\n <div class=\"range-time-wrap\" :class=\"{ active: activeTimeSide === 'end' }\">\n <button class=\"range-time-input\" type=\"button\" @click=\"openRangeTime('end')\">\n {{ formatTimePart(tempRange[1]) || defaultEndTime }}\n </button>\n <div v-if=\"activeTimeSide === 'end'\" class=\"range-time-popover\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === activeRangeHour, disabled: isRangeTimeDisabled('end', 'hour', hour) }]\"\n @click=\"selectRangeTime('hour', hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === activeRangeMinute, disabled: isRangeTimeDisabled('end', 'minute', minute) }]\"\n @click=\"selectRangeTime('minute', minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === activeRangeSecond, disabled: isRangeTimeDisabled('end', 'second', second) }]\"\n @click=\"selectRangeTime('second', second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeTimeSide = null\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeTimeSide = null\">确定</button>\n </div>\n </div>\n </div>\n </div>\n </template>\n\n <template v-else>\n <div class=\"single-time-panel\">\n <div class=\"time-columns\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === selectedHour, disabled: isTimePartDisabled(hour, selectedMinute, selectedSecond) }]\"\n @click=\"selectHour(hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === selectedMinute, disabled: isTimePartDisabled(selectedHour, minute, selectedSecond) }]\"\n @click=\"selectMinute(minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === selectedSecond, disabled: isTimePartDisabled(selectedHour, selectedMinute, second) }]\"\n @click=\"selectSecond(second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <div class=\"picker-footer\">\n <button v-if=\"!isRange\" class=\"btn btn-text\" type=\"button\" @click=\"handleNow\">此刻</button>\n <button v-if=\"isRange\" class=\"btn btn-text\" type=\"button\" @click=\"clearTempRange\">清空</button>\n <span class=\"footer-spacer\"></span>\n <button class=\"btn btn-text\" type=\"button\" @click=\"handleCancel\">取消</button>\n <button class=\"btn btn-primary\" type=\"button\" :disabled=\"!canConfirm\" @click=\"handleConfirm\">确定</button>\n </div>\n </div>\n </VMenu>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkTimePicker',\n});\n\nconst props = defineProps({\n modelValue: {\n type: [String, Date, Number, Array],\n default: null\n },\n mode: {\n type: String,\n default: 'single',\n validator: (value) => ['single', 'range'].includes(value)\n },\n label: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: '请选择时间'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n clearable: {\n type: Boolean,\n default: true\n },\n format: {\n type: String,\n default: 'HH:mm:ss'\n },\n valueFormat: {\n type: String,\n default: 'HH:mm:ss'\n },\n separator: {\n type: String,\n default: ' 至 '\n },\n min: {\n type: String,\n default: null\n },\n max: {\n type: String,\n default: null\n },\n minuteStep: {\n type: Number,\n default: 1\n },\n secondStep: {\n type: Number,\n default: 1\n },\n showSeconds: {\n type: Boolean,\n default: true\n },\n inline: {\n type: Boolean,\n default: false\n },\n placement: {\n type: String,\n default: 'left',\n validator: (value) => ['left', 'right'].includes(value)\n },\n noTeleport: {\n type: Boolean,\n default: false\n },\n onCancel: {\n type: Function,\n default: null\n },\n onConfirm: {\n type: Function,\n default: null\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\n\nconst showPicker = ref(false);\nconst selectedTime = ref(null);\nconst selectedRange = ref([]);\nconst tempRange = ref([null, null]);\nconst selectedHour = ref(0);\nconst selectedMinute = ref(0);\nconst selectedSecond = ref(0);\nconst activeTimeSide = ref(null);\n\nconst defaultStartTime = '00:00:00';\nconst defaultEndTime = '23:59:59';\n\nconst isRange = computed(() => props.mode === 'range');\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\nconst menuWidth = computed(() => isRange.value ? 320 : 240);\nconst minTime = computed(() => parseTime(props.min));\nconst maxTime = computed(() => parseTime(props.max));\nconst hourOptions = computed(() => Array.from({ length: 24 }, (_, index) => index));\nconst minuteOptions = computed(() => buildStepOptions(props.minuteStep));\nconst secondOptions = computed(() => buildStepOptions(props.secondStep));\n\nconst displayValue = computed(() => {\n if (isRange.value) {\n if (!selectedRange.value.length) return '';\n const [start, end] = selectedRange.value;\n return [start, end].filter(Boolean).map(date => formatByPattern(date, props.format)).join(props.separator);\n }\n return selectedTime.value ? formatByPattern(selectedTime.value, props.format) : '';\n});\n\nconst canConfirm = computed(() => {\n if (isRange.value) {\n const [start, end] = tempRange.value;\n if (!start || !end) return false;\n if (start > end) return false;\n return !isTimeDisabled(start.getHours(), start.getMinutes(), start.getSeconds())\n && !isTimeDisabled(end.getHours(), end.getMinutes(), end.getSeconds());\n }\n return !isTimeDisabled(selectedHour.value, selectedMinute.value, props.showSeconds ? selectedSecond.value : 0);\n});\n\nconst activeRangeDate = computed(() => {\n return activeTimeSide.value === 'end' ? tempRange.value[1] : tempRange.value[0];\n});\n\nconst activeRangeHour = computed(() => activeRangeDate.value ? activeRangeDate.value.getHours() : 0);\nconst activeRangeMinute = computed(() => activeRangeDate.value ? activeRangeDate.value.getMinutes() : 0);\nconst activeRangeSecond = computed(() => activeRangeDate.value ? activeRangeDate.value.getSeconds() : 0);\n\nconst buildStepOptions = (step) => {\n const normalizedStep = Number.isFinite(step) && step > 0 ? Math.max(1, Math.floor(step)) : 1;\n const options = [];\n for (let value = 0; value < 60; value += normalizedStep) {\n options.push(value);\n }\n return options;\n};\n\nconst padTime = (value) => String(value).padStart(2, '0');\n\nconst formatByPattern = (date, pattern) => {\n if (!(date instanceof Date) || Number.isNaN(date.getTime())) return '';\n const replacements = {\n HH: padTime(date.getHours()),\n mm: padTime(date.getMinutes()),\n ss: padTime(date.getSeconds())\n };\n return Object.keys(replacements).reduce((result, token) => {\n return result.replace(new RegExp(token, 'g'), replacements[token]);\n }, pattern);\n};\n\nconst formatTimePart = (date) => date ? formatByPattern(date, props.showSeconds ? 'HH:mm:ss' : 'HH:mm') : '';\n\nconst parseTime = (value) => {\n if (!value && value !== 0) return null;\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) return null;\n return new Date(2000, 0, 1, value.getHours(), value.getMinutes(), value.getSeconds());\n }\n if (typeof value === 'number') {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return new Date(2000, 0, 1, date.getHours(), date.getMinutes(), date.getSeconds());\n }\n if (typeof value !== 'string') return null;\n\n const match = value.trim().match(/(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?/);\n if (!match) return null;\n const [, hour, minute, second = '0'] = match;\n const date = new Date(2000, 0, 1, Math.min(23, Number(hour)), Math.min(59, Number(minute)), Math.min(59, Number(second)));\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst parseRangeValue = (value) => {\n if (Array.isArray(value)) return value.map(parseTime).filter(Boolean).slice(0, 2);\n if (typeof value === 'string' && value.includes(props.separator)) {\n return value.split(props.separator).map(item => parseTime(item.trim())).filter(Boolean).slice(0, 2);\n }\n return [];\n};\n\nconst toModelValue = (date) => {\n if (!date) return null;\n if (props.valueFormat === 'timestamp') return date.getTime();\n if (props.valueFormat === 'Date') return new Date(date.getTime());\n return formatByPattern(date, props.valueFormat);\n};\n\nconst toModelRange = (range) => range.map(date => toModelValue(date));\n\nconst buildTempTime = (hour = selectedHour.value, minute = selectedMinute.value, second = selectedSecond.value) => {\n return new Date(2000, 0, 1, hour, minute, props.showSeconds ? second : 0);\n};\n\nconst isTimeDisabled = (hour, minute, second) => {\n const date = new Date(2000, 0, 1, hour, minute, props.showSeconds ? second : 0);\n if (minTime.value && date < minTime.value) return true;\n if (maxTime.value && date > maxTime.value) return true;\n return false;\n};\n\nconst isTimePartDisabled = (hour, minute, second) => isTimeDisabled(hour, minute, second);\n\nconst isRangeTimeDisabled = (side, part, value) => {\n const index = side === 'end' ? 1 : 0;\n const otherIndex = 1 - index;\n const current = tempRange.value[index];\n const other = tempRange.value[otherIndex];\n const hour = part === 'hour' ? value : (current ? current.getHours() : 0);\n const minute = part === 'minute' ? value : (current ? current.getMinutes() : 0);\n const second = part === 'second' ? value : (current ? current.getSeconds() : 0);\n const date = new Date(2000, 0, 1, hour, minute, props.showSeconds ? second : 0);\n if (side === 'start') {\n if (other && date > other) return true;\n if (maxTime.value && date > maxTime.value) return true;\n } else {\n if (other && date < other) return true;\n if (minTime.value && date < minTime.value) return true;\n }\n return false;\n};\n\nconst selectHour = (hour) => {\n if (isTimePartDisabled(hour, selectedMinute.value, selectedSecond.value)) return;\n selectedHour.value = hour;\n};\n\nconst selectMinute = (minute) => {\n if (isTimePartDisabled(selectedHour.value, minute, selectedSecond.value)) return;\n selectedMinute.value = minute;\n};\n\nconst selectSecond = (second) => {\n if (isTimePartDisabled(selectedHour.value, selectedMinute.value, second)) return;\n selectedSecond.value = second;\n};\n\nconst openRangeTime = (side) => {\n activeTimeSide.value = side;\n const index = side === 'start' ? 0 : 1;\n if (!tempRange.value[index]) {\n const base = new Date(2000, 0, 1);\n base.setHours(side === 'start' ? 0 : 23, side === 'start' ? 0 : 59, props.showSeconds ? (side === 'start' ? 0 : 59) : 0, 0);\n tempRange.value[index] = base;\n }\n};\n\nconst selectRangeTime = (part, value) => {\n const index = activeTimeSide.value === 'end' ? 1 : 0;\n const date = tempRange.value[index] ? new Date(tempRange.value[index].getTime()) : new Date(2000, 0, 1);\n if (part === 'hour') date.setHours(value);\n if (part === 'minute') date.setMinutes(value);\n if (part === 'second') date.setSeconds(value);\n if (!props.showSeconds) date.setSeconds(0);\n date.setMilliseconds(0);\n tempRange.value[index] = date;\n};\n\nconst setSingleFromTime = (date) => {\n if (!date) return;\n selectedHour.value = date.getHours();\n selectedMinute.value = date.getMinutes();\n selectedSecond.value = date.getSeconds();\n};\n\nconst initializePicker = () => {\n if (isRange.value) {\n tempRange.value = selectedRange.value.length ? selectedRange.value.map(date => new Date(date.getTime())) : [null, null];\n activeTimeSide.value = null;\n return;\n }\n setSingleFromTime(selectedTime.value || new Date());\n};\n\nconst closePicker = () => {\n showPicker.value = false;\n activeTimeSide.value = null;\n};\n\nconst clearTempRange = () => {\n tempRange.value = [null, null];\n activeTimeSide.value = null;\n};\n\nconst clearValue = () => {\n if (isRange.value) {\n selectedRange.value = [];\n tempRange.value = [null, null];\n emit('update:modelValue', []);\n emit('change', []);\n } else {\n selectedTime.value = null;\n emit('update:modelValue', null);\n emit('change', null);\n }\n};\n\nconst confirm = () => {\n if (!canConfirm.value) return;\n if (isRange.value) {\n selectedRange.value = tempRange.value.map(date => new Date(date.getTime()));\n const modelValue = toModelRange(selectedRange.value);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n return;\n }\n const nextValue = buildTempTime();\n selectedTime.value = nextValue;\n const modelValue = toModelValue(nextValue);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n};\n\nconst handleCancel = () => {\n if (props.onCancel) {\n props.onCancel();\n } else {\n emit('cancel');\n closePicker();\n }\n};\n\nconst handleConfirm = () => {\n const value = isRange.value ? toModelRange(tempRange.value) : toModelValue(buildTempTime());\n if (props.onConfirm) {\n props.onConfirm(value);\n } else {\n emit('confirm', value);\n confirm();\n }\n};\n\nconst handleNow = () => {\n const now = new Date();\n if (isTimeDisabled(now.getHours(), now.getMinutes(), now.getSeconds())) return;\n setSingleFromTime(now);\n};\n\nwatch(showPicker, (isOpen) => {\n if (isOpen) initializePicker();\n});\n\nwatch(() => props.modelValue, (newValue) => {\n if (isRange.value) {\n selectedRange.value = parseRangeValue(newValue);\n } else {\n selectedTime.value = parseTime(newValue);\n }\n}, { immediate: true });\n</script>\n\n<style scoped>\n.vtk-time-picker {\n position: relative;\n width: 100%;\n}\n\n.time-input {\n width: 100%;\n}\n\n.time-input-field {\n cursor: pointer;\n}\n\n:deep(.time-input-field .v-field),\n:deep(.time-input-field input) {\n cursor: pointer;\n}\n\n.time-icon {\n margin-left: 8px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n}\n\n.time-picker-dropdown {\n background: rgb(var(--v-theme-surface));\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n overflow: visible;\n}\n\n.time-columns {\n display: flex;\n height: 260px;\n}\n\n.time-columns.compact {\n height: 192px;\n}\n\n.time-column {\n flex: 1;\n overflow-y: auto;\n padding: 6px 0;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.08);\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.time-column::-webkit-scrollbar {\n width: 0;\n height: 0;\n}\n\n.time-column:last-child {\n border-right: none;\n}\n\n.time-item {\n width: 100%;\n height: 28px;\n border: none;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n cursor: pointer;\n font-size: 13px;\n transition: all 0.2s;\n}\n\n.time-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.time-item.selected {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.time-item.disabled {\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\n cursor: not-allowed !important;\n pointer-events: none;\n opacity: 0.5;\n}\n\n.single-time-panel {\n padding: 8px 0;\n}\n\n.range-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n gap: 10px;\n padding: 10px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.range-time-wrap {\n position: relative;\n flex: 0 0 auto;\n}\n\n.range-time-input {\n width: 124px;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n text-align: left;\n padding: 0 12px;\n outline: none;\n cursor: pointer;\n}\n\n.range-time-input.active,\n.range-time-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.range-arrow {\n flex: 0 0 16px;\n width: 16px;\n text-align: center;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-size: 22px;\n}\n\n.range-time-popover {\n position: absolute;\n top: 40px;\n left: 0;\n width: 190px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.time-popover-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.footer-spacer {\n flex: 1;\n}\n\n.btn {\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n white-space: nowrap;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n outline: none;\n}\n\n.btn.small {\n padding: 4px 8px;\n font-size: 12px;\n}\n\n.btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.btn-text {\n background: none;\n color: rgb(var(--v-theme-primary));\n}\n\n.btn-text:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.btn-primary {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n}\n</style>\n","<script setup>\r\nimport { ref, computed, reactive, onMounted, getCurrentInstance, watch, nextTick } from \"vue\";\r\nconst { proxy } = getCurrentInstance();\r\n// 获取配置的键名,如果没有配置则使用默认值\r\nconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\nconst user = JSON.parse(proxy.$vtk.storage.get(userKey));\r\n\r\nconsole.log('window.VTK_CONFIG=', window.VTK_CONFIG)\r\nconsole.log('window.VTK_CONFIG?.storageKeys?.user', window.VTK_CONFIG?.storageKeys?.user)\r\nconsole.log('user', user)\r\nconst pause = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\r\n\r\n// 字段命名兼容:不同环境的用户信息 / 接口返回可能是 areacode 或 areaCode\r\nconst pickAreaCode = (obj) => obj?.areaCode || obj?.areacode || '';\r\nconst pickAreaName = (obj) => obj?.areaName || obj?.areaname || '';\r\n\r\n// 定义 props - 控制是否支持多选\r\nconst props = defineProps({\r\n multiple: {\r\n type: Boolean,\r\n default: false // 默认单选\r\n }\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['selected']);\r\n\r\n// 定义响应式数据\r\nconst dialog = ref(false);\r\n\r\n\r\n// 地区列表\r\nconst areaData = ref([]);\r\nconst areaSelectedData = ref([]);\r\nconst areaActivatedData = ref([]);\r\n\r\nwatch(areaActivatedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.areaCode) {\r\n getDeptList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\nwatch(areaSelectedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.areaCode) {\r\n getDeptList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\n// 获取地区列表\r\nconst getAreaList = () => {\r\n const userAreaCode = pickAreaCode(user);\r\n if (userAreaCode) {\r\n proxy.$vtk.request.getForm(`/dict/area/show/${userAreaCode}`).then((res) => {\r\n if (res && res.data) {\r\n areaData.value = [{\r\n areaCode: pickAreaCode(res.data),\r\n areaName: pickAreaName(res.data),\r\n children: []\r\n }];\r\n }\r\n });\r\n }\r\n};\r\n\r\n// 获取下级地区列表\r\nconst getAreaNextList = async (item) => {\r\n await pause(300);\r\n const parentCode = pickAreaCode(item);\r\n proxy.$vtk.request.getForm(`/dict/area/next/${parentCode}`).then((res) => {\r\n if (res && res.data) {\r\n res.data.forEach((it) => {\r\n // 统一成 areaCode / areaName,避免后端返回 areacode 时树取值取不到\r\n it.areaCode = pickAreaCode(it);\r\n it.areaName = pickAreaName(it);\r\n it.areaLeve < 12 && (it.children = []);\r\n item.children.push(it);\r\n });\r\n }\r\n });\r\n};\r\n\r\n// 部门列表\r\nconst deptData = ref([]);\r\nconst deptSelectedData = ref([]);\r\nconst deptActivatedData = ref([]);\r\n\r\nwatch(deptSelectedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.id) {\r\n getPersonList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\nwatch(deptActivatedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.id) {\r\n getPersonList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\n// 点击叶子节点时调用的方法\r\nconst getDeptList = (node) => {\r\n const selectAreaCode = node[0].areaCode;\r\n const params = { codex: { area: selectAreaCode, type: \"0\" } };\r\n deptData.value = [];\r\n proxy.$vtk.request.postJson('/bizp/supported/dept/list', params).then((res) => {\r\n res.data.forEach((it) => {\r\n it.children = [];\r\n deptData.value.push(it);\r\n });\r\n });\r\n};\r\n\r\nconst getDepNextList = async (item) => {\r\n await pause(300);\r\n const selectAreaCode = item.areaCode;\r\n const selectPid = item.id;\r\n const params = { codex: { area: selectAreaCode, pid: selectPid } };\r\n proxy.$vtk.request.postJson('/bizp/supported/dept/list', params).then((res) => {\r\n if (res && res.data) {\r\n res.data.forEach((it) => {\r\n it.children = [];\r\n item.children.push(it);\r\n });\r\n }\r\n });\r\n};\r\n\r\n// 人员列表\r\nconst personData = ref([]);\r\nconst selectedPersonData = ref([]);\r\n// 全局已选人员列表(跨部门保存,用于去重和持久化选中状态)\r\nconst allSelectedPersons = ref([]);\r\n// 标记是否正在恢复选中状态(避免触发 watch 循环)\r\nconst isRestoringSelection = ref(false);\r\n\r\n// 已选中的人员列表(用于右侧显示)- 去重后的列表\r\nconst selectedPersonList = computed(() => {\r\n // 使用 Map 去重,key 为人员 id\r\n const uniqueMap = new Map();\r\n allSelectedPersons.value.forEach(person => {\r\n if (person && person.id) {\r\n uniqueMap.set(person.id, person);\r\n }\r\n });\r\n\r\n return Array.from(uniqueMap.values());\r\n});\r\n\r\n// 监听当前部门选中人员的变化\r\nwatch(selectedPersonData, (newVal, oldVal) => {\r\n // 如果正在恢复选中状态,不处理\r\n if (isRestoringSelection.value) {\r\n return;\r\n }\r\n\r\n // 单选模式:直接替换全局列表\r\n if (!props.multiple) {\r\n if (newVal && newVal.length > 0) {\r\n // 单选模式下只保留最新选中的一个\r\n allSelectedPersons.value = [newVal[0]];\r\n } else {\r\n // 取消选中时清空\r\n allSelectedPersons.value = [];\r\n }\r\n return;\r\n }\r\n\r\n // 多选模式:累加到全局列表\r\n // 处理新选中的人员\r\n if (newVal && newVal.length > 0) {\r\n newVal.forEach(person => {\r\n const exists = allSelectedPersons.value.some(p => p.id === person.id);\r\n if (!exists) {\r\n allSelectedPersons.value.push(person);\r\n }\r\n });\r\n }\r\n\r\n // 处理取消选中的人员\r\n if (oldVal && oldVal.length > 0) {\r\n oldVal.forEach(oldPerson => {\r\n const stillSelected = newVal?.some(p => p.id === oldPerson.id);\r\n if (!stillSelected) {\r\n // 从全局列表中移除\r\n const index = allSelectedPersons.value.findIndex(p => p.id === oldPerson.id);\r\n if (index > -1) {\r\n allSelectedPersons.value.splice(index, 1);\r\n }\r\n }\r\n });\r\n }\r\n}, { deep: true });\r\n\r\n// 监听部门切换,同步选中状态\r\nwatch(personData, async (newPersonData) => {\r\n if (!newPersonData || newPersonData.length === 0) {\r\n isRestoringSelection.value = true;\r\n selectedPersonData.value = [];\r\n await nextTick();\r\n isRestoringSelection.value = false;\r\n return;\r\n }\r\n\r\n // 等待 DOM 更新\r\n await nextTick();\r\n\r\n // 标记正在恢复选中状态\r\n isRestoringSelection.value = true;\r\n\r\n // 当人员列表更新时,恢复之前选中的状态\r\n const currentSelected = [];\r\n newPersonData.forEach(person => {\r\n const isSelected = allSelectedPersons.value.some(p => p.id === person.id);\r\n if (isSelected) {\r\n currentSelected.push(person);\r\n }\r\n });\r\n\r\n selectedPersonData.value = currentSelected;\r\n\r\n // 等待状态更新完成\r\n await nextTick();\r\n isRestoringSelection.value = false;\r\n}, { deep: true });\r\n\r\n// 移除已选中的人员\r\nconst removeSelectedPerson = (personId) => {\r\n // 从全局列表中移除\r\n const globalIndex = allSelectedPersons.value.findIndex(person => person.id === personId);\r\n if (globalIndex > -1) {\r\n allSelectedPersons.value.splice(globalIndex, 1);\r\n }\r\n\r\n // 从当前显示的选中列表中移除\r\n const currentIndex = selectedPersonData.value.findIndex(person => person.id === personId);\r\n if (currentIndex > -1) {\r\n selectedPersonData.value.splice(currentIndex, 1);\r\n }\r\n};\r\n\r\n\r\n// 点击叶子节点时调用的方法\r\n// \r\nconst getPersonList = (node) => {\r\n const selectAreaID = node[0].id;\r\n const params = { codex: { dept: selectAreaID } };\r\n\r\n proxy.$vtk.request.postJson('/bizp/supported/user/list', params).then((res) => {\r\n if (res && res.meta.success && res.data.length > 0) {\r\n personData.value = res.data\r\n } else {\r\n personData.value = null\r\n }\r\n });\r\n};\r\nconst add = () => {\r\n dialog.value = true;\r\n};\r\n\r\nconst close = () => {\r\n // 先设置标记,避免触发 watch\r\n isRestoringSelection.value = true;\r\n\r\n // 关闭对话框\r\n dialog.value = false;\r\n\r\n // 清空选中状态\r\n selectedPersonData.value = [];\r\n allSelectedPersons.value = [];\r\n areaSelectedData.value = [];\r\n areaActivatedData.value = [];\r\n deptSelectedData.value = [];\r\n deptActivatedData.value = [];\r\n personData.value = [];\r\n deptData.value = [];\r\n\r\n // 重置标记\r\n nextTick(() => {\r\n isRestoringSelection.value = false;\r\n });\r\n};\r\n\r\n// 确认选择\r\nconst confirm = () => {\r\n // 返回选中的人员列表给父组件\r\n const selectedPersons = selectedPersonList.value;\r\n // 通过 emit 将选中的人员传递给父组件\r\n emit('selected', selectedPersons);\r\n close();\r\n};\r\n\r\nonMounted(() => {\r\n // 获取地区列表\r\n getAreaList();\r\n});\r\n\r\n// 使组件方法可以被父组件调用\r\ndefineExpose({\r\n close,\r\n add,\r\n});\r\n</script>\r\n\r\n<template>\r\n <v-dialog v-model=\"dialog\" persistent width=\"1000\">\r\n <v-card>\r\n <v-card-title class=\"d-flex align-center\">\r\n <span class=\"text-h6\">人员选择</span>\r\n <v-spacer></v-spacer>\r\n <v-btn class=\"g-no-shadow\" icon @click=\"close\" size=\"small\">\r\n <v-icon>mdi-close</v-icon>\r\n </v-btn>\r\n </v-card-title>\r\n <v-divider />\r\n <v-card-text class=\"pb-0 mb-0 pl-0 pr-0\" style=\"height: 600px;\">\r\n <v-row style=\"margin-top:-16px; height: 100%;\">\r\n <v-col md=\"3\" class=\"pr-0 \" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">地区</span>\r\n </v-card-title>\r\n <v-sheet height=\"500\" style=\"overflow: auto\" class=\"mt-2 pl-2\">\r\n <v-treeview item-value=\"id\" item-title=\"areaName\" return-object :items=\"areaData\" density=\"compact\"\r\n color=\"primary\" item-props activatable v-model:selected=\"areaSelectedData\"\r\n v-model:activated=\"areaActivatedData\" :load-children=\"getAreaNextList\">\r\n <template v-slot:title=\"{ item }\">\r\n <span :title=\"item.areaName\">{{ item.areaName }}</span>\r\n </template>\r\n </v-treeview>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">部门</span>\r\n </v-card-title>\r\n <v-sheet height=\"500\" style=\"overflow: auto\" class=\"mt-2 pl-2\">\r\n <v-treeview v-if=\"deptData && deptData.length > 0\" item-value=\"id\" item-title=\"name\" return-object :items=\"deptData\" density=\"compact\"\r\n color=\"primary\" item-props activatable v-model:selected=\"deptSelectedData\"\r\n v-model:activated=\"deptActivatedData\" :load-children=\"getDepNextList\">\r\n <template v-slot:title=\"{ item }\">\r\n <span :title=\"item.name\">{{ item.name }}</span>\r\n </template>\r\n </v-treeview>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-office-building-outline\r\n </v-icon>\r\n <div class=\"text-grey\">暂无</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">人员</span>\r\n </v-card-title>\r\n <v-sheet height=\"550\" style=\"overflow: auto;\" class=\"mt-2\">\r\n <v-treeview v-if=\"personData && personData.length > 0\"\r\n item-value=\"id\"\r\n item-title=\"username\"\r\n return-object\r\n :items=\"personData\"\r\n density=\"compact\"\r\n color=\"primary\"\r\n item-props\r\n selectable\r\n :select-strategy=\"multiple ? 'leaf' : 'single-leaf'\"\r\n v-model:selected=\"selectedPersonData\">\r\n <template v-slot:title=\"{ item }\">\r\n <div class=\"d-flex align-center\" :title=\"item.username\">\r\n <v-avatar size=\"24\" class=\"mr-2\">\r\n <v-img v-if=\"item.avatar\" :src=\"item.avatar\"></v-img>\r\n <v-icon v-else size=\"20\">mdi-account-circle</v-icon>\r\n </v-avatar>\r\n <span>{{ item.username }}</span>\r\n </div>\r\n </template>\r\n </v-treeview>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-account-group\r\n </v-icon>\r\n <div class=\"text-grey\">暂无</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">已选中人员 ({{ selectedPersonList.length }})</span>\r\n </v-card-title>\r\n <v-sheet height=\"550\" style=\"overflow: auto\" class=\"mt-2 px-2\">\r\n <v-list v-if=\"selectedPersonList.length > 0\" density=\"compact\">\r\n <v-list-item\r\n v-for=\"person in selectedPersonList\"\r\n :key=\"person.id\"\r\n :title=\"person.username\"\r\n class=\"px-2 mb-1 mr-2\"\r\n rounded=\"lg\"\r\n color=\"primary\"\r\n variant=\"tonal\">\r\n <template v-slot:prepend>\r\n <v-avatar size=\"32\">\r\n <v-img v-if=\"person.avatar\" :src=\"person.avatar\"></v-img>\r\n <v-icon v-else>mdi-account-circle</v-icon>\r\n </v-avatar>\r\n </template>\r\n <template v-slot:append>\r\n <v-btn\r\n icon\r\n size=\"x-small\"\r\n variant=\"text\"\r\n @click=\"removeSelectedPerson(person.id)\">\r\n <v-icon size=\"16\">mdi-close</v-icon>\r\n </v-btn>\r\n </template>\r\n </v-list-item>\r\n </v-list>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-account\r\n </v-icon>\r\n <div class=\"text-grey\">暂无选中</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n </v-row>\r\n </v-card-text>\r\n <v-divider />\r\n <v-card-actions>\r\n <v-spacer></v-spacer>\r\n <v-btn color=\"darken-1\" text @click=\"close\">取消</v-btn>\r\n <v-btn color=\"blue darken-1\" text @click=\"confirm\">确定</v-btn>\r\n </v-card-actions>\r\n </v-card>\r\n </v-dialog>\r\n</template>\r\n\r\n<style scoped>\r\n:deep() .v-sheet[style*=\"overflow: auto\"] {\r\n &::-webkit-scrollbar {\r\n width: 5px;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background: #ccc;\r\n border-radius: 4px;\r\n }\r\n}\r\n</style>","<!-- 空页面 -->\r\n<template>\r\n <v-empty-state\r\n :headline=\"headline\"\r\n :title=\"title\"\r\n :text=\"text\"\r\n :image=\"image\"\r\n :icon=\"icon\"\r\n :rounded=\"rounded\"\r\n :elevation=\"elevation\"\r\n >\r\n <!-- 图像插槽 -->\r\n <template v-if=\"$slots.media\" #media>\r\n <slot name=\"media\"></slot>\r\n </template>\r\n\r\n <!-- 标题插槽 -->\r\n <template v-if=\"$slots.title\" #title>\r\n <slot name=\"title\"></slot>\r\n </template>\r\n\r\n <!-- 文本插槽 -->\r\n <template v-if=\"$slots.text\" #text>\r\n <slot name=\"text\"></slot>\r\n </template>\r\n\r\n <!-- 操作按钮插槽 -->\r\n <template v-if=\"$slots.actions\" #actions>\r\n <slot name=\"actions\"></slot>\r\n </template>\r\n\r\n <!-- 底部插槽 -->\r\n <template v-if=\"$slots.bottom\" #bottom>\r\n <slot name=\"bottom\"></slot>\r\n </template>\r\n </v-empty-state>\r\n</template>\r\n\r\n<script setup>\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkEmpty\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 标题\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n // 副标题/文本\r\n text: {\r\n type: String,\r\n default: ''\r\n },\r\n // 头部文本(更大字体)\r\n headline: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图标\r\n icon: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图像\r\n image: {\r\n type: String,\r\n default: ''\r\n },\r\n // 圆角\r\n rounded: {\r\n type: [Boolean, String, Number],\r\n default: 'circle'\r\n },\r\n // 阴影\r\n elevation: {\r\n type: [Number, String],\r\n default: 0\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* 可以添加自定义样式 */\r\n:deep(.v-empty-state) {\r\n padding: 24px;\r\n}\r\n\r\n:deep(.v-empty-state__media) {\r\n margin-bottom: 16px;\r\n}\r\n\r\n:deep(.v-empty-state__headline) {\r\n margin-bottom: 8px;\r\n}\r\n\r\n:deep(.v-empty-state__title) {\r\n margin-bottom: 8px;\r\n}\r\n\r\n:deep(.v-empty-state__actions) {\r\n margin-top: 16px;\r\n}\r\n</style>","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1749629552703'%20class='icon'%20viewBox='0%200%201396%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='13768'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='272.65625'%20height='200'%3e%3cpath%20d='M1264.425891%20814.340655c-6.050909-42.7008-33.233455-84.433455-74.202764-97.540655a199.028364%20199.028364%200%200%201%202.373818%20136.443345c-5.9392%2017.072873-14.373236%2035.439709-8.154763%2052.410182a44.274036%2044.274036%200%200%200%2023.021382%2023.514764%20132.096%20132.096%200%200%200%2032.423563%209.309091l2.169018%201.7408c16.5888-39.880145%2028.429964-83.232582%2022.369746-125.877527z'%20fill='%23F4F4F4'%20p-id='13769'%3e%3c/path%3e%3cpath%20d='M1191.666036%20718.773527c25.488291%2026.242327%2041.630255%2059.466473%2046.145164%2094.952728%201.089164%207.633455%200.893673%2015.378618-0.577164%2022.956218a41.648873%2041.648873%200%200%201-10.593745%2019.642182%2088.175709%2088.175709%200%200%200-13.898473%2016.27229%2024.669091%2024.669091%200%200%200-0.902982%2021.00131c3.723636%208.192%209.141527%2015.5648%2015.946473%2021.69949a66.187636%2066.187636%200%200%201%2017.7152%2024.315346c0.335127%201.135709%202.215564%200.539927%201.880436-0.651636-5.697164-16.821527-22.788655-26.158545-31.390254-41.239273a24.920436%2024.920436%200%200%201-2.215564-22.788655%2067.323345%2067.323345%200%200%201%2013.7216-16.877382%2043.976145%2043.976145%200%200%200%2011.394328-18.878836%2065.619782%2065.619782%200%200%200%201.42429-22.844509%20157.947345%20157.947345%200%200%200-13.6192-49.915345%20171.4176%20171.4176%200%200%200-33.540654-49.319564c-0.856436-0.930909-2.169018%200.539927-1.312582%201.461527l-0.176873%200.214109z'%20fill='%23FFFFFF'%20p-id='13770'%3e%3c/path%3e%3cpath%20d='M1228.418327%20845.460945c-8.033745-5.678545-14.038109-14.838691-16.821527-25.674472-0.279273-1.098473-1.629091-0.502691-1.387055%200.549236%202.913745%2011.282618%209.197382%2020.815127%2017.594182%2026.679855%200.8192%200.539927%201.424291-1.005382%200.6144-1.554619z'%20fill='%23FFFFFF'%20p-id='13771'%3e%3c/path%3e%3cpath%20d='M1070.545455%20804.770909l1.954909%201.135709c8.759855%204.980364%2017.035636%2010.630982%2024.734254%2016.886691%200.642327%200.437527%201.238109%200.912291%201.796655%201.4336a184.813382%20184.813382%200%200%201%2044.776727%2053.573818c4.421818%208.043055%208.154764%2016.384%2011.170909%2024.939055%204.189091%2011.803927%207.68%2024.687709%2015.685818%2034.564654%200.837818%201.014691%201.722182%201.992145%202.671709%202.913746l70.814255-1.135709H1247.418182a12.241455%2012.241455%200%200%200-0.381673-1.3312%203.351273%203.351273%200%200%200%200-0.791273%201.926982%201.926982%200%200%201%200-0.539927%201.303273%201.303273%200%200%201%200-0.446837c-0.763345-2.615855-1.582545-5.231709-2.345891-7.801018a246.225455%20246.225455%200%200%200-26.959127-58.963782%20166.288291%20166.288291%200%200%200-17.221818-22.760727%20137.746618%20137.746618%200%200%200-45.921746-33.978182c-25.013527-12.269382-54.346473-15.173818-81.696582-8.098909l-2.34589%200.400291z'%20fill='%23F4F4F4'%20p-id='13772'%3e%3c/path%3e%3cpath%20d='M1071.904582%20802.425018c35.169745%206.022982%2067.444364%2022.341818%2092.243782%2046.685091a69.678545%2069.678545%200%200%201%2013.451636%2017.594182c3.165091%206.395345%204.468364%2013.479564%203.742255%2020.517236a78.941091%2078.941091%200%200%200-0.651637%2019.893528c1.303273%206.823564%205.659927%2012.790691%2011.943564%2016.365381%207.7824%204.189091%2016.384%206.8608%2025.283491%207.847564a67.397818%2067.397818%200%200%201%2028.048291%208.722618c0.977455%200.670255%202.066618-0.8192%201.033309-1.536-14.270836-9.746618-33.093818-7.335564-48.835491-14.112582-7.493818-2.774109-13.2096-8.685382-15.453091-16.002327a60.229818%2060.229818%200%200%201%200-20.200727%2040.001164%2040.001164%200%200%200-2.885818-20.265891%2064.260655%2064.260655%200%200%200-12.6976-17.957236%20164.9664%20164.9664%200%200%200-40.364218-30.366255A180.140218%20180.140218%200%200%200%201071.522909%20800.581818c-1.247418%200-1.359127%201.582545%200%201.796655l0.372364%200.046545z'%20fill='%23FFFFFF'%20p-id='13773'%3e%3c/path%3e%3cpath%20d='M1148.220509%20837.520291c8.620218-8.145455%208.052364-19.725964-1.3312-27.387346-0.912291-0.7168-2.541382%200.316509-1.582545%201.03331%208.8064%207.121455%209.271855%2017.938618%201.098472%2025.451054-0.847127%200.809891%200.968145%201.675636%201.815273%200.902982z'%20fill='%23FFFFFF'%20p-id='13774'%3e%3c/path%3e%3cpath%20d='M269.963636%20102.4m20.107637%200l248.366545%200q20.107636%200%2020.107637%2020.107636l0%2080.802909q0%2020.107636-20.107637%2020.107637l-248.366545%200q-20.107636%200-20.107637-20.107637l0-80.802909q0-20.107636%2020.107637-20.107636Z'%20fill='%23F4F4F4'%20p-id='13775'%3e%3c/path%3e%3cpath%20d='M339.781818%20162.909091m-23.272727%200a23.272727%2023.272727%200%201%200%2046.545454%200%2023.272727%2023.272727%200%201%200-46.545454%200Z'%20fill='%23FFFFFF'%20p-id='13776'%3e%3c/path%3e%3cpath%20d='M513.889745%20158.217309H387.872582C384.372364%20157.789091%20381.672727%20153.767564%20381.672727%20148.945455s2.690327-8.843636%206.199855-9.271855h126.017163c2.569309-0.316509%205.045527%201.377745%206.404655%204.375273%201.349818%203.006836%201.349818%206.795636%200%209.793163-1.359127%202.997527-3.835345%204.691782-6.404655%204.375273zM477.435345%20195.490909h-89.125236c-3.667782%200-6.637382-4.170473-6.637382-9.309091s2.978909-9.309091%206.637382-9.309091h89.125236c3.667782%200%206.637382%204.170473%206.637382%209.309091s-2.978909%209.309091-6.637382%209.309091z'%20fill='%23FFFFFF'%20p-id='13777'%3e%3c/path%3e%3cpath%20d='M111.709091%20605.090909m20.107636%200l183.202909%200q20.107636%200%2020.107637%2020.107636l0%2090.112q0%2020.107636-20.107637%2020.107637l-183.202909%200q-20.107636%200-20.107636-20.107637l0-90.112q0-20.107636%2020.107636-20.107636Z'%20fill='%23E1EDFF'%20p-id='13778'%3e%3c/path%3e%3cpath%20d='M162.909091%20665.6m-23.272727%200a23.272727%2023.272727%200%201%200%2046.545454%200%2023.272727%2023.272727%200%201%200-46.545454%200Z'%20fill='%23FFFFFF'%20p-id='13779'%3e%3c/path%3e%3cpath%20d='M251.997091%20660.908218h-30.608291C217.264873%20660.489309%20214.109091%20656.477091%20214.109091%20651.636364s3.165091-8.852945%207.279709-9.271855h30.608291c2.997527-0.3072%205.892655%201.396364%207.4752%204.384582%201.582545%202.997527%201.582545%206.777018%200%209.774545-1.582545%202.997527-4.477673%204.691782-7.4752%204.384582zM282.0096%20698.181818h-61.328291c-3.723636-0.418909-6.572218-4.468364-6.572218-9.309091s2.848582-8.890182%206.572218-9.309091h61.328291c3.723636%200.418909%206.572218%204.468364%206.572218%209.309091s-2.848582%208.890182-6.572218%209.309091z'%20fill='%23FFFFFF'%20p-id='13780'%3e%3c/path%3e%3cpath%20d='M269.963636%20944.872727h1014.690909'%20fill='%2366676D'%20p-id='13781'%3e%3c/path%3e%3cpath%20d='M269.963636%20940.218182h1014.690909v9.309091H269.963636z'%20fill='%23E1EDFF'%20p-id='13782'%3e%3c/path%3e%3cpath%20d='M996.072727%20232.727273m-27.927272%200a27.927273%2027.927273%200%201%200%2055.854545%200%2027.927273%2027.927273%200%201%200-55.854545%200Z'%20fill='%23F4F4F4'%20p-id='13783'%3e%3c/path%3e%3cpath%20d='M1181.305018%20866.117818c-1.508073%203.956364-4.431127%206.656-7.7824%207.177309-0.893673%200-0.633018%201.8432%200%201.759418%203.695709-0.6144%206.925964-3.584%208.610909-7.940654a1.098473%201.098473%200%200%200%200.055855-0.865746c-0.093091-0.279273-0.297891-0.465455-0.539927-0.50269-0.232727-0.027927-0.465455%200.111709-0.605091%200.372363h0.260654z'%20fill='%23FFFFFF'%20p-id='13784'%3e%3c/path%3e%3cpath%20d='M1196.218182%20358.4m-32.581818%200a32.581818%2032.581818%200%201%200%2065.163636%200%2032.581818%2032.581818%200%201%200-65.163636%200Z'%20fill='%23FEDAC2'%20p-id='13785'%3e%3c/path%3e%3cpath%20d='M1027.537455%20679.563636H846.196364a26.437818%2026.437818%200%200%200-26.372655%2026.5216v11.347782c0%2010.426182-8.406109%2018.878836-18.776436%2018.878837H642.234182a18.832291%2018.832291%200%200%201-18.776437-18.822982v-11.403637A26.437818%2026.437818%200%200%200%20597.085091%20679.563636H415.529891c-8.415418%200-15.238982%206.8608-15.238982%2015.332073v239.299491A15.341382%2015.341382%200%200%200%20415.529891%20949.527273h611.849309a15.341382%2015.341382%200%200%200%2015.238982-15.332073V694.895709c0-8.406109-6.730473-15.248291-15.080727-15.332073z%20m7.382109%20254.585019c0%204.105309-3.295418%207.447273-7.382109%207.4752H415.688145a7.456582%207.456582%200%200%201-7.382109-7.4752V694.895709a7.186618%207.186618%200%200%201%202.169019-5.306182%207.316945%207.316945%200%200%201%205.268945-2.178327h181.341091a18.832291%2018.832291%200%200%201%2018.720582%2018.888145v11.347782a26.763636%2026.763636%200%200%200%2026.633309%2026.512291H801.047273a26.763636%2026.763636%200%200%200%2026.633309-26.512291v-11.357091c0-10.398255%208.378182-18.850909%2018.729891-18.878836h181.341091a7.456582%207.456582%200%200%201%207.3728%207.484509l-0.2048%20239.243636z'%20fill='%23D3D3D3'%20p-id='13786'%3e%3c/path%3e%3cpath%20d='M527.145891%20260.654545H934.632727c13.833309%200.977455%2024.417745%2013.163055%2024.203637%2027.368728l-0.046546%201.163636L958.836364%20684.218182h-6.460509l-0.046546-395.226764c0.6144-10.835782-6.944582-20.200727-16.905309-21.466763l-1.005382-0.093091-407.058618-0.009309c-10.333091%200.726109-18.255127%209.755927-18.208582%2020.666181l0.037237%201.098473%200.046545%20395.031273h-6.460509l-0.037236-394.835782c-0.791273-14.522182%209.4208-27.052218%2023.272727-28.625455l1.135709-0.1024z'%20fill='%23CACACC'%20p-id='13787'%3e%3c/path%3e%3cpath%20d='M823.975564%20381.672727H712.024436c-7.7824-0.446836-13.842618-6.572218-13.842618-13.963636s6.060218-13.5168%2013.842618-13.963636h111.951128c7.7824%200.446836%2013.842618%206.572218%2013.842618%2013.963636s-6.060218%2013.5168-13.842618%2013.963636zM878.964364%20381.672727h-17.128728c-8.266473-0.446836-14.708364-6.572218-14.708363-13.963636s6.441891-13.5168%2014.708363-13.963636h17.128728c8.266473%200.446836%2014.708364%206.572218%2014.708363%2013.963636s-6.441891%2013.5168-14.708363%2013.963636z'%20fill='%23F4F4F4'%20p-id='13788'%3e%3c/path%3e%3cpath%20d='M650.724073%20357.338764h-30.72V326.190545A10.333091%2010.333091%200%200%200%20609.745455%20316.509091a10.333091%2010.333091%200%200%200-10.24931%209.681454v31.148219h-30.72c-5.650618%200-10.230691%204.645236-10.23069%2010.370327%200%205.725091%204.580073%2010.370327%2010.221381%2010.370327h30.72v31.157527A10.333091%2010.333091%200%200%200%20609.745455%20418.909091a10.333091%2010.333091%200%200%200%2010.249309-9.681455v-31.148218h30.72c5.650618%200%2010.230691-4.645236%2010.230691-10.370327%200-5.725091-4.580073-10.370327-10.221382-10.370327z'%20fill='%231E73F7'%20p-id='13789'%3e%3c/path%3e%3cpath%20d='M558.545455%20474.763636m20.107636%200l304.221091%200q20.107636%200%2020.107636%2020.107637l0%2024.948363q0%2020.107636-20.107636%2020.107637l-304.221091%200q-20.107636%200-20.107636-20.107637l0-24.948363q0-20.107636%2020.107636-20.107637Z'%20fill='%23E1EDFF'%20p-id='13790'%3e%3c/path%3e%3cpath%20d='M558.545455%20549.236364m20.107636%200l118.039273%200q20.107636%200%2020.107636%2020.107636l0%2024.948364q0%2020.107636-20.107636%2020.107636l-118.039273%200q-20.107636%200-20.107636-20.107636l0-24.948364q0-20.107636%2020.107636-20.107636Z'%20fill='%23E1EDFF'%20p-id='13791'%3e%3c/path%3e%3cpath%20d='M251.345455%20437.527273m-18.618182%200a18.618182%2018.618182%200%201%200%2037.236363%200%2018.618182%2018.618182%200%201%200-37.236363%200Z'%20fill='%23E1EDFF'%20p-id='13792'%3e%3c/path%3e%3cpath%20d='M1079.854545%20539.927273m-9.30909%200a9.309091%209.309091%200%201%200%2018.618181%200%209.309091%209.309091%200%201%200-18.618181%200Z'%20fill='%23E1EDFF'%20p-id='13793'%3e%3c/path%3e%3cpath%20d='M558.545455%20810.942836v53.750691h5.920581V820.503273h0.214109l29.29571%2044.190254h6.060218v-53.750691h-5.911273v43.734109h-0.223418l-29.146764-43.734109zM632.943709%20809.890909c-7.791709%200-13.851927%202.708945-18.3296%208.126836-4.254255%205.12-6.3488%2011.748073-6.3488%2019.87491%200%208.052364%202.094545%2014.680436%206.3488%2019.800436%204.468364%205.343418%2010.537891%208.052364%2018.255127%208.052364%207.726545%200%2013.861236-2.708945%2018.338909-8.052364%204.189091-5.12%206.3488-11.6736%206.3488-19.800436%200-8.201309-2.169018-14.829382-6.358109-19.949382-4.468364-5.417891-10.603055-8.052364-18.245818-8.052364z%20m0%205.492364c5.920582%200%2010.537891%202.038691%2013.861236%206.171927%203.165091%204.068073%204.831418%209.495273%204.831419%2016.337455%200%206.777018-1.657018%2012.120436-4.840728%2016.188509-3.314036%204.058764-8.005818%206.171927-13.9264%206.171927-5.911273%200-10.603055-2.113164-13.9264-6.330182-3.165091-4.058764-4.756945-9.402182-4.756945-16.030254%200-6.702545%201.582545-12.045964%204.756945-16.104728%203.397818-4.291491%208.0896-6.404655%2014.000873-6.404654zM689.803636%20810.942836v53.750691h17.901382c8.080291%200%2014.289455-2.485527%2018.618182-7.382109%204.114618-4.663855%206.209164-11.217455%206.209164-19.493236%200-8.434036-1.954909-14.987636-5.771637-19.493237-4.189091-4.971055-10.323782-7.382109-18.478545-7.382109h-18.469237z%20m5.920582%205.343419h11.617746c6.795636%200%2011.692218%201.805964%2014.866618%205.492363%202.960291%203.472291%204.477673%208.815709%204.477673%2016.039564%200%207.000436-1.657018%2012.343855-4.840728%2015.955782-3.388509%203.695709-8.434036%205.576145-15.145891%205.576145h-10.975418v-43.063854zM755.842327%20810.942836l-20.2752%2053.750691h6.3488l5.483055-15.0528h23.663709l5.492364%2015.0528h6.423272l-20.284509-53.750691h-6.851491z%20m-6.572218%2033.503419l9.886255-26.875346h0.288581l9.746619%2026.875346h-19.921455zM784.197818%20810.942836v5.343419h18.189964v48.407272h5.846109v-48.407272h18.180654v-5.343419zM847.918545%20810.942836l-20.2752%2053.750691h6.3488l5.492364-15.0528h23.663709l5.492364%2015.0528H875.054545l-20.2752-53.750691h-6.8608z%20m-6.562909%2033.503419l9.886255-26.875346h0.279273l9.746618%2026.875346h-19.921455z'%20fill='%23E1EDFF'%20p-id='13794'%3e%3c/path%3e%3cpath%20d='M959.860364%20543.222691l-0.791273%201.954909-4.635927%204.244945%2077.367854%20123.233746c1.973527%203.146473%203.025455%206.814255%203.006837%2010.556509v251.308218a7.354182%207.354182%200%200%201-2.048%205.110691%206.907345%206.907345%200%200%201-4.961746%202.122473H415.371636a7.391418%207.391418%200%200%201-7.2704-7.512437V683.2128c0-3.751564%201.061236-7.419345%203.053382-10.556509L507.345455%20535.272727l-2.532073-10.873018-100.258909%20143.741673c-2.792727%204.440436-4.282182%209.616291-4.263564%2014.903854V922.344727c0%2015.015564%2011.803927%2027.191855%2026.372655%2027.191855h589.321309c14.605964%200%2026.484364-12.129745%2026.624-27.191855V683.045236c0-5.213091-1.4336-10.333091-4.161164-14.736291l-78.587345-125.086254z'%20fill='%23D3D3D3'%20p-id='13795'%3e%3c/path%3e%3c/svg%3e\"","<template>\n <v-card class=\"pa-4 mx-auto text-center pt-10\" color=\"transparent\" elevation=\"0\" style=\"border: none !important;box-shadow: none !important;\">\n <v-img contain width=\"120\" class=\"mx-auto\" :src=\"emptyImg\" alt=\"\" />\n <p class=\"text-grey mt-1\">{{ text || \"暂无数据\" }}</p>\n </v-card>\n</template>\n\n<script setup>\nimport emptyImg from '@/assets/img/empty.svg';\n\n// 定义 props\ndefineProps({\n text: {\n type: String,\n default: null,\n },\r\n items: {\r\n type: Array,\r\n default: null,\r\n },\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped></style>\n","<!-- 悬浮按钮 -->\r\n<template>\r\n <transition name=\"slide-up\">\r\n <v-fab\r\n v-if=\"showFab\"\r\n :class=\"fabClass\"\r\n color=\"primary\"\r\n icon=\"mdi-arrow-up\"\r\n @click=\"scrollToTop\"\r\n ></v-fab>\r\n </transition>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, onBeforeUnmount } from 'vue'\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkFab\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 控制悬浮按钮显示状态\r\nconst showFab = ref(false)\r\n// 自定义类名用于样式调整\r\nconst fabClass = ref('scroll-to-top-fab')\r\n\r\n// 监听滚动事件\r\nconst handleScroll = () => {\r\n showFab.value = window.scrollY > 100\r\n}\r\n\r\n// 滚动到顶部\r\nconst scrollToTop = () => {\r\n window.scrollTo({\r\n top: 0,\r\n behavior: 'smooth'\r\n })\r\n}\r\n\r\n// 组件挂载时添加滚动监听\r\nonMounted(() => {\r\n window.addEventListener('scroll', handleScroll)\r\n})\r\n\r\n// 组件卸载前移除监听\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('scroll', handleScroll)\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.scroll-to-top-fab {\r\n position: fixed;\r\n bottom: 24px;\r\n right: 24px;\r\n z-index: 1004;\r\n}\r\n\r\n/* 滑动动画 */\r\n.slide-up-enter-active {\r\n transition: all 0.2s ease-out;\r\n}\r\n\r\n.slide-up-leave-active {\r\n transition: all 0.2s ease-in;\r\n}\r\n\r\n.slide-up-enter-from {\r\n opacity: 0;\r\n transform: translateY(30px);\r\n}\r\n\r\n.slide-up-leave-to {\r\n opacity: 0;\r\n transform: translateY(30px);\r\n}\r\n</style>","<template>\r\n <div\r\n class=\"box\"\r\n :class=\"{\r\n 'form-item--vertical': top,\r\n 'form-item--horizontal': !top\r\n }\"\r\n style=\"position: relative\"\r\n >\r\n <!-- label 在上方 (top模式) -->\r\n <div\r\n v-if=\"label && top\"\r\n class=\"pb-2 text-left\"\r\n >\r\n <span v-if=\"must\" class=\"text-red mr-1\">*</span>\r\n <span>{{ label }}</span>\r\n </div>\r\n\r\n <!-- label 在左侧 (默认模式) -->\r\n <div\r\n v-if=\"label && !top\"\r\n :class=\"left ? '' : 'vtk-width-2'\"\r\n class=\"d-inline-block text-right\"\r\n :style=\"Tstyle\"\r\n style=\"min-width: 120px !important;vertical-align: top;padding-top: 11px;\"\r\n >\r\n <span v-if=\"must\" class=\"text-red\">*</span>\r\n <span>{{ label }}</span>\r\n </div>\r\n\r\n <!-- 输入框容器 (top模式) -->\r\n <div\r\n v-if=\"top\"\r\n :style=\"contentStyles\"\r\n >\r\n <slot></slot>\r\n </div>\r\n\r\n <!-- 输入框容器 (默认模式) -->\r\n <div\r\n v-if=\"!top\"\r\n class=\"d-inline-block vtk-width-7 \"\r\n style=\"min-width: 350px;\"\r\n >\r\n <slot></slot>\r\n </div>\r\n\r\n <!-- help提示 (仅left模式) -->\r\n <div\r\n v-if=\"left && help && !top\"\r\n class=\"box_help tips py-3 px-4\"\r\n style=\"width: calc(30% - 160px)\"\r\n >\r\n <p class=\"mb-2 font-weight-bold text-body-1\">{{ label }}</p>\r\n <span v-html=\"help\"></span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n name: \"VtkFormItem\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n label: {\r\n type: String,\r\n default: null\r\n },\r\n must: {\r\n type: Boolean,\r\n default: false\r\n },\r\n left: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 标签在上方的垂直布局\r\n top: {\r\n type: Boolean,\r\n default: false\r\n },\r\n Tstyle: {\r\n type: String,\r\n default: null\r\n },\r\n help: {\r\n type: String,\r\n default: null\r\n },\r\n // 控制top模式下内容的最大宽度\r\n maxWidth: {\r\n type: [String, Number],\r\n default: '100%'\r\n }\r\n});\r\n\r\n// 处理maxWidth属性\r\nconst processedMaxWidth = computed(() => {\r\n if (typeof props.maxWidth === 'number') {\r\n return props.maxWidth + 'px';\r\n }\r\n return props.maxWidth;\r\n});\r\n\r\n// 内容样式(仅在top模式下应用maxWidth)\r\nconst contentStyles = computed(() => {\r\n const styles = {};\r\n\r\n // 在top模式下应用maxWidth\r\n if (props.top && props.maxWidth) {\r\n styles.maxWidth = processedMaxWidth.value;\r\n }\r\n\r\n return styles;\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.box:hover > .box_help {\r\n display: inline-block !important;\r\n border-top-right-radius: 24px;\r\n border-bottom-left-radius: 24px;\r\n}\r\n\r\n.box_help {\r\n display: none;\r\n}\r\n\r\n.tips {\r\n position: absolute;\r\n right: 8px;\r\n top: 0;\r\n border: 1px rgba(175, 175, 175, 0.341) solid;\r\n}\r\n\r\n.form-item--vertical {\r\n display: block;\r\n margin-bottom: 1rem;\r\n}\r\n\r\n.form-item--horizontal {\r\n display: block;\r\n margin-bottom: 0.5rem;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"vtk-img-container\">\r\n <VCard \r\n :class=\"['vtk-img-card', { 'vtk-img-card--preview': preview }]\"\r\n @click=\"openPreview\"\r\n >\r\n <!-- 超大图片守卫:先读文件头拿尺寸,再决定是否内嵌解码渲染 -->\r\n <template v-if=\"imgState === 'preview'\">\r\n <v-img\r\n v-bind=\"$attrs\"\r\n :src=\"srcWithToken\"\r\n class=\"vtk-img\"\r\n :aspect-ratio=\"aspectRatio\"\r\n cover\r\n >\r\n <template v-slot:placeholder>\r\n <div class=\"d-flex align-center justify-center fill-height\">\r\n <v-progress-circular indeterminate color=\"grey-lighten-1\"></v-progress-circular>\r\n </div>\r\n </template>\r\n </v-img>\r\n </template>\r\n <template v-else-if=\"imgState === 'oversize'\">\r\n <div class=\"vtk-img-guard\" :style=\"{ aspectRatio }\">\r\n <v-icon class=\"guard-icon\">mdi-image-size-select-large</v-icon>\r\n <span class=\"guard-text\">图片分辨率过大</span>\r\n </div>\r\n </template>\r\n <template v-else-if=\"imgState === 'unknown'\">\r\n <div class=\"vtk-img-guard\" :style=\"{ aspectRatio }\">\r\n <v-icon class=\"guard-icon\">mdi-image-broken-variant</v-icon>\r\n <span class=\"guard-text\">点击打开</span>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <div class=\"vtk-img-guard vtk-img-guard--loading\" :style=\"{ aspectRatio }\">\r\n <v-progress-circular indeterminate color=\"grey-lighten-1\"></v-progress-circular>\r\n </div>\r\n </template>\r\n \r\n <!-- 图片标题和描述 -->\r\n <div class=\"vtk-img-info\" v-if=\"showTitle || showDescription\">\r\n <VCardTitle v-if=\"showTitle\" class=\"vtk-img-title text-subtitle-2 pa-2\">\r\n {{ title }}\r\n </VCardTitle>\r\n <v-card-subtitle v-if=\"showDescription\" class=\"vtk-img-description text-caption pa-2\">\r\n {{ description }}\r\n </v-card-subtitle>\r\n </div>\r\n </VCard>\r\n \r\n <!-- 使用 v-dialog 的图片预览 -->\r\n <VDialog \r\n v-model=\"showPreview\" \r\n max-width=\"90%\" \r\n fullscreen\r\n @click:outside=\"closePreview\"\r\n >\r\n <VCard class=\"image-viewer-card\">\r\n <v-toolbar dark color=\"primary\">\r\n <v-toolbar-title>{{ currentImageTitle }}</v-toolbar-title>\r\n <VSpacer></VSpacer>\r\n <v-toolbar-items>\r\n <VBtn icon dark title=\"新窗口打开\" @click=\"openCurrentImageInNewWindow\">\r\n <VIcon>mdi-open-in-new</VIcon>\r\n </VBtn>\r\n <VBtn icon dark title=\"下载图片\" @click=\"downloadCurrentImage\">\r\n <VIcon>mdi-download</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"zoomImage(-0.3)\">\r\n <VIcon>mdi-magnify-minus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"zoomImage(0.3)\">\r\n <VIcon>mdi-magnify-plus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"rotateImage(-90)\">\r\n <VIcon>mdi-rotate-left</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"rotateImage(90)\">\r\n <VIcon>mdi-rotate-right</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"resetImageTransform\">\r\n <VIcon>mdi-refresh</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </v-toolbar-items>\r\n </v-toolbar>\r\n \r\n <div class=\"image-viewer-content\">\r\n <VBtn \r\n v-if=\"hasPrev\" \r\n icon \r\n class=\"nav-button prev-button\" \r\n @click=\"prevImage\"\r\n >\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n \r\n <div class=\"image-container\" @wheel.prevent=\"handleImageWheel\">\r\n <template v-if=\"viewerImgState === 'preview'\">\r\n <v-img\r\n :src=\"currentImageUrl\"\r\n class=\"viewer-image\"\r\n :class=\"{ 'viewer-image--draggable': imageScale > 1 }\"\r\n :style=\"viewerImageStyle\"\r\n draggable=\"false\"\r\n @pointerdown=\"startImageDrag\"\r\n />\r\n </template>\r\n <template v-else-if=\"viewerImgState === 'oversize'\">\r\n <div class=\"viewer-guard\" @click=\"openViewerOversize\">\r\n <v-icon size=\"48\">mdi-image-size-select-large</v-icon>\r\n <span>图片过大,点击在新窗口打开</span>\r\n </div>\r\n </template>\r\n <template v-else-if=\"viewerImgState === 'unknown'\">\r\n <div class=\"viewer-guard\" @click=\"openViewerOversize\">\r\n <v-icon size=\"48\">mdi-image-broken-variant</v-icon>\r\n <span>图片无法内嵌预览,点击在新窗口打开</span>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <div class=\"viewer-guard viewer-guard--loading\">\r\n <v-progress-circular indeterminate color=\"grey-lighten-2\"></v-progress-circular>\r\n </div>\r\n </template>\r\n </div>\r\n \r\n <VBtn \r\n v-if=\"hasNext\" \r\n icon \r\n class=\"nav-button next-button\" \r\n @click=\"nextImage\"\r\n >\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n </div>\r\n \r\n <div class=\"image-info\">\r\n <p class=\"text-center\">{{ currentImageDescription }}</p>\r\n <p class=\"text-center text--secondary\">{{ currentIndex + 1 }} / {{ imageList.length }}</p>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, getCurrentInstance } from 'vue';\r\n\r\ndefineOptions({\r\n name: 'VtkImg',\r\n inheritAttrs: true\r\n});\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\nconst props = defineProps({\r\n src: {\r\n type: String,\r\n default: null,\r\n },\r\n downloadSrc: {\r\n type: String,\r\n default: '',\r\n },\r\n error: {\r\n type: String,\r\n default: new URL('../../assets/img/wxsq.png', import.meta.url).href,\r\n },\r\n preview: {\r\n type: Boolean,\r\n default: true\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n description: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图片列表,用于导航功能\r\n imageList: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 当前图片索引\r\n index: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 是否显示标题\r\n showTitle: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示描述\r\n showDescription: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 图片宽高比\r\n aspectRatio: {\r\n type: [String, Number],\r\n default: 16/9\r\n },\r\n // 超大图片像素阈值:超过则不内嵌解码渲染\r\n maxPixels: {\r\n type: Number,\r\n default: 50_000_000\r\n },\r\n // 是否开启超大图片尺寸守卫(关闭时退回原行为)\r\n sizeGuard: {\r\n type: Boolean,\r\n default: true\r\n }\r\n});\r\n\r\n// 预览状态\r\nconst showPreview = ref(false);\r\n// 图片旋转角度\r\nconst imageRotation = ref(0);\r\n// 图片缩放和拖动位置\r\nconst imageScale = ref(1);\r\nconst imageTranslateX = ref(0);\r\nconst imageTranslateY = ref(0);\r\nconst imageDragState = ref(null);\r\n// 当前图片索引(预览模式下使用)\r\nconst currentIndex = ref(0);\r\n\r\n// 取本地 token:$vtk.storage 优先,回退 localStorage\r\nconst getLocalToken = () => {\r\n try {\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n return window.$vtk.storage.get('_mis_acis_token') || '';\r\n }\r\n return localStorage.getItem('_mis_acis_token') || '';\r\n } catch (error) {\r\n console.warn('VtkImg: Failed to get token', error);\r\n return '';\r\n }\r\n};\r\n\r\n// 追加 stoken:\r\n// - 已带 stoken(通常是服务端签发的)不再追加,避免污染签名\r\n// - 已有其它查询参数时用 & 拼接,避免拼出 \"...?a=1?stoken=x\" 这种非法 URL\r\nconst withToken = (url) => {\r\n if (!url) return url;\r\n if (/[?&]stoken=/.test(url)) return url;\r\n const token = getLocalToken();\r\n if (!token) return url;\r\n return `${url}${url.includes('?') ? '&' : '?'}stoken=${token}`;\r\n};\r\n\r\n// 使用计算属性处理带token的URL\r\nconst srcWithToken = computed(() => withToken(props.src));\r\n\r\n// 当前预览图片的URL\r\nconst currentImageUrl = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n // 支持 imageList 项为字符串(直接是URL)或对象(含 url 属性)\r\n const url = typeof currentImage === 'string' ? currentImage : currentImage?.url;\r\n if (url) return withToken(url);\r\n }\r\n return srcWithToken.value;\r\n});\r\n\r\n// ===== 超大图片尺寸守卫:读文件头拿宽高,超过阈值不内嵌解码 =====\r\nconst imageMeta = ref({}); // 主图尺寸 { w, h }\r\nconst headerState = ref('loading'); // 主图头部读取状态:loading | done | error\r\n\r\nconst imgState = computed(() => {\r\n if (!props.sizeGuard) return 'preview';\r\n if (headerState.value === 'loading') return 'loading';\r\n // 只有「明确读到尺寸且超过阈值」才拦截;读不出尺寸(解析失败 / 格式不支持 /\r\n // 网络失败 / SVG 等矢量图)一律正常展示——探测只决定要不要拦截,不该有否决权。\r\n const { w, h } = imageMeta.value;\r\n if (w && h && w * h > props.maxPixels) return 'oversize';\r\n return 'preview';\r\n});\r\n\r\nconst viewerMeta = ref({}); // 预览弹窗当前图尺寸 { w, h }\r\nconst viewerHeaderState = ref('loading');\r\nconst headerMetaCache = ref({}); // imageList 各 URL -> { w, h } 缓存,避免重复请求\r\n\r\nconst viewerImgState = computed(() => {\r\n if (!props.sizeGuard) return 'preview';\r\n if (viewerHeaderState.value === 'loading') return 'loading';\r\n // 与 imgState 同策略:读不出尺寸就正常展示,只有明确超阈值才拦截\r\n const { w, h } = viewerMeta.value;\r\n if (w && h && w * h > props.maxPixels) return 'oversize';\r\n return 'preview';\r\n});\r\n\r\nconst readUInt16BE = (bytes, offset) => (bytes[offset] << 8) | bytes[offset + 1];\r\nconst readUInt16LE = (bytes, offset) => bytes[offset] | (bytes[offset + 1] << 8);\r\nconst readUInt32BE = (bytes, offset) => (\r\n ((bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3]) >>> 0\r\n);\r\n\r\n// SVG 是文本矢量格式,不产生\"解压炸弹\",识别出直接放行(不参与像素守卫)。\r\n// 要求以 '<' 开头(跳过 BOM/空白),避免二进制图里恰好含 \"<svg\" 造成假阳性绕过守卫。\r\nconst isSvgBytes = (bytes) => {\r\n try {\r\n const head = new TextDecoder('utf-8', { fatal: false })\r\n .decode(bytes.subarray(0, 1024))\r\n .replace(/^/, '')\r\n .trimStart()\r\n .toLowerCase();\r\n return head.startsWith('<') && head.includes('<svg');\r\n } catch (error) {\r\n return false;\r\n }\r\n};\r\n\r\n// 按字节解析图片文件头的宽高(PNG / JPEG / GIF / WEBP / SVG)\r\nconst parseImageDimensions = (bytes) => {\r\n const length = bytes.length;\r\n\r\n if (isSvgBytes(bytes)) return { w: 0, h: 0, vector: true };\r\n\r\n if (length < 24) return { w: 0, h: 0 };\r\n\r\n // PNG:魔数 89 50 4E 47,IHDR 后宽 16 / 高 20(大端 uint32)\r\n if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {\r\n return { w: readUInt32BE(bytes, 16), h: readUInt32BE(bytes, 20) };\r\n }\r\n\r\n // GIF:魔数 GIF8,宽 6-7 / 高 8-9(小端 uint16)\r\n if (bytes[0] === 0x47 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x38) {\r\n return { w: readUInt16LE(bytes, 6), h: readUInt16LE(bytes, 8) };\r\n }\r\n\r\n // JPEG:扫 SOF 段(0xC0–0xCF,排除 C4/C8/CC),以 marker 为基准:高在 +4、宽在 +6(大端 uint16)\r\n if (bytes[0] === 0xff && bytes[1] === 0xd8) {\r\n const sofMarkers = new Set([\r\n 0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf,\r\n ]);\r\n let offset = 2;\r\n while (offset + 9 < length) {\r\n if (bytes[offset] !== 0xff) { offset += 1; continue; }\r\n let p = offset;\r\n while (p < length && bytes[p] === 0xff) p += 1; // 跳过填充 0xFF,p 落在 marker 上\r\n if (p >= length - 1) break;\r\n const marker = bytes[p];\r\n if (marker === 0x00 || marker === 0xd8 || marker === 0xd9) { offset = p + 1; continue; }\r\n if (sofMarkers.has(marker)) {\r\n // 段结构 [FF][marker][len:2][precision:1][height:2][width:2],一律以 marker 为基准\r\n return { w: readUInt16BE(bytes, p + 6), h: readUInt16BE(bytes, p + 4) };\r\n }\r\n if (p + 2 >= length) break;\r\n // 段长字段在 marker 之后的 p+1 / p+2\r\n const segLength = readUInt16BE(bytes, p + 1);\r\n if (segLength < 2) break;\r\n offset = p + 1 + segLength;\r\n }\r\n }\r\n\r\n // WEBP:RIFF....WEBP\r\n if (\r\n length >= 30\r\n && bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46\r\n && bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50\r\n ) {\r\n const fourcc = String.fromCharCode(bytes[12], bytes[13], bytes[14], bytes[15]);\r\n if (fourcc === 'VP8X') {\r\n return {\r\n w: 1 + (bytes[24] | (bytes[25] << 8) | (bytes[26] << 16)),\r\n h: 1 + (bytes[27] | (bytes[28] << 8) | (bytes[29] << 16)),\r\n };\r\n }\r\n if (fourcc === 'VP8 ') {\r\n return {\r\n w: bytes[26] | ((bytes[27] & 0x3f) << 8),\r\n h: bytes[28] | ((bytes[29] & 0x3f) << 8),\r\n };\r\n }\r\n if (fourcc === 'VP8L' && length >= 25) {\r\n // VP8L:width-1 占低 14 位,height-1 占次 14 位(小端 32 位)\r\n const bits = (bytes[21] | (bytes[22] << 8) | (bytes[23] << 16) | ((bytes[24] << 24) >>> 0)) >>> 0;\r\n return { w: 1 + (bits & 0x3fff), h: 1 + ((bits >> 14) & 0x3fff) };\r\n }\r\n }\r\n\r\n return { w: 0, h: 0 };\r\n};\r\n\r\n// 头部读取上限:64KB,覆盖带大 EXIF 缩略图的 JPEG(SOF 段可能远离文件头)\r\nconst HEADER_BYTES = 64 * 1024;\r\n\r\n// 只取前 N 字节:即使服务端忽略 Range 返回整张图,也不会把整图读进内存\r\nconst readFirstBytes = async (response, maxBytes) => {\r\n const reader = response.body?.getReader?.();\r\n if (!reader) {\r\n const buffer = await response.arrayBuffer();\r\n return new Uint8Array(buffer, 0, Math.min(buffer.byteLength, maxBytes));\r\n }\r\n\r\n const chunks = [];\r\n let total = 0;\r\n while (total < maxBytes) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n chunks.push(value);\r\n total += value.length;\r\n }\r\n // 读够了就取消剩余下载\r\n try { await reader.cancel(); } catch (error) { /* 忽略取消失败 */ }\r\n\r\n const out = new Uint8Array(Math.min(total, maxBytes));\r\n let offset = 0;\r\n for (const chunk of chunks) {\r\n if (offset >= out.length) break;\r\n const take = Math.min(chunk.length, out.length - offset);\r\n out.set(chunk.subarray(0, take), offset);\r\n offset += take;\r\n }\r\n return out;\r\n};\r\n\r\n// 只拉头部,每次尝试 5 秒超时;拿不到尺寸返回 null(绝不回退全量解码)\r\n// 先带 Range 只取头部;个别服务端/网关对 Range 请求处理异常导致 fetch 直接失败,\r\n// 此时退回普通 GET —— readFirstBytes 仍把读取量限制在 64KB,不会把整图读进内存。\r\nconst fetchImageMeta = async (url) => {\r\n if (!url) return null;\r\n\r\n const attempts = [\r\n { mode: 'cors', headers: { Range: `bytes=0-${HEADER_BYTES - 1}` } },\r\n { mode: 'cors' },\r\n ];\r\n\r\n let lastError = null;\r\n for (const options of attempts) {\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), 5000);\r\n try {\r\n const response = await fetch(url, { ...options, signal: controller.signal });\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\r\n const bytes = await readFirstBytes(response, HEADER_BYTES);\r\n const { w, h, vector } = parseImageDimensions(bytes);\r\n if (vector) return { w: 0, h: 0, vector: true };\r\n if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) return null;\r\n return { w, h };\r\n } catch (error) {\r\n lastError = error;\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n throw lastError || new Error('Failed to read image header');\r\n};\r\n\r\n// 取图片头部尺寸(唯一入口):命中缓存直接返回;同一 URL 的并发请求合并为一次。\r\n// 主图和弹窗可能同时需要同一个 URL,没有这层去重会发两次请求。\r\nconst inflightMeta = new Map();\r\nconst getImageMeta = (url) => {\r\n if (!url) return Promise.resolve(null);\r\n\r\n const cached = headerMetaCache.value[url];\r\n if (cached) return Promise.resolve(cached);\r\n\r\n if (!inflightMeta.has(url)) {\r\n const task = fetchImageMeta(url)\r\n .then((meta) => {\r\n if (meta) headerMetaCache.value[url] = meta;\r\n return meta;\r\n })\r\n .finally(() => inflightMeta.delete(url));\r\n inflightMeta.set(url, task);\r\n }\r\n\r\n return inflightMeta.get(url);\r\n};\r\n\r\n// 主图源变化时读头部\r\nwatch(srcWithToken, async (url) => {\r\n imageMeta.value = {};\r\n headerState.value = 'loading';\r\n if (!props.sizeGuard || !url) { headerState.value = 'done'; return; }\r\n try {\r\n const meta = await getImageMeta(url);\r\n if (srcWithToken.value !== url) return; // 已被更新的图取代,丢弃过期结果\r\n imageMeta.value = meta || {};\r\n headerState.value = 'done';\r\n } catch (error) {\r\n if (srcWithToken.value !== url) return;\r\n headerState.value = 'error';\r\n console.warn('VtkImg: 图片尺寸读取失败,按未知处理', error);\r\n }\r\n}, { immediate: true });\r\n\r\n// 弹窗当前图读头部(覆盖 imageList 照片墙模式)。\r\n// 只在弹窗打开时才取:弹窗未打开时这笔请求没有意义(弹窗内切换才需要)。\r\nwatch([currentImageUrl, showPreview], async ([url, open]) => {\r\n if (!props.sizeGuard || !url || !open) {\r\n viewerHeaderState.value = 'done';\r\n viewerMeta.value = {};\r\n return;\r\n }\r\n viewerMeta.value = {};\r\n viewerHeaderState.value = 'loading';\r\n try {\r\n const meta = await getImageMeta(url);\r\n // 已切走或弹窗已关闭:丢弃过期结果,否则会把超大图误判成可渲染\r\n if (currentImageUrl.value !== url || !showPreview.value) return;\r\n viewerMeta.value = meta || {};\r\n viewerHeaderState.value = 'done';\r\n } catch (error) {\r\n if (currentImageUrl.value !== url || !showPreview.value) return;\r\n viewerHeaderState.value = 'error';\r\n console.warn('VtkImg: 预览图片尺寸读取失败,按未知处理', error);\r\n }\r\n}, { immediate: true });\r\n\r\n// 超大/未知图点击:直接新窗口打开原图,绝不进 v-dialog(内部 v-img 同样会全量解码)\r\nconst openViewerOversize = () => {\r\n if (currentImageUrl.value) window.open(currentImageUrl.value, '_blank', 'noopener');\r\n};\r\n\r\nconst currentImageRawUrl = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n const url = typeof currentImage === 'string' ? currentImage : currentImage?.url;\r\n return url || props.src;\r\n }\r\n\r\n return props.src;\r\n});\r\n\r\nconst currentImageDownloadUrl = computed(() => {\r\n if (props.downloadSrc) return props.downloadSrc;\r\n\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n if (currentImage && typeof currentImage === 'object') {\r\n return currentImage.downloadUrl || currentImage.downloadSrc || currentImage.url || props.src;\r\n }\r\n }\r\n\r\n return currentImageRawUrl.value;\r\n});\r\n\r\n// 当前图片标题\r\nconst currentImageTitle = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n return currentImage?.title || '';\r\n }\r\n return props.title;\r\n});\r\n\r\n// 当前图片描述\r\nconst currentImageDescription = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n return currentImage?.description || '';\r\n }\r\n return props.description;\r\n});\r\n\r\n// 是否有上一张图片\r\nconst hasPrev = computed(() => {\r\n return props.imageList.length > 1 && currentIndex.value > 0;\r\n});\r\n\r\n// 是否有下一张图片\r\nconst hasNext = computed(() => {\r\n return props.imageList.length > 1 && currentIndex.value < props.imageList.length - 1;\r\n});\r\n\r\nconst viewerImageStyle = computed(() => ({\r\n transform: `translate(${imageTranslateX.value}px, ${imageTranslateY.value}px) scale(${imageScale.value}) rotate(${imageRotation.value}deg)`,\r\n}));\r\n\r\nconst openCurrentImageInNewWindow = () => {\r\n if (!currentImageRawUrl.value) return;\r\n\r\n window.open(currentImageRawUrl.value, '_blank', 'noopener');\r\n};\r\n\r\nconst imageMimeExtensionMap = {\r\n 'image/bmp': 'bmp',\r\n 'image/gif': 'gif',\r\n 'image/jpeg': 'jpg',\r\n 'image/png': 'png',\r\n 'image/svg+xml': 'svg',\r\n 'image/webp': 'webp',\r\n};\r\n\r\nconst imageExtensionMimeMap = {\r\n bmp: 'image/bmp',\r\n gif: 'image/gif',\r\n jpeg: 'image/jpeg',\r\n jpg: 'image/jpeg',\r\n png: 'image/png',\r\n svg: 'image/svg+xml',\r\n webp: 'image/webp',\r\n};\r\n\r\nconst getImageFileExtension = (blob) => {\r\n const mimeType = blob?.type?.split(';')[0]?.toLowerCase();\r\n\r\n if (mimeType && imageMimeExtensionMap[mimeType]) {\r\n return imageMimeExtensionMap[mimeType];\r\n }\r\n\r\n try {\r\n const { pathname } = new URL(currentImageRawUrl.value, window.location.href);\r\n const matched = pathname.match(/\\.([a-z0-9]+)$/i);\r\n return matched?.[1]?.toLowerCase() || 'png';\r\n } catch (error) {\r\n return 'png';\r\n }\r\n};\r\n\r\nconst getCurrentImageFileName = (blob) => {\r\n const extension = getImageFileExtension(blob);\r\n const titleName = currentImageTitle.value?.trim();\r\n\r\n if (titleName) {\r\n const safeTitle = titleName.replace(/[\\\\/:*?\"<>|]/g, '_').replace(/\\.[a-z0-9]+$/i, '');\r\n return `${safeTitle}.${extension}`;\r\n }\r\n\r\n try {\r\n const { pathname } = new URL(currentImageRawUrl.value, window.location.href);\r\n const urlName = decodeURIComponent(pathname.split('/').pop() || '')\r\n .replace(/[\\\\/:*?\"<>|]/g, '_')\r\n .replace(/\\.[a-z0-9]+$/i, '');\r\n return urlName ? `${urlName}.${extension}` : `image.${extension}`;\r\n } catch (error) {\r\n return `image.${extension}`;\r\n }\r\n};\r\n\r\nconst isDownloadRiskWebView = () => {\r\n const ua = window.navigator?.userAgent || '';\r\n const hasEmbeddedBridge = typeof window.dd !== 'undefined' || typeof window.AlipayJSBridge !== 'undefined';\r\n return hasEmbeddedBridge\r\n || /DingTalk|AliApp\\(DingTalk|zjzwfw|zzd|ZJGovernment|ZhejiangGovernment|GovDing|Electron|WebView|; wv\\)/i.test(ua);\r\n};\r\n\r\nconst getDownloadFailureReason = (error) => {\r\n const message = error?.message || '';\r\n const name = error?.name || '';\r\n\r\n if (name === 'AbortError') return '已取消下载';\r\n if (name === 'NotAllowedError' || name === 'SecurityError') return '当前客户端阻止了文件保存';\r\n if (name === 'QuotaExceededError') return '存储空间不足或客户端限制写入';\r\n if (/Failed to fetch|NetworkError|Load failed/i.test(message)) {\r\n return '图片地址不允许跨域读取,或当前网络无法访问图片';\r\n }\r\n if (/HTTP error! status:\\s*(\\d+)/i.test(message)) {\r\n return `图片请求失败,状态码 ${message.match(/HTTP error! status:\\s*(\\d+)/i)?.[1]}`;\r\n }\r\n if (/Response is not an image/i.test(message)) return '下载地址返回的不是图片文件';\r\n if (/Downloaded image is empty/i.test(message)) return '下载到的图片文件为空';\r\n if (/Downloaded file is not an image/i.test(message)) return '下载到的文件不是图片格式';\r\n if (/Downloaded image cannot be decoded/i.test(message)) return '下载到的图片无法被浏览器解析';\r\n\r\n return message || '未知错误';\r\n};\r\n\r\nconst validateImageBlob = async (blob) => {\r\n if (!blob || blob.size <= 0) {\r\n throw new Error('Downloaded image is empty');\r\n }\r\n\r\n const extension = getImageFileExtension(blob);\r\n const mimeType = blob.type?.split(';')[0]?.trim().toLowerCase();\r\n if (mimeType && !mimeType.startsWith('image/')) {\r\n throw new Error(`Downloaded file is not an image: ${mimeType}`);\r\n }\r\n\r\n if (typeof window.createImageBitmap === 'function' && mimeType !== 'image/svg+xml') {\r\n try {\r\n const bitmap = await window.createImageBitmap(blob);\r\n bitmap.close?.();\r\n return;\r\n } catch (error) {\r\n console.warn('VtkImg: createImageBitmap validation failed, fallback to Image validation', error);\r\n }\r\n }\r\n\r\n if (extension === 'svg') return;\r\n\r\n await new Promise((resolve, reject) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const image = new Image();\r\n\r\n image.onload = () => {\r\n window.URL.revokeObjectURL(url);\r\n resolve();\r\n };\r\n image.onerror = () => {\r\n window.URL.revokeObjectURL(url);\r\n reject(new Error('Downloaded image cannot be decoded'));\r\n };\r\n image.src = url;\r\n });\r\n};\r\n\r\nconst triggerBrowserDownload = (blob, fileName) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n setTimeout(() => window.URL.revokeObjectURL(url), 60 * 1000);\r\n};\r\n\r\nconst triggerBrowserUrlDownload = (url, fileName) => {\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.target = '_blank';\r\n link.rel = 'noopener';\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n};\r\n\r\nconst showDownloadToast = (message, color = 'info') => {\r\n try {\r\n const toast = proxy?.$vtk?.message?.toast || window.$vtk?.message?.toast;\r\n if (typeof toast === 'function') {\r\n toast(message, { color });\r\n return;\r\n }\r\n } catch (error) {\r\n console.warn('VtkImg: failed to show message toast', error);\r\n }\r\n\r\n if (color === 'error' || color === 'warning') {\r\n window.alert?.(message);\r\n }\r\n};\r\n\r\nconst getDownloadFileHandle = async (fileName, blob) => {\r\n if (isDownloadRiskWebView()) {\r\n return null;\r\n }\r\n\r\n if (typeof window.showSaveFilePicker !== 'function') {\r\n showDownloadToast('当前浏览器不支持选择保存目录,将使用默认下载方式。', 'warning');\r\n return null;\r\n }\r\n\r\n const extension = getImageFileExtension(blob);\r\n const mimeType = imageExtensionMimeMap[extension] || blob?.type || 'image/png';\r\n\r\n try {\r\n return await window.showSaveFilePicker({\r\n suggestedName: fileName,\r\n types: [\r\n {\r\n description: '图片文件',\r\n accept: {\r\n [mimeType]: [`.${extension}`],\r\n },\r\n },\r\n ],\r\n });\r\n } catch (error) {\r\n if (error?.name === 'AbortError') {\r\n showDownloadToast('已取消下载。');\r\n return false;\r\n }\r\n\r\n console.warn('VtkImg: showSaveFilePicker unavailable, fallback to browser download', error);\r\n return null;\r\n }\r\n};\r\n\r\nconst isImageResponse = (response, blob, url) => {\r\n const contentType = response.headers.get('content-type')?.split(';')[0]?.trim().toLowerCase();\r\n\r\n if (contentType?.startsWith('image/')) return true;\r\n if (blob.type?.startsWith('image/')) return true;\r\n\r\n const canFallbackToExtension = !contentType\r\n || contentType === 'application/octet-stream'\r\n || contentType === 'binary/octet-stream';\r\n if (!canFallbackToExtension) return false;\r\n\r\n try {\r\n const { pathname } = new URL(url, window.location.href);\r\n const extension = pathname.match(/\\.([a-z0-9]+)$/i)?.[1]?.toLowerCase();\r\n return Boolean(extension && imageExtensionMimeMap[extension]);\r\n } catch (error) {\r\n return false;\r\n }\r\n};\r\n\r\nconst fetchImageBlob = async (url) => {\r\n const response = await fetch(url, { mode: 'cors' });\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n if (!isImageResponse(response, blob, url)) {\r\n const contentType = response.headers.get('content-type') || blob.type || 'unknown';\r\n throw new Error(`Response is not an image: ${contentType}`);\r\n }\r\n\r\n return blob;\r\n};\r\n\r\nconst fetchCurrentImageBlob = async () => {\r\n if (!currentImageDownloadUrl.value) {\r\n throw new Error('Image download url is empty');\r\n }\r\n\r\n return fetchImageBlob(currentImageDownloadUrl.value);\r\n};\r\n\r\nconst downloadCurrentImage = async () => {\r\n const downloadUrl = currentImageDownloadUrl.value;\r\n\r\n if (!downloadUrl) {\r\n showDownloadToast('暂无可下载的图片地址。', 'warning');\r\n return;\r\n }\r\n\r\n try {\r\n const blob = await fetchCurrentImageBlob();\r\n await validateImageBlob(blob);\r\n const fileName = getCurrentImageFileName(blob);\r\n const fileHandle = await getDownloadFileHandle(fileName, blob);\r\n if (fileHandle === false) return;\r\n\r\n if (fileHandle) {\r\n const writable = await fileHandle.createWritable();\r\n await writable.write(blob);\r\n await writable.close();\r\n showDownloadToast('图片下载成功。', 'success');\r\n return;\r\n }\r\n\r\n triggerBrowserDownload(blob, fileName);\r\n if (isDownloadRiskWebView()) {\r\n showDownloadToast('已使用兼容方式下载图片,如文件仍不可用,请在系统浏览器中打开后保存。');\r\n return;\r\n }\r\n\r\n showDownloadToast('图片已开始下载。', 'success');\r\n } catch (error) {\r\n const failureReason = getDownloadFailureReason(error);\r\n console.error(`下载图片失败:${failureReason}`, error);\r\n triggerBrowserUrlDownload(downloadUrl, getCurrentImageFileName());\r\n if (isDownloadRiskWebView()) {\r\n showDownloadToast(`下载失败:${failureReason}。已打开原图,请在系统浏览器中保存。`, 'warning');\r\n return;\r\n }\r\n\r\n showDownloadToast(`下载失败:${failureReason}。已切换为浏览器下载。`, 'warning');\r\n }\r\n};\r\n\r\nconst resetImageTransform = () => {\r\n imageRotation.value = 0;\r\n imageScale.value = 1;\r\n imageTranslateX.value = 0;\r\n imageTranslateY.value = 0;\r\n imageDragState.value = null;\r\n};\r\n\r\n// 监听预览状态变化\r\nwatch(showPreview, (newVal) => {\r\n if (newVal) {\r\n // 打开预览时重置旋转角度和当前索引\r\n resetImageTransform();\r\n currentIndex.value = props.index;\r\n }\r\n});\r\n\r\n// 打开预览\r\nconst openPreview = () => {\r\n if (!props.preview) return;\r\n // 超大/未知尺寸图:不进入 v-dialog(内部 v-img 全量解码会卡死),直接新窗口打开原图\r\n if (props.sizeGuard && (imgState.value === 'oversize' || imgState.value === 'unknown')) {\r\n if (srcWithToken.value) window.open(srcWithToken.value, '_blank', 'noopener');\r\n return;\r\n }\r\n showPreview.value = true;\r\n};\r\n\r\n// 关闭预览\r\nconst closePreview = () => {\r\n showPreview.value = false;\r\n};\r\n\r\n// 上一张图片\r\nconst prevImage = () => {\r\n if (hasPrev.value) {\r\n currentIndex.value--;\r\n resetImageTransform();\r\n }\r\n};\r\n\r\n// 下一张图片\r\nconst nextImage = () => {\r\n if (hasNext.value) {\r\n currentIndex.value++;\r\n resetImageTransform();\r\n }\r\n};\r\n\r\n// 旋转图片\r\nconst rotateImage = (degrees) => {\r\n imageRotation.value += degrees;\r\n};\r\n\r\nconst zoomImage = (step) => {\r\n const nextScale = Number((imageScale.value + step).toFixed(2));\r\n imageScale.value = Math.min(3, Math.max(0.2, nextScale));\r\n if (imageScale.value <= 1) {\r\n imageTranslateX.value = 0;\r\n imageTranslateY.value = 0;\r\n }\r\n};\r\n\r\nconst handleImageWheel = (event) => {\r\n zoomImage(event.deltaY < 0 ? 0.2 : -0.2);\r\n};\r\n\r\nconst startImageDrag = (event) => {\r\n if (imageScale.value <= 1) return;\r\n event.preventDefault();\r\n const target = event.currentTarget;\r\n imageDragState.value = {\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startY: event.clientY,\r\n translateX: imageTranslateX.value,\r\n translateY: imageTranslateY.value,\r\n };\r\n target.setPointerCapture?.(event.pointerId);\r\n target.addEventListener('pointermove', moveImageDrag);\r\n target.addEventListener('pointerup', endImageDrag, { once: true });\r\n target.addEventListener('pointercancel', endImageDrag, { once: true });\r\n};\r\n\r\nconst moveImageDrag = (event) => {\r\n const state = imageDragState.value;\r\n if (!state || state.pointerId !== event.pointerId) return;\r\n imageTranslateX.value = state.translateX + event.clientX - state.startX;\r\n imageTranslateY.value = state.translateY + event.clientY - state.startY;\r\n};\r\n\r\nconst endImageDrag = (event) => {\r\n event.currentTarget?.releasePointerCapture?.(event.pointerId);\r\n event.currentTarget?.removeEventListener('pointermove', moveImageDrag);\r\n imageDragState.value = null;\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-img-container {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.vtk-img-card {\r\n height: 100%;\r\n}\r\n\r\n.vtk-img-card--preview {\r\n cursor: pointer;\r\n transition: transform 0.2s ease-in-out;\r\n}\r\n\r\n.vtk-img-card--preview:hover {\r\n transform: translateY(-5px);\r\n}\r\n\r\n.vtk-img {\r\n width: 100%;\r\n}\r\n\r\n/* 超大图片守卫占位 */\r\n.vtk-img-guard {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 8px;\r\n min-height: 160px;\r\n background: rgb(var(--v-theme-on-surface), 0.05);\r\n border-radius: 4px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n cursor: pointer;\r\n}\r\n\r\n.vtk-img-guard--loading {\r\n cursor: default;\r\n}\r\n\r\n.vtk-img-guard .guard-icon {\r\n font-size: 40px;\r\n}\r\n\r\n.vtk-img-guard .guard-text {\r\n font-size: 13px;\r\n}\r\n\r\n.vtk-img-info {\r\n padding: 0;\r\n}\r\n\r\n.vtk-img-title {\r\n word-break: break-word;\r\n}\r\n\r\n.vtk-img-description {\r\n word-break: break-word;\r\n}\r\n\r\n/* 图片查看器样式 */\r\n.image-viewer-card {\r\n background-color: rgba(0, 0, 0, 0.3);\r\n color: white;\r\n}\r\n\r\n.image-viewer-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: calc(100vh - 150px);\r\n position: relative;\r\n}\r\n\r\n.image-container {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n}\r\n\r\n.viewer-image {\r\n max-width: 90%;\r\n max-height: 80vh;\r\n transform-origin: center center;\r\n transition: transform 0.3s ease;\r\n user-select: none;\r\n touch-action: none;\r\n}\r\n\r\n.viewer-image--draggable {\r\n cursor: grab;\r\n}\r\n\r\n.viewer-guard {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 12px;\r\n padding: 24px;\r\n color: rgba(255, 255, 255, 0.85);\r\n font-size: 15px;\r\n text-align: center;\r\n cursor: pointer;\r\n}\r\n\r\n.viewer-guard--loading {\r\n cursor: default;\r\n}\r\n\r\n.viewer-image--draggable:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.nav-button {\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n z-index: 10;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n color: white;\r\n width: 50px;\r\n height: 50px;\r\n}\r\n\r\n.prev-button {\r\n left: 20px;\r\n}\r\n\r\n.next-button {\r\n right: 20px;\r\n}\r\n\r\n.image-info {\r\n padding: 20px;\r\n background-color: rgba(0, 0, 0, 0.7);\r\n}\r\n\r\n.image-info p {\r\n margin: 5px 0;\r\n}\r\n\r\n:deep(.v-img__img) {\r\n background: v-bind('props.error') no-repeat center;\r\n background-size: cover;\r\n}\r\n\r\n:deep(.v-img__placeholder) {\r\n filter: blur(0px);\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"m_pagination\">\r\n <VRow v-if=\"pageDatas.rowCount > 0\" class=\"pagination box\" align=\"center\">\r\n <span class=\"page-total d-none d-md-flex align-center\">共{{ pageDatas.rowCount }}条</span>\r\n <VSelect\r\n v-model=\"pagination.limit\"\r\n :items=\"pageSizeObjs\"\r\n variant=\"outlined\"\r\n density=\"compact\"\r\n :menu-props=\"{ offsetY: true }\"\r\n hide-details\r\n class=\"page-select ml-2 d-none d-md-flex\"\r\n @update:model-value=\"pageSizeChange()\"\r\n />\r\n <span class=\"my-2\">\r\n <v-pagination\r\n v-model=\"pageDatas.pageno\"\r\n :total-visible=\"5\"\r\n :length=\"pageDatas.pageCount\"\r\n size=\"small\"\r\n @update:model-value=\"pageChange()\"\r\n />\r\n </span>\r\n <span class=\"page-total ml-1 d-none d-md-flex align-center\">到</span>\r\n <VTextField\r\n v-model=\"pagination.pageno\"\r\n variant=\"outlined\"\r\n density=\"compact\"\r\n hide-details\r\n class=\"page-go ml-2 d-none d-md-flex\"\r\n @keyup.enter=\"toPage()\"\r\n />\r\n <span class=\"page-total ml-2 d-none d-md-flex align-center\">页</span>\r\n </VRow>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, reactive, computed, watch, onMounted } from 'vue';\r\n\r\nconst props = defineProps({\r\n pageData: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n pageSizes: {\r\n type: Array,\r\n default: () => [10, 20, 30]\r\n }\r\n});\r\n\r\nconst emit = defineEmits(['pageChange']);\r\n\r\nconst pagination = reactive({\r\n pageno: 1,\r\n limit: 10\r\n});\r\n\r\nconst pageSizeObjs = ref([]);\r\nconst pageDatas = ref({ ...props.pageData });\r\n\r\nconst paginationChange = computed(() => pageDatas.value.pageno);\r\n\r\nwatch(paginationChange, () => {\r\n pagination.pageno = pageDatas.value.pageno;\r\n});\r\n\r\nwatch(() => props.pageData, (newVal) => {\r\n pageDatas.value = { ...newVal };\r\n if (newVal.rowCount < 1 && newVal.rows > 0) {\r\n pageDatas.value.pageno = newVal.pageno - 1;\r\n pageChange();\r\n }\r\n}, { deep: true });\r\n\r\nonMounted(() => {\r\n pageSizeFormat();\r\n});\r\n\r\nconst toPage = () => {\r\n const re = /^[0-9]+$/;\r\n if (re.test(pagination.pageno) && pagination.pageno <= pageDatas.value.pageCount) {\r\n pageDatas.value.pageno = parseInt(pagination.pageno);\r\n pageChange();\r\n } else {\r\n pagination.pageno = pageDatas.value.pageno;\r\n }\r\n};\r\n\r\nconst pageSizeChange = () => {\r\n pageDatas.value.pageCount = 1;\r\n pageChange();\r\n};\r\n\r\nconst pageSizeFormat = () => {\r\n const temp = props.pageSizes;\r\n temp.forEach((value) => {\r\n const obj = {\r\n title: value + \"条/页\",\r\n value: value\r\n };\r\n pageSizeObjs.value.push(obj);\r\n });\r\n pagination.limit = temp[0];\r\n};\r\n\r\nconst pageChange = () => {\r\n const page = {\r\n pageno: pageDatas.value.pageno,\r\n limit: pagination.limit\r\n };\r\n emit('pageChange', page);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.mt-1 {\r\n margin-top: 11px !important;\r\n}\r\n.my-5 {\r\n margin-top: 20px !important;\r\n margin-bottom: 20px !important;\r\n}\r\n.m_pagination {\r\n width: 100%;\r\n min-height: 52px;\r\n display: flex;\r\n align-items: center;\r\n .box {\r\n position: absolute;\r\n right: 32px;\r\n }\r\n}\r\n.page-total {\r\n display: flex;\r\n align-items: center;\r\n height: 36px;\r\n font-size: 13px;\r\n padding-top: 4px;\r\n}\r\n.page-select {\r\n padding-top: 4px;\r\n max-width: 120px;\r\n :deep(.v-input__control) {\r\n min-height: 36px !important;\r\n height: 36px !important;\r\n }\r\n :deep(.v-field) {\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n :deep(.v-field__input) {\r\n padding-top: 6px !important;\r\n padding-bottom: 6px !important;\r\n min-height: 36px !important;\r\n }\r\n}\r\n.page-go {\r\n max-width: 75px;\r\n padding-top: 4px;\r\n :deep(.v-input__control) {\r\n min-height: 36px !important;\r\n height: 36px !important;\r\n }\r\n :deep(.v-field) {\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n :deep(.v-field__input) {\r\n padding-top: 6px !important;\r\n padding-bottom: 6px !important;\r\n min-height: 36px !important;\r\n }\r\n}\r\n\r\n// 分页按钮缩小\r\n.my-2 {\r\n :deep(.v-pagination__item),\r\n :deep(.v-pagination__prev),\r\n :deep(.v-pagination__next) {\r\n min-width: 32px !important;\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-pdf-container\">\r\n <VCard \r\n :class=\"['vtk-pdf-card', { 'vtk-pdf-card--preview': preview }]\"\r\n @click=\"openPreview\"\r\n >\r\n <!-- PDF封面或默认图标 -->\r\n <div class=\"vtk-pdf-cover\" :style=\"{ aspectRatio: aspectRatio }\">\r\n <VIcon size=\"48\" color=\"red\">mdi-file-pdf-box</VIcon>\r\n <div class=\"vtk-pdf-label\">PDF</div>\r\n </div>\r\n \r\n <!-- PDF标题和描述 -->\r\n <div class=\"vtk-pdf-info\" v-if=\"showTitle || showDescription\">\r\n <VCardTitle v-if=\"showTitle\" class=\"vtk-pdf-title text-subtitle-2 pa-2\">\r\n {{ title }}\r\n </VCardTitle>\r\n <v-card-subtitle v-if=\"showDescription\" class=\"vtk-pdf-description text-caption pa-2\">\r\n {{ description }}\r\n </v-card-subtitle>\r\n </div>\r\n </VCard>\r\n \r\n <!-- 使用 v-dialog 的PDF预览 -->\r\n <VDialog \r\n v-model=\"showPreview\" \r\n max-width=\"90%\" \r\n fullscreen\r\n @click:outside=\"closePreview\"\r\n >\r\n <VCard class=\"pdf-viewer-card\">\r\n <v-toolbar dark color=\"red darken-1\">\r\n <VBtn icon dark @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n <v-toolbar-title>{{ title }}</v-toolbar-title>\r\n <VSpacer></VSpacer>\r\n <v-toolbar-items>\r\n <VBtn icon dark @click=\"downloadPdf\">\r\n <VIcon>mdi-download</VIcon>\r\n </VBtn>\r\n </v-toolbar-items>\r\n </v-toolbar>\r\n \r\n <div class=\"pdf-viewer-content\">\r\n <div class=\"pdf-container\" ref=\"pdfContainer\">\r\n <!-- PDF内容将通过PDF.js渲染 -->\r\n <div id=\"pdf-viewer\"></div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"pdf-viewer-footer\" v-if=\"pdfLoaded\">\r\n <VRow align=\"center\" justify=\"center\">\r\n <VCol cols=\"12\" sm=\"6\" class=\"d-flex justify-center\">\r\n <VBtn icon @click=\"prevPage\" :disabled=\"currentPage <= 1\">\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n <div class=\"mx-4\">\r\n <span>第 {{ currentPage }} 页 / 共 {{ pageCount }} 页</span>\r\n </div>\r\n <VBtn icon @click=\"nextPage\" :disabled=\"currentPage >= pageCount\">\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n </VCol>\r\n <VCol cols=\"12\" sm=\"6\" class=\"d-flex justify-center\">\r\n <VSlider\r\n v-model=\"currentPage\"\r\n :min=\"1\"\r\n :max=\"pageCount\"\r\n hide-details\r\n class=\"mx-4\"\r\n ></VSlider>\r\n </VCol>\r\n </VRow>\r\n </div>\r\n \r\n <div class=\"pdf-loading\" v-if=\"loading\">\r\n <v-progress-circular indeterminate color=\"red\"></v-progress-circular>\r\n <p class=\"mt-2\">正在加载PDF...</p>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, onMounted, onBeforeUnmount } from 'vue';\r\n// import * as pdfjsLib from 'pdfjs-dist';\r\n// 注意:在实际项目中,您需要安装 pdfjs-dist 库\r\n// npm install pdfjs-dist\r\n// import * as pdfjsLib from 'pdfjs-dist';\r\n\r\ndefineOptions({\r\n name: 'VtkPdf',\r\n inheritAttrs: true\r\n});\r\n\r\nconst props = defineProps({\r\n src: {\r\n type: String,\r\n default: null,\r\n },\r\n preview: {\r\n type: Boolean,\r\n default: true\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n description: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否显示标题\r\n showTitle: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示描述\r\n showDescription: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 封面宽高比\r\n aspectRatio: {\r\n type: [String, Number],\r\n default: 16/9\r\n }\r\n});\r\n\r\n// 预览状态\r\nconst showPreview = ref(false);\r\n// PDF相关状态\r\nconst loading = ref(false);\r\nconst pdfLoaded = ref(false);\r\nconst currentPage = ref(1);\r\nconst pageCount = ref(0);\r\nconst pdfContainer = ref(null);\r\n\r\n// PDF对象(实际使用时需要引入pdfjsLib)\r\nlet pdfDoc = null;\r\n\r\n// 使用计算属性处理带token的URL\r\nconst srcWithToken = computed(() => {\r\n if (!props.src) return props.src;\r\n \r\n try {\r\n // 首先尝试使用 $vtk.storage\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n const token = window.$vtk.storage.get('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n // 如果 $vtk 不存在,尝试从 localStorage 获取 token\r\n else {\r\n const token = localStorage.getItem('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n } catch (error) {\r\n // 发生错误时返回原始src\r\n console.warn('VtkPdf: Failed to get token, using src without token', error);\r\n return props.src;\r\n }\r\n});\r\n\r\n// 打开预览\r\nconst openPreview = () => {\r\n if (props.preview) {\r\n showPreview.value = true;\r\n // 延迟加载PDF以确保DOM已准备好\r\n setTimeout(() => {\r\n loadPdf();\r\n }, 300);\r\n }\r\n};\r\n\r\n// 关闭预览\r\nconst closePreview = () => {\r\n showPreview.value = false;\r\n // 清理PDF对象\r\n pdfDoc = null;\r\n pdfLoaded.value = false;\r\n currentPage.value = 1;\r\n pageCount.value = 0;\r\n};\r\n\r\n// 加载PDF(示例实现,实际使用需要PDF.js库)\r\nconst loadPdf = async () => {\r\n if (!srcWithToken.value) return;\r\n \r\n loading.value = true;\r\n \r\n try {\r\n // 模拟PDF加载(实际实现需要使用PDF.js)\r\n /*\r\n // 实际使用时的代码示例:\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '//cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.worker.min.js';\r\n \r\n const loadingTask = pdfjsLib.getDocument(srcWithToken.value);\r\n pdfDoc = await loadingTask.promise;\r\n pageCount.value = pdfDoc.numPages;\r\n pdfLoaded.value = true;\r\n \r\n // 渲染第一页\r\n renderPage(currentPage.value);\r\n */\r\n \r\n // 模拟加载过程\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n pageCount.value = 10; // 模拟10页PDF\r\n pdfLoaded.value = true;\r\n } catch (error) {\r\n console.error('加载PDF失败:', error);\r\n } finally {\r\n loading.value = false;\r\n }\r\n};\r\n\r\n// 渲染PDF页面(示例实现)\r\nconst renderPage = async (pageNum) => {\r\n if (!pdfDoc || !pdfContainer.value) return;\r\n \r\n try {\r\n /*\r\n // 实际使用时的代码示例:\r\n const page = await pdfDoc.getPage(pageNum);\r\n const viewport = page.getViewport({ scale: 1.5 });\r\n \r\n // 准备canvas\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d');\r\n canvas.height = viewport.height;\r\n canvas.width = viewport.width;\r\n \r\n // 清空容器\r\n pdfContainer.value.innerHTML = '';\r\n pdfContainer.value.appendChild(canvas);\r\n \r\n // 渲染页面\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport: viewport\r\n };\r\n await page.render(renderContext).promise;\r\n */\r\n } catch (error) {\r\n console.error('渲染PDF页面失败:', error);\r\n }\r\n};\r\n\r\n// 上一页\r\nconst prevPage = () => {\r\n if (currentPage.value > 1) {\r\n currentPage.value--;\r\n renderPage(currentPage.value);\r\n }\r\n};\r\n\r\n// 下一页\r\nconst nextPage = () => {\r\n if (currentPage.value < pageCount.value) {\r\n currentPage.value++;\r\n renderPage(currentPage.value);\r\n }\r\n};\r\n\r\n// 下载PDF\r\nconst downloadPdf = async () => {\r\n if (!srcWithToken.value) return;\r\n \r\n try {\r\n // 获取PDF文件的二进制数据\r\n const response = await fetch(srcWithToken.value);\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n \r\n const blob = await response.blob();\r\n const fileName = props.title && props.title.trim() !== '' \r\n ? `${props.title}.pdf` \r\n : 'document.pdf';\r\n \r\n // 创建下载链接\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n \r\n // 清理\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n } catch (error) {\r\n console.error('下载PDF失败:', error);\r\n // 备用方案:在新窗口打开\r\n window.open(srcWithToken.value, '_blank');\r\n }\r\n};\r\n\r\n// 监听页码变化\r\nconst handlePageChange = (newPage) => {\r\n if (newPage >= 1 && newPage <= pageCount.value) {\r\n renderPage(newPage);\r\n }\r\n};\r\n\r\n// 监听 currentPage 变化\r\n// 在实际实现中,您需要使用 watch 监听 currentPage 变化\r\n// watch(currentPage, handlePageChange);\r\n\r\n// 组件销毁前清理\r\nonBeforeUnmount(() => {\r\n pdfDoc = null;\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-pdf-container {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.vtk-pdf-card {\r\n height: 100%;\r\n}\r\n\r\n.vtk-pdf-card--preview {\r\n cursor: pointer;\r\n transition: transform 0.2s ease-in-out;\r\n}\r\n\r\n.vtk-pdf-card--preview:hover {\r\n transform: translateY(-5px);\r\n}\r\n\r\n.vtk-pdf-cover {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #f5f5f5;\r\n border: 1px solid #ddd;\r\n width: 100%;\r\n}\r\n\r\n.vtk-pdf-label {\r\n margin-top: 8px;\r\n font-weight: 500;\r\n color: #666;\r\n}\r\n\r\n.vtk-pdf-info {\r\n padding: 0;\r\n}\r\n\r\n.vtk-pdf-title {\r\n word-break: break-word;\r\n}\r\n\r\n.vtk-pdf-description {\r\n word-break: break-word;\r\n}\r\n\r\n/* PDF查看器样式 */\r\n.pdf-viewer-card {\r\n background-color: #e0e0e0;\r\n color: #333;\r\n}\r\n\r\n.pdf-viewer-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: calc(100vh - 150px);\r\n position: relative;\r\n background-color: #555;\r\n overflow: auto;\r\n}\r\n\r\n.pdf-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n#pdf-viewer {\r\n max-width: 100%;\r\n max-height: 100%;\r\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\r\n background-color: white;\r\n /* 实际PDF内容将在此处渲染 */\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 500px;\r\n min-width: 400px;\r\n}\r\n\r\n.pdf-viewer-footer {\r\n padding: 16px;\r\n background-color: #f5f5f5;\r\n border-top: 1px solid #ddd;\r\n}\r\n\r\n.pdf-loading {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: rgba(255, 255, 255, 0.9);\r\n padding: 20px;\r\n border-radius: 8px;\r\n z-index: 100;\r\n}\r\n</style>","// composables/useMixins.js\r\nimport { ref, reactive } from 'vue'\r\nimport Request from '../commons/request.js'\r\nimport Message from '../components/message/index.js'\r\nimport storage from '../commons/storage.js'\r\n\r\n/**\r\n * 通用 mixins composable\r\n * @param {Object} urlConfig - URL 配置对象\r\n * @returns {Object} 包含所有状态和方法的对象\r\n */\r\nexport function useMixins(urlConfig = {}) {\r\n // 响应式数据\r\n const queryParam = reactive({})\r\n const desserts = ref([])\r\n const loading = ref(false)\r\n const superQueryParams = ref('')\r\n const page = reactive({\r\n pageno: 1,\r\n limit: 10\r\n })\r\n const pageData = ref({})\r\n const sumup = ref({})\r\n const pageDataCopy = ref([])\r\n const overlay = ref(false)\r\n const user = ref({})\r\n\r\n // URL 配置\r\n const url = reactive(urlConfig)\r\n\r\n /**\r\n * 获取查询参数\r\n * @returns {Object} 查询参数对象\r\n */\r\n const getQueryParams = () => {\r\n user.value = storage.get('_mis_acis_users')\r\n if (!queryParam.areaCode) {\r\n queryParam.areaCode = user.value?.areacode\r\n }\r\n const codex = Object.assign({}, queryParam)\r\n const params = {\r\n pageno: page.pageno,\r\n limit: page.limit,\r\n codex: codex\r\n }\r\n return params\r\n }\r\n\r\n /**\r\n * 加载页面数据\r\n */\r\n const loadPage = () => {\r\n if (!url.list) {\r\n Message.toast('请先设置url.list属性', { color: 'warning' })\r\n return\r\n }\r\n const params = getQueryParams()\r\n loading.value = true\r\n\r\n // 兼容处理 vtk 对象\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.show()\r\n }\r\n\r\n Request.postJson(url.list, params)\r\n .then((res) => {\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n\r\n if (res.meta.success || res.data) {\r\n desserts.value = res.data?.rows || []\r\n pageData.value = res.data\r\n sumup.value = res.data.sumup ? res.data.sumup : {}\r\n pageDataCopy.value = res.data\r\n }\r\n loading.value = false\r\n })\r\n .catch((error) => {\r\n console.error('加载页面数据失败:', error)\r\n loading.value = false\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 搜索查询\r\n */\r\n const searchQuery = () => {\r\n page.pageno = 1\r\n page.limit ??= 10\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 分页变化处理\r\n * @param {Object} pageInfo - 分页信息\r\n */\r\n const getListPage = (pageInfo) => {\r\n page.pageno = pageInfo.pageno\r\n page.limit = pageInfo.limit\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 删除项\r\n * @param {string|number} id - 要删除的项ID\r\n * @param {string} text - 确认提示文本\r\n */\r\n const deleteItem = (id, text) => {\r\n if (!url.delete) {\r\n Message.toast('请设置url.delete属性!', { color: 'warning' })\r\n return\r\n }\r\n\r\n Message.confirm(\r\n { title: '确认删除', text: text ? text : '是否删除?' },\r\n (result) => {\r\n if (result) {\r\n Request.getForm(url.delete, { id: id })\r\n .then((res) => {\r\n if (res.meta.success) {\r\n Message.toast('删除成功', { color: 'success' })\r\n loadPage()\r\n } else {\r\n Message.toast('删除失败', { color: 'warning' })\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('删除失败:', error)\r\n Message.toast('删除失败', { color: 'warning' })\r\n })\r\n }\r\n }\r\n )\r\n }\r\n\r\n /**\r\n * 复制项\r\n * @param {string|number} id - 要复制的项ID\r\n * @param {string} text - 确认提示文本\r\n */\r\n const copyItem = (id, text) => {\r\n if (!url.copy) {\r\n Message.toast('请设置url.copy!', { color: 'warning' })\r\n return\r\n }\r\n\r\n Message.confirm(\r\n { title: '拷贝', text: text ? text : '是否确认拷贝当前数据?' },\r\n (result) => {\r\n if (result) {\r\n Request.getForm(url.copy, { id: id })\r\n .then((res) => {\r\n if (res.meta.success) {\r\n Message.toast('拷贝成功', { color: 'success' })\r\n loadPage()\r\n } else {\r\n Message.toast('拷贝失败', { color: 'warning' })\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('拷贝失败:', error)\r\n Message.toast('拷贝失败', { color: 'warning' })\r\n })\r\n }\r\n }\r\n )\r\n }\r\n\r\n /**\r\n * 编辑项\r\n * @param {Object} record - 要编辑的记录\r\n * @param {Object} modalFormRef - 模态框引用\r\n */\r\n const edit = (record, modalFormRef) => {\r\n if (modalFormRef?.value) {\r\n modalFormRef.value.edit(record)\r\n }\r\n }\r\n\r\n /**\r\n * 添加新项\r\n * @param {Object} modalFormRef - 模态框引用\r\n */\r\n const add = (modalFormRef) => {\r\n if (modalFormRef?.value) {\r\n modalFormRef.value.add()\r\n }\r\n }\r\n\r\n /**\r\n * 模态框确认回调\r\n */\r\n const modalFormOk = () => {\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 导出数据\r\n */\r\n const expData = () => {\r\n overlay.value = true\r\n\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.show()\r\n }\r\n\r\n const params = getQueryParams()\r\n Request.exp(url.exp, params)\r\n .then((res) => {\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n\r\n if (res) {\r\n const disposition = res.headers['content-disposition']\r\n const filename = decodeURI(\r\n disposition.substring(\r\n disposition.indexOf('filename=') + 9,\r\n disposition.length\r\n )\r\n )\r\n const blob = new Blob([res.data], {\r\n type: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n })\r\n\r\n if (window.navigator.msSaveOrOpenBlob) {\r\n navigator.msSaveBlob(blob)\r\n } else {\r\n const link = document.createElement('a')\r\n link.style.display = 'none'\r\n link.href = URL.createObjectURL(blob)\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n }\r\n }\r\n overlay.value = false\r\n })\r\n .catch((error) => {\r\n console.error('导出数据失败:', error)\r\n overlay.value = false\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 重置查询参数\r\n */\r\n const resetQueryParams = () => {\r\n Object.keys(queryParam).forEach(key => {\r\n delete queryParam[key]\r\n })\r\n }\r\n\r\n /**\r\n * 重置分页\r\n */\r\n const resetPage = () => {\r\n page.pageno = 1\r\n page.limit = 10\r\n }\r\n\r\n /**\r\n * 更新 URL 配置\r\n * @param {Object} newUrlConfig - 新的 URL 配置\r\n */\r\n const updateUrlConfig = (newUrlConfig) => {\r\n Object.assign(url, newUrlConfig)\r\n }\r\n\r\n // 返回所有状态和方法\r\n return {\r\n // 响应式数据\r\n queryParam,\r\n desserts,\r\n loading,\r\n superQueryParams,\r\n page,\r\n pageData,\r\n sumup,\r\n pageDataCopy,\r\n overlay,\r\n user,\r\n url,\r\n\r\n // 方法\r\n getQueryParams,\r\n loadPage,\r\n searchQuery,\r\n getListPage,\r\n deleteItem,\r\n copyItem,\r\n edit,\r\n add,\r\n modalFormOk,\r\n expData,\r\n resetQueryParams,\r\n resetPage,\r\n updateUrlConfig\r\n }\r\n}\r\n\r\n// 默认导出保持向后兼容\r\nexport default useMixins","<template>\r\n\t<VContainer fluid class=\"vtk-height pa-0\">\r\n\t\t<VTabs v-model=\"examType\" bg-color=\"transparent\" height=\"38\" style=\"width: 100%\">\r\n\t\t\t<VTab @click=\"examAll()\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-clipboard-arrow-up</VIcon>全部</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"list\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-star-circle</VIcon>审核</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-hand-heart</VIcon>实施</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-comment-minus</VIcon>评价</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-credit-card-check</VIcon>支付</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VSpacer />\r\n\t\t</VTabs>\r\n\t\t<VCard elevation=\"0\" style=\"min-height: calc(100% - 38px)\">\r\n\t\t\t<VCardTitle style=\"height: 88px\">\r\n\t\t\t\t<VMenu v-if=\"examType == '0' && (expShow || user.grole >= 2)\" offset-y :close-on-content-click=\"false\" location=\"bottom\">\r\n\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t<VBtn @click=\"exv\" v-bind=\"props\" class=\"bg-orange text-white mr-3\" elevation=\"0\">\r\n\t\t\t\t\t\t\t<VIcon>mdi-export-variant</VIcon> 导出\r\n\t\t\t\t\t\t</VBtn>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<VCard class=\"pa-3\" width=\"300\">\r\n\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t<p class=\"mb-2 font-weight-bold\">公共字段</p>\r\n\t\t\t\t\t\t\t<p class=\"text-caption\">\r\n\t\t\t\t\t\t\t\t服务事项\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属区县\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属镇街\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属社区\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人证件号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人姓名\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t残疾人证号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t性别\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人手机号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t补助金额\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t开户银行\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t银行卡号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t收款人姓名\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t收款人证件号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t状态\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t<VDivider />\r\n\t\t\t\t\t\t\t<div v-if=\"queryParam.servState == '1' && projName\">\r\n\t\t\t\t\t\t\t\t<VCardTitle class=\"pa-0 text-body-1 mb-2 pt-3\">\r\n\t\t\t\t\t\t\t\t\t<VCheckbox @update:model-value=\"chkAll\" v-model=\"select\" class=\"mt-n1\" hide-details>\r\n\t\t\t\t\t\t\t\t\t\t<template v-slot:append>\r\n\t\t\t\t\t\t\t\t\t\t\t<VIcon class=\"active\" style=\"display: none\" size=\"18\">mdi-check-circle</VIcon>\r\n\t\t\t\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t\t\t</VCheckbox>\r\n\t\t\t\t\t\t\t\t\t<span class=\"font-weight-bold ml-n2\">拓展字段</span>\r\n\t\t\t\t\t\t\t\t\t<VSpacer />\r\n\t\t\t\t\t\t\t\t</VCardTitle>\r\n\t\t\t\t\t\t\t\t<p v-if=\"formArr?.length > 0\" class=\"mb-0 expBox\">\r\n\t\t\t\t\t\t\t\t\t<VCheckbox\r\n\t\t\t\t\t\t\t\t\t\tv-for=\"(item, index) in formArr\"\r\n\t\t\t\t\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\t\t\t\t\tv-model=\"expArr\"\r\n\t\t\t\t\t\t\t\t\t\t:label=\"item.label\"\r\n\t\t\t\t\t\t\t\t\t\t:value=\"{ name: item.name, valu: `${item.label}${item.valu && item.valu.includes('/') && item.valu.includes(':') ? `(${item.valu})` : ''}` }\"\r\n\t\t\t\t\t\t\t\t\t\tclass=\"mt-2\"\r\n\t\t\t\t\t\t\t\t\t\tmultiple\r\n\t\t\t\t\t\t\t\t\t\thide-details>\r\n\t\t\t\t\t\t\t\t\t\t<template v-slot:append>\r\n\t\t\t\t\t\t\t\t\t\t\t<VIcon class=\"active\" style=\"display: none\" size=\"18\">mdi-check-circle</VIcon>\r\n\t\t\t\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t\t\t</VCheckbox>\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p v-else class=\"text-red text-body-2 mb-2\">{{ projTip }}</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div v-else>\r\n\t\t\t\t\t\t\t\t<p class=\"mb-3 pt-3 font-weight-bold\">导出提示</p>\r\n\t\t\t\t\t\t\t\t<p :class=\"queryParam.servState == '1' ? 'text-green' : 'text-red'\" class=\"mb-3 text-body-2\">\r\n\t\t\t\t\t\t\t\t\t<VIcon size=\"20\" :color=\"queryParam.servState == '1' ? 'green' : 'red'\">{{ queryParam.servState == \"1\" ? \"mdi-progress-check\" : \"mdi-progress-close\" }}</VIcon>\r\n\t\t\t\t\t\t\t\t\t导出数据仅限已服务信息\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p class=\"mb-2 text-body-2\" :class=\"projName ? 'text-green' : 'text-red'\">\r\n\t\t\t\t\t\t\t\t\t<VIcon size=\"20\" :color=\"projName ? 'green' : 'red'\">{{ projName ? \"mdi-progress-check\" : \"mdi-progress-close\" }}</VIcon>\r\n\t\t\t\t\t\t\t\t\t至少选择一个服务事项导出\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<VBtn @click=\"exp\" :disabled=\"!(projName && queryParam.servState == '1')\" elevation=\"0\" color=\"primary\" class=\"vtk-width mt-3\" size=\"small\">确认导出</VBtn>\r\n\t\t\t\t\t</VCard>\r\n\t\t\t\t</VMenu>\r\n\t\t\t\t<VSpacer />\r\n\t\t\t\t<vtk-search v-model=\"queryParam\" @search=\"searchQuery\" placeholder=\"输入姓名/身份证查询\" :styles=\"'width:320px'\">\r\n\t\t\t\t\t<VTextField @click=\"searchProj\" v-model=\"projName\" :title=\"projName\" clearable readonly variant=\"outlined\" placeholder=\"服务事项\" density=\"compact\" hide-details class=\"my-3\"></VTextField>\r\n\t\t\t\t\t<vtk-area-tabs v-model=\"queryParam.areaCode\" :styles=\"'width:100%'\" />\r\n\t\t\t\t\t<div v-if=\"examType == 0\" style=\"width: 400px\">\r\n\t\t\t\t\t\t<vtk-select v-model=\"queryParam.servState\" @change=\"searchQuery\" placeholder=\"服务状态\" list=\"0:服务中/1:已服务\" class=\"mt-3 d-inline-block mr-3 mb-3\" style=\"width: calc(50% - 6px)\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t\t<vtk-select v-model=\"queryParam.rateState\" @change=\"searchQuery\" placeholder=\"是否评价\" list=\"0:未评价/1:已评价\" class=\"mt-3 d-inline-block\" style=\"width: calc(50% - 6px)\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t\t<VMenu v-model=\"menu\" :close-on-content-click=\"false\" transition=\"scale-transition\" location=\"bottom\" max-width=\"290px\" min-width=\"auto\">\r\n\t\t\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t\t\t<VTextField v-model=\"queryParam.servFtime0\" placeholder=\"开始时间\" persistent-hint append-icon=\"mdi-calendar\" class=\"d-inline-block\" style=\"width: calc(50% - 16px)\" hide-details variant=\"outlined\" density=\"compact\" v-bind=\"props\"></VTextField>\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t<VDatePicker v-model=\"queryParam.servFtime0\" title=\"\" @update:model-value=\"menu = false\" view-mode=\"month\" :max=\"queryParam.servFtime1\"></VDatePicker>\r\n\t\t\t\t\t\t</VMenu>\r\n\t\t\t\t\t\t<span class=\"mx-2\">至</span>\r\n\t\t\t\t\t\t<VMenu v-model=\"menu1\" :close-on-content-click=\"false\" transition=\"scale-transition\" location=\"bottom\" max-width=\"290px\" min-width=\"auto\">\r\n\t\t\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t\t\t<VTextField v-model=\"queryParam.servFtime1\" placeholder=\"结束时间\" persistent-hint append-icon=\"mdi-calendar\" class=\"d-inline-block\" style=\"width: calc(50% - 15px)\" hide-details variant=\"outlined\" density=\"compact\" v-bind=\"props\"></VTextField>\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t<VDatePicker v-model=\"queryParam.servFtime1\" title=\"\" @update:model-value=\"menu1 = false\" view-mode=\"month\" :min=\"queryParam.servFtime0\"></VDatePicker>\r\n\t\t\t\t\t\t</VMenu>\r\n\t\t\t\t\t\t<vtk-select v-if=\"queryParam.servState == '1'\" @change=\"searchQuery\" v-model=\"queryParam.state\" class=\"mt-3\" placeholder=\"状态\" list=\"1:已通过/0:未通过\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</vtk-search>\r\n\t\t\t</VCardTitle>\r\n\t\t\t<VCardText>\r\n\t\t\t\t<VDataTable :headers=\"headers\" :items=\"desserts\" :loading=\"loading\" disable-pagination loading-text=\"数据加载中...\" class=\"elevation-0\" hide-default-footer>\r\n\t\t\t\t\t<template v-slot:[`item.objsName`]=\"{ item }\">\r\n\t\t\t\t\t\t<div class=\"py-3\" @click=\"toView(item)\">\r\n\t\t\t\t\t\t\t<p class=\"vtk-cursor-pointer text-body-1 font-weight-bold mb-2\">\r\n\t\t\t\t\t\t\t\t{{ item.objsName }}<span class=\"ml-3 text-grey\">{{ formatIdCard(item.objsCode) }} </span>\r\n\t\t\t\t\t\t\t\t<VChip class=\"ml-2\" :class=\"getServStateClass(item.servState)\" size=\"small\" label>{{ getServStateText(item.servState) }} </VChip>\r\n\t\t\t\t\t\t\t\t<VChip class=\"ml-2\" :class=\"getRateStateClass(item.rateState)\" size=\"small\" label>{{ getRateStateText(item.rateState) }} </VChip>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t<VChip class=\"bg-orange-lighten-5 text-orange\" size=\"small\" label> 事项编码:{{ item.projCode }} </VChip>\r\n\t\t\t\t\t\t\t\t<VChip class=\"text-primary ml-2\" size=\"small\" label> 办件编号:{{ item.inst }} </VChip>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<div class=\"mb-0 mt-2 text-grey\">\r\n\t\t\t\t\t\t\t\t<div class=\"d-inline-block\" style=\"min-width: 320px\">\r\n\t\t\t\t\t\t\t\t\t服务名称:<span class=\"text-blue\">{{ item.projName }}</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<span>补助金额:{{ item.servAmts }}元</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<VRow class=\"py-2\" style=\"color: #979797c2\">\r\n\t\t\t\t\t\t\t\t<VCol style=\"max-width: 320px\">\r\n\t\t\t\t\t\t\t\t\t<span :title=\"item.name\" class=\"d-block\" style=\"color: #979797c2\">申请途径:{{ getServFromText(item.servFrom) }}</span>\r\n\t\t\t\t\t\t\t\t</VCol>\r\n\t\t\t\t\t\t\t\t<VCol>\r\n\t\t\t\t\t\t\t\t\t<span :title=\"item.name\" class=\"d-block\" style=\"color: #979797c2\">申请时间:{{ formatDate(item.servCtime) }}</span>\r\n\t\t\t\t\t\t\t\t</VCol>\r\n\t\t\t\t\t\t\t</VRow>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-slot:[`item.actions`]=\"{ item }\">\r\n\t\t\t\t\t\t<a v-if=\"item.state != 0 && user.areacode?.length == 6 && item.servState == '1'\" @click=\"del(item)\" class=\"text-error\" text>作废</a>\r\n\t\t\t\t\t\t<div v-if=\"item.state == 0\" class=\"state_btg text-right\"></div>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-slot:no-data>\r\n\t\t\t\t\t\t<vtk-empty />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</VDataTable>\r\n\t\t\t\t<vtk-page :page-sizes=\"[10, 20]\" :page-data=\"pageData\" @pageChange=\"getListPage\" />\r\n\t\t\t</VCardText>\r\n\t\t</VCard>\r\n\t\t<!-- 服务事项 -->\r\n\t\t<vtk-proj ref=\"MprojRef\" @toPage=\"toPage\" />\r\n\t\t<!-- 删除服务 -->\r\n\t\t<VDialog v-model=\"dialog\" persistent max-width=\"500\">\r\n\t\t\t<VCard>\r\n\t\t\t\t<VCardTitle>作废</VCardTitle>\r\n\t\t\t\t<VCardText class=\"pb-0\">\r\n\t\t\t\t\t服务作废后将无法恢复,请谨慎操作!!!\r\n\t\t\t\t\t<VTextarea v-model=\"delNote\" variant=\"outlined\" label=\"请填写作废原因\" class=\"mt-3\" hide-details density=\"compact\"></VTextarea>\r\n\t\t\t\t</VCardText>\r\n\t\t\t\t<VCardActions>\r\n\t\t\t\t\t<VSpacer />\r\n\t\t\t\t\t<VBtn @click=\"dialog = false\" variant=\"text\">取消</VBtn>\r\n\t\t\t\t\t<VBtn @click=\"delSave(true)\" variant=\"text\">确定</VBtn>\r\n\t\t\t\t</VCardActions>\r\n\t\t\t</VCard>\r\n\t\t</VDialog>\r\n\t</VContainer>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onActivated } from 'vue';\r\nimport { useMixins } from '../../composables/useMixins'\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件选项\r\ndefineOptions({\r\n\tname: 'VtkProj',\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 表单列表 URL 配置\r\nconst urlConfig = {\r\n\tlist: '/kudas/xfwez/page',\r\n\texp: '/kudas/xfwez/exp',\r\n\tdelete: '/kudas/xfwez/delete'\r\n};\r\n\r\n// 使用 mixins composable\r\nconst {\r\n\tpageData,\r\n\tgetListPage,\r\n\tloadPage,\r\n\texpData,\r\n\tdesserts,\r\n\tloading,\r\n\tqueryParam: mixinQueryParam,\r\n\turl\r\n} = useMixins(urlConfig);\r\n\r\n// 合并 queryParam\r\nObject.assign(mixinQueryParam, {});\r\nconst queryParam = mixinQueryParam;\r\n\r\n// 响应式数据\r\nconst user = ref({});\r\nconst examType = ref(1);\r\n\r\nconst headers = ref([\r\n\t{ title: '事项', key: 'objsName', sortable: false },\r\n\t{ title: '状态', key: 'actions', sortable: false, align: 'end' },\r\n]);\r\n\r\n// 主题筛选\r\nconst permits = ref([]);\r\nconst projName = ref('');\r\nconst projTip = ref('');\r\nconst bizType = ref('');\r\nconst expShow = ref(false);\r\nconst menu = ref(false);\r\nconst menu1 = ref(false);\r\n\r\n// 导出\r\nconst expArr = ref([]);\r\nconst formArr = ref([]);\r\nconst select = ref(false);\r\nconst selectAll = ref([]);\r\n\r\n// 删除\r\nconst dialog = ref(false);\r\nconst delItem = ref({});\r\nconst delNote = ref('');\r\n\r\n// ref\r\nconst MprojRef = ref(null);\r\n\r\n// 监听器\r\nwatch(expArr, (newVal) => {\r\n\tif (newVal.length < selectAll.value.length) {\r\n\t\tselect.value = false;\r\n\t}\r\n}, { deep: true });\r\n\r\n// 生命周期\r\nonActivated(() => {\r\n\talert('onActivated');\r\n\tlist();\r\n\t// 监听接收消息,刷新页面\r\n\twindow.addEventListener('storage', (event) => {\r\n\t\tif (JSON.parse(event?.newValue)?.fwez) {\r\n\t\t\texamType.value == '0' ? examAll() : loadPage();\r\n\t\t}\r\n\t});\r\n});\r\n\r\n// 方法\r\n// 全选\r\nconst chkAll = (e) => {\r\n\texpArr.value = e ? selectAll.value : [];\r\n};\r\n\r\nconst list = () => {\r\n\tbizType.value = '';\r\n\texpShow.value = false;\r\n\tuser.value = getUserInfo();\r\n\tpermits.value = [];\r\n\tuser.value.permits?.forEach((e) => {\r\n\t\tif (e.permNkey.includes('biz_type')) {\r\n\t\t\tpermits.value.push(e);\r\n\t\t\tbizType.value = bizType.value + e.permNkey.slice(9) + ',';\r\n\t\t} else if (e.permNkey == 'btn_expo') {\r\n\t\t\texpShow.value = true;\r\n\t\t}\r\n\t});\r\n\tqueryParam.bizType = bizType.value;\r\n\texamWait();\r\n};\r\n\r\n// 获取用户信息\r\nconst getUserInfo = () => {\r\n\ttry {\r\n\t\t// 实际项目中从存储或状态管理获取\r\n\t\treturn window.$vtk?.storage?.get('_mis_acis_users') || {};\r\n\t} catch (error) {\r\n\t\tconsole.warn('获取用户信息失败:', error);\r\n\t\treturn {};\r\n\t}\r\n};\r\n\r\n// 待审\r\nconst examWait = () => {\r\n\texamType.value = 1;\r\n\tqueryParam.operateLeve = user.value.areacode?.length;\r\n\tqueryParam.servState = '0';\r\n\tloadPage();\r\n};\r\n\r\n// 全部审核\r\nconst examAll = () => {\r\n\texamType.value = 0;\r\n\tdelete queryParam.operateLeve;\r\n\tdelete queryParam.servState;\r\n\tloadPage();\r\n};\r\n\r\n// 审核\r\nconst toView = (item) => {\r\n\tconst url = item.servState == 1\r\n\t\t? `#/mino/suse/view/${item.inst}?ddtab=true`\r\n\t\t: `#/mino/suse/exam/${item.inst}?ddtab=true`;\r\n\twindow.open(url);\r\n};\r\n\r\n// 服务事项查询/筛选\r\nconst searchProj = () => {\r\n\tMprojRef.value?.add(queryParam.projCode);\r\n};\r\n\r\nconst toPage = (param) => {\r\n\tprojName.value = param.projName;\r\n\tqueryParam.projCode = param.projCode;\r\n\tdelete queryParam.bizType;\r\n\tsearchQuery();\r\n};\r\n\r\nconst searchQuery = () => {\r\n\t// 搜索查询逻辑\r\n\tloadPage();\r\n};\r\n\r\n// 导出相关\r\nconst exv = () => {\r\n\tif (projName.value && queryParam.servState == '1') {\r\n\t\texpArr.value = [];\r\n\t\tformArr.value = [];\r\n\t\t// 显示加载状态\r\n\t\tRequest.postJson('/kudas/xfwez/exv', { codex: queryParam }).then((res) => {\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\tJSON.parse(res.data.formJson).forEach((item) => {\r\n\t\t\t\t\tif (['text', 'radio', 'number', 'time', 'checkbox', 'textarea', 'select'].includes(item.type)) {\r\n\t\t\t\t\t\titem.value = {\r\n\t\t\t\t\t\t\tname: item.name,\r\n\t\t\t\t\t\t\tvalu: `${item.label}${item.valu && item.valu.includes('/') && item.valu.includes(':') ? `(${item.valu})` : ''}`\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tformArr.value.push(item);\r\n\t\t\t\t\t\tselectAll.value.push(item.value);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tprojTip.value = res.meta.message;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n};\r\n\r\nconst exp = () => {\r\n\tqueryParam.fields = expArr.value;\r\n\texpData();\r\n};\r\n\r\n// 服务作废\r\nconst del = (item) => {\r\n\tdialog.value = true;\r\n\tdelItem.value = item;\r\n\tdelNote.value = '';\r\n};\r\n\r\nconst delSave = () => {\r\n\tif (delNote.value) {\r\n\t\tRequest.postForm(url.delete, { id: delItem.value.id, note: delNote.value }).then((res) => {\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\t// 显示成功消息\r\n\t\t\t\tdialog.value = false;\r\n\t\t\t\tloadPage();\r\n\t\t\t} else {\r\n\t\t\t\t// 显示失败消息\r\n\t\t\t}\r\n\t\t});\r\n\t} else {\r\n\t\t// 显示错误消息\r\n\t}\r\n};\r\n\r\n// 提示\r\nconst tip = () => {\r\n\t// 显示应用开发中的消息\r\n};\r\n\r\n// 工具函数\r\nconst formatIdCard = (idcard) => {\r\n\tif (!idcard) return '';\r\n\treturn idcard.replace(/^(.{6})(?:\\d+)(.{4})$/, '$1********$2');\r\n};\r\n\r\nconst formatDate = (dateStr) => {\r\n\tif (!dateStr) return '';\r\n\tconst date = new Date(dateStr);\r\n\treturn `${date.getFullYear()}年${String(date.getMonth() + 1).padStart(2, '0')}月${String(date.getDate()).padStart(2, '0')}日 ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;\r\n};\r\n\r\nconst getServStateClass = (state) => {\r\n\treturn state == '0' ? 'bg-blue-lighten-5 text-blue' : 'bg-green-lighten-5 text-green';\r\n};\r\n\r\nconst getServStateText = (state) => {\r\n\treturn state == '0' ? '服务中' : '已服务';\r\n};\r\n\r\nconst getRateStateClass = (state) => {\r\n\treturn state == '0' ? 'bg-orange-lighten-5 text-orange' : 'bg-blue-lighten-5 text-blue';\r\n};\r\n\r\nconst getRateStateText = (state) => {\r\n\treturn state == '0' ? '未评价' : '已评价';\r\n};\r\n\r\nconst getServFromText = (from) => {\r\n\tconst fromMap = {\r\n\t\t'100': '特殊渠道',\r\n\t\t'101': '移动端代办',\r\n\t\t'102': '窗口端通办',\r\n\t\t'200': '特殊渠道',\r\n\t\t'210': '浙里办App',\r\n\t\t'211': '浙里办微信小程序',\r\n\t\t'212': '浙里办支付宝小程序',\r\n\t\t'230': '微信小程序',\r\n\t\t'240': '支付宝小程序',\r\n\t\t'250': '自助机',\r\n\t\t'300': '特殊渠道',\r\n\t\t'310': '服务外包代办'\r\n\t};\r\n\treturn fromMap[from] || from;\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.state_btg {\r\n\tpadding-right: 0;\r\n\theight: 100%;\r\n\tbackground: url(../../assets/img/objs_btg.png) no-repeat;\r\n\tbackground-size: 80px;\r\n\tbackground-position: 100% 100%;\r\n}\r\n\r\n:deep(.v-tab) {\r\n\tbackground: url(../../assets/img/tab-2.png) no-repeat;\r\n\tbackground-size: 100% 100%;\r\n\twidth: 150px;\r\n\tmargin-left: -11px;\r\n\tborder-top-left-radius: 20px;\r\n\tborder-top-right-radius: 20px;\r\n\tspan {\r\n\t\tz-index: 99;\r\n\t}\r\n}\r\n\r\n/* Dark theme */\r\n.v-theme--dark {\r\n\t:deep(.v-tab) {\r\n\t\tbackground: url(../../assets/img/tab-4.png) no-repeat;\r\n\t\tbackground-size: 100% 100%;\r\n\t}\r\n\r\n\t:deep(.v-tabs__slider) {\r\n\t\tbackground: url(../../assets/img/tab-3.png) no-repeat !important;\r\n\t\tbackground-size: 100% 100% !important;\r\n\t}\r\n}\r\n\r\n:deep(.v-tab::before),\r\n:deep(.v-tab:focus::before),\r\n:deep(.v-tab:hover::before) {\r\n\tbackground-color: transparent !important;\r\n\topacity: 0 !important;\r\n}\r\n\r\n:deep(.v-tabs__slider) {\r\n\theight: 38px !important;\r\n\tbackground: url(../../assets/img/tab-1.png) no-repeat;\r\n\tbackground-size: 100% 100%;\r\n}\r\n\r\n.expBox {\r\n\t:deep(td) {\r\n\t\tborder-bottom: thin solid rgba(123, 123, 123, 0.22);\r\n\t}\r\n\r\n\t:deep(.v-data-table__empty-wrapper td) {\r\n\t\tborder: none;\r\n\t}\r\n\r\n\t:deep(.v-checkbox.v-selection-control--dirty) {\r\n\t\tbackground-color: rgba(33, 149, 243, 0.06) !important;\r\n\r\n\t\t.v-label {\r\n\t\t\tcolor: rgb(33, 150, 243) !important;\r\n\t\t}\r\n\r\n\t\t.active {\r\n\t\t\tcolor: rgb(33, 150, 243);\r\n\t\t\tdisplay: inline-block !important;\r\n\t\t}\r\n\t}\r\n\r\n\t:deep(.v-selection-control__input) {\r\n\t\tdisplay: none;\r\n\t}\r\n\r\n\t:deep(.v-checkbox) {\r\n\t\tpadding: 4px 8px 4px 10px;\r\n\t\tborder-radius: 6px;\r\n\t\tbackground-color: rgba(117, 117, 117, 0.06);\r\n\r\n\t\t.v-label {\r\n\t\t\tmargin-top: 3px;\r\n\t\t\tfont-size: 12px;\r\n\t\t}\r\n\t}\r\n}\r\n</style>\r\n","<template>\r\n <VRadioGroup v-bind=\"attrs\" :modelValue=\"modelValue\" @update:modelValue=\"onUpdate\">\r\n <VRadio\r\n v-for=\"item in items\"\r\n :key=\"item.id || item.code\"\r\n :label=\"item.codeValue\"\r\n :value=\"item.code\"\r\n />\r\n </VRadioGroup>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs } from 'vue';\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkRadio\",\r\n inheritAttrs: false,\r\n});\r\n// 定义 props\r\nconst props = defineProps({\r\n /**\r\n * 字典来源:\r\n * - 静态数据,如:\"0:否/1:是\"\r\n * - 字典键名,如:\"DISABLE_TYPE\"\r\n */\r\n list: {\r\n type: String,\r\n required: true,\r\n },\r\n modelValue: {\r\n type: [String, Number],\r\n default: null,\r\n },\r\n});\r\n\r\n// 定义 emit 事件\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 获取透传属性(替代 $attrs)\r\nconst attrs = useAttrs();\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 处理静态数据\r\nconst statc = () => {\r\n props.list.split('/').forEach(it => {\r\n const [code, codeValue] = it.split(':');\r\n items.value.push({ code, codeValue });\r\n });\r\n};\r\n\r\n// 请求远程字典\r\nconst miscs = async () => {\r\n try {\r\n const res = await Request.getForm(`dict/misc/list/${props.list}`);\r\n items.value = res.data || [];\r\n } catch (error) {\r\n console.error('[VtkRadio] Failed to load dictionary:', error);\r\n items.value = [];\r\n }\r\n};\r\n\r\n// 更新 v-model 值\r\nconst onUpdate = (val) => {\r\n emit('update:modelValue', val);\r\n};\r\n\r\n// 初始化数据\r\nonMounted(() => {\r\n if (props.list.includes(':')) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n</style>","<template>\r\n <div class=\"search\">\r\n <VMenu\r\n v-model=\"menu\"\r\n @update:model-value=\"obtain\"\r\n location=\"bottom end\"\r\n origin=\"top end\"\r\n offset=\"4\"\r\n :close-on-content-click=\"false\"\r\n >\r\n <template v-slot:activator=\"{ props }\">\r\n <VTextField\r\n v-model=\"queryParam.condition\"\r\n :placeholder=\"$attrs.placeholder || '请输入查询内容'\"\r\n :style=\"$attrs.styles\"\r\n class=\"box\"\r\n density=\"compact\"\r\n variant=\"outlined\"\r\n hide-details\r\n @click:append=\"search\"\r\n @keyup.enter=\"search\"\r\n @click:clear=\"(queryParam.condition = ''), search()\"\r\n clearable\r\n >\r\n <template v-slot:append-inner>\r\n <span class=\"search-trigger\" @click.stop=\"search\">\r\n <VIcon class=\"search-icon\" size=\"small\">mdi-magnify</VIcon>\r\n </span>\r\n <span v-bind=\"props\" class=\"search-advanced\">\r\n <span class=\"search-divider\"></span>\r\n <VBadge\r\n dot\r\n :content=\"initialIndex\"\r\n :model-value=\"initialIndex > 0\"\r\n color=\"error\"\r\n class=\"advanced-badge\"\r\n >\r\n <span\r\n class=\"pl-1 text-blue vtk-cursor-pointer d-inline-flex align-center text-body-2\"\r\n >\r\n 高级\r\n </span>\r\n </VBadge>\r\n </span>\r\n </template>\r\n </VTextField>\r\n </template>\r\n\r\n <VCard class=\"search-panel\">\r\n <VCardTitle class=\"pr-3 d-flex justify-space-between align-center pb-3\">\r\n <span>高级搜索</span>\r\n <VBtn class=\"mx-0\" variant=\"text\" icon @click=\"close\" size=\"small\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </VCardTitle>\r\n\r\n <VCardText class=\"search-panel__body\">\r\n <div class=\"search-panel__content\" :style=\"contentStyle\">\r\n <slot :query-param=\"queryParam\"></slot>\r\n </div>\r\n </VCardText>\r\n\r\n <VCardActions class=\"pt-0 px-4 pb-3\">\r\n <slot name=\"actions\"></slot>\r\n <VSpacer />\r\n <VBtn @click=\"search\" variant=\"flat\" color=\"primary\">\r\n <VIcon class=\"mr-1\">mdi-magnify</VIcon>搜索\r\n </VBtn>\r\n <VBtn @click=\"handleResetClick\" variant=\"flat\" color=\"error\">\r\n <VIcon class=\"mr-1\">mdi-sync</VIcon>重置\r\n </VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VMenu>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, getCurrentInstance, onMounted, ref, watch } from 'vue';\r\n\r\ndefineOptions({\r\n name: \"VtkSearch\"\r\n});\r\n\r\nconst props = defineProps({\r\n value: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n contentMinHeight: {\r\n type: [Number, String],\r\n default: 0\r\n },\r\n contentMaxHeight: {\r\n type: [Number, String],\r\n default: 360\r\n }\r\n});\r\n\r\nconst emit = defineEmits(['update:value', 'search', 'reset']);\r\nconst instance = getCurrentInstance();\r\n\r\nconst user = ref({});\r\nconst menu = ref(false);\r\n\r\nconst cloneValue = (val) => {\r\n if (Array.isArray(val)) return [...val];\r\n if (val && typeof val === 'object') return { ...val };\r\n return val;\r\n};\r\n\r\nconst cloneQueryParam = (source = {}) => {\r\n return Object.fromEntries(Object.entries(source || {}).map(([key, val]) => [key, cloneValue(val)]));\r\n};\r\n\r\nconst isSameValue = (a, b) => {\r\n if (\r\n Array.isArray(a) ||\r\n Array.isArray(b) ||\r\n (a && typeof a === 'object') ||\r\n (b && typeof b === 'object')\r\n ) {\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n }\r\n\r\n return a === b;\r\n};\r\n\r\nconst queryParam = ref(cloneQueryParam(props.value));\r\nconst initialQueryParam = ref(cloneQueryParam(props.value));\r\nconst externalQueryParam = ref(cloneQueryParam(props.value));\r\n\r\nconst initialIndex = computed(() => {\r\n return Object.entries(queryParam.value).filter(([key, val]) => {\r\n if (key === 'condition') return false;\r\n const initVal = initialQueryParam.value[key];\r\n return !isSameValue(val, initVal);\r\n }).length;\r\n});\r\n\r\nconst contentStyle = computed(() => {\r\n const minValue = props.contentMinHeight;\r\n const maxValue = props.contentMaxHeight;\r\n const minHeight = typeof minValue === 'number' ? `${minValue}px` : minValue;\r\n const maxHeight = typeof maxValue === 'number' ? `${maxValue}px` : maxValue;\r\n\r\n return {\r\n ...(minValue ? { minHeight } : {}),\r\n maxHeight,\r\n };\r\n});\r\n\r\nwatch(\r\n () => props.value,\r\n (newVal = {}) => {\r\n const nextExternalQueryParam = cloneQueryParam(newVal);\r\n const nextQueryParam = { ...queryParam.value };\r\n\r\n Object.entries(nextExternalQueryParam).forEach(([key, val]) => {\r\n if (!isSameValue(val, externalQueryParam.value[key])) {\r\n nextQueryParam[key] = cloneValue(val);\r\n }\r\n });\r\n\r\n Object.keys(externalQueryParam.value).forEach((key) => {\r\n if (!(key in nextExternalQueryParam)) {\r\n delete nextQueryParam[key];\r\n }\r\n });\r\n\r\n queryParam.value = nextQueryParam;\r\n externalQueryParam.value = nextExternalQueryParam;\r\n },\r\n { deep: true }\r\n);\r\n\r\nonMounted(() => {\r\n user.value = JSON.parse(localStorage.getItem(\"_mis_acis_users\") || \"{}\");\r\n});\r\n\r\nconst obtain = () => {};\r\n\r\nconst close = () => {\r\n menu.value = false;\r\n obtain();\r\n};\r\n\r\nconst filterNull = (obj) => {\r\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== null && v !== undefined));\r\n};\r\n\r\nconst search = () => {\r\n close();\r\n emit('update:value', filterNull(queryParam.value));\r\n emit(\"search\");\r\n};\r\n\r\nconst reset = () => {\r\n queryParam.value = {\r\n ...initialQueryParam.value,\r\n condition: ''\r\n };\r\n emit('update:value', filterNull(queryParam.value));\r\n emit(\"search\");\r\n menu.value = false;\r\n};\r\n\r\nconst handleResetClick = () => {\r\n const hasParentResetHandler = Boolean(instance?.vnode.props?.onReset);\r\n\r\n if (hasParentResetHandler) {\r\n emit('reset', { ...queryParam.value });\r\n return;\r\n }\r\n\r\n reset();\r\n};\r\n\r\ndefineExpose({ search, reset });\r\n\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.search {\r\n position: relative;\r\n min-width: 380px;\r\n min-height: 40px;\r\n}\r\n\r\n.box {\r\n min-width: 380px;\r\n min-height: 40px;\r\n}\r\n\r\n.search-panel {\r\n width: 380px;\r\n overflow: visible;\r\n}\r\n\r\n.search-panel__body {\r\n overflow: visible;\r\n}\r\n\r\n.search-panel__content {\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n scrollbar-gutter: stable;\r\n scrollbar-color: rgb(var(--v-theme-primary)) transparent;\r\n scrollbar-width: thin;\r\n}\r\n\r\n\r\n.search-panel__content::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n.search-panel__content::-webkit-scrollbar-thumb {\r\n background: rgb(var(--v-theme-primary));\r\n}\r\n\r\n:deep(.box .v-field__append-inner) {\r\n cursor: pointer;\r\n padding-left: 4px !important;\r\n min-width: 50px;\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n:deep(.advanced-badge .v-badge__badge) {\r\n transform: translate(8px, -2px);\r\n}\r\n\r\n.search-trigger {\r\n flex-shrink: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n align-self: stretch;\r\n /* 搜索热区铺满「放大镜 → 竖线」整段:右侧 10px 即图标与竖线之间的空白,\r\n 竖线的左边距已并入此处,点击该区域执行搜索(不再落到高级弹窗热区) */\r\n padding: 1px 10px 0 0;\r\n cursor: pointer;\r\n}\r\n\r\n.search-advanced {\r\n flex-shrink: 0;\r\n white-space: nowrap;\r\n display: inline-flex;\r\n align-items: center;\r\n align-self: stretch;\r\n /* 高级热区从竖线开始:右侧 12px 补 .v-field--appended 的 padding-inline-end,\r\n 负外边距抵消 padding,视觉与布局保持原样 */\r\n padding: 1px 12px 0 0;\r\n margin-right: -12px;\r\n cursor: pointer;\r\n}\r\n\r\n.search-divider {\r\n width: 1px;\r\n align-self: stretch;\r\n margin: 0 8px 0 0;\r\n background: #cccccc88;\r\n flex-shrink: 0;\r\n}\r\n\r\n.search-icon {\r\n transition: color 0.2s;\r\n}\r\n\r\n.search-trigger:hover .search-icon {\r\n color: rgb(var(--v-theme-primary));\r\n}\r\n</style>\r\n","<template>\r\n <VSelect \r\n v-bind=\"filteredAttrs\" \r\n :items=\"items\" \r\n item-title=\"codeValue\" \r\n item-value=\"code\" \r\n :multiple=\"multi\"\r\n :menu-props=\"{ offsetY: true }\" \r\n @update:model-value=\"$emit('update:modelValue', $event)\"\r\n />\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs, computed } from 'vue'\r\nimport Request from \"../../commons/request\";\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n name: \"VtkSelect\",\r\n inheritAttrs: false\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 数据库字段名字(DISABLE_TYPE) 或 静态的字段(0:否/1:是)\r\n list: {\r\n type: String,\r\n default: null,\r\n },\r\n multi: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 获取所有传递的属性\r\nconst attrs = useAttrs();\r\n\r\n// 过滤属性,排除组件内部使用的属性\r\nconst filteredAttrs = computed(() => {\r\n const { list, multi, ...rest } = attrs;\r\n return rest;\r\n});\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 方法定义\r\nconst miscs = () => {\r\n Request.getForm(`dict/misc/list/${props.list}`).then((res) => {\r\n items.value = res.data;\r\n });\r\n};\r\n\r\nconst statc = () => {\r\n if (!props.list) return;\r\n \r\n props.list.split(\"/\").forEach((it) => {\r\n const its = it.split(\":\");\r\n items.value.push({ code: its[0], codeValue: its[1] });\r\n });\r\n};\r\n\r\n// 生命周期钩子\r\nonMounted(() => {\r\n if (props.list) {\r\n if (props.list.includes(\":\")) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n }\r\n});\r\n\r\n// 使用方式\r\n// <vtk-select\r\n// v-model=\"value\"\r\n// list=\"YOUR_LIST\"\r\n// variant=\"outlined\" <!-- 样式变体 -->\r\n// density=\"compact\" <!-- 密度 'default' | 'comfortable' | 'compact' -->\r\n// clearable <!-- 可清除 -->\r\n// placeholder=\"请选择\" <!-- 占位符 -->\r\n// :rules=\"rules\" <!-- 验证规则 -->\r\n// disabled <!-- 禁用状态 -->\r\n// readonly <!-- 只读状态 -->\r\n// hide-details <!-- 隐藏详情信息 -->\r\n// />\r\n\r\n</script>\r\n\r\n<style scoped>\r\n::-webkit-scrollbar {\r\n width: 6px;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n border-radius: 3px;\r\n height: 100px;\r\n background-color: #007acc;\r\n}\r\n</style>","<template>\n <div class=\"vtk-single-page\">\n <v-row class=\"pagination-row ma-0\" align=\"center\" justify=\"end\">\n <template v-if=\"hasTotal\">\n <span class=\"page-total d-none d-md-flex\">共 {{ rowCount }} 条</span>\n\n <v-select\n v-model=\"pagination.limit\"\n :items=\"pageSizeItems\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n class=\"page-select ml-2 d-none d-md-flex\"\n @update:model-value=\"handlePageSizeChange\"\n />\n\n <v-pagination\n v-model=\"currentPage\"\n :length=\"pageCount\"\n :total-visible=\"6\"\n density=\"comfortable\"\n size=\"small\"\n class=\"page-pagination\"\n @update:model-value=\"emitPageChange\"\n />\n\n <span class=\"page-total ml-2 d-none d-md-flex\">到</span>\n <v-text-field\n v-model=\"pagination.pageno\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n inputmode=\"numeric\"\n class=\"page-go ml-2 d-none d-md-flex\"\n @keyup.enter=\"goToPage\"\n />\n <span class=\"page-total ml-2 d-none d-md-flex\">页</span>\n </template>\n\n <template v-else>\n <span class=\"page-total d-none d-md-flex\">第 {{ currentPage }} 页</span>\n\n <v-select\n v-model=\"pagination.limit\"\n :items=\"pageSizeItems\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n class=\"page-select ml-2 d-none d-md-flex\"\n @update:model-value=\"handlePageSizeChange\"\n />\n\n <div class=\"d-flex\">\n <v-btn\n variant=\"outlined\"\n size=\"small\"\n height=\"36\"\n\t\t\tclass=\"mr-2\"\n :disabled=\"currentPage <= 1\"\n @click=\"previousPage\"\n >\n 上一页\n </v-btn>\n <v-btn\n variant=\"outlined\"\n size=\"small\"\n height=\"36\"\n :disabled=\"!hasNextPage\"\n @click=\"nextPage\"\n >\n 下一页\n </v-btn>\n </div>\n </template>\n </v-row>\n </div>\n</template>\n\n<script setup>\nimport { computed, reactive, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkSinglePage'\n});\n\nconst props = defineProps({\n pageData: {\n type: Object,\n default: () => ({})\n },\n pageSizes: {\n type: Array,\n default: () => [15, 20, 30]\n }\n});\n\nconst emit = defineEmits(['pageChange']);\n\nconst normalizePositiveInteger = (value, fallback = 1) => {\n const parsedValue = Number.parseInt(value, 10);\n return Number.isInteger(parsedValue) && parsedValue > 0 ? parsedValue : fallback;\n};\n\nconst initialLimit = computed(() => normalizePositiveInteger(props.pageSizes[0], 15));\nconst currentPage = ref(normalizePositiveInteger(props.pageData.pageno));\nconst pagination = reactive({\n pageno: currentPage.value,\n limit: normalizePositiveInteger(props.pageData.limit, initialLimit.value)\n});\n\nconst rowCount = computed(() => Math.max(0, Number(props.pageData.rowCount) || 0));\nconst pageCount = computed(() => normalizePositiveInteger(props.pageData.pageCount));\nconst hasTotal = computed(() => rowCount.value > 0);\nconst pageSizeItems = computed(() => props.pageSizes.map(value => ({\n title: `${value} 条/页`,\n value\n})));\nconst rowLength = computed(() => {\n if (Array.isArray(props.pageData.rows)) {\n return props.pageData.rows.length;\n }\n\n return Number.isFinite(Number(props.pageData.rows))\n ? Number(props.pageData.rows)\n : null;\n});\nconst hasNextPage = computed(() => (\n rowLength.value === null || rowLength.value >= Number(pagination.limit)\n));\n\nwatch(\n () => props.pageData,\n newValue => {\n currentPage.value = normalizePositiveInteger(newValue.pageno, currentPage.value);\n pagination.pageno = currentPage.value;\n\n if (newValue.limit != null) {\n pagination.limit = normalizePositiveInteger(newValue.limit, pagination.limit);\n }\n },\n { deep: true }\n);\n\nwatch(currentPage, value => {\n pagination.pageno = value;\n});\n\nwatch(\n () => props.pageSizes,\n values => {\n if (!values.some(value => Number(value) === Number(pagination.limit))) {\n pagination.limit = initialLimit.value;\n }\n },\n { deep: true }\n);\n\nconst emitPageChange = () => {\n emit('pageChange', {\n pageno: currentPage.value,\n limit: Number(pagination.limit)\n });\n};\n\nconst goToPage = () => {\n const targetPage = Number(pagination.pageno);\n\n if (Number.isInteger(targetPage) && targetPage >= 1 && targetPage <= pageCount.value) {\n currentPage.value = targetPage;\n emitPageChange();\n return;\n }\n\n pagination.pageno = currentPage.value;\n};\n\nconst handlePageSizeChange = () => {\n currentPage.value = 1;\n emitPageChange();\n};\n\nconst previousPage = () => {\n if (currentPage.value <= 1) return;\n\n currentPage.value -= 1;\n emitPageChange();\n};\n\nconst nextPage = () => {\n if (!hasNextPage.value) return;\n\n currentPage.value += 1;\n emitPageChange();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.vtk-single-page {\n width: 100%;\n min-height: 60px;\n}\n\n.pagination-row {\n min-height: 60px;\n padding: 8px 16px;\n}\n\n.page-total {\n align-items: center;\n min-height: 36px;\n color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));\n font-size: 13px;\n}\n\n.page-select {\n max-width: 120px;\n}\n\n.page-go {\n max-width: 72px;\n}\n\n.page-select,\n.page-go {\n :deep(.v-input__control),\n :deep(.v-field) {\n min-height: 36px;\n height: 36px;\n font-size: 13px;\n }\n\n :deep(.v-field__input) {\n min-height: 36px;\n padding-top: 4px;\n padding-bottom: 4px;\n }\n}\n\n.page-pagination {\n :deep(.v-pagination__item),\n :deep(.v-pagination__prev),\n :deep(.v-pagination__next) {\n font-size: 13px;\n }\n}\n</style>\n","<template>\r\n\t<VStepper class=\"elevation-0\" v-model=\"stepIndex\">\r\n\t\t<VStepperHeader class=\"elevation-0\" style=\"overflow: hidden;\">\r\n\t\t\t<VRow class=\"stepList\">\r\n\t\t\t\t<VCol class=\"pl-0 colItem\" v-for=\"(item, index) in step\" :key=\"index\" style=\"\">\r\n\t\t\t\t\t<div class=\"first-box1 last-box pl-10 py-5 stepItem\" :class=\"stepIndex > index? 'selected' : ''\"\r\n\t\t\t\t\t\t:complete=\"stepIndex > index\" :step=\"index + 1\">\r\n\t\t\t\t\t\t{{ item }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</VCol>\r\n\t\t\t</VRow>\r\n\t\t</VStepperHeader>\r\n\r\n\t\t<VStepperWindow>\r\n\t\t\t<VStepperWindowItem v-for=\"(item, index) in list\" :key=\"index\" :value=\"index + 1\">\r\n\t\t\t\t<slot :name=\"index + 1\"></slot>\r\n\t\t\t</VStepperWindowItem>\r\n\t\t\t<slot></slot>\r\n\t\t</VStepperWindow>\r\n\t</VStepper>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onMounted } from 'vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n\tname: \"VtkStepper\",\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n\tlist: {\r\n\t\ttype: String,\r\n\t\tdefault: null,\r\n\t},\r\n\tel: {\r\n\t\ttype: Number,\r\n\t\tdefault: 1,\r\n\t},\r\n});\r\n\r\n// 响应式数据\r\nconst stepIndex = ref(props.el);\r\nconst step = ref([]);\r\n\r\n// 监听el属性变化\r\nwatch(() => props.el, (val) => {\r\n\tstepIndex.value = val;\r\n});\r\n\r\n// 处理内容\r\nconst content = () => {\r\n\tif (props.list) {\r\n\t\tstep.value = props.list.split(\",\");\r\n\t}\r\n};\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\tcontent();\r\n});\r\n\r\n// 监听list变化\r\nwatch(() => props.list, () => {\r\n\tcontent();\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// 颜色变量定义\r\n$color-background: #c7ccd538;\r\n$color-selected: #165dff;\r\n$color-white: #fff;\r\n$color-light-bg: #f2f3f5;\r\n$color-dark-bg: #1e1e1e;\r\n\r\n.v-stepper__step {\r\n\tbackground: $color-background;\r\n\tposition: relative;\r\n}\r\n\r\n// 隐藏步骤数字\r\n:deep(.v-stepper__step__step) {\r\n\tdisplay: none !important;\r\n}\r\n\r\n.stepItem {\r\n\talign-items: center;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tpadding: 24px;\r\n\tposition: relative;\r\n\tbackground: $color-background;\r\n\r\n\t// 暗色主题样式\r\n\t.v-theme--dark & {\r\n\t\tcolor: rgba(255, 255, 255, 0.5);\r\n\t}\r\n\r\n\t// 选中状态\r\n\t&.selected {\r\n\t\tbackground: $color-selected;\r\n\t\tcolor: $color-white !important;\r\n\r\n\t\t&.last-box::after {\r\n\t\t\tborder-color: transparent transparent transparent $color-selected;\r\n\t\t}\r\n\r\n\t\t:deep(.v-stepper__label) {\r\n\t\t\tcolor: $color-white !important;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.colItem {\r\n\t&:first-child .first-box1::before {\r\n\t\tborder-color: transparent !important;\r\n\t}\r\n\r\n\t&:last-child .last-box::after {\r\n\t\tborder-color: transparent !important;\r\n\t}\r\n}\r\n\r\n.first-box1::before {\r\n\tposition: absolute;\r\n\tleft: 0;\r\n\tcontent: \"\";\r\n\twidth: 0;\r\n\theight: 0;\r\n\tz-index: 0;\r\n\tborder: 30px solid;\r\n\tborder-color: transparent transparent transparent rgb(var(--v-theme-surface));\r\n\r\n\t.v-theme--dark & {\r\n\t\tborder-color: transparent transparent transparent rgb(var(--v-theme-surface));\r\n\t}\r\n}\r\n\r\n.last-box::after {\r\n\tposition: absolute;\r\n\tright: -70px;\r\n\tcontent: \"\";\r\n\tz-index: 1;\r\n\twidth: 0;\r\n\theight: 0;\r\n\tborder: 35px solid;\r\n\tborder-color: transparent transparent transparent $color-light-bg;\r\n\r\n\t.v-theme--dark & {\r\n\t\tborder-color: transparent transparent transparent $color-background;\r\n\t}\r\n}\r\n\r\n.theme--dark.v-stepper {\r\n\tbackground: transparent;\r\n}\r\n</style>","<template>\n <div class=\"vtk-upload\">\n <!-- 拖拽 / 点击上传区域 -->\n <div\n v-if=\"listType !== 'picture-card' && !detail\"\n :class=\"['vtk-upload__dragger', { 'is-dragover': isDragover, 'is-disabled': disabled }]\"\n title=\"点击上传\"\n @click=\"!disabled && triggerInput()\"\n @dragover.prevent=\"onDragover\"\n @dragleave.prevent=\"isDragover = false\"\n @drop.prevent=\"onDrop\"\n >\n <slot>\n <div class=\"vtk-upload__dragger-inner\">\n <VIcon size=\"40\" color=\"grey-lighten-1\">mdi-cloud-upload-outline</VIcon>\n <div class=\"text-body-2 mt-2 text-grey\">将文件拖到此处,或 <span class=\"text-primary\" style=\"cursor:pointer\">点击上传</span></div>\n <div v-if=\"tip\" class=\"text-caption text-grey-lighten-1 mt-1\">{{ tip }}</div>\n </div>\n </slot>\n </div>\n\n <!-- picture-card 模式 -->\n <div v-if=\"listType === 'picture-card'\" class=\"vtk-upload__picture-card-wrap\">\n <div\n v-for=\"file in fileList\"\n :key=\"file.uid\"\n class=\"vtk-upload__picture-card-item\"\n >\n <v-img :key=\"file.url || file.preview || file.uid\" :src=\"file.url || file.preview\" cover class=\"fill-height\" />\n <div class=\"vtk-upload__picture-card-mask\">\n <VBtn icon size=\"x-small\" variant=\"text\" color=\"white\" title=\"查看\" @click.stop=\"handlePreview(file)\">\n <VIcon>mdi-eye</VIcon>\n </VBtn>\n <VBtn v-if=\"!disabled && !detail\" icon size=\"x-small\" variant=\"text\" color=\"white\" title=\"删除\" @click.stop=\"handleRemove(file)\">\n <VIcon>mdi-delete</VIcon>\n </VBtn>\n </div>\n <!-- 上传进度 -->\n <div v-if=\"file.status === 'uploading'\" class=\"vtk-upload__picture-card-progress\">\n <v-progress-circular :model-value=\"file.percentage\" size=\"36\" color=\"white\" />\n </div>\n </div>\n\n <!-- 添加按钮 -->\n <div\n v-if=\"!disabled && !detail && (limit === 0 || fileList.length < limit)\"\n :class=\"['vtk-upload__picture-card-add', { 'is-dragover': isDragover }]\"\n title=\"添加文件\"\n @click=\"triggerInput()\"\n @dragover.prevent=\"onDragover\"\n @dragleave.prevent=\"isDragover = false\"\n @drop.prevent=\"onDrop\"\n >\n <VIcon size=\"28\" color=\"grey-lighten-1\">mdi-plus</VIcon>\n </div>\n </div>\n\n <!-- 隐藏的 input -->\n <input\n ref=\"inputRef\"\n type=\"file\"\n class=\"vtk-upload__input\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n @change=\"onInputChange\"\n />\n\n <!-- 文件列表 (非 picture-card) -->\n <div v-if=\"showFileList && listType !== 'picture-card' && fileList.length > 0\" class=\"vtk-upload__list mt-2\">\n <div\n v-for=\"file in fileList\"\n :key=\"file.uid\"\n :class=\"['vtk-upload__list-item', `is-${file.status}`]\"\n style=\"cursor: pointer;\"\n >\n <VIcon size=\"18\" class=\"mr-1\" :color=\"file.status === 'error' ? 'error' : 'primary'\">\n {{ fileIcon(file) }}\n </VIcon>\n <span class=\"vtk-upload__list-item-name flex-grow-1 text-truncate\" @click=\"handlePreview(file)\" :title=\"file.name\">{{ file.name }}</span>\n <span v-if=\"file.status === 'uploading'\" class=\"text-caption text-grey ml-2\">{{ file.percentage }}%</span>\n <VBtn\n v-if=\"!disabled && !detail\"\n icon\n size=\"x-small\"\n variant=\"text\"\n color=\"grey\"\n class=\"ml-1\"\n title=\"删除\"\n @click=\"handleRemove(file)\"\n >\n <VIcon size=\"16\">mdi-close</VIcon>\n </VBtn>\n <!-- 进度条 -->\n <v-progress-linear\n v-if=\"file.status === 'uploading'\"\n :model-value=\"file.percentage\"\n color=\"primary\"\n class=\"vtk-upload__list-progress\"\n height=\"2\"\n />\n </div>\n </div>\n\n <!-- 预览 Dialog -->\n <VDialog v-model=\"previewVisible\" fullscreen scrollable @click:outside=\"closePreview\">\n <VCard class=\"vtk-upload__preview-card\">\n <v-toolbar color=\"primary\" density=\"comfortable\">\n <v-toolbar-title class=\"text-truncate\">{{ previewFile?.name }}</v-toolbar-title>\n <VSpacer />\n <VBtn icon variant=\"text\" title=\"新窗口打开\" @click=\"openCurrentPreview\">\n <VIcon>mdi-open-in-new</VIcon>\n </VBtn>\n <template v-if=\"isImage(previewFile)\">\n <VBtn icon variant=\"text\" :disabled=\"!hasPreviewPrev\" title=\"上一张\" @click=\"switchPreviewImage(-1)\">\n <VIcon>mdi-chevron-left</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" :disabled=\"!hasPreviewNext\" title=\"下一张\" @click=\"switchPreviewImage(1)\">\n <VIcon>mdi-chevron-right</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"缩小\" @click=\"zoomPreview(-0.3)\">\n <VIcon>mdi-magnify-minus-outline</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"放大\" @click=\"zoomPreview(0.3)\">\n <VIcon>mdi-magnify-plus-outline</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"向左旋转\" @click=\"rotatePreview(-90)\">\n <VIcon>mdi-rotate-left</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"向右旋转\" @click=\"rotatePreview(90)\">\n <VIcon>mdi-rotate-right</VIcon>\n </VBtn>\n <VBtn icon variant=\"text\" title=\"重置\" @click=\"resetPreviewTransform\">\n <VIcon>mdi-refresh</VIcon>\n </VBtn>\n </template>\n <VBtn icon variant=\"text\" title=\"关闭\" @click=\"closePreview\">\n <VIcon>mdi-close</VIcon>\n </VBtn>\n </v-toolbar>\n <div class=\"vtk-upload__preview-body\">\n <VBtn\n v-if=\"isImage(previewFile) && hasPreviewPrev\"\n icon\n class=\"vtk-upload__preview-nav vtk-upload__preview-nav--prev\"\n title=\"上一张\"\n @click.stop=\"switchPreviewImage(-1)\"\n >\n <VIcon size=\"36\">mdi-chevron-left</VIcon>\n </VBtn>\n <VBtn\n v-if=\"isImage(previewFile) && hasPreviewNext\"\n icon\n class=\"vtk-upload__preview-nav vtk-upload__preview-nav--next\"\n title=\"下一张\"\n @click.stop=\"switchPreviewImage(1)\"\n >\n <VIcon size=\"36\">mdi-chevron-right</VIcon>\n </VBtn>\n <div v-if=\"isImage(previewFile)\" class=\"vtk-upload__preview-image-wrap\">\n <img\n class=\"vtk-upload__preview-image\"\n :src=\"previewFile?._previewSrc\"\n :alt=\"previewFile?.name\"\n :style=\"previewImageStyle\"\n draggable=\"false\"\n @pointerdown=\"startPreviewDrag\"\n />\n </div>\n <div v-else class=\"vtk-upload__preview-empty\">\n <VIcon size=\"64\">{{ isExcel(previewFile) ? 'mdi-microsoft-excel' : 'mdi-file-outline' }}</VIcon>\n <div class=\"mt-2\">{{ previewFile?.name }}</div>\n <div class=\"text-caption mt-1\">This file cannot be previewed online.</div>\n </div>\n </div>\n </VCard>\n </VDialog>\n </div>\n</template>\n\n<script setup>\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\nimport Request from '../../commons/request.js';\n\ndefineOptions({\n name: 'VtkUpload',\n inheritAttrs: false,\n});\n\nconst props = defineProps({\n /** v-model 文件列表 */\n modelValue: {\n type: Array,\n default: () => [],\n },\n /** 上传地址 */\n action: {\n type: String,\n default: '',\n },\n /** 接受的文件类型,同原生 accept */\n accept: {\n type: String,\n default: '',\n },\n /** 是否多选 */\n multiple: {\n type: Boolean,\n default: false,\n },\n /** 最大上传数量,0 表示不限制 */\n limit: {\n type: Number,\n default: 0,\n },\n /** 单文件最大体积,单位 MB,0 表示不限制 */\n maxSize: {\n type: Number,\n default: 0,\n },\n /** 单张图片最大像素(宽*高),超过则拒绝上传;传 0 表示不限制 */\n maxPixels: {\n type: Number,\n default: 50_000_000,\n },\n /** 列表类型:text | picture | picture-card */\n listType: {\n type: String,\n default: 'text',\n validator: (v) => ['text', 'picture', 'picture-card'].includes(v),\n },\n /** 是否显示文件列表 */\n showFileList: {\n type: Boolean,\n default: true,\n },\n /** 是否自动上传 */\n autoUpload: {\n type: Boolean,\n default: true,\n },\n /** 是否禁用 */\n disabled: {\n type: Boolean,\n default: false,\n },\n /** 详情模式:隐藏上传和删除入口,仅展示已上传文件并保留查看 */\n detail: {\n type: Boolean,\n default: false,\n },\n /** 附加请求头 */\n headers: {\n type: Object,\n default: () => ({}),\n },\n /** 附加请求数据 */\n data: {\n type: Object,\n default: () => ({}),\n },\n /** 文件字段名 */\n name: {\n type: String,\n default: 'file',\n },\n /** 提示文字 */\n tip: {\n type: String,\n default: '',\n },\n /** 上传前钩子,返回 false 或 rejected Promise 则停止上传 */\n beforeUpload: {\n type: Function,\n default: null,\n },\n /** 移除前钩子 */\n beforeRemove: {\n type: Function,\n default: null,\n },\n});\n\nconst emit = defineEmits([\n 'update:modelValue',\n 'change',\n 'success',\n 'error',\n 'progress',\n 'remove',\n 'exceed',\n 'preview',\n]);\n\n/* -------------------- 内部状态 -------------------- */\nconst inputRef = ref(null);\nconst isDragover = ref(false);\nconst previewVisible = ref(false);\nconst previewFile = ref(null);\nconst previewScale = ref(1);\nconst previewRotation = ref(0);\nconst previewTranslateX = ref(0);\nconst previewTranslateY = ref(0);\nconst previewDragState = ref(null);\n\n// 内部维护文件列表\nconst fileList = ref([]);\nlet isSyncingModel = false;\nconst localPreviewUrls = new Set();\n\nwatch(\n () => props.modelValue,\n (val) => {\n if (isSyncingModel) {\n isSyncingModel = false;\n return;\n }\n\n // Accept external URL lists or file object lists.\n revokeAllLocalPreviews();\n fileList.value = normalizeFileList(val || []);\n },\n);\n\n/* -------------------- 工具函数 -------------------- */\nlet uidCounter = 0;\nconst genUid = () => `vtk-upload-${Date.now()}-${uidCounter++}`;\n\nconst getFileNameFromUrl = (url) => {\n const cleanUrl = String(url || '').split('?')[0].split('#')[0];\n const name = cleanUrl.substring(cleanUrl.lastIndexOf('/') + 1);\n try {\n return decodeURIComponent(name || cleanUrl || 'file');\n } catch (e) {\n return name || cleanUrl || 'file';\n }\n};\n\nconst isImageUrl = (url) => {\n const value = String(url || '');\n const cleanUrl = value.split('?')[0].split('#')[0];\n return /^data:image\\//i.test(value) || /\\.(png|jpg|jpeg|gif|bmp|webp|svg)$/i.test(cleanUrl);\n};\n\nconst readUInt16BE = (bytes, offset) => (bytes[offset] << 8) | bytes[offset + 1];\nconst readUInt16LE = (bytes, offset) => bytes[offset] | (bytes[offset + 1] << 8);\nconst readUInt32BE = (bytes, offset) => (\n ((bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3]) >>> 0\n);\n\n// 按字节解析图片头部宽高(PNG / JPEG / GIF / WEBP),禁止整图解码。\n// 与 VtkImg.vue 的解析保持同一套实现,避免两处漂移。\nconst parseDimensions = (bytes) => {\n const length = bytes.length;\n if (length < 24) return { w: 0, h: 0 };\n\n // PNG:魔数 89 50 4E 47,IHDR 后宽 16 / 高 20(大端 uint32)\n if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {\n return { w: readUInt32BE(bytes, 16), h: readUInt32BE(bytes, 20) };\n }\n\n // GIF:魔数 GIF8,宽 6-7 / 高 8-9(小端 uint16)\n if (bytes[0] === 0x47 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x38) {\n return { w: readUInt16LE(bytes, 6), h: readUInt16LE(bytes, 8) };\n }\n\n // JPEG:扫 SOF 段(0xC0–0xCF,排除 C4/C8/CC),以 marker 为基准:高在 +4、宽在 +6(大端 uint16)\n if (bytes[0] === 0xff && bytes[1] === 0xd8) {\n const sofMarkers = new Set([\n 0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf,\n ]);\n let offset = 2;\n while (offset + 9 < length) {\n if (bytes[offset] !== 0xff) { offset += 1; continue; }\n let p = offset;\n while (p < length && bytes[p] === 0xff) p += 1; // 跳过填充 0xFF,p 落在 marker 上\n if (p >= length - 1) break;\n const marker = bytes[p];\n if (marker === 0x00 || marker === 0xd8 || marker === 0xd9) { offset = p + 1; continue; }\n if (sofMarkers.has(marker)) {\n // 段结构 [FF][marker][len:2][precision:1][height:2][width:2],一律以 marker 为基准\n return { w: readUInt16BE(bytes, p + 6), h: readUInt16BE(bytes, p + 4) };\n }\n if (p + 2 >= length) break;\n // 段长字段在 marker 之后的 p+1 / p+2\n const segLength = readUInt16BE(bytes, p + 1);\n if (segLength < 2) break;\n offset = p + 1 + segLength;\n }\n }\n\n // WEBP:RIFF....WEBP\n if (\n length >= 30\n && bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46\n && bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50\n ) {\n const fourcc = String.fromCharCode(bytes[12], bytes[13], bytes[14], bytes[15]);\n if (fourcc === 'VP8X') {\n return {\n w: 1 + (bytes[24] | (bytes[25] << 8) | (bytes[26] << 16)),\n h: 1 + (bytes[27] | (bytes[28] << 8) | (bytes[29] << 16)),\n };\n }\n if (fourcc === 'VP8 ') {\n return {\n w: bytes[26] | ((bytes[27] & 0x3f) << 8),\n h: bytes[28] | ((bytes[29] & 0x3f) << 8),\n };\n }\n if (fourcc === 'VP8L' && length >= 25) {\n // VP8L:width-1 占低 14 位,height-1 占次 14 位(小端 32 位)\n const bits = (bytes[21] | (bytes[22] << 8) | (bytes[23] << 16) | ((bytes[24] << 24) >>> 0)) >>> 0;\n return { w: 1 + (bits & 0x3fff), h: 1 + ((bits >> 14) & 0x3fff) };\n }\n }\n\n return { w: 0, h: 0 };\n};\n\n// 只读本地文件头部 64KB 拿尺寸;解析不出(非以上格式 / 字节不足)返回 null\nconst parseImageSizeFromFile = async (raw) => {\n if (!(raw instanceof Blob)) return null;\n try {\n const buffer = await raw.slice(0, 64 * 1024).arrayBuffer();\n const { w, h } = parseDimensions(new Uint8Array(buffer));\n if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) return null;\n return { w, h };\n } catch (error) {\n return null;\n }\n};\n\n// 像素数格式化:1234万 / 5亿 / 5000万\nconst formatPixelCount = (value) => {\n if (value >= 1e8) return `${Number((value / 1e8).toFixed(1))}亿`;\n if (value >= 1e4) return `${Math.round(value / 1e4)}万`;\n return String(value);\n};\n\n// 拦截反馈:优先用全局 toast,找不到则降级 alert\nconst showBlockMessage = (message) => {\n try {\n const toast = window.$vtk?.message?.toast;\n if (typeof toast === 'function') {\n toast(message, { color: 'error' });\n return;\n }\n } catch (error) {\n console.warn('VtkUpload: failed to show message toast', error);\n }\n window.alert?.(message);\n};\n\nconst normalizeFileList = (value) => {\n if (!Array.isArray(value)) return [];\n\n return value\n .filter((item) => item)\n .map((item) => {\n if (typeof item === 'string') {\n return {\n uid: genUid(),\n name: getFileNameFromUrl(item),\n size: 0,\n type: props.listType === 'picture-card' || isImageUrl(item) ? 'image/*' : '',\n status: 'success',\n percentage: 100,\n raw: null,\n url: item,\n preview: '',\n response: null,\n };\n }\n\n return {\n uid: item.uid || genUid(),\n name: item.name || getFileNameFromUrl(item.url || item.preview),\n size: item.size || 0,\n type: item.type || (props.listType === 'picture-card' && (item.url || item.preview) ? 'image/*' : ''),\n status: item.status || 'success',\n percentage: item.percentage ?? 100,\n raw: item.raw || null,\n url: item.url || '',\n preview: item.preview || '',\n response: item.response || null,\n ...item,\n };\n });\n};\n\nfileList.value = normalizeFileList(props.modelValue || []);\n\nconst isImage = (file) => {\n if (!file) return false;\n return /image\\//.test(file.type) || isImageUrl(file.name) || isImageUrl(file.url) || isImageUrl(file.preview);\n};\n\nconst fileIcon = (file) => {\n if (file.status === 'error') return 'mdi-file-alert-outline';\n if (isImage(file)) return 'mdi-file-image-outline';\n return 'mdi-file-outline';\n};\n\nconst getPreviewSrc = (file) => file?.url || file?.preview || '';\n\nconst revokeLocalPreview = (file) => {\n const preview = file?.preview;\n if (preview && localPreviewUrls.has(preview)) {\n URL.revokeObjectURL(preview);\n localPreviewUrls.delete(preview);\n }\n};\n\nconst revokeAllLocalPreviews = () => {\n fileList.value.forEach(revokeLocalPreview);\n localPreviewUrls.forEach((url) => URL.revokeObjectURL(url));\n localPreviewUrls.clear();\n};\n\nconst previewImageList = computed(() => fileList.value.filter((file) => isImage(file) && getPreviewSrc(file)));\n\nconst previewImageIndex = computed(() => {\n if (!previewFile.value) return -1;\n return previewImageList.value.findIndex((file) => file.uid === previewFile.value.uid);\n});\n\nconst hasPreviewPrev = computed(() => previewImageIndex.value > 0);\nconst hasPreviewNext = computed(() => previewImageIndex.value >= 0 && previewImageIndex.value < previewImageList.value.length - 1);\n\nconst previewImageStyle = computed(() => ({\n transform: `translate(${previewTranslateX.value}px, ${previewTranslateY.value}px) scale(${previewScale.value}) rotate(${previewRotation.value}deg)`,\n}));\n\n/* -------------------- 触发 input -------------------- */\nconst triggerInput = () => {\n inputRef.value && inputRef.value.click();\n};\n\n/* -------------------- 拖拽 -------------------- */\nconst onDragover = () => {\n if (!props.disabled && !props.detail) isDragover.value = true;\n};\n\nconst onDrop = (e) => {\n isDragover.value = false;\n if (props.disabled || props.detail) return;\n processFiles(Array.from(e.dataTransfer.files));\n};\n\n/* -------------------- input change -------------------- */\nconst onInputChange = (e) => {\n if (props.disabled || props.detail) return;\n processFiles(Array.from(e.target.files));\n // 清空,允许重复选同一文件\n e.target.value = '';\n};\n\n/* -------------------- 文件处理 -------------------- */\n// 逐个文件顺序处理:分辨率检查里有 await,用 forEach 会导致\"谁先解析完谁先进列表\",\n// 与用户选择顺序不一致。\nconst processFiles = async (rawFiles) => {\n if (!rawFiles.length) return;\n\n // 数量限制检查\n if (props.limit > 0 && fileList.value.length + rawFiles.length > props.limit) {\n emit('exceed', rawFiles, fileList.value);\n return;\n }\n\n for (const raw of rawFiles) {\n // 体积检查\n if (props.maxSize > 0 && raw.size / 1024 / 1024 > props.maxSize) {\n const errFile = buildFile(raw, 'error');\n emit('error', new Error(`文件 ${raw.name} 超过最大限制 ${props.maxSize}MB`), errFile, fileList.value);\n continue;\n }\n\n // 分辨率检查:只读图片头部字节。\n // 读到且超阈值 → 拦截;读不出尺寸(格式不支持 / 字节不足)→ 直接放行。\n if (props.maxPixels > 0 && isImage(raw)) {\n const dims = await parseImageSizeFromFile(raw);\n if (dims && dims.w * dims.h > props.maxPixels) {\n const errFile = buildFile(raw, 'error');\n const message = `图片 ${raw.name} 分辨率 ${dims.w}×${dims.h},超出允许上限(${formatPixelCount(props.maxPixels)} 像素以内)`;\n showBlockMessage(message);\n emit('error', new Error(message), errFile, fileList.value);\n continue;\n }\n }\n\n const file = buildFile(raw, 'ready');\n\n // 生成本地预览地址,保证 picture-card 选图后立即回显缩略图。\n if (isImage(raw)) {\n if (typeof URL !== 'undefined' && URL.createObjectURL) {\n file.preview = URL.createObjectURL(raw);\n localPreviewUrls.add(file.preview);\n } else {\n const reader = new FileReader();\n reader.onload = (e) => {\n file.preview = e.target.result;\n emit('change', file, fileList.value);\n };\n reader.readAsDataURL(raw);\n }\n }\n\n const beforeHook = props.beforeUpload ? props.beforeUpload(raw) : true;\n Promise.resolve(beforeHook).then((result) => {\n if (result === false) return;\n addFile(file);\n if (props.autoUpload && props.action) {\n uploadFile(file);\n }\n }).catch(() => {});\n }\n};\n\nconst buildFile = (raw, status) => ({\n uid: genUid(),\n name: raw.name,\n size: raw.size,\n type: raw.type,\n status,\n percentage: 0,\n raw,\n url: '',\n preview: '',\n response: null,\n});\n\nconst addFile = (file) => {\n fileList.value.push(file);\n syncModel();\n emit('change', file, fileList.value);\n};\n\nconst syncModel = () => {\n const urls = fileList.value\n .filter((f) => f.status === 'success' && f.url)\n .map((f) => String(f.url));\n isSyncingModel = true;\n emit('update:modelValue', urls);\n nextTick(() => {\n isSyncingModel = false;\n });\n};\n\n/* -------------------- 上传逻辑 -------------------- */\nconst uploadFile = (file) => {\n file.status = 'uploading';\n const formData = new FormData();\n formData.append(props.name, file.raw);\n Object.entries(props.data).forEach(([k, v]) => formData.append(k, v));\n\n // 使用 axios 直接调,以获得 onUploadProgress\n const tokenKey = window.VTK_CONFIG?.storageKeys?.token || '_mis_acis_token';\n const token = window.$vtk?.storage?.get(tokenKey) || localStorage.getItem(tokenKey);\n\n const headers = {\n 'content-type': 'multipart/form-data',\n ...props.headers,\n };\n if (token) headers['Authorization'] = `Bearer ${token}`;\n\n Request.http(props.action, formData, 'POST', headers).then((res) => {\n file.status = 'success';\n file.response = res;\n // 兼容 { data: 'url' } 和 { data: { url: '...' } } 两种结构\n const url = typeof res?.data === 'string' ? res.data : (res?.data?.url || res?.url || '');\n if (url) {\n file.url = url;\n revokeLocalPreview(file);\n }\n console.log('[VtkUpload] res:', res, '| file.url:', file.url, '| fileList:', JSON.parse(JSON.stringify(fileList.value)));\n syncModel();\n emit('success', res, file, fileList.value);\n emit('change', file, fileList.value);\n }).catch((err) => {\n file.status = 'error';\n syncModel();\n emit('error', err, file, fileList.value);\n emit('change', file, fileList.value);\n });\n};\n\n/* -------------------- 移除文件 -------------------- */\nconst handleRemove = (file) => {\n const doRemove = () => {\n revokeLocalPreview(file);\n fileList.value = fileList.value.filter((f) => f.uid !== file.uid);\n syncModel();\n emit('remove', file, fileList.value);\n };\n\n if (props.beforeRemove) {\n Promise.resolve(props.beforeRemove(file, fileList.value)).then((result) => {\n if (result !== false) doRemove();\n }).catch(() => {});\n } else {\n doRemove();\n }\n};\n\n/* -------------------- 预览 -------------------- */\nconst isExcel = (file) => /\\.(xlsx|xls)$/i.test(file?.name || '');\n\nconst resetPreviewTransform = () => {\n previewScale.value = 1;\n previewRotation.value = 0;\n previewTranslateX.value = 0;\n previewTranslateY.value = 0;\n};\n\nconst closePreview = () => {\n previewVisible.value = false;\n};\n\nconst rotatePreview = (degrees) => {\n previewRotation.value += degrees;\n};\n\nconst zoomPreview = (step) => {\n const nextScale = Number((previewScale.value + step).toFixed(2));\n previewScale.value = Math.min(3, Math.max(0.2, nextScale));\n};\n\nconst setImagePreviewFile = (file) => {\n previewFile.value = {\n ...file,\n _previewSrc: getPreviewSrc(file),\n };\n resetPreviewTransform();\n};\n\nconst switchPreviewImage = (step) => {\n if (!isImage(previewFile.value)) return;\n\n const index = previewImageIndex.value;\n const nextFile = previewImageList.value[index + step];\n if (!nextFile) return;\n\n emit('preview', nextFile);\n setImagePreviewFile(nextFile);\n};\n\nconst handlePreviewKeydown = (event) => {\n if (!previewVisible.value || !isImage(previewFile.value)) return;\n\n if (event.key === 'ArrowLeft' && hasPreviewPrev.value) {\n event.preventDefault();\n switchPreviewImage(-1);\n }\n\n if (event.key === 'ArrowRight' && hasPreviewNext.value) {\n event.preventDefault();\n switchPreviewImage(1);\n }\n};\n\nconst startPreviewDrag = (event) => {\n if (previewScale.value <= 1) return;\n event.preventDefault();\n const target = event.currentTarget;\n previewDragState.value = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n translateX: previewTranslateX.value,\n translateY: previewTranslateY.value,\n };\n target.setPointerCapture?.(event.pointerId);\n target.addEventListener('pointermove', movePreviewDrag);\n target.addEventListener('pointerup', endPreviewDrag, { once: true });\n target.addEventListener('pointercancel', endPreviewDrag, { once: true });\n};\n\nconst movePreviewDrag = (event) => {\n const state = previewDragState.value;\n if (!state || state.pointerId !== event.pointerId) return;\n previewTranslateX.value = state.translateX + event.clientX - state.startX;\n previewTranslateY.value = state.translateY + event.clientY - state.startY;\n};\n\nconst endPreviewDrag = (event) => {\n event.currentTarget?.releasePointerCapture?.(event.pointerId);\n event.currentTarget?.removeEventListener('pointermove', movePreviewDrag);\n previewDragState.value = null;\n};\n\nconst openFileInNewTab = (file, fileUrl) => {\n if (fileUrl) {\n window.open(fileUrl, '_blank');\n return;\n }\n\n if (file.raw instanceof File || file.raw instanceof Blob) {\n const blobUrl = URL.createObjectURL(file.raw);\n const win = window.open(blobUrl, '_blank');\n win?.addEventListener('unload', () => URL.revokeObjectURL(blobUrl));\n }\n};\n\nconst openCurrentPreview = () => {\n if (!previewFile.value) return;\n openFileInNewTab(previewFile.value, previewFile.value._previewSrc || previewFile.value.url || previewFile.value.preview);\n};\n\nconst handlePreview = (file) => {\n emit('preview', file);\n\n const fileUrl = getPreviewSrc(file);\n\n // Non-image files open in a new tab.\n if (!isImage(file) && !isExcel(file)) {\n openFileInNewTab(file, fileUrl);\n return;\n }\n\n // Excel:Office Online 查看器(需要文件有公网 URL)\n if (isExcel(file)) {\n if (fileUrl && /^https?:\\/\\//.test(fileUrl)) {\n window.open(`https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(fileUrl)}`, '_blank');\n } else {\n // Excel without a public URL falls back to the dialog hint.\n previewFile.value = { ...file, _previewSrc: fileUrl };\n resetPreviewTransform();\n previewVisible.value = true;\n }\n return;\n }\n\n // Images preview inside the dialog.\n setImagePreviewFile(file);\n previewVisible.value = true;\n};\n\nwatch(previewVisible, (visible) => {\n if (visible) {\n window.addEventListener('keydown', handlePreviewKeydown);\n return;\n }\n\n window.removeEventListener('keydown', handlePreviewKeydown);\n resetPreviewTransform();\n});\n\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', handlePreviewKeydown);\n revokeAllLocalPreviews();\n});\n\n/* -------------------- 对外暴露方法 -------------------- */\n/** 手动触发未上传文件的上传 */\nconst submit = () => {\n fileList.value\n .filter((f) => f.status === 'ready' && props.action)\n .forEach(uploadFile);\n};\n\n/** 清空文件列表 */\nconst clearFiles = () => {\n revokeAllLocalPreviews();\n fileList.value = [];\n syncModel();\n};\n\n/** 手动移除某个文件 */\nconst remove = (file) => handleRemove(file);\n\ndefineExpose({ submit, clearFiles, remove });\n</script>\n\n<style lang=\"scss\" scoped>\n.vtk-upload {\n width: 100%;\n}\n\n/* ---- 拖拽区域 ---- */\n.vtk-upload__dragger {\n border: 1px dashed rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n padding: 24px 16px;\n text-align: center;\n cursor: pointer;\n transition: border-color 0.2s, background 0.2s;\n background: transparent;\n\n &:hover:not(.is-disabled) {\n border-color: rgb(var(--v-theme-primary));\n }\n\n &.is-dragover {\n border-color: rgb(var(--v-theme-primary));\n background: rgba(var(--v-theme-primary), 0.05);\n }\n\n &.is-disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n}\n\n/* ---- 文件列表 ---- */\n.vtk-upload__list {\n border-top: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n.vtk-upload__list-item {\n position: relative;\n display: flex;\n align-items: center;\n padding: 4px 4px 4px 8px;\n border-radius: 4px;\n font-size: 13px;\n transition: background 0.15s;\n\n &:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n\n &.is-error {\n color: rgb(var(--v-theme-error));\n }\n\n &.is-success .vtk-upload__list-item-name {\n cursor: pointer;\n &:hover { color: rgb(var(--v-theme-primary)); }\n }\n}\n\n.vtk-upload__list-item-name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 500px;\n}\n\n.vtk-upload__list-progress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n/* ---- picture-card ---- */\n.vtk-upload__picture-card-wrap {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.vtk-upload__picture-card-item,\n.vtk-upload__picture-card-add {\n width: 100px;\n height: 100px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.vtk-upload__picture-card-item {\n position: relative;\n border: 1px solid rgba(0, 0, 0, 0.12);\n\n &:hover .vtk-upload__picture-card-mask {\n opacity: 1;\n }\n}\n\n.vtk-upload__picture-card-mask {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.08);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n}\n\n.vtk-upload__picture-card-progress {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vtk-upload__picture-card-add {\n border: 1px dashed rgba(0, 0, 0, 0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: border-color 0.2s, background 0.2s;\n\n &:hover, &.is-dragover {\n border-color: rgb(var(--v-theme-primary));\n background: rgba(var(--v-theme-primary), 0.04);\n }\n}\n\n/* ---- 隐藏 input ---- */\n.vtk-upload__input {\n display: none;\n}\n\n/* ---- preview ---- */\n.vtk-upload__preview-card {\n --vtk-upload-preview-bg: rgba(0, 0, 0, 0.3);\n\n height: 100vh;\n background: var(--vtk-upload-preview-bg);\n}\n\n.vtk-upload__preview-body {\n height: calc(100vh - 64px);\n overflow: auto;\n background: var(--vtk-upload-preview-bg);\n position: relative;\n}\n\n.vtk-upload__preview-nav {\n position: fixed;\n top: 50%;\n z-index: 10;\n width: 50px;\n height: 50px;\n color: #fff;\n background: rgba(0, 0, 0, 0.5);\n transform: translateY(-50%);\n}\n\n.vtk-upload__preview-nav--prev {\n left: 20px;\n}\n\n.vtk-upload__preview-nav--next {\n right: 20px;\n}\n\n.vtk-upload__preview-image-wrap {\n min-width: 100%;\n min-height: 100%;\n padding: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vtk-upload__preview-image {\n display: block;\n max-width: 90vw;\n max-height: calc(100vh - 128px);\n object-fit: contain;\n transform-origin: center center;\n transition: transform 0.2s ease;\n user-select: none;\n cursor: grab;\n touch-action: none;\n\n &:active {\n cursor: grabbing;\n }\n}\n\n.vtk-upload__preview-empty {\n min-height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px;\n color: rgba(var(--v-theme-on-surface), 0.72);\n text-align: center;\n}\n</style>\n","import Request from \"./request.js\";\r\nimport Storage from \"./storage.js\";\r\nimport Message from \"../components/message/index.js\";\r\n\r\nfunction isAid(value) {\r\n const str = String(value || \"\");\r\n return !!str && !/^(https?:)?\\/\\//i.test(str) && !str.includes(\"/\") && !str.includes(\"?\");\r\n\r\n \r\n}\r\n\r\nfunction getLinkFromResponse(data) {\r\n if (!data) {\r\n return \"\";\r\n }\r\n\r\n if (typeof data === \"string\") {\r\n return data;\r\n }\r\n\r\n return data.puri || \"\";\r\n}\r\n\r\nfunction buildUrlWithParams(target, appendParams) {\r\n const queryString = target.includes(\"?\") ? target.split(\"?\")[1] : \"\";\r\n const queryParams = new URLSearchParams(queryString);\r\n const newParams = [];\r\n\r\n Object.entries(appendParams).forEach(([key, value]) => {\r\n if (!key || value === undefined || value === null || value === \"\") {\r\n return;\r\n }\r\n\r\n if (!queryParams.has(key)) {\r\n newParams.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\r\n }\r\n });\r\n\r\n if (!newParams.length) {\r\n return target;\r\n }\r\n\r\n const joinSymbol = target.includes(\"?\") ? \"&\" : \"?\";\r\n return `${target}${joinSymbol}${newParams.join(\"&\")}`;\r\n}\r\n\r\nfunction appendParamsToUrl(targetUrl, appendParams) {\r\n const hashIndex = targetUrl.indexOf(\"#\");\r\n\r\n if (hashIndex === -1) {\r\n return buildUrlWithParams(targetUrl, appendParams);\r\n }\r\n\r\n const baseUrl = targetUrl.slice(0, hashIndex);\r\n const hashRoute = targetUrl.slice(hashIndex + 1);\r\n const newHashRoute = buildUrlWithParams(hashRoute, appendParams);\r\n return `${baseUrl}#${newHashRoute}`;\r\n}\r\n\r\nasync function resolveAidUrl(aid) {\r\n if (!aid) {\r\n return aid;\r\n }\r\n\r\n try {\r\n const res = await Request.postForm(\"/kudas/xfwez/apps\", { aid });\r\n const realUrl = res?.meta?.success ? getLinkFromResponse(res.data) : \"\";\r\n return realUrl || aid;\r\n } catch (error) {\r\n return aid;\r\n }\r\n}\r\n\r\nfunction buildAppendParams(sobject, sroute, stokenKey) {\r\n const appendParams = {};\r\n const storageKey = stokenKey || \"_mis_acis_token\";\r\n const stoken = Storage.get(storageKey);\r\n\r\n if (stoken !== undefined && stoken !== null && stoken !== \"\") {\r\n appendParams.stoken = stoken;\r\n }\r\n\r\n if (sroute) {\r\n appendParams.sroute = sroute;\r\n }\r\n\r\n if (sobject && typeof sobject === \"object\" && Object.keys(sobject).length) {\r\n appendParams.sobject = btoa(encodeURIComponent(JSON.stringify(sobject)));\r\n }\r\n\r\n return appendParams;\r\n}\r\n\r\n/**\r\n * 解析地址中的指定参数值。\r\n * @param {string} name 参数名。\r\n * @param {string} url 要解析的地址,不传时默认使用当前地址。\r\n * @return {string} 参数值;未找到时返回空字符串。\r\n */\r\nexport function GetQueryString(name, url = window.location.href) {\r\n const reg = new RegExp(`[?&]${name}=([^&^#^/]*)`, \"i\");\r\n const res = String(url || \"\").match(reg);\r\n return res ? decodeURIComponent(res[1]) : \"\";\r\n}\r\n\r\n/**\r\n * 追加应用访问参数。\r\n * @param {string} url 链接地址或应用 aid;不传时默认取当前地址。\r\n * @param {Object} sobject 参数对象;会按 `btoa(encodeURIComponent(JSON.stringify(sobject)))` 编码后追加为 `sobject` 参数。\r\n * @param {string} sroute 页面路由标识;传值后会在最终地址中追加 `sroute=xxx`。\r\n * @param {string} stokenKey 取 `stoken` 的存储键名,默认 `_mis_acis_token`。\r\n * @return {Promise<string>} 拼接后的链接地址。\r\n */\r\nexport async function appendAppParams(url, sobject = {}, sroute = \"\", stokenKey = \"_mis_acis_token\") {\r\n if (url === undefined || url === null || url === \"\" || url === 0 || url === \"0\") {\r\n Message.toast(\"应用标识错误\", { color: \"error\" });\r\n return \"\";\r\n }\r\n\r\n const source = url || window.location.href;\r\n\r\n if (!source) {\r\n return \"\";\r\n }\r\n\r\n const targetUrl = isAid(source) ? await resolveAidUrl(source) : source;\r\n return appendParamsToUrl(targetUrl, buildAppendParams(sobject, sroute, stokenKey));\r\n}\r\n","/**\r\n * 将数值转换成中文 '0:未启/1:已启'\r\n * \r\n * @param {*} val 数值\r\n * @param {*} map 值对\r\n * @return {string} 中文值\r\n */\r\nexport function dict(val, map) {\r\n let value = \"\";\r\n if (val && val.includes(\",\")) {\r\n value = val.split(\",\").map(item => pre(item, map)).join();\r\n } else {\r\n value = pre(val, map)\r\n }\r\n return value;\r\n}\r\n\r\nfunction pre(value, map) {\r\n if (value) {\r\n var val = Array.isArray(value) ? value : value.split(\",\");\r\n var maps = map?.split(\"/\");\r\n var results = []; // 创建一个空数组,用于存储匹配到的值\r\n // 遍历 val 数组\r\n for (var j = 0; j < val?.length; j++) {\r\n var currentVal = val[j]; // 获取当前要查找的键\r\n for (var i in maps) {\r\n var kv = maps[i].split(\":\");\r\n if (kv[0] == currentVal) {\r\n results.push(kv[1]); // 将匹配到的值添加到结果数组中\r\n break; // 找到匹配项后,跳出内层循环\r\n }\r\n }\r\n }\r\n return results.length > 0 ? results.join() : \"其他\";\r\n }\r\n\r\n}\r\n\r\n\r\n/**\r\n * 1,2字符残疾类别转换\r\n * \r\n * @param {*} val 数值\r\n * @return {string} 中文值\r\n */\r\nexport function analyType(val) {\r\n if (!val) {\r\n return ''\r\n }\r\n let newVal = ''\r\n let arr = ['视力', '听力', '言语', '肢体', '智力', '精神', '多重']\r\n for (let i = 1; i < 8; i++) {\r\n if (i === 1) {\r\n newVal = val.replace(i.toString(), arr[i - 1])\r\n } else {\r\n newVal = newVal.replace(i.toString(), arr[i - 1])\r\n }\r\n }\r\n return newVal;\r\n}\r\nexport function analyLevel(val) {\r\n if (!val) {\r\n return ''\r\n }\r\n let newVal = ''\r\n let arr = ['一级', '二级', '三级', '四级', '不限等级']\r\n for (let i = 1; i < 7; i++) {\r\n if (i === 1) {\r\n newVal = val.replace(i.toString(), arr[i - 1])\r\n } else {\r\n newVal = newVal.replace(i.toString(), arr[i - 1])\r\n }\r\n }\r\n return newVal;\r\n}","/**\r\n * \r\n * @param {*} value 需格式化的时间\r\n * @param {*} fmt 格式\r\n */\r\nexport function date(value, fmt) {\r\n if (!value || value == '无' || value == null) {\r\n fmt = '无';\r\n return fmt;\r\n }\r\n let getDate = new Date(value)\r\n let o = {\r\n 'M+': getDate.getMonth() + 1,\r\n 'd+': getDate.getDate(),\r\n 'H+': getDate.getHours(),\r\n 'h+': getDate.getHours(),\r\n 'm+': getDate.getMinutes(),\r\n 's+': getDate.getSeconds(),\r\n 'q+': Math.floor((getDate.getMonth() + 3) / 3),\r\n 'S': getDate.getMilliseconds()\r\n }\r\n if (/(y+)/.test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (getDate.getFullYear() + '').substr(4 - RegExp.$1.length))\r\n }\r\n for (let k in o) {\r\n if (new RegExp('(' + k + ')').test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))\r\n }\r\n }\r\n return fmt\r\n\r\n}\r\n\r\n\r\n/**\r\n * 数字格式化 '0,000.00'\r\n * @param {*} val 数值\r\n * @param {*} fmt 格式\r\n * @return {string} 数字字符串\r\n */\r\nexport function num(val, fmt) {\r\n if (isNaN(val) || val === '' || val === null) {\r\n return val;\r\n }\r\n\r\n // 移除了对Strings和Datetime的依赖,这些在当前上下文中未定义\r\n var numValue = parseFloat(val);\r\n var neg = numValue < 0 ? \"-\" : \"\"; // 正负数\r\n var absValue = Math.abs(numValue);\r\n\r\n // 解析格式字符串,确定小数位数\r\n var fix = 0;\r\n if (fmt && fmt.includes('.')) {\r\n fix = fmt.length - fmt.lastIndexOf('.') - 1;\r\n }\r\n\r\n // 是否需要千分位分隔符\r\n var needSep = fmt && fmt.includes(',');\r\n\r\n // 处理小数部分\r\n var xs = fix > 0 ? absValue.toFixed(fix) : Math.round(absValue);\r\n var decimalPart = fix > 0 ? '.' + xs.toString().split('.')[1] : '';\r\n\r\n // 处理整数部分\r\n var integerPart = fix > 0 ? Math.floor(absValue).toString() : xs.toString();\r\n\r\n // 添加千分位分隔符\r\n if (needSep && integerPart.length > 3) {\r\n integerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n }\r\n\r\n return neg + integerPart + decimalPart;\r\n}\r\n\r\n\r\n/**\r\n * 年龄\r\n * @param {*} val 时间 yyyy-MM-dd\r\n * @return {string} 年龄\r\n */\r\nexport function age(val) {\r\n let birthdays = new Date(val.slice(0, 10).replace(/-/g, \"/\"));\r\n let d = new Date();\r\n let age = d.getFullYear() - birthdays.getFullYear() - ((d.getMonth() < birthdays.getMonth() || (d.getMonth() === birthdays.getMonth() && d.getDate() < birthdays.getDate())) ? 1 : 0);\r\n return age;\r\n}\r\n\r\n/**\r\n * 指定中文大于len,用...省略号表示,达到美观效果\r\n * @param {*} val 需格式的中文\r\n * @param {*} len 需格式的长度\r\n */\r\nexport function txt(val, len) {\r\n if (val?.length > len) {\r\n return val.slice(0, len) + \"...\";\r\n } else {\r\n return val;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * 取数据绝对值\r\n * @param {*} val 手机号\r\n */\r\nexport function abs(val) {\r\n return isNaN(val) ? 0 : Math.abs(val)\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/**\r\n * 脱敏手机号码\r\n * @param {*} val 手机号\r\n * @return {string} 手机号码\r\n */\r\nexport function mobile(val) {\r\n return val.replace(/(\\d{3})\\d{4}(\\d{4})/, \"$1****$2\");\r\n}\r\n\r\n\r\n/**\r\n * 脱敏身份证号\r\n * @param {*} val 身份证号\r\n * @return {string} 身份证号\r\n */\r\nexport function idcard(val) {\r\n if (val) {\r\n return val.replace(/^(.{4})(?:\\d+)(.{4})$/, \"$1** **** ****$2\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","export const red = {\n base: '#f44336',\n lighten5: '#ffebee',\n lighten4: '#ffcdd2',\n lighten3: '#ef9a9a',\n lighten2: '#e57373',\n lighten1: '#ef5350',\n darken1: '#e53935',\n darken2: '#d32f2f',\n darken3: '#c62828',\n darken4: '#b71c1c',\n accent1: '#ff8a80',\n accent2: '#ff5252',\n accent3: '#ff1744',\n accent4: '#d50000'\n};\nexport const pink = {\n base: '#e91e63',\n lighten5: '#fce4ec',\n lighten4: '#f8bbd0',\n lighten3: '#f48fb1',\n lighten2: '#f06292',\n lighten1: '#ec407a',\n darken1: '#d81b60',\n darken2: '#c2185b',\n darken3: '#ad1457',\n darken4: '#880e4f',\n accent1: '#ff80ab',\n accent2: '#ff4081',\n accent3: '#f50057',\n accent4: '#c51162'\n};\nexport const purple = {\n base: '#9c27b0',\n lighten5: '#f3e5f5',\n lighten4: '#e1bee7',\n lighten3: '#ce93d8',\n lighten2: '#ba68c8',\n lighten1: '#ab47bc',\n darken1: '#8e24aa',\n darken2: '#7b1fa2',\n darken3: '#6a1b9a',\n darken4: '#4a148c',\n accent1: '#ea80fc',\n accent2: '#e040fb',\n accent3: '#d500f9',\n accent4: '#aa00ff'\n};\nexport const deepPurple = {\n base: '#673ab7',\n lighten5: '#ede7f6',\n lighten4: '#d1c4e9',\n lighten3: '#b39ddb',\n lighten2: '#9575cd',\n lighten1: '#7e57c2',\n darken1: '#5e35b1',\n darken2: '#512da8',\n darken3: '#4527a0',\n darken4: '#311b92',\n accent1: '#b388ff',\n accent2: '#7c4dff',\n accent3: '#651fff',\n accent4: '#6200ea'\n};\nexport const indigo = {\n base: '#3f51b5',\n lighten5: '#e8eaf6',\n lighten4: '#c5cae9',\n lighten3: '#9fa8da',\n lighten2: '#7986cb',\n lighten1: '#5c6bc0',\n darken1: '#3949ab',\n darken2: '#303f9f',\n darken3: '#283593',\n darken4: '#1a237e',\n accent1: '#8c9eff',\n accent2: '#536dfe',\n accent3: '#3d5afe',\n accent4: '#304ffe'\n};\nexport const blue = {\n base: '#2196f3',\n lighten5: '#e3f2fd',\n lighten4: '#bbdefb',\n lighten3: '#90caf9',\n lighten2: '#64b5f6',\n lighten1: '#42a5f5',\n darken1: '#1e88e5',\n darken2: '#1976d2',\n darken3: '#1565c0',\n darken4: '#0d47a1',\n accent1: '#82b1ff',\n accent2: '#448aff',\n accent3: '#2979ff',\n accent4: '#2962ff'\n};\nexport const lightBlue = {\n base: '#03a9f4',\n lighten5: '#e1f5fe',\n lighten4: '#b3e5fc',\n lighten3: '#81d4fa',\n lighten2: '#4fc3f7',\n lighten1: '#29b6f6',\n darken1: '#039be5',\n darken2: '#0288d1',\n darken3: '#0277bd',\n darken4: '#01579b',\n accent1: '#80d8ff',\n accent2: '#40c4ff',\n accent3: '#00b0ff',\n accent4: '#0091ea'\n};\nexport const cyan = {\n base: '#00bcd4',\n lighten5: '#e0f7fa',\n lighten4: '#b2ebf2',\n lighten3: '#80deea',\n lighten2: '#4dd0e1',\n lighten1: '#26c6da',\n darken1: '#00acc1',\n darken2: '#0097a7',\n darken3: '#00838f',\n darken4: '#006064',\n accent1: '#84ffff',\n accent2: '#18ffff',\n accent3: '#00e5ff',\n accent4: '#00b8d4'\n};\nexport const teal = {\n base: '#009688',\n lighten5: '#e0f2f1',\n lighten4: '#b2dfdb',\n lighten3: '#80cbc4',\n lighten2: '#4db6ac',\n lighten1: '#26a69a',\n darken1: '#00897b',\n darken2: '#00796b',\n darken3: '#00695c',\n darken4: '#004d40',\n accent1: '#a7ffeb',\n accent2: '#64ffda',\n accent3: '#1de9b6',\n accent4: '#00bfa5'\n};\nexport const green = {\n base: '#4caf50',\n lighten5: '#e8f5e9',\n lighten4: '#c8e6c9',\n lighten3: '#a5d6a7',\n lighten2: '#81c784',\n lighten1: '#66bb6a',\n darken1: '#43a047',\n darken2: '#388e3c',\n darken3: '#2e7d32',\n darken4: '#1b5e20',\n accent1: '#b9f6ca',\n accent2: '#69f0ae',\n accent3: '#00e676',\n accent4: '#00c853'\n};\nexport const lightGreen = {\n base: '#8bc34a',\n lighten5: '#f1f8e9',\n lighten4: '#dcedc8',\n lighten3: '#c5e1a5',\n lighten2: '#aed581',\n lighten1: '#9ccc65',\n darken1: '#7cb342',\n darken2: '#689f38',\n darken3: '#558b2f',\n darken4: '#33691e',\n accent1: '#ccff90',\n accent2: '#b2ff59',\n accent3: '#76ff03',\n accent4: '#64dd17'\n};\nexport const lime = {\n base: '#cddc39',\n lighten5: '#f9fbe7',\n lighten4: '#f0f4c3',\n lighten3: '#e6ee9c',\n lighten2: '#dce775',\n lighten1: '#d4e157',\n darken1: '#c0ca33',\n darken2: '#afb42b',\n darken3: '#9e9d24',\n darken4: '#827717',\n accent1: '#f4ff81',\n accent2: '#eeff41',\n accent3: '#c6ff00',\n accent4: '#aeea00'\n};\nexport const yellow = {\n base: '#ffeb3b',\n lighten5: '#fffde7',\n lighten4: '#fff9c4',\n lighten3: '#fff59d',\n lighten2: '#fff176',\n lighten1: '#ffee58',\n darken1: '#fdd835',\n darken2: '#fbc02d',\n darken3: '#f9a825',\n darken4: '#f57f17',\n accent1: '#ffff8d',\n accent2: '#ffff00',\n accent3: '#ffea00',\n accent4: '#ffd600'\n};\nexport const amber = {\n base: '#ffc107',\n lighten5: '#fff8e1',\n lighten4: '#ffecb3',\n lighten3: '#ffe082',\n lighten2: '#ffd54f',\n lighten1: '#ffca28',\n darken1: '#ffb300',\n darken2: '#ffa000',\n darken3: '#ff8f00',\n darken4: '#ff6f00',\n accent1: '#ffe57f',\n accent2: '#ffd740',\n accent3: '#ffc400',\n accent4: '#ffab00'\n};\nexport const orange = {\n base: '#ff9800',\n lighten5: '#fff3e0',\n lighten4: '#ffe0b2',\n lighten3: '#ffcc80',\n lighten2: '#ffb74d',\n lighten1: '#ffa726',\n darken1: '#fb8c00',\n darken2: '#f57c00',\n darken3: '#ef6c00',\n darken4: '#e65100',\n accent1: '#ffd180',\n accent2: '#ffab40',\n accent3: '#ff9100',\n accent4: '#ff6d00'\n};\nexport const deepOrange = {\n base: '#ff5722',\n lighten5: '#fbe9e7',\n lighten4: '#ffccbc',\n lighten3: '#ffab91',\n lighten2: '#ff8a65',\n lighten1: '#ff7043',\n darken1: '#f4511e',\n darken2: '#e64a19',\n darken3: '#d84315',\n darken4: '#bf360c',\n accent1: '#ff9e80',\n accent2: '#ff6e40',\n accent3: '#ff3d00',\n accent4: '#dd2c00'\n};\nexport const brown = {\n base: '#795548',\n lighten5: '#efebe9',\n lighten4: '#d7ccc8',\n lighten3: '#bcaaa4',\n lighten2: '#a1887f',\n lighten1: '#8d6e63',\n darken1: '#6d4c41',\n darken2: '#5d4037',\n darken3: '#4e342e',\n darken4: '#3e2723'\n};\nexport const blueGrey = {\n base: '#607d8b',\n lighten5: '#eceff1',\n lighten4: '#cfd8dc',\n lighten3: '#b0bec5',\n lighten2: '#90a4ae',\n lighten1: '#78909c',\n darken1: '#546e7a',\n darken2: '#455a64',\n darken3: '#37474f',\n darken4: '#263238'\n};\nexport const grey = {\n base: '#9e9e9e',\n lighten5: '#fafafa',\n lighten4: '#f5f5f5',\n lighten3: '#eeeeee',\n lighten2: '#e0e0e0',\n lighten1: '#bdbdbd',\n darken1: '#757575',\n darken2: '#616161',\n darken3: '#424242',\n darken4: '#212121'\n};\nexport const shades = {\n black: '#000000',\n white: '#ffffff',\n transparent: '#ffffff00'\n};\nexport default {\n red,\n pink,\n purple,\n deepPurple,\n indigo,\n blue,\n lightBlue,\n cyan,\n teal,\n green,\n lightGreen,\n lime,\n yellow,\n amber,\n orange,\n deepOrange,\n brown,\n blueGrey,\n grey,\n shades\n};\n//# sourceMappingURL=colors.js.map","import colors from 'vuetify/lib/util/colors';\r\n\r\nconst theme_colors = [\r\n {\r\n name: 'Blue-light',\r\n scheme: 'md-blue-500-scheme',\r\n dark: true,\r\n primary: colors.blue.base,\r\n secondary: colors.blue.lighten4, // #FFCDD2\r\n accent: colors.blue.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Yellow-light',\r\n scheme: 'md-amber-a700-scheme',\r\n dark: true,\r\n primary: colors.amber.darken1,\r\n secondary: colors.amber.lighten4, // #FFCDD2\r\n accent: colors.amber.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Red-light',\r\n scheme: 'md-red-a400-scheme',\r\n dark: true,\r\n primary: colors.red.accent3,\r\n secondary: colors.red.lighten4, // #FFCDD2\r\n accent: colors.red.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Pink-light',\r\n dark: false,\r\n scheme: 'md-pink-a100-scheme',\r\n primary: colors.pink.accent1,\r\n secondary: colors.pink.lighten4, // #FFCDD2\r\n accent: colors.pink.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Purple-light',\r\n dark: false,\r\n scheme: 'md-purple-a700-scheme',\r\n primary: colors.purple.accent4,\r\n secondary: colors.purple.lighten4, // #FFCDD2\r\n accent: colors.purple.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'DeepPurple-light',\r\n dark: false,\r\n scheme: 'md-deep-purple-a700-scheme',\r\n primary: colors.deepPurple.base,\r\n secondary: colors.deepPurple.lighten4, // #FFCDD2\r\n accent: colors.deepPurple.accent2, // #3F51B5\r\n }\r\n];\r\n\r\nconst navi_colors = [\r\n {\r\n name: 'black',\r\n class: 'black'\r\n },\r\n {\r\n name: 'red-pink',\r\n class: 'gradient-red-pink'\r\n },\r\n {\r\n name: 'blue-grey-blue',\r\n class: 'gradient-blue-grey-blue'\r\n },\r\n {\r\n name: 'green-teal',\r\n class: 'gradient-green-teal'\r\n },\r\n {\r\n name: 'purple-deep-purple',\r\n class: 'gradient-purple-deep-purple'\r\n },\r\n {\r\n name: 'purple-amber',\r\n class: 'gradient-purple-amber'\r\n },\r\n {\r\n name: 'indigo-purple',\r\n class: 'gradient-indigo-purple'\r\n },\r\n {\r\n name: 'deep-purple-blue',\r\n class: 'gradient-deep-purple-blue'\r\n },\r\n {\r\n name: 'deep-orange-orange',\r\n class: 'gradient-deep-orange-orange'\r\n },\r\n {\r\n name: 'light-blue-cyan',\r\n class: 'gradient-light-blue-cyan'\r\n },\r\n {\r\n name: 'timber',\r\n class: 'gradient-timber'\r\n },\r\n {\r\n name: 'strawberry',\r\n class: 'gradient-strawberry'\r\n },\r\n {\r\n name: 'orange',\r\n class: 'gradient-orange'\r\n },\r\n {\r\n name: 'pomegranate',\r\n class: 'gradient-pomegranate'\r\n },\r\n {\r\n name: 'green-tea',\r\n class: 'gradient-green-tea'\r\n },\r\n {\r\n name: 'blackberry',\r\n class: 'gradient-blackberry'\r\n },\r\n {\r\n name: 'plum',\r\n class: 'gradient-plum'\r\n },\r\n {\r\n name: 'passion-fruit',\r\n class: 'gradient-passion-fruit'\r\n },\r\n {\r\n name: 'sublime-vivid',\r\n class: 'gradient-sublime-vivid'\r\n },\r\n {\r\n name: 'summer',\r\n class: 'gradient-summer'\r\n },\r\n {\r\n name: 'crystal-clear',\r\n class: 'gradient-crystal-clear'\r\n },\r\n {\r\n name: 'dawn',\r\n class: 'gradient-dawn'\r\n },\r\n {\r\n name: 'grapefruit-sunset',\r\n class: 'gradient-grapefruit-sunset'\r\n },\r\n {\r\n name: 'man-of-steel',\r\n class: 'gradient-man-of-steel'\r\n }\r\n]\r\n\r\nexport default { theme_colors, navi_colors }\r\n","/** https://github.com/shadowOfCode/bee.js */\r\nconst Validation = {\r\n //手机号码\r\n isMobile: function (input) {\r\n return /^(?:\\+86)?(?:13\\d|14[57]|15[0-35-9]|17[35-8]|18\\d)\\d{8}$|^(?:\\+86)?170[057-9]\\d{7}$/.test(input);\r\n },\r\n //手机号码简单校验,只校验长度\r\n isMobileSize: function (input) {\r\n return /^(?:\\+86)?1\\d{10}$/.test(input);\r\n },\r\n isPhone: function (input) {\r\n return /^(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?$/.test(input);\r\n },\r\n isCall: (input) => {\r\n return this.isPhone(input) || this.isMobile(input);\r\n },\r\n //邮箱格式校验\r\n isEmail: function (input) {\r\n return /^[-\\w+]+(?:\\.[-\\w]+)*@[-a-z0-9]+(?:\\.[a-z0-9]+)*(?:\\.[a-z]{2,})$/i.test(input);\r\n },\r\n //18位身份证简单校验\r\n isIdCardSimple: function (idCard) {\r\n return /^(?:1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5])\\d{4}(?:1[89]|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}(?:\\d|[xX])$/.test(idCard);\r\n },\r\n // 真实姓名校验\r\n isName: function (input) {\r\n return /^([\\u4e00-\\u9fa5]{1,20}|[a-zA-Z.\\s]{1,20})$/.test(input);\r\n },\r\n //\r\n //18位身份证严格校验\r\n isIdCard: function (idCard) {\r\n let checkCode = (input) => {\r\n var multiplier = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\r\n var ids = input.split(\"\");\r\n var len = 17, sum = 0;\r\n for (var i = 0; i < len; i++) {\r\n sum += ids[i] * multiplier[i];\r\n }\r\n var remainder = sum % 11;\r\n var checkCodeArr = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\r\n var result = checkCodeArr[remainder];\r\n return result === input[17];\r\n }\r\n //先校验格式\r\n if (this.isIdCardSimple(idCard)) {\r\n //校验日期时间是否合法\r\n var dateStr = idCard.substr(6, 8);\r\n var dateStrNew = dateStr.replace(/(\\d{4})(\\d{2})(\\d{2})/, \"$1/$2/$3\");\r\n var dateObj = new Date(dateStrNew);\r\n var month = dateObj.getMonth() + 1;\r\n if (parseInt(dateStr.substr(4, 2)) === month) {\r\n return checkCode(idCard);\r\n }\r\n }\r\n return false;\r\n },\r\n getFromIdCard: (idCard) => {\r\n var area = idCard.substr(0, 6);\r\n var birth = idCard.substr(6, 8).replace(/(\\d{4})(\\d{2})(\\d{2})/, '$1年$2月$3日');\r\n var age = new Date().getFullYear() - idCard.substr(6, 4) + 1;\r\n var sex = (idCard.substr(16, 1) % 2 === 0) ? '女' : '男';\r\n\r\n return {\r\n 'area': area,\r\n 'birth': birth,\r\n 'age': age,\r\n 'sex': sex\r\n };\r\n }\r\n};\r\n\r\nexport default Validation;","<template>\r\n <VDialog v-model=\"isActive\" persistent :width=\"options.width\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText v-if=\"options.text\">\r\n {{ options.text }}\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"close_modal\">确定</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js' // 根据实际路径调整\r\n\r\nconst messageStore = useMessageStore()\r\n\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.alert?.isActive || false)\r\nconst options = computed(() => messageStore.alert?.options || {})\r\n\r\n// 关闭模态框方法\r\nconst close_modal = () => {\r\n messageStore.hide('alert')\r\n}\r\n</script>","<template>\r\n <VDialog v-model=\"isActive\" persistent :max-width=\"options.width || 400\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText v-if=\"options.text\">\r\n {{ options.text }}\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"cancel\">{{ options.cancelText || '取消' }}</VBtn>\r\n <VBtn text @click=\"confirm\">{{ options.confirmText || '确定' }}</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.confirm?.isActive || false)\r\nconst options = computed(() => messageStore.confirm?.options || {})\r\n\r\n// 确认操作\r\nconst confirm = () => {\r\n // 如果 options.onConfirm 存在则执行回调\r\n if (typeof options.value.onConfirm === 'function') {\r\n options.value.onConfirm()\r\n }\r\n messageStore.hide('confirm')\r\n}\r\n\r\n// 取消操作\r\nconst cancel = () => {\r\n // 如果 options.onCancel 存在则执行回调\r\n if (typeof options.value.onCancel === 'function') {\r\n options.value.onCancel()\r\n }\r\n messageStore.hide('confirm')\r\n}\r\n</script>","<template>\r\n <v-overlay v-model=\"isActive\" persistent class=\"align-center justify-center\" :style=\"{ zIndex: 9999 }\">\r\n <v-progress-circular indeterminate size=\"64\" width=\"6\" color=\"primary\"></v-progress-circular>\r\n </v-overlay>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\n\r\nconst isActive = computed(() => messageStore.loading?.isActive || false)\r\n</script>\r\n","<template>\r\n <VDialog v-model=\"isActive\" persistent :width=\"options.width\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText>\r\n <VTextField\r\n v-model=\"inputValue\"\r\n :label=\"options.label\"\r\n :placeholder=\"options.placeholder\"\r\n :type=\"options.inputType || 'text'\"\r\n outlined\r\n dense\r\n />\r\n <div v-if=\"options.text\" class=\"mt-2\">\r\n {{ options.text }}\r\n </div>\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"cancel\">{{ options.cancelText || '取消' }}</VBtn>\r\n <VBtn text @click=\"confirm\">{{ options.confirmText || '确定' }}</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\nconst inputValue = ref('')\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.prompt?.isActive || false)\r\nconst options = computed(() => messageStore.prompt?.options || {})\r\n\r\n// 确认操作\r\nconst confirm = () => {\r\n // 如果 options.onConfirm 存在则执行回调\r\n if (typeof options.value.onConfirm === 'function') {\r\n options.value.onConfirm(inputValue.value)\r\n }\r\n messageStore.hide('prompt')\r\n inputValue.value = '' // 清空输入值\r\n}\r\n\r\n// 取消操作\r\nconst cancel = () => {\r\n // 如果 options.onCancel 存在则执行回调\r\n if (typeof options.value.onCancel === 'function') {\r\n options.value.onCancel()\r\n }\r\n messageStore.hide('prompt')\r\n inputValue.value = '' // 清空输入值\r\n}\r\n</script>","<template>\r\n\t<VSnackbar v-model=\"isActive\" :timeout=\"options.timeout > 0 ? options.timeout : 3000\" :color=\"options.color\" centered @update:modelValue=\"onModelUpdate\">\r\n\t\t{{ options.text }}\r\n\t\t<template v-slot:actions>\r\n\t\t\t<VBtn text icon @click=\"close_modal()\">\r\n\t\t\t\t<VIcon>mdi-close</VIcon>\r\n\t\t\t</VBtn>\r\n\t\t</template>\r\n\t</VSnackbar>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from \"vue\";\r\nimport { useMessageStore } from \"../../stores/message.js\";\r\n\r\nconst messageStore = useMessageStore();\r\n\r\nconst isActive = computed({\r\n\tget: () => messageStore.toast?.isActive || false,\r\n\tset: (value) => {\r\n\t\tif (messageStore.toast) {\r\n\t\t\tmessageStore.toast.isActive = value;\r\n\t\t}\r\n\t},\r\n});\r\n\r\nconst options = computed(() => messageStore.toast?.options || {});\r\n\r\nconst close_modal = () => {\r\n\tmessageStore.hide(\"toast\");\r\n};\r\n\r\n// 监听模型值更新\r\nconst onModelUpdate = (value) => {\r\n\tif (!value) {\r\n\t\t// Snackbar 关闭时确保 store 状态同步\r\n\t\tmessageStore.hide(\"toast\");\r\n\t}\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n:deep(.v-snackbar__wrapper) {\r\n\ttop: 24px;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"text-center\">\r\n <vtk-alert />\r\n <vtk-confirm />\r\n <vtk-loading />\r\n <vtk-prompt />\r\n <vtk-toast />\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport vtkAlert from \"./alert.vue\";\r\nimport vtkConfirm from \"./confirm.vue\";\r\nimport vtkLoading from \"./loading.vue\";\r\nimport vtkPrompt from \"./prompt.vue\";\r\nimport vtkToast from \"./toast.vue\";\r\nexport default {\r\n name: \"vtkMessage\",\r\n components: {\r\n vtkAlert,\r\n vtkConfirm,\r\n vtkLoading,\r\n vtkPrompt,\r\n vtkToast,\r\n },\r\n};\r\n</script>","/**\r\n * Specter PUI - Vue 3 组件库\r\n */\r\n\r\nexport { default as VtkArea } from \"./components/assembly/VtkArea.vue\";\r\nexport { default as VtkAreaTabs } from \"./components/assembly/VtkAreaTabs.vue\";\r\nexport { default as VtkBreadcrumb } from \"./components/assembly/VtkBreadcrumb.vue\";\r\nexport { default as VtkCheckbox } from \"./components/assembly/VtkCheckbox.vue\";\r\nexport { default as VtkCount } from \"./components/assembly/VtkCount.vue\";\r\nexport { default as VtkDatePicker } from \"./components/assembly/VtkDatePicker.vue\";\r\nexport { default as VtkDateSelector } from \"./components/assembly/VtkDateSelector.vue\";\r\nexport { default as VtkDateTimePicker } from \"./components/assembly/VtkDateTimePicker.vue\";\r\nexport { default as VtkTimePicker } from \"./components/assembly/VtkTimePicker.vue\";\r\nexport { default as VtkDept } from \"./components/assembly/VtkDept.vue\";\r\nexport { default as VtkEmpty } from \"./components/assembly/VtkEmpty.vue\";\r\nexport { default as VtkEmptyNew } from \"./components/assembly/VtkEmptyNew.vue\";\r\nexport { default as VtkFab } from \"./components/assembly/VtkFab.vue\";\r\nexport { default as VtkFormItem } from \"./components/assembly/VtkFormItem.vue\";\r\nexport { default as VtkImg } from \"./components/assembly/VtkImg.vue\";\r\nexport { default as VtkPage } from \"./components/assembly/VtkPage.vue\";\r\nexport { default as VtkPdf } from \"./components/assembly/VtkPdf.vue\";\r\nexport { default as VtkProj } from \"./components/assembly/VtkProj.vue\";\r\nexport { default as VtkRadio } from \"./components/assembly/VtkRadio.vue\";\r\nexport { default as VtkSearch } from \"./components/assembly/VtkSearch.vue\";\r\nexport { default as VtkSelect } from \"./components/assembly/VtkSelect.vue\";\r\nexport { default as VtkSinglePage } from \"./components/assembly/VtkSinglePage.vue\";\r\nexport { default as VtkStepper } from \"./components/assembly/VtkStepper.vue\";\r\nexport { default as VtkUpload } from \"./components/assembly/VtkUpload.vue\";\r\n\r\nexport * from \"./commons/location.js\";\r\nexport * from \"./commons/filters/dictionary.js\";\r\nexport * from \"./commons/filters/format.js\";\r\nexport * from \"./commons/filters/mask.js\";\r\nexport { default as request } from \"./commons/request.js\";\r\nexport { default as storage } from \"./commons/storage.js\";\r\nexport { default as themes } from \"./commons/themes.js\";\r\nexport * from \"./commons/validation.js\";\r\n\r\nexport { useMixins } from \"./composables/usePage.js\";\r\nexport { default as vtkMessage } from \"./components/message/index.js\";\r\n\r\nimport vtkMessage from \"./components/message/index.js\";\r\nimport storage from \"./commons/storage.js\";\r\nimport themes from \"./commons/themes.js\";\r\nimport request from \"./commons/request.js\";\r\nimport * as location from \"./commons/location.js\";\r\nimport Validation from \"./commons/validation.js\";\r\nimport * as dictionary from \"./commons/filters/dictionary.js\";\r\nimport * as mask from \"./commons/filters/mask.js\";\r\nimport * as format from \"./commons/filters/format.js\";\r\n\r\nimport VtkArea from \"./components/assembly/VtkArea.vue\";\r\nimport VtkAreaTabs from \"./components/assembly/VtkAreaTabs.vue\";\r\nimport VtkBreadcrumb from \"./components/assembly/VtkBreadcrumb.vue\";\r\nimport VtkCheckbox from \"./components/assembly/VtkCheckbox.vue\";\r\nimport VtkCount from \"./components/assembly/VtkCount.vue\";\r\nimport VtkDatePicker from \"./components/assembly/VtkDatePicker.vue\";\r\nimport VtkDateSelector from \"./components/assembly/VtkDateSelector.vue\";\r\nimport VtkDateTimePicker from \"./components/assembly/VtkDateTimePicker.vue\";\r\nimport VtkTimePicker from \"./components/assembly/VtkTimePicker.vue\";\r\nimport VtkDept from \"./components/assembly/VtkDept.vue\";\r\nimport VtkEmpty from \"./components/assembly/VtkEmpty.vue\";\r\nimport VtkEmptyNew from \"./components/assembly/VtkEmptyNew.vue\";\r\nimport VtkFab from \"./components/assembly/VtkFab.vue\";\r\nimport VtkFormItem from \"./components/assembly/VtkFormItem.vue\";\r\nimport VtkImg from \"./components/assembly/VtkImg.vue\";\r\nimport VtkPage from \"./components/assembly/VtkPage.vue\";\r\nimport VtkPdf from \"./components/assembly/VtkPdf.vue\";\r\nimport VtkProj from \"./components/assembly/VtkProj.vue\";\r\nimport VtkRadio from \"./components/assembly/VtkRadio.vue\";\r\nimport VtkSearch from \"./components/assembly/VtkSearch.vue\";\r\nimport VtkSelect from \"./components/assembly/VtkSelect.vue\";\r\nimport VtkSinglePage from \"./components/assembly/VtkSinglePage.vue\";\r\nimport VtkStepper from \"./components/assembly/VtkStepper.vue\";\r\nimport VtkUpload from \"./components/assembly/VtkUpload.vue\";\r\nimport VtkMessageComponent from \"./components/message/vtkMessage.vue\";\r\n\r\nfunction install(app, options = {}) {\r\n const components = {\r\n VtkArea,\r\n VtkAreaTabs,\r\n VtkBreadcrumb,\r\n VtkCheckbox,\r\n VtkCount,\r\n VtkDatePicker,\r\n VtkDateSelector,\r\n VtkDateTimePicker,\r\n VtkTimePicker,\r\n VtkDept,\r\n VtkEmpty,\r\n VtkEmptyNew,\r\n VtkFab,\r\n VtkFormItem,\r\n VtkImg,\r\n VtkPage,\r\n VtkPdf,\r\n VtkProj,\r\n VtkRadio,\r\n VtkSearch,\r\n VtkSelect,\r\n VtkSinglePage,\r\n VtkStepper,\r\n VtkUpload,\r\n VtkMessage: VtkMessageComponent\r\n };\r\n\r\n Object.keys(components).forEach(name => {\r\n app.component(name, components[name]);\r\n });\r\n\r\n app.config.globalProperties.$vtk = {\r\n message: vtkMessage,\r\n request,\r\n storage,\r\n themes,\r\n location,\r\n Validation,\r\n filters: {\r\n ...dictionary,\r\n ...mask,\r\n ...format\r\n },\r\n ...options\r\n };\r\n\r\n return app;\r\n}\r\n\r\nexport default {\r\n install,\r\n VtkArea,\r\n VtkAreaTabs,\r\n VtkBreadcrumb,\r\n VtkCheckbox,\r\n VtkCount,\r\n VtkDatePicker,\r\n VtkDateSelector,\r\n VtkDateTimePicker,\r\n VtkTimePicker,\r\n VtkDept,\r\n VtkEmpty,\r\n VtkEmptyNew,\r\n VtkFab,\r\n VtkFormItem,\r\n VtkImg,\r\n VtkPage,\r\n VtkPdf,\r\n VtkProj,\r\n VtkRadio,\r\n VtkSearch,\r\n VtkSelect,\r\n VtkSinglePage,\r\n VtkStepper,\r\n VtkUpload,\r\n request,\r\n storage,\r\n themes,\r\n vtkMessage\r\n};\r\n"],"names":["Storage","storage","type","key","js","value","useMessageStore","defineStore","options","Message","messageStore","defaultOptions","text","toastOptions","service","axios","config","tokenKey","_b","_a","error","response","res","header","handleRedirect","url","index","newUrl","Request","data","method","headers","responseType","proxy","getCurrentInstance","emit","__emit","entity","reactive","user","ref","areaData","onMounted","userKey","area","nextArea","areaCode","inputFn","e","clear","arr","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_VSelect","_cache","$event","__props","_createBlock","_c","_normalizeClass","_d","_e","_f","_g","_h","_i","_normalizeStyle","_j","props","menu","tab","tabItems","areaStorage","areaItems","current","itemValue","itemText","view","code","province","city","district","town","village","tabArea","areaChange","item","getTree","nextTick","getAreaName","save","val","lastItem","close","textClear","initCode","watch","newVal","oldVal","_component_v_menu","_withCtx","_component_v_btn","_mergeProps","$attrs","_createElementVNode","_toDisplayString","_component_v_icon","_component_v_card","_hoisted_2","_Fragment","_renderList","link","_component_v_sheet","_component_v_tabs","_component_v_tab","_createTextVNode","_vShow","_component_v_chip_group","_component_v_chip","_component_v_card_actions","_component_v_spacer","router","inject","route","breadcrumbItems","computed","matched","r","pathArray","p","path","routePath","handleBack","_component_v_breadcrumbs","_component_v_breadcrumbs_item","localValue","isUpdatingLocal","isUpdatingModel","attrs","useAttrs","inputAttrs","list","inline","modelValue","rest","checkboxAttrs","errorMessages","rules","hint","persistentHint","inputValue","items","statc","it","codeValue","miscs","_component_VInput","_component_VCheckbox","currentNumber","currentDigits","digitKey","isAnimating","formatNumber","num","result","targetNumberString","startNumberString","maxDigitString","target","start","getCurrentDigit","initDigitsArray","startStr","char","startChar","getDigitStyle","currentValue","digitValue","offset","translateY","startAnimation","startTime","startValue","endValue","diff","animate","currentTime","elapsed","progress","easeOutQuart","updateDigitArray","valueStr","maxStr","i","newStr","oldStr","endStr","__expose","digitChar","_hoisted_4","_hoisted_3","n","_hoisted_5","dateRange","startDateRange","endDateRange","displayValue","formatDate","textFieldProps","placeholder","disabled","min","max","showCurrent","format","separator","date","year","month","day","minDate","maxDate","newValue","dates","onStartDateChange","onEndDateChange","clearValue","cancel","confirm","sortedRange","date1","date2","_component_VMenu","activatorProps","_component_VTextField","_component_VIcon","_component_VCard","_component_VCardText","_component_VDatePicker","_component_VDivider","_component_VCardActions","_component_VSpacer","_component_VBtn","YEAR_PAGE_SIZE","YEAR_PAGE_CENTER_OFFSET","MONTHS","getYearPageStart","openPicker","yearPageStart","headerRef","yearPage","_","canShowNextYearPage","isYearDisabled","isMonthDisabled","togglePicker","closePicker","shiftYearPage","nextStart","selectYear","selectMonth","handleNavigate","direction","handleOutsideClick","event","onBeforeUnmount","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","YEAR_PANEL_SIZE","YEAR_PANEL_CENTER_OFFSET","showPicker","viewMode","currentYear","currentMonth","rightYear","rightMonth","selectedValue","tempValue","today","todayYear","todayMonth","todayDate","weekDays","monthList","menuAttach","menuLocation","menuOrigin","normalizeCssSize","nextValue","rootStyle","width","popupStyle","formatDisplay","week","yearList","startYear","weekList","weeks","firstDay","lastDay","currentDate","weekNumber","getWeekNumber","isToday","dayList","days","startDate","endDate","nextMonthYear","nextMonthMonth","nextMonthDayList","d","dayNum","yearStart","isYearSelected","v","isYearInRange","end","isMonthSelected","monthStr","isMonthInRange","isWeekSelected","weekStr","isWeekInRange","isDaySelected","isDayInRange","isDayRangeStart","isDayRangeEnd","isFutureYear","isFutureMonth","isFutureDay","yearStr","first","selectMonthRight","isMonthSelectedRight","isMonthInRangeRight","selectWeek","selectDay","prevPeriod","nextPeriod","prevMonth","nextMonthLeft","prevMonthRight","nextMonth","prevYear","nextYearLeft","prevYearRight","nextYear","changeViewMode","mode","parseCalendarValue","match","setRightPanelToNextMonth","syncCalendarPanels","values","endUsesDifferentMonth","initializePicker","isOpen","handleCancel","handleConfirm","menuProps","VtkDatePanelHeader","_unref","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","defaultStartTime","defaultEndTime","selectedDateTime","selectedRange","tempDate","tempRange","leftYear","leftMonth","selectedHour","selectedMinute","selectedSecond","activeRangeSide","activeTimeSide","activeSingleTime","isRange","menuWidth","dropdownStyle","minDateTime","parseValue","maxDateTime","hourOptions","minuteOptions","buildStepOptions","secondOptions","getDayList","leftDayList","rightDayList","formatByPattern","buildTempDateTime","singleTimeValue","pattern","canConfirm","isDateTimeDisabled","activeRangeDate","activeRangeHour","activeRangeMinute","activeRangeSecond","step","normalizedStep","startDay","daysInMonth","daysInPrevMonth","createDay","otherMonth","isSameDate","padTime","replacements","token","formatDatePart","formatTimePart","fallback","hour","minute","second","parseRangeValue","toModelValue","toModelRange","range","left","right","isDayDisabled","isTimePartDisabled","isRangeDaySelected","side","isRangeDayInRange","rangeDayClass","setSinglePanelFromDate","setRangePanelsFromDate","base","prevLeftMonth","nextRightMonth","selectRangeDay","selected","currentStart","currentEnd","selectHour","selectMinute","selectSecond","openRangeTime","selectRangeTime","part","clearTempRange","handleNow","now","_hoisted_21","selectedTime","minTime","parseTime","maxTime","isTimeDisabled","buildTempTime","isRangeTimeDisabled","otherIndex","other","setSingleFromTime","pause","ms","resolve","pickAreaCode","obj","pickAreaName","dialog","areaSelectedData","areaActivatedData","getDeptList","getAreaList","userAreaCode","getAreaNextList","parentCode","deptData","deptSelectedData","deptActivatedData","getPersonList","node","params","getDepNextList","selectAreaCode","selectPid","personData","selectedPersonData","allSelectedPersons","isRestoringSelection","selectedPersonList","uniqueMap","person","oldPerson","newPersonData","currentSelected","removeSelectedPerson","personId","globalIndex","currentIndex","add","selectedPersons","_component_v_dialog","_component_v_card_title","_component_v_divider","_component_v_card_text","_component_v_row","_component_v_col","_component_v_treeview","_component_v_avatar","_component_v_img","_component_v_list","_component_v_list_item","_component_v_empty_state","$slots","_renderSlot","_ctx","emptyImg","showFab","fabClass","handleScroll","scrollToTop","_Transition","_component_v_fab","processedMaxWidth","contentStyles","styles","HEADER_BYTES","showPreview","imageRotation","imageScale","imageTranslateX","imageTranslateY","imageDragState","getLocalToken","withToken","srcWithToken","currentImageUrl","currentImage","imageMeta","headerState","imgState","w","h","viewerMeta","viewerHeaderState","headerMetaCache","viewerImgState","readUInt16BE","bytes","readUInt16LE","readUInt32BE","isSvgBytes","head","parseImageDimensions","length","sofMarkers","marker","segLength","fourcc","bits","readFirstBytes","maxBytes","reader","buffer","chunks","total","done","out","chunk","take","fetchImageMeta","attempts","lastError","controller","timer","vector","inflightMeta","getImageMeta","cached","task","meta","open","openViewerOversize","currentImageRawUrl","currentImageDownloadUrl","currentImageTitle","currentImageDescription","hasPrev","hasNext","viewerImageStyle","openCurrentImageInNewWindow","imageMimeExtensionMap","imageExtensionMimeMap","getImageFileExtension","blob","mimeType","pathname","getCurrentImageFileName","extension","titleName","urlName","isDownloadRiskWebView","ua","getDownloadFailureReason","message","name","validateImageBlob","bitmap","reject","image","triggerBrowserDownload","fileName","triggerBrowserUrlDownload","showDownloadToast","color","toast","getDownloadFileHandle","isImageResponse","contentType","fetchImageBlob","fetchCurrentImageBlob","downloadCurrentImage","downloadUrl","fileHandle","writable","failureReason","resetImageTransform","openPreview","closePreview","prevImage","nextImage","rotateImage","degrees","zoomImage","nextScale","handleImageWheel","startImageDrag","moveImageDrag","endImageDrag","state","_component_v_progress_circular","_component_VCardTitle","_component_v_card_subtitle","_component_VDialog","_component_v_toolbar","_component_v_toolbar_title","_component_v_toolbar_items","pagination","pageSizeObjs","pageDatas","paginationChange","pageChange","pageSizeFormat","toPage","pageSizeChange","temp","page","_component_VRow","_component_v_pagination","loading","pdfLoaded","currentPage","pageCount","pdfContainer","pdfDoc","loadPdf","renderPage","pageNum","prevPage","nextPage","downloadPdf","_component_VCol","_component_VSlider","useMixins","urlConfig","queryParam","desserts","superQueryParams","pageData","sumup","pageDataCopy","overlay","getQueryParams","codex","loadPage","pageInfo","id","record","modalFormRef","disposition","filename","newUrlConfig","getListPage","expData","mixinQueryParam","examType","permits","projName","projTip","bizType","expShow","menu1","expArr","formArr","select","selectAll","delItem","delNote","MprojRef","onActivated","examAll","chkAll","getUserInfo","examWait","toView","searchProj","param","searchQuery","exv","exp","del","delSave","tip","formatIdCard","idcard","dateStr","getServStateClass","getServStateText","getRateStateClass","getRateStateText","getServFromText","from","_component_VContainer","_component_VTabs","_component_VTab","_component_vtk_search","_component_vtk_area_tabs","_component_vtk_select","_component_VDataTable","_component_VChip","_component_vtk_empty","_component_vtk_page","_component_vtk_proj","_component_VTextarea","onUpdate","_component_VRadioGroup","_component_VRadio","instance","cloneValue","cloneQueryParam","source","isSameValue","a","b","initialQueryParam","externalQueryParam","initialIndex","initVal","contentStyle","minValue","maxValue","minHeight","maxHeight","nextExternalQueryParam","nextQueryParam","obtain","filterNull","search","reset","handleResetClick","_component_VBadge","filteredAttrs","multi","its","$emit","normalizePositiveInteger","parsedValue","initialLimit","rowCount","hasTotal","pageSizeItems","rowLength","hasNextPage","emitPageChange","goToPage","targetPage","handlePageSizeChange","previousPage","_component_v_select","_component_v_text_field","stepIndex","content","_component_VStepper","_component_VStepperHeader","_component_VStepperWindow","_component_VStepperWindowItem","inputRef","isDragover","previewVisible","previewFile","previewScale","previewRotation","previewTranslateX","previewTranslateY","previewDragState","fileList","isSyncingModel","localPreviewUrls","revokeAllLocalPreviews","normalizeFileList","uidCounter","genUid","getFileNameFromUrl","cleanUrl","isImageUrl","parseDimensions","parseImageSizeFromFile","raw","formatPixelCount","showBlockMessage","isImage","file","fileIcon","getPreviewSrc","revokeLocalPreview","preview","previewImageList","previewImageIndex","hasPreviewPrev","hasPreviewNext","previewImageStyle","triggerInput","onDragover","onDrop","processFiles","onInputChange","rawFiles","errFile","buildFile","dims","beforeHook","addFile","uploadFile","status","syncModel","urls","f","formData","k","err","handleRemove","doRemove","isExcel","resetPreviewTransform","rotatePreview","zoomPreview","setImagePreviewFile","switchPreviewImage","nextFile","handlePreviewKeydown","startPreviewDrag","movePreviewDrag","endPreviewDrag","openFileInNewTab","fileUrl","blobUrl","win","openCurrentPreview","handlePreview","visible","_withModifiers","_component_v_progress_linear","isAid","str","getLinkFromResponse","buildUrlWithParams","appendParams","queryString","queryParams","newParams","joinSymbol","appendParamsToUrl","targetUrl","hashIndex","baseUrl","hashRoute","newHashRoute","resolveAidUrl","aid","buildAppendParams","sobject","sroute","stokenKey","storageKey","stoken","GetQueryString","reg","appendAppParams","dict","map","pre","maps","results","j","currentVal","kv","analyType","analyLevel","fmt","getDate","o","numValue","neg","absValue","fix","needSep","xs","decimalPart","integerPart","age","birthdays","txt","len","abs","mobile","red","pink","purple","deepPurple","blue","amber","colors","theme_colors","navi_colors","themes","Validation","input","this","idCard","checkCode","multiplier","ids","sum","remainder","checkCodeArr","dateStrNew","dateObj","birth","sex","isActive","close_modal","_component_v_overlay","onModelUpdate","_component_VSnackbar","_sfc_main","vtkAlert","vtkConfirm","vtkLoading","vtkPrompt","vtkToast","_component_vtk_alert","_component_vtk_confirm","_component_vtk_loading","_component_vtk_prompt","_component_vtk_toast","install","app","components","VtkArea","VtkAreaTabs","VtkBreadcrumb","VtkCheckbox","VtkCount","VtkDatePicker","VtkDateSelector","VtkDateTimePicker","VtkTimePicker","VtkDept","VtkEmpty","VtkEmptyNew","VtkFab","VtkFormItem","VtkImg","VtkPage","VtkPdf","VtkProj","VtkRadio","VtkSearch","VtkSelect","VtkSinglePage","VtkStepper","VtkUpload","VtkMessageComponent","vtkMessage","request","location","dictionary","mask"],"mappings":"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","x_google_ignoreList":[35]}
|