以土豆之名,行学习之实

family_tree项目JavaScript前端技术文档


家谱管理系统 - 前端技术详细文档

📋 文档概述

本文档提供家谱管理系统前端模块的详细技术说明,涵盖所有类、方法的功能描述、参数说明和实现逻辑。

🏗️ 系统架构概览

模块依赖关系

main.js (应用入口)                                       # 统一初始化和管理所有模块
├── core/ (核心工具模块)                                 # 提供基础工具和服务
│   ├── utils.js (DateUtils, FormUtils, DomUtils)       # 日期、表单、DOM工具类
│   ├── apiService.js                                   # API请求服务封装
│   ├── simpleValidator.js                              # 表单验证器
│   └── messageManager.js                               # 消息提示管理器
├── components/ (UI组件库)                              # 可复用UI组件
│   ├── dateInputManager.js                             # 日期输入管理组件
│   ├── personSearch.js                                 # 人员搜索组件
│   ├── dataTable.js                                    # 数据表格组件
│   ├── pagination.js                                   # 分页组件
│   ├── tabManager.js                                   # 标签管理器
│   └── relationshipInputManager.js                     # 关系输入组件
└── pages/ (页面逻辑模块)                               # 具体页面功能实现
    ├── personAdd.js                                    # 人员添加页面
    ├── personList.js                                   # 人员列表页面
    ├── personDetail.js                                 # 人员详情页面
    ├── personEdit.js                                   # 人员编辑页面
    └── relationshipAdd.js                              # 关系添加页面

🔧 核心模块 (core/)

1. utils.js - 通用工具模块

DateUtils 日期工具类

功能: 处理日期数据的解析、格式化、显示和输入框渲染

方法列表:

方法参数返回值功能描述
parseDateData(dateString, accuracy, dateType)dateString: 日期字符串
accuracy: 精度
dateType: 日期类型
Object 解析后的日期数据解析日期数据为结构化对象,支持不同精度和日期类型
buildDate(formData, accuracy, type)formData: FormData对象
accuracy: 精度
type: 日期类型前缀
String 日期字符串从表单数据构建标准日期字符串
getDateType(formData, accuracy, type)formData: FormData对象
accuracy: 精度
type: 日期类型前缀
String 日期类型根据精度获取对应的日期类型字段值
clampValue(value, min, max)value: 数值
min: 最小值
max: 最大值
Number 限制后的值限制数值在指定范围内
formatDateDisplay(dateString, dateType, accuracy)dateString: 日期字符串
dateType: 日期类型
accuracy: 精度
String 格式化后的日期统一格式化日期显示,支持公历和农历
formatLunarDate(dateString, accuracy)dateString: 日期字符串
accuracy: 精度
String 农历日期字符串专门格式化农历日期显示
formatSolarDate(dateString, accuracy)dateString: 日期字符串
accuracy: 精度
String 公历日期字符串专门格式化公历日期显示
fixLunarDateDisplay(person)person: 人员对象String 修复后的日期显示修复人员对象的农历日期显示格式
renderDateInputs(type, dateData, isRequired)type: 日期类型前缀
dateData: 日期数据
isRequired: 是否必填
String HTML字符串渲染日期输入框组,支持不同精度

FormUtils 表单工具类

功能: 处理表单数据的收集和变更检测

方法列表:

方法参数返回值功能描述
collectPersonData(form, isLiving)form: 表单元素
isLiving: 是否在世
Object 人员数据对象从表单收集人员数据,处理日期字段
hasFormChanges(originalData, currentForm)originalData: 原始数据
currentForm: 当前表单
Boolean 是否有变更检测表单数据是否发生变更

DomUtils DOM工具类

功能: 提供DOM操作和界面状态管理

方法列表:

