From 6b7fd0ec95cc73e45f170e1ff04f689fbb60d5a5 Mon Sep 17 00:00:00 2001 From: Pine Date: Tue, 18 Aug 2026 06:17:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20AI=20=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=E9=A2=84=E8=AE=BE=E9=97=AE=E9=A2=98=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E5=9B=AD=E5=8C=BA=E6=A6=82=E8=A7=88?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/routers.py | 73 +++++++++++++ src/components/Building3D.jsx | 32 ++++++ src/components/Icons.jsx | 5 +- src/components/PageHeader.jsx | 10 +- src/components/ParkOverviewStrip.jsx | 16 +-- src/components/PromptPanel.jsx | 86 +++++++++++++++ src/pages/AiAssistant.jsx | 10 +- src/pages/DataScreen.jsx | 2 +- src/styles/datascreen.css | 51 ++++++++- src/voice/markdown.jsx | 156 +++++++++++++++++++++++++++ 10 files changed, 420 insertions(+), 21 deletions(-) create mode 100644 src/components/PromptPanel.jsx create mode 100644 src/voice/markdown.jsx diff --git a/backend/app/routers.py b/backend/app/routers.py index 8f3ef8c..57ac19c 100644 --- a/backend/app/routers.py +++ b/backend/app/routers.py @@ -323,6 +323,79 @@ async def park_zones(): # ==================== AI 对话(通义千问 + 工具调用) ==================== +# 预设问题(围绕昆明市大学生创业园 / OPC 园区性质设计,前端从后端读取) +AI_GROUPED_QUESTIONS = [ + { + "title": "入驻与流程", + "questions": [ + "如何申请入驻园区?", + "园区入驻的条件有哪些?", + "入驻需要准备哪些材料?", + "入驻流程是怎样的?", + "入驻评审如何打分?", + "入驻需要多长时间?", + ], + }, + { + "title": "政策与扶持", + "questions": [ + "园区有哪些创业政策扶持?", + "如何申请创业补贴?", + "如何申请创业担保贷款?", + "对高校毕业生有什么优惠?", + "科技成果转化有哪些支持?", + ], + }, + { + "title": "OPC 概念", + "questions": [ + "什么是 OPC?", + "OPC 创业有哪些模式?", + "OPC 适合哪些人?", + "OPC 创业者从哪里开始?", + "OPC 常用的人工智能工具有哪些?", + ], + }, + { + "title": "场地与服务", + "questions": [ + "园区提供哪些免费办公空间?", + "园区有哪些孵化服务?", + "园区提供哪些创业辅导?", + "园区有哪些基础配套?", + "园区可以免费使用哪些资源?", + ], + }, + { + "title": "园区企业介绍", + "questions": [ + "介绍一下园区入驻企业", + "园区有哪些 AI 科技企业?", + "园区有哪些跨境电商企业?", + "园区有哪些生物医药企业?", + "介绍一下云南派音人工智能科技", + "介绍一下米勒克尔蓝宝石珠宝", + "介绍一下研X同行者网络", + ], + }, +] + +AI_OPC_TOOLS = [ + "DeepSeek-V3", "通义千问", "ChatGPT", "豆包", + "Midjourney", "Stable Diffusion", "剪映", "Notion AI", + "WPS AI", "GitHub Copilot", +] + + +@router.get("/api/ai/questions") +async def ai_questions(): + """预设问题列表(围绕园区性质设计,前端右侧面板展示)""" + return { + "groups": AI_GROUPED_QUESTIONS, + "opcTools": AI_OPC_TOOLS, + } + + @router.post("/api/ai/chat") async def ai_chat(body: ChatBody): """大模型对话:工具调用(切页/控制/卡片/通知)经 MQTT 广播到所有大屏 diff --git a/src/components/Building3D.jsx b/src/components/Building3D.jsx index bb21b00..b8c4d7c 100644 --- a/src/components/Building3D.jsx +++ b/src/components/Building3D.jsx @@ -644,6 +644,38 @@ function Building() { walls.push(); walls.push(); + /* ===== 过道/大厅绿植(靠墙摆放 · 严禁穿墙 · 排列整齐) ===== + 每盆绿植按【墙线 wall(x 或 z)+ 内侧方向 side(+1 向过道内侧 / -1)+ 沿墙间距】确定: + 中心离墙 = 冠半径 + 固定余量 0.15,保证完全落在过道地面内、不越墙、不挡门 */ + const plant = (s, wall, side, offset) => ({ + s, + x: wall.kind === 'x' ? wall.v + side * (0.28 * s + 0.18) : offset, + z: wall.kind === 'z' ? wall.v + side * (0.28 * s + 0.18) : offset, + }); + // wall: 沿墙线;offset: 沿该墙线的间距(x 或 z 坐标) + const corridorPlants = [ + // —— H04 竖向过道西墙(x=50,过道 x50-58,内侧 = +x 方向)—— + plant(0.9, { kind: 'x', v: 50 }, 1, 30), + plant(0.8, { kind: 'x', v: 50 }, 1, 29.2), + // —— H02 竖向过道(x50-53)绿植靠东内侧 x≈50.6,沿 z 等距 —— + plant(0.85, { kind: 'x', v: 50.5 }, 1, 20), + plant(0.85, { kind: 'x', v: 50.5 }, 1, 14), + plant(0.85, { kind: 'x', v: 50.5 }, 1, 8), + // —— H03 横向过道北墙(z=28,过道在 z<28,内侧 = -z)—— + // plant(0.9, { kind: 'z', v: 28 }, -1, 48), + // plant(0.9, { kind: 'z', v: 28 }, -1, 54), + // plant(0.9, { kind: 'z', v: 28 }, -1, 56), + // —— 中庭围栏(z=1 北外墙内侧 +z / z=27 南缘内侧 -z)—— + // plant(0.85, { kind: 'z', v: 1 }, 1, 40), + // plant(0.85, { kind: 'z', v: 27 }, -1, 40), + // plant(0.85, { kind: 'z', v: 27 }, -1, 2), + // —— W02 共享工位区南缘(z=32,内侧 = +z 回工位区)—— + plant(0.8, { kind: 'z', v: 32 }, 1, 36), + plant(0.8, { kind: 'z', v: 32 }, 1, 40), + ]; + corridorPlants.forEach((p, i) => { + furniture.push(); + }); return ( diff --git a/src/components/Icons.jsx b/src/components/Icons.jsx index df32c9a..4252d5a 100644 --- a/src/components/Icons.jsx +++ b/src/components/Icons.jsx @@ -12,7 +12,7 @@ import { Volume, VolumeOff, ChevronLeft, ChevronRight, PlayerPlay, PlayerPause, Send, Trash, Eraser, Headset, CircleDot, AlertCircle, Microphone, MicrophoneFilled, MicrophoneOff, MessageCircle, - Camera, CameraOff, HandStop, + Camera, CameraOff, HandStop, Copyright, } from '@appica/icons-react'; /* 名称 → 图标组件映射(推荐的调用方式:icon="bolt") */ @@ -89,6 +89,7 @@ const NAME_MAP = { camera: Camera, 'camera-off': CameraOff, 'hand-stop': HandStop, + copyright: Copyright, }; /** @@ -123,5 +124,5 @@ export { Volume, VolumeOff, ChevronLeft, ChevronRight, PlayerPlay, PlayerPause, Send, Trash, Eraser, Headset, CircleDot, AlertCircle, Microphone, MicrophoneFilled, MicrophoneOff, MessageCircle, - Camera, CameraOff, HandStop, + Camera, CameraOff, HandStop, Copyright, }; diff --git a/src/components/PageHeader.jsx b/src/components/PageHeader.jsx index 331f23d..13adc8d 100644 --- a/src/components/PageHeader.jsx +++ b/src/components/PageHeader.jsx @@ -51,9 +51,15 @@ export default function PageHeader() {

