【知律|10】HarmonyOS ArkTS 案例边界实战:明确普法内容不替代法律意见

法律学习应用有一个比"答案是否能显示"更难的工程问题:用户会把界面里的确定语气当成可以直接执行的结论。题库写着"应当赔偿""可以起诉""申请仲裁",在学习场景里可能只是知识点;放到真实纠纷中,却还取决于事实、证据、地域、程序期限、现行规则和专业判断。一个醒目的"仅供参考"无法自动修复过期法条、虚构来源或缺失条件。

本文基于知律项目 D:\huawei\one19-11、包名 com.jiaweikang.one19 的真实源码,复核 brief 指向的 BankDetailPage.etsSettingsPage.ets,并追踪 HomePage.ets、本地题库和应用清单。当前应用明确定位为"知律 · 普法学堂",内容为本地题库练习;但页面使用"真实案例""维权思路"等表述,没有展示"不替代法律意见"的边界,也没有来源、适用日期、审核时间或案例改编标记。文章从这一真实缺口出发,设计 HarmonyOS 5.0+ 可落地的内容边界契约。

一、源码已经把产品定位为普法学习

资源文件中的应用名是:

json 复制代码
{
  "name": "app_name",
  "value": "知律 · 普法学堂"
}

首页、启动页和题库分类也反复使用"普法学堂""每日普法""案例学习"。这说明产品核心是法律知识教育,不是在线问律师、案件代理或个案结论生成。

这个定位很重要。边界设计不是把产品能力缩小,而是让用户知道:应用帮助理解一般规则和学习路径,具体纠纷仍需结合完整事实与有效规则判断。

二、BankDetailPage 的现有文案容易产生能力外推

默认题库简介写着:

ts 复制代码
const DEFAULT_BANK_DETAIL_PROFILE: BankDetailProfile = {
  subtitle: '按章节练习重点法条、情景判断与案例分析',
  intro: '从日常生活场景出发,逐步掌握常识型法律知识与维权思路。',
  cultureNote: '题目会以真实案例为依托,穿插重要法条与维权流程,帮你记得更牢。',
  focusTags: ['高频法条', '生活场景', '维权思路'],
  sceneTags: ['日常交往', '消费维权', '人身权益']
}

"案例分析"和"维权思路"适合学习产品,但"真实案例"是一项可验证声明。当前题库数据没有案号、裁判文书链接、发布机关、时间或改编说明,无法从源码确认每道题都源自可追溯真实案件。

更稳的文案应区分:

  • 有公开来源且可核验:标为"公开案例摘编";
  • 根据常见情形整理:标为"教学情景";
  • 为知识点构造:标为"模拟案例";
  • 来源暂不完整:不使用"真实案例"。

三、SettingsPage 目前没有法律内容边界入口

设置页"关于"区域只有版本、平台和框架:

ts 复制代码
this.ActionSettingItem('版本', 'v1.0.0', ...)
this.ActionSettingItem('平台', 'HarmonyOS', ...)
this.ActionSettingItem('框架', 'ArkTS / ArkUI', ...)

源码搜索没有找到"不构成法律意见""仅供普法学习""内容更新时间""来源说明"或"专业法律帮助"等入口。因此当前版本不能宣称已经向用户完整披露案例边界。

设置页适合放全局说明,但不能只把提示藏在最深处。用户做高风险判断时,相关边界还要出现在题库入口和题目解析附近。

四、免责声明不是万能免责按钮

一条免责声明最多说明产品用途,不能把错误内容变成正确,也不能把无法核验的"真实案例"变成真实。

工程上应同时完成四件事:

  1. 内容本身有来源和更新时间;
  2. 场景文案明确一般规则与个案判断的区别;
  3. 高风险结论旁显示适用条件;
  4. 上架描述、应用内文案和真实能力一致。

华为开发者官方上架说明要求应用符合审核标准和法律法规,并如实配置应用信息与隐私声明。边界提示应服务于真实表达,而不是规避内容责任。华为开发者:提交 HarmonyOS 应用

五、用内容类型决定提示强度

不同内容不能统一套一行灰字。可以先定义类型:

ts 复制代码
export type LegalContentType =
  'statuteExcerpt' |
  'knowledgePoint' |
  'teachingScenario' |
  'publicCaseDigest' |
  'procedureGuide'

knowledgePoint 主要解释一般概念;teachingScenario 必须标记为模拟;publicCaseDigest 需要可核验公开来源;procedureGuide 还要提醒地区、机构和时效差异。

