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