Authored by 王水玲

微信群控软件

const config = {
axiosBaseUrl: '/api',
axiosBaseUrl: '',
yohoApi: '/yohoApi',
axiosResponseType: 'json'
};
... ...
module.exports = {
image(url, width, height, mode, quality) {
mode = _.isNumber(mode) ? mode : 2;
url = url || '';
url = url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
if (url.indexOf('imageView2') > 0) {
quality = _.isNumber(quality) ? quality : 90;
url += '/q/' + quality;
}
return url.replace('http:', '');
}
}
\ No newline at end of file
... ...
let api = require('../common/create-api');
import config from '../common/config';
import api from '../common/create-api';
module.exports = {
queryHelper(param) {
return api.get('helper/queryHelper', param, {
getWechatShareCode(params) {
return api.get('', Object.assign({
method: 'app.passport.getWechatShareCode'
}, params), {
defaults: {
baseURL: 'imApi'
baseURL: config.yohoApi
}
});
},
queryAllCommonPhrase(param) {
return api.get('commonphrase/queryAllCommonPhrase', param, {
defaults: {
baseURL: 'imApi'
}
getWechatConsultant(params) {
// api.get('/erp/wechatCs/getWechatConsultant', params);
return new Promise(function(resolve, reject) {
return resolve({
"alg": "SALT_MD5",
"code": 200,
"data": {
"groupName": "其他顾问分组",
"machineCode": "99001182249951",
"staffName": "刘忙",
"wechatCode": "yoho2w1qb",
"wechatMobile": "13770769602",
"wechatNickName": "红柚",
"wechatUid": 500032152,
"yohoMobile": "13770769602"
},
"md5": "7541dd607cef8dc3345d2ce0af7ce1c4",
"message": "操作成功"
})
});
},
queryAllCommonLink(param) {
return api.get('/commonlink/queryAllCommonLink', param, {
defaults: {
baseURL: 'imApi'
}
getUserInfo(params) {
// api.get('/erp/wechatCs/getUserInfo', params);
return new Promise(function(resolve, reject) {
return resolve({
"alg": "SALT_MD5",
"code": 200,
"data": {
"birthday": "1995-08-20",
"createTimeStr": "2018-04-27 00:28:50",
"mobile": "13365289763",
"nickName": "admire102",
"user_uid": 500031572,
"vipLevel": "0",
"yearCost": "0"
},
"md5": "216a47d172dfc195d992a3151df7c3a0",
"message": "操作成功"
})
});
},
bindWechatCSAndUser(params) {
// api.get('/erp/wechatCs/bindWechatCSAndUser', params);
return new Promise(function(resolve, reject) {
return resolve({
"alg": "SALT_MD5",
"code": 200,
"data": [],
"md5": "6d729d4b35f10fc73531210bd7ecff91",
"message": "操作成功"
})
});
},
updateUserReminder(params) {
// api.get('/erp/wechatCs/updateUserReminder', params);
return new Promise(function(resolve, reject) {
return resolve({
"alg": "SALT_MD5",
"code": 200,
"data": [],
"md5": "6d729d4b35f10fc73531210bd7ecff91",
"message": "操作成功"
})
});
},
getUserUid(params) {
// api.get('/erp/wechatCs/getUserUid', params);
return new Promise(function(resolve, reject) {
return resolve({
"alg": "SALT_MD5",
"code": 200,
"data": 500031572,
"md5": "86ac2ee7339487d6211c7629a4ef5432",
"message": "操作成功"
})
});
},
getOrderList(params) {
return api.get('/erp-gateway/erp/order/getOrderList', params);
},
getChangeList(params) {
return api.get('/erp-gateway/erp/order/getChangeList', params);
},
getRefundList(params) {
return api.get('/erp-gateway/erp/order/getRefundList', params);
}
}
... ...
<template>
<ul class="base-info-list">
<li v-for="(item,index) in list" :key="index"><span class="label">{{item.label}}:</span>{{item.value}}</li>
<li v-for="(item,index) in list" :key="index"><span class="label">{{item.label}}</span>{{item.value}}</li>
</ul>
</template>
... ... @@ -9,8 +9,8 @@ export default {
name: 'baseInfoList',
props: {
list: {
type: Array,
default: []
type: Object,
default: {}
}
}
}
... ...
<template>
<div class="coupon-item coupon-shop">
<div class="coupon-item coupon-activity">
<div class="left">
<p class="price">100</p>
<p class="condition">满499可用</p>
... ...
... ... @@ -20,7 +20,7 @@ export default {
name: 'coupon',
data() {
return {
more: 'http://www.baidu.com'
more: 'http://admin.portal.yohobuy.com/market/queryCoupon/index#page=1'
};
},
mounted() {
... ...
<template>
<div class="data-null">
<slot name="cont"></slot>
</div>
</template>
<script>
export default {
name: 'dataNull'
}
</script>
<style lang="scss" scoped>
.data-null {
text-align: center;
padding: 80px 0;
font-size: 14px;
}
</style>
... ...
<template>
<div class="exchange-container">
<Tabs :tabs="tabs" @change-tabs="changeTabs"></Tabs>
<NavTitle :more="more">
<template slot="title">{{getTitleCont}}</template>
<NavTitle :more="tabObj[curTabs].more">
<template slot="title">{{tabObj[curTabs].title}}</template>
</NavTitle>
<Modal class="list-cont">
<Modal v-for="(item, index) in tabObj[curTabs].data" :key="index" class="list-cont">
<template slot="label">
<div class="original-order-code" v-if="curTabs === '换货'">原订单号:2222</div>
<div class="order-code" :class="{lg: curTabs === '退货'}">订单号:11111</div>
<div class="original-order-code" v-if="curTabs === '换货'">原订单号:{{item.sourceOrderCode}}</div>
<div class="order-code" :class="{lg: curTabs === '退货'}">订单号:{{item.orderCode}}</div>
</template>
<template slot="cont">
<div class="order-cont" >
<div class="goods-info">
<img src="//img11.static.yhbimg.com/goodsimg/2018/10/22/18/012502918a8149f76a74ebcab5971437c6.jpg?imageMogr2/thumbnail/750x750/background/d2hpdGU=/position/center/quality/80">
<div v-for="(goods, key) in item.goodsList" :key="key" class="goods-info">
<img :src="fomartImg(goods.goodsImage, 77, 104)">
<div class="right">
<div class="goods-name">AIR JORDAN 1 x OFF-WHITE CHICAGO THE TEN 芝加哥</div>
<div class="goods-name">{{goods.productName}}</div>
<div class="number">
<span class="skn">SKN:</span>
<span class="sku">SKU:</span>
<span class="skn">SKN:{{goods.productSkn}}</span>
<span class="sku">SKU:{{goods.productSku}}</span>
</div>
<div class="remark">备注:</div>
<div class="remark">备注:{{goods.remark}}</div>
</div>
</div>
<div class="user-info">
<div class="item"><span class="item-label">收货人:</span></div>
<div class="item"><span class="item-label">手机号:</span></div>
<div class="item" v-if="curTabs === '退货'"><span class="item-label">退款金额:</span></div>
<div class="item" v-if="curTabs === '退货'"><span class="item-label">退款方式:</span></div>
<div class="item"><span class="item-label">申请类型:</span></div>
<div class="item"><span class="item-label">申请人:</span></div>
<div class="item"><span class="item-label">当前状态:</span></div>
<div class="item address"><span class="item-label">地址:</span></div>
<template v-if="curTabs === '退货'">
<div class="item"><span class="item-label">退款金额:</span>¥{{item.returnAmountText}}</div>
<div class="item"><span class="item-label">退款方式:</span>{{item.returnAmountModeName}}</div>
</template>
<template v-if="curTabs === '换货'">
<div class="item"><span class="item-label">收货人:</span>{{item.deliveryAddressBO.consignee}}</div>
<div class="item"><span class="item-label">手机号:</span>{{item.deliveryAddressBO.mobile}}</div>
</template>
<div class="item"><span class="item-label">申请类型:</span>{{item.refundChangeModeName}}</div>
<div class="item"><span class="item-label">申请人:</span>{{item.applicant}}</div>
<div class="item"><span class="item-label">当前状态:</span>{{item.statusName}}</div>
<div class="item address" v-if="curTabs === '换货'"><span class="item-label">地址:</span>{{item.deliveryAddressBO.address}}</div>
</div>
</div>
</template>
</Modal>
</Modal>
<dataNull v-if="tabObj[curTabs].haveData">
<template slot="cont">暂无{{curTabs}}信息</template>
</dataNull>
</div>
</template>
... ... @@ -42,33 +49,85 @@
import Tabs from './tabs';
import Modal from './modal';
import NavTitle from './nav-title';
import dataNull from './data-null';
import homeModel from '../../../models/home';
import {image} from '../../../common/helpers';
export default {
name: 'exchange',
props: ['uid'],
data() {
return {
tabs: ['换货', '退货'],
curTabs: '换货',
more: 'http://www.baidu.com'
tabObj: {
'换货': {
title: '最近10笔换货订单',
haveData: true,
data: [],
more: 'http://erp.yohobuy.com/customer/exchange/index'
},
'退货': {
title: '最近10笔退货订单',
haveData: true,
data: [],
more: 'http://erp.yohobuy.com/customer/returned/index'
}
}
};
},
mounted() {
this.getChangeList();
},
computed: {
getTitleCont() {
return this.curTabs === '换货' ? '最近10笔换货订单' : '最近10笔退货订单';
tabs() {
return Object.keys(this.tabObj);
}
},
methods: {
fomartImg(url, width, height, mode, quality) {
return image(url, width, height, mode, quality);
},
changeTabs(item) {
this.curTabs = item;
if (item === '换货' && this.tabObj[item].haveData) {
this.getChangeList();
}
if (item === '退货' && this.tabObj[item].haveData) {
this.getRefundList();
}
},
getChangeList() {
homeModel.getChangeList({
uid: this.uid,
page: 1,
limit: 10
}).then(ret => {
if (ret && ret.code === 200) {
this.tabObj['换货'].data = ret.data && ret.data.list || [];
this.tabObj['换货'].haveData = ret.data && ret.data.list && ret.data.list.length === 0;
}
});
},
getRefundList() {
homeModel.getRefundList({
uid: this.uid,
page: 1,
limit: 10
}).then(ret => {
if (ret && ret.code === 200) {
this.tabObj['退货'].data = ret.data && ret.data.list || [];
this.tabObj['退货'].haveData = ret.data && ret.data.list && ret.data.list.length === 0;
}
});
}
},
components: {
Tabs,
Modal,
NavTitle
NavTitle,
dataNull
}
}
</script>
... ... @@ -77,10 +136,12 @@ export default {
.exchange-container {
.original-order-code {
float: left;
font-size: 14px;
}
.order-code {
float: right;
font-size: 14px;
}
.lg {
... ... @@ -89,7 +150,12 @@ export default {
.list-cont {
padding-bottom: 20px;
margin-bottom: 15px;
background: #fff;
&:last-child {
margin-bottom: 0;
}
}
.goods-info {
... ... @@ -115,6 +181,7 @@ export default {
overflow: hidden;
font-family: PingFang-SC-Medium;
font-size: 18px;
min-height: 50px;
}
.number {
... ... @@ -147,15 +214,16 @@ export default {
height: auto;
overflow: hidden;
font-family: PingFang-SC-Regular;
font-size: 18px;
font-size: 15px;
width: 100%;
border-top: 1px solid #EAEBEB;
padding: 0 20px;
box-sizing: border-box;
.item {
width: 50%;
float: left;
line-height: 30px;
line-height: 30px;
line-height: 25px;
margin-top: 15px;
}
... ...
... ... @@ -3,7 +3,7 @@
<span class="title">
<slot name="title"></slot>
</span>
<a :href="more" class="more" v-if="more != ''">&nbsp;</a>
<a :href="more" class="more" v-if="more != ''" target="_blank">&nbsp;</a>
</div>
</template>
... ...
... ... @@ -3,53 +3,118 @@
<NavTitle :more="more">
<template slot="title">最近10笔订单</template>
</NavTitle>
<Modal class="order-list">
<Modal class="order-list" v-for="(item, index) in orderList" :key="index">
<template slot="label">
<div class="time">2018-10-31 16:51:22</div>
<div class="order-code">订单号:11111</div>
<div class="time">{{item.pay_expire}}</div>
<div class="order-code">订单号:{{item.order_code}}</div>
</template>
<template slot="cont">
<div class="order-cont" >
<div class="goods-info">
<img src="//img11.static.yhbimg.com/goodsimg/2018/10/22/18/012502918a8149f76a74ebcab5971437c6.jpg?imageMogr2/thumbnail/750x750/background/d2hpdGU=/position/center/quality/80">
<div class="order-cont">
<div v-for="(goods, goodsIndex) in item.order_goods" :key="goodsIndex" class="goods-info">
<img :src="fomartImg(goods.goods_image, 78, 103)">
<div class="right">
<div class="goods-name">AIR JORDAN 1 x OFF-WHITE CHICAGO THE TEN 芝加哥</div>
<div class="goods-name">{{goods.product_name}}</div>
<div class="number">
<span class="goods-price red">¥859</span>
<span class="goods-num">数量:1</span>
<span class="goods-price red">¥{{goods.real_pay_price}}</span>
<span class="goods-num">数量:{{goods.buy_number}}</span>
</div>
</div>
</div>
<div class="order-info">
<div class="item"><span class="item-label">订单金额:</span></div>
<div class="item"><span class="item-label">订单状态:</span></div>
<div class="item"><span class="item-label">订单来源:</span></div>
<div class="item"><span class="item-label">订单金额:</span>¥{{item.amount}}</div>
<div class="item"><span class="item-label">订单状态:</span>{{item.status_str}}</div>
<div class="item"><span class="item-label">订单来源:</span>{{orderType(item.order_type)}}</div>
</div>
</div>
</template>
</Modal>
</Modal>
<dataNull v-if="orderList.length === 0">
<template slot="cont">暂无订单信息</template>
</dataNull>
</div>
</template>
<script>
import Modal from './modal';
import NavTitle from './nav-title';
import dataNull from './data-null';
import homeModel from '../../../models/home';
import {image} from '../../../common/helpers';
const sourceList = {
'0': '测试订单',
'1': '有货订单',
'2': '内购订单',
'3': 'IPhone订单',
'4': '安卓订单',
'5': '淘宝B店订单',
'6': 'Wap站',
'7': '换货订单',
'8': '淘宝C店订单',
'9': '淘宝LAL店订单',
'10': '一号店',
'11': '京东',
'12': '京东闪购店',
'13': '京东lal闪购店',
'14': '物色',
'15': 'bj天猫店',
'16': 'intotherainbow旗舰店',
'17': '微信商城',
'18': 'BLK-IPhone订单',
'19': 'BLK安卓订单',
'20': 'BLK-PC订单',
'21': 'BLK-Wap订单',
'22': '测试订单',
'23': '苏宁',
'24': '微信小程序',
'30': '残次网站订单',
'60': '南京艾尚YOHO!Store',
'61': 'YOHOOD仓库',
'62': '南京艾尚YOHO!Kids',
'63': '红人分销',
'64': '品牌主体小程序',
'65': '有货主体品牌小程序',
'66': '上海奕欧来Outlet',
'67': '上海K11POP-UP STORE'
};
export default {
name: 'orderList',
props: ['uid'],
data() {
return {
more: 'http://www.baidu.com'
more: 'http://erp.yohobuy.com/orders/orders/index',
orderList: []
};
},
mounted() {
this.getOrderList();
},
methods: {
fomartImg(url, width, height, mode, quality) {
return image(url, width, height, mode, quality);
},
orderType(type) {
return sourceList[type];
},
getOrderList() {
homeModel.getOrderList({
type: 1,
uid: this.uid,
page: 1,
limit: 10,
debug: true
}).then(ret => {
if (ret && ret.code === 200) {
this.orderList = ret.data && ret.data.order_list || [];
}
});
}
},
components: {
Modal,
NavTitle
NavTitle,
dataNull
}
}
</script>
... ... @@ -128,17 +193,16 @@ export default {
.order-info {
border-top: 1px solid #EAEBEB;
margin-top: 10px;
padding: 10px 20px;
font-family: PingFang-SC-Regular;
font-size: 18px;
font-size: 16px;
height: auto;
overflow: hidden;
.item {
font-family: PingFang-SC-Regular;
font-size: 18px;
font-size: 16px;
width: 50%;
float: left;
line-height: 25px;
... ...
<template>
<div class="user-info-container">
<ModalHaveTitle class="notes" :title="'用户备忘录'">
<textarea name="" id="" placeholder="备忘录(非必填)"></textarea>
<textarea name="" id="" placeholder="备忘录(非必填)" v-model="reminder"></textarea>
<NavButton :text="'更新备忘录'" @click-btn="updateNote"></NavButton>
</ModalHaveTitle>
<ModalHaveTitle class="bind-user" :title="'绑定用户'">
<div class="label">用户微信号:</div>
<ModalHaveTitle class="bind-user" :title="'绑定用户'" v-if="showBind">
<div class="label">用户微信号:{{userCode}}</div>
<div class="search">
<input type="text" value="" placeholder="用户UID查询(请输入有货手机号/订单编号)">
<span class="search-btn"></span>
<input type="text" value="" placeholder="用户UID查询(请输入有货手机号)" v-model="phone">
<span class="search-btn" @click="searchUid"></span>
</div>
<input type="text" value="" placeholder="用户UID" class="input-uid">
<textarea name="" id="" placeholder="备注(非必填)"></textarea>
<input type="text" value="" placeholder="用户UID" class="input-uid" v-model="userUid">
<textarea name="" id="" placeholder="备注(非必填)" v-model="remarks"></textarea>
<NavButton :text="'绑定用户'" @click-btn="bindUser"></NavButton>
</ModalHaveTitle>
<ModalHaveTitle class="user-base-info" :title="'用户基本信息'">
<ModalHaveTitle class="user-base-info" :title="'用户基本信息'" v-if="showUserInfo">
<BaseInfoList :list="userInfo"></BaseInfoList>
</ModalHaveTitle>
</div>
... ... @@ -31,27 +31,95 @@ import BaseInfoList from './base-info-list';
export default {
name: 'userInfo',
props: ['wechatUid', 'userCode'],
data() {
return {
userInfo: [
{label: '用户UID', value: ''},
{label: '昵称', value: ''},
{label: '手机号', value: ''},
{label: '注册', value: ''},
{label: '生日', value: ''},
{label: '等级', value: ''},
{label: '365天累计消费', value: ''}
]
userInfo: {
user_uid: {label: '用户UID', value: ''},
nickName: {label: '昵称', value: ''},
mobile: {label: '手机号', value: ''},
createTimeStr: {label: '注册', value: ''},
birthday: {label: '生日', value: ''},
vipLevel: {label: '等级', value: ''},
yearCost: {label: '365天累计消费', value: ''}
},
showUserInfo: false,
showBind: false,
userUid: '',
remarks: '',
reminder: '',
phone: ''
};
},
mounted() {
this.getUserInfo();
},
methods: {
getUserInfo() {
homeModel.getUserInfo({userCode: this.userCode, wechat_uid: this.wechatUid}).then(ret => {
if (ret && ret.code === 200) {
let data = ret.data || {};
Object.keys(data).forEach((item, key) => {
this.userInfo[item].value = data[item];
});
this.showUserInfo = true;
this.showBind = false;
this.$emit('get-user-uid', ret.data.user_uid);
}
if (ret && ret.code === 403) {
this.showUserInfo = false;
this.showBind = true;
}
});
},
isPoneAvailable(str) {
let myreg=/^[1][3,4,5,7,8][0-9]{9}$/;
if (!myreg.test(str)) {
return false;
} else {
return true;
}
},
updateNote() {
console.log('update note')
homeModel.updateUserReminder({
user_uid: this.userUid,
wechat_uid: this.wechatUid,
reminder: this.reminder
}).then(ret => {
console.log(ret)
});
},
bindUser() {
console.log('bind user')
homeModel.bindWechatCSAndUser({
user_uid: this.userUid,
wechat_uid: this.wechatUid,
user_code: this.userCode,
remarks: this.remarks,
reminder: this.reminder
}).then(ret => {
console.log(ret)
if (ret && ret.code === 200) {
this.getUserInfo();
}
});
},
searchUid() {
if (this.isPoneAvailable(this.phone)) {
homeModel.getUserUid({
profile: this.phone
}).then(ret => {
if (ret && ret.code === 200) {
this.userUid = ret.data || '';
}
});
} else {
alert('手机号输入不正确');
}
}
},
components: {
... ... @@ -105,14 +173,14 @@ input:-ms-input-placeholder {
}
.notes {
border-bottom: 1px solid #EAEBEB;
textarea {
height: 130px;
}
}
.bind-user {
border-top: 1px solid #EAEBEB;
.search {
width: 100%;
background: #F3F3F3;
... ...
... ... @@ -13,18 +13,16 @@
@click="changeMenu(item.text)">{{item.text}}</span>
</div>
<Knowledge v-if="curMenu === '知识库'"></Knowledge>
<OrderList v-if="curMenu === '订单信息'"></OrderList>
<Exchange v-if="curMenu === '退换货'"></Exchange>
<OrderList v-if="curMenu === '订单信息'" :uid="userUid"></OrderList>
<Exchange v-if="curMenu === '退换货'" :uid="userUid"></Exchange>
<Coupon v-if="curMenu === '优惠券'"></Coupon>
<UserInfo v-if="curMenu === '用户信息'"></UserInfo>
<UserInfo v-if="curMenu === '用户信息'" :wechatUid="serviceInfo.wechatUid.value" :userCode="userCode" @get-user-uid="getUserUid"></UserInfo>
<Tip :text="tipCont" :hasClose="tipClose" :show="tipShow" @change-tip-status="changeTipStatus"></Tip>
</div>
</template>
<script>
import BaseInfoList from './components/base-info-list';
import Knowledge from './components/knowledge';
import OrderList from './components/order-list';
import Exchange from './components/exchange';
import Coupon from './components/coupon';
... ... @@ -33,6 +31,7 @@ import NavButton from './components/nav-button';
import ModalHaveTitle from './components/modal-have-title';
import Tip from './components/tip';
import Clipboard from 'clipboard';
import homeModel from '../../models/home';
export default {
name: 'Home',
... ... @@ -42,26 +41,62 @@ export default {
{text: '用户信息'},
{text: '订单信息'},
{text: '退换货'},
{text: '优惠券'},
{text: '知识库'}
{text: '优惠券'}
],
curMenu: '用户信息',
serviceInfo: [
{label: '微信号', value: ''},
{label: '微信昵称', value: ''},
{label: '微信手机号', value: ''},
{label: '机器码', value: ''},
{label: '有货账号', value: ''},
{label: '有货UID', value: ''},
{label: '所属分组', value: ''},
{label: '运营人员', value: ''}
],
serviceInfo: {
wechatCode: {label: '微信号', value: ''},
wechatNickName: {label: '微信昵称', value: ''},
wechatMobile: {label: '微信手机号', value: ''},
machineCode: {label: '机器码', value: ''},
yohoMobile: {label: '有货账号', value: ''},
wechatUid: {label: '有货UID', value: ''},
groupName: {label: '所属分组', value: ''},
staffName: {label: '运营人员', value: ''}
},
tipCont: '复制成功',
tipShow: false,
tipClose: false
tipClose: false,
wechatCode: this.queryString().operator,
userCode: this.queryString().friend,
shareCode: '',
userUid: ''
};
},
mounted() {
homeModel.getWechatConsultant({wechatCode: this.wechatCode}).then(ret => {
if (ret && ret.code === 200) {
let data = ret.data || {};
Object.keys(data).forEach((item, key) => {
this.serviceInfo[item].value = data[item];
});
this.getWechatShareCode(data.wechatUid || '');
}
});
},
methods: {
queryString() {
let vars = [], hash;
let hashes = window.location.search.slice(1).split('&');
for (let i = 0; i < hashes.length; i++) {
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
},
getWechatShareCode(wechatUid) {
wechatUid = 500031262;
homeModel.getWechatShareCode({
uid: wechatUid
}).then(ret => {
console.log(ret)
});
},
changeMenu(item) {
this.curMenu = item;
},
... ... @@ -69,7 +104,7 @@ export default {
let that = this;
let clipboard = new Clipboard('.copy-link', {
text: function() {
return '有货有赚';
return this.shareCode;
}
});
... ... @@ -92,11 +127,14 @@ export default {
},
changeTipStatus(item) {
this.tipShow = item;
},
getUserUid(uid) {
console.log(uid)
this.userUid = uid;
}
},
components: {
BaseInfoList,
Knowledge,
OrderList,
Exchange,
Coupon,
... ...

5.72 KB | W: | H:

6.48 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin

5.87 KB | W: | H:

6.7 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin