在这里插入图片描述

每日一句正能量

不必对全世界失望,百步之内必有芳草。
当你觉得周围全是荆棘,提醒自己:美好不会很远,可能就在下一个转角。

在这里插入图片描述

标记:参与方向三「毕业季 · 鸿蒙同行」文章投稿。

一、选题背景:为什么毕业设计适合做“智慧校园导航”

每年毕业季,我都会在校企合作课程里遇到一个很典型的问题:学生希望毕业设计既有技术含量,又能落到真实场景;企业导师希望项目不要停留在“页面展示”,而是能体现移动端工程能力、用户体验设计和系统架构能力。

“智慧校园导航系统”正好处在这两个需求的交叉点。

对新生来说,开学第一周最常见的痛点不是“没有地图”,而是“地图不懂校园”:教学楼有简称,实验室有门禁,活动地点会临时变更,食堂和校医院在高峰期有明显时间差;对老师和访客来说,校园内部道路、停车点、会议室、无障碍路线同样需要更贴近场景的导航。传统地图解决的是城市级路径,而智慧校园导航解决的是“校园知识 + 导航体验 + 多端协同”。

因此,本篇以 HarmonyOS 6.1(API 23) 为目标环境,设计一个增强版毕业设计方案:不仅实现校园地图浏览和路径规划,还加入 AI 智能问路、Intent Framework 一键导航、元服务快速入口、手机到平板的跨设备接续、课程表联动、活动推荐、离线缓存与无障碍路线推荐。项目既适合毕业答辩展示,也适合作为校企合作课程中的综合实训案例。

二、需求分析:从“能导航”升级到“会理解校园”

本系统的用户分为四类:

  1. 学生用户:查看课程地点、快速导航到教室、查询食堂/图书馆/实验室。
  2. 教师用户:会议室导航、实验室预约地点导航、课程地点变更提醒。
  3. 访客用户:校门到学院楼、停车场到会议地点、无障碍路线。
  4. 管理员用户:维护楼宇、POI、活动地点、道路状态和推荐内容。

围绕这些角色,系统划分为八个核心功能:

  • 校园地图浏览:展示教学楼、宿舍、食堂、运动场、图书馆等 POI。
  • 智能路线规划:支持最短路线、少楼梯路线、夜间安全路线。
  • AI 智能问路:支持“从东门到物联网实验室怎么走”这类自然语言输入。
  • 课程表联动:从课程卡片直接进入教室导航。
  • HarmonyOS 意图直达:通过搜索、语音或系统入口触发“导航到图书馆”。
  • 元服务入口:迎新、访客、活动场景可快速进入导航服务。
  • 跨设备接续:手机发起导航,平板展示校园总览和路线详情。
  • 离线缓存与无障碍:在网络不稳定或特殊用户场景下保障可用性。

在这里插入图片描述

三、HarmonyOS 6.1 技术选型

本案例采用以下技术栈:

  • ArkTS:作为主要开发语言,负责页面、状态管理、服务层逻辑。
  • ArkUI:构建声明式 UI,适配手机和平板不同窗口尺寸。
  • Stage Model:通过 UIAbility 管理页面生命周期和入口路由。
  • Intents Kit:将“去图书馆”“导航到 A302”等业务能力暴露为可被系统理解的意图。
  • Location Kit:获取当前位置、监听定位变化、支持到达提醒。
  • Map Kit / POI 能力:承接地图展示、地点详情和位置检索。
  • ArkData / 分布式数据同步:同步路线令牌、收藏地点、历史路线等轻量数据。
  • 元服务与服务卡片:把校园导航入口前置到迎新、活动、访客等高频场景。

在毕业设计中,最重要的不是堆 API,而是说明“为什么这样分层”。因此我建议把系统拆成四层:入口层、业务层、能力层和数据层。入口层解决用户从哪里进来,业务层处理导航流程,能力层封装 HarmonyOS 能力,数据层沉淀校园知识。

在这里插入图片描述

四、系统总体架构设计

系统采用“端侧优先 + 校园数据服务 + 管理后台”的架构。

