diff --git a/.trae/documents/为移动端添加手指缩放支持.md b/.trae/documents/为移动端添加手指缩放支持.md new file mode 100644 index 0000000..2f9a76a --- /dev/null +++ b/.trae/documents/为移动端添加手指缩放支持.md @@ -0,0 +1,49 @@ +# 实现移动端手指缩放功能 + +## 现状分析 +- 当前代码已经实现了鼠标滚轮+Ctrl键的缩放功能 +- 实现了场景拖拽功能,支持触摸和鼠标事件 +- 有一个`preventPinchZoom`函数阻止了缩放手势,需要修改 +- 没有实现双指缩放功能 + +## 实现方案 + +### 1. 修改preventPinchZoom函数 +- 移除或修改该函数,允许在主内容区域进行缩放手势 +- 保持在侧边栏区域阻止缩放手势 + +### 2. 添加双指缩放支持 +- 添加触摸事件处理,实现双指缩放 +- 在`touchstart`事件中记录双指初始距离 +- 在`touchmove`事件中计算双指距离变化,实现缩放 +- 保持与现有缩放逻辑的一致性 + +### 3. 实现缩放中心点计算 +- 计算双指中心点作为缩放中心 +- 调整场景偏移量,使缩放围绕双指中心点进行 + +### 4. 保持现有功能不变 +- 确保鼠标滚轮缩放功能正常 +- 确保单指拖拽功能正常 + +## 代码修改点 + +1. **修改preventPinchZoom函数**:仅在侧边栏区域阻止缩放手势 +2. **添加触摸事件处理变量**:记录双指初始距离和中心点 +3. **修改startSceneDrag函数**:添加双指检测逻辑 +4. **修改dragScene函数**:添加双指缩放逻辑 +5. **调整缩放计算逻辑**:支持从触摸事件获取缩放中心点 + +## 预期效果 +- 移动端支持双指缩放场景 +- 缩放围绕双指中心点进行 +- 与现有鼠标滚轮缩放效果一致 +- 保持单指拖拽功能正常 + +## 实现步骤 + +1. 分析现有触摸事件处理逻辑 +2. 添加双指缩放所需的状态变量 +3. 修改触摸事件处理函数,添加双指缩放逻辑 +4. 测试在移动端的缩放效果 +5. 确保与现有功能兼容 \ No newline at end of file diff --git a/.trae/documents/优化物流信息布局为左右并排展示.md b/.trae/documents/优化物流信息布局为左右并排展示.md new file mode 100644 index 0000000..e992f00 --- /dev/null +++ b/.trae/documents/优化物流信息布局为左右并排展示.md @@ -0,0 +1,35 @@ +# 优化物流信息布局方案 + +**需求分析**:将当前物流信息区域中承运信息卡片和物流时间线从上下垂直排列改为左右并排展示,提高空间利用率和视觉层次感。 + +**实现思路**: + +1. 修改物流信息主容器的布局方式 +2. 将承运信息卡片和物流时间线作为并排的两个子元素 +3. 调整宽度比例和间距 +4. 保持响应式设计,在小屏幕下自动切换为垂直布局 + +**具体修改点**: + +1. **修改模板结构**:将承运信息卡片和物流时间线包裹在一个flex/grid容器中 +2. **调整CSS样式**: + + * 修改`.logistics-timeline`容器布局 + + * 调整`.logistics-info`和`.logistics-timeline-container`的宽度和排列方式 + + * 添加响应式断点 +3. **优化间距和对齐**:确保左右两个区域视觉平衡 + +**预期效果**: + +* 桌面端:承运信息卡片在左侧,物流时间线在右侧,左右并排展示 + +* 移动端:保持原有的上下垂直排列,适配小屏幕 + +* 提高信息展示效率,减少页面滚动 + +**修改文件**: + +* `d:\work\Aiproject\DeotalandAi\apps\frontend\src\views\OrderDetail.vue` + diff --git a/.trae/documents/实现图片预览功能.md b/.trae/documents/实现图片预览功能.md new file mode 100644 index 0000000..916f4aa --- /dev/null +++ b/.trae/documents/实现图片预览功能.md @@ -0,0 +1,36 @@ +# 实现图片预览功能 + +## 目标 +在IPCard组件中添加点击图片预览功能,使用Element Plus的Image组件实现。 + +## 实现步骤 + +1. **引入Element Plus Image组件** + - 在组件脚本中引入ElImage组件 + +2. **修改图片标签** + - 将当前的img标签替换为el-image标签 + - 配置el-image的src、alt、class属性保持原有样式 + - 添加preview-src-list属性以支持预览功能 + - 添加@click事件处理预览逻辑 + +3. **确保样式一致性** + - 保持原有ip-card-image类的样式不变 + - 确保el-image组件的布局与原有img标签一致 + +4. **测试功能** + - 确保点击图片时能够正常弹出预览窗口 + - 确保预览窗口可以正常关闭 + - 确保样式没有破坏原有布局 + +## 代码修改点 + +1. **引入组件**:在第122行添加ElImage到Element Plus组件引入列表 +2. **修改模板**:将第36-43行的img标签替换为el-image标签 +3. **添加预览配置**:添加preview-src-list属性和相关逻辑 + +## 预期效果 +- 点击IP卡片中的图片时,会弹出一个全屏的图片预览窗口 +- 预览窗口支持缩放、旋转等操作 +- 点击预览窗口外部或关闭按钮可以关闭预览 +- 原有卡片样式和布局保持不变 \ No newline at end of file diff --git a/.trae/documents/实现登录表单邀请码功能.md b/.trae/documents/实现登录表单邀请码功能.md new file mode 100644 index 0000000..4ac35f0 --- /dev/null +++ b/.trae/documents/实现登录表单邀请码功能.md @@ -0,0 +1,87 @@ +# 实现独立邀请码组件并集成到登录表单 + +## 1. 创建独立的邀请码组件 + +### 1.1 创建 InviteCodeInput.vue 组件 +- 组件路径:`src/components/auth/InviteCodeInput.vue` +- 实现邀请码输入框,包含label、input和错误提示 +- 使用与现有表单相同的样式和结构 +- 添加邀请码的必填验证逻辑 +- 支持实时验证和错误提示 +- 支持加载状态 + +### 1.2 组件功能设计 +- 支持v-model双向绑定 +- 支持自定义placeholder和label +- 支持错误信息显示 +- 支持禁用状态 +- 支持聚焦和失焦事件 + +## 2. 更新 LoginForm.vue 组件 + +### 2.1 引入并使用 InviteCodeInput 组件 +- 在LoginForm.vue中引入InviteCodeInput组件 +- 在登录按钮下方添加一个div容器,使用`divider`类名进行隔离 +- 在div容器中使用InviteCodeInput组件 +- 传递必要的props和事件 + +### 2.2 更新表单数据和验证 +- 在form对象中添加inviteCode字段 +- 在rules中添加inviteCode的必填验证 +- 添加inviteCodeError状态变量 +- 更新表单有效性判断,包含inviteCode验证 + +## 3. 更新 Login.vue 页面 + +### 3.1 添加邀请码状态管理 +- 在Login.vue中添加inviteCode状态变量 +- 添加inviteCodeError状态变量 +- 添加validateInviteCode函数 + +### 3.2 更新Google登录按钮逻辑 +- 将inviteCode状态传递给GoogleOAuthButton组件 +- 更新GoogleOAuthButton的disabled属性,只有inviteCode有效时才启用 +- 确保Google登录流程能够获取到邀请码信息 + +## 4. 实现样式隔离 + +### 4.1 使用divider进行样式隔离 +- 在LoginForm组件和InviteCodeInput组件之间添加divider +- 确保视觉上的清晰分隔 +- 保持与现有分割线一致的样式 + +## 5. 实现Google登录与邀请码的关联 + +### 5.1 共享邀请码状态 +- 确保LoginForm和Google登录按钮使用同一个邀请码状态 +- 实现跨组件的状态同步 +- 确保Google登录时能够传递邀请码信息到后端 + +## 6. 国际化支持 + +### 6.1 添加邀请码相关的i18n翻译 +- 在i18n配置文件中添加邀请码相关的翻译文本 +- 确保中英文都有对应的翻译 + +## 7. 响应式设计 + +### 7.1 确保邀请码组件在各种屏幕尺寸下正常显示 +- 适配移动端、平板端和桌面端 +- 确保在不同主题下正常显示 + +## 实现步骤 + +1. 创建独立的InviteCodeInput.vue组件 +2. 更新LoginForm.vue,引入并使用InviteCodeInput组件 +3. 更新Login.vue,添加邀请码状态管理和Google登录按钮的禁用逻辑 +4. 实现样式隔离和响应式设计 +5. 测试所有功能,确保邀请码功能正常工作,且Google登录按钮只有在填写邀请码后才能使用 + +## 预期效果 + +1. 登录表单下方新增邀请码输入组件,用divider隔离 +2. 邀请码为必填项,有实时验证和错误提示 +3. Google登录按钮初始禁用,填写邀请码后启用 +4. 邀请码组件样式与现有表单保持一致 +5. 支持响应式设计和国际化 +6. 支持明暗主题切换 \ No newline at end of file diff --git a/.trae/documents/添加规则方格子四个角点.md b/.trae/documents/添加规则方格子四个角点.md new file mode 100644 index 0000000..91f0b38 --- /dev/null +++ b/.trae/documents/添加规则方格子四个角点.md @@ -0,0 +1,65 @@ +# 添加规则方格子四个角点 + +## 实现目标 +在画布上添加有规则的点,类似方格子但只展示四个角上的点,支持缩放、拖动交互,并适配亮色和暗色主题。 + +## 实现步骤 + +### 1. 修改.scene-container的背景样式 +- 将当前的随机装饰点替换为规则的方格子四个角点 +- 使用CSS radial-gradient创建点效果 +- 通过多个渐变层组合实现四个角的点 +- 设置合适的background-size控制方格大小 + +### 2. 适配亮色主题 +- 为亮色主题设置合适的点颜色和大小 +- 确保点与背景对比度适中 + +### 3. 适配暗色主题 +- 为暗色主题单独设置点颜色 +- 保持与暗色背景的良好对比度 + +### 4. 确保交互兼容性 +- 点网格应随画布缩放和拖动保持正确位置 +- 不影响现有卡片元素的交互 + +## 技术实现 + +通过修改CSS样式,使用多个radial-gradient层和background-position属性来创建规则的方格子四个角点。具体实现如下: + +```css +/* 亮色主题 */ +.scene-container { + background: + /* 背景渐变 */ + radial-gradient(ellipse at center, rgba(255, 255, 255, 0.9) 0%, rgba(243, 244, 246, 0.9) 100%), + /* 方格子四个角点 */ + radial-gradient(circle at 0 0, rgba(107, 70, 193, 0.3) 2px, transparent 3px), + radial-gradient(circle at 100% 0, rgba(107, 70, 193, 0.3) 2px, transparent 3px), + radial-gradient(circle at 0 100%, rgba(107, 70, 193, 0.3) 2px, transparent 3px), + radial-gradient(circle at 100% 100%, rgba(107, 70, 193, 0.3) 2px, transparent 3px); + background-size: 100% 100%, 50px 50px, 50px 50px, 50px 50px, 50px 50px; + background-position: center center, 0 0, 0 0, 0 0, 0 0; +} + +/* 暗色主题 */ +html.dark .scene-container { + background: + /* 背景渐变 */ + radial-gradient(ellipse at center, rgba(31, 41, 55, 0.9) 0%, rgba(17, 24, 39, 0.9) 100%), + /* 方格子四个角点 */ + radial-gradient(circle at 0 0, rgba(167, 139, 250, 0.4) 2px, transparent 3px), + radial-gradient(circle at 100% 0, rgba(167, 139, 250, 0.4) 2px, transparent 3px), + radial-gradient(circle at 0 100%, rgba(167, 139, 250, 0.4) 2px, transparent 3px), + radial-gradient(circle at 100% 100%, rgba(167, 139, 250, 0.4) 2px, transparent 3px); + background-size: 100% 100%, 50px 50px, 50px 50px, 50px 50px, 50px 50px; + background-position: center center, 0 0, 0 0, 0 0, 0 0; +} +``` + +## 预期效果 +- 画布上出现规则排列的方格子,每个方格的四个角上有一个点 +- 方格大小为50px x 50px,点大小为2px +- 点的颜色适配当前主题 +- 缩放和拖动画布时,点网格保持正确的位置关系 +- 不影响现有卡片元素的交互 \ No newline at end of file diff --git a/.trae/documents/重新设计div模块.md b/.trae/documents/重新设计div模块.md new file mode 100644 index 0000000..2f93b56 --- /dev/null +++ b/.trae/documents/重新设计div模块.md @@ -0,0 +1,39 @@ +# 重新设计div模块并适配中英文切换 + +## 目标 +将当前的双按钮设计重新设计为参考图样式,并确保支持中英文切换功能。 + +## 修改内容 +1. **修改文件**:`d:\work\Aiproject\DeotalandAi\apps\frontend\src\views\home\index.vue` +2. **修改位置**: + - 第181-194行的div容器(按钮布局) + - 第541-654行的i18n对象(中英文文本) + +## 具体修改 +### 1. 更新i18n配置 +在i18n对象的en和zh部分添加新的文本键值对: +- en: { hero: { joinWaitlist: 'Join Waitlist', enterInviteCode: 'Enter Invite Code' } } +- zh: { hero: { joinWaitlist: '加入候补名单', enterInviteCode: '输入邀请码' } } + +### 2. 修改按钮布局 +- 将flex容器的排列方式改为垂直居中 +- 替换两个按钮为一个主按钮和一个次按钮 +- 使用t()函数获取按钮文本,支持中英文切换 + +### 3. 样式设计 +- 主按钮:白色背景、黑色文字、大圆角、居中显示 +- 次按钮:使用渐变文字效果(用户提供的样式) +- 整体垂直排列,居中显示 + +## 实现细节 +- 主按钮文字:通过`t('hero.joinWaitlist')`获取 +- 次按钮文字:通过`t('hero.enterInviteCode')`获取 +- 主按钮样式:白色背景、黑色文字、大圆角 +- 次按钮样式: + - 渐变背景:linear-gradient(90deg, #fff5c1, #a2e5ff) + - 文字填充透明:-webkit-text-fill-color: #0000 + - 背景裁剪文字:-webkit-background-clip: text; background-clip: text +- 布局:垂直排列,主按钮在上,次按钮在下,整体居中 + +## 预期效果 +修改后的div模块将呈现参考图所示的设计,支持中英文切换功能。当切换语言时,按钮文字会自动更新为对应语言,同时保持参考图的视觉设计。 \ No newline at end of file diff --git a/apps/frontend/package.json b/apps/frontend/package.json index c6c84ba..8d8b57a 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -21,7 +21,6 @@ "@vuelidate/core": "^2.0.3", "@vuelidate/validators": "^2.0.4", "@vueuse/core": "^14.1.0", - "axios": "^1.13.2", "country-state-city": "^3.2.1", "dayjs": "^1.11.13", "element-plus": "^2.11.7", diff --git a/apps/frontend/src/assets/5b7e01a1-a5d5-4aa9-9c44-274959788864.png b/apps/frontend/src/assets/5b7e01a1-a5d5-4aa9-9c44-274959788864.png deleted file mode 100644 index 317351a..0000000 Binary files a/apps/frontend/src/assets/5b7e01a1-a5d5-4aa9-9c44-274959788864.png and /dev/null differ diff --git a/apps/frontend/src/assets/demo.png b/apps/frontend/src/assets/demo.png deleted file mode 100644 index bb33281..0000000 Binary files a/apps/frontend/src/assets/demo.png and /dev/null differ diff --git a/apps/frontend/src/assets/demo1.png b/apps/frontend/src/assets/demo1.png deleted file mode 100644 index 1674cef..0000000 Binary files a/apps/frontend/src/assets/demo1.png and /dev/null differ diff --git a/apps/frontend/src/assets/demo3.png b/apps/frontend/src/assets/demo3.png deleted file mode 100644 index 310f289..0000000 Binary files a/apps/frontend/src/assets/demo3.png and /dev/null differ diff --git a/apps/frontend/src/assets/demo4.png b/apps/frontend/src/assets/demo4.png deleted file mode 100644 index 6e21908..0000000 Binary files a/apps/frontend/src/assets/demo4.png and /dev/null differ diff --git a/apps/frontend/src/assets/demo5.png b/apps/frontend/src/assets/demo5.png deleted file mode 100644 index 8966bea..0000000 Binary files a/apps/frontend/src/assets/demo5.png and /dev/null differ diff --git a/apps/frontend/src/assets/demosst.png b/apps/frontend/src/assets/demosst.png deleted file mode 100644 index 8a7930f..0000000 Binary files a/apps/frontend/src/assets/demosst.png and /dev/null differ diff --git a/apps/frontend/src/assets/logo.png b/apps/frontend/src/assets/logo.png deleted file mode 100644 index c68a23c..0000000 Binary files a/apps/frontend/src/assets/logo.png and /dev/null differ diff --git a/apps/frontend/src/assets/logo.webp b/apps/frontend/src/assets/logo.webp new file mode 100644 index 0000000..f4de295 Binary files /dev/null and b/apps/frontend/src/assets/logo.webp differ diff --git a/apps/frontend/src/assets/material/cz1.jpg b/apps/frontend/src/assets/material/cz1.jpg deleted file mode 100644 index 4edbfbd..0000000 Binary files a/apps/frontend/src/assets/material/cz1.jpg and /dev/null differ diff --git a/apps/frontend/src/assets/material/cz2.png b/apps/frontend/src/assets/material/cz2.png deleted file mode 100644 index 6510c7c..0000000 Binary files a/apps/frontend/src/assets/material/cz2.png and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/2c315fb7-0d2e-42c7-beaa-cd3da8117cbf (1).png b/apps/frontend/src/assets/sketches/2c315fb7-0d2e-42c7-beaa-cd3da8117cbf (1).png deleted file mode 100644 index 13d4bce..0000000 Binary files a/apps/frontend/src/assets/sketches/2c315fb7-0d2e-42c7-beaa-cd3da8117cbf (1).png and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/arduino_sitting.svg b/apps/frontend/src/assets/sketches/arduino_sitting.svg deleted file mode 100644 index 10ce8d7..0000000 --- a/apps/frontend/src/assets/sketches/arduino_sitting.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Sitting - \ No newline at end of file diff --git a/apps/frontend/src/assets/sketches/arduino_standing.svg b/apps/frontend/src/assets/sketches/arduino_standing.svg deleted file mode 100644 index 3270e6d..0000000 --- a/apps/frontend/src/assets/sketches/arduino_standing.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Standing - \ No newline at end of file diff --git a/apps/frontend/src/assets/sketches/cjt.png b/apps/frontend/src/assets/sketches/cjt.png deleted file mode 100644 index 5be71fd..0000000 Binary files a/apps/frontend/src/assets/sketches/cjt.png and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/dwww.webp b/apps/frontend/src/assets/sketches/dwww.webp deleted file mode 100644 index 8c725f1..0000000 Binary files a/apps/frontend/src/assets/sketches/dwww.webp and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/dwww2.png b/apps/frontend/src/assets/sketches/dwww2.png deleted file mode 100644 index 86817d2..0000000 Binary files a/apps/frontend/src/assets/sketches/dwww2.png and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/emails.png b/apps/frontend/src/assets/sketches/emails.png deleted file mode 100644 index 24ffb5b..0000000 Binary files a/apps/frontend/src/assets/sketches/emails.png and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/esp32_compact.svg b/apps/frontend/src/assets/sketches/esp32_compact.svg deleted file mode 100644 index 43c5539..0000000 --- a/apps/frontend/src/assets/sketches/esp32_compact.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Compact - \ No newline at end of file diff --git a/apps/frontend/src/assets/sketches/lts.png b/apps/frontend/src/assets/sketches/lts.png deleted file mode 100644 index 52ae87b..0000000 Binary files a/apps/frontend/src/assets/sketches/lts.png and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/ltsby.png b/apps/frontend/src/assets/sketches/ltsby.png deleted file mode 100644 index f022773..0000000 Binary files a/apps/frontend/src/assets/sketches/ltsby.png and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/mk2dy.png b/apps/frontend/src/assets/sketches/mk2dy.png deleted file mode 100644 index e853a4f..0000000 Binary files a/apps/frontend/src/assets/sketches/mk2dy.png and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/raspberry_action.svg b/apps/frontend/src/assets/sketches/raspberry_action.svg deleted file mode 100644 index 3a86175..0000000 --- a/apps/frontend/src/assets/sketches/raspberry_action.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Action - \ No newline at end of file diff --git a/apps/frontend/src/assets/sketches/tcww.png b/apps/frontend/src/assets/sketches/tcww.png deleted file mode 100644 index 784fa73..0000000 Binary files a/apps/frontend/src/assets/sketches/tcww.png and /dev/null differ diff --git a/apps/frontend/src/assets/sketches/tcww2.webp b/apps/frontend/src/assets/sketches/tcww2.webp deleted file mode 100644 index 222acf0..0000000 Binary files a/apps/frontend/src/assets/sketches/tcww2.webp and /dev/null differ diff --git a/apps/frontend/src/assets/step/creatProject/step1.png b/apps/frontend/src/assets/step/creatProject/step1.png deleted file mode 100644 index 4b17415..0000000 Binary files a/apps/frontend/src/assets/step/creatProject/step1.png and /dev/null differ diff --git a/apps/frontend/src/assets/step/creatProject/step2.png b/apps/frontend/src/assets/step/creatProject/step2.png deleted file mode 100644 index b0d4bd6..0000000 Binary files a/apps/frontend/src/assets/step/creatProject/step2.png and /dev/null differ diff --git a/apps/frontend/src/assets/step/creatProject/step3.png b/apps/frontend/src/assets/step/creatProject/step3.png deleted file mode 100644 index 7cf0ce4..0000000 Binary files a/apps/frontend/src/assets/step/creatProject/step3.png and /dev/null differ diff --git a/apps/frontend/src/assets/step/creatProject/step4.png b/apps/frontend/src/assets/step/creatProject/step4.png deleted file mode 100644 index d2f9161..0000000 Binary files a/apps/frontend/src/assets/step/creatProject/step4.png and /dev/null differ diff --git a/apps/frontend/src/components/CustomizationModal/index.vue b/apps/frontend/src/components/CustomizationModal/index.vue index e9cbbf0..0c6e7ea 100644 --- a/apps/frontend/src/components/CustomizationModal/index.vue +++ b/apps/frontend/src/components/CustomizationModal/index.vue @@ -11,7 +11,7 @@
-
白膜预览
+
白膜模型
基础打样,适合二次涂装
@@ -63,8 +63,6 @@ import { ref, watch } from 'vue' // 移除路由跳转,改为向父组件发出购买事件 import { ElIcon } from 'element-plus' import { CloseBold } from '@element-plus/icons-vue' -import whiteThumb from '@/assets/demo.png' -import colorThumb from '@/assets/demo4.png' const props = defineProps({ show: { type: Boolean, default: false }, diff --git a/apps/frontend/src/components/GuideModal/index.vue b/apps/frontend/src/components/GuideModal/index.vue index 5c176a1..c9c5d33 100644 --- a/apps/frontend/src/components/GuideModal/index.vue +++ b/apps/frontend/src/components/GuideModal/index.vue @@ -113,28 +113,28 @@ const guideSteps = computed(() => [ id: 1, title: t('guideModal.step1.title'), description: t('guideModal.step1.description'), - image: new URL('@/assets/step/creatProject/step1.png', import.meta.url).href, + image: 'https://draft-user.s3.us-east-2.amazonaws.com/images/de7142df-ceb9-48f9-9367-af2a65e786a5.png', tips: t('guideModal.step1.tips') }, { id: 2, title: t('guideModal.step2.title'), description: t('guideModal.step2.description'), - image: new URL('@/assets/step/creatProject/step2.png', import.meta.url).href, + image:'https://draft-user.s3.us-east-2.amazonaws.com/images/40773ee8-7f85-40c9-8c23-7ea1718e58a8.png', tips: t('guideModal.step2.tips') }, { id: 3, title: t('guideModal.step3.title'), description: t('guideModal.step3.description'), - image: new URL('@/assets/step/creatProject/step3.png', import.meta.url).href, + image: 'https://draft-user.s3.us-east-2.amazonaws.com/images/47cdd95f-23fb-486b-bd19-5fca67c2ce45.png', tips: t('guideModal.step3.tips') }, { id: 4, title: t('guideModal.step4.title'), description: t('guideModal.step4.description'), - image: new URL('@/assets/step/creatProject/step4.png', import.meta.url).href, + image: 'https://draft-user.s3.us-east-2.amazonaws.com/images/690f2da4-400e-4cb0-a815-246e614d79b1.png', tips: t('guideModal.step4.tips') } ]); diff --git a/apps/frontend/src/components/IPCard/index.vue b/apps/frontend/src/components/IPCard/index.vue index 9841192..abe76fe 100644 --- a/apps/frontend/src/components/IPCard/index.vue +++ b/apps/frontend/src/components/IPCard/index.vue @@ -1,5 +1,5 @@ @@ -719,6 +722,17 @@ const handleImageLoad = (event) => { pointer-events: auto; } +/* 移动端适配:点击卡片后显示功能按钮 */ +@media (max-width: 768px) { + /* 点击卡片容器时显示功能按钮 */ + .ip-card-container:active .right-circular-controls, + .ip-card-container.controls-visible .right-circular-controls { + opacity: 1; + transform: translateX(0); + pointer-events: auto; + } +} + .control-button { width: 48px; height: 48px; @@ -759,6 +773,14 @@ const handleImageLoad = (event) => { display: block; } +/* 确保el-image内部图片正确显示 */ +.ip-card-image :deep(img) { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + .image-placeholder { width: 100%; height: 100%; diff --git a/apps/frontend/src/components/ImagePreviewModal/index.vue b/apps/frontend/src/components/ImagePreviewModal/index.vue new file mode 100644 index 0000000..be19ade --- /dev/null +++ b/apps/frontend/src/components/ImagePreviewModal/index.vue @@ -0,0 +1,701 @@ + + + + + \ No newline at end of file diff --git a/apps/frontend/src/components/LoadingCom/index.vue b/apps/frontend/src/components/LoadingCom/index.vue index 6ef4a21..1dab9aa 100644 --- a/apps/frontend/src/components/LoadingCom/index.vue +++ b/apps/frontend/src/components/LoadingCom/index.vue @@ -15,7 +15,7 @@ /* background: red; */ backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px); - z-index: 9999; + z-index: 99999; opacity: 0; visibility: hidden; transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1); diff --git a/apps/frontend/src/components/LogisticsTimeline.vue b/apps/frontend/src/components/LogisticsTimeline.vue index f4004c8..da53ff9 100644 --- a/apps/frontend/src/components/LogisticsTimeline.vue +++ b/apps/frontend/src/components/LogisticsTimeline.vue @@ -9,7 +9,7 @@
{{ $t('logistics.estimatedDelivery') }}: - {{ formatDate(logisticsInfo.estimatedDelivery) }} + {{ dateUtils.formatDate(logisticsInfo.estimatedDelivery) }}
@@ -68,7 +68,7 @@

