feat: 品牌更名、用户管理增强、画像版本管理、对话体验优化
CI / 后端测试 (push) Has been cancelled
CI / 前端构建 (push) Has been cancelled

- 品牌统一为"左右(BossAi)":网页标签、侧边栏、登录页、manifest、后端
- 用户管理:搜索、对话统计、重置密码、激活/停用账号
- 用户画像:确认事实步骤(带入内容+追问内容)、版本历史管理、PUT /profile/me
- 对话历史:按场景分组、保密模式标题处理
- AI助手页面:话题区可收起、模式选择紧凑化、footer免责声明
- 设置页:toggle宽度修复、工单文案改为专家咨询
- 去掉工单功能(前后端)

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
selfrelease
2026-08-30 09:05:31 +08:00
co-authored by Devin
parent 038ab17278
commit 4e2b4666aa
24 changed files with 1623 additions and 333 deletions
+13 -31
View File
@@ -1,17 +1,10 @@
import { useState } from 'react'
import { PageLayout } from '@/components/common/PageLayout'
import { ChatPanel } from '@/components/common/ChatPanel'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Lightbulb, Scale, TrendingUp, Wallet, Store, Handshake, Tag, UserPlus, Repeat } from 'lucide-react'
import { Card, CardContent, CardHeader } from '@/components/ui/card'
import { Wallet, Store, Handshake, Tag, UserPlus, Repeat, ChevronDown } from 'lucide-react'
import { cn } from '@/lib/utils'
const FRAMEWORK = [
{ icon: TrendingUp, title: '预期收益', desc: '各方案的收益估算与时间线' },
{ icon: Scale, title: '主要风险', desc: '每个方案的核心风险点' },
{ icon: Wallet, title: '现金流影响', desc: '对短期和长期现金流的冲击' },
{ icon: Lightbulb, title: '推荐程度', desc: '综合评估后的推荐等级' },
]
/** 决策话题:每个话题对应不同的示例问题 */
const TOPICS = [
{
@@ -85,6 +78,7 @@ const TOPICS = [
/** 经营决策助手:情景推演、方案对比、收益/风险/现金流/推荐程度 */
export function Decisions() {
const [selectedTopic, setSelectedTopic] = useState(0)
const [topicsCollapsed, setTopicsCollapsed] = useState(false)
return (
<PageLayout
@@ -93,25 +87,15 @@ export function Decisions() {
>
<Card>
<CardHeader className="pb-3">
<CardTitle className="text-base">决策推演框架</CardTitle>
</CardHeader>
<CardContent>
<div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
{FRAMEWORK.map((f) => (
<div key={f.title} className="rounded-md border p-3">
<f.icon className="mb-2 h-5 w-5 text-primary" aria-hidden />
<p className="text-sm font-medium">{f.title}</p>
<p className="mt-1 text-xs text-muted-foreground">{f.desc}</p>
</div>
))}
</div>
</CardContent>
</Card>
<Card>
<CardHeader className="pb-3">
<CardTitle className="text-base">决策话题</CardTitle>
<button
onClick={() => setTopicsCollapsed(!topicsCollapsed)}
className="flex items-center gap-1.5 text-base font-semibold transition-opacity hover:opacity-70"
>
<ChevronDown className={cn('h-4 w-4 transition-transform', topicsCollapsed && '-rotate-90')} />
决策话题
</button>
</CardHeader>
{!topicsCollapsed && (
<CardContent>
<div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
{TOPICS.map((t, i) => (
@@ -134,6 +118,7 @@ export function Decisions() {
))}
</div>
</CardContent>
)}
</Card>
<ChatPanel
@@ -144,11 +129,8 @@ export function Decisions() {
placeholder={`描述你的${TOPICS[selectedTopic].title}问题…`}
showRiskCard={false}
enableUpload={false}
footer="AI 提供情景推演和利弊分析,最终决策由老板做出。"
/>
<p className="text-center text-xs text-muted-foreground">
AI 提供情景推演和利弊分析,最终决策由老板做出。
</p>
</PageLayout>
)
}