hookehuyr

docs(components): 补充 ArticleCard 和 PeriodInput 组件文档

- 新增 ArticleCard 组件文档(文章卡片)
- 新增 PeriodInput 组件文档(提取期自定义输入)
- 更新组件索引表格,添加缺失的组件条目

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
...@@ -51,6 +51,7 @@ import TabBar from '@/components/navigation/TabBar.vue' ...@@ -51,6 +51,7 @@ import TabBar from '@/components/navigation/TabBar.vue'
51 |------|------|-------| 51 |------|------|-------|
52 | [`MaterialCard`](#materialcardvue) | 资料/文档卡片 | title, icon, learners, docType, collected | 52 | [`MaterialCard`](#materialcardvue) | 资料/文档卡片 | title, icon, learners, docType, collected |
53 | [`ProductCard`](#productcardvue) | 产品卡片 | name, type, tags, collected | 53 | [`ProductCard`](#productcardvue) | 产品卡片 | name, type, tags, collected |
54 +| [`ArticleCard`](#articlecardvue) | 文章卡片 | id, title, excerpt, coverUrl, date, learners, readPeoplePercent, collected, showCover |
54 55
55 **使用示例** 56 **使用示例**
56 ```vue 57 ```vue
...@@ -187,6 +188,7 @@ const htmlContent = '<p>HTML 内容</p>' ...@@ -187,6 +188,7 @@ const htmlContent = '<p>HTML 内容</p>'
187 | [`SelectPickerGlobal`](#selectpickerglobalvue) | 选项选择器 | 188 | [`SelectPickerGlobal`](#selectpickerglobalvue) | 选项选择器 |
188 | [`AmountKeyboard`](#amountkeyboardvue) | 金额键盘 | 189 | [`AmountKeyboard`](#amountkeyboardvue) | 金额键盘 |
189 | [`PaymentPeriodRadio`](#paymentperiodradiovue) | 缴费年期单选 | 190 | [`PaymentPeriodRadio`](#paymentperiodradiovue) | 缴费年期单选 |
191 +| [`PeriodInput`](#periodinputvue) | 提取期自定义输入 |
190 | [`RadioGroup`](#radiogroupvue) | 单选分组 | 192 | [`RadioGroup`](#radiogroupvue) | 单选分组 |
191 193
192 #### 模板 (PlanTemplates/) 194 #### 模板 (PlanTemplates/)
...@@ -322,6 +324,54 @@ emit('change', newValue) ...@@ -322,6 +324,54 @@ emit('change', newValue)
322 324
323 --- 325 ---
324 326
327 +### ArticleCard.vue
328 +
329 +文章卡片,展示文章标题、简介、封面图、日期和操作按钮。
330 +
331 +**Props**
332 +| Prop | 类型 | 默认值 | 说明 |
333 +|------|------|--------|------|
334 +| id | Number/String | - | 文章 ID |
335 +| title | String | - | 文章标题 |
336 +| excerpt | String | '' | 文章简介 |
337 +| coverUrl | String | '' | 封面图 URL |
338 +| date | String | '' | 发布日期(格式:YYYY-MM-DD HH:mm:ss) |
339 +| learners | String/Number | '' | 学习人数 |
340 +| readPeoplePercent | Number | null | 学习人数百分比(热度) |
341 +| collected | Boolean | false | 是否已收藏 |
342 +| showCover | Boolean | false | 是否显示封面图 |
343 +
344 +**Events**
345 +| Event | 说明 | 参数 |
346 +|-------|------|------|
347 +| viewed | 查看文章时触发 | { id } |
348 +| collectChanged | 收藏状态改变时触发 | { id, title, excerpt, coverUrl, date, collected } |
349 +
350 +**使用示例**
351 +```vue
352 +<template>
353 + <ArticleCard
354 + :id="article.id"
355 + :title="article.title"
356 + :excerpt="article.excerpt"
357 + :cover-url="article.coverUrl"
358 + :date="article.createdAt"
359 + :learners="article.learners"
360 + :read-people-percent="article.readPeoplePercent"
361 + :collected="article.collected"
362 + :show-cover="true"
363 + @viewed="handleViewed"
364 + @collect-changed="handleCollectChanged"
365 + />
366 +</template>
367 +
368 +<script setup>
369 +import ArticleCard from '@/components/cards/ArticleCard.vue'
370 +</script>
371 +```
372 +
373 +---
374 +
325 ### MaterialCard.vue 375 ### MaterialCard.vue
326 376
327 资料/文档卡片,展示资料信息和操作按钮。 377 资料/文档卡片,展示资料信息和操作按钮。
...@@ -441,6 +491,71 @@ const handleFileClick = ({ url, fileName }) => { ...@@ -441,6 +491,71 @@ const handleFileClick = ({ url, fileName }) => {
441 491
442 --- 492 ---
443 493
494 +### PeriodInput.vue
495 +
496 +提取期自定义输入组件,支持整数年期和快捷选项(终身、一笔过)。
497 +
498 +**Props**
499 +| Prop | 类型 | 默认值 | 说明 |
500 +|------|------|--------|------|
501 +| visible | Boolean | false | 弹窗显示状态(v-model:visible) |
502 +| modelValue | String | '' | 绑定的值(v-model) |
503 +| label | String | '' | 标签文本 |
504 +| required | Boolean | false | 是否必填 |
505 +| placeholder | String | '请选择或输入提取期' | 占位符文本 |
506 +| inputLabel | String | '请输入提取期' | 弹窗内输入提示文本 |
507 +| inputPlaceholder | String | '请输入年数' | 输入框占位符 |
508 +| validationRules | Object | { min: 1, max: 100, ... } | 验证规则 |
509 +| hideTrigger | Boolean | false | 是否隐藏触发区域 |
510 +
511 +**Events**
512 +| Event | 说明 | 参数 |
513 +|-------|------|------|
514 +| update:visible | 更新弹窗显示状态 | boolean |
515 +| update:modelValue | 更新绑定值 | string |
516 +| confirm | 确认输入 | string(确认的提取期值) |
517 +| cancel | 取消输入 | - |
518 +
519 +**功能特性**
520 +- 整数年期约束(1-100年)
521 +- 快捷选项:终身、一笔过
522 +- 实时验证输入格式
523 +- 可扩展的验证器接口
524 +- 支持全局弹窗管理
525 +
526 +**使用示例**
527 +```vue
528 +<template>
529 + <PeriodInput
530 + v-model:visible="showPeriodInput"
531 + v-model="periodValue"
532 + label="提取期"
533 + input-label="请输入提取期"
534 + :validation-rules="{ min: 1, max: 100 }"
535 + @confirm="handlePeriodConfirm"
536 + @cancel="handleCancel"
537 + />
538 +</template>
539 +
540 +<script setup>
541 +import { ref } from 'vue'
542 +import PeriodInput from '@/components/plan/PlanFields/PeriodInput.vue'
543 +
544 +const showPeriodInput = ref(false)
545 +const periodValue = ref('')
546 +
547 +const handlePeriodConfirm = (value) => {
548 + console.log('确认提取期:', value)
549 +}
550 +
551 +const handleCancel = () => {
552 + console.log('取消输入')
553 +}
554 +</script>
555 +```
556 +
557 +---
558 +
444 ## 📖 最佳实践 559 ## 📖 最佳实践
445 560
446 ### 组件抽取原则 561 ### 组件抽取原则
......