feat(personal_collect,motion_reminder): 新增回收站与云端TTS语音功能

- 新增小程序个人收藏回收站页面,支持查看已删除收藏、恢复与彻底删除操作
- 修复个人收藏文件上传时的中文名乱码问题,新增原文件名透传参数
- 接入阿里云百炼TTS服务,实现运动提醒模块的云端语音合成与本地缓存,支持系统TTS与云端MP3双降级播放
- 新增语音引擎探测与异常预警UI,覆盖web端与移动端
- 优化web端订单盒页面布局,修复卡片操作按钮换行问题
- 新增调试探针脚本、ESLint配置与相关lint脚本
- 完善后端接口与路由,更新项目依赖与配置文件
This commit is contained in:
yangxiangyuan
2026-09-17 16:26:27 +08:00
parent d4bf3627fd
commit bbc7ca6523
29 changed files with 3228 additions and 163 deletions
+270 -1
View File
@@ -692,13 +692,282 @@ body {
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.65);
z-index: 2000;
z-index: 2200;
}
.icon-picker.active {
display: flex;
}
/* ===== 书签后台维护:tab + 表格 + 分页 + 弹窗 ===== */
.admin-tabs {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 12px;
}
.admin-tab-btn {
opacity: 0.65;
}
.admin-tab-btn.active {
opacity: 1;
background: rgba(59, 130, 246, 0.4);
border-color: rgba(99, 102, 241, 0.8);
}
.admin-tab-page {
display: none;
}
.admin-tab-page.active {
display: block;
}
.admin-toolbar {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
margin-bottom: 10px;
}
.admin-toolbar .bookmark-search {
flex: 1 1 200px;
min-width: 160px;
margin: 0;
}
.bookmark-filter-select {
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.25);
background: rgba(0, 0, 0, 0.35);
color: #ffffff;
padding: 0.5rem 0.6rem;
outline: none;
max-width: 220px;
}
.admin-count {
margin-left: auto;
font-size: 0.85rem;
opacity: 0.8;
white-space: nowrap;
}
.admin-table-wrap {
overflow-x: auto;
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.15);
background: rgba(0, 0, 0, 0.25);
}
.admin-table {
width: 100%;
border-collapse: collapse;
font-size: 0.92rem;
min-width: 660px;
}
.admin-table th,
.admin-table td {
padding: 8px 10px;
text-align: left;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
vertical-align: middle;
}
.admin-table th {
background: rgba(255, 255, 255, 0.06);
font-weight: 600;
white-space: nowrap;
}
.admin-table tbody tr:last-child td {
border-bottom: none;
}
.admin-table tbody tr:hover {
background: rgba(255, 255, 255, 0.05);
}
.admin-table .th-actions,
.admin-table .td-actions {
text-align: right;
white-space: nowrap;
}
.admin-table .td-actions .admin-row-actions {
justify-content: flex-end;
}
.admin-table .td-icon {
width: 34px;
text-align: center;
}
.admin-table .td-icon img {
width: 20px;
height: 20px;
object-fit: contain;
vertical-align: middle;
}
.admin-table .td-main .td-sub {
font-size: 0.8rem;
opacity: 0.75;
max-width: 220px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.admin-table .td-remark-wrap {
display: flex;
align-items: center;
gap: 4px;
min-width: 0;
}
.admin-table .td-remark-wrap.expanded {
align-items: flex-start;
}
.admin-table .td-remark-wrap.expanded .td-sub {
white-space: normal;
max-width: 420px;
overflow: visible;
text-overflow: clip;
}
.remark-toggle {
flex: none;
background: none;
border: none;
color: #93c5fd;
cursor: pointer;
font-size: 0.8rem;
line-height: 1;
padding: 0 2px;
opacity: 0.9;
}
.remark-toggle:hover {
opacity: 1;
}
.admin-table .td-url {
max-width: 240px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.admin-table .td-url .url-type-icon {
margin-right: 4px;
font-size: 0.85em;
}
.admin-table .td-url a {
color: #93c5fd;
text-decoration: none;
}
.admin-table .td-url a:hover {
text-decoration: underline;
}
.admin-table .empty-row {
text-align: center;
color: rgba(255, 255, 255, 0.6);
padding: 18px 10px;
}
.admin-pagination {
display: flex;
flex-wrap: wrap;
gap: 6px;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
.pagination-btn {
padding: 0.32rem 0.7rem;
font-size: 0.85rem;
}
.pagination-btn.active {
background: rgba(59, 130, 246, 0.5);
border-color: rgba(99, 102, 241, 0.9);
opacity: 1;
}
.pagination-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.pagination-dots {
color: rgba(255, 255, 255, 0.6);
padding: 0 2px;
}
/* 后台维护弹窗 */
.nav-modal-overlay {
position: fixed;
inset: 0;
display: none;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.6);
z-index: 2100;
padding: 16px;
}
.nav-modal-overlay.active {
display: flex;
}
.nav-modal {
width: 100%;
max-width: 460px;
max-height: 86vh;
overflow-y: auto;
border-radius: 12px;
background: rgba(15, 20, 35, 0.98);
border: 1px solid rgba(255, 255, 255, 0.22);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
padding: 16px;
}
.nav-modal-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.nav-modal-title {
font-size: 1.05rem;
font-weight: 600;
}
.nav-modal-close {
padding: 4px 10px;
line-height: 1;
}
.nav-form .form-actions {
justify-content: flex-end;
}
.nav-form button[type="submit"]:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.fitness-diary-reminder,
.weekly-report-reminder {
position: fixed;