feat: 商业核算+个人库存+认证优化
All checks were successful
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Successful in 5s
Test / build-check (push) Successful in 4s
PR Preview / test (pull_request) Successful in 6s
PR Preview / deploy-preview (pull_request) Successful in 16s
Test / e2e-test (push) Successful in 49s

商业核算:
- 加标语和示意项目(芳香调理),所有人可体验
- 管理员开放(不需认证)
- 新增项目需认证,未认证提示

个人库存:
- 搜索直接添加(回车或点击)
- 4个套装快捷按钮(家庭医生/居家呵护3988/芳香调理/全精油)
- 精油库默认折叠
- 配方匹配排除椰子油,降低门槛(至少1种匹配)

商业认证:
- 简化为商户名+证明图片
- 通过后内容仍显示(和二维码页面一致)
- 审核中内容不可修改

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-10 22:47:33 +00:00
parent 76c9316ede
commit 3dd75f34c0
3 changed files with 222 additions and 82 deletions

View File

@@ -1,12 +1,29 @@
<template>
<div class="projects-page">
<!-- Header -->
<div class="commercial-header">
<div class="commercial-icon">💼</div>
<div class="commercial-desc">商业用户专属功能包含项目核算成本分析等工具</div>
</div>
<!-- Project List -->
<div class="toolbar">
<h3 class="page-title">💼 商业核算</h3>
<button v-if="auth.isBusiness" class="btn-primary" @click="createProject">+ 项目</button>
<h3 class="page-title">📊 服务项目成本利润分析</h3>
<button class="btn-primary btn-sm" @click="handleCreateProject">+ 项目</button>
</div>
<div v-if="!selectedProject" class="project-list">
<!-- Demo project (always visible) -->
<div class="project-card demo-card" @click="openDemo">
<div class="proj-header">
<span class="proj-name">芳香调理示意</span>
<span class="proj-badge">体验</span>
</div>
<div class="proj-summary">
<span>点击查看示意项目</span>
</div>
</div>
<!-- Real projects -->
<div
v-for="p in projects"
:key="p._id || p.id"
@@ -27,7 +44,6 @@
<button class="btn-icon-sm" @click="deleteProject(p)" title="删除">🗑</button>
</div>
</div>
<div v-if="projects.length === 0" class="empty-hint">暂无项目点击上方创建</div>
</div>
<!-- Project Detail -->
@@ -244,6 +260,34 @@ async function loadProjects() {
}
}
function handleCreateProject() {
if (!auth.isBusiness && !auth.isAdmin) {
showCertPrompt()
return
}
createProject()
}
// Demo project data (local only, per user)
const demoProject = ref(null)
function openDemo() {
demoProject.value = {
_demo: true,
name: '芳香调理(示意)',
ingredients: [
{ oil: '芳香调理', drops: 12 },
{ oil: '椰子油', drops: 186 },
],
packaging_cost: 5,
labor_cost: 30,
other_cost: 10,
selling_price: 198,
quantity: 1,
notes: '这是一个示意项目,您可以修改数字体验功能',
}
selectedProject.value = demoProject.value
}
async function createProject() {
const name = await showPrompt('项目名称:', '新项目')
if (!name) return
@@ -273,7 +317,7 @@ async function createProject() {
}
function selectProject(p) {
if (!auth.isBusiness) {
if (!auth.isBusiness && !auth.isAdmin) {
showCertPrompt()
return
}
@@ -383,6 +427,16 @@ function formatDate(d) {
padding: 0 12px 24px;
}
.commercial-header {
text-align: center; padding: 24px 16px 16px; margin-bottom: 16px;
}
.commercial-icon { font-size: 48px; margin-bottom: 8px; }
.commercial-desc { font-size: 14px; color: var(--text-light, #999); }
.demo-card { border-style: dashed !important; opacity: 0.85; }
.proj-badge {
font-size: 10px; background: #fff3e0; color: #e65100; padding: 2px 8px; border-radius: 8px;
}
.toolbar {
display: flex;
align-items: center;