类型是数据层字段,不应由页面根据标题关键词猜测。否则同一内容在搜索页和练习页可能显示不同边界。

六、为每条内容补充来源元数据

现有 Question 主要包含题干、选项、答案和解析,无法表达法律来源的生命周期。可以扩展独立元数据:

ts 复制代码
export interface LegalContentMeta {
  contentType: LegalContentType
  sourceTitle: string
  sourceUrl?: string
  sourceAuthority?: string
  effectiveDate?: string
  verifiedAt: string
  jurisdiction: string
  isAdaptedScenario: boolean
  riskLevel: 'low' | 'medium' | 'high'
}

这些字段解决的是可追溯性,不是装饰。页面可以回答"依据来自哪里""何时复核""是否教学改编""适用于哪个范围",内容团队也能按 verifiedAt 找出需要复审的条目。

七、来源 URL 不是唯一可信证据

只保存链接也不够。网页可能改版、失效或指向非权威转载。建议至少记录:

字段 用途
sourceAuthority 识别发布机关或官方数据库
sourceTitle 链接失效时仍能定位材料
sourceUrl 供用户核验原文
effectiveDate 判断规则适用时间
verifiedAt 记录内容最后复核时间
jurisdiction 标明适用地区或层级

对于法条摘要,页面不能把开发者的解释伪装成原文。原文摘录、通俗解释和教学结论应使用不同字段和视觉标签。

八、一般知识与个案意见要有数据级边界

可以为内容增加用途声明:

ts 复制代码
export interface LegalUseBoundary {
  purpose: 'legalEducation'
  replacesProfessionalAdvice: false
  requiresFactReview: boolean
  helpPath?: 'publicLegalService' | 'licensedProfessional'
}

这里的 replacesProfessionalAdvice: false 是固定契约,不让运营配置成 truerequiresFactReview 用于区分低风险概念题与涉及赔偿、诉讼、仲裁、报警、期限的场景。

页面拿到结构化边界后,可以稳定显示对应提示,不必把逻辑散落在若干 Text() 中。

九、题库详情页应先说明学习用途

ProfileCard() 中,题库简介和"文化提示"之后可以增加一条紧邻说明:

ts 复制代码
@Builder
LegalLearningNotice() {
  Row({ space: 8 }) {
    Image($r('app.media.ic_info'))
      .width(18)
      .height(18)
      .objectFit(ImageFit.Contain)
    Text('内容用于普法学习与一般知识理解,不替代针对具体事实的专业法律意见。')
      .fontSize(Sizes.CAPTION_FONT)
      .fontColor(Colors.TEXT_SECONDARY)
      .lineHeight(20)
      .layoutWeight(1)
  }
  .width('100%')
  .padding(12)
  .backgroundColor(Colors.BACKGROUND_ALT)
  .borderRadius(12)
}

提示应可读、可聚焦、有无障碍文本,不能用极小字号或低对比度弱化。它位于用户开始练习之前,能建立正确预期。

十、练习解析旁需要就近条件说明

很多风险发生在答案解析。比如"可起诉""应赔偿"若省略条件,用户容易直接套用。

可以给解析模型增加:

ts 复制代码
interface LegalAnalysis {
  generalRule: string
  keyConditions: string[]
  evidenceHints: string[]
  procedureNotes: string[]
  sourceRefs: string[]
}

UI 先展示一般规则,再分块列出"适用条件""证据提示""程序提醒"。如果字段为空,页面不能自动补出不存在的建议,更不能由标题生成确定结论。

十一、把"真实案例"改造成可验证状态

首页当前使用:

ts 复制代码
Text('真实案例 · 以案学法')
Text('精选真实案例,学习法律知识')

而本地 dialog 题多为简短情景,没有案号与公开来源。更符合源码的表达是"案例情景 · 以案学法"或"模拟案例学习"。

若未来接入公开案例,可定义:

ts 复制代码
interface PublicCaseSource {
  caseName: string
  caseNumber?: string
  publishingAuthority: string
  publicUrl: string
  publishedAt?: string
  adaptedFields: string[]
}

只有满足最低来源字段后才显示"公开案例摘编"标签。显示逻辑与数据校验绑定,避免文案先上线、证据后补。

十二、SettingsPage 负责全局声明与版本信息

设置页可以新增"内容说明"分组:

ts 复制代码
this.ActionSettingItem(
  '内容用途',
  '普法学习',
  () => router.pushUrl({ url: 'pages/LegalContentNoticePage' })
)

this.ActionSettingItem(
  '内容复核',
  '查看日期与来源',
  () => router.pushUrl({ url: 'pages/LegalSourcePage' })
)

