diff --git a/package.json b/package.json index befcac8..3b73023 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,14 @@ "@element-plus/icons-vue": "^2.3.2", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^1.0.2", + "axios": "^1.12.2", "core-js": "^3.8.3", "d3": "^7.9.0", "echarts": "^6.0.0", "element-plus": "^2.11.4", + "pinia": "^3.0.3", "vue": "^3.2.13", - "vue-router": "^4.0.3", - "vuex": "^4.0.0" + "vue-router": "^4.0.3" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.4.0", @@ -47,12 +48,15 @@ "parserOptions": { "ecmaVersion": 2020 }, - "rules": {}, + "rules": { + "vue/multi-word-component-names": "off" + }, "globals": { "defineProps": "readonly", "defineEmits": "readonly", "defineExpose": "readonly", - "withDefaults": "readonly" + "withDefaults": "readonly", + "defineOptions": "readonly" } }, "browserslist": [ diff --git a/src/api/auth.ts b/src/api/auth.ts new file mode 100644 index 0000000..245df6f --- /dev/null +++ b/src/api/auth.ts @@ -0,0 +1,67 @@ +import { post, get } from './request' + +// 登录接口 +export interface LoginParams { + username: string + password: string + loginType: number // 登录类型,固定为2 +} + +// 菜单项接口 +export interface MenuItem { + id: string + name: string + code: string + icon: string + path: string + parentId: string + sort: number + type: number + children?: MenuItem[] +} + +// 用户信息接口 +export interface UserInfo { + userId: string + username: string + realName: string + email: string + phone: string + status: number + lastLoginIp: string + lastLoginTime: string + roles: string[] + permissions: string[] + menus: MenuItem[] +} + +export interface LoginResponse { + token: string + userInfo?: UserInfo +} + +export interface UserInfoResponse { + code: number + data: UserInfo + message: string +} + +// 用户登录 +export function login(data: LoginParams) { + return post('/api/system/auth/login', data) +} + +// 获取当前用户信息 +export function getUserInfo() { + return get('/api/system/auth/info') +} + +// 登出接口 +export function logout() { + return post('/api/system/auth/logout') +} + +// 刷新 token +export function refreshToken() { + return post('/api/system/auth/refresh') +} diff --git a/src/api/content.ts b/src/api/content.ts new file mode 100644 index 0000000..2e46cf6 --- /dev/null +++ b/src/api/content.ts @@ -0,0 +1,88 @@ +import { get, post, put, del } from './request' + +// ==================== 新闻政策 ==================== +export interface NewsPolicyItem { + id?: string + title: string + status: string + author: string + publishTime: string + content?: string +} + +// 通用分页参数 +export interface PageParams { + page: number + pageSize: number + keyword?: string + status?: string + [key: string]: any +} + +// 通用分页响应 +export interface PageResponse { + list: T[] + total: number + page: number + pageSize: number +} + +// 获取新闻政策列表 +export function getNewsPolicyList(params: PageParams) { + return get>('/content/news-policy/list', params) +} + +// 获取新闻政策详情 +export function getNewsPolicyDetail(id: string) { + return get(`/content/news-policy/${id}`) +} + +// 创建新闻政策 +export function createNewsPolicy(data: NewsPolicyItem) { + return post('/content/news-policy', data) +} + +// 更新新闻政策 +export function updateNewsPolicy(id: string, data: NewsPolicyItem) { + return put(`/content/news-policy/${id}`, data) +} + +// 删除新闻政策 +export function deleteNewsPolicy(id: string) { + return del(`/content/news-policy/${id}`) +} + +// ==================== 科技问答 ==================== +export interface QAItem { + id?: string + question: string + answer: string + category: string + status: string + createTime: string +} + +// 获取科技问答列表 +export function getQAList(params: PageParams) { + return get>('/content/smart-qa/list', params) +} + +// 获取科技问答详情 +export function getQADetail(id: string) { + return get(`/content/smart-qa/${id}`) +} + +// 创建科技问答 +export function createQA(data: QAItem) { + return post('/content/smart-qa', data) +} + +// 更新科技问答 +export function updateQA(id: string, data: QAItem) { + return put(`/content/smart-qa/${id}`, data) +} + +// 删除科技问答 +export function deleteQA(id: string) { + return del(`/content/smart-qa/${id}`) +} diff --git a/src/api/dashboard.ts b/src/api/dashboard.ts new file mode 100644 index 0000000..61f7922 --- /dev/null +++ b/src/api/dashboard.ts @@ -0,0 +1,52 @@ +import { get } from './request' + +// 统计数据 +export interface StatsData { + news: number + qa: number + resources: number + talents: number +} + +// 获取统计数据 +export function getStats() { + return get('/dashboard/stats') +} + +// 趋势数据 +export interface TrendData { + dates: string[] + newsPolicy: number[] + smartQA: number[] + techResources: number[] + talentProfile: number[] +} + +// 获取趋势数据 +export function getTrendData(params?: { startDate?: string; endDate?: string }) { + return get('/dashboard/trend', params) +} + +// 访问统计 +export interface VisitStats { + name: string + value: number +} + +// 获取访问统计 +export function getVisitStats() { + return get('/dashboard/visit-stats') +} + +// 活动记录 +export interface Activity { + id: string + text: string + time: string + type: string +} + +// 获取最新活动 +export function getRecentActivities(params?: { limit?: number }) { + return get('/dashboard/activities', params) +} diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..49b973b --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,11 @@ +// 统一导出所有 API +export * from './auth' +export * from './content' +export * from './tech-resources' +export * from './system' +export * from './dashboard' +export * from './upload' + +// 导出请求方法 +export { get, post, put, del } from './request' +export type { ResponseData } from './request' diff --git a/src/api/request.ts b/src/api/request.ts new file mode 100644 index 0000000..90134a1 --- /dev/null +++ b/src/api/request.ts @@ -0,0 +1,142 @@ +import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios' +import { ElMessage } from 'element-plus' +import router from '@/router' +import { getEnvConfig } from '@/config/env' + +// 获取环境配置 +const envConfig = getEnvConfig() + +// 创建 axios 实例 +const service: AxiosInstance = axios.create({ + baseURL: envConfig.baseURL, + timeout: envConfig.timeout, + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } +}) + +// 请求拦截器 +service.interceptors.request.use( + (config) => { + // 从 localStorage 获取 token + const token = localStorage.getItem('token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + return config + }, + (error: AxiosError) => { + console.error('请求错误:', error) + return Promise.reject(error) + } +) + +// 响应拦截器 +service.interceptors.response.use( + (response: AxiosResponse) => { + const res = response.data + + // 根据后端返回的状态码进行处理 + // 这里假设后端返回格式为 { code: number, data: any, message: string } + if (res.code !== undefined && res.code !== 200 && res.code !== 0) { + ElMessage.error(res.message || '请求失败') + + // 401: 未授权,跳转到登录页 + if (res.code === 401) { + localStorage.removeItem('token') + router.push('/login') + } + + return Promise.reject(new Error(res.message || '请求失败')) + } + + return res + }, + (error: AxiosError) => { + console.error('响应错误:', error) + + if (error.response) { + const status = error.response.status + + switch (status) { + case 401: + ElMessage.error('未授权,请重新登录') + localStorage.removeItem('token') + router.push('/login') + break + case 403: + ElMessage.error('拒绝访问') + break + case 404: + ElMessage.error('请求的资源不存在') + break + case 500: + ElMessage.error('服务器内部错误') + break + case 502: + ElMessage.error('网关错误') + break + case 503: + ElMessage.error('服务不可用') + break + case 504: + ElMessage.error('网关超时') + break + default: + ElMessage.error(error.message || '请求失败') + } + } else if (error.request) { + ElMessage.error('网络错误,请检查网络连接') + } else { + ElMessage.error('请求配置错误') + } + + return Promise.reject(error) + } +) + +// 通用请求方法 +export interface ResponseData { + code: number + data: T + message: string +} + +// GET 请求 +export function get( + url: string, + params?: unknown, + config?: AxiosRequestConfig +): Promise> { + return service.get(url, { params, ...config }) +} + +// POST 请求 +export function post( + url: string, + data?: unknown, + config?: AxiosRequestConfig +): Promise> { + return service.post(url, data, config) +} + +// PUT 请求 +export function put( + url: string, + data?: unknown, + config?: AxiosRequestConfig +): Promise> { + return service.put(url, data, config) +} + +// DELETE 请求 +export function del( + url: string, + params?: unknown, + config?: AxiosRequestConfig +): Promise> { + return service.delete(url, { params, ...config }) +} + +// 导出 axios 实例 +export default service diff --git a/src/api/system.ts b/src/api/system.ts new file mode 100644 index 0000000..963afd6 --- /dev/null +++ b/src/api/system.ts @@ -0,0 +1,139 @@ +import { get, post, put, del } from "./request"; +import { PageParams, PageResponse } from "./content"; + +// ==================== 用户管理 ==================== +export interface UserItem { + id?: string; + username: string; + realName: string; + email: string; + role: string; + status: string; + lastLogin: string; + password?: string; +} + +export function getUserList(params: PageParams) { + return get>("/system/users/list", params); +} + +export function getUserDetail(id: string) { + return get(`/system/users/${id}`); +} + +export function createUser(data: UserItem) { + return post("/system/users", data); +} + +export function updateUser(id: string, data: UserItem) { + return put(`/system/users/${id}`, data); +} + +export function deleteUser(id: string) { + return del(`/system/users/${id}`); +} + +export function toggleUserStatus(id: string, status: string) { + return put(`/system/users/${id}/status`, { status }); +} + +// ==================== 权限管理 ==================== +export interface RoleItem { + id?: string; + roleName: string; + roleCode: string; + description: string; + permissions: string[]; + status: string; + updateTime: string; +} + +export function getRoleList(params: PageParams) { + return get>("/system/roles/list", params); +} + +export function getRoleDetail(id: string) { + return get(`/system/roles/${id}`); +} + +export function createRole(data: RoleItem) { + return post("/system/roles", data); +} + +export function updateRole(id: string, data: RoleItem) { + return put(`/system/roles/${id}`, data); +} + +export function deleteRole(id: string) { + return del(`/system/roles/${id}`); +} + +export function updateRolePermissions(id: string, permissions: string[]) { + return put(`/system/roles/${id}/permissions`, { permissions }); +} + +// 获取所有权限列表 +export function getPermissionList() { + return get("/system/permissions/all"); +} + +// ==================== 字典管理 ==================== +export interface DictItem { + id?: string; + paramName: string; + paramType: string; + paramValue: string; + dataType: string; + sortOrder: number; + status: number; + flag: number; + remark?: string; + createBy?: string; + createTime?: string; + updateBy?: string; + updateTime?: string; +} + +// 新增字典 +export function createDict(data: DictItem) { + return post("/system/param", data); +} + +// 修改字典 +export function updateDict(data: DictItem) { + return put("/system/param", data); +} + +// 删除字典 +export function deleteDict(id: string) { + return del(`/system/param/${id}`); +} + +// 分页查询字典列表 +export interface DictListParams extends PageParams { + typeCode?: string; +} + +export function getDictList(params: DictListParams) { + return get>("/system/param/list", params); +} + +// 根据参数类型获取参数列表 +export function getDictByType(typeCode: string) { + return get(`/system/param/type/${typeCode}`); +} + +// 批量获取多个字典类型的字典列表 +export function getBatchDictList(typeCodes: string) { + return get>("/system/param/batch", { typeCodes }); +} + +// 获取字典值 +export function getDictValue(params: { paramType?: string; paramName?: string }) { + return get("/system/param/value", params); +} + +// 刷新字典缓存 +export function refreshDictCache(typeCode?: string) { + return post("/system/param/refresh", { typeCode }); +} diff --git a/src/api/tech-resources.ts b/src/api/tech-resources.ts new file mode 100644 index 0000000..57ec0e5 --- /dev/null +++ b/src/api/tech-resources.ts @@ -0,0 +1,194 @@ +import { get, post, put, del } from './request' +import { PageParams, PageResponse } from './content' + +// ==================== 科技资源 ==================== +export interface ResourceItem { + id?: string + name: string + type: string + organization: string + status: string + updateTime: string + description?: string +} + +export function getResourceList(params: PageParams) { + return get>('/tech-resources/resources/list', params) +} + +export function getResourceDetail(id: string) { + return get(`/tech-resources/resources/${id}`) +} + +export function createResource(data: ResourceItem) { + return post('/tech-resources/resources', data) +} + +export function updateResource(id: string, data: ResourceItem) { + return put(`/tech-resources/resources/${id}`, data) +} + +export function deleteResource(id: string) { + return del(`/tech-resources/resources/${id}`) +} + +// ==================== 人才档案 ==================== +export interface TalentItem { + id?: string + name: string + title: string + field: string + organization: string + level: string + updateTime: string + description?: string +} + +export function getTalentList(params: PageParams) { + return get>('/tech-resources/talent-profile/list', params) +} + +export function getTalentDetail(id: string) { + return get(`/tech-resources/talent-profile/${id}`) +} + +export function createTalent(data: TalentItem) { + return post('/tech-resources/talent-profile', data) +} + +export function updateTalent(id: string, data: TalentItem) { + return put(`/tech-resources/talent-profile/${id}`, data) +} + +export function deleteTalent(id: string) { + return del(`/tech-resources/talent-profile/${id}`) +} + +// ==================== 科技项目 ==================== +export interface ProjectItem { + id?: string + name: string + category: string + organization: string + fundingAmount: string + applicationYear: string + status: string + description?: string +} + +export function getProjectList(params: PageParams) { + return get>('/tech-resources/projects/list', params) +} + +export function getProjectDetail(id: string) { + return get(`/tech-resources/projects/${id}`) +} + +export function createProject(data: ProjectItem) { + return post('/tech-resources/projects', data) +} + +export function updateProject(id: string, data: ProjectItem) { + return put(`/tech-resources/projects/${id}`, data) +} + +export function deleteProject(id: string) { + return del(`/tech-resources/projects/${id}`) +} + +// ==================== 科技成果 ==================== +export interface AchievementItem { + id?: string + name: string + type: string + author: string + organization: string + level: string + date: string + description?: string +} + +export function getAchievementList(params: PageParams) { + return get>('/tech-resources/achievements/list', params) +} + +export function getAchievementDetail(id: string) { + return get(`/tech-resources/achievements/${id}`) +} + +export function createAchievement(data: AchievementItem) { + return post('/tech-resources/achievements', data) +} + +export function updateAchievement(id: string, data: AchievementItem) { + return put(`/tech-resources/achievements/${id}`, data) +} + +export function deleteAchievement(id: string) { + return del(`/tech-resources/achievements/${id}`) +} + +// ==================== 科技报告 ==================== +export interface ReportItem { + id?: string + title: string + type: string + author: string + department: string + status: string + publishDate: string + content?: string +} + +export function getReportList(params: PageParams) { + return get>('/tech-resources/reports/list', params) +} + +export function getReportDetail(id: string) { + return get(`/tech-resources/reports/${id}`) +} + +export function createReport(data: ReportItem) { + return post('/tech-resources/reports', data) +} + +export function updateReport(id: string, data: ReportItem) { + return put(`/tech-resources/reports/${id}`, data) +} + +export function deleteReport(id: string) { + return del(`/tech-resources/reports/${id}`) +} + +// ==================== 科技奖励 ==================== +export interface AwardItem { + id?: string + awardName: string + category: string + awardingOrganization: string + awardTime: string + awardYear: string + winner: string + status: string + description?: string +} + +export function getAwardList(params: PageParams) { + return get>('/tech-resources/awards/list', params) +} + +export function getAwardDetail(id: string) { + return get(`/tech-resources/awards/${id}`) +} + +export function createAward(data: AwardItem) { + return post('/tech-resources/awards', data) +} + +export function updateAward(id: string, data: AwardItem) { + return put(`/tech-resources/awards/${id}`, data) +} + +export function deleteAward(id: string) { + return del(`/tech-resources/awards/${id}`) +} diff --git a/src/api/upload.ts b/src/api/upload.ts new file mode 100644 index 0000000..ec50f3f --- /dev/null +++ b/src/api/upload.ts @@ -0,0 +1,153 @@ +import service from './request' +import { ResponseData } from './request' + +// 上传响应数据 +export interface UploadResponse { + url: string // 文件访问地址 + fileName: string // 文件名 + fileSize: number // 文件大小(字节) + fileType: string // 文件类型 +} + +/** + * 上传文件到阿里云 OSS + * @param file 文件对象 + * @param onProgress 上传进度回调 + * @returns Promise> + */ +export function uploadFile( + file: File, + onProgress?: (progressEvent: any) => void +): Promise> { + const formData = new FormData() + formData.append('file', file) + + return service.post('/oss/upload', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + }, + onUploadProgress: onProgress + }) +} + +/** + * 批量上传文件 + * @param files 文件数组 + * @param onProgress 上传进度回调 + * @returns Promise> + */ +export function uploadFiles( + files: File[], + onProgress?: (progressEvent: any) => void +): Promise> { + const formData = new FormData() + files.forEach((file) => { + formData.append('files', file) + }) + + return service.post('/oss/upload/batch', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + }, + onUploadProgress: onProgress + }) +} + +/** + * 上传图片(带图片压缩和格式验证) + * @param file 图片文件 + * @param options 配置选项 + * @returns Promise> + */ +export interface UploadImageOptions { + maxSize?: number // 最大文件大小(MB),默认 5MB + allowedTypes?: string[] // 允许的文件类型,默认 ['image/jpeg', 'image/png', 'image/gif', 'image/webp'] + onProgress?: (progressEvent: any) => void +} + +export function uploadImage( + file: File, + options: UploadImageOptions = {} +): Promise> { + const { + maxSize = 5, + allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'], + onProgress + } = options + + // 验证文件类型 + if (!allowedTypes.includes(file.type)) { + return Promise.reject(new Error(`只支持上传 ${allowedTypes.join(', ')} 格式的图片`)) + } + + // 验证文件大小 + const maxSizeBytes = maxSize * 1024 * 1024 + if (file.size > maxSizeBytes) { + return Promise.reject(new Error(`图片大小不能超过 ${maxSize}MB`)) + } + + return uploadFile(file, onProgress) +} + +/** + * 上传文档(Word、Excel、PDF 等) + * @param file 文档文件 + * @param options 配置选项 + * @returns Promise> + */ +export interface UploadDocumentOptions { + maxSize?: number // 最大文件大小(MB),默认 10MB + allowedTypes?: string[] // 允许的文件类型 + onProgress?: (progressEvent: any) => void +} + +export function uploadDocument( + file: File, + options: UploadDocumentOptions = {} +): Promise> { + const { + maxSize = 10, + allowedTypes = [ + 'application/pdf', + 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/vnd.ms-powerpoint', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation' + ], + onProgress + } = options + + // 验证文件类型 + if (!allowedTypes.includes(file.type)) { + return Promise.reject(new Error('不支持的文档格式')) + } + + // 验证文件大小 + const maxSizeBytes = maxSize * 1024 * 1024 + if (file.size > maxSizeBytes) { + return Promise.reject(new Error(`文档大小不能超过 ${maxSize}MB`)) + } + + return uploadFile(file, onProgress) +} + +/** + * 删除文件 + * @param url 文件地址 + * @returns Promise> + */ +export function deleteFile(url: string): Promise> { + return service.post('/oss/delete', { url }) +} + +/** + * 获取文件临时访问地址(用于私有文件) + * @param url 文件地址 + * @param expires 过期时间(秒),默认 3600 + * @returns Promise> + */ +export function getFileUrl(url: string, expires = 3600): Promise> { + return service.post('/oss/getUrl', { url, expires }) +} diff --git a/src/components/UploadExample.vue b/src/components/UploadExample.vue new file mode 100644 index 0000000..336576a --- /dev/null +++ b/src/components/UploadExample.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/src/config/env.ts b/src/config/env.ts new file mode 100644 index 0000000..423e927 --- /dev/null +++ b/src/config/env.ts @@ -0,0 +1,24 @@ +// 环境配置 +export const ENV = { + // 开发环境 + development: { + baseURL: '/brain', // 开发环境使用代理 + timeout: 15000 + }, + // 生产环境 + production: { + baseURL: 'http://47.110.148.47:8090/brain', + timeout: 15000 + }, + // 测试环境 + test: { + baseURL: 'http://47.110.148.47:8090/brain', + timeout: 15000 + } +} + +// 获取当前环境配置 +export function getEnvConfig() { + const env = process.env.NODE_ENV || 'development' + return ENV[env as keyof typeof ENV] || ENV.development +} diff --git a/src/layouts/AdminLayout.vue b/src/layouts/AdminLayout.vue index 62bc2de..6aceab3 100644 --- a/src/layouts/AdminLayout.vue +++ b/src/layouts/AdminLayout.vue @@ -9,7 +9,7 @@ \ No newline at end of file diff --git a/src/views/admin/README.md b/src/views/admin/README.md new file mode 100644 index 0000000..41c65ea --- /dev/null +++ b/src/views/admin/README.md @@ -0,0 +1,67 @@ +# 后台管理系统页面结构 + +## 文件夹组织 + +``` +src/views/admin/ +├── dashboard/ # 数据概览 +│ └── index.vue # 数据概览主页 +├── content/ # 内容管理 +│ ├── news-policy.vue # 新闻政策列表页 +│ ├── news-policy-form.vue # 新闻政策表单页 +│ ├── smart-qa.vue # 科技问答列表页 +│ └── smart-qa-form.vue # 科技问答表单页 +├── tech-resources/ # 科技资源 +│ ├── resources.vue # 科技资源列表页 +│ ├── resources-form.vue # 科技资源表单页 +│ ├── talent-profile.vue # 人才档案列表页 +│ ├── talent-profile-form.vue # 人才档案表单页 +│ ├── projects.vue # 科技项目列表页 +│ ├── projects-form.vue # 科技项目表单页 +│ ├── achievements.vue # 科技成果列表页 +│ ├── achievements-form.vue # 科技成果表单页 +│ ├── reports.vue # 科技报告列表页 +│ ├── reports-form.vue # 科技报告表单页 +│ ├── awards.vue # 科技奖励列表页 +│ └── awards-form.vue # 科技奖励表单页 +└── system/ # 系统管理 + ├── users.vue # 用户管理页 + └── permissions.vue # 权限管理页 +``` + +## 路由结构 + +### 数据概览 +- `/admin/dashboard` - 数据概览主页 + +### 内容管理 +- `/admin/news-policy` - 新闻政策列表 +- `/admin/news-policy/create` - 新增新闻政策 +- `/admin/news-policy/edit/:id` - 编辑新闻政策 +- `/admin/smart-qa` - 科技问答列表 +- `/admin/smart-qa/create` - 新增科技问答 +- `/admin/smart-qa/edit/:id` - 编辑科技问答 + +### 科技资源 +- `/admin/tech-resources` - 科技资源列表 +- `/admin/tech-resources/create` - 新增科技资源 +- `/admin/tech-resources/edit/:id` - 编辑科技资源 +- `/admin/talent-profile` - 人才档案列表 +- `/admin/talent-profile/create` - 新增人才档案 +- `/admin/talent-profile/edit/:id` - 编辑人才档案 +- `/admin/tech-projects` - 科技项目列表 +- `/admin/tech-projects/create` - 新增科技项目 +- `/admin/tech-projects/edit/:id` - 编辑科技项目 +- `/admin/tech-achievements` - 科技成果列表 +- `/admin/tech-achievements/create` - 新增科技成果 +- `/admin/tech-achievements/edit/:id` - 编辑科技成果 +- `/admin/tech-reports` - 科技报告列表 +- `/admin/tech-reports/create` - 新增科技报告 +- `/admin/tech-reports/edit/:id` - 编辑科技报告 +- `/admin/tech-awards` - 科技奖励列表 +- `/admin/tech-awards/create` - 新增科技奖励 +- `/admin/tech-awards/edit/:id` - 编辑科技奖励 + +### 系统管理 +- `/admin/users` - 用户管理 +- `/admin/permissions` - 权限管理 \ No newline at end of file diff --git a/src/views/admin/NewsPolicyForm.vue b/src/views/admin/content/news-policy-form.vue similarity index 99% rename from src/views/admin/NewsPolicyForm.vue rename to src/views/admin/content/news-policy-form.vue index c92d428..6a3143a 100644 --- a/src/views/admin/NewsPolicyForm.vue +++ b/src/views/admin/content/news-policy-form.vue @@ -169,6 +169,10 @@ + + diff --git a/src/views/admin/PermissionsAdmin.vue b/src/views/admin/system/permissions.vue similarity index 98% rename from src/views/admin/PermissionsAdmin.vue rename to src/views/admin/system/permissions.vue index ec55297..5f63074 100644 --- a/src/views/admin/PermissionsAdmin.vue +++ b/src/views/admin/system/permissions.vue @@ -87,6 +87,10 @@ import { ref, reactive, onMounted } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' +defineOptions({ + name: 'PermissionsAdmin' +}) + interface RoleItem { id: string roleName: string @@ -166,10 +170,12 @@ const handleAdd = () => { const handleEdit = (row: RoleItem) => { ElMessage.info('编辑功能开发中') + console.log(row) } const handlePermissions = (row: RoleItem) => { ElMessage.info('权限配置功能开发中') + console.log(row) } const handleDelete = (row: RoleItem) => { diff --git a/src/views/admin/UsersAdmin.vue b/src/views/admin/system/users.vue similarity index 99% rename from src/views/admin/UsersAdmin.vue rename to src/views/admin/system/users.vue index 0857530..e6b4f90 100644 --- a/src/views/admin/UsersAdmin.vue +++ b/src/views/admin/system/users.vue @@ -89,6 +89,10 @@ import { ref, reactive, onMounted } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' +defineOptions({ + name: 'UsersAdmin' +}) + interface UserItem { id: string username: string @@ -168,6 +172,7 @@ const handleAdd = () => { const handleEdit = (row: UserItem) => { ElMessage.info('编辑功能开发中') + console.log(row) } const handleToggleStatus = (row: UserItem) => { diff --git a/src/views/admin/TechAchievementsForm.vue b/src/views/admin/tech-resources/achievements-form.vue similarity index 99% rename from src/views/admin/TechAchievementsForm.vue rename to src/views/admin/tech-resources/achievements-form.vue index 666c8b3..e093a31 100644 --- a/src/views/admin/TechAchievementsForm.vue +++ b/src/views/admin/tech-resources/achievements-form.vue @@ -187,6 +187,10 @@ + + \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index 910e297..e39b5b2 100644 --- a/vue.config.js +++ b/vue.config.js @@ -1,4 +1,17 @@ const { defineConfig } = require('@vue/cli-service') module.exports = defineConfig({ - transpileDependencies: true + transpileDependencies: true, + devServer: { + port: 8080, + proxy: { + '/brain': { + target: 'http://47.110.148.47:8090', + changeOrigin: true, + ws: true, + pathRewrite: { + '^/brain': '/brain' + } + } + } + } }) diff --git a/yarn.lock b/yarn.lock index b695c72..264ef1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1778,11 +1778,38 @@ optionalDependencies: prettier "^1.18.2 || ^2.0.0" -"@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.6.4": +"@vue/devtools-api@^6.6.4": version "6.6.4" resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz" integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g== +"@vue/devtools-api@^7.7.2": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz#5ef5f55f60396220725a273548c0d7ee983d5d34" + integrity sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg== + dependencies: + "@vue/devtools-kit" "^7.7.7" + +"@vue/devtools-kit@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz#41a64f9526e9363331c72405544df020ce2e3641" + integrity sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA== + dependencies: + "@vue/devtools-shared" "^7.7.7" + birpc "^2.3.0" + hookable "^5.5.3" + mitt "^3.0.1" + perfect-debounce "^1.0.0" + speakingurl "^14.0.1" + superjson "^2.2.2" + +"@vue/devtools-shared@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz#ff14aa8c1262ebac8c0397d3b09f767cd489750c" + integrity sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw== + dependencies: + rfdc "^1.4.1" + "@vue/eslint-config-typescript@^9.1.0": version "9.1.0" resolved "https://registry.npmmirror.com/@vue/eslint-config-typescript/-/eslint-config-typescript-9.1.0.tgz" @@ -2243,6 +2270,11 @@ async@^3.2.6: resolved "https://registry.npmmirror.com/async/-/async-3.2.6.tgz" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz" @@ -2260,6 +2292,15 @@ autoprefixer@^10.2.4: picocolors "^1.1.1" postcss-value-parser "^4.2.0" +axios@^1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.12.2.tgz#6c307390136cf7a2278d09cec63b136dfc6e6da7" + integrity sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.4" + proxy-from-env "^1.1.0" + babel-loader@^8.2.2: version "8.4.1" resolved "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.4.1.tgz" @@ -2331,6 +2372,11 @@ binary-extensions@^2.0.0: resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +birpc@^2.3.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/birpc/-/birpc-2.6.1.tgz#c73463590928897e80f3263d9fbb7da63515014b" + integrity sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ== + bl@^4.1.0: version "4.1.0" resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz" @@ -2638,6 +2684,13 @@ colorette@^2.0.10: resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@7, commander@^7.2.0: version "7.2.0" resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz" @@ -2727,6 +2780,13 @@ cookie@0.7.1: resolved "https://registry.npmmirror.com/cookie/-/cookie-0.7.1.tgz" integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== +copy-anything@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.5.tgz#2d92dce8c498f790fa7ad16b01a1ae5a45b020a0" + integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w== + dependencies: + is-what "^4.1.8" + copy-webpack-plugin@^9.0.1: version "9.1.0" resolved "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz" @@ -3263,6 +3323,11 @@ delaunator@5: dependencies: robust-predicates "^3.0.2" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + depd@2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz" @@ -3513,6 +3578,16 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: dependencies: es-errors "^1.3.0" +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14: version "0.10.64" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" @@ -3969,7 +4044,7 @@ flatted@^3.2.9: resolved "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -follow-redirects@^1.0.0: +follow-redirects@^1.0.0, follow-redirects@^1.15.6: version "1.15.11" resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz" integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== @@ -3993,6 +4068,17 @@ fork-ts-checker-webpack-plugin@^6.4.0: semver "^7.3.2" tapable "^1.0.0" +form-data@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" + integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz" @@ -4053,7 +4139,7 @@ get-caller-file@^2.0.5: resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -4188,11 +4274,18 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-symbols@^1.1.0: +has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + hash-sum@^1.0.2: version "1.0.2" resolved "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz" @@ -4220,6 +4313,11 @@ highlight.js@^10.7.1: resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== +hookable@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d" + integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz" @@ -4549,6 +4647,11 @@ is-url@^1.2.4: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +is-what@^4.1.8: + version "4.1.16" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" + integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== + is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz" @@ -4983,7 +5086,7 @@ mime-match@^1.0.2: dependencies: wildcard "^1.1.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -5037,6 +5140,11 @@ minipass@^3.1.1: dependencies: yallist "^4.0.0" +mitt@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + module-alias@^2.2.2: version "2.2.3" resolved "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.3.tgz" @@ -5428,6 +5536,11 @@ path-type@^4.0.0: resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +perfect-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" + integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== + picocolors@^0.2.1: version "0.2.1" resolved "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz" @@ -5443,6 +5556,13 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pinia@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pinia/-/pinia-3.0.3.tgz#f412019bdeb2f45e85927b432803190343e12d89" + integrity sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA== + dependencies: + "@vue/devtools-api" "^7.7.2" + pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz" @@ -5785,6 +5905,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz" @@ -5997,6 +6122,11 @@ reusify@^1.0.4: resolved "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz" @@ -6385,6 +6515,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +speakingurl@^14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53" + integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz" @@ -6495,6 +6630,13 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +superjson@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.2.2.tgz#9d52bf0bf6b5751a3c3472f1292e714782ba3173" + integrity sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q== + dependencies: + copy-anything "^3.0.2" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz" @@ -6870,13 +7012,6 @@ vue@^3.2.13: "@vue/server-renderer" "3.5.22" "@vue/shared" "3.5.22" -vuex@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/vuex/-/vuex-4.1.0.tgz" - integrity sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ== - dependencies: - "@vue/devtools-api" "^6.0.0-beta.11" - watchpack@^2.4.0, watchpack@^2.4.4: version "2.4.4" resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.4.tgz"