【知律|10】HarmonyOS ArkTS 案例边界实战:明确普法内容不替代法律意见
2026/8/17 21:55:27 网站建设 项目流程

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

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

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

资源文件中的应用名是:

{ "name": "app_name", "value": "知律 · 普法学堂" }

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

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

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

默认题库简介写着:

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

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

更稳的文案应区分:

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

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

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

this.ActionSettingItem('版本', 'v1.0.0', ...) this.ActionSettingItem('平台', 'HarmonyOS', ...) this.ActionSettingItem('框架', 'ArkTS / ArkUI', ...)

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

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

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

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

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

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

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

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

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

export type LegalContentType = 'statuteExcerpt' | 'knowledgePoint' | 'teachingScenario' | 'publicCaseDigest' | 'procedureGuide'

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

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

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

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

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标明适用地区或层级

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

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

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

export interface LegalUseBoundary { purpose: 'legalEducation' replacesProfessionalAdvice: false requiresFactReview: boolean helpPath?: 'publicLegalService' | 'licensedProfessional' }

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

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

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

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

@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) }

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

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

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

可以给解析模型增加:

interface LegalAnalysis { generalRule: string keyConditions: string[] evidenceHints: string[] procedureNotes: string[] sourceRefs: string[] }

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

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

首页当前使用:

Text('真实案例 · 以案学法') Text('精选真实案例,学习法律知识')

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

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

interface PublicCaseSource { caseName: string caseNumber?: string publishingAuthority: string publicUrl: string publishedAt?: string adaptedFields: string[] }

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

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

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

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

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

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

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

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

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

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

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

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

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. 设置页提供完整版本、来源与更新策略。

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

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

真实题库中存在类似:

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

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

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

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

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

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

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

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

interface LegalContentPack { schemaVersion: number contentVersion: string reviewedAt: string entries: LegalQuestion[] }

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

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

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

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

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

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

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

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 上保持可读。

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

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

interface ContentCorrection { contentId: string contentVersion: string issueType: 'source' | 'outdated' | 'wording' | 'other' description: string }

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

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

审核前同时检查:

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

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

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

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

@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;底部操作保留系统安全区;宽屏可以让来源列表和说明并排,但不能缩小正文。正文对比度应达到可读要求,提示不能用浅灰字伪装成存在。

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

构建前可以扫描内容包:

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 示例用于说明工程方案,不构成针对任何具体事项的法律意见,也不代表当前版本已经实现来源追踪、风险分级、边界提示或专业帮助入口。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询