Commit a6307922 authored by xieyishang's avatar xieyishang

仓库迁移~

parent 538fad45
/unpackage
<script>
import {newsRemind} from "@/utils/api/api.js";//获取商家消息
export default {
onLaunch: function() {
console.log('App Launch');
// #ifdef APP-PLUS
//app关闭默认的启动 方法关闭启动图。但是这个时间不能太晚,6s 超时后依旧会主动关闭。
setTimeout(()=>{
plus.navigator.closeSplashscreen();
},100)
// #endif
this.getnewsRemind();
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
},
methods:{
//获取 语音消息
async getnewsRemind(){
console.info("66344554");
var date = new Date();
let hours = date.getHours();//当前 时间 小时
let datestime = 15000;//默认15秒
console.info(hours);
if(hours==11 || hours==12 || hours==13 ){//1级别 高峰时间
datestime = 5000;//高峰时期 5s一次
}else if(hours==10 || hours==14){//1级别
datestime = 8000;//高峰时期 5s一次
}
else{
datestime = 15000;
}
if(this.$store.state.token!=""){//判断是否 已登录
let res = await newsRemind({
})
console.info(".99999",res);
if(res.code==0){
console.info("0000000000");
if(res.data.length!=0){
//进来了就是有消息
let msglist = res.data;
console.info("循环消息列表");
if(msglist.length==1){
//一条就播放 如果多条 直接告诉商家多少条
// isvoice 开关
if(this.$store.state.isvoice){
this.$store.dispatch('AudioVoice',msglist[0].message).then((e) => {
console.log(e);
console.info("循环消息列表2");
//震动 调用//400ms//长震动
uni.vibrateLong({
success:(re)=> {
},
fail:(a)=> {
}
})
})
}else{
//震动 调用//400ms//长震动
uni.vibrateLong({
success:(re)=> {
},
fail:(a)=> {
}
})
}
}else{
//多条的时候
console.info("提示多条订单~");
let msgtext = `你有${msglist.length}条新的鹿马订单了,请及时处理`;
if(this.$store.state.isvoice){
this.$store.dispatch('AudioVoice',msgtext).then((e) => {
console.log(e);
console.info("循环消息列表2");
//震动 调用//400ms//长震动
uni.vibrateLong({
success:(re)=> {
},
fail:(a)=> {
}
})
})
}else{
//震动 调用//400ms//长震动
uni.vibrateLong({
success:(re)=> {
},
fail:(a)=> {
}
})
}
}
// for(let i=0;i<msglist.length;i++){
// let item = msglist[i];
// // item.message
// // isvoice 开关
// if(this.$store.state.isvoice){
// this.$store.dispatch('AudioVoice',item.message).then((e) => {
// console.log(e);
// console.info("循环消息列表2");
// //震动 调用//400ms//长震动
// uni.vibrateLong({
// success:(re)=> {
// },
// fail:(a)=> {
// }
// })
// })
// }else{
// //震动 调用//400ms//长震动
// uni.vibrateLong({
// success:(re)=> {
// },
// fail:(a)=> {
// }
// })
// }
// }
console.info("循环消息列表3");
//回调
setTimeout(()=>{
this.getnewsRemind()
},datestime)
}else{
//获取到的消息列表为空列表
//回调
setTimeout(()=>{
this.getnewsRemind()
},datestime)
}
}else{
//回调
setTimeout(()=>{
this.getnewsRemind()
},datestime)
}
}else{
//回调
setTimeout(()=>{
this.getnewsRemind()
},datestime)
}
}
}
}
</script>
<style>
/*每个页面公共css */
@import "colorui/main.css";
@import "colorui/icon.css";
@import "./common/uni.css";
@import './common/qiun.css';
@import './style.css';
</style>
#鹿马商家助手思维导图
##商家管理
###商家资料修改
###商家资质提交
#==========》页面 = 商家资料修改页面 + 商家资质提交页面
#(对应有个门店编辑的页面) 门店编辑有 可以直接对数据
###### 相关资质 /pages/edit/Qualifications/Qualifications
###### 商家信息修改 /pages/edit/shop/shop
##商品管理
###商品分类
###商品添加
###商品编辑
###商品相册功能 略
#===========》 商品分类列表页面 商品分类添加页面 商品编辑管理页面 商品相册列表页
#(商品列表 商品编辑 商品添加 有模板)
##### 商品列表 /pages/edit/pro_manage/pro_manage
##### 商品编辑 /pages/edit/product/product?id=8
##### 商品添加 /pages/edit/product/product?id=8
##### 商品分类列表页 /pages/shopCategory/shopCategory
##### 商品分类添加页面 /pages/shopCategory/shopCategory
##### 商品分编辑页面 /pages/shopCategory/shopCategory
##财务管理
###佣金管理
#### 日报表 月报表 数据可视化 查询功能
###商户资金管理
#### 日流水 月流水 数据可视化 查询功能
#### 图表 [https://ext.dcloud.net.cn/plugin?id=271]
#===========》 佣金管理页面 + 商户资金管理页面
# 图表 在明细 里面
#####佣金管理 /pages/user/mingxi/mingxi
##### 商户资金管理 /pages/user/tongji/tongji
##### 上面两个页面ok 调整下样式就好了
##订单管理
###订单列表
###订单声音提醒 这个是测试过的
###发货功能
### 退单功能
### #===========》 订单列表页面 + 订单发货页面 + 退单页面 + 订单详情页面
##(订单列表 订单详情 是有模板的)
#### 订单订单列表页面 /pages/order/order 现成的 改改就可以了
#### 订单详情页面 /pages/order/detail/detail 现成的 改改就可以了
#### 订单发货页面没做 /pages/order/delivery/delivery?id=1
#### 退单页面 /pages/order/RefundExamine/RefundExamine 外卖退单
#### 退单页面 /pages/order/refundprojuct/refundprojuct 商城退单
##商品规格 ok
###商品规格添加
###商品规格列表
###商品规格编辑
###商品规格删除
#===============》商品规格列表页面(删除功能) + 商品规格添加页面 + 商品规格编辑页面
####商品规格
##商品属性
###商品属性添加
###商品属性列表
###商品属性编辑
###商品属性删除
#==========》商品属性列表页面(删除功能) + 商品属性添加页面 + 商品属性编辑页面
####商品属性 ok
##### 分享功能 参照采源宝
##########
########## 一个商户
########## 多店
########## 多账号
########## 这么处理?
#####3 页面结构
######## pages/login/login 登录 ok
######## pages/yjWithdraw/yjWithdraw 提现
######## pages/setPassword/setPassword 修改密码 ok
######## pages/index/index 首页
######## pages/notice/notice 通知
######## pages/kehu/kehu 锁客列表
######## pages/edit/product/product 添加产品 编辑产品
######## pages/edit/shop/shop 商家信息编辑
######## pages/user/tongji/tongji 商户资金管理 ok
######## pages/user/mingxi/mingxi 佣金明细
######## pages/order/order 订单管理
######## pages/order/shopOrder 商城订单
######## pages/order/detail 订单详情
######## pages/order/delivery/delivery 订单发货
######## pages/order/RefundExamine/RefundExamine 订单退款 外卖的
######## pages/order/refundprojuct/refundprojuct 订单退款 商城的
######## pages/user/fenxiao/success/success 提现成功
######## pages/user/fenxiao/bankcard/bankcard 银行卡管理
######## pages/user/fenxiao/addcard/addcard 添加银行卡
######## pages/edit/pro_manage/pro_manage 产品管理
######## pages/order/detail/detail 订单详情
######## pages/user/reseller/reseller 资金首页
######## pages/user/cash/cash 申请提现
######## pages/user/record/record 资金记录
######## pages/edit/Qualifications/Qualifications 相关资质
######## pages/shopCategory/shopCategory 分类管理
######## pages/specs/specs 商品规格
######## pages/specsadd/specsadd 添加规格
######## pages/setup/setup 设置
######## pages/about/about 关于我们
######## pages/specsShop/specsShop 商品管理规格处理 商品规格
######## pages/storeqrcode/storeqrcode 店铺二维码
######## pages/tagglestore/tagglestore 切换门店
######## pages/shopModel/shopModel 属性 分类管理
######## pages/eleProduct/eleProduct 外卖商品列表
######## pages/addEditEleProduct/addEditEleProduct 添加外卖产品
################################################################################################################ 进度统计
##############
##############
#####3 页面结构
######## pages/storeqrcode/storeqrcode 店铺二维码 ok
######## pages/tagglestore/tagglestore 切换门店 ok
######## pages/about/about 关于我们 ok
######## pages/login/login 登录 ok
######## pages/setPassword/setPassword 修改密码 ok
######## pages/index/index 首页 ok
######## pages/notice/notice 通知 ok
######## pages/kehu/kehu 锁客列表 ok
######## pages/order/order 订单管理 外卖订单列表 ok
######## pages/order/detail 外卖订单详情 订单详情 ok
######## pages/order/detail/detail 订单详情 外卖订单详情 ok
######## pages/user/record/record 资金记录 ok
######## pages/user/tongji/tongji 商户资金管理 ok
######## pages/user/fenxiao/bankcard/bankcard 银行卡管理 ok
######## pages/user/fenxiao/addcard/addcard 添加银行卡 ok
######## pages/user/fenxiao/success/success 提现成功 ok
######## pages/edit/Qualifications/Qualifications 相关资质 ok
######## pages/specs/specs 商品规格 ok
######## pages/specsadd/specsadd 添加规格 ok
######## pages/eleProduct/eleProduct 外卖商品列表 ok
######## pages/addEditEleProduct/addEditEleProduct 添加外卖产品 ok
######## pages/user/mingxi/mingxi 佣金明细 要测试 ok
######## pages/shopCategory/shopCategory 分类管理 添加和列表 ok
######## pages/user/reseller/reseller 资金首页 ok
######## pages/order/delivery/delivery 订单发货 ok
######## pages/setup/setup 设置 ok
######## pages/order/shopOrder 商城订单 ok
######## pages/specsShop/specsShop 商品管理规格处理 商品规格 商品添加关联规格
######## pages/yjWithdraw/yjWithdraw 提现 申请提现 要加风险检测 还没做
######## pages/edit/pro_manage/pro_manage 产品管理 商城产品管理 商城产品列表
######## pages/edit/product/product 添加产品 编辑产品 商城的 还没做 添加商城产品
##商城不做分类
######## pages/order/RefundExamine/RefundExamine 订单退款 外卖的 退款的
######## pages/order/refundprojuct/refundprojuct 订单退款 商城的 没有账号 先不弄 退款的
######## pages/edit/shop/shop 商家信息编辑 先忽略
######## pages/shopModel/shopModel 属性 分类管理 属性和分类的 先不做
\ No newline at end of file
@charset "utf-8";html{background-color:#fff;color:#000;font-size:14px}
body,ul,ol,dl,dd,h1,h2,h3,h4,h5,h6,figure,form,fieldset,legend,input,textarea,button,p,blockquote,th,td,pre,xmp{margin:0;padding:0}
body,input,textarea,button,select,pre,xmp,tt,code,kbd,samp{line-height:1.5;}
h1,h2,h3,h4,h5,h6,small,big,input,textarea,button,select{font-size:100%}
h1,h2,h3,h4,h5,h6,b,strong{font-weight:normal}
address,cite,dfn,em,i,optgroup,var{font-style:normal}
table{border-collapse:collapse;border-spacing:0;text-align:left}
caption,th{text-align:inherit}
ul,ol,menu{list-style:none}
fieldset,img{border:0}
img,object,input,textarea,button,select{vertical-align:middle}
article,aside,footer,header,section,nav,figure,figcaption,hgroup,details,menu{display:block}
blockquote:before,blockquote:after,q:before,q:after{content:"\0020"}
textarea{overflow:auto;resize:vertical}
input,textarea,button,select,a{outline:0 none;border: none;}
button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}
mark{background-color:transparent}
a,ins,s,u,del{text-decoration:none}
sup,sub{vertical-align:baseline}
html {overflow-x: hidden;height: 100%;font-size: 50px;-webkit-tap-highlight-color: transparent;}
body {color: #333;font-size: .28em;line-height: 1;-webkit-text-size-adjust: none;}
hr {height: .02rem;margin: .1rem 0;border: medium none;border-top: .02rem solid #cacaca;}
a {color: #000;text-decoration: none;}
html,body {
width: 700px;
margin: auto;
font-size:14px;
}
.main700{
position: absolute;
width: 700px;
}
.H10{height: 10px;}
.H15{height: 15px;}
.H50{height: 50px;}
.white{background: #fff;}
.van-nav-bar__text{
color:#555;
}
.van-nav-bar .van-icon{
color:#555;
}
@media (max-width: 700px) {
html,body {
width: 100%;
}
.main700{
position: absolute;
width: 100%;
}
}
/*
Animation 微动画
基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28
*/
/* css 滤镜 控制黑白底色gif的 */
.gif-black{
mix-blend-mode: screen;
}
.gif-white{
mix-blend-mode: multiply;
}
/* Animation css */
[class*=animation-] {
animation-duration: .5s;
animation-timing-function: ease-out;
animation-fill-mode: both
}
.animation-fade {
animation-name: fade;
animation-duration: .8s;
animation-timing-function: linear
}
.animation-scale-up {
animation-name: scale-up
}
.animation-scale-down {
animation-name: scale-down
}
.animation-slide-top {
animation-name: slide-top
}
.animation-slide-bottom {
animation-name: slide-bottom
}
.animation-slide-left {
animation-name: slide-left
}
.animation-slide-right {
animation-name: slide-right
}
.animation-shake {
animation-name: shake
}
.animation-reverse {
animation-direction: reverse
}
@keyframes fade {
0% {
opacity: 0
}
100% {
opacity: 1
}
}
@keyframes scale-up {
0% {
opacity: 0;
transform: scale(.2)
}
100% {
opacity: 1;
transform: scale(1)
}
}
@keyframes scale-down {
0% {
opacity: 0;
transform: scale(1.8)
}
100% {
opacity: 1;
transform: scale(1)
}
}
@keyframes slide-top {
0% {
opacity: 0;
transform: translateY(-100%)
}
100% {
opacity: 1;
transform: translateY(0)
}
}
@keyframes slide-bottom {
0% {
opacity: 0;
transform: translateY(100%)
}
100% {
opacity: 1;
transform: translateY(0)
}
}
@keyframes shake {
0%,
100% {
transform: translateX(0)
}
10% {
transform: translateX(-9px)
}
20% {
transform: translateX(8px)
}
30% {
transform: translateX(-7px)
}
40% {
transform: translateX(6px)
}
50% {
transform: translateX(-5px)
}
60% {
transform: translateX(4px)
}
70% {
transform: translateX(-3px)
}
80% {
transform: translateX(2px)
}
90% {
transform: translateX(-1px)
}
}
@keyframes slide-left {
0% {
opacity: 0;
transform: translateX(-100%)
}
100% {
opacity: 1;
transform: translateX(0)
}
}
@keyframes slide-right {
0% {
opacity: 0;
transform: translateX(100%)
}
100% {
opacity: 1;
transform: translateX(0)
}
}
\ No newline at end of file
<template>
<view>
<view class="cu-custom" :style="[{height:CustomBar + 'px'}]">
<view class="cu-bar fixed" :style="style" :class="[bgImage!=''?'none-bg text-white bg-img':'',bgColor]">
<view class="action" @tap="BackPage" v-if="isBack">
<text class="cuIcon-back"></text>
<slot name="backText"></slot>
</view>
<view class="content" :style="[{top:StatusBar + 'px'}]">
<slot name="content"></slot>
</view>
<slot name="right"></slot>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
StatusBar: this.StatusBar,
CustomBar: this.CustomBar
};
},
name: 'cu-custom',
computed: {
style() {
var StatusBar= this.StatusBar;
var CustomBar= this.CustomBar;
var bgImage = this.bgImage;
var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
if (this.bgImage) {
style = `${style}background-image:url(${bgImage});`;
}
return style
}
},
props: {
bgColor: {
type: String,
default: ''
},
isBack: {
type: [Boolean, String],
default: false
},
bgImage: {
type: String,
default: ''
},
},
methods: {
BackPage() {
uni.navigateBack({
delta: 1
});
}
}
}
</script>
<style>
</style>
This diff is collapsed.
This diff is collapsed.
import {
Api_url
} from './config'
export default {
//post请求
post(url, param) {
return new Promise((cback, reject) => {
uni.request({
url: Api_url + url,
data: param,
method:'post',
header: {
token:uni.getStorageSync("token")
},
}).then(data => { //data为一个数组,数组第一项为错误信息,第二项为返回数据
var [error, res] = data;
var res_code = res.statusCode.toString();
if (res_code.charAt(0) == 2) {
if(res_code==200){
cback(res.data);
}else{
console.log('201:',res.data.msg)
uni.showToast({
title:res.data.msg,
icon:'none'
})
}
} else {
if(res_code==401){
uni.showToast({
title:'登录失效',
icon:'none'
})
setTimeout(()=>{
uni.removeStorageSync('token')
uni.reLaunch({
url:'/pages/login/login'
})
},1000)
return;
}
console.log('400:',res.data.msg)
let msg=res.data.msg?res.data.msg:'请求错误'
uni.showToast({
title:msg,
icon:'none'
})
}
}).catch(err => {
console.log('请求异常:',err);
uni.showToast({
title:'请求异常',
icon:'none'
})
})
})
},
get(url, param) {
return new Promise((cback, reject) => {
uni.request({
url: Api_url + url,
data: param,
method:'get',
header: {
token:uni.getStorageSync("token")
},
}).then(data => { //data为一个数组,数组第一项为错误信息,第二项为返回数据
var [error, res] = data;
var res_code = res.statusCode.toString();
if (res_code.charAt(0) == 2) {
if(res_code==200){
cback(res.data);
}else{
console.log('201:',res.data.msg)
uni.showToast({
title:res.data.msg,
icon:'none'
})
}
} else {
if(res_code==401){
uni.showToast({
title:'登录失效',
icon:'none'
})
setTimeout(()=>{
uni.removeStorageSync('token')
uni.reLaunch({
url:'/pages/login/login'
})
},1000)
return;
}
console.log('400:',res.data.msg)
let msg=res.data.msg?res.data.msg:'请求错误'
uni.showToast({
title:msg,
icon:'none'
})
}
}).catch(err => {
console.log('请求异常:',err);
uni.showToast({
title:'请求异常',
icon:'none'
})
})
})
},
}
module.exports = {
error:'',
isJSON : function (str){
if (typeof str == 'string') {
try {
var obj=JSON.parse(str);
if(typeof obj == 'object' && obj ){
return true;
}else{
return false;
}
} catch(e) {
console.log('error:'+str+'!!!'+e);
return false;
}
}
},
isNumber : function (checkVal){
var reg = /^-?[1-9][0-9]?.?[0-9]*$/;
return reg.test(checkVal);
}
}
\ No newline at end of file
const Api_url= 'http://www.xxx.com'
export {Api_url}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
page {
background: #F4F5F6;
width: 750upx;
overflow-x: hidden;
}
.qiun-padding {
padding: 2%;
width: 96%;
}
.qiun-wrap {
display: flex;
flex-wrap: wrap;
}
.qiun-rows {
display: flex;
flex-direction: row !important;
}
.qiun-columns {
display: flex;
flex-direction: column !important;
}
.qiun-common-mt {
margin-top: 10upx;
}
.qiun-common-border-bottom {
border-bottom: 1px solid #E9E9E9;
}
.qiun-bg-white {
background: #FFFFFF;
}
.qiun-title-bar {
width: 96%;
padding: 10upx 2%;
flex-wrap: nowrap;
}
.qiun-title-dot-light {
border-left: 10upx solid #0ea391;
padding-left: 10upx;
font-size: 32upx;
color: #000000
}
.qiun-textarea {
height: 400upx;
font-size: 34upx;
box-sizing: border-box;
line-height: 50upx;
width: 100%;
background-color: #FFFFFF;
}
.qiun-text-tips {
font-size: 28upx;
color: #dc2626;
line-height: 40upx;
padding: 6upx;
}
.qiun-button {
background: #2fc25b;
color: #FFFFFF;
margin: 20upx;
}
/* 通用样式 */
.qiun-charts {
width: 750upx;
height: 500upx;
background-color: #FFFFFF;
}
.charts {
width: 750upx;
height: 500upx;
background-color: #FFFFFF;
}
/* 横屏样式 */
.qiun-charts-rotate {
width: 700upx;
height: 1100upx;
background-color: #FFFFFF;
padding: 25upx;
}
.charts-rotate {
width: 700upx;
height: 1100upx;
background-color: #FFFFFF;
}
/* 圆弧进度样式 */
.qiun-charts3 {
width: 750upx;
height: 250upx;
background-color: #FFFFFF;
position: relative;
}
.charts3 {
position: absolute;
width: 250upx;
height: 250upx;
background-color: #FFFFFF;
}
This diff is collapsed.
File added
/* picker类型 css配置 */
/* 选中框中的内容样式 */
.pickerDefault{
font-size: 16px;
transition: color .3s;
}
/* 选中时的颜色 */
.selectColor{
color: #ff6900;
}
/* 未选中时的颜色 */
.defaultColor{
color: #666;
}
\ No newline at end of file
/* pcis 与 infinitepics csss配置 */
/* 图片与图片预选框 */
.picsBox {
height: 120rpx;
width: 120rpx;
}
/* pics类型的小标题 */
.picsItemTitle{
font-size: 25rpx;
}
/* 必填标志样式 */
.requiredSign{
color: #F1505C;
}
/* 排序选择模式的选中框 */
.sortSelection{
position: absolute;
bottom: 0;
right: 0;
height: 40rpx;
width: 40rpx;
border-radius: 50%;
transition: background-color .3s;
font-size: 22rpx;
}
\ No newline at end of file
import log from './log.js';
/**
* inputTap custom类型点击触发函数
* @param {any} customId
*/
export function inputCustomTapFc(customId) { // 必须return一个Promise对象, 可以resolve数据给相应的input赋值
return new Promise((resolve, reject) => {
switch (customId) {
case '自定义id':
break;
default:
uni.scanCode({ //示例, 扫码后赋值
success: function(res) {
log('条码类型:' + res.scanType);
log('条码内容:' + res.result);
resolve(res.result);
}
});
break;
}
})
}
/**
* inputTap custom类型点击触发函数异常时触发的函数
* @param {any} customId
* @param {Object} e
*/
export function inputCustomTapCatchFc(customId, e) { // inputTap custom类型触发的函数异常时触发的函数, 必须return一个Promise对象, 可以resolve数据给相应的input赋值
return new Promise((resolve, reject) => {
switch (customId) {
case '自定义id':
break;
default:
break;
}
})
}
/**
* 内置过滤函数
*/
export const filterTypeObj = { // 可根据需求自行添加拓展
twoDecimalPlaces(value) { // 必须接受一个参数
value = value.replace(/[^\d.]/g, ""); //清除“数字”和“.”以外的字符
value = value.replace(/\.{2,}/g, "."); //只保留第一个. 清除多余的
value = value.replace(/^(\-)*(\d+)\.(\d).*$/, '$1$2.$3'); //只能输入1个小数
return value; // 必须return value
}
};
// 注意只可增加不可删除
// 注意只可增加不可删除
// 注意只可增加不可删除
/**
* 内置正则校验
*/
export const verifyTypeObj = {
Tel: {
reg: /^[1][0-9]{10}$/,
name: '手机号'
},
Email: {
reg: /^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/,
name: '电子邮箱'
},
idCart: {
reg: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
name: '身份证号'
},
NationalNumber: {
reg: /\d{3}-\d{8}|\d{4}-\d{7}/,
name: '国内号码'
},
QQ: {
reg: /[1-9][0-9]{4,}/,
name: 'QQ号'
},
PostalCode: {
reg: /[1-9]\d{5}(?!\d)/,
name: '邮政编码'
},
IpAddress: {
reg: /\d+\.\d+\.\d+\.\d+/,
name: 'IP地址'
},
Chinese: {
reg: /[\u4e00-\u9fa5]/,
name: '中文字符'
},
Char: {
reg: /^[A-Za-z]+$/,
name: '英文字母'
},
Int: {
reg: /^\d+$/,
name: '整数'
},
Number: {
reg: /^([1-9]\d*(\.\d+)?)|(\d+(\.\d+))$/,
name: '数字'
}
};
\ No newline at end of file
export default {
baseUrl: 'https://zxluma.jxdsy.cn/merchant.php/FileUpload/uploadify', // 域名替换地址
upLoadImg: `https://zxluma.jxdsy.cn/merchant.php/FileUpload/uploadify`, // 服务器地址(上传图片)
};
\ No newline at end of file
/**
* 打印管理
* @param {String} t
*/
export default function log(t) {
console.log(t); // 若不想打印内容请注释
}
import log from './log';
/**
* picker逐级获取-获取访问接口时的自定义携带参数
* @param {Object} obj
*/
export function getSendData(obj) {
const {
// 以下参数供以判断
value, //picker的value值
launch, // 是否是初始化
customId, // 自定义标识
index, // 改变的列的下标(第几列改变)
linkageNum, // 联动级数
type, // picker的type
datas, // 页面当前数据: {data_0: 第一列数据, data_1: 第二列数据, data_2: 第三列数据}
column // 三级联动中 是第几列获取sendData
} = obj
const {
data_0, // 第一列数据
data_1 // 第二列数据
} = datas; // 页面当前数据: {data_0: 第一列数据, data_1: 第二列数据, data_2: 第三列数据}
let vbName_0; // 第一列数据获取value值的变量名
let vbName_1; // 第二列数据获取value值的变量名
switch (customId) { // 根据customId决定vbName的赋值走向
case '自定义标识':
vbName_0 = '';
vbName_1 = '';
break;
default:
vbName_0 = 'value';
vbName_1 = 'value';
break;
}
let sendData = {}; // 访问接口携带的数据
switch (linkageNum) {
case 2: // 二级联动
sendData.id = data_0[value[0]][vbName_0];
break;
case 3: // 三级联动
if (launch || index === 0) { // 首次初始化 或 第一列更改
switch (column) {
case 0: // 获取第一列中用以获取sendData的数据
sendData.id = data_0[value[0]][vbName_0];
break;
case 1: // 获取第二列中用以获取sendData的数据
sendData.id = data_1[0][vbName_1];
break;
default:
log('column 超限');
break;
}
} else { // 第二列更改
sendData.id = data_1[value[1]][vbName_1];
}
break;
default:
log('级数不存在');
break;
}
return sendData; // 最终return sendData
}
/**
* picker逐级获取-获取逐级数据
* @param {Object} obj
*/
export function getAsyncDataFc(obj) { // 访问接口获取picker自定义逐级数据
return new Promise((rs, rj) => {
uni.showLoading({ //不需要可以删除, 别忘了下面的hideLoading
title: '获取数据中……'
})
setTimeout(() => { // 访问接口获取数据 (需自己修改)
let data;
switch (obj.id) {
case 'a':
data = [{
name: 'a_a',
value: 'a_a'
}, {
name: 'a_b',
value: 'a_b'
}];
break;
case 'b':
data = [{
name: 'b_a',
value: 'b_a'
}, {
name: 'b_b',
value: 'b_b'
}];
break;
case 'c':
data = [{
name: 'c_a',
value: 'c_a'
}, {
name: 'c_b',
value: 'c_b'
}];
break;
case 'a_a':
data = [{
name: 'a_a_a',
value: 'a_a_a'
}, {
name: 'a_a_b',
value: 'a_a_b'
}]
break;
case 'a_b':
data = [{
name: 'a_b_a',
value: 'a_b_a'
}, {
name: 'a_b_b',
value: 'a_b_b'
}]
break;
case 'b_a':
data = [{
name: 'b_a_a',
value: 'b_a_a'
}, {
name: 'b_a_b',
value: 'b_a_b'
}]
break;
case 'b_b':
data = [{
name: 'b_b_a',
value: 'b_b_a'
}, {
name: 'b_b_b',
value: 'b_b_b'
}]
break;
case 'c_a':
data = [{
name: 'c_a_a',
value: 'c_a_a'
}, {
name: 'c_a_b',
value: 'c_a_b'
}]
break;
case 'c_b':
data = [{
name: 'c_b_a',
value: 'c_b_a'
}, {
name: 'c_b_b',
value: 'c_b_b'
}]
break;
default:
break;
}
rs(data);
uni.hideLoading(); //不需要可以删除
}, 1000);
})
}
\ No newline at end of file
import log from './log';
import interfaces from './interfaces';
import { errObj } from '../../js/Msg.js';
/**
* 上传文件方法
* @param {any} customId
* @param {String} filePath
* @param {Object} picsUpLoadData
*/
export function UpLoadFile(customId, filePath, picsUpLoadData) { // 上传文件方法: (自定义上传标识, 文件路径, 自定义上传数据)
log('自定义上传图片携带数据:' + JSON.stringify(picsUpLoadData));
if (interfaces.baseUrl && filePath.indexOf(interfaces.baseUrl) != -1) { //域名替换机制: 判断是否是从后端获取的图片路径, 若是 替换域名字符串为空后resolve. 也可以根据customId动态控制, 不需要则删除此代码
const replacePath = filePath.replace(interfaces.baseUrl, '');
return Promise.resolve({
data: replacePath
});
}
let _this = this;
let url = '';
//上传商品类型(商家:shopphoto 外卖产品:eleproduct 商家产品:goods)
let formData = {
model:"eleproduct",
user_token:uni.getStorageSync("token"),
};
let name = 'img';
switch (customId) { //判断该项pics类型自带的UpLoadFileType, 根据此值来确定不同的url、formData、name
case 'UpLoadImage_1': //自定义的标识
url = '';
formData = {};
name = '';
break;
default: //若无判断需求可直接写在这里
url = interfaces.upLoadImg;
//formData = {};
//name = '';
break;
}
if (!url) {
uni.showToast({title:'上传文件的url不能为空', icon: 'none'});
return Promise.reject({...errObj['102'], errMsg: '上传文件的url不能为空'});
}
if (!filePath) {
uni.showToast({title:'上传文件的filePath不能为空', icon: 'none'});
return Promise.reject({...errObj['102'], errMsg: '上传文件的filePath不能为空'});
}
const obj = {
url,
name,
filePath
}
// #ifdef APP-PLUS
if (plus.os.name.toLowerCase() === 'ios') {
if(Object.keys(formData).length > 0) obj.url = renderUrlData(obj.url, formData);
}else{
obj.formData = formData;
}
// #endif
// #ifndef APP-PLUS
obj.formData = formData;
// #endif
return uni.uploadFile(obj);
}
/**
* 拼接上传返回数据方法
* @param {String} vals
* @param {String} val
*/
export function pics_splice(vals, val) { // 拼接图片上传返回后的数据, vals是拼接后的数据, val是新添项
if (typeof(vals) !== 'string') { // 第一次传进来是一个数组
vals = val || '|'; // 可更改分隔符
return vals;
}
vals += val ? '|' + val : '|';
return vals; // 必须return vals
}
function renderUrlData(u, d) {
let c = '';
let n = 0;
if (d)
for (let i in d) {
if (n > 0)
c += '&' + i + '=' + d[i];
else
c += '?' + i + '=' + d[i];
++n;
}
return u + c;
}
\ No newline at end of file
/**
* 发送验证码方法
* @param {any} customId
* @param {String} phone
*/
// 目前 点击获取验证码按钮后会emit一个getCode事件至父级,所以自己在外面发送验证码,并且验证也是自己做校验
export default function sendSMS(phone) { // 发送验证码方法, 需返回生成的验证码
let code = '123456'; // 生成验证码
//发送验证码
uni.showToast({title: `发送验证码给${phone}成功,请注意查收`, icon: 'none'});
return code; // 必须return生成的验证码
}
\ No newline at end of file
This diff is collapsed.
<template>
<QStemplate :title="title" :titleHide="titleHide" :fontSize="fontSize" :width="width" :titleFlex="titleFlex"
:contentFlex="contentFlex" :titleStyle="titleStyle" :contentStyle="contentStyle" :required="required" :requiredSign="requiredSign"
:layout="layout" :titleLayout="titleLayout" :itemDisabled="itemDisabled" :titleColor="titleColor">
<view class="flex_row_none_c width100 padding_10rpx_15rpx">
<checkbox-group @change="checkboxChange" class="width100 wrap" :class="itemLayout_computed">
<label class="fontColor666666 flex_row_none_c marginRight_15rpx padding_10rpx" v-for="(checkboxItem, checkboxIndex) in itemArray||[]"
:key="checkboxIndex">
<!-- checkboxItem.color|| -->
<!-- :color="color" -->
<checkbox :value="checkboxItem.value" :checked="getStatus[checkboxIndex]" :disabled="disabled" color="#FF6900"
:style="'transform: scale(' + (scale||'.8') + ');'" />
<view class="flex_row_none_c">{{checkboxItem.name}}</view>
</label>
</checkbox-group>
</view>
</QStemplate>
</template>
<script>
import _app from '../../js/app.js';
import QStemplate from '../../template/template.vue';
import QSInputsMixin from '../../js/QSInputsMixin.js';
export default {
components: {
QStemplate
},
props: {
itemArray: {
type: Array,
default () {
return []
}
},
color: {
type: String,
default: '#33cc33'
},
scale: {
type: String,
default: '.8'
},
disabled: {
type: Boolean,
default: false
}
},
computed:{
getStatus() {
const status = [];
const value = this.value;
const itemArray = this.itemArray;
if(value instanceof Array && value.length > 0) {
for(let i = 0; i < itemArray.length; i++) {
const j = value.findIndex(item=>item === itemArray[i].value)
if(j >= 0) {
status.push(true);
}else{
status.push(false);
}
}
}else{
itemArray.forEach(()=>{
status.push(false);
})
}
return status;
}
},
methods: {
checkboxChange({
detail: {
value
}
}) {
// console.info("infos");
// console.info("value",value);
this.setValue(value);
this.$emit("changeupdata",value);//触发change
}
},
mixins: [QSInputsMixin({
QSInputsType: _app.typeObj.checkbox
})]
};
</script>
<style scoped>
@import url("../../css/inputs.css");
</style>
<template>
<QStemplate :title="title" :titleHide="titleHide" :fontSize="fontSize" :width="width" :titleFlex="titleFlex"
:contentFlex="contentFlex" :titleStyle="titleStyle" :contentStyle="contentStyle" :required="required" :requiredSign="requiredSign"
:layout="layout" :titleLayout="titleLayout" :itemDisabled="itemDisabled" :titleColor="titleColor">
<view class="width100 padding_10rpx_15rpx wrap" :class="itemLayout_computed">
<view
class="flex_column_c_c border_radius_4px transition_border_point6s padding_10rpx"
v-for="(picsItem, picsIndex) in itemArray"
:key="picsIndex">
<view
class="flex_row_c_c border1pxf2f2f2 position_relative border_radius_4px backgrounColor_f8f8f8 picsBox">
<image
:src="picsItem.path"
class="border_radius_4px box_shadow_2px_2px_5px_ADADAD picsBox"
mode="aspectFill"
@tap.stop.prevent="showImg"
:data-picsindex="picsIndex">
</image>
<view
class="picsClear"
@tap.prevent.stop="clearPic"
:data-picsindex="picsIndex">
<uni-icon type="clear" :color="picsItem.clearColor||clearColor||'#f5105c'" :size="34"/>
</view>
<view
class="sortSelection flex_row_c_c"
:style="{
'background-color': sortSelectionArray[picsIndex]?(selectedColor||'#0099FF'):(unSelectedColor||'rgba(0,0,0,.7)'),
'border': (selectBorderColor||'1px solid rgba(255,255,255,.7)'),
'color': selectColor||'#fff'
}"
v-if="sortSelection" @tap.stop.prevent="sortSelectionFc" :data-picsindex="picsIndex">
{{
sortSelectionArray[picsIndex] || ''
}}
</view>
</view>
</view>
<view
class="flex_column_c_c border_radius_4px transition_border_point6s padding_10rpx"
v-if="max?(itemArray.length>=max?false:true):true">
<view
class="flex_row_c_c border1pxf2f2f2 position_relative border_radius_4px backgrounColor_f8f8f8 box_shadow_2px_2px_5px_ADADAD picsBox"
@tap="chooseImg">
<uni-icon type="image" :size="45" color="#999" />
</view>
</view>
</view>
</QStemplate>
</template>
<script>
import _app from '../../js/app.js';
import QStemplate from '../../template/template.vue';
import QSInputsMixin from '../../js/QSInputsMixin.js';
import uniIcon from '../../uniIcons/uni-icons.vue';
export default {
components: {
QStemplate,
uniIcon
},
props: {
max: { //最多选择图片数量
type: [String, Number],
default: ''
},
sortSelection: { //排序选择模式
type: Boolean,
default: false
},
defaultSelectAll: { //在排序选择模式下,用户未选择任何图片时是否默认选择全部
type: Boolean,
default: true
},
clearColor: {
type: String,
default: '#f5105c'
},
selectedColor: {
type: String,
default: '#0099FF'
},
unSelectedColor: {
type: String,
default: 'rgba(0,0,0,.7)'
},
selectBorderColor: {
type: String,
default: '1px solid rgba(255,255,255,.7)'
},
selectColor: {
type: String,
default: '#fff'
}
},
data() {
let itemArray;
if(this.value && this.value instanceof Array && this.value.length > 0) {
itemArray = this.value;
}else{
itemArray = [];
}
return {
itemArray,
sortSelectionArray: [],
sortSelectionCheckArray: []
}
},
methods: {
chooseImg() {
uni.chooseImage({
success: res => {
const tempFilePaths = res.tempFilePaths;
tempFilePaths.forEach(item=>{
this.itemArray.push({path: item});
})
this.setValue(this.getItemArray());
}
})
},
clearPic(
{currentTarget: { dataset: { picsindex } } } = {}
) {
const oldPath = this.itemArray[picsindex].path;
this.itemArray.splice(picsindex, 1);
if(this.sortSelection) {
const selectionIndex = this.sortSelectionCheckArray.findIndex(item=>item.path === oldPath);
if(selectionIndex >= 0) {
this.sortSelectionCheckArray.splice(selectionIndex, 1);
}
this.checkPicsCheckObj();
}
this.setValue(this.getItemArray());
},
showImg(
{currentTarget: { dataset: { picsindex } } } = {}
) {
_app.previewImage(this.itemArray.map(item=>item.path), picsindex);
},
sortSelectionFc(
{ currentTarget: { dataset: { picsindex } } } = {},
) {
const hasIndex = this.sortSelectionCheckArray.findIndex(item=>item.path === this.itemArray[picsindex].path);
if(hasIndex >= 0) {
this.sortSelectionCheckArray.splice(hasIndex, 1);
}else{
this.sortSelectionCheckArray.push(this.itemArray[picsindex]);
}
this.setValue(this.getItemArray());
this.checkPicsCheckObj();
},
checkPicsCheckObj(vbName) {
const newArray = [];
const itemArray = this.itemArray;
const sortSelectionCheckArray = this.sortSelectionCheckArray;
for(let i = 0; i < itemArray.length; i++) {
const index = sortSelectionCheckArray.findIndex(ite=>ite.path === itemArray[i].path);
if(index >= 0) {
newArray.push(index+1);
}else{
newArray.push('');
}
}
this.sortSelectionArray = newArray
},
setData(newArr) {
this.itemArray = newArr;
if(this.sortSelection) {
this.sortSelectionCheckArray = [];
}
this.setValue(this.getItemArray());
this.checkPicsCheckObj();
},
setUpLoadData(obj) {
this.upLoadData = obj;
if(this.sortSelection) {
this.sortSelectionCheckArray = [];
}
this.setValue(this.getItemArray());
this.checkPicsCheckObj();
},
getUpLoadPromiseArray() {
return _app.getUpLoadPromiseArray({
itemArray: [...this.getItemArray()],
customId: this.customId,
upLoadData: this.upLoadData,
required: this.required
});
},
getItemArray() {
if(this.sortSelection) {
if(this.sortSelectionCheckArray.length > 0) {
return this.sortSelectionCheckArray;
}else{
if(this.defaultSelectAll) {
return this.itemArray;
}else{
return [];
}
}
}else{
return this.itemArray;
}
}
},
mixins: [QSInputsMixin({
QSInputsType: _app.typeObj.infinitePics
})]
};
</script>
<style scoped>
@import url("../../css/inputs.css");
@import url("../../config/css/picsAndInfinitePics.css");
</style>
This diff is collapsed.
<template>
<view class="width100 borderBottom1pxf2f2f2" @tap.stop="show">
<QStemplate :title="title" :titleHide="titleHide" :fontSize="fontSize" :width="width" :titleFlex="titleFlex"
:contentFlex="contentFlex" :titleStyle="titleStyle" :contentStyle="contentStyle" :required="required" :requiredSign="requiredSign"
:layout="layout" :titleLayout="titleLayout" :itemDisabled="itemDisabled" :titleColor="titleColor">
<view class="flex_row width100">
<view class="flex_row_e_c padding_10rpx_15rpx Flex5" :class="nValue.data?'':'fontColorADADAD'">
{{nValue.data||placherhold}}
</view>
<view class="Flex1_5 flex_row_c_c">
<uniIcon type="forward" :size="fontSize" color="#666"></uniIcon>
</view>
</view>
</QStemplate>
<pickerCity
ref="inputsRef"
:height="height"
:fontScale="fontScale"
:buttonSet="buttonSet"
:dataSet="dataSet"
:showReset="showReset"
:title="pickerTitle"
:mode="mode"
:zIndex="zIndex"
:bgColor_title="bgColor_title"
:titleColor="pickerTitleColor"
:autoHide="autoHide"
@confirm="confirm"
@pickerChange="pickerChange"></pickerCity>
</view>
</template>
<script>
import _app from '../../js/app.js';
import QStemplate from '../../template/template.vue';
import QSInputsMixin from '../../js/QSInputsMixin.js';
import QSInputsPickerMixin from '../../js/QSInputsPickerMixin.js';
import pickerCity from '../../template/QS-picker/elements/QS-picker-city.vue';
import uniIcon from '../../uniIcons/uni-icons.vue';
export default {
components: {
QStemplate,
pickerCity,
uniIcon
},
mixins: [QSInputsMixin({
QSInputsType: _app.typeObj.picker_city
}), QSInputsPickerMixin()]
};
</script>
<style scoped>
@import url("../../css/inputs.css");
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<QStemplate :title="title" :titleHide="titleHide" :fontSize="fontSize" :width="width" :titleFlex="titleFlex"
:contentFlex="contentFlex" :titleStyle="titleStyle" :contentStyle="contentStyle" :required="required" :requiredSign="requiredSign"
:layout="layout" :titleLayout="titleLayout" :itemDisabled="itemDisabled">
<view class="flex_row_none_c width100 padding_10rpx_15rpx">
</view>
</QStemplate>
</template>
<script>
import _app from '../../js/app.js';
import QStemplate from '../../template/template.vue';
import QSInputsMixin from '../../js/QSInputsMixin.js';
export default {
components: {
QStemplate
},
props: {
},
methods: {
},
mixins: [QSInputsMixin({
QSInputsType: _app.typeObj.radio
})]
};
</script>
<style scoped>
@import url("../../css/inputs.css");
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment