新增搜索功能: 前端新增搜索框,用户可以搜索匹配的图片
bug修复:
- usePhotoStore 新增 searchPhotos 方法,用于处理搜索请求
- NavBar 新增搜索框,用户可以输入搜索关键词,点击搜索按钮后触发搜索请求
前端优化:
- 搜索框默认只显示图标,用户点击之后才显示输入框
- 搜索之后跳转到单独的搜索结果页面,展示匹配的图片
- 搜索结果页面与src/views/album/location页面类似,展示匹配的图片,标题就是搜索关键词
- 搜索可能比较慢,需要有加载动画
- 搜索结果可能比较多,注意分页显示
- 后端接口适配前端需要
bug修复
- 点击搜索之后不能跳转到搜索结果页面
bug修复: UnifiedPhotoPage.vue是按时间线展示的,实际上搜索结果是按相似性排序的,不适合显示时间轴数据,因此不要使用UnifiedPhotoPage组件,使用简单的图片展示组件即可
优化:
- 搜索结果页面的图片展示组件,新增点击事件,点击后显示该图片的详情页面(PhotoLightbox.vue)
- 后端api支持设置搜索阈值,默认值为0.5,搜索相似度大于等于阈值的图片(search_by_text)
新增智能分类功能:
- 后端api支持查询图片标签,返回图片的标签列表和每个标签的封面(与location.py类似)
- 后端支持按标签查询图片列表
- 前端新增智能分类展示分类结果,用户可以点击分类查看对应图片(与src/views/album/location类似)
优化AI服务: 图像分类模块的文本编码embed使用sentence-transformers/clip-ViT-B-32-multilingual-v1模型,图片编码还使用原来的模型
AI服务优化:
- 启动时自动检测模型是否存在,不存在则自动下载
- 默认使用modelscope下载模型,放在data/models/目录下
- 人脸识别、图片分类模型都从data/models/目录加载
- 注意适配modelscope的模型目录结构
bug修复: task_worker.py的config_manager与主进程的config_manager是两个独立的对象,导致主进程修改配置之后,task_worker.py的配置没有更新,从而导致任务执行失败
优化模型下载方式:
- 每个服务设置一个单独的模型检测是否存在和模型下载的函数(类似现有的模型加载、释放),以便自定义不同模型的下载过程
- 模型下载失败或中断清理对应的文件夹,放置识别错误
- 下载采用多线程的方式,每个模型使用单独的下载线程,避免阻塞,主线程不需要等待模型下载即可对外提供api服务
- 模型不存在或者未下载完成,返回特定的响应码表示模型还未准备完成
前端优化:
- 把Navbar.vue的主题切换功能放到设置(Settings.vue)中
优化AI服务:
将所有AI模型使用的模型名都放到全局变量里,方便后续维护和管理。
设置一个配置文件,包括AI模型名称、参数(如果有的话)、阈值(如果有的话)等,方便后续修改和调整。
配置文件提供模型名称的选项,例如OCR模型有[server, mobile]两个版本,给出当前使用的模型名称和选项。
新增一个接口,用户可以在前端选择不同的AI模型版本(只能从配置文件中提供的选项中选择),例如OCR模型的[server, mobile]两个版本。把用户选择的模型版本保存到配置文件中。判断用户选择的模型版本是否存在,不存在则下载模型。
优化任务管理模块:
- 为每个任务类型添加一个运行时间,当该类型的任务一段时间没有运行时,释放任务对应的资源(现在是所有任务都没有运行时释放所有的资源)
- 增加失败任务重试功能,允许用户手动触发失败任务的重试
前端优化:
- 取消新建任务按钮
- 任务列表新增重试失败和强制重做所有按钮
- 失败任务数点击可以查看失败任务列表,显示失败详细信息
前端:
- 重试失败任务和强制重做所有是针对单个任务类似,而不是针对所有任务,在每个任务的操作菜单中新增重试和重做所有按钮
- 失败个数为0时,不显示查看详情
查看失败详情按照任务类型筛选,而不是直接获取全部失败任务然后在前端筛选
内存管理优化:
- 一段时间没有请求,重启服务
报告前后端数据对接:
- 整理合并annualReport.ts定义的数据,适配前端页面需要的字段
- 后端根据现有的数据,返回符合annualReport.ts定义的格式数据
- 对于现阶段不能获取的数据,使用默认示例数据代替,待后续实现
要求
- 不要修改前端页面显示的内容,以后端适配前端为主
- 标清现阶段不能满足要求的数据内容,写出todo待做事项
优化年度报告SectionLocation.vue:
- 地图按城市展示,有图片数据的城市点亮,其他城市保持默认状态
- 鼠标悬停在城市上可以查看该城市的图片数据
- 照片数最多的城市做个标记
修改server端api,与前端需求保持一致(后端应该返回每个城市的照片数)
优化人脸识别模块:
- faces表的face_feature字段改成postgresql的vector类型,用于存储人脸特征向量
- 优化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优化:
- 布局更加紧凑,避免照片之间的间距过大,
- 默认横向移动,每行照片交错排列,(类似图片中这样)
接口对齐:
- server/app/api/annual_report.py,新增获取年度照片墙照片接口
- 入参: start_time, end_time
- 返回结果,按月分组,每个月包含照片数据列表(最多10张)
- 前端调用该接口,获取照片数据后,渲染到照片墙组件中
bug修复:
- 球形只能显示一半,其他部分不显示,转动之后也是只显示一半
- 球形形成之后改成自动旋转
- 最后的照片墙的里的照片尺寸缩小,而且要中间一排的照片尺寸要大一点
优化:
- 如果后端返回的照片数较少的情况下,前端需要把照片循环利用,同一张照片可以放到多行中,重复出现,避免出现空隙,要确保每一行的照片数量足够多
- 存在一行中照片有空隙的情况(如图所示)
- 球形展示时,挑选出部分照片就行,避免展示所有照片,导致页面卡顿,移动端适当缩小照片大小,减少照片个数,避免太密集导致观感不佳
优化过渡动画: 第三阶段Stage 3: Grid 和第四阶段Stage 4: Scroll,的图片大小不一样,导致在切换阶段时,图片的大小会发生变化,导致视觉上的不连贯,优化过渡动画,使图片在切换阶段时,大小变化更加平滑。
bug修复:
- 年度报告每一页添加适当的入场动画
- 第二页照片墙动画触发时机,现在是index.vue加载完成就触发了,导致第一页加载时就触发了动画,影响用户体验,数据可以提前获取,等滚动到第二页时再触发动画。
- 修改前后端年度报告数据接口,新增start_time, end_time参数,根据时间范围返回数据,而不是直接传入年份
- 年度报告数据分多个接口单独获取,而不是一次性全部返回,后几页有些数据耗时较长,不能跟前面的数据一起返回,所以要拆分
优化SectionTime.vue组件,增加照片年历,在日历上显示拍照的日期,有照片的日期点亮,没有照片的日期不点亮(如图所示,配色保持现有的主题配色) 后端对应给出需要的数据
年度报告get_report_location优化:
- 新增最远的城市,以及到最远城市的距离(单位为公里),和最远城市的照片(10张)
- 以照片数最多的城市为当前城市,计算其他城市到当前城市的距离,取最远的城市为最远城市
扫描这个项目帮我写一个官网,给出官网的设计文档:
- 官网的功能介绍
- 官网的文档
- 架构设计文档
- 前端框架分析
- 后端框架分析
- 开发者文档
- 用户指南
- 常见问题
- 要求可以部署在GitHub Pages上,每次push之后自动部署到GitHub Pages上
- 设计文档输出到doc目录下
- 新增GitHub的issue模板(中文),包括但不限于:
- 功能请求
- 错误报告
- 改进建议
- 新增GitHub的pull request模板(中文),包括但不限于:
- 功能实现
- 修复错误
新增登录功能:
- 新增注册登录功能
- 相册对应权限
新增条件相册和智能相册功能:
新增条件相册功能
- 用户可以根据不同条件创建自定义相册
- 时间范围
- 地点(一个或多个,省、市、区)
- 人物(一个或多个或者多个同时存在)
- 其他自定义条件
- 用户可以根据不同条件创建自定义相册
新增智能相册功能
- 调用AI服务/classification/embed/text,把description的描述编码为向量存储,匹配与描述相似度大于阈值的照片
albums表新增字段以实现上述功能
前端对接智能相册和条件相册:
- package\website\src\views\album\AlbumList.vue 中新建相册弹出选项(普通相册、条件相册、智能相册)
- 点击对应的选项之后弹出对应相册的创建表单
- 允许用户修改相册的条件(条件相册的条件、智能相册的描述)
- 创建完成之后自动扫描相册中的照片,根据条件筛选出符合条件的照片,更新相册对应的表数据
相册创建完成之后,需要扫描图片表,根据相册的条件筛选出符合条件的照片,更新相册对应的表数据,并在album_photos表中新增符合条件的照片记录,扫描过程不要阻塞前端请求,要异步执行。 相册修改之后,也需要扫描图片表,根据相册的条件筛选出符合条件的照片,更新相册对应的表数据,并在album_photos表中新增符合条件的照片记录,删除不符合条件的记录,扫描过程不要阻塞前端请求,要异步执行。
优化:
- 条件相册编辑的时候显示当前的条件表单
- 添加地点,省市区输入框有溢出问题,需要调整样式,确保输入框不会超出容器范围,优化界面告诉用户可以留空而不是省市区都要填
- 条件相册也增加描述内容编辑选项(可选)
优化智能相册功能:
- 新增智能相册的匹配阈值配置项,默认值为0.75
- 智能相册的匹配阈值可以在相册创建或编辑时进行配置
- 智能相册的匹配阈值影响着智能相册的筛选结果,阈值越高,筛选结果越严格,阈值越低,筛选结果越宽松
新增视觉大模型任务模块:
使用openai库调用视觉大模型,对照片进行描述
新增任务类型VISUAL_DESCRIPTION,任务处理函数调用视觉大模型,对照片进行描述(需要判断模型是否配置,未配置则不执行任务)
新增表image_descriptions,用于存储视觉大模型的描述结果
- 表字段:
- id: 主键,自动递增
- photo_id: 照片ID,外键引用photos表
- description: 图片简短描述
- quality_score: 图片质量评分,用于相册筛选高质量照片和不重要照片(0-100分)
- tags: 相册中可能用到的标签列表(如“风景”、“人物”、“动物”等)
- created_at: 创建时间,默认当前时间
- 表字段:
前端基础设置(package\website\src\views\settings\BasicSettings.vue)新增视觉大模型和语言大模型配置项(base_url, api_key,model_name)
前端任务管理(package\website\src\views\settings\TaskManagement.vue)新增任务类型VISUAL_DESCRIPTION,用于触发视觉大模型任务
Ui优化:
- 设置页面适配移动端,优化布局和交互
- 基础设置新增语言大模型配置项(base_url, api_key,model_name),跟视觉大模型配置有所区分,给出必要的提示
package/official_site新增博客栏:
- 扫描项目功能,写一篇博客介绍(微信公众号风格,需要符合该平台写作风格)
- 从不同角度介绍TrailSnap的功能和优势(如用户视角、开发者视角、业务视角等),写多篇博客(至少3篇)
- 用户指南侧边栏新增二级目录,docker部署给出常见NAS系统的部署教程(绿联NAS、极空间、飞牛os等)
package/official_site修改博客:
- 修改用户视角、开发者视角、业务视角的三篇博客。改成从不同的功能点介绍软件特色
人脸识别优化:
- face_identities 表新增字段 description,用于存储用户对识别到的人脸的描述
- face_identities 表新增字段 tags,用于存储人脸的标签
- 标签提供默认值(如“朋友”、“同事”、“女朋友”、“家人”、“同学”、“男朋友”等),也可以自定义
- 新增前端界面,用户可以在界面上查看和管理自己的人脸标识(如查看所有识别到的人脸、添加/删除标签、编辑描述等)
图片元数据功能:
- photo_metadata表新增字段 make,用于存储照片的相机品牌
- photo_metadata表新增字段 model,用于存储照片的相机型号
- photo_metadata表新增字段 shooting_params,用于存储照片的相机拍摄参数(如光圈、快门速度、ISO等)
- 扫描元数据功能(package\server\app\service\tasks\metadata.py),从照片中提取相机品牌和型号,存储到photo_metadata表中
- 前端详细信息页面(package\website\src\components\PhotoMetadataSidebar.vue),在拍摄时间下方新增相机品牌、型号、拍摄参数的显示(如果有的话)
年度报告功能优化: 0. bug修复,电脑上年度报告翻页不流畅(鼠标滚动之后一段时间才会触发页面切换,导致割裂),手机上滑动就正常
- package\website\src\components\annual-report\SectionTime.vue 增加入场动画,日历逐个出现
- package\website\src\components\annual-report\SectionHighlight.vue 增加合适的入场动画
- package\website\src\components\annual-report\SectionSeason.vue 增加入场动画,每个季节逐个出现
- package\website\src\components\annual-report\SectionAccount.vue 增加合适的入场动画
- 年度报告初始加载时,const data = await getReportSummary(startTime, endTime);接口返回数据之后就停止加载动画,而不是全部数据都返回之后再加载页面,其他接口在后台异步加载,等数据返回后再渲染到页面上
把构建镜像并push的工作流拆分成三个独立的流程,分别是:
- 构建前端,触发website模块的构建流程,构建完成后将镜像push到docker hub
- 构建后端,触发server模块的构建流程,构建完成后将镜像push到docker hub
- 构建ai,触发ai模块的构建流程,构建完成后将镜像push到docker hub
新增景区照片识别功能:
- 新增景区表,存储景区的基本信息
- id,用于存储景区的唯一标识符
- name,用于存储景区的名称
- description,用于存储景区的描述
- level,用于存储景区的等级(如1级、2级、3级等)
- address,用于存储景区的地址
- latitude,用于存储景区的纬度
- longitude,用于存储景区的经度
- radius,用于存储景区的半径(单位:米)
- polygon,用于存储景区的多边形坐标(格式:[[lat1, lng1], [lat2, lng2], ...])
- created_at,用于存储景区的创建时间
- photo_metadata表新增字段 scene_id,用于存储照片所属的景区id
- package\server\app\service\tasks\metadata.py 元数据任务,新增识别景区的功能
- 如果景区的多边形坐标不为空,判断照片的经纬度是否在多边形范围内
- 如果景区的多边形坐标为空,判断照片的经纬度是否在景区的半径范围内
- 如果在范围内,返回景区的id
- 景区表里可能有上千个景区,注意性能问题
- package\server\app\api\location.py 接口新增获取景区相关数据的功能,level="scene",表示按景区查询
在地图上查看图片功能:
- package\website\src\views\album\location\LocationList.vue的地图视图下的区县、城市、省份旁边新增一个按钮,点击后可以在地图上查看照片及个数
- 点击按钮后,使用地图API在地图上显示照片的位置,每个位置上显示一个照片封面,图片下面显示照片的数量(如图所示)
- 地图拆分为独立的组件,LocationMap.vue,负责显示地图和照片聚类
- 地图api默认使用(天地图),后续会增加高德地图、百度地图等
- 照片根据GPS坐标进行聚类,聚类距离根据地图缩放级别动态调整,避免在地图上显示过多的点导致重叠
- 点击地图上的照片封面,查看该聚类的所有照片(LocationDetail.vue)
- 修改server的api以实现上述功能(package\server\app\api\location.py)
优化Ui显示:
- 仅在地图视图下显示地图照片按钮,列表视图下不显示
- 地图组件充满屏幕,上面按钮显示在地图上,增大显示空间,而不是现在的上下布局
地图api优化:
- 地图api的key从后端获取,避免前端暴露key(package\website\index.html)
- 在设置->基础设置中新增地图api key的输入框,用户可以在其中输入自己的地图api key(区分天地图、高德地图、百度地图等)(package\website\src\views\settings\BasicSettings.vue)
- 如果用户没有输入自己的地图api key,则点击地图照片,会提示用户输入key,点击跳转到设置页面
- 把地图照片按钮作为(区县、城市、省份)的并列按钮,而不是与网格视图、地图视图并列(package\website\src\views\album\location\LocationList.vue)
地图api优化:
- 地图api的key可以设置多个(package\website\src\views\settings\BasicSettings.vue)
- package\website\src\utils\mapLoader.ts,加载地图api脚本时,根据用户设置的地图api key,随机选择一个key加载地图api脚本(避免单个key用量超过限制)
- 修改后端对应的配置脚本
- 使用docker部署时,通过nginx转发前端请求,package\website\nginx.conf,能不能增加缓存,把地图的瓦片请求缓存起来,避免重复请求地图api,本地源码启动时没有nginx就不用缓存了
前端Ui优化:
- package\website\src\views\Settings.vue 导航增加锚点定位,可以通过URL参数跳转到对应的设置项(如/settings#basic)
- package\website\src\views\album\AlbumList.vue 新增相册表单适配移动端
- package\website\src\components\PhotoGallery.vue的Batch Action Bar移动端会溢出,需要调整布局
- package\website\src\views\album\people\PeopleList.vue 编辑任务信息表单移动端会溢出,需要调整布局
- 上述几个弹窗事件在移动端使用返回键的时候,需要关闭弹窗,而不是直接关闭页面或者返回上一页
位置相册新增功能(package\website\src\views\album\location):
- 区县、城市、省份栏新增一个按钮(景区),点击后按景区分组显示照片
- 网格视图下显示景区列表
- 地图视图下在地图上标记景区位置及名称
- 点击之后查看该景区的所有照片
- 景区视图下,可以新增自定义景区
- 新增景区表单,包含景区名称、描述、等级、地址、经纬度、半径(单位:米)、多边形坐标(格式:[[lat1, lng1], [lat2, lng2], ...])
- 利用现有的地图api,根据用户输入的景区名称,在地图上显示该景区的位置
- 用户可以在地图上绘制一个多边形,作为该景区的范围
- 提交表单后,将景区信息存储到数据库中
- 刷新页面后,新添加的景区会出现在景区列表中
- 新增景区表单,包含景区名称、描述、等级、地址、经纬度、半径(单位:米)、多边形坐标(格式:[[lat1, lng1], [lat2, lng2], ...])
- 后端api适配上述功能(package\server\app\api\location.py)
Ui交互优化:
- 去掉搜索位置按钮,输入景区名称之后,调用天地图api,在下方显示搜索建议词,用户可以点击建议词,自动填充到输入框中,自动显示该景区的位置在地图上,并在表单上显示该景区的经纬度,并自动填充景区地址
- 去掉完成绘制按钮,用户可以在地图上绘制完多边形后,直接更新到表单,并在表单上显示该景区的多边形坐标
- 天地图官方示例:
bug修复,搜索之后没有效果,下面是天地图官方的示例代码:
package\official-site 官网多语言变更,官网现在所有文件和配置都是中文的,现在需要改成中英文切换,默认是中文,md文件按照中文版本翻译成英文
新增实况图(live photos)解析:
各个手机厂商的实况图格式不一样,要抽象出统一的接口,各个厂商的实况图都要实现这个接口。
- 要支持苹果手机的实况图格式.HEIC
- 要支持安卓手机的实况图格式(jpg图片+同名mp4视频)
不需要存储live_photo_path,因为图片和视频必须在同一个文件夹下,并且文件名必须一样只是后缀名不一样。
扫描文件夹如果实况图的jpg或者mp4文件缺失则将实况图变成普通的图片或者视频,如果存在如何条件的实况图则将原先的图片+视频合并成一个新的实况图。(可能刚开始只有图片,后面才会有视频,也可能手动把实况图的视频删除了,则需要降级)
bug修复:
- 苹果的实况图是单个.HEIC文件,而安卓的是(jpg图片+同名mp4视频),现在的这个解析逻辑不对
前端支持live photo的播放:
- 点击实况图时,如果是苹果手机则直接播放.HEIC文件,如果是安卓手机则播放jpg图片+mp4视频。
- 点击之后自动播放视频,视频播放完成之后自动切换回图片。
- 要有实况图的特殊标记,点击之后可以重新播放
- package\website\src\components\PhotoGallery.vue对每个实况图添加特殊标记
bug修复:
- new_files和deleted_files识别错误
- files_on_disk是所有文件的集合,existing_files是数据库中文件的集合。
- 如果一个文件是实况图,并且以.jpg结尾,那么应该
任务管理优化(package\server\app\service):
- 把package\server\app\service\tasks\scan.py里的出里基础任务放到一个单独的文件中,跟扫描文件夹区分开
- package\server\app\service\task_manager.py把扫描文件夹和处理PROCESS_BASIC任务区分开,改为两个单独的任务类型
live photo优化:
- 现在是在扫描文件夹(package\server\app\service\tasks\scan.py)的时候判断是否存在同名的jpg文件或者mp4文件,如果存在则将其合并成一个实况图。但是这是vivo手机的实况图格式,文件名是jpg,但是视频文件是mp4。
- 要支持谷歌的Motion Photo格式,文件名是jpg,但是jpg文件里内嵌了mp4视频,要判断是否是动态照片,如果是的话从jpg文件里提取出视频。
- 在package\server\app\service\tasks\basic.py文件处理PROCESS_BASIC任务时,要判断是否是实况图,如果是则将其标记为实况图
外部图库优化:
- package\website\src\views\settings\ExternalGallery.vue 新增一个按钮,点击后可以创建扫描某个文件夹的任务
网站优化:
- package\official-site.vitepress\theme\components\Home.vue 在和之间新增一个段落,用于展示功能截图,采用轮播图展示。功能截图放在变量里,每个截图都有一个标题和描述。