refactor: 重构组件逻辑与样式优化

- 在 App.vue 中重构站点信息的获取与应用逻辑,提升代码可读性与维护性。
- 更新 Search.vue 组件,优化搜索框的样式与结构,增强用户体验。
- 在 element.scss 中注释掉不再使用的样式,并新增确认收货按钮的样式。
- 改进多个页面的布局与样式,确保响应式设计的一致性与美观性。
- 更新订单相关组件的按钮样式,提升视觉一致性与可用性。
This commit is contained in:
田香琪
2026-06-30 21:09:28 +08:00
parent ec948b5496
commit 28a857249a
121 changed files with 5122 additions and 2182 deletions

View File

@@ -18,22 +18,39 @@
/>
</el-form-item>
<el-form-item label="获取方式" prop="getType">
<el-select v-model="searchForm.getType" placeholder="请选择" clearable style="width: 240px">
<el-option label="免费获取" value="FREE" />
<el-option label="活动获取" value="ACTIVITY" />
<el-select
v-model="searchForm.getType"
placeholder="请选择"
:clearable="!isGetTypeFilterLocked"
:disabled="isGetTypeFilterLocked"
teleported
popper-class="coupon-filter-popper"
style="width: 240px"
>
<el-option
v-for="item in getTypeFilterOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="活动状态" prop="promotionStatus">
<el-select
v-model="searchForm.promotionStatus"
placeholder="请选择"
clearable
:clearable="!isPromotionStatusFilterLocked"
:disabled="isPromotionStatusFilterLocked"
teleported
popper-class="coupon-filter-popper"
style="width: 240px"
>
<el-option label="未开始" value="NEW" />
<el-option label="已开始/上架" value="START" />
<el-option label="已结束/下架" value="END" />
<el-option label="紧急关闭/作废" value="CLOSE" />
<el-option
v-for="item in promotionStatusFilterOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="活动时间">
@@ -41,6 +58,8 @@
v-model="selectDate"
type="daterange"
clearable
teleported
popper-class="coupon-filter-popper"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 240px"
@@ -218,6 +237,8 @@ export default {
sort: "create_time",
order: "desc",
getType: "",
promotionStatus: "",
couponName: "",
},
selectList: [],
selectCount: 0,
@@ -229,6 +250,36 @@ export default {
isSyncingSelection: false,
};
},
computed: {
getTypeFilterOptions() {
const all = [
{ label: "免费获取", value: "FREE" },
{ label: "活动获取", value: "ACTIVITY" },
];
if (this.getType) {
return all.filter((item) => item.value === this.getType);
}
return all;
},
promotionStatusFilterOptions() {
const all = [
{ label: "未开始", value: "NEW" },
{ label: "已开始/上架", value: "START" },
{ label: "已结束/下架", value: "END" },
{ label: "紧急关闭/作废", value: "CLOSE" },
];
if (this.promotionStatus) {
return all.filter((item) => item.value === this.promotionStatus);
}
return all;
},
isGetTypeFilterLocked() {
return !!this.getType;
},
isPromotionStatusFilterLocked() {
return !!this.promotionStatus;
},
},
watch: {
$route(to) {
if (to.fullPath == "/promotions/manager-coupon") {
@@ -342,7 +393,9 @@ export default {
this.selectList = nextList;
this.selectCount = nextList.length;
this.$nextTick(() => {
this.isSyncingSelection = false;
this.$nextTick(() => {
this.isSyncingSelection = false;
});
});
},
check() {
@@ -398,9 +451,9 @@ export default {
}
getPlatformCouponList(this.searchForm)
.then((res) => {
if (res.success) {
this.data = res.result.records;
this.total = res.result.total;
if (res && res.success && res.result) {
this.data = res.result.records || [];
this.total = res.result.total || 0;
this.$nextTick(() => {
if (this.selectedList.length) {
this.syncTableSelection(this.selectedList);
@@ -408,6 +461,7 @@ export default {
});
}
})
.catch(() => {})
.finally(() => {
this.loading = false;
});
@@ -523,3 +577,9 @@ export default {
margin-bottom: 10px;
}
</style>
<style lang="scss">
.coupon-filter-popper {
z-index: 4000 !important;
}
</style>

View File

@@ -366,28 +366,31 @@ export default {
padding-top: 1px;
}
.gift-card-validity-group {
display: flex;
flex-direction: column;
align-items: flex-start;
width: 100%;
padding-top: 0;
padding-bottom: 0;
}
.gift-card-validity-group :deep(.el-radio) {
display: inline-flex;
align-items: center;
line-height: 1;
}
.gift-card-validity-group :deep(.el-radio:first-child) {
margin-top: 0;
}
.gift-card-validity-group :deep(.el-radio) {
display: flex;
flex-wrap: wrap;
align-items: center;
margin-right: 0;
margin-bottom: 10px;
line-height: 32px;
min-height: 32px;
height: auto;
}
.gift-card-validity-group :deep(.el-radio:last-child) {
margin-bottom: 0;
}
.gift-card-validity-group :deep(.el-radio__label) {
display: inline-flex;
align-items: center;
flex-wrap: wrap;
line-height: 32px;
}
.gift-card-validity-input-gap {
width: 168px;
margin: 0 10px;

View File

@@ -3,67 +3,82 @@
<el-card>
<el-form :model="liveForm" ref="liveForm" :rules="liveRulesForm" label-width="120px">
<el-form-item label="直播标题" prop="name">
<el-input disabled v-model="liveForm.name" style="width:460px"></el-input>
<div class="tips">直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符</div>
<div class="form-field-block">
<el-input disabled v-model="liveForm.name" style="width:460px"></el-input>
<div class="form-tip">直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符</div>
</div>
</el-form-item>
<el-form-item label="主播昵称" prop="anchorName">
<el-input disabled v-model="liveForm.anchorName" style="width:360px"></el-input>
<div class="tips">主播昵称,最短2个汉字,最长15个汉字,1个汉字相当于2个字符</div>
<div class="form-field-block">
<el-input disabled v-model="liveForm.anchorName" style="width:360px"></el-input>
<div class="form-tip">主播昵称,最短2个汉字,最长15个汉字,1个汉字相当于2个字符</div>
</div>
</el-form-item>
<el-form-item label="直播时间" prop="startTime">
<el-date-picker
disabled
format="YYYY-MM-DD HH:mm"
type="datetimerange"
v-model="times"
@change="handleChangeTime"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="直播计划开始时间-直播计划结束时间"
style="width: 300px"
/>
<div class="tips">直播开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后</div>
<div class="form-field-block">
<el-date-picker
disabled
format="YYYY-MM-DD HH:mm"
type="datetimerange"
v-model="times"
@change="handleChangeTime"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="直播计划开始时间-直播计划结束时间"
style="width: 300px"
/>
<div class="form-tip">直播开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后</div>
</div>
</el-form-item>
<el-form-item label="主播微信号" prop="anchorWechat">
<el-input disabled v-model="liveForm.anchorWechat" style="width:360px" placeholder="主播微信号"></el-input>
<div class="tips">主播微信号,如果未实名认证,需要先前往“小程序直播”小程序进行<a target="_black" href="https://res.wx.qq.com/op_res/9rSix1dhHfK4rR049JL0PHJ7TpOvkuZ3mE0z7Ou_Etvjf-w1J_jVX0rZqeStLfwh">实名验证</a></div>
<div class="form-field-block">
<el-input disabled v-model="liveForm.anchorWechat" style="width:360px" placeholder="主播微信号"></el-input>
<div class="form-tip">主播微信号,如果未实名认证,需要先前往“小程序直播”小程序进行<a target="_black" href="https://res.wx.qq.com/op_res/9rSix1dhHfK4rR049JL0PHJ7TpOvkuZ3mE0z7Ou_Etvjf-w1J_jVX0rZqeStLfwh">实名验证</a></div>
</div>
</el-form-item>
<el-form-item label="分享卡片封面" prop="feedsImg">
<div class="upload-list" v-if="liveForm.feedsImg">
<img :src="liveForm.feedsImg">
<div class="upload-list-cover" @click="handleView(liveForm.feedsImg)">
<span class="view-icon">查看</span>
<div class="form-field-block">
<div class="upload-list" v-if="liveForm.feedsImg">
<img :src="liveForm.feedsImg">
<div class="upload-list-cover" @click="handleView(liveForm.feedsImg)">
<span class="view-icon">查看</span>
</div>
</div>
<div class="form-tip">
直播间分享图,图片规则:建议像素800*640,大小不超过1M;
</div>
</div>
<div class="tips">
直播间分享图,图片规则:建议像素800*640,大小不超过1M;
</div>
</el-form-item>
<el-form-item label="直播间背景墙" prop="coverImg">
<div class="upload-list" v-if="liveForm.coverImg">
<img :src="liveForm.coverImg">
<div class="upload-list-cover" @click="handleView(liveForm.coverImg)">
<span class="view-icon">查看</span>
<div class="form-field-block">
<div class="upload-list" v-if="liveForm.coverImg">
<img :src="liveForm.coverImg">
<div class="upload-list-cover" @click="handleView(liveForm.coverImg)">
<span class="view-icon">查看</span>
</div>
</div>
<div class="form-tip"> 直播间背景图,图片规则:建议像素1080*1920,大小不超过1M</div>
</div>
<div class="tips"> 直播间背景图,图片规则:建议像素1080*1920,大小不超过1M</div>
</el-form-item>
<el-form-item label="直播间分享图" prop="shareImg">
<div class="upload-list" v-if="liveForm.shareImg">
<img :src="liveForm.shareImg">
<div class="upload-list-cover" @click="handleView(liveForm.shareImg)">
<span class="view-icon">查看</span>
<div class="form-field-block">
<div class="upload-list" v-if="liveForm.shareImg">
<img :src="liveForm.shareImg">
<div class="upload-list-cover" @click="handleView(liveForm.shareImg)">
<span class="view-icon">查看</span>
</div>
</div>
<div class="form-tip"> 直播间分享图,图片规则:建议像素800*640,大小不超过1M</div>
</div>
<div class="tips"> 直播间分享图,图片规则:建议像素800*640,大小不超过1M</div>
</el-form-item>
<el-form-item label="商品" v-if="$route.query.id">
<el-table class="goods-table" border :data="liveData" style="width: 100%">
<div class="form-field-block">
<el-table class="goods-table" border :data="liveData" style="width: 100%">
<el-table-column label="商品" min-width="200">
<template #default="{ row, $index }">
<div v-if="row" class="flex-goods">
@@ -91,8 +106,9 @@
</template>
</el-table-column>
</el-table>
<div class="tips">
直播间商品中前两个商品将自动被选为封面,伴随直播间在直播列表中显示
<div class="form-tip">
直播间商品中前两个商品将自动被选为封面,伴随直播间在直播列表中显示
</div>
</div>
</el-form-item>
@@ -198,13 +214,21 @@ export default {
margin-right: 10px;
}
}
.tips {
.form-field-block {
display: flex;
flex-direction: column;
align-items: flex-start;
width: 100%;
}
.form-tip {
color: #999;
font-size: 12px;
line-height: 1.5;
margin-top: 4px;
}
.goods-table {
width: 1000px;
margin: 10px 0;
margin: 10px 0 0;
}
.upload-list {
display: inline-block;