Commit 6cbe1821 authored by 秦威威's avatar 秦威威

ui

parent e5aba52f
Pipeline #13 failed with stages
# 忽略UniApp编译生成的小程序相关目录
/unpackage/*
!/unpackage/res/*
/.idea/*
/.hbuilderx/*
/.svn/*
<script>
// https://ext.dcloud.net.cn/plugin?id=1287 绘制二维码插件地址
// https://ext.dcloud.net.cn/plugin?id=10446 地址三级联动插件地址
export default {
onLaunch: async function() {
// // #ifdef MP-WEIXIN
// this.autoUpdate()
// // #endif
const token = uni.getStorageSync('token')
// console.log(token)
// 有token先获取用户信息
if (token) {
this.$store.dispatch('user/getUserInfo');
}
},
onShow: function() {
},
onHide: function() {
},
methods: {
// 小程序检测更新
autoUpdate() {
// 获取小程序更新机制兼容
if (uni.canIUse('getUpdateManager')) {
const updateManager = uni.getUpdateManager()
// 检查是否有新版本发布
updateManager.onCheckForUpdate((res) => {
// console.log(res)
if (res.hasUpdate) {
//则静默下载新版本
updateManager.onUpdateReady(() => {
uni.showModal({
title: '更新提示',
content: '新版本已经准备好,是否重启应用?',
success: (res) => {
if (res.confirm) {
//新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate()
} else if (res.cancel) {
//如果需要强制更新,则给出二次弹窗,如果不需要,则这里的代码删掉
uni.showModal({
title: '温馨提示',
content: '我们已经做了新的优化,请及时更新哦~',
showCancel: false, //隐藏取消按钮,也可显示,取消会走res.cancel,然后从新开始提示
success: (res) => {
//第二次提示后,强制更新
if (res.confirm) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate()
} else if (res.cancel) {
//重新回到版本更新提示
this.autoUpdate()
}
}
})
}
}
})
})
// 新的版本下载失败
updateManager.onUpdateFailed(function() {
uni.showModal({
title: '温馨提示',
content: '新版本已经上线,请您删除当前小程序,重新搜索打开',
})
})
} else { // 没有新版本
}
})
} else {
// 提示用户在最新版本的客户端上体验
// uni.showModal({
// title: '温馨提示',
// content: '当前微信版本过低,可能无法使用该功能,请升级到最新版本后重试。'
// })
}
}
}
}
</script>
<style lang="scss">
/*每个页面公共css */
@import "@/uni_modules/uview-ui/index.scss";
@import "@/common/css/public.scss";
</style>
$app-main-color: #1FCA7C;
page {
height: 100%;
}
.container {
box-sizing: border-box; /* padding border 等不增加到宽高上 */
}
view,
scroll-view,
swiper,
button,
input,
textarea,
label,
navigator,
image {
box-sizing: content-box; /* padding border 等增加到宽高上 */
}
.flex {
display: flex;
}
.flex-wrap {
display: flex;
flex-wrap: wrap;
}
.flex-column {
display: flex;
flex-direction: column;
}
// 横轴
.flex-row-around {
display: flex;
justify-content: space-around;
}
.flex-row-between {
display: flex;
justify-content: space-between;
}
.flex-row-center {
display: flex;
justify-content: center;
}
// 纵轴
.flex-column-center {
display: flex;
align-items: center;
}
// 横轴 纵轴
.flex-around-center{
display: flex;
justify-content: space-around;
align-items: center;
}
.flex-between-center{
display: flex;
justify-content: space-between;
align-items: center;
}
.flex-center-center {
display: flex;
justify-content: center;
align-items: center;
}
.h-center {
justify-content: center;
}
.v-center {
align-items:center;
}
.vh-center {
justify-content: center;
align-items:center;
}
// 宽高
@for $i from 1 through 400 {
.w-#{$i} {
width: $i + rpx;
}
.h-#{$i} {
height: $i + rpx;
}
.lh-#{$i} {
line-height: $i + rpx;
}
}
// 字体大小
@for $i from 10 through 60 {
.fs-#{$i} {
font-size: $i + rpx;
}
}
.fw-400 {
font-weight: 400;
}
.fw-600 {
font-weight: 600;
}
.fw-700 {
font-weight: 700;
}
// 圆角
@for $i from 8 through 50 {
.br-#{$i} {
border-radius: $i + rpx;
}
}
// 内边距
@for $i from 5 through 200 {
.pad-#{$i} {
padding: $i + rpx;
}
.pt-#{$i} {
padding-top: $i + rpx;
}
.pr-#{$i} {
padding-right: $i + rpx;
}
.pb-#{$i} {
padding-bottom: $i + rpx;
}
.pl-#{$i} {
padding-left: $i + rpx;
}
.ptb-#{$i} {
padding-top: $i + rpx;
padding-bottom: $i + rpx;
}
.plr-#{$i} {
padding-left: $i + rpx;
padding-right: $i + rpx;
}
}
// 外边距
@for $i from 5 through 100 {
.mar-#{$i} {
margin: $i + rpx;
}
.mt-#{$i} {
margin-top: $i + rpx;
}
.mr-#{$i} {
margin-right: $i + rpx;
}
.mb-#{$i} {
margin-bottom: $i + rpx;
}
.ml-#{$i} {
margin-left: $i + rpx;
}
.mtb-#{$i} {
margin-top: $i + rpx;
margin-bottom: $i + rpx;
}
.mlr-#{$i} {
margin-left: $i + rpx;
margin-right: $i + rpx;
}
}
.center {
text-align: center;
}
// 订单的主要按钮
.main-btn {
width: 160rpx;
height: 72rpx;
border-radius: 60rpx;
text-align: center;
line-height: 72rpx;
color: #FFF;
background-color: $app-main-color;
}
// 订单的次要按钮
.minor-btn {
width: 160rpx;
height: 72rpx;
border: 2rpx solid #999999;
border-radius: 60rpx;
text-align: center;
line-height: 72rpx;
}
.bottom-box {
box-sizing: border-box;
}
// 沾满全屏的按钮
.fullscreen-btn {
height: 90rpx;
margin-left: 20rpx;
margin-right: 20rpx;
text-align: center;
line-height: 90rpx;
background-color: #1FCA7C;
border-radius: 12rpx;
color: #FFFFFF;
}
.full-btn {
height: 100rpx;
margin: 0 20rpx;
text-align: center;
line-height: 100rpx;
background-color: #EBF5F0;
border-radius: 50rpx;
color: #EEA616;
}
.overflow-y {
flex: 1;
overflow-y: auto;
}
button::after {
border: none;
}
button {
display: block;
line-height: normal;
background-color: #FFF;
padding-left: 0;
padding-right: 0;
margin: 0;
font-size: 32rpx;
}
\ No newline at end of file
import config from "config"
/**
* http请求
* @author 万世科技
* @param {Object} params
*/
function request(params) {
// console.log(params)
// const token = uni.getStorageSync('token')
const token = '237c5a89-2627-48a7-b0b7-49b68af09d3d'
return new Promise((resolve, reject) => {
try {
params.url = config.domain + params.url
params.method = params.method || 'POST'
if (params.loadingTip === '' || params.loadingTip) {
uni.showLoading({
title: params.loadingTip
})
}
uni.request({
...params,
header: {
"token": token || ''
},
success: (res) => {
// console.log(res)
// 防止组件那边使用showLoading这里提前关闭
if(params.loadingTip === '' || params.loadingTip){
uni.hideLoading()
}
// 这里判断code为1,组件那边不需要再判断then回调就是成功
if (res.statusCode === 200 && res.data.code === 1) {
resolve(res.data)
} else if (res.statusCode === 401 || res.data.code === 401) { // 未登录,或登录过期
// toLogin()
} else {
reject(res.data || {})
}
},
fail: (err) => {
// console.log('失败')
// console.log(err)
uni.hideLoading()
if(err.data.code === 401) {
// toLogin()
}
reject(err || {})
}
})
} catch (err) {
reject(err)
}
})
}
function toLogin(){
uni.$u.toast('登录过期')
uni.clearStorageSync();
setTimeout(()=> {
uni.reLaunch({
url: '/pages/login/wechatlogin'
})
}, 600)
}
export default request
\ No newline at end of file
This diff is collapsed.
<template>
<view class="page-content">
<!-- 选择器背景 -->
<view class="page-mask"></view>
<!-- 选择器主体 -->
<view class="page-main" :style="'height:60%'">
<!-- 操作区域 包含取消和确定 -->
<view class="main-operate">
<text class="title-txt" @click.stop="handleCancel">取消</text>
<text class="title-txt" @click.stop="handleSubmit">确定</text>
</view>
<!-- 已选择的地址信息 -->
<view class="main-select" :class="[selectAreaLevelLimit == 3 ? 'w33_percent' : '']">
<text v-if="showIndex == 0 || provinceObj.label" :class="showIndex == 0 ? 'select' : ''"
@click="anewSelect(0)">{{ provinceObj.label || "请选择" }}</text>
<text v-if="showIndex == 1 || cityObj.label" :class="showIndex == 1 ? 'select' : ''"
@click="anewSelect(1)">{{ cityObj.label || "请选择" }}</text>
<text v-if="showIndex == 2 || areaObj.label" :class="showIndex == 2 ? 'select' : ''"
@click="anewSelect(2)">{{ areaObj.label || "请选择" }}</text>
</view>
<!-- 待选择的地址信息 -->
<view class="main-list">
<view v-if="showIndex == 0">
<view class="list-box" :class="provinceObj.value == item.value ? 'active' : ''"
@click="handleSelectAddress(0, item)" v-for="item in provinceData" :key="item.value">
<text>{{ item.label }}</text>
</view>
</view>
<view v-if="showIndex == 1">
<view class="list-box" :class="cityObj.value == item.value ? 'active' : ''"
@click="handleSelectAddress(1, item)" v-for="item in cityData" :key="item.value">
<text>{{ item.label }}</text>
</view>
</view>
<view v-if="showIndex == 2">
<view class="list-box" :class="areaObj.value == item.value ? 'active' : ''"
@click="handleSelectAddress(2, item)" v-for="item in areaData" :key="item.value">
<text>{{ item.label }}</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: "address-modal",
props: {
areaInfoSelected: {
type: Object,
default: {
},
},
selectAreaLevelLimit: {
type: Number,
default: 3,
}
},
data() {
return {
showIndex: 0, //地区显示
provinceObj: {},
cityObj: {},
areaObj: {},
heightCot: 30, //设置屏幕高度 0 ~ 100
provinceData: "", // 当前展示的省数据
cityData: [], // 当前展示的市数据
areaData: [], //当前展示的区数据
};
},
mounted() {
if (this.areaInfoSelected.fullAreaTextInitial) {
let {
fullAreaTextInitial
} = this.areaInfoSelected;
let _arr = fullAreaTextInitial.split(",");
this.provinceObj = this.areaInfoSelected.provinceObj;
this.cityObj = this.areaInfoSelected.cityObj;
this.areaObj = this.areaInfoSelected.areaObj;
if (_arr.length == 1) {
this.handleGetMap({}, "init");
}
if (_arr.length == 2) {
this.handleGetMap(this.areaInfoSelected.provinceObj, "pro");
}
if (_arr.length == 3) {
this.handleGetMap(this.areaInfoSelected.cityObj, "city");
}
if (_arr.length == 4) {
this.handleGetMap(this.areaInfoSelected.areaObj, "area");
}
} else {
this.handleGetMap({}, "init");
}
this.getScreen();
},
onShow() {},
methods: {
//组件高度自适应
getScreen() {
let that = this;
uni.getSystemInfo({
success: (res) => {
that.heightCot = (res.safeArea.height * 2) / 2;
},
});
},
//取消
handleCancel() {
this.$emit("cancel");
},
//确定
handleSubmit() {
const {
provinceObj,
cityObj,
areaObj
} = this;
console.log(cityObj)
const arr = [provinceObj, cityObj, areaObj];
let _fullAreaText = [];
arr.map((item) => {
if (item.value) {
_fullAreaText.push(item.label);
}
});
if (this.selectAreaLevelLimit == 3) {
if (_fullAreaText.length !== 3) {
uni.showToast({
icon: "none",
title: "地址需精确到地区",
});
return
}
} else {
if (_fullAreaText.length !== this.selectAreaLevelLimit) {
uni.showToast({
icon: "none",
title: "地址需精确到街道",
});
return
}
}
let areaInfoObj = {
fullAreaTextInitial: _fullAreaText.toString(),
fullAreaText: _fullAreaText.toString().replace(/,/g, ""),
provinceCode: provinceObj.value || "",
cityCode: cityObj.value || "",
areaCode: areaObj.value || "",
provinceObj,
cityObj,
areaObj
};
this.$emit("confirm", areaInfoObj);
},
//下拉选择
anewSelect(num) {
console.log(num)
switch (num) {
case 0:
this.showIndex = 0;
this.cityObj = {};
this.areaObj = {};
this.cityData = [];
this.areaData = [];
this.handleGetMap({}, "init");
break;
case 1:
this.showIndex = 1;
this.areaData = [];
// if (!this.areaObj.areaCode) return;
this.areaObj = {};
this.handleGetMap(this.provinceObj, "pro");
break;
case 2:
this.showIndex = 2;
// if (!this.areaObj.areaCode) return;
// this.areaObj = {};
// this.handleGetMap(this.areaObj, "area");
// break;
}
},
handleGetMap(obj, type) {
//name选择名称 type类型
if (type !== "init") {
uni.showLoading({
title: "加载中",
mask: true,
});
}
let queryParam
if (type == 'init') {
queryParam = {
url: '/addons/shop/api.common/area',
}
}
if (type == 'pro') {
queryParam = {
url: '/addons/shop/api.common/area',
data: {
province: obj.value
}
}
}
if (type == 'city') {
queryParam = {
url: '/addons/shop/api.common/area',
data: {
city: obj.value
}
}
}
this.$request(queryParam).then((resp) => {
uni.hideLoading();
if (resp.code == 1) {
let arr = ["init", "pro", "city", "area"];
let _obj = {
init: "provinceData",
pro: "cityData",
city: "areaData"
};
this[_obj[type]] = resp.data;
this.showIndex = arr.indexOf(type);
} else {
uni.hideLoading();
uni.showToast({
icon: "none",
title: resp.msg,
position: "center",
duration: 2000,
});
}
});
},
handleSelectAddress(type, obj) {
switch (type) {
case 0:
//选择省
this.handleGetMap(obj, "pro");
this.provinceObj = obj;
this.showIndex = 1;
this.cityData = [];
this.areaData = [];
break;
case 1:
//选择市
this.handleGetMap(obj, "city");
this.cityObj = obj;
this.showIndex = 2;
this.areaData = [];
break;
case 2:
//选择区
this.areaObj = obj;
this.handleSubmit()
break;
default:
break;
}
},
},
};
</script>
<style lang="scss" scoped>
.page-mask {
position: fixed;
width: 100%;
height: 100vh;
z-index: 998;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.6);
}
.page-main {
height: 100vh;
position: fixed;
z-index: 999;
bottom: 0;
left: 0;
right: 0;
background-color: #ffffff;
padding: 20rpx;
border-top: 1rpx solid rgba(0, 0, 0, 0.2);
border-radius: 16rpx 16rpx 0 0;
max-height: 60%;
.main-operate {
padding: 0 10rpx 10rpx 10rpx;
display: flex;
justify-content: space-between;
.title-txt {
color: #343434;
font-size: 30rpx;
&:nth-child(2) {
color: #000;
}
}
}
.main-select {
display: flex;
justify-content: flex-start;
color: #343434;
font-size: 30rpx;
height: 100rpx;
line-height: 100rpx;
text {
display: inline-block;
width: 25%;
text-align: center;
overflow: hidden;
-webkit-line-clamp: 1;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
text-align: center;
}
.select {
color: #000;
position: relative;
&::after {
content: "";
width: 100%;
height: 6rpx;
background: #ff4242;
position: absolute;
left: 0;
bottom: -8rpx;
}
}
}
.main-list {
overflow-y: auto;
color: #343434;
font-size: 30rpx;
width: 100%;
height: 72%;
overflow: auto;
.list-box {
display: flex;
flex-direction: column;
height: 100rpx;
line-height: 100rpx;
border-bottom: 2rpx solid #dedede;
}
.list-box:last-child {
border-bottom: none;
}
.active {
color: #000;
}
}
}
</style>
\ No newline at end of file
<template>
<view class="list">
<view v-for="(item, index) in 5" :key="index" class="item">
<view class="user-info-box">
<view class="left">
<image src="@/static/logo.png"></image>
<view style="display: flex;flex-direction: column;">
<text>秦**黄</text>
<text class="fs-24 mt-20" style="color: #999999;">2023-04-02 12:12</text>
</view>
</view>
<view class="rate-box">
<u-rate :count="5" :readonly="true" size="25" activeColor="#F29600"></u-rate>
</view>
</view>
<view class="comment-imgs">
<image v-for="(img, imgIndex) in 3" :key="imgIndex" @click="onPreviewImage(item.images, imgIndex)"
src="@/static/logo.png"></image>
</view>
<view class="comment-content">
<text>速度快,好评!!!谷歌翻译新增了5种语音的翻译,它们分别是基尼亚卢旺达语(卢旺达)、奥里亚语。</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
score: '',
goodsId: '',
commentList: [],
currentPage: 1,
isEmpty: false,
};
},
onLoad(options) {
this.goodsId = options.goodsId
this.score = options.score
// this.getCommentList()
},
methods: {
// 获取评价列表
getCommentList() {
const params = {
url: '/api/order/comment_list',
data: {
page: this.currentPage,
goods_id: this.goodsId
}
}
this.$request(params).then(res => {
// console.log(res)
this.commentList = this.commentList.concat(res.data.data)
if (this.commentList.length >= res.data.total) {
this.isEmpty = true
}
}).catch(err => {
})
},
scrolltolower(e) {
if (!this.isEmpty) {
this.currentPage += 1
this.getCommentList()
}
},
onPreviewImage(imgList, index){
let imgData = []
imgList.map(item => {
imgData.push(this.$config.domain + item)
})
uni.previewImage({
current: index,
urls: imgData
})
}
},
};
</script>
<style scoped>
.item:first-child {
padding: 0 0 30rpx;
}
.item {
padding: 30rpx 0;
border-bottom: 2rpx solid #F5F5F5;
}
.user-info-box {
display: flex;
justify-content: space-between;
align-items: center;
}
.user-info-box .left {
display: flex;
align-items: center;
}
.user-info-box .left > image {
width: 96rpx;
height: 96rpx;
border-radius: 50%;
margin-right: 20rpx;
}
.rate-box {
}
.comment-content {
margin-top: 20rpx;
}
.comment-imgs {
margin-top: 30rpx;
display: flex;
align-items: center;
}
.comment-imgs > image {
width: 32%;
height: 180rpx;
margin-right: 30rpx;
border-radius: 15rpx;
}
</style>
<template>
<view>
<view class="mt-32 flex-between-center">
<view @click="onOpenStartTime" class="select-time">
<text v-if="!startTimeValue">选择开始时间</text>
<text v-else>{{ startTimeValue }}</text>
</view>
<text class="fs-30" style="color: #999999;">-</text>
<view @click="onOpenEndTime" class="select-time">
<text v-if="!endTimeValue">选择结束时间</text>
<text v-else>{{ endTimeValue }}</text>
</view>
</view>
<!-- 选择开始时间 -->
<u-datetime-picker :show="startTimeShow" v-model="startTime" title="开始时间" mode="datetime" :formatter="formatter"
:closeOnClickOverlay="true" @confirm="onConfirmStartTime"
@close="startTimeShow = false"></u-datetime-picker>
<!-- 选择结束时间 -->
<u-datetime-picker :show="endTimeShow" v-model="endTime" title="结束时间" mode="datetime" :formatter="formatter"
:closeOnClickOverlay="true" @confirm="onConfirmEndTime" @close="endTimeShow = false"></u-datetime-picker>
</view>
</template>
<script>
export default {
data() {
return {
startTimeShow: false,
startTimeValue: '',
startTime: new Date().getTime(),
endTimeShow: false,
endTime: new Date().getTime(),
endTimeValue: ''
}
},
methods: {
formatter(type, value) {
if (type === 'year') {
return `${value}年`
}
if (type === 'month') {
return `${value}月`
}
if (type === 'day') {
return `${value}日`
}
if (type === 'hour') {
return `${value}点`
}
if (type === 'minute') {
return `${value}分`
}
return value
},
onOpenStartTime() {
this.startTimeShow = true
},
onOpenEndTime() {
this.endTimeShow = true
},
onConfirmStartTime(e) {
// console.log(e)
this.startTimeShow = false
this.startTimeValue = this.$wskj.timeFormat(e.value, 'yyyy-mm-dd hh:MM:ss')
this.$emit('onConfirmStartTime', this.startTimeValue)
},
onConfirmEndTime(e) {
this.endTimeShow = false
this.endTimeValue = this.$wskj.timeFormat(e.value, 'yyyy-mm-dd hh:MM:ss')
this.$emit('onConfirmEndTime', this.endTimeValue)
},
}
}
</script>
<style scoped>
.select-time {
width: 322rpx;
height: 84rpx;
text-align: center;
line-height: 84rpx;
background: #f7f7f7;
border-radius: 5px;
font-size: 30rpx;
color: #999999;
}
</style>
\ No newline at end of file
<template>
<view id="drapdown">
<view class="tab-box">
<view
@click="onChangeDrapShow(index)"
:style="currentTab === index? activeStyle : inactiveStyle"
class="tab-item"
v-for="(item, index) in tabList" :key="index"
>
<text>{{ item.label }}</text>
<u-icon :color="getDownIcon(index).color" :size="getDownIcon(index).size" :name="getDownIcon(index).name"></u-icon>
</view>
</view>
<view class="drop-down-popup">
<u-transition :show="drapShow" @click="onClose" :custom-style="overlayStyle" mode="fade">
<view class="child-list" :style="{'height': contentHeight + 'rpx'}">
<view @click="onClickLabel(item, index)" v-for="(item, index) in currentChildList" :key="index" class="label-item">
<text>{{ item.label }}</text>
</view>
</view>
</u-transition>
</view>
</view>
</template>
<script>
export default {
props: {
tabList: { // 数据列表
type: Array,
default: []
},
iconSize: { // 上下图标大小
type: String,
default: '14'
},
activeStyle: { // 菜单选中的样式
type: Object,
default: {'color': '#3c9cff'}
},
inactiveStyle: { // 菜单非选中的样式
type: Object,
default: {'color': '#000'}
}
},
data() {
return {
currentTab: '',// 当前选中的tab
drapShow: false, // 蒙版显示隐藏
overlayStyle: {}, // 蒙版样式
contentHeight: 0 // 内容高度(用于动画)
};
},
computed: {
currentChildList(){ // 蒙版内展示的数据内容
if(this.currentTab !== '') {
return this.tabList[this.currentTab].children
} else {
return []
}
},
getDownIcon() { // 动态设置图标
return (index) => {
const style = {
size: this.iconSize,
color: this.inactiveStyle['color'],
name: 'arrow-up-fill'
}
if (this.drapShow && this.currentTab === index) { // 下拉菜单打开选项变蓝色
style.color = this.activeStyle['color']
style.name = 'arrow-down-fill'
}
return style;
}
}
},
mounted(){
this.init()
},
methods: {
// 初始化样式,决定蒙版位置,放在tab下
init(){
const query = uni.createSelectorQuery().in(this);
query.select('#drapdown').boundingClientRect(data => {
// console.log(data)
console.log(this.$u.sys())
let top = 0
// #ifdef H5
top += this.$u.sys().windowTop;
// #endif
this.overlayStyle = {
position: 'fixed',
top: `${data.top + top + 50}px`, // 50是tablist高度
left: 0,
right: 0,
zIndex: 998,
bottom: 0,
'background-color': `rgba(0, 0, 0, ${0.5})`
}
}).exec();
},
// 打开关闭蒙版
onChangeDrapShow(index){
if(this.drapShow && this.currentTab === index) {
this.currentTab = ''
this.contentHeight = 0
this.drapShow = false
} else {
this.currentTab = index
this.contentHeight = this.currentChildList.length * 90
this.drapShow = true
}
},
// 关闭蒙版
onClose(){
this.currentTab = ''
this.contentHeight = 0
this.drapShow = false
},
// 点击蒙版内数据
onClickLabel(item, index){
this.onClose()
this.$emit('click', item, index)
}
}
};
</script>
<style scoped>
.tab-box {
height: 100rpx;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20rpx;
background-color: #FFF;
}
.tab-item {
height: 100%;
display: flex;
align-items: center;
}
.tab-item > text{
margin-right: 10rpx;
}
.child-list {
background-color: #FFF;
overflow: hidden;
transition: all .15s;
}
.label-item {
padding: 24rpx 24rpx;
}
.mask-popup{
transition: opacity 300ms ease-out 0ms, -webkit-transform 300ms ease-out 0ms, transform 300ms ease-out 0ms;
transform-origin: 50% 50%;
}
</style>
<template>
<view class="flex-column flex-column-center">
<image class="w-380 h-380" src="@/static/emptydata.png"></image>
<text class="fs-26">{{ emptyText }}</text>
</view>
</template>
<script>
export default {
props: {
emptyText: {
type: String,
default: '暂无数据'
}
}
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<view class="com-list">
<view v-for="(item, index) in 3" :key="index"
@click="$wskj.authTo('/pages/home/goodsdetails?goodsId=' + item.id)" class="good-item" :style="{'margin-right': (index+1) % 2 === 0? '0' : '30rpx'}">
<image class="good-img" src="@/static/logo.png"></image>
<view class="bottom">
<text>商品标题</text>
<!-- 价格 销量 -->
<view class="sales-box">
<text class="fw-600 fs-40" style="color: #FE2C24;">{{ 100 }}</text>
<text class="fs-24" style="color: #999;">销量:2</text>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
props: ['goodsDataList'],
data() {
return {
};
}
};
</script>
<style scoped>
.com-list {
display: flex;
flex-wrap: wrap;
}
.good-item {
width: 47.8%;
display: flex;
flex-direction: column;
margin-bottom: 24rpx;
position: relative;
border-bottom-left-radius: 16rpx;
border-bottom-right-radius: 16rpx;
}
.good-img {
width: 100%;
height: 330rpx;
border-top-left-radius: 16rpx;
border-top-right-radius: 16rpx;
}
.bottom {
padding: 20rpx;
display: flex;
flex-direction: column;
background-color: #FFF;
}
.sales-box {
margin-top: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
</style>
<template>
<view>
<!--版本更新弹窗-->
<wskj-modal :show="updateShow" @confirm="onConfirmUpdate" @close="updateShow = false" @cancel="updateShow = false">
<view class="updateVer-box">
<!-- 升级内容 -->
<view class="center fw-600">
<text>版本更新</text>
</view>
<view class="center mt-20">
<text>检测到有新版本,您需要更新才可继续使用v:{{ newVersion }}</text>
</view>
</view>
</wskj-modal>
<!--进度条弹窗-->
<wskj-modal :show="progress" :closeOnClickOverlay="false" :showConfirmButton="false" :showCancelButton="true" @cancel="onPercentageModalCancel">
<view class="progress-modalbox">
<view class="center fw-600">
<text>下载中</text>
</view>
<view class="mt-30">
<u-line-progress style="width: 100%;" :percentage="downLoadPercentage" activeColor="#FF0000"
height="20"></u-line-progress>
</view>
</view>
</wskj-modal>
</view>
</template>
<script>
export default {
props: {
time: {
type: Number,
default: 0
},
packageUrl: { // 下载安装包地址
type: String,
default: ''
},
newVersion: { // 新版本号
type: String,
default: ''
},
force: { // 是否强制更新
type: [Boolean, Number],
default: false
}
},
data() {
return {
updateShow: false, // 是否确认更新弹窗
downloadTask: null, // 下载任务
progress: false, // 下载进度弹窗
downLoadPercentage: 0 // 下载进度
};
},
watch: {
time(newValue, oldValue) {
if(this.packageUrl) {
if(!this.force){ // 不强制更新
this.updateShow = true
} else { // 强制更新
this.updateShow = false
this.downLoadApp()
}
}
}
},
methods: {
// 点击确认更新
onConfirmUpdate() {
this.updateShow = false
this.downLoadApp()
},
// 下载APP
downLoadApp() {
this.progress = true
this.downloadTask = uni.downloadFile({ //执行下载
url: this.packageUrl, // 下载地址
//下载成功 onProgressUpdate监听到下载100这里才执行
success: downloadResult => {
// console.log(downloadResult)
this.progress = false // 关闭下载进度弹窗
if (downloadResult.statusCode == 200) {
uni.showModal({
title: '',
content: '更新成功,确定现在重启吗?',
showCancel: false,
confirmText: '重启',
confirmColor: '#7737FD',
success: (res) => {
if (res.confirm == true) {
plus.runtime.install( //安装
downloadResult.tempFilePath, {
force: true
},
function(res) {
utils.showToast(
'更新成功,重启中');
plus.runtime
.restart(); // 重启
// plus.runtime.quit(); 退出
}
);
}
}
});
} else {
this.$u.toast('下载失败')
}
},
fail: (err) => {
// this.$u.toast('下载失败')
this.progress = false // 关闭下载进度弹窗
},
});
// 监听下载进度
this.downloadTask.onProgressUpdate((res) => {
// console.log('下载进度' + res.progress);
// console.log('已经下载的数据长度' + res.totalBytesWritten);
// console.log('预期需要下载的数据总长度' + res.totalBytesExpectedToWrite);
this.downLoadPercentage = res.progress
});
},
// 下载进度弹窗取消
onPercentageModalCancel() {
// console.log('取消')
if (this.enforce) {
this.$u.toast('本次更新不可取消')
} else {
this.downloadTask.abort()
this.progress = false
this.$u.toast('取消下载')
}
},
},
};
</script>
<style scoped>
.updateVer-box {
background-color: #FFF;
padding: 0 40rpx;
border-radius: 20rpx;
width: 500rpx;
}
.progress-modalbox {
width: 500rpx;
padding: 30rpx 40rpx;
background-color: #FFF;
border-radius: 20rpx;
}
</style>
\ No newline at end of file
<template>
<u-upload :capture="['album', 'camera']" :multiple="true" :fileList="fileList"
@afterRead="afterRead($event, 'fileList')" @delete="deletePic($event, 'fileList')" :maxCount="maxCount" :width="width"
:height="height">
<image :style="{'width': width + 'px', 'height': height + 'px'}" src="@/static/my/upload.png"></image>
</u-upload>
</template>
<script>
export default {
props: {
width: {
type: String,
default: '100'
},
height: {
type: String,
default: '100'
},
maxCount: {
type: String,
default: '9'
},
type: {
type: String,
default: 'fullurl'
},
images: { // 重置fileList把images设为空即可
type: String,
default: ''
}
},
data() {
return {
fileList: []
}
},
model: {
prop: 'images',
event: 'upload'
},
watch: {
images: {
immediate: true,
handler(newVal, oldVal){
// console.log(newVal)
// console.log(this.fileList)
this.fileList = []
if(newVal){
const urlList = newVal.split(",")
urlList.forEach(item => {
// 防止直接传递全路径
let url = this.removeUrl(item, this.$config.domain)
this.fileList.push({
status: 'success',
message: '',
fullurl: this.$config.domain + url,
url: url
})
})
}
}
}
},
methods: {
// 删除图片
deletePic(event, type) {
this.fileList.splice(event.index, 1)
this.uploadParseData()
},
// 新增图片
async afterRead(event, type) {
// console.log(event)
let lists = [].concat(event.file)
let fileListLen = this.fileList.length
lists.map((item) => {
this.fileList.push({
...item,
status: 'uploading',
message: '上传中'
})
})
for (let i = 0; i < lists.length; i++) {
const result = await this.$wskj.uploadImg(lists[i].url)
// console.log(result)
let item = this[[type]][fileListLen]
this.fileList.splice(fileListLen, 1, Object.assign(item, {
status: 'success',
message: '',
url: result.url,
fullurl: result.fullurl
}))
fileListLen++
}
this.uploadParseData()
},
uploadParseData(){
const images = this.fileList.map(item => item[this.type]).join(",")
this.$emit('upload', images)
},
removeUrl(str, urlToRemove) {
// 使用正则表达式匹配要删除的URL,确保匹配整个字符串
// 注意:这里我们假设urlToRemove不包含查询字符串或路径,如果包含,需要调整正则表达式
const regex = new RegExp(urlToRemove, 'g');
// 使用replace方法替换匹配的URL为空字符串,即删除它们
return str.replace(regex, '');
}
}
}
</script>
<style scoped>
</style>
\ No newline at end of file
<template>
<u-modal
:show="show"
:title="title"
:confirmText="confirmText"
:cancelText="cancelText"
:showCancelButton="true"
:confirmColor="confirmColor"
:cancelColor="cancelColor"
:closeOnClickOverlay="true"
@confirm="$emit('confirm')"
@cancel="$emit('cancel')"
@close="$emit('close')"
>
<slot></slot>
</u-modal>
</template>
<script>
export default {
props: {
show: {
type: Boolean,
default: false
},
title: {
type: String,
default: ''
},
confirmText: {
type: String,
default: '确认'
},
cancelText: {
type: String,
default: '取消'
},
confirmColor: {
type: String,
default: '#2979ff'
},
cancelColor: {
type: String,
default: '#606266'
}
},
created() {
},
};
</script>
<style scoped>
</style>
<template>
<u-overlay :show="show">
<view class="modal-main">
<view class="modal-content">
<slot></slot>
</view>
<view @click="$emit('close')" class="close">
<image src="@/static/close.png"></image>
</view>
</view>
</u-overlay>
</template>
<script>
export default {
props: {
show: {
type: Boolean,
default: false
}
},
data() {
return {
}
}
}
</script>
<style scoped>
.modal-main {
width: 90%;
margin: auto;
}
.modal-content {
min-height: 500rpx;
padding: 32rpx 32rpx 48rpx;
background-color: #FFF;
border-radius: 16rpx;
}
.close {
margin-top: 48rpx;
text-align: center;
}
.close > image {
width: 64rpx;
height: 64rpx;
}
</style>
\ No newline at end of file
<template>
<u-popup
:show="show"
:mode="mode"
:closeable="closeable"
:round="round"
@close="$emit('close')"
@open="$emit('open')"
>
<slot></slot>
</u-popup>
</template>
<script>
export default {
props: {
show: {
type: Boolean,
default: false
},
mode: {
type: String,
default: 'bottom'
},
closeable: {
type: Boolean,
default: true
},
round: {
type: String,
default: '10'
}
},
created() {
},
};
</script>
<style scoped>
</style>
export default {
domain: 'https://smxy0327.idiaoyuyi.com', // 项目域名
cdnUrl: '', // 云储蓄静态资源图片域名
amapKey: '' , // 高德web服务key
socketUrl: ''// websocket地址
}
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<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>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>
import App from './App'
// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
import uView from '@/uni_modules/uview-ui'
import mixinsConfig from '@/mixins/config.js'
// #ifdef MP-WEIXIN
import share from '@/mixins/share.js' // 导入并挂载全局的分享方法
// #endif
import store from '@/store';
import wskj_function from "@/common/wskj_function.js"
import request from "@/common/request.js"
import config from "@/config.js"
import emptydata from "@/components/emptydata"
import comment from "@/components/comment"
import goodslist from "@/components/goodslist"
import wskjmodal from "@/components/wskj-modal"
import wskjpopup from "@/components/wskj-popup"
import uploadimage from "@/components/upload-image"
import wskjmodelclose from "@/components/wskj-model-close"
// 全局组件
Vue.component("emptydata", emptydata)
Vue.component("comment", comment)
Vue.component("goodslist", goodslist)
Vue.component("wskj-modal", wskjmodal)
Vue.component("wskj-popup", wskjpopup)
Vue.component("upload-image", uploadimage)
Vue.component("wskj-model-close", wskjmodelclose)
// 全局混入
// #ifdef MP
Vue.mixin(mixinsConfig) // 混入用于在组件中可使用
// #endif
// #ifdef MP-WEIXIN
Vue.mixin(share) // 全局分享
// #endif
Vue.use(uView)
Vue.prototype.$wskj = wskj_function
Vue.prototype.$request = request
Vue.prototype.$store = store;
Vue.prototype.$config = config;
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
// #endif
// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
// #endif
\ No newline at end of file
{
"name": "basis-template",
"appid": "__UNI__7B80478",
"description": "",
"versionName": "1.0.0",
"versionCode": "100",
"transformPx": false,
/* 5+App特有相关 */
"app-plus": {
"usingComponents": true,
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
},
/* 模块配置 */
"modules": {},
/* 应用发布信息 */
"distribute": {
/* android打包配置 */
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
/* ios打包配置 */
"ios": {},
/* SDK配置 */
"sdkConfigs": {}
}
},
/* 快应用特有相关 */
"quickapp": {},
/* 小程序特有相关 */
"mp-weixin": {
"appid": "wxa54fb690ac0a3f64",
"setting": {
"urlCheck": false
},
"usingComponents": true
},
"mp-alipay": {
"usingComponents": true
},
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao": {
"usingComponents": true
},
"uniStatistics": {
"enable": false
},
"vueVersion": "2"
}
\ No newline at end of file
import config from "@/config.js"
export default {
data() {
return {
$config: config
}
}
}
\ No newline at end of file
// 定义全局分享
export default {
data() {
return {
// 默认的全局分享内容
share: {
title: '分享标题',
path: '/pages/global', // 全局分享的路径
imageUrl: 'https://sbc.itanzhu.com/uploads/logo.png', // 全局分享的图片(可本地可网络)
}
}
},
// 1.发送给朋友
onShareAppMessage(res) {
const userInfo = uni.getStorageSync('userInfo')
return {
title: this.share.title,
path: this.share.path + '?userId=' + userInfo.userid,
imageUrl: this.share.imageUrl,
}
},
// 2.分享到朋友圈
onShareTimeline(res) {
const userInfo = uni.getStorageSync('userInfo')
return {
title: this.share.title,
path: this.share.path + '?userId=' + userInfo.userid,
imageUrl: this.share.imageUrl,
}
},
}
\ No newline at end of file
{
"name": "basis-template",
"version": "1.0.0",
"description": "一、首页模块\r \t1.app登录页面--注册页面--忘记密码\r \t2.微信小程序登录页面",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://gitee.com/wsdzkj/uni-app-basic-template.git"
},
"author": "",
"license": "ISC",
"dependencies": {
"jweixin-module": "^1.6.0"
}
}
{
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/wy-home",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/wy-bmfw",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/wy-mine",
"style": {
"navigationStyle": "custom"
}
}
],
"subPackages": [{
"root": "pagesMain",
"pages": [{
"path": "pages/fkdj",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/shjf",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/bxbs",
"style": {
"navigationBarTitleText": "报修报事"
}
},
{
"path": "pages/bxbs_submit",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/bxbs_lsgd",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/tjsq",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/bxxq",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/fwgz",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/cydh",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/tsby",
"style": {
"navigationBarTitleText": "投诉表扬"
}
},
{
"path": "pages/tsby_submit",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/tsby_lsgd",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/jnzd",
"style": {
"navigationBarTitleText": "缴纳账单"
}
},
{
"path": "pages/jnzd_ccc",
"style": {
"navigationBarTitleText": "缴纳账单"
}
},
{
"path": "pages/jnzd_qt",
"style": {
"navigationBarTitleText": "缴纳账单"
}
},
{
"path": "pages/jnzd_wyf",
"style": {
"navigationBarTitleText": "缴纳账单"
}
},
{
"path": "pages/jnzd_wyfmx",
"style": {
"navigationBarTitleText": "缴纳账单"
}
},
{
"path": "pages/jnzd_tcfmx",
"style": {
"navigationBarTitleText": "缴纳账单"
}
}
]
}],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#FFFFFF",
"backgroundColor": "#FFFFFF"
},
/* 底部菜单 */
"tabBar": {
"color": "#000000", //菜单上的文字默认颜色
"selectedColor": "#FF6B89", //菜单上的文字选中时的颜色
"borderStyle": "white", //菜单上边框的颜色,仅支持 black/white
"list": [{
"pagePath": "pages/wy-home", //页面路径,必须在 pages 中先定义
"iconPath": "static/tabbar/home.png", //建议尺寸为 81px * 81px
"selectedIconPath": "static/tabbar/homeHL.png", //建议尺寸为 81px * 81px
"text": "首页" //菜单上按钮文字,在 5+APP H5 平台为非必填。例如中间可放一个没有文字的+号图标
},
{
"pagePath": "pages/wy-bmfw",
"iconPath": "static/tabbar/cart.png",
"selectedIconPath": "static/tabbar/cartHL.png",
"text": "便民服务"
},
{
"pagePath": "pages/wy-mine",
"iconPath": "static/tabbar/my.png",
"selectedIconPath": "static/tabbar/myHL.png",
"text": "个人中心"
}
]
},
"uniIdRouter": {}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
<template>
<view class='container'>
<view class="wapper">
<view class="left-box">
<view class="left">
<scroll-view scroll-y style="height: 100%;">
<view v-for="(item, index) in 8" :key="index" @click="onClickLeftIfy(index)" :class="{'active': currentIfy === index}" class="left-item">
<text>分类</text>
</view>
</scroll-view>
</view>
</view>
<!-- 一级分类 -->
<view v-if="true" class="right-box">
<view id="right" class="right">
<scroll-view scroll-y class="children-scroll" @scrolltolower="scrolltolower">
<view class="goods-box-yiji">
<view
@click="$wskj.to('/pages/home/twolevelclassify?pid=' + item.id)"
class="good-item-yiji"
v-for="(item, index) in 20"
:key="index"
>
<image src="@/static/logo.png"></image>
<view style="flex:1;" class="fs-28 ptb-10 flex flex-column flex-row-between">
<text>男士多口袋后宫嘻哈流行裤长裤街头服装运动裤休闲</text>
<view class="flex-between-center">
<view class="flex-column-center">
<text style="color: #FE2C24;" class="fs-36"><text class="fs-24"></text>200</text>
<text class="fs-24 ml-15" style="text-decoration: line-through;color: #999999;">¥180</text>
</view>
<text class="fs-24" style="color: #999999;">销量:200</text>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
<!-- 二级分类 -->
<view v-if="false" class="right-box">
<view id="right" class="right">
<scroll-view scroll-y class="children-scroll" @scrolltolower="scrolltolower">
<view class="goods-box">
<view
@click="$wskj.to('/pages/home/twolevelclassify?pid=' + item.id)"
class="good-item"
v-for="(item, index) in 20"
:key="index"
:style="{'margin-right': (index + 1) % 3 === 0? '0' : '20rpx'}"
>
<image src="@/static/logo.png"></image>
<view class="center fs-28" style="color: #666;">
<text>二级</text>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
<!-- 三级分类 -->
<view v-if="false" class="right-box">
<view id="right" class="right">
<scroll-view scroll-y class="children-scroll" @scrolltolower="scrolltolower">
<view v-for="(item, index) in 3" class="goods-box-sanji">
<view class="mb-24 flex flex-column-center fw-600">
<text>二级分类名称</text>
<image class="ml-8 w-24 h-24" src="@/static/right.png"></image>
</view>
<view class="sanji-box">
<view
@click="$wskj.to('/pages/home/twolevelclassify?pid=' + item.id)"
class="good-item"
v-for="(item, index) in 10"
:key="index"
:style="{'margin-right': (index + 1) % 3 === 0? '0' : '20rpx'}"
>
<image src="@/static/logo.png"></image>
<view class="center fs-24" style="color: #999999;">
<text>三级</text>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</view>
</view>
</template>
<script>
import {
mapState
} from "vuex"
export default {
data() {
return {
classIfyList: [],
cartLen: 0,
currentIfy: 0,
currentPid: '',
secondClassIfyList: [],
currentPage: 1,
isEmpty: false
};
},
onLoad() {
},
computed:{
...mapState(['cart'])
},
// 监听切换上级门店或返回我的门店重新获取数据
onShow(){
this.currentIfy = 0
this.currentPid = ''
this.secondClassIfyList = []
this.currentPage = 1
this.isEmpty = false
this.getClassIfy()
this.getCartList()
},
methods: {
getClassIfy(){
const params = {
url: '/api/index/getcatelist',
data: {
pid: 'all'
}
}
this.$request(params).then(res => {
// console.log(res)
this.classIfyList = res.data.catelist
this.currentPid = this.classIfyList[0].id
this.getSecondClassIfyList()
}).catch(err => {
})
},
// 获取二级分类列表
getSecondClassIfyList(){
const params = {
url: '/api/index/getcatelist',
data: {
pid: this.currentPid, // 一级分类的ID
page: this.currentPage,
// pid: 'all'
}
}
this.$request(params).then(res => {
// console.log(res)
this.secondClassIfyList = this.secondClassIfyList.concat(res.data.ercate)
if(res.data.ercate.length === 0) {
this.isEmpty = false
}
}).catch(err => {
})
},
getCartList(){
const params = {
url: '/api/userinfo/carlist',
data: {
page: 1
}
}
this.$request(params).then(res => {
this.cartLen = res.data.list.length
}).catch(err => {
})
},
scrolltolower(){
if(!this.isEmpty) {
this.currentPage += 1
this.getSecondClassIfyList()
}
},
// 点击左侧分类
onClickLeftIfy(index){
// console.log(index)
this.currentIfy = index
this.currentPid = this.classIfyList[index].id
this.secondClassIfyList = []
this.currentPage = 1
this.isEmpty = false
this.getSecondClassIfyList()
},
toCart(){
uni.switchTab({
url: '/pages/cart'
})
}
},
};
</script>
<style scoped>
.container {
height: 100%;
padding: 0 0;
}
.wapper {
height: 100%;
display: flex;
justify-content: space-between;
}
.left-box {
width: 180rpx;
}
.left {
width: 100%;
height: 100%;
background-color: #F7F8FA;
}
.left-item {
width: 100%;
height: 100rpx;
display: flex;
justify-content: center;
align-items: center;
background-color: #F5F5F5;
color: #000000;
word-break: break-all;
word-wrap: break-word;
position: relative;
}
.active {
color: #FF0000;
font-weight: 600;
background-color: #FFF;
position: relative;
}
.active::before {
content: '';
background-color: #FF0000;
width: 6rpx;
height: 48rpx;
border-radius: 4rpx;
position: absolute;
left: 0;
}
.right-box {
width: calc(100% - 180rpx);
height: calc(100% - 24rpx);
background-color: #FFF;
padding: 24rpx 24rpx 0;
}
.right {
width: 100%;
height: 100%
}
.right-item {
height: 100%;
padding: 0 20rpx;
background-color: #FFF;
}
.children-scroll {
height: 100%;
}
.goods-box {
display: flex;
flex-wrap: wrap;
align-content : flex-start;
}
.good-item {
width: calc((100% - 40rpx) / 3);
text-align: center;
margin-bottom: 24rpx;
font-size: 28rpx;
}
.good-item > image {
width: 100%;
height: 160rpx;
margin-bottom: 8rpx;
border-radius: 16rpx;
}
/* 一级分类 */
.good-item-yiji:first-child {
padding-top: 0;
}
.good-item-yiji {
display: flex;
/* margin-bottom: 24rpx; */
padding: 24rpx 0;
border-bottom: 2rpx solid #F5F5F5;
}
.good-item-yiji > image {
width: 160rpx;
height: 160rpx;
border-radius: 10rpx;
margin-right: 20rpx;
}
/* 三级分类 */
.goods-box-sanji {
margin-bottom: 48rpx;
}
.sanji-box {
display: flex;
flex-wrap: wrap;
align-content: flex-start;
}
</style>
<template>
<view class="container">
<view class="item">
<view class="title">
日期时间段选择
</view>
<dateTimeQuantum
@onConfirmStartTime="onConfirmStartTime"
@onConfirmEndTime="onConfirmEndTime"
></dateTimeQuantum>
</view>
<view class="item">
<view class="title">
下拉选择
</view>
<drapdown
:tabList="tabList"
:activeStyle="{'color': '#3c9cff'}"
:inactiveStyle="{'color': '#000'}"
@click="onSelect"
></drapdown>
</view>
<view class="item">
<view class="title">
<text>图片选择</text>
</view>
<view>
<upload-image
v-model="images"
maxCount="3"
width="100"
height="100"
type="fullurl"
></upload-image>
<button @click="submit">提交</button>
</view>
</view>
<view class="item">
<view @click="show = true" class="title">
<text>打开带关闭按钮的弹窗组件</text>
</view>
<wskj-model-close :show="show" @close="show = false">
<view>123</view>
</wskj-model-close>
</view>
<view class="item">
<view @click="showAddressSelector = true" class="title">
打开地址选择(使用后端数据)
</view>
<addressModal v-if="showAddressSelector" :areaInfoSelected="areaInfoObj" @cancel="showAddressSelector = false"
@confirm="handleConfirm">
</addressModal>
</view>
<view class="item">
<view @click="selectAddressShow = true" class="title">
打开地址选择(使用前端自定义数据)
</view>
<address-picker :show="selectAddressShow" @confirm="onConfirmAddress" @close="selectAddressShow = false" @cancel="selectAddressShow = false" :closeOnClickOverlay="true" confirmText="确定"></address-picker>
</view>
</view>
</template>
<script>
import dateTimeQuantum from "@/components/dateTimeQuantum"
import drapdown from "@/components/drapdown"
import addressModal from '@/components/address-modal.vue';
export default {
data() {
return {
show: false,
images: '',
tabList:[{
label: '选项一',
children: [
{
label: '111'
}
]
},
{
label: '选项二',
children: [
{
label: '222'
}
]
},
{
label: '选项三',
children: [
{
label: '333'
}
]
}],
showAddressSelector: false,
areaInfoObj: {
provinceObj: {
id: '',
name: '',
},
cityObj: {
id: '',
name: '',
},
cityObj: {
id: '',
name: '',
},
areaObj: {
id: '',
name: '',
}
},
selectAddressShow: false,
}
},
components:{
dateTimeQuantum,
drapdown,
addressModal
},
onLoad() {
this.images = this.$config.domain + '/assets/img/qrcode.png'
},
methods: {
onConfirmStartTime(e){
console.log(e)
},
onConfirmEndTime(e){
console.log(e)
},
submit(){
console.log(this.images)
},
handleConfirm(areaInfoObj) {
console.log(areaInfoObj)
this.showAddressSelector = false;
},
onConfirmAddress(e){
// console.log(e)
this.selectAddressShow = false
},
onSelect(item, index){
uni.showModal({
content: '点击了:' + JSON.stringify(item) + '' + index + ''
})
}
}
}
</script>
<style scoped>
.container {
height: 100%;
padding: 24rpx 24rpx;
}
.item {
margin-bottom: 60rpx;
}
.title {
font-weight: 600;
}
</style>
\ No newline at end of file
<template>
<view class='page'>
<view class='top'>
<u-navbar :placeholder="true" bgColor="#fdb62a">
<view slot="left" class="flex align-center">
<u-icon name="map-fill" color="#000" size="19"></u-icon>
<text class="fs-30 u-line-1" style="margin:0 5rpx;width: 100rpx;">北京</text>
</view>
<view slot="center">
<u--text text="首页" size="20"></u--text>
</view>
<view slot="right"
style="position: relative;width: 60rpx;height: 60rpx;display: flex;justify-content: center;">
<u-icon name="/static/home/icon_home_xx.png" size="25"></u-icon>
<u-badge max="99" :absolute="true" :offset="[0,0]" :value="1"></u-badge>
</view>
</u-navbar>
</view>
<view class='top-search'>
<u-search placeholder="搜索" :showAction="false" :disabled='true' bgColor="#fff" height="45"></u-search>
</view>
<scroll-view scroll-y="true" class="scroll-Y">
<view style="margin: 20rpx;">
<u-swiper :list="swiperList" height="146"></u-swiper>
</view>
<!-- 厂家入选区 -->
<view class="cjq">
<u-cell size="large" title="厂家入选区" value="查看全部" isLink :border="false"></u-cell>
<view style="padding:0 20rpx 20rpx 20rpx;">
<u-grid :border="false" col="3">
<u-grid-item v-for="(listItem,listIndex) in cqList" :key="listIndex">
<view class="cj">
<image
style="width: 100%; height: 110px;background-color: aqua;border-radius:10rpx 10rpx 0 0;"
:src="listItem.url"></image>
<view style="padding: 10rpx;">
<u--text :text="listItem.title" size="12" color="#000000" lines="2"></u--text>
<view style="display: flex;">
<u--text mode="price" :text="listItem.price" size="14"
color="#FE2C24"></u--text>
<u--text mode="price" :text="listItem.oldPrice" size="12" color="#999999"
decoration="line-through"></u--text>
</view>
</view>
</view>
</u-grid-item>
</u-grid>
</view>
</view>
<!-- 医院专区 -->
<view class="cjq">
<u-cell size="large" title="医院专区" value="查看全部" isLink :border="false"></u-cell>
<view style="padding:0 20rpx 20rpx 20rpx;">
<u-grid :border="false" col="3">
<u-grid-item v-for="(listItem,listIndex) in cqList" :key="listIndex">
<view class="cj">
<image
style="width: 100%; height: 110px;background-color: aqua;border-radius:10rpx 10rpx 0 0;"
:src="listItem.url"></image>
<view style="padding: 10rpx;">
<u--text :text="listItem.title" size="12" color="#000000" lines="2"></u--text>
<view style="display: flex;">
<u--text mode="price" :text="listItem.price" size="14"
color="#FE2C24"></u--text>
<u--text mode="price" :text="listItem.oldPrice" size="12" color="#999999"
decoration="line-through"></u--text>
</view>
</view>
</view>
</u-grid-item>
</u-grid>
</view>
</view>
<!-- 筛选 -->
<view style="display: flex;padding:20rpx 0;" class="flex-between-center">
<view style="display: flex;flex: 1; justify-content: center;align-items: center;">
<u-icon index="1" :labelColor="labelColorOne==true?'#FE2C24':'#000000'" size="14" label="综合排序"
labelPos="left" @click="clickOne"></u-icon>
</view>
<view style="display: flex;flex: 1; justify-content: center;">
<u-icon index="2" :name="iconTwo" width="8" :labelColor="labelColorTwo==true?'#FE2C24':'#000000'"
size="14" label="销量" labelPos="left" @click="clickTwo"></u-icon>
</view>
<view style="display: flex;flex: 1; justify-content: center;">
<u-icon index="3" :name="iconThree" width="8"
:labelColor="labelColorThree==true?'#FE2C24':'#000000'" size="14" label="价格" labelPos="left"
@click="clickThree"></u-icon>
</view>
</view>
<view>
<u-list @scrolltolower="scrolltolower" style="background-color:#f5f5f5;">
<u-list-item v-for="(item, index) in list" :key="index">
<view class="goods">
<u--image :src="item.url" width="100" height="100" radius="8"></u--image>
<view style="padding:0 10rpx;display: flex;flex-direction: column;">
<u--text :text="item.title" size="12" color="#000000" lines="2"
style="align-items: baseline;"></u--text>
<text
style="font-size: 20rpx;color: #999999;margin-bottom: 10rpx;">销量:{{item.price}}</text>
<view style="display: flex;">
<u--text style="flex: 0;" mode="price" :text="item.price" size="14"
color="#FE2C24"></u--text>
<u--text style="flex: 0;" mode="price" :text="item.oldPrice" size="12"
color="#999999" decoration="line-through"></u--text>
</view>
</view>
</view>
</u-list-item>
</u-list>
</view>
</scroll-view>
</view>
</template>
<script>
export default {
data() {
return {
labelColorOne: true,
labelColorTwo: false,
labelColorThree: false,
iconTwo: '/static/icon_sx_cg.png',
iconThree: '/static/icon_sx_cg.png',
swiperList: [
'https://cdn.uviewui.com/uview/swiper/swiper1.png',
'https://cdn.uviewui.com/uview/swiper/swiper2.png',
'https://cdn.uviewui.com/uview/swiper/swiper3.png',
],
cqList: [{
price: '100',
oldPrice: '200',
url: 'https://cdn.uviewui.com/uview/swiper/swiper1.png',
title: '创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌'
},
{
price: '100',
oldPrice: '200',
url: 'https://cdn.uviewui.com/uview/swiper/swiper1.png',
title: '创意桌面石狮子一对茶桌'
},
{
price: '100',
oldPrice: '200',
url: 'https://cdn.uviewui.com/uview/swiper/swiper1.png',
title: '创意桌面石狮子一对茶桌'
}
],
list: [{
price: '100',
oldPrice: '200',
url: 'https://cdn.uviewui.com/uview/swiper/swiper1.png',
title: '创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌'
},
{
price: '100',
oldPrice: '200',
url: 'https://cdn.uviewui.com/uview/swiper/swiper1.png',
title: '创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌'
},
{
price: '100',
oldPrice: '200',
url: 'https://cdn.uviewui.com/uview/swiper/swiper1.png',
title: '创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌'
},
{
price: '100',
oldPrice: '200',
url: 'https://cdn.uviewui.com/uview/swiper/swiper1.png',
title: '创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌'
},
{
price: '100',
oldPrice: '200',
url: 'https://cdn.uviewui.com/uview/swiper/swiper1.png',
title: '创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌创意桌面石狮子一对茶桌'
},
]
};
},
onLoad() {
},
methods: {
clickOne(e) {
//console.log()
this.labelColorOne = true
this.labelColorTwo = false
this.labelColorThree = false
this.iconTwo = '/static/icon_sx_cg.png'
this.iconThree = '/static/icon_sx_cg.png'
},
clickTwo(e) {
this.labelColorOne = false
this.labelColorTwo = true
this.labelColorThree = false
this.iconThree = '/static/icon_sx_cg.png'
if (this.iconTwo == '/static/icon_sx_x.png') {
this.iconTwo = '/static/icon_sx_s.png'
} else {
this.iconTwo = '/static/icon_sx_x.png'
}
},
clickThree(e) {
this.labelColorOne = false
this.labelColorTwo = false
this.labelColorThree = true
this.iconTwo = '/static/icon_sx_cg.png'
if (this.iconThree == '/static/icon_sx_x.png') {
this.iconThree = '/static/icon_sx_s.png'
} else {
this.iconThree = '/static/icon_sx_x.png'
}
}
},
};
</script>
<style scoped>
.page {
width: 100%;
height: 100%;
background: #f5f5f5;
background-color: ;
}
.top {
background-color: #fdb62a;
height: 245rpx;
}
.top-search {
margin-top: -40rpx;
margin-left: 20rpx;
margin-right: 20rpx;
}
.cjq {
height: 240px;
background: linear-gradient(180deg, #ffffff, #ffffff 19%, #f5f5f5);
border-radius: 22px 22px 0px 0px;
}
.cj {
background: #ffffff;
border-radius: 8px;
margin: 0 10rpx;
}
.goods {
background: #ffffff;
border-radius: 15px;
margin: 10rpx;
display: flex;
padding: 20rpx;
}
</style>
\ No newline at end of file
<template>
<view class="list">
<comment></comment>
</view>
</template>
<script>
export default {
data() {
return {
score: '',
goodsId: '',
commentList: [],
currentPage: 1,
isEmpty: false,
};
},
onLoad(options) {
this.goodsId = options.goodsId
this.score = options.score
// this.getCommentList()
},
methods: {
// 获取评价列表
getCommentList() {
const params = {
url: '/api/order/comment_list',
data: {
page: this.currentPage,
goods_id: this.goodsId
}
}
this.$request(params).then(res => {
// console.log(res)
this.commentList = this.commentList.concat(res.data.data)
if (this.commentList.length >= res.data.total) {
this.isEmpty = true
}
}).catch(err => {
})
},
scrolltolower(e) {
if (!this.isEmpty) {
this.currentPage += 1
this.getCommentList()
}
},
onPreviewImage(imgList, index) {
let imgData = []
imgList.map(item => {
imgData.push(this.$config.domain + item)
})
uni.previewImage({
current: index,
urls: imgData
})
}
},
};
</script>
<style scoped>
.list {
padding: 20rpx;
}
</style>
\ No newline at end of file
<template>
<view class='container'>
<view class="list">
<view @click="$wskj.to('/pages/home/msg/systemmsg')" class="item">
<view class="left">
<image src="@/static/home/system.svg"></image>
<view>
<text class="fs-36">系统消息</text>
</view>
</view>
<view class="right">
<view class="dot">
<text>9</text>
</view>
<image src="@/static/right.png"></image>
</view>
</view>
</view>
</view>
</template>
<script>
import { mapState } from "vuex"
export default {
data() {
return {
tongzhi: {},
sysmnews: {}
};
},
onLoad() {
this.getnewslist()
},
computed: {
...mapState(['home'])
},
methods: {
getnewslist(){
const params = {
url: '/api/index/newslist',
data: {
}
}
this.$request(params).then(res => {
// console.log(res)
this.tongzhi = res.data.tongzhi
this.sysmnews = res.data.sysmnews
}).catch(err => {
})
},
},
};
</script>
<style scoped>
.list {
}
.item {
padding: 30rpx;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 2rpx solid #f5f5f5;
}
.left {
display: flex;
align-items: center;
}
.left > image {
width: 88rpx;
height: 88rpx;
margin-right: 20rpx;
}
.left > view {
display: flex;
flex-direction: column;
}
.left > view>text:nth-child(2) {
margin-top: 10rpx;
}
.right {
display: flex;
align-items: center;
}
.dot {
padding: 5rpx 10rpx;
background-color: #FE2C24;
border-radius: 50%;
color: #FFF;
font-size: 16rpx;
}
.right > image {
width: 24rpx;
height: 24rpx;
margin-left: 10rpx;
}
</style>
<template>
<view class='container'>
<view class="wapper">
<scroll-view style="height: 100%;" scroll-y @scrolltolower="scrolltolower">
<view class="msg-list">
<view @click="$wskj.to('/pages/home/msg/systemmsgdetails?msgId=' + item.id)" v-for="(item, index) in 2" :key="index" class="item">
<image src="@/static/logo.png"></image>
<view class="bottom">
<text class="fs-36 fw-600">标题</text>
<text class="fs-28 mt-30" style="color: #999;">描述</text>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
currentPage: 1,
msgList: [],
isEmpty: false
};
},
onLoad() {
this.getMsgList()
},
methods: {
getMsgList(){
const params = {
url: '/api/index/newslist',
data: {
page: this.currentPage
}
}
this.$request(params).then(res => {
// console.log(res)
this.msgList = this.msgList.concat(res.data)
if(res.data.length === 0) {
this.isEmpty = true
}
}).catch(err => {
})
},
scrolltolower(){
if(!this.isEmpty) {
this.currentPage += 1
this.getMsgList()
}
}
},
};
</script>
<style scoped>
.container {
height: 100%;
}
.wapper {
padding: 40rpx 40rpx;
height: 100%;
background-color: #F5F5F5;
}
.msg-list {
height: 100%;
}
.item {
display: flex;
flex-direction: column;
margin-bottom: 40rpx;
background-color: #FFF;
border-radius: 20rpx;
}
.item:last-child {
margin-bottom: 0;
}
.item > image {
width: 100%;
height: 340rpx;
border-radius: 15rpx;
}
.bottom {
padding: 30rpx;
display: flex;
flex-direction: column;
}
.time {
text-align: center;
margin-top: 50rpx;
color: #999999;
font-size: 24rpx;
}
</style>
<template>
<view class='container'>
<view class="center mb-30 fw-600">
<text>标题</text>
</view>
<view class="bottom">
<view v-html="details.content"></view>
</view>
<view style="text-align: center;">
<image class="h-280" style="width: 100%;" src="@/static/logo.png"></image>
</view>
</view>
</template>
<script>
export default {
data() {
return {
msgId: '',
details: {}
};
},
onLoad(options) {
this.msgId = options.msgId
this.getMsgDetails()
},
methods: {
getMsgDetails(){
const params = {
url: '/api/index/newsdetail',
data: {
id: this.msgId
}
}
this.$request(params).then(res => {
// console.log(res)
this.details = res.data
}).catch(err => {
})
},
},
};
</script>
<style scoped>
.container {
height: 100%;
padding: 20rpx 20rpx;
}
.bottom {
margin-top: 30rpx;
line-height: 40rpx;
}
</style>
This diff is collapsed.
This diff is collapsed.
<template>
<view>
</view>
</template>
<script>
export default {
data() {
return {
};
},
onLoad(options) {
// console.log(options)
// 通过他人分享进入
if (options.userId) {
uni.setStorageSync('shareUserId', options.userId)
}
const token = uni.getStorageSync('token')
// console.log(token)
if(token) {
this.$wskj.switchTab('/pages/home')
} else {
this.$wskj.reLaunch('/pages/login/wechatlogin')
}
}
};
</script>
<style>
</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.
<template>
</template>
<script>
</script>
<style>
</style>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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