This commit is contained in:
Felix
2025-12-10 19:39:31 +08:00
parent dda6290b15
commit f4079961ca
7 changed files with 53 additions and 30 deletions

View File

@@ -1315,7 +1315,17 @@ Page<IPageData, IPageInstance>({
analizing: false
})
wx.showToast({ title: '评估失败', icon: 'none' })
wx.hideLoading()
// wx.hideLoading()
}).finally(() => {
this.setData({
isRecording: false,
overlayVisible: false,
highlightShow: false,
highlightZoom: false,
focusTransform: '',
highlightWords: [],
analizing: false
})
})
}).catch(err => {
console.error('上传录音失败:', err)
@@ -1329,7 +1339,17 @@ Page<IPageData, IPageInstance>({
analizing: false
})
wx.showToast({ title: '上传失败', icon: 'none' })
wx.hideLoading()
// wx.hideLoading()
}).finally(() => {
this.setData({
isRecording: false,
overlayVisible: false,
highlightShow: false,
highlightZoom: false,
focusTransform: '',
highlightWords: [],
analizing: false
})
})
}
},
@@ -1367,7 +1387,7 @@ Page<IPageData, IPageInstance>({
// 录音出错时淡出高亮层
this.setData({ overlayVisible: false, isRecording: false })
const timer = setTimeout(() => {
this.setData({ highlightShow: false, highlightZoom: false, focusTransform: '', highlightWords: [] })
this.setData({ highlightShow: false, highlightZoom: false, focusTransform: '', highlightWords: [], analizing: false })
clearTimeout(timer)
}, 320)
})

View File

