feat: v0.7 全功能复刻与前端适配

后端:
- 产品价格本模块(型材/玻璃/五金/配件, 供报价取价)
- 报价单模块(BJ单号, 手动报价/样板算料/转订单)
- 售后单(问题描述必填, 对齐原站校验)与状态流转
- 量尺单(洞口尺寸清单)与阳光房订单(order_type=1)
- 个人中心: 资料/密码修改/邀请返利(HMC邀请码)
前端:
- 新增8页面: 产品/报价单/售后/量尺/阳光房/商城/使用指南/个人中心
- 登录页注册双Tab, 响应式侧边栏(<900px自动折叠)
- Element Plus 图标全局注册修复
- 共15个页面覆盖原站核心业务路由
This commit is contained in:
HHY
2026-09-20 11:53:31 -07:00
parent 78563267c4
commit b2730af80b
22 changed files with 1404 additions and 29 deletions
+96
View File
@@ -0,0 +1,96 @@
<template>
<el-card>
<div class="toolbar">
<el-select v-model="status" placeholder="全部状态" clearable style="width:140px" @change="load">
<el-option :value="0" label="待处理" /><el-option :value="1" label="处理中" /><el-option :value="2" label="已完成" />
</el-select>
<el-button type="primary" @click="load">查询</el-button>
<div style="flex:1" />
<el-button type="primary" plain @click="openCreate">提交售后</el-button>
</div>
<el-table :data="rows" v-loading="loading" stripe>
<el-table-column prop="id" label="ID" width="70" />
<el-table-column prop="title" label="标题" min-width="120" />
<el-table-column prop="description" label="问题描述" min-width="200" show-overflow-tooltip />
<el-table-column prop="order_no" label="关联订单" width="150" />
<el-table-column label="状态" width="90">
<template #default="{ row }">
<el-tag size="small" :type="(['warning', 'primary', 'success'] as const)[row.status]">
{{ ['待处理', '处理中', '已完成'][row.status] }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="created_at" label="提交时间" width="170" />
<el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button v-if="row.status !== 2" size="small" @click="advance(row)">
{{ row.status === 0 ? '开始处理' : '完成' }}</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination style="margin-top:12px; justify-content:flex-end" background layout="total, prev, pager, next"
:total="total" :page-size="page_size" v-model:current-page="page" @current-change="load" />
<el-dialog v-model="createVisible" title="提交售后" width="520px">
<el-form :model="form" label-width="80px">
<el-form-item label="标题"><el-input v-model="form.title" /></el-form-item>
<el-form-item label="问题描述"><el-input v-model="form.description" type="textarea" :rows="3" /></el-form-item>
<el-form-item label="关联订单"><el-input v-model="form.order_no" placeholder="订单号(可选)" /></el-form-item>
</el-form>
<template #footer>
<el-button @click="createVisible = false">取消</el-button>
<el-button type="primary" @click="save">提交</el-button>
</template>
</el-dialog>
</el-card>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import { api } from '../api'
const rows = ref<any[]>([])
const total = ref(0)
const page = ref(1)
const page_size = 15
const status = ref<number | undefined>()
const loading = ref(false)
const createVisible = ref(false)
const form = reactive({ title: '', description: '', order_no: '' })
async function load() {
loading.value = true
try {
const qs = `page=${page.value}&page_size=${page_size}${status.value !== undefined ? `&status=${status.value}` : ''}`
const d = await api<any>('get', `/api/after_sales?${qs}`)
rows.value = d.data
total.value = d.total
} finally { loading.value = false }
}
function openCreate() {
Object.assign(form, { title: '', description: '', order_no: '' })
createVisible.value = true
}
async function save() {
if (!form.description.trim()) return ElMessage.warning('问题描述必填')
await api('post', '/api/after_sales', form)
ElMessage.success('已提交')
createVisible.value = false
load()
}
async function advance(row: any) {
const next = row.status === 0 ? 1 : 2
await api('put', `/api/after_sales/${row.id}`, { status: next })
ElMessage.success('状态已更新')
load()
}
onMounted(load)
</script>
<style scoped>
.toolbar { display: flex; gap: 10px; margin-bottom: 12px; }
</style>