Browse Source

Merge remote-tracking branch 'origin/feature-1.1-dev' into feature-1.1-dev

feature-1.1-dev
Penny 3 years ago
parent
commit
e1068737cf
  1. 4
      pages/ai/paint/paint.vue
  2. 24
      pages/userInfo/userInfo.vue
  3. 155
      pages/userInfo/vip/MemberScroll.vue
  4. 265
      pages/userInfo/vip/vip.vue
  5. 42
      static/icon/iconfont.css
  6. BIN
      static/icon/iconfont.ttf

4
pages/ai/paint/paint.vue

@ -134,7 +134,7 @@
<button type="default" @click="$noMultipleClicks(startPaint)" class="startPaint">开始创作<br/>消耗{{formData.goldNum}}点画意值</button>
</view> -->
<view class="startPaint" @click="$noMultipleClicks(startPaint)">
开始创作<br/>消耗({{formData.goldNum}}点画意值)
开始创作<br/><span :style="{fontSize: '12px'}">消耗({{formData.goldNum}}点画意值)</span>
</view>
</view>
</uni-forms>
@ -270,7 +270,7 @@
content: '点击确定解锁更多权益哟~',
cancelText: '狠心拒绝',
cancelColor: '#ff0000',
confirmColor: '#0000ff',
confirmColor: '#1a94bc',
confirmText: '立刻前往',
success(res){
if (res.confirm) {

24
pages/userInfo/userInfo.vue

@ -7,11 +7,13 @@
<image :src="userInfo.img" mode=""></image>
</view>
<view class="right">
<view class="username" v-if="userInfo.username">
{{userInfo.username}}
<uni-icons class="vip-icon" custom-prefix="iconfont" type="icon-VIP" size="14" :color="isVip === true ? primaryColor : noVipColor "/>
<br/>画意值{{goldNum}}
</view>
<view v-if="userInfo.username">
<view class="username">
{{userInfo.username}}
<uni-icons class="vip-icon" custom-prefix="iconfont" type="icon-VIP" size="14" :color="isVip === true ? primaryColor : noVipColor "/>
</view>
<view class="gold-info">画意值{{goldNum}}</view>
</view>
<view class="login-btn uni-primary" v-else @click="$noMultipleClicks(getUserInfoLogin)">点击登录</view>
</view>
</view>
@ -25,7 +27,7 @@
</view>
</view>
<view class="prominent-menu-item collect-menu" @click="toLinkAuth('/pages/userInfo/aiPaint/aiPaint')">
<view class="prominent-menu-title">创作工坊</view>
<view class="prominent-menu-title">我的创作</view>
<view class="prominent-menu-icon">
<uni-icons custom-prefix="iconfont" type="icon-chuangzuozhongxin" size="40" :color="primaryColor" />
</view>
@ -38,12 +40,12 @@
<uni-icons class="list-menu-genduo" custom-prefix="iconfont" type="icon-gengduo"></uni-icons>
</view>
<view class="list-menu-item" @click="toLink()">
<uni-icons class="list-menu-icon" custom-prefix="iconfont" type="icon-gengduo" size="20" :color="primaryColor" />
<uni-icons class="list-menu-icon" custom-prefix="iconfont" type="icon-huabi1" size="20" :color="primaryColor" />
<view class="text">画意值记录</view>
<uni-icons class="list-menu-genduo" custom-prefix="iconfont" type="icon-gengduo"></uni-icons>
</view>
<view class="list-menu-item" @click="$noMultipleClicks(useCdk)">
<uni-icons class="list-menu-icon" custom-prefix="iconfont" type="icon-gengduo" size="20" :color="primaryColor" />
<uni-icons class="list-menu-icon" custom-prefix="iconfont" type="icon-xunhuanjiagongcishu" size="20" :color="primaryColor" />
<view class="text">兑换绘画次数</view>
<uni-icons class="list-menu-genduo" custom-prefix="iconfont" type="icon-gengduo"></uni-icons>
</view>
@ -402,6 +404,12 @@ import UniIcons from "../../uni_modules/uni-icons/components/uni-icons/uni-icons
}
}
.gold-info {
font-size: 24rpx;
line-height: 32rpx;
color: $uni-base-color;
}
}
}
}

155
pages/userInfo/vip/MemberScroll.vue