@@ -9,7 +9,7 @@
<view class="section">
<text class="subtitle">引言</text>
<text class="paragraph">KnowWords(以下简称"我们")深知个人信息对您的重要性,并承诺按照法律法规的要求保护您的隐私安全。本《隐私政策》(以下简称"本政策")旨在向您清晰说明我们在您使用本小程序过程中如何收集、使用、存储、共享和保护您的个人信息,以及您享有的权利。</text>
<text class="paragraph">blabla(以下简称"我们")深知个人信息对您的重要性,并承诺按照法律法规的要求保护您的隐私安全。本《隐私政策》(以下简称"本政策")旨在向您清晰说明我们在您使用本小程序过程中如何收集、使用、存储、共享和保护您的个人信息,以及您享有的权利。</text>
</view>
<view class="section">
@@ -24,14 +24,14 @@
<view class="section">
<text class="subtitle">2. 我们如何使用这些信息</text>
<text class="paragraph">我们仅会出于以下目的处理您的信息:</text>
<text class="paragraph">提供与优化服务使用您的微信信息为您创建账户标识使用第三方AI模型处理您上传的图片以返回单词处理您的语音以提供发音反馈。</text>
<text class="paragraph">提供与优化服务使用您的微信信息为您创建账户标识使用第三方AI模型处理您上传的图片以返回单词处理您的语音以提供发音反馈。</text>
<text class="paragraph">安全与运维:利用日志信息排查故障、防范安全风险。</text>
</view>
<view class="section">
<text class="subtitle">3. 我们如何共享、转让、公开披露您的信息</text>
<text class="paragraph">共享: 我们不会出售您的个人信息。我们会在以下情况下与第三方共享信息:</text>
<text class="paragraph">与必要的第三方服务提供商共享:为实现识别功能,我们必须将您上传的图片数据共享给第三方 AI 技术服务商。我们只会共享提供服务所必要的信息,并采取严格的保密和安全措施。</text>
<text class="paragraph">与必要的第三方服务提供商共享:为实现功能,我们必须将您上传的数据共享给第三方 AI 技术服务商。我们只会共享提供服务所必要的信息,并采取严格的保密和安全措施。</text>
<text class="paragraph">应法律要求:如为遵守适用的法律法规、法院指令或政府要求,我们可能会披露您的信息。</text>
<text class="paragraph">转让与公开披露:我们不会将您的个人信息转让给任何公司、组织或个人,也不会公开披露,除非事先获得您的明确同意或法律强制要求。</text>
</view>
@@ -39,35 +39,35 @@
<view class="section">
<text class="subtitle">4. 数据的存储与保护</text>
<text class="paragraph">存储地点:我们在中华人民共和国境内收集和产生的个人信息,将存储在境内。</text>
<text class="paragraph">安全措施: 我们采用符合行业标准的安全技术如HTTPS加密传输和管理流程来防止信息泄露、篡改或损坏。</text>
<text class="paragraph">安全措施: 我们采用符合行业标准的安全技术和管理流程来防止信息泄露、篡改或损坏。</text>
</view>
<view class="section">
<text class="subtitle">5. 您的权利</text>
<text class="paragraph">您对自己的个人信息享有以下权利:</text>
<text class="paragraph">访问与更正您有权访问我们持有的关于您的个人信息。由于我们仅存储微信OpenID您可以通过微信个人资料设置修改您的头像和昵称。</text>
<text class="paragraph">删除与撤回同意:您可以通过【请说明用户如何注销账户或删除数据,例如"通过小程序内'联系客服'申请注销账户"】的方式,要求删除您的账户信息。您也可以在设备系统设置中关闭相机、麦克风权限来撤回相应授权。</text>
<text class="paragraph">删除与撤回同意:您可以通过小程序内'联系客服-申请注销账户'的方式,要求删除您的账户信息。您也可以在设备系统设置中关闭相机、麦克风权限来撤回相应授权。</text>
<text class="paragraph">投诉与举报:如果您认为我们的处理行为侵害了您的权益,您可以通过本政策提供的联系方式向我们投诉,或向相关监管部门举报。</text>
</view>
<view class="section">
<text class="subtitle">6. 第三方服务说明</text>
<text class="paragraph">本服务依赖第三方AI服务商处理图像。该处理过程受其自身隐私政策的约束我们无法直接控制其服务器端的数据处理行为。 我们建议您了解其主要隐私政策(例如,通义千问的隐私政策)。</text>
<text class="paragraph">本服务依赖第三方AI服务商处理图像。该处理过程受其自身隐私政策的约束我们无法直接控制其服务器端的数据处理行为。 我们建议您了解其主要隐私政策。</text>
</view>
<view class="section">
<text class="subtitle">7. 儿童隐私保护</text>
<text class="paragraph">我们不建议未满10周岁的儿童自行使用本服务。如果您是儿童监护人,请确保儿童在您的指导下使用,并已同意我们按照本政策处理儿童信息。如果您发现我们在不知情的情况下收集了儿童信息,请立即联系我们,我们将尽快删除。</text>
<text class="paragraph">我们不建议未满14周岁的儿童自行使用本服务。如果您是儿童监护人,请确保儿童在您的指导下使用,并已同意我们按照本政策处理儿童信息。如果您发现我们在不知情的情况下收集了儿童信息,请立即联系我们,我们将尽快删除。</text>
</view>
<view class="section">
<text class="subtitle">8. 隐私政策的修订</text>
<text class="paragraph">我们可能适时修订本政策。更新后,我们会在本小程序内以显著方式发布更新后的政策,并重新征得您的同意(如法律要求)。</text>
<text class="paragraph">我们可能适时修订本政策。更新后,我们会在本小程序内以显著方式发布更新后的政策,并重新征得您的同意。</text>
</view>
<view class="section">
<text class="subtitle">9. 联系我们</text>
<text class="paragraph">如您对本政策或您的个人信息相关事宜有任何疑问、意见或需要行使权利,请通过以下方式与我们联系:</text>
<text class="paragraph">如您对本政策有任何疑问、意见或需要行使权利,请通过以下方式与我们联系:</text>
<text class="paragraph">【请填写负责数据保护的联系方式DPO@yourcompany.com】</text>
<text class="paragraph">我们将在收到请求后的15个工作日内予以回复和处理。</text>
</view>

View File