方法参数返回值功能描述
escapeHtml(unsafe)unsafe: 未转义字符串String 转义后的字符串HTML特殊字符转义,防止XSS攻击
showElement(elementId, show)elementId: 元素ID
show: 显示状态
void显示或隐藏指定元素
setElementRequired(elementId, required)elementId: 元素ID
required: 必填状态
void设置元素的必填状态
updateSaveButtonState(buttonId, hasChanges)buttonId: 按钮ID
hasChanges: 是否有变更
void根据变更状态更新保存按钮状态
showLoading(containerId, show, message)containerId: 容器ID
show: 显示状态
message: 加载消息
void显示或隐藏加载状态

2. apiService.js - API服务封装

功能: 统一管理所有后端API调用,提供标准的请求处理

类方法列表:

方法参数返回值功能描述
request(endpoint, options)endpoint: API端点
options: 请求选项
Promise 响应数据统一的API请求方法,处理错误和响应
getPersons(params)params: 查询参数Promise 人员列表获取人员列表,支持分页和搜索
getPerson(personId)personId: 人员IDPromise 人员详情获取单个人员详细信息
createPerson(data)data: 人员数据Promise 创建结果创建新人员
updatePerson(personId, data)personId: 人员ID
data: 更新数据
Promise 更新结果更新人员信息
deletePerson(personId)personId: 人员IDPromise 删除结果删除指定人员
searchPersons(keyword)keyword: 搜索关键词Promise 搜索结果根据关键词搜索人员
createRelationship(data)data: 关系数据Promise 创建结果创建亲属关系
deleteRelationship(relId)relId: 关系IDPromise 删除结果删除指定关系

3. simpleValidator.js - 简化验证器

功能: 提供基础的表单数据验证功能

类方法列表:

方法参数返回值功能描述
validatePerson(data)data: 人员数据Object 验证结果验证人员数据的完整性和格式
validateRelationship(data)data: 关系数据Object 验证结果验证关系数据的有效性
validateRequired(value, fieldName)value: 字段值
fieldName: 字段名
String 错误信息验证字段是否必填
validateEmail(email)email: 邮箱地址String 错误信息验证邮箱格式
validatePhone(phone)phone: 手机号码String 错误信息验证手机号格式

4. messageManager.js - 消息管理器

功能: 统一管理用户提示消息的显示和隐藏

构造函数:

  • constructor(containerSelector = 'body', messageId = 'form-message')

方法列表:

方法参数返回值功能描述
showMessage(message, type, autoHide, duration)message: 消息内容
type: 消息类型
autoHide: 自动隐藏
duration: 显示时长
HTMLElement 消息元素显示通用消息提示
clearMessage()void清除当前显示的消息
showSuccess(message, autoHide, duration)message: 成功消息
autoHide: 自动隐藏
duration: 显示时长
HTMLElement 消息元素显示成功消息
showError(message, autoHide, duration)message: 错误消息
autoHide: 自动隐藏
duration: 显示时长
HTMLElement 消息元素显示错误消息
showWarning(message, autoHide, duration)message: 警告消息
autoHide: 自动隐藏
duration: 显示时长
HTMLElement 消息元素显示警告消息
showInfo(message, autoHide, duration)message: 信息消息
autoHide: 自动隐藏
duration: 显示时长
HTMLElement 消息元素显示信息消息
showPersonCreateSuccess(formData)formData: 表单数据HTMLElement 模态框元素显示人员创建成功模态框
showPersonUpdateSuccess(formData)formData: 表单数据HTMLElement 模态框元素显示人员更新成功模态框

🎨 UI组件库 (components/)

1. dateInputManager.js - 日期输入管理器

功能: 管理不同精度的日期输入(精确到日/月/年)

构造函数:

  • constructor(prefix, accuracySelectId, containers)

方法列表:

方法参数返回值功能描述
init()void初始化日期管理器
initAccuracyHandler()void初始化精度选择处理器
updateDateInputFormat(accuracy)accuracy: 日期精度void根据精度更新日期输入格式
setDateInputsRequired(required)required: 必填状态void设置所有日期输入框必填状态
setContainerInputsRequired(containerId, required)containerId: 容器ID
required: 必填状态
void设置特定容器输入框必填状态
clearDateInputs(containerId)containerId: 容器IDvoid清空日期输入框的值和状态
initDateInputLimits()void初始化日期输入限制
limitInputValue(input)input: 输入框元素void限制输入值在合理范围内
validateDateValidity()Object 验证结果验证日期有效性(基础范围验证)
validateExactDate()Object 验证结果验证精确到日的日期
validateYearMonth()Object 验证结果验证精确到年月的日期
validateYearOnly()Object 验证结果验证精确到年的日期
collectDateData(formData)formData: FormData对象Object 日期数据收集日期相关数据
buildDate(formData, accuracy)formData: FormData对象
accuracy: 精度
String 日期字符串构建日期字符串
getDateType(formData, accuracy)formData: FormData对象
accuracy: 精度
String 日期类型获取日期类型
validateDate()Boolean 是否有效验证日期是否填写完整
reset()void重置日期管理器状态

2. personSearch.js - 人员搜索组件

功能: 提供人员搜索和选择功能

构造函数:

  • constructor(containerId, options = {})

方法列表:

方法参数返回值功能描述
init()void初始化组件
render()void渲染组件HTML结构
bindEvents()void绑定事件监听器
handleSearch(keyword)keyword: 搜索关键词void处理搜索逻辑
showLoading()void显示加载状态
searchPersons(keyword)keyword: 搜索关键词Promise 搜索结果调用API搜索人员
showSearchResults(persons, emptyMessage)persons: 人员列表
emptyMessage: 空结果提示
void显示搜索结果
selectPerson(option)option: 选择的人员元素void选择人员
updateSelectedDisplay()void更新选中人员显示
clearSelection()void清空选择
showSuggestions()void显示建议框
hideSuggestions()void隐藏建议框
showError(message)message: 错误消息void显示错误信息
getSelectedPerson()Object 选中人员获取当前选中人员
setSelectedPerson(person)person: 人员对象void设置选中人员
destroy()void销毁组件,清理资源

3. dataTable.js - 数据表格组件

功能: 渲染和操作人员数据表格

构造函数:

  • constructor(containerId, options = {})

方法列表:

方法参数返回值功能描述
render(data)data: 表格数据void渲染表格数据
generateTableHTML()String HTML字符串生成表格HTML结构
formatDateDisplay(person)person: 人员对象String 格式化日期格式化日期显示
generateActionButtons(personId)personId: 人员IDString HTML字符串生成操作按钮
bindRowEvents()void绑定行事件处理
disableDeleteButton(button)button: 删除按钮void禁用删除按钮并显示加载状态
enableAllDeleteButtons()void启用所有删除按钮
showLoading()void显示加载状态
showEmpty()void显示空数据状态
showError(message, onRetry)message: 错误消息
onRetry: 重试回调
void显示错误状态
destroy()void清理事件监听器

4. pagination.js - 分页组件

功能: 处理数据分页显示和导航

构造函数:

  • constructor(container, options = {})

方法列表:

方法参数返回值功能描述
update(options)options: 分页配置void更新分页配置
render()void渲染分页组件
generatePaginationHTML(totalPages)totalPages: 总页数String HTML字符串生成分页按钮HTML
bindEvents()void绑定分页事件
handlePageChange(page)page: 目标页码void处理页面切换
updateButtonStates(totalPages)totalPages: 总页数void更新按钮状态
getPaginationInfo()String 分页信息获取分页描述信息

5. tabManager.js - 标签管理器

功能: 管理页面标签切换功能

构造函数:

  • constructor()

方法列表:

方法参数返回值功能描述
init()void初始化标签管理器
switchTab(tabId)tabId: 目标标签IDvoid切换到指定标签页
onTabChange(tabId)tabId: 当前标签IDvoid标签切换回调函数
showTab(tabId)tabId: 目标标签IDvoid显示指定标签页(外部调用)
getActiveTab()String 激活标签ID获取当前激活标签

6. relationshipInputManager.js - 关系输入组件

功能: 提供关系建立的表单输入功能

