文档目录
UI组件库

简介

本文件为 DouPHP 后台管理系统的 UI 组件库文档,聚焦于后台界面中常用的按钮、模态框、下拉菜单、标签页、导航栏等组件。文档从系统架构、组件职责、数据流与事件处理入手,说明各组件的 API 接口、配置选项、事件机制与样式定制方法,并提供开发示例与最佳实践,帮助开发者快速复用现有组件、组合复杂界面并实现自定义扩展。

项目结构

后台 UI 由“布局壳层 + 可复用片段 + 通用样式 + 通用脚本”构成:

  • 布局壳层:通过 index.htm 引入 header、sidebar、toolbar、footer 等公共片段,形成固定顶栏、侧边栏、工具栏与内容区。
  • 可复用片段:page_header、pager、file_input、editor 等用于页面级复用。
  • 样式:common.css 提供全局重置、布局、按钮、表单、表格、分页、模态框等;form.css 补充表单相关样式。
  • 脚本:common.js 提供删除、提交、状态切换、下拉菜单、侧边子菜单定位、文件上传预览与裁剪、自动高度文本域等交互能力。
graph TB
A["index.htm<br/>入口模板"] --> B["header.tpl<br/>顶栏"]
A --> C["sidebar.tpl<br/>侧边栏"]
A --> D["toolbar.tpl<br/>工具栏"]
A --> E["footer.tpl<br/>页脚含隐藏表单"]
A --> F["common.css<br/>全局样式"]
A --> G["common.js<br/>通用交互"]
D --> H["page_header.tpl<br/>页面头部"]
D --> I["pager.tpl<br/>分页"]
F --> J["form.css<br/>表单样式"]

图示来源

  • admin/view/index.htm:1-224
  • admin/view/inc/header.tpl
  • admin/view/inc/sidebar.tpl
  • admin/view/inc/toolbar.tpl
  • admin/view/inc/footer.tpl
  • admin/view/inc/page_header.tpl
  • admin/view/inc/pager.tpl
  • admin/view/css/common.css
  • admin/view/css/form.css
  • admin/view/js/common.js

核心组件

  • 布局壳层
    • 顶栏:站点名、用户操作入口、下拉菜单。
    • 侧边栏:一级菜单与二级子菜单,支持悬停弹出与当前模块展开。
    • 工具栏:页面级操作入口,支持下拉菜单。
    • 内容区:页面主体,支持独立页面模式与带二级导航模式。
  • 表单与数据展示
    • 表单控件:输入框、选择框、文本域、文件上传、编辑器。
    • 表格与分页:统一边框与行高,配合 pager 片段。
  • 交互组件
    • 按钮:主按钮、次按钮、危险按钮等语义化样式。
    • 下拉菜单:基于 hover 激活,CSS 控制显隐。
    • 模态框:通过 AJAX 动态加载 HTML 片段到 body。
    • 状态切换:无刷新布尔字段切换,AJAX 更新 UI。
    • 文件上传:本地预览、裁剪、替换、删除。
    • 自动高度文本域:根据内容自适应高度。

架构总览

后台 UI 采用“模板片段 + 样式 + 脚本”的解耦方式:

  • 模板负责结构与数据绑定,片段化复用。
  • 样式集中在 common.css,按章节组织(重置、工具类、布局、按钮、表单、表格、分页、模态框等)。
  • 脚本集中在 common.js,使用事件委托与协议化属性(如 data-url、data-confirm、data-state)驱动交互。
sequenceDiagram
participant U as "用户"
participant T as "模板(index.htm)"
participant S as "样式(common.css)"
participant J as "脚本(common.js)"
participant R as "服务端路由"
U->>T : 打开后台首页
T-->>S : 加载全局样式
T-->>J : 加载通用脚本
U->>J : 点击删除/提交/切换
J->>R : 发送请求(POST/GET/DELETE)
R-->>J : 返回HTML或JSON
J-->>U : 更新DOM/提示/跳转

图示来源

  • admin/view/index.htm:1-224
  • admin/view/css/common.css
  • admin/view/js/common.js

详细组件分析

