优化快手小店核销界面
This commit is contained in:
@@ -98,10 +98,6 @@ const {
|
|||||||
hydrateKuaishouEticketConfig,
|
hydrateKuaishouEticketConfig,
|
||||||
addKuaishouEticketShop,
|
addKuaishouEticketShop,
|
||||||
removeKuaishouEticketShop,
|
removeKuaishouEticketShop,
|
||||||
isKuaishouEticketShopExpanded,
|
|
||||||
toggleKuaishouEticketShop,
|
|
||||||
expandAllKuaishouEticketShops,
|
|
||||||
collapseAllKuaishouEticketShops,
|
|
||||||
setKuaishouEticketDebugShop,
|
setKuaishouEticketDebugShop,
|
||||||
describeKuaishouEticketShop,
|
describeKuaishouEticketShop,
|
||||||
getKuaishouEticketShopInitial,
|
getKuaishouEticketShopInitial,
|
||||||
@@ -361,10 +357,6 @@ onMounted(loadConfigs)
|
|||||||
:kuaishou-eticket-stats="kuaishouEticketStats"
|
:kuaishou-eticket-stats="kuaishouEticketStats"
|
||||||
:add-kuaishou-eticket-shop="addKuaishouEticketShop"
|
:add-kuaishou-eticket-shop="addKuaishouEticketShop"
|
||||||
:remove-kuaishou-eticket-shop="removeKuaishouEticketShop"
|
:remove-kuaishou-eticket-shop="removeKuaishouEticketShop"
|
||||||
:is-kuaishou-eticket-shop-expanded="isKuaishouEticketShopExpanded"
|
|
||||||
:toggle-kuaishou-eticket-shop="toggleKuaishouEticketShop"
|
|
||||||
:expand-all-kuaishou-eticket-shops="expandAllKuaishouEticketShops"
|
|
||||||
:collapse-all-kuaishou-eticket-shops="collapseAllKuaishouEticketShops"
|
|
||||||
:set-kuaishou-eticket-debug-shop="setKuaishouEticketDebugShop"
|
:set-kuaishou-eticket-debug-shop="setKuaishouEticketDebugShop"
|
||||||
:describe-kuaishou-eticket-shop="describeKuaishouEticketShop"
|
:describe-kuaishou-eticket-shop="describeKuaishouEticketShop"
|
||||||
:get-kuaishou-eticket-shop-initial="getKuaishouEticketShopInitial"
|
:get-kuaishou-eticket-shop-initial="getKuaishouEticketShopInitial"
|
||||||
|
|||||||
+157
-105
@@ -1,9 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type {
|
import type {
|
||||||
AdminKuaishouEticketDetailResult,
|
|
||||||
AdminKuaishouEticketConsumeResult,
|
AdminKuaishouEticketConsumeResult,
|
||||||
|
AdminKuaishouEticketDetailResult,
|
||||||
} from '@/types/admin'
|
} from '@/types/admin'
|
||||||
import AdminResultCard from '@/components/admin/AdminResultCard.vue'
|
|
||||||
|
|
||||||
type KuaishouEticketDebugForm = {
|
type KuaishouEticketDebugForm = {
|
||||||
selectedShopId: string
|
selectedShopId: string
|
||||||
@@ -27,36 +26,51 @@ type Props = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
defineProps<Props>()
|
defineProps<Props>()
|
||||||
|
|
||||||
|
function formatDetailStatus(result: AdminKuaishouEticketDetailResult | null) {
|
||||||
|
if (!result) return '未查询'
|
||||||
|
if (result.ok) return result.alreadyConsumed ? '已核销' : '可核销'
|
||||||
|
return '查询异常'
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatConsumeStatus(result: AdminKuaishouEticketConsumeResult | null) {
|
||||||
|
if (!result) return '未执行'
|
||||||
|
if (result.consumed) return '核销完成'
|
||||||
|
if (result.alreadyConsumed) return '已核销'
|
||||||
|
return result.ok ? '已返回' : '执行异常'
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<el-card class="section-card">
|
<el-card class="section-card debug-card">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<div>
|
<div>
|
||||||
<span class="card-title">快手小店核销调试</span>
|
<span class="card-title">核销调试</span>
|
||||||
<p class="card-desc">
|
<p class="card-desc">查询券码后自动回填 eTicketId、oid、formToken,再执行核销。</p>
|
||||||
这里使用"当前调试店铺"的 Cookie 执行查询与核销;eTicketId / oid / formToken
|
|
||||||
都来自查询结果。
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="card-actions">
|
<div class="card-actions">
|
||||||
<el-button :loading="kuaishouEticketDetailing" @click="handleKuaishouEticketQueryDetail"
|
<el-button
|
||||||
>查询核销信息</el-button
|
:loading="kuaishouEticketDetailing"
|
||||||
|
@click="handleKuaishouEticketQueryDetail"
|
||||||
>
|
>
|
||||||
|
查询核销信息
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
:loading="kuaishouEticketConsuming"
|
:loading="kuaishouEticketConsuming"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handleKuaishouEticketConsume"
|
@click="handleKuaishouEticketConsume"
|
||||||
>执行核销</el-button
|
|
||||||
>
|
>
|
||||||
|
执行核销
|
||||||
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<div class="debug-layout">
|
<div class="debug-grid">
|
||||||
<div class="debug-main">
|
<section class="query-panel">
|
||||||
<el-form label-width="auto" label-position="top">
|
<el-form label-position="top">
|
||||||
|
<div class="query-grid">
|
||||||
<el-form-item label="调试店铺">
|
<el-form-item label="调试店铺">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="kuaishouEticketForm.selectedShopId"
|
v-model="kuaishouEticketForm.selectedShopId"
|
||||||
@@ -71,16 +85,12 @@ defineProps<Props>()
|
|||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-row :gutter="16">
|
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="查询券码">
|
<el-form-item label="查询券码">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="kuaishouEticketForm.queryTicketCode"
|
v-model="kuaishouEticketForm.queryTicketCode"
|
||||||
placeholder="用于查询核销信息"
|
placeholder="用于查询核销信息"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="核销数量">
|
<el-form-item label="核销数量">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="kuaishouEticketForm.num"
|
v-model="kuaishouEticketForm.num"
|
||||||
@@ -89,96 +99,64 @@ defineProps<Props>()
|
|||||||
class="w-full"
|
class="w-full"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="storeId">
|
<el-form-item label="storeId">
|
||||||
<el-input v-model="kuaishouEticketForm.storeId" placeholder="默认 0" />
|
<el-input v-model="kuaishouEticketForm.storeId" placeholder="默认 0" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
|
||||||
|
|
||||||
<el-card shadow="never" class="auto-fill-card">
|
<div class="auto-fill-row">
|
||||||
<template #header>
|
<div class="auto-fill-item">
|
||||||
<div>
|
<span>eTicketId</span>
|
||||||
<span class="card-title">自动回填参数</span>
|
<strong>{{ kuaishouEticketForm.eTicketId || '查询后回填' }}</strong>
|
||||||
<span class="text-muted ml-2">查询后生成</span>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
<div class="auto-fill-item">
|
||||||
<el-form label-width="auto" label-position="top">
|
<span>oid</span>
|
||||||
<el-row :gutter="16">
|
<strong>{{ kuaishouEticketForm.oid || '查询后回填' }}</strong>
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="eTicketId">
|
|
||||||
<el-input
|
|
||||||
:model-value="kuaishouEticketForm.eTicketId"
|
|
||||||
readonly
|
|
||||||
placeholder="查询后自动回填"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="oid">
|
|
||||||
<el-input
|
|
||||||
:model-value="kuaishouEticketForm.oid"
|
|
||||||
readonly
|
|
||||||
placeholder="查询后自动回填"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="formToken">
|
|
||||||
<el-input
|
|
||||||
:model-value="kuaishouEticketForm.formToken"
|
|
||||||
readonly
|
|
||||||
placeholder="查询后自动回填"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-form>
|
|
||||||
</el-card>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="auto-fill-item">
|
||||||
|
<span>formToken</span>
|
||||||
|
<strong>{{ kuaishouEticketForm.formToken || '查询后回填' }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<div class="result-grid mt-4">
|
<aside class="result-panel">
|
||||||
<AdminResultCard
|
<div class="status-card">
|
||||||
label="详情查询"
|
<span>详情查询</span>
|
||||||
:value="
|
<strong>{{ formatDetailStatus(kuaishouEticketDetailResult) }}</strong>
|
||||||
kuaishouEticketDetailResult
|
|
||||||
? kuaishouEticketDetailResult.ok
|
|
||||||
? '成功'
|
|
||||||
: '已返回'
|
|
||||||
: '未执行'
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<p v-if="kuaishouEticketDetailResult?.detail">
|
<p v-if="kuaishouEticketDetailResult?.detail">
|
||||||
{{
|
{{
|
||||||
kuaishouEticketDetailResult.goods?.itemTitle ||
|
kuaishouEticketDetailResult.goods?.itemTitle ||
|
||||||
kuaishouEticketDetailResult.goods?.skuDesc ||
|
kuaishouEticketDetailResult.goods?.skuDesc ||
|
||||||
'-'
|
'商品信息未返回'
|
||||||
}}, 剩余 {{ kuaishouEticketDetailResult.detail.leftCount }} /
|
|
||||||
{{ kuaishouEticketDetailResult.detail.totalCount }}
|
|
||||||
</p>
|
|
||||||
<p v-else>先通过查询券码获取核销详情并自动带出核销参数。</p>
|
|
||||||
</AdminResultCard>
|
|
||||||
<AdminResultCard
|
|
||||||
label="核销执行"
|
|
||||||
:value="
|
|
||||||
kuaishouEticketConsumeResult
|
|
||||||
? kuaishouEticketConsumeResult.consumed
|
|
||||||
? '已处理'
|
|
||||||
: '已返回'
|
|
||||||
: '未执行'
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<p v-if="kuaishouEticketConsumeResult">
|
|
||||||
{{
|
|
||||||
kuaishouEticketConsumeResult.errorMessage ||
|
|
||||||
(kuaishouEticketConsumeResult.ok ? '核销成功' : '接口已返回结果')
|
|
||||||
}}
|
}}
|
||||||
</p>
|
</p>
|
||||||
<p v-else>查询详情后再执行核销会更稳妥。</p>
|
<p v-else>
|
||||||
</AdminResultCard>
|
{{ kuaishouEticketDetailResult?.errorMessage || '先输入券码并查询详情。' }}
|
||||||
|
</p>
|
||||||
|
<div v-if="kuaishouEticketDetailResult?.detail" class="count-row">
|
||||||
|
<span>剩余 {{ kuaishouEticketDetailResult.detail.leftCount }}</span>
|
||||||
|
<span>总数 {{ kuaishouEticketDetailResult.detail.totalCount }}</span>
|
||||||
|
<span>状态 {{ kuaishouEticketDetailResult.detail.status || '-' }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="status-card">
|
||||||
|
<span>核销执行</span>
|
||||||
|
<strong>{{ formatConsumeStatus(kuaishouEticketConsumeResult) }}</strong>
|
||||||
|
<p>
|
||||||
|
{{
|
||||||
|
kuaishouEticketConsumeResult?.errorMessage ||
|
||||||
|
(kuaishouEticketConsumeResult?.ok ? '接口已返回结果。' : '查询成功后再执行核销。')
|
||||||
|
}}
|
||||||
|
</p>
|
||||||
|
<div v-if="kuaishouEticketConsumeResult" class="count-row">
|
||||||
|
<span>数量 {{ kuaishouEticketConsumeResult.num }}</span>
|
||||||
|
<span>requestId {{ kuaishouEticketConsumeResult.requestId || '-' }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</template>
|
</template>
|
||||||
@@ -195,29 +173,103 @@ defineProps<Props>()
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.debug-layout {
|
.debug-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1.7fr) minmax(260px, 0.9fr);
|
grid-template-columns: minmax(0, 1.6fr) minmax(300px, 0.8fr);
|
||||||
gap: var(--space-4);
|
gap: var(--space-4);
|
||||||
}
|
}
|
||||||
|
|
||||||
.auto-fill-card {
|
.query-panel,
|
||||||
background: var(--bg-subtle);
|
.result-panel {
|
||||||
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.result-grid {
|
.query-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
grid-template-columns: minmax(180px, 1.2fr) minmax(220px, 1.6fr) minmax(120px, 0.8fr) minmax(
|
||||||
|
120px,
|
||||||
|
0.8fr
|
||||||
|
);
|
||||||
gap: var(--space-3);
|
gap: var(--space-3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-muted {
|
.auto-fill-row {
|
||||||
font-size: var(--text-xs);
|
display: grid;
|
||||||
color: var(--text-muted);
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
|
gap: var(--space-3);
|
||||||
|
margin-top: var(--space-2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 900px) {
|
.auto-fill-item,
|
||||||
.debug-layout {
|
.status-card {
|
||||||
|
min-width: 0;
|
||||||
|
padding: var(--space-3);
|
||||||
|
border: 1px solid var(--border-default);
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
background: var(--bg-subtle);
|
||||||
|
}
|
||||||
|
|
||||||
|
.auto-fill-item {
|
||||||
|
display: grid;
|
||||||
|
gap: var(--space-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.auto-fill-item span,
|
||||||
|
.status-card > span {
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: var(--text-xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.auto-fill-item strong,
|
||||||
|
.status-card strong {
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-family: var(--font-mono);
|
||||||
|
font-size: var(--text-sm);
|
||||||
|
font-weight: 700;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-panel {
|
||||||
|
display: grid;
|
||||||
|
gap: var(--space-3);
|
||||||
|
align-content: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-card {
|
||||||
|
display: grid;
|
||||||
|
gap: var(--space-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-card p {
|
||||||
|
margin: 0;
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: var(--text-xs);
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-row {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: var(--space-2);
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: var(--text-xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-row span {
|
||||||
|
padding: 2px var(--space-2);
|
||||||
|
border-radius: var(--radius-sm);
|
||||||
|
background: var(--bg-card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1080px) {
|
||||||
|
.debug-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 760px) {
|
||||||
|
.query-grid,
|
||||||
|
.auto-fill-row {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+58
-18
@@ -7,27 +7,67 @@ defineProps<Props>()
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<el-card class="section-card">
|
<section class="info-strip">
|
||||||
<template #header>
|
<div class="info-main">
|
||||||
<span class="card-title">说明信息</span>
|
<span class="card-title">快手小店核销</span>
|
||||||
</template>
|
<p class="card-desc">
|
||||||
<el-descriptions :column="1" border size="small">
|
独立维护店铺 Cookie,选择目标店铺后查询券码并执行核销。
|
||||||
<el-descriptions-item label="配置文件">{{
|
</p>
|
||||||
kuaishouEticketFilePath || '-'
|
</div>
|
||||||
}}</el-descriptions-item>
|
<div class="info-meta">
|
||||||
<el-descriptions-item label="职责">
|
<span>配置文件</span>
|
||||||
这是独立的新流程,只负责快手小店券核销调试与配置,不接入当前已完成的订单来源和履约主链路。
|
<strong>{{ kuaishouEticketFilePath || '-' }}</strong>
|
||||||
</el-descriptions-item>
|
</div>
|
||||||
<el-descriptions-item label="建议流程">
|
</section>
|
||||||
先为每个店铺录入 kshopName + Cookie,可用 info 接口自动识别店铺名与店铺
|
|
||||||
ID;保存后选择目标店铺,再查询券码并执行核销。
|
|
||||||
</el-descriptions-item>
|
|
||||||
</el-descriptions>
|
|
||||||
</el-card>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.section-card {
|
.info-strip {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: var(--space-4);
|
||||||
|
padding: var(--space-4) var(--space-5);
|
||||||
|
border: 1px solid var(--border-default);
|
||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
|
background: var(--bg-card);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-main {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-main .card-desc {
|
||||||
|
margin-top: var(--space-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-meta {
|
||||||
|
display: grid;
|
||||||
|
gap: var(--space-1);
|
||||||
|
min-width: 260px;
|
||||||
|
padding: var(--space-3);
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
background: var(--bg-subtle);
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: var(--text-xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-meta strong {
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-family: var(--font-mono);
|
||||||
|
font-weight: 600;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 760px) {
|
||||||
|
.info-strip {
|
||||||
|
align-items: stretch;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: var(--space-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-meta {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
+293
-208
@@ -1,9 +1,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { EditableKuaishouEticketShop } from '../../composables/types'
|
import type { EditableKuaishouEticketShop } from '../../composables/types'
|
||||||
import type {
|
import type { AdminKuaishouEticketShopInfoResult } from '@/types/admin'
|
||||||
AdminKuaishouEticketShopInfoResult,
|
|
||||||
} from '@/types/admin'
|
|
||||||
import AdminResultCard from '@/components/admin/AdminResultCard.vue'
|
|
||||||
|
|
||||||
type KuaishouEticketStats = {
|
type KuaishouEticketStats = {
|
||||||
configuredShopCount: number
|
configuredShopCount: number
|
||||||
@@ -27,10 +24,6 @@ type Props = {
|
|||||||
kuaishouEticketStats: KuaishouEticketStats
|
kuaishouEticketStats: KuaishouEticketStats
|
||||||
addKuaishouEticketShop: () => void
|
addKuaishouEticketShop: () => void
|
||||||
removeKuaishouEticketShop: (id: string) => void
|
removeKuaishouEticketShop: (id: string) => void
|
||||||
isKuaishouEticketShopExpanded: (id: string) => boolean
|
|
||||||
toggleKuaishouEticketShop: (id: string) => void
|
|
||||||
expandAllKuaishouEticketShops: () => void
|
|
||||||
collapseAllKuaishouEticketShops: () => void
|
|
||||||
setKuaishouEticketDebugShop: (id: string) => void
|
setKuaishouEticketDebugShop: (id: string) => void
|
||||||
describeKuaishouEticketShop: (shop: EditableKuaishouEticketShop) => string
|
describeKuaishouEticketShop: (shop: EditableKuaishouEticketShop) => string
|
||||||
getKuaishouEticketShopInitial: (shop: EditableKuaishouEticketShop) => string
|
getKuaishouEticketShopInitial: (shop: EditableKuaishouEticketShop) => string
|
||||||
@@ -42,74 +35,50 @@ defineProps<Props>()
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<el-card class="section-card">
|
<el-card class="section-card shop-workspace">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<div>
|
<div>
|
||||||
<span class="card-title">快手小店店铺配置</span>
|
<span class="card-title">店铺配置</span>
|
||||||
<p class="card-desc">
|
<p class="card-desc">维护多店铺 Cookie,当前选中店铺会直接用于下方查询与核销。</p>
|
||||||
支持多店铺配置,建议先粘贴 Cookie,再用 info 接口自动识别 kshopName /
|
|
||||||
shopId,最后统一保存到文件。
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="card-actions">
|
<div class="card-actions">
|
||||||
<el-button
|
|
||||||
:disabled="kuaishouEticketShops.length === 0"
|
|
||||||
@click="expandAllKuaishouEticketShops"
|
|
||||||
>全部展开</el-button
|
|
||||||
>
|
|
||||||
<el-button
|
|
||||||
:disabled="kuaishouEticketShops.length === 0"
|
|
||||||
@click="collapseAllKuaishouEticketShops"
|
|
||||||
>全部折叠</el-button
|
|
||||||
>
|
|
||||||
<el-button @click="addKuaishouEticketShop">新增店铺</el-button>
|
<el-button @click="addKuaishouEticketShop">新增店铺</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
:loading="kuaishouEticketSaving"
|
:loading="kuaishouEticketSaving"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handleKuaishouEticketSaveSource"
|
@click="handleKuaishouEticketSaveSource"
|
||||||
>保存配置</el-button
|
|
||||||
>
|
>
|
||||||
|
保存配置
|
||||||
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-form label-width="auto" label-position="top">
|
<div class="workspace-grid">
|
||||||
<el-form-item label="Base URL">
|
<aside class="shop-sidebar">
|
||||||
<el-input
|
<div class="sidebar-head">
|
||||||
v-model="kuaishouEticketForm.baseUrl"
|
<div>
|
||||||
placeholder="https://s.kwaixiaodian.com"
|
<strong>{{ kuaishouEticketStats.configuredShopCount }} 家店铺</strong>
|
||||||
/>
|
<p>Cookie 就绪 {{ kuaishouEticketStats.cookieReadyCount }} 家</p>
|
||||||
</el-form-item>
|
</div>
|
||||||
</el-form>
|
<el-tag
|
||||||
|
:type="kuaishouEticketStats.selectedShopReady ? 'success' : 'warning'"
|
||||||
<el-empty
|
effect="plain"
|
||||||
v-if="kuaishouEticketShops.length === 0"
|
|
||||||
description="当前还没有快手小店店铺配置,先新增一条。"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div v-else class="shop-panels">
|
|
||||||
<div class="shop-list">
|
|
||||||
<el-collapse
|
|
||||||
:model-value="
|
|
||||||
kuaishouEticketShops
|
|
||||||
.filter((s) => isKuaishouEticketShopExpanded(s.id))
|
|
||||||
.map((s) => s.id)
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<el-collapse-item
|
{{ kuaishouEticketStats.selectedShopReady ? '可调试' : '待补全' }}
|
||||||
|
</el-tag>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="kuaishouEticketShops.length > 0" class="shop-list">
|
||||||
|
<button
|
||||||
v-for="shop in kuaishouEticketShops"
|
v-for="shop in kuaishouEticketShops"
|
||||||
:key="shop.id"
|
:key="shop.id"
|
||||||
:name="shop.id"
|
type="button"
|
||||||
:class="[
|
class="shop-item"
|
||||||
'shop-panel',
|
:class="{ 'shop-item--active': kuaishouEticketForm.selectedShopId === shop.id }"
|
||||||
{
|
@click="setKuaishouEticketDebugShop(shop.id)"
|
||||||
'is-debug': kuaishouEticketForm.selectedShopId === shop.id,
|
|
||||||
},
|
|
||||||
]"
|
|
||||||
>
|
>
|
||||||
<template #title>
|
|
||||||
<div class="shop-title-bar">
|
|
||||||
<div class="shop-avatar">
|
<div class="shop-avatar">
|
||||||
<img
|
<img
|
||||||
v-if="shop.userAvatar"
|
v-if="shop.userAvatar"
|
||||||
@@ -118,138 +87,135 @@ defineProps<Props>()
|
|||||||
/>
|
/>
|
||||||
<span v-else>{{ getKuaishouEticketShopInitial(shop) }}</span>
|
<span v-else>{{ getKuaishouEticketShopInitial(shop) }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="shop-info">
|
<div class="shop-summary">
|
||||||
<div class="shop-name-row">
|
<div class="shop-name">
|
||||||
<strong>{{ shop.kshopName || shop.shopId || '未命名店铺' }}</strong>
|
<strong>{{ shop.kshopName || shop.shopId || '未命名店铺' }}</strong>
|
||||||
<el-tag :type="shop.enabled ? 'success' : 'info'" size="small">{{
|
<el-tag :type="shop.enabled ? 'success' : 'info'" size="small">
|
||||||
shop.enabled ? '已启用' : '已停用'
|
{{ shop.enabled ? '启用' : '停用' }}
|
||||||
}}</el-tag>
|
|
||||||
<el-tag
|
|
||||||
v-if="kuaishouEticketForm.selectedShopId === shop.id"
|
|
||||||
type="primary"
|
|
||||||
size="small"
|
|
||||||
>当前调试</el-tag
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="shop-meta">
|
|
||||||
<span>店铺 ID:{{ shop.shopId || '等待 info 自动识别' }}</span>
|
|
||||||
<el-tag
|
|
||||||
:type="Boolean(shop.cookie.trim()) ? 'success' : 'warning'"
|
|
||||||
size="small"
|
|
||||||
>
|
|
||||||
{{ shop.cookie.trim() ? 'Cookie 已粘贴' : '待补 Cookie' }}
|
|
||||||
</el-tag>
|
|
||||||
<el-tag
|
|
||||||
:type="Boolean(shop.userAvatar || shop.shopId.trim()) ? 'success' : 'info'"
|
|
||||||
size="small"
|
|
||||||
>
|
|
||||||
{{ shop.userAvatar || shop.shopId.trim() ? '信息已识别' : '未读取信息' }}
|
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</div>
|
</div>
|
||||||
|
<p>{{ shop.shopId || '等待识别 shopId' }}</p>
|
||||||
|
<div class="shop-flags">
|
||||||
|
<span :class="{ 'is-ok': shop.cookie.trim() }">
|
||||||
|
{{ shop.cookie.trim() ? 'Cookie 已填' : '缺 Cookie' }}
|
||||||
|
</span>
|
||||||
|
<span v-if="kuaishouEticketForm.selectedShopId === shop.id">当前调试</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<el-form label-width="auto" label-position="top">
|
<div v-else class="compact-empty">
|
||||||
<el-row :gutter="16">
|
<strong>还没有店铺</strong>
|
||||||
<el-col :span="12">
|
<p>新增店铺后粘贴 Cookie,再读取店铺信息确认归属。</p>
|
||||||
|
<el-button type="primary" plain @click="addKuaishouEticketShop">新增店铺</el-button>
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
<section class="shop-editor">
|
||||||
|
<el-form label-position="top" class="editor-form">
|
||||||
|
<div class="base-row">
|
||||||
|
<el-form-item label="Base URL">
|
||||||
|
<el-input
|
||||||
|
v-model="kuaishouEticketForm.baseUrl"
|
||||||
|
placeholder="https://s.kwaixiaodian.com"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template v-if="activeKuaishouEticketShop">
|
||||||
|
<div class="editor-head">
|
||||||
|
<div>
|
||||||
|
<strong>
|
||||||
|
{{
|
||||||
|
activeKuaishouEticketShop.kshopName ||
|
||||||
|
activeKuaishouEticketShop.shopId ||
|
||||||
|
'未命名店铺'
|
||||||
|
}}
|
||||||
|
</strong>
|
||||||
|
<p>{{ describeKuaishouEticketShop(activeKuaishouEticketShop) }}</p>
|
||||||
|
</div>
|
||||||
|
<div class="editor-actions">
|
||||||
|
<el-switch
|
||||||
|
v-model="activeKuaishouEticketShop.enabled"
|
||||||
|
inline-prompt
|
||||||
|
active-text="启用"
|
||||||
|
inactive-text="停用"
|
||||||
|
/>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
plain
|
||||||
|
size="small"
|
||||||
|
@click="removeKuaishouEticketShop(activeKuaishouEticketShop.id)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-grid">
|
||||||
<el-form-item label="kshopName">
|
<el-form-item label="kshopName">
|
||||||
<el-input v-model="shop.kshopName" placeholder="例如 稚嫩游戏交易店" />
|
<el-input
|
||||||
|
v-model="activeKuaishouEticketShop.kshopName"
|
||||||
|
placeholder="例如:稚嫩游戏交易店"
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="店铺 ID">
|
<el-form-item label="店铺 ID">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="shop.shopId"
|
v-model="activeKuaishouEticketShop.shopId"
|
||||||
readonly
|
readonly
|
||||||
placeholder="通过 info 接口自动识别"
|
placeholder="通过 info 接口自动识别"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
<el-form-item label="Cookie">
|
<el-form-item label="Cookie">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="shop.cookie"
|
v-model="activeKuaishouEticketShop.cookie"
|
||||||
type="textarea"
|
type="textarea"
|
||||||
:rows="4"
|
:rows="5"
|
||||||
placeholder="直接粘贴该店铺请求头中的完整 Cookie"
|
placeholder="直接粘贴该店铺请求头中的完整 Cookie"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
|
||||||
|
|
||||||
<div class="shop-footer">
|
<div class="editor-footer">
|
||||||
<div class="footer-left">
|
<div class="recognize-result">
|
||||||
<el-switch v-model="shop.enabled" active-text="启用该店铺" />
|
<span>最近识别</span>
|
||||||
<span v-if="shop.userAvatar" class="text-muted"
|
<strong>
|
||||||
>已识别头像,可直接作为调试店铺</span
|
{{
|
||||||
>
|
kuaishouEticketShopInfoResult?.shop.kshopName ||
|
||||||
<span v-else class="text-muted">建议先读取店铺信息确认 Cookie 归属</span>
|
kuaishouEticketShopInfoResult?.shop.shopId ||
|
||||||
|
'未执行'
|
||||||
|
}}
|
||||||
|
</strong>
|
||||||
|
<small v-if="kuaishouEticketShopInfoResult">
|
||||||
|
结算状态 {{ kuaishouEticketShopInfoResult.shop.settleStatus }}
|
||||||
|
</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="footer-actions">
|
<div class="footer-actions">
|
||||||
<el-button
|
<el-button
|
||||||
:loading="kuaishouEticketResolvingShopId === shop.id"
|
:loading="kuaishouEticketResolvingShopId === activeKuaishouEticketShop.id"
|
||||||
size="small"
|
@click="handleKuaishouEticketResolveShopInfo(activeKuaishouEticketShop)"
|
||||||
@click="handleKuaishouEticketResolveShopInfo(shop)"
|
|
||||||
>
|
>
|
||||||
读取店铺信息
|
读取店铺信息
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
size="small"
|
type="primary"
|
||||||
:type="kuaishouEticketForm.selectedShopId === shop.id ? 'success' : 'primary'"
|
plain
|
||||||
@click="setKuaishouEticketDebugShop(shop.id)"
|
@click="setKuaishouEticketDebugShop(activeKuaishouEticketShop.id)"
|
||||||
>
|
>
|
||||||
{{
|
设为调试店铺
|
||||||
kuaishouEticketForm.selectedShopId === shop.id
|
|
||||||
? '当前调试店铺'
|
|
||||||
: '设为调试店铺'
|
|
||||||
}}
|
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button size="small" type="danger" @click="removeKuaishouEticketShop(shop.id)"
|
|
||||||
>删除</el-button
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-collapse-item>
|
</template>
|
||||||
</el-collapse>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="side-panel">
|
<div v-else class="editor-empty">
|
||||||
<AdminResultCard label="店铺总数" :value="kuaishouEticketStats.configuredShopCount">
|
<strong>请选择或新增店铺</strong>
|
||||||
<p>其中 Cookie 就绪 {{ kuaishouEticketStats.cookieReadyCount }} 家。</p>
|
<p>左侧选择店铺后,这里会显示 Cookie、店铺 ID 和识别结果。</p>
|
||||||
</AdminResultCard>
|
|
||||||
<AdminResultCard
|
|
||||||
label="当前调试店铺"
|
|
||||||
:value="
|
|
||||||
activeKuaishouEticketShop?.kshopName || activeKuaishouEticketShop?.shopId || '未选择'
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<p>
|
|
||||||
{{
|
|
||||||
kuaishouEticketStats.selectedShopReady
|
|
||||||
? '已具备调试条件,可直接查询核销信息。'
|
|
||||||
: '请选择店铺并补全 Cookie。'
|
|
||||||
}}
|
|
||||||
</p>
|
|
||||||
</AdminResultCard>
|
|
||||||
<AdminResultCard
|
|
||||||
label="最近识别结果"
|
|
||||||
:value="
|
|
||||||
kuaishouEticketShopInfoResult?.shop.kshopName ||
|
|
||||||
kuaishouEticketShopInfoResult?.shop.shopId ||
|
|
||||||
'未执行'
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<p v-if="kuaishouEticketShopInfoResult">
|
|
||||||
结算状态 {{ kuaishouEticketShopInfoResult.shop.settleStatus }}
|
|
||||||
</p>
|
|
||||||
<p v-else>可用"读取店铺信息"校验 Cookie 是否属于预期店铺。</p>
|
|
||||||
</AdminResultCard>
|
|
||||||
<AdminResultCard label="建议顺序" value="先配置,再调试">
|
|
||||||
<p>1. 新增店铺并粘贴 Cookie</p>
|
|
||||||
<p>2. 读取店铺信息确认 kshopName / shopId</p>
|
|
||||||
<p>3. 设为调试店铺后查询券码并执行核销</p>
|
|
||||||
</AdminResultCard>
|
|
||||||
</div>
|
</div>
|
||||||
|
</el-form>
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-alert
|
<el-alert
|
||||||
@@ -268,6 +234,10 @@ defineProps<Props>()
|
|||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.shop-workspace :deep(.el-card__body) {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.card-actions {
|
.card-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: var(--space-2);
|
gap: var(--space-2);
|
||||||
@@ -275,50 +245,90 @@ defineProps<Props>()
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shop-panels {
|
.workspace-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1.7fr) minmax(260px, 0.9fr);
|
grid-template-columns: 320px minmax(0, 1fr);
|
||||||
gap: var(--space-4);
|
min-height: 460px;
|
||||||
margin-top: var(--space-4);
|
}
|
||||||
|
|
||||||
|
.shop-sidebar {
|
||||||
|
display: grid;
|
||||||
|
grid-template-rows: auto minmax(0, 1fr);
|
||||||
|
gap: var(--space-3);
|
||||||
|
padding: var(--space-4);
|
||||||
|
border-right: 1px solid var(--border-default);
|
||||||
|
background: var(--bg-subtle);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-head,
|
||||||
|
.editor-head,
|
||||||
|
.editor-footer {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: var(--space-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-head strong,
|
||||||
|
.editor-head strong,
|
||||||
|
.compact-empty strong,
|
||||||
|
.editor-empty strong,
|
||||||
|
.recognize-result strong {
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-head p,
|
||||||
|
.editor-head p,
|
||||||
|
.compact-empty p,
|
||||||
|
.editor-empty p {
|
||||||
|
margin: var(--space-1) 0 0;
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: var(--text-xs);
|
||||||
}
|
}
|
||||||
|
|
||||||
.shop-list {
|
.shop-list {
|
||||||
min-width: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.side-panel {
|
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: var(--space-3);
|
gap: var(--space-2);
|
||||||
align-content: start;
|
align-content: start;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding-right: var(--space-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.shop-panel.is-debug {
|
.shop-item {
|
||||||
border: 1px solid var(--border-hover);
|
display: grid;
|
||||||
border-radius: var(--radius-md);
|
grid-template-columns: 42px minmax(0, 1fr);
|
||||||
}
|
|
||||||
|
|
||||||
.shop-title-bar {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: var(--space-3);
|
gap: var(--space-3);
|
||||||
flex: 1;
|
width: 100%;
|
||||||
min-width: 0;
|
padding: var(--space-3);
|
||||||
padding-right: var(--space-4);
|
border: 1px solid transparent;
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
background: transparent;
|
||||||
|
color: inherit;
|
||||||
|
text-align: left;
|
||||||
|
cursor: pointer;
|
||||||
|
transition:
|
||||||
|
border-color 0.2s ease,
|
||||||
|
background 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-item:hover,
|
||||||
|
.shop-item--active {
|
||||||
|
border-color: var(--border-hover);
|
||||||
|
background: var(--bg-card);
|
||||||
}
|
}
|
||||||
|
|
||||||
.shop-avatar {
|
.shop-avatar {
|
||||||
width: 44px;
|
width: 42px;
|
||||||
height: 44px;
|
height: 42px;
|
||||||
|
border: 1px solid var(--border-hover);
|
||||||
border-radius: var(--radius-md);
|
border-radius: var(--radius-md);
|
||||||
overflow: hidden;
|
background: #eef6ff;
|
||||||
background: linear-gradient(135deg, #dbeafe, #eff6ff);
|
|
||||||
color: var(--color-primary-dark);
|
color: var(--color-primary-dark);
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 800;
|
|
||||||
display: grid;
|
display: grid;
|
||||||
place-items: center;
|
place-items: center;
|
||||||
flex-shrink: 0;
|
overflow: hidden;
|
||||||
border: 1px solid var(--border-hover);
|
font-size: 17px;
|
||||||
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shop-avatar img {
|
.shop-avatar img {
|
||||||
@@ -327,59 +337,134 @@ defineProps<Props>()
|
|||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shop-info {
|
.shop-summary {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shop-name-row {
|
.shop-name {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: var(--space-2);
|
gap: var(--space-2);
|
||||||
flex-wrap: wrap;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shop-meta {
|
.shop-name strong {
|
||||||
display: flex;
|
overflow: hidden;
|
||||||
align-items: center;
|
color: var(--text-primary);
|
||||||
gap: var(--space-2);
|
text-overflow: ellipsis;
|
||||||
flex-wrap: wrap;
|
white-space: nowrap;
|
||||||
font-size: var(--text-xs);
|
}
|
||||||
|
|
||||||
|
.shop-summary p {
|
||||||
|
margin: 2px 0 0;
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
margin-top: 2px;
|
font-size: var(--text-xs);
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shop-footer {
|
.shop-flags {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
gap: var(--space-2);
|
||||||
align-items: flex-start;
|
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: var(--space-3);
|
margin-top: var(--space-2);
|
||||||
margin-top: var(--space-3);
|
color: var(--text-muted);
|
||||||
padding-top: var(--space-3);
|
font-size: var(--text-xs);
|
||||||
border-top: 1px solid var(--border-default);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-left {
|
.shop-flags .is-ok {
|
||||||
display: flex;
|
color: var(--color-success);
|
||||||
align-items: center;
|
|
||||||
gap: var(--space-3);
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.compact-empty,
|
||||||
|
.editor-empty {
|
||||||
|
display: grid;
|
||||||
|
place-items: start;
|
||||||
|
align-content: center;
|
||||||
|
gap: var(--space-2);
|
||||||
|
min-height: 220px;
|
||||||
|
padding: var(--space-4);
|
||||||
|
border: 1px dashed var(--border-default);
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
background: var(--bg-card);
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-editor {
|
||||||
|
min-width: 0;
|
||||||
|
padding: var(--space-5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-form {
|
||||||
|
display: grid;
|
||||||
|
gap: var(--space-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.base-row {
|
||||||
|
max-width: 560px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-head {
|
||||||
|
padding: var(--space-4);
|
||||||
|
border: 1px solid var(--border-default);
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
background: var(--bg-subtle);
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-actions,
|
||||||
.footer-actions {
|
.footer-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
gap: var(--space-2);
|
gap: var(--space-2);
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-muted {
|
.form-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
|
gap: var(--space-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-footer {
|
||||||
|
align-items: flex-end;
|
||||||
|
padding-top: var(--space-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recognize-result {
|
||||||
|
display: grid;
|
||||||
|
gap: 2px;
|
||||||
|
color: var(--text-muted);
|
||||||
font-size: var(--text-xs);
|
font-size: var(--text-xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recognize-result small {
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 900px) {
|
@media (max-width: 980px) {
|
||||||
.shop-panels {
|
.workspace-grid {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.shop-sidebar {
|
||||||
|
border-right: 0;
|
||||||
|
border-bottom: 1px solid var(--border-default);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 640px) {
|
||||||
|
.shop-editor {
|
||||||
|
padding: var(--space-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-head,
|
||||||
|
.editor-footer {
|
||||||
|
align-items: stretch;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
-8
@@ -43,10 +43,6 @@ type Props = {
|
|||||||
kuaishouEticketStats: KuaishouEticketStats
|
kuaishouEticketStats: KuaishouEticketStats
|
||||||
addKuaishouEticketShop: () => void
|
addKuaishouEticketShop: () => void
|
||||||
removeKuaishouEticketShop: (id: string) => void
|
removeKuaishouEticketShop: (id: string) => void
|
||||||
isKuaishouEticketShopExpanded: (id: string) => boolean
|
|
||||||
toggleKuaishouEticketShop: (id: string) => void
|
|
||||||
expandAllKuaishouEticketShops: () => void
|
|
||||||
collapseAllKuaishouEticketShops: () => void
|
|
||||||
setKuaishouEticketDebugShop: (id: string) => void
|
setKuaishouEticketDebugShop: (id: string) => void
|
||||||
describeKuaishouEticketShop: (shop: EditableKuaishouEticketShop) => string
|
describeKuaishouEticketShop: (shop: EditableKuaishouEticketShop) => string
|
||||||
getKuaishouEticketShopInitial: (shop: EditableKuaishouEticketShop) => string
|
getKuaishouEticketShopInitial: (shop: EditableKuaishouEticketShop) => string
|
||||||
@@ -74,10 +70,6 @@ defineProps<Props>()
|
|||||||
:kuaishou-eticket-stats="kuaishouEticketStats"
|
:kuaishou-eticket-stats="kuaishouEticketStats"
|
||||||
:add-kuaishou-eticket-shop="addKuaishouEticketShop"
|
:add-kuaishou-eticket-shop="addKuaishouEticketShop"
|
||||||
:remove-kuaishou-eticket-shop="removeKuaishouEticketShop"
|
:remove-kuaishou-eticket-shop="removeKuaishouEticketShop"
|
||||||
:is-kuaishou-eticket-shop-expanded="isKuaishouEticketShopExpanded"
|
|
||||||
:toggle-kuaishou-eticket-shop="toggleKuaishouEticketShop"
|
|
||||||
:expand-all-kuaishou-eticket-shops="expandAllKuaishouEticketShops"
|
|
||||||
:collapse-all-kuaishou-eticket-shops="collapseAllKuaishouEticketShops"
|
|
||||||
:set-kuaishou-eticket-debug-shop="setKuaishouEticketDebugShop"
|
:set-kuaishou-eticket-debug-shop="setKuaishouEticketDebugShop"
|
||||||
:describe-kuaishou-eticket-shop="describeKuaishouEticketShop"
|
:describe-kuaishou-eticket-shop="describeKuaishouEticketShop"
|
||||||
:get-kuaishou-eticket-shop-initial="getKuaishouEticketShopInitial"
|
:get-kuaishou-eticket-shop-initial="getKuaishouEticketShopInitial"
|
||||||
|
|||||||
-14
@@ -81,9 +81,6 @@ export function useAdminKuaishouEticketPlatform() {
|
|||||||
storeId: '0',
|
storeId: '0',
|
||||||
}
|
}
|
||||||
kuaishouEticketForm.value.selectedShopId = shopManager.kuaishouEticketShops.value[0]?.id || ''
|
kuaishouEticketForm.value.selectedShopId = shopManager.kuaishouEticketShops.value[0]?.id || ''
|
||||||
shopManager.expandedKuaishouEticketShopIds.value = shopManager.kuaishouEticketShops.value[0]?.id
|
|
||||||
? [shopManager.kuaishouEticketShops.value[0].id]
|
|
||||||
: []
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildKuaishouEticketConfigPayload(): AdminKuaishouEticketSourceConfig {
|
function buildKuaishouEticketConfigPayload(): AdminKuaishouEticketSourceConfig {
|
||||||
@@ -116,7 +113,6 @@ export function useAdminKuaishouEticketPlatform() {
|
|||||||
|
|
||||||
function setKuaishouEticketDebugShop(id: string) {
|
function setKuaishouEticketDebugShop(id: string) {
|
||||||
kuaishouEticketForm.value.selectedShopId = id
|
kuaishouEticketForm.value.selectedShopId = id
|
||||||
shopManager.expandKuaishouEticketShop(id)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function ensureSelectedKuaishouEticketShop() {
|
function ensureSelectedKuaishouEticketShop() {
|
||||||
@@ -229,9 +225,6 @@ export function useAdminKuaishouEticketPlatform() {
|
|||||||
shopManager.findShopByShopId(previousSelectedShopId)?.id ||
|
shopManager.findShopByShopId(previousSelectedShopId)?.id ||
|
||||||
shopManager.kuaishouEticketShops.value[0]?.id ||
|
shopManager.kuaishouEticketShops.value[0]?.id ||
|
||||||
''
|
''
|
||||||
shopManager.expandedKuaishouEticketShopIds.value = kuaishouEticketForm.value.selectedShopId
|
|
||||||
? [kuaishouEticketForm.value.selectedShopId]
|
|
||||||
: []
|
|
||||||
showSuccess('快手小店核销配置已保存')
|
showSuccess('快手小店核销配置已保存')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
kuaishouEticketResultError.value =
|
kuaishouEticketResultError.value =
|
||||||
@@ -310,7 +303,6 @@ export function useAdminKuaishouEticketPlatform() {
|
|||||||
return {
|
return {
|
||||||
kuaishouEticketFilePath,
|
kuaishouEticketFilePath,
|
||||||
kuaishouEticketShops: shopManager.kuaishouEticketShops,
|
kuaishouEticketShops: shopManager.kuaishouEticketShops,
|
||||||
expandedKuaishouEticketShopIds: shopManager.expandedKuaishouEticketShopIds,
|
|
||||||
kuaishouEticketForm,
|
kuaishouEticketForm,
|
||||||
kuaishouEticketSaving,
|
kuaishouEticketSaving,
|
||||||
kuaishouEticketResolvingShopId,
|
kuaishouEticketResolvingShopId,
|
||||||
@@ -325,12 +317,6 @@ export function useAdminKuaishouEticketPlatform() {
|
|||||||
hydrateKuaishouEticketConfig,
|
hydrateKuaishouEticketConfig,
|
||||||
addKuaishouEticketShop,
|
addKuaishouEticketShop,
|
||||||
removeKuaishouEticketShop,
|
removeKuaishouEticketShop,
|
||||||
isKuaishouEticketShopExpanded: shopManager.isKuaishouEticketShopExpanded,
|
|
||||||
expandKuaishouEticketShop: shopManager.expandKuaishouEticketShop,
|
|
||||||
collapseKuaishouEticketShop: shopManager.collapseKuaishouEticketShop,
|
|
||||||
toggleKuaishouEticketShop: shopManager.toggleKuaishouEticketShop,
|
|
||||||
expandAllKuaishouEticketShops: shopManager.expandAllKuaishouEticketShops,
|
|
||||||
collapseAllKuaishouEticketShops: shopManager.collapseAllKuaishouEticketShops,
|
|
||||||
setKuaishouEticketDebugShop,
|
setKuaishouEticketDebugShop,
|
||||||
describeKuaishouEticketShop: shopManager.describeKuaishouEticketShop,
|
describeKuaishouEticketShop: shopManager.describeKuaishouEticketShop,
|
||||||
getKuaishouEticketShopInitial: shopManager.getKuaishouEticketShopInitial,
|
getKuaishouEticketShopInitial: shopManager.getKuaishouEticketShopInitial,
|
||||||
|
|||||||
-42
@@ -4,7 +4,6 @@ import type { AdminKuaishouEticketShopConfigItem } from '@/types/admin'
|
|||||||
|
|
||||||
export function useKuaishouEticketShopManager() {
|
export function useKuaishouEticketShopManager() {
|
||||||
const kuaishouEticketShops = ref<EditableKuaishouEticketShop[]>([])
|
const kuaishouEticketShops = ref<EditableKuaishouEticketShop[]>([])
|
||||||
const expandedKuaishouEticketShopIds = ref<string[]>([])
|
|
||||||
|
|
||||||
function addKuaishouEticketShop() {
|
function addKuaishouEticketShop() {
|
||||||
const shop = createEmptyKuaishouEticketShop()
|
const shop = createEmptyKuaishouEticketShop()
|
||||||
@@ -14,46 +13,12 @@ export function useKuaishouEticketShopManager() {
|
|||||||
|
|
||||||
function removeKuaishouEticketShop(id: string, currentSelectedId: string) {
|
function removeKuaishouEticketShop(id: string, currentSelectedId: string) {
|
||||||
kuaishouEticketShops.value = kuaishouEticketShops.value.filter((item) => item.id !== id)
|
kuaishouEticketShops.value = kuaishouEticketShops.value.filter((item) => item.id !== id)
|
||||||
collapseKuaishouEticketShop(id)
|
|
||||||
if (currentSelectedId === id) {
|
if (currentSelectedId === id) {
|
||||||
return kuaishouEticketShops.value[0]?.id || ''
|
return kuaishouEticketShops.value[0]?.id || ''
|
||||||
}
|
}
|
||||||
return currentSelectedId
|
return currentSelectedId
|
||||||
}
|
}
|
||||||
|
|
||||||
function isKuaishouEticketShopExpanded(id: string) {
|
|
||||||
return expandedKuaishouEticketShopIds.value.includes(id)
|
|
||||||
}
|
|
||||||
|
|
||||||
function expandKuaishouEticketShop(id: string) {
|
|
||||||
if (expandedKuaishouEticketShopIds.value.includes(id)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
expandedKuaishouEticketShopIds.value = [id, ...expandedKuaishouEticketShopIds.value]
|
|
||||||
}
|
|
||||||
|
|
||||||
function collapseKuaishouEticketShop(id: string) {
|
|
||||||
expandedKuaishouEticketShopIds.value = expandedKuaishouEticketShopIds.value.filter(
|
|
||||||
(item) => item !== id,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleKuaishouEticketShop(id: string) {
|
|
||||||
if (isKuaishouEticketShopExpanded(id)) {
|
|
||||||
collapseKuaishouEticketShop(id)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
expandKuaishouEticketShop(id)
|
|
||||||
}
|
|
||||||
|
|
||||||
function expandAllKuaishouEticketShops() {
|
|
||||||
expandedKuaishouEticketShopIds.value = kuaishouEticketShops.value.map((item) => item.id)
|
|
||||||
}
|
|
||||||
|
|
||||||
function collapseAllKuaishouEticketShops() {
|
|
||||||
expandedKuaishouEticketShopIds.value = []
|
|
||||||
}
|
|
||||||
|
|
||||||
function describeKuaishouEticketShop(shop: EditableKuaishouEticketShop) {
|
function describeKuaishouEticketShop(shop: EditableKuaishouEticketShop) {
|
||||||
const status = shop.cookie.trim() ? 'Cookie 已就绪' : '待补 Cookie'
|
const status = shop.cookie.trim() ? 'Cookie 已就绪' : '待补 Cookie'
|
||||||
const identity = shop.shopId.trim() ? '已识别店铺' : '待读取信息'
|
const identity = shop.shopId.trim() ? '已识别店铺' : '待读取信息'
|
||||||
@@ -76,15 +41,8 @@ export function useKuaishouEticketShopManager() {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
kuaishouEticketShops,
|
kuaishouEticketShops,
|
||||||
expandedKuaishouEticketShopIds,
|
|
||||||
addKuaishouEticketShop,
|
addKuaishouEticketShop,
|
||||||
removeKuaishouEticketShop,
|
removeKuaishouEticketShop,
|
||||||
isKuaishouEticketShopExpanded,
|
|
||||||
expandKuaishouEticketShop,
|
|
||||||
collapseKuaishouEticketShop,
|
|
||||||
toggleKuaishouEticketShop,
|
|
||||||
expandAllKuaishouEticketShops,
|
|
||||||
collapseAllKuaishouEticketShops,
|
|
||||||
describeKuaishouEticketShop,
|
describeKuaishouEticketShop,
|
||||||
getKuaishouEticketShopInitial,
|
getKuaishouEticketShopInitial,
|
||||||
setShopsFromConfig,
|
setShopsFromConfig,
|
||||||
|
|||||||
Reference in New Issue
Block a user