端侧 App 负责地图展示、路线渲染、离线缓存、意图接收、页面交互和跨端接续;校园数据服务负责 POI、楼宇、路线图谱、活动地点和通知内容;管理后台负责数据维护、活动发布、路线审核和运营看板。

这种设计有三个好处:

第一,端侧体验稳定。常用 POI 和路线图谱可缓存到本地,网络抖动时仍可搜索教学楼和查看历史路线。

第二,后台可维护。学校道路施工、活动地点变更、临时封路等信息可以通过管理后台更新,而不是重新发版。

第三,适合毕业答辩。学生可以在答辩中清楚展示客户端、服务端、后台和 HarmonyOS 能力之间的关系,避免项目看起来只是几个页面。

在这里插入图片描述

五、数据模型设计

校园导航系统的核心不是地图图片,而是结构化校园数据。建议至少设计四张表或四类实体:

export interface CampusPoi {
  id: string
  name: string
  alias: string[]
  category: 'building' | 'classroom' | 'canteen' | 'library' | 'lab' | 'office'
  latitude: number
  longitude: number
  floor?: number
  tags: string[]
  openTime?: string
  accessible: boolean
}

export interface CampusRouteNode {
  id: string
  poiId?: string
  latitude: number
  longitude: number
  floor?: number
  nodeType: 'gate' | 'road' | 'stairs' | 'elevator' | 'classroom' | 'service'
}

export interface CampusRouteEdge {
  from: string
  to: string
  distance: number
  cost: number
  accessibleCost: number
  nightSafeCost: number
}

export interface CourseNavigationTask {
  courseName: string
  classroom: string
  startTime: string
  targetPoiId: string
}

这里有一个教学上的重点:路线规划不是简单地把经纬度连线,而是把校园道路抽象成图结构。对于普通路线,使用 distance + cost;对于无障碍路线,提高楼梯节点的代价,优先选择电梯或坡道;对于夜间路线,提高偏僻小路的代价,优先选择主干道和照明区域。

六、核心模块拆分

项目建议按以下目录组织:

entry/src/main/ets/
├── entryability/
│   └── EntryAbility.ets
├── pages/
│   ├── HomePage.ets
│   ├── MapPage.ets
│   ├── RouteDetailPage.ets
│   ├── AskPage.ets
│   └── ProfilePage.ets
├── model/
│   ├── CampusPoi.ets
│   ├── CampusRoute.ets
│   └── CourseTask.ets
├── service/
│   ├── CampusPoiService.ets
│   ├── NavigationService.ets
│   ├── IntentRouter.ets
│   ├── AiQuestionService.ets
│   ├── OfflineCacheService.ets
│   └── DeviceHandoffService.ets
├── component/
│   ├── SearchBar.ets
│   ├── PoiCard.ets
│   ├── RoutePanel.ets
│   └── CampusMapView.ets
└── common/
    ├── PermissionHelper.ets
    ├── Logger.ets
    └── Constants.ets

这个结构适合毕业设计,也适合课堂讲解:页面只负责 UI,服务层负责业务,模型层负责数据结构,common 层封装权限、日志和常量。

七、业务流程:从“问一句”到“开始导航”

用户可以通过三个入口进入导航:搜索框输入、课程表点击、系统意图直达。进入后统一由 CampusIntentRouter 解析为导航任务,再交给 NavigationService 生成路线。

在这里插入图片描述

核心流程如下:

  1. 获取用户输入,例如“带我去图书馆三楼自习区”。
  2. 从自然语言中抽取地点、楼层、时间、路线偏好。
  3. 校验定位权限和网络状态。
  4. 使用 POI 服务匹配“图书馆”“三楼自习区”等别名。
  5. 根据当前位置和目标地点生成路线。
  6. 在手机端展示步行导航,在平板端展示总览地图。
  7. 到达后记录历史路线,支持收藏和反馈。

八、Intents Kit:实现“系统入口一键导航”

在 HarmonyOS 6.1 中,意图框架的价值在于把应用内部能力暴露成系统可理解的业务功能。对于本案例,我们不希望用户每次都打开 App、点击搜索框、输入地点,而是希望用户说一句“导航到图书馆”就可以直接进入路线页。

