Commit 4b440e3c authored by 秦威威's avatar 秦威威

start

parents
Pipeline #20 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: #FE2C24;
page {
height: 100%;
}
.container {
box-sizing: border-box; /* padding border 等不增加到宽高上 */
// box-sizing: content-box; /* padding border 等增加到宽高上 */
}
view,
scroll-view,
swiper,
button,
input,
textarea,
label,
navigator,
image {
box-sizing: content-box; /* padding border 等增加到宽高上 */
}
.full {
width: 100%;
height: 100%;
}
.flex {
display: flex;
}
.flex-column {
display: flex;
flex-direction: column;
}
.flex-wrap {
display: flex;
flex-wrap: wrap;
}
.flex-around {
justify-content: space-around;
}
.flex-between {
justify-content: space-between;
}
.flex-center {
justify-content: center;
}
.align-start {
align-items: flex-start;
}
.align-end {
align-items: flex-end;
}
.align-center {
align-items: center;
}
// 横轴
.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;
}
/* 控制行显示内容 */
.common-line, .one-line-ellipsis, .two-line-ellipsis, .three-line-ellipsis {
display: -webkit-box; /*弹性伸缩盒子模型显示*/
-webkit-box-orient: vertical; /*排列方式*/
overflow: hidden; /*溢出隐藏*/
}
.one-line-ellipsis {
-webkit-line-clamp: 1; /*显示文本行数(这里控制多少行隐藏)*/
}
.two-line-ellipsis {
-webkit-line-clamp: 2; /*显示文本行数(这里控制多少行隐藏)*/
}
.three-line-ellipsis {
-webkit-line-clamp: 3; /*显示文本行数(这里控制多少行隐藏)*/
}
// 宽高
@for $i from 1 through 2000 {
.w-#{$i} {
width: $i + rpx;
}
.h-#{$i} {
height: $i + rpx;
}
.lh-#{$i} {
line-height: $i + rpx;
}
.wh-#{$i} {
width: $i + rpx;
height: $i + rpx;
}
}
// 字体大小
@for $i from 10 through 500 {
.fs-#{$i} {
font-size: $i + rpx;
}
}
.fw-500 {
font-weight: 500;
}
.fw-600 {
font-weight: 600;
}
.fw-700 {
font-weight: 700;
}
//flex 占比
@for $i from 1 through 10 {
.flex-#{$i} {
flex: $i;
}
}
// 圆角
@for $i from 8 through 500 {
.br-#{$i} {
border-radius: $i + rpx;
}
}
// 内边距
@for $i from 5 through 500 {
.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 500 {
.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;
}
}
.sv-y {
flex: 1;
/* 自动占满剩余的空间 */
overflow-y: auto;
/* 允许纵向滚动 */
}
.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 {
width: 100%;
height: 94rpx;
text-align: center;
line-height: 94rpx;
background-color: $app-main-color;
border-radius: 60rpx;
color: #FFF;
}
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')
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: {
"authorization": token || '',
},
success: (res) => {
// 防止组件那边使用showLoading这里提前关闭
if (params.loadingTip === '' || params.loadingTip) {
uni.hideLoading()
}
// 这里判断code为1,组件那边不需要再判断then回调就是成功
if (res.statusCode === 200 && res.data.code === 200) {
resolve(res.data)
} else if (res.statusCode === 401 || res.data.code === 401) { // 未登录,或登录过期
toLogin()
} else if (res.statusCode === 200 || res.data.code === 500) {
this.$wskj.toast('接口异常')
} else {
reject(res.data || {})
}
logApiRequest(params, res.data)
},
fail: (err) => {
console.log(err);
uni.hideLoading()
reject(err || {})
}
})
} catch (err) {
reject(err)
}
})
}
//封装日志打印函数
function logApiRequest(data, response) {
console.log(`========== 接口请求start日志 ==========`);
console.log(data);
console.log(response);
if (response.code == 500) {
uni.showToast({
title: response.msg,
icon: 'none',
duration: 2000 // 持续时间,单位ms
});
}
console.log(`========== 接口请求end日志 ==========`);
}
function toLogin() {
uni.clearStorageSync();
uni.showModal({
title: '提示',
content: '您的登录失效,是否重新登录?',
success(res) {
console.log(res)
if (res.confirm) {
uni.redirectTo({
url: '/pages/login/wechatlogin'
})
}
}
})
}
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" style="color: white;">{{ 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>
This diff is collapsed.
# kevy-swiper
[========]
### **开源不易,各位大侠,若本插件真的对您有所帮助,还请赏个好评 ~.~ 赞赏支持一下哦**
[========]
#### 介绍
**高度自定义**的轮播图插件,最多只显示3个,其余在循环切换时显示,**具有3d切换效果**,支持自动播放和设置时间间隔,切换后返回当前下标,默认监听左右滑动进行切换,想要上下滑动的话可以在插件里上下滑动的事件里写自己的逻辑。
- **符合easycom规范,使用简便**
- **插件含全部源码,给你无限可能自定义你的功能**
#### 软件架构
uniapp框架插件,欢迎下载使用。
#### 方法和属性
| 名称 | 类型 | 默认值 | 描述 |
| ------- | ------- |------ |------
| list | Array | [] |swiper列表,内部结构为Object或String,示例{"imgUrl":"imgurl" ,"imgDesc":"我是描述文字"}或"imgurl",详见list字段说明|
| showNum | Number | 3 |显示图片个数,仅支持3或5,若list的长度小于5会被强制设为3|
| width | Number | 100% |swiper的宽度,单位rpx|
| height | Number | 690rpx |swiper的高度,单位rpx|
| click | Event | |点击当前item事件,返回点击item对应下标|
| change | Event | |切换后change事件,返回当前中间位置item对应下标|
| autoPlay | Boolean | false |是否自动播放,true自动播放|
| autoPlayInterval | Number | 5000 |自动播放时间间隔,autoPlay为true时生效,单位毫秒|
| showDot | Boolean | false | 是否显示轮播指示点 |
| descAniType | String | slideFromRight | 图片描述文字动画类型:支持slideFromRight、slideFromBottom、scaleX、scaleY |
| dotColor | String | linear-gradient(to bottom, #999999, #c0c0c0) | 指示点未选中背景色,支持css颜色值及渐变 |
| dotSelectedColor | String | linear-gradient(to bottom, #92ffc0, #002661) | 指示点选中背景色,支持css颜色值及渐变 |
#### list字段说明:其内部结构若为**Object**类型,属性值说明如下:
| 名称 | 类型 | 描述 |
| ------------ | ------------ |------------ |
| imgUrl | String | 图片url |
| imgDesc | String | 图片描述,非必填,不填时不显示描述文字 |
详见下方readme示例
#### list字段说明:其内部结构若为**String**类型,属性值说明如下:
| 名称 | 类型 | 描述 |
| ------------ | ------------ |------------ |
| imgUrl | String | 图片url |
详见下方readme示例
#### 使用说明(图片+文字)
```html
<template>
<view class="t-content">
<kevy-swiper v-if="list && list.length>0" @click="swClick" @change="swChange" :autoPlay="true"
:autoPlayInterval="5000" :list="list" :height="500" :showNum="5" :showDot="true" descAniType="slideFromRight" dotColor="linear-gradient(to bottom, #999999, #c0c0c0)" dotSelectedColor="linear-gradient(to bottom, #92ffc0, #002661)" />
</view>
</template>
<script>
import kevySwiper from '@/components/kevy-swiper/kevy-swiper'
export default {
components: {
kevySwiper
},
data() {
return {
//图片url列表,内部结构为Object或String,示例{"imgUrl":"http://www.abc.com/a.jpg","imgDesc":"我是描述文字"}或"http://www.abc.com/a.jpg"
list: [],
}
},
onLoad() {
//请求数据
//这里模拟请求到了这个list
let list = [{
imgUrl: 'https://www.changan.com.cn/uploads/chan_newsthumb/330513479a6459781f00398815b9906a.jpg',
imgDesc: '我是第一个图片的说明文字'
},
{
imgUrl: 'https://www.changan.com.cn/uploads/chan_newsthumb/e1b488d041b576ba6ce1cc20a6cb81a3.jpg',
imgDesc: '我是第二个图片的说明文字'
},
{
imgUrl: 'https://www.changan.com.cn/uploads/chan_newsthumb/40e7cb2bf37e1123b5e4547b094192c3.jpg',
imgDesc: '我是第三个图片的说明文字'
},
{
imgUrl: 'https://www.changan.com.cn/uploads/chan_newsthumb/f60d441c589563b0ece918853194f6e9.jpg',
imgDesc: '我是第四个图片的说明文字'
},
{
imgUrl: 'https://www.changan.com.cn/uploads/chan_newsthumb/cd4353d0d1322c6f085b1bb0ecf2c835.jpg',
imgDesc: '我是第五个图片的说明文字'
},
{
imgUrl: 'https://www.changan.com.cn/cars_m/UNI-V/images/meitu/1.jpg',
imgDesc: '我是第六个图片的说明文字'
}
];
this.list = list;
},
methods: {
//当点击图片时返回图片下标,用于跳转之类业务
swClick(idx) {
console.log("当前点击的图片下标为:" + idx)
},
//当切换后返回当前下标
swChange(idx) {
console.log("当前中间图片的下标为:" + idx)
}
}
}
</script>
<style lang="scss" scoped>
.t-content {
background-color: #f7f7f7;
min-height: 100vh;
}
</style>
```
#### 使用说明(仅图片)
```html
<template>
<view class="t-content">
<kevy-swiper v-if="list && list.length>0" @click="swClick" @change="swChange" :autoPlay="true"
:autoPlayInterval="5000" :list="list" :height="500" :showNum="5" :showDot="true" descAniType="slideFromRight" dotColor="linear-gradient(to bottom, #999999, #c0c0c0)" dotSelectedColor="linear-gradient(to bottom, #92ffc0, #002661)" />
</view>
</template>
<script>
import kevySwiper from '@/components/kevy-swiper/kevy-swiper'
export default {
components: {
kevySwiper
},
data() {
return {
//图片url列表,内部结构为Object或String,示例{"imgUrl":"http://www.abc.com/a.jpg","imgDesc":"我是描述文字"}或"http://www.abc.com/a.jpg"
list: [],
}
},
onLoad() {
//请求数据
//这里模拟请求到了这个list
let list = [
"https://www.changan.com.cn/uploads/chan_newsthumb/330513479a6459781f00398815b9906a.jpg",
"https://www.changan.com.cn/uploads/chan_newsthumb/e1b488d041b576ba6ce1cc20a6cb81a3.jpg",
"https://www.changan.com.cn/uploads/chan_newsthumb/40e7cb2bf37e1123b5e4547b094192c3.jpg",
"https://www.changan.com.cn/uploads/chan_newsthumb/f60d441c589563b0ece918853194f6e9.jpg",
"https://www.changan.com.cn/uploads/chan_newsthumb/cd4353d0d1322c6f085b1bb0ecf2c835.jpg",
"https://www.changan.com.cn/cars_m/UNI-V/images/meitu/1.jpg"
];
this.list = list;
},
methods: {
//当点击图片时返回图片下标,用于跳转之类业务
swClick(idx) {
console.log("当前点击的图片下标为:" + idx)
},
//当切换后返回当前下标
swChange(idx) {
console.log("当前中间图片的下标为:" + idx)
}
}
}
</script>
<style lang="scss" scoped>
.t-content {
background-color: #f7f7f7;
min-height: 100vh;
}
</style>
```
\ No newline at end of file
<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/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: 'url'
},
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, type, "et")
let lists = [].concat(event.file)
let fileListLen = this.fileList.length
lists.map((item) => {
this.fileList.push({
...item,
status: 'uploading',
message: '上传中'
})
})
// console.log(lists, "listslistslistslists")
for (let i = 0; i < lists.length; i++) {
const result = await this.$wskj.uploadImg(lists[i].url)
// console.log(result, "resulttttt")
// console.log(this.fileList, "fileListfileList")
let item = this[[type]][fileListLen]
// console.log(item, "itemssss")
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.url).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" @click="$emit('close')">
<view class="modal-main" @tap.stop="">
<view class="modal-content">
<slot></slot>
</view>
<view v-if="showClose" @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
},
showClose: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
}
}
</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: 'http://192.168.0.169:8080',
domain: 'https://huahai.xnszz.com/prod-api',
cdnUrl: '', // 云储蓄静态资源图片域名
amapKey: '', // 高德web服务key
socketUrl: '' // websocket地址
}
\ No newline at end of file
import request from '@/common/request.js';
const api = {
//首页查询轮播图
getBanner(data) {
return request({
url: "/system/banner/list",
data: {
type: 1
},
method: "GET"
})
},
//获取门店
getShoplist(data) {
return request({
url: '/system/party/listShop',
data,
method: "GET"
})
},
//获取活动
getparty(data) {
return request({
url: "/system/party/list",
data,
method: "GET"
})
},
//门店id获取楼层
getetlistFloorByShop(data) {
return request({
url: `/system/party/listFloorByShopId/${data}`,
method: "GET"
})
},
//楼层id查询区域列表
getlistAreaByFloor(data) {
return request({
url: `/system/party/listAreaByFloorId/${data}`,
method: "GET"
})
},
//楼层id查询卡座列表
getlistSeatByByFloor(data) {
return request({
url: `/system/party/listSeatByByFloorId`,
data,
method: "GET"
})
},
//楼层id查询活动(派对)列表
getlistPartyByFloor(data) {
return request({
url: `/system/party/listPartyByFloorId`,
data: data,
method: "GET"
})
},
//活动id查询领队列表
getlistLeaderByParty(data) {
return request({
url: `/system/party/listLeaderByPartyId/${data}`,
method: "GET"
})
},
//活动详情
getPartyByDetail(data) {
return request({
url: `/system/party/getPartyById/${data}`,
method: "GET"
})
},
//领队id查询参与拼卡的会员列表
getAndLeader(data) {
return request({
url: `/system/party/listPlayerByPartyIdAndLeaderId`,
data,
method: "GET"
})
},
//购买拼卡返回订单id待支付
getbuyMember(data) {
return request({
url: `/system/party/buyMember`,
data,
method: "POST"
})
},
//购买定卡返回订单id待支付
getbuySeat(data) {
return request({
url: `/system/party/buySeat`,
data,
method: "GET"
})
},
//获取订单详细信息
getgetOrderById(data) {
return request({
url: `/system/party/getOrderById/${data}`,
data,
method: "GET"
})
},
//微信支付
getwechatpay(data) {
return request({
url: `/system/party/wechatpay`,
data,
method: "POST"
})
},
//获取支付结果通知
getwechatpaynotify(data) {
return request({
url: `/system/party/wechatpay/notify`,
data,
method: "POST"
})
},
//举报
getDiscoverReport(data) {
return request({
url: "/system/discoverReport/insertDiscoverReport",
data,
method: "POST"
})
}
};
export default api;
\ 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/index.js"
import wskj_function from "@/common/wskj_function.js"
import request from "@/common/request.js"
import config from "@/config.js"
import api from "@/config/api.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.$api = api;
Vue.prototype.$config = config;
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
store,
...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__5A0EDA2",
"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" : "wxb33442e062ef0995",
"setting" : {
"urlCheck" : false,
"es6" : true
},
"usingComponents" : true,
"optimization" : {
"subPackages" : true
}
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "2"
}
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/init', // 全局分享的路径
imageUrl: 'https://image.xnszz.com/hehuaguoji/2025/03/13/f3eaebd6b1e1a794c74f74cd991b875a_20250313180027A010.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
{
"id": "hch-poster",
"name": "canvas 生成海报",
"version": "3.2.2",
"description": "分享弹窗,生成海报并支持保存,支持多端(H5,微信小程序,支付宝小程序,百度小程序,字节跳动小程序,QQ小程序)",
"keywords": [
"分享",
"海报",
"自定义图片",
"小程序码",
"商城商品分享海报。"
]
}
\ No newline at end of file
{
// entryPagesPath
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/init",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/login/wechatlogin",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/home_tab_one",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/home_tab_two",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/home_tab_three",
"style": {
"navigationBarTitleText": "拼卡",
"navigationStyle": "custom"
}
},
{
"path": "pages/home_tab_four",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/home_tab_five",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/xieyi",
"style": {
"navigationBarTitleText": ""
}
}
],
"subPackages": [{
"root": "pagesMain",
"pages": [{
"path": "pages/xzmd",
"style": {
"navigationBarTitleText": "选择门店"
}
},
{
"path": "pages/mdhd",
"style": {
"navigationBarTitleText": ""
}
},
{
"path": "pages/ydxq",
"style": {
"navigationBarTitleText": "预订详情"
}
},
{
"path": "pages/zfjg",
"style": {
"navigationBarTitleText": "支付结果"
}
},
{
"path": "pages/ddxq",
"style": {
"navigationBarTitleText": "订单详情"
}
},
{
"path": "pages/ldxx",
"style": {
"navigationBarTitleText": "领队信息"
}
},
{
"path": "pages/hdxq",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/ljyd",
"style": {
"navigationBarTitleText": "立即预订"
}
}
]
},
{
"root": "pagesMine",
"pages": [{
"path": "pages/user_info",
"style": {
"navigationBarTitleText": "编辑资料"
}
},
{
"path": "pages/user_edit_name",
"style": {
"navigationBarTitleText": "编辑昵称"
}
},
{
"path": "pages/user_smxx",
"style": {
"navigationBarTitleText": "实名信息"
}
},
{
"path": "pages/user_report",
"style": {
"navigationBarTitleText": "举报"
}
},
{
"path": "pages/user_grzy",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "pages/user_wdkz",
"style": {
"navigationBarTitleText": "我的卡座"
}
},
{
"path": "pages/user_message",
"style": {
"navigationBarTitleText": "我的消息"
}
},
{
"path": "pages/user_chat",
"style": {
"navigationBarTitleText": "消息"
}
},
{
"path": "pages/user_wdzj",
"style": {
"navigationBarTitleText": "我的足迹"
}
},
{
"path": "pages/user_wddw",
"style": {
"navigationBarTitleText": "我的队伍"
}
},
{
"path": "pages/user_thwj",
"style": {
"navigationBarTitleText": "RICCO头号玩家"
}
},
{
"path": "pages/user_thwjjh",
"style": {
"navigationBarTitleText": "头号玩家计划",
"navigationBarTextStyle": "black",
"navigationBarBackgroundColor": "#FFFFFF" // 设置标题栏背景颜色为白色
}
}
]
},
{
"root": "subPackages",
"pages": [{
"path": "withdrawalCash/withdrawalCash",
"style": {
"navigationBarTitleText": "业绩提现",
"navigationBarTextStyle": "black",
"navigationBarBackgroundColor": "#FFFFFF" // 设置标题栏背景颜色为白色
}
}]
}
],
/* 分包预载配置 */
// "preloadRule": {
// "pages/home_tab_one": {
// "network": "all",
// "packages": ["pages/my"]
// }
// },
"globalStyle": {
"navigationBarTextStyle": "white",
"navigationBarTitleText": "花海",
"navigationBarBackgroundColor": "#0F0F0F",
"backgroundColor": "#0F0F0F"
},
/* 底部菜单 */
"tabBar": {
"backgroundColor": "#0F0F0F",
"color": "#878787", //菜单上的文字默认颜色
"selectedColor": "#FE42C2", //菜单上的文字选中时的颜色
"borderStyle": "black", //菜单上边框的颜色,仅支持 black/white
"list": [{
"pagePath": "pages/home_tab_one", //页面路径,必须在 pages 中先定义
"iconPath": "static/tabbar/icon_tab_sy.png", //建议尺寸为 81px * 81px
"selectedIconPath": "static/tabbar/icon_tab_sy_s.png", //建议尺寸为 81px * 81px
"text": "首页" //菜单上按钮文字,在 5+APP H5 平台为非必填。例如中间可放一个没有文字的+号图标
},
{
"pagePath": "pages/home_tab_two",
"iconPath": "static/tabbar/icon_tab_dk.png",
"selectedIconPath": "static/tabbar/icon_tab_dk_s.png",
"text": "订卡"
},
{
"pagePath": "pages/home_tab_three",
"iconPath": "static/tabbar/icon_tab_pk.png",
"selectedIconPath": "static/tabbar/icon_tab_pk_s.png",
"text": "拼卡"
},
{
"pagePath": "pages/home_tab_four",
"iconPath": "static/tabbar/icon_tab_sq.png",
"selectedIconPath": "static/tabbar/icon_tab_sq_s.png",
"text": "社区"
},
{
"pagePath": "pages/home_tab_five",
"iconPath": "static/tabbar/icon_tab_wd.png",
"selectedIconPath": "static/tabbar/icon_tab_wd_s.png",
"text": "我的"
}
]
},
"uniIdRouter": {}
}
\ 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.
<template>
<view class='container'>
<view class="sv-y">
<scroll-view scroll-y>
<view class="flex-column">
<view style="position: relative;">
<image :src="`${$config.domain}`+ partyobj.image" mode="" style="width: 100%;height: 940rpx;">
</image>
<view class="wh-50 flex-center-center mt-100 ml-24" @click="$wskj.goBack(1)"
style="position:absolute;left: 0rpx;top: 0rpx;">
<image class="w-20 h-38" src="/static/icon_hdxq_back.png"></image>
</view>
<view class="pt-100 pb-20 plr-24"
style="color: white;position:absolute;left: 0rpx;bottom: 0rpx;background: linear-gradient( 180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0.75) 49%, #000000 100%);">
<text class="fs-36">{{partyobj.name}}</text>
</view>
</view>
<view class="flex-column pad-24">
<view class="flex flex-between align-center">
<text class="fs-28" style="color:#878787;">{{partyobj.startTime}}</text>
<button open-type="share" style="background-color: transparent; border: none;">
<image class="wh-52" src="/static/icon_hdxq_fx.png" ></image>
</button>
</view>
<text class="fs-42 mt-10" style="color:#FD46B9;">{{storeobj.name}}</text>
</view>
<view class="flex-column mlr-24 mt-25 br-10 pad-24 fs-24"
style="color: #878787;background-color: #171717;">
<text style="color: white;">主办方</text>
<text class="fs-28 mt-10">{{storeobj.name}}</text>
<text class="mt-36" style="color: white;">场地信息</text>
<text class="fs-28 mt-10">{{storeobj.address}}</text>
</view>
<view class="flex-column mlr-24 mt-25 br-10 pad-24 fs-24"
style="color: #878787;background-color: #171717;">
<image class="w-153 h-40" src="../static/icon_hdxq_text.png"></image>
<rich-text :nodes="partyobj.poster"></rich-text>
</view>
</view>
</scroll-view>
</view>
<view class="h-100 mtb-30 mlr-24">
<view @click="$wskj.to('/pages/ljyd')" class="fullscreen-btn" style="background-color: #FE42C2;">
<text>立即预订</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
partyobj: '',
storeobj: ''
};
},
onLoad(options) {
this.storeobj = this.$store.state.messagelist
this.$api.getPartyByDetail(this.storeobj.shopid).then(res => {
this.partyobj = res.data
})
},
methods: {
onShareAppMessage(){
return {
title:"花海",
path:"/",
success:(res)=>{
this.$u.toast({
title:'转发成功',
duration:1000
})
},
fail:()=>{
}
}
}
},
};
</script>
<style scoped>
.container {
width: 100%;
height: 100%;
background: #0F0F0F;
background-color: ;
display: flex;
flex-direction: column;
}
</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.
<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.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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