Skip to content

新增搜索功能: 前端新增搜索框,用户可以搜索匹配的图片


bug修复:

  • usePhotoStore 新增 searchPhotos 方法,用于处理搜索请求
  • NavBar 新增搜索框,用户可以输入搜索关键词,点击搜索按钮后触发搜索请求

前端优化:

  1. 搜索框默认只显示图标,用户点击之后才显示输入框
  2. 搜索之后跳转到单独的搜索结果页面,展示匹配的图片
    1. 搜索结果页面与src/views/album/location页面类似,展示匹配的图片,标题就是搜索关键词
    2. 搜索可能比较慢,需要有加载动画
    3. 搜索结果可能比较多,注意分页显示
  3. 后端接口适配前端需要

bug修复

  1. 点击搜索之后不能跳转到搜索结果页面

bug修复: UnifiedPhotoPage.vue是按时间线展示的,实际上搜索结果是按相似性排序的,不适合显示时间轴数据,因此不要使用UnifiedPhotoPage组件,使用简单的图片展示组件即可


优化:

  1. 搜索结果页面的图片展示组件,新增点击事件,点击后显示该图片的详情页面(PhotoLightbox.vue)
  2. 后端api支持设置搜索阈值,默认值为0.5,搜索相似度大于等于阈值的图片(search_by_text)

新增智能分类功能:

  1. 后端api支持查询图片标签,返回图片的标签列表和每个标签的封面(与location.py类似)
  2. 后端支持按标签查询图片列表
  3. 前端新增智能分类展示分类结果,用户可以点击分类查看对应图片(与src/views/album/location类似)

优化AI服务: 图像分类模块的文本编码embed使用sentence-transformers/clip-ViT-B-32-multilingual-v1模型,图片编码还使用原来的模型

AI服务优化:

  1. 启动时自动检测模型是否存在,不存在则自动下载
  2. 默认使用modelscope下载模型,放在data/models/目录下
  3. 人脸识别、图片分类模型都从data/models/目录加载
  4. 注意适配modelscope的模型目录结构

bug修复: task_worker.py的config_manager与主进程的config_manager是两个独立的对象,导致主进程修改配置之后,task_worker.py的配置没有更新,从而导致任务执行失败

优化模型下载方式:

  1. 每个服务设置一个单独的模型检测是否存在和模型下载的函数(类似现有的模型加载、释放),以便自定义不同模型的下载过程
  2. 模型下载失败或中断清理对应的文件夹,放置识别错误
  3. 下载采用多线程的方式,每个模型使用单独的下载线程,避免阻塞,主线程不需要等待模型下载即可对外提供api服务
  4. 模型不存在或者未下载完成,返回特定的响应码表示模型还未准备完成

前端优化:

  1. 把Navbar.vue的主题切换功能放到设置(Settings.vue)中

优化AI服务:

  1. 将所有AI模型使用的模型名都放到全局变量里,方便后续维护和管理。

  2. 设置一个配置文件,包括AI模型名称、参数(如果有的话)、阈值(如果有的话)等,方便后续修改和调整。

  3. 配置文件提供模型名称的选项,例如OCR模型有[server, mobile]两个版本,给出当前使用的模型名称和选项。

  4. 新增一个接口,用户可以在前端选择不同的AI模型版本(只能从配置文件中提供的选项中选择),例如OCR模型的[server, mobile]两个版本。把用户选择的模型版本保存到配置文件中。判断用户选择的模型版本是否存在,不存在则下载模型。


优化任务管理模块:

  1. 为每个任务类型添加一个运行时间,当该类型的任务一段时间没有运行时,释放任务对应的资源(现在是所有任务都没有运行时释放所有的资源)
  2. 增加失败任务重试功能,允许用户手动触发失败任务的重试

前端优化:

  1. 取消新建任务按钮
  2. 任务列表新增重试失败和强制重做所有按钮
  3. 失败任务数点击可以查看失败任务列表,显示失败详细信息

前端:

  1. 重试失败任务和强制重做所有是针对单个任务类似,而不是针对所有任务,在每个任务的操作菜单中新增重试和重做所有按钮
  2. 失败个数为0时,不显示查看详情

查看失败详情按照任务类型筛选,而不是直接获取全部失败任务然后在前端筛选


内存管理优化:

  1. 一段时间没有请求,重启服务

