You've already forked SmartisanNote.Remake
9.8 KiB
9.8 KiB
SmartisanNote.vue 项目概览
项目简介
这是一个基于 Vue 3 和 Vite 构建的单页 Web 应用(SPA),旨在模仿锤子科技(Smartisan)的便签应用。该项目使用 localStorage 进行本地数据持久化,支持便签的增删改查、文件夹管理、便签置顶、星标标记、基础设置(如云同步、深色模式)以及丰富的交互功能。
技术栈
- 核心框架: Vue 3 (Composition API)
- 构建工具: Vite
- 路由管理: vue-router
- 状态管理: Pinia (Vue 3 状态管理库)
- UI 库: 原生 CSS,使用了锤子便签的经典配色方案(定义在
index.html的 CSS 变量中) - 移动端支持: Capacitor (用于构建 Android/iOS 应用)
- 样式预处理器: Less
- 代码语言: JavaScript (ES6+)
- UI 组件库: Ionic Framework
- 日期处理: moment.js
项目结构
.
├── android/ # Capacitor Android 项目文件
├── dist/ # 构建后的生产文件
├── node_modules/ # 项目依赖
├── public/ # 静态资源目录
├── src/
│ ├── common/ # 全局样式和通用工具
│ ├── components/ # 可复用的 Vue 组件 (Header, NoteItem, FolderItem)
│ ├── pages/ # 页面级别的 Vue 组件 (NoteList, NoteEditor, Folder, Settings)
│ ├── stores/ # Pinia 状态管理 stores
│ │ └── useAppStore.js # 全局状态管理 store
│ ├── utils/ # 工具函数
│ │ ├── dateUtils.js # 日期处理工具,基于 moment.js
│ │ └── storage.js # localStorage 封装,负责数据的读写
│ ├── App.vue # 根组件
│ └── main.js # 应用入口,初始化路由、Pinia 和挂载
├── index.html # HTML 模板,包含 CSS 变量定义
├── package.json # 项目元数据和脚本命令
├── vite.config.js # Vite 构建配置
└── capacitor.config.json # Capacitor 配置文件
开发与构建命令
- 安装依赖:
npm install - 启动开发服务器:
npm run dev- 默认端口: 3000
- 基于 Vite,支持热更新。
- 构建生产版本:
npm run build- 使用 Vite 构建,并同步到 Capacitor 项目 (
npx cap sync)。
- 使用 Vite 构建,并同步到 Capacitor 项目 (
- 构建所有版本:
npm run build:all- 构建标准版本和 PWA 版本
- 部署PWA版本:
npm run deploy:pwa- 构建并部署PWA版本到FTP服务器
- 在 Android 设备上运行:
npm run android- 需要预先配置好 Android 开发环境。
核心功能
便签管理
- 增删改查: 支持创建、查看、编辑和删除便签
- 星标标记: 可以将重要便签标记为星标便签
- 置顶功能: 支持将便签置顶显示在列表顶部
- 图片标记: 可以标记便签中是否包含图片
- 滑动删除: 支持右滑显示删除按钮,带有阻尼效果的交互体验
- 富文本编辑: 支持加粗、居中、待办事项、列表、标题、引用等格式
文件夹管理
- 分类组织: 支持创建文件夹对便签进行分类管理
- 默认文件夹: 提供"全部便签"、"加星便签"、"回收站"等默认文件夹
搜索功能
- 全文搜索: 支持按标题和内容搜索便签
- 实时过滤: 搜索结果实时更新
设置功能
- 云同步: 支持云同步设置(待实现)
- 深色模式: 支持深色模式切换(待完善)
日期时间处理
- 智能格式化: 根据时间范围自动格式化日期显示
- 多场景适配: 不同页面使用不同的日期格式化规则
- 本地化支持: 支持中文日期格式显示
代码规范与开发约定
- 状态管理: 使用 Pinia 进行全局状态管理,通过
useAppStorecomposable 函数访问状态。 - 数据持久化: 所有数据(便签、文件夹、设置)均通过
src/utils/storage.js与localStorage进行交互。 - 路由: 使用
vue-router和createWebHashHistory进行前端路由管理。 - UI 风格: 颜色方案严格遵循
index.html中定义的 CSS 变量,以保持锤子便签的视觉风格。 - 组件组织: 页面组件 (
pages/) 和可复用组件 (components/) 分离,结构清晰。 - 代码风格: 采用标准的 Vue 3 Composition API 写法,使用 ES6 模块系统 (
import/export)。 - 日期处理: 使用 moment.js 进行日期处理,通过
src/utils/dateUtils.js统一管理日期格式化逻辑。
样式
- 全局样式文件是位于
common/目录下的base.css。 - 使用 Codefun 原子类样式,用于快速布局。
- 样式规范应遵循项目中已有的风格。
- 使用 Less 作为 CSS 预处理器。
JavaScript
- 严格遵循ES6规范。
- 遵循JavaScript函数式编程范式。
- 方法类函数应该使用
function进行定义。 - 避免出现超过4个以上的
ref,超过4个则使用reactive。 - 全局变量都集中放置于代码顶部。
- 变量名使用小驼峰命名法。
- 常量名使用全大写。
- 状态类变量命名参考
isLogin、isOpen。 - 事件类方法命名参考
onClick、onSelect。 - 变量都应该写有注释说明、类型说明。
Promise方法使用asyncawait写法,并进行容错处理。- 字符串拼接使用ES6的模板语法。
- JavaScript规范应遵循项目中已有的风格。
组件
- 全局组件放在
components/目录下。 - 页面独立组件放在页面根目录下的
components/。 - 每个组件应该附带
README.MD文档。 - 组件编写应遵循项目中已有的风格。
Header 组件
- 动态按钮: 根据页面状态显示不同的操作按钮(新建、保存、插入图片)
- 文件夹管理: 支持文件夹展开/收起功能
NoteItem 组件
- 滑动交互: 支持右滑显示删除按钮,带有阻尼效果
- 状态切换: 支持星标和置顶状态的切换
- 视觉反馈: 滑动时便签夹会切换状态,提供直观的交互反馈
- 日期显示: 显示格式化后的便签更新时间
RichTextEditor 组件
- 富文本编辑: 支持多种文本格式(加粗、居中、待办事项、列表、标题、引用)
- 图片插入: 支持插入图片功能
- 工具栏: 提供浮动工具栏,支持格式化操作
页面
- 页面使用 Composition API (setup语法糖) 编写。
- 注释、结构规范应遵循项目中已有的风格。
NoteListPage
- 便签列表: 显示所有便签,支持置顶便签优先显示
- 文件夹管理: 支持文件夹的展开和切换
- 搜索功能: 提供便签搜索功能
- 交互反馈: 显示便签总数和置顶便签数量
- 智能日期显示: 根据时间范围显示不同的日期格式
- 今天:显示为 "今天 下午 4:00"
- 昨天:显示为 "昨天 下午 4:00"
- 超过两天但小于一周:显示为 "星期一 10/8 上午 3:00"
- 超过一周但小于一年:显示为 "10天前 9/20 下午 2:00"
- 超过一年:显示为 "635天前 2024/8/10 上午 9:00"
NoteEditorPage
- 编辑模式: 支持新建和编辑便签
- 富文本编辑: 集成RichTextEditor组件,支持丰富的文本格式
- 图片插入: 支持通过工具栏插入图片
- 状态管理: 根据路由参数判断是新建还是编辑模式
- 智能日期显示: 根据时间范围显示不同的日期格式
- 今天:显示为 "今天 下午 4:00"
- 昨天:显示为 "昨天 下午 4:00"
- 超过两天但小于一个月:显示为 "10/8 上午 3:00"
- 超过一个月:显示为 "2024/8/10 上午 9:00"
状态管理 (Pinia)
项目现在使用 Pinia 作为状态管理解决方案,主要特点包括:
- Store 定义: 在
src/stores/useAppStore.js中定义了全局状态 store - 状态结构: 包含 notes、folders 和 settings 三个主要状态
- Getters: 提供了计算属性如 starredNotesCount 和 allNotesCount
- Actions: 包含所有状态变更操作,如 addNote、updateNote、deleteNote 等
- 数据持久化: 通过 storage.js 工具函数与 localStorage 进行数据交互
- Mock 数据: 支持加载预设的 mock 数据用于开发和演示
- 使用方式: 在组件中通过
const store = useAppStore()来访问状态和方法
新增功能特性
滑动交互
- 阻尼效果: 右滑超过阈值后提供阻尼效果,增强交互体验
- 状态切换: 滑动时便签夹会切换到展开状态,松开后根据位置决定是否保持展开
- 视觉反馈: 滑动过程中提供实时视觉反馈
Mock 数据
- 自动加载: 当检测到无数据时自动加载预设的 mock 数据
- 手动加载: 可通过 URL 参数
?mock=true强制加载 mock 数据 - 丰富内容: 包含多种类型的便签、文件夹和设置示例
- 固定日期: 使用固定的日期值确保数据一致性
增强的便签功能
- 置顶支持: 便签可以置顶显示在列表顶部
- 图片标记: 可以标记便签是否包含图片
- 排序优化: 置顶便签优先显示,按更新时间排序
PWA 支持
- 离线使用: 支持构建PWA版本,可离线使用
- 自动部署: 支持一键构建并部署到FTP服务器
智能日期处理
- 统一管理: 通过
dateUtils.js统一管理所有日期处理逻辑 - 多格式支持: 支持多种日期格式化方式以适应不同场景
- 本地化显示: 支持中文友好的日期时间显示
- 场景适配: 不同页面使用最适合的日期格式化规则