This commit is contained in:
2026-05-10 23:32:27 +08:00
parent e75ec01614
commit 5f579593a3
9 changed files with 3702 additions and 1285 deletions
+6 -1
View File
@@ -27,7 +27,12 @@
"Bash(curl -X POST http://localhost:3000/api/orders/1/pay -H \"Content-Type: application/json\" -H \"Authorization: Bearer test\" -d '{\"paymentMethod\":\"wechat\"}' -v)",
"Bash(curl -X POST http://localhost:3000/api/orders/1/pay -v)",
"Bash(xargs grep -l \"jwt\\\\|JWT\")",
"Bash(xargs grep -l \"invite\")"
"Bash(xargs grep -l \"invite\")",
"Bash(curl -s -X POST http://localhost:3000/api/auth/login/phone -H \"Content-Type: application/json\" -d '{\"phone\":\"13800138000\",\"code\":\"123456\"}')",
"Bash(python3 -c \"import sys, json; data=json.load\\(sys.stdin\\); token=data['data']['accessToken']; import jwt; decoded=jwt.decode\\(token, options={'verify_signature': False}\\); print\\(f\\\\\"iat: {decoded['iat']}, exp: {decoded['exp']}, duration: {decoded['exp']-decoded['iat']} seconds \\({\\(decoded['exp']-decoded['iat']\\)/3600} hours\\)\\\\\"\\)\")",
"Bash(curl -s -X GET http://localhost:3000/api/orders -H \"Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwicGhvbmUiOiIxMzgwMDEzODAwMCIsImlhdCI6MTc3ODM4MTc2NywiZXhwIjoxNzc4Mzg4OTY3fQ.-jcY69afC6O6CtKtOj6tRaoiknypwDfvpXYhpz95rVE\")",
"Bash(pnpm install *)",
"Bash(pnpm dev:mp-weixin)"
]
}
}
+2 -1
View File
@@ -42,7 +42,8 @@
"@dcloudio/vite-plugin-uni": "3.0.0-5000720260410001",
"@types/node": "^22.0.0",
"@vue/runtime-core": "^3.4.21",
"sass": "^1.77.0",
"sass": "^1.83.0",
"sass-embedded": "^1.83.0",
"typescript": "^5.5.0",
"vite": "^5.2.8"
}
File diff suppressed because it is too large Load Diff
@@ -455,7 +455,7 @@ async function handleCheckout() {
border: none;
&:active {
background: darken($success-color, 5%);
background: $success-dark;
}
}
@@ -470,7 +470,7 @@ async function handleCheckout() {
border: none;
&:active {
background: darken($info-color, 5%);
background: $info-dark;
}
}
@@ -485,7 +485,7 @@ async function handleCheckout() {
border: none;
&:active {
background: darken($success-color, 5%);
background: $success-dark;
}
}
@@ -580,7 +580,7 @@ async function handleCheckout() {
color: #fff;
&:active {
background: darken($error-color, 5%);
background: $error-dark;
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+714 -75
View File
@@ -1,6 +1,9 @@
<template>
<view class="page-shop-edit">
<!-- 基本信息 -->
<view class="form-section">
<view class="section-title">基本信息</view>
<!-- 店铺名称 -->
<view class="form-item">
<text class="label required">店铺名称</text>
@@ -48,45 +51,6 @@
/>
</view>
<!-- 营业执照图片 -->
<view class="form-item">
<text class="label required">营业执照</text>
<view class="upload-section">
<view v-if="form.businessLicense" class="image-preview">
<image class="preview-img" :src="form.businessLicense" mode="aspectFit" />
<view class="delete-btn" @tap="deleteLicense">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadLicense">
<text class="upload-icon">+</text>
<text class="upload-text">上传营业执照</text>
</view>
</view>
</view>
<!-- 营业执照编号 -->
<view class="form-item">
<text class="label">营业执照编号</text>
<input
class="input"
type="text"
v-model="form.licenseNo"
placeholder="请输入营业执照编号"
maxlength="50"
/>
</view>
<!-- 法人姓名 -->
<view class="form-item">
<text class="label">法人姓名</text>
<input
class="input"
type="text"
v-model="form.legalPerson"
placeholder="请输入法人姓名"
maxlength="50"
/>
</view>
<!-- 店铺描述 -->
<view class="form-item">
<text class="label">店铺描述</text>
@@ -97,6 +61,326 @@
maxlength="500"
/>
</view>
<!-- 门店营业执照 -->
<view class="form-item">
<text class="label required">门店营业执照</text>
<view class="upload-section">
<view v-if="form.storeLicense" class="image-preview">
<image class="preview-img" :src="form.storeLicense" mode="aspectFit" />
<view class="delete-btn" @tap="form.storeLicense = ''">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadStoreLicense">
<text class="upload-icon">+</text>
<text class="upload-text">上传门店营业执照</text>
</view>
</view>
</view>
</view>
<!-- 酒店照片 -->
<view class="form-section">
<view class="section-title">酒店照片</view>
<view class="section-desc">用于店铺首页轮播图展示最多上传9张</view>
<view class="form-item">
<view class="upload-grid">
<view
v-for="(img, index) in form.hotelImages"
:key="index"
class="image-preview"
>
<image class="preview-img" :src="img" mode="aspectFill" />
<view class="delete-btn" @tap="deleteHotelImage(index)">×</view>
</view>
<view
v-if="form.hotelImages.length < 9"
class="upload-btn"
@tap="uploadHotelImages"
>
<text class="upload-icon">+</text>
<text class="upload-text">上传照片</text>
</view>
</view>
</view>
</view>
<!-- 签约资料 -->
<view class="form-section">
<view class="section-title">签约资料</view>
<!-- 签约类型 -->
<view class="form-item">
<text class="label required">签约类型</text>
<view class="radio-group">
<view
class="radio-item"
:class="{ active: form.contractType === 'personal' }"
@tap="form.contractType = 'personal'"
>
<view class="radio-icon">
<view v-if="form.contractType === 'personal'" class="radio-dot"></view>
</view>
<text>个人签约</text>
</view>
<view
class="radio-item"
:class="{ active: form.contractType === 'company' }"
@tap="form.contractType = 'company'"
>
<view class="radio-icon">
<view v-if="form.contractType === 'company'" class="radio-dot"></view>
</view>
<text>公司/法人签约</text>
</view>
</view>
</view>
<!-- 个人签约 -->
<template v-if="form.contractType === 'personal'">
<view class="form-item">
<text class="label required">身份证正面</text>
<view class="upload-section">
<view v-if="form.idCardFront" class="image-preview">
<image class="preview-img" :src="form.idCardFront" mode="aspectFit" />
<view class="delete-btn" @tap="form.idCardFront = ''">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadIdCardFront">
<text class="upload-icon">+</text>
<text class="upload-text">上传身份证正面</text>
</view>
</view>
</view>
<view class="form-item">
<text class="label required">身份证反面</text>
<view class="upload-section">
<view v-if="form.idCardBack" class="image-preview">
<image class="preview-img" :src="form.idCardBack" mode="aspectFit" />
<view class="delete-btn" @tap="form.idCardBack = ''">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadIdCardBack">
<text class="upload-icon">+</text>
<text class="upload-text">上传身份证反面</text>
</view>
</view>
</view>
</template>
<!-- 公司/法人签约 -->
<template v-if="form.contractType === 'company'">
<view class="form-item">
<text class="label required">法人身份证正面</text>
<view class="upload-section">
<view v-if="form.legalIdCardFront" class="image-preview">
<image class="preview-img" :src="form.legalIdCardFront" mode="aspectFit" />
<view class="delete-btn" @tap="form.legalIdCardFront = ''">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadLegalIdCardFront">
<text class="upload-icon">+</text>
<text class="upload-text">上传法人身份证正面</text>
</view>
</view>
</view>
<view class="form-item">
<text class="label required">法人身份证反面</text>
<view class="upload-section">
<view v-if="form.legalIdCardBack" class="image-preview">
<image class="preview-img" :src="form.legalIdCardBack" mode="aspectFit" />
<view class="delete-btn" @tap="form.legalIdCardBack = ''">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadLegalIdCardBack">
<text class="upload-icon">+</text>
<text class="upload-text">上传法人身份证反面</text>
</view>
</view>
</view>
<view class="form-item">
<text class="label required">营业执照</text>
<view class="upload-section">
<view v-if="form.businessLicense" class="image-preview">
<image class="preview-img" :src="form.businessLicense" mode="aspectFit" />
<view class="delete-btn" @tap="form.businessLicense = ''">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadLicense">
<text class="upload-icon">+</text>
<text class="upload-text">上传营业执照</text>
</view>
</view>
</view>
<!-- 营业执照编号 -->
<view class="form-item">
<text class="label">营业执照编号</text>
<input
class="input"
type="text"
v-model="form.licenseNo"
placeholder="请输入营业执照编号"
maxlength="50"
/>
</view>
<!-- 法人姓名 -->
<view class="form-item">
<text class="label">法人姓名</text>
<input
class="input"
type="text"
v-model="form.legalPerson"
placeholder="请输入法人姓名"
maxlength="50"
/>
</view>
</template>
</view>
<!-- 财务信息 -->
<view class="form-section">
<view class="section-title">财务信息</view>
<!-- 账户类型 -->
<view class="form-item">
<text class="label required">账户类型</text>
<view class="radio-group">
<view
class="radio-item"
:class="{ active: form.accountType === 'company' }"
@tap="form.accountType = 'company'"
>
<view class="radio-icon">
<view v-if="form.accountType === 'company'" class="radio-dot"></view>
</view>
<text>对公账户</text>
</view>
<view
class="radio-item"
:class="{ active: form.accountType === 'personal' }"
@tap="form.accountType = 'personal'"
>
<view class="radio-icon">
<view v-if="form.accountType === 'personal'" class="radio-dot"></view>
</view>
<text>对私账户</text>
</view>
</view>
</view>
<!-- 对公账户 -->
<template v-if="form.accountType === 'company'">
<view class="form-item">
<text class="label required">收款银行</text>
<input
class="input"
type="text"
v-model="form.bankName"
placeholder="请输入收款银行名称"
maxlength="100"
/>
</view>
<view class="form-item">
<text class="label required">银行账号</text>
<input
class="input"
type="text"
v-model="form.bankAccount"
placeholder="请输入银行账号"
maxlength="50"
/>
</view>
<view class="form-item">
<text class="label required">开户营业执照</text>
<view class="upload-section">
<view v-if="form.bankLicense" class="image-preview">
<image class="preview-img" :src="form.bankLicense" mode="aspectFit" />
<view class="delete-btn" @tap="form.bankLicense = ''">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadBankLicense">
<text class="upload-icon">+</text>
<text class="upload-text">上传开户营业执照</text>
</view>
</view>
</view>
</template>
<!-- 对私账户 -->
<template v-if="form.accountType === 'personal'">
<view class="form-item">
<text class="label required">开户名</text>
<input
class="input"
type="text"
v-model="form.accountName"
placeholder="请输入开户名"
maxlength="50"
/>
</view>
<view class="form-item">
<text class="label required">开户账号</text>
<input
class="input"
type="text"
v-model="form.bankAccount"
placeholder="请输入开户账号"
maxlength="50"
/>
</view>
<view class="form-item">
<text class="label required">开户银行</text>
<input
class="input"
type="text"
v-model="form.bankName"
placeholder="请输入开户银行"
maxlength="100"
/>
</view>
<view class="form-item">
<text class="label required">支行信息</text>
<input
class="input"
type="text"
v-model="form.bankBranch"
placeholder="请输入支行名称"
maxlength="100"
/>
</view>
<view class="form-item">
<text class="label required">开户身份证正面</text>
<view class="upload-section">
<view v-if="form.accountIdCardFront" class="image-preview">
<image class="preview-img" :src="form.accountIdCardFront" mode="aspectFit" />
<view class="delete-btn" @tap="form.accountIdCardFront = ''">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadAccountIdCardFront">
<text class="upload-icon">+</text>
<text class="upload-text">上传身份证正面</text>
</view>
</view>
</view>
<view class="form-item">
<text class="label required">开户身份证反面</text>
<view class="upload-section">
<view v-if="form.accountIdCardBack" class="image-preview">
<image class="preview-img" :src="form.accountIdCardBack" mode="aspectFit" />
<view class="delete-btn" @tap="form.accountIdCardBack = ''">×</view>
</view>
<view v-else class="upload-btn" @tap="uploadAccountIdCardBack">
<text class="upload-icon">+</text>
<text class="upload-text">上传身份证反面</text>
</view>
</view>
</view>
</template>
</view>
<button class="submit-btn" :disabled="loading" @tap="handleSubmit">
@@ -104,9 +388,10 @@
</button>
<view class="tips">
<text class="tips-title">温馨提示</text>
<text class="tips-text">修改店铺信息后需要重新等待平台审核</text>
<text class="tips-text">审核结果将通过消息通知您</text>
<view class="tips-title">温馨提示</view>
<text class="tips-text">1. 修改店铺信息后需要重新等待平台审核</text>
<text class="tips-text">2. 所有证件照片需清晰可见确保信息真实有效</text>
<text class="tips-text">3. 审核通过后即可继续营业</text>
</view>
</view>
</template>
@@ -123,16 +408,38 @@ const sellerStore = useSellerStore();
const loading = ref(false);
const form = ref({
// 基本信息
shopName: '',
phone: '',
province: '',
city: '',
district: '',
address: '',
businessLicense: '',
description: '',
storeLicense: '', // 门店营业执照
// 酒店照片
hotelImages: [] as string[],
// 签约资料
contractType: 'personal' as 'personal' | 'company',
idCardFront: '', // 个人身份证正面
idCardBack: '', // 个人身份证反面
legalIdCardFront: '', // 法人身份证正面
legalIdCardBack: '', // 法人身份证反面
businessLicense: '', // 营业执照
licenseNo: '',
legalPerson: '',
description: '',
// 财务信息
accountType: 'company' as 'company' | 'personal',
accountName: '', // 开户名(对私)
bankAccount: '', // 银行账号
bankName: '', // 银行名称
bankBranch: '', // 支行信息(对私)
bankLicense: '', // 开户营业执照(对公)
accountIdCardFront: '', // 开户身份证正面(对私)
accountIdCardBack: '', // 开户身份证反面(对私)
});
onMounted(async () => {
@@ -140,18 +447,39 @@ onMounted(async () => {
const res = await getMyMerchant();
const merchant = res.data;
form.value = {
// 基本信息
shopName: merchant.shopName || '',
phone: merchant.phone || '',
province: merchant.province || '',
city: merchant.city || '',
district: merchant.district || '',
address: merchant.address || '',
description: merchant.description || '',
storeLicense: merchant.storeLicense || '',
// 酒店照片
hotelImages: merchant.hotelImages ? merchant.hotelImages.split(',').filter((img: string) => img) : [],
// 签约资料
contractType: merchant.contractType || 'personal',
idCardFront: merchant.idCardFront || '',
idCardBack: merchant.idCardBack || '',
legalIdCardFront: merchant.legalIdCardFront || '',
legalIdCardBack: merchant.legalIdCardBack || '',
businessLicense: merchant.businessLicense || '',
licenseNo: merchant.licenseNo || '',
legalPerson: merchant.legalPerson || '',
description: merchant.description || '',
// 财务信息
accountType: merchant.accountType || 'company',
accountName: merchant.accountName || '',
bankAccount: merchant.bankAccount || '',
bankName: merchant.bankName || '',
bankBranch: merchant.bankBranch || '',
bankLicense: merchant.bankLicense || '',
accountIdCardFront: merchant.accountIdCardFront || '',
accountIdCardBack: merchant.accountIdCardBack || '',
};
// 地区信息已通过 RegionSelector 的 props 传入,无需额外处理
} catch (error) {
uni.showToast({ title: '获取店铺信息失败', icon: 'none' });
}
@@ -163,10 +491,96 @@ function onRegionChange(value: { province: string; city: string; district: strin
form.value.district = value.district;
}
function deleteLicense() {
form.value.businessLicense = '';
// 上传酒店照片
async function uploadHotelImages() {
try {
uni.showLoading({ title: '上传中...' });
const remainCount = 9 - form.value.hotelImages.length;
const urls = await chooseAndUpload({ count: remainCount, useSellerToken: true });
form.value.hotelImages.push(...urls);
uni.showToast({ title: '上传成功', icon: 'success' });
} catch (err: any) {
uni.showToast({ title: err.message || '上传失败', icon: 'none' });
} finally {
uni.hideLoading();
}
}
function deleteHotelImage(index: number) {
form.value.hotelImages.splice(index, 1);
}
// 上传门店营业执照
async function uploadStoreLicense() {
try {
uni.showLoading({ title: '上传中...' });
const urls = await chooseAndUpload({ count: 1, useSellerToken: true });
form.value.storeLicense = urls[0];
uni.showToast({ title: '上传成功', icon: 'success' });
} catch (err: any) {
uni.showToast({ title: err.message || '上传失败', icon: 'none' });
} finally {
uni.hideLoading();
}
}
// 上传身份证正面(个人)
async function uploadIdCardFront() {
try {
uni.showLoading({ title: '上传中...' });
const urls = await chooseAndUpload({ count: 1, useSellerToken: true });
form.value.idCardFront = urls[0];
uni.showToast({ title: '上传成功', icon: 'success' });
} catch (err: any) {
uni.showToast({ title: err.message || '上传失败', icon: 'none' });
} finally {
uni.hideLoading();
}
}
// 上传身份证反面(个人)
async function uploadIdCardBack() {
try {
uni.showLoading({ title: '上传中...' });
const urls = await chooseAndUpload({ count: 1, useSellerToken: true });
form.value.idCardBack = urls[0];
uni.showToast({ title: '上传成功', icon: 'success' });
} catch (err: any) {
uni.showToast({ title: err.message || '上传失败', icon: 'none' });
} finally {
uni.hideLoading();
}
}
// 上传法人身份证正面
async function uploadLegalIdCardFront() {
try {
uni.showLoading({ title: '上传中...' });
const urls = await chooseAndUpload({ count: 1, useSellerToken: true });
form.value.legalIdCardFront = urls[0];
uni.showToast({ title: '上传成功', icon: 'success' });
} catch (err: any) {
uni.showToast({ title: err.message || '上传失败', icon: 'none' });
} finally {
uni.hideLoading();
}
}
// 上传法人身份证反面
async function uploadLegalIdCardBack() {
try {
uni.showLoading({ title: '上传中...' });
const urls = await chooseAndUpload({ count: 1, useSellerToken: true });
form.value.legalIdCardBack = urls[0];
uni.showToast({ title: '上传成功', icon: 'success' });
} catch (err: any) {
uni.showToast({ title: err.message || '上传失败', icon: 'none' });
} finally {
uni.hideLoading();
}
}
// 上传营业执照
async function uploadLicense() {
try {
uni.showLoading({ title: '上传中...' });
@@ -180,9 +594,52 @@ async function uploadLicense() {
}
}
function validateForm(): boolean {
const { shopName, phone, businessLicense } = form.value;
// 上传开户营业执照
async function uploadBankLicense() {
try {
uni.showLoading({ title: '上传中...' });
const urls = await chooseAndUpload({ count: 1, useSellerToken: true });
form.value.bankLicense = urls[0];
uni.showToast({ title: '上传成功', icon: 'success' });
} catch (err: any) {
uni.showToast({ title: err.message || '上传失败', icon: 'none' });
} finally {
uni.hideLoading();
}
}
// 上传开户身份证正面
async function uploadAccountIdCardFront() {
try {
uni.showLoading({ title: '上传中...' });
const urls = await chooseAndUpload({ count: 1, useSellerToken: true });
form.value.accountIdCardFront = urls[0];
uni.showToast({ title: '上传成功', icon: 'success' });
} catch (err: any) {
uni.showToast({ title: err.message || '上传失败', icon: 'none' });
} finally {
uni.hideLoading();
}
}
// 上传开户身份证反面
async function uploadAccountIdCardBack() {
try {
uni.showLoading({ title: '上传中...' });
const urls = await chooseAndUpload({ count: 1, useSellerToken: true });
form.value.accountIdCardBack = urls[0];
uni.showToast({ title: '上传成功', icon: 'success' });
} catch (err: any) {
uni.showToast({ title: err.message || '上传失败', icon: 'none' });
} finally {
uni.hideLoading();
}
}
function validateForm(): boolean {
const { shopName, phone, contractType, accountType } = form.value;
// 基本信息验证
if (!shopName || shopName.length < 2) {
uni.showToast({ title: '店铺名称至少2个字', icon: 'none' });
return false;
@@ -193,11 +650,77 @@ function validateForm(): boolean {
return false;
}
if (!businessLicense) {
uni.showToast({ title: '请上传营业执照', icon: 'none' });
if (!form.value.storeLicense) {
uni.showToast({ title: '请上传门店营业执照', icon: 'none' });
return false;
}
// 签约资料验证
if (contractType === 'personal') {
if (!form.value.idCardFront) {
uni.showToast({ title: '请上传身份证正面', icon: 'none' });
return false;
}
if (!form.value.idCardBack) {
uni.showToast({ title: '请上传身份证反面', icon: 'none' });
return false;
}
} else if (contractType === 'company') {
if (!form.value.legalIdCardFront) {
uni.showToast({ title: '请上传法人身份证正面', icon: 'none' });
return false;
}
if (!form.value.legalIdCardBack) {
uni.showToast({ title: '请上传法人身份证反面', icon: 'none' });
return false;
}
if (!form.value.businessLicense) {
uni.showToast({ title: '请上传营业执照', icon: 'none' });
return false;
}
}
// 财务信息验证
if (accountType === 'company') {
if (!form.value.bankName) {
uni.showToast({ title: '请填写收款银行', icon: 'none' });
return false;
}
if (!form.value.bankAccount) {
uni.showToast({ title: '请填写银行账号', icon: 'none' });
return false;
}
if (!form.value.bankLicense) {
uni.showToast({ title: '请上传开户营业执照', icon: 'none' });
return false;
}
} else if (accountType === 'personal') {
if (!form.value.accountName) {
uni.showToast({ title: '请填写开户名', icon: 'none' });
return false;
}
if (!form.value.bankAccount) {
uni.showToast({ title: '请填写开户账号', icon: 'none' });
return false;
}
if (!form.value.bankName) {
uni.showToast({ title: '请填写开户银行', icon: 'none' });
return false;
}
if (!form.value.bankBranch) {
uni.showToast({ title: '请填写支行信息', icon: 'none' });
return false;
}
if (!form.value.accountIdCardFront) {
uni.showToast({ title: '请上传开户身份证正面', icon: 'none' });
return false;
}
if (!form.value.accountIdCardBack) {
uni.showToast({ title: '请上传开户身份证反面', icon: 'none' });
return false;
}
}
return true;
}
@@ -208,16 +731,38 @@ async function handleSubmit() {
try {
const res = await updateMerchant({
// 基本信息
shopName: form.value.shopName,
phone: form.value.phone,
province: form.value.province,
city: form.value.city,
district: form.value.district,
address: form.value.address,
description: form.value.description,
storeLicense: form.value.storeLicense,
// 酒店照片
hotelImages: form.value.hotelImages.join(','),
// 签约资料
contractType: form.value.contractType,
idCardFront: form.value.idCardFront,
idCardBack: form.value.idCardBack,
legalIdCardFront: form.value.legalIdCardFront,
legalIdCardBack: form.value.legalIdCardBack,
businessLicense: form.value.businessLicense,
licenseNo: form.value.licenseNo,
legalPerson: form.value.legalPerson,
description: form.value.description,
// 财务信息
accountType: form.value.accountType,
accountName: form.value.accountName,
bankAccount: form.value.bankAccount,
bankName: form.value.bankName,
bankBranch: form.value.bankBranch,
bankLicense: form.value.bankLicense,
accountIdCardFront: form.value.accountIdCardFront,
accountIdCardBack: form.value.accountIdCardBack,
});
uni.showToast({ title: '修改成功', icon: 'success' });
@@ -246,17 +791,36 @@ async function handleSubmit() {
min-height: 100vh;
background: $bg-page;
padding: $spacing-xl;
padding-bottom: 200rpx;
}
.form-section {
background: $bg-card;
border-radius: $radius-lg;
padding: $spacing-xl;
padding: $spacing-2xl;
margin-bottom: $spacing-xl;
border: 1rpx solid $border-light;
}
.section-title {
font-size: $font-lg;
font-weight: $font-semibold;
color: $text-primary;
margin-bottom: $spacing-xs;
}
.section-desc {
font-size: $font-xs;
color: $text-secondary;
margin-bottom: $spacing-xl;
}
.form-item {
margin-bottom: $spacing-2xl;
&:last-child {
margin-bottom: 0;
}
}
.label {
@@ -279,7 +843,9 @@ async function handleSubmit() {
background: $bg-page;
border-radius: $radius-base;
padding: 0 $spacing-xl;
font-size: $font-md;
font-size: $font-base;
color: $text-primary;
box-sizing: border-box;
border: 2rpx solid $border-light;
transition: all 0.2s ease;
@@ -291,11 +857,13 @@ async function handleSubmit() {
.textarea {
width: 100%;
height: 160rpx;
min-height: 160rpx;
background: $bg-page;
border-radius: $radius-base;
padding: $spacing-xl;
font-size: $font-md;
font-size: $font-base;
color: $text-primary;
box-sizing: border-box;
border: 2rpx solid $border-light;
transition: all 0.2s ease;
@@ -305,25 +873,66 @@ async function handleSubmit() {
}
}
.picker-value {
/* 单选组 */
.radio-group {
display: flex;
gap: $spacing-xl;
}
.radio-item {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
gap: $spacing-sm;
height: 88rpx;
background: $bg-page;
border-radius: $radius-base;
padding: 0 $spacing-xl;
font-size: $font-md;
font-size: $font-base;
color: $text-secondary;
border: 2rpx solid $border-light;
transition: all 0.2s ease;
&.active {
background: $primary-bg;
color: $primary-color;
border-color: $primary-color;
}
}
.radio-icon {
width: 32rpx;
height: 32rpx;
border-radius: 50%;
border: 2rpx solid $border-base;
display: flex;
align-items: center;
border: 2rpx solid $border-light;
justify-content: center;
transition: all 0.2s ease;
.radio-item.active & {
border-color: $primary-color;
}
}
.placeholder {
color: $text-placeholder;
.radio-dot {
width: 16rpx;
height: 16rpx;
border-radius: 50%;
background: $primary-color;
}
/* 上传区域 */
.upload-section {
display: flex;
}
.upload-grid {
display: flex;
flex-wrap: wrap;
gap: $spacing-md;
}
.upload-btn {
width: 200rpx;
height: 200rpx;
@@ -334,17 +943,22 @@ async function handleSubmit() {
align-items: center;
justify-content: center;
border: 2rpx dashed $border-base;
transition: all 0.2s ease;
&:active {
background: $bg-hover;
}
}
.upload-icon {
font-size: 48rpx;
color: $text-tertiary;
margin-bottom: $spacing-xs;
}
.upload-text {
font-size: $font-xs;
color: $text-tertiary;
margin-top: $spacing-xs;
}
.image-preview {
@@ -353,6 +967,7 @@ async function handleSubmit() {
background: $bg-page;
border-radius: $radius-base;
position: relative;
overflow: hidden;
border: 1rpx solid $border-light;
}
@@ -364,22 +979,24 @@ async function handleSubmit() {
.delete-btn {
position: absolute;
top: -16rpx;
right: -16rpx;
width: 40rpx;
height: 40rpx;
top: -12rpx;
right: -12rpx;
width: 48rpx;
height: 48rpx;
background: $error-color;
border-radius: 50%;
color: #fff;
font-size: $font-base;
font-size: 32rpx;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
}
/* 提交按钮 */
.submit-btn {
width: 100%;
height: 88rpx;
height: 96rpx;
background: $primary-color;
color: #fff;
font-size: $font-lg;
@@ -389,6 +1006,10 @@ async function handleSubmit() {
margin-top: $spacing-3xl;
transition: all 0.2s ease;
&::after {
border: none;
}
&:active:not([disabled]) {
background: $primary-dark;
}
@@ -399,11 +1020,12 @@ async function handleSubmit() {
}
}
/* 提示信息 */
.tips {
margin-top: $spacing-2xl;
padding: $spacing-xl;
padding: $spacing-2xl;
background: $bg-card;
border-radius: $radius-base;
border-radius: $radius-lg;
border: 2rpx solid $warning-color;
}
@@ -412,13 +1034,30 @@ async function handleSubmit() {
font-weight: $font-semibold;
color: $warning-color;
margin-bottom: $spacing-md;
display: block;
display: flex;
align-items: center;
gap: $spacing-xs;
&::before {
content: '!';
width: 32rpx;
height: 32rpx;
background: $warning-color;
color: #fff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: $font-lg;
font-weight: $font-bold;
}
}
.tips-text {
font-size: $font-xs;
font-size: $font-sm;
color: $text-secondary;
display: block;
margin-top: $spacing-xs;
margin-top: $spacing-sm;
line-height: 1.6;
}
</style>
+268 -30
View File
@@ -47,13 +47,13 @@ importers:
version: 18.3.7(@types/react@18.3.28)
'@vitejs/plugin-react':
specifier: ^4.3.0
version: 4.7.0(vite@5.4.21(@types/node@24.12.2)(sass@1.99.0)(terser@5.46.2))
version: 4.7.0(vite@5.4.21(@types/node@24.12.2)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))
typescript:
specifier: ^5.5.0
version: 5.9.3
vite:
specifier: ^5.4.0
version: 5.4.21(@types/node@24.12.2)(sass@1.99.0)(terser@5.46.2)
version: 5.4.21(@types/node@24.12.2)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2)
apps/miniapp:
dependencies:
@@ -62,10 +62,10 @@ importers:
version: 3.0.0-5000720260410001(@dcloudio/types@3.4.31)(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vue@3.5.33(typescript@5.9.3))
'@dcloudio/uni-app-harmony':
specifier: 3.0.0-5000720260410001
version: 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
version: 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@dcloudio/uni-app-plus':
specifier: 3.0.0-5000720260410001
version: 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
version: 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@dcloudio/uni-components':
specifier: 3.0.0-5000720260410001
version: 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vue@3.5.33(typescript@5.9.3))
@@ -132,7 +132,7 @@ importers:
version: 3.0.0-5000720260410001
'@dcloudio/vite-plugin-uni':
specifier: 3.0.0-5000720260410001
version: 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
version: 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@types/node':
specifier: ^22.0.0
version: 22.19.17
@@ -140,14 +140,17 @@ importers:
specifier: ^3.4.21
version: 3.5.33
sass:
specifier: ^1.77.0
specifier: ^1.83.0
version: 1.99.0
sass-embedded:
specifier: ^1.83.0
version: 1.99.0
typescript:
specifier: ^5.5.0
version: 5.9.3
vite:
specifier: ^5.2.8
version: 5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2)
version: 5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2)
apps/platform-admin:
dependencies:
@@ -184,13 +187,13 @@ importers:
version: 18.3.7(@types/react@18.3.28)
'@vitejs/plugin-react':
specifier: ^4.3.0
version: 4.7.0(vite@5.4.21(@types/node@24.12.2)(sass@1.99.0)(terser@5.46.2))
version: 4.7.0(vite@5.4.21(@types/node@24.12.2)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))
typescript:
specifier: ^5.5.0
version: 5.9.3
vite:
specifier: ^5.4.0
version: 5.4.21(@types/node@24.12.2)(sass@1.99.0)(terser@5.46.2)
version: 5.4.21(@types/node@24.12.2)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2)
apps/server:
dependencies:
@@ -1046,6 +1049,9 @@ packages:
'@borewit/text-codec@0.2.2':
resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==}
'@bufbuild/protobuf@2.12.0':
resolution: {integrity: sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA==}
'@colors/colors@1.5.0':
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'}
@@ -3499,6 +3505,9 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
colorjs.io@0.5.2:
resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==}
combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
@@ -5909,6 +5918,123 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
sass-embedded-all-unknown@1.99.0:
resolution: {integrity: sha512-qPIRG8Uhjo6/OKyAKixTnwMliTz+t9K6Duk0mx5z+K7n0Ts38NSJz2sjDnc7cA/8V9Lb3q09H38dZ1CLwD+ssw==}
cpu: ['!arm', '!arm64', '!riscv64', '!x64']
sass-embedded-android-arm64@1.99.0:
resolution: {integrity: sha512-fNHhdnP23yqqieCbAdym4N47AleSwjbNt6OYIYx4DdACGdtERjQB4iOX/TaKsW034MupfF7SjnAAK8w7Ptldtg==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [android]
sass-embedded-android-arm@1.99.0:
resolution: {integrity: sha512-EHvJ0C7/VuP78Qr6f8gIUVUmCqIorEQpw2yp3cs3SMg02ZuumlhjXvkTcFBxHmFdFR23vTNk1WnhY6QSeV1nFQ==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [android]
sass-embedded-android-riscv64@1.99.0:
resolution: {integrity: sha512-4zqDFRvgGDTL5vTHuIhRxUpXFoh0Cy7Gm5Ywk19ASd8Settmd14YdPRZPmMxfgS1GH292PofV1fq1ifiSEJWBw==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [android]
sass-embedded-android-x64@1.99.0:
resolution: {integrity: sha512-Uk53k/dGYt04RjOL4gFjZ0Z9DH9DKh8IA8WsXUkNqsxerAygoy3zqRBS2zngfE9K2jiOM87q+1R1p87ory9oQQ==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [android]
sass-embedded-darwin-arm64@1.99.0:
resolution: {integrity: sha512-u61/7U3IGLqoO6gL+AHeiAtlTPFwJK1+964U8gp45ZN0hzh1yrARf5O1mivXv8NnNgJvbG2wWJbiNZP0lG/lTg==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [darwin]
sass-embedded-darwin-x64@1.99.0:
resolution: {integrity: sha512-j/kkk/NcXdIameLezSfXjgCiBkVcA+G60AXrX768/3g0miK1g7M9dj7xOhCb1i7/wQeiEI3rw2LLuO63xRIn4A==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [darwin]
sass-embedded-linux-arm64@1.99.0:
resolution: {integrity: sha512-btNcFpItcB56L40n8hDeL7sRSMLDXQ56nB5h2deddJx1n60rpKSElJmkaDGHtpkrY+CTtDRV0FZDjHeTJddYew==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
libc: glibc
sass-embedded-linux-arm@1.99.0:
resolution: {integrity: sha512-d4IjJZrX2+AwB2YCy1JySwdptJECNP/WfAQLUl8txI3ka8/d3TUI155GtelnoZUkio211PwIeFvvAeZ9RXPQnw==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
libc: glibc
sass-embedded-linux-musl-arm64@1.99.0:
resolution: {integrity: sha512-Hi2bt/IrM5P4FBKz6EcHAlniwfpoz9mnTdvSd58y+avA3SANM76upIkAdSayA8ZGwyL3gZokru1AKDPF9lJDNw==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
libc: musl
sass-embedded-linux-musl-arm@1.99.0:
resolution: {integrity: sha512-2gvHOupgIw3ytatXT4nFUow71LFbuOZPEwG+HUzcNQDH8ue4Ez8cr03vsv5MDv3lIjOKcXwDvWD980t18MwkoQ==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
libc: musl
sass-embedded-linux-musl-riscv64@1.99.0:
resolution: {integrity: sha512-mKqGvVaJ9rHMqyZsF0kikQe4NO0f4osb67+X6nLhBiVDKvyazQHJ3zJQreNefIE36yL2sjHIclSB//MprzaQDg==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
libc: musl
sass-embedded-linux-musl-x64@1.99.0:
resolution: {integrity: sha512-huhgOMmOc30r7CH7qbRbT9LerSEGSnWuS4CYNOskr9BvNeQp4dIneFufNRGZ7hkOAxUM8DglxIZJN/cyAT95Ew==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
libc: musl
sass-embedded-linux-riscv64@1.99.0:
resolution: {integrity: sha512-mevFPIFAVhrH90THifxLfOntFmHtcEKOcdWnep2gJ0X4DVva4AiVIRlQe/7w9JFx5+gnDRE1oaJJkzuFUuYZsA==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
libc: glibc
sass-embedded-linux-x64@1.99.0:
resolution: {integrity: sha512-9k7IkULqIZdCIVt4Mboryt6vN8Mjmm3EhI1P3mClU5y5i3wLK5ExC3cbVWk047KsID/fvB1RLslqghXJx5BoxA==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
libc: glibc
sass-embedded-unknown-all@1.99.0:
resolution: {integrity: sha512-P7MxiUtL/XzGo3PX0CaB8lNNEFLQWKikPA8pbKytx9ZCLZSDkt2NJcdAbblB/sqMs4AV3EK2NadV8rI/diq3xg==}
os: ['!android', '!darwin', '!linux', '!win32']
sass-embedded-win32-arm64@1.99.0:
resolution: {integrity: sha512-8whpsW7S+uO8QApKfQuc36m3P9EISzbVZOgC79goob4qGy09u8Gz/rYvw8h1prJDSjltpHGhOzBE6LDz7WvzVw==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [win32]
sass-embedded-win32-x64@1.99.0:
resolution: {integrity: sha512-ipuOv1R2K4MHeuCEAZGpuUbAgma4gb0sdacyrTjJtMOy/OY9UvWfVlwErdB09KIkp4fPDpQJDJfvYN6bC8jeNg==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [win32]
sass-embedded@1.99.0:
resolution: {integrity: sha512-gF/juR1aX02lZHkvwxdF80SapkQeg2fetoDF6gIQkNbSw5YEUFspMkyGTjPjgZSgIHuZpy+Wz4PlebKnLXMjdg==}
engines: {node: '>=16.0.0'}
hasBin: true
sass@1.99.0:
resolution: {integrity: sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==}
engines: {node: '>=14.0.0'}
@@ -6163,6 +6289,14 @@ packages:
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
sync-child-process@1.0.2:
resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==}
engines: {node: '>=16.0.0'}
sync-message-port@1.2.0:
resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==}
engines: {node: '>=16.0.0'}
synckit@0.11.12:
resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==}
engines: {node: ^14.18.0 || >=16.0.0}
@@ -6554,6 +6688,9 @@ packages:
resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==}
engines: {node: '>= 0.10'}
varint@6.0.0:
resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
@@ -7754,6 +7891,8 @@ snapshots:
'@borewit/text-codec@0.2.2': {}
'@bufbuild/protobuf@2.12.0': {}
'@colors/colors@1.5.0':
optional: true
@@ -7763,10 +7902,10 @@ snapshots:
'@dcloudio/types@3.4.31': {}
'@dcloudio/uni-app-harmony@3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
'@dcloudio/uni-app-harmony@3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
dependencies:
'@dcloudio/uni-app-uts': 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vue@3.5.33(typescript@5.9.3))
'@dcloudio/uni-app-vite': 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@dcloudio/uni-app-vite': 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
debug: 4.3.7
fs-extra: 10.1.0
licia: 1.41.1
@@ -7781,10 +7920,10 @@ snapshots:
- vite
- vue
'@dcloudio/uni-app-plus@3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
'@dcloudio/uni-app-plus@3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
dependencies:
'@dcloudio/uni-app-uts': 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vue@3.5.33(typescript@5.9.3))
'@dcloudio/uni-app-vite': 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@dcloudio/uni-app-vite': 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@dcloudio/uni-app-vue': 3.0.0-5000720260410001
debug: 4.3.7
fs-extra: 10.1.0
@@ -7835,14 +7974,14 @@ snapshots:
- ts-node
- vue
'@dcloudio/uni-app-vite@3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
'@dcloudio/uni-app-vite@3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
dependencies:
'@dcloudio/uni-cli-shared': 3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vue@3.5.33(typescript@5.9.3))
'@dcloudio/uni-i18n': 3.0.0-5000720260410001
'@dcloudio/uni-nvue-styler': 3.0.0-5000720260410001
'@dcloudio/uni-shared': 3.0.0-5000720260410001
'@rollup/pluginutils': 5.1.0(rollup@4.60.2)
'@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@vue/compiler-dom': 3.4.21
'@vue/compiler-sfc': 3.4.21
debug: 4.3.7
@@ -8367,7 +8506,7 @@ snapshots:
- ts-node
- vue
'@dcloudio/vite-plugin-uni@3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
'@dcloudio/vite-plugin-uni@3.0.0-5000720260410001(postcss@8.5.10)(rollup@4.60.2)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
dependencies:
'@babel/core': 7.25.2
'@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2)
@@ -8376,9 +8515,9 @@ snapshots:
'@dcloudio/uni-nvue-styler': 3.0.0-5000720260410001
'@dcloudio/uni-shared': 3.0.0-5000720260410001
'@rollup/pluginutils': 5.1.0(rollup@4.60.2)
'@vitejs/plugin-legacy': 5.3.2(terser@5.46.2)(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))
'@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@vitejs/plugin-vue-jsx': 3.1.0(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@vitejs/plugin-legacy': 5.3.2(terser@5.46.2)(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))
'@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@vitejs/plugin-vue-jsx': 3.1.0(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))
'@vue/compiler-core': 3.4.21
'@vue/compiler-dom': 3.4.21
'@vue/compiler-sfc': 3.4.21
@@ -8395,7 +8534,7 @@ snapshots:
picocolors: 1.1.0
terser: 5.46.2
unplugin-auto-import: 19.1.0
vite: 5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2)
vite: 5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2)
transitivePeerDependencies:
- '@nuxt/kit'
- '@vueuse/core'
@@ -10243,7 +10382,7 @@ snapshots:
'@unrs/resolver-binding-win32-x64-msvc@1.11.1':
optional: true
'@vitejs/plugin-legacy@5.3.2(terser@5.46.2)(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))':
'@vitejs/plugin-legacy@5.3.2(terser@5.46.2)(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))':
dependencies:
'@babel/core': 7.25.2
'@babel/preset-env': 7.29.2(@babel/core@7.25.2)
@@ -10254,11 +10393,11 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.46.2
vite: 5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2)
vite: 5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@24.12.2)(sass@1.99.0)(terser@5.46.2))':
'@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@24.12.2)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
@@ -10266,23 +10405,23 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.27
'@types/babel__core': 7.20.5
react-refresh: 0.17.0
vite: 5.4.21(@types/node@24.12.2)(sass@1.99.0)(terser@5.46.2)
vite: 5.4.21(@types/node@24.12.2)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue-jsx@3.1.0(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
'@vitejs/plugin-vue-jsx@3.1.0(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
dependencies:
'@babel/core': 7.25.2
'@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.25.2)
'@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.25.2)
vite: 5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2)
vite: 5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2)
vue: 3.5.33(typescript@5.9.3)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
'@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2))(vue@3.5.33(typescript@5.9.3))':
dependencies:
vite: 5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2)
vite: 5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2)
vue: 3.5.33(typescript@5.9.3)
'@vue/babel-helper-vue-transform-on@1.5.0': {}
@@ -11060,6 +11199,8 @@ snapshots:
color-name@1.1.4: {}
colorjs.io@0.5.2: {}
combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
@@ -14005,6 +14146,93 @@ snapshots:
safer-buffer@2.1.2: {}
sass-embedded-all-unknown@1.99.0:
dependencies:
sass: 1.99.0
optional: true
sass-embedded-android-arm64@1.99.0:
optional: true
sass-embedded-android-arm@1.99.0:
optional: true
sass-embedded-android-riscv64@1.99.0:
optional: true
sass-embedded-android-x64@1.99.0:
optional: true
sass-embedded-darwin-arm64@1.99.0:
optional: true
sass-embedded-darwin-x64@1.99.0:
optional: true
sass-embedded-linux-arm64@1.99.0:
optional: true
sass-embedded-linux-arm@1.99.0:
optional: true
sass-embedded-linux-musl-arm64@1.99.0:
optional: true
sass-embedded-linux-musl-arm@1.99.0:
optional: true
sass-embedded-linux-musl-riscv64@1.99.0:
optional: true
sass-embedded-linux-musl-x64@1.99.0:
optional: true
sass-embedded-linux-riscv64@1.99.0:
optional: true
sass-embedded-linux-x64@1.99.0:
optional: true
sass-embedded-unknown-all@1.99.0:
dependencies:
sass: 1.99.0
optional: true
sass-embedded-win32-arm64@1.99.0:
optional: true
sass-embedded-win32-x64@1.99.0:
optional: true
sass-embedded@1.99.0:
dependencies:
'@bufbuild/protobuf': 2.12.0
colorjs.io: 0.5.2
immutable: 5.1.5
rxjs: 7.8.2
supports-color: 8.1.1
sync-child-process: 1.0.2
varint: 6.0.0
optionalDependencies:
sass-embedded-all-unknown: 1.99.0
sass-embedded-android-arm: 1.99.0
sass-embedded-android-arm64: 1.99.0
sass-embedded-android-riscv64: 1.99.0
sass-embedded-android-x64: 1.99.0
sass-embedded-darwin-arm64: 1.99.0
sass-embedded-darwin-x64: 1.99.0
sass-embedded-linux-arm: 1.99.0
sass-embedded-linux-arm64: 1.99.0
sass-embedded-linux-musl-arm: 1.99.0
sass-embedded-linux-musl-arm64: 1.99.0
sass-embedded-linux-musl-riscv64: 1.99.0
sass-embedded-linux-musl-x64: 1.99.0
sass-embedded-linux-riscv64: 1.99.0
sass-embedded-linux-x64: 1.99.0
sass-embedded-unknown-all: 1.99.0
sass-embedded-win32-arm64: 1.99.0
sass-embedded-win32-x64: 1.99.0
sass@1.99.0:
dependencies:
chokidar: 4.0.3
@@ -14311,6 +14539,12 @@ snapshots:
symbol-tree@3.2.4: {}
sync-child-process@1.0.2:
dependencies:
sync-message-port: 1.2.0
sync-message-port@1.2.0: {}
synckit@0.11.12:
dependencies:
'@pkgr/core': 0.2.9
@@ -14695,9 +14929,11 @@ snapshots:
validator@13.15.35: {}
varint@6.0.0: {}
vary@1.1.2: {}
vite@5.4.21(@types/node@22.19.17)(sass@1.99.0)(terser@5.46.2):
vite@5.4.21(@types/node@22.19.17)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2):
dependencies:
esbuild: 0.21.5
postcss: 8.5.10
@@ -14706,9 +14942,10 @@ snapshots:
'@types/node': 22.19.17
fsevents: 2.3.3
sass: 1.99.0
sass-embedded: 1.99.0
terser: 5.46.2
vite@5.4.21(@types/node@24.12.2)(sass@1.99.0)(terser@5.46.2):
vite@5.4.21(@types/node@24.12.2)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.46.2):
dependencies:
esbuild: 0.21.5
postcss: 8.5.10
@@ -14717,6 +14954,7 @@ snapshots:
'@types/node': 24.12.2
fsevents: 2.3.3
sass: 1.99.0
sass-embedded: 1.99.0
terser: 5.46.2
vue-demi@0.14.10(vue@3.5.33(typescript@5.9.3)):