Files
IOT_SIM/web/src/samples.ts
T
xuyueandClaude Opus 5.5 61a32e900d
CI/CD / test (push) Canceled after 0s
CI/CD / deploy (push) Canceled after 0s
实验下拉菜单按项目分组;路线图更新到已上线、待一个班试用
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 21:39:40 +08:00

35 lines
1.6 KiB
TypeScript

// 实验下拉菜单:按教材的项目分组,组名是项目名,组里每项只写"任务N …";选中后框里显示完整标题
import { h } from 'vue'
import type { SelectGroupOption, SelectOption, SelectRenderTag } from 'naive-ui'
/** 教材 8 个项目的名称(去掉"智慧校园系统——"前缀) */
const PROJECTS: Record<string, string> = {
1: 'C#入门基础',
2: '环境监测模块',
3: '智慧路灯控制模块',
4: '入侵信息监测模块',
5: '灾情信息监测模块',
6: '数据存储模块',
7: '情景控制模块',
8: '智慧校园管理平台',
}
/** 实验标题形如"项目3 任务2 实现人体红外传感器和路灯联动",按项目分组;不是这种格式的放进"其他" */
export function sampleOptions(list: { id: string; title: string }[]): SelectGroupOption[] {
const groups = new Map<string, SelectGroupOption & { children: SelectOption[] }>()
for (const s of list) {
const m = /^项目(\d+)\s*(.*)$/.exec(s.title)
const key = m ? m[1]! : '其他'
let group = groups.get(key)
if (!group) {
group = { type: 'group', key, label: m ? `项目${key} ${PROJECTS[key] ?? ''}`.trim() : '其他', children: [] }
groups.set(key, group)
}
group.children.push({ label: m ? m[2] : s.title, value: s.id, title: s.title })
}
return [...groups.values()]
}
/** 选择框里显示完整标题(带项目号),下拉列表里仍是简短的"任务N …" */
export const renderSampleTag: SelectRenderTag = ({ option }) => h('span', { title: option.title as string }, option.title as string)