@@ -318,11 +318,9 @@ Page({
if (stats.sizeByType.audio > 0) {
detailParts.push(`音频:${apiManager.formatFileSize(stats.sizeByType.audio)}`)
}
if (stats.sizeByType.image > 0) {
detailParts.push(`图片:${apiManager.formatFileSize(stats.sizeByType.image)}`)
}
if (stats.sizeByType.thumbnail > 0) {
detailParts.push(`缩略图:${apiManager.formatFileSize(stats.sizeByType.thumbnail)}`)
const imageTotal = (stats.sizeByType.image || 0) + (stats.sizeByType.thumbnail || 0)
if (imageTotal > 0) {
detailParts.push(`图片:${apiManager.formatFileSize(imageTotal)}`)
}
if (stats.sizeByType.dict > 0) {
detailParts.push(`词典:${apiManager.formatFileSize(stats.sizeByType.dict)}`)

View File

@@ -4,17 +4,17 @@
<text class="title">用户协议</text>
<view class="section">
<text class="subtitle">欢迎使用 KnowWords</text>
<text class="paragraph">本用户协议(以下简称"本协议")由您(以下简称"用户"或"您")与 KnowWords 小程序运营者(以下简称"我们")订立,旨在明确您在使用 KnowWords 微信小程序(以下简称"本小程序")时的权利与义务。</text>
<text class="subtitle">欢迎使用 blabla</text>
<text class="paragraph">本用户协议(以下简称"本协议")由您(以下简称"用户"或"您")与 blabla 小程序运营者(以下简称"我们")订立,旨在明确您在使用 blabla 微信小程序(以下简称"本小程序")时的权利与义务。</text>
<text class="paragraph">请您在使用本小程序前,仔细阅读并理解本协议及《隐私政策》 的全部内容。</text>
</view>
<view class="section">
<text class="subtitle">1. 服务说明</text>
<text class="paragraph">KnowWords 是一款通过识别图片中的物体来帮助用户学习外语的工具。您需要使用微信账号授权登录。本服务主要包括:</text>
<text class="paragraph">blabla 是一款通过识别图片中的物体来帮助用户学习外语的工具。您需要使用微信账号授权登录。本服务主要包括:</text>
<text class="paragraph">提供基于微信身份的一键登录。</text>
<text class="paragraph">接收您上传的图片并利用第三方AI模型(如通义千问)进行识别,返回相应的图片描述。</text>
<text class="paragraph">录制并分析您的语音并利用第三方AI模型(智聆口语评测)进行评测,提供发音反馈。</text>
<text class="paragraph">接收您上传的图片并利用第三方AI模型进行识别返回相应的图片描述。</text>
<text class="paragraph">录制并分析您的语音并利用第三方AI模型进行评测提供发音反馈。</text>
</view>
<view class="section">

View File

@@ -317,6 +317,7 @@ Page({
// 加载今日摘要数据(当天记录,只加载第一页)
async loadTodaySummary(page: number = 1) {
try {
this.setData({ isLoading: true });
const result = await apiManager.getTodaySummary(page, this.data.todaySize);
// 处理数据,按时间分组
@@ -346,7 +347,8 @@ Page({
// 设置今日摘要数据
this.setData({
todaySummary: processedItems
todaySummary: processedItems,
isLoading: false
}, () => {
this.rebuildDateData();
this.fetchSecureTodayImageUrls();
@@ -356,6 +358,7 @@ Page({
return processedItems;
} catch (error) {
console.error('加载今日摘要失败:', error);
this.setData({ isLoading: false });
wx.showToast({
title: '加载今日数据失败',
icon: 'none'

View File

@@ -84,7 +84,7 @@
<block wx:if="{{!useWaterfall}}">
<view class="image-list">
<view class="list-item" wx:for="{{selectedDateImages}}" wx:for-item="image" wx:key="index" catch:tap="onImageTap" data-image-id="{{image.image_id}}">
<t-skeleton wx:if="{{image.thumbnail_loading}}" class="full-image" theme="image" animation="gradient" loading="{{true}}"></t-skeleton>
<t-skeleton wx:if="{{image.thumbnail_loading}}" class="full-image" row-col="{{[1]}}" animation="gradient" loading></t-skeleton>
<image wx:else class="full-image" src="{{image.thumbnail_url}}" mode="widthFix" />
</view>
</view>
@@ -93,13 +93,13 @@
<view class="waterfall">
<view class="wf-col">
<view class="wf-item" wx:for="{{waterfallLeft}}" wx:key="index" catch:tap="onImageTap" data-image-id="{{item.image_id}}">
<t-skeleton wx:if="{{item.thumbnail_loading}}" class="wf-image" theme="image" animation="gradient" loading="{{true}}"></t-skeleton>
<t-skeleton wx:if="{{item.thumbnail_loading}}" class="wf-image" row-col="{{[1]}}" animation="gradient" loading></t-skeleton>
<image wx:else class="wf-image" src="{{item.thumbnail_url}}" mode="widthFix" />
</view>
</view>
<view class="wf-col">
<view class="wf-item" wx:for="{{waterfallRight}}" wx:key="index" catch:tap="onImageTap" data-image-id="{{item.image_id}}">
<t-skeleton wx:if="{{item.thumbnail_loading}}" class="wf-image" theme="image" animation="gradient" loading="{{true}}"></t-skeleton>
<t-skeleton wx:if="{{item.thumbnail_loading}}" class="wf-image" row-col="{{[1]}}" animation="gradient" loading></t-skeleton>
<image wx:else class="wf-image" src="{{item.thumbnail_url}}" mode="widthFix" />
</view>
</view>
@@ -108,7 +108,7 @@
</scroll-view>
</view>
</view>
<view wx:if="{{!takePhoto && selectedDateKey === todayKey && (!selectedDateImages || selectedDateImages.length === 0)}}" class="history-wrap">
<view wx:if="{{!isLoading && !takePhoto && selectedDateKey === todayKey && (!selectedDateImages || selectedDateImages.length === 0)}}" class="history-wrap">
<view class="history-card-item blank-card">
<view class="blank-content" bindtap="handleImageSelect">
<view class="photo-inner">
@@ -119,7 +119,7 @@
</view>
<!-- 历史记录区域 -->
<!-- 仅在加载更多时显示骨架屏 -->
<t-skeleton wx:if="{{isLoading && page >= 1}}" theme="paragraph" animation="gradient" loading="{{true}}"></t-skeleton>
<!-- <t-skeleton wx:if="{{isLoading && page >= 1}}" theme="paragraph" animation="gradient" loading="{{true}}"></t-skeleton> -->
<!-- 使用提示 -->
<!-- <view class="tips-section">
<view class="tips-card">

View File

@@ -114,13 +114,13 @@
/* 新:单列全幅图片列表 */
.image-list { padding: 24rpx; box-sizing: border-box; }
.list-item { margin-bottom: 24rpx; border-radius: 24rpx; overflow: hidden; background: #fff; }
.full-image { width: 100%; height: auto; display: block; }
.full-image { width: 100%; height: auto; display: block; --td-skeleton-text-height: 550rpx;}
/* 新:两列瀑布布局 */
.waterfall { display: flex; gap: 12rpx; padding: 12rpx; box-sizing: border-box; }
.wf-col { width: calc(50% - 6rpx); }
.wf-item { margin-bottom: 12rpx; border-radius: 24rpx; overflow: hidden; background: #fff; }
.wf-image { width: 100%; height: auto; display: block; }
.wf-image { width: 100%; height: auto; display: block; --td-skeleton-text-height: 330rpx; }
.images-list {
margin-top: 20rpx;
width: 100%;
@@ -376,6 +376,8 @@
.date-item.label { background: rgba(255,255,255,0.65); color: #001858; box-shadow: none; }
.date-item .weekday { font-size: 24rpx; opacity: 0.8; }
.date-item .day { font-size: 36rpx;}
.night .date-item { background: rgba(160,160,160,0.75); color: #000000; }
.night .date-item.active { background: #fffffe; color: #000000; }
@keyframes moveLeftRight {
0% {