feat(widget): 新增评论组件核心功能及开发环境配置

新增评论组件核心功能,包括评论列表、分页、回复、表单验证等功能
添加开发环境配置,包括Vite构建配置、样式变量和工具函数
实现管理员验证功能,支持本地存储加密
添加组件基础类及常用组件如加载状态、分页、模态框等
配置文档站点构建流程,支持widget独立构建和集成
This commit is contained in:
anghunk
2026-01-22 09:01:11 +08:00
parent f221245c44
commit 6555907156
28 changed files with 7 additions and 7 deletions

View File

@@ -0,0 +1,124 @@
/**
* Pagination 分页组件
*/
import { Component } from './Component.js';
export class Pagination extends Component {
/**
* @param {HTMLElement|string} container - 容器元素或选择器
* @param {Object} props - 组件属性
* @param {number} props.currentPage - 当前页码
* @param {number} props.totalPages - 总页数
* @param {Function} props.onPrev - 上一页回调
* @param {Function} props.onNext - 下一页回调
* @param {Function} props.onGoTo - 跳转页码回调
*/
constructor(container, props = {}) {
super(container, props);
this.state = {
currentPage: props.currentPage || 1,
totalPages: props.totalPages || 1
};
}
/**
* 计算显示的页码最多5个
* @returns {number[]}
*/
getDisplayedPages() {
const { currentPage, totalPages } = this.state;
const pages = [];
const maxVisible = 5;
const start = Math.max(1, currentPage - Math.floor(maxVisible / 2));
const end = Math.min(totalPages, start + maxVisible - 1);
for (let i = end - maxVisible + 1; i <= end; i++) {
if (i >= 1) {
pages.push(i);
}
}
return pages.slice(0, maxVisible);
}
render() {
if (this.state.totalPages <= 1) {
this.empty(this.container);
return;
}
const displayedPages = this.getDisplayedPages();
const root = this.createElement('div', {
className: 'cwd-pagination',
children: [
// 上一页按钮
this.createElement('button', {
className: 'cwd-page-btn',
attributes: {
type: 'button',
disabled: this.state.currentPage === 1,
onClick: () => this.handlePrev()
},
text: '上一页'
}),
// 页码按钮
this.createElement('div', {
className: 'cwd-page-numbers',
children: displayedPages.map(page =>
this.createElement('button', {
className: `cwd-page-num ${page === this.state.currentPage ? 'cwd-page-num-active' : ''}`,
attributes: {
type: 'button',
onClick: () => this.handleGoTo(page)
},
text: page.toString()
})
)
}),
// 下一页按钮
this.createElement('button', {
className: 'cwd-page-btn',
attributes: {
type: 'button',
disabled: this.state.currentPage === this.state.totalPages,
onClick: () => this.handleNext()
},
text: '下一页'
})
]
});
this.elements.root = root;
this.empty(this.container);
this.container.appendChild(root);
}
updateProps() {
// 更新状态并重新渲染
this.state.currentPage = this.props.currentPage;
this.state.totalPages = this.props.totalPages;
this.render();
}
handlePrev() {
if (this.props.onPrev) {
this.props.onPrev();
}
}
handleNext() {
if (this.props.onNext) {
this.props.onNext();
}
}
handleGoTo(page) {
if (this.props.onGoTo) {
this.props.onGoTo(page);
}
}
}