示例意图配置可以设计为:

{
  "module": {
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "exported": true,
        "skills": [
          {
            "actions": [
              "ohos.want.action.viewData"
            ],
            "uris": [
              {
                "scheme": "campus",
                "host": "navigate",
                "path": "poi"
              }
            ]
          }
        ]
      }
    ]
  }
}

业务侧统一解析 Want 参数:

import { Want } from '@kit.AbilityKit'

export class CampusIntentRouter {
  static parseTarget(want: Want): string {
    const params = want.parameters ?? {}
    const poiName = params['poiName'] as string
    const classroom = params['classroom'] as string
    const keyword = params['keyword'] as string

    if (poiName && poiName.length > 0) {
      return poiName
    }
    if (classroom && classroom.length > 0) {
      return classroom
    }
    if (keyword && keyword.length > 0) {
      return keyword
    }
    return ''
  }

  static buildRouteParam(target: string): Record<string, string> {
    return {
      target,
      source: 'intent',
      routeMode: 'normal'
    }
  }
}

教学建议:答辩时不要只说“用了意图框架”,而要展示它解决了什么问题。这里它解决的是“服务直达”问题,让校园导航不再依赖 App 内的层层点击。

九、AI 智能问路:让系统听懂校园语言

校园问路的难点在于地点表达并不规范。例如“信工楼”“信息楼”“信工院楼”可能指同一个地点,“A302”可能需要结合课程表和学院楼上下文才能定位。

本系统的 AI 智能问路不追求复杂大模型本地化,而是采用“轻量语义解析 + 校园知识库匹配 + 本地路线校验”的方案。

在这里插入图片描述

示例代码如下:

export interface AskResult {
  originText: string
  targetName: string
  routeMode: 'normal' | 'accessible' | 'night'
  confidence: number
}

export class AiQuestionService {
  private poiAliases: Map<string, string> = new Map([
    ['信工楼', '信息工程学院楼'],
    ['信息楼', '信息工程学院楼'],
    ['图书馆自习区', '图书馆'],
    ['二饭', '第二食堂'],
    ['校医务室', '校医院']
  ])

  parseQuestion(question: string): AskResult {
    let routeMode: 'normal' | 'accessible' | 'night' = 'normal'
    if (question.includes('无障碍') || question.includes('少走楼梯')) {
      routeMode = 'accessible'
    }
    if (question.includes('晚上') || question.includes('夜间')) {
      routeMode = 'night'
    }

    let targetName = ''
    this.poiAliases.forEach((standardName, alias) => {
      if (question.includes(alias)) {
        targetName = standardName
      }
    })

    if (!targetName) {
      const match = question.match(/去(.+?)(怎么走|在哪|导航|$)/)
      targetName = match && match[1] ? match[1].trim() : question
    }

    return {
      originText: question,
      targetName,
      routeMode,
      confidence: targetName.length > 0 ? 0.86 : 0.42
    }
  }
}

这个实现很适合毕业设计:可解释、可答辩、可演示,也不会把项目做成不可控的“黑盒 AI”。

十、NavigationService:路线生成核心

路线生成模块需要考虑普通路线、无障碍路线和夜间安全路线。为了便于课堂讲解,可以用 Dijkstra 或 A* 作为核心算法,再根据场景调整边权。

export interface RoutePlan {
  routeId: string
  targetPoi: CampusPoi
  nodes: CampusRouteNode[]
  distance: number
  durationMinute: number
  mode: 'normal' | 'accessible' | 'night'
  tips: string[]
}

export class NavigationService {
  constructor(
    private poiService: CampusPoiService,
    private graph: CampusRouteGraph
  ) {}

