更新团课列表页面,修复路径代理导致的错误识别
This commit is contained in:
@@ -1,13 +0,0 @@
|
|||||||
/**
|
|
||||||
* 环境配置文件
|
|
||||||
* 当前仅使用模拟数据(开发模式)
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { groupCourseMockApi } from './groupCourse.mock.js'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 团课服务(仅使用模拟数据)
|
|
||||||
*/
|
|
||||||
export const groupCourseService = groupCourseMockApi
|
|
||||||
|
|
||||||
export default groupCourseService
|
|
||||||
@@ -1,407 +0,0 @@
|
|||||||
/**
|
|
||||||
* 团课模拟数据(测试环境使用)
|
|
||||||
* 数据格式与后端返回格式保持一致
|
|
||||||
*/
|
|
||||||
|
|
||||||
// 模拟团课列表数据(与后端返回格式一致)
|
|
||||||
const mockCourseList = [
|
|
||||||
{
|
|
||||||
"id": "1",
|
|
||||||
"createBy": "admin",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-06-01T11:00:00",
|
|
||||||
"updatedAt": "2026-06-01T11:00:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "极速燃脂单车",
|
|
||||||
"coachId": "104",
|
|
||||||
"courseType": "2",
|
|
||||||
"startTime": "2026-06-02T16:45:00",
|
|
||||||
"endTime": "2026-06-15T20:20:00",
|
|
||||||
"maxMembers": 25,
|
|
||||||
"currentMembers": 0,
|
|
||||||
"status": "0",
|
|
||||||
"location": "单车房",
|
|
||||||
"coverImage": "https://picsum.photos/seed/spinning/640/360",
|
|
||||||
"description": "跟随音乐节奏变换阻力和速度,体验爬坡与冲刺的快感,一节课消耗800大卡。支持次数卡(1次)或储值卡(50元)支付。",
|
|
||||||
"pointCardAmount": 0,
|
|
||||||
"storedValueAmount": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "3",
|
|
||||||
"createBy": "coach_zhang",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-06-01T14:30:00",
|
|
||||||
"updatedAt": "2026-06-01T14:30:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "燃脂搏击",
|
|
||||||
"coachId": "102",
|
|
||||||
"courseType": "2",
|
|
||||||
"startTime": "2026-06-10T18:30:00",
|
|
||||||
"endTime": "2026-06-10T19:30:00",
|
|
||||||
"maxMembers": 20,
|
|
||||||
"currentMembers": 20,
|
|
||||||
"status": "0",
|
|
||||||
"location": "综合训练区",
|
|
||||||
"coverImage": "https://picsum.photos/seed/kickboxing/640/360",
|
|
||||||
"description": "高强度间歇训练,配合音乐快速燃脂,释放压力。名额已满,无法预约。支持次数卡(1次)或储值卡(60元)支付。",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 60
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "4",
|
|
||||||
"createBy": "coach_li",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-06-01T08:00:00",
|
|
||||||
"updatedAt": "2026-06-01T08:00:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "哈他瑜伽",
|
|
||||||
"coachId": "101",
|
|
||||||
"courseType": "1",
|
|
||||||
"startTime": "2026-06-01T15:20:00",
|
|
||||||
"endTime": "2026-06-01T16:50:00",
|
|
||||||
"maxMembers": 12,
|
|
||||||
"currentMembers": 3,
|
|
||||||
"status": "0",
|
|
||||||
"location": "瑜伽教室B",
|
|
||||||
"coverImage": "https://picsum.photos/seed/yoga/640/360",
|
|
||||||
"description": "基础哈他瑜伽,适合所有级别。距开始不足30分钟,已停止预约。支持次数卡(1次)或储值卡(40元)支付。",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 40
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "5",
|
|
||||||
"createBy": "coach_wang",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-05-28T08:00:00",
|
|
||||||
"updatedAt": "2026-05-28T08:00:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "周末冥想修复",
|
|
||||||
"coachId": "101",
|
|
||||||
"courseType": "1",
|
|
||||||
"startTime": "2026-06-20T15:00:00",
|
|
||||||
"endTime": "2026-06-20T16:00:00",
|
|
||||||
"maxMembers": 12,
|
|
||||||
"currentMembers": 3,
|
|
||||||
"status": "1",
|
|
||||||
"location": "冥想室",
|
|
||||||
"coverImage": "https://picsum.photos/seed/meditation/640/360",
|
|
||||||
"description": "通过呼吸和正念冥想,深度放松身心。该课程已被取消。支持次数卡(1次)或储值卡(30元)支付。",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 30
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "6",
|
|
||||||
"createBy": "coach_li",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-05-20T09:15:00",
|
|
||||||
"updatedAt": "2026-05-20T09:15:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "蜜桃臀塑造",
|
|
||||||
"coachId": "103",
|
|
||||||
"courseType": "3",
|
|
||||||
"startTime": "2026-05-30T19:00:00",
|
|
||||||
"endTime": "2026-05-30T20:00:00",
|
|
||||||
"maxMembers": 10,
|
|
||||||
"currentMembers": 8,
|
|
||||||
"status": "2",
|
|
||||||
"location": "私教专区",
|
|
||||||
"coverImage": "https://picsum.photos/seed/glute/640/360",
|
|
||||||
"description": "针对性训练臀部肌肉群,课程已于5月30日结束,无法预约。支持次数卡(1次)或储值卡(80元)支付。",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "7",
|
|
||||||
"createBy": "admin",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-05-25T09:00:00",
|
|
||||||
"updatedAt": "2026-05-25T09:00:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "午间冥想放松",
|
|
||||||
"coachId": "101",
|
|
||||||
"courseType": "1",
|
|
||||||
"startTime": "2026-05-31T12:00:00",
|
|
||||||
"endTime": "2026-05-31T13:00:00",
|
|
||||||
"maxMembers": 15,
|
|
||||||
"currentMembers": 6,
|
|
||||||
"status": "2",
|
|
||||||
"location": "冥想室",
|
|
||||||
"coverImage": "https://picsum.photos/seed/noonmeditation/640/360",
|
|
||||||
"description": "午间冥想课程,已于5月31日结束。支持次数卡(1次)或储值卡(25元)支付。",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 25
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "8",
|
|
||||||
"createBy": "admin",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-06-01T10:00:00",
|
|
||||||
"updatedAt": "2026-06-01T10:00:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "燃脂搏击_次数卡课程",
|
|
||||||
"coachId": "102",
|
|
||||||
"courseType": "2",
|
|
||||||
"startTime": "2026-06-10T19:30:00",
|
|
||||||
"endTime": "2026-06-10T20:30:00",
|
|
||||||
"maxMembers": 20,
|
|
||||||
"currentMembers": 0,
|
|
||||||
"status": "0",
|
|
||||||
"location": "综合训练区",
|
|
||||||
"coverImage": null,
|
|
||||||
"description": "高强度间歇训练,配合音乐快速燃脂,消耗1次",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "9",
|
|
||||||
"createBy": "admin",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-06-01T10:00:00",
|
|
||||||
"updatedAt": "2026-06-01T10:00:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "高端普拉提_储值卡课程",
|
|
||||||
"coachId": "103",
|
|
||||||
"courseType": "1",
|
|
||||||
"startTime": "2026-06-11T19:00:00",
|
|
||||||
"endTime": "2026-06-11T20:00:00",
|
|
||||||
"maxMembers": 15,
|
|
||||||
"currentMembers": 0,
|
|
||||||
"status": "0",
|
|
||||||
"location": "普拉提教室",
|
|
||||||
"coverImage": null,
|
|
||||||
"description": "精准训练核心肌群,消耗储值50元",
|
|
||||||
"pointCardAmount": 0,
|
|
||||||
"storedValueAmount": 20
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "11",
|
|
||||||
"createBy": "admin",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-06-02T10:00:00",
|
|
||||||
"updatedAt": "2026-06-02T10:00:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "时间冲突测试_A_13点-15点",
|
|
||||||
"coachId": "102",
|
|
||||||
"courseType": "2",
|
|
||||||
"startTime": "2026-06-15T13:00:00",
|
|
||||||
"endTime": "2026-06-15T15:00:00",
|
|
||||||
"maxMembers": 20,
|
|
||||||
"currentMembers": 0,
|
|
||||||
"status": "0",
|
|
||||||
"location": "综合训练区",
|
|
||||||
"coverImage": null,
|
|
||||||
"description": "测试用团课A,用于验证时间冲突检测。支持次数卡(1次)或储值卡(50元)支付。",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 50
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "12",
|
|
||||||
"createBy": "admin",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-06-02T10:00:00",
|
|
||||||
"updatedAt": "2026-06-02T10:00:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "时间冲突测试_B_14点-16点",
|
|
||||||
"coachId": "103",
|
|
||||||
"courseType": "1",
|
|
||||||
"startTime": "2026-06-15T14:00:00",
|
|
||||||
"endTime": "2026-06-15T16:00:00",
|
|
||||||
"maxMembers": 15,
|
|
||||||
"currentMembers": 0,
|
|
||||||
"status": "0",
|
|
||||||
"location": "普拉提教室",
|
|
||||||
"coverImage": null,
|
|
||||||
"description": "测试用团课B,与团课A时间重叠(14:00-15:00)。支持次数卡(1次)或储值卡(50元)支付。",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 50
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "13",
|
|
||||||
"createBy": "admin",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-06-02T10:00:00",
|
|
||||||
"updatedAt": "2026-06-02T10:00:00",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "时间冲突测试_C_10点-12点",
|
|
||||||
"coachId": "101",
|
|
||||||
"courseType": "1",
|
|
||||||
"startTime": "2026-06-15T10:00:00",
|
|
||||||
"endTime": "2026-06-15T12:00:00",
|
|
||||||
"maxMembers": 15,
|
|
||||||
"currentMembers": 0,
|
|
||||||
"status": "0",
|
|
||||||
"location": "瑜伽教室",
|
|
||||||
"coverImage": null,
|
|
||||||
"description": "测试用团课C,与团课A/B不冲突。支持次数卡(1次)或储值卡(50元)支付。",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 50
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "14",
|
|
||||||
"createBy": "system",
|
|
||||||
"updateBy": "system",
|
|
||||||
"createdAt": "2026-06-02T17:32:50.532336",
|
|
||||||
"updatedAt": "2026-06-02T17:32:50.532336",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "动感单车aaa",
|
|
||||||
"coachId": "2",
|
|
||||||
"courseType": "2",
|
|
||||||
"startTime": "2026-06-05T18:00:00",
|
|
||||||
"endTime": "2026-06-05T19:00:00",
|
|
||||||
"maxMembers": 25,
|
|
||||||
"currentMembers": 0,
|
|
||||||
"status": "0",
|
|
||||||
"location": "健身房B区",
|
|
||||||
"coverImage": "https://example.com/spinning.jpg",
|
|
||||||
"description": "高强度有氧运动课程",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 50
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "2",
|
|
||||||
"createBy": "admin",
|
|
||||||
"updateBy": null,
|
|
||||||
"createdAt": "2026-06-01T10:00:00",
|
|
||||||
"updatedAt": "2026-06-02T17:35:35.155616",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "清晨流瑜伽",
|
|
||||||
"coachId": "101",
|
|
||||||
"courseType": "1",
|
|
||||||
"startTime": "2026-06-12T09:00:00",
|
|
||||||
"endTime": "2026-06-12T10:30:00",
|
|
||||||
"maxMembers": 15,
|
|
||||||
"currentMembers": 6,
|
|
||||||
"status": "0",
|
|
||||||
"location": "A座3楼瑜伽教室",
|
|
||||||
"coverImage": "https://picsum.photos/seed/yogaflow/640/360",
|
|
||||||
"description": "适合有一定基础的学员,通过流畅的体式连接呼吸,唤醒身体能量。支持次数卡(1次)或储值卡(45元)支付。",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 45
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "15",
|
|
||||||
"createBy": "system",
|
|
||||||
"updateBy": "system",
|
|
||||||
"createdAt": "2026-06-02T17:57:27.483488",
|
|
||||||
"updatedAt": "2026-06-02T17:57:27.483488",
|
|
||||||
"deletedAt": null,
|
|
||||||
"courseName": "动感单车",
|
|
||||||
"coachId": "2",
|
|
||||||
"courseType": "2",
|
|
||||||
"startTime": "2026-06-05T18:00:00",
|
|
||||||
"endTime": "2026-06-05T19:00:00",
|
|
||||||
"maxMembers": 25,
|
|
||||||
"currentMembers": 0,
|
|
||||||
"status": "0",
|
|
||||||
"location": "健身房B区",
|
|
||||||
"coverImage": "https://example.com/spinning.jpg",
|
|
||||||
"description": "高强度有氧运动课程",
|
|
||||||
"pointCardAmount": 1,
|
|
||||||
"storedValueAmount": 50
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 模拟团课API(测试环境)
|
|
||||||
* 接口签名与真实API保持一致
|
|
||||||
*/
|
|
||||||
export const groupCourseMockApi = {
|
|
||||||
/**
|
|
||||||
* 获取团课列表(支持分页)
|
|
||||||
* @param {Object} params - 查询参数
|
|
||||||
* @param {number} params.pageNum - 页码(从1开始)
|
|
||||||
* @param {number} params.pageSize - 每页数量
|
|
||||||
* @returns {Promise} - 分页团课列表数据
|
|
||||||
*/
|
|
||||||
getList: (params = {}) => {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
const pageNum = params.pageNum || 1
|
|
||||||
const pageSize = params.pageSize || 10
|
|
||||||
|
|
||||||
const total = mockCourseList.length
|
|
||||||
const startIndex = (pageNum - 1) * pageSize
|
|
||||||
const endIndex = startIndex + pageSize
|
|
||||||
const list = mockCourseList.slice(startIndex, endIndex)
|
|
||||||
|
|
||||||
console.log('[groupCourse.mock.js] 模拟获取团课列表(分页):', {
|
|
||||||
pageNum,
|
|
||||||
pageSize,
|
|
||||||
total,
|
|
||||||
listCount: list.length
|
|
||||||
})
|
|
||||||
|
|
||||||
resolve({
|
|
||||||
code: 0,
|
|
||||||
message: 'success',
|
|
||||||
data: {
|
|
||||||
list,
|
|
||||||
total,
|
|
||||||
pageNum,
|
|
||||||
pageSize,
|
|
||||||
totalPages: Math.ceil(total / pageSize)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}, 500)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取团课详情
|
|
||||||
* @param {string} id - 课程ID
|
|
||||||
* @returns {Promise} - 团课详情数据
|
|
||||||
*/
|
|
||||||
getDetail: (id) => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
console.log('[groupCourse.mock.js] 模拟获取团课详情:', id)
|
|
||||||
const course = mockCourseList.find(item => item.id === id)
|
|
||||||
if (course) {
|
|
||||||
resolve(course)
|
|
||||||
} else {
|
|
||||||
reject({ code: -1, message: '课程不存在' })
|
|
||||||
}
|
|
||||||
}, 300)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 预约团课
|
|
||||||
* @param {Object} data - 预约数据
|
|
||||||
* @param {string} data.courseId - 课程ID
|
|
||||||
* @param {string} data.memberId - 会员ID
|
|
||||||
* @returns {Promise} - 预约结果
|
|
||||||
*/
|
|
||||||
book: (data) => {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
console.log('[groupCourse.mock.js] 模拟预约团课:', data)
|
|
||||||
resolve({
|
|
||||||
code: 0,
|
|
||||||
message: '预约成功',
|
|
||||||
data: { bookingId: `BK${Date.now()}` }
|
|
||||||
})
|
|
||||||
}, 400)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 取消预约
|
|
||||||
* @param {string} id - 预约记录ID
|
|
||||||
* @returns {Promise} - 取消结果
|
|
||||||
*/
|
|
||||||
cancelBooking: (id) => {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
console.log('[groupCourse.mock.js] 模拟取消预约:', id)
|
|
||||||
resolve({
|
|
||||||
code: 0,
|
|
||||||
message: '取消成功',
|
|
||||||
data: null
|
|
||||||
})
|
|
||||||
}, 300)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default groupCourseMockApi
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
import request from "@/utils/request.js"
|
|
||||||
|
|
||||||
export function login(params) {
|
|
||||||
return request.post('/member/auth/miniapp/login', params)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function logout() {
|
|
||||||
return request.post('/member/auth/logout')
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getQRCode(options = { cache: true, cacheTime: 5 * 60 * 1000 }) {
|
|
||||||
return request.get('/checkIn/qrcode', {}, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function checkIn(params) {
|
|
||||||
return request.post('/checkIn/scan', params)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getUserInfo(options = { cache: true, cacheTime: 30 * 60 * 1000 }) {
|
|
||||||
return request.get('/member/info', {}, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function updateUserInfo(params) {
|
|
||||||
return request.put('/member/info', params)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getRecommendCourses(options = { cache: true, cacheTime: 10 * 60 * 1000 }) {
|
|
||||||
return request.get('/course/recommend', {}, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getCourseDetail(id, options = { cache: true, cacheTime: 15 * 60 * 1000 }) {
|
|
||||||
return request.get(`/course/${id}`, {}, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getGroupCoursePage(params = {}, options = { cache: true, cacheTime: 5 * 60 * 1000 }) {
|
|
||||||
const { page = 0, size = 10, sort = 'id', order = 'asc', keyword } = params
|
|
||||||
return request.post('/groupCourse/page', { page, size, sort, order, keyword }, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
|
||||||
login,
|
|
||||||
logout,
|
|
||||||
getQRCode,
|
|
||||||
checkIn,
|
|
||||||
getUserInfo,
|
|
||||||
updateUserInfo,
|
|
||||||
getRecommendCourses,
|
|
||||||
getCourseDetail,
|
|
||||||
getGroupCoursePage
|
|
||||||
}
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
/** 与 pages.json 保持一致 */
|
/** 与 pages.json 保持一致 */
|
||||||
export const PAGE = {
|
export const PAGE = {
|
||||||
INDEX: '/pages/index/index',
|
INDEX: '/pages/index/index',
|
||||||
COURSE: '/pages/course/index',
|
COURSE: '/pages/groupCourse/list',
|
||||||
TRAIN: '/pages/train/index',
|
TRAIN: '/pages/train/index',
|
||||||
DISCOVER: '/pages/discover/index',
|
DISCOVER: '/pages/discover/index',
|
||||||
MEMBER: '/pages/memberInfo/memberInfo',
|
MEMBER: '/pages/memberInfo/memberInfo',
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ import { onLoad, onUnload } from '@dcloudio/uni-app'
|
|||||||
// 引入状态组件(路径与你保持一致)
|
// 引入状态组件(路径与你保持一致)
|
||||||
import QrStatus from '@/components/QRCode/StatusCard.vue'
|
import QrStatus from '@/components/QRCode/StatusCard.vue'
|
||||||
// 引入API封装
|
// 引入API封装
|
||||||
import { getQRCode, checkIn as apiCheckIn } from '@/api/main.js'
|
import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
|
||||||
|
|
||||||
let image = ref("")
|
let image = ref("")
|
||||||
let width = ref(0)
|
let width = ref(0)
|
||||||
|
|||||||
Reference in New Issue
Block a user