在鸿蒙PC上,学生常常需要在教务系统、班级群、图书馆等多个入口之间切换信息。大语言模型的成熟,使得通过自然语言一句话获取答案成为可能。本文完整记录一款「智慧校园助手」应用在鸿蒙PC(HUAWEI MateBook Pro)上的开发过程,涵盖架构设计、大模型接入、五大功能模块实现以及真机运行适配,所有代码均使用ArkTS/ArkUI,在DevEco Studio中编译并跑在鸿蒙PC上。
一、总体架构
应用采用四层结构:EntryAbility层负责生命周期与初始化;common层统一管理主题与AI配置;model层封装网络请求与数据持久化;pages层包含五个功能页和一个Tab主壳。这种分层实现了关注点分离,UI层不直接操作网络和存储,数据请求全部收敛到model层。
二、大模型接入层
这是智能核心。所有配置集中在AIConfig类中。采用OpenAI兼容的chat/completions接口,应用不绑定特定模型服务商,更换服务只需修改endpoint和model。通过systemPrompt将模型约束为校园助手角色。AIService类使用@kit.NetworkKit的http模块发起POST请求,请求体需显式定义接口(ArkTS严格模式不允许无类型对象字面量)。每次请求携带完整历史消息以支持多轮对话,设置了30秒超时与异常兜底,finally中调用req.destroy()释放资源。响应解析从JSON中提取choices[0].message.content。
三、功能模块实现
1. AI对话助手:通过@State维护Bubble数组,每个Bubble含role、content、loading字段。用户发送后先插入loading占位气泡显示“正在思考…”,真实回复返回后替换。使用this.bubbles = this.bubbles.slice()触发UI刷新。用于构建聊天气泡,用户消息靠右蓝色,助手消息靠左白底,发送后自动滚动到底部。
2. 课程表:数据模型包含课程名、教师、地点、周几、起始节次、结束节次、配色索引。使用Preferences轻量键值存储做持久化,首次运行时自动写入示例课程。课表网格左侧节次列,右侧7天列,每个课程根据起止节次绝对定位高度和上边距,不同课程轮转配色。
3. 校园问答:采用预置答案+AI兜底的混合模式。高频问题有本地预置答案,点击秒开;其他问题标记为AI,实时调用大模型生成回答。这种设计兼顾体验与成本。
4. 待办日程:支持作业、考试、事项三类,按截止时间排序,临期(不到2天)标红提醒,不同类型用不同颜色标签。左滑删除,点击圆形勾选完成。
5. 我的与设置:展示个人信息、统计卡片,提供模型服务配置功能,允许用户运行时覆盖API密钥和模型名,覆盖值存入AppStorage,AIService优先使用。
四、PC适配实践
这是项目区别于手机Demo的重点。在module.json5中声明deviceTypes包含"phone", "tablet", "2in1"。关键适配点:
- 全程弹性布局:宽度使用layoutWeight、百分比与Flex自动换行,不写死像素值,保证窗口大小变化时内容自然铺展。
- 安全区适配:EntryAbility中计算系统状态栏和导航条的安全区,存入全局@StorageProp,各页面统一避让,覆盖手机刘海到PC窗口边框的差异。
- 键鼠交互:ArkUI事件自动映射到鼠标键盘,AI对话输入框在PC上用物理键盘输入、回车发送,适合大量文字录入。
- 大屏信息密度:五Tab结构+卡片式布局,在PC窗口中从容显示,减少滚动。
五、主壳与部署
使用Tabs组件组织五个页面,底部导航。应用在DevEco Studio中连接HUAWEI MateBook Pro真机,SDK版本为HarmonyOS 6.1.0,直接Run即可看到窗口化运行效果。所有截图均来自鸿蒙PC真机,同一套ArkTS代码无需单独适配即可覆盖手机、平板和PC。
- // 配置示例:AIConfig类
- export class AIConfig {
- static readonly endpoint: string = 'https://xxxxxxxx/compatible-mode/v1/chat/completions';
- static readonly apiKey: string = 'sk-****************';
- static readonly model: string = 'qwen-plus';
- static readonly systemPrompt: string = '你是"智慧校园助手",一款面向高校学生的智能助手。...';
- static readonly temperature: number = 0.7;
- static readonly maxTokens: number = 800;
- static readonly timeoutMs: number = 30000;
- }
复制代码- // AIService核心方法
- export class AIService {
- static async chat(history: ChatMessage[]): Promise<string> {
- const messages: ChatMessage[] = [
- { role: 'system', content: AIConfig.systemPrompt }
- ];
- for (const m of history) {
- messages.push(m);
- }
- const body: ChatRequest = {
- model: currentModel(),
- messages: messages,
- temperature: AIConfig.temperature,
- max_tokens: AIConfig.maxTokens
- };
- const req = http.createHttp();
- try {
- const resp = await req.request(AIConfig.endpoint, {
- method: http.RequestMethod.POST,
- header: {
- 'Content-Type': 'application/json',
- 'Authorization': 'Bearer ' + currentKey()
- },
- extraData: JSON.stringify(body),
- connectTimeout: AIConfig.timeoutMs,
- readTimeout: AIConfig.timeoutMs
- });
- if (resp.responseCode !== 200) {
- return `(请求失败:${resp.responseCode})请检查网络或服务配置。`;
- }
- const text = AIService.parseContent(`${resp.result}`);
- return text !== '' ? text : '(助手暂时没有返回内容,请重试)';
- } catch (e) {
- return '(网络异常)请检查设备网络连接后重试。';
- } finally {
- req.destroy();
- }
- }
- }
复制代码
通过以上实践,开发者可以在鸿蒙PC上快速搭建一个集成本地数据管理与云端AI能力的智能校园助手应用,并充分利用PC的大屏和键鼠交互优势。 |