  async createPlan(currentLat: number, currentLng: number, targetKeyword: string,
    mode: 'normal' | 'accessible' | 'night'): Promise<RoutePlan> {
    const target = await this.poiService.searchBestMatch(targetKeyword)
    if (!target) {
      throw new Error(`未找到目标地点:${targetKeyword}`)
    }

    const startNode = this.graph.findNearestNode(currentLat, currentLng)
    const endNode = this.graph.findNearestNode(target.latitude, target.longitude)
    const nodes = this.graph.shortestPath(startNode.id, endNode.id, mode)

    const distance = this.calculateDistance(nodes)
    return {
      routeId: `${Date.now()}_${target.id}`,
      targetPoi: target,
      nodes,
      distance,
      durationMinute: Math.ceil(distance / 75),
      mode,
      tips: this.buildTips(nodes, mode)
    }
  }

  private calculateDistance(nodes: CampusRouteNode[]): number {
    let total = 0
    for (let i = 1; i < nodes.length; i++) {
      total += this.graph.distanceBetween(nodes[i - 1].id, nodes[i].id)
    }
    return total
  }

  private buildTips(nodes: CampusRouteNode[], mode: string): string[] {
    const tips: string[] = []
    if (mode === 'accessible') {
      tips.push('已优先选择坡道、电梯和无障碍入口')
    }
    if (mode === 'night') {
      tips.push('已优先选择主干道和照明区域')
    }
    if (nodes.some(node => node.nodeType === 'stairs')) {
      tips.push('路线中包含楼梯,请注意安全')
    }
    return tips
  }
}

十一、ArkUI 页面:手机和平板双端适配

毕业设计答辩时,手机端适合展示“随身导航”,平板端适合展示“路线总览”。ArkUI 的自适应布局可以让同一套业务在不同设备上呈现不同信息密度。

@Entry
@Component
struct HomePage {
  @State keyword: string = ''
  @State quickPois: string[] = ['图书馆', '第二食堂', '校医院', '体育馆']
  @State todayCourse: string = '物联网实验室 A302'

  build() {
    Column() {
      Text('智慧校园导航')
        .fontSize(28)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 24, bottom: 16 })

      TextInput({ placeholder: '搜索教学楼 / 食堂 / 实验室', text: this.keyword })
        .height(48)
        .borderRadius(16)
        .onChange((value: string) => {
          this.keyword = value
        })
        .onSubmit(() => {
          this.openRoute(this.keyword)
        })

      this.CourseCard()

      Grid() {
        ForEach(this.quickPois, (item: string) => {
          GridItem() {
            Button(item)
              .height(48)
              .borderRadius(16)
              .onClick(() => this.openRoute(item))
          }
        })
      }
      .columnsTemplate('1fr 1fr')
      .rowsGap(12)
      .columnsGap(12)
      .margin({ top: 20 })

      Button('AI 智能问路')
        .height(52)
        .margin({ top: 24 })
        .onClick(() => {
          router.pushUrl({ url: 'pages/AskPage' })
        })
    }
    .padding(20)
    .width('100%')
    .height('100%')
  }

  @Builder
  CourseCard() {
    Column({ space: 8 }) {
      Text('今日课程')
        .fontSize(18)
        .fontWeight(FontWeight.Medium)
      Text(`10:10  ${this.todayCourse}`)
        .fontSize(16)
      Button('一键导航到教室')
        .onClick(() => this.openRoute(this.todayCourse))
    }
    .padding(16)
    .borderRadius(20)
    .margin({ top: 20 })
  }

  private openRoute(target: string) {
    if (!target || target.trim().length === 0) {
      return
    }
    router.pushUrl({
      url: 'pages/RouteDetailPage',
      params: { target }
    })
  }
}

这段代码可以作为答辩现场讲解的 UI 主线:搜索、课程、快捷地点、AI 问路四个入口最终都进入同一个路线能力。

十二、跨设备接续:手机发起,平板查看

智慧校园导航非常适合展示 HarmonyOS 的跨设备体验。实际设计中,不建议把整条路线大对象直接塞到 Want 参数里,而是生成一个轻量的 routeToken,再通过同应用数据同步或服务端查询获取完整路线。

在这里插入图片描述

export interface RouteHandoffPayload {
  routeToken: string
  targetPoiId: string
  mode: 'normal' | 'accessible' | 'night'
  createdAt: number
  expireAt: number
}

