Refactor API requests and update component imports

This commit is contained in:
wangqiao
2025-08-18 14:28:10 +08:00
parent 07b4d3de99
commit 9ae3abeded
91 changed files with 669 additions and 884 deletions

View File

@ -1,5 +1,6 @@
import { get, post, Delete, put } from '@/utils/axios' import * as useDollarFetchRequest from '~/composables/useDollarFetchRequest'
import { import * as useFetchRequest from '~/composables/useFetchRequest'
import type {
TpageReq, TpageReq,
TpageRes, TpageRes,
TcreateReq, TcreateReq,
@ -19,10 +20,7 @@ import {
* @return {Promise} * @return {Promise}
*/ */
export const page = (params: TpageReq) => { export const page = (params: TpageReq) => {
return get<IResponse<TpageRes>>({ return useFetchRequest.get<IResponse<TpageRes>>('/prod-api/app-api/business/posts/page', params)
url: '/prod-api/app-api/business/posts/page',
params,
})
} }
/** /**
@ -30,49 +28,35 @@ export const page = (params: TpageReq) => {
* @return {Promise} * @return {Promise}
*/ */
export const create = (params: TcreateReq) => { export const create = (params: TcreateReq) => {
return post<IResponse<number>>({ return useDollarFetchRequest.post<IResponse<number>>('/prod-api/app-api/business/posts/create', params)
url: '/prod-api/app-api/business/posts/create',
data: params,
})
} }
/** /**
* 获得论坛频道列表 * 获得论坛频道列表
* @return {Promise} * @return {Promise}
*/ */
export const list = () => { export const list = () => {
return get<IResponse<TlistRes[]>>({ return useFetchRequest.get<IResponse<TlistRes[]>>('/prod-api/app-api/business/channel/list')
url: '/prod-api/app-api/business/channel/list',
})
} }
/** /**
* 获得论坛频道列表 * 获得论坛频道列表
* @return {Promise} * @return {Promise}
*/ */
export const getChannelPosts = (params: { id: number }) => { export const getChannelPosts = (params: { id: number }) => {
return get<IResponse<TGetChannelPostsRes[]>>({ return useFetchRequest.get<IResponse<TGetChannelPostsRes[]>>('/prod-api/app-api/business/posts/get', params)
url: '/prod-api/app-api/business/posts/get',
params,
})
} }
/** /**
* 删除频道帖子 * 删除频道帖子
* @return {Promise} * @return {Promise}
*/ */
export const postsDelete = (params: { id: number }) => { export const postsDelete = (params: { id: number }) => {
return Delete<IResponse<boolean>>({ return useDollarFetchRequest.del<IResponse<boolean>>('/prod-api/app-api/business/posts/delete', { params })
url: '/prod-api/app-api/business/posts/delete',
params,
})
} }
/** /**
* 获取帖子详情 * 获取帖子详情
* @return {Promise} * @return {Promise}
*/ */
export const getChannelDetail = (params: { id: string }) => { export const getChannelDetail = (params: { id: string }) => {
return get<IResponse<TGetChannelPostsRes>>({ return useFetchRequest.get<IResponse<TGetChannelPostsRes>>('/prod-api/app-api/business/posts/get', params)
url: '/prod-api/app-api/business/posts/get',
params,
})
} }
/** /**
@ -80,20 +64,14 @@ export const getChannelDetail = (params: { id: string }) => {
* @return {Promise} * @return {Promise}
*/ */
export const postscommentpage = (params: { postsId: string; pageNo: number; pageSize: number }) => { export const postscommentpage = (params: { postsId: string; pageNo: number; pageSize: number }) => {
return get<IResponse<PageResultPostsCommentRespVO>>({ return useFetchRequest.get<IResponse<PageResultPostsCommentRespVO>>('/prod-api/app-api/business/posts-comment/page', params)
url: '/prod-api/app-api/business/posts-comment/page',
params,
})
} }
/** /**
* 创建帖子评论 * 创建帖子评论
* @return {Promise} * @return {Promise}
*/ */
export const createPostsComment = (params: { postsId: string; content: string; commentId?: string }) => { export const createPostsComment = (params: { postsId: string; content: string; commentId?: string }) => {
return post<IResponse<number>>({ return useDollarFetchRequest.post<IResponse<number>>('/prod-api/app-api/business/posts-comment/create', params)
url: '/prod-api/app-api/business/posts-comment/create',
data: params,
})
} }
/** /**
@ -101,102 +79,68 @@ export const createPostsComment = (params: { postsId: string; content: string; c
* @return {Promise} * @return {Promise}
*/ */
export const sendSingleChat = (params: sendSingleChatReq) => { export const sendSingleChat = (params: sendSingleChatReq) => {
return post<IResponse<any>>({ return useDollarFetchRequest.post<IResponse<any>>('/prod-api/app-api/mqtt/message/send/single', params)
url: '/prod-api/app-api/mqtt/message/send/single',
data: params,
})
} }
/** /**
* 发送客服消息 * 发送客服消息
*/ */
export const sendKefuMessage = (params: SingleMessageVo) => { export const sendKefuMessage = (params: SingleMessageVo) => {
return post<IResponse<any>>({ return useDollarFetchRequest.post<IResponse<any>>('/prod-api/app-api/mqtt/message/send/kefu', params)
url: '/prod-api/app-api/mqtt/message/send/kefu',
data: params,
})
} }
/** /**
* 获得消息记录分页 * 获得消息记录分页
*/ */
export const getMessagePage = (params: { pageNo: number; pageSize: number; fromId?: number; msgType?: number; topic: string }) => { export const getMessagePage = (params: { pageNo: number; pageSize: number; fromId?: number; msgType?: number; topic: string }) => {
return get<IResponse<PageResultMessageRespVO>>({ return useFetchRequest.get<IResponse<PageResultMessageRespVO>>('/prod-api/app-api/mqtt/message/page', params)
url: '/prod-api/app-api/mqtt/message/page',
params,
})
} }
/** /**
* 会话列表 * 会话列表
*/ */
export const conversationList = () => { export const conversationList = () => {
return get<IResponse<PageResultSessionRespVO[]>>({ return useFetchRequest.get<IResponse<PageResultSessionRespVO[]>>('/prod-api/app-api/mqtt/session/list')
url: '/prod-api/app-api/mqtt/session/list',
})
} }
/** /**
* 获取聊天记录 * 获取聊天记录
*/ */
export const getChatDetail = (params: { sessionId: number; pageNo: number; pageSize: number }) => { export const getChatDetail = (params: { sessionId: number; pageNo: number; pageSize: number }) => {
return get<IResponse<PageResultMessageRespVO>>({ return useFetchRequest.get<IResponse<PageResultMessageRespVO>>('/prod-api/app-api/mqtt/message/pageBySession', params)
url: '/prod-api/app-api/mqtt/message/pageBySession',
params,
})
} }
/** /**
* 清空未读信息 * 清空未读信息
*/ */
export const clearUnreadMessage = (params: { id: number }) => { export const clearUnreadMessage = (params: { id: number }) => {
return put<IResponse<boolean>>({ return useDollarFetchRequest.put<IResponse<boolean>>('/prod-api/app-api/mqtt/session/clear', { params })
url: '/prod-api/app-api/mqtt/session/clear',
params,
})
} }
/** /**
* 获得论坛频道 * 获得论坛频道
*/ */
export const getChannelLunTanDetail = (params: { id: string }) => { export const getChannelLunTanDetail = (params: { id: string }) => {
return get<IResponse<ChannelRespVO>>({ return useFetchRequest.get<IResponse<ChannelRespVO>>('/prod-api/app-api/business/channel/get', params)
url: '/prod-api/app-api/business/channel/get',
params,
})
} }
/** /**
* 创建论坛关注 * 创建论坛关注
*/ */
export const createChannelFollow = (params: { channelId: string }) => { export const createChannelFollow = (params: { channelId: string }) => {
return post<IResponse<boolean>>({ return useDollarFetchRequest.post<IResponse<boolean>>('/prod-api/app-api/business/channel-follow/create', params)
url: '/prod-api/app-api/business/channel-follow/create',
data: params,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
} }
/** /**
* 删除论坛关注 * 删除论坛关注
*/ */
export const deleteChannelFollow = (params: { channelId: string }) => { export const deleteChannelFollow = (params: { channelId: string }) => {
return Delete<IResponse<boolean>>({ return useDollarFetchRequest.del<IResponse<boolean>>('/prod-api/app-api/business/channel-follow/delete', { params })
url: '/prod-api/app-api/business/channel-follow/delete',
params,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
} }
/** /**
* 根据群组ID获取群组成员 * 根据群组ID获取群组成员
*/ */
export const getGroupMembers = (params: { channelId: string }) => { export const getGroupMembers = (params: { channelId: string }) => {
return get<IResponse<MemberUserRespDTO[]>>({ return useFetchRequest.get<IResponse<MemberUserRespDTO[]>>(`/prod-api/app-api/mqtt/session/users/${params.channelId}`)
url: `/prod-api/app-api/mqtt/session/users/${params.channelId}`,
})
} }

View File

@ -1,45 +1,34 @@
import { post, get } from '@/utils/axios' import * as useDollarFetchRequest from '~/composables/useDollarFetchRequest'
import type { AppMemberUserInfoRespVO, NotifyMessageRespVO, fileCreateReqVO } from '@/api/common/types' import * as useFetchRequest from '~/composables/useFetchRequest'
import type { AppMemberUserInfoRespVO, NotifyMessageRespVO, fileCreateReqVO } from '~/api/common/types'
/** /**
* 获取省份地区 * 获取省份地区
* @return {Promise} * @return {Promise}
*/ */
export const tree = (params: { id?: number | string }) => { export const tree = (params: { id?: number | string }) => {
return get<IResponse<any[]>>({ return useFetchRequest.get<IResponse<any[]>>('/prod-api/app-api/system/area/tree', { params })
url: '/prod-api/app-api/system/area/tree',
params,
})
} }
/** /**
* 上传附件 * 上传附件
* @return {Promise} * @return {Promise}
*/ */
export const upload = (uploadUrl = '/prod-api/app-api/infra/file/upload', params: any) => { export const upload = (uploadUrl = '/prod-api/app-api/infra/file/upload', params: any) => {
return post<IResponse<any>>({ return useDollarFetchRequest.post<IResponse<any>>(uploadUrl, params)
url: uploadUrl,
data: params,
})
} }
/** /**
* 上传附件 * 上传附件
* @return {Promise} * @return {Promise}
*/ */
export const uploadV2 = (uploadUrl = '/prod-api/app-api/infra/file/presigned-url', params: any) => { export const uploadV2 = (uploadUrl = '/prod-api/app-api/infra/file/presigned-url', params: any) => {
return get<IResponse<any>>({ return useDollarFetchRequest.get<IResponse<any>>(uploadUrl, { params })
url: uploadUrl,
params: params,
})
} }
/** /**
* 创建文件 * 创建文件
*/ */
export const creatFile = (params: fileCreateReqVO) => { export const creatFile = (params: fileCreateReqVO) => {
return post<IResponse<any>>({ return useDollarFetchRequest.post<IResponse<any>>('/prod-api/app-api/infra/file/create', params)
url: '/prod-api/app-api/infra/file/create',
data: params,
})
} }
/** /**
@ -47,9 +36,7 @@ export const creatFile = (params: fileCreateReqVO) => {
* @return {Promise} * @return {Promise}
*/ */
export const getUserInfo = () => { export const getUserInfo = () => {
return get<IResponse<AppMemberUserInfoRespVO>>({ return useFetchRequest.get<IResponse<AppMemberUserInfoRespVO>>('/prod-api/app-api/member/user/get')
url: '/prod-api/app-api/member/user/get',
})
} }
/** /**
@ -66,17 +53,11 @@ export const getUserInfo = () => {
* @return {Promise} * @return {Promise}
*/ */
export const sendSms = (params: { mobile: string; scene: number }) => { export const sendSms = (params: { mobile: string; scene: number }) => {
return post<IResponse<any>>({ return useDollarFetchRequest.post<IResponse<any>>('/prod-api/app-api/member/auth/send-sms-code', params)
url: '/prod-api/app-api/member/auth/send-sms-code',
data: params,
})
} }
/** /**
* 获得站内信 * 获得站内信
*/ */
export const getMessage = (params: { id: number }) => { export const getMessage = (params: { id: number }) => {
return get<IResponse<NotifyMessageRespVO>>({ return useFetchRequest.get<IResponse<NotifyMessageRespVO>>('/prod-api/app-api/system/notify-message/get', { params })
url: '/prod-api/app-api/system/notify-message/get',
params,
})
} }

View File

@ -1,15 +1,13 @@
import { get, post, Delete } from '@/utils/axios' import * as useDollarFetchRequest from '~/composables/useDollarFetchRequest'
import { ProjectRespVO, PageResultProjectCommentResVO, ProjectDrawPageRespVO, UserExtendSimpleRespDTO, ProjectDrawMemberRespVO } from './types' import * as useFetchRequest from '~/composables/useFetchRequest'
import type { ProjectRespVO, PageResultProjectCommentResVO, ProjectDrawPageRespVO, UserExtendSimpleRespDTO, ProjectDrawMemberRespVO } from './types'
/** /**
* 获取图纸详情 * 获取图纸详情
* @return {Promise} * @return {Promise}
*/ */
export const getDetail = (params: { id?: number | string }) => { export const getDetail = (params: { id?: number | string }) => {
return get<IResponse<ProjectRespVO>>({ return useFetchRequest.get<IResponse<ProjectRespVO>>('/prod-api/app-api/business/app/project-draw/preview', { params })
url: '/prod-api/app-api/business/app/project-draw/preview',
params,
})
} }
/** /**
@ -17,10 +15,7 @@ export const getDetail = (params: { id?: number | string }) => {
* @return {Promise} * @return {Promise}
*/ */
export const getCommentList = (params: { relationId?: number | string; pageNum?: number; pageSize?: number }) => { export const getCommentList = (params: { relationId?: number | string; pageNum?: number; pageSize?: number }) => {
return get<IResponse<PageResultProjectCommentResVO>>({ return useFetchRequest.get<IResponse<PageResultProjectCommentResVO>>('/prod-api/app-api/business/app/project-comment/page', { params })
url: '/prod-api/app-api/business/app/project-comment/page',
params,
})
} }
/** /**
@ -28,10 +23,7 @@ export const getCommentList = (params: { relationId?: number | string; pageNum?:
* @return {Promise} * @return {Promise}
*/ */
export const createComment = (params: { relationId?: number | string; content?: string; projectId?: number | string }) => { export const createComment = (params: { relationId?: number | string; content?: string; projectId?: number | string }) => {
return post<IResponse<boolean>>({ return useDollarFetchRequest.post<IResponse<boolean>>('/prod-api/app-api/business/app/project-comment/create', params)
url: '/prod-api/app-api/business/app/project-comment/create',
data: params,
})
} }
/** /**
@ -39,10 +31,7 @@ export const createComment = (params: { relationId?: number | string; content?:
* @return {Promise} * @return {Promise}
*/ */
export const getRelationRecommend = (params: { type?: number | string; projectType?: number | string }) => { export const getRelationRecommend = (params: { type?: number | string; projectType?: number | string }) => {
return get<IResponse<ProjectDrawPageRespVO[]>>({ return useFetchRequest.get<IResponse<ProjectDrawPageRespVO[]>>('/prod-api/app-api/business/app/project-draw/top-list', { params })
url: '/prod-api/app-api/business/app/project-draw/top-list',
params,
})
} }
/** /**
@ -50,10 +39,7 @@ export const getRelationRecommend = (params: { type?: number | string; projectTy
* @return {Promise} * @return {Promise}
*/ */
export const report = (params: { id?: number | string; title?: string; comments?: string; files?: any; projectId: any; drawId: any }) => { export const report = (params: { id?: number | string; title?: string; comments?: string; files?: any; projectId: any; drawId: any }) => {
return post<IResponse<boolean>>({ return useDollarFetchRequest.post<IResponse<boolean>>('/prod-api/app-api/business/project-report/create', params)
url: '/prod-api/app-api/business/project-report/create',
data: params,
})
} }
/** /**
@ -61,58 +47,38 @@ export const report = (params: { id?: number | string; title?: string; comments?
* @return {Promise} * @return {Promise}
*/ */
export const getUserInfo = (params: { id?: number | string }) => { export const getUserInfo = (params: { id?: number | string }) => {
return get<IResponse<UserExtendSimpleRespDTO>>({ return useFetchRequest.get<IResponse<UserExtendSimpleRespDTO>>('/prod-api/app-api/business/app/project-draw/preview-user-info', { params })
url: '/prod-api/app-api/business/app/project-draw/preview-user-info',
params,
})
} }
/** /**
* 当前用户的主要作品内容 * 当前用户的主要作品内容
*/ */
export const getMainWork = (params: { id?: number | string; limit: number; memberId?: number | string }) => { export const getMainWork = (params: { id?: number | string; limit: number; memberId?: number | string }) => {
return get<IResponse<ProjectDrawMemberRespVO[]>>({ return useFetchRequest.get<IResponse<ProjectDrawMemberRespVO[]>>('/prod-api/app-api/business/app/project-draw/preview-user-projects', { params })
url: '/prod-api/app-api/business/app/project-draw/preview-user-projects',
params,
})
} }
/** /**
* 创建内容信息 * 创建内容信息
*/ */
export const createContent = (params: { projectId: any; drawId: any }) => { export const createContent = (params: { projectId: any; drawId: any }) => {
return post<IResponse<boolean>>({ return useDollarFetchRequest.post<IResponse<boolean>>('/prod-api/app-api/business/project-member-favorites/create', params)
url: '/prod-api/app-api/business/project-member-favorites/create',
data: params,
})
} }
/** /**
* 创建用户项目、工具箱下载 * 创建用户项目、工具箱下载
*/ */
export const createUserProject = (params: { relationId: any; type: any }) => { export const createUserProject = (params: { relationId: any; type: any }) => {
return post<IResponse<string>>({ return useDollarFetchRequest.post<IResponse<string>>('/prod-api/app-api/business/project-member-file/create', params)
url: '/prod-api/app-api/business/project-member-file/create',
data: params,
})
} }
/** /**
* 删除项目订单用户收藏信息 * 删除项目订单用户收藏信息
*/ */
export const deleteProject = (params: { id: any }) => { export const deleteProject = (params: { id: any }) => {
return Delete<IResponse<boolean>>({ return useDollarFetchRequest.del<IResponse<boolean>>('/prod-api/app-api/business/project-member-favorites/delete', { params })
url: '/prod-api/app-api/business/project-member-favorites/delete',
data: params,
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
})
} }
/** /**
* 删除工具箱信息 * 删除工具箱信息
*/ */
export const deleteTool = (params: { id: any }) => { export const deleteTool = (params: { id: any }) => {
return Delete<IResponse<boolean>>({ return useDollarFetchRequest.del<IResponse<boolean>>('/prod-api/app-api/business/project-resource/delete', { params })
url: '/prod-api/app-api/business/project-resource/delete',
data: params,
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
})
} }

View File

@ -1,5 +1,6 @@
import { get } from '@/utils/axios' import * as useDollarFetchRequest from '~/composables/useDollarFetchRequest'
import { import * as useFetchRequest from '~/composables/useFetchRequest'
import type {
ThotTopReq, ThotTopReq,
ProjectDrawPageRespVO, ProjectDrawPageRespVO,
ProjectDictNodeVO, ProjectDictNodeVO,
@ -14,10 +15,7 @@ import {
* @returns * @returns
*/ */
export const hotTop = (params: ThotTopReq) => { export const hotTop = (params: ThotTopReq) => {
return get<IResponse<ProjectDrawPageRespVO[]>>({ return useFetchRequest.get<IResponse<ProjectDrawPageRespVO[]>>('/prod-api/app-api/business/app/project-draw/hot-top', { params })
url: '/prod-api/app-api/business/app/project-draw/hot-top',
params,
})
} }
/** /**
@ -26,85 +24,60 @@ export const hotTop = (params: ThotTopReq) => {
* @returns * @returns
*/ */
export const recommendTop = (params: ThotTopReq) => { export const recommendTop = (params: ThotTopReq) => {
return get<IResponse<ProjectDrawPageRespVO[]>>({ return useFetchRequest.get<IResponse<ProjectDrawPageRespVO[]>>('/prod-api/app-api/business/app/project-draw/recommend-top', { params })
url: '/prod-api/app-api/business/app/project-draw/recommend-top',
params,
})
} }
/** /**
* 获取最新图纸信息 * 获取最新图纸信息
*/ */
export const newDraw = (params: { type: number; limit: number }) => { export const newDraw = (params: { type: number; limit: number }) => {
return get<IResponse<ProjectDrawPageRespVO[]>>({ return useFetchRequest.get<IResponse<ProjectDrawPageRespVO[]>>('/prod-api/app-api/business/project/index/draw-new', { params })
url: '/prod-api/app-api/business/project/index/draw-new',
params,
})
} }
/** /**
* 首页-热点标签 * 首页-热点标签
*/ */
export const hotTag = (params: { type: number; limit: number; size: number }) => { export const hotTag = (params: { type: number; limit: number; size: number }) => {
return get<IResponse<ProjectDictNodeVO[]>>({ return useFetchRequest.get<IResponse<ProjectDictNodeVO[]>>('/prod-api/app-api/business/project/index/index-hot-tab', { params })
url: '/prod-api/app-api/business/project/index/index-hot-tab',
params,
})
} }
/** /**
* 首页-标签 * 首页-标签
*/ */
export const tag = () => { export const tag = () => {
return get<IResponse<ProjectDictNodeVO[]>>({ return useFetchRequest.get<IResponse<ProjectDictNodeVO[]>>('/prod-api/app-api/business/project/index/index-tab', {})
url: '/prod-api/app-api/business/project/index/index-tab',
})
} }
/** /**
* 获取top数据 * 获取top数据
*/ */
export const top = (params: { type: number; limit: number }) => { export const top = (params: { type: number; limit: number }) => {
return get<IResponse<ProjectDrawStatisticAppRespVO[]>>({ return useFetchRequest.get<IResponse<ProjectDrawStatisticAppRespVO[]>>('/prod-api/app-api/business/project/index/top', { params })
url: '/prod-api/app-api/business/project/index/top',
params,
})
} }
/** /**
* 获取用户top数据 * 获取用户top数据
*/ */
export const userTop = (params: { type?: number }) => { export const userTop = (params: { type?: number }) => {
return get<IResponse<ProjectTrendingScoreUserInfoVO[]>>({ return useFetchRequest.get<IResponse<ProjectTrendingScoreUserInfoVO[]>>('/prod-api/app-api/business/project/index/user-top', { params })
url: '/prod-api/app-api/business/project/index/user-top',
params,
})
} }
/** /**
* 设置首页设置信息分页 * 设置首页设置信息分页
*/ */
export const settinngPage = (params: { pageNo?: number; pageSize: number; type: number; status: number; innerType?: number }) => { export const settinngPage = (params: { pageNo?: number; pageSize: number; type: number; status: number; innerType?: number }) => {
return get<IResponse<PageResultIndexSettingRespVO>>({ return useFetchRequest.get<IResponse<PageResultIndexSettingRespVO>>('/prod-api/admin-api/system/index-setting/page', { params })
url: '/prod-api/admin-api/system/index-setting/page',
params,
})
} }
/** /**
* 获得首页设置信息分页 * 获得首页设置信息分页
*/ */
export const getSettingPage = (params: { type: number }) => { export const getSettingPage = (params: { type: number }) => {
return get<IResponse<PageResultIndexSettingRespVO[]>>({ return useFetchRequest.get<IResponse<PageResultIndexSettingRespVO[]>>('/prod-api/app-api/system/index-setting/list', { params })
url: '/prod-api/app-api/system/index-setting/list',
params,
})
} }
/** /**
* 首页-标签2 * 首页-标签2
*/ */
export const tab2 = () => { export const tab2 = () => {
return get<IResponse<ProjectDictNodeVO[]>>({ return useFetchRequest.get<IResponse<ProjectDictNodeVO[]>>('/prod-api/app-api/business/project/index/index-tab2', {})
url: '/prod-api/app-api/business/project/index/index-tab2',
})
} }

View File

@ -1,5 +1,6 @@
import { post, put } from '@/utils/axios' import * as useDollarFetchRequest from '~/composables/useDollarFetchRequest'
import { LoginParams, LoginResponseData, AppAuthLoginRespVO } from './types' import * as useFetchRequest from '~/composables/useFetchRequest'
import type { LoginParams, LoginResponseData, AppAuthLoginRespVO } from './types'
/** /**
* 新建图纸 * 新建图纸
@ -7,63 +8,39 @@ import { LoginParams, LoginResponseData, AppAuthLoginRespVO } from './types'
* @returns * @returns
*/ */
export const login = (params: LoginParams) => { export const login = (params: LoginParams) => {
return post<IResponse<LoginResponseData>>({ return useDollarFetchRequest.post('/prod-api/app-api/member/auth/login', params)
url: '/prod-api/app-api/member/auth/login',
data: params,
})
} }
/** /**
* 发送手机验证码 * 发送手机验证码
*/ */
export const sendCode = (params: { mobile: string }) => { export const sendCode = (params: { mobile: string }) => {
return post<IResponse<any>>({ return useDollarFetchRequest.post('/prod-api/app-api/member/auth/send-sms-code', params)
url: '/prod-api/app-api/member/auth/send-sms-code',
data: params,
})
} }
/** /**
* 使用手机 + 验证码登录 * 使用手机 + 验证码登录
*/ */
export const loginByMobile = (params: { mobile: string; code: string; socialCode?: string; socialType?: string; socialState?: string }) => { export const loginByMobile = (params: { mobile: string; code: string; socialCode?: string; socialType?: string; socialState?: string }) => {
return post<IResponse<AppAuthLoginRespVO>>({ return useDollarFetchRequest.post('/prod-api/app-api/member/auth/sms-login', params)
url: '/prod-api/app-api/member/auth/sms-login',
data: params,
})
} }
/** /**
* 发送邮箱验证码 * 发送邮箱验证码
*/ */
export const sendEmailCode = (params: { email: string }) => { export const sendEmailCode = (params: { email: string }) => {
return post<IResponse<any>>({ return useDollarFetchRequest.post('/prod-api/app-api/member/auth/send-email-code', params)
url: '/prod-api/app-api/member/auth/send-email-code',
data: params,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
} }
/** /**
* 使用邮箱 + 验证码登录 * 使用邮箱 + 验证码登录
*/ */
export const loginByEmail = (params: { email: string; code: string }) => { export const loginByEmail = (params: { email: string; code: string }) => {
return post<IResponse<AppAuthLoginRespVO>>({ return useDollarFetchRequest.post('/prod-api/app-api/member/auth/verify-code', params)
url: '/prod-api/app-api/member/auth/verify-code',
data: params,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
} }
/** /**
* 重置密码 * 重置密码
*/ */
export const resetPassoword = (params: { password: string; code: string }) => { export const resetPassword = (params: { password: string; code: string }) => {
return put<IResponse<boolean>>({ return useDollarFetchRequest.put('/prod-api/app-api/member/user/update-password', params)
url: '/prod-api/app-api/member/user/update-password',
data: params,
})
} }

View File

@ -1,4 +1,4 @@
import { get, post } from '@/utils/axios' import { get, post } from '~/utils/axios'
import { AppPayWalletPackageRespVO, PayOrderSubmitReqVO, PayOrderRespVO, PageResultAppPayWalletRechargeRespVO } from './types' import { AppPayWalletPackageRespVO, PayOrderSubmitReqVO, PayOrderRespVO, PageResultAppPayWalletRechargeRespVO } from './types'
/** /**

View File

@ -1,4 +1,4 @@
import { get, post, put, Delete } from '@/utils/axios' import { get, post, put, Delete } from '~/utils/axios'
import { import {
UserExtendSaveReqVO, UserExtendSaveReqVO,
UserExtendRespVO, UserExtendRespVO,

View File

@ -1,4 +1,4 @@
import { post, get } from '@/utils/axios' import { post, get } from '~/utils/axios'
import { TcreateReq, TpageReq, TpageRes } from './types' import { TcreateReq, TpageReq, TpageRes } from './types'
/** /**

View File

@ -1,4 +1,4 @@
import { post, get } from '@/utils/axios' import { post, get } from '~/utils/axios'
import { TcreateReq, pageReq, pageRes, recommendTopReq, recommendTopRes, parentRes, ProjectDictNodeVO } from './types' import { TcreateReq, pageReq, pageRes, recommendTopReq, recommendTopRes, parentRes, ProjectDictNodeVO } from './types'
/** /**

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<NuxtLoadingIndicator /> <NuxtLoadingIndicator />
<NuxtWelcome /> <NuxtPage />
</div> </div>
</template> </template>

View File

@ -34,8 +34,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch } from 'vue' import { ref, watch } from 'vue'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { getCommentList, createComment } from '@/api/drawe-detail' import { getCommentList, createComment } from '~/api/drawe-detail'
import type { PageResultProjectCommentResVO } from '@/api/drawe-detail/types' import type { PageResultProjectCommentResVO } from '~/api/drawe-detail/types'
const props = defineProps({ const props = defineProps({
relationId: { relationId: {

View File

@ -16,7 +16,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { PropType } from 'vue' import type { PropType } from 'vue'
import type { ProjectDrawPageRespVO } from '@/api/home/type' import type { ProjectDrawPageRespVO } from '~/api/home/type'
const props = defineProps({ const props = defineProps({
cardItemInfo: { cardItemInfo: {

View File

@ -14,15 +14,15 @@
<div class="mt-24px flex items-center justify-between"> <div class="mt-24px flex items-center justify-between">
<div class="flex items-center justify-between text-14px text-[#666666] font-normal"> <div class="flex items-center justify-between text-14px text-[#666666] font-normal">
<div class="mr-9px flex items-center"> <div class="mr-9px flex items-center">
<img src="@/assets/images/look.png" alt="" srcset="" class="mr-2px h-17px" /> <img src="~/assets/images/look.png" alt="" srcset="" class="mr-2px h-17px" />
<span class="color-#666">{{ props.itemInfo.previewPoint }}</span> <span class="color-#666">{{ props.itemInfo.previewPoint }}</span>
</div> </div>
<div class="mr-9px flex items-center"> <div class="mr-9px flex items-center">
<img src="@/assets/images/add.png" alt="" srcset="" class="mr-2px h-22px" /> <img src="~/assets/images/add.png" alt="" srcset="" class="mr-2px h-22px" />
<span class="color-#666">{{ props.itemInfo.hotPoint }}</span> <span class="color-#666">{{ props.itemInfo.hotPoint }}</span>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/chat.png" alt="" srcset="" class="mr-4px h-17px" /> <img src="~/assets/images/chat.png" alt="" srcset="" class="mr-4px h-17px" />
<span class="color-#666">{{ props.itemInfo.commentsPoint }}</span> <span class="color-#666">{{ props.itemInfo.commentsPoint }}</span>
</div> </div>
</div> </div>
@ -36,7 +36,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { PropType } from 'vue' import type { PropType } from 'vue'
import type { pageRes } from '@/api/upnew/types' import type { pageRes } from '~/api/upnew/types'
const props = defineProps({ const props = defineProps({
itemInfo: { itemInfo: {
type: Object as PropType<pageRes['list'][0]>, type: Object as PropType<pageRes['list'][0]>,

View File

@ -6,7 +6,7 @@
<el-icon class="absolute right-0 top-0 cursor-pointer" @click="onClose()"><Close /></el-icon> <el-icon class="absolute right-0 top-0 cursor-pointer" @click="onClose()"><Close /></el-icon>
<!-- 左侧插图 --> <!-- 左侧插图 -->
<div class="login-left"> <div class="login-left">
<img src="@/assets/images/login-illustration.png" alt="login" class="login-img" /> <img src="~/assets/images/login-illustration.png" alt="login" class="login-img" />
</div> </div>
<!-- 右侧登录表单 --> <!-- 右侧登录表单 -->
@ -56,15 +56,15 @@
<!-- 第三方登录 --> <!-- 第三方登录 -->
<div class="third-party-login"> <div class="third-party-login">
<div class="login-icons" @click="handleLoginQQ"> <div class="login-icons" @click="handleLoginQQ">
<img src="@/assets/images/qq-v2.png" alt="QQ登录" class="login-icon" /> <img src="~/assets/images/qq-v2.png" alt="QQ登录" class="login-icon" />
<div class="icon-text">QQ登录</div> <div class="icon-text">QQ登录</div>
</div> </div>
<div class="login-icons" @click="handleLoginWechat"> <div class="login-icons" @click="handleLoginWechat">
<img src="@/assets/images/weixin-v2.png" alt="微信登录" class="login-icon" /> <img src="~/assets/images/weixin-v2.png" alt="微信登录" class="login-icon" />
<div class="icon-text">微信登录</div> <div class="icon-text">微信登录</div>
</div> </div>
<div class="login-icons" @click="goToLogin"> <div class="login-icons" @click="goToLogin">
<img src="@/assets/images/email-v2.png" alt="邮箱登录" class="login-icon" /> <img src="~/assets/images/email-v2.png" alt="邮箱登录" class="login-icon" />
<div class="icon-text">账号登录</div> <div class="icon-text">账号登录</div>
</div> </div>
</div> </div>
@ -84,10 +84,10 @@
import { User, Lock, Close } from '@element-plus/icons-vue' import { User, Lock, Close } from '@element-plus/icons-vue'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { login, sendEmailCode, loginByEmail } from '@/api/login/index' import { login, sendEmailCode, loginByEmail } from '~/api/login/index'
import refreshToken from '@/utils/RefreshToken' import refreshToken from '~/utils/RefreshToken'
import { handleLoginQQ, handleLoginWechat, generateRandomString } from '@/utils/login' import { handleLoginQQ, handleLoginWechat, generateRandomString } from '~/utils/login'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const { $openRegister, $openLogin } = useNuxtApp() const { $openRegister, $openLogin } = useNuxtApp()

View File

@ -6,7 +6,7 @@
<el-icon class="absolute right-0 top-0 cursor-pointer" @click="onClose()"><Close /></el-icon> <el-icon class="absolute right-0 top-0 cursor-pointer" @click="onClose()"><Close /></el-icon>
<!-- 左侧插图 --> <!-- 左侧插图 -->
<div class="login-left"> <div class="login-left">
<img src="@/assets/images/login-illustration.png" alt="login" class="login-img" /> <img src="~/assets/images/login-illustration.png" alt="login" class="login-img" />
</div> </div>
<!-- 右侧登录表单 --> <!-- 右侧登录表单 -->
@ -56,15 +56,15 @@
<!-- 第三方登录 --> <!-- 第三方登录 -->
<div class="third-party-login"> <div class="third-party-login">
<div class="login-icons" @click="handleLoginQQ"> <div class="login-icons" @click="handleLoginQQ">
<img src="@/assets/images/qq-v2.png" alt="QQ登录" class="login-icon" /> <img src="~/assets/images/qq-v2.png" alt="QQ登录" class="login-icon" />
<div class="icon-text">QQ登录</div> <div class="icon-text">QQ登录</div>
</div> </div>
<div class="login-icons" @click="handleLoginWechat"> <div class="login-icons" @click="handleLoginWechat">
<img src="@/assets/images/weixin-v2.png" alt="微信登录" class="login-icon" /> <img src="~/assets/images/weixin-v2.png" alt="微信登录" class="login-icon" />
<div class="icon-text">微信登录</div> <div class="icon-text">微信登录</div>
</div> </div>
<div class="login-icons" @click="handleLoginEmail"> <div class="login-icons" @click="handleLoginEmail">
<img src="@/assets/images/email-v2.png" alt="邮箱登录" class="login-icon" /> <img src="~/assets/images/email-v2.png" alt="邮箱登录" class="login-icon" />
<div class="icon-text">邮箱登录</div> <div class="icon-text">邮箱登录</div>
</div> </div>
</div> </div>
@ -84,11 +84,11 @@
import { User, Lock, Close } from '@element-plus/icons-vue' import { User, Lock, Close } from '@element-plus/icons-vue'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { login, loginByMobile } from '@/api/login/index' import { login, loginByMobile } from '~/api/login/index'
import { sendSms } from '@/api/common/index' import { sendSms } from '~/api/common/index'
import { refreshToken as REFRESHTOKEN } from '@/utils/axios' import REFRESHTOKEN from '~/utils/RefreshToken'
import { handleLoginQQ, handleLoginWechat } from '@/utils/login' import { handleLoginQQ, handleLoginWechat } from '~/utils/login'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const { $openRegister, $openLogin, $openLoginEmail } = useNuxtApp() const { $openRegister, $openLogin, $openLoginEmail } = useNuxtApp()
const userStore = useUserStore() const userStore = useUserStore()
@ -157,7 +157,7 @@
const handleRegister = () => { const handleRegister = () => {
props.onClose() props.onClose()
nextTick(() => { nextTick(() => {
$openRegister() // $openRegister()
}) })
} }
// 发送验证码 // 发送验证码
@ -262,7 +262,7 @@
const handleLoginEmail = () => { const handleLoginEmail = () => {
props.onClose() props.onClose()
nextTick(() => { nextTick(() => {
$openLoginEmail() // $openLoginEmail()
}) })
} }
</script> </script>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="w-100% border-b-1px border-b-[#eee] border-b-solid"> <div class="w-100% border-b-1px border-b-[#eee] border-b-solid">
<div class="relative ma-auto flex items-center py-20px w-1500px!"> <div class="relative ma-auto flex items-center py-20px w-1500px!">
<img src="@/assets/images/logo5.png" alt="图夕夕" srcset="" class="h-51px w-182px cursor-pointer" @click="router.push('/index')" /> <img src="~/assets/images/logo5.png" alt="图夕夕" srcset="" class="h-51px w-182px cursor-pointer" @click="router.push('/index')" />
<div class="ml-60px flex items-center"> <div class="ml-60px flex items-center">
<span v-for="item in navList" :key="item" class="nav" :class="props.active === item ? 'active' : ''" @click="handleClick(item)">{{ item }}</span> <span v-for="item in navList" :key="item" class="nav" :class="props.active === item ? 'active' : ''" @click="handleClick(item)">{{ item }}</span>
</div> </div>
@ -37,7 +37,7 @@
</div> </div>
<div class="absolute right-10px flex items-center"> <div class="absolute right-10px flex items-center">
<div class="h-36px w-36px border-rd-[50%] bg-[#F5F5F5] text-center line-height-44px"> <div class="h-36px w-36px border-rd-[50%] bg-[#F5F5F5] text-center line-height-44px">
<img v-if="!isLogin" src="@/assets/images/user.png" alt="" srcset="" class="h-19px w-17px" /> <img v-if="!isLogin" src="~/assets/images/user.png" alt="" srcset="" class="h-19px w-17px" />
<img v-else :src="userStore.userInfoRes.avatar" alt="" srcset="" class="h-19px w-17px rd-50%" /> <img v-else :src="userStore.userInfoRes.avatar" alt="" srcset="" class="h-19px w-17px rd-50%" />
</div> </div>
<span v-if="!isLogin" class="ml-14px cursor-pointer text-14px text-[#1A65FF] font-normal" @click="handleLogin">立即登录</span> <span v-if="!isLogin" class="ml-14px cursor-pointer text-14px text-[#1A65FF] font-normal" @click="handleLogin">立即登录</span>
@ -63,11 +63,11 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, getCurrentInstance, computed, onMounted } from 'vue' import { ref, getCurrentInstance, computed, onMounted } from 'vue'
import { Setting, SwitchButton } from '@element-plus/icons-vue' import { Setting, SwitchButton } from '@element-plus/icons-vue'
import { page } from '@/api/upnew/index' import { page } from '~/api/upnew/index'
import { top } from '@/api/home/index' import { top } from '~/api/home/index'
import type { ProjectDrawStatisticAppRespVO } from '@/api/home/type' import type { ProjectDrawStatisticAppRespVO } from '~/api/home/type'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const { $openLogin } = useNuxtApp() const { $openLogin } = useNuxtApp()

View File

@ -88,10 +88,10 @@
import { throttle } from 'lodash' import { throttle } from 'lodash'
import { ref, onMounted, nextTick } from 'vue' import { ref, onMounted, nextTick } from 'vue'
import { Picture, Position, Sunrise, Loading } from '@element-plus/icons-vue' import { Picture, Position, Sunrise, Loading } from '@element-plus/icons-vue'
import { upload } from '@/api/common' import { upload } from '~/api/common'
import { sendKefuMessage, getMessagePage } from '@/api/channel/index' import { sendKefuMessage, getMessagePage } from '~/api/channel/index'
import type { msgType, PageResultMessageRespVO } from '@/api/channel/types' import type { msgType, PageResultMessageRespVO } from '~/api/channel/types'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
import dayjs from 'dayjs' import dayjs from 'dayjs'

View File

@ -35,13 +35,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch, onMounted } from 'vue' import { ref, watch, onMounted } from 'vue'
import { listVip, submitPayOrder, getPayStatus } from '@/api/pay/index' import { listVip, submitPayOrder, getPayStatus } from '~/api/pay/index'
import { accDiv } from '@/utils/utils' import { accDiv } from '~/utils/utils'
import { Close } from '@element-plus/icons-vue' import { Close } from '@element-plus/icons-vue'
import type { AppPayWalletPackageRespVO } from '@/api/pay/types' import type { AppPayWalletPackageRespVO } from '~/api/pay/types'
// @ts-ignore // @ts-ignore
import QrcodeVue from 'qrcode.vue' import QrcodeVue from 'qrcode.vue'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {

View File

@ -33,7 +33,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
import { Service, Top, Promotion, Checked, Trophy } from '@element-plus/icons-vue' import { Service, Top, Promotion, Checked, Trophy } from '@element-plus/icons-vue'
import KlService from './components/kl-service.vue' import KlService from './components/kl-service.vue'

View File

@ -5,7 +5,7 @@
<el-icon class="absolute right-0 top-0 cursor-pointer" @click="onClose()"><Close /></el-icon> <el-icon class="absolute right-0 top-0 cursor-pointer" @click="onClose()"><Close /></el-icon>
<!-- 左侧插图 --> <!-- 左侧插图 -->
<div class="register-left"> <div class="register-left">
<img src="@/assets/images/login-illustration.png" alt="register" class="register-img" /> <img src="~/assets/images/login-illustration.png" alt="register" class="register-img" />
</div> </div>
<!-- 右侧注册表单 --> <!-- 右侧注册表单 -->
@ -53,12 +53,12 @@
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
import { Close } from '@element-plus/icons-vue' import { Close } from '@element-plus/icons-vue'
import { sendSms } from '@/api/common/index' import { sendSms } from '~/api/common/index'
import { loginByMobile } from '@/api/login/index' import { loginByMobile } from '~/api/login/index'
const { $openLogin } = useNuxtApp() const { $openLogin } = useNuxtApp()
import { refreshToken as REFRESHTOKEN } from '@/utils/axios' import { refreshToken as REFRESHTOKEN } from '~/utils/axios'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const props = defineProps({ const props = defineProps({

View File

@ -7,7 +7,7 @@
> >
<el-tab-pane v-for="(item, index) in data" :key="index" :label="item.label" :name="item.value"> <el-tab-pane v-for="(item, index) in data" :key="index" :label="item.label" :name="item.value">
<template v-if="showNum" #label> <template v-if="showNum" #label>
<img v-if="item.value === tabActive && showIcon" src="@/assets/images/2.png" alt="" srcset="" class="mr-7px" /> <img v-if="item.value === tabActive && showIcon" src="~/assets/images/2.png" alt="" srcset="" class="mr-7px" />
<span>{{ item.label }}</span> <span>{{ item.label }}</span>
<el-badge :value="item.num" class="item" :max="9999999999999" :hidden="!item.num" /> <el-badge :value="item.num" class="item" :max="9999999999999" :hidden="!item.num" />
</template> </template>

View File

@ -68,10 +68,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { PropType } from 'vue' import type { PropType } from 'vue'
import { ref } from 'vue' import { ref } from 'vue'
import { uploadV2, creatFile } from '@/api/common/index' import { uploadV2, creatFile } from '~/api/common/index'
import { Document } from '@element-plus/icons-vue' import { Document } from '@element-plus/icons-vue'
import type { UploadUserFile, UploadInstance } from 'element-plus' import type { UploadUserFile, UploadInstance } from 'element-plus'
import { accDiv } from '@/utils/utils' import { accDiv } from '~/utils/utils'
// import CryptoJS from 'crypto-js' // 引入 crypto-js // import CryptoJS from 'crypto-js' // 引入 crypto-js
import dayjs from 'dayjs' import dayjs from 'dayjs'

View File

@ -51,8 +51,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
import { parent } from '@/api/upnew/index' import { parent } from '~/api/upnew/index'
import type { pageReq } from '@/api/upnew/types' import type { pageReq } from '~/api/upnew/types'
import { ArrowRight } from '@element-plus/icons-vue' import { ArrowRight } from '@element-plus/icons-vue'
const props = defineProps({ const props = defineProps({

View File

@ -3,7 +3,7 @@ import { isArray } from "~/utils/utils";
type FetchType = typeof $fetch; type FetchType = typeof $fetch;
export type FetchOptions = Parameters<FetchType>[1]; export type FetchOptions = Parameters<FetchType>[1];
export const useClientRequest = <T = unknown>( const useClientRequest = async <T = unknown>(
url: string, url: string,
opts?: FetchOptions opts?: FetchOptions
) => { ) => {
@ -33,5 +33,42 @@ export const useClientRequest = <T = unknown>(
}, },
}; };
return $fetch<T>(url, { ...defaultOptions, ...opts }); // 明确转换返回类型
const response = await $fetch(url, { ...defaultOptions, ...opts });
return response as unknown as IResponse<T>;
}; };
// GET请求
export const get = <T = unknown>(
endpoint: string,
config?: Omit<FetchOptions, 'method'>
): Promise<IResponse<T>> => {
return useClientRequest<T>(endpoint, { ...config, method: 'GET' })
}
// POST请求
export const post = <T = unknown>(
endpoint: string,
body?: any,
config?: Omit<FetchOptions, 'method' | 'body'>
): Promise<IResponse<T>> => {
return useClientRequest<T>(endpoint, { ...config, method: 'POST', body })
}
// DELETE请求
export const del = <T = unknown>(
endpoint: string,
config?: Omit<FetchOptions, 'method'>
): Promise<IResponse<T>> => {
return useClientRequest<T>(endpoint, { ...config, method: 'DELETE' })
}
// PUT请求
export const put = <T = unknown>(
endpoint: string,
body?: any,
config?: Omit<FetchOptions, 'method' | 'body'>
): Promise<IResponse<T>> => {
return useClientRequest<T>(endpoint, { ...config, method: 'PUT', body })
}

View File

@ -2,7 +2,7 @@ import { useFetch } from "#app";
import type { UseFetchOptions } from "#app"; import type { UseFetchOptions } from "#app";
import { isArray } from "~/utils/utils"; import { isArray } from "~/utils/utils";
export const useServerRequest = <T>( const useServerRequest = async <T>(
url: string, url: string,
opts?: UseFetchOptions<T, unknown> opts?: UseFetchOptions<T, unknown>
) => { ) => {
@ -32,6 +32,43 @@ export const useServerRequest = <T>(
); );
}, },
}; };
// return useFetch<T>(url, { ...defaultOptions, ...opts } as any);
return useFetch<T>(url, { ...defaultOptions, ...opts } as any); // 明确转换返回类型
const response = await useFetch<T>(url, { ...defaultOptions, ...opts } as any);
return response as unknown as IResponse<T>;
}; };
// GET请求
export const get = <T = unknown>(
endpoint: string,
config?: Omit<FetchOptions, 'method'>
): Promise<IResponse<T>> => {
return useServerRequest<T>(endpoint, { ...config, method: 'GET' })
}
// POST请求
export const post = <T = unknown>(
endpoint: string,
body?: any,
config?: Omit<FetchOptions, 'method' | 'body'>
): Promise<IResponse<T>> => {
return useServerRequest<T>(endpoint, { ...config, method: 'POST', body })
}
// DELETE请求
export const del = <T = unknown>(
endpoint: string,
config?: Omit<FetchOptions, 'method'>
): Promise<IResponse<T>> => {
return useServerRequest<T>(endpoint, { ...config, method: 'DELETE' })
}
// PUT请求
export const put = <T = unknown>(
endpoint: string,
body?: any,
config?: Omit<FetchOptions, 'method' | 'body'>
): Promise<IResponse<T>> => {
return useServerRequest<T>(endpoint, { ...config, method: 'PUT', body })
}

11
enum/index.ts Normal file
View File

@ -0,0 +1,11 @@
/**
* 交易分类
*/
export const bizTypeMap = {
1: '充值',
2: '充值退款',
3: '支付',
4: '支付退款',
5: '分佣到账',
6: '分佣体现',
} as Record<number, string>

View File

@ -11,7 +11,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import KlFooter from './kl-footer/index.vue' import KlFooter from './kl-footer/index.vue'
import KlQuickMenu from '@/components/kl-quick-menu/index.vue' import KlQuickMenu from '~/components/kl-quick-menu/index.vue'
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -4,7 +4,7 @@
<div class="mb-[40px] flex flex-col items-start justify-between gap-[30px] lg:flex-row"> <div class="mb-[40px] flex flex-col items-start justify-between gap-[30px] lg:flex-row">
<!-- 左侧 Logo --> <!-- 左侧 Logo -->
<div class="mx-auto w-[200px] shrink-0 lg:mx0"> <div class="mx-auto w-[200px] shrink-0 lg:mx0">
<img src="@/assets/images/logo5.png" class="h-auto w-full" /> <img src="~/assets/images/logo5.png" class="h-auto w-full" />
</div> </div>
<!-- 中间部分 --> <!-- 中间部分 -->
@ -52,8 +52,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import { getSettingPage } from '@/api/home/index' import { getSettingPage } from '~/api/home/index'
import { PageResultIndexSettingRespVO } from '@/api/home/type' import type { PageResultIndexSettingRespVO } from '~/api/home/type'
// 导航数据 // 导航数据
// const columns = [ // const columns = [
@ -70,11 +70,11 @@
// 二维码数据(需要替换真实图片路径) // 二维码数据(需要替换真实图片路径)
// const qrcodes = [ // const qrcodes = [
// { // {
// img: new URL('@/assets/images/logo2.png', import.meta.url).href, // img: new URL('~/assets/images/logo2.png', import.meta.url).href,
// text: '抖音电商关注官方号', // text: '抖音电商关注官方号',
// }, // },
// { // {
// img: new URL('@/assets/images/logo2.png', import.meta.url).href, // img: new URL('~/assets/images/logo2.png', import.meta.url).href,
// text: '微信扫码关注官方助手', // text: '微信扫码关注官方助手',
// }, // },
// ] // ]
@ -122,7 +122,7 @@
if (item.content && (item.innerType === 3 || item.innerType === 2)) { if (item.content && (item.innerType === 3 || item.innerType === 2)) {
window.open(item.content, '_blank') window.open(item.content, '_blank')
} else if (item.content && (item.innerType === 4 || item.innerType === 0)) { } else if (item.content && (item.innerType === 4 || item.innerType === 0)) {
window.open(`/editor-view?content=${encodeURIComponent(item.content)}`, '_blank') navigateTo(`/editor-view?content=${encodeURIComponent(item.content)}`)
} else if (item.innerType === 1 && item.content) { } else if (item.innerType === 1 && item.content) {
showViewer.value = true showViewer.value = true
previewImgList.value = [item.content] previewImgList.value = [item.content]

View File

@ -3,11 +3,11 @@
<div class="flex items-center"> <div class="flex items-center">
<div class="flex items-center"> <div class="flex items-center">
<div class="box-border h-100% h-55px w-221px flex items-center rounded-lg bg-[#1A65FF] pl-24px text-white"> <div class="box-border h-100% h-55px w-221px flex items-center rounded-lg bg-[#1A65FF] pl-24px text-white">
<img src="@/assets/images/1.png" alt="" srcset="" /> <img src="~/assets/images/1.png" alt="" srcset="" />
<span class="ml-12px text-16px">全部资源分类</span> <span class="ml-12px text-16px">全部资源分类</span>
</div> </div>
<div class="item-center ml-45px w-660px flex justify-between"> <div class="item-center ml-45px w-660px flex justify-between">
<router-link <nuxt-link
v-for="(item, index) in menuItems" v-for="(item, index) in menuItems"
:key="index" :key="index"
target="_blank" target="_blank"
@ -15,13 +15,13 @@
class="parent-links relative rounded-lg px3 py2 text-[#1A65FF]" class="parent-links relative rounded-lg px3 py2 text-[#1A65FF]"
> >
{{ item.name }} {{ item.name }}
<img v-if="item.path === '/communication/channel'" src="@/assets/images/hot.png" alt="火" class="absolute right--15px top--2px" /> <img v-if="item.path === '/communication/channel'" src="~/assets/images/hot.png" alt="火" class="absolute right--15px top--2px" />
</router-link> </nuxt-link>
</div> </div>
</div> </div>
<div v-if="isLogin" class="flex flex-1 items-center justify-end"> <div v-if="isLogin" class="flex flex-1 items-center justify-end">
<div class="h-36px w-36px cursor-pointer border-rd-[50%] bg-[#F5F5F5] text-center line-height-44px" @click="handleUserCenter"> <div class="h-36px w-36px cursor-pointer border-rd-[50%] bg-[#F5F5F5] text-center line-height-44px" @click="handleUserCenter">
<img src="@/assets/images/user.png" alt="" srcset="" class="h-19px w-17px" /> <img src="~/assets/images/user.png" alt="" srcset="" class="h-19px w-17px" />
</div> </div>
<div class="ml-8px h-36px w-36px cursor-pointer border-rd-[50%] text-center line-height-44px" @click="handleMessageCenter"> <div class="ml-8px h-36px w-36px cursor-pointer border-rd-[50%] text-center line-height-44px" @click="handleMessageCenter">
<el-icon size="20px" color="#999999"><BellFilled /></el-icon> <el-icon size="20px" color="#999999"><BellFilled /></el-icon>
@ -31,12 +31,10 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
import { BellFilled } from '@element-plus/icons-vue' import { BellFilled } from '@element-plus/icons-vue'
import { ref, computed } from 'vue' import { ref, computed } from 'vue'
import { useRouter } from 'vue-router'
const router = useRouter()
const menuItems = ref([ const menuItems = ref([
{ name: '首页', path: '/index' }, { name: '首页', path: '/index' },
{ name: '图纸', path: '/drawe' }, { name: '图纸', path: '/drawe' },
@ -55,12 +53,12 @@
// 用户中心 // 用户中心
const handleUserCenter = () => { const handleUserCenter = () => {
router.push('/personal/center/info') navigateTo('/personal/center/info')
} }
// 消息中心 // 消息中心
const handleMessageCenter = () => { const handleMessageCenter = () => {
router.push('/personal/center/message') navigateTo('/personal/center/message')
} }
</script> </script>
<style scoped> <style scoped>

View File

@ -1,66 +0,0 @@
<template>
<div class="kl-menu">
<el-scrollbar height="100%">
<el-menu class="el-menu-vertical" :default-active="activeRouteComputed" router>
<KlMenuItem
v-for="menu in childRoutes"
:key="menu?.component?.toString()"
:title="menu?.meta?.title + ''"
:children="menu.children"
:index="menu.path"
/>
</el-menu>
</el-scrollbar>
</div>
</template>
<script lang="ts" setup>
import KlMenuItem from './kl-menu-item.vue'
import { RouteRecordRaw, useRoute } from 'vue-router'
import { computed } from 'vue'
const modulesFiles = import.meta.globEager('@/router/modules/*.ts')
const childRoutes: RouteRecordRaw[] = []
Object.keys(modulesFiles).forEach((path: string) => {
const module = modulesFiles[path] as any
if (module?.default) {
childRoutes.push(...module.default)
}
}, {})
const route = useRoute()
const activeRouteComputed = computed(() => {
return route.path
})
</script>
<style lang="scss" scoped>
.kl-menu {
height: 100%;
::v-deep(.el-scrollbar) {
.el-scrollbar__bar.is-vertical {
display: block !important;
.el-scrollbar__thumb {
width: 0px;
float: right;
}
}
}
}
.el-menu-vertical {
border: none;
.el-sub-menu__title,
.el-menu-item {
font-size: 15px;
}
.el-menu-item.is-active {
background-color: #ebf1ff;
border-right: 4px solid $color-primary;
}
.el-sub-menu {
.el-menu-item {
text-indent: 10px;
}
}
}
</style>

View File

@ -1,58 +0,0 @@
<template>
<el-menu-item v-if="!props.children?.length" :index="props.index">
<template #title>
<span>{{ props.title }}</span>
</template>
</el-menu-item>
<el-sub-menu v-else-if="props.children.length" :index="props.index + props.title">
<template #title>
<span>{{ props.title }}</span>
</template>
<KlMenuItem v-for="menu in props.children" :key="menu.path" :title="menu.meta?.title || ''" :children="menu.children" :index="menu.path"></KlMenuItem>
</el-sub-menu>
</template>
<script lang="ts" setup>
import { PropType } from 'vue'
import { RouteRecordRaw } from 'vue-router'
const props = defineProps({
title: {
type: String as PropType<string>,
default: '',
},
children: {
type: Array as PropType<RouteRecordRaw[]>,
default: () => [],
},
index: {
type: String as PropType<string>,
default: '',
},
})
</script>
<style lang="scss" scoped>
::v-deep(.el-sub-menu) {
.el-menu-item {
display: flex;
span {
text-indent: 6px;
flex: 1;
position: relative;
z-index: 1;
}
&::before {
content: '';
display: inline-block;
width: 4px;
height: 4px;
background-color: #bcbfc5;
border-radius: 10px;
margin-left: -4px;
position: relative;
z-index: 2;
}
}
}
</style>

View File

@ -4,7 +4,7 @@
<div class="mx-a ml--250px h-full flex items-center justify-center"> <div class="mx-a ml--250px h-full flex items-center justify-center">
<!-- Logo区域 --> <!-- Logo区域 -->
<div class="h-100% flex cursor-pointer items-center" @click="router.push('/index')"> <div class="h-100% flex cursor-pointer items-center" @click="router.push('/index')">
<img src="@/assets/images/logo5.png" alt="图夕夕" class="h-51px w-182px" /> <img src="~/assets/images/logo5.png" alt="图夕夕" class="h-51px w-182px" />
</div> </div>
<!-- 搜索区域 --> <!-- 搜索区域 -->
<div class="relative ml-49px w-647px px4 p-r-0px!"> <div class="relative ml-49px w-647px px4 p-r-0px!">
@ -61,13 +61,12 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
import router from '@/router'
const userStore = useUserStore() const userStore = useUserStore()
import { top } from '@/api/home/index' import { top } from '~/api/home/index'
import type { ProjectDrawStatisticAppRespVO } from '@/api/home/type' import type { ProjectDrawStatisticAppRespVO } from '~/api/home/type'
import { page } from '@/api/upnew/index' import { page } from '~/api/upnew/index'
const searchQuery = ref('') const searchQuery = ref('')
const showHotList = ref(false) const showHotList = ref(false)
@ -77,7 +76,7 @@
// 是否登录 // 是否登录
if (!userStore.token) return ElMessage.error('请先登录') if (!userStore.token) return ElMessage.error('请先登录')
// 新开窗口 用router跳转 新窗口打开 // 新开窗口 用router跳转 新窗口打开
window.open('/upnew/drawe', '_blank') navigateTo('/upnew/drawe')
} }
const loading = ref(false) const loading = ref(false)
@ -121,11 +120,11 @@
const level = item.pairs?.filter(Boolean).map((item) => ({ id: item?.id, name: item?.name, isChildren: false })) || [] const level = item.pairs?.filter(Boolean).map((item) => ({ id: item?.id, name: item?.name, isChildren: false })) || []
level.unshift(normal) level.unshift(normal)
if (item.type === 1) { if (item.type === 1) {
window.open(`/drawe?level=${JSON.stringify(level)}&keywords=${item.title || ''}`, '_blank') navigateTo(`/drawe?level=${JSON.stringify(level)}&keywords=${item.title || ''}`,)
} else if (item.type === 2) { } else if (item.type === 2) {
window.open(`/text?level=${JSON.stringify(level)}&keywords=${item.title || ''}`, '_blank') navigateTo(`/text?level=${JSON.stringify(level)}&keywords=${item.title || ''}`,)
} else if (item.type === 3) { } else if (item.type === 3) {
window.open(`/model?level=${JSON.stringify(level)}&keywords=${item.title || ''}`, '_blank') navigateTo(`/model?level=${JSON.stringify(level)}&keywords=${item.title || ''}`,)
} }
} }

View File

@ -12,10 +12,17 @@
"dependencies": { "dependencies": {
"@nuxtjs/axios": "^5.13.6", "@nuxtjs/axios": "^5.13.6",
"@pinia/nuxt": "^0.11.2", "@pinia/nuxt": "^0.11.2",
"@tinymce/tinymce-vue": "^6.3.0",
"@types/tinymce": "^5.5.0",
"decimal.js": "^10.6.0",
"echarts": "^6.0.0",
"mqtt": "^5.14.0", "mqtt": "^5.14.0",
"nuxt": "^3.18.1", "nuxt": "^3.18.1",
"pdfjs-dist": "^5.4.54",
"pinia": "^3.0.3", "pinia": "^3.0.3",
"tinymce": "^8.0.2",
"vue": "^3.5.18", "vue": "^3.5.18",
"vue-pdf-embed": "^2.1.3",
"vue-router": "^4.5.1" "vue-router": "^4.5.1"
}, },
"packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610", "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610",

View File

@ -65,10 +65,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue' import { ref } from 'vue'
import { Plus, EditPen } from '@element-plus/icons-vue' import { Plus, EditPen } from '@element-plus/icons-vue'
import { ChannelRespVO } from '@/api/channel/types' import type { ChannelRespVO } from '~/api/channel/types'
import { createChannelFollow, deleteChannelFollow } from '@/api/channel/index' import { createChannelFollow, deleteChannelFollow } from '~/api/channel/index'
import ChatPage from '@/pages/chat-page/index.vue' import ChatPage from '~/pages/chat-page/index.vue'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const lunTanRes = defineModel<ChannelRespVO>('modelValue', { const lunTanRes = defineModel<ChannelRespVO>('modelValue', {

View File

@ -17,7 +17,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref } from 'vue'
import { list } from '@/api/channel/index' import { list } from '~/api/channel/index'
const channelId = defineModel('modelValue', { const channelId = defineModel('modelValue', {
required: true, required: true,

View File

@ -36,8 +36,8 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { TpageRes, ChannelRespVO } from '@/api/channel/types' import type { TpageRes, ChannelRespVO } from '~/api/channel/types'
import { postsDelete } from '@/api/channel/index' import { postsDelete } from '~/api/channel/index'
import ChannelHeader from './ChannelHeader.vue' import ChannelHeader from './ChannelHeader.vue'
import dayjs from 'dayjs' import dayjs from 'dayjs'

View File

@ -2,7 +2,7 @@
<div class="box-border h-240px w-320px border border-[#EEEEEE] rounded-8px border-solid bg-[#FFFFFF] px-31px py-25px"> <div class="box-border h-240px w-320px border border-[#EEEEEE] rounded-8px border-solid bg-[#FFFFFF] px-31px py-25px">
<div class="flex"> <div class="flex">
<div> <div>
<img src="@/assets/images/user2.png" alt="" srcset="" class="h-47px w-48px rounded-full" /> <img src="~/assets/images/user2.png" alt="" srcset="" class="h-47px w-48px rounded-full" />
</div> </div>
<div class="ml-13px"> <div class="ml-13px">
<div class="text-16px text-[#333333] font-normal">你好</div> <div class="text-16px text-[#333333] font-normal">你好</div>
@ -36,7 +36,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const handleClick = () => { const handleClick = () => {
// 判断是否登录 // 判断是否登录

View File

@ -46,14 +46,14 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { keywords } from '@/api/upnew/index' import { keywords } from '~/api/upnew/index'
import { reactive, ref, onMounted } from 'vue' import { reactive, ref, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router' import { useRouter, useRoute } from 'vue-router'
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
import { create, list } from '@/api/channel/index' import { create, list } from '~/api/channel/index'
import { parent } from '@/api/upnew/index' import { parent } from '~/api/upnew/index'
import { upload } from '@/api/common/index' // 自定义上传方法 import { upload } from '~/api/common/index' // 自定义上传方法
import Editor from '@tinymce/tinymce-vue' import Editor from '@tinymce/tinymce-vue'
import tinymce from 'tinymce/tinymce' import tinymce from 'tinymce/tinymce'
import 'tinymce/themes/silver' import 'tinymce/themes/silver'
@ -74,7 +74,7 @@
import 'tinymce/plugins/advlist' //列 import 'tinymce/plugins/advlist' //列
import 'tinymce/plugins/quickbars' //快速工具条 import 'tinymce/plugins/quickbars' //快速工具条
import 'tinymce/plugins/wordcount' // 字数统计插件 import 'tinymce/plugins/wordcount' // 字数统计插件
// import '@/assets/tinymce/langs/zh-Hans.js' //下载后的语言包 // import '~/assets/tinymce/langs/zh-Hans.js' //下载后的语言包
// import 'tinymce/skins/content/default/content.css' // import 'tinymce/skins/content/default/content.css'
// 获取从其他地方传过来的参数 // 获取从其他地方传过来的参数
const channelId = route.query.channelId as string const channelId = route.query.channelId as string

View File

@ -8,12 +8,12 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import LeftContent from './components/LeftContent.vue' import LeftContent from './components/LeftContent.vue'
import RightContent from './components/RightContent.vue' import RightContent from './components/RightContent.vue'
import { page, getChannelLunTanDetail } from '@/api/channel/index.ts' import { page, getChannelLunTanDetail } from '~/api/channel/index'
import { reactive, watch, ref } from 'vue' import { reactive, watch, ref } from 'vue'
import { TpageRes, ChannelRespVO } from '@/api/channel/types' import type { TpageRes, ChannelRespVO } from '~/api/channel/types'
const pageReq = reactive({ const pageReq = reactive({
pageNo: 1, pageNo: 1,

View File

@ -13,15 +13,15 @@
</div> </div>
<div class="mt-19px flex items-center justify-between"> <div class="mt-19px flex items-center justify-between">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/look.png" alt="" srcset="" class="mr-4px h-17px" /> <img src="~/assets/images/look.png" alt="" srcset="" class="mr-4px h-17px" />
<span class="text-[#666666]">{{ channelDetail?.likeNum || 0 }}人赞过</span> <span class="text-[#666666]">{{ channelDetail?.likeNum || 0 }}人赞过</span>
<div class="ml-16px flex items-center"> <div class="ml-16px flex items-center">
<img src="@/assets/images/add.png" alt="" class="mr-4px h-23px" /> <img src="~/assets/images/add.png" alt="" class="mr-4px h-23px" />
<span class="text-[#666666]">{{ channelDetail?.commentNum || 0 }}评论</span> <span class="text-[#666666]">{{ channelDetail?.commentNum || 0 }}评论</span>
</div> </div>
</div> </div>
<div class="ml-16px flex items-center"> <div class="ml-16px flex items-center">
<img src="@/assets/images/chat.png" alt="" srcset="" class="mr-4px h-17px" /> <img src="~/assets/images/chat.png" alt="" srcset="" class="mr-4px h-17px" />
<span class="text-[#666666]">{{ channelDetail?.browseNum || 0 }}人看过</span> <span class="text-[#666666]">{{ channelDetail?.browseNum || 0 }}人看过</span>
</div> </div>
</div> </div>
@ -66,7 +66,7 @@
</div> </div>
<div class="right ml-23px w-100%"> <div class="right ml-23px w-100%">
<div class="mt-20px w-398px border border-[#EEEEEE] border-rd-[10px_10px_0px_0px] border-solid bg-[#FFFFFF]"> <div class="mt-20px w-398px border border-[#EEEEEE] border-rd-[10px_10px_0px_0px] border-solid bg-[#FFFFFF]">
<img src="@/assets/images/sign.png" alt="" srcset="" class="h-206px w-100%" /> <img src="~/assets/images/sign.png" alt="" srcset="" class="h-206px w-100%" />
<div class="box-border border border-[#EEEEEE] border-rd-[10px_10px_0px_0px] border-solid border-t-none bg-[#FFFFFF] pa-18px"> <div class="box-border border border-[#EEEEEE] border-rd-[10px_10px_0px_0px] border-solid border-t-none bg-[#FFFFFF] pa-18px">
<div class="mt-10px flex items-center"> <div class="mt-10px flex items-center">
<div class="text-18px text-[#333333] font-bold">王琦</div> <div class="text-18px text-[#333333] font-bold">王琦</div>
@ -96,10 +96,10 @@
<script setup lang="ts"> <script setup lang="ts">
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { watch, ref, reactive } from 'vue' import { watch, ref, reactive } from 'vue'
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { getChannelDetail, postscommentpage, createPostsComment } from '@/api/channel' import { getChannelDetail, postscommentpage, createPostsComment } from '~/api/channel'
import type { TGetChannelPostsRes, PageResultPostsCommentRespVO } from '@/api/channel/types' import type { TGetChannelPostsRes, PageResultPostsCommentRespVO } from '~/api/channel/types'
const route = useRoute() const route = useRoute()
const channelId = route.query.channelId as string const channelId = route.query.channelId as string

View File

@ -100,13 +100,13 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { upload } from '@/api/common/index' import { upload } from '~/api/common/index'
import { Picture, Sunrise } from '@element-plus/icons-vue' import { Picture, Sunrise } from '@element-plus/icons-vue'
import { getGroupMembers } from '@/api/channel/index' import { getGroupMembers } from '~/api/channel/index'
import { msgType, PageResultMessageRespVO, MemberUserRespDTO } from '@/api/channel/types' import type { msgType, PageResultMessageRespVO, MemberUserRespDTO } from '~/api/channel/types'
import { ref, onMounted, nextTick, watch, onUnmounted } from 'vue' import { ref, onMounted, nextTick, watch, onUnmounted } from 'vue'
// import dayjs from 'dayjs' // import dayjs from 'dayjs'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const props = defineProps({ const props = defineProps({

View File

@ -128,7 +128,7 @@
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 40px; margin-bottom: 40px;
background-image: url('@/assets/images/community-banner.png'); background-image: url('~/assets/images/community-banner.png');
background-size: 100% 100%; background-size: 100% 100%;
background-position: center; background-position: center;
background-repeat: no-repeat; background-repeat: no-repeat;
@ -161,7 +161,7 @@
h2 { h2 {
color: #333; color: #333;
margin: 40px 0 20px; margin: 40px 0 20px;
background-image: url('@/assets/images/community-bg.png'); background-image: url('~/assets/images/community-bg.png');
background-size: 120px 16px; background-size: 120px 16px;
background-position: 14px 22px; background-position: 14px 22px;
background-repeat: no-repeat; background-repeat: no-repeat;

View File

@ -43,7 +43,8 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, PropType, watch, nextTick } from 'vue' import type { PropType} from 'vue'
import { ref, watch, nextTick } from 'vue'
// @ts-ignore // @ts-ignore
import { Swiper, SwiperSlide } from 'swiper/vue' import { Swiper, SwiperSlide } from 'swiper/vue'

View File

@ -12,17 +12,17 @@
<div class="ml-23px flex flex-1 text-18px text-[#FFFFFF] font-normal"> <div class="ml-23px flex flex-1 text-18px text-[#FFFFFF] font-normal">
<div class="h-60px w-160px flex cursor-pointer items-center justify-center rounded-8px bg-[#1A65FF]" @click="handleDownload"> <div class="h-60px w-160px flex cursor-pointer items-center justify-center rounded-8px bg-[#1A65FF]" @click="handleDownload">
<img src="@/assets/images/download.png" alt="" srcset="" class="mr-4px h-22px w-27px" /> <img src="~/assets/images/download.png" alt="" srcset="" class="mr-4px h-22px w-27px" />
{{ detail.points === 0 ? '免费下载' : '立即下载' }} {{ detail.points === 0 ? '免费下载' : '立即下载' }}
</div> </div>
<div <div
v-if="!detail.favoriteId" v-if="!detail.favoriteId"
class="ml-11px h-60px flex flex-1 cursor-pointer items-center justify-center rounded-8px bg-[#E7B03B]" class="ml-11px h-60px flex flex-1 cursor-pointer items-center justify-center rounded-8px bg-[#E7B03B]"
@click="handleCollect" @click="handleCollect"
><img src="@/assets/images/collect.png" alt="" srcset="" class="mr-4px h-24px w-24px" /> 收藏</div ><img src="~/assets/images/collect.png" alt="" srcset="" class="mr-4px h-24px w-24px" /> 收藏</div
> >
<div v-else class="ml-11px h-60px flex flex-1 cursor-pointer items-center justify-center rounded-8px bg-[#E7B03B]" @click="handleCollect" <div v-else class="ml-11px h-60px flex flex-1 cursor-pointer items-center justify-center rounded-8px bg-[#E7B03B]" @click="handleCollect"
><img src="@/assets/images/wjx2.png" alt="" srcset="" class="mr-4px h-18px w-18px" /> 已收藏</div ><img src="~/assets/images/wjx2.png" alt="" srcset="" class="mr-4px h-18px w-18px" /> 已收藏</div
> >
<div class="ml-11px h-60px flex flex-1 cursor-pointer items-center justify-center rounded-8px bg-[#F56C6C]" @click="handleReport" <div class="ml-11px h-60px flex flex-1 cursor-pointer items-center justify-center rounded-8px bg-[#F56C6C]" @click="handleReport"
@ -52,7 +52,7 @@
</div> </div>
<div> <div>
<div v-for="item in detail.files" :key="item.id" class="flex items-center justify-between border-b-1px border-b-[#eee] border-b-solid py-10px"> <div v-for="item in detail.files" :key="item.id" class="flex items-center justify-between border-b-1px border-b-[#eee] border-b-solid py-10px">
<!-- <img src="@/assets/images/avater.png" alt="" srcset="" class="h-30px w-30px" /> --> <!-- <img src="~/assets/images/avater.png" alt="" srcset="" class="h-30px w-30px" /> -->
<div> <div>
<span class="ml-10px cursor-pointer" @click="handleDownloadPreview(item)">{{ item.title }}</span> <span class="ml-10px cursor-pointer" @click="handleDownloadPreview(item)">{{ item.title }}</span>
<span v-if="item.size" class="ml-200px color-#999">{{ item.size || '-' }}</span> <span v-if="item.size" class="ml-200px color-#999">{{ item.size || '-' }}</span>
@ -107,7 +107,7 @@
<div class="mb-10px">软件分类{{ detail.editionsName }}</div> <div class="mb-10px">软件分类{{ detail.editionsName }}</div>
</div> </div>
<div class="mt-20px w-398px border border-[#EEEEEE] border-rd-[10px_10px_0px_0px] border-solid bg-[#FFFFFF]"> <div class="mt-20px w-398px border border-[#EEEEEE] border-rd-[10px_10px_0px_0px] border-solid bg-[#FFFFFF]">
<img src="@/assets/images/banner.png" alt="" srcset="" class="w-100%" /> <img src="~/assets/images/banner.png" alt="" srcset="" class="w-100%" />
<div class="box-border border border-[#EEEEEE] border-rd-[10px_10px_0px_0px] border-solid border-t-none bg-[#FFFFFF] pa-18px"> <div class="box-border border border-[#EEEEEE] border-rd-[10px_10px_0px_0px] border-solid border-t-none bg-[#FFFFFF] pa-18px">
<div class="flex flex-wrap items-start"> <div class="flex flex-wrap items-start">
<div v-if="userInfo.nickname" class="mt-10px text-18px text-[#333333] font-bold">{{ userInfo.nickname }}</div> <div v-if="userInfo.nickname" class="mt-10px text-18px text-[#333333] font-bold">{{ userInfo.nickname }}</div>
@ -123,13 +123,13 @@
<div class="flex items-center gap-40px"> <div class="flex items-center gap-40px">
<div class="flex items-center"> <div class="flex items-center">
<div class="h-20px"> <div class="h-20px">
<img src="@/assets/images/folder.png" alt="works" class="w-80%" /> <img src="~/assets/images/folder.png" alt="works" class="w-80%" />
</div> </div>
<div class="ml-8px mt--4px text-14px text-[#666] font-normal">作品: {{ userInfo.projectCount || 0 }}</div> <div class="ml-8px mt--4px text-14px text-[#666] font-normal">作品: {{ userInfo.projectCount || 0 }}</div>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
<div class="h-20px"> <div class="h-20px">
<img src="@/assets/images/user4.png" alt="fans" class="w-80% rounded-full vertical-top" /> <img src="~/assets/images/user4.png" alt="fans" class="w-80% rounded-full vertical-top" />
</div> </div>
<div class="relative top--3px ml-8px text-14px text-[#666] font-normal">粉丝: {{ userInfo.fansCount || 0 }}</div> <div class="relative top--3px ml-8px text-14px text-[#666] font-normal">粉丝: {{ userInfo.fansCount || 0 }}</div>
</div> </div>
@ -170,18 +170,18 @@
<script setup lang="ts"> <script setup lang="ts">
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { downloadFile } from '@/utils/utils' import { downloadFile } from '~/utils/utils'
import { useMessage } from '@/utils/useMessage' import { useMessage } from '~/utils/useMessage'
import { Warning } from '@element-plus/icons-vue' import { Warning } from '@element-plus/icons-vue'
import CardPicture from '@/components/kl-card-picture/index.vue' import CardPicture from '~/components/kl-card-picture/index.vue'
import { getDetail, getRelationRecommend, report, getUserInfo, getMainWork, createContent, createUserProject, deleteProject } from '@/api/drawe-detail/index' import { getDetail, getRelationRecommend, report, getUserInfo, getMainWork, createContent, createUserProject, deleteProject } from '~/api/drawe-detail/index'
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import ThumBnail from './components/swiper.vue' import ThumBnail from './components/swiper.vue'
import CommentSection from '@/components/comment-section/index.vue' import CommentSection from '~/components/comment-section/index.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { ref } from 'vue' import { ref } from 'vue'
import { ProjectRespVO, ProjectDrawPageRespVO, UserExtendSimpleRespDTO, ProjectDrawMemberRespVO } from '@/api/drawe-detail/types' import type { ProjectRespVO, ProjectDrawPageRespVO, UserExtendSimpleRespDTO, ProjectDrawMemberRespVO } from '~/api/drawe-detail/types'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const message = useMessage() const message = useMessage()
const userStore = useUserStore() const userStore = useUserStore()
// 获取路由参数 // 获取路由参数
@ -244,7 +244,7 @@
} }
const handleDownloadPreview = (item: any) => { const handleDownloadPreview = (item: any) => {
// 预览pdf // 预览pdf
window.open(`/pdf-preview?url=${item.url}`) navigateTo(`/pdf-preview?url=${item.url}`)
} }
/** 获取下载类型 */ /** 获取下载类型 */
@ -341,7 +341,7 @@
} }
const handleClick = (id: string | number) => { const handleClick = (id: string | number) => {
window.open(`/down-drawe-detail?id=${id}`, '_blank') // 修改为在新窗口打开 navigateTo(`/down-drawe-detail?id=${id}`) // 修改为在新窗口打开
} }
const handleDownloadFile = (url: string, name: string) => { const handleDownloadFile = (url: string, name: string) => {

View File

@ -14,9 +14,10 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { PropType, ref, watch } from 'vue' import type { PropType} from 'vue'
import { recommendTop } from '@/api/upnew/index' import { ref, watch } from 'vue'
import { recommendTopRes } from '@/api/upnew/types' import { recommendTop } from '~/api/upnew/index'
import type { recommendTopRes } from '~/api/upnew/types'
const props = defineProps({ const props = defineProps({
type: { type: {
type: Number as PropType<1 | 2 | 3>, type: Number as PropType<1 | 2 | 3>,

View File

@ -17,11 +17,11 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import KlTabBar from '@/components/kl-tab-bar/index.vue' import KlTabBar from '~/components/kl-tab-bar/index.vue'
import CardPicture from '@/components/kl-card-picture/index.vue' import CardPicture from '~/components/kl-card-picture/index.vue'
import { ref } from 'vue' import { ref } from 'vue'
import { pageRes, pageReq } from '@/api/upnew/types' import type { pageRes, pageReq } from '~/api/upnew/types'
import emptyImg from '@/assets/images/empty.png' import emptyImg from '~/assets/images/empty.png'
const query = defineModel<pageReq>('modelValue', { const query = defineModel<pageReq>('modelValue', {
required: true, required: true,

View File

@ -23,14 +23,14 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import KlWallpaperCategory from '@/components/kl-wallpaper-category/index.vue' import KlWallpaperCategory from '~/components/kl-wallpaper-category/index.vue'
import RecommendedColumnsV2 from './components/RecommendedColumnsV2.vue' import RecommendedColumnsV2 from './components/RecommendedColumnsV2.vue'
// import FeaturedSpecials from './components/FeaturedSpecials.vue' // import FeaturedSpecials from './components/FeaturedSpecials.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { reactive, watch, ref } from 'vue' import { reactive, watch, ref } from 'vue'
import { page } from '@/api/upnew/index' import { page } from '~/api/upnew/index'
import { pageRes, pageReq } from '@/api/upnew/types' import type { pageRes, pageReq } from '~/api/upnew/types'
const route = useRoute() const route = useRoute()
const level = ref( const level = ref(
route.query.level route.query.level

View File

@ -2,10 +2,10 @@
<div class="wscn-http404-container"> <div class="wscn-http404-container">
<div class="wscn-http404"> <div class="wscn-http404">
<div class="pic-404"> <div class="pic-404">
<img class="pic-404__parent" src="@/assets/images/404.png" alt="404" /> <img class="pic-404__parent" src="~/assets/images/404.png" alt="404" />
<img class="left pic-404__child" src="@/assets/images/404_cloud.png" alt="404" /> <img class="left pic-404__child" src="~/assets/images/404_cloud.png" alt="404" />
<img class="pic-404__child mid" src="@/assets/images/404_cloud.png" alt="404" /> <img class="pic-404__child mid" src="~/assets/images/404_cloud.png" alt="404" />
<img class="pic-404__child right" src="@/assets/images/404_cloud.png" alt="404" /> <img class="pic-404__child right" src="~/assets/images/404_cloud.png" alt="404" />
</div> </div>
<div class="bullshit"> <div class="bullshit">
<div class="bullshit__oops"> 404错误! </div> <div class="bullshit__oops"> 404错误! </div>

View File

@ -7,7 +7,7 @@
<button class="join-button">快来加入</button> <button class="join-button">快来加入</button>
</div> </div>
<div class="banner-image"> <div class="banner-image">
<img src="@/assets/images/foreign_banner.png" alt="CAD工作环境" /> <img src="~/assets/images/foreign_banner.png" alt="CAD工作环境" />
</div> </div>
</div> </div>
</div> </div>

View File

@ -96,7 +96,7 @@
.large-card { .large-card {
grid-column: 1; grid-column: 1;
grid-row: 1 / span 2; grid-row: 1 / span 2;
background-image: url('@/assets/images/hardware-tools.png'); background-image: url('~/assets/images/hardware-tools.png');
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -115,22 +115,22 @@
/* CAD设计工作站卡片 - 较宽 */ /* CAD设计工作站卡片 - 较宽 */
.top-row .card-wide { .top-row .card-wide {
background-image: url('@/assets/images/cad-workstation.png'); background-image: url('~/assets/images/cad-workstation.png');
} }
/* 工作站卡片 - 较窄 */ /* 工作站卡片 - 较窄 */
.top-row .card-narrow { .top-row .card-narrow {
background-image: url('@/assets/images/laptop-workspace.png'); background-image: url('~/assets/images/laptop-workspace.png');
} }
/* 工业机器人卡片 - 较窄 */ /* 工业机器人卡片 - 较窄 */
.bottom-row .card-narrow { .bottom-row .card-narrow {
background-image: url('@/assets/images/industrial-robots.png'); background-image: url('~/assets/images/industrial-robots.png');
} }
/* CAD工业设计卡片 - 较宽 */ /* CAD工业设计卡片 - 较宽 */
.bottom-row .card-wide { .bottom-row .card-wide {
background-image: url('@/assets/images/cad-industrial-design.png'); background-image: url('~/assets/images/cad-industrial-design.png');
} }
.card-content { .card-content {

View File

@ -18,10 +18,10 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import KlTabBar from '@/components/kl-tab-bar/index.vue' import KlTabBar from '~/components/kl-tab-bar/index.vue'
import CardPicture from '@/components/kl-card-picture/index.vue' import CardPicture from '~/components/kl-card-picture/index.vue'
import { ref } from 'vue' import { ref } from 'vue'
import { pageRes } from '@/api/upnew/types' import type { pageRes } from '~/api/upnew/types'
const level = ref([ const level = ref([
{ {

View File

@ -25,15 +25,15 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import RecommendedColumnsV2 from './components/RecommendedColumnsV2.vue' import RecommendedColumnsV2 from './components/RecommendedColumnsV2.vue'
// import FeaturedSpecials from './components/FeaturedSpecials.vue' // import FeaturedSpecials from './components/FeaturedSpecials.vue'
import BannerTips from './components/BannerTips.vue' import BannerTips from './components/BannerTips.vue'
// import ImageTips from './components/ImageTips.vue' // import ImageTips from './components/ImageTips.vue'
import { reactive, watch } from 'vue' import { reactive, watch } from 'vue'
import { page } from '@/api/upnew/index' import { page } from '~/api/upnew/index'
import { pageRes, pageReq } from '@/api/upnew/types' import type { pageRes, pageReq } from '~/api/upnew/types'
const query = reactive<pageReq>({ const query = reactive<pageReq>({
pageNo: 1, pageNo: 1,

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="flex"> <div class="flex">
<div> <div>
<div class="my-32px mb-20px text-18px text-[#333333] font-normal"><img src="@/assets/images/2.png" alt="" srcset="" /> 多多排行榜</div> <div class="my-32px mb-20px text-18px text-[#333333] font-normal"><img src="~/assets/images/2.png" alt="" srcset="" /> 多多排行榜</div>
<div class="flex"> <div class="flex">
<div class="ma-auto box-border h-470px w-460px border border-[#EEEEEE] rounded-12px border-solid bg-[#FFFFFF] px-28px"> <div class="ma-auto box-border h-470px w-460px border border-[#EEEEEE] rounded-12px border-solid bg-[#FFFFFF] px-28px">
<div class="title-bg ma-auto mb-40px mt-20px">一周图纸作者排行</div> <div class="title-bg ma-auto mb-40px mt-20px">一周图纸作者排行</div>
@ -22,12 +22,12 @@
</div> </div>
<div class="ml-20px flex text-14px text-[#666666] font-normal"> <div class="ml-20px flex text-14px text-[#666666] font-normal">
<!-- <el-icon class="text-17px color-#a8abb2!"><Folder /></el-icon> --> <!-- <el-icon class="text-17px color-#a8abb2!"><Folder /></el-icon> -->
<img src="@/assets/images/file.png" alt="" srcset="" class="h-18px" /> <img src="~/assets/images/file.png" alt="" srcset="" class="h-18px" />
<div class="ellipsis1 ml-10px">作品{{ item.projectCount || 0 }}</div> <div class="ellipsis1 ml-10px">作品{{ item.projectCount || 0 }}</div>
</div> </div>
<div class="ml-20px flex text-14px text-[#666666] font-normal"> <div class="ml-20px flex text-14px text-[#666666] font-normal">
<!-- <el-icon class="text-17px color-[#e4e7ed!]"><User /></el-icon> --> <!-- <el-icon class="text-17px color-[#e4e7ed!]"><User /></el-icon> -->
<img src="@/assets/images/user4.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/user4.png" alt="" srcset="" class="h-17px" />
<div class="ellipsis1 ml-10px">粉丝{{ item.fansCount || 0 }}</div> <div class="ellipsis1 ml-10px">粉丝{{ item.fansCount || 0 }}</div>
</div> </div>
</div> </div>
@ -52,11 +52,11 @@
<span class="ellipsis1 ml-10px">{{ item.nickname }}</span> <span class="ellipsis1 ml-10px">{{ item.nickname }}</span>
</div> </div>
<div class="ml-20px flex text-14px text-[#666666] font-normal"> <div class="ml-20px flex text-14px text-[#666666] font-normal">
<img src="@/assets/images/file.png" alt="" srcset="" class="h-18px" /> <img src="~/assets/images/file.png" alt="" srcset="" class="h-18px" />
<div class="ellipsis1 ml-10px">作品{{ item.projectCount || 0 }}</div> <div class="ellipsis1 ml-10px">作品{{ item.projectCount || 0 }}</div>
</div> </div>
<div class="ml-20px flex text-14px text-[#666666] font-normal"> <div class="ml-20px flex text-14px text-[#666666] font-normal">
<img src="@/assets/images/user4.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/user4.png" alt="" srcset="" class="h-17px" />
<div class="ellipsis1 ml-10px">粉丝{{ item.fansCount || 0 }}</div> <div class="ellipsis1 ml-10px">粉丝{{ item.fansCount || 0 }}</div>
</div> </div>
</div> </div>
@ -66,7 +66,7 @@
</div> </div>
</div> </div>
<div class="ml-63px"> <div class="ml-63px">
<div class="my-32px mb-20px text-18px text-[#333333] font-normal"><img src="@/assets/images/2.png" alt="" srcset="" /> 发布动态</div> <div class="my-32px mb-20px text-18px text-[#333333] font-normal"><img src="~/assets/images/2.png" alt="" srcset="" /> 发布动态</div>
<div class="box-border h-470px w-437px border border-[#EEEEEE] rounded-12px border-solid bg-[#FFFFFF] p-15px"> <div class="box-border h-470px w-437px border border-[#EEEEEE] rounded-12px border-solid bg-[#FFFFFF] p-15px">
<div <div
v-for="item in newDrawList" v-for="item in newDrawList"
@ -87,11 +87,11 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
// import { Folder, User } from '@element-plus/icons-vue' // import { Folder, User } from '@element-plus/icons-vue'
import { newDraw, userTop } from '@/api/home/index' import { newDraw, userTop } from '~/api/home/index'
import { ProjectDrawPageRespVO, ProjectTrendingScoreUserInfoVO } from '@/api/home/type' import type { ProjectDrawPageRespVO, ProjectTrendingScoreUserInfoVO } from '~/api/home/type'
import dayjs from 'dayjs' import dayjs from 'dayjs'
const Url = Object.values( const Url = Object.values(
import.meta.glob('@/assets/images/no*.png', { import.meta.glob('~/assets/images/no*.png', {
eager: true, eager: true,
query: 'url', query: 'url',
}) })
@ -133,7 +133,7 @@
.title-bg { .title-bg {
width: 224px; width: 224px;
height: 52px; height: 52px;
background-image: url('@/assets/images/name_bg.png'); background-image: url('~/assets/images/name_bg.png');
background-size: 100% 100%; background-size: 100% 100%;
text-align: center; text-align: center;
line-height: 48px; line-height: 48px;

View File

@ -23,8 +23,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import { getSettingPage } from '@/api/home/index' import { getSettingPage } from '~/api/home/index'
import { PageResultIndexSettingRespVO } from '@/api/home/type' import type { PageResultIndexSettingRespVO } from '~/api/home/type'
const pageReq = reactive({ const pageReq = reactive({
type: 2, type: 2,
@ -41,7 +41,7 @@
getBanner() getBanner()
const handleClick = (url: string) => { const handleClick = (url: string) => {
window.open(url, '_blank') navigateTo(url)
} }
</script> </script>

View File

@ -11,29 +11,29 @@
@click="handleUserInfo" @click="handleUserInfo"
/> />
<div class="mt-10px text-16px text-[#333333] font-normal"> <div class="mt-10px text-16px text-[#333333] font-normal">
<img v-if="userStore.userInfoRes.vipLevel === 1" src="@/assets/svg/vip.svg" alt="" class="relative top-12px" /> <img v-if="userStore.userInfoRes.vipLevel === 1" src="~/assets/svg/vip.svg" alt="" class="relative top-12px" />
<img v-if="userStore.userInfoRes.vipLevel === 2" src="@/assets/svg/svip.svg" alt="" class="relative top-12px" /> <img v-if="userStore.userInfoRes.vipLevel === 2" src="~/assets/svg/svip.svg" alt="" class="relative top-12px" />
Hi{{ userStore.userInfoRes.nickname || '欢迎访问~' }} Hi{{ userStore.userInfoRes.nickname || '欢迎访问~' }}
</div> </div>
</div> </div>
<div v-if="isLogin" class="mt-20px flex flex-col gap-20px px-20px text-14px text-[#333333] font-normal"> <div v-if="isLogin" class="mt-20px flex flex-col gap-20px px-20px text-14px text-[#333333] font-normal">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/cad_0 (1).png" alt="" srcset="" /> <img src="~/assets/images/cad_0 (1).png" alt="" srcset="" />
<span class="title ml-4px" :title="`${userStaticInfo?.pointCount}`">我的积分: {{ userStaticInfo?.pointCount || 0 }}</span> <span class="title ml-4px" :title="`${userStaticInfo?.pointCount}`">我的积分: {{ userStaticInfo?.pointCount || 0 }}</span>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/cad_0 (2).png" alt="" srcset="" /> <img src="~/assets/images/cad_0 (2).png" alt="" srcset="" />
<span class="title ml-4px" :title="`${userStaticInfo?.followCount}`">我的收藏: {{ userStaticInfo?.followCount || 0 }}</span> <span class="title ml-4px" :title="`${userStaticInfo?.followCount}`">我的收藏: {{ userStaticInfo?.followCount || 0 }}</span>
</div> </div>
</div> </div>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/cad_0 (3).png" alt="" srcset="" /> <img src="~/assets/images/cad_0 (3).png" alt="" srcset="" />
<span class="title ml-4px" :title="`${userStaticInfo?.projectCount}`">我的发布: {{ userStaticInfo?.projectCount || 0 }}</span> <span class="title ml-4px" :title="`${userStaticInfo?.projectCount}`">我的发布: {{ userStaticInfo?.projectCount || 0 }}</span>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/cad_0 (4).png" alt="" srcset="" /> <img src="~/assets/images/cad_0 (4).png" alt="" srcset="" />
<span class="title ml-4px" :title="`${userStaticInfo?.downloadCount}`">我的下载: {{ userStaticInfo?.downloadCount || 0 }}</span> <span class="title ml-4px" :title="`${userStaticInfo?.downloadCount}`">我的下载: {{ userStaticInfo?.downloadCount || 0 }}</span>
</div> </div>
</div> </div>
@ -63,25 +63,25 @@
> >
</div> </div>
<div v-if="!isLogin" class="mt-30px flex justify-between px-20px"> <div v-if="!isLogin" class="mt-30px flex justify-between px-20px">
<img src="@/assets/images/qq-v2.png" alt="QQ登录" class="social-icon" @click="handleLoginQQ" /> <img src="~/assets/images/qq-v2.png" alt="QQ登录" class="social-icon" @click="handleLoginQQ" />
<img src="@/assets/images/weixin-v2.png" alt="微信登录" class="social-icon" @click="handleLoginWechat" /> <img src="~/assets/images/weixin-v2.png" alt="微信登录" class="social-icon" @click="handleLoginWechat" />
<img src="@/assets/images/email-v2.png" alt="邮箱登录" class="social-icon" @click="handleLoginEmail" /> <img src="~/assets/images/email-v2.png" alt="邮箱登录" class="social-icon" @click="handleLoginEmail" />
<img src="@/assets/images/phone-v2.png" alt="手机登录" class="social-icon" @click="handleLoginPhone" /> <img src="~/assets/images/phone-v2.png" alt="手机登录" class="social-icon" @click="handleLoginPhone" />
</div> </div>
<div class="sign-bonus mt-18px" @click="handleSign"> <div class="sign-bonus mt-18px" @click="handleSign">
<img src="@/assets/images/sign.png" alt="签到奖励" class="bonus-image" /> <img src="~/assets/images/sign.png" alt="签到奖励" class="bonus-image" />
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { refreshToken as REFRESHTOKEN } from '@/utils/axios' import { refreshToken as REFRESHTOKEN } from '~/utils/axios'
import { getCurrentInstance, computed, watchEffect, ref } from 'vue' import { getCurrentInstance, computed, watchEffect, ref } from 'vue'
import { handleLoginQQ, handleLoginWechat } from '@/utils/login' import { handleLoginQQ, handleLoginWechat } from '~/utils/login'
import { UserStatisticsCountRespVO } from '@/api/personal-center/types' import type { UserStatisticsCountRespVO } from '~/api/personal-center/types'
import { getUserStatistics } from '@/api/personal-center/index' import { getUserStatistics } from '~/api/personal-center/index'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const instance = getCurrentInstance() const instance = getCurrentInstance()
@ -103,36 +103,36 @@
const handleLogin = () => { const handleLogin = () => {
if (instance) { if (instance) {
instance.appContext.config.globalProperties.$openLogin() // instance.appContext.config.globalProperties.$openLogin()
} }
} }
const handleRegister = () => { const handleRegister = () => {
if (instance) { if (instance) {
instance.appContext.config.globalProperties.$openRegister() // instance.appContext.config.globalProperties.$openRegister()
} }
} }
const handleLoginPhone = () => { const handleLoginPhone = () => {
if (instance) { if (instance) {
instance.appContext.config.globalProperties.$openLogin('verify') // instance.appContext.config.globalProperties.$openLogin('verify')
} }
} }
const handleLoginEmail = () => { const handleLoginEmail = () => {
if (instance) { if (instance) {
instance.appContext.config.globalProperties.$openLoginEmail() // instance.appContext.config.globalProperties.$openLoginEmail()
} }
} }
const handleUserInfo = () => { const handleUserInfo = () => {
if (!isLogin.value) return if (!isLogin.value) return
window.open('/personal-detail', '_blank') // 修改为在新窗口打开 navigateTo('/personal-detail') // 修改为在新窗口打开
} }
// 发布图纸 // 发布图纸
const handleDrawe = () => { const handleDrawe = () => {
window.open('/upnew/drawe', '_blank') // 修改为在新窗口打开 navigateTo('/upnew/drawe') // 修改为在新窗口打开
} }
// 推出登录 // 推出登录
@ -145,7 +145,7 @@
} }
const handleSign = () => { const handleSign = () => {
window.open('/sign-page', '_blank') // 修改为在新窗口打开 navigateTo('/sign-page') // 修改为在新窗口打开
} }
watchEffect(() => { watchEffect(() => {

View File

@ -11,7 +11,7 @@
<LoginForm /> <LoginForm />
</div> </div>
<div class="box-border h-56px w-1219px flex items-center border border-[#EEEEEE] border-solid border-t-none bg-[#FFFFFF] pl-10px line-height-46px"> <div class="box-border h-56px w-1219px flex items-center border border-[#EEEEEE] border-solid border-t-none bg-[#FFFFFF] pl-10px line-height-46px">
<img src="@/assets/images/voice.png" alt="" srcset="" class="mr-10px h-15px w-16px" /> <img src="~/assets/images/voice.png" alt="" srcset="" class="mr-10px h-15px w-16px" />
<Vue3Marquee :duration="10" direction="normal" pause-on-hover>· 经典来袭SolidWorks装配经典案例之气动发动机 </Vue3Marquee> <Vue3Marquee :duration="10" direction="normal" pause-on-hover>· 经典来袭SolidWorks装配经典案例之气动发动机 </Vue3Marquee>
</div> </div>
</div> </div>
@ -21,8 +21,8 @@
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import LoginForm from './LoginForm.vue' import LoginForm from './LoginForm.vue'
import { getSettingPage } from '@/api/home/index' import { getSettingPage } from '~/api/home/index'
import { PageResultIndexSettingRespVO } from '@/api/home/type' import type { PageResultIndexSettingRespVO } from '~/api/home/type'
const pageReq = reactive({ const pageReq = reactive({
type: 1, type: 1,
@ -40,7 +40,7 @@
const handleClick = (url: string) => { const handleClick = (url: string) => {
if (url) { if (url) {
window.open(url, '_blank') navigateTo(url)
} }
} }
</script> </script>

View File

@ -18,7 +18,7 @@
<div class="content mt-10px flex"> <div class="content mt-10px flex">
<!-- <div class="sider"> <!-- <div class="sider">
<div class="box-border h-100% h-55px w-221px flex items-center rounded-lg bg-[#1A65FF] pl-24px text-white"> <div class="box-border h-100% h-55px w-221px flex items-center rounded-lg bg-[#1A65FF] pl-24px text-white">
<img src="@/assets/images/1.png" alt="" srcset="" /> <img src="~/assets/images/1.png" alt="" srcset="" />
<span class="ml-12px text-16px">全部资源分类</span> <span class="ml-12px text-16px">全部资源分类</span>
</div> </div>
<div class="side-menu border border-[#EEEEEE] border-solid"> <div class="side-menu border border-[#EEEEEE] border-solid">
@ -65,10 +65,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import KlTabBar from '@/components/kl-tab-bar/index.vue' import KlTabBar from '~/components/kl-tab-bar/index.vue'
// import KlCardDetail from '@/components/kl-card-detail/index.vue' // import KlCardDetail from '~/components/kl-card-detail/index.vue'
import { hotTop, hotTag } from '@/api/home/index' import { hotTop, hotTag } from '~/api/home/index'
import { ProjectDrawPageRespVO, ProjectDictNodeVO } from '@/api/home/type' import type { ProjectDrawPageRespVO, ProjectDictNodeVO } from '~/api/home/type'
/** 请求参数 */ /** 请求参数 */
const query = reactive({ const query = reactive({
@ -105,7 +105,7 @@
/** 点击卡片 */ /** 点击卡片 */
const handleCardClick = (item: ProjectDrawPageRespVO) => { const handleCardClick = (item: ProjectDrawPageRespVO) => {
// 跳转到下载详情页 并且是单独开标签 // 跳转到下载详情页 并且是单独开标签
window.open(`/down-drawe-detail?id=${item.id}`, '_blank') // 修改为在新窗口打开 navigateTo(`/down-drawe-detail?id=${item.id}`) // 修改为在新窗口打开
} }
const handleClickType = (primary?: ProjectDictNodeVO, secondary?: ProjectDictNodeVO) => { const handleClickType = (primary?: ProjectDictNodeVO, secondary?: ProjectDictNodeVO) => {
@ -118,11 +118,11 @@
level.unshift(normal) level.unshift(normal)
} }
if (query.type === 1) { if (query.type === 1) {
window.open(`/drawe?level=${JSON.stringify(level)}`) navigateTo(`/drawe?level=${JSON.stringify(level)}`)
} else if (query.type === 2) { } else if (query.type === 2) {
window.open(`/text?level=${JSON.stringify(level)}`) navigateTo(`/text?level=${JSON.stringify(level)}`)
} else if (query.type === 3) { } else if (query.type === 3) {
window.open(`/model?level=${JSON.stringify(level)}`) navigateTo(`/model?level=${JSON.stringify(level)}`)
} }
} }

View File

@ -16,10 +16,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, watch } from 'vue' import { ref, reactive, watch } from 'vue'
import KlTabBar from '@/components/kl-tab-bar/index.vue' import KlTabBar from '~/components/kl-tab-bar/index.vue'
import CardPicture from '@/components/kl-card-picture/index.vue' import CardPicture from '~/components/kl-card-picture/index.vue'
import { recommendTop } from '@/api/home/index' import { recommendTop } from '~/api/home/index'
import { ProjectDrawPageRespVO } from '@/api/home/type' import type { ProjectDrawPageRespVO } from '~/api/home/type'
const query = reactive({ const query = reactive({
type: 1, type: 1,
@ -55,11 +55,11 @@
const handleClick = () => { const handleClick = () => {
if (query.type === 1) { if (query.type === 1) {
window.open('/drawe', '_blank') navigateTo('/drawe')
} else if (query.type === 2) { } else if (query.type === 2) {
window.open('/text', '_blank') navigateTo('/text')
} else { } else {
window.open('/model', '_blank') navigateTo('/model')
} }
} }

View File

@ -33,8 +33,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import type { ComponentPublicInstance } from 'vue' import type { ComponentPublicInstance } from 'vue'
import { tab2 } from '@/api/home/index' import { tab2 } from '~/api/home/index'
import { ProjectDictNodeVO } from '@/api/home/type' import type { ProjectDictNodeVO } from '~/api/home/type'
const activeIndex = ref(-1) const activeIndex = ref(-1)
const submenuTop = ref(0) const submenuTop = ref(0)
@ -67,7 +67,7 @@
level.unshift(normal) level.unshift(normal)
} }
window.open(`/drawe?level=${JSON.stringify(level)}`, '_blank') navigateTo(`/drawe?level=${JSON.stringify(level)}`)
} }
const keepSubmenuVisible = () => { const keepSubmenuVisible = () => {

View File

@ -17,11 +17,11 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import KlTabBar from '@/components/kl-tab-bar/index.vue' import KlTabBar from '~/components/kl-tab-bar/index.vue'
import CardPicture from '@/components/kl-card-picture/index.vue' import CardPicture from '~/components/kl-card-picture/index.vue'
import { ref } from 'vue' import { ref } from 'vue'
import { pageRes, pageReq } from '@/api/upnew/types' import type { pageRes, pageReq } from '~/api/upnew/types'
import emptyImg from '@/assets/images/empty.png' import emptyImg from '~/assets/images/empty.png'
const query = defineModel<pageReq>('modelValue', { const query = defineModel<pageReq>('modelValue', {
required: true, required: true,

View File

@ -23,14 +23,14 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import KlWallpaperCategory from '@/components/kl-wallpaper-category/index.vue' import KlWallpaperCategory from '~/components/kl-wallpaper-category/index.vue'
import RecommendedColumnsV2 from './components/RecommendedColumnsV2.vue' import RecommendedColumnsV2 from './components/RecommendedColumnsV2.vue'
// import FeaturedSpecials from './components/FeaturedSpecials.vue' // import FeaturedSpecials from './components/FeaturedSpecials.vue'
import { reactive, watch, ref } from 'vue' import { reactive, watch, ref } from 'vue'
import { page } from '@/api/upnew/index' import { page } from '~/api/upnew/index'
import { pageRes, pageReq } from '@/api/upnew/types' import type { pageRes, pageReq } from '~/api/upnew/types'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const level = ref( const level = ref(

View File

@ -54,9 +54,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import { resetPassoword } from '@/api/login/index' import { resetPassoword } from '~/api/login/index'
import { sendSms } from '@/api/common/index' import { sendSms } from '~/api/common/index'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const activeName = ref('修改密码') const activeName = ref('修改密码')

View File

@ -20,7 +20,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ProjectHistoryResVO } from '@/api/personal-center/types' import type { ProjectHistoryResVO } from '~/api/personal-center/types'
import dayjs from 'dayjs' import dayjs from 'dayjs'
const modelValue = defineModel<ProjectHistoryResVO[]>('modelValue', { const modelValue = defineModel<ProjectHistoryResVO[]>('modelValue', {

View File

@ -9,15 +9,15 @@
<div class="text-14px text-[#333333] font-normal my-10px!">by {{ scope.row?.ownedUserIdInfo?.nickName }}</div> <div class="text-14px text-[#333333] font-normal my-10px!">by {{ scope.row?.ownedUserIdInfo?.nickName }}</div>
<div class="flex items-center"> <div class="flex items-center">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/look.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/look.png" alt="" srcset="" class="h-17px" />
<span class="ml-4px">{{ scope.row.previewPoint }}</span> <span class="ml-4px">{{ scope.row.previewPoint }}</span>
</div> </div>
<div class="ml-13px flex items-center"> <div class="ml-13px flex items-center">
<img src="@/assets/images/add.png" alt="" srcset="" class="h-23px" /> <img src="~/assets/images/add.png" alt="" srcset="" class="h-23px" />
<span class="ml-4px">{{ scope.row.hotPoint }}</span> <span class="ml-4px">{{ scope.row.hotPoint }}</span>
</div> </div>
<div class="ml-13px flex items-center"> <div class="ml-13px flex items-center">
<img src="@/assets/images/chat.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/chat.png" alt="" srcset="" class="h-17px" />
<span class="ml-4px">{{ scope.row.commentsPoint }}</span> <span class="ml-4px">{{ scope.row.commentsPoint }}</span>
</div> </div>
</div> </div>
@ -35,7 +35,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ProjectHistoryResVO } from '@/api/personal-center/types' import type { ProjectHistoryResVO } from '~/api/personal-center/types'
import dayjs from 'dayjs' import dayjs from 'dayjs'
const modelValue = defineModel<ProjectHistoryResVO[]>('modelValue', { const modelValue = defineModel<ProjectHistoryResVO[]>('modelValue', {

View File

@ -10,15 +10,15 @@
<div class="text-14px text-[#333333] font-normal my-10px!">{{ scope.row?.ownedUserIdInfo?.nickName }}</div> <div class="text-14px text-[#333333] font-normal my-10px!">{{ scope.row?.ownedUserIdInfo?.nickName }}</div>
<div class="flex items-center"> <div class="flex items-center">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/look.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/look.png" alt="" srcset="" class="h-17px" />
<span class="ml-4px">{{ scope.rowpreviewPoint || 0 }}</span> <span class="ml-4px">{{ scope.rowpreviewPoint || 0 }}</span>
</div> </div>
<div class="ml-13px flex items-center"> <div class="ml-13px flex items-center">
<img src="@/assets/images/add.png" alt="" srcset="" class="h-23px" /> <img src="~/assets/images/add.png" alt="" srcset="" class="h-23px" />
<span class="ml-4px">{{ scope.row.hotPoint || 0 }}</span> <span class="ml-4px">{{ scope.row.hotPoint || 0 }}</span>
</div> </div>
<div class="ml-13px flex items-center"> <div class="ml-13px flex items-center">
<img src="@/assets/images/chat.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/chat.png" alt="" srcset="" class="h-17px" />
<span class="ml-4px">{{ scope.row.commentsPoint || 0 }}</span> <span class="ml-4px">{{ scope.row.commentsPoint || 0 }}</span>
</div> </div>
</div> </div>
@ -42,11 +42,11 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue' import { ref } from 'vue'
import KlTabBar from '@/components/kl-tab-bar/v2/index.vue' import KlTabBar from '~/components/kl-tab-bar/v2/index.vue'
import { PageResultProjectMemberFavoritesRespVO } from '@/api/personal-center/types' import type { PageResultProjectMemberFavoritesRespVO } from '~/api/personal-center/types'
import { deleteProject } from '@/api/drawe-detail/index' import { deleteProject } from '~/api/drawe-detail/index'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { useMessage } from '@/utils/useMessage' import { useMessage } from '~/utils/useMessage'
const message = useMessage() const message = useMessage()
const type = defineModel<number | string>('type', { const type = defineModel<number | string>('type', {

View File

@ -128,10 +128,10 @@
import { throttle } from 'lodash' import { throttle } from 'lodash'
import { ref, computed, onMounted, nextTick } from 'vue' import { ref, computed, onMounted, nextTick } from 'vue'
import { Picture, Position, Sunrise, Search, Loading } from '@element-plus/icons-vue' import { Picture, Position, Sunrise, Search, Loading } from '@element-plus/icons-vue'
import { upload } from '@/api/common' import { upload } from '~/api/common'
import { sendSingleChat, conversationList, getChatDetail, clearUnreadMessage } from '@/api/channel/index' import { sendSingleChat, conversationList, getChatDetail, clearUnreadMessage } from '~/api/channel/index'
import { chatMessagesReq, msgType, PageResultSessionRespVO, PageResultMessageRespVO } from '@/api/channel/types' import type { chatMessagesReq, msgType, PageResultSessionRespVO, PageResultMessageRespVO } from '~/api/channel/types'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
import dayjs from 'dayjs' import dayjs from 'dayjs'

View File

@ -23,11 +23,11 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive } from 'vue' import { reactive } from 'vue'
// import { accDiv } from '@/utils/utils' // import { accDiv } from '~/utils/utils'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { bizTypeMap } from '@/enum/index' import { bizTypeMap } from '~/enum/index'
import { getWalletRechargeRecordPage } from '@/api/pay/index' import { getWalletRechargeRecordPage } from '~/api/pay/index'
import { AppPayWalletRechargeRespVO } from '@/api/pay/types' import type { AppPayWalletRechargeRespVO } from '~/api/pay/types'
const result = reactive({ const result = reactive({
data: [] as AppPayWalletRechargeRespVO[], data: [] as AppPayWalletRechargeRespVO[],

View File

@ -38,13 +38,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch, onMounted } from 'vue' import { ref, watch, onMounted } from 'vue'
import { listWalletRechargePackage, submitPayOrder, getPayStatus } from '@/api/pay/index' import { listWalletRechargePackage, submitPayOrder, getPayStatus } from '~/api/pay/index'
import { accDiv } from '@/utils/utils' import { accDiv } from '~/utils/utils'
import { Close } from '@element-plus/icons-vue' import { Close } from '@element-plus/icons-vue'
import type { AppPayWalletPackageRespVO } from '@/api/pay/types' import type { AppPayWalletPackageRespVO } from '~/api/pay/types'
// @ts-ignore // @ts-ignore
import QrcodeVue from 'qrcode.vue' import QrcodeVue from 'qrcode.vue'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const props = defineProps({ const props = defineProps({

View File

@ -10,15 +10,15 @@
<div class="text-14px text-[#333333] font-normal my-10px!">{{ dayjs(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</div> <div class="text-14px text-[#333333] font-normal my-10px!">{{ dayjs(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</div>
<div class="flex items-center"> <div class="flex items-center">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/look.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/look.png" alt="" srcset="" class="h-17px" />
<span class="ml-4px">{{ scope.row.previewPoint }}</span> <span class="ml-4px">{{ scope.row.previewPoint }}</span>
</div> </div>
<div class="ml-13px flex items-center"> <div class="ml-13px flex items-center">
<img src="@/assets/images/add.png" alt="" srcset="" class="h-23px" /> <img src="~/assets/images/add.png" alt="" srcset="" class="h-23px" />
<span class="ml-4px">{{ scope.row.hotPoint }}</span> <span class="ml-4px">{{ scope.row.hotPoint }}</span>
</div> </div>
<div class="ml-13px flex items-center"> <div class="ml-13px flex items-center">
<img src="@/assets/images/chat.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/chat.png" alt="" srcset="" class="h-17px" />
<span class="ml-4px">{{ scope.row.commentsPoint }}</span> <span class="ml-4px">{{ scope.row.commentsPoint }}</span>
</div> </div>
</div> </div>
@ -43,11 +43,11 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue' import { ref } from 'vue'
import { offShelf, deleteResource } from '@/api/personal-center' import { offShelf, deleteResource } from '~/api/personal-center'
import KlTabBar from '@/components/kl-tab-bar/v2/index.vue' import KlTabBar from '~/components/kl-tab-bar/v2/index.vue'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { useMessage } from '@/utils/useMessage' import { useMessage } from '~/utils/useMessage'
const message = useMessage() const message = useMessage()
const type = defineModel<number | string>('type', { const type = defineModel<number | string>('type', {

View File

@ -17,7 +17,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref, onUnmounted } from 'vue' import { onMounted, ref, onUnmounted } from 'vue'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { getRecentIncomeAndActive, getResourceDistribution } from '@/api/personal-center/index' import { getRecentIncomeAndActive, getResourceDistribution } from '~/api/personal-center/index'
const incomeChartRef = ref<HTMLElement>() const incomeChartRef = ref<HTMLElement>()
const activeChartRef = ref<HTMLElement>() const activeChartRef = ref<HTMLElement>()

View File

@ -5,8 +5,8 @@
<div class="ml-29px"> <div class="ml-29px">
<div class="flex items-center"> <div class="flex items-center">
<span class="text-20px text-[#333333] font-normal">Hi{{ userStore.userInfoRes.nickname }}</span> <span class="text-20px text-[#333333] font-normal">Hi{{ userStore.userInfoRes.nickname }}</span>
<img v-if="userStore.userInfoRes.vipLevel === 1" src="@/assets/svg/vip.svg" alt="" class="relative top-2px ml-5px" /> <img v-if="userStore.userInfoRes.vipLevel === 1" src="~/assets/svg/vip.svg" alt="" class="relative top-2px ml-5px" />
<img v-if="userStore.userInfoRes.vipLevel === 2" src="@/assets/svg/svip.svg" alt="" class="relative top-2px ml-5px" /> <img v-if="userStore.userInfoRes.vipLevel === 2" src="~/assets/svg/svip.svg" alt="" class="relative top-2px ml-5px" />
<div <div
class="ml-18px h-30px w-80px cursor-pointer border border-[#1A65FF] rounded-15px border-solid text-center text-14px text-[#1A65FF] font-normal line-height-30px" class="ml-18px h-30px w-80px cursor-pointer border border-[#1A65FF] rounded-15px border-solid text-center text-14px text-[#1A65FF] font-normal line-height-30px"
@click="handleClick" @click="handleClick"
@ -15,19 +15,19 @@
</div> </div>
<div class="mt-20px flex items-center text-14px text-[#333333] font-normal"> <div class="mt-20px flex items-center text-14px text-[#333333] font-normal">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/cad_0 (1).png" alt="" srcset="" /> <img src="~/assets/images/cad_0 (1).png" alt="" srcset="" />
<span class="ml-4px">我的积分: {{ userStaticInfo?.pointCount || 0 }}</span> <span class="ml-4px">我的积分: {{ userStaticInfo?.pointCount || 0 }}</span>
</div> </div>
<div class="ml-37px flex items-center"> <div class="ml-37px flex items-center">
<img src="@/assets/images/cad_0 (2).png" alt="" srcset="" /> <img src="~/assets/images/cad_0 (2).png" alt="" srcset="" />
<span class="ml-4px">我的收藏: {{ userStaticInfo?.followCount || 0 }}</span> <span class="ml-4px">我的收藏: {{ userStaticInfo?.followCount || 0 }}</span>
</div> </div>
<div class="ml-37px flex items-center"> <div class="ml-37px flex items-center">
<img src="@/assets/images/cad_0 (3).png" alt="" srcset="" /> <img src="~/assets/images/cad_0 (3).png" alt="" srcset="" />
<span class="ml-4px">我的发布: {{ userStaticInfo?.projectCount || 0 }}</span> <span class="ml-4px">我的发布: {{ userStaticInfo?.projectCount || 0 }}</span>
</div> </div>
<div class="ml-37px flex items-center"> <div class="ml-37px flex items-center">
<img src="@/assets/images/cad_0 (4).png" alt="" srcset="" /> <img src="~/assets/images/cad_0 (4).png" alt="" srcset="" />
<span class="ml-4px">我的下载: {{ userStaticInfo?.downloadCount || 0 }}</span> <span class="ml-4px">我的下载: {{ userStaticInfo?.downloadCount || 0 }}</span>
</div> </div>
</div> </div>
@ -36,8 +36,8 @@
<div class="mt-30px flex items-center justify-around"> <div class="mt-30px flex items-center justify-around">
<div class="flex items-center"> <div class="flex items-center">
<div class="relative"> <div class="relative">
<img src="@/assets/images/info_1 (3).png" alt="" srcset="" /> <img src="~/assets/images/info_1 (3).png" alt="" srcset="" />
<img src="@/assets/images/info_1 (4).png" alt="" srcset="" class="absolute left-18px top-18px" /> <img src="~/assets/images/info_1 (4).png" alt="" srcset="" class="absolute left-18px top-18px" />
</div> </div>
<div class="ml-18px"> <div class="ml-18px">
<div class="flex items-center"> <div class="flex items-center">
@ -49,8 +49,8 @@
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
<div class="relative"> <div class="relative">
<img src="@/assets/images/info_1 (5).png" alt="" srcset="" /> <img src="~/assets/images/info_1 (5).png" alt="" srcset="" />
<img src="@/assets/images/info_1 (6).png" alt="" srcset="" class="absolute left-18px top-22px" /> <img src="~/assets/images/info_1 (6).png" alt="" srcset="" class="absolute left-18px top-22px" />
</div> </div>
<div class="ml-18px"> <div class="ml-18px">
<div> <div>
@ -61,8 +61,8 @@
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
<div class="relative"> <div class="relative">
<img src="@/assets/images/info_1 (1).png" alt="" srcset="" /> <img src="~/assets/images/info_1 (1).png" alt="" srcset="" />
<img src="@/assets/images/info_1 (2).png" alt="" srcset="" class="absolute left-20px top-18px" /> <img src="~/assets/images/info_1 (2).png" alt="" srcset="" class="absolute left-20px top-18px" />
</div> </div>
<div class="ml-18px"> <div class="ml-18px">
<div> <div>
@ -78,15 +78,15 @@
<div class="title">快捷入口</div> <div class="title">快捷入口</div>
<div class="mt-20px flex items-center"> <div class="mt-20px flex items-center">
<div class="info_item cursor-pointer" @click="handleClickPush('/upnew/drawe')"> <div class="info_item cursor-pointer" @click="handleClickPush('/upnew/drawe')">
<img src="@/assets/images/fabu_2 (3).png" alt="" srcset="" /> <img src="~/assets/images/fabu_2 (3).png" alt="" srcset="" />
<div class="mt-10px">发布资源</div> <div class="mt-10px">发布资源</div>
</div> </div>
<div class="info_item ml-31px cursor-pointer" @click="handleClickPush('/communication/channel')"> <div class="info_item ml-31px cursor-pointer" @click="handleClickPush('/communication/channel')">
<img src="@/assets/images/fabu_2 (1).png" alt="" srcset="" /> <img src="~/assets/images/fabu_2 (1).png" alt="" srcset="" />
<div class="mt-10px">交流频道</div> <div class="mt-10px">交流频道</div>
</div> </div>
<div class="info_item ml-31px cursor-pointer" @click="handleService"> <div class="info_item ml-31px cursor-pointer" @click="handleService">
<img src="@/assets/images/fabu_2 (2).png" alt="" srcset="" /> <img src="~/assets/images/fabu_2 (2).png" alt="" srcset="" />
<div class="mt-10px">消息</div> <div class="mt-10px">消息</div>
</div> </div>
</div> </div>
@ -102,12 +102,12 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref } from 'vue'
import { getUserStatistics } from '@/api/personal-center/index' import { getUserStatistics } from '~/api/personal-center/index'
import { UserStatisticsCountRespVO } from '@/api/personal-center/types' import type { UserStatisticsCountRespVO } from '~/api/personal-center/types'
import Message from './components/message.vue' import Message from './components/message.vue'
import InfoEcharts from './info-echarts.vue' import InfoEcharts from './info-echarts.vue'
import Pay from './components/pay.vue' import Pay from './components/pay.vue'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
// 路由跳转 // 路由跳转
@ -136,7 +136,7 @@
if (!path) { if (!path) {
return return
} }
window.open(path, '_blank') navigateTo(path)
} }
const dialogVisible = ref(false) const dialogVisible = ref(false)

View File

@ -3,7 +3,7 @@
<div class="flex items-center justify-between border-b-1px border-b-[#eeeeee] border-b-solid pb-18px"> <div class="flex items-center justify-between border-b-1px border-b-[#eeeeee] border-b-solid pb-18px">
<div class="text-16px text-[#333333] font-normal">个人资料</div> <div class="text-16px text-[#333333] font-normal">个人资料</div>
<div class="flex items-center"> <div class="flex items-center">
<!-- <img src="@/assets/images/fans.png" alt="" srcset="" /> --> <!-- <img src="~/assets/images/fans.png" alt="" srcset="" /> -->
<span class="ml-8px text-14px text-[#333333] font-normal"></span> <span class="ml-8px text-14px text-[#333333] font-normal"></span>
</div> </div>
</div> </div>
@ -118,13 +118,13 @@
</div> </div>
<div class="flex flex-col justify-center text-14px text-[#333333] font-normal"> <div class="flex flex-col justify-center text-14px text-[#333333] font-normal">
<div class="mt-30px flex items-center"> <div class="mt-30px flex items-center">
<img src="@/assets/images/qq-v2.png" alt="" srcset="" class="h-35px w-34px" /> <img src="~/assets/images/qq-v2.png" alt="" srcset="" class="h-35px w-34px" />
<div class="ml-19px">QQ</div> <div class="ml-19px">QQ</div>
<div class="ml-100px flex items-center"><div class="w-90px">QQ昵称</div><div class="w-180px">xxx</div></div> <div class="ml-100px flex items-center"><div class="w-90px">QQ昵称</div><div class="w-180px">xxx</div></div>
<div class="btn">绑定</div> <div class="btn">绑定</div>
</div> </div>
<div class="mt-30px flex items-center"> <div class="mt-30px flex items-center">
<img src="@/assets/images/weixin-v2.png" alt="" srcset="" class="h-35px w-34px" /> <img src="~/assets/images/weixin-v2.png" alt="" srcset="" class="h-35px w-34px" />
<div class="ml-19px">微信</div> <div class="ml-19px">微信</div>
<div class="ml-95px flex items-center"><div class="w-90px">微信昵称</div><div class="w-180px">xxx</div></div> <div class="ml-95px flex items-center"><div class="w-90px">微信昵称</div><div class="w-180px">xxx</div></div>
<div class="btn">绑定</div> <div class="btn">绑定</div>
@ -137,10 +137,10 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
import { Plus } from '@element-plus/icons-vue' import { Plus } from '@element-plus/icons-vue'
import { tree, upload } from '@/api/common/index' import { tree, upload } from '~/api/common/index'
import { keywords } from '@/api/upnew/index' import { keywords } from '~/api/upnew/index'
import { userExtend, getUserInfo, updateUserExtend } from '@/api/personal-center/index.ts' import { userExtend, getUserInfo, updateUserExtend } from '~/api/personal-center/index'
import { UserExtendSaveReqVO } from '@/api/personal-center/types' import type { UserExtendSaveReqVO } from '~/api/personal-center/types'
import verifyDialog from './verify-dialog.vue' import verifyDialog from './verify-dialog.vue'
const userFormRef = ref() const userFormRef = ref()

View File

@ -33,14 +33,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
import { getContentPage, getUserToolBoxPage, getUserFavoritePage, getOwnContentPage } from '@/api/personal-center/index' import { getContentPage, getUserToolBoxPage, getUserFavoritePage, getOwnContentPage } from '~/api/personal-center/index'
// import { ProjectHistoryResVO } from '@/api/personal-center/types' // import { ProjectHistoryResVO } from '~/api/personal-center/types'
import uploadTable from './components/upload-table.vue' import uploadTable from './components/upload-table.vue'
import downloadTable from './components/download-table.vue' import downloadTable from './components/download-table.vue'
import favoriteTable from './components/favorite-table.vue' import favoriteTable from './components/favorite-table.vue'
import browseTable from './components/browse-table.vue' import browseTable from './components/browse-table.vue'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const activeName = ref('我的上传') const activeName = ref('我的上传')

View File

@ -39,8 +39,8 @@
import { ref } from 'vue' import { ref } from 'vue'
import Pay from './components/pay.vue' import Pay from './components/pay.vue'
import PayRecords from './components/pay-records.vue' import PayRecords from './components/pay-records.vue'
import { getUserStatistics } from '@/api/personal-center/index' import { getUserStatistics } from '~/api/personal-center/index'
import { UserStatisticsCountRespVO } from '@/api/personal-center/types' import type { UserStatisticsCountRespVO } from '~/api/personal-center/types'
const activeTab = ref('purchase') const activeTab = ref('purchase')
// const currentMonth = ref('2025.03') // const currentMonth = ref('2025.03')

View File

@ -38,8 +38,8 @@
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
import { Plus } from '@element-plus/icons-vue' import { Plus } from '@element-plus/icons-vue'
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import { getUserAuthInfo, createUserAuthInfo, updateUserAuthInfo } from '@/api/personal-center/index.ts' import { getUserAuthInfo, createUserAuthInfo, updateUserAuthInfo } from '~/api/personal-center/index'
import { UserAuthInfoRespVO } from '@/api/personal-center/types' import type { UserAuthInfoRespVO } from '~/api/personal-center/types'
const dialogVisible = ref(false) const dialogVisible = ref(false)
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()

View File

@ -2,77 +2,77 @@
<KlNavTab /> <KlNavTab />
<div class="ma-auto w-1198px flex justify-between"> <div class="ma-auto w-1198px flex justify-between">
<div class="left mt-25px box-border h-370px w-260px border border-[#EEEEEE] rounded-4px border-solid bg-[#FFFFFF] text-15px text-[#333333] font-medium"> <div class="left mt-25px box-border h-370px w-260px border border-[#EEEEEE] rounded-4px border-solid bg-[#FFFFFF] text-15px text-[#333333] font-medium">
<router-link to="/personal/center/info" class="flex items-center justify-between py-14px"> <nuxt-link to="/personal/center/info" class="flex items-center justify-between py-14px">
<div class="flex items-center pl-20px"> <div class="flex items-center pl-20px">
<img v-if="route.path.startsWith('/personal/center/info')" src="@/assets/images/user3.png" alt="" srcset="" class="h-20px" /> <img v-if="route.path.startsWith('/personal/center/info')" src="~/assets/images/user3.png" alt="" srcset="" class="h-20px" />
<img v-else src="@/assets/images/个人.png" alt="" srcset="" class="h-20px" /> <img v-else src="~/assets/images/个人.png" alt="" srcset="" class="h-20px" />
<span class="ml-10px">个人中心</span> <span class="ml-10px">个人中心</span>
</div> </div>
<div class="pr-20px"> <div class="pr-20px">
<el-icon><ArrowRight /></el-icon> <el-icon><ArrowRight /></el-icon>
</div> </div>
</router-link> </nuxt-link>
<router-link to="/personal/profile" class="flex items-center justify-between py-14px"> <nuxt-link to="/personal/profile" class="flex items-center justify-between py-14px">
<div class="flex items-center pl-20px"> <div class="flex items-center pl-20px">
<img v-if="!route.path.startsWith('/personal/profile')" src="@/assets/images/user_zl.png" alt="" srcset="" class="h-16px" /> <img v-if="!route.path.startsWith('/personal/profile')" src="~/assets/images/user_zl.png" alt="" srcset="" class="h-16px" />
<img v-else src="@/assets/images/个人资料 (1).png" alt="" srcset="" class="h-16px" /> <img v-else src="~/assets/images/个人资料 (1).png" alt="" srcset="" class="h-16px" />
<span class="ml-10px">个人资料</span> <span class="ml-10px">个人资料</span>
</div> </div>
<div class="pr-20px"> <div class="pr-20px">
<el-icon><ArrowRight /></el-icon> <el-icon><ArrowRight /></el-icon>
</div> </div>
</router-link> </nuxt-link>
<router-link to="/personal/account/security" class="flex items-center justify-between py-14px"> <nuxt-link to="/personal/account/security" class="flex items-center justify-between py-14px">
<div class="flex items-center pl-20px"> <div class="flex items-center pl-20px">
<img v-if="!route.path.startsWith('/personal/account/security')" src="@/assets/images/account.png" alt="" srcset="" class="h-20px" /> <img v-if="!route.path.startsWith('/personal/account/security')" src="~/assets/images/account.png" alt="" srcset="" class="h-20px" />
<img v-else src="@/assets/images/账户安全.png" alt="" srcset="" class="h-20px" /> <img v-else src="~/assets/images/账户安全.png" alt="" srcset="" class="h-20px" />
<span class="ml-14px">账户与安全</span> <span class="ml-14px">账户与安全</span>
</div> </div>
<div class="pr-20px"> <div class="pr-20px">
<el-icon><ArrowRight /></el-icon> <el-icon><ArrowRight /></el-icon>
</div> </div>
</router-link> </nuxt-link>
<router-link to="/personal/resource/center" class="flex items-center justify-between py-14px"> <nuxt-link to="/personal/resource/center" class="flex items-center justify-between py-14px">
<div class="flex items-center pl-20px"> <div class="flex items-center pl-20px">
<img v-if="!route.path.startsWith('/personal/resource/center')" src="@/assets/images/ziyuan.png" alt="" srcset="" class="h-18px" /> <img v-if="!route.path.startsWith('/personal/resource/center')" src="~/assets/images/ziyuan.png" alt="" srcset="" class="h-18px" />
<img v-else src="@/assets/images/资源.png" alt="" srcset="" class="h-18px" /> <img v-else src="~/assets/images/资源.png" alt="" srcset="" class="h-18px" />
<span class="ml-12px">资源中心</span> <span class="ml-12px">资源中心</span>
</div> </div>
<div class="pr-20px"> <div class="pr-20px">
<el-icon><ArrowRight /></el-icon> <el-icon><ArrowRight /></el-icon>
</div> </div>
</router-link> </nuxt-link>
<router-link to="/personal/trading/center" class="flex items-center justify-between py-14px"> <nuxt-link to="/personal/trading/center" class="flex items-center justify-between py-14px">
<div class="flex items-center pl-20px"> <div class="flex items-center pl-20px">
<img v-if="!route.path.startsWith('/personal/trading/center')" src="@/assets/images/pay.png" alt="" srcset="" class="h-20px" /> <img v-if="!route.path.startsWith('/personal/trading/center')" src="~/assets/images/pay.png" alt="" srcset="" class="h-20px" />
<img v-else src="@/assets/images/交易管理.png" alt="" srcset="" class="h-20px" /> <img v-else src="~/assets/images/交易管理.png" alt="" srcset="" class="h-20px" />
<span class="ml-12px">交易中心</span> <span class="ml-12px">交易中心</span>
</div> </div>
<div class="pr-20px"> <div class="pr-20px">
<el-icon><ArrowRight /></el-icon> <el-icon><ArrowRight /></el-icon>
</div> </div>
</router-link> </nuxt-link>
<router-link to="/personal/center/message" class="flex items-center justify-between py-14px"> <nuxt-link to="/personal/center/message" class="flex items-center justify-between py-14px">
<div class="flex items-center pl-20px"> <div class="flex items-center pl-20px">
<img v-if="!route.path.startsWith('/personal/center/message')" src="@/assets/images/message.png" alt="" srcset="" class="h-18px" /> <img v-if="!route.path.startsWith('/personal/center/message')" src="~/assets/images/message.png" alt="" srcset="" class="h-18px" />
<img v-else src="@/assets/images/消息.png" alt="" srcset="" class="h-18px" /> <img v-else src="~/assets/images/消息.png" alt="" srcset="" class="h-18px" />
<span class="ml-14px">消息通知</span> <span class="ml-14px">消息通知</span>
</div> </div>
<div class="pr-20px"> <div class="pr-20px">
<el-icon><ArrowRight /></el-icon> <el-icon><ArrowRight /></el-icon>
</div> </div>
</router-link> </nuxt-link>
</div> </div>
<div class="right mt-25px"> <div class="right mt-25px">
<router-view></router-view> <NuxtPage />
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ArrowRight } from '@element-plus/icons-vue' import { ArrowRight } from '@element-plus/icons-vue'
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()

View File

@ -41,15 +41,15 @@
<div class="text-14px text-[#666] font-normal my-10px!">{{ dayjs(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</div> <div class="text-14px text-[#666] font-normal my-10px!">{{ dayjs(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</div>
<div class="flex items-center"> <div class="flex items-center">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/look.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/look.png" alt="" srcset="" class="h-17px" />
<span class="ml-4px">{{ scope.row.previewPoint }}</span> <span class="ml-4px">{{ scope.row.previewPoint }}</span>
</div> </div>
<div class="ml-13px flex items-center"> <div class="ml-13px flex items-center">
<img src="@/assets/images/add.png" alt="" srcset="" class="h-23px" /> <img src="~/assets/images/add.png" alt="" srcset="" class="h-23px" />
<span class="ml-4px">{{ scope.row.hotPoint }}</span> <span class="ml-4px">{{ scope.row.hotPoint }}</span>
</div> </div>
<div class="ml-13px flex items-center"> <div class="ml-13px flex items-center">
<img src="@/assets/images/chat.png" alt="" srcset="" class="h-17px" /> <img src="~/assets/images/chat.png" alt="" srcset="" class="h-17px" />
<span class="ml-4px">{{ scope.row.commentsPoint }}</span> <span class="ml-4px">{{ scope.row.commentsPoint }}</span>
</div> </div>
</div> </div>
@ -104,13 +104,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, reactive } from 'vue' import { ref, onMounted, reactive } from 'vue'
import { UserExtendSaveReqVO } from '@/api/personal-center/types' import type { UserExtendSaveReqVO } from '~/api/personal-center/types'
import { getMainWork } from '@/api/drawe-detail/index' import { getMainWork } from '~/api/drawe-detail/index'
import { getOwnContentPage } from '@/api/personal-center/index.ts' import { getOwnContentPage } from '~/api/personal-center/index'
import { offShelf, deleteResource, getUserExtend } from '@/api/personal-center' import { offShelf, deleteResource, getUserExtend } from '~/api/personal-center'
import { ProjectDrawMemberRespVO } from '@/api/drawe-detail/types' import type { ProjectDrawMemberRespVO } from '~/api/drawe-detail/types'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { useMessage } from '@/utils/useMessage' import { useMessage } from '~/utils/useMessage'
const message = useMessage() const message = useMessage()
// 用户信息 // 用户信息
const userForm = reactive<UserExtendSaveReqVO>({ const userForm = reactive<UserExtendSaveReqVO>({
@ -249,7 +249,7 @@
} }
const handleClickV2 = (id: string | number) => { const handleClickV2 = (id: string | number) => {
window.open(`/down-drawe-detail?id=${id}`, '_blank') // 修改为在新窗口打开 navigateTo(`/down-drawe-detail?id=${id}`) // 修改为在新窗口打开
} }
// 获取最新发布 // 获取最新发布
const mainWork = ref<ProjectDrawMemberRespVO[]>([]) const mainWork = ref<ProjectDrawMemberRespVO[]>([])

View File

@ -67,9 +67,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive } from 'vue' import { reactive } from 'vue'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import { signIn, getUserPointPage } from '@/api/personal-center/index' import { signIn, getUserPointPage } from '~/api/personal-center/index'
import { PageResultMemberPointRecordRespVO } from '@/api/personal-center/types' import type { PageResultMemberPointRecordRespVO } from '~/api/personal-center/types'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
import dayjs from 'dayjs' import dayjs from 'dayjs'
const userStore = useUserStore() const userStore = useUserStore()

View File

@ -17,11 +17,11 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import KlTabBar from '@/components/kl-tab-bar/index.vue' import KlTabBar from '~/components/kl-tab-bar/index.vue'
import CardPicture from '@/components/kl-card-picture/index.vue' import CardPicture from '~/components/kl-card-picture/index.vue'
import { ref } from 'vue' import { ref } from 'vue'
import { pageRes, pageReq } from '@/api/upnew/types' import type { pageRes, pageReq } from '~/api/upnew/types'
import emptyImg from '@/assets/images/empty.png' import emptyImg from '~/assets/images/empty.png'
const query = defineModel<pageReq>('modelValue', { const query = defineModel<pageReq>('modelValue', {
required: true, required: true,

View File

@ -23,14 +23,14 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import KlWallpaperCategory from '@/components/kl-wallpaper-category/index.vue' import KlWallpaperCategory from '~/components/kl-wallpaper-category/index.vue'
import RecommendedColumnsV2 from './components/RecommendedColumnsV2.vue' import RecommendedColumnsV2 from './components/RecommendedColumnsV2.vue'
// import FeaturedSpecials from './components/FeaturedSpecials.vue' // import FeaturedSpecials from './components/FeaturedSpecials.vue'
import { reactive, watch, ref } from 'vue' import { reactive, watch, ref } from 'vue'
import { page } from '@/api/upnew/index' import { page } from '~/api/upnew/index'
import { pageRes, pageReq } from '@/api/upnew/types' import type { pageRes, pageReq } from '~/api/upnew/types'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()

View File

@ -88,10 +88,10 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
import { Plus } from '@element-plus/icons-vue' import { Plus } from '@element-plus/icons-vue'
import KlUploader from '@/components/kl-uploader/index.vue' import KlUploader from '~/components/kl-uploader/index.vue'
import { parent, keywords, labels } from '@/api/upnew/index' import { parent, keywords, labels } from '~/api/upnew/index'
import { create } from '@/api/toolbox/index.js' import { create } from '~/api/toolbox/index.js'
import { TcreateReq } from '@/api/toolbox/types' import type { TcreateReq } from '~/api/toolbox/types'
const form = reactive<TcreateReq>({ const form = reactive<TcreateReq>({
title: '', title: '',

View File

@ -37,7 +37,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref } from 'vue'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import useUserStore from '@/store/user' import useUserStore from '~/store/user'
const userStore = useUserStore() const userStore = useUserStore()
const emits = defineEmits(['search']) const emits = defineEmits(['search'])
@ -48,7 +48,7 @@
// 是否登录 // 是否登录
if (!userStore.token) return ElMessage.error('请先登录') if (!userStore.token) return ElMessage.error('请先登录')
// 新开窗口 用router跳转 新窗口打开 // 新开窗口 用router跳转 新窗口打开
window.open('/toolbox-publish', '_blank') navigateTo('/toolbox-publish')
} }
const search = () => { const search = () => {

View File

@ -4,7 +4,7 @@
<KlSearch @search="search"></KlSearch> <KlSearch @search="search"></KlSearch>
<div v-loading="loading" class="ml-auto mr-auto mt-20px w1440 flex justify-center gap-60px"> <div v-loading="loading" class="ml-auto mr-auto mt-20px w1440 flex justify-center gap-60px">
<div class="left w-821px"> <div class="left w-821px">
<img src="@/assets/images/banner2.png" alt="" srcset="" class="h-284px w-100%" /> <img src="~/assets/images/banner2.png" alt="" srcset="" class="h-284px w-100%" />
<div <div
class="box-border border border-t-0px border-t-0px border-[#EEEEEE] rounded-12px border-solid border-t-none bg-[#FFFFFF] px-28px py-17px" class="box-border border border-t-0px border-t-0px border-[#EEEEEE] rounded-12px border-solid border-t-none bg-[#FFFFFF] px-28px py-17px"
style="border-top-left-radius: 0px; border-top-right-radius: 0px" style="border-top-left-radius: 0px; border-top-right-radius: 0px"
@ -19,10 +19,10 @@
<div class="mt-10px flex items-center justify-between"> <div class="mt-10px flex items-center justify-between">
<div class="flex items-center"> <div class="flex items-center">
<div class="flex items-center text-14px text-[#666666] font-normal"> <div class="flex items-center text-14px text-[#666666] font-normal">
<img src="@/assets/images/look.png" alt="" srcset="" class="mr-4px h-17px w-23px" />{{ item.previewPoint }} <img src="~/assets/images/look.png" alt="" srcset="" class="mr-4px h-17px w-23px" />{{ item.previewPoint }}
</div> </div>
<div class="ml-26px flex items-center text-14px text-[#666666] font-normal"> <div class="ml-26px flex items-center text-14px text-[#666666] font-normal">
<img src="@/assets/images/chat.png" alt="" srcset="" class="mr-4px h-17px w-19px" /> {{ item.commentsPoint }} <img src="~/assets/images/chat.png" alt="" srcset="" class="mr-4px h-17px w-19px" /> {{ item.commentsPoint }}
</div> </div>
<div class="ml-20px"> <div class="ml-20px">
<div v-for="(v, index) in item.labels" :key="index" class="mr-10px inline-block text-14px text-[#1A65FF] font-normal">#{{ v }}</div> <div v-for="(v, index) in item.labels" :key="index" class="mr-10px inline-block text-14px text-[#1A65FF] font-normal">#{{ v }}</div>
@ -85,7 +85,7 @@
:key="item" :key="item"
class="mt-16px flex items-center border-b-1px border-b-[#eee] border-b-solid pb-16px text-16px text-[#333333] font-normal" class="mt-16px flex items-center border-b-1px border-b-[#eee] border-b-solid pb-16px text-16px text-[#333333] font-normal"
> >
<img src="@/assets/images/aucad.png" alt="" srcset="" class="h-68px w-110px" /> <img src="~/assets/images/aucad.png" alt="" srcset="" class="h-68px w-110px" />
<div class="ml-20px text-16px text-[#333333] font-normal">Stable Diffusion 商业变现与 绘画大模型多场景实战</div> <div class="ml-20px text-16px text-[#333333] font-normal">Stable Diffusion 商业变现与 绘画大模型多场景实战</div>
</div> </div>
</div> --> </div> -->
@ -94,14 +94,14 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import { page } from '@/api/toolbox/index.js' import { page } from '~/api/toolbox/index.js'
import { TpageReq, TpageRes } from '@/api/toolbox/types' import type { TpageReq, TpageRes } from '~/api/toolbox/types'
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import KlSearch from '@/pages/toolbox/components/search.vue' import KlSearch from '~/pages/toolbox/components/search.vue'
import { getRelationRecommend } from '@/api/drawe-detail/index' import { getRelationRecommend } from '~/api/drawe-detail/index'
import { ProjectDrawPageRespVO } from '@/api/drawe-detail/types' import type { ProjectDrawPageRespVO } from '~/api/drawe-detail/types'
import emptyImg from '@/assets/images/empty.png' import emptyImg from '~/assets/images/empty.png'
import dayjs from 'dayjs' import dayjs from 'dayjs'
const pageReq = reactive<TpageReq>({ const pageReq = reactive<TpageReq>({

View File

@ -157,11 +157,12 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, PropType, computed } from 'vue' import type { PropType } from 'vue'
import { ref, computed } from 'vue'
import { Plus } from '@element-plus/icons-vue' import { Plus } from '@element-plus/icons-vue'
import KlUploader from '@/components/kl-uploader/index.vue' import KlUploader from '~/components/kl-uploader/index.vue'
import { parent, keywords, labels, indexTabs } from '@/api/upnew/index' import { parent, keywords, labels, indexTabs } from '~/api/upnew/index'
import { TcreateReq } from '@/api/upnew/types' import type { TcreateReq } from '~/api/upnew/types'
const props = defineProps({ const props = defineProps({
vaildRules: { vaildRules: {

View File

@ -53,9 +53,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { nextTick, ref } from 'vue' import { nextTick, ref } from 'vue'
import { TcreateReq } from '@/api/upnew/types' import type { TcreateReq } from '~/api/upnew/types'
import { tree } from '@/api/common/index' import { tree } from '~/api/common/index'
import { DrawsEnmu } from '../util.ts' import { DrawsEnmu } from '../util'
const form = defineModel<TcreateReq>('modelValue', { const form = defineModel<TcreateReq>('modelValue', {
required: true, required: true,

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="ml-23px box-border min-h-930px w-516px border border-[#EEEEEE] rounded-12px border-solid bg-[#FFFFFF] px-33px py-22px"> <div class="ml-23px box-border min-h-930px w-516px border border-[#EEEEEE] rounded-12px border-solid bg-[#FFFFFF] px-33px py-22px">
<div class="flex items-center"> <div class="flex items-center">
<img src="@/assets/images/preview.png" alt="" srcset="" width="16px" height="19px" /><span class="ml-7px text-18px text-[#333333] font-normal" <img src="~/assets/images/preview.png" alt="" srcset="" width="16px" height="19px" /><span class="ml-7px text-18px text-[#333333] font-normal"
>预览</span >预览</span
></div ></div
> >
@ -11,7 +11,7 @@
> >
<div class="my-30px h-1px w-460px rounded-1px bg-[#EEEEEE]"></div> <div class="my-30px h-1px w-460px rounded-1px bg-[#EEEEEE]"></div>
<div class="flex items-center" <div class="flex items-center"
><img src="@/assets/images/tip.png" width="20px" height="20px" /><span class="ml-7px text-18px text-[#333333] font-normal" ><img src="~/assets/images/tip.png" width="20px" height="20px" /><span class="ml-7px text-18px text-[#333333] font-normal"
>上传遇到问题可以咨询</span >上传遇到问题可以咨询</span
></div ></div
> >

View File

@ -28,11 +28,11 @@
import PreView from './components/Preview.vue' import PreView from './components/Preview.vue'
import DrawType from './components/DrawType.vue' import DrawType from './components/DrawType.vue'
import DrawForm from './components/DrawForm.vue' import DrawForm from './components/DrawForm.vue'
import KlNavTab from '@/components/kl-nav-tab/index.vue' import KlNavTab from '~/components/kl-nav-tab/index.vue'
import { reactive, ref, onMounted, computed } from 'vue' import { reactive, ref, onMounted, computed } from 'vue'
import { TcreateReq } from '@/api/upnew/types' import type { TcreateReq } from '~/api/upnew/types'
import { create } from '@/api/upnew/index' import { create } from '~/api/upnew/index'
const form = reactive<TcreateReq>({ const form = reactive<TcreateReq>({
activeName: '', // 标签 activeName: '', // 标签

View File

@ -1,5 +1,5 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
// import { getPermissions } from '@/api/common' // import { getPermissions } from '~/api/common'
import type { IPermissions } from '~/api/common/types' import type { IPermissions } from '~/api/common/types'
// type TPayload = { // type TPayload = {

View File

@ -1,7 +1,4 @@
import type { AppMemberUserInfoRespVO } from "@/api/common/types"; import type { AppMemberUserInfoRespVO } from "~/api/common/types";
export type onRefreshTokenResponse = (
data: AxiosResponse | boolean
) => { token: string; refreshToken: string } | false;
class RefreshToken { class RefreshToken {
static instance: RefreshToken; static instance: RefreshToken;
@ -10,10 +7,10 @@ class RefreshToken {
static SOTRAGE_USERID = "kl-userId"; static SOTRAGE_USERID = "kl-userId";
static SOTRAGE_USERNAME = "kl-userName"; static SOTRAGE_USERNAME = "kl-userName";
static SOTRAGE_USERINFO = "kl-userInfo"; static SOTRAGE_USERINFO = "kl-userInfo";
public pending = false; static pending = false;
public callbacks: any[] = []; static callbacks: any[] = [];
protected constructor(config: TRefreshTokenConstructorConfig) { protected constructor(config: any) {
RefreshToken.SOTRAGE_REFRESH_TOKEN_KEY = config?.refreshTokenKey || "kl-tk"; RefreshToken.SOTRAGE_REFRESH_TOKEN_KEY = config?.refreshTokenKey || "kl-tk";
RefreshToken.SOTRAGE_TOKENKEY = config?.refreshTokenKey || "kl-rfk"; RefreshToken.SOTRAGE_TOKENKEY = config?.refreshTokenKey || "kl-rfk";
RefreshToken.SOTRAGE_USERID = config?.refreshTokenKey || "kl-userId"; RefreshToken.SOTRAGE_USERID = config?.refreshTokenKey || "kl-userId";
@ -72,4 +69,5 @@ class RefreshToken {
} }
} }
export default RefreshToken; const REFRESHTOKEN = RefreshToken;
export default REFRESHTOKEN;

View File

@ -1,151 +0,0 @@
import axios, { AxiosInstance, InternalAxiosRequestConfig, AxiosRequestConfig, AxiosResponse } from 'axios'
import qs from 'qs'
import useUserStore from '@/store/user'
import isPlainObject from 'lodash/isPlainObject'
import RefreshToken from './RefreshToken'
// 允许跨域
axios.defaults.headers.post['Access-Control-Allow-Origin-Type'] = '*'
const axiosInstance: AxiosInstance = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 1200000,
})
// 自动刷新 token 实现
export const refreshToken = RefreshToken.create({
axiosInstance,
refreshTokenApiUrl: '',
onRefreshTokenResponse: (res: any) => {
if (res.data && (res?.data?.code === 0 || res?.data?.statusCode === '00000') && res.data.data) {
return {
token: res?.data?.data?.access_token || '',
refreshToken: res?.data?.data?.refresh_token || '',
}
}
const userStore = useUserStore()
userStore.logout()
return false
},
onRefreshTokenResquest() {
const tokens = refreshToken.getToken()
return {
data: {
refreshToken: tokens.refreshToken,
},
config: {
headers: {
refreshToken: tokens.refreshToken,
},
data: {
refreshToken: tokens.refreshToken,
},
},
}
},
})
// axios实例拦截响应
axiosInstance.interceptors.response.use(
(response: AxiosResponse) => {
//因为后端的有些接口没有statusCode这个状态码先这样判断吧
if (response.data.statusCode === '00000' || response.data.code === 0) {
return response.data
} else {
ElMessage.error(response.data.msg)
return response.data
}
},
(error) => {
let message = '系统异常'
const { status, config } = error.response
if (status === 401) {
if (refreshToken.pending) {
return refreshToken.pushCallbacks(config)
} else {
// 刷新token
refreshToken.refresh().then((refreshSuccess) => {
// 刷新成功 回调错误队列
if (refreshSuccess) {
refreshToken.releaseQueue()
} else {
return Promise.reject(error)
}
})
// 推入第一个401请求
return refreshToken.pushCallbacks(config)
}
} else if (status === 404) {
message = '接口地址有误'
} else if (status === 400) {
message = '参数有误,请确认参数是否正确'
}
ElMessage.error(message)
return Promise.reject(error)
}
)
// axios实例拦截请求
axiosInstance.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
config.headers['Accept-Language'] = 'zh-CN'
const tokens = refreshToken.getToken()
if (tokens !== null) {
config.headers['authorization'] = `Bearer ${tokens.token}`
config.headers['Refreshtoken'] = tokens.refreshToken
}
// 防止get请求缓存
if (config.method === 'get') {
config.params = {
...config.params,
...{ _t: new Date().getTime() },
}
}
if (isPlainObject(config.data)) {
// eslint-disable-next-line no-param-reassign
config.data = {
...config.data,
}
if (config.headers?.['content-type']) {
const contentType: string = config.headers['content-type'] + ''
if (/^application\/x-www-form-urlencoded/.test(contentType)) {
// form形式编码
config.data = qs.stringify(config.data)
}
}
}
return config
},
(error) => {
return Promise.reject(error)
}
)
const request = <T = any>(config: AxiosRequestConfig): Promise<T> => {
const conf = config
return new Promise((resolve, reject) => {
axiosInstance
.request<any, AxiosResponse<IResponse>>(conf)
.then((res: AxiosResponse<IResponse>) => {
const data: any = res
resolve(data as T)
})
.catch((error) => reject(error))
})
}
// 封装get
export function get<T = any>(config: AxiosRequestConfig): Promise<T> {
return request({ ...config, method: 'GET' })
}
// 封装delete
export function Delete<T = any>(config: AxiosRequestConfig): Promise<T> {
return request({ ...config, method: 'delete' })
}
// 封装put
export function put<T = any>(config: AxiosRequestConfig): Promise<T> {
return request({ ...config, method: 'put' })
}
// 封装post
export function post<T = any>(config: AxiosRequestConfig): Promise<T> {
return request({ ...config, method: 'POST' })
}
export default axiosInstance
export type { AxiosInstance, AxiosResponse }

129
yarn.lock
View File

@ -709,6 +709,72 @@
semver "^7.5.3" semver "^7.5.3"
tar "^7.4.0" tar "^7.4.0"
"@napi-rs/canvas-android-arm64@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.77.tgz#58debdab512a950d505f17cd499e7171f33a5184"
integrity sha512-jC8YX0rbAnu9YrLK1A52KM2HX9EDjrJSCLVuBf9Dsov4IC6GgwMLS2pwL9GFLJnSZBFgdwnA84efBehHT9eshA==
"@napi-rs/canvas-darwin-arm64@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.77.tgz#84bbbf72d2ca647d2be7d1a0a64548ba086b8b95"
integrity sha512-VFaCaCgAV0+hPwXajDIiHaaGx4fVCuUVYp/CxCGXmTGz699ngIEBx3Sa2oDp0uk3X+6RCRLueb7vD44BKBiPIg==
"@napi-rs/canvas-darwin-x64@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.77.tgz#e0f845fa5d2ad7eafe49c5e862a94b4be1dbc040"
integrity sha512-uD2NSkf6I4S3o0POJDwweK85FE4rfLNA2N714MgiEEMMw5AmupfSJGgpYzcyEXtPzdaca6rBfKcqNvzR1+EyLQ==
"@napi-rs/canvas-linux-arm-gnueabihf@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.77.tgz#51f2d786951c9c1eac8dbc92471a128212392cb6"
integrity sha512-03GxMMZGhHRQxiA4gyoKT6iQSz8xnA6T9PAfg/WNJnbkVMFZG782DwUJUb39QIZ1uE1euMCPnDgWAJ092MmgJQ==
"@napi-rs/canvas-linux-arm64-gnu@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.77.tgz#e92897dac7f3b7acb806529bf8a0ab20ac26e84f"
integrity sha512-ZO+d2gRU9JU1Bb7SgJcJ1k9wtRMCpSWjJAJ+2phhu0Lw5As8jYXXXmLKmMTGs1bOya2dBMYDLzwp7KS/S/+aCA==
"@napi-rs/canvas-linux-arm64-musl@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.77.tgz#f2ba1f00e734c6ab142efd86263adf5cb391a228"
integrity sha512-S1KtnP1+nWs2RApzNkdNf8X4trTLrHaY7FivV61ZRaL8NvuGOkSkKa+gWN2iedIGFEDz6gecpl/JAUSewwFXYg==
"@napi-rs/canvas-linux-riscv64-gnu@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.77.tgz#c6b3cb3cd277de835ac06a87403eca51efa67acd"
integrity sha512-A4YIKFYUwDtrSzCtdCAO5DYmRqlhCVKHdpq0+dBGPnIEhOQDFkPBTfoTAjO3pjlEnorlfKmNMOH21sKQg2esGA==
"@napi-rs/canvas-linux-x64-gnu@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.77.tgz#c36c7dbec434d6c60529edbfe46a32d1ac21d096"
integrity sha512-Lt6Sef5l0+5O1cSZ8ysO0JI+x+rSrqZyXs5f7+kVkCAOVq8X5WTcDVbvWvEs2aRhrWTp5y25Jf2Bn+3IcNHOuQ==
"@napi-rs/canvas-linux-x64-musl@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.77.tgz#36c20eae7c46f724da406a68199755601a7b311d"
integrity sha512-NiNFvC+D+omVeJ3IjYlIbyt/igONSABVe9z0ZZph29epHgZYu4eHwV9osfpRt1BGGOAM8LkFrHk4LBdn2EDymA==
"@napi-rs/canvas-win32-x64-msvc@0.1.77":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.77.tgz#1cb0b9964e0b4db348e4120eea39b5c60aa5432c"
integrity sha512-fP6l0hZiWykyjvpZTS3sI46iib8QEflbPakNoUijtwyxRuOPTTBfzAWZUz5z2vKpJJ/8r305wnZeZ8lhsBHY5A==
"@napi-rs/canvas@^0.1.65", "@napi-rs/canvas@^0.1.74":
version "0.1.77"
resolved "https://registry.npmmirror.com/@napi-rs/canvas/-/canvas-0.1.77.tgz#e78e208adb79cf211f6d260664d766b6f26da341"
integrity sha512-N9w2DkEKE1AXGp3q55GBOP6BEoFrqChDiFqJtKViTpQCWNOSVuMz7LkoGehbnpxtidppbsC36P0kCZNqJKs29w==
optionalDependencies:
"@napi-rs/canvas-android-arm64" "0.1.77"
"@napi-rs/canvas-darwin-arm64" "0.1.77"
"@napi-rs/canvas-darwin-x64" "0.1.77"
"@napi-rs/canvas-linux-arm-gnueabihf" "0.1.77"
"@napi-rs/canvas-linux-arm64-gnu" "0.1.77"
"@napi-rs/canvas-linux-arm64-musl" "0.1.77"
"@napi-rs/canvas-linux-riscv64-gnu" "0.1.77"
"@napi-rs/canvas-linux-x64-gnu" "0.1.77"
"@napi-rs/canvas-linux-x64-musl" "0.1.77"
"@napi-rs/canvas-win32-x64-msvc" "0.1.77"
"@napi-rs/wasm-runtime@^1.0.1": "@napi-rs/wasm-runtime@^1.0.1":
version "1.0.3" version "1.0.3"
resolved "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.3.tgz#24593dbd6fd1454b0b9c8b73bf7ac62d92a6bf63" resolved "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.3.tgz#24593dbd6fd1454b0b9c8b73bf7ac62d92a6bf63"
@ -1664,6 +1730,11 @@
resolved "https://registry.npmmirror.com/@speed-highlight/core/-/core-1.2.7.tgz" resolved "https://registry.npmmirror.com/@speed-highlight/core/-/core-1.2.7.tgz"
integrity sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g== integrity sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==
"@tinymce/tinymce-vue@^6.3.0":
version "6.3.0"
resolved "https://registry.npmmirror.com/@tinymce/tinymce-vue/-/tinymce-vue-6.3.0.tgz#1ea4d57eea71e48aa71da9d8de98472f8505b2d4"
integrity sha512-DSP8Jhd3XqCCliTnusfbmz3D8GqQ4iRzkc4aadYHDcJPVjkaqopJ61McOdH82CSy599vGLkPjGzqJYWJkRMiUA==
"@tybys/wasm-util@^0.10.0": "@tybys/wasm-util@^0.10.0":
version "0.10.0" version "0.10.0"
resolved "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.0.tgz#2fd3cd754b94b378734ce17058d0507c45c88369" resolved "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.0.tgz#2fd3cd754b94b378734ce17058d0507c45c88369"
@ -1726,6 +1797,13 @@
resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-1.20.2.tgz" resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-1.20.2.tgz"
integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==
"@types/tinymce@^5.5.0":
version "5.5.0"
resolved "https://registry.npmmirror.com/@types/tinymce/-/tinymce-5.5.0.tgz#b92f376ff97a1a3fef474827e13874786a2fa838"
integrity sha512-fOma8SV34kaHoiigF/RJ7/wbgv2B2DXtP51qTWn5nt2D2ubHFDTl/HKy/QmSgBxkdvpMNW9bng58cMsqgfQrUA==
dependencies:
tinymce "*"
"@types/triple-beam@^1.3.2": "@types/triple-beam@^1.3.2":
version "1.3.5" version "1.3.5"
resolved "https://registry.npmmirror.com/@types/triple-beam/-/triple-beam-1.3.5.tgz" resolved "https://registry.npmmirror.com/@types/triple-beam/-/triple-beam-1.3.5.tgz"
@ -3102,6 +3180,11 @@ decache@^4.6.2:
dependencies: dependencies:
callsite "^1.0.0" callsite "^1.0.0"
decimal.js@^10.6.0:
version "10.6.0"
resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a"
integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==
deepmerge@^4.2.2: deepmerge@^4.2.2:
version "4.3.1" version "4.3.1"
resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz" resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz"
@ -3317,6 +3400,14 @@ eastasianwidth@^0.2.0:
resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz" resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz"
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
echarts@^6.0.0:
version "6.0.0"
resolved "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz#2935aa7751c282d1abbbf7d719d397199a15b9e7"
integrity sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==
dependencies:
tslib "2.3.0"
zrender "6.0.0"
ee-first@1.1.1: ee-first@1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz" resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz"
@ -5303,6 +5394,20 @@ pathe@^2.0.1, pathe@^2.0.3:
resolved "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz" resolved "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz"
integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==
pdfjs-dist@^4.10.38:
version "4.10.38"
resolved "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz#3ee698003790dc266cc8b55c0e662ccb9ae18f53"
integrity sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==
optionalDependencies:
"@napi-rs/canvas" "^0.1.65"
pdfjs-dist@^5.4.54:
version "5.4.54"
resolved "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-5.4.54.tgz#a2a605cd65d401f988c1e8e79454f2eca9d385bd"
integrity sha512-TBAiTfQw89gU/Z4LW98Vahzd2/LoCFprVGvGbTgFt+QCB1F+woyOPmNNVgLa6djX9Z9GGTnj7qE1UzpOVJiINw==
optionalDependencies:
"@napi-rs/canvas" "^0.1.74"
pend@~1.2.0: pend@~1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz" resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz"
@ -6369,6 +6474,11 @@ tinyglobby@0.2.14, tinyglobby@^0.2.14:
fdir "^6.4.4" fdir "^6.4.4"
picomatch "^4.0.2" picomatch "^4.0.2"
tinymce@*, tinymce@^8.0.2:
version "8.0.2"
resolved "https://registry.npmmirror.com/tinymce/-/tinymce-8.0.2.tgz#babaaa40c154d0832b41332f25f3485b5887a6f2"
integrity sha512-Gkvn5mRcZCAK1EKP7hnk3VBzwqPbqpZU2AN0T08BMtvmY9Sg0C0ZqmMghJCQ3vgo+LWA38pDOPiaM8EW7BZEow==
tmp-promise@^3.0.2: tmp-promise@^3.0.2:
version "3.0.3" version "3.0.3"
resolved "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz" resolved "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz"
@ -6418,6 +6528,11 @@ ts-api-utils@^2.1.0:
resolved "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz" resolved "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz"
integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==
tslib@2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
tslib@^2.4.0, tslib@^2.6.3, tslib@^2.8.1: tslib@^2.4.0, tslib@^2.6.3, tslib@^2.8.1:
version "2.8.1" version "2.8.1"
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz" resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
@ -6803,6 +6918,13 @@ vue-flow-layout@^0.2.0:
resolved "https://registry.npmmirror.com/vue-flow-layout/-/vue-flow-layout-0.2.0.tgz" resolved "https://registry.npmmirror.com/vue-flow-layout/-/vue-flow-layout-0.2.0.tgz"
integrity sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q== integrity sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q==
vue-pdf-embed@^2.1.3:
version "2.1.3"
resolved "https://registry.npmmirror.com/vue-pdf-embed/-/vue-pdf-embed-2.1.3.tgz#e2575b75ed0463c41265d2405506a7d1c39ed0ee"
integrity sha512-EGgZNb8HRrAloBpb8p8CugDpJpoPbQ8CFfAYdWZgq2e5qBMP9JSeLzVQIAJkXsclHXRIS3O9fp3WQbP9T5Inwg==
dependencies:
pdfjs-dist "^4.10.38"
vue-router@^4.5.1: vue-router@^4.5.1:
version "4.5.1" version "4.5.1"
resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz" resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz"
@ -7074,3 +7196,10 @@ zod@^3.23.8:
version "3.25.76" version "3.25.76"
resolved "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz" resolved "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz"
integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==
zrender@6.0.0:
version "6.0.0"
resolved "https://registry.npmmirror.com/zrender/-/zrender-6.0.0.tgz#947077bc69cdea744134984927f132f3727f8079"
integrity sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==
dependencies:
tslib "2.3.0"