@@ -1,10 +1,8 @@ | |||||
1、小程序登录与H5登录差异化 | 1、小程序登录与H5登录差异化 | ||||
2、H5支付实现问题 | 2、H5支付实现问题 | ||||
3、生成照片失败时的错误处理(包括退换积分、页面展示、生成历史列表的展现形式) | 3、生成照片失败时的错误处理(包括退换积分、页面展示、生成历史列表的展现形式) | ||||
<<<<<<< HEAD | |||||
4、生成照片失败是否从草稿恢复 | 4、生成照片失败是否从草稿恢复 | ||||
======= | |||||
(1)自动重试 | (1)自动重试 | ||||
(2)错误时的友好提示 | (2)错误时的友好提示 | ||||
(3)重试直到成功,通知用户 | (3)重试直到成功,通知用户 | ||||
>>>>>>> dev | |||||
5、百度图片审核API失效问题 |
@@ -0,0 +1,41 @@ | |||||
import request from "../utils/request" | |||||
/** | |||||
* @description:获取金币价格列表 | |||||
* @param {*} (pageSize, pageNum) | |||||
* @return: list | |||||
*/ | |||||
export function getCoinList(pageSize, pageNum) { | |||||
return request({ | |||||
url: `api/product/list?projectType=5&type=1&pageSize=${pageSize}&pageNum=${pageNum}`, | |||||
method: 'get' | |||||
}) | |||||
} | |||||
/** | |||||
* @description:购买金币下单 | |||||
* @param productId | |||||
* @return: data | |||||
*/ | |||||
export function createOrder(productId) { | |||||
return request({ | |||||
url: `api/productOrder/createOrder`, | |||||
method: 'post', | |||||
data: { | |||||
productId | |||||
} | |||||
}) | |||||
} | |||||
/** | |||||
* @description:获取收银台数据 | |||||
* @param data | |||||
* @return: data | |||||
*/ | |||||
export function createPay(data) { | |||||
return request({ | |||||
url: `api/productOrder/createPay`, | |||||
method: 'post', | |||||
data | |||||
}) | |||||
} |
@@ -66,6 +66,12 @@ | |||||
"navigationBarTitleText": "智像相机用户使用协议" | "navigationBarTitleText": "智像相机用户使用协议" | ||||
} | } | ||||
}, | }, | ||||
{ | |||||
"path": "pages/protocol/coin", | |||||
"style": { | |||||
"navigationBarTitleText": "慧拍金币充值协议" | |||||
} | |||||
}, | |||||
{ | { | ||||
"path": "pages/generateVideo/index", | "path": "pages/generateVideo/index", | ||||
"style": { | "style": { | ||||
@@ -2,50 +2,81 @@ | |||||
<view class="page"> | <view class="page"> | ||||
<text class="tips">金币可以用来生成写真和制作视频</text> | <text class="tips">金币可以用来生成写真和制作视频</text> | ||||
<view | <view | ||||
v-for="item in orderList" | |||||
v-for="item in coinList" | |||||
class="orderListItem" | class="orderListItem" | ||||
:class="active == item.num ? 'border' : ''" | |||||
:class="active == item.id ? 'border' : ''" | |||||
@click="select(item)" | @click="select(item)" | ||||
> | > | ||||
<image src="../../assets/icon/coin.png" mode="scaleToFill" /> | <image src="../../assets/icon/coin.png" mode="scaleToFill" /> | ||||
<text class="num">金币{{ item.num }}枚</text> | |||||
<text class="price">¥{{ item.money }}</text> | |||||
<text class="num">{{ item.title }}</text> | |||||
<text class="price">¥{{ item.sellPriceRmb / 100 }}</text> | |||||
</view> | |||||
<view class="buyBtn"> | |||||
<view class="btn" @click="createProductOrder">立刻购买</view> | |||||
<view class="pro" @click="goPro">《慧拍金币充值协议》</view> | |||||
</view> | </view> | ||||
<view class="buyBtn">立刻购买</view> | |||||
</view> | </view> | ||||
</template> | </template> | ||||
<script setup> | <script setup> | ||||
//#region 导入 | //#region 导入 | ||||
import { ref, reactive } from "vue"; | import { ref, reactive } from "vue"; | ||||
import { getCoinList, createOrder, createPay } from "../../api/coin.js"; | |||||
//#endregion -------------- | //#endregion -------------- | ||||
//#region 列表数据 | //#region 列表数据 | ||||
const active = ref(5); | |||||
const orderList = ref([ | |||||
{ num: 5, money: 4.9 }, | |||||
{ num: 20, money: 18.9 }, | |||||
{ num: 30, money: 28.9 }, | |||||
]); | |||||
const active = ref(""); | |||||
const coinList = ref([]); | |||||
function select(item) { | function select(item) { | ||||
active.value = item.num; | |||||
active.value = item.id; | |||||
} | } | ||||
//#endregion -------------- | |||||
const goPro = () => { | |||||
uni.navigateTo({ | |||||
url: "/pages/protocol/coin", | |||||
}); | |||||
}; | |||||
const getList = async () => { | |||||
try { | |||||
const res = await getCoinList(5, 1); | |||||
coinList.value = res.data.list; | |||||
console.log(coinList.value, "coinList.value"); | |||||
} catch (error) { | |||||
console.log(error, "error"); | |||||
} | |||||
}; | |||||
//#region | |||||
const createProductOrder = async () => { | |||||
try { | |||||
const res = await createOrder(1); | |||||
console.log(res, "res"); | |||||
// createProductPay() | |||||
} catch (error) { | |||||
console.log(error, "error"); | |||||
} | |||||
}; | |||||
//#endregion -------------- | |||||
const createProductPay = async () => { | |||||
try { | |||||
const res = await createPay(1); | |||||
console.log(res, "res"); | |||||
} catch (error) { | |||||
console.log(error, "error"); | |||||
} | |||||
}; | |||||
getList(); | |||||
</script> | </script> | ||||
<style lang="scss"> | <style lang="scss"> | ||||
.tips { | .tips { | ||||
font-size: 33rpx; | |||||
margin-top: 70rpx; | margin-top: 70rpx; | ||||
margin-bottom: 90rpx; | |||||
margin-bottom: 70rpx; | |||||
} | } | ||||
.orderListItem { | .orderListItem { | ||||
position: relative; | position: relative; | ||||
margin-bottom: 40rpx; | margin-bottom: 40rpx; | ||||
padding: 0 70rpx 0 30rpx; | padding: 0 70rpx 0 30rpx; | ||||
width: 690rpx; | width: 690rpx; | ||||
@@ -60,6 +91,8 @@ function select(item) { | |||||
font-size: 30rpx; | font-size: 30rpx; | ||||
font-weight: 900; | font-weight: 900; | ||||
border: 6px solid #484848; | border: 6px solid #484848; | ||||
transform: scale(1); | |||||
transition: all 0.3s; | |||||
image { | image { | ||||
width: 53rpx; | width: 53rpx; | ||||
height: 53rpx; | height: 53rpx; | ||||
@@ -71,19 +104,27 @@ function select(item) { | |||||
} | } | ||||
} | } | ||||
.border { | .border { | ||||
transform: scale(1.03); | |||||
border: 6px solid #ff4f00; | border: 6px solid #ff4f00; | ||||
} | } | ||||
.buyBtn { | .buyBtn { | ||||
position: absolute; | position: absolute; | ||||
bottom: 80rpx; | bottom: 80rpx; | ||||
width: 520rpx; | |||||
height: 100rpx; | |||||
background: #ff4f00; | |||||
border-radius: 50rpx; | |||||
text-align: center; | |||||
line-height: 100rpx; | |||||
font-size: 30rpx; | |||||
font-weight: bold; | |||||
.btn { | |||||
width: 520rpx; | |||||
height: 100rpx; | |||||
background: #ff4f00; | |||||
border-radius: 50rpx; | |||||
text-align: center; | |||||
line-height: 100rpx; | |||||
font-size: 30rpx; | |||||
font-weight: bold; | |||||
margin-bottom: 40rpx; | |||||
} | |||||
.pro { | |||||
text-align: center; | |||||
color: #ff4f00; | |||||
} | |||||
} | } | ||||
</style> | </style> |
@@ -23,16 +23,22 @@ | |||||
class="bottomBtn" | class="bottomBtn" | ||||
open-type="getPhoneNumber" | open-type="getPhoneNumber" | ||||
type="default" | type="default" | ||||
id="getPhoneNumber" | |||||
@getphonenumber="toCreate" | @getphonenumber="toCreate" | ||||
> | > | ||||
开始制作我的数字分身 | 开始制作我的数字分身 | ||||
</button> | </button> | ||||
<!-- <view class="bottomBtn" @click="toCreate"> 开始制作我的数字分身 </view> --> | <!-- <view class="bottomBtn" @click="toCreate"> 开始制作我的数字分身 </view> --> | ||||
<u-checkbox-group v-model="checkboxValue1" placement="row"> | |||||
<u-checkbox-group | |||||
v-model="checkboxValue" | |||||
placement="row" | |||||
@change="changed" | |||||
> | |||||
<u-checkbox | <u-checkbox | ||||
labelColor="white" | labelColor="white" | ||||
activeColor="red" | activeColor="red" | ||||
v-for="(item, index) in checkboxList1" | |||||
v-for="(item, index) in checkboxList" | |||||
:name="item.name" | |||||
:key="index" | :key="index" | ||||
> | > | ||||
</u-checkbox> | </u-checkbox> | ||||
@@ -62,11 +68,10 @@ const pageClass = computed(() => { | |||||
} | } | ||||
}); | }); | ||||
//#region 勾选 | //#region 勾选 | ||||
const checkboxValue1 = ref([]); | |||||
const checkboxList1 = ref([ | |||||
const checkboxValue = ref([]); | |||||
const checkboxList = ref([ | |||||
{ | { | ||||
name: "同意智像相机用户使用协议", | name: "同意智像相机用户使用协议", | ||||
disabled: false, | |||||
}, | }, | ||||
]); | ]); | ||||
@@ -106,7 +111,7 @@ async function getphonenumber(e) { | |||||
} | } | ||||
async function toCreate(e) { | async function toCreate(e) { | ||||
if (checkboxValue1.value[0]) { | |||||
if (checkboxValue.value[0]) { | |||||
// await handleLogin(); | // await handleLogin(); | ||||
await getphonenumber(e); | await getphonenumber(e); | ||||
} else { | } else { | ||||
@@ -115,7 +120,7 @@ async function toCreate(e) { | |||||
content: "同意慧图相机用户使用协议?", | content: "同意慧图相机用户使用协议?", | ||||
success: function (res) { | success: function (res) { | ||||
if (res.confirm) { | if (res.confirm) { | ||||
checkboxList1.value[0].disabled = true; | |||||
checkboxValue.value[0] = true; | |||||
// handleLogin(); | // handleLogin(); | ||||
getphonenumber(e); | getphonenumber(e); | ||||
} else if (res.cancel) { | } else if (res.cancel) { | ||||
@@ -0,0 +1,194 @@ | |||||
<template> | |||||
<div class="page"> | |||||
<div class="title">慧拍“金币”充值协议</div> | |||||
<div class="paragraph"> | |||||
欢迎您使用慧拍的“金币”付费服务!为了使用慧拍内的特定付费产品和服务,您必须仔细阅读并遵守《慧拍“金币”充值协议》(以下简称“本协议”)。 | |||||
</div> | |||||
<div class="paragraph"> | |||||
注意:请用户仔细阅读以下全部内容。如果您不同意本服务协议的任一或全部条款内容,请不要使用慧拍“金币”服务。慧拍“金币”服务是慧拍服务的子服务,因此,当您开始使用慧拍“金币”服务时,即表示您与慧拍已达成协议关系,并自愿接受并遵守慧拍服务及慧拍“金币”服务的所有服务协议,包括但不限于《用户服务协议》、本服务协议及相关子协议和管理规范等。 | |||||
</div> | |||||
<div class="paragraph"> | |||||
特别提示:在您开始使用本服务之前,您应当具备中华人民共和国法律规定的与您行为相适应的民事行为能力。若您不具备前述与您行为相适应的民事行为能力,则应获得监护人的知情同意。您及您的监护人应依照法律规定承担因此而导致的相应责任。特别地,如果您是未成年人,请在您的监护人的同意和指导下访问和/或使用我们的平台。慧拍谨此提醒家长合理引导未成年子女的上网及消费行为。 | |||||
</div> | |||||
<div class="item"> | |||||
<div class="name">一、协议的范围</div> | |||||
<div class="child"> | |||||
1.1 | |||||
协议适用主体范围:本协议是用户与慧拍之间关于用户在使用指定付费产品/服务和充值规则等相关事宜所订立的协议。 | |||||
</div> | |||||
<div class="child"> | |||||
1.2 | |||||
协议关系及冲突条款:本协议视为《慧拍用户服务协议》的补充协议,是其不可分割的组成部分。如果本协议与上述内容存在冲突,以本协议为准。 | |||||
</div> | |||||
</div> | |||||
<div class="item"> | |||||
<div class="name">二、名词定义</div> | |||||
<div class="child"> | |||||
2.1 | |||||
慧拍“金币”:指按照慧拍的指定方式支付一定费用后,可以享有由慧拍提供的特定付费产品和服务。慧拍“金币”不具有法定货币的流通和支付功能,不得兑换为法定货币或实物。慧拍提醒用户注意,慧拍“金币”付费服务非存款、预付款或其他可无理由退还性质的商品或财产权利。 | |||||
</div> | |||||
<div class="child"> | |||||
2.2 | |||||
充值服务:用户通过慧拍“金币”充值,享有由慧拍或第三方提供的特定付费产品/服务。用户所享有的具体服务内容会根据充值金额而有所不同。同时,慧拍可能会在不同时间推出具体不同的服务内容,以不断完善和优化本服务。具体服务内容请参阅慧拍相关服务页面的公布和实际提供的内容。 | |||||
</div> | |||||
</div> | |||||
<div class="item"> | |||||
<div class="name">三、付费服务及充值规则</div> | |||||
<div class="child"> | |||||
3.1 | |||||
用户理解并同意,用户必须成为慧拍的普通注册用户后,才能继续进行付费服务。本服务收取的充值金额是慧拍向最终用户收取互联网增值服务使用费的一种通用收费渠道或计费方式。该充值金额仅可用于慧拍指定服务,不适用于其他任何产品或服务。 | |||||
</div> | |||||
<div class="child"> | |||||
3.2 | |||||
慧拍将有权决定所提供的服务资费标准和收费方式。可能会针对不同的服务制定不同的资费标准和收费方式,也可能根据慧拍所提供的服务的不同阶段确定不同的资费标准和收费方式。 | |||||
</div> | |||||
<div class="child"> | |||||
3.3 充值 | |||||
<div class="inside"> | |||||
3.3.1 | |||||
用户通过所用客户端相应的支付方式(具体支付方式请见充值页面),为其账号充值所直接获得的慧拍“金币”,可在指定的付费产品/服务中使用。 | |||||
安卓端:慧拍“金币”费用将通过支付宝、微信等第三方代收费的方式支付,具体价格请见购买收银台标示。 | |||||
iOS端:慧拍“金币”费用将通过支付宝、微信等第三方代收费的方式支付,具体价格为人民币0.1元。 | |||||
</div> | |||||
<div class="inside"> | |||||
3.3.2 | |||||
用户可以通过登录慧拍,在首页点击“我的金币”,查询已购买或尚未消费的慧拍“金币”。 | |||||
</div> | |||||
<div class="inside"> | |||||
3.3.3 | |||||
用户理解并知晓,慧拍不提供用户间交易慧拍“金币”服务。用户间交易慧拍“金币”构成对本协议的违反,慧拍有权在未经通知的情况下采取相应适当措施,以确保不提供用户间交易慧拍“金币”服务。 | |||||
</div> | |||||
<div class="inside"> | |||||
3.3.4 | |||||
用户理解并同意,充值的慧拍“金币”不适用无理由退换。充值一旦成功,即视为充值完成。用户不得以消费完成后账户内仍有剩余慧拍“金币”为由要求退费。 | |||||
</div> | |||||
<div class="inside"> | |||||
3.3.5 | |||||
当用户在慧拍进行慧拍“金币”充值时,用户必须仔细确认自己的账号及信息。若因为用户自身操作不当、不了解或未充分了解充值计费方式等因素造成充错账号、错选充值种类等情况而损害自身权益,由用户自行负责。 | |||||
</div> | |||||
<div class="inside"> | |||||
3.3.6 | |||||
用户在充值时使用第三方支付企业提供的服务应遵守与该第三方的各项协议及其服务规则。在使用第三方支付服务过程中,用户应妥善保管个人信息,包括但不限于银行卡账号、密码、验证码等。用户同意并确认,慧拍对因第三方支付服务产生的纠纷不承担任何责任。 | |||||
</div> | |||||
<div class="inside"> | |||||
3.3.7 | |||||
若因违反本协议条款,导致账号被冻结和/或终止使用的用户,不得因此要求慧拍作任何补偿或赔偿。 | |||||
</div> | |||||
<div class="inside"> | |||||
3.3.8 | |||||
若因慧拍“金币”充值系统自身充值故障原因造成用户充值失实,在慧拍恢复、存有有效数据和用户提供合法有效凭证的情况下,慧拍将根据用户充值情况作出变动及补救措施。 | |||||
因慧拍“金币”充值系统自身故障原因,造成系统充值额小于用户实际充值额的,慧拍将补其差额。 | |||||
因慧拍“金币”充值系统自身故障原因,造成系统充值额大于用户实际充值额的,慧拍有权追回差额。 | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="item"> | |||||
<div class="name">四、服务的变更、中止或终止</div> | |||||
<div class="child"> | |||||
4.1 本服务的中止或终止包含如下情况: | |||||
因用户的违约或违规行为,慧拍主动中止或终止服务。 | |||||
因国家或相关政府监管部门要求或发生不可抗力事件时,慧拍中止或终止服务。 | |||||
其他根据法律法规应中止或终止服务的情况。 | |||||
</div> | |||||
<div class="child"> | |||||
4.2 | |||||
中止或终止服务后,慧拍会以法律允许的方式通知用户。当用户发现无法登录或享受服务时,可以咨询客服人员。 | |||||
</div> | |||||
<div class="child"> | |||||
4.3 中止或终止后的处理: | |||||
除法律规定的责任外,慧拍对本服务的中止或终止对用户和第三人不承担任何责任。 | |||||
除法律规定或本协议另有约定外,已收取的费用不予退还。 | |||||
</div> | |||||
<div class="child"> | |||||
4.4 | |||||
对于本服务或本协议可能发生的变更(包括但不限于本协议修改、服务细则调整等),慧拍将根据本协议的约定通知用户。请用户仔细阅读并选择是否按照调整和/或变更后的本协议/服务细则等继续选择本服务。如用户同意上述调整和/或变更,用户可以继续使用本服务,以表明用户已经接受上述调整和/或变更。如用户不同意调整和/或变更,建议用户立即停止使用本服务。如用户对上述调整和/或变更有任何问题,可以咨询客服。 | |||||
</div> | |||||
</div> | |||||
<div class="item"> | |||||
<div class="name">五、违约责任</div> | |||||
<div class="child"> | |||||
5.1 | |||||
如果慧拍发现用户有违反本协议任何行为的,慧拍有权进行独立判断并采取技术手段予以删除、屏蔽或断开相关信息。同时,慧拍有权视用户的行为性质,对用户采取包括但不限于暂停或终止部分或全部本服务、中止或终止用户对慧拍账号使用、追究法律责任等措施。由此给用户带来的损失(包括但不限于通信中断、相关数据清空、服务费用作为违约金而归慧拍所有等),由用户自行承担。造成慧拍损失的,用户也应予以赔偿。若慧拍依前述约定对用户采取暂停或终止部分或全部本服务的,慧拍无需向用户退还任何费用,剩余的服务费用作为违约金而归慧拍所有。 | |||||
</div> | |||||
<div class="child"> | |||||
5.2 | |||||
如用户有违反本协议任何行为,导致任何第三方损害,用户应当独立承担责任。慧拍因此遭受损失的,用户也应当一并赔偿。 | |||||
</div> | |||||
</div> | |||||
<div class="item"> | |||||
<div class="name">六、争议解决和法律适用</div> | |||||
<div class="child"> | |||||
6.1 | |||||
本协议条款的生效、履行、解释及争议的解决均适用中华人民共和国法律。本协议条款因与中华人民共和国现行法律相抵触而导致部分无效,不影响其他部分的效力。 | |||||
</div> | |||||
<div class="child"> | |||||
6.2 | |||||
如就本协议内容或其执行发生任何争议,应尽量友好协商解决。协商不成时,任何一方均可向被告所在地人民法院提起诉讼。 | |||||
</div> | |||||
</div> | |||||
<div class="item"> | |||||
<div class="name">七、其他</div> | |||||
<div class="child"> | |||||
7.1 | |||||
本协议任一条款被视为废止、无效或不可执行,该条应视为可分的,且并不影响本协议其余条款的有效性及可执行性。 | |||||
</div> | |||||
<div class="child"> | |||||
7.2 本协议的标题仅为方便阅读而设,不影响正文中任何条款的含义或解释。 | |||||
</div> | |||||
</div> | |||||
<div class="paragraph"> | |||||
以上为慧拍“金币”充值协议的内容,请您仔细阅读并遵守。如您同意并愿意继续使用慧拍“金币”服务,请进行相应操作。如有任何疑问,请咨询客服人员。谢谢! | |||||
</div> | |||||
</div> | |||||
</template> | |||||
<script setup> | |||||
import { ref, reactive } from "vue"; | |||||
</script> | |||||
<style lang="scss"> | |||||
.page { | |||||
padding: 40rpx; | |||||
.title { | |||||
font-size: 35rpx; | |||||
margin-bottom: 30rpx; | |||||
} | |||||
.date { | |||||
font-size: 23rpx; | |||||
margin-bottom: 15rpx; | |||||
} | |||||
.version { | |||||
font-size: 23rpx; | |||||
margin-bottom: 30rpx; | |||||
} | |||||
.paragraph { | |||||
text-align: left !important; | |||||
text-indent: 2em; | |||||
margin-bottom: 30rpx; | |||||
} | |||||
.item { | |||||
margin-bottom: 20rpx; | |||||
border-bottom: 1px solid #9c9c9c; | |||||
.name { | |||||
font-size: 28rpx; | |||||
margin-bottom: 25rpx; | |||||
} | |||||
.child { | |||||
padding: 15rpx; | |||||
margin-bottom: 20rpx; | |||||
.inside { | |||||
font-size: 26rpx; | |||||
color: #ffffffb6; | |||||
margin: 20rpx 0; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
</style> |