export class DeviceHandoffService {
  async createHandoff(plan: RoutePlan): Promise<RouteHandoffPayload> {
    const payload: RouteHandoffPayload = {
      routeToken: plan.routeId,
      targetPoiId: plan.targetPoi.id,
      mode: plan.mode,
      createdAt: Date.now(),
      expireAt: Date.now() + 10 * 60 * 1000
    }

    await this.saveToDistributedStore(payload)
    return payload
  }

  async receiveHandoff(routeToken: string): Promise<RoutePlan | null> {
    const payload = await this.readFromDistributedStore(routeToken)
    if (!payload || payload.expireAt < Date.now()) {
      return null
    }
    return await this.restoreRoutePlan(payload)
  }

  private async saveToDistributedStore(payload: RouteHandoffPayload): Promise<void> {
    // 教学示例:实际项目可接入 ArkData 分布式数据库或服务端同步接口
  }

  private async readFromDistributedStore(routeToken: string): Promise<RouteHandoffPayload | null> {
    return null
  }

  private async restoreRoutePlan(payload: RouteHandoffPayload): Promise<RoutePlan | null> {
    return null
  }
}

跨设备接续的答辩亮点在于“轻量同步”:同步的是令牌和状态,不是大图层和大路线对象,这样可以降低冲突、提高安全性,也便于控制过期时间。

十三、离线缓存:校园场景的稳定性保障

校园场景经常遇到网络信号弱、教学楼内定位漂移、迎新期间并发访问高等问题。因此系统需要离线缓存:

  • 常用 POI:教学楼、食堂、图书馆、学院楼。
  • 地图基础数据:校园道路节点、路线边权、无障碍入口。
  • 用户历史:最近导航、收藏地点、课程常用教室。
  • 版本信息:本地数据版本号、远端更新时间、增量更新记录。
export class OfflineCacheService {
  private versionKey: string = 'campus_map_version'

  async loadPoiCache(): Promise<CampusPoi[]> {
    // 实际项目可使用 Preferences、关系型数据库或键值数据库
    return []
  }

  async refreshIfNeeded(remoteVersion: string): Promise<void> {
    const localVersion = await this.getLocalVersion()
    if (localVersion === remoteVersion) {
      return
    }
    const latestPoi = await this.fetchLatestPoi()
    const latestGraph = await this.fetchLatestGraph()
    await this.saveLocalData(latestPoi, latestGraph, remoteVersion)
  }

  private async getLocalVersion(): Promise<string> {
    return '2026.07.demo'
  }

  private async fetchLatestPoi(): Promise<CampusPoi[]> {
    return []
  }

  private async fetchLatestGraph(): Promise<CampusRouteGraph> {
    return new CampusRouteGraph()
  }

  private async saveLocalData(poi: CampusPoi[], graph: CampusRouteGraph, version: string): Promise<void> {
    // 保存本地缓存
  }
}

十四、无障碍导航:让毕业设计更有温度

很多校园项目只强调“最快路线”,但真实校园里还有轮椅通行、临时受伤、夜间安全、雨天避雨等需求。无障碍导航可以作为毕业设计的加分点。

实现方式不是另写一套地图,而是在同一张路线图上调整边权:

  • 楼梯节点:无障碍模式下提高代价。
  • 电梯和坡道:无障碍模式下降低代价。
  • 夜间偏僻道路:夜间模式提高代价。
  • 主干道和有照明区域:夜间模式降低代价。
  • 雨天连廊:雨天模式降低代价。

答辩时可以展示三种路线对比:普通路线、无障碍路线、夜间安全路线。这样评委能直观看到系统不是简单地图壳,而是把校园细节融入算法。

十五、通知与活动推荐

校园导航还可以和活动系统联动。例如用户点击“创新创业讲座”,系统直接展示地点、时间、报名状态和导航按钮。对于即将开始的课程或活动,可通过通知提醒用户提前出发。

export interface CampusEvent {
  id: string
  title: string
  locationPoiId: string
  startTime: string
  tags: string[]
}

export class EventRecommendService {
  recommend(events: CampusEvent[], userTags: string[]): CampusEvent[] {
    return events
      .filter(event => event.tags.some(tag => userTags.includes(tag)))
      .sort((a, b) => Date.parse(a.startTime) - Date.parse(b.startTime))
      .slice(0, 5)
  }
}