{{ logisticsInfo.currentLocation || '北京市朝阳区分拣中心' }}

- {{ $t('logistics.lastUpdate') }}: {{ formatDate(logisticsInfo.lastUpdate) }} + {{ $t('logistics.lastUpdate') }}: {{ dateUtils.formatDate(logisticsInfo.lastUpdate) }}
@@ -92,7 +92,8 @@ import { CircleCheck } from '@element-plus/icons-vue' import { ORDER_STATUS } from '@/stores/orders' -import dayjs from 'dayjs' +import {dateUtils} from '@deotaland/utils'; +// import dayjs from 'dayjs' const props = defineProps({ orderId: { @@ -127,11 +128,7 @@ const EVENT_TYPES = { EXCEPTION: 'exception' } -// 格式化日期 -const formatDate = (dateString) => { - if (!dateString) return '' - return dayjs(dateString).format('YYYY-MM-DD HH:mm') -} + // 获取事件颜色 const getEventColor = (eventType) => { diff --git a/apps/frontend/src/components/ModelModal/index.vue b/apps/frontend/src/components/ModelModal/index.vue index 2602ac1..433caef 100644 --- a/apps/frontend/src/components/ModelModal/index.vue +++ b/apps/frontend/src/components/ModelModal/index.vue @@ -232,6 +232,7 @@ onBeforeUnmount(() => { transform: translateX(-50%); display: flex; justify-content: center; + z-index: 20; } .toolbar-content { diff --git a/apps/frontend/src/components/ThreeModelViewer/index.vue b/apps/frontend/src/components/ThreeModelViewer/index.vue index 3b8bdc0..6c651ae 100644 --- a/apps/frontend/src/components/ThreeModelViewer/index.vue +++ b/apps/frontend/src/components/ThreeModelViewer/index.vue @@ -2,9 +2,7 @@
-
-
-
{{ 'loadingModel' }}
+
{{ Math.round(loadingProgress) }}%
@@ -750,13 +748,16 @@ defineExpose({ } .loading-spinner { - width: 40px; - height: 40px; - border: 4px solid rgba(255, 255, 255, 0.3); + width: 50px; + height: 50px; + border: 4px solid rgba(107, 70, 193, 0.3); border-radius: 50%; - border-top-color: #4287f5; - animation: spin 1s ease-in-out infinite; + border-top-color: #6B46C1; + border-right-color: #A78BFA; + border-bottom-color: #D6BCFA; + animation: spin 1s linear infinite, pulse 1.5s ease-in-out infinite alternate; margin-bottom: 16px; + box-shadow: 0 0 20px rgba(107, 70, 193, 0.5); } .loading-text { @@ -764,28 +765,54 @@ defineExpose({ font-size: 14px; margin-bottom: 8px; text-align: center; + background: linear-gradient(90deg, #6B46C1, #A78BFA); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + animation: fadeIn 0.5s ease-in-out; } .loading-progress { - color: #4287f5; - font-size: 16px; + background: linear-gradient(90deg, #6B46C1, #A78BFA); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + font-size: 20px; font-weight: bold; margin-bottom: 12px; + text-shadow: 0 0 10px rgba(107, 70, 193, 0.5); + animation: glow 1.5s ease-in-out infinite alternate; } .loading-bar { width: 80%; - height: 4px; - background-color: rgba(255, 255, 255, 0.2); - border-radius: 2px; + height: 6px; + background-color: rgba(255, 255, 255, 0.1); + border-radius: 3px; overflow: hidden; + box-shadow: 0 0 10px rgba(107, 70, 193, 0.3); + position: relative; } .loading-progress-bar { height: 100%; - background-color: #4287f5; + background: linear-gradient(90deg, #6B46C1, #A78BFA, #D6BCFA, #A78BFA, #6B46C1); + background-size: 300% 100%; transition: width 0.3s ease; - border-radius: 2px; + border-radius: 3px; + animation: gradientFlow 2s linear infinite; + position: relative; +} + +.loading-progress-bar::after { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent); + animation: shimmer 1.5s ease-in-out infinite; } /* 错误提示样式 */ @@ -809,6 +836,10 @@ defineExpose({ .error-icon { font-size: 32px; margin-bottom: 12px; + background: linear-gradient(90deg, #6B46C1, #A78BFA); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; } .error-text { @@ -833,6 +864,60 @@ defineExpose({ } } +/* 脉冲动画 */ +@keyframes pulse { + from { + transform: scale(1); + box-shadow: 0 0 20px rgba(107, 70, 193, 0.5); + } + to { + transform: scale(1.1); + box-shadow: 0 0 30px rgba(107, 70, 193, 0.8); + } +} + +/* 渐变流动动画 */ +@keyframes gradientFlow { + 0% { + background-position: 0% 50%; + } + 100% { + background-position: 100% 50%; + } +} + +/* 闪光动画 */ +@keyframes shimmer { + 0% { + left: -100%; + } + 100% { + left: 100%; + } +} + +/* 发光动画 */ +@keyframes glow { + from { + text-shadow: 0 0 10px rgba(107, 70, 193, 0.5); + } + to { + text-shadow: 0 0 20px rgba(107, 70, 193, 0.8), 0 0 30px rgba(167, 139, 250, 0.6); + } +} + +/* 淡入动画 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + .export-controls { display: flex; gap: 8px; diff --git a/apps/frontend/src/components/auth/ForgotPasswordForm.vue b/apps/frontend/src/components/auth/ForgotPasswordForm.vue index 3a36fa7..961f350 100644 --- a/apps/frontend/src/components/auth/ForgotPasswordForm.vue +++ b/apps/frontend/src/components/auth/ForgotPasswordForm.vue @@ -1,10 +1,10 @@