# ldesign-work-log
**Repository Path**: ldesign-v1/ldesign-work-log
## Basic Information
- **Project Name**: ldesign-work-log
- **Description**: ???? - ??/??/???????
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-12
- **Last Updated**: 2026-04-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# @ldesign/work-log
工作日志组件,支持日报/周报/月报的结构化填写、模板管理和统计分析。
## ✨ 特性
- 📝 **结构化填报** - 今日完成/明日计划/需要协调/心得备注等结构化模板
- 📅 **日历视图** - 日历面板快速翻阅历史日志,缺填日期高亮提醒
- 📋 **多种周期** - 日报/周报/月报/自定义周期
- 📄 **模板管理** - 自定义日志模板,部门级模板统一配置
- 🔗 **关联事项** - 日志关联任务/项目/工单,自动汇总工时
- 👥 **团队概览** - 管理者视角查看团队成员日志提交情况
- 💬 **评论批注** - 上级对日志的评论与批注
- 📊 **统计汇总** - 工作量统计、工时分布、关键词词云
- 🔔 **填报提醒** - 定时提醒填写日志,未填写预警
- 📤 **导出功能** - 导出个人/团队日志报告(Excel/PDF)
- 📱 **移动端适配** - 移动端快速填报
- 🌓 **主题切换** - 亮色/暗色主题
---
## 📦 安装
```bash
# 使用 pnpm
pnpm add @ldesign/work-log
# 使用 npm
npm install @ldesign/work-log
# Vue 用户
pnpm add @ldesign/work-log-vue
```
## 🚀 快速开始
### 原生 JavaScript/TypeScript
```typescript
import { createWorkLog } from '@ldesign/work-log';
// 创建工作日志实例
const workLog = createWorkLog({
container: '#work-log',
type: 'daily', // 'daily' | 'weekly' | 'monthly'
theme: 'light', // 'light' | 'dark'
showCalendar: true,
showStats: false,
// 值变更回调
onChange: (entry) => {
console.log('内容变更:', entry);
},
// 保存回调
onSave: (entry) => {
console.log('保存:', entry);
},
});
// 获取当前数据
const data = workLog.getValue();
// 设置数据
workLog.setValue({
sections: [
{ key: 'completed', title: '今日完成', content: '完成了XX功能开发' }
],
workHours: 8,
tags: ['开发', '前端']
});
// 保存并提交
const entry = workLog.save();
// 切换主题
workLog.setTheme('dark');
// 切换日志类型
workLog.setType('weekly');
// 销毁实例
workLog.destroy();
```
### Vue 3 使用方式
#### 方式一:组件方式
```vue
```
#### 方式二:Composable 方式
```vue
```
#### 方式三:插件注册
```typescript
// main.ts
import { createApp } from 'vue';
import { WorkLogPlugin } from '@ldesign/work-log-vue';
import App from './App.vue';
const app = createApp(App);
// 全局注册组件
app.use(WorkLogPlugin);
// 或带前缀注册
app.use(WorkLogPlugin, { prefix: 'Ld' }); // LdWorkLog, LdWorkLogEditor...
app.mount('#app');
```
---
## 📁 项目结构
```
work-log/
├── packages/
│ ├── core/ # 核心库 @ldesign/work-log
│ │ └── src/
│ │ ├── core/ # 核心引擎
│ │ │ ├── work-log.ts # WorkLog 主类
│ │ │ └── event-emitter.ts # 事件发射器
│ │ ├── templates/ # 日志模板
│ │ │ ├── builtin-templates.ts # 内置模板
│ │ │ └── template-manager.ts # 模板管理器
│ │ ├── calendar/ # 日历功能
│ │ │ ├── calendar.ts # 日历逻辑
│ │ │ └── date-utils.ts # 日期工具
│ │ ├── stats/ # 统计分析
│ │ │ └── stats-engine.ts # 统计引擎
│ │ ├── renderer/ # DOM渲染
│ │ │ ├── dom-renderer.ts # DOM渲染器
│ │ │ └── style-manager.ts # 样式管理
│ │ ├── theme/ # 主题系统
│ │ │ ├── theme-manager.ts # 主题管理器
│ │ │ └── tokens.ts # 设计Token
│ │ ├── utils/ # 工具函数
│ │ │ └── index.ts # 通用工具
│ │ ├── types/ # TypeScript 类型
│ │ │ └── index.ts # 类型定义
│ │ └── index.ts # 入口导出
│ └── vue/ # Vue 组件 @ldesign/work-log-vue
│ └── src/
│ ├── components/ # Vue 组件
│ │ ├── WorkLog.vue # 主组件
│ │ ├── WorkLogEditor.vue # 编辑器组件
│ │ ├── WorkLogCalendar.vue # 日历组件
│ │ └── WorkLogStats.vue # 统计组件
│ ├── composables/ # Vue Composables
│ │ └── useWorkLog.ts # useWorkLog Hook
│ ├── plugins/ # Vue 插件
│ │ └── work-log-plugin.ts # 插件定义
│ └── index.ts # 入口导出
├── playground/ # 演示应用
└── README.md
```
---
## 📖 API 文档
### WorkLog 配置 (WorkLogConfig)
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `container` | `string \| HTMLElement` | - | 挂载容器(必需) |
| `type` | `'daily' \| 'weekly' \| 'monthly'` | `'daily'` | 日志类型 |
| `date` | `Date \| string` | 当前日期 | 初始日期 |
| `theme` | `'light' \| 'dark'` | `'light'` | 主题模式 |
| `template` | `LogTemplate` | 内置模板 | 自定义模板 |
| `data` | `Partial` | - | 初始数据 |
| `logs` | `LogEntry[]` | - | 日志记录(用于日历标记) |
| `disabled` | `boolean` | `false` | 是否禁用 |
| `readonly` | `boolean` | `false` | 是否只读 |
| `showCalendar` | `boolean` | `true` | 是否显示日历 |
| `showStats` | `boolean` | `false` | 是否显示统计 |
### WorkLog 实例方法
| 方法 | 说明 |
|------|------|
| `getValue()` | 获取当前日志数据 |
| `setValue(entry)` | 设置日志数据 |
| `save()` | 保存并提交日志 |
| `clear()` | 清空日志内容 |
| `setDate(date)` | 设置日期 |
| `getDate()` | 获取当前日期 |
| `setType(type)` | 设置日志类型 |
| `setTemplate(template)` | 设置自定义模板 |
| `setTheme(theme)` | 设置主题 |
| `setDisabled(disabled)` | 设置禁用状态 |
| `setLogs(logs)` | 设置日志记录 |
| `getStats()` | 获取统计数据 |
| `prevMonth()` | 导航到上一个月 |
| `nextMonth()` | 导航到下一个月 |
| `goToday()` | 导航到今天 |
| `on(event, callback)` | 注册事件监听 |
| `focus()` | 聚焦编辑器 |
| `blur()` | 失焦编辑器 |
| `destroy()` | 销毁实例 |
| `refresh()` | 强制重新渲染 |
| `exportToJson()` | 导出为JSON |
| `importFromJson(json)` | 从JSON导入 |
### 事件
| 事件名 | 参数 | 说明 |
|--------|------|------|
| `change` | `Partial` | 内容变更 |
| `save` | `LogEntry` | 保存完成 |
| `date-change` | `string` | 日期变更 |
| `type-change` | `LogType` | 类型变更 |
| `theme-change` | `ThemeMode` | 主题变更 |
| `focus` | - | 聚焦 |
| `blur` | - | 失焦 |
| `error` | `Error` | 错误 |
### 内置模板
| 模板Key | 名称 | 说明 |
|---------|------|------|
| `daily-default` | 日报模板 | 标准日报,含今日完成/明日计划/问题协调/心得备注 |
| `weekly-default` | 周报模板 | 标准周报,含本周总结/下周计划/项目进展/风险预警 |
| `monthly-default` | 月报模板 | 标准月报,含月度总结/关键成果/问题分析/下月规划 |
| `daily-simple` | 简洁日报 | 简化版,仅完成与计划 |
| `daily-dev` | 研发日报 | 研发专用,含需求/Bug/代码审查/技术调研 |
| `weekly-project` | 项目周报 | 项目管理专用,含进度/风险/资源/质量 |
---
## 🎨 主题定制
### 使用CSS变量
组件通过CSS变量实现主题,可直接覆盖:
```css
:root {
--wl-primary: #4f6ef7;
--wl-bg: #f7f8fa;
--wl-text: #1a1a2e;
/* 更多变量... */
}
```
### 编程式切换
```typescript
// 切换主题
workLog.setTheme('dark');
// 监听主题变化
workLog.on('theme-change', (theme) => {
console.log('主题切换为:', theme);
});
```
---
## 📊 统计功能
```typescript
import { StatsEngine } from '@ldesign/work-log';
// 计算统计数据
const stats = StatsEngine.compute(logs);
console.log(stats.totalDays); // 填报天数
console.log(stats.completionRate); // 完成率
console.log(stats.totalHours); // 总工时
console.log(stats.streak); // 连续填报天数
console.log(stats.weeklyData); // 按周统计
console.log(stats.tagDistribution); // 标签分布
// 获取月度填报率
const monthlyRates = StatsEngine.getMonthlyRates(logs, 6);
// 获取工时分布
const hoursDist = StatsEngine.getHoursDistribution(logs);
```
---
## 🔧 高级用法
### 自定义模板
```typescript
import type { LogTemplate } from '@ldesign/work-log';
import { TemplateManager } from '@ldesign/work-log';
const customTemplate: LogTemplate = {
name: '自定义日报',
key: 'my-daily',
description: '团队专用日报模板',
type: 'daily',
sections: [
{
key: 'tasks',
title: '任务完成',
placeholder: '请输入完成的任务...',
required: true,
},
{
key: 'plans',
title: '明日计划',
placeholder: '请输入明日计划...',
required: true,
},
{
key: 'issues',
title: '问题反馈',
placeholder: '请输入遇到的问题...',
required: false,
},
],
};
// 注册模板
const templateManager = new TemplateManager();
templateManager.register(customTemplate);
// 使用自定义模板
workLog.setTemplate(customTemplate);
```
### 导出JSON
```typescript
// 导出
const json = workLog.exportToJson();
// 导入
workLog.importFromJson(json);
```
---
## 📱 响应式设计
组件自动适配移动端,在小屏幕下:
- 侧边栏自动隐藏
- 日历和统计面板堆叠显示
- 触控友好的交互
---
## 🔗 相关链接
- [LDesign 官方文档](https://ldesign.github.io)
- [GitHub 仓库](https://github.com/ldesign/ldesign)
- [问题反馈](https://github.com/ldesign/ldesign/issues)
---
## 📄 License
MIT