发布流程增加解锁赛伊德与腾讯安全中心截图教程

- 解锁赛伊德:皮肤与交接分区新增是/否必选项,存入 asset_summary,
  仅当号主选「是」时在买家端列表/详情展示「解锁赛伊德:是」
- 腾讯安全中心截图:新增可复用 GuideImage 组件(缩略图 + 点击全屏放大),
  在该截图槽位展示处罚截图教程图,仅提示用途、不占用上传数量

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
yml2213
2026-06-17 02:12:15 +08:00
co-authored by Claude Opus 4.8
parent a88008f783
commit f336957391
9 changed files with 157 additions and 0 deletions
@@ -17,6 +17,7 @@ export function defaultPublishForm(): PublishForm {
login_method: '',
online_start: '',
online_end: '',
unlock_said: '',
ban_record: '',
common_regions: [],
depositAmountYuan: '',
@@ -285,6 +285,7 @@ export function usePublishForm(options: UsePublishFormOptions) {
login_method: listing.login_platform || '',
online_start: stringValue(onlineTime.start),
online_end: stringValue(onlineTime.end),
unlock_said: stringValue(summary.unlock_said),
ban_record: stringValue(summary.ban_record),
common_regions: stringArray(summary.common_regions),
depositAmountYuan: listing.deposit_amount_cent > 0 ? listing.deposit_amount_cent / 100 : '',
@@ -730,6 +731,7 @@ export function usePublishForm(options: UsePublishFormOptions) {
}
}
if (pricing.banRecordOptions.value.length && !form.ban_record) return '请选择封禁记录'
if (!form.unlock_said) return '请选择是否解锁赛伊德'
if (form.depositAmountYuan === '' || Number(form.depositAmountYuan) < 0) return '请填写押金'
if (!Number.isFinite(Number(form.depositAmountYuan))) return '押金格式不正确'
if (
@@ -825,6 +827,7 @@ export function usePublishForm(options: UsePublishFormOptions) {
start: form.online_start,
end: form.online_end,
},
unlock_said: form.unlock_said,
ban_record: form.ban_record,
common_regions: form.common_regions,
remark: form.remark,
@@ -6,6 +6,8 @@ import MobileBottomNav from '@/components/MobileBottomNav.vue'
import { usePublishForm } from '@/features/seller/composables/usePublishForm'
import { formatMoney } from '@/shared/utils/money'
import type { AgreementContent } from '@/features/listings/api/listingOptions'
import GuideImage from '@/components/GuideImage.vue'
import tencentSecurityGuide from '@/assets/tencent-security-guide.webp'
const {
commonOnlineTimes,
@@ -115,6 +117,13 @@ function openPublishAgreement(agreement: AgreementContent) {
function selectRadio<T extends string>(value: T, setter: (value: T) => void) {
setter(value)
}
const unlockSaidOptions = ['是', '否']
// 截图槽位的指导示例图(仅展示、点击放大,不占用上传数量)
const screenshotGuides: Record<string, string> = {
tencentSecurity: tencentSecurityGuide,
}
</script>
<template>
@@ -356,6 +365,23 @@ function selectRadio<T extends string>(value: T, setter: (value: T) => void) {
优先推荐账密登录出售速度约为扫码的数倍两种方式安全性一致账密登录更便捷请自行衡量
</p>
<van-field label="解锁赛伊德" required class="publish-field">
<template #input>
<div class="radio-group">
<button
v-for="opt in unlockSaidOptions"
:key="opt"
type="button"
class="radio-btn"
:class="{ active: form.unlock_said === opt }"
@click="selectRadio(opt, value => (form.unlock_said = value))"
>
{{ opt }}
</button>
</div>
</template>
</van-field>
<div class="time-row">
<div class="time-field-group">
<van-field
@@ -487,6 +513,11 @@ function selectRadio<T extends string>(value: T, setter: (value: T) => void) {
<small v-if="getScreenshotLimitHint(slot.key)">{{
getScreenshotLimitHint(slot.key)
}}</small>
<GuideImage
v-if="screenshotGuides[slot.key]"
:src="screenshotGuides[slot.key] || ''"
label="点击查看处罚截图教程"
/>
</div>
<div v-if="getScreenshotCount(slot.key)" class="upload-preview-list">
<div
@@ -14,6 +14,8 @@ import { formatMoney } from '@/shared/utils/money'
import type { AgreementContent } from '@/features/listings/api/listingOptions'
import OptionChips from './components/OptionChips.vue'
import PublishSection from './components/PublishSection.vue'
import GuideImage from '@/components/GuideImage.vue'
import tencentSecurityGuide from '@/assets/tencent-security-guide.webp'
const {
commonOnlineTimes,
@@ -115,6 +117,13 @@ const activeAgreement = ref<AgreementContent | null>(null)
const activeAgreementTitle = computed(() => activeAgreement.value?.title || '协议内容')
const activeAgreementContent = computed(() => activeAgreement.value?.content || '')
const unlockSaidOptions = ['是', '否']
// 截图槽位的指导示例图(仅展示、点击放大,不占用上传数量)
const screenshotGuides: Record<string, string> = {
tencentSecurity: tencentSecurityGuide,
}
function toggleSkinOption(value: string | number) {
toggleSkin(String(value))
}
@@ -322,6 +331,15 @@ function selectDailyLoss(value: string | number) {
</p>
</div>
<div class="field-row panel-field-row">
<label>解锁赛伊德<span>*</span></label>
<OptionChips
:options="unlockSaidOptions"
:model-value="form.unlock_said"
@select="form.unlock_said = String($event)"
/>
</div>
<div class="time-preset-panel">
<div class="time-preset-row">
<strong>在线开始<span>*</span></strong>
@@ -427,6 +445,11 @@ function selectDailyLoss(value: string | number) {
<em v-if="getScreenshotLimitHint(slot.key)">{{
getScreenshotLimitHint(slot.key)
}}</em>
<GuideImage
v-if="screenshotGuides[slot.key]"
:src="screenshotGuides[slot.key] || ''"
label="点击查看处罚截图教程"
/>
</div>
<div v-if="getScreenshotCount(slot.key)" class="upload-preview-list">
<div