报告前后端数据对接:

  1. 整理合并annualReport.ts定义的数据,适配前端页面需要的字段
  2. 后端根据现有的数据,返回符合annualReport.ts定义的格式数据
    1. 对于现阶段不能获取的数据,使用默认示例数据代替,待后续实现

要求

  1. 不要修改前端页面显示的内容,以后端适配前端为主
  2. 标清现阶段不能满足要求的数据内容,写出todo待做事项

优化年度报告SectionLocation.vue:

  1. 地图按城市展示,有图片数据的城市点亮,其他城市保持默认状态
  2. 鼠标悬停在城市上可以查看该城市的图片数据
  3. 照片数最多的城市做个标记

修改server端api,与前端需求保持一致(后端应该返回每个城市的照片数)


优化人脸识别模块:

  1. faces表的face_feature字段改成postgresql的vector类型,用于存储人脸特征向量
  2. 优化face.py模块的process_single_photo函数,是否有必要每个face都要进行一次聚类,考虑批量聚类是否能提高效率,结合FaceClusterService的聚类算法,利用pgvector的索引是否有更高效的聚类方法
# 年度照片墙动态展示效果

## 二、 需求概述

在年度报告(package/website/components/annual-report),实现**多照片随机飞入-聚合成指定形状-平铺展开-满屏循环滚动**的动态视觉效果,适配多终端网页浏览,用于年度回顾、活动纪念等场景的网页展示模块。
作为年度报告的第二页,展示该年度的照片墙动态效果,后续页数自动顺延。

## 三、 核心交互与视觉效果
### 1.  初始阶段:照片随机飞入
- **视觉表现**:网页加载完成后,背景为预设纯色或主题图,所有照片素材从屏幕视口外(上下左右四个方向+四角)随机位置切入,伴随**差异化的飞入速度、轻微旋转角度(±15°内)、缩放渐变(从0.5倍放大至1倍)**,模拟动态汇聚的视觉感。
- **技术要求**
  - 飞入时长可配置,默认 `2.5s`,支持通过配置项调整;
  - 照片飞入过程无卡顿,支持批量加载(建议≤100张,避免性能过载);
  - 支持设置飞入延迟差(每张照片间隔 `0.05s` 启动,避免同步飞入的僵硬感)。

### 2.  核心阶段:照片聚合成形
- **视觉表现**:所有照片飞入结束后,平滑过渡至指定目标形状,照片间保留 `5px` 均匀间隙,无重叠遮挡,聚合完成后停留 `4s` 供用户观看。
- **支持形状及技术要求**
  | 目标形状 | 技术实现要点 |
  |----------|--------------|
  | **球形** | 基于 `3D` 变换(`CSS 3D Transforms`),构建球形坐标系,照片分布于球面,支持鼠标拖拽旋转查看不同角度的照片 |
  | **心形** | 预设心形路径坐标集,照片按坐标排列填充心形轮廓,边缘照片自动适配位置,保证形状完整 |
  | **文字排列** | 支持自定义文字(如“2025”“年度记忆”),基于文字轮廓生成坐标点,照片填充排列,文字大小可适配屏幕宽度 |
- **交互补充**:聚合状态下,支持鼠标悬浮单张照片时**轻微放大(1.1倍)+ 阴影加深**的高亮效果。

### 3.  过渡阶段:照片平铺展开
- **视觉表现**:聚合形状自动解散,所有照片统一调整为**水平正向(旋转角度归0)**,以**响应式网格布局**平铺填满整个网页视口,照片尺寸自适应,保证不同屏幕下无拉伸变形。
- **技术要求**
  - 展开过渡时长默认 `1.5s`,动画曲线为 `ease-in-out`;
  - 网格布局支持断点适配:PC端每行显示 `6-8` 张,平板端 `4-5` 张,移动端 `2-3` 张;
  - 照片间距统一为 `10px`,边缘与视口间距 `20px`。

### 4.  收尾阶段:满屏循环滚动
- **视觉表现**:平铺完成后自动触发循环滚动,支持两种滚动模式(二选一配置),滚动过程平滑匀速。
- **滚动模式及技术要求**
  - **横向滚动**:整行照片以 `50px/s` 的速度向左匀速移动,照片移出左视口后,从右视口无缝切入,实现无限循环;
  - **纵向滚动**:整列照片以 `30px/s` 的速度向上匀速移动,照片移出上视口后,从下视口无缝切入;