构造函数:

  • constructor(containerId, options = {})

方法列表:

方法参数返回值功能描述
init()void初始化表单
render()void渲染表单HTML结构
initPersonSearch()void初始化人员搜索组件
bindEvents()void绑定事件监听器
updateAddButtonState()void更新添加按钮状态
handleAddRelationship()void处理添加关系逻辑
getFormData()Object 表单数据获取表单数据并进行验证
resetForm()void重置表单状态
destroy()void销毁组件,清理资源

📄 页面逻辑模块 (pages/)

1. personAdd.js - 人员添加页面

功能: 处理人员添加表单的渲染、验证和提交

构造函数:

  • constructor()

方法列表:

方法参数返回值功能描述
initEventListeners()void初始化事件监听器
initRealTimeValidation()void初始化实时验证
showFieldError(fieldName, errorMessage)fieldName: 字段名
errorMessage: 错误信息
void显示字段级错误提示
clearFieldError(fieldName)fieldName: 字段名void清除字段错误提示
toggleDeathInfo()void切换逝世信息显示状态
handleFormSubmit()void处理表单提交
validateDateFields()Boolean 是否有效验证日期字段有效性
validateFormStepByStep(data)data: 表单数据Boolean 是否通过验证分步骤验证表单数据
focusField(fieldName)fieldName: 字段名void聚焦到指定字段
focusFirstBirthDateField()void聚焦到第一个出生日期字段
focusFirstDeathDateField()void聚焦到第一个逝世日期字段
ensureRequiredStates()void确保必填状态正确
validateBusinessRules(data)data: 表单数据Boolean 是否通过验证验证业务规则
showValidationErrors(errors)errors: 错误信息void显示验证错误
submitForm(formData)formData: 表单数据void提交表单数据
handleSuccess(result, formData)result: 响应结果
formData: 表单数据
void处理成功响应
handleError(error)error: 错误对象void处理错误响应
showLoading(show)show: 显示状态void显示加载状态
collectFormData()Object 表单数据收集表单数据
resetForm()void重置表单状态
clearAllFieldErrors()void清除所有字段错误
destroy()void销毁实例,清理事件监听器

2. personList.js - 人员列表页面

功能: 管理人员列表的显示、搜索、分页和操作

构造函数:

  • constructor()

方法列表:

方法参数返回值功能描述
init()Promise初始化页面
initializeComponents()void初始化组件
initEventListeners()void初始化事件监听器
loadPersons()Promise加载人员列表数据
updatePagination()void更新分页信息
getPaginationInfo()String 分页信息获取分页描述信息
handleTableAction(action, personId)action: 操作类型
personId: 人员ID
void处理表格操作
handleViewPerson(personId)personId: 人员IDvoid处理查看人员详情
handleEditPerson(personId)personId: 人员IDvoid处理编辑人员
deletePerson(personId)personId: 人员IDPromise删除指定人员
handleSearch()void处理搜索操作
handlePageChange(page)page: 目标页码void处理页面切换
showMessage(message, type)message: 消息内容
type: 消息类型
void显示消息提示
destroy()void清理资源

3. personDetail.js - 人员详情页面

功能: 显示人员详细信息模态框

构造函数:

  • constructor()

方法列表:

方法参数返回值功能描述
init()void初始化页面
bindGlobalEvents()void绑定全局事件
isModalOpen()Boolean 模态框状态检查模态框是否打开
viewPerson(personId)personId: 人员IDPromise查看人员详情
showPersonDetail(personId)personId: 人员IDPromise显示人员详情数据
renderPersonDetail(person)person: 人员对象void渲染人员详情内容
openModal()void打开详情模态框
closeModal()void关闭详情模态框
editCurrentPerson()void编辑当前显示的人员
showLoading(show)show: 显示状态void显示加载状态
formatDateTime(dateTimeString)dateTimeString: 日期时间字符串String 格式化时间格式化日期时间显示
showMessage(message, type)message: 消息内容
type: 消息类型
void显示消息提示

