This commit is contained in:
2021-09-29 17:27:04 +08:00
219 changed files with 1167 additions and 853 deletions

15
App.vue
View File

@@ -1,7 +1,19 @@
<script> <script>
export default { export default {
onLaunch: function() { onLaunch: function() {
console.log('App Launch') if (typeof WeixinJSBridge == 'object' && typeof WeixinJSBridge.invoke == 'function') {
handleFontSize();
} else {
document.addEventListener('WeixinJSBridgeReady', handleFontSize, false);
}
function handleFontSize() {
// 设置网页字体为默认大小
WeixinJSBridge.invoke('setFontSizeCallback', { fontSize: 0 });
// 重写设置网页字体大小的事件
WeixinJSBridge.on('menu:setfont', function() {
WeixinJSBridge.invoke('setFontSizeCallback', { fontSize: 0 });
});
}
}, },
onShow: function() { onShow: function() {
console.log('App Show') console.log('App Show')
@@ -15,6 +27,7 @@
<style> <style>
page{ page{
background: #F5F5F5; background: #F5F5F5;
-webkit-text-size-adjust: 100% !important;
} }
</style> </style>

View File

@@ -9,11 +9,10 @@ import store from '@/store'
// 基础配置 // 基础配置
const config = { const config = {
// apiUrl : 'https://oapi.lianshang.vip/api/',
// apiUrls : 'https://oapi.lianshang.vip/',
apiUrl : 'http://api.ahxh.shangkelian.cn/api/', apiUrl : 'http://api.ahxh.shangkelian.cn/api/',
apiUrls : 'http://api.ahxh.shangkelian.cn/', apiUrls : 'http://api.ahxh.shangkelian.cn/',
// apiUrl : 'http://api.ahxh.shangkelian.cn/api/',
// apiUrls : 'http://api.ahxh.shangkelian.cn/',
timeout : 60000 timeout : 60000
} }
@@ -34,9 +33,6 @@ const request = (parameter) => {
'Accept': 'application/json', 'Accept': 'application/json',
'Authorization': store.getters.getToken || '' 'Authorization': store.getters.getToken || ''
} }
// console.log('parameterDbug', parameter)
// 加载提示 // 加载提示
uni.showLoading({ uni.showLoading({
title: '加载中', title: '加载中',

View File

@@ -25,9 +25,10 @@ const vipOrder = (id, data) =>{
} }
// 开通会员微信支付 // 开通会员微信支付
const vipWechatPay = id => { const vipWechatPay = (id, data) => {
return request({ return request({
url : 'user/identities/pay/' + id + '/wechat' url: 'user/identities/pay/' + id + '/wechat',
data
}) })
} }

View File

@@ -9,13 +9,32 @@
import { request } from '../index' import { request } from '../index'
// 微信配置信息
const wxConfig = data => { const wxConfig = data => {
return request({ return request({
url : 'user/auth/get_jssdk', url: 'user/auth/get_jssdk',
data : data data
})
}
// 鉴权转跳地址
const wxCode = data => {
return request({
url: 'user/auth/get_auth_url',
data
})
}
// 获取openid
const wxOpenid = data => {
return request({
url: 'user/auth/get_openid',
data
}) })
} }
export { export {
wxConfig wxConfig,
wxCode,
wxOpenid
} }

View File

@@ -0,0 +1,18 @@
export default function h5Copy(content) {
if (!document.queryCommandSupported('copy')) {
// 不支持
return false
}
let textarea = document.createElement("textarea")
textarea.value = content
textarea.readOnly = "readOnly"
document.body.appendChild(textarea)
textarea.select() // 选择对象
textarea.setSelectionRange(0, content.length) //核心
let result = document.execCommand("copy") // 执行浏览器复制命令
textarea.remove()
return result
}

View File

@@ -332,6 +332,10 @@
}, },
"name": "withdrawList", "name": "withdrawList",
"aliasPath": "/wallet/withdraw/list" "aliasPath": "/wallet/withdraw/list"
}, {
"path" : "pages/wxAuth/wxAuth",
"name" : "wxAuth",
"aliasPath": "/wechat-auth"
} }
], ],
"globalStyle": { "globalStyle": {

View File

@@ -321,6 +321,8 @@
width: 100%; width: 100%;
text-align: center; text-align: center;
margin-top: -50rpx; margin-top: -50rpx;
position: relative;
z-index: 2;
.signBtn-go { .signBtn-go {
width: 100%; width: 100%;
line-height: 100rpx; line-height: 100rpx;

View File

@@ -57,9 +57,6 @@
} }
}, },
onShow(){ onShow(){
console.log(this.$Route)
this.parentId = this.$Route.query.invite || '' this.parentId = this.$Route.query.invite || ''
}, },
methods: { methods: {

View File

@@ -1,88 +1,90 @@
<template> <template>
<!-- v-if="loaded" --> <view class="content" v-if="loaded">
<view class="content">
<view class="code"> <view class="code">
<swiper class="code-swiper" previous-margin="70rpx" next-margin="70rpx"> <swiper class="code-swiper" previous-margin="70rpx" next-margin="70rpx" @change="swiperChange">
<swiper-item> <swiper-item v-for="(item, index) in inviteData" :key="index">
<view class="code-item"> <view class="code-item">
<image class="code-back-image" src="@/static/dev/WechatIMG9663.png" mode="aspectFill"></image> <image class="code-back-image" :src="item.cover" mode="aspectFill"></image>
<view class="codDate"> <view class="codDate">
<view class="codDate-year"> <view class="codDate-year">
2020.09 {{item.date.solar.month}}
</view> </view>
<view class="codDate-day"> <view class="codDate-day">
02 {{item.date.solar.day}}
</view> </view>
<view class="codDate-lunar"> <view class="codDate-lunar">
农历八月二十 {{item.date.lunar}}
</view> </view>
</view> </view>
<view class="codeCont"> <view class="codeCont">
<image class="codeCont-avatar" src="@/static/user/user-portrait.png" mode="aspectFill"></image> <image class="codeCont-avatar" :src="item.user_info.avatar ? item.user_info.avatar : '/static/user/user-portrait.png'" mode="aspectFill"></image>
<view class="codeCont-text"> <view class="codeCont-text">
<view class="codeCont-name"> <view class="codeCont-name">
唐明明 {{item.user_info.nickname}}
</view> </view>
<view class="codeCont-number"> <view class="codeCont-number">
邀请码 邀请码{{item.invite}}
<view class="codeBack-number" @click="copyCenter(inviteData.invite)">
21321321
</view> </view>
</view> </view>
<image class="codeCont-img" :src="item.code" mode="widthFix"></image>
</view> </view>
</view> </view>
<view class="codeImg">
<image class="codeImg-code" mode="widthFix"></image>
<view class="codeImg-name">长按识别</view>
</view>
</view>
</swiper-item>
<swiper-item>
<view class="code-item">
<image class="code-back-image" src="@/static/dev/WechatIMG9663.png" mode="aspectFill"></image>
</view>
</swiper-item>
<swiper-item>
<view class="code-item">
<image class="code-back-image" src="@/static/dev/WechatIMG9663.png" mode="aspectFill"></image>
</view>
</swiper-item> </swiper-item>
</swiper> </swiper>
</view> </view>
<view class="footer"> <view class="footer">
<view class="hith">朋友通过你的邀请注册成功后将与您绑定好友关系通过成为平台用户你都可以获得能量碎片奖励</view> <view class="hith">朋友通过你的邀请注册成功后将与您绑定好友关系通过成为平台用户你都可以获得能量碎片奖励</view>
<view class="number"> <view class="number">
<view class="title">邀请码</view> <view class="title">邀请码 : {{inviteData[0].invite}}</view>
<view class="value">2173978217389729</view> <view class="value" @click="copyCenter(inviteData[0].invite)">复制邀请码</view>
</view>
<view class="button" @click="coverCode">生成分享海报</view>
</view>
<canvas class="my-canvas" canvas-id="myCanvas" id="myCanvas"/>
<view v-if="posterShow">
<view class="posterBack"></view>
<view class="poster">
<view class="poster-img">
<image class="img" :src="posterImg" mode="widthFix" />
</view>
<view class="poster-btn">
<view class="operate">长按图片保存</view>
<view class="operate operate-cancel" @tap="posterShow = false">确定</view>
</view> </view>
<view class="button">
<view class="title" @click="coverCode">生成分享海报</view>
</view> </view>
</view> </view>
<canvas canvas-id="myCanvas"></canvas>
</view> </view>
</template> </template>
<script> <script>
import { userInvite } from '@/apis/interfaces/user' import { userInvite } from '@/apis/interfaces/user'
import { saveImageToPhotosAlbum, showToast, downloadFile } from '@/uni_modules/sakura-canvas/js_sdk/util'
import Draw from '@/uni_modules/sakura-canvas/js_sdk/draw' import Draw from '@/uni_modules/sakura-canvas/js_sdk/draw'
import h5Copy from '@/js_sdk/junyi-h5-copy/junyi-h5-copy/junyi-h5-copy'
let draw = null
export default { export default {
data() { data() {
return { return {
inviteData: {} ,//二维码信息 Popinvite : {}, //下载海报数据
loaded : false inviteData: [] ,//二维码信息
codeIndex : 0,
posterImg : '',
defaultImg: '/static/dev/WechatIMG9663.png',
loaded : false,
posterShow: false
}; };
}, },
onLoad() { onLoad() {
// 获取二维码 // 获取二维码
// this.inviteInfo() this.inviteInfo()
}, },
async created() {},
methods:{ methods:{
// 二维码 // 二维码
inviteInfo(){ inviteInfo(){
userInvite().then(res => { userInvite().then(res => {
this.inviteData = res
this.loaded = true this.loaded = true
this.inviteData = res
}).catch(err => { }).catch(err => {
uni.showToast({ uni.showToast({
icon: 'none', icon: 'none',
@@ -92,42 +94,199 @@
}, },
// 生成海报 // 生成海报
coverCode(){ async coverCode(){
let canvas = new Draw({ // let { img, title, price, head, tips } = this
width: '375', let img = this.inviteData[this.codeIndex].code
height: '745', let back = this.inviteData[this.codeIndex].cover
canvasId: 'myCanvas', let name = this.inviteData[this.codeIndex].user_info.nickname
let invite = this.inviteData[this.codeIndex].invite
let avatar = this.inviteData[this.codeIndex].user_info.avatar || '/static/user/user-portrait.png'
let date = this.inviteData[this.codeIndex].date
draw = new Draw({
width: 375,
height: 745,
canvasId:'myCanvas',
_this: this, _this: this,
background: { background: {
type: 'color', type: 'color',
color: '#fffff' color: 'white',
w: 375,
h: 745,
}, },
quality: 1, // 导出图片的质量, 默认1 值范围0~1, 大于一都为1处理
drawTipsText: '绘制中...'
}) })
// await draw.createdSharePoster(() => { let res = await draw.createdSharePoster(({ bgObj }) => {
let { width, height } = bgObj
this.Popinvite = bgObj
// 绘制内容
return [
// 背景
{
type: 'image',
x: 0,
y: 0,
src: back,
w: 375,
h: 745,
zIndex: 0,
},
// return textArray // 日历-边框
// }) {
type: 'rect',
x: 280,
y: 20,
w: 60, // 宽度 必填
h: 80, // 高度 必填
zIndex: 99,
isFill: false, // 是否是填充矩形, false: 线性矩形
lineWidth: 1 ,// 当矩形为线性时,矩形的边框宽度
color: '#ffffff',
},
// 日历-线条
{
type: 'line',
zIndex: 99,
x: 280,
y: 74,
w: 60, // 宽度 默认整个画布的宽度 - x轴的距离
color: '#ffffff', // 颜色 默认#000000 在不考虑字节跳动小程序的前提下可简写(#000)
alpha: 1, // 透明度 默认1 取值范围 0~1
lineType: 'solid', // 线条类型 默认 solid: 实线 可选 dashed: 虚线
lineWidth: 1, // 线条高度
lineCap: 'butt' // 线条端点样式 默认 butt 可选 round, square
},
// 日历-年月
{
type: 'text',
x: 284,
y: 28,
zIndex: 99,
w: width - (20 * 2),
text: date.solar.month,
color: '#ffffff',
font: {
size: 14
}
},
// 日历-日
{
type: 'text',
x: 296,
y: 50,
zIndex: 99,
w: width - (20 * 2),
text: date.solar.day,
color: '#ffffff',
font: {
size: 20,
weight: 'bold'
}
},
// 日历-农历日期
{
type: 'text',
x: 282,
y: 80,
zIndex: 99,
w: width - (20 * 2),
text: date.lunar,
color: '#ffffff',
font: {
size: 14
}
},
// 用户昵称
{
type: 'text',
x: 90,
y: 650,
zIndex: 99,
w: width - (20 * 2),
text: name,
color: '#ffffff',
font: {
size: 18
}
},
// 邀请码
{
type: 'text',
x: 90,
y: 685,
zIndex: 99,
w: width - (20 * 2),
text: '邀请码:' + invite,
color: '#c4a1cb',
font: {
size: 16
}
},
// 用户头像
{
type: 'image',
x: 20,
y: 650,
src: avatar,
w: 54,
h: 54,
drawType: 'arc',
zIndex: 99,
borderWidth: 5, // 图片边框大小 默认0
borderColor: '#ffffff' // 图片边框颜色 默认无颜色
},
// 二维码
{
type: 'image',
x: 270,
y: 630,
w: 90,
h: 90,
zIndex: 99,
src: img
}
]
})
if (!res.success) return
this.posterImg = res.data
this.posterShow = true
},
// 保存图片
async saveImage() {
let { posterImg } = this
let res = await saveImageToPhotosAlbum(posterImg)
if (!res.success) return
showToast('保存成功')
this.posterShow = false
}, },
// 复制邀请码 // 复制邀请码
copyCenter(e) { copyCenter(e) {
let copyNo = e let copyNo = e
uni.vibrateShort({ const result = h5Copy(copyNo)
success: () => { if (result === false) {
uni.setClipboardData({
data : copyNo,
success : res=> {
uni.showToast({ uni.showToast({
title : '复制成功', title:'不支持',
icon :'none', })
duration: 3000 } else {
}); uni.showToast({
} title:'复制成功',
icon:'none'
}) })
} }
}) },
// 切换海报背景index
swiperChange(e) {
this.codeIndex = e.detail.current
} }
} }
} }
@@ -137,6 +296,7 @@
.content{ .content{
background: white; background: white;
padding: $padding 0; padding: $padding 0;
box-sizing: border-box;
min-height: 100vh; min-height: 100vh;
@extend .vertical; @extend .vertical;
} }
@@ -165,11 +325,36 @@
// 提示信息 // 提示信息
.footer{ .footer{
padding: $padding ($padding*2); padding: 0 $padding + 10;
text-align: center;
.hith{ .hith{
color: $text-gray; color: $text-gray;
font-size: $title-size-sm; font-size: $title-size-sm;
padding-top: $padding + 10;
}
.number {
background-color: $border-color-lg;
padding: $padding - 5;
margin: $margin + 20 0;
font-size: $title-size-lg;
border-radius: 8rpx;
display: flex;
.title {
flex: 1;
}
.value {
font-size: $title-size-m;
color: $text-price;
}
}
.button {
background: $mian-color-deep;
border-radius: 0;
height: 90rpx;
line-height: 90rpx;
font-size: $title-size;
color: white;
text-align: center;
border-radius: 8rpx;
} }
// number // number
// title // title
@@ -182,37 +367,43 @@
.codeCont { .codeCont {
position: absolute; position: absolute;
left: 0; left: 0;
bottom: 140rpx; bottom: 0;
width: 100%; width: 100%;
bottom: 100rpx;
left: 0; left: 0;
padding: 40rpx; padding: 10rpx 30rpx 50rpx;
box-sizing: border-box; box-sizing: border-box;
z-index: 9; z-index: 9;
.codeCont-avatar { .codeCont-avatar {
width: 100rpx; width: 80rpx;
height: 100rpx; height: 80rpx;
border-radius: 50%; border-radius: 50%;
border: 6rpx solid #FFFFFF; border: 4rpx solid #FFFFFF;
} }
.codeCont-text { .codeCont-text {
position: absolute; position: absolute;
width: 100%; width: 100%;
left: 0; left: 0;
top: 0; top: 0;
padding: 50rpx 40rpx 0 180rpx; padding: 10rpx 40rpx 0 150rpx;
box-sizing: border-box; box-sizing: border-box;
.codeCont-name { .codeCont-name {
color: #FFFFFF; color: #FFFFFF;
font-size: 34rpx; font-size: $title-size;
margin-bottom: 10rpx; margin-bottom: 10rpx;
} }
.codeCont-number { .codeCont-number {
font-size: 28rpx; font-size: $title-size-sm;
display: flex; display: flex;
color: #c4a1cb; color: #c4a1cb;
} }
} }
.codeCont-img {
width: 140rpx;
height: 140rpx;
position: absolute;
right: 30rpx;
bottom: 30rpx;
}
} }
// 日历 // 日历
.codDate { .codDate {
@@ -235,8 +426,63 @@
} }
.codDate-lunar { .codDate-lunar {
font-size: 24rpx; font-size: 24rpx;
transform: scale(.8); transform: scale(.9);
padding: 4rpx 0; padding: 4rpx 0;
} }
} }
// canvas
.my-canvas{
width: 375px;
height: 745px;
position: fixed;
top: -99999999999rpx;
left: -99999999999rpx;
z-index: -99999999999;
opacity: 0;
}
.posterBack {
width: 100%;
height: 100%;
position: fixed;
background-color: rgba(0,0,0,.7);
left: 0;
top: 0;
}
.poster{
width: 100vw;
height: 100vh;
display: flex;
flex-flow: column nowrap;
justify-content: center;
overflow: hidden;
position: fixed;
top: 0;
left: 0;
z-index: 9;
&-img{
width: 580rpx;
position: relative;
margin: 70rpx auto 20rpx;
.img{
width: 100%;
}
}
&-btn{
padding: 0 $padding * 2;
.operate {
width: 100%;
margin-bottom: 20rpx;
height: 80rpx;
line-height: 80rpx;
border-radius: 40rpx;
display: inline-block;
text-align: center;
color: #fff;
&-cancel{
background-color: $text-price;
}
}
}
}
</style> </style>

View File

@@ -28,7 +28,7 @@
<!-- 消息列表弹出 end --> <!-- 消息列表弹出 end -->
<!-- 用户信息 start --> <!-- 用户信息 start -->
<view class="fileTool" :class="{ bigTool: scroll > 200 }"> <!-- <view class="fileTool" :class="{ bigTool: scroll > 200 }">
<view class="user-portrait"> <view class="user-portrait">
<image class="user-portrait-head" :src="userData.avatar ? userData.avatar : '/static/user/user-portrait.png'" mode="aspectFill"></image> <image class="user-portrait-head" :src="userData.avatar ? userData.avatar : '/static/user/user-portrait.png'" mode="aspectFill"></image>
</view> </view>
@@ -39,7 +39,7 @@
<image class="user-tool-icon" src="/static/user/user-top-00.png" mode="aspectFill" @click="$Router.push({name: 'setting'})"></image> <image class="user-tool-icon" src="/static/user/user-top-00.png" mode="aspectFill" @click="$Router.push({name: 'setting'})"></image>
<image class="user-tool-icon" src="/static/user/user-top-01.png" mode="aspectFill" @click="$Router.push({name: 'news'})"></image> <image class="user-tool-icon" src="/static/user/user-top-01.png" mode="aspectFill" @click="$Router.push({name: 'news'})"></image>
</view> </view>
</view> </view> -->
<view class="user-top" :class="[scroll > 0 ? 'bigTop' : 'refurnTop']"> <view class="user-top" :class="[scroll > 0 ? 'bigTop' : 'refurnTop']">
<!-- <image class="user-back" :class="[scroll > 0 ? 'bigSize' : 'refurnSize']" src="../../static/img/user-back.png" mode="aspectFill"></image> --> <!-- <image class="user-back" :class="[scroll > 0 ? 'bigSize' : 'refurnSize']" src="../../static/img/user-back.png" mode="aspectFill"></image> -->
<view class="user-tool"> <view class="user-tool">
@@ -252,6 +252,7 @@
<script> <script>
import { userIndex, userNotice, userCustomer } from '@/apis/interfaces/user' import { userIndex, userNotice, userCustomer } from '@/apis/interfaces/user'
import h5Copy from '@/js_sdk/junyi-h5-copy/junyi-h5-copy/junyi-h5-copy'
export default { export default {
data() { data() {
return { return {
@@ -355,20 +356,17 @@
// 复制邀请码 // 复制邀请码
copyCenter(e) { copyCenter(e) {
let copyNo = e let copyNo = e
uni.vibrateShort({ const result = h5Copy(copyNo)
success: () => { if (result === false) {
uni.setClipboardData({
data : copyNo,
success : res=> {
uni.showToast({ uni.showToast({
title : '复制成功', title:'不支持',
icon :'none', })
duration: 3000 } else {
}); uni.showToast({
} title:'复制成功',
icon:'none'
}) })
} }
})
}, },
// 友情提示信息 // 友情提示信息

View File

@@ -15,31 +15,22 @@
<image class="vip-back" :src="item.card_cover" mode="scaleToFill"></image> <image class="vip-back" :src="item.card_cover" mode="scaleToFill"></image>
<view class="vip-cont"> <view class="vip-cont">
<view class="vip-name"> <view class="vip-name">
{{item.name}}<image class="vip-name-img" @click="showRemark(item.name, item.node_definition)" src="../../static/user/vip_privilege_03.png" mode="widthFix"></image> {{ item.name }}
</view> <image class="vip-name-img" @click="showRemark(item.name, item.node_definition)" src="../../static/user/vip_privilege_03.png" mode="widthFix"></image>
<view class="vip-number" v-if="item.count">
{{item.count.stock > 0 ? '剩余名额:' + item.count.residue : '不限名数'}}
</view> </view>
<view class="vip-number" v-if="item.count">{{ item.count.stock > 0 ? '剩余名额:' + item.count.residue : '不限名数' }}</view>
<view class="vip-tips"> <view class="vip-tips">
<!-- 会员 --> <!-- 会员 -->
<view v-if="item.identity_id == 2" class="vip-tips-text vip-tips-color-01"> <view v-if="item.identity_id == 2" class="vip-tips-text vip-tips-color-01">{{ item.title }}</view>
{{item.title}}
</view>
<!-- VIP节点 --> <!-- VIP节点 -->
<view v-else-if="item.identity_id == 3" class="vip-tips-text vip-tips-color-02"> <view v-else-if="item.identity_id == 3" class="vip-tips-text vip-tips-color-02">{{ item.title }}</view>
{{item.title}}
</view>
<!-- 主节点 --> <!-- 主节点 -->
<view v-else-if="item.identity_id == 4" class="vip-tips-text vip-tips-color-03"> <view v-else-if="item.identity_id == 4" class="vip-tips-text vip-tips-color-03">{{ item.title }}</view>
{{item.title}}
</view>
<!-- 超级节点 --> <!-- 超级节点 -->
<view v-else-if="item.identity_id == 5" class="vip-tips-text vip-tips-color-04"> <view v-else-if="item.identity_id == 5" class="vip-tips-text vip-tips-color-04">{{ item.title }}</view>
{{item.title}}
</view>
</view> </view>
</view> </view>
</view> </view>
@@ -51,51 +42,45 @@
<view class="privilege-list"> <view class="privilege-list">
<image class="privilege-img" src="/static/user/vip_privilege_00.png" mode=""></image> <image class="privilege-img" src="/static/user/vip_privilege_00.png" mode=""></image>
<view class="privilege-text"> <view class="privilege-text">
<view class="privilege-name"> <view class="privilege-name">节点定义</view>
节点定义 {{ identitie[tabsIndex].node_definition }}
</view>
{{identitie[tabsIndex].node_definition}}
</view> </view>
</view> </view>
<view class="privilege-list"> <view class="privilege-list">
<image class="privilege-img" src="/static/user/vip_privilege_01.png" mode=""></image> <image class="privilege-img" src="/static/user/vip_privilege_01.png" mode=""></image>
<view class="privilege-text"> <view class="privilege-text">
<view class="privilege-name"> <view class="privilege-name">升级条件</view>
升级条件
</view>
<block v-if="openCondition.energy_shard"> <block v-if="openCondition.energy_shard">
<view class="privilege-label" :class="{'active' : openCondition.energy_shard.finish}">{{openCondition.energy_shard.message}}<uni-icons v-if="openCondition.energy_shard.finish" type="checkmarkempty" size="17" color="#f6b338"></uni-icons></view> <view class="privilege-label" :class="{ active: openCondition.energy_shard.finish }">
<view class="privilege-label" :class="{'active' : openCondition.price.finish}" v-if="!openCondition.energy_shard.finish">{{openCondition.price.message}}</view> {{ openCondition.energy_shard.message }}
<view class="privilege-label" v-else>{{openCondition.service_charge.message}}</view> <uni-icons v-if="openCondition.energy_shard.finish" type="checkmarkempty" size="17" color="#f6b338"></uni-icons>
</view>
<view class="privilege-label" :class="{ active: openCondition.price.finish }" v-if="!openCondition.energy_shard.finish">
{{ openCondition.price.message }}
</view>
<view class="privilege-label" v-else>{{ openCondition.service_charge.message }}</view>
</block> </block>
<block v-else> <block v-else>
<view class="privilege-label" :class="{'active' : openCondition.price.finish}">{{openCondition.price.message}}</view> <view class="privilege-label" :class="{ active: openCondition.price.finish }">{{ openCondition.price.message }}</view>
</block> </block>
</view> </view>
</view> </view>
<view class="privilege-list"> <view class="privilege-list">
<image class="privilege-img" src="/static/user/vip_privilege_02.png" mode=""></image> <image class="privilege-img" src="/static/user/vip_privilege_02.png" mode=""></image>
<view class="privilege-text"> <view class="privilege-text">
<view class="privilege-name"> <view class="privilege-name">节点权益</view>
节点权益 <view class="privilege-label privilege-right" v-for="(item, index) in identitie[tabsIndex].rights" :key="index">&{{ item.remark }}</view>
</view>
<view class="privilege-label privilege-right" v-for="(item, index) in identitie[tabsIndex].rights" :key="index">
&{{item.remark}}
</view> </view>
</view> </view>
</view> </view>
<!-- 用户协议 --> <!-- 用户协议 -->
<!-- 用户协议 --> <view class="agree"><view class="agree-tips" @click="$Router.push({ name: 'vipAgree', params: { type: 'vipAgree' } })">请仔细阅读并确认服务协议</view></view>
<view class="agree">
<view class="agree-tips" @click="$Router.push({name: 'vipAgree', params: {type : 'vipAgree'}})">
请仔细阅读并确认服务协议
</view>
<view class="agree-btn" @click="agreeChange"> <view class="agree-btn" @click="agreeChange">
<view class="agree-btn" @click="agreeChange"> <radio :checked="selected" style="transform: scale(.7);" color="#7c52fc"></radio>
会员服务协议
</view> </view>
<!-- 开通按钮 --> <!-- 开通按钮 -->
<view class="footer"> <view class="footer">
<image class="footer-btn" :src="identitie[tabsIndex].button_cover" mode="widthFix" @click="openOrder"></image> <image class="footer-btn" :src="identitie[tabsIndex].button_cover" mode="widthFix" @click="openOrder"></image>
@@ -112,265 +97,239 @@
</template> </template>
<script> <script>
<script> import { identities, vipOrder, vipWechatPay, vipCont, vipVoucher } from '@/apis/interfaces/vip';
import { identities, vipOrder, vipWechatPay, vipCont, vipVoucher } from '@/apis/interfaces/vip' import { wxConfig } from '@/apis/interfaces/wx';
import { wxConfig } from '@/apis/interfaces/wx' import { uploads } from '@/apis/interfaces/uploading';
import { uploads } from '@/apis/interfaces/uploading' export default {
data() { data() {
return { return {
return { loding: true,
loding : true, tabsIndex: 0,
tabsIndex : 0, user: {},
user : {}, identitie: [],
identitie : [], rights: [],
rights : [], description: '',
identityTime: '', // 到期时间 identityTime: '', // 到期时间
identityTime: '', // 到期时间 sumNumber: 1, // 开通年限
sumNumber : 1, // 开通年限 total: '', // 开通年限总资金额
total : '', // 开通年限总资金额 selected: false, // 用户协议
selected : false, // 用户协议 canBtn: '', // 按钮操作
canBtn : '', // 按钮操作 canForm: false, // 凭证弹出
canForm : false, // 凭证弹出 canFromImg: {
showpath: '', showpath: '',
showpath: '', path: ''
}, },
openCondition: {} openCondition: {}
openCondition: {} };
}, },
created() { created() {
// 获取当前用户信息 // 获取当前用户信息
this.idenInfo(); this.idenInfo();
this.idenInfo();
// 微信鉴权
wxConfig({
url : window.location.href,
jsApiList : ['chooseWXPay']
}).then(res => {
let payConfig = JSON.parse(res)
let jweixin = require('jweixin-module')
jweixin.ready(res=>{
// res
})
jweixin.error(err => {
console.log(err)
uni.showToast({
title: err,
icon : 'none'
})
})
jweixin.config({...payConfig})
}).catch(err => {
console.log(err)
}, },
methods: { methods: {
// 当前用户信息 // 当前用户信息
// 当前用户信息 idenInfo() {
identities().then(res => { identities().then(res => {
res.identities.map(item => { res.identities.map(item => {
res.identities.map(item => { item.obj_condition = new Object();
item.obj_condition = new Object for (let val of item.get_condition) {
item.obj_condition[val.name] = { item.obj_condition[val.name] = {
message: val.message, message: val.message,
finish: val.finish finish: val.finish
};
} }
} return item;
} });
return item this.identitie = res.identities;
}) this.openCondition = res.identities[this.tabsIndex].obj_condition;
this.rights = res.identities[this.tabsIndex].rights;
this.identitie = res.identities this.total = res.identities[this.tabsIndex].price;
this.openCondition = res.identities[this.tabsIndex].obj_condition this.canBtn = res.identities[this.tabsIndex].can;
this.rights = res.identities[this.tabsIndex].rights this.loding = false;
this.total = res.identities[this.tabsIndex].price }).catch(err => {
this.canBtn = res.identities[this.tabsIndex].can
this.loding = false
uni.showToast({ uni.showToast({
title: err.message, title: err.message,
title: err.message, icon: 'none'
icon : 'none' });
}) });
}, },
// 切换开通身份 // 切换开通身份
swiperChange(e) { swiperChange(e) {
swiperChange(e) { this.tabsIndex = e.detail.current;
// 获取当前用户信息 // 获取当前用户信息
this.idenInfo(); this.idenInfo();
}, },
// 开通会员 // 开通会员
// 开通会员 openOrder() {
let can = this.canBtn, let can = this.canBtn,
let can = this.canBtn, identitiesId = this.identitie[this.tabsIndex].identity_id;
identitiesId = this.identitie[this.tabsIndex].identity_id if (this.selected == false) {
uni.showToast({ uni.showToast({
title: '请勾选用户协议', title: '请勾选用户协议',
title: '请勾选用户协议', icon: 'none'
icon : 'none' });
}) return;
} }
} if (can.on_line) {
if(can.on_line) { if (can.buy) {
if(can.buy) { this.wxPayConfig();
// 开通vip提交
console.log('开通vip提交')
} else { } else {
uni.showToast({ uni.showToast({
title: can.message, title: can.message,
title: can.message, icon: 'none'
icon : 'none' });
} }
} else { } else {
} else { if (can.buy) {
// 上传凭证 // 上传凭证
this.canClick(); this.canClick();
} else { } else {
uni.showToast({ uni.showToast({
title: can.message, title: can.message,
title: can.message, icon: 'none'
icon : 'none' });
} }
} }
} return;
}, },
}, // 微信支付鉴权
// 开通vip提交 wxPayConfig() {
vipSubmitr(id) { wxConfig({
// vipOrder(id,{ url: window.location.href,
// year: 1 jsApiList: ['chooseWXPay']
// }).then(res => { }).then(res => {
// if(!res.test){ let payConfig = JSON.parse(res);
// let verifyForm = res let jweixin = require('jweixin-module');
// this.wechatPay(res.id) jweixin.ready(() => {
// }else{ // res
// // 测试环境 });
// uni.showModal({ jweixin.error(err => {
// title : '开通提示', uni.showToast({
// content : '会员开通成功,是否继续完成企业认证', title: err,
// showCancel : true, icon: 'none'
// cancelText : '稍后认证', });
// confirmText : '立即认证', });
// success : modalRes => { jweixin.config({ ...payConfig });
// if(modalRes.confirm){ vipOrder(this.identitie[this.tabsIndex].identity_id, {
// this.$Router.replace({name: 'Approve'}) year: this.sumNumber
// return }).then(payId => {
// } this.wechatPay(payId.id, jweixin);
// this.$Router.back() }).catch(err => {
// }, uni.showToast({
// fail(err) { title: err.message,
// } icon: 'none'
// }) });
// } });
// }).catch(err =>{ }).catch(err => {
// uni.showToast({ uni.showToast({
// title: err.message, title: err.message,
// icon : 'none' icon: 'none'
// }) });
});
}, },
// 微信支付 // 微信支付
// 微信支付 wechatPay(id, wx) {
wechatPay(id){ vipWechatPay(id, {
vipWechatPay(id).then(res => { openid: this.$store.getters.getCode
let payConfig = JSON.parse(res.wechat), }).then(payConfig => {
payIdentity = res.identity wx.chooseWXPay({...payConfig,
uni.requestPayment({ success: ()=> {
provider : "wxpay",
orderInfo : payConfig,
success : payRes => {
console.log(payRes)
},
fail : payErr => {
console.log(payErr)
}
})
uni.showToast({ uni.showToast({
uni.showToast({ title: '支付成功',
icon: "success"
})
this.idenInfo();
},
fail(err) {
uni.showToast({
title: '支付被取消',
icon : 'none' icon : 'none'
}) })
}) }
});
});
}, },
// 勾选协议 // 勾选协议
agreeChange() { agreeChange() {
agreeChange() { this.selected = !this.selected;
}, },
// 会员权益介绍 // 会员权益介绍
// 会员权益介绍 showRemark(title, val) {
uni.showModal({ uni.showModal({
uni.showModal({ title: title,
title : title, content: val,
content : val, showCancel: false
showCancel : false });
}, },
// 上传打款凭证图片 // 上传打款凭证图片
// 上传打款凭证图片 updImg() {
uni.chooseImage({ uni.chooseImage({
uni.chooseImage({ count: 1,
count : 1, success: path => {
success : path => { uploads([{uri: path.tempFilePaths[0]}]).then(res => {
uploads([{
uri : path.tempFilePaths[0]
this.canFromImg = { this.canFromImg = {
showpath: res.url[0], showpath: res.url[0],
path: res.path[0] path: res.path[0]
path: res.path[0] };
}).catch(err => { }).catch(err => {
uni.showToast({ uni.showToast({
title: err.message, title: err.message,
title: err.message, icon: 'none'
icon : 'none' });
}) });
} }
} });
}, },
// 打款凭证弹出状态 // 打款凭证弹出状态
canClick() { canClick() {
canClick() { this.canForm = !this.canForm;
}, },
// 打款凭证提交 // 打款凭证提交
canSubmit() { canSubmit() {
let newCover = this.canFromImg.path, let newCover = this.canFromImg.path,
let newCover = this.canFromImg.path, newId = this.identitie[this.tabsIndex].identity_id;
vipVoucher({ vipVoucher({
cover: newCover, cover: newCover,
identity_id: newId identity_id: newId
}).then(res => { }).then(res => {
}).then(res => { this.$Router.push({ name: 'Examine' });
this.$Router.push({name: "Examine"}) }).catch(err => {
uni.showToast({ uni.showToast({
title: err.message, title: err.message,
title: err.message, icon: 'none'
icon : 'none' });
}) });
})
} }
} }
};
</script> </script>
<style> <style>
<style> page {
page { background-color: #ffffff;
background-color: #FFFFFF; }
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
<style lang="scss" scoped> .canBack {
position: fixed; position: fixed;
width: 100vw; width: 100vw;
height: 100vh; height: 100vh;
height: 100vh; background-color: rgba(0, 0, 0, 0.5);
left: 0; left: 0;
top: 0; top: 0;
z-index: 99; z-index: 99;
z-index: 99; }
} .canPop {
position: absolute; position: absolute;
position: absolute; background-color: #ffffff;
left: 100rpx; left: 100rpx;
right: 100rpx; right: 100rpx;
top: 30%; top: 30%;
@@ -405,25 +364,25 @@
line-height: 90rpx; line-height: 90rpx;
font-size: $title-size; font-size: $title-size;
color: white; color: white;
color: white; &::after {
border: none; border: none;
} }
} }
} }
.vip-container {
width: 750rpx; width: 750rpx;
height: 340rpx; height: 340rpx;
margin-top: $margin; margin-top: $margin;
margin-top: $margin; }
.swiper-item {
width: 640rpx; width: 640rpx;
height: 340rpx; height: 340rpx;
display: flex; display: flex;
display: flex; }
.vip-item {
width: 640rpx; width: 640rpx;
height: 340rpx; height: 340rpx;
border-radius: 20rpx; border-radius: 20rpx;
@@ -457,9 +416,9 @@
} }
.vip-number { .vip-number {
margin: 10rpx 0 40rpx; margin: 10rpx 0 40rpx;
margin: 10rpx 0 40rpx; color: #ffffff;
font-size: 32rpx; font-size: 32rpx;
font-size: 32rpx; opacity: 0.8;
} }
.vip-tips { .vip-tips {
font-size: 30rpx; font-size: 30rpx;
@@ -475,25 +434,25 @@
color: transparent; color: transparent;
} }
.vip-tips-color-00 { .vip-tips-color-00 {
.vip-tips-color-00 { background-image: linear-gradient(to bottom, #6189f0, #b6b9c1);
} }
.vip-tips-color-01 { .vip-tips-color-01 {
.vip-tips-color-01 { background-image: linear-gradient(to top, #ffd459, #ff6c52);
} }
.vip-tips-color-02 { .vip-tips-color-02 {
.vip-tips-color-02 { background-image: linear-gradient(to top, #e0c9fe, #892edb);
} }
.vip-tips-color-03 { .vip-tips-color-03 {
.vip-tips-color-03 { background-image: linear-gradient(to top, #f6b237, #f035e3);
} }
.vip-tips-color-04 { .vip-tips-color-04 {
.vip-tips-color-04 { background-image: linear-gradient(to top, #c455ec, #5f76e9);
} }
} }
} }
} }
} // 会员特权
// 会员特权 .privilege {
padding: 20rpx 30rpx 80rpx; padding: 20rpx 30rpx 80rpx;
box-sizing: border-box; box-sizing: border-box;
.privilege-list { .privilege-list {
@@ -522,108 +481,108 @@
} }
} }
} }
} }
// 用户协议
// 用户协议 .agree {
margin: $margin 0; margin: $margin 0;
text-align: center; text-align: center;
.agree-tips { .agree-tips {
background-color: #999999; background-color: #999999;
display: inline-block; display: inline-block;
padding: 14rpx $padding; padding: 14rpx $padding;
padding: 14rpx $padding; color: #ffffff;
border-radius: 60rpx; border-radius: 60rpx;
} }
} }
} .agree-btn {
display: flex; display: flex;
font-size: $title-size-lg; font-size: $title-size-lg;
text-align: left; text-align: left;
color: #999999; color: #999999;
padding: $padding; padding: $padding;
padding: $padding; }
// .content{
// .content{ // min-height: 100vh;
// min-height: 100vh; // background: #fefaef;
// background: #fefaef; // }
// } // 开通须知
// 开通须知 .notice {
font-size: $title-size-m; font-size: $title-size-m;
color: $text-gray; color: $text-gray;
color: $text-gray; padding: $padding $padding * 2 $padding * 2;
padding: $padding $padding*2 $padding*2; .title {
padding-bottom: $padding/2; padding-bottom: $padding/2;
font-weight: bold; font-weight: bold;
} }
} .item {
padding-bottom: $padding/2; padding-bottom: $padding/2;
line-height: 40rpx; line-height: 40rpx;
text-align: justify; text-align: justify;
} }
} }
} // footer
// footer .footer {
padding: 0 $padding; padding: 0 $padding;
box-sizing: border-box; box-sizing: border-box;
text-align: center; text-align: center;
text-align: center; .footer-btn {
width: 74%; width: 74%;
} }
} }
} // 会员权限
// 会员权限 .privilege {
padding: $padding; padding: $padding;
padding: $padding; .title {
font-weight: bold; font-weight: bold;
color: #322711; color: #322711;
font-size: $title-size; font-size: $title-size;
text-align: center; text-align: center;
line-height: 90rpx; line-height: 90rpx;
} }
} .privilege-box {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
padding: $padding 0; padding: $padding 0;
padding: $padding 0; .item {
width: 25%; width: 25%;
padding: $padding/2; padding: $padding/2;
box-sizing: border-box; box-sizing: border-box;
text-align: center; text-align: center;
text-align: center; .icon {
width: 78rpx; width: 78rpx;
height: 78rpx; height: 78rpx;
background: #bd995d; background: #bd995d;
border-radius: 50%; border-radius: 50%;
vertical-align: top; vertical-align: top;
} }
} .text {
font-size: $title-size-sm; font-size: $title-size-sm;
color: #201212; color: #201212;
line-height: 60rpx; line-height: 60rpx;
} }
} }
} }
} }
} // 会员卡
// 会员卡 .cards {
position: relative; position: relative;
background: #1f1b1c; background: #1f1b1c;
background: #1f1b1c; .card {
position: relative; position: relative;
margin: 0 $margin; margin: 0 $margin;
background: linear-gradient(to right, #3b3d4a, #231d1f); background: linear-gradient(to right, #3b3d4a, #231d1f);
padding: 15rpx; padding: 15rpx;
border-radius: $radius/2; border-radius: $radius/2;
z-index: 2; z-index: 2;
z-index: 2; .card-content {
position: relative; position: relative;
position: relative; border: solid 1rpx rgba($color: white, $alpha: 0.4);
border-radius: $radius/2; border-radius: $radius/2;
padding: 30rpx 180rpx 60rpx 148rpx; padding: 30rpx 180rpx 60rpx 148rpx;
min-height: 98rpx; min-height: 98rpx;
min-height: 98rpx; .cover {
position: absolute; position: absolute;
left: 30rpx; left: 30rpx;
top: 30rpx; top: 30rpx;
@@ -631,17 +590,17 @@
height: 98rpx; height: 98rpx;
border-radius: 50%; border-radius: 50%;
} }
} .user {
.user{ color: rgba($color: white, $alpha: 0.7);
line-height: 58rpx; line-height: 58rpx;
font-size: $title-size-lg; font-size: $title-size-lg;
} }
} .sub-time {
line-height: 40rpx; line-height: 40rpx;
color: #e6ce9e; color: #e6ce9e;
font-size: $title-size-sm; font-size: $title-size-sm;
} }
} .btn {
position: absolute; position: absolute;
color: #261f0f; color: #261f0f;
background: #e6ce9e; background: #e6ce9e;
@@ -655,15 +614,15 @@
} }
} }
} }
} .cards-angle {
position: absolute; position: absolute;
left: 0; left: 0;
bottom: 0; bottom: 0;
width: 100%; width: 100%;
z-index: 3; z-index: 3;
} }
} &::after {
&::after{ content: ' ';
height: 70rpx; height: 70rpx;
background: #b29671; background: #b29671;
position: absolute; position: absolute;
@@ -672,36 +631,36 @@
border-radius: $radius/2; border-radius: $radius/2;
z-index: 0; z-index: 0;
} }
} }
} // tabs
// tabs .tabs {
background: #1f1b1c; background: #1f1b1c;
color: white; color: white;
padding: 0 0 $padding 0; padding: 0 0 $padding 0;
display: flex; display: flex;
justify-content: center; justify-content: center;
font-size: $title-size-lg; font-size: $title-size-lg;
font-size: $title-size-lg; .item {
margin: 0 $margin; margin: 0 $margin;
line-height: 70rpx; line-height: 70rpx;
height: 70rpx; height: 70rpx;
height: 70rpx; color: rgba($color: white, $alpha: 0.6);
color: rgba($color: white, $alpha: .6); &.show {
position: relative; position: relative;
font-weight: bold; font-weight: bold;
font-size: $title-size; font-size: $title-size;
color: white; color: white;
color: white; &::after {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 20%; left: 20%;
width: 60%; width: 60%;
height: 6rpx; height: 6rpx;
border-radius: 3rpx; border-radius: 3rpx;
border-radius: 3rpx; content: ' ';
background: white; background: white;
} }
} }
} }
} }
</style> </style>