- 滚动结束之后进入第三页

## 四、 技术栈与开发要求

### 3.  性能要求
- 首屏加载时间≤ `3s`(在 `100Mbps` 网络环境下);
- 动画运行时,网页帧率稳定在 `60fps`,无明显掉帧;
- 支持照片数量上限 `120` 张

## 接口说明
- **获取年度照片数据**:server后端每个月最多选10张照片,最多120张照片

# 年度照片墙动态展示效果

## 二、需求概述

在年度报告(package/website/components/annual-report)模块中,实现一个高性能、响应式的照片墙动态展示效果,包含四个连贯的动画阶段:多照片随机飞入→聚合成指定形状→平铺展开→满屏循环滚动。该组件需完美适配PC、平板和移动端,作为年度报告的第二页展示,后续页面自动顺延编号。

## 三、核心交互与视觉效果

### 1. 初始阶段:照片随机飞入
- **视觉表现**:
  - 背景使用主题色或可配置的背景图
  - 照片从屏幕外8个方向(上、下、左、右、左上、右上、左下、右下)随机位置飞入
  - 每张照片具有差异化动画参数:
    * 飞入速度:1.5x-2.5x基础速度
    * 旋转角度:-15°至+15°随机
    * 缩放动画:从0.5倍渐增至1倍
- **技术要求**:
  - 动画时长:默认2.5秒,可通过配置项调整(1.5s-4s)
  - 延迟机制:每张照片间隔0.05秒启动
  - 性能优化:
    * 使用CSS硬件加速(transform3d)
    * 实现照片预加载机制
    * 限制最大并发动画数

### 2. 核心阶段:照片聚合成形
- **视觉表现**:
  - 聚合动画时长:1.5秒(ease-out曲线)
  - 形状保持时间:4秒(可配置)
  - 照片间距:5px均匀分布
- **支持形状实现方案**:
  | 形状类型 | 技术实现 | 交互功能 |
  |----------|----------|----------|
  | **球形** | Three.js或纯CSS 3D变换 | 支持鼠标拖拽旋转(阻尼效果) |
  | **心形** | SVG路径计算坐标 | 响应式边缘适配 |
  | **文字** | Canvas文字轮廓分析 | 支持动态文字内容 |
- **交互增强**:
  - Hover效果:放大1.1倍+box-shadow加深
  - 点击回调:触发照片详情展示

### 3. 过渡阶段:照片平铺展开
- **视觉表现**:
  - 动画时长:1.5秒(ease-in-out曲线)
  - 最终状态:
    * 所有照片角度归零
    * 等比例缩放填充
- **响应式布局**:
  | 设备类型 | 每行照片数 | 间距 |
  |----------|------------|------|
  | PC(>1200px) | 6-8张 | 10px |
  | 平板(768-1199px) | 4-5张 | 8px |
  | 移动端(<767px) | 2-3张 | 5px |
  - 边缘留白:20px安全间距

### 4. 收尾阶段:满屏循环滚动
- **滚动模式**:
  | 模式 | 速度 | 技术实现 |
  |------|------|----------|
  | 横向 | 50px/s | CSS动画+无缝衔接 |
  | 纵向 | 30px/s | requestAnimationFrame |
- **切换时机**:
  - 自动触发:平铺完成后2秒
  - 手动控制:支持暂停/继续

## 四、技术规范

### 性能要求
1. 加载优化:
   - 图片懒加载
   - WebP格式支持
   - 首屏加载≤3s(100Mbps)
2. 运行时性能:
   - 稳定60fps
   - 内存占用≤200MB
   - 支持120张照片上限

### 接口规范

- 获取逻辑:
  - 每月最多10张
  - 按时间倒序排列
  - 分页加载支持

### 开发要求
1. 组件化设计:
   - 可复用动画模块
   - 独立配置系统
2. 浏览器兼容:
   - 现代浏览器(Chrome/Firefox/Safari最新版)
   - 移动端WebView支持
3. 可访问性:
   - 键盘导航支持
   - ARIA标签完善

Ui优化:

  1. 布局更加紧凑,避免照片之间的间距过大,
  2. 默认横向移动,每行照片交错排列,(类似图片中这样)

接口对齐:

  1. server/app/api/annual_report.py,新增获取年度照片墙照片接口
    • 入参: start_time, end_time
    • 返回结果,按月分组,每个月包含照片数据列表(最多10张)
  2. 前端调用该接口,获取照片数据后,渲染到照片墙组件中