4. personEdit.js - 人员编辑页面

功能: 处理人员信息编辑功能

构造函数:

  • constructor()

方法列表:

方法参数返回值功能描述
init()void初始化页面
initializeManagers()void初始化管理器
initializeDateManagers()void初始化日期管理器
bindEvents()void绑定事件监听器
editPerson(personId)personId: 人员IDPromise编辑指定人员
showEditForm(personId)personId: 人员IDPromise显示编辑表单
renderEditForm(person)person: 人员对象void渲染编辑表单
bindFormEvents()void绑定表单事件
savePersonEdit()Promise保存人员编辑
validateForm()Boolean 是否有效验证表单数据
validateDateFields(formData)formData: 表单数据Array 错误信息验证日期字段
submitForm(formData)formData: 表单数据Promise提交表单数据
showLoading(show)show: 显示状态void显示加载状态
collectFormData()Object 表单数据收集表单数据
toggleDeathInfo(show)show: 显示状态void切换逝世信息显示
handleValidationError(errors)errors: 错误信息void处理验证错误
handleSaveSuccess(result)result: 响应结果void处理保存成功
handleSaveError(error)error: 错误对象void处理保存错误
hasChanges()Boolean 是否有变更检查表单是否有变更
updateSaveButtonState()void更新保存按钮状态
handleCloseRequest()void处理关闭请求
openModal()void打开编辑模态框
closeModal()void关闭编辑模态框
showMessage(message, type)message: 消息内容
type: 消息类型
void显示消息提示
isModalOpen()Boolean 模态框状态检查模态框是否打开

5. relationshipAdd.js - 关系添加页面

功能: 处理亲属关系建立功能

构造函数:

  • constructor()

方法列表:

方法参数返回值功能描述
init()void初始化页面
initializeComponents()void初始化组件
handleAddRelationship(formData)formData: 表单数据Promise处理添加关系逻辑
showCreationMessages(messages, totalCount)messages: 创建消息
totalCount: 总数
void显示关系创建消息
formatCreationMessages(messages)messages: 消息数组String HTML字符串格式化创建消息显示
showMessage(message, type)message: 消息内容
type: 消息类型
void显示简单消息提示
destroy()void销毁页面,清理资源

🚀 应用入口 (main.js)

功能: 统一管理应用初始化和模块加载

构造函数:

  • constructor()

方法列表:

方法参数返回值功能描述
init()Promise初始化应用
initCoreModules()Promise初始化核心模块
initPageComponents()Promise初始化页面组件
initPersonPages()Promise初始化人员相关页面
initRelationshipPages()Promise初始化关系相关页面
initAddPages()Promise初始化添加页面
loadModule(moduleName, initFunction)moduleName: 模块名
initFunction: 初始化函数
Promise动态加载模块
showGlobalError(message)message: 错误消息void显示全局错误提示
getStatus()Object 应用状态获取应用运行状态
reinit()Promise重新初始化应用
destroy()void销毁应用,清理资源

🔄 数据流与状态管理

数据流架构

用户操作 → 事件监听器 → 数据处理 → API调用 → 后端服务
    ↓
后端响应 → 状态更新 → UI渲染 → 用户反馈

状态管理

// 应用状态示例
{
    currentPage: 1,                    // 当前页码
    pageSize: 10,                      // 每页数量
    totalPersons: 0,                   // 总人员数
    searchKeyword: '',                 // 搜索关键词
    searchGender: '',                  // 性别筛选
    currentPerson: null,               // 当前选中人员
    originalData: null,                // 原始数据(用于比较变更)
    activeTab: 'add-person',           // 激活标签
    formData: {},                      // 表单数据
    validationErrors: [],              // 验证错误
    isLoading: false,                  // 加载状态
    isProcessing: false                // 处理中状态
}

🛡️ 错误处理机制

1. 网络错误处理

