diff --git a/.gitignore b/.gitignore index 1f22b9c..8856bc6 100644 --- a/.gitignore +++ b/.gitignore @@ -114,3 +114,5 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* +/.hbuilderx/ +/.idea/ diff --git a/manifest.json b/manifest.json index 88b3b9b..15b01c3 100644 --- a/manifest.json +++ b/manifest.json @@ -86,6 +86,9 @@ }, "scope.camera": { "desc": "需要摄像头拍照和视频通话" + }, + "scope.writePhotosAlbum": { + "desc": "需要访问您的相册以选择图片" } } }, diff --git a/pages/index/index.vue b/pages/index/index.vue index e4eeb36..b1ddbe7 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -124,9 +124,9 @@ - + @@ -136,7 +136,7 @@

{{ item.last_message }}

- +
暂无新消息 @@ -151,6 +151,7 @@ import { getseesionInfo, getseesionRead } from '../../request/api/api' +import {getChatFriendsListApi} from "@/request/api/im"; export default { data() { @@ -158,108 +159,7 @@ export default { order: [], system: [], doctor: [], - imChat: [ - { - id: 'doctor-39', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '李二狗', - avatar: 'https://xiaokang88.oss-cn-hangzhou.aliyuncs.com/xk_upload_20250108/29bdb9560340373bb3096394a845afa5.jpg', - un_read_num: 99, - last_message: '多喝水即可', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-2', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王三三', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[图片]', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-3', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王五五', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[图片]', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-4', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王六六', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[图片]', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-5', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王六六1', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[音频]', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-6', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王六六2', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[视频]', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-7', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王六六3', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[文件]', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-8', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王六六', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[图片]', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-9', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王六六1', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[音频]', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-10', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王六六2', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[视频]', - last_message_time: '2021-07-05 09:05:05' - }, - { - id: 'doctor-11', - room_id: 'xk_chat_room_68786b4fd071233eb15dfa3e62c1', - nick_name: '王六六3', - avatar: '/static/xx/ysxx.png', - un_read_num: 0, - last_message: '[文件]', - last_message_time: '2021-07-05 09:05:05' - }, - - ], + imChat: [], type: "" } }, @@ -357,6 +257,11 @@ export default { this.system = res.data.data.system this.doctor = res.data.data.doctor_news }) + }, + getMyChatFriendsList() { + getChatFriendsListApi().then((res) => { + this.imChat = res.data.result + }) } }, mounted() { @@ -367,6 +272,7 @@ export default { this.system = [] this.doctor = [] this.getInfo() + this.getMyChatFriendsList() } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7052cd7..c1df2f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,15 +8,23 @@ importers: .: dependencies: + js-base64: + specifier: ^3.7.7 + version: 3.7.7 uview-ui: specifier: ^1.8.8 version: 1.8.8 packages: + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + uview-ui@1.8.8: resolution: {integrity: sha512-Osal3yzXiHor0In9OPTZuXTaqTbDglMZ9RGK/MPYDoQQs+y0hrBCUD0Xp5T70C8i2lLu2X6Z11zJhmsQWMR7Jg==, tarball: https://registry.npmmirror.com/uview-ui/-/uview-ui-1.8.8.tgz} snapshots: + js-base64@3.7.7: {} + uview-ui@1.8.8: {} diff --git a/request/api/http.js b/request/api/http.js new file mode 100644 index 0000000..d322812 --- /dev/null +++ b/request/api/http.js @@ -0,0 +1,88 @@ +import http from './request' + +const HttpUrlMap = [ + '/oldApi', + '/newApi', + '/imApi', + '/xkApi', +] + +/** + * GET请求(Json) + * @param url + * @param params + * @param type + * @returns {Promise<*>} + */ +export async function get(url, params, type = 0) { + return await http(HttpUrlMap[type] + url, { + method: 'GET', + data: params, + // 传输方式是json + headers: { + 'Content-Type': 'application/json' + } + }, 1) +} +/** + * POST请求(Json) + * @param url + * @param params + * @param type + * @returns {Promise<*>} + */ +export async function post(url, params, type = 0) { + return await http(HttpUrlMap[type] + url, { + method: 'POST', + data: params, + // 传输方式是json + headers: { + 'Content-Type': 'application/json' + } + }, 1) +} + +/** + * 文件上传方法(仅支持 FormData 格式) + * @param {string} url - 接口路径 + * @param {any} formData - 包含文件的 FormData 对象 + * @param {int} [type=0] - 请求类型(用于映射 HttpUrlMap) + * @returns {Promise<*>} + */ +export function uploadFile(url, formData, type = 3) { + const fullUrl = 'http://127.0.0.1:18001/api/mobile' + url; + + console.log(fullUrl, 'sssssssssssss') + uni.uploadFile({ + url: 'http://127.0.0.1:18001/api/mobile/chat-friends/upload-chat-file', + filePath: formData, + name: 'file', + header: { + "authorization": uni.getStorageSync('token') + }, + formData, + success: (uploadFileRes) => { + return uploadFileRes; + }, + fail: (res) => { + console.log(res, '上传失败') + } + }) + // return; + // try { + // const response = await http(fullUrl, { + // method: 'POST', + // data: formData, + // // 注意:不手动设置 Content-Type,浏览器会自动添加 multipart/form-data 和 boundary + // headers: { + // // 如果需要额外 headers(如 token),可在此添加 + // // 'Authorization': 'Bearer xxx', + // }, + // }, 1); + // + // return response; + // } catch (error) { + // console.error('File upload failed:', error); + // throw error; // 抛出错误供调用者处理 + // } +} \ No newline at end of file diff --git a/request/api/im.js b/request/api/im.js index e8b24c5..d16ef5f 100644 --- a/request/api/im.js +++ b/request/api/im.js @@ -1,4 +1,5 @@ import http from './request' +import {get, post, uploadFile} from './http' // 发信息 // export async function sendMsg(params) { // let data = await http('/v1/im/message-send', params) @@ -14,4 +15,32 @@ export async function sendToUserApi(params) { 'Content-Type': 'application/json' } }, 1) +} + +/** + * 获取房间聊天记录 + * @param params + * @returns {Promise<*>} + */ +export async function getMessagesByRoomIdApi(params) { + return await post('/chat-friends/messages-by-room-id', params, 3) +} + +/** + * 获取聊天好友列表 + * @param params + * @returns {Promise<*>} + */ +export async function getChatFriendsListApi(params) { + return await get('/chat-friends/list', params, 3) +} + +/** + * 上传聊天文件 + * @param params + * @returns {Promise<*>} + */ +export function upLoadChatFileApi(params) { + return console.log('aaaaaaaaaaaaaaaaaaa', uploadFile('/chat-friends/upload-chat-file', params)) + return uploadFile('/chat-friends/upload-chat-file', params) } \ No newline at end of file diff --git a/request/api/request.js b/request/api/request.js index 56dc89e..45c9a75 100644 --- a/request/api/request.js +++ b/request/api/request.js @@ -29,7 +29,7 @@ function request(url, params, method = 0) { } if (url.split('/').indexOf('xkApi') !== -1) { // baseURL = "https://api.xiaokang88.com/member" - baseURL = "https://127.0.0.1:18001/member" + baseURL = "http://127.0.0.1:18001/api/mobile" } url = url.replace('/oldApi', ''); url = url.replace('/newApi', ''); diff --git a/store/chat/chat.js b/store/chat/chat.js index e44abfa..fbab38c 100644 --- a/store/chat/chat.js +++ b/store/chat/chat.js @@ -1,11 +1,15 @@ +import {getMessagesByRoomIdApi} from "@/request/api/im"; + /** * 聊天消息管理器 - * @type {{currentRoomId: null, unreadCounts: {}, messageCache: {}, roomMessages: {}, enterRoom(*): void, leaveRoom(): void, getCurrentRoomId(): *, increaseUnreadCount(*): void, resetUnreadCount(*): void, getUnreadCount(*): *, getAllUnreadCount(): *, notifyUnreadChange(): void, cacheMessage(*, *): void, addMessageToRoom(*, *): void, getRoomMessages(*): *, handleIncomingMessage(*): void}} + * @type {{currentRoomId: null, lastMessageId: null, unreadCounts: {}, messageCache: {}, roomMessages: {}, enterRoom(*): void, leaveRoom(): void, getCurrentRoomId(): *, increaseUnreadCount(*): void, resetUnreadCount(*): void, getUnreadCount(*): *, getAllUnreadCount(): *, loadHistory(): *, getMessageType(): *, notifyUnreadChange(): void,, addMessageToRoom(*, *): void, getRoomMessages(*): *, handleIncomingMessage(*): void}} */ const ChatManager = { // 当前房间ID currentRoomId: null, + lastMessageId: 0, + // 存储未读消息数 { roomId: count } unreadCounts: {}, @@ -19,19 +23,9 @@ const ChatManager = { enterRoom(roomId) { this.currentRoomId = roomId; uni.setStorageSync('currentRoomId', roomId); - console.log(`进入房间: ${roomId}`); - + console.log(`进入房间`); // 重置当前房间的未读消息 this.resetUnreadCount(roomId); - - // 如果有缓存消息,则触发事件,然后清除缓存 - if (this.messageCache[roomId]) { - const cachedMessages = this.messageCache[roomId]; - cachedMessages.forEach(message => { - this.addMessageToRoom(roomId, message); - }); - delete this.messageCache[roomId]; - } }, // 离开聊天室 @@ -83,25 +77,152 @@ const ChatManager = { }); }, - // 缓存消息(当收到消息但不在该房间时) - cacheMessage(roomId, message) { - if (!this.messageCache[roomId]) { - this.messageCache[roomId] = []; - } - this.messageCache[roomId].push(message); - }, - // 添加消息到房间 addMessageToRoom(roomId, message) { if (!this.roomMessages[roomId]) { this.roomMessages[roomId] = []; } this.roomMessages[roomId].push(message); + console.log('addMessageToRoom', this.roomMessages[roomId]) }, // 获取房间消息 getRoomMessages(roomId) { + let that = this; + this.roomMessages[roomId] = []; + getMessagesByRoomIdApi({ + room_id: roomId, + last_message_id: 0, + }).then((res) => { + that.roomMessages[roomId] = that.checkMessage(res.data.result.list); + that.lastMessageId = res.data.result.last_message_id; + console.log(that.roomMessages[roomId], 'roomMessages') + + uni.$emit('load-room-message', 1); + return this.roomMessages[roomId] || []; + }) return this.roomMessages[roomId] || []; + + }, + + checkMessage(message, type = 0) { + if (type === 1) { + return { + id: message.id, + sender: message.sender_user_id, + type: this.getMessageType(message.message_type), + content: message.content, + duration: message.duration, + time: this.formatTime(message.send_time), + timestamp: message.send_time + }; + } + return message.map(item => { + return { + id: item.id, + sender: item.sender_user_id, + type: this.getMessageType(item.message_type), + content: item?.message_content || item.content, + duration: item.duration, + time: item?.created_at_text || item.send_time, + timestamp: item?.created_at || item.send_time + }; + }); + }, + + // 根据消息类型ID获取类型名称 + getMessageType(typeId) { + const types = { + 0: 'text', + 1: 'image', + 2: 'audio', + 3: 'video', + 4: 'prescription', + 5: 'file' + }; + return types[typeId]; + }, + + // 格式化时间 + formatTime(timestamp) { + let date; + + // 处理不同输入类型 + if (typeof timestamp === 'number') { + // 数字直接作为时间戳处理 + date = new Date(timestamp); + } else if (timestamp instanceof Date) { + // Date对象直接使用 + date = timestamp; + } else if (typeof timestamp === 'string') { + // 字符串类型:尝试转换为时间戳 + const parsed = Date.parse(timestamp); + if (isNaN(parsed)) { + // 转换失败则使用当前时间 + date = new Date(); + } else { + date = new Date(parsed); + } + } else { + // 其他类型使用当前时间 + date = new Date(); + } + + const now = new Date(); + const diff = now - date; // 时间差(毫秒) + const seconds = Math.floor(diff / 1000); + + // 定义星期几的名称 + const weekdays = ['日', '一', '二', '三', '四', '五', '六']; + const currentWeekday = date.getDay(); // 0=周日,1=周一,...,6=周六 + + // 格式化时间函数 (补零) + const formatTime = (num) => num.toString().padStart(2, '0'); + const formattedTime = `${formatTime(date.getHours())}:${formatTime(date.getMinutes())}`; + + if (seconds < 60) { + return '刚刚'; + } else if (seconds < 3600) { + return Math.floor(seconds / 60) + '分钟前'; + } else if (seconds < 7200) { // 1-2小时 + return Math.floor(seconds / 3600) + '小时前'; + } else if (seconds < 86400) { // 2-24小时 + return formattedTime; + } else if (seconds < 172800) { // 1-2天(昨天) + return `昨天 ${formattedTime}`; + } else if (seconds < 259200) { // 2-3天(前天) + return `前天 ${formattedTime}`; + } else if (seconds < 604800) { // 3-7天内(本周X) + return `周${weekdays[currentWeekday]} ${formattedTime}`; + } else if (seconds < 1209600) { // 7-14天(上周X) + return `上周${weekdays[currentWeekday]} ${formattedTime}`; + } else if (seconds < 2592000) { // 14天-1个月 + return Math.floor(seconds / 86400) + '天前'; + } else if (seconds < 31536000) { // 1个月-1年 + return Math.floor(seconds / 2592000) + '个月前'; + } else { // 超过1年 + return `${date.getFullYear()}-${formatTime(date.getMonth() + 1)}-${formatTime(date.getDate())}`; + } + }, + + loadHistory(roomId) { + let that = this; + getMessagesByRoomIdApi({ + room_id: roomId, + last_message_id: that.lastMessageId, + }).then((res) => { + + if (res.data.result.list?.length === 0) { + // 没有更多历史消息 + uni.$emit('no-more-history'); + return; + } + that.roomMessages[roomId] = [...that.checkMessage(res.data.result.list), ...that.roomMessages[roomId]]; + that.lastMessageId = res.data.result.last_message_id; + + uni.$emit('load-room-message'); + return res.data.result.list + }) }, // 处理收到的消息 @@ -110,15 +231,14 @@ const ChatManager = { const currentRoomId = this.getCurrentRoomId(); // 添加消息到房间 - this.addMessageToRoom(roomId, message); + this.addMessageToRoom(roomId, this.checkMessage(message, 1)); // 如果当前在消息所属的房间,直接显示 if (currentRoomId === roomId) { // 通知聊天页面显示消息 - uni.$emit('new-room-message', message); + uni.$emit('new-room-message', this.checkMessage(message, 1)); } else { // 不在当前房间,缓存消息并增加未读消息数 - this.cacheMessage(roomId, message); this.increaseUnreadCount(roomId); } } diff --git a/subPackages/chat/chat.vue b/subPackages/chat/chat.vue index 98ec1e2..cba55b5 100644 --- a/subPackages/chat/chat.vue +++ b/subPackages/chat/chat.vue @@ -40,6 +40,9 @@ @scrolltoupper="loadHistory" > + + 没有更多消息了~ + @@ -218,7 +221,7 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/utils/ws/websocket.js b/utils/ws/websocket.js index 4a6985b..6e363d0 100644 --- a/utils/ws/websocket.js +++ b/utils/ws/websocket.js @@ -107,7 +107,7 @@ export class WebSocketManager { handleMessage(data) { // 如果对象中有clientId则给websocket发送 if (data.clientId) { - const userId = '252'; // 实际项目中从存储获取 + const userId = uni.getStorageSync('user_id'); // 实际项目中从存储获取 const bindMessage = { request_type: 'bind', user_type: 'user', diff --git a/yarn.lock b/yarn.lock index 327cd1e..d99c32c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,135 @@ # yarn lockfile v1 +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/parser@^7.23.5": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== + dependencies: + "@babel/types" "^7.28.0" + +"@babel/types@^7.28.0": + version "7.28.1" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz" + integrity sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@vue/compiler-sfc@2.7.16": + version "2.7.16" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz" + integrity sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg== + dependencies: + "@babel/parser" "^7.23.5" + postcss "^8.4.14" + source-map "^0.6.1" + optionalDependencies: + prettier "^1.18.2 || ^2.0.0" + +"@vue/composition-api@^1.0.0-rc.1", "@vue/composition-api@^1.4.1": + version "1.4.1" + resolved "https://registry.npmjs.org/@vue/composition-api/-/composition-api-1.4.1.tgz" + integrity sha512-ZTat9ru/rwecveRnFzlO2mduOBpGfnBdXn+WtBcFLV9UsL/D+6nX47RWuLiVdNxNDX0qphGZRC+JDjwt+YTnRA== + dependencies: + tslib "^2.3.1" + +"@vue/devtools-api@^6.6.3": + version "6.6.4" + resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz" + integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g== + +csstype@^3.1.0: + version "3.1.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + js-base64@^3.7.7: version "3.7.7" resolved "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.7.tgz" integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +pinia@^2.0.14: + version "2.3.1" + resolved "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz" + integrity sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug== + dependencies: + "@vue/devtools-api" "^6.6.3" + vue-demi "^0.14.10" + +postcss@^8.4.14: + version "8.5.6" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +"prettier@^1.18.2 || ^2.0.0": + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +tslib@^2.3.1: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + uview-ui@^1.8.8: version "1.8.8" resolved "https://registry.npmmirror.com/uview-ui/-/uview-ui-1.8.8.tgz" integrity sha512-Osal3yzXiHor0In9OPTZuXTaqTbDglMZ9RGK/MPYDoQQs+y0hrBCUD0Xp5T70C8i2lLu2X6Z11zJhmsQWMR7Jg== + +vue-demi@^0.14.10: + version "0.14.10" + resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz" + integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg== + +vue-demi@^0.14.5: + version "0.14.5" + resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz" + integrity sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA== + +vue@^2.0.0, "vue@^2.7.0 || ^3.5.11", "vue@^3.0.0-0 || ^2.6.0", "vue@>= 2.5 < 3": + version "2.7.16" + resolved "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz" + integrity sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw== + dependencies: + "@vue/compiler-sfc" "2.7.16" + csstype "^3.1.0" + +vuex@^3.6.2: + version "3.6.2" + resolved "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz" + integrity sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==