bug修复:

  1. 球形只能显示一半,其他部分不显示,转动之后也是只显示一半
  2. 球形形成之后改成自动旋转
  3. 最后的照片墙的里的照片尺寸缩小,而且要中间一排的照片尺寸要大一点

优化:

  1. 如果后端返回的照片数较少的情况下,前端需要把照片循环利用,同一张照片可以放到多行中,重复出现,避免出现空隙,要确保每一行的照片数量足够多
  2. 存在一行中照片有空隙的情况(如图所示)
  3. 球形展示时,挑选出部分照片就行,避免展示所有照片,导致页面卡顿,移动端适当缩小照片大小,减少照片个数,避免太密集导致观感不佳

优化过渡动画: 第三阶段Stage 3: Grid 和第四阶段Stage 4: Scroll,的图片大小不一样,导致在切换阶段时,图片的大小会发生变化,导致视觉上的不连贯,优化过渡动画,使图片在切换阶段时,大小变化更加平滑。


bug修复:

  1. 年度报告每一页添加适当的入场动画
  2. 第二页照片墙动画触发时机,现在是index.vue加载完成就触发了,导致第一页加载时就触发了动画,影响用户体验,数据可以提前获取,等滚动到第二页时再触发动画。
  3. 修改前后端年度报告数据接口,新增start_time, end_time参数,根据时间范围返回数据,而不是直接传入年份
  4. 年度报告数据分多个接口单独获取,而不是一次性全部返回,后几页有些数据耗时较长,不能跟前面的数据一起返回,所以要拆分

优化SectionTime.vue组件,增加照片年历,在日历上显示拍照的日期,有照片的日期点亮,没有照片的日期不点亮(如图所示,配色保持现有的主题配色) 后端对应给出需要的数据

年度报告get_report_location优化:

  1. 新增最远的城市,以及到最远城市的距离(单位为公里),和最远城市的照片(10张)
  • 以照片数最多的城市为当前城市,计算其他城市到当前城市的距离,取最远的城市为最远城市

扫描这个项目帮我写一个官网,给出官网的设计文档:

  1. 官网的功能介绍
  2. 官网的文档
    • 架构设计文档
    • 前端框架分析
    • 后端框架分析
    • 开发者文档
    • 用户指南
    • 常见问题
  3. 要求可以部署在GitHub Pages上,每次push之后自动部署到GitHub Pages上
  4. 设计文档输出到doc目录下

  1. 新增GitHub的issue模板(中文),包括但不限于:
    • 功能请求
    • 错误报告
    • 改进建议
  2. 新增GitHub的pull request模板(中文),包括但不限于:
    • 功能实现
    • 修复错误

新增登录功能:

  1. 新增注册登录功能
  2. 相册对应权限

新增条件相册和智能相册功能:

  1. 新增条件相册功能

    • 用户可以根据不同条件创建自定义相册
      • 时间范围
      • 地点(一个或多个,省、市、区)
      • 人物(一个或多个或者多个同时存在)
      • 其他自定义条件
  2. 新增智能相册功能

    • 调用AI服务/classification/embed/text,把description的描述编码为向量存储,匹配与描述相似度大于阈值的照片
  3. albums表新增字段以实现上述功能


前端对接智能相册和条件相册:

  1. package\website\src\views\album\AlbumList.vue 中新建相册弹出选项(普通相册、条件相册、智能相册)
  2. 点击对应的选项之后弹出对应相册的创建表单
  3. 允许用户修改相册的条件(条件相册的条件、智能相册的描述)
  4. 创建完成之后自动扫描相册中的照片,根据条件筛选出符合条件的照片,更新相册对应的表数据

相册创建完成之后,需要扫描图片表,根据相册的条件筛选出符合条件的照片,更新相册对应的表数据,并在album_photos表中新增符合条件的照片记录,扫描过程不要阻塞前端请求,要异步执行。 相册修改之后,也需要扫描图片表,根据相册的条件筛选出符合条件的照片,更新相册对应的表数据,并在album_photos表中新增符合条件的照片记录,删除不符合条件的记录,扫描过程不要阻塞前端请求,要异步执行。

优化:

  1. 条件相册编辑的时候显示当前的条件表单
  2. 添加地点,省市区输入框有溢出问题,需要调整样式,确保输入框不会超出容器范围,优化界面告诉用户可以留空而不是省市区都要填
  3. 条件相册也增加描述内容编辑选项(可选)