说明页至少包含产品用途、内容类型、来源原则、更新时间、纠错渠道和专业帮助路径。不要把它与隐私政策混成一篇;内容责任、个人信息处理和用户协议是不同问题。

十三、一个可读的全局说明应该写什么

全局说明可以采用分层语言:

ts 复制代码
const LEGAL_CONTENT_NOTICE: string =
  '知律提供普法学习、题库练习和一般法律知识说明。' +
  '内容基于发布时可核验资料整理,教学情景可能经过简化或改编。' +
  '具体事项会受事实、证据、地区、时间和程序影响,' +
  '应用内容不替代针对个案的专业法律意见。'

还应紧接一段行动建议:遇到人身安全、财产损失、诉讼时效、劳动仲裁、未成年人保护等问题时,及时联系具备相应资质的专业人员或当地公共法律服务渠道。

司法部智慧普法平台的咨询须知也明确把线上回复限定为参考,并提醒用户不要填写隐私信息。这提供了一个重要产品启示:即使回答由专家产生,也需要说明信息不完整与效力边界。司法部智慧普法平台

十四、边界提示要靠近高风险动作

可以用风险等级决定提示位置:

ts 复制代码
function noticePlacement(
  level: 'low' | 'medium' | 'high'
): 'global' | 'inline' | 'blocking' {
  if (level === 'high') return 'blocking'
  if (level === 'medium') return 'inline'
  return 'global'
}
  • 低风险:术语解释,依赖全局说明即可;
  • 中风险:赔偿、举证、仲裁、投诉等,解析旁显示条件;
  • 高风险:人身安全、刑事风险、紧迫期限等,在操作前显示醒目提示和求助路径。

blocking 不等于每次都弹窗。它表示用户不能在完全看不到边界的情况下进入高风险行动建议。

十五、不要让提示变成打扰

如果每道题都弹同一个对话框,用户会机械关闭,边界信息反而失效。推荐三层呈现:

  1. 首次进入法律题库时展示简短用途提示;
  2. 解析页按风险显示就近说明;
  3. 设置页提供完整版本、来源与更新策略。

同一提示在当前版本内可以记录"已读",但高风险内容的关键条件仍要常驻。已读状态只控制重复引导,不应隐藏具体题目的适用限制。

十六、题目解析要避免绝对化语气

真实题库中存在类似:

ts 复制代码
analysis: '侵权人应承担恢复原状或赔偿损失等责任,可与物业一并协调或起诉。'

作为单选题解析,它表达了知识方向;用于现实行动时则缺少责任主体、过错、因果关系、证据和程序条件。

更稳的内容结构可以写成:

ts 复制代码
const analysis: LegalAnalysis = {
  generalRule: '造成他人损害并符合责任构成条件时,相关主体可能承担相应责任。',
  keyConditions: ['损害事实', '行为与损害的因果关系', '适用的归责原则'],
  evidenceHints: ['现场记录', '沟通记录', '损失凭证'],
  procedureNotes: ['先固定证据,再按具体情况选择协商或法定渠道'],
  sourceRefs: ['民事责任相关有效规范']
}

示例只是内容建模方法,不代表对任何具体纠纷的处理意见。

十七、法条版本与生效时间必须可更新

法律内容会变化。把结论直接写死在 ArkTS 数组中,发布后无法单独修订,除非重新发版。

离线应用仍可使用版本化内容包:

ts 复制代码
interface LegalContentPack {
  schemaVersion: number
  contentVersion: string
  reviewedAt: string
  entries: LegalQuestion[]
}

每次构建时生成清单和校验报告。应用在设置页展示内容版本与复核日期。若没有联网更新能力,就明确"以当前版本所载资料为准,并请核对最新官方信息",不能暗示实时更新。

十八、离线与在线能力要分别说明

设置页写着"数据保存在本机",这与收藏、笔记等 Preferences 数据相符;但 module.json5 声明了 ohos.permission.INTERNET,项目另有在线 TTS 兜底。内容边界与隐私说明需要分别核对:

  • 题库是否完全内置;
  • 法律来源链接是否需要联网打开;
  • 语音是否可能使用在线引擎;
  • 是否收集用户输入;
  • 是否上传笔记或答题记录。

不能因为题库本地化,就笼统宣称整个应用没有网络行为。华为分发说明强调应用信息和隐私声明应按真实情况填写并更新。华为开发者:在应用市场分发

十九、外部来源链接需要安全处理

如果来源页通过外部浏览器打开,先验证 URL 属于允许的官方域名:

