feat: 登录上传头像+协议添加

This commit is contained in:
zc 2025-12-23 15:23:54 +08:00
parent c25e4ed02c
commit b58c6f2a67
22 changed files with 493 additions and 85 deletions

View File

@ -1,4 +1,6 @@
import request from '@/utils/request'
import {httpRequest} from '@/utils/request/axios'
const baseUrl = 'https://api.1024api.com/api-interface/app'
// api地址
const api = {
@ -32,3 +34,11 @@ export const bindMobile = (data, option) => {
export const personal = (data, option) => {
return request.post(api.personal, data, option)
}
// 修改个人信息(头像昵称)
export const apiUpdateUserInfo = (data) => {
return httpRequest.post(
`${baseUrl}/buyer/info/update`,
data
);
}

View File

@ -138,6 +138,7 @@
<style lang="scss" scoped>
.diy-goods {
padding: 20rpx;
// margin-bottom: -10px
display: flex;
flex-direction: column;

View File

@ -107,6 +107,18 @@
"navigationBarTitleText": "帮助中心"
}
},
{
"path": "pages/agreement/index",
"style": {
"navigationBarTitleText": "相关协议"
}
},
{
"path": "pages/agreement/detail",
"style": {
"navigationBarTitleText": "协议详情"
}
},
{
"path": "pages/coupon/index",
"style": {

View File

@ -0,0 +1 @@
export default `<p><br></p><p>限时秒杀、平台补贴、加价购、满额赠</p><p>限时秒杀、加价购⋯</p><p>限时秒杀、加价购、满额赠、限时专享价</p><p>活动说明</p><p>一、参与对象</p><p>“限时秒杀”、”满额赠”:邀约制,由随机获得邀请的用户参与,未收到邀请的用户暂无法参与。</p><p>“限时专享价”活动期间通过推广链接搜索进入购de着的用户可享受该活动价格。</p><p>二、活动时间</p><p>“限时秒杀”、”加价购”、”满额赠”、 “限时专享价”等促销活动将不定期开展具体以购de着小程序实际展示活动时间和参与活动的城市为准。</p><p>三、活动价格</p><p>相同商品在不同的“限时秒杀”、“加价购”、“满额赠”、”限时专享价“等活动下可能会出现不同的价格具体以购de着小程序展示的为准。</p><p>四、特别说明</p><p>1.因不同的访问或查找商品方式的经营成本、促销活动等不同购de着在不同的方式下展示的商品价格、服务费用、活动等均有可能出现不一致的情况 用户可以自主选择喜欢的方式获取商品进行下单或参与活动等不同方式包括但不限于通过搜索查找商品、在购de着小程序端频道页查找商品等。</p><p>2.参与促销活动的部分商品存在限量购买、不能与优惠券共同使用等限制具体以购de着小程序的购物车或实际结算页面展示为准。</p><p>3.促销活动过程中用户不得使用任何外挂、插件以及其他破坏活动规则、违背活动公平原则的方式参加本次活动如批量注册、恶意退款、虚假分享、倒买倒卖、虚假交易等用户不得进行有组织的众包作弊行为否则购de着有权取消用户参与活动资格或者对部分商品采取限购、禁售等动作必要时购de着还会取消用户后续参与购de着任意活动的权利或者冻结购de着并追究法律责任。</p><p>4.促销活动过程中,若出现因网络攻击、黑客攻击、 数据泄露、自然灾害等原因导致活动无法继续购de着有权暂停或提前终止活动。</p><p>5.如对相关促销活动有任何疑问用户可进入购de着小程序”我的“-”联系客服”咨询反馈或拨打客服热线18458195149。</p>`

File diff suppressed because one or more lines are too long

113
pages/agreement/content.js Normal file
View File

@ -0,0 +1,113 @@
// 协议内容模板
export const agreementContent = {
// 用户协议
'user': `
<h2>用户协议</h2>
<p>欢迎使用本应用在使用本应用前请您仔细阅读本用户协议当您注册登录使用本应用时即表示您已阅读理解并同意接受本协议的全部内容</p>
<h3>服务条款的接受</h3>
<p>本服务条款是您与我们之间关于使用本服务的法律协议通过使用本服务您同意遵守本条款的所有规定</p>
<h3>服务说明</h3>
<p>我们向您提供包括但不限于以下服务</p>
<p>1. 商品展示与浏览服务</p>
<p>2. 商品购买与交易服务</p>
<p>3. 用户账户管理服务</p>
<p>4. 其他相关服务</p>
<h3>用户账户</h3>
<p>您在使用本服务时需要注册一个账户您应当保证账户信息的真实性准确性和完整性您对账户的所有活动负责</p>
<h3>用户行为规范</h3>
<p>您在使用本服务时应当遵守相关法律法规不得利用本服务从事违法违规活动</p>
<h3>隐私保护</h3>
<p>我们非常重视您的隐私保护具体内容请参见隐私政策</p>
<h3>免责声明</h3>
<p>在法律允许的范围内我们对因使用或无法使用本服务而产生的任何损害不承担责任</p>
<h3>协议修改</h3>
<p>我们保留随时修改本协议的权利修改后的协议将在本应用上公布后立即生效</p>
<h3>联系我们</h3>
<p>如果您对本协议有任何疑问请联系我们的客服</p>
`,
// 隐私政策
'privacy': `
<h2>隐私政策</h2>
<p>我们非常重视您的隐私保护本隐私政策说明了我们如何收集使用存储和保护您的个人信息</p>
<h3>信息收集</h3>
<p>我们可能收集以下信息</p>
<p>1. 您主动提供的信息包括但不限于姓名手机号地址等</p>
<p>2. 自动收集的信息包括但不限于设备信息日志信息位置信息等</p>
<h3>信息使用</h3>
<p>我们使用收集的信息用于</p>
<p>1. 提供维护和改进我们的服务</p>
<p>2. 处理您的订单和交易</p>
<p>3. 向您发送服务通知</p>
<p>4. 进行数据分析改善用户体验</p>
<h3>信息存储</h3>
<p>我们会采取合理的安全措施保护您的个人信息防止信息泄露丢失或滥用</p>
<h3>信息共享</h3>
<p>我们不会向第三方出售出租或以其他方式披露您的个人信息除非</p>
<p>1. 获得您的明确同意</p>
<p>2. 法律法规要求</p>
<p>3. 为提供服务所必需</p>
<h3>您的权利</h3>
<p>您有权</p>
<p>1. 访问更正您的个人信息</p>
<p>2. 删除您的个人信息</p>
<p>3. 撤回您的同意</p>
<h3>未成年人保护</h3>
<p>我们非常重视未成年人的个人信息保护如果您是未成年人请在监护人同意和指导下使用我们的服务</p>
<h3>政策更新</h3>
<p>我们可能会不时更新本隐私政策更新后的政策将在本应用上公布</p>
`,
// 服务条款
'service': `
<h2>服务条款</h2>
<p>本服务条款是您与我们之间关于使用本服务的法律协议通过使用本服务您同意遵守本条款的所有规定</p>
<h3>服务内容</h3>
<p>我们为您提供在线购物平台服务包括商品展示订单管理支付处理等功能</p>
<h3>用户责任</h3>
<p>您在使用本服务时应当</p>
<p>1. 遵守相关法律法规</p>
<p>2. 提供真实准确的信息</p>
<p>3. 妥善保管账户信息</p>
<p>4. 不得利用本服务从事违法违规活动</p>
<h3>商品信息</h3>
<p>我们努力确保商品信息的准确性但不对商品信息的绝对准确性做出保证</p>
<h3>价格与支付</h3>
<p>商品价格以页面显示为准我们保留调整价格的权利您可以通过我们提供的支付方式完成支付</p>
<h3>订单处理</h3>
<p>订单提交后我们将尽快处理如遇特殊情况我们可能会延迟或取消订单</p>
<h3>退换货政策</h3>
<p>退换货政策请参见相关页面说明我们会在符合条件的情况下为您办理退换货</p>
<h3>知识产权</h3>
<p>本服务中的所有内容包括但不限于文字图片商标等均受知识产权法保护</p>
<h3>免责声明</h3>
<p>在法律允许的范围内我们对因使用或无法使用本服务而产生的任何损害不承担责任</p>
<h3>争议解决</h3>
<p>因本服务条款引起的争议双方应友好协商解决协商不成的提交有管辖权的人民法院解决</p>
`
}

View File

@ -0,0 +1 @@
export default `<p><br></p><p><br></p><p>购de着配送规则</p><p><br></p><p>更新日期2023年11月30日</p><p><br></p><p>生效日期2023年12月8日</p><p><br></p><p><strong>请您理解、同意并遵守以下配送服务相关规则:</strong></p><p><br></p><p>1.为了让您的商品及时准确送达、品质得到保证,<strong>您应准确填写收货人真实姓名、收货地址及联系方式等配送信息请您理解并授权购de着将您订单中的配送信息粘贴在商品外包装上</strong>购de着提醒您收到商品后立即销毁外包装上的个人信息。</p><p><br></p><p>2.配送费用(如有)具体由:基础配送费、超重费、 夜间配送费、恶劣天气配送费等组成。最终收取的金额会因为订单重量、订单距离、预计配送时间、天气情况等因素不同而不同。因此,您实际所需支付的费用,会因线下具体站点服务、商品金额、商品重量、 配送时间、配送地点、天气情况等因素的不同而有所差异具体金额将以您提交订单时购de着平台所显示的所需支付费用为准。</p><p><br></p><p>3.您的订单生成后可在购de着平台相关页面查看商品预计送达时间预计送达时间系根据库存状况、配货流程、送货地点等因素由系统估算生成<strong>预计送达时间为参考时间并不作为购de着对您做出关于配送到达时间的承诺。如遇以下情况造成订单配送延迟或无法配送购de着不承担配送延迟或无法配送的责任</strong></p><p><br></p><p>1 用户提供的配送信息有误或不详细等原因导致的;</p><p>2商品送达后无人接收等原因导致的</p><p>3 根据用户指示,商品放置于代收地点或其他室外地点的;</p><p>4用户拒收的</p><p>5因节假日、大型促销活动、店庆、预购或抢购人数众多等原因导致的</p><p>6恶劣天气、自然灾害、交通管制等多种外界不可抗力因素导致的。</p>`

106
pages/agreement/detail.vue Normal file
View File

@ -0,0 +1,106 @@
<template>
<view class="container b-f p-b">
<view class="agreement-content" v-if="content">
<mp-html :content="content" />
</view>
<view class="empty" v-else>
<text>协议内容不存在</text>
</view>
</view>
</template>
<script>
import service from './service'
import appPermission from './appPermission'
import activity from './activity'
import minor from './minor'
import privacy from './privacy'
import review from './review'
import refund from './refund'
import delivery from './delivery'
import getByMyself from './getByMyself'
export default {
data() {
return {
// ID
agreementId: null,
//
content: '',
agreementContent: {
service: service,
appPermission: appPermission,
activity: activity,
minor: minor,
privacy: privacy,
review: review,
refund: refund,
delivery: delivery,
getByMyself: getByMyself,
}
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
// ID
this.agreementId = options.id
//
this.loadAgreementContent()
},
methods: {
//
loadAgreementContent() {
if (!this.agreementId) {
return
}
// ID
this.content = this.agreementContent[this.agreementId] || ''
}
}
}
</script>
<style lang="scss" scoped>
.container {
padding: 30rpx;
min-height: 100vh;
}
.agreement-content {
font-size: 28rpx;
line-height: 1.8;
color: #333;
h2 {
font-size: 36rpx;
font-weight: bold;
margin: 30rpx 0 20rpx;
color: #333;
}
h3 {
font-size: 32rpx;
font-weight: bold;
margin: 24rpx 0 16rpx;
color: #333;
}
p {
font-size: 28rpx;
line-height: 1.8;
margin: 12rpx 0;
color: #666;
}
}
.empty {
text-align: center;
padding: 100rpx 0;
color: #999;
font-size: 28rpx;
}
</style>

File diff suppressed because one or more lines are too long

96
pages/agreement/index.vue Normal file
View File

@ -0,0 +1,96 @@
<template>
<view class="container">
<view class="agreement-item cont-box b-f" v-for="(item, index) in list" :key="index" @click="handleItemClick(item.id)">
<view class="title">
<text>{{ item.title }}</text>
</view>
<view class="arrow">
<text class="iconfont icon-arrow-right"></text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
//
list: [
{
id: 'privacy',
title: '隐私政策'
},
{
id: 'service',
title: '用户服务条款'
},
{
id: 'getByMyself',
title: '自提服务协议'
},
{
id: 'delivery',
title: '配送规则'
},
{
id: 'refund',
title: '退换货政策'
},
{
id: 'activity',
title: '限时秒杀、平台补贴、加价购、满额赠'
},
{
id: 'minor',
title: '未成年人个人信息保护'
},
{
id: 'review',
title: '评价管理规范'
},
{
id: 'privacy',
title: '隐私政策'
},
{
id: 'appPermission',
title: '应用权限说明'
}
]
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {},
methods: {
//
handleItemClick(id) {
this.$navTo('pages/agreement/detail', { id })
}
}
}
</script>
<style lang="scss" scoped>
.agreement-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 30rpx;
border-bottom: 1rpx solid #f6f6f9;
.title {
font-size: 32rpx;
color: #333;
}
.arrow {
color: #999;
font-size: 28rpx;
}
}
</style>

1
pages/agreement/minor.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
export default `<p><br></p><p><br></p><p><strong>购de着退换货政策</strong></p><p><br></p><p>更新日期【2023】年【11】月【30】日</p><p><br></p><p>生效日期【2023】 年【12】月【8】日</p><p><br></p><p>【特别提示】请您在使用购de着以下称“我们“ 提供的各项产品/服务前,仔细阅读并充分理解本 《退换货政策》(下称“本政策“)并做出相应选择 <strong>重点内容已将字体加粗请您特别关注</strong>。一旦您通过购de着平台下单购买我们的商品即意味着您同意本政策。</p><p><br></p><p><strong>一、验货与签收</strong></p><p>1、为保障您的权益请您在收到商品时与配送员当场核对核对范围包括但不限于商品种类、规格、 数量(包括商品最小包装单位)、金额、赠品、外包装、标识、票据、防伪码等是否与订单一致,商品表面质量及性状是否有问题等。</p><p>2、如果您在验货时发现商品存在上述问题您可与客服联络或拒收商品并将商品交由配送员带回。</p><p>3、如订单商品确认无误您可进行签收。<strong>若您的订单商品交由他人代收,代收人享有与您同等权利,我们将视为您本人签收。</strong></p><p>4、部分商品因商品特征以及现有科技水平限制无法实现与您实际下单重量完全一致会存在微小误差因此如您实际收到的商品重量小于您下单时选择的重量我们将为您自动退差如您实际收到的商品重量超过您下单时选择的重量我们将按照您下单时选择的重量与您结算具体请查看订单信息。</p><p><br></p><p><strong>二、退换货细则</strong></p><p>1、除本政策另有约定外如满足以下条件则您可以在收到商品后7日内申请无理由退货</p><p>1申请退货的商品及赠品如有本身及包装无损坏</p><p>2申请退货的商品及赠品数量不缺少</p><p>3不影响我们二次销售。</p><p>2、如您发现商品存在质量问题可随时联系客服申请退换货。但以下情况不属于质量问题 </p><p>1由于受季节、气候、生长环境等因素影响不同批次略有差异属正常现象不属质量问题</p><p>2由于商品特殊性、拍摄灯光及不同显示器色差等问题可能造成宣传图片与实物有一定差异不属质量问题我们尽最大努力确保购de着平台的宣传图片与实物的一致性。</p><p><br></p><p><strong>3、以下情形除存在商品质量问题外我们不提供退换货服务</strong></p><p>1定作商品</p><p>2 加工商品;</p><p>3临期特卖、瑕疵降价、特价促销等商品</p><p>4因您使用或保管不当导致出现质量问题的商品</p><p>5一经激活或者试用后价值贬损较大的商品</p><p>6商品详情页或结算页标注“不支持无理由退货” 的商品;</p><p>7 其他根据商品性质不适宜退货且您购买时同意不予退货的商品。</p><p><br></p><p><br></p><p><strong>三、特别说明</strong></p><p><br></p><p>1、成套商品或者礼盒装商品中有部分商品存在质量问题在办理退换货时需将整套商品退回否则无法办理退货。</p><p>2、赠品的主商品进行退货时需将赠品一并退回 如赠品未退回,则主商品无法全额退款。</p><p>3、加工商品或含加工商品的订单在下单并进入备货环节后不支持取消订单备货环节前可申请取消请您关注订单信息的变化。但您收货后仍可根据本政策申请退换货。</p><p>4、通常情况下一张订单只能进行一次退换货操作所以为了确保您的权益请您考虑周全后与我们联系。</p><p>5、退货审核通过后已支付的款项我们将按原支付方式和路径安排退款。</p><p>6、退款时订单中使用的优惠券、积分权益、红包等优惠或折扣会按照优惠券、积分、红包等优惠或折扣规则进行处理。</p><p>7、退货金额按照您实付的金额进行退款。</p>`

View File

@ -0,0 +1 @@
export default `<p><br></p><p>购de着评价管理规范</p><p>一、概述</p><p>第一条【目标】</p><p>为促进、保障评价内容能公正、客观、真实的反映商品或服务情况进而为其他消费者在购买决策过程中提供相对可靠的参考维护买卖双方的合法权益及经营秩序根据《中华人民共和国电子商务法》以及其他相关法律法规、《购de着用户服务协议》《购de着用户服务条款》等相关平台规则及协议制定本规范。</p><p>第二条【适用范围】</p><p>本规范适用于在购de着上进行交易、参与评价的所有用户。</p><p>二、评价说明</p><p>第三条【评价资格】为保证评价的及时性和有效性, 买家基于真实有效的交易订单和商品,在交易成功后 15天内有权对本次交易的商品及服务进行评价。</p><p>第四条【评价内容】评价包括”商品评价”和”骑手评价”。“商品评价“包括“好评/差评”、“评价标签”、 “文字评论”、“图片评论“及”视频评论”等;“配送评价“包括”满意/还行/不满意”、“评价标签“和”文字评论”。</p><p>第五条【评论修改】暂不支持在提交评价后进行修改、删除、追评。</p><p>三、处理规则</p><p>第六条【基础原则】平台可基于买家消费体验、平台经营及管理等需要对评价内容进行审核,针对不合理评价或异常交易产生的评价进行处理,调整评价工具适用范围及相关计算逻辑并进行公示。</p><p>第七条【禁发评价】用户应当理解评价将成为其他用户对该商品或服务的重要判断依据,需承诺提交真实有效的评价,不得发表任何违法违规评价内容。禁止发布的内容,包括但不限于如下:</p><p>1、包含暴力恐怖、犯罪、赌博、毒品等违法相关信息</p><p>2、包含政治敏感、反政府言论、宣传宗教迷信等相关信息</p><p>3、包含淫秽、色情等低俗或其他有违公序良俗等相关信息的评价</p><p>4、过激言论出现人身攻击、恶意诋毁、辱骂、泄露个人信息等相关评价</p><p>5、侵犯他人知识产权、人格权、肖像权等内容的评价</p><p>6、包含联系方式、二维码、以及非本平台上的其他商品、商家信息等广告宣传信息内容的评价</p><p>7、未经他人同意涉及盗用他人文字、图片、视频并编辑后发布的评价</p><p>8、同行竞争者给予与事实不符的差评、负面内容等的恶意评价以及非竞争者通过不正当手段提交大量重复、非真实的好评</p><p>9、非本订单评价或与本订单商家、商品或服务无直接关系的评价</p><p>10、图片、视频非本商品/服务相关或图片、视频不清晰的;</p><p>11、仅包含纯数字、无规则字母、乱码、标点符号、 表情、无意义的灌水等信息以及内容重复超过60% 以上,无参考意义的评价;</p><p>12、其他违反法律法规、相关平台规则及协议、本管理规范等的评价。</p><p>四、附则</p><p>第八条【生效时间】本规范于2024年10月17日首次发布2024年10月24日正式生效。</p><p>第九条【规范变更】根据法律法规以及经营需要,平台有权对本规范进行修改更新,修改更新后的内容将进行公告。如您不同意接受修改更新,可停止使用;</p><p>如您继续使用,则视为知悉并接受修改更新。</p>`

File diff suppressed because one or more lines are too long

View File

@ -173,10 +173,10 @@
*/
getGoodsList(pageNo = 1) {
const app = this
const categoryId = app.getCategoryId()
const categoryIdResult = app.getCategoryId()
return new Promise((resolve, reject) => {
// testorigin GoodsApi.list({ categoryId, page: pageNo }, { load: false })
GoodsApi.apiGetCommodityList({ categoryId })
GoodsApi.apiGetCommodityList({ categoryId: categoryIdResult })
.then(result => {
const newList = result.data.rows
app.goodsList.data = getMoreListData({ data: newList }, app.goodsList, pageNo)
@ -190,10 +190,14 @@
// ID
getCategoryId() {
const app = this
const result = { categoryId1: '', categoryId2: '' }
if (app.curIndex2 > -1) {
return app.subCateList[app.curIndex2].id
result.categoryId2 = app.subCateList[app.curIndex2].id || ''
}
return app.curIndex > -1 ? app.list[app.curIndex].id : 0
if (app.curIndex > -1) {
result.categoryId1 = app.list[app.curIndex].id || ''
}
return result
},
//

View File

@ -347,6 +347,10 @@ import storage from '@/utils/storage'
if (!app.onVerifyFrom()) {
return false
}
if (!this.order.address.id) {
app.showToast('请先选择收货地址后再下单')
return false
}
//
app.disabled = true
const skuList = app.order.goodsList.map(item => ({

View File

@ -6,7 +6,7 @@
<!-- 主图视频 -->
<swiper-item v-if="video">
<view class="slide-video">
<video id="myVideo" class="video" :poster="videoCover ? videoCover.preview_url : ''" :src="video.external_url" controls
<video id="myVideo" class="video" :poster="videoCover ? videoCover.preview_url : ''" :src="video" autoplay
x5-playsinline playsinline x5-video-player-type="h5" x5-video-player-fullscreen x5-video-orientation="portrait"
:enable-progress-gesture="false" @play="onVideoPlay"></video>
</view>

View File

@ -91,7 +91,7 @@
</view>
</view>
<!-- 客服 -->
<customer-btn v-if="isShowCustomerBtn" :showCard="true" :cardTitle="goods.title" :cardImage="goods.goods_image"
<customer-btn v-if="isShowCustomerBtn" :showCard="true" :cardTitle="goods.title" :cardImage="goods.goods_images ? goods.goods_images[0] : ''"
:cardPath="pagePath">
<view class="fast-item">
<view class="fast-icon">
@ -132,7 +132,7 @@
<!-- <shortcut bottom="120" /> -->
<!-- 分享菜单 -->
<share-sheet v-model="showShareSheet" :shareTitle="goods.title" :shareImageUrl="goods.goods_image" />
<share-sheet v-model="showShareSheet" :shareTitle="goods.title" :shareImageUrl="goods.goods_images ? goods.goods_images[0] : ''" />
</view>
</template>

View File

@ -34,7 +34,14 @@ export default {
items: [],
};
},
onLoad() {
onLoad(options) {
//
// toast
uni.showToast({
title: `参数: ${JSON.stringify(options)}`,
icon: 'none',
duration: 2000
});
this.getPageData();
},
onShow() {

View File

@ -40,17 +40,37 @@
</view>
</view>
<view class="auth-title">申请获取以下权限</view>
<view class="auth-subtitle">获得你的公开信息昵称头像手机号</view>
<view class="auth-subtitle">获得你的公开信息昵称头像</view>
<!-- #ifdef MP-WEIXIN -->
<view class="agreement-box">
<view class="agreement-checkbox" @click="toggleAgreement">
<view class="checkbox-icon" :class="{ checked: agreedToTerms }">
<u-icon v-if="agreedToTerms" name="checkbox-mark" color="#fff" size="28"></u-icon>
</view>
<text class="agreement-text">
我已同意
<text class="agreement-link" @click.stop="openAgreement">相关协议</text>
</text>
</view>
</view>
<view class="login-btn">
<button class="button" open-type="getPhoneNumber" @getphonenumber="handleLoginWithPhone" @click="clickPhoneNumber" :class="{ disabled }">
一键登录
</button>
<view class="button" :class="{ disabled: disabled || !agreedToTerms }" @click="handleLogin()">一键登录</view>
</view>
<!-- #endif -->
<!-- #ifndef MP-WEIXIN -->
<view class="agreement-box">
<view class="agreement-checkbox" @click="toggleAgreement">
<view class="checkbox-icon" :class="{ checked: agreedToTerms }">
<u-icon v-if="agreedToTerms" name="checkbox-mark" color="#fff" size="28"></u-icon>
</view>
<text class="agreement-text">
我已同意
<text class="agreement-link" @click.stop="openAgreement">相关协议</text>
</text>
</view>
</view>
<view class="login-btn">
<view class="button" :class="{ disabled }" @click="handleLogin()">一键登录</view>
<view class="button" :class="{ disabled: disabled || !agreedToTerms }" @click="handleLogin()">一键登录</view>
</view>
<!-- #endif -->
<view class="no-login-btn">
@ -65,6 +85,7 @@
import AvatarImage from '@/components/avatar-image'
import * as Verify from '@/utils/verify'
import * as OrderApi from '@/api/order'
import * as UserApi from '@/api/user'
export default {
components: {
@ -76,6 +97,8 @@
isPersonal: false,
//
disabled: false,
//
agreedToTerms: false,
// ()
avatarUrl: '',
// ()
@ -84,9 +107,6 @@
form: {
nickName: ''
},
//
phoneEncryptedData: '',
phoneIv: '',
// (code)
// openid
code: ''
@ -94,92 +114,40 @@
},
methods: {
//
handleLogin() {
this.onAuthSuccess({})
},
// :
// : getphonenumbercode
// getphonenumbercode,encryptedData
async clickPhoneNumber() {
// #ifdef MP-WEIXIN
if (!this.disabled) {
//
async handleLogin() {
if (!this.agreedToTerms) {
this.$toast('请先同意相关协议')
return
}
// code
if (!this.code) {
this.code = await this.getCode()
}
// #endif
},
//
async handleLoginWithPhone({ detail }) {
const app = this
// #ifdef MP-WEIXIN
//
if (detail.errMsg === 'getPhoneNumber:ok') {
//
app.phoneEncryptedData = detail.encryptedData
app.phoneIv = detail.iv
console.log('获取手机号成功', {
hasEncryptedData: !!detail.encryptedData,
hasIv: !!detail.iv,
hasCode: !!app.code
})
//
let userInfo = {
phoneEncryptedData: detail.encryptedData,
phoneIv: detail.iv,
nickName: '',
avatarUrl: ''
}
//
app.onAuthSuccess(userInfo)
} else {
//
console.log('用户拒绝授权手机号', detail)
app.$toast('为了更好的体验,请授权手机号再登录')
}
// #endif
this.onAuthSuccess()
},
//
// :
// 1.codeuserInfo
// 2., ,
// 1.codeuserInfo
// 2.,
// 3.,
async onAuthSuccess(userInfo) {
async onAuthSuccess() {
const app = this
// codecode
//
if (!app.code) {
app.code = await app.getCode()
}
//
const loginData = {
code: app.code,
phoneEncryptedData: userInfo.phoneEncryptedData || '',
phoneIv: userInfo.phoneIv || '',
nickName: userInfo.nickName || '',
avatarUrl: userInfo.avatarUrl || ''
}
console.log('登录数据:', {
hasCode: !!loginData.code,
hasPhoneNumber: !!(loginData.phoneEncryptedData && loginData.phoneIv),
nickName: loginData.nickName,
hasAvatar: !!(loginData.avatarUrl)
})
//
app.disabled = true
store.dispatch('LoginMpWx', loginData)
store.dispatch('LoginMpWx', { code: app.code })
.then(result => {
app.disabled = false
if (!result.data.buyer.avatarUrl) {
if (!result.data.buyer.avatar) {
app.isPersonal = true
} else {
store.dispatch('UpdateUserInfo', res.data.buyer)
app.$toast('登录成功')
uni.$emit('syncRefresh', true)
setTimeout(() => app.onNavigateBack(), 2000)
@ -340,8 +308,7 @@
app.disabled = false
return
}
//
app.onAuthSuccess({ nickName: app.form.nickName, avatarUrl: app.form.avatarUrl })
store.dispatch('UpdateUserInfo', { buyerName: app.form.nickName, avatar: app.form.avatarUrl })
},
// oauth
@ -375,6 +342,20 @@
} else {
this.$navTo('pages/index/index')
}
},
/**
* 切换协议同意状态
*/
toggleAgreement() {
this.agreedToTerms = !this.agreedToTerms
},
/**
* 打开协议页面
*/
openAgreement() {
this.$navTo('pages/agreement/index')
}
}
@ -522,4 +503,52 @@
align-items: center;
}
}
.agreement-box {
margin-bottom: 30rpx;
padding: 0 10rpx;
.agreement-checkbox {
display: flex;
align-items: flex-start;
font-size: 24rpx;
color: #666;
line-height: 1.6;
.checkbox-icon {
width: 32rpx;
height: 32rpx;
border: 2rpx solid #ddd;
border-radius: 4rpx;
margin-right: 12rpx;
margin-top: 2rpx;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.3s;
&.checked {
background: $main-bg;
border-color: $main-bg;
}
.icon-check2 {
color: #fff;
font-size: 20rpx;
font-weight: bold;
}
}
.agreement-text {
flex: 1;
line-height: 1.6;
}
.agreement-link {
color: $main-bg;
text-decoration: underline;
}
}
}
</style>

View File

@ -1,5 +1,6 @@
import storage from '@/utils/storage'
import * as LoginApi from '@/api/login'
import * as UserApi from '@/api/user'
const user = {
state: {
@ -46,6 +47,21 @@ const user = {
})
},
// 修改个人信息(头像昵称)
UpdateUserInfo({ commit }, data) {
if (data.token) {
storage.set('user_info', data)
commit('SET_USER_INFO', data)
} else {
UserApi.apiUpdateUserInfo(data)
.then(response => {
const { token, buyerId, flag } = this.state
commit('SET_USER_INFO', { token, buyerId, flag, ...data })
resolve(response)
})
}
},
// 微信小程序一键授权登录 (授权手机号)
LoginMpWxMobile({ commit }, data) {
return new Promise((resolve, reject) => {