优化智能相册功能:

  1. 新增智能相册的匹配阈值配置项,默认值为0.75
  2. 智能相册的匹配阈值可以在相册创建或编辑时进行配置
  3. 智能相册的匹配阈值影响着智能相册的筛选结果,阈值越高,筛选结果越严格,阈值越低,筛选结果越宽松

新增视觉大模型任务模块:

  1. 使用openai库调用视觉大模型,对照片进行描述

  2. 新增任务类型VISUAL_DESCRIPTION,任务处理函数调用视觉大模型,对照片进行描述(需要判断模型是否配置,未配置则不执行任务)

  3. 新增表image_descriptions,用于存储视觉大模型的描述结果

    • 表字段:
      • id: 主键,自动递增
      • photo_id: 照片ID,外键引用photos表
      • description: 图片简短描述
      • quality_score: 图片质量评分,用于相册筛选高质量照片和不重要照片(0-100分)
      • tags: 相册中可能用到的标签列表(如“风景”、“人物”、“动物”等)
      • created_at: 创建时间,默认当前时间
  4. 前端基础设置(package\website\src\views\settings\BasicSettings.vue)新增视觉大模型和语言大模型配置项(base_url, api_key,model_name)

  5. 前端任务管理(package\website\src\views\settings\TaskManagement.vue)新增任务类型VISUAL_DESCRIPTION,用于触发视觉大模型任务


Ui优化:

  1. 设置页面适配移动端,优化布局和交互
  2. 基础设置新增语言大模型配置项(base_url, api_key,model_name),跟视觉大模型配置有所区分,给出必要的提示

package/official_site新增博客栏:

  1. 扫描项目功能,写一篇博客介绍(微信公众号风格,需要符合该平台写作风格)
  2. 从不同角度介绍TrailSnap的功能和优势(如用户视角、开发者视角、业务视角等),写多篇博客(至少3篇)
  3. 用户指南侧边栏新增二级目录,docker部署给出常见NAS系统的部署教程(绿联NAS、极空间、飞牛os等)

package/official_site修改博客:

  1. 修改用户视角、开发者视角、业务视角的三篇博客。改成从不同的功能点介绍软件特色

人脸识别优化:

  1. face_identities 表新增字段 description,用于存储用户对识别到的人脸的描述
  2. face_identities 表新增字段 tags,用于存储人脸的标签
  3. 标签提供默认值(如“朋友”、“同事”、“女朋友”、“家人”、“同学”、“男朋友”等),也可以自定义
  4. 新增前端界面,用户可以在界面上查看和管理自己的人脸标识(如查看所有识别到的人脸、添加/删除标签、编辑描述等)

图片元数据功能:

  1. photo_metadata表新增字段 make,用于存储照片的相机品牌
  2. photo_metadata表新增字段 model,用于存储照片的相机型号
  3. photo_metadata表新增字段 shooting_params,用于存储照片的相机拍摄参数(如光圈、快门速度、ISO等)
  4. 扫描元数据功能(package\server\app\service\tasks\metadata.py),从照片中提取相机品牌和型号,存储到photo_metadata表中
  5. 前端详细信息页面(package\website\src\components\PhotoMetadataSidebar.vue),在拍摄时间下方新增相机品牌、型号、拍摄参数的显示(如果有的话)

年度报告功能优化: 0. bug修复,电脑上年度报告翻页不流畅(鼠标滚动之后一段时间才会触发页面切换,导致割裂),手机上滑动就正常

  1. package\website\src\components\annual-report\SectionTime.vue 增加入场动画,日历逐个出现
  2. package\website\src\components\annual-report\SectionHighlight.vue 增加合适的入场动画
  3. package\website\src\components\annual-report\SectionSeason.vue 增加入场动画,每个季节逐个出现
  4. package\website\src\components\annual-report\SectionAccount.vue 增加合适的入场动画
  5. 年度报告初始加载时,const data = await getReportSummary(startTime, endTime);接口返回数据之后就停止加载动画,而不是全部数据都返回之后再加载页面,其他接口在后台异步加载,等数据返回后再渲染到页面上