导航栏与侧边栏

  • 顶栏
    • 结构:Logo、站点名、右侧导航与下拉菜单。
    • 交互:hover 激活下拉菜单,active 状态高亮。
    • 响应式:移动端缩小间距,隐藏站点名。
  • 侧边栏
    • 结构:一级菜单项与二级子菜单 ul.sub-menu。
    • 交互:当前模块内联展开;非当前模块悬停弹出 fixed 定位的子菜单,JS 计算视口坐标避免溢出。
    • 滚动位置:点击菜单项保存滚动位置,下次恢复。
    • 响应式:窄屏下仅显示图标,展开时显示当前模块子菜单。
flowchart TD
Start(["鼠标进入侧边栏子菜单"]) --> Calc["计算弹出位置<br/>top/left"]
Calc --> Check{"是否超出视口底部?"}
Check -- 是 --> Adjust["调整top至可视区域"]
Check -- 否 --> Keep["保持原top"]
Adjust --> Show["显示子菜单"]
Keep --> Show
Show --> End(["完成"])

图示来源

  • admin/view/js/common.js:62-76
  • admin/view/css/common.css:394-575

工具栏与页面头部

  • 工具栏
    • 结构:固定顶部工具条,包含操作按钮与下拉菜单。
    • 交互:下拉菜单 hover 激活,active 状态显示菜单。
  • 页面头部
    • 结构:标题与操作区,支持副操作区。
    • 用途:统一页面标题与动作入口,便于复用。

按钮

  • 语义化样式:主按钮、次按钮、危险按钮等,通过 class 区分。
  • 行为:结合 common.js 的事件委托,支持删除、提交、状态切换等操作。
  • 响应式:在小屏幕下调整内边距与字体大小。

表单控件与编辑器

  • 表单控件
    • 输入框、选择框、文本域:统一基础样式与对齐。
    • 自动高度文本域:autoTextarea 插件根据 min/max 行数自适应高度。
  • 文件上传
    • 本地预览:FileReader 读取并显示缩略图。
    • 裁剪:调用 douCrop 编辑图片,支持比例设置。
    • 替换/删除:通过 fileReplace/fileDel 与后端交互。
  • 编辑器
    • 通过 editor.tpl 片段集成富文本编辑器。

表格与分页

  • 表格
    • 统一边框、行高与背景色,支持子行与选中态。
  • 分页
    • 通过 pager.tpl 片段渲染分页控件,支持页码与跳转。

模态框

  • 触发:通过 douFrame(name, frame, url) 发起 AJAX 请求,将返回的 HTML 追加到 body。
  • 使用场景:弹窗表单、详情查看、确认对话框等。
sequenceDiagram
participant U as "用户"
participant J as "common.js"
participant R as "服务端"
participant D as "DOM"
U->>J : 调用 douFrame(name, frame, url)
J->>R : POST {name, frame}
R-->>J : 返回HTML片段
J->>D : append(html)
D-->>U : 显示模态框

图示来源

  • admin/view/js/common.js:602-612

下拉菜单

  • 交互:hover 添加 active 类以显示菜单,离开移除 active。
  • 样式:绝对定位、边框与悬停高亮。

状态切换(行内布尔切换)

  • 协议:元素携带 data-url、data-post、data-state、data-text-on/off、data-on-class/off-class、data-confirm-on/off。
  • 流程:点击后 AJAX POST 提交,成功则根据返回值翻转文字、类与行弱化样式,并显示提示。
  • 适用:启用/禁用、显示/隐藏、已读/未读等。
sequenceDiagram
participant U as "用户"
participant E as "元素(.js-toggle)"
participant J as "common.js"
participant S as "服务端"
U->>E : 点击
E->>J : 触发 douToggle()
J->>S : POST(data-url, data-post)
S-->>J : JSON{code : 'OK', message, data : {value : 1|0}}
J->>E : 应用状态(文字/类/行样式)
J-->>U : 提示成功/失败

图示来源

  • admin/view/js/common.js:25-47
  • admin/view/js/common.js:711-742
  • admin/view/js/common.js:747-800

删除与提交

  • 删除:douDelete(url, confirmMsg) 通过隐藏表单提交 DELETE(_method=DELETE),支持确认文案。
  • 提交:douPost(url, confirmMsg) 通过隐藏表单提交 POST,支持确认文案。
  • 事件委托:.js-delete 与 .js-post 类名统一绑定,避免内联 onclick 冲突。

页面布局与响应式

  • 布局壳层:#dou-header、#dou-sidebar、#dou-content、#dou-footer。
  • 响应式:窄屏下侧边栏宽度变化,子菜单隐藏,内容区 margin 调整。
  • 工具栏与二级导航:在 has-subnav 模式下,左侧固定子导航,右侧内容自适应。

