Commit 2350ed01 authored by Jawa Tang's avatar Jawa Tang

docs: add project technical documentation

parent 1e8e9645
# CLAUDE.md
This file provides guidance to Claude Code when working with code in this repository.
## Project Overview
vue2-countdown 是一个基于 Vue 2.0 的活动倒计时组件(v1.0.8,MIT),支持:
- 活动未开始时显示"距离开始"倒计时
- 活动进行中时显示"距离结束"倒计时
- 支持服务端当前时间(解决客户端时间不准问题)
- 开始/结束时触发自定义回调
## Usage
```javascript
import vue2Countdown from 'vue2-countdown'
Vue.use(vue2Countdown)
// 模板
<count-down
:currentTime="serverTimestamp"
:startTime="startTimestamp"
:endTime="endTimestamp"
:tipText="'距离开始'"
:tipTextEnd="'距离结束'"
:endText="'已结束'"
@start_callback="onStart"
@end_callback="onEnd"
/>
```
时间参数支持秒级(10位)和毫秒级(13位)时间戳,组件内自动判断。
## Key Props
| Prop | Type | Default | 说明 |
|------|------|---------|------|
| currentTime | Number | — | 服务端当前时间戳,不传则用客户端时间 |
| startTime | Number | — | 活动开始时间戳 |
| endTime | Number | — | 活动结束时间戳 |
| tipText | String | '距离开始' | 未开始时的前缀文字 |
| tipTextEnd | String | '距离结束' | 进行中的前缀文字 |
| endText | String | '已结束' | 结束后显示文字 |
| dayTxt | String | ':' | 天的分隔符 |
| hourTxt | String | ':' | 时的分隔符 |
| minutesTxt | String | ':' | 分的分隔符 |
| secondsTxt | String | ':' | 秒的分隔符 |
## Events
| 事件 | 触发时机 |
|------|---------|
| `start_callback` | 活动开始倒计时启动时 |
| `end_callback` | 倒计时归零(活动结束)时 |
## Files
```
lib/vue2-countdown.vue → 组件源码(单文件组件)
index.js → 注册入口(Vue.component)
example/index.html → 示例页面
example/lib/vue2-countdown.js → 编译后的示例用 JS
```
## Implementation Notes
- `runTime()` 方法:计算剩余时间分解为天/时/分/秒,用 `setTimeout` 递归驱动(每 1000ms)
- 补偿漂移:记录每次函数执行时间差 `diffPerFunc``setTimeout` 减去执行耗时
- `watch.currentTime`:监听服务端时间变化,重新触发 `gogogo()` 计算
- 天数为 0 时自动隐藏天的显示
# vue2-countdown
基于 Vue 2.0 的活动倒计时组件(v1.0.8,MIT)。支持服务端时间同步、活动开始前/进行中双阶段倒计时、自定义回调。
## 安装
```bash
npm install vue2-countdown
# 或从 GitHub 安装
npm install git+ssh://git@github.com/jinxiking/vue2-countdown.git
```
## 注册
```javascript
import vue2Countdown from 'vue2-countdown'
Vue.use(vue2Countdown) // 全局注册为 <count-down>
```
## 使用示例
```html
<count-down
:currentTime="serverTime"
:startTime="1700000000"
:endTime="1700086400"
:dayTxt="'天'"
:hourTxt="'时'"
:minutesTxt="'分'"
:secondsTxt="'秒'"
@start_callback="onActivityStart"
@end_callback="onActivityEnd"
/>
```
- 时间戳支持秒级(10位)和毫秒级(13位),组件自动识别
- `currentTime` 不传时使用客户端本地时间
## 显示逻辑
| 时间关系 | 显示内容 |
|---------|---------|
| `current < startTime` | 倒计时距离开始 |
| `startTime <= current < endTime` | 倒计时距离结束 |
| `current >= endTime` | 隐藏倒计时,触发 `end_callback` |
## 已知问题
- 秒表模式(`secondsFixed`)未实现
- 倒计时组件不自动清理定时器(页面销毁时 `setTimeout` 链仍在运行)
# Architecture
## 文件结构
```
vue2-countdown/
├── index.js → 入口,Vue.component('count-down', component) 注册
├── lib/
│ └── vue2-countdown.vue → 核心单文件组件
├── example/
│ ├── index.html → 示例页面
│ └── lib/vue2-countdown.js → 编译后的 UMD 产物(供示例用)
└── package.json
```
## 组件内部状态
```javascript
data: {
tipShow: true, // true=距离开始, false=距离结束
msTime: {
show: false, // 是否显示倒计时
day, hour, minutes, seconds // 各单位值
},
star, end, current // 统一转换为毫秒时间戳
}
```
## 核心方法
### gogogo()
入口计算方法,在 `mounted``watch.currentTime` 中触发。
1. 统一转换时间戳为毫秒
2. 根据当前时间与开始/结束时间的关系分支:
- 已结束 → `end_message()`
- 未开始 → `runTime(star, current, start_message)` 计算距开始剩余
- 进行中 → `runTime(end, star, end_message, true)` 计算距结束剩余
### runTime(startTime, endTime, callFun, type)
递归倒计时驱动:
1. 计算差值 `timeDistance = startTime - endTime`
2. 分解为天/时/分/秒,不足两位补零
3. 记录函数执行耗时 `diffPerFunc`,用 `setTimeout(fn, 1000 - diffPerFunc)` 补偿漂移
4. 下一轮:`endTime += 1000`(推进 1 秒)
5. `timeDistance <= 0` 时调 `callFun()`
### 事件
| 方法 | 触发事件 |
|------|---------|
| `start_message()` | `$emit('start_callback', true)` → 切换到结束倒计时 |
| `end_message()` | `$emit('end_callback', false)` |
## 模板结构
```html
<div>
<p v-if="msTime.show">
<span v-if="msTime.day > 0">{{ day }}</span> <!-- 天数为0时隐藏 -->
{{ hour }} : {{ minutes }} : {{ seconds }}
</p>
</div>
```
CSS 类 `.time_down_bgg`:60x32px 圆角方块,背景色 `#66A2A6`
# Dependencies
## 运行时依赖
| 依赖 | 版本要求 | 说明 |
|------|---------|------|
| vue | ^2.x | 宿主框架,组件基于 Vue 2.0 Options API |
无其他运行时依赖。
## 开发依赖
`package.json` 未声明 devDependencies。示例用的编译产物(`example/lib/vue2-countdown.js`)已预构建提交到仓库。
## 版本信息
- 包名:`vue2-countdown`
- 版本:`1.0.8`
- 主入口:`index.js`(UMD 格式,通过 `Vue.use()` 注册)
- 许可:MIT
- 作者:cgygd / 安装来源 jinxiking(fork)
## 兼容性
- Vue 2.x(不兼容 Vue 3,Composition API 未实现)
- 不依赖构建工具,`.vue` 单文件组件需要项目自带 vue-loader
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment