Merge branch 'master' of http://git.luyuan.tk/luyuan/deming into xbx

This commit is contained in:
luyuan 2020-08-17 09:45:42 +08:00
commit 884bf6945f
Signed by: theluyuan
GPG Key ID: A7972FD973317FF3
23 changed files with 737 additions and 1441 deletions

34
App.vue
View File

@ -4,9 +4,9 @@
globalData: { globalData: {
im: {} im: {}
}, },
computed: { computed: {
...mapState(["hasLogin"]) ...mapState(["hasLogin"])
}, },
onLaunch() { onLaunch() {
getApp().globalData.im = this.imService getApp().globalData.im = this.imService
// token // token
@ -16,23 +16,23 @@
this.loginIn(res.data); this.loginIn(res.data);
} }
}) })
// token // token
if (this.hasLogin) { if (this.hasLogin) {
this.refreshToken_function(); this.refreshToken_function();
} }
}, },
methods: { methods: {
...mapMutations(['loginIn']), ...mapMutations(['loginIn']),
// token // token
refreshToken_function(){ refreshToken_function(){
this.$u.api.refreshToken({}).then((res) => { this.$u.api.refreshToken({}).then((res) => {
// console.log(res); // console.log(res);
if (res.errCode == 0) { if (res.errCode == 0) {
let token = res.data.token; let token = res.data.token;
uni.setStorageSync('token', token);//toke uni.setStorageSync('token', token);//toke
} }
}) })
}, },
} }
} }
</script> </script>

View File

