diff --git a/.env.base b/.env.base index 19b9a09..2d3b1b8 100644 --- a/.env.base +++ b/.env.base @@ -4,8 +4,8 @@ VITE_NODE_ENV=development VITE_DEV=true # 请求路径 -VITE_BASE_URL='http://47.98.161.246:48080' -# VITE_BASE_URL='http://114.215.207.150:48080' +# VITE_BASE_URL='http://47.98.161.246:48080' +VITE_BASE_URL='http://114.215.207.150:48080' # 小程序接口请求路劲 VITE_APPLET_URL='https://cloud.ahduima.com' diff --git a/package.json b/package.json index 5047ffa..9cebdcb 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "diagram-js": "^11.6.0", "echarts": "^5.4.2", "echarts-wordcloud": "^2.1.0", - "element-plus": "2.3.4", + "element-plus": "2.9.4", "fast-xml-parser": "^4.2.2", "highlight.js": "^11.8.0", "intro.js": "^7.0.1", @@ -69,9 +69,11 @@ "vue": "3.3.4", "vue-amap": "^0.5.10", "vue-dompurify-html": "^5.0.1", + "vue-draggable-plus": "^0.6.0", "vue-i18n": "9.2.2", "vue-router": "^4.2.1", "vue-types": "^5.0.3", + "vue3-tree-org": "^4.2.2", "vuedraggable": "^4.1.0", "web-storage-cache": "^1.1.1", "xe-utils": "^3.5.7", diff --git a/src/api/okr/comment.js b/src/api/okr/comment.js new file mode 100644 index 0000000..6763407 --- /dev/null +++ b/src/api/okr/comment.js @@ -0,0 +1,38 @@ +import request from '@/config/axios' + +// 创建 +export const createComment = (data) => { + return request.post({ + url: '/admin-api/okr/comments/create', + data, + isSubmitForm: true + // headers: { 'instance-id': 1016 } + }) +} + +// 分页 +export const getCommentPage = (params) => { + return request.get({ + url: '/admin-api/okr/comments/page', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取评论类型 +export const getCommentTypeOptions = () => { + return request.get({ + url: '/admin-api/okr/dict-data/get-by-type', + params: { dictType: 'comment_type' } + // headers: { 'instance-id': 1016 } + }) +} + +// 点赞评论 +export const likeComment = (commentId) => { + return request.put({ + url: '/admin-api/okr/comments-likes/update', + data: { commentId } + // headers: { 'instance-id': 1016 } + }) +} diff --git a/src/api/okr/okr.js b/src/api/okr/okr.js new file mode 100644 index 0000000..09edcd4 --- /dev/null +++ b/src/api/okr/okr.js @@ -0,0 +1,145 @@ +import request from '@/config/axios' + +// 创建 +export const createOkrNode = (data) => { + return request.post({ + url: '/admin-api/okr/node/add', + data, + isSubmitForm: true + // headers: { 'instance-id': 1016 } + }) +} + +// 修改 +export const updateOkrNode = (data) => { + return request.put({ + url: '/admin-api/okr/node/update', + data + // headers: { 'instance-id': 1016 } + }) +} + +// 查询详情 +export const getOkrNodeDetail = (params) => { + return request.get({ + url: '/admin-api/okr/node/get', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 我负责的 - 节点树 +export const getMyNodeTree = (params) => { + return request.get({ + url: '/admin-api/okr/node/my/list', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 我负责的 - okr列表 +export const getMyOkrPage = (params) => { + return request.get({ + url: '/admin-api/okr/node/my/object/list', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 全部目标 - 节点树 +export const getAllNodeTree = (params) => { + return request.get({ + url: '/admin-api/okr/node/all/list', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 全部目标 - okr列表 +export const getAllOkrPage = (params) => { + return request.get({ + url: '/admin-api/okr/node/all/object/list', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取节点操作历史 +export const getOkrNodeHistory = (nodeId) => { + return request.get({ + url: '/admin-api/okr/record/list', + params: { nodeId } + // headers: { 'instance-id': 1016 } + }) +} + +// 获取系统默认的关键成果内容 +export const getDefaultOkrOptions = () => { + return request.get({ + url: '/admin-api/okr/dict-data/get-by-type', + params: { dictType: 'key_result_source' } + // headers: { 'instance-id': 1016 } + }) +} + +// 更新OKR进度 +export const updateOkrProgress = (data) => { + return request.put({ + url: '/admin-api/okr/node/progress/update', + data + // headers: { 'instance-id': 1016 } + }) +} + +// 获取目标关系树一级节点 +export const getOkrRelationTree = (params) => { + return request.get({ + url: '/admin-api/okr/node/first-node', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取目标关系树下级节点数据 +export const getOkrRelationTreeChildren = (params) => { + return request.get({ + url: '/admin-api/okr/node/node-tree', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取我的组员 +export const getMyMemberList = (params) => { + return request.get({ + url: '/admin-api/okr/node/my-members', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取我的组员节点树 +export const getMySonNodeTree = (params) => { + return request.get({ + url: '/admin-api/okr/node/member/node/list', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取我的组员OKR列表 +export const getMySonOkrPage = (params) => { + return request.get({ + url: '/admin-api/okr/node/member/objective/list', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 获取渠道 +export const getChannelOptions = () => { + return request.get({ + url: '/admin-api/okr/node/source' + // headers: { 'instance-id': 1016 } + }) +} diff --git a/src/api/okr/wait.js b/src/api/okr/wait.js new file mode 100644 index 0000000..fa8517e --- /dev/null +++ b/src/api/okr/wait.js @@ -0,0 +1,83 @@ +import request from '@/config/axios' + +// 创建 +export const createWait = (data) => { + return request.post({ + url: '/admin-api/okr/agent-work/create', + data, + isSubmitForm: true + // headers: { 'instance-id': 1016 } + }) +} + +// 修改 +export const updateWait = (data) => { + return request.put({ + url: '/admin-api/okr/agent-work/update', + data + // headers: { 'instance-id': 1016 } + }) +} + +// 分页 +export const getWaitPage = (params) => { + return request.get({ + url: '/admin-api/okr/agent-work/page', + params + // headers: { 'instance-id': 1016 } + }) +} + +// 详情 +export const getWaitDetail = (id) => { + return request.get({ + url: '/admin-api/okr/agent-work/get', + params: { id } + // headers: { 'instance-id': 1016 } + }) +} + +// 删除 +export const deleteWait = (id) => { + return request.delete({ + url: '/admin-api/okr/agent-work/delete', + params: { id } + // headers: { 'instance-id': 1016 } + }) +} + +// 催办 +export const urgeWait = (workId) => { + return request.get({ + url: '/admin-api/okr/agent-work/urge', + params: { workId } + // headers: { 'instance-id': 1016 } + }) +} + +// 跟进待办 +export const followWait = (data) => { + return request.post({ + url: '/admin-api/okr/agent-work-follow/create', + data, + isSubmitForm: true + // headers: { 'instance-id': 1016 } + }) +} + +// 查询跟进记录 +export const getFollowWaitPage = (params) => { + return request.get({ + url: '/admin-api/okr/agent-work-follow/list', + params + // headers: { 'instance-id': 1016 } + }) +} + +export const getWaitCount = (params) => { + return request.get({ + url: '/admin-api/okr/agent-work/getAgentWorkNum', + params + // headers: { 'instance-id': 1016 } + }) +} diff --git a/src/api/pers/attendancePlan.js b/src/api/pers/attendancePlan.js new file mode 100644 index 0000000..2e27ad3 --- /dev/null +++ b/src/api/pers/attendancePlan.js @@ -0,0 +1,36 @@ +import request from '@/config/axios' + +// 创建 +export const createPlan = (data) => { + return request.post({ url: '/admin-api/oa/attendance-setting/create', data, isSubmitForm: true }) +} + +// 修改 +export const updatePlan = (data) => { + return request.put({ url: '/admin-api/oa/attendance-setting/update', data }) +} + +// 修改状态 +export const updatePlanStatus = (data) => { + return request.put({ url: '/admin-api/oa/attendance-setting/status/update', data }) +} + +// 分页 +export const getPlanPage = (params) => { + return request.get({ url: '/admin-api/oa/attendance-setting/page', params }) +} + +// 列表 +export const getPlanSimpleList = (params) => { + return request.get({ url: '/admin-api/oa/attendance-setting/simple-list', params }) +} + +// 详情 +export const getPlanDetail = (id) => { + return request.get({ url: '/admin-api/oa/attendance-setting/get', params: { id } }) +} + +// 删除 +export const deletePlan = (id) => { + return request.delete({ url: '/admin-api/oa/attendance-setting/delete', params: { id } }) +} diff --git a/src/api/pers/employee.js b/src/api/pers/employee.js new file mode 100644 index 0000000..bc12147 --- /dev/null +++ b/src/api/pers/employee.js @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +// 创建 +export const createEmployee = (data) => { + return request.post({ url: '/admin-api/oa/employee/create', data, isSubmitForm: true }) +} + +// 分页 +export const getEmployeeSimpleList = (params) => { + return request.get({ url: '/admin-api/oa/employee/list-all-simple', params }) +} + +// 修改 +export const updateEmployee = (data) => { + return request.put({ url: '/admin-api/oa/employee/update', data }) +} + +// 修改状态 +export const updateEmployeeStatus = (data) => { + return request.put({ url: '/admin-api/oa/employee/status/update', data }) +} + +// 分页 +export const getEmployeePage = (params) => { + return request.get({ url: '/admin-api/oa/employee/page', params }) +} + +// 详情 +export const getEmployeeDetail = (id) => { + return request.get({ url: '/admin-api/oa/employee/get', params: { id } }) +} + +// 删除 +export const deleteEmployee = (id) => { + return request.delete({ url: '/admin-api/oa/employee/delete', params: { id } }) +} + +// 获取钉钉id +export const getDingUserId = (params) => { + return request.get({ url: '/admin-api/oa/employee/getDingTalkUserIdByMobile', params }) +} diff --git a/src/permission.js b/src/permission.js index bf1625c..2dcd4fd 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,6 +1,6 @@ import router from './router' import { isRelogin } from '@/config/axios/service' -import { getAccessToken, removeToken } from '@/utils/auth' +import { getAccessToken } from '@/utils/auth' import { useTitle } from '@/hooks/web/useTitle' import { useNProgress } from '@/hooks/web/useNProgress' import { usePageLoading } from '@/hooks/web/usePageLoading' @@ -9,7 +9,6 @@ import { useUserStoreWithOut } from '@/store/modules/user' import { usePermissionStoreWithOut } from '@/store/modules/permission' import { useAppStoreWithOut } from '@/store/modules/app' import { getTenantId, getAppId, setTenantId, setAppId } from '@/utils/auth' -import cache from '@/plugins/cache' const { start, done } = useNProgress() @@ -30,57 +29,51 @@ const whiteList = [ router.beforeEach(async (to, from, next) => { start() loadStart() - if (getAppId() && to.query?.appId && getAppId() != to.query?.appId) { - removeToken() - cache?.local?.delete('appInfo') - cache?.local?.delete('roleRouters') - cache?.local?.delete('user') - cache?.local?.delete('App_ID') - next(`/login?tenantId=${to.query?.tenantId}&appId=${to.query?.appId}`) - } else { - if (getAccessToken()) { - if (to.path === '/login') { - if (to.query?.tenantId && to.query?.appId) { - setApp(to.query.tenantId, to.query.appId) - await waitTime(1500) - } - next({ path: '/' }) - } else { - // 获取所有字典 - const dictStore = useDictStoreWithOut() - const userStore = useUserStoreWithOut() - const permissionStore = usePermissionStoreWithOut() - if (!dictStore.getIsSetDict) { - await dictStore.setDictMap() - } - if (!userStore.getIsSetUser) { - isRelogin.show = true - await userStore.setUserInfoAction() - isRelogin.show = false - // 后端过滤菜单 - await permissionStore.generateRoutes() - permissionStore.getAddRouters.forEach((route) => { - router.addRoute(route) // 动态添加可访问路由表 - }) - const redirectPath = from.query.redirect || to.path - const redirect = decodeURIComponent(redirectPath) - const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect } - next(nextData) - } else { - next() - } + const userStore = useUserStoreWithOut() + if (to.path == '/login') { + userStore.resetState() // 重置用户信息状态 + } + if (getAccessToken()) { + if (to.path === '/login') { + if (to.query?.tenantId && to.query?.appId) { + setApp(to.query.tenantId, to.query.appId) + await waitTime(1500) } + next({ path: '/' }) } else { - if (whiteList.indexOf(to.path) !== -1) { + // 获取所有字典 + const dictStore = useDictStoreWithOut() + const permissionStore = usePermissionStoreWithOut() + if (!dictStore.getIsSetDict) { + await dictStore.setDictMap() + } + if (!userStore.getIsSetUser) { + isRelogin.show = true + await userStore.setUserInfoAction() + isRelogin.show = false + // 后端过滤菜单 + await permissionStore.generateRoutes() + permissionStore.getAddRouters.forEach((route) => { + router.addRoute(route) // 动态添加可访问路由表 + }) + const redirectPath = from.query.redirect || to.path + const redirect = decodeURIComponent(redirectPath) + const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect } + next(nextData) + } else { next() + } + } + } else { + if (whiteList.indexOf(to.path) !== -1) { + next() + } else { + const tenantId = getTenantId() + const appId = getAppId() + if (tenantId && appId) { + next(`/login?tenantId=${tenantId}&appId=${appId}&redirect=${to.fullPath}`) // 否则全部重定向到登录页 } else { - const tenantId = getTenantId() - const appId = getAppId() - if (tenantId && appId) { - next(`/crm/login?tenantId=${tenantId}&appId=${appId}&redirect=${to.fullPath}`) // 否则全部重定向到登录页 - } else { - next(`/crm/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 - } + next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 } } } diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index 3720fda..bbf6ade 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -59,31 +59,20 @@ const remainingRouter: AppRouteRecordRaw[] = [ title: '首页', hidden: true } - // children: [ - // { - // path: '/index', - // component: () => import('@/views/Home/Index.vue'), - // name: 'Home', - // meta: { - // title: '首页', - // icon: 'ep:home-filled', - // noTagsView: true, - // affix: true - // // hidden: true - // } + // children: [ + // { + // path: '/index', + // component: () => import('@/views/Basic/Menu/index.vue'), + // name: 'Home', + // meta: { + // title: '首页', + // icon: 'ep:home-filled', + // noTagsView: true, + // affix: true + // // hidden: true // } - // { - // path: 'menu', - // component: () => import('@/views/Basic/Menu/index.vue'), - // name: 'Menu', - // meta: { - // affix: true, - // noTagsView: true, - // icon: 'ep:user', - // title: '菜单管理' // } - // } - // ] + // ] }, { path: '/swagger', diff --git a/src/router/modules/static.ts b/src/router/modules/static.ts new file mode 100644 index 0000000..0faa34c --- /dev/null +++ b/src/router/modules/static.ts @@ -0,0 +1,73 @@ +const staticRouter: AppCustomRouteRecordRaw[] = [ + { + icon: 'ep:calendar', + path: '/Okr', + component: '', + name: 'OKR', + componentName: '', + redirect: '', + parentId: 0, + visible: true, + alwaysShow: true, + children: [ + { + icon: 'ep:finished', + path: 'okr-management', + name: 'OKR管理', + componentName: 'OkrManagement', + component: 'OKR/Management/index', + visible: true, + alwaysShow: true, + meta: { + title: 'OKR管理' + }, + redirect: '' + }, + { + icon: 'ep:alarm-clock', + path: 'okr-wait', + name: '待办事项', + componentName: 'OkrWait', + component: 'OKR/Wait/index', + meta: { + title: '待办事项' + }, + visible: true, + alwaysShow: true, + redirect: '' + }, + { + icon: 'ep:data-line', + path: 'okr-analysis', + name: 'Okr统计', + componentName: 'OkrAnalysis', + component: 'OKR/Analysis/index', + meta: { + title: 'Okr统计' + }, + visible: true, + alwaysShow: true, + redirect: '' + } + // { + // icon: 'ep:data-board', + // path: 'okr-metting', + // name: '会议管理', + // componentName: 'OkrMetting', + // component: 'OKR/Meeting/index', + // meta: { + // title: '会议管理' + // }, + // visible: true, + // alwaysShow: true, + // redirect: '' + // } + ], + meta: { + title: 'OKR', + icon: 'ep:calendar' + } + } +] + +export default staticRouter diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index 926fac7..f3359a6 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -2,6 +2,7 @@ import { defineStore } from 'pinia' import { store } from '../index' import { cloneDeep } from 'lodash-es' import remainingRouter from '@/router/modules/remaining' +import staticRouter from '@/router/modules/static' import { generateRoute, flatMultiLevelRoutes } from '@/utils/routerHelper' import { CACHE_KEY } from '@/hooks/web/useCache' import cache from '@/plugins/cache' @@ -36,6 +37,25 @@ export const usePermissionStore = defineStore('permission', { if (cache.local.get(CACHE_KEY.ROLE_ROUTERS)) { res = cache.local.get(CACHE_KEY.ROLE_ROUTERS) as AppCustomRouteRecordRaw[] } + const staticRouters = cloneDeep(staticRouter) + // 与动态路由比较,首先判断目录是否存在,如果存在就合并,并替换动态路由中的目录 + staticRouters.forEach((item) => { + const index = res.findIndex((item2) => item2.path === item.path) + if (index !== -1) { + const arr = [] + if (!item.children || item.children.length === 0) { + item.children = arr + } + if (res[index].children && res[index].children.length > 0) { + item.children = item.children.concat(res[index].children) + } + // routerMap[index].children = item.children + // 插入动态路由数组的第二位 + res[index] = { ...res, ...item } + } else { + res = [...staticRouters, ...res] + } + }) const routerMap: AppRouteRecordRaw[] = generateRoute(res) // 动态路由,404一定要放到最后面 this.addRouters = routerMap.concat([ diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index a3d9b7e..01b0b14 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -77,6 +77,7 @@ export const useUserStore = defineStore('admin-user', { nickname: '', currentRole: 0 } + cache.local.delete(CACHE_KEY.USER) }, refresh() { cache.local.delete(CACHE_KEY.USER) diff --git a/src/views/Home/Index.vue b/src/views/Home/Index.vue index 408d216..84dbd03 100644 --- a/src/views/Home/Index.vue +++ b/src/views/Home/Index.vue @@ -13,6 +13,32 @@
+
+
今日待办
+ +
+ +
+
我的待办
+ +
+
今日待跟进
{ + waitCount.value = res + }) +} + +const waitCount = ref({ + dayEndAgentWorkNum: 0, + myAgentWorkNum: 0, + urgeAgentWorkNum: 0, + notifyNum: 0 +}) + const getAllApi = async () => { - await Promise.all([getClueInfo(), getSignList(), getMonthlySaleRate(), getFollowList()]) + await Promise.all([ + getClueInfo(), + getSignList(), + getMonthlySaleRate(), + getFollowList(), + getWaitTargetCount() + ]) loading.value = false } diff --git a/src/views/OKR/Analysis/index.vue b/src/views/OKR/Analysis/index.vue new file mode 100644 index 0000000..3b8d285 --- /dev/null +++ b/src/views/OKR/Analysis/index.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/views/OKR/Management/Components/AllTarget.vue b/src/views/OKR/Management/Components/AllTarget.vue new file mode 100644 index 0000000..55a7f7a --- /dev/null +++ b/src/views/OKR/Management/Components/AllTarget.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/src/views/OKR/Management/Components/DialogOkr.vue b/src/views/OKR/Management/Components/DialogOkr.vue new file mode 100644 index 0000000..cabb65c --- /dev/null +++ b/src/views/OKR/Management/Components/DialogOkr.vue @@ -0,0 +1,681 @@ + + + + + diff --git a/src/views/OKR/Management/Components/DialogOkrInfo.vue b/src/views/OKR/Management/Components/DialogOkrInfo.vue new file mode 100644 index 0000000..2dc6422 --- /dev/null +++ b/src/views/OKR/Management/Components/DialogOkrInfo.vue @@ -0,0 +1,632 @@ + + + + + diff --git a/src/views/OKR/Management/Components/MyDuty.vue b/src/views/OKR/Management/Components/MyDuty.vue new file mode 100644 index 0000000..6373f79 --- /dev/null +++ b/src/views/OKR/Management/Components/MyDuty.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/src/views/OKR/Management/Components/MySon.vue b/src/views/OKR/Management/Components/MySon.vue new file mode 100644 index 0000000..2b2ad26 --- /dev/null +++ b/src/views/OKR/Management/Components/MySon.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/src/views/OKR/Management/Components/ObjectList.vue b/src/views/OKR/Management/Components/ObjectList.vue new file mode 100644 index 0000000..be3508d --- /dev/null +++ b/src/views/OKR/Management/Components/ObjectList.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/src/views/OKR/Management/Components/OkrTable.vue b/src/views/OKR/Management/Components/OkrTable.vue new file mode 100644 index 0000000..d1f165c --- /dev/null +++ b/src/views/OKR/Management/Components/OkrTable.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/src/views/OKR/Management/index.vue b/src/views/OKR/Management/index.vue new file mode 100644 index 0000000..c8c9d0c --- /dev/null +++ b/src/views/OKR/Management/index.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/src/views/OKR/Wait/Components/DialogWait.vue b/src/views/OKR/Wait/Components/DialogWait.vue new file mode 100644 index 0000000..25c1697 --- /dev/null +++ b/src/views/OKR/Wait/Components/DialogWait.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/src/views/OKR/Wait/index.vue b/src/views/OKR/Wait/index.vue new file mode 100644 index 0000000..7dafc56 --- /dev/null +++ b/src/views/OKR/Wait/index.vue @@ -0,0 +1,297 @@ + + + + + diff --git a/yarn.lock b/yarn.lock index 21e6c31..20279a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1227,7 +1227,7 @@ resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== -"@element-plus/icons-vue@^2.0.6", "@element-plus/icons-vue@^2.1.0": +"@element-plus/icons-vue@^2.1.0", "@element-plus/icons-vue@^2.3.1": version "2.3.1" resolved "https://registry.yarnpkg.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz#1f635ad5fdd5c85ed936481525570e82b5a8307a" integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg== @@ -1961,6 +1961,11 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== +"@types/sortablejs@^1.15.8": + version "1.15.8" + resolved "https://registry.yarnpkg.com/@types/sortablejs/-/sortablejs-1.15.8.tgz#11ed555076046e00869a5ef85d1e7651e7a66ef6" + integrity sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg== + "@types/svgo@^2.6.1": version "2.6.4" resolved "https://registry.yarnpkg.com/@types/svgo/-/svgo-2.6.4.tgz#b7298fc1dd687539fd63fc818b00146d96e68836" @@ -3362,6 +3367,11 @@ core-js@^3.31.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.36.1.tgz#c97a7160ebd00b2de19e62f4bbd3406ab720e578" integrity sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA== +core-js@^3.6.5: + version "3.42.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37" + integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g== + cors@^2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" @@ -3515,7 +3525,12 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -dayjs@^1.11.3, dayjs@^1.11.7: +dayjs@^1.11.13: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + +dayjs@^1.11.7: version "1.11.10" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== @@ -3827,20 +3842,20 @@ electron-to-chromium@^1.4.668: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz#ecb4348f4d5c70fb1e31c347e5bad6b751066416" integrity sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q== -element-plus@2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.3.4.tgz#4319f6b0a1096cfac9c53b69da2fe23ac5aea63e" - integrity sha512-SQr0J9z7N4z48WYk/l9NE2tizl8Q7j2OhqlpTc42k4pGncry3+rVX6dsmcsglFynn6vt3NzYxWJqmLFyDKQq+g== +element-plus@2.9.4: + version "2.9.4" + resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.9.4.tgz#e4b75055f0f1b1c1f33186321eb3d7a6424051e5" + integrity sha512-sGnW0wd9zf6lEGixXV2gfwx3X6VTMkP52qTkX7zbURJ2oariyslrKTBh2txt1sdn1pUvj2l0KY3OfSXoZGmDOw== dependencies: "@ctrl/tinycolor" "^3.4.1" - "@element-plus/icons-vue" "^2.0.6" + "@element-plus/icons-vue" "^2.3.1" "@floating-ui/dom" "^1.0.1" "@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7" "@types/lodash" "^4.14.182" "@types/lodash-es" "^4.17.6" "@vueuse/core" "^9.1.0" async-validator "^4.2.5" - dayjs "^1.11.3" + dayjs "^1.11.13" escape-html "^1.0.3" lodash "^4.17.21" lodash-es "^4.17.21" @@ -8161,6 +8176,13 @@ vue-dompurify-html@^5.0.1: dependencies: dompurify "^3.0.0" +vue-draggable-plus@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/vue-draggable-plus/-/vue-draggable-plus-0.6.0.tgz#e4da6917e94ca73402f34113073f44771691fa5e" + integrity sha512-G5TSfHrt9tX9EjdG49InoFJbt2NYk0h3kgjgKxkFWr3ulIUays0oFObr5KZ8qzD4+QnhtALiRwIqY6qul4egqw== + dependencies: + "@types/sortablejs" "^1.15.8" + vue-eslint-parser@^9.4.2: version "9.4.2" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz#02ffcce82042b082292f2d1672514615f0d95b6d" @@ -8215,6 +8237,13 @@ vue-types@^5.0.3: dependencies: is-plain-object "5.0.0" +vue3-tree-org@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/vue3-tree-org/-/vue3-tree-org-4.2.2.tgz#6b711dc6e7c5aac99d9b7ff169a432435080cb4b" + integrity sha512-AG2SykyD6dw0jIyqBm8iuF9j9GWli6KrwudxR1RjULCCBTDFsoNm7MmP/weKT7wowN/sPk+e2RsnvEJMw2OJMw== + dependencies: + core-js "^3.6.5" + vue@3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6"