ts 复制代码
function isTrustedLegalSource(url: string): boolean {
  const allowedHosts: string[] = [
    'flk.npc.gov.cn',
    'www.gov.cn',
    'www.moj.gov.cn'
  ]
  try {
    const parsed = new URL(url)
    return parsed.protocol === 'https:' &&
      allowedHosts.includes(parsed.hostname)
  } catch (_) {
    return false
  }
}

真实项目应根据内容来源维护白名单,不能照搬示例后遗漏必要机关。页面还要显示将打开的域名,失败时保留来源标题,避免只剩不可点击空白。

二十、不要收集用户案情来制造"个性化建议"

当前知律是本地题库,没有个案问答输入,这是较清晰的边界。若未来增加"描述你的纠纷",产品性质会发生明显变化:

  • 用户可能输入身份证号、住址、合同、病历或未成年人信息;
  • 系统需要明确处理目的、范围、保留期限和删除方式;
  • 自动回复容易被理解为个案意见;
  • 错误结论的风险远高于普通练习题。

在没有完整隐私、资质、内容审核和风险控制方案前,不应只加一个文本框和生成模型就上线"智能法律咨询"。

二十一、未成年人场景需要更谨慎

题库包含校园欺凌、隐私、体罚和校园贷等主题。此类内容不能只给出抽象责任结论,还应优先呈现安全与求助边界:

  • 紧急危险先联系可信成年人或紧急服务;
  • 不公开填写姓名、学校、住址、联系方式;
  • 不鼓励自行对抗或传播敏感材料;
  • 对程序和责任仅提供一般知识说明;
  • 具体处理由监护人、学校、专业机构或法定渠道结合事实判断。

这些提示应使用儿童可理解语言,并在手机、平板和 2in1 上保持可读。

二十二、错误反馈不能只依赖应用商店评论

法律内容需要专门纠错入口。反馈记录至少包括:

ts 复制代码
interface ContentCorrection {
  contentId: string
  contentVersion: string
  issueType: 'source' | 'outdated' | 'wording' | 'other'
  description: string
}

若应用保持完全离线,可以在关于页提供不收集案情的反馈方式,并提示只提交内容 ID 与问题类型。不要要求用户上传完整纠纷材料来证明一道题可能过期。

二十三、上架材料也要保持同一边界

审核前同时检查:

位置 应保持一致的内容
应用名称与副标题 普法学习,不写在线法律咨询
应用描述 不承诺个案胜诉、赔偿金额或实时权威结论
截图 不突出无法核验的"真实案例"
隐私声明 与本地数据、网络权限、语音能力一致
应用内关于页 能看到内容用途、版本、来源与求助路径
题库入口 关键提示不被隐藏

技术实现正确但商店文案过度承诺,仍会让用户形成错误预期。

二十四、边界组件也要做多设备适配

可以把提示封装为可复用组件,但保持信息密度克制:

ts 复制代码
@Component
struct LegalBoundaryBanner {
  message: string = ''

  build() {
    Row({ space: 10 }) {
      Image($r('app.media.ic_info'))
        .width(20)
        .height(20)
      Text(this.message)
        .fontSize(Sizes.CAPTION_FONT)
        .fontColor(Colors.TEXT_SECONDARY)
        .lineHeight(20)
        .maxLines(4)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .layoutWeight(1)
    }
    .width('100%')
    .padding(12)
    .backgroundColor(Colors.BACKGROUND_ALT)
    .borderRadius(8)
  }
}

长说明页放进 Scroll;底部操作保留系统安全区;宽屏可以让来源列表和说明并排,但不能缩小正文。正文对比度应达到可读要求,提示不能用浅灰字伪装成存在。

二十五、内容边界的自动检查

构建前可以扫描内容包:

ts 复制代码
interface BoundaryIssue {
  contentId: string
  field: string
  reason: string
}

function validateLegalMeta(
  id: string,
  meta: LegalContentMeta
): BoundaryIssue[] {
  const issues: BoundaryIssue[] = []
  if (!meta.sourceTitle) {
    issues.push({ contentId: id, field: 'sourceTitle', reason: '缺少来源标题' })
  }
  if (!meta.verifiedAt) {
    issues.push({ contentId: id, field: 'verifiedAt', reason: '缺少复核日期' })
  }
  if (meta.contentType === 'publicCaseDigest' && !meta.sourceUrl) {
    issues.push({ contentId: id, field: 'sourceUrl', reason: '公开案例缺少链接' })
  }
  return issues
}