try {
    const result = await ApiService.request(endpoint, options);
    // 处理成功响应
} catch (error) {
    // 统一错误处理
    MessageManager.showError(error.message);
    // 恢复界面状态
    this.showLoading(false);
    this.enableAllDeleteButtons?.();
}

2. 表单验证流程

// 分步骤验证
1. 基础非空验证 → 即时反馈(实时验证)
2. 格式验证 → 失焦时验证(字段级验证)
3. 业务逻辑验证 → 提交时验证(表单级验证)
4. 服务端验证 → API返回验证(最终验证)

📊 性能优化策略

1. 加载优化

  • 按需加载: 组件按需初始化,避免不必要的资源消耗

  • 数据分页: 每页10条数据,减少初始加载数据量

  • 延迟搜索: 输入时延迟搜索,避免频繁API请求

  • 组件缓存: 重复使用的组件实例化一次

2. 用户体验优化

  • 即时反馈: 所有操作都有明确的加载状态和结果提示

  • 状态保持: 搜索条件、分页状态在操作间保持连续性

  • 错误恢复: 操作失败后自动恢复可操作状态

  • 渐进式验证: 分步骤验证,提供清晰的错误指引

🎯 核心业务逻辑

1. 人员信息验证规则

// 必填字段验证
1. 姓名 → 非空验证(trim后长度 > 0)
2. 性别 → 选项验证 (M/F)
3. 出生日期 → 日期格式验证 + 范围验证(1900-2100)
4. 在世状态 → 逻辑验证

// 条件验证
if (!isLiving) {
    // 不在世人员必须填写逝世日期
    validateDeathDate()
    // 逝世日期不能早于出生日期
    validateDeathAfterBirth()
}

2. 日期处理逻辑

// 日期精度处理
switch(accuracy) {
    case 'exact':      // 精确到日 → 年+月+日(全部必填)
    case 'year_month': // 精确到月 → 年+月(日默认为01)  
    case 'year_only':  // 精确到年 → 年(月日默认为01-01)
}

// 日期类型处理
switch(dateType) {
    case 'solar': // 公历日期 → 直接显示
    case 'lunar': // 农历日期 → 转换为中文显示
}

3. 关系建立逻辑

// 关系类型映射
关系类型: {
    'parent': '父母关系',  // A是B的父母
    'spouse': '配偶关系',  // A是B的配偶  
    'child': '子女关系'    // A是B的子女
}

// 关系验证规则
1. 不能选择同一人员(from_person_id ≠ to_person_id)
2. 关系类型必须选择
3. 人员必须存在(通过ID验证)
4. 防止重复关系(后端唯一性约束)

✅ 系统运行状态

已验证功能

  • 标签切换功能: 新增成员 ↔ 添加关系 正常切换

  • 人员CRUD操作: 添加、查看、编辑、删除功能完整

  • 关系建立: 亲属关系创建和自动反向关系生成

  • 搜索筛选: 按姓名、性别组合搜索正常

  • 分页显示: 数据分页和导航功能完善

  • 日期管理: 多精度日期输入和验证

  • 消息提示: 统一的消息反馈机制

  • 错误处理: 完善的错误处理和状态恢复

技术特点

  • 模块化设计: 功能清晰分离,便于维护和测试

  • 统一管理: API、消息、验证统一处理,减少重复代码

  • 用户体验优先: 即时反馈、状态指示、渐进式交互

  • 错误恢复: 完善的错误处理和状态恢复机制

  • 性能优化: 按需加载、分页处理、延迟搜索

  • 安全性: XSS防护、输入验证、API安全调用

🔧 部署说明

环境要求

  • 现代浏览器支持 ES6+(Chrome 60+, Firefox 55+, Safari 11+)

  • 后端API服务运行在端口 8000

  • Web服务运行在端口 5000

启动流程

  1. 启动后端FastAPI服务 (localhost:8000)

  2. 启动前端Flask服务 (localhost:5000)

  3. 浏览器访问 https://localhost:5000

这套前端架构确保了系统的稳定性、可用性和可维护性,为用户提供了流畅的家谱管理体验。