把构建镜像并push的工作流拆分成三个独立的流程,分别是:

  1. 构建前端,触发website模块的构建流程,构建完成后将镜像push到docker hub
  2. 构建后端,触发server模块的构建流程,构建完成后将镜像push到docker hub
  3. 构建ai,触发ai模块的构建流程,构建完成后将镜像push到docker hub

新增景区照片识别功能:

  1. 新增景区表,存储景区的基本信息
    1. id,用于存储景区的唯一标识符
    2. name,用于存储景区的名称
    3. description,用于存储景区的描述
    4. level,用于存储景区的等级(如1级、2级、3级等)
    5. address,用于存储景区的地址
    6. latitude,用于存储景区的纬度
    7. longitude,用于存储景区的经度
    8. radius,用于存储景区的半径(单位:米)
    9. polygon,用于存储景区的多边形坐标(格式:[[lat1, lng1], [lat2, lng2], ...])
    10. created_at,用于存储景区的创建时间
  2. photo_metadata表新增字段 scene_id,用于存储照片所属的景区id
  3. package\server\app\service\tasks\metadata.py 元数据任务,新增识别景区的功能
    1. 如果景区的多边形坐标不为空,判断照片的经纬度是否在多边形范围内
    2. 如果景区的多边形坐标为空,判断照片的经纬度是否在景区的半径范围内
    3. 如果在范围内,返回景区的id
    4. 景区表里可能有上千个景区,注意性能问题
  4. package\server\app\api\location.py 接口新增获取景区相关数据的功能,level="scene",表示按景区查询

在地图上查看图片功能:

  1. package\website\src\views\album\location\LocationList.vue的地图视图下的区县、城市、省份旁边新增一个按钮,点击后可以在地图上查看照片及个数
  2. 点击按钮后,使用地图API在地图上显示照片的位置,每个位置上显示一个照片封面,图片下面显示照片的数量(如图所示)
    1. 地图拆分为独立的组件,LocationMap.vue,负责显示地图和照片聚类
    2. 地图api默认使用(天地图),后续会增加高德地图、百度地图等
  3. 照片根据GPS坐标进行聚类,聚类距离根据地图缩放级别动态调整,避免在地图上显示过多的点导致重叠
  4. 点击地图上的照片封面,查看该聚类的所有照片(LocationDetail.vue)
  5. 修改server的api以实现上述功能(package\server\app\api\location.py)

优化Ui显示:

  1. 仅在地图视图下显示地图照片按钮,列表视图下不显示
  2. 地图组件充满屏幕,上面按钮显示在地图上,增大显示空间,而不是现在的上下布局

地图api优化:

  1. 地图api的key从后端获取,避免前端暴露key(package\website\index.html)
  2. 在设置->基础设置中新增地图api key的输入框,用户可以在其中输入自己的地图api key(区分天地图、高德地图、百度地图等)(package\website\src\views\settings\BasicSettings.vue)
  3. 如果用户没有输入自己的地图api key,则点击地图照片,会提示用户输入key,点击跳转到设置页面
  4. 把地图照片按钮作为(区县、城市、省份)的并列按钮,而不是与网格视图、地图视图并列(package\website\src\views\album\location\LocationList.vue)

地图api优化:

  1. 地图api的key可以设置多个(package\website\src\views\settings\BasicSettings.vue)
  2. package\website\src\utils\mapLoader.ts,加载地图api脚本时,根据用户设置的地图api key,随机选择一个key加载地图api脚本(避免单个key用量超过限制)
  3. 修改后端对应的配置脚本
  4. 使用docker部署时,通过nginx转发前端请求,package\website\nginx.conf,能不能增加缓存,把地图的瓦片请求缓存起来,避免重复请求地图api,本地源码启动时没有nginx就不用缓存了