校验失败应阻止内容包进入发布构建。不要等用户发现过期内容后才依赖人工修正。

二十六、测试用例要覆盖误解风险

除了普通 UI 测试,还应验证:

  1. 首次进入题库能看到用途提示;
  2. 提示在深浅色和小窗下可读;
  3. "模拟案例"不会显示成"真实案例";
  4. 公开案例缺少来源时构建失败;
  5. 中高风险解析显示适用条件;
  6. 来源链接只允许受信任 HTTPS 域名;
  7. 内容版本和复核日期在设置页可见;
  8. 离线时来源标题仍可阅读;
  9. 未成年人主题显示隐私与求助提醒;
  10. 上架描述与应用内能力一致。

这组用例验证的是用户理解和内容治理,不只是组件是否渲染。

二十七、当前版本与目标版本对照

能力 当前源码 建议目标
产品定位 普法学堂 保持
题库简介 有案例和维权表述 增加用途边界
"真实案例" 无来源元数据支撑 改为情景或补足来源
法条来源 未展示 标题、机关、链接、日期
内容复核时间 未展示 设置页可见
个案法律意见提示 未找到 入口与高风险解析就近显示
专业帮助路径 未找到 提供公共服务或专业人员方向
内容纠错 未找到 使用内容 ID 的最小反馈
上架一致性 需人工核对 纳入发布检查

这张表可以直接作为迭代验收基线,避免把未实现项写成现有能力。

二十八、发布前闭环检查

逐项确认:

  • 应用仍定位为普法学习;
  • 不把模拟情景写成真实案例;
  • 每条高风险内容有来源和复核日期;
  • 原文、解释和教学结论视觉上可区分;
  • 一般规则不包装成个案结论;
  • 入口级、就近和全局提示各司其职;
  • 提示字号、对比度和无障碍文本可用;
  • 未成年人内容不诱导提交隐私;
  • 外部来源链接经过域名校验;
  • 内容版本可以追踪和迁移;
  • 网络权限、语音能力、隐私说明相互一致;
  • 应用描述、截图和真实功能不夸大;
  • 没有虚构权威背书、案例来源或审核结果。

二十九、结语

知律当前的真实基础是清楚的:它是一款 HarmonyOS 本地普法题库应用,题库详情页提供简介、学习重点、章节与练习入口,设置页提供学习偏好和本地数据管理。源码没有在线法律咨询,也没有个案资料收集,这为保持教育产品边界提供了良好起点。

需要补齐的是"内容如何证明自己没有越界":当前"真实案例""维权思路"等文案缺少来源与条件,设置页没有用途声明、内容版本和专业帮助路径。把来源元数据、案例类型、风险分级、就近提示、更新机制和上架信息统一成一份契约,普法内容才能既有帮助,又不把一般知识伪装成针对具体案件的法律意见。


本文部分内容由 AI 辅助整理。所有现状判断均基于 D:\huawei\one19-11com.jiaweikang.one19 的本地源码复核;文中的内容模型和 ArkTS 示例用于说明工程方案,不构成针对任何具体事项的法律意见,也不代表当前版本已经实现来源追踪、风险分级、边界提示或专业帮助入口。

相关推荐
xq95272 小时前
鸿蒙组件化设计横空出世
harmonyos
特立独行的猫A2 小时前
Tauri v2 桌面应用m3u8dl-tauri移植到 HarmonyOS(鸿蒙 PC)完整实战指南
harmonyos
HarmonyOS_SDK2 小时前
从“一屏一态”到“一屏多能”:WPS通过HarmonyOS多窗口能力重塑移动办公体验
harmonyos
世人万千丶3 小时前
收纳格卡片风:ArkUI 让鸿蒙物品清单像收纳盒贴标
学习·华为·harmonyos·鸿蒙
yuhulkjv3353 小时前
Grok鸿蒙版导出word格式的终极解法:AI导出鸭如何重构AI内容到文档的最后一公里
人工智能·ai·word·harmonyos·ai导出鸭
大锅盖14 小时前
HarmonyOS 6.1.1 ArkWeb:交付门户下载资料前-为什么必须先登记下载代理与来源字段
android·华为·harmonyos
特立独行的猫a4 小时前
Tauri v2的Rust应用 → HarmonyOS(鸿蒙 PC)移植30分钟速成指南
开发语言·rust·harmonyos·tauri·移植·鸿蒙pc
YM52e16 小时前
分页查询的基石:ArkTS 为鸿蒙商品列表设计 LIMIT/OFFSET 的表
android·学习·华为·harmonyos