依赖关系分析

  • 模板依赖
    • index.htm 依赖 header、sidebar、toolbar、footer 片段。
    • toolbar 可能包含 page_header 与 pager。
  • 样式依赖
    • common.css 提供全局样式与组件样式。
    • form.css 补充表单与表格样式。
  • 脚本依赖
    • common.js 依赖 jQuery、Alpine(slug 生成)、Pinyin(拼音转 slug)、cropper(裁剪)。
    • 文件上传依赖 douCrop 与 fileReplace/fileDel 等函数。
graph LR
I["index.htm"] --> H["header.tpl"]
I --> S["sidebar.tpl"]
I --> T["toolbar.tpl"]
I --> F["footer.tpl"]
T --> PH["page_header.tpl"]
T --> PG["pager.tpl"]
I --> CSS["common.css"]
I --> JS["common.js"]
CSS --> FORM["form.css"]
JS --> LIB["jQuery/Alpine/Pinyin/cropper"]

图示来源

  • admin/view/index.htm:1-224
  • admin/view/inc/header.tpl
  • admin/view/inc/sidebar.tpl
  • admin/view/inc/toolbar.tpl
  • admin/view/inc/footer.tpl
  • admin/view/inc/page_header.tpl
  • admin/view/inc/pager.tpl
  • admin/view/css/common.css
  • admin/view/css/form.css
  • admin/view/js/common.js

性能考虑

  • 事件委托:使用 document 级别的事件委托减少监听器数量,提升性能。
  • 懒加载与缓存:侧边栏滚动位置与页面滚动位置通过 localStorage 缓存,减少重复计算。
  • 图片优化:文件上传预览仅在必要时计算宽高,避免频繁重排。
  • 样式合并:common.css 集中管理,减少 HTTP 请求。
  • 异步交互:AJAX 局部更新 DOM,避免整页刷新。

故障排查指南

  • 删除/提交无效
    • 检查是否存在 #dou-delete-form 或 #dou-post-form 隐藏表单。
    • 确认 CSRF token 是否正确注入(meta csrf-token 与表单 token)。
  • 状态切换失败
    • 检查 data-url 与 data-post 是否正确。
    • 服务端需返回 JSON{code:'OK', message, data:{value:1|0}}。
  • 下拉菜单不显示
    • 检查元素是否带有 .dropdown 与 .dropdown-menu。
    • 确认 hover 事件是否被其他脚本拦截。
  • 文件上传预览异常
    • 检查 FileReader 兼容性。
    • 确认 douCrop 与 fileReplace/fileDel 函数可用。
  • 文本域高度异常
    • 检查 autoTextarea 是否初始化。
    • 确认 min/max 行数与 line-height 计算正确。

结论

DouPHP 后台 UI 组件库通过清晰的模板片段、统一的样式与脚本,提供了稳定易用的界面基础。开发者可基于现有组件快速构建复杂界面,并通过协议化属性与 AJAX 交互实现高效的数据更新。遵循一致性、可访问性与响应式设计原则,结合主题定制与样式覆盖的最佳实践,可进一步提升用户体验与维护效率。

附录

  • 常用类名与属性
    • 按钮:.btn-primary/.btn-secondary/.btn-danger(语义化样式)。
    • 下拉菜单:.dropdown/.dropdown-menu/.active。
    • 状态切换:.js-toggle、data-url、data-post、data-state、data-text-on/off、data-on-class/off-class、data-confirm-on/off。
    • 删除/提交:.js-delete、.js-post、data-url、data-confirm。
    • 文件上传:.file-input、.file-input-preview、.file-input-action-crop、.file-input-remove。
  • 主题定制建议
    • 优先覆盖 common.css 中的变量与关键类,避免直接修改源码。
    • 使用媒体查询适配不同屏幕尺寸。
    • 保持颜色对比度与焦点可见性,提升可访问性。
  • 开发示例路径
    • 按钮与表单:参考 admin/view/inc/file_input.tpl 与 form.css。
    • 模态框:参考 common.js 中的 douFrame 用法。
    • 状态切换:参考 common.js 中的 js-toggle 协议与服务端响应格式。
    • 分页:参考 admin/view/inc/pager.tpl。
添加日期:2026-10-05