|
|
@@ -9,7 +9,7 @@
|
|
|
:labelWidth="100"
|
|
|
>
|
|
|
<!-- 商品分类 -->
|
|
|
- <view class="card-title">商品分类</view>
|
|
|
+ <view class="card-title" v-if="!isProductCenter">商品分类</view>
|
|
|
<up-form-item
|
|
|
class="form-item"
|
|
|
label="商品分类"
|
|
|
@@ -17,6 +17,7 @@
|
|
|
:borderBottom="false"
|
|
|
@click="showCategory = true"
|
|
|
:required="true"
|
|
|
+ v-if="!isProductCenter"
|
|
|
>
|
|
|
<up-input
|
|
|
v-model="formData.categoryDisplayName"
|
|
|
@@ -51,6 +52,7 @@
|
|
|
prop="keyword"
|
|
|
:borderBottom="false"
|
|
|
:required="true"
|
|
|
+ v-if="!isProductCenter"
|
|
|
>
|
|
|
<up-input
|
|
|
v-model="formData.keyword"
|
|
|
@@ -64,6 +66,7 @@
|
|
|
prop="storeInfo"
|
|
|
:borderBottom="false"
|
|
|
:required="true"
|
|
|
+ v-if="!isProductCenter"
|
|
|
>
|
|
|
<up-textarea
|
|
|
v-model="formData.storeInfo"
|
|
|
@@ -77,6 +80,7 @@
|
|
|
prop="unitName"
|
|
|
:borderBottom="false"
|
|
|
:required="true"
|
|
|
+ v-if="!isProductCenter"
|
|
|
>
|
|
|
<up-input
|
|
|
v-model="formData.unitName"
|
|
|
@@ -87,7 +91,7 @@
|
|
|
</up-form-item>
|
|
|
|
|
|
<!-- 图片上传 -->
|
|
|
- <view class="upload-section">
|
|
|
+ <view class="upload-section" v-if="!isProductCenter">
|
|
|
<view class="upload-item">
|
|
|
<view class="upload-label"><text class="required">*</text>商品封面图</view>
|
|
|
<up-upload
|
|
|
@@ -111,7 +115,7 @@
|
|
|
</view>
|
|
|
</view>
|
|
|
|
|
|
- <view class="upload-section">
|
|
|
+ <view class="upload-section" v-if="!isProductCenter">
|
|
|
<view class="upload-item">
|
|
|
<view class="upload-label"><text class="required">*</text>商品图片</view>
|
|
|
<up-upload
|
|
|
@@ -143,6 +147,7 @@
|
|
|
prop="metalType"
|
|
|
:borderBottom="false"
|
|
|
:required="true"
|
|
|
+ v-if="!isProductCenter"
|
|
|
>
|
|
|
<up-radio-group
|
|
|
v-model="formData.metalType"
|
|
|
@@ -154,6 +159,7 @@
|
|
|
:key="index"
|
|
|
:label="item.name"
|
|
|
:name="item.code"
|
|
|
+ activeColor="#F8C008"
|
|
|
>
|
|
|
</up-radio>
|
|
|
</up-radio-group>
|
|
|
@@ -178,10 +184,10 @@
|
|
|
</up-form-item>
|
|
|
|
|
|
<!-- 商品描述 -->
|
|
|
- <view class="card-title">商品描述</view>
|
|
|
- <view class="editor-section">
|
|
|
+ <view class="card-title" v-if="!isProductCenter">商品描述</view>
|
|
|
+ <view class="editor-section" v-if="!isProductCenter">
|
|
|
<view class="editor-header">
|
|
|
- <text class="editor-label"><text class="required">*</text>商品描述</text>
|
|
|
+ <text class="editor-label">商品描述</text>
|
|
|
<text class="word-count">{{ descriptionText.length }}/500</text>
|
|
|
</view>
|
|
|
<sp-editor
|
|
|
@@ -358,9 +364,9 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
-import { ref, computed, watch } from 'vue';
|
|
|
+import { ref, computed, watch,nextTick } from 'vue';
|
|
|
import { onShow,onLoad } from "@dcloudio/uni-app";
|
|
|
-import { productCategory,productSave,templatesList,productInfo } from "@/api/merchant";
|
|
|
+import { productCategory,productSave,productUpdate,templatesList,productInfo } from "@/api/merchant";
|
|
|
import CategorySelector from '@/components/CategorySelector';
|
|
|
import { useAppStore } from "@/stores/app";
|
|
|
import { useImageUpload } from "@/hooks/useImageUpload";
|
|
|
@@ -373,6 +379,9 @@ const { imageList, afterRead, deletePic, uploadLoading } = useImageUpload({
|
|
|
const appStore = useAppStore();
|
|
|
const merchantInfo = appStore.userInfo.merchant
|
|
|
|
|
|
+// 表单验证和提交
|
|
|
+const formRef = ref(null);
|
|
|
+
|
|
|
// 表单数据
|
|
|
const formData = ref({
|
|
|
categoryIds: [], // 选中的分类ID数组
|
|
|
@@ -415,6 +424,9 @@ const previewImages = ref([]);
|
|
|
const productImages = ref([]);
|
|
|
const productImagesGg = ref([]);
|
|
|
|
|
|
+const productId = ref(null);
|
|
|
+const isProductCenter = ref(null);
|
|
|
+
|
|
|
// 材质列表
|
|
|
const materialList = ref([
|
|
|
{ name: '黄金',code:'au' },
|
|
|
@@ -428,7 +440,7 @@ const rules = ref({
|
|
|
type: 'array',
|
|
|
required: true,
|
|
|
message: '请选择商品分类',
|
|
|
- trigger: ['change']
|
|
|
+ trigger: ['blur','change']
|
|
|
},
|
|
|
storeName: {
|
|
|
type: 'string',
|
|
|
@@ -464,7 +476,7 @@ const rules = ref({
|
|
|
type: 'string',
|
|
|
required: true,
|
|
|
message: '请选择材质',
|
|
|
- trigger: ['change']
|
|
|
+ trigger: ['blur','change']
|
|
|
},
|
|
|
weight: {
|
|
|
type: 'string',
|
|
|
@@ -491,21 +503,34 @@ const rules = ref({
|
|
|
type: 'string',
|
|
|
pattern: /^\d*$/,
|
|
|
message: '排序号必须是整数',
|
|
|
- trigger: ['blur', 'change']
|
|
|
+ trigger: ['blur', 'change'],
|
|
|
+ validator: (rule, value) => {
|
|
|
+ if (!value || value.trim().length === 0) return true; // 可选字段,为空时通过
|
|
|
+ return /^\d+$/.test(value);
|
|
|
+ }
|
|
|
},
|
|
|
stock: {
|
|
|
type: 'string',
|
|
|
required: true,
|
|
|
pattern: /^\d*$/,
|
|
|
message: '库存必须是整数',
|
|
|
- trigger: ['blur', 'change']
|
|
|
+ trigger: ['blur', 'change'],
|
|
|
+ validator: (rule, value) => {
|
|
|
+ if (!value || value.trim().length === 0) return false;
|
|
|
+ return /^\d+$/.test(value);
|
|
|
+ }
|
|
|
},
|
|
|
barCode: {
|
|
|
type: 'string',
|
|
|
required: true,
|
|
|
pattern: /^\d*$/,
|
|
|
message: '商品编号必须是整数',
|
|
|
- trigger: ['blur', 'change']
|
|
|
+ trigger: ['blur', 'change'],
|
|
|
+ validator: (rule, value) => {
|
|
|
+ if (!value || value.trim().length === 0) return false;
|
|
|
+ return /^\d+$/.test(value);
|
|
|
+ }
|
|
|
+
|
|
|
},
|
|
|
});
|
|
|
|
|
|
@@ -516,9 +541,13 @@ onShow(() => {
|
|
|
onLoad(async (options)=>{
|
|
|
await getProductCategory();
|
|
|
await getTempData();
|
|
|
- console.log(options);
|
|
|
+ console.log(options)
|
|
|
if(options.id){
|
|
|
+ productId.value = options.id;
|
|
|
+ isProductCenter.value = options.isProductCenter || null;
|
|
|
await getProductDetail(options.id);
|
|
|
+ }else {
|
|
|
+ resetForm();
|
|
|
}
|
|
|
})
|
|
|
|
|
|
@@ -562,42 +591,112 @@ async function getTempData(){
|
|
|
uni.showToast({ title: '获取分类失败', icon: 'none' });
|
|
|
}
|
|
|
}
|
|
|
+const initFormValidation = async () => {
|
|
|
+ await nextTick();
|
|
|
+
|
|
|
+ if (!formRef.value) {
|
|
|
+ console.error('表单引用不存在');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 方法1:清除所有验证状态,然后重新验证
|
|
|
+ formRef.value.clearValidate();
|
|
|
+
|
|
|
+ // 方法2:延迟触发字段验证
|
|
|
+ setTimeout(async () => {
|
|
|
+ // 逐个触发必填字段的验证
|
|
|
+ const requiredFields = ['categoryIds', 'storeName', 'keyword', 'storeInfo', 'unitName',
|
|
|
+ 'tempIds', 'metalType', 'weight', 'laborCost', 'additionalFee',
|
|
|
+ 'stock', 'barCode'];
|
|
|
+
|
|
|
+ for (const field of requiredFields) {
|
|
|
+ try {
|
|
|
+ await formRef.value.validateField(field);
|
|
|
+ } catch (error) {
|
|
|
+ console.log(`⚠️ 字段 ${field} 验证状态:`, error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, 300);
|
|
|
+
|
|
|
+ } catch (error) {
|
|
|
+ console.error('初始化表单验证状态失败:', error);
|
|
|
+ }
|
|
|
+};
|
|
|
// 获取商品详情
|
|
|
async function getProductDetail(id){
|
|
|
try {
|
|
|
const { data } = await productInfo(id)
|
|
|
console.log('获取商品详情:',data);
|
|
|
- formData.value = data;
|
|
|
+
|
|
|
+ // 使用Object.assign确保响应式更新
|
|
|
+ Object.assign(formData.value, {
|
|
|
+ ...data,
|
|
|
+ // 确保categoryIds是数组格式
|
|
|
+ categoryIds: data.cateId ? (Array.isArray(data.cateId) ? data.cateId : data.cateId.split(',')) : [],
|
|
|
+ // 确保tempIds是数组格式
|
|
|
+ tempIds: data.tempId ? [data.tempId] : []
|
|
|
+ });
|
|
|
+
|
|
|
productImages.value = [];
|
|
|
- formData.value.categoryIds =data.cateId.split(',') ;
|
|
|
+
|
|
|
+ console.log('分类IDs:', formData.value.categoryIds);
|
|
|
+ console.log('运费模板IDs:', formData.value.tempIds);
|
|
|
+
|
|
|
+ // 等待DOM更新
|
|
|
+ await nextTick();
|
|
|
+
|
|
|
+ // 更新显示名称
|
|
|
formData.value.categoryDisplayName = getCategoryDisplayName(formData.value.categoryIds);
|
|
|
- console.log(formData.value.categoryDisplayName)
|
|
|
- formData.value.tempName =formatterTemp(data.tempId);
|
|
|
- previewImages.value[0] = {};
|
|
|
- previewImages.value[0].url = data.image;
|
|
|
- const urlArr = JSON.parse(data.sliderImage);
|
|
|
- if(urlArr.length > 0){
|
|
|
- urlArr.forEach((item)=>{
|
|
|
- productImages.value.push({
|
|
|
- url:item
|
|
|
- })
|
|
|
- })
|
|
|
+ formData.value.tempName = formatterTemp(data.tempId);
|
|
|
+ console.log('分类显示名称:', formData.value.categoryDisplayName);
|
|
|
+
|
|
|
+ // 图片处理
|
|
|
+ previewImages.value = data.image ? [{ url: data.image }] : [];
|
|
|
+
|
|
|
+ // 商品轮播图
|
|
|
+ if(data.sliderImage){
|
|
|
+ try {
|
|
|
+ const urlArr = typeof data.sliderImage === 'string' ? JSON.parse(data.sliderImage) : data.sliderImage;
|
|
|
+ if(urlArr && urlArr.length > 0){
|
|
|
+ productImages.value = urlArr.map(url => ({ url }));
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('解析轮播图失败:', error);
|
|
|
+ productImages.value = [];
|
|
|
+ }
|
|
|
}
|
|
|
- console.log(productImages.value)
|
|
|
- formData.value.additionalFee = data.attrValue[0].additionalAmount;
|
|
|
- formData.value.laborCost = data.attrValue[0].price;
|
|
|
- formData.value.barCode = data.attrValue[0].barCode;
|
|
|
- productImagesGg.value[0] = {};
|
|
|
- productImagesGg.value[0].url = data.attrValue[0].image;
|
|
|
- formData.value.stock = data.attrValue[0].stock;
|
|
|
- formData.value.weight = data.attrValue[0].weight;
|
|
|
|
|
|
+ // 商品属性
|
|
|
+ if (data.attrValue && data.attrValue.length > 0) {
|
|
|
+ formData.value.additionalFee = data.attrValue[0].additionalAmount;
|
|
|
+ formData.value.laborCost = data.attrValue[0].price;
|
|
|
+ formData.value.barCode = data.attrValue[0].barCode;
|
|
|
+ formData.value.stock = data.attrValue[0].stock;
|
|
|
+ formData.value.weight = data.attrValue[0].weight;
|
|
|
+
|
|
|
+ // 规格图片
|
|
|
+ productImagesGg.value = data.attrValue[0].image ? [{ url: data.attrValue[0].image }] : [];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 商品描述
|
|
|
+ descriptionText.value = data.content ? data.content.replace(/<[^>]*>/g, '').substring(0, 500) : '';
|
|
|
+ formData.value.content = data.content || '';
|
|
|
+
|
|
|
+ // 设置分类选择器
|
|
|
if (categoryRef.value && formData.value.categoryIds.length > 0) {
|
|
|
- // 给组件一点时间初始化
|
|
|
- setTimeout(() => {
|
|
|
+
|
|
|
+ // 使用nextTick确保组件已渲染
|
|
|
+ await nextTick();
|
|
|
+
|
|
|
+ if (categoryRef.value.setSelectedIds) {
|
|
|
categoryRef.value.setSelectedIds(formData.value.categoryIds);
|
|
|
- }, 100);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ // 重要:手动初始化表单验证状态
|
|
|
+ await initFormValidation();
|
|
|
+
|
|
|
} catch (error) {
|
|
|
console.error('获取商品详情失败:', error);
|
|
|
uni.showToast({ title: '获取商品详情失败', icon: 'none' });
|
|
|
@@ -613,7 +712,11 @@ function tempConfirm(obj){
|
|
|
formData.value.tempId = obj.value[0].id;
|
|
|
formData.value.tempName = obj.value[0].name;
|
|
|
showTemp.value = false;
|
|
|
-
|
|
|
+ setTimeout(() => {
|
|
|
+ if (formRef.value) {
|
|
|
+ formRef.value.validateField('tempIds');
|
|
|
+ }
|
|
|
+ }, 100);
|
|
|
}
|
|
|
// 分类选择变化
|
|
|
const onCategoryChange = (result) => {
|
|
|
@@ -637,6 +740,12 @@ const confirmCategory = () => {
|
|
|
|
|
|
showCategory.value = false
|
|
|
console.log('最终选中的分类ID:', selectedIds)
|
|
|
+ // 触发校验
|
|
|
+ setTimeout(() => {
|
|
|
+ if (formRef.value) {
|
|
|
+ formRef.value.validateField('categoryIds');
|
|
|
+ }
|
|
|
+ }, 100);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -690,7 +799,6 @@ async function getImage() {
|
|
|
imageList.value = [];
|
|
|
}
|
|
|
async function getImageProduct() {
|
|
|
- console.log(imageList.value)
|
|
|
if (imageList.value.length > 0) {
|
|
|
if (imageList.value[0].status == "success") {
|
|
|
productImages.value = [...productImages.value,...imageList.value];
|
|
|
@@ -702,7 +810,6 @@ async function getImageProduct() {
|
|
|
imageList.value = [];
|
|
|
}
|
|
|
async function getImageProductGg() {
|
|
|
- console.log(imageList.value)
|
|
|
if (imageList.value.length > 0) {
|
|
|
if (imageList.value[0].status == "success") {
|
|
|
productImagesGg.value = imageList.value;
|
|
|
@@ -749,74 +856,69 @@ const onUpinImage = (tempFiles, editorCtx) => {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
-// 表单验证和提交
|
|
|
-const formRef = ref(null);
|
|
|
|
|
|
-const validateForm = async () => {
|
|
|
+
|
|
|
+const validateForm = () => {
|
|
|
try {
|
|
|
- const valid = await formRef.value.validate();
|
|
|
- return valid;
|
|
|
- } catch (error) {
|
|
|
- console.error('表单验证失败:', error);
|
|
|
- return false;
|
|
|
- }
|
|
|
-};
|
|
|
+ if(!isProductCenter.value){
|
|
|
+ // 检查图片上传
|
|
|
+ if (previewImages.value.length === 0) {
|
|
|
+ uni.showToast({ title: '请上传商品预览图', icon: 'none' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
-const submitForm = async () => {
|
|
|
- console.log(formData.value)
|
|
|
- // 检查商品描述
|
|
|
- if (!descriptionText.value.trim()) {
|
|
|
- uni.showToast({ title: '请输入商品描述', icon: 'none' });
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (productImages.value.length === 0) {
|
|
|
+ uni.showToast({ title: '请上传商品图片', icon: 'none' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- // 检查图片上传
|
|
|
- if (previewImages.value.length === 0) {
|
|
|
- uni.showToast({ title: '请上传商品预览图', icon: 'none' });
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (formData.value.sort && !/^\d+$/.test(formData.value.sort)) {
|
|
|
+ uni.showToast({ title: '排序号必须是整数', icon: 'none' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (productImages.value.length === 0) {
|
|
|
- uni.showToast({ title: '请上传商品图片', icon: 'none' });
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
- if (productImagesGg.value.length === 0) {
|
|
|
- uni.showToast({ title: '请上传商品规格图片', icon: 'none' });
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (productImagesGg.value.length === 0) {
|
|
|
+ uni.showToast({ title: '请上传商品规格图片', icon: 'none' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- // 验证数字字段
|
|
|
- if (!/^\d+(\.\d+)?$/.test(formData.value.weight)) {
|
|
|
- uni.showToast({ title: '重量格式不正确', icon: 'none' });
|
|
|
- return;
|
|
|
- }
|
|
|
+ // 验证数字字段
|
|
|
+ if (!/^\d+(\.\d+)?$/.test(formData.value.weight)) {
|
|
|
+ uni.showToast({ title: '重量格式不正确', icon: 'none' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (!/^\d+(\.\d+)?$/.test(formData.value.laborCost)) {
|
|
|
- uni.showToast({ title: '工费格式不正确', icon: 'none' });
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (!/^\d+(\.\d+)?$/.test(formData.value.laborCost)) {
|
|
|
+ uni.showToast({ title: '工费格式不正确', icon: 'none' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (!/^\d+(\.\d+)?$/.test(formData.value.additionalFee)) {
|
|
|
- uni.showToast({ title: '附加费格式不正确', icon: 'none' });
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (!/^\d+(\.\d+)?$/.test(formData.value.additionalFee)) {
|
|
|
+ uni.showToast({ title: '附加费格式不正确', icon: 'none' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (!/^\d+$/.test(formData.value.stock)) {
|
|
|
- uni.showToast({ title: '库存必须是整数', icon: 'none' });
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!/^\d+$/.test(formData.value.barCode)) {
|
|
|
- uni.showToast({ title: '商品编号必须是整数', icon: 'none' });
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (!/^\d+$/.test(formData.value.stock)) {
|
|
|
+ uni.showToast({ title: '库存必须是整数', icon: 'none' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!/^\d+$/.test(formData.value.barCode)) {
|
|
|
+ uni.showToast({ title: '商品编号必须是整数', icon: 'none' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (formData.value.sort && !/^\d+$/.test(formData.value.sort)) {
|
|
|
- uni.showToast({ title: '排序号必须是整数', icon: 'none' });
|
|
|
- return;
|
|
|
+ const valid = formRef.value.validate();
|
|
|
+ return valid;
|
|
|
+ } catch (error) {
|
|
|
+ console.error('表单验证失败:', error);
|
|
|
+ return false;
|
|
|
}
|
|
|
+};
|
|
|
+const submitForm = async () => {
|
|
|
+ const valid = validateForm();
|
|
|
|
|
|
- const valid = await validateForm();
|
|
|
if (valid) {
|
|
|
const submitData = {
|
|
|
...formData.value
|
|
|
@@ -847,13 +949,51 @@ const submitForm = async () => {
|
|
|
}
|
|
|
];
|
|
|
console.log('提交数据:', submitData);
|
|
|
- const {data} = await productSave(submitData);
|
|
|
- uni.showToast({ title: '发布成功', icon: 'success' });
|
|
|
+
|
|
|
+ if(productId.value && !isProductCenter.value){
|
|
|
+ const {data} = await productUpdate(submitData);
|
|
|
+ uni.showToast({ title: '修改成功', icon: 'success' });
|
|
|
+ }else{
|
|
|
+ const {data} = await productSave(submitData);
|
|
|
+ uni.showToast({ title: '发布成功', icon: 'success' });
|
|
|
+ }
|
|
|
+
|
|
|
uni.navigateTo({
|
|
|
- url: '/pages/merchantCenter/productCenter'
|
|
|
+ url: '/pages/merchantCenter/productManagement'
|
|
|
})
|
|
|
}
|
|
|
-};
|
|
|
+}
|
|
|
+// 重置表单(用于新建场景)
|
|
|
+const resetForm = () => {
|
|
|
+ formData.value = {
|
|
|
+ categoryIds: [],
|
|
|
+ categoryDisplayName: '',
|
|
|
+ tempName: '',
|
|
|
+ tempIds: [],
|
|
|
+ storeName: '',
|
|
|
+ keyword: '',
|
|
|
+ storeInfo: '',
|
|
|
+ unitName: '',
|
|
|
+ metalType: '',
|
|
|
+ weight: '',
|
|
|
+ laborCost: '',
|
|
|
+ additionalFee: '',
|
|
|
+ sort: '',
|
|
|
+ content: '',
|
|
|
+ stock: '',
|
|
|
+ barCode: ''
|
|
|
+ };
|
|
|
+
|
|
|
+ previewImages.value = [];
|
|
|
+ productImages.value = [];
|
|
|
+ productImagesGg.value = [];
|
|
|
+ descriptionText.value = '';
|
|
|
+
|
|
|
+ // 清除校验状态
|
|
|
+ if (formRef.value) {
|
|
|
+ formRef.value.clearValidate();
|
|
|
+ }
|
|
|
+}
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
@@ -957,6 +1097,7 @@ const submitForm = async () => {
|
|
|
background-color: #FFF;
|
|
|
padding: 20rpx 30rpx;
|
|
|
box-shadow: 0 -2rpx 10rpx rgba(0,0,0,0.1);
|
|
|
+ z-index: 5;
|
|
|
}
|
|
|
|
|
|
.submit {
|