在文章投稿里,这部分可以强调“导航不是孤立功能”,而是校园信息服务的基础入口。

十六、开发难点与解决方案

难点一:校园地点别名多

解决方案:建立 POI 别名表,把“信工楼、信息楼、信息工程学院楼”映射到同一标准 POI。AI 问路只做语义提取,最终地点必须通过 POI 服务校验。

难点二:室内外路线混合

解决方案:路线节点中增加 floornodeType 字段,把楼梯、电梯、门禁口、教室作为图节点统一处理。室内地图不完整时,可先实现楼宇入口到教室的分段提示。

难点三:跨设备数据同步冲突

解决方案:跨端接续只同步路线令牌和目标状态,完整路线由接收端恢复。令牌设置过期时间,避免旧路线误用。

难点四:隐私与定位授权

解决方案:首次进入导航页时明确说明定位用途;没有授权时提供手动选择起点;历史路线只保存必要字段,不保存连续轨迹。

难点五:答辩展示容易散

解决方案:答辩现场采用“新生从校门到教室”作为主线,依次展示搜索、AI 问路、课程联动、跨设备接续和无障碍路线,不要把所有功能零散点击一遍。

十七、性能测试与优化

教学样例工程中,我们对四个关键路径进行 20 次重复测试,记录平均耗时。测试数据仅用于说明优化方向,不作为行业通用结论。

在这里插入图片描述

优化策略包括:

  • 首页首屏:拆分组件,延迟加载非首屏 POI。
  • POI 检索:本地别名索引 + 最近访问缓存。
  • 路线生成:预加载校园路线图,路线边权提前计算。
  • 跨端接续:同步 routeToken,不同步完整路线对象。
  • UI 渲染:地图图层和路线面板分离,减少状态更新范围。

十八、成果展示:毕业设计可以怎么演示

建议录制 45 秒演示视频:

  1. 手机端打开元服务入口,进入智慧校园导航首页。
  2. 点击课程卡片“一键导航到 A302”。
  3. 展示路线详情和预计时间。
  4. 输入“晚上从图书馆回宿舍怎么走”,展示夜间安全路线。
  5. 点击跨设备接续,平板展示校园总览路线。
  6. 切换无障碍路线,展示少楼梯路线提示。
  7. 管理后台修改活动地点,手机端刷新活动导航入口。

这样的视频脚本清晰、有节奏,也能体现 HarmonyOS 特性和毕业设计成果。

十九、答辩 PPT 结构建议

PPT 建议控制在 18~22 页:

  1. 项目标题与成员信息
  2. 选题背景
  3. 用户痛点
  4. 需求分析
  5. 系统总体架构
  6. HarmonyOS 技术选型
  7. 核心功能展示
  8. 校园数据模型
  9. 路线规划算法
  10. AI 智能问路
  11. 意图框架一键导航
  12. 元服务快速入口
  13. 跨设备接续
  14. 离线缓存
  15. 无障碍导航
  16. 系统界面展示
  17. 性能测试
  18. 开发难点
  19. 项目成果
  20. 总结与展望

二十、总结

这篇毕业设计的核心价值不是“做一个校园地图”,而是把 HarmonyOS 的系统能力与校园真实场景结合起来:通过 ArkUI 构建双端体验,通过 Intents Kit 实现服务直达,通过元服务降低入口门槛,通过分布式能力实现跨设备接续,通过离线缓存和无障碍路线提升实际可用性。

从校企合作教学角度看,这个项目非常适合作为毕业设计:它有清晰的用户痛点,有可展示的界面,有可讲解的架构,有算法和数据模型,也能体现 HarmonyOS 6.1 的平台能力。对于学生来说,它不是一份“为了答辩而做的系统”,而是一份能继续迭代、能进入作品集、也能迁移到真实校园服务中的综合项目。

转载自:https://blog.csdn.net/u014727709/article/details/162997764
欢迎 👍点赞✍评论⭐收藏,欢迎指正

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