46
pages/wxAuth/wxAuth.vue Normal file
View File

@@ -0,0 +1,46 @@
<template>
<view class="content vertical">
<u-loading mode="flower"></u-loading>
</view>
</template>
<script>
import { wxCode, wxOpenid } from '@/apis/interfaces/wx'
export default {
data() {
return {
};
},
created() {
// 微信鉴权
if(!this.$Route.query.code){
wxCode({
pages: 'wechat-auth'
}).then(res => {
window.location.href = res
})
}else{
wxOpenid({
code: this.$Route.query.code
}).then(res => {
this.$store.commit('setCode', res.openid)
this.$Router.replaceAll({name: 'Index'})
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
}
}
}
</script>
<style lang="scss">
.content{
background: white;
height: 100vh;
text-align: center;
}
</style>

View File

@@ -28,6 +28,12 @@ const router = createRouter({
// 全局路由前置守卫 // 全局路由前置守卫
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
const token = store.getters.getToken || uni.getStorageSync('token') const token = store.getters.getToken || uni.getStorageSync('token')
// 检查是否需要微信授权
if(store.getters.getCode === '' && to.name != 'wxAuth'){
next({
name: 'wxAuth'
})
}
// 检查是否需要登录 // 检查是否需要登录
if(to.auth && token === ''){ if(to.auth && token === ''){
next({ next({

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 KiB

After

Width:  |  Height:  |  Size: 114 KiB

BIN
static/dev/wallet-code.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -13,6 +13,7 @@ Vue.use(Vuex)
export default new Vuex.Store({ export default new Vuex.Store({
state: { state: {
token : uni.getStorageSync('token') || '', token : uni.getStorageSync('token') || '',
code : uni.getStorageSync('wxCode') || '',
coupongoods : [] coupongoods : []
}, },
getters: { getters: {
@@ -21,6 +22,9 @@ export default new Vuex.Store({
}, },
getCoupongoods: state => { getCoupongoods: state => {
return state.coupongoods return state.coupongoods
},
getCode: state => {
return state.code
} }
}, },
mutations: { mutations: {
@@ -30,6 +34,10 @@ export default new Vuex.Store({
}, },
setCoupongoods(state, value) { setCoupongoods(state, value) {
state.coupongoods = value state.coupongoods = value
},
setCode(state, value) {
state.code = value
uni.setStorageSync('wxCode', value)
} }
} }
}) })

View File

@@ -1,2 +1,2 @@
<!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>链商星球</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)')) <!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>链商星球</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/static/index.f4fc78fe.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.1319762c.js></script><script src=/static/js/index.21bb54d6.js></script></body></html> document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/static/index.5e7e3b56.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.61332aa4.js></script><script src=/static/js/index.21d43ced.js></script></body></html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 465 KiB

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 639 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 354 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 558 B

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 686 B

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 937 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 1015 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 585 B

After

Width:  |  Height:  |  Size: 303 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 944 B

After

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 880 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 491 B

After

Width:  |  Height:  |  Size: 306 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 956 B

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 590 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 904 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 B

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 930 B

After

Width:  |  Height:  |  Size: 643 B

Some files were not shown because too many files have changed in this diff Show More