@ -54,6 +54,10 @@ export default {
getRecommendList(){ getRecommendList(){
return vm.$u.post('MemberExpert/recommendList'); return vm.$u.post('MemberExpert/recommendList');
}, },
// 获取所有达人
getAllRecommendList({ page }) {
return vm.$u.post('MemberExpert/getRecommendList', { page });
},
// 达人(搜索)列表 // 达人(搜索)列表
getExpertList({ page, store_id, live_status, like_nickname }){ getExpertList({ page, store_id, live_status, like_nickname }){
return vm.$u.post('MemberExpert/expertList', { return vm.$u.post('MemberExpert/expertList', {

View File

@ -415,7 +415,7 @@ export default {
}, },
// 关注用户列表 // 关注用户列表
attentionMemberList({ page = 1,role } = {}) { attentionMemberList({ page = 1,role } = {}) {
return vm.$u.post('member/attentionMemberList', { page,role }); return vm.$u.post('member/attentionMemberList', { page, role });
}, },
// 可用优惠券商品 // 可用优惠券商品
couponGoodsList({ voucher_id, page, order }) { couponGoodsList({ voucher_id, page, order }) {
@ -437,6 +437,10 @@ export default {
friend_tomid:id friend_tomid:id
}); });
}, },
// 设置里的帮助
getSettingHelpList() {
return vm.$u.post('document/help');
},
//获取默认头像 //获取默认头像
getDefaultAvatar(){ getDefaultAvatar(){
return vm.$u.post("member/getDefaultAvatar") return vm.$u.post("member/getDefaultAvatar")

View File

@ -47,6 +47,10 @@ const install = (Vue, vm) => {
// 假设201为token失效这里跳转登录 // 假设201为token失效这里跳转登录
// vm.$u.toast('您还没有登录哦,请先去登录!'); // vm.$u.toast('您还没有登录哦,请先去登录!');
if (res.data.data.action != "memberinfo") { if (res.data.data.action != "memberinfo") {
uni.showToast({
title: "您还没有登录,请先去登录哦!",
icon: "none"
})
setTimeout(() => { setTimeout(() => {
// 此为uView的方法详见路由相关文档 // 此为uView的方法详见路由相关文档
uni.navigateTo({ uni.navigateTo({

View File

@ -18,7 +18,8 @@ const store = new Vuex.Store({
loadmore: {}, // 下拉加载返回的数据 loadmore: {}, // 下拉加载返回的数据
hasLogin: false, // 登录状态 hasLogin: false, // 登录状态
token: "", // 储存token token: "", // 储存token
showLoginModel: false, // 登录框 showLoginModel: false, // 登录框
question: {}, // 帮助与反馈
}, },
getters: { getters: {
getOrderAddress(state) { getOrderAddress(state) {
@ -75,6 +76,9 @@ const store = new Vuex.Store({
}, },
setLoadMore(state, info) { setLoadMore(state, info) {
state.loadmore = info; state.loadmore = info;
},
setQuestion(state, question) {
state.question = question;
} }
} }
}) })

View File

@ -46,6 +46,7 @@ export default {
}, },
methods: { methods: {
viewGoodsDetails(item) { viewGoodsDetails(item) {
if(this.closeAction()) return false;
const list = this.list.filter(item => { const list = this.list.filter(item => {
return item.show; return item.show;
}) })
@ -57,6 +58,17 @@ export default {
} }
}) })
}, },
closeAction() {
let status = false;
this.list.map((val, idx) => {
if(val.show) {
status = true;
this.$set(this.list[idx], 'show', false);
};
})
this.$forceUpdate();
return status;
},
getGoodsFavoritesList() { getGoodsFavoritesList() {
this.$u.api.getFavoritesList().then(res => { this.$u.api.getFavoritesList().then(res => {
if(res.errCode == 0) { if(res.errCode == 0) {

View File

@ -3,32 +3,28 @@
<view> <view>
<view class="login"> <view class="login">
<view class="content"> <view class="content">
<view class="title">手机登录</view> <view class="title">请绑定手机号</view>
<view class="labales"> <view class="labales">
<text>手机号</text> <input type="number" maxlength="11" v-model="phone" placeholder="手机号" />
<input type="tel" placeholder="" />
</view> </view>
<view class="labales"> <view class="labales flex-inp">
<text>请输入验证码</text> <input type="number" maxlength="6" placeholder="请输入验证码" v-model="sms_code" />
<input type="tel" placeholder="" /> <button class="identifying" :class="is_sendcode ? 'sended' : ''" @click="getCode" :disabled="is_sendcode">{{ is_sendcode ? time_count + "后可以重新发送" : "发送验证码" }}</button>
<text class="identifying">获取验证码</text>
</view> </view>
<!-- 服务协议 --> <!-- 服务协议 -->
<view class="pact"> <view class="pact">
<view></view> <checkbox-group @change="change">
<checkbox class="check-tit" color="#1ADE00" :checked="checked" />
</checkbox-group>
<text>我已详细阅读并同意</text> <text>我已详细阅读并同意</text>
<text class="pact_text">用户协议</text> <text class="pact_text" v-for="(item,index) in pactList" :key="index" @click="infoPact(index)">
<text class="pact_text">隐私协议</text> {{ item }}
<text class="pact_text">使用协议</text> </text>
<u-checkbox-group @change="checkboxGroupChange" size="27">
<u-checkbox @change="checkboxChange" v-model="item.checked" v-for="(item, index) in list" :key="index" :name="item.name"
shape="circle" size="14" active-color="#19BE6B"></u-checkbox>
</u-checkbox-group>
</view> </view>
</view> </view>
<!-- denglu QQ weixin --> <!-- denglu QQ weixin -->
<u-button>{{login}}</u-button> <view class="btn-login" @click="bindPhone">{{login}}</view>
<u-toast ref="uToast" />
</view> </view>
</view> </view>
</template> </template>
@ -36,81 +32,151 @@
export default { export default {
data() { data() {
return { return {
list: [{ phone: "",
checked: false, sms_code: "",
disabled: false login: '绑定',
}], show: true,
value: '', checked: false,
login: '注册', //
show: true timer: null,
is_sendcode: false, // 60s
time_count: 60,
pactList: [ "《用户协议》", "《隐私协议》", "《使用协议》" ],
}; };
}, },
methods: { methods: {
// checkbox //
checkboxChange(e) { change(e) {
//console.log(e); this.checked = !this.checked;
}, console.log(this.checked);
// checkboxcheckbox-group },
checkboxGroupChange(e) { //
// console.log(e); getCode() {
}, if (this.$u.test.isEmpty(this.phone)) {
mask_u(){ this.$refs.uToast.show({
this.show = !this.show title: '手机号格式不能为空!',
}, type: 'error',
})
return;
}
if(!(/^1[3456789]\d{9}$/.test(this.phone))){
this.$refs.uToast.show({
title: '手机号格式不正确!',
type: 'warning',
})
return;
}
this.$u.api.sendSmsCode({
member_mobile: this.phone,
smslog_type: 4,
}).then(res => {
if (res.errCode == 0) {
console.log(res);
this.$refs.uToast.show({
title: res.message,
type: 'success',
})
//
this.getSendCode();
} else {
this.$refs.uToast.show({
title: res.message,
type: 'warning',
})
}
})
},
//
bindPhone() {
if (this.$u.test.isEmpty(this.phone)) {
this.$refs.uToast.show({
title: '手机号不能为空!',
type: 'error',
})
return;
}
if(!(/^1[3456789]\d{9}$/.test(this.phone))){
this.$refs.uToast.show({
title: '手机号格式不正确!',
type: 'warning',
})
return;
}
if(this.$u.test.isEmpty(this.sms_code)){
this.$refs.uToast.show({
title: '验证码不能为空!',
type: 'warning',
})
return;
}
if(this.sms_code.length == 0){
this.$refs.uToast.show({
title: '验证码有误!',
type: 'warning',
})
return;
}
if(!this.checked){
this.$refs.uToast.show({
title: '请同意协议!',
type: 'warning',
})
return;
}
this.$u.api.mobileBind({
member_mobile: this.phone,
sms_code: this.sms_code,
}).then(res => {
console.log(res);
if (res.errCode == 0) {
this.$refs.uToast.show({
title: res.message,
type: 'success',
})
uni.switchTab({
url: '/pages/index/index'
});
} else {
this.$refs.uToast.show({
title: res.message,
type: 'warning',
})
}
})
},
//
infoPact(index) {
// console.log(index);
uni.navigateTo({
url: '/pageA/pactList/pactList?index=' + index
});
},
// 60s
getSendCode() {
const TIME_COUNT = 60;
if (!this.timer) {
this.time_count = TIME_COUNT;
this.is_sendcode = true;
this.timer = setInterval(() => {
if (this.time_count > 0 && this.time_count <= TIME_COUNT) {
this.time_count--;
} else {
this.is_sendcode = false;
clearInterval(this.timer);
this.timer = null;
}
}, 1000);
}
},
} }
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.uni-page-wrapper{
background: #fff; page {
} background-color: #fff;
.login { }
// background: url(../../static/pageA/loginbackground.png) no-repeat!important;
.images {
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: -1;
}
.backes {
background: rgba(0, 0, 0, 0.4);
position: fixed;
width: 100%;
height: 100%;
z-index: -1;
}
text {
z-index: 9;
color: #fff;
}
.more_Login {
overflow: hidden;
zoom: 1;
width: 630rpx;
margin: 0 auto;
}
.more_Login text {
display: inline-block;
width: 50%;
float: left;
font-size: 30rpx;
color: rgba(255, 255, 255, 1);
line-height: 36px;
margin: 97rpx 0;
}
.more_Login .other {
text-align: right;
}
}
.title { .title {
font-size: 36rpx; font-size: 36rpx;
@ -124,163 +190,87 @@
z-index: 99999; z-index: 99999;
margin: 0 auto; margin: 0 auto;
padding-top: 130rpx; padding-top: 130rpx;
.labales {
position: relative;
display: flex;
align-items: center;
padding: 20rpx;
border-bottom: 1px #BFBFBF solid;
input {
width: 100%;
}
}
.flex-inp {
justify-content: space-between;
margin-top: 70rpx;
}
.labales text { .labales text {
font-size: 30rpx; font-size: 30rpx;
color: #999; color: #999;
} }
.labales {
border-bottom: 1px #BFBFBF solid;
margin-bottom: 90rpx;
}
.labales {
position: relative;
}
.identifying { .identifying {
position: absolute; flex-shrink: 0;
right: 0; font-size: 26rpx;
top: 0;
bottom: 0;
margin: auto;
font-size: 30rpx;
font-weight: 500; font-weight: 500;
color: #FF780F!important; color: #FF780F !important;
border: none;
background-color: #fff;
} }
}
.pact text { .sended {
font-size: 22rpx; color: #666 !important;
font-weight: 400; }
color: #333;
line-height: 36px;
} }
.pact {
display: flex;
align-items: center;
flex-wrap: wrap;
margin: 20rpx 0;
&>text {
font-size: 22rpx;
font-weight: 400;
color: #333;
}
}
.check-tit {
font-size: 20rpx;
}
::v-deep uni-checkbox .uni-checkbox-input {
width: 24rpx;
height: 24rpx;
border-color: #d1d1d1 !important;
border-radius: 50% !important;
}
::v-deep uni-checkbox .uni-checkbox-input-checked:before {
font-size: 28rpx;
}
.pact_text { .pact_text {
font-size: 22px; font-size: 22px;
font-weight: 400; font-weight: 400;
color: rgba(129, 188, 253, 1) !important; color: rgba(129, 188, 253, 1) !important;
line-height: 36px;
} }
// .btn-login {
.pact { width: 650rpx;
position: relative; height: 90rpx;
padding-left: 38rpx; margin: 300rpx auto 0;
} text-align: center;
line-height: 90rpx;
color: #fff;
font-size: 34rpx;
border-radius: 50rpx !important;
background-color: #FF780F;
}
.u-checkbox-group { button::after{ border: none; }
position: absolute;
left: 0;
top: 0;
bottom: 0;
margin: auto;
}
.u-checkbox__icon--square {
border-radius: 50rpx !important;
width: 22rpx;
height: 22rpx;
}
.u-btn {
width: 628rpx;
height: 98rpx;
background: rgba(255, 120, 15, 1) !important;
border-radius: 49rpx;
margin: 0 auto;
font-size: 36rpx;
color: rgba(255, 255, 255, 1) !important;
line-height: 36px;
border: 1px #ff780f solid;
outline: none;
border-color: rgba(255, 120, 15, 1) !important;
margin-top: 225rpx;
}
.warp {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
.rect {
width: 558rpx;
height: 300rpx;
background-color: #fff;
border-radius: 20rpx;
overflow: hidden;
zoom: 1;
position: relative;
display: flex;
flex-wrap:wrap;
display: -webkit-flex; /* Safari */
.rect_view{
width: 100rpx;
height: 100rpx;
.image{
width: 45rpx;
height: 53rpx;
display: inline-block;
}
flex:1;
margin-top: 77rpx;
}
.rect_view:nth-child(2) image{
width: 57rpx;
height: 45rpx;
}
.rect_butoon{
width: 100%;
position: absolute;
bottom: 0;
height: 85rpx;
text-align: center;
line-height: 85rpx;
border-top: 1px #999999 solid;
}
view{
color: #666;
font-size:24rpx;
margin-top: 30rpx;
}
}
.rect_view:nth-child(1) image,.rect_view:nth-child(1) view{
float: right;
}
.rect_view:nth-child(1) image{
margin-right: 20rpx;
}
.rect_view:nth-child(1){
position: relative;
margin-right: 79rpx;
}
.rect_view:nth-child(1) view{
position: absolute;
bottom: 0;
right: 0;
}
.rect_view:nth-child(2) image,.rect_view:nth-child(2) view{
float: left;
}
.rect_view:nth-child(2) image{
margin-left: 20rpx;
}
.rect_view:nth-child(2){
position: relative;
}
.rect_view:nth-child(2) view{
position: absolute;
bottom: 0;
left: 0;
}
u-button{
margin-top: 225rpx;
}
</style> </style>

View File

@ -226,14 +226,20 @@
member_nickname: data.userInfo.nickName, member_nickname: data.userInfo.nickName,
member_avatar: data.userInfo.avatarUrl, member_avatar: data.userInfo.avatarUrl,
}).then(res => { }).then(res => {
console.log(res.errCode);
if (res.errCode == 0) { if (res.errCode == 0) {
this.loginIn(res.data.token); this.loginIn(res.data.token);
uni.setStorageSync('user_info',res.data); uni.setStorageSync('user_info',res.data);
this.show = false; this.show = false;
uni.switchTab({ console.log(res.data.member.member_mobilebind);
url: "../../pages/index/index" if(res.data.member.member_mobilebind) {
}) uni.switchTab({
url: "/pages/index/index"
});
} else {
uni.navigateTo({
url: '/pageA/bindinges/bindinges'
});
}
} }
}) })
} }
@ -247,11 +253,11 @@
uni.login({ uni.login({
provider: 'weixin', provider: 'weixin',
success: (wxres) => { success: (wxres) => {
console.log(wxres); // console.log(wxres);
uni.getUserInfo({ uni.getUserInfo({
provider: 'weixin', provider: 'weixin',
success: (data) => { success: (data) => {
console.log(data); // console.log(data);
this.$u.api.wechatLogin({ this.$u.api.wechatLogin({
member_wxopenid: data.userInfo.openId, member_wxopenid: data.userInfo.openId,
member_nickname: data.userInfo.nickName, member_nickname: data.userInfo.nickName,
@ -260,11 +266,18 @@
console.log(res); console.log(res);
if (res.errCode == 0) { if (res.errCode == 0) {
this.loginIn(res.data.token); this.loginIn(res.data.token);
uni.setStorageSync('user_info',res.data); uni.setStorageSync('user_info',res.data);
this.show = false; this.show = false;
uni.switchTab({ console.log(res.data.member.member_mobilebind);
url: "../../pages/index/index" if(res.data.member.member_mobilebind) {
}) uni.switchTab({
url: "/pages/index/index"
});
} else {
uni.navigateTo({
url: '/pageA/bindinges/bindinges'
});
}
} }
}) })
} }
@ -301,11 +314,11 @@
tochange() { tochange() {
}, },
goIndex() { goIndex() {
uni.switchTab({ uni.switchTab({
url: "/pages/index/index" url: "/pages/index/index"
}) })
} }
}, },
components: { components: {
identifying identifying

View File

@ -29,9 +29,9 @@ export default {
document_code: 'agreement' document_code: 'agreement'
}).then((res)=>{ }).then((res)=>{
// console.log(res.data.document_title); // console.log(res.data.document_title);
uni.setNavigationBarTitle({ uni.setNavigationBarTitle({
title: res.data.document_title title: res.data.document_title
}) })
let data = common.unescapeHTML(res.data.document_content); let data = common.unescapeHTML(res.data.document_content);
this.document_content = data; this.document_content = data;
}) })
@ -41,9 +41,9 @@ export default {
document_code: 'privacy' document_code: 'privacy'
}).then((res)=>{ }).then((res)=>{
// console.log(res.data.document_title); // console.log(res.data.document_title);
uni.setNavigationBarTitle({ uni.setNavigationBarTitle({
title: res.data.document_title title: res.data.document_title
}) })
let data = common.unescapeHTML(res.data.document_content); let data = common.unescapeHTML(res.data.document_content);
this.document_content = data this.document_content = data
}) })
@ -53,9 +53,9 @@ export default {
document_code: 'use' document_code: 'use'
}).then((res)=>{ }).then((res)=>{
// console.log(res.data.document_title); // console.log(res.data.document_title);
uni.setNavigationBarTitle({ uni.setNavigationBarTitle({
title: res.data.document_title title: res.data.document_title
}) })
let data = common.unescapeHTML(res.data.document_content); let data = common.unescapeHTML(res.data.document_content);
this.document_content = data this.document_content = data
}) })
@ -69,7 +69,6 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.packlist{}
.packlist > view{ .packlist > view{
width: 90%; width: 90%;
margin: 0 auto; margin: 0 auto;

View File

@ -1,43 +1,49 @@
<template> <template>
<view class="follow"> <view class="follow">
<view class="sosuo" @click="searchValue"> <scroll-view scroll-y :style="{ height: viewHeight }" @scrolltolower="loadmore" class="container">
<image src="/static/image/common/10.png"></image> <view class="sosuo" @click="searchValue">
<text>输入达人名称</text> <image src="/static/image/common/10.png"></image>
</view> <text>输入达人名称</text>
<view class="list" style="margin-left:-20rpx"> </view>
<darenItem style="margin-top:20rpx;margin-left:20rpx;" v-for="item in recommendList" :key="item.id" :info="item" v-on:pChangeType="changeType"></darenItem> <view class="list" style="margin-left:-20rpx">
</view> <darenItem style="margin-top:20rpx;margin-left:20rpx;" v-for="item in recommendList" :key="item.id" :info="item" v-on:pChangeType="changeType"></darenItem>
</view>
<u-loadmore :status="loadStatus" bgColor="#ECECEC" font-size="14" margin-top="40" margin-bottom="20" v-if="recommendList.length > pageSize" @loadmore="loadmore"></u-loadmore>
</scroll-view>
</view> </view>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
.follow{ .follow{
background-color: #ECECEC; background-color: #ECECEC;
min-height: calc(100vh - var(--window-top)); min-height: calc(100vh - var(--window-top));
padding: 20rpx 30rpx; .container {
.sosuo{ box-sizing: border-box;
width: 100%; padding: 20rpx 30rpx;
height: 60rpx; .sosuo{
border-radius: 30rpx; width: 100%;
background-color: #fff; height: 60rpx;
display: flex; border-radius: 30rpx;
align-items: center; background-color: #fff;
justify-content: center; display: flex;
>image{ align-items: center;
width: 29rpx; justify-content: center;
height: 29rpx; >image{
} width: 29rpx;
>text{ height: 29rpx;
font-size: 24rpx; }
color: #999; >text{
margin-left: 15rpx; font-size: 24rpx;
} color: #999;
} margin-left: 15rpx;
.list{ }
display: flex; }
flex-wrap: wrap; .list{
width: calc(100% + 23rpx); display: flex;
margin-right: -23rpx; flex-wrap: wrap;
} width: calc(100% + 23rpx);
margin-right: -23rpx;
}
}
} }
</style> </style>
<script> <script>
@ -50,22 +56,45 @@ export default {
}, },
data(){ data(){
return{ return{
pageSize: 2,
recommendList: [], // recommendList: [], //
page: 1,
loadStatus: 'loadmore',
timer: true,
viewHeight: '',
} }
}, },
onLoad() {
this.setViewHeight();
},
onShow() { onShow() {
this.getRecommendList(); this.getRecommendList();
}, },
methods: { methods: {
getRecommendList() { async getRecommendList({ load = 'reload' } = {}) {
this.$u.api.getRecommendList().then(res => { const res = await this.$u.api.getAllRecommendList({ page: this.page });
if(res.errCode == 0) { this.timer = true;
this.recommendList = res.data.list; if(res.errCode == 0) {
} if(load == 'reload') this.recommendList = res.data.list;
if(load == 'loadmore') this.recommendList.push(...res.data.list);
}
return res.data.list.length;
},
loadmore() {
if(!this.timer) return false;
this.timer = false;
this.loadStatus = "loading";
this.page++;
this.getRecommendList({ load: "loadmore" }).then(length => {
this.loadStatus = "nomore";
if(length == 0) this.page--;
}).catch(() => {
this.loadStatus = "nomore";
this.page--;
}) })
}, },
changeType(member_id){ changeType(member_id){
console.log(member_id); // console.log(member_id);
this.$emit("pChangeType") this.$emit("pChangeType")
this.$u.api.attentionMember({ this.$u.api.attentionMember({
member_id: member_id member_id: member_id
@ -79,6 +108,10 @@ export default {
url: '/pageB/search/index?type=2&curent=1' url: '/pageB/search/index?type=2&curent=1'
}) })
}, },
setViewHeight() {
const res = uni.getSystemInfoSync();
this.viewHeight = res.windowHeight + 'px';
}
}, },
} }
</script> </script>

View File

@ -543,8 +543,8 @@ export default {
reply_id: this.reply_id, reply_id: this.reply_id,
}).then(res => { }).then(res => {
// console.log(res.data); // console.log(res.data);
this.send_value = "";
if (res.errCode == 0) { if (res.errCode == 0) {
this.send_value = "";
this.comment_num = res.data.num; this.comment_num = res.data.num;
// console.log(this.comment_num); // console.log(this.comment_num);
this.is_edit = false; this.is_edit = false;

View File

@ -31,9 +31,9 @@
<text>{{ goodsInfo.goods_price || '0.00' }}</text> <text>{{ goodsInfo.goods_price || '0.00' }}</text>
</view> </view>
<view class="collect" @click="switchCollect(goodsInfo.is_collect)"> <view class="collect" @click="switchCollect(goodsInfo.is_collect)">
<u-icon name="star" color="#474747" size="28" v-if="goodsInfo.is_collect == 0"></u-icon> <u-icon name="star-fill" color="#FF7807" size="28" v-if="goodsInfo.is_collect == 1"></u-icon>
<u-icon name="star-fill" color="#FF7807" size="28" v-else></u-icon> <u-icon name="star" color="#474747" size="28" v-else></u-icon>
<text>{{ !goodsInfo.is_collect == 1 ? '收藏' : '收藏' }}</text> <text>{{ goodsInfo.is_collect == 1 ? '收藏' : '收藏' }}</text>
</view> </view>
</view> </view>
</view> </view>
@ -638,7 +638,7 @@ export default {
current: arr[index] current: arr[index]
}) })
}, },
switchCollect(status) { switchCollect(status = 0) {
if(status == 1) { if(status == 1) {
this.removeFavorite(); this.removeFavorite();
} else { } else {
@ -646,6 +646,13 @@ export default {
} }
}, },
addFavoriteGoods() { addFavoriteGoods() {
// //
// if (!this.$store.state.hasLogin) {
// uni.navigateTo({
// url: "pageA/login/login"
// })
// return false;
// }
this.$u.api.addFavoriteGoods({ fid: this.goodsInfo.goods_id }).then(res => { this.$u.api.addFavoriteGoods({ fid: this.goodsInfo.goods_id }).then(res => {
if(res.errCode == 0) { if(res.errCode == 0) {
this.getGoodsDetails(this.id); this.getGoodsDetails(this.id);

View File

@ -266,8 +266,8 @@
success: (res) => { success: (res) => {
console.log(res); console.log(res);
this.is_edit = false; this.is_edit = false;
this.send_value = "";
if (res.data.errCode == 0) { if (res.data.errCode == 0) {
this.send_value = "";
this.comment_num = res.data.num; this.comment_num = res.data.num;
let p_id = res.data.data.data.pid; let p_id = res.data.data.data.pid;
console.log(this.pid, this.reply_id, this.comment_id); console.log(this.pid, this.reply_id, this.comment_id);

View File

@ -170,9 +170,9 @@ export default {
} }
}, },
getStoreInfo() { getStoreInfo() {
console.log(this.sid ) // console.log(this.sid )
this.$u.api.getStoreInfo({ id: this.sid }).then((res)=>{ this.$u.api.getStoreInfo({ id: this.sid }).then((res)=>{
console.log(JSON.stringify(res)) // console.log(JSON.stringify(res))
this.info = res.data; this.info = res.data;
uni.stopPullDownRefresh(); uni.stopPullDownRefresh();
}) })
@ -222,7 +222,7 @@ export default {
const res = uni.getSystemInfoSync(); const res = uni.getSystemInfoSync();
this.scrollHeiht = res.windowHeight - (73 + 20 + 170) + 'px'; this.scrollHeiht = res.windowHeight - (73 + 20 + 170) + 'px';
this.paddingTop = res.windowWidth / 750 * (90 + 50) + 'px'; this.paddingTop = res.windowWidth / 750 * (90 + 50) + 'px';
console.log(this.paddingTop); // console.log(this.paddingTop);
} }
}, },
onLoad(option){ onLoad(option){

View File

@ -1,544 +0,0 @@
<template>
<view class="content">
<view class="content-box" @touchstart="touchstart" id="content-box" :class="{'content-showfn':showFunBtn}">
<!-- 背景图- 定位方式 -->
<image class="content-box-bg" :src="_user_info.chatBgImg" :style="{ height: imgHeight }"></image>
<view class="content-box-loading" v-if="!loading"><u-loading mode="flower"></u-loading></view>
<view class="message" v-for="(item, index) in messageList" :key="index" :id="`msg-${item.hasBeenSentId}`">
<view class="message-item " :class="item.isItMe ? 'right' : 'left'">
<image class="img" :src="item.fromUserHeadImg" mode="" @tap="linkToBusinessCard(item.fromUserId)"></image>
<!-- contentType = 1 文本 -->
<view class="content" v-if="item.contentType == 1">{{ item.content }}</view>
<!-- contentType = 2 语音 -->
<view
class="content contentType2"
:class="[{ 'content-type-right': item.isItMe }]"
v-if="item.contentType == 2"
@tap="handleAudio(item)"
hover-class="contentType2-hover-class"
:style="{width:`${130+(item.contentDuration*2)}rpx`}"
>
<view
class="voice_icon"
:class="[
{ voice_icon_right: item.isItMe },
{ voice_icon_left: !item.isItMe },
{ voice_icon_right_an: item.anmitionPlay && item.isItMe },
{ voice_icon_left_an: item.anmitionPlay && !item.isItMe }
]"
></view>
<view class="">{{ item.contentDuration }}''</view>
</view>
<!-- contentType = 3 图片 -->
<view
class="content contentType3"
v-if="item.contentType == 3"
@tap="viewImg([item.content])"
>
<image :src="item.content" class="img" mode="widthFix"></image>
</view>
</view>
</view>
</view>
<!-- 底部聊天输入框 -->
<view class="input-box" :class="{ 'input-box-mpInputMargin': mpInputMargin }">
<view class="input-box-flex">
<!-- #ifndef H5 -->
<image v-if="chatType === 'voice'" class="icon_img" :src="require('@/static/pageD/voice.png')" @click="switchChatType('keyboard')"></image>
<image v-if="chatType === 'keyboard'" class="icon_img" :src="require('@/static/pageD/keyboard.png')" @click="switchChatType('voice')"></image>
<!-- #endif -->
<view class="input-box-flex-grow">
<input
v-if="chatType === 'voice'"
type="text"
class="content"
id="input"
v-model="formData.content"
:hold-keyboard="true"
:confirm-type="'send'"
:confirm-hold="true"
placeholder-style="color:#DDDDDD;"
:cursor-spacing="10"
@confirm="sendMsg(null)"
/>
<view
class="voice_title"
v-if="chatType === 'keyboard'"
:style="{ background: recording ? '#c7c6c6' : '#FFFFFF' }"
@touchstart.stop.prevent="startVoice"
@touchmove.stop.prevent="moveVoice"
@touchend.stop="endVoice"
@touchcancel.stop="cancelVoice"
>
{{ voiceTitle }}
</view>
</view>
<!-- 功能性按钮 -->
<image class=" icon_btn_add" :src="require('@/static/pageD/add.png')" @tap="switchFun"></image>
<!-- #ifdef H5 -->
<button class="btn" type="primary" size="mini" @touchend.prevent="sendMsg(null)">发送</button>
<!-- #endif -->
</view>
<view class="fun-box" :class="{'show-fun-box':showFunBtn}">
<u-grid :col="4" hover-class="contentType2-hover-class" :border="false" @click="clickGrid">
<u-grid-item v-for="(item, index) in funList" :index="index" :key="index" bg-color="#eaeaea">
<u-icon :name="item.icon" :size="52"></u-icon>
<view class="grid-text">{{ item.title }}</view>
</u-grid-item>
</u-grid>
</view>
</view>
<!-- // -->
<view class="voice_an" v-if="recording">
<view class="voice_an_icon">
<view id="one" class="wave"></view>
<view id="two" class="wave"></view>
<view id="three" class="wave"></view>
<view id="four" class="wave"></view>
<view id="five" class="wave"></view>
<view id="six" class="wave"></view>
<view id="seven" class="wave"></view>
</view>
<view class="text">{{voiceIconText}}</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
fromUserInfo: {},
formData: {
content: '',
limit: 15,
index: 1
},
messageList: [],
loading: true, //
imgHeight: '1000px',
mpInputMargin: false, //
chatType:"voice", // 'voice' 'keyboard'
voiceTitle: '按住 说话',
Recorder: uni.getRecorderManager(),
Audio: uni.createInnerAudioContext(),
recording: false, //
isStopVoice: false, // (),stop
voiceInterval:null,
voiceTime:0, //
canSend:true, //
PointY:0, //
voiceIconText:"正在录音...",
showFunBtn:false, //
AudioExam:null, //
funList: [
{ icon:"photo-fill",title:"照片",uploadType:["album"] },
{ icon:"camera-fill",title:"拍摄",uploadType:["camera"] },
],
};
},
methods: {
//
async joinData() {
if (!this.loading) {
// loadingfalsereturn
return;
}
this.loading = false;
const data = await this.getMessageData();
//
const { index } = this.formData;
const sel = `#msg-${index > 1 ? this.messageList[0].hasBeenSentId : data[data.length - 1].hasBeenSentId}`;
this.messageList = [...data, ...this.messageList];
//bindScroll ---
this.$nextTick(() => {
this.bindScroll(sel);
//
if (this.formData.limit >= data.length) {
this.formData.index++;
setTimeout(() => {
this.loading = true;
}, 200);
}
});
},
//
bindScroll(sel, duration = 0) {
const query = uni.createSelectorQuery().in(this);
query
.select(sel)
.boundingClientRect(data => {
uni.pageScrollTo({
scrollTop: data && data.top - 40,
duration
});
})
.exec();
},
//
getMessageData() {
let getData = () => {
let arr = [];
let startIndex = (this.formData.index - 1) * this.formData.limit;
let endIndex = startIndex + this.formData.limit;
for (let i = startIndex; i < endIndex; i++) {
const isItMe = Math.random() > 0.5 ? true : false;
arr.unshift({
hasBeenSentId: i, //id
content: `很高兴认识你,这是第${i + 1}条消息。`,
fromUserHeadImg: isItMe ? this._user_info.headImg : this.fromUserInfo.fromUserHeadImg, //
fromUserId: isItMe ? this._user_info.id : this.fromUserInfo.fromUserId,
isItMe, //true false
createTime: Date.now(),
contentType: 1, // 1 2
anmitionPlay: false //
});
}
return arr;
};
return new Promise((resolve, reject) => {
const data = getData();
setTimeout(() => {
resolve(data);
}, 500);
});
},
//
switchChatType(type) {
this.chatType = type;
this.showFunBtn =false;
},
//
switchFun(){
this.chatType = 'keyboard'
this.showFunBtn = !this.showFunBtn;
uni.hideKeyboard()
},
//
sendMsg(data) {
const params = {
hasBeenSentId: Date.now(), //id
content: this.formData.content,
fromUserHeadImg: this._user_info.headImg, //
fromUserId: this._user_info.id,
isItMe: true, //true false
createTime: Date.now(),
contentType: 1
};
if (data) {
if(data.contentType == 2){
//
params.content = data.content;
params.contentType = data.contentType;
params.contentDuration = data.contentDuration;
params.anmitionPlay = false;
}else if(data.contentType == 3){
//
params.content = data.content;
params.contentType = data.contentType;
}
} else if (!this.$u.trim(this.formData.content)) {
//
return;
}
this.messageList.push(params);
this.$nextTick(() => {
this.formData.content = '';
// #ifdef MP-WEIXIN
if(params.contentType == 1){
uni.pageScrollTo({
scrollTop: 99999,
duration: 0, // input...
});
}else{
setTimeout(()=>{
uni.pageScrollTo({
scrollTop: 99999,
duration: 0, // input...
});
},150)
}
// #endif
// #ifndef MP-WEIXIN
uni.pageScrollTo({
scrollTop: 99999,
duration: 100
});
// #endif
if(this.showFunBtn){
this.showFunBtn = false;
}
// #ifdef MP-WEIXIN
if (params.contentType == 1) {
this.mpInputMargin = true;
}
// #endif
//h5
// #ifdef H5
uni.hideKeyboard();
// #endif
});
},
//
touchstart() {
uni.hideKeyboard();
},
// userid id
linkToBusinessCard(userId) {
this.$u.route({
url: 'pages/businessCard/businessCard',
params: {
userId
}
});
},
//
startVoice(e) {
if(!this.Audio.paused){
//
this.stopAudio(this.AudioExam)
}
this.recording = true;
this.isStopVoice = false;
this.canSend = true;
this.voiceIconText = "正在录音..."
this.PointY = e.touches[0].clientY;
this.Recorder.start({
format: 'mp3'
});
},
//
beginVoice(){
if (this.isStopVoice) {
this.Recorder.stop();
return;
}
this.voiceTitle = '松开 结束'
this.voiceInterval = setInterval(()=>{
this.voiceTime ++;
},1000)
},
//move
moveVoice(e){
const PointY = e.touches[0].clientY
const slideY = this.PointY - PointY;
if(slideY > uni.upx2px(120)){
this.canSend = false;
this.voiceIconText = '松开手指 取消发送 '
}else if(slideY > uni.upx2px(60)){
this.canSend = true;
this.voiceIconText = '手指上滑 取消发送 '
}else{
this.voiceIconText = '正在录音... '
}
},
//
endVoice() {
this.isStopVoice = true; //
this.Recorder.stop();
this.voiceTitle = '按住 说话'
},
//
cancelVoice(e){
this.voiceTime = 0;
this.voiceTitle = '按住 说话';
this.canSend = false;
this.Recorder.stop();
},
//
handleRecorder({ tempFilePath,duration }) {
let contentDuration;
// #ifdef MP-WEIXIN
this.voiceTime = 0;
if (duration < 600) {
this.voiceIconText="说话时间过短";
setTimeout(()=>{
this.recording = false;
},200)
return;
}
contentDuration = duration/1000;
// #endif
// #ifdef APP-PLUS
contentDuration = this.voiceTime +1;
this.voiceTime = 0;
if(contentDuration <= 0) {
this.voiceIconText="说话时间过短";
setTimeout(()=>{
this.recording = false;
},200)
return;
};
// #endif
this.recording = false;
const params = {
contentType: 2,
content: tempFilePath,
contentDuration: Math.ceil(contentDuration)
};
this.canSend && this.sendMsg(params);
},
//
handleAudio(item) {
this.AudioExam = item;
this.Audio.paused ? this.playAudio(item) : this.stopAudio(item);
},
//
playAudio(item) {
this.Audio.src = item.content;
this.Audio.hasBeenSentId = item.hasBeenSentId;
this.Audio.play();
item.anmitionPlay = true;
},
//
stopAudio(item) {
item.anmitionPlay = false;
this.Audio.src = '';
this.Audio.stop();
},
//
closeAnmition() {
const hasBeenSentId = this.Audio.hasBeenSentId;
const item = this.messageList.find(it => it.hasBeenSentId == hasBeenSentId);
item.anmitionPlay = false;
},
//
clickGrid(index){
if(index == 0){
this.chooseImage(['album'])
}else if(index == 1){
this.chooseImage(['camera'])
}
},
//
chooseImage(sourceType){
uni.chooseImage({
sourceType,
sizeType:['compressed'],
success:res=>{
this.showFunBtn = false;
for(let i = 0;i<res.tempFilePaths.length;i++){
const params = {
contentType: 3,
content: res.tempFilePaths[i],
};
this.sendMsg(params)
}
}
})
},
//
viewImg(imgList){
uni.previewImage({
urls: imgList,
// #ifndef MP-WEIXIN
indicator: 'number'
// #endif
});
},
},
onPageScroll(e) {
if (e.scrollTop < 50) {
this.joinData();
}
},
onNavigationBarButtonTap({ index }) {
if (index == 0) {
//
} else if (index == 1) {
//
this.$u.route({
type: 'switchTab',
url: 'pages/home/home'
});
}
},
//
onBackPress(e) {
//h5
//--
this.$u.route({
type: 'switchTab',
url: 'pages/home/home'
});
return true;
},
onLoad(info) {
// { messageId,fromUserName,fromUserHeadImg } = info
const userInfo = this.firendList.filter(item => item.userId == info.fromUserId)[0];
console.log(userInfo)
this.fromUserInfo = {
fromUserName: userInfo.userName,
fromUserHeadImg: userInfo.headImg,
fromUserId: 4,
messageId: 2
};
//
this.Recorder.onStart(e => {
this.beginVoice();
});
//
this.Recorder.onStop(res => {
clearInterval(this.voiceInterval);
this.handleRecorder(res);
});
//
this.Audio.onStop(e => {
this.closeAnmition();
});
//
this.Audio.onEnded(e => {
this.closeAnmition();
});
},
onReady() {
//
// #ifdef H5
const icon = document.getElementsByClassName('uni-page-head-btn')[0];
icon.style.display = 'none';
// #endif
uni.setNavigationBarTitle({
title: this.fromUserInfo.fromUserName
});
this.joinData();
uni.getSystemInfo({
success: res => {
this.imgHeight = res.windowHeight + 'px';
}
});
uni.onKeyboardHeightChange(res => {
if (res.height == 0) {
// #ifdef MP-WEIXIN
this.mpInputMargin = false;
// #endif
}else{
this.showFunBtn = false;
}
});
}
};
</script>
<style lang="scss" scoped>
@import './index.scss'
</style>

View File

@ -1,354 +0,0 @@
page {
background-color: #f3f3f3;
}
.content {
&-showfn{
padding-bottom: 0rpx;
padding-bottom: calc(420rpx + constant(safe-area-inset-bottom));
padding-bottom: calc(420rpx + env(safe-area-inset-bottom) );
/* #ifdef MP-WEIXIN */
/* #endif */
}
&-box {
width: 100%;
height: auto;
min-height: calc(100vh - env(safe-area-inset-top) - 200rpx);
box-sizing: content-box;
position: relative;
padding-bottom: 120rpx;
/* #ifdef APP-PLUS */
margin-bottom: 0rpx;
margin-bottom: constant(safe-area-inset-bottom);
margin-bottom: env(safe-area-inset-bottom);
/* #endif */
/* #ifdef MP-WEIXIN */
padding-bottom: 0rpx;
padding-bottom: calc(120rpx + constant(safe-area-inset-bottom));
padding-bottom: calc(120rpx + env(safe-area-inset-bottom) );
/* #endif */
&-bg {
width: 100%;
position: fixed;
/* #ifdef MP-WEIXIN */
bottom: 0;
bottom: constant(safe-area-inset-bottom);
bottom: env(safe-area-inset-bottom);
/* #endif */
/* #ifndef MP-WEIXIN */
top: 0;
left: 0;
/* #endif */
}
&-loading {
text-align: center;
padding: 20rpx 0;
}
.message {
padding: 13rpx 20rpx;
}
.message-item {
display: flex;
justify-content: flex-start;
align-items: flex-start;
align-content: flex-start;
flex-wrap: nowrap;
flex-direction: row;
.img {
width: 80rpx;
height: 80rpx;
border-radius: 5rpx;
}
.content {
padding: 20rpx;
max-width: 500rpx;
border-radius: 10rpx;
font-size: 28rpx;
}
// 语音
.contentType2 {
display: flex;
flex-direction: row;
align-items: center;
.voice_icon {
height: 34rpx;
width: 34rpx;
background-repeat: no-repeat;
background-size: 100%;
}
.voice_icon_right {
background-image: url(../../static/voice-left-3.png);
margin-left: 10rpx;
}
.voice_icon_left {
background-image: url(../../static/voice-right-3.png);
margin-right: 10rpx;
}
.voice_icon_right_an {
animation: voiceAn_right 1s linear alternate infinite;
}
.voice_icon_left_an {
animation: voiceAn_left 1s linear alternate infinite;
}
@keyframes voiceAn_right {
0% {
background-image: url(../../static/voice-left-1.png);
}
50% {
background-image: url(../../static/voice-left-2.png);
}
100% {
background-image: url(../../static/voice-left-3.png);
}
}
@keyframes voiceAn_left {
0% {
background-image: url(../../static/voice-right-1.png);
}
50% {
background-image: url(../../static/voice-right-2.png);
}
100% {
background-image: url(../../static/voice-right-3.png);
}
}
}
//图片
.contentType3{
padding: 0;
border-radius: 2rpx;
background-color: transparent !important;
.img{
width: 200rpx;
height: auto;
max-width: 300rpx;
max-height: 400rpx;
}
}
.contentType3::after{
border: none !important;
display: none !important;
}
.content-type-right {
flex-direction: row-reverse;
}
&.right {
flex-direction: row-reverse;
.content {
background-color: $uni-color-success;
margin-right: 28rpx;
word-break: break-all;
line-height: 36rpx;
position: relative;
&::after {
content: '';
display: block;
width: 0;
height: 0;
border-top: 10rpx solid transparent;
border-bottom: 10rpx solid transparent;
border-left: 16rpx solid $uni-color-success;
position: absolute;
right: -16rpx;
top: 30rpx;
}
}
}
&.left {
.content {
background-color: $uni-text-color-inverse;
margin-left: 28rpx;
word-break: break-all;
line-height: 36rpx;
position: relative;
&::after {
content: '';
display: block;
width: 0;
height: 0;
border-top: 10rpx solid transparent;
border-bottom: 10rpx solid transparent;
border-right: 16rpx solid $uni-text-color-inverse;
position: absolute;
left: -16rpx;
top: 30rpx;
}
}
}
}
}
.input-box {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
box-sizing: content-box;
z-index: 999;
background-color: #eaeaea;
/* #ifdef APP-PLUS */
margin-bottom: 0rpx;
margin-bottom: constant(safe-area-inset-bottom);
margin-bottom: env(safe-area-inset-bottom);
/* #endif */
/* #ifdef MP-WEIXIN */
padding-bottom: 0rpx;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
/* #endif */
&-flex {
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: nowrap;
flex-direction: row;
padding: 20rpx;
box-sizing: border-box;
image{
width: 56rpx;
height: 56rpx;
}
.icon_img {
margin-right: 20rpx;
}
.icon_btn_add{
margin-left: 20rpx;
}
&-grow {
flex-grow: 1;
.content {
box-sizing: border-box;
background-color: #fff;
height: 80rpx;
padding: 0 20rpx;
border-radius: 12rpx;
font-size: 28rpx;
caret-color: $uni-color-success;
}
.voice_title {
text-align: center;
background-color: #ffffff;
height: 80rpx;
line-height: 80rpx;
border-radius: 12rpx;
}
}
.btn {
margin-left: 20rpx;
background-color: $u-type-success;
border: none;
}
}
.fun-box{
opacity: 0;
transition: all 0.1s ease-in-out;
height: 0;
.grid-text{
padding-top: 10rpx;
color: $uni-text-color-grey;
}
}
.show-fun-box{
opacity: 1;
height: 300rpx;
}
}
.input-box-mpInputMargin {
/* #ifdef MP-WEIXIN */
padding-bottom: 0rpx;
/* #endif */
}
.voice_an{
width: 300rpx;
height: 300rpx;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%,-55%);
background-color: rgba(41,41,41,0.7);
color: white;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
border-radius: 10rpx;
.text{
padding-top: 30rpx;
}
@keyframes runVoice{
0%{
height: 10%;
}
20%{
height: 50%;
}
50%{
height: 100%;
}
80%{
height: 50%;
}
100%{
height: 0%;
}
}
.wave{
width:6rpx;
height: 100%;
margin-left: 10rpx;
border-radius: 50rpx;
background-color: #999;
vertical-align: middle;
display: inline-block;
}
.voice_an_icon{
width: 200rpx;
height: 100rpx;
line-height: 50rpx;
margin: 50rpx 0;
}
.voice_an_icon #one{
animation:runVoice 0.6s infinite 0.1s;
}
.voice_an_icon #two{
animation:runVoice 0.6s infinite 0.3s;
}
.voice_an_icon #three{
animation:runVoice 0.6s infinite 0.6s;
}
.voice_an_icon #four{
animation:runVoice 0.6s infinite 0.1s;
}
.voice_an_icon #five{
animation:runVoice 0.6s infinite 0.3s;
}
.voice_an_icon #six{
animation:runVoice 0.6s infinite 0.6s;
}
.voice_an_icon #seven{
animation:runVoice 0.6s infinite 0.1s;
}
}
}

View File

@ -1,259 +1,121 @@
<template> <template>
<view class="concerns"> <view class="concerns">
<view> <view class="tabs-top u-border-bottom">
<u-tabs-swiper ref="uTabs" :list="list" :current="current" @change="tabsChange" :is-scroll="false" <u-tabs ref="uTabs" :show-bar="false" :list="list" font-size="32" :current="current" @change="tabsChange" :is-scroll="false"
swiperWidth="750" active-color="#FF780F"></u-tabs-swiper> swiperWidth="750" active-color="#FF780F"></u-tabs>
</view> </view>
<swiper :current="swiperCurrent" @transition="transition" @animationfinish="animationfinish" style="width:750rpx" :style="{'height':height}"> <scroll-view v-if="current==0" scroll-y style="height: 100%;width: 100%;" class="store" @scrolltolower="onreachBottom">
<swiper-item class="swiper-item" > <storeViwe ref="store"></storeViwe>
</scroll-view>
<scroll-view scroll-y style="height: 100%;width: 100%;" class="store" @scrolltolower="shangjiaapi()"> <scroll-view v-else scroll-y style="height: 100%;width: 100%;" @scrolltolower="onreachBottom">
<view @touchmove.stop=""> <view class="concerns-container">
<u-swipe-action <view v-for="(info, index) in daren" :key="index">
v-for="(item, index) in shangjia" :key="index" <view class="daren-item">
:index='item.friend_tomid' <image class="head" :src="info.friend_tomavatar" @click="toDetailsPage({ id: info.friend_tomid })"></image>
:options="options" <text class="name" @click="toDetailsPage({ id: info.friend_tomid })">{{ info.friend_tomname || '' }}</text>
:show="item.show" <view class="guanzhu" @click="changeType(info.friend_tomid)" v-if="info.friend_followstate == 1">取消关注</view>
@click="removeFavorite"
@open="open"
>
<view class="item u-border-bottom" @click="toDetailsPage(item.friend_store_id)">
<image :src="item.friend_tomavatar"></image>
<!-- 此层wrap在此为必写的否则可能会出现标题定位错误 -->
<view class="title-wrap">
<view class="item-name u-line-1">{{ item.friend_tomname }}</view>
<view class="item-date">
<image src="@/pageE/static/mine/26.png"></image>
<view>{{ item.friend_tomavatar | date }}</view>
</view>
</view>
</view>
</u-swipe-action>
<view style="height:20rpx"></view>
<u-loadmore :status="sstatus" bg-color="#ECECEC" v-if="shangjia.length" />
</view>
<u-empty mode="list" v-if="!shangjia.length" color="#000" img-width="200" font-size="30"></u-empty>
</scroll-view>
</swiper-item>
<swiper-item class="swiper-item" >
<scroll-view scroll-y style="height: 100%;width: 100%;" @scrolltolower="darenapi()">
<view class="concerns-container">
<view v-for="(info, index) in daren" :key="index">
<view class="daren-item">
<image class="head" :src="info.friend_tomavatar" @click="viewDetails({ id: info.friend_tomid, type: info.role })"></image>
<text class="name" @click="viewDetails({ id: info.friend_tomid, type: info.role })">{{ info.friend_tomname || '' }}</text>
<view class="guanzhu" @click="changeType(info.friend_tomid)" v-if="info.friend_followstate == 1">取消关注</view>
</view>
</view>
<u-loadmore :status="dstatus" bg-color="#ECECEC" v-if="daren.length" />
</view> </view>
<u-empty mode="list" v-if="!daren.length" color="#000" img-width="200" font-size="30"></u-empty> </view>
</scroll-view> <u-loadmore :status="loadStatus" bg-color="#FFFFFF" v-if="daren.length > 9" @loadmore="loadmore" />
</swiper-item> </view>
</swiper> <u-empty mode="list" v-if="!daren.length" color="#000" img-width="200" font-size="30" margin-top="200"></u-empty>
</scroll-view>
</view> </view>
</template> </template>
<script> <script>
import storeViwe from './storeConcerns'
export default { export default {
data() { data() {
return { return {
list: [{name:"商家"},{name:"达人"}], list: [{ name: "商家" }, { name: "达人" }],
current: 0, // tabscurrenttab daren: [],
swiperCurrent: 0, // swipercurrentswiper-item
daren:[],
shangjia:[], shangjia:[],
height:0, height: 0,
show: false, show: false,
options: [ current: 0,
{ page: 1,
text: '删除', loadStatus: 'loadmore',
style: { timer: true,
backgroundColor: '#FF3131'
}
}
],
dpage:1,
spage:1,
dstatus: 'loadmore',
sstatus: 'loadmore',
} }
}, },
components: {
storeViwe,
},
onShow() { onShow() {
this.dstatus = "loadmore" this.loadStatus = "loadmore"
this.sstatus = "loadmore" this.page = 1
this.dpage = 1 this.getPeopleList();
this.spage = 1
this.shangjiaapi();
this.darenapi();
}, },
onLoad(){ onLoad(){
let that = this this.setViewHeight();
uni.getSystemInfo({
success(res){
that.height = res.windowHeight - (res.windowWidth / 750 * 80) + 'px'
}
})
}, },
//
methods: { methods: {
setViewHeight() {
const res = uni.getSystemInfoSync();
this.height = res.windowHeight - (res.windowWidth / 750 * 80) + 'px';
},
// tabsswiper // tabsswiper
tabsChange(index) { tabsChange(index) {
this.swiperCurrent = index; this.current = index;
},
// swiper-itemtabs
transition(e) {
let dx = e.detail.dx;
this.$refs.uTabs.setDx(dx);
},
// swiperswiperdx
// swipertabsswiper
animationfinish(e) {
let current = e.detail.current;
this.$refs.uTabs.setFinishCurrent(current);
this.swiperCurrent = current;
this.current = current;
}, },
// scroll-view // scroll-view
onreachBottom() { onreachBottom() {
if(this.current == 0) this.$refs.loadmore();
else if(this.current == 1) this.loadmore();
}, },
shangjiaapi() { loadmore() {
if(this.sstatus == "loading" || this.sstatus == 'nomore') return if(!this.timer) return false;
this.sstatus = "loading" this.timer = false;
this.$forceUpdate(); this.loadStatus = "loading";
this.$u.api.attentionMemberList({role:2,page:this.spage}).then(res => { this.page++;
console.log(res) this.getPeopleList({ load: 'loadmore' }).then(length => {
if(res.errCode == 0) { this.loadStatus = "nomore";
this.spage > 1 ? this.shangjia.push(...res.data.data) : (this.shangjia = res.data.data); if(length == 0) this.page--;
this.sstatus = "loadmore" }).catch(() => {
this.loadStatus = "nomore";
if(res.data.data.length == 0){ this.page--;
this.sstatus = 'nomore'
}
this.spage++
this.$forceUpdate();
}
}) })
}, },
darenapi() { async getPeopleList({ load = 'reload' } = {}) {
this.$u.api.attentionMemberList({role:3,page:this.dpage}).then(res => { const res = await this.$u.api.attentionMemberList({
if(this.dstatus == "loading" || this.dstatus == 'nomore') return role: 3,
this.dstatus = "loading" page: this.page
this.$forceUpdate();
console.log(this.dstatus)
console.log(res)
if(res.errCode == 0) {
this.dpage > 1 ? this.daren.push(...res.data.data) : (this.daren = res.data.data);
this.dstatus = "loadmore"
if(res.data.data.length == 0){
this.dstatus = 'nomore'
}
this.dpage++
this.$forceUpdate();
}
}) })
this.timer = true;
if(res.errCode == 0) {
if(load == 'reload') this.daren = res.data.data;
else if(load == 'loadmore') this.daren.push(...res.data.data);
}
return res.data.data.length;
}, },
viewDetails({ id, type }) { //
let src = type == 3 ? 'pageB/details/index' : 'pageC/merchant/index';
this.$u.route(src, {
id: id
});
},
changeType(id) { changeType(id) {
console.log(id); // console.log(id);
this.$u.api.attentionMember({ this.$u.api.attentionMember({
member_id: id member_id: id
}).then(res => { }).then(res => {
this.$u.toast(res.message); this.$u.toast(res.message);
this.attentionMemberList(); this.getPeopleList();
})
},
removeFavorite(id) {
console.log(id)
this.$u.api.attentionMemberRemove({
id: id,
type: 'store'
}).then(res => {
console.log(res)
this.$u.toast(res.message);
if(res.errCode == 0) {
this.sstatus = "loadmore"
this.spage = 1
this.shangjiaapi();
}
}) })
}, },
toDetailsPage(id) { toDetailsPage(id) {
this.$u.route('pageC/merchant/index', { this.$u.route('pageB/details/index', {
id: id id: id
}); });
}, },
open(index) {
// swipeActionprops
// 'false''false'
this.shangjia[index].show = true;
this.shangjia.map((val, idx) => {
if(index != idx) this.list[idx].show = false;
})
}
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.store {
background-color: #ECECEC;
.item {
padding: 30rpx;
display: flex;
align-items: center;
> image {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
flex-shrink: 0;
margin-right: 21rpx;
}
.title-wrap {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
.item-name {
width: 260rpx;
font-size: 30rpx;
color: rgba(51,51,51,1);
}
.item-date {
display: flex;
align-items: center;
> image {
margin-right: 25rpx;
width: 24rpx;
height: 24rpx;
}
}
}
}
}
.concerns { .concerns {
background-color: #ECECEC; background-color: #FFFFFF;
.store {
background-color: #FFFFFF;
}
.concerns-container { .concerns-container {
padding: 30rpx; padding: 30rpx;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
// &:not(:nth-child(3n)) {
// margin-right: 20rpx;
// }
margin-left: -20rpx; margin-left: -20rpx;
.daren-item{ .daren-item{
width: 215rpx; width: 215rpx;

View File

@ -0,0 +1,176 @@
<template>
<view class="collection-item">
<u-swipe-action
v-for="(item, index) in list" :key="index"
:index='index'
:show="item.show"
:options="options"
@click="removeFavorite"
@open="open"
>
<view class="item u-border-bottom" @click="viewStoreDetails(item)">
<image :src="item.friend_tomavatar"></image>
<!-- 此层wrap在此为必写的否则可能会出现标题定位错误 -->
<view class="title-wrap">
<view class="item-top u-line-1">{{ item.friend_tomname }}</view>
<view class="item-bottom">
<view class="item-date">
<image src="@/pageE/static/mine/26.png"></image>
<view>{{ item.friend_tomavatar | date }}</view>
</view>
</view>
</view>
</view>
</u-swipe-action>
<u-empty mode="list" v-if="!list.length" color="#000" img-width="200" font-size="30" margin-top="200"></u-empty>
<u-loadmore :status="loadStatus" bg-color="#FFFFFF" v-if="list.length > pageSize" @loadmore="loadmore" />
</view>
</template>
<script>
export default {
data() {
return {
pageSize: 12,
list: [],
options: [
{
text: '删除',
style: {
backgroundColor: '#FF3131'
}
}
],
page: 1,
timer: true,
loadStatus: 'loadmore',
}
},
mounted() {
this.getStoreList();
},
methods: {
viewStoreDetails(item) {
if(this.closeAction()) return false;
// console.log(this.list);
const list = this.list.filter(item => {
return item.show;
})
if(list.length) return false;
this.$u.route({
url: 'pageC/merchant/index',
params: {
id: item.friend_store_id,
}
})
},
async getStoreList({ load = 'reload' } = {}) {
const res = await this.$u.api.attentionMemberList({
role: 2,
page: this.page
})
this.timer = true;
if(res.errCode == 0) {
if(load == 'reload') this.list = res.data.data;
else if(load == 'loadmore') this.list.push(...res.data.data);
}
this.list.forEach(item => {
Object.assign(item, { show: false });
})
// console.log(this.list);
return res.data.data.length;
},
loadmore() {
if(!this.timer) return false;
this.timer = false;
this.loadStatus = "loading";
this.page++;
let promise;
promise = this.getStoreList({ load: 'loadmore' });
promise.then(length => {
this.loadStatus = "nomore";
if(length == 0) this.page--;
}).catch(() => {
this.loadStatus = "nomore";
this.page--;
})
},
removeFavorite(index) {
const id = this.list[index].friend_tomid;
this.$u.api.attentionMemberRemove({
id: id,
type: 'store'
}).then(res => {
if(res.errCode == 0) {
this.getStoreList();
} else {
this.$u.toast(res.message);
}
})
},
closeAction() {
let status = false;
this.list.map((val, idx) => {
if(val.show) {
status = true;
this.$set(this.list[idx], 'show', false);
};
})
this.$forceUpdate();
return status;
},
open(index) {
console.log(index);
// swipeActionprops
// 'false''false'
this.list[index].show = true;
this.list.map((val, idx) => {
if(index != idx) this.list[idx].show = false;
})
this.$forceUpdate();
}
},
};
</script>
<style lang="scss" scoped>
.collection-item {
background-color: #ffffff;
.item {
padding: 30rpx;
display: flex;
> image {
width: 180rpx;
height: 160rpx;
border-radius: 10rpx;
margin-right: 30rpx;
flex-shrink: 0;
}
.title-wrap {
flex: 1;
.item-top {
font-size: 30rpx;
color: rgba(51,51,51,1);
line-height: 44rpx;
margin-bottom: 54rpx;
}
.item-bottom {
display: flex;
align-items: center;
justify-content: space-between;
.item-price {
font-size: 30rpx;
color: rgba(51,51,51,1);
}
.item-date {
display: flex;
align-items: center;
> image {
margin-right: 25rpx;
width: 24rpx;
height: 24rpx;
}
}
}
}
}
}
</style>

View File

@ -1,11 +1,11 @@
<template> <template>
<view class="setting"> <view class="setting">
<view class="list-item"> <!-- <view class="list-item">
<view>消息提醒</view> <view>消息提醒</view>
<view> <view>
<u-switch v-model="checked" active-color="#FF770F" inactive-color="#A9A7A7" size="35"></u-switch> <u-switch v-model="checked" active-color="#FF770F" inactive-color="#A9A7A7" size="35"></u-switch>
</view> </view>
</view> </view> -->
<view v-for="(item, index) in settingList" :key="index" class="list-item" @click="toNextPage(item.link)"> <view v-for="(item, index) in settingList" :key="index" class="list-item" @click="toNextPage(item.link)">
<view>{{ item.title }}</view> <view>{{ item.title }}</view>
<image src="../static/mine/21.png"></image> <image src="../static/mine/21.png"></image>

View File

@ -5,17 +5,15 @@
<view class="feedback-itme"> <view class="feedback-itme">
<view class="manual"> <view class="manual">
<view class="service-phone">拨打官方客服电话400-100-100</view> <view class="service-phone">拨打官方客服电话400-100-100</view>
<view class="manual-time">周一至周五08:0-18:00</view> <view class="manual-time">{{ wkTime }}</view>
</view> </view>
<view class="suggestions">意见反馈</view> <view class="suggestions" @click="writeComments">意见反馈</view>
</view> </view>
</view> </view>
<view class="feedback-box"> <view class="feedback-box">
<view class="feedback-title">常见服务</view> <view class="feedback-title">常见服务</view>
<view class="feedback-itme"> <view class="feedback-itme">
<view class="u-line-2">账号问题登录时需要验证码手机号使用不了怎么办</view> <view class="u-line-2" v-for="item in helpList" :key="item.id" @click="viewAnswer(item)">{{ item.question }}</view>
<view class="u-line-2">账号问题登录时需提示您的密码不安全请重置</view>
<view class="u-line-2">账号问题登录密码忘记了怎么办</view>
</view> </view>
</view> </view>
</view> </view>
@ -23,7 +21,32 @@
<script> <script>
export default { export default {
data() { data() {
return {} return {
helpList: [],
wkTime: '',
tel400: '',
}
},
onLoad() {
this.getHelpList();
},
methods: {
viewAnswer(item) {
this.$store.commit('setQuestion', item);
this.$u.route('pageE/setting/question');
},
getHelpList() {
this.$u.api.getSettingHelpList().then(res => {
this.helpList = res.data.QA;
this.tel400 = res.data.tel400;
this.wkTime = res.data.wkTime;
})
},
writeComments() {
uni.navigateTo({
url: '/pageE/more/WriteComments'
});
}
} }
}; };
</script> </script>

View File

@ -0,0 +1,51 @@
<template>
<view class="question">
<view class="public-view quest">
<view class="title qt">Q:</view>
<view class="qa">{{ item.question }}</view>
</view>
<view class="public-view answer">
<view class="title at">A:</view>
<view>
<rich-text :nodes="nodes"></rich-text>
</view>
</view>
</view>
</template>
<script>
import common from '@/static/js/common.js'
export default {
data() {
return {
item: {},
nodes: ''
}
},
onLoad() {
this.item = this.$store.state.question;
console.log(this.item);
this.nodes = common.unescapeHTML(this.item.answer);
}
};
</script>
<style lang="scss" scoped>
.question {
min-height: calc(100vh - var(--window-top));
background: #FFFFFF;
padding: 20rpx 30rpx;
.public-view {
display: flex;
margin-bottom: 40rpx;
.title {
font-size: 36rpx;
margin-right: 20rpx;
}
.at {
color: #ff780f;
}
.qa {
line-height: 36rpx;
}
}
}
</style>

View File

@ -845,7 +845,6 @@
{ {
"path": "mine/MineConcerns", "path": "mine/MineConcerns",
"style": { "style": {
"enablePullDownRefresh": true,
"navigationBarTitleText": "我的关注", "navigationBarTitleText": "我的关注",
"app-plus": { "app-plus": {
"titleSize": "36px", "titleSize": "36px",
@ -861,10 +860,9 @@
"style": { "style": {
"navigationBarTitleText": "勋章介绍", "navigationBarTitleText": "勋章介绍",
"app-plus": { "app-plus": {
"type": "transparent",
"titleSize": "36px", "titleSize": "36px",
"titleNView": { "titleNView": {
"backgroundColor": "rgba(255,255,255,0)", "type": "transparent",
"titleColor": "#ffffff" "titleColor": "#ffffff"
} }
} }
@ -968,6 +966,19 @@
} }
} }
}, },
{
"path": "setting/question",
"style": {
"navigationBarTitleText": "常见问题",
"app-plus": {
"titleSize": "36px",
"titleNView": {
"titleColor": "#333333",
"backgroundColor": "#FFFFFF"
}
}
}
},
{ {
"path": "setting/ShieldUsers", "path": "setting/ShieldUsers",
"style": { "style": {

View File

@ -222,7 +222,6 @@
import zhiboItem from "@/components/index/zhibo-item/index" import zhiboItem from "@/components/index/zhibo-item/index"
import indexad from "@/components/index/ad/index" import indexad from "@/components/index/ad/index"
import darenItem from "@/components/index/daren-item/index" import darenItem from "@/components/index/daren-item/index"
import chatVue from '../../pageD/chat/chat.vue'
export default { export default {
name: "index", name: "index",
@ -266,14 +265,14 @@ import chatVue from '../../pageD/chat/chat.vue'
onShow() { onShow() {
this.page = 1; this.page = 1;
if (this.page != 1) { if (this.page != 1) {
this.articleList = [];
} }
this.getArticlelist();
// if (this.hasLogin) { // if (this.hasLogin) {
// this.isNewmembervoucher(); // this.isNewmembervoucher();
// } // }
}, },
async onLoad(){ async onLoad(){
this.articleList = [];
this.getArticlelist();
this.getSwiper(); this.getSwiper();
// //
if(this.$store.state.hasLogin){ if(this.$store.state.hasLogin){
@ -402,16 +401,18 @@ import chatVue from '../../pageD/chat/chat.vue'
} }
} }
}, },
// //
getArticlelist() { getArticlelist() {
uni.showLoading({ if (this.page > 1) {
title: "loading..." uni.showLoading({
}) title: "loading..."
})
}
this.$u.api.getArticlelist({ this.$u.api.getArticlelist({
page: this.page, page: this.page,
is_video_img: 0, // 1 2 0 is_video_img: 0, // 1 2 0
}).then(res => { }).then(res => {
// uni.stopPullDownRefresh(); uni.stopPullDownRefresh();
this.status = "loading"; this.status = "loading";
if (res.errCode == 0) { if (res.errCode == 0) {
uni.hideLoading(); uni.hideLoading();