昆明市大学生创业园 · OPC 智能园区数字运营中心

-
云南省首家政府主办大学生创业孵化园区 · 空间+孵化+融资+政策+资源+AI赋能+综合服务 七位一体
+
云南省首家政府主办大学生创业孵化园区 · 空间+孵化+融资+政策+资源+AI赋能+综合服务
-    云南派音人工智能科技有限公司 开发 + + + + 云南派音人工智能科技有限公司 + 开发 + +
{/* 媒体轮播页:页眉内嵌播放控制 */} diff --git a/src/components/ParkOverviewStrip.jsx b/src/components/ParkOverviewStrip.jsx index 0c7870e..c12ea6e 100644 --- a/src/components/ParkOverviewStrip.jsx +++ b/src/components/ParkOverviewStrip.jsx @@ -7,23 +7,23 @@ import { fmtInt, fmtWan } from '../utils/parkData'; export default function ParkOverviewStrip({ d }) { const chips = [ - { icon: 'building', label: '实际入驻企业', value: `${d.projects.inPark} 家` }, + { icon: 'building', label: '入驻企业', value: `${d.projects.inPark} 家` }, { icon: 'users', label: '带动就业', value: `${fmtInt(d.jobs.total)} 人` }, - { icon: 'coin', label: '累计生产经营总额', value: `${d.revenue.total} 万元` }, - { icon: 'chart-line', label: '累计上缴税利', value: `${d.revenue.tax} 万元` }, - { icon: 'wallet', label: '累计投入运营资金', value: `${d.projects.invested} 万元` }, - { icon: 'briefcase', label: '可容纳企业', value: `${d.projects.capacity} 个` }, + { icon: 'coin', label: '经营总额', value: `${d.revenue.total} 万元` }, + { icon: 'chart-line', label: '上缴税利', value: `${d.revenue.tax} 万元` }, + { icon: 'wallet', label: '运营资金', value: `${d.projects.invested} 万元` }, + { icon: 'briefcase', label: '容纳企业', value: `${d.projects.capacity} 个` }, { icon: 'map-pin', label: '园区面积', value: `${d.park.area} ㎡` }, { icon: 'clock', label: '成立时间', value: `${d.park.founded} 年` }, { icon: 'trophy', label: '省级创业园', value: `${d.park.provinceLevel} 年认定` }, - { icon: 'headset', label: '报名电话', value: d.park.phone }, + // { icon: 'headset', label: '报名电话', value: d.park.phone }, ]; return (