前端Ui优化:

  1. package\website\src\views\Settings.vue 导航增加锚点定位,可以通过URL参数跳转到对应的设置项(如/settings#basic)
  2. package\website\src\views\album\AlbumList.vue 新增相册表单适配移动端
  3. package\website\src\components\PhotoGallery.vue的Batch Action Bar移动端会溢出,需要调整布局
  4. package\website\src\views\album\people\PeopleList.vue 编辑任务信息表单移动端会溢出,需要调整布局
  5. 上述几个弹窗事件在移动端使用返回键的时候,需要关闭弹窗,而不是直接关闭页面或者返回上一页

位置相册新增功能(package\website\src\views\album\location):

  1. 区县、城市、省份栏新增一个按钮(景区),点击后按景区分组显示照片
    1. 网格视图下显示景区列表
    2. 地图视图下在地图上标记景区位置及名称
    3. 点击之后查看该景区的所有照片
  2. 景区视图下,可以新增自定义景区
    1. 新增景区表单,包含景区名称、描述、等级、地址、经纬度、半径(单位:米)、多边形坐标(格式:[[lat1, lng1], [lat2, lng2], ...])
      1. 利用现有的地图api,根据用户输入的景区名称,在地图上显示该景区的位置
      2. 用户可以在地图上绘制一个多边形,作为该景区的范围
    2. 提交表单后,将景区信息存储到数据库中
    3. 刷新页面后,新添加的景区会出现在景区列表中
  3. 后端api适配上述功能(package\server\app\api\location.py)

Ui交互优化:

  1. 去掉搜索位置按钮,输入景区名称之后,调用天地图api,在下方显示搜索建议词,用户可以点击建议词,自动填充到输入框中,自动显示该景区的位置在地图上,并在表单上显示该景区的经纬度,并自动填充景区地址
  2. 去掉完成绘制按钮,用户可以在地图上绘制完多边形后,直接更新到表单,并在表单上显示该景区的多边形坐标
  3. 天地图官方示例:

bug修复,搜索之后没有效果,下面是天地图官方的示例代码:

package\official-site 官网多语言变更,官网现在所有文件和配置都是中文的,现在需要改成中英文切换,默认是中文,md文件按照中文版本翻译成英文

新增实况图(live photos)解析:

  1. 各个手机厂商的实况图格式不一样,要抽象出统一的接口,各个厂商的实况图都要实现这个接口。

    1. 要支持苹果手机的实况图格式.HEIC
    2. 要支持安卓手机的实况图格式(jpg图片+同名mp4视频)
  2. 不需要存储live_photo_path,因为图片和视频必须在同一个文件夹下,并且文件名必须一样只是后缀名不一样。

  3. 扫描文件夹如果实况图的jpg或者mp4文件缺失则将实况图变成普通的图片或者视频,如果存在如何条件的实况图则将原先的图片+视频合并成一个新的实况图。(可能刚开始只有图片,后面才会有视频,也可能手动把实况图的视频删除了,则需要降级)


bug修复:

  1. 苹果的实况图是单个.HEIC文件,而安卓的是(jpg图片+同名mp4视频),现在的这个解析逻辑不对

前端支持live photo的播放:

  1. 点击实况图时,如果是苹果手机则直接播放.HEIC文件,如果是安卓手机则播放jpg图片+mp4视频。
    1. 点击之后自动播放视频,视频播放完成之后自动切换回图片。
    2. 要有实况图的特殊标记,点击之后可以重新播放
  2. package\website\src\components\PhotoGallery.vue对每个实况图添加特殊标记

bug修复:

  1. new_files和deleted_files识别错误
    1. files_on_disk是所有文件的集合,existing_files是数据库中文件的集合。
    2. 如果一个文件是实况图,并且以.jpg结尾,那么应该

任务管理优化(package\server\app\service):

  1. 把package\server\app\service\tasks\scan.py里的出里基础任务放到一个单独的文件中,跟扫描文件夹区分开
  2. package\server\app\service\task_manager.py把扫描文件夹和处理PROCESS_BASIC任务区分开,改为两个单独的任务类型

live photo优化:

  1. 现在是在扫描文件夹(package\server\app\service\tasks\scan.py)的时候判断是否存在同名的jpg文件或者mp4文件,如果存在则将其合并成一个实况图。但是这是vivo手机的实况图格式,文件名是jpg,但是视频文件是mp4。
  2. 要支持谷歌的Motion Photo格式,文件名是jpg,但是jpg文件里内嵌了mp4视频,要判断是否是动态照片,如果是的话从jpg文件里提取出视频。
  3. 在package\server\app\service\tasks\basic.py文件处理PROCESS_BASIC任务时,要判断是否是实况图,如果是则将其标记为实况图

外部图库优化:

  1. package\website\src\views\settings\ExternalGallery.vue 新增一个按钮,点击后可以创建扫描某个文件夹的任务

网站优化:

  1. package\official-site.vitepress\theme\components\Home.vue 在和之间新增一个段落,用于展示功能截图,采用轮播图展示。功能截图放在变量里,每个截图都有一个标题和描述。

基于 AGPL-3.0 许可发布