法律学习应用有一个比“答案是否能显示”更难的工程问题:用户会把界面里的确定语气当成可以直接执行的结论。题库写着“应当赔偿”“可以起诉”“申请仲裁”,在学习场景里可能只是知识点;放到真实纠纷中,却还取决于事实、证据、地域、程序期限、现行规则和专业判断。一个醒目的“仅供参考”无法自动修复过期法条、虚构来源或缺失条件。
本文基于知律项目D:\huawei\one19-11、包名com.jiaweikang.one19的真实源码,复核 brief 指向的BankDetailPage.ets与SettingsPage.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', ...)源码搜索没有找到“不构成法律意见”“仅供普法学习”“内容更新时间”“来源说明”或“专业法律帮助”等入口。因此当前版本不能宣称已经向用户完整披露案例边界。
设置页适合放全局说明,但不能只把提示藏在最深处。用户做高风险判断时,相关边界还要出现在题库入口和题目解析附近。
四、免责声明不是万能免责按钮
一条免责声明最多说明产品用途,不能把错误内容变成正确,也不能把无法核验的“真实案例”变成真实。
工程上应同时完成四件事:
- 内容本身有来源和更新时间;
- 场景文案明确一般规则与个案判断的区别;
- 高风险结论旁显示适用条件;
- 上架描述、应用内文案和真实能力一致。
华为开发者官方上架说明要求应用符合审核标准和法律法规,并如实配置应用信息与隐私声明。边界提示应服务于真实表达,而不是规避内容责任。华为开发者:提交 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是固定契约,不让运营配置成true。requiresFactReview用于区分低风险概念题与涉及赔偿、诉讼、仲裁、报警、期限的场景。
页面拿到结构化边界后,可以稳定显示对应提示,不必把逻辑散落在若干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不等于每次都弹窗。它表示用户不能在完全看不到边界的情况下进入高风险行动建议。
十五、不要让提示变成打扰
如果每道题都弹同一个对话框,用户会机械关闭,边界信息反而失效。推荐三层呈现:
- 首次进入法律题库时展示简短用途提示;
- 解析页按风险显示就近说明;
- 设置页提供完整版本、来源与更新策略。
同一提示在当前版本内可以记录“已读”,但高风险内容的关键条件仍要常驻。已读状态只控制重复引导,不应隐藏具体题目的适用限制。
十六、题目解析要避免绝对化语气
真实题库中存在类似:
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 测试,还应验证:
- 首次进入题库能看到用途提示;
- 提示在深浅色和小窗下可读;
- “模拟案例”不会显示成“真实案例”;
- 公开案例缺少来源时构建失败;
- 中高风险解析显示适用条件;
- 来源链接只允许受信任 HTTPS 域名;
- 内容版本和复核日期在设置页可见;
- 离线时来源标题仍可阅读;
- 未成年人主题显示隐私与求助提醒;
- 上架描述与应用内能力一致。
这组用例验证的是用户理解和内容治理,不只是组件是否渲染。
二十七、当前版本与目标版本对照
| 能力 | 当前源码 | 建议目标 |
|---|---|---|
| 产品定位 | 普法学堂 | 保持 |
| 题库简介 | 有案例和维权表述 | 增加用途边界 |
| “真实案例” | 无来源元数据支撑 | 改为情景或补足来源 |
| 法条来源 | 未展示 | 标题、机关、链接、日期 |
| 内容复核时间 | 未展示 | 设置页可见 |
| 个案法律意见提示 | 未找到 | 入口与高风险解析就近显示 |
| 专业帮助路径 | 未找到 | 提供公共服务或专业人员方向 |
| 内容纠错 | 未找到 | 使用内容 ID 的最小反馈 |
| 上架一致性 | 需人工核对 | 纳入发布检查 |
这张表可以直接作为迭代验收基线,避免把未实现项写成现有能力。
二十八、发布前闭环检查
逐项确认:
- 应用仍定位为普法学习;
- 不把模拟情景写成真实案例;
- 每条高风险内容有来源和复核日期;
- 原文、解释和教学结论视觉上可区分;
- 一般规则不包装成个案结论;
- 入口级、就近和全局提示各司其职;
- 提示字号、对比度和无障碍文本可用;
- 未成年人内容不诱导提交隐私;
- 外部来源链接经过域名校验;
- 内容版本可以追踪和迁移;
- 网络权限、语音能力、隐私说明相互一致;
- 应用描述、截图和真实功能不夸大;
- 没有虚构权威背书、案例来源或审核结果。
二十九、结语
知律当前的真实基础是清楚的:它是一款 HarmonyOS 本地普法题库应用,题库详情页提供简介、学习重点、章节与练习入口,设置页提供学习偏好和本地数据管理。源码没有在线法律咨询,也没有个案资料收集,这为保持教育产品边界提供了良好起点。
需要补齐的是“内容如何证明自己没有越界”:当前“真实案例”“维权思路”等文案缺少来源与条件,设置页没有用途声明、内容版本和专业帮助路径。把来源元数据、案例类型、风险分级、就近提示、更新机制和上架信息统一成一份契约,普法内容才能既有帮助,又不把一般知识伪装成针对具体案件的法律意见。
---
本文部分内容由 AI 辅助整理。所有现状判断均基于
D:\huawei\one19-11中com.jiaweikang.one19的本地源码复核;文中的内容模型和 ArkTS 示例用于说明工程方案,不构成针对任何具体事项的法律意见,也不代表当前版本已经实现来源追踪、风险分级、边界提示或专业帮助入口。