@ -0,0 +1,155 @@
<template>
<view class="member-scroll">
<view class="member-item" v-for="(item, index) in memberList" :key="index">
<text class="member-name">{{ encryptString(item.name) }}</text>
<text class="member-time">{{ calculateTimeDifference(item.time) }}</text>
<text class="member-info">购买了{{ item.duration }}个月{{ item.vipName }}</text>
</view>
</view>
</template>
<script>
export default {
name: "MemberScroll",
data() {
return {
memberList: []
}
},
created() {
this.generateMemberList();
this.startAutoScroll();
},
methods: {
generateMemberList() {
const names = [
'张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十',
'郑十一', '王十二', '陈十三', '杨十四', '朱十五', '秦十六', '许十七', '何十八'
];
const currentDateTime = new Date();
const memberCount = Math.floor(Math.random() * 6) + 5; // 5-10
for (let i = 0; i < memberCount; i++) {
const randomName = this.generateRandomName(names);
const randomDateTime = this.generateRandomDateTime(currentDateTime);
const member = {
name: randomName,
time: randomDateTime,
duration: Math.floor(Math.random() * 12) + 1,
vipName: "全站VIP权益"
};
this.memberList.push(member);
}
},
generateRandomName(names) {
const randomIndex = Math.floor(Math.random() * names.length);
const randomName = names[randomIndex];
names.splice(randomIndex, 1); // 使
return randomName;
},
padZero(num) {
return num.toString().padStart(2, '0');
},
formatDateTime(date) {
const year = date.getFullYear();
const month = this.padZero(date.getMonth() + 1);
const day = this.padZero(date.getDate());
const hours = this.padZero(date.getHours());
const minutes = this.padZero(date.getMinutes());
const seconds = this.padZero(date.getSeconds());
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
generateRandomDateTime(currentDateTime) {
//
const twoHoursAgo = currentDateTime.getTime() - 2 * 60 * 60 * 1000;
//
const randomTimestamp = Math.floor(Math.random() * (currentDateTime.getTime() - twoHoursAgo)) + twoHoursAgo;
// Date
const randomDate = new Date(randomTimestamp);
return this.formatDateTime(randomDate);
},
calculateTimeDifference(dateString) {
const currentDate = new Date(); //
const targetDate = new Date(dateString); //
const timeDifference = Math.floor((currentDate - targetDate) / (1000 * 60)); //
if (timeDifference >= 60) {
const hours = Math.floor(timeDifference / 60); //
return `${hours}小时前`;
} else {
return `${timeDifference}分钟前`;
}
},
startAutoScroll() {
setInterval(() => {
const firstItem = this.memberList.shift();
this.memberList.push(firstItem);
}, 3000);
},
encryptString(str) {
if (!str || str.length <= 1) {
return "***";
}
let firstTwoChars = '';
if (str.length <= 2) {
firstTwoChars = str.substring(0, 1);
} else {
firstTwoChars = str.substring(0, 2); //
}
return firstTwoChars + "***";
}
}
}
</script>
<style lang="scss" scoped>
.member-scroll {
height: 120rpx;
overflow: hidden;
font-size: 24rpx;
.member-item:first-child {
opacity: 1;
}
.member-item:nth-child(2) {
opacity: 1;
}
}
.member-item {
display: flex;
flex-wrap: nowrap;
overflow: hidden;
align-items: center;
margin-bottom: 10rpx;
font-weight: 400;
opacity: 0.5;
}
.member-name {
margin-right: 10rpx;
}
.member-time {
margin-right: 10rpx;
}
</style>

265
pages/userInfo/vip/vip.vue

@ -1,43 +1,82 @@
<template>
<view class="container">
<view class="header">
<view class="vip-info">
<image :src="userInfo.img" mode="" class="vip-info__avatar"></image>
<view>
<view class="vip-info__name">{{userInfo.username}}</view>
<view class="vip-info__tips" v-if="vipInfo.isVip == '0'">你还不是会员,开通立享 9 项特权</view>
<view class="vip-info__tips" v-if="vipInfo.isVip == '1'">您的会员为{{vipInfo.vipName}}</view>
<view class="vip-info__tips" v-if="vipInfo.isVip == '1'">到期时间为{{vipInfo.endTime}}</view>
</view>
</view>
<view class="vip-explan" v-if="vipInfo.isVip == '0'">
会员说明
<uni-icons type="help" size="20" color="#eee" @click="openIntro()"/>
</view>
</view>
<view class="vip-box">
<view class="vip-box__item" :class="{'item-active':active == index}" @click="change(index)"
v-for="(item,index) in vipList" :key="index">
<view class="title">
{{item.vipName}}
</view>
<view class="price">
<text class="price-unit">¥</text> {{item.price}}
</view>
<view class="o-price">
{{item.originPrice}}
</view>
<view class="save-box">
立省{{item.originPrice - item.price}}
</view>
</view>
</view>
<button class="sumbit-btn" @click="openVip" :disabled="disabled">
立即开通
</button>
</view>
<view >
<view class="container">
<view class="header">
<view class="vip-info">
<image :src="userInfo.img" mode="" class="vip-info__avatar"></image>
<view>
<view class="vip-info__name">{{userInfo.username}}</view>
<view class="vip-info__tips" v-if="vipInfo.isVip == '0'">你还不是会员,开通立享 9 项特权</view>
<view class="vip-info__tips" v-if="vipInfo.isVip == '1'">您的会员为{{vipInfo.vipName}}</view>
<view class="vip-info__tips" v-if="vipInfo.isVip == '1'">到期时间为{{vipInfo.endTime}}</view>
</view>
</view>
<view class="vip-explan" v-if="vipInfo.isVip == '0'">
会员说明
<uni-icons type="help" size="20" color="#eee" @click="openIntro()"/>
</view>
</view>
<view class="vip-box">
<view class="vip-box__item" :class="{'item-active':active == index}" @click="change(index)"
v-for="(item,index) in vipList" :key="index">
<view class="title">
{{item.vipName}}
</view>
<view class="price">
<text class="price-unit">¥</text> {{item.price}}
</view>
<view class="o-price">
{{item.originPrice}}
</view>
<view class="save-box">
立省{{item.originPrice - item.price}}
</view>
</view>
</view>
<button class="sumbit-btn" @click="openVip" :disabled="disabled">
立即开通
</button>
<view class="opened-member-info">
<view class="member-info-title">他们已经享受了会员权益</view>
<MemberScroll />
</view>
<view class="member-benefits">
<view class="benefits-title title">会员权益</view>
<view class="benefits-list">
<view class="benefits-item" v-for="item in memberBenefits" >
<view class="benefits-icon-div" :style="{backgroundColor: item.bgColor}">
<uni-icons class="benefits-icon" custom-prefix="iconfont" :type="item.icon" size="22" :color="item.iconColor" ></uni-icons>
</view>
<view class="benefits-info">
<view class="benefits-name">{{ item.info }}</view>
<view class="benefits-description">{{ item.description }}</view>
</view>
</view>
</view>
</view>
</view>
<view class="purchase-instructions instructions">
<view class="instructions-title title">购买须知</view>
<view class="ul">
<view class="li" v-for="item in purchaseList">
<view class="point">·</view>
<view class="content">{{ item }}</view>
</view>
</view>
</view>
<view class="auto-renewal-instructions instructions">
<view class="instructions-title title">自动续费说明</view>
<view class="ul">
<view class="li" v-for="item in autoRenewalList">
<view class="point">·</view>
<view class="content">{{ item }}</view>
</view>
</view>
</view>
</view>
</template>
<script>
@ -47,14 +86,40 @@
unifiedOrder
} from '@/api/userInfo.js'
import {checkVip} from '@/api/paint.js'
import MemberScroll from "./MemberScroll";
export default {
components: {MemberScroll},
data() {
return {
userInfo: null,
vipList: [],
active: 0,
disabled: false,
vipInfo: undefined
vipInfo: undefined,
memberBenefits: [
{icon: "icon-wuguanggao", iconColor: "#b07838", bgColor: "#fbefc5", info: "免看全部广告", description: "无需看广告解锁,直接用"},
{icon: "icon-biaoqing", iconColor: "#d58859", bgColor: "#fae1d8", info: "千万表情免费用", description: "超全超有趣的表情库,海量表情免费用"},
{icon: "icon-shuazi", iconColor: "#667dc9", bgColor: "#d5e2e9", info: "独享VIP素材", description: "万张热门表情模板等你diy"},
{icon: "icon-tupian", iconColor: "#9474c3", bgColor: "#e7d7fb", info: "专属VIP板块", description: "让你成为斗图届的王者"},
{icon: "icon-tupianliebiao", iconColor: "#d68353", bgColor: "#f4e1d3", info: "专辑一键保存", description: "轻松下载专辑内所有图"},
{icon: "icon-zuanshi", iconColor: "#9e7438", bgColor: "#fbefc5", info: "尊贵身份", description: "专属会员身份标识"},
{icon: "icon-neirongguanli", iconColor: "#916bd4", bgColor: "#e7d7f7", info: "每周精选内容推送", description: "热点再也不会错过啦"},
{icon: "icon-weixin", iconColor: "#6eae9c", bgColor: "#d5ebec", info: "微信小程序互通", description: "意境小程序自动同步权益"},
{icon: "icon-jingqingqidai", iconColor: "#d5d5d7", bgColor: "#f2f3f5", info: "敬请期待", description: "更多精彩权益"},
],
purchaseList: [
"意境会员下载的全部内容,仅限个人使用,禁止商用。",
"会员市场可以叠加购买,续费后过期时间顺延",
"会员购买时立即生效,会员生效时常为购买时间加购买时长,比如您在2020年5月1日12点30分购买了一个月会员 (31天),则在2020年6月1日12点31分期",
"会员权益会在会员到期后失效,但是使用会员权益添加并未删除的部分内容可以继续使用",
"购买会员后不支持退款",
],
autoRenewalList: [
"付款:用户确认购买并付款后记入iTunes账户;",
"续费:苹果账户iTunes账户会在到期前24小时内扣费,扣费成功后订阅周期顺延一个订阅周期;",
"取消续订: 如需取消续订,请在订阅周期到期前24小时之前,手动在iTunes/AppleID设置管理中关闭自动续费功能,如到期前24小时内取消,依然会自动扣款再订阅一个周期。",
]
}
},
methods: {
@ -103,7 +168,7 @@
orderNo,
sceneCode: 1,
payType: 'dypay',
})
})
let {orderId,orderToken} = res_uni.data.data.dyThirdInOrderVo
this.tikPay(orderId,orderToken)
@ -118,12 +183,12 @@
success(res) {
if (res.code == 0) {
}
uni.hideLoading();
}
uni.hideLoading();
this.disabled = false
},
fail(res) {
uni.hideLoading();
uni.hideLoading();
this.disabled = false
},
})
@ -160,6 +225,7 @@
.container {
padding: 30rpx;
background: #fff;
border-radius: 0 0 60rpx 60rpx;
.vip-box {
margin: 30px 0;
@ -279,5 +345,114 @@
}
}
}
.opened-member-info {
background-color: $uni-primary-20;
padding: 20rpx;
margin: 20rpx auto;
border-radius: 10rpx;
color: $uni-primary;
.member-info-title {
font-size: 24rpx;
margin-bottom: 20rpx;
font-weight: 600;
}
}
.member-benefits {
.benefits-title {
}
.benefits-list {
display: flex;
flex-wrap: wrap;
.benefits-item {
height: 120rpx;
width: 50%;
display: flex;
align-items: center;
.benefits-icon-div {
height: 80rpx;
width: 80rpx;
border-radius: 40rpx;
flex-shrink: 0;
text-align: center;
line-height: 80rpx;
margin-right: 20rpx;
.benefits-icon {
}
}
.benefits-info {
height: 120rpx;
.benefits-name {
margin-top: 12rpx;
font-size: 28rpx;
line-height: 48rpx;
}
.benefits-description {
font-size: 20rpx;
line-height: 32rpx;
color: $uni-base-color;
}
}
}
}
}
}
</style>
.title {
font-size: 40rpx;
margin-bottom: 20rpx;
}
.purchase-instructions {
padding: 30rpx;
}
.auto-renewal-instructions {
padding: 30rpx;
}
.instructions {
.ul {
.li {
display: flex;
color: $uni-base-color;
font-size: 24rpx;
line-height: 36rpx;
margin-bottom: 10rpx;
.point {
width: 30rpx;
text-align: center;
flex-shrink: 0;
}
.content {
}
}
}
}
</style>

42
static/icon/iconfont.css

@ -1,6 +1,6 @@
@font-face {
font-family: "iconfont"; /* Project id 3946003 */
src: url('/static/icon/iconfont.ttf?t=1684048739520') format('truetype');
src: url('/static/icon/iconfont.ttf?t=1684580762824') format('truetype');
}
.iconfont {
@ -11,6 +11,46 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-huabi1:before {
content: "\e61a";
}
.icon-xunhuanjiagongcishu:before {
content: "\e600";
}
.icon-tupianliebiao:before {
content: "\e61c";
}
.icon-shuazi:before {
content: "\e65e";
}
.icon-zuanshi:before {
content: "\e728";
}
.icon-jingqingqidai:before {
content: "\e618";
}
.icon-wuguanggao:before {
content: "\e69a";
}
.icon-biaoqing:before {
content: "\e619";
}
.icon-weixin:before {
content: "\e8bc";
}
.icon-neirongguanli:before {
content: "\e683";
}
.icon-VIP:before {
content: "\e68e";
}

BIN
static/icon/iconfont.ttf

Binary file not shown.
Loading…
Cancel
Save