Commit b4509306 authored by 秦威威's avatar 秦威威

start

parents
Pipeline #21 failed with stages
# 忽略UniApp编译生成的小程序相关目录
/unpackage/*
!/unpackage/res/*
/.idea/*
/.hbuilderx/*
/.svn/*
<script>
export default {
globalData: {
lon: '',
lat: ''
},
onLaunch: function() {
// 初始化用户状态
this.User.__init();
},
onShow: function() {
uni.getLocation({
type: 'wgs84',
success: (res) => {
this.globalData.lon = res.longitude;
this.globalData.lat = res.latitude;
console.log('当前位置的经度:' + res.longitude);
console.log('当前位置的纬度:' + res.latitude);
}
});
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style lang="scss">
/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
@import "@/uni_modules/uview-plus/index.scss";
/*每个页面公共css */
@import './common/uni.css';
/* 通用样式 */
@import './common/common.css';
/* @import "./uni_modules/uview-plus/index.scss"; */
</style>
<style lang="scss">
.common-mes-nofity {
padding-bottom: 50rpx;
position: relative;
width: 100%;
border-radius: 14rpx;
background-color: #ffffff;
.top {
width: 100%;
background: linear-gradient(180deg, #FFE3D9 0%, #FFFFFF 100%);
border-radius: 14rpx;
height: 148rpx;
}
.bot {
margin-top: 72rpx;
.confirm {
padding: 10rpx 60rpx;
border-radius: 30rpx;
color: #ffffff;
background-color: #FF4502;
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 28rpx;
color: #FFFFFF;
}
}
}
</style>
\ No newline at end of file
This diff is collapsed.
// 配置信息
export default {
// api请求前缀
// webUrl: 'http://192.168.0.170:8081/client'
// webUrl: 'http://e582ac.natappfree.cc'
// webUrl: 'http://192.168.0.150:9302'
webUrl: 'https://server.mycsh.cc/prod-api/client'
// webUrl: 'https://wx.hnivdlab.com'
// webUrl: 'https://mycsh.xnszz.com'
}
\ No newline at end of file
export function getCusNavBarInfo() {
let menuBtnInfo = uni.getMenuButtonBoundingClientRect()
let statusBarHeight = uni.getSystemInfoSync().statusBarHeight
let menuBtnWidth = menuBtnInfo.width
let menuBtnHeight = menuBtnInfo.height
let menuBtnLeft = menuBtnInfo.left
let menuBtnBottom = menuBtnInfo.bottom
let menuBtnTop = menuBtnInfo.top
let menuBtnRight = menuBtnInfo.right
let navBarHeight = menuBtnHeight + (menuBtnTop - statusBarHeight) * 2
let customizeNavBarHeight = statusBarHeight + navBarHeight
return {
menuBtnInfo,
statusBarHeight,
menuBtnWidth,
menuBtnHeight,
menuBtnLeft,
menuBtnBottom,
menuBtnTop,
menuBtnRight,
navBarHeight,
customizeNavBarHeight
}
}
\ No newline at end of file
// 引入配置文件
import toast from "../uni_modules/uview-plus/components/u-toast/toast.js";
import config from "./config.js";
import User from "./user.js";
export default {
config: {
baseUrl: config.webUrl,
header: {
'Content-Type': 'application/json;charset=UTF-8',
},
data: {},
method: "GET",
dataType: "json",
},
request(options = {}) {
options.header = options.header || this.config.header;
options.method = options.method || this.config.method;
options.dataType = options.dataType || this.config.dataType;
options.url = this.config.baseUrl + options.url;
options.header.Authorization = uni.getStorageSync('token')
// TODO:token增加等操作
// console.log(options);
if (options.token) {
// 验证用户是否登录
if (!this.checkToken(options.checkToken)) return;
// 验证用户操作权限(验证是否绑定手机号码)
// if (!this.checkAuth(options.checkAuth)) return;
options.header.Authorization = User.token;
} else {
this.checkToken()
}
return new Promise((success, resolve) => {
uni.request(options)
//请求成功
.then(res => {
// console.log(res,'resresresresresresres');
if (res.data.code == 200) {
console.log('请求成功');
success(res)
} else if (res.data.code == 2001) {
console.log('请求成功');
success(res)
} else if (res.data.code == 403) {
this.checkLoginExpired();
} else if (res.data.code == 500) {
uni.showToast({
title: res.data.msg,
icon: "none"
});
resolve(res)
}
this.logApiRequest(options, res)
})
//请求失败
.catch(err => {
console.log('请求失败');
})
})
},
get(url, data, options = {}) {
options.url = url;
options.data = data;
options.method = 'GET';
return this.request(options);
},
post(url, data, options = {}) {
options.url = url;
options.data = data;
options.method = 'POST';
return this.request(options);
},
// 上传图片
upload(url, options = {}) {
options.url = this.config.baseUrl + url;
options.header = options.header || this.config.header;
options.fileType = options.fileType || "image";
options.formData = options.formData || {};
options.filePath = options.filePath;
options.name = options.name;
// TODO:token增加等操作
if (options.token) {
// 验证是否登录
if (!this.checkToken(options.checkToken)) return;
// 验证权限
// if (!this.checkAuth(options.checkAuth)) return;
options.header.Authorization = User.token;
}
return uni.uploadFile(options);
},
// 错误处理
errorCheck(err, res, errfun = false, resfun = false) {
if (err) {
typeof errfun === 'function' && errfun();
uni.showToast({
title: '加载失败',
icon: "none"
});
return false;
}
if (res.data.errorCode) {
typeof errfun === 'function' && resfun();
uni.showToast({
title: res.data.msg,
icon: "none"
});
return false;
}
return true;
},
// 验证用户是否登录
checkToken(checkToken) {
if (checkToken && !User.token) {
uni.showToast({
title: '请先登录',
icon: "none"
})
uni.navigateTo({
url: '/pages/login/login'
});
return false;
}
return true;
},
checkLoginExpired(res) {
uni.setStorageSync("token", "");
console.log(res, 'aaaaaaaa');
// uni.showToast({
// title: '请先登录',
// icon: "none"
// })
uni.navigateTo({
url: '/pages/login/login'
});
return true;
},
//封装日志打印函数
logApiRequest(data, response) {
console.log(`========== 接口请求start日志 ==========`);
console.log(data);
console.log(response);
console.log(`========== 接口请求end日志 ==========`);
}
// 验证用户权限
// checkAuth(checkAuth){
// if (checkAuth && !User.userinfo.phone) {
// uni.showToast({ title: '请先绑定手机号码', icon:"none" })
// uni.navigateTo({
// url: '/pages/user-bind-phone/user-bind-phone'
// });
// return false;
// }
// return true;
// }
}
\ No newline at end of file
This diff is collapsed.
import $http from "./request.js"
export default {
// 用户token
token: false,
// 用户信息
userinfo: false,
// 绑定第三方登录情况
userbind: false,
latitude: 0,
longitude: 0,
curcity: false,
agreeagent: false,
sysnotify: false,
// 初始化
__init(){
// 获取用户信息
this.userinfo = uni.getStorageSync("userinfo");
this.token = uni.getStorageSync("token");
this.counts = uni.getStorageSync("counts");
this.userbind = uni.getStorageSync("userbind");
this.curcity = uni.getStorageSync("curcity");
this.agreeagent = uni.getStorageSync("agreeagent");
this.sysnotify = uni.getStorageSync("sysnotify");
},
// 权限验证跳转
navigate(options,type = "navigateTo",isCheck){
// 是否登录验证
if (!$http.checkToken(isCheck)) return;
// 验证是否绑定手机号
// if (!$http.checkAuth(true)) return;
// 跳转
switch (type){
case "navigateTo":
uni.navigateTo(options);
break;
case "redirectTo":
uni.redirectTo(options);
break;
case "reLaunch":
uni.reLaunch(options);
break;
case "switchTab":
uni.switchTab(options);
break;
}
},
// 登录
async login(options ={}){
uni.showLoading({ title: '登录中...', mask: true });
// 请求登录
let [err,res] = await $http.post(options.url,options.data);
// 登录失败
if (!$http.errorCheck(err,res)){
uni.hideLoading();
return false;
}
console.log("res", res);
// 登录成功 保存状态
this.token = res.data.data.token;
// this.userinfo = this.__formatUserinfo(res.data.data);
// 本地存储
// uni.setStorageSync("userinfo", this.userinfo);
uni.setStorageSync("token", this.token);
// 成功提示
uni.hideLoading();
uni.showToast({ title: '登录成功' });
// 返回上一步
// if (!options.Noback) {
// uni.navigateBack({ delta: 1 });
// }
return true;
},
// 退出登录
async logout(showToast = true){
// 退出登录
await $http.post('/user/logout',{},{
token:true,
checkToken:true ,
});
// 清除缓存
uni.removeStorageSync('userinfo');
uni.removeStorageSync('token');
uni.removeStorageSync('counts');
// 清除状态
this.token = false;
this.userinfo = false;
this.userbind = false;
this.counts = {};
// 返回home页面
uni.switchTab({ url:"/pages/home/home" })
// 退出成功
if (showToast) {
return uni.showToast({ title: '退出登录成功' });
}
},
// 获取当前用户第三方绑定情况
// async getUserBind(){
// let [err,res] =await $http.get('/user/getuserbind',{},{
// token: true,
// checkToken: true
// });
// if (!$http.errorCheck(err,res)) return false;
// this.userbind = res.data.data;
// // 存储缓存
// uni.setStorageSync("userbind", this.userbind);
// return true;
// },
// 转换第三方登录格式
// __formatOtherLogin(provider,options){
// return {
// provider:provider,
// openid:options.userInfo.unionId || options.userInfo.openId,
// expires_in:options.authResult.expires_in,
// nickName:options.userInfo.nickName,
// avatarUrl:options.userInfo.avatarUrl,
// }
// },
setCurCity(city) {
uni.setStorageSync("curcity", city);
this.curcity = city
},
setUserInfo(userinfo) {
this.userinfo = userinfo;
// 本地存储
uni.setStorageSync("userinfo", this.userinfo);
},
setAgreeAgent(value) {
// 本地存储
uni.setStorageSync("agreeagent", value);
this.agreeagent = value
},
setSysNotify(value) {
// 本地存储
uni.setStorageSync("sysnotify", value)
this.sysnotify = value
}
}
export const debounce = function(func) {
let args = arguments;
let result = null
console.log(args);
if (timeout) {
clearTimeout(timeout)
}
let callNow = !timeout
let timeout = setTimeout(() => {
timeout = null;
}, 1000)
if (callNow) {
result = func.apply(this, args) //如this指向有问题再开启 并注释下一行
// result = func(...args)
}
return result
}
<template>
<view class="tab-item">
<view
@click="handleCheckTab(item)"
:class="['tab-content u-f u-f-fdc u-f-aic', acitveTab === item.id ? 'active' : '']">
<text class="name fs30 fw400 mg-bot-10">{{item.name}}</text>
<image style="width: 32rpx;height: 8rpx;" src="../.././static/common/curve.png" :style="{'visibility': acitveTab !== item.id ? 'hidden' : ''}" />
</view>
</view>
</template>
<script>
export default {
name: "CommonTab",
props: {
item: {
type: Object,
default: {}
},
acitveTab: {
type: String,
default: ''
}
},
methods: {
handleCheckTab(item) {
this.$emit('tab-item', item)
}
}
}
</script>
<style lang="scss" scoped>
.tab-item {
position: relative;
.tab-content {
.name {
color: #999999;
line-height: 38rpx;
}
&.active {
.name {
color: #333333;
}
}
}
}
</style>
\ No newline at end of file
<template>
<view class="common-title fs28">
{{ msg }}
</view>
</template>
<script>
export default {
name: "CommonTitle",
props: {
msg: {
type: String,
default: ''
}
}
}
</script>
<style lang="scss" scoped>
.common-title {
color: #333333;
border-left: 6rpx solid #FF4502;
padding-left: 10rpx;
}
</style>
\ No newline at end of file
<template>
<view class="u-f u-f-aic u-f-jcc" style="width: 100%;">
<text class="load-more" :style="{color: color}">{{loadtext}}</text>
</view>
</template>
<script>
export default {
props:{
loadtext:String,
color:{
type:String,
default:'#999999'
}
}
}
</script>
<style lang='scss' scoped>
.load-more{
font-size: 24rpx;
text-align: center;
padding: 30rpx;
}
</style>
<template>
<view class="good-list mg-top-24" @click="goToDetail">
<view class="good-item u-f u-f-jcfs u-f-aifs">
<view style="width: 146rpx;" class="u-f u-f-fdc mg-right-10">
<image style="width: 146rpx;height: 146rpx;" :mode="'scaleToFill'" :src="item.goodsImage"
class="border-radius-9"></image>
</view>
<view class="right" style="width: calc(100% - 156rpx);">
<view class="fs28 one-line-ellipsis mg-bot-10" style="width: 100%;">{{item.goodsName}}</view>
<view class="fs22 u-f u-f-jcfs u-f-aic mg-bot-10">
<view class="gray-btn u-f u-f-jcfs u-f-aic">
<view class="shop-icon mg-right-8">
<image src="../.././static/common/shop-icon.png" :mode="'widthFix'"
style="width: 100%;height: 100%"></image>
</view>
<text class="light-black">{{item.storeName}}</text>
</view>
</view>
<view class="fs24 light-gray mg-bot-10">
总售 {{item.totalSales}}
</view>
<view class="fs24 fw400 mg-bot-10 one-line-ellipsis">
<text class="light-black">{{item.distance}}km </text>
<text class="light-gray">| {{item.address}}</text>
</view>
<view class="mg-top-16 u-f u-f-jcsb u-f-aic">
<text class="main-color fs30 fw700">{{item.goodsOriginalPrice}}</text>
<view class="go-look u-f u-f-aic u-f-jcfs">
<text class="mg-right-10">立即抢购</text>
<text class="white-right-arrow"></text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'maintenanceShop',
props: {
item: {
type: Object,
default: {}
},
activeOperateMenu: {
type: Number,
default: 0
}
},
methods: {
goToDetail() {
this.$emit('enter-detail', this.item)
}
}
}
</script>
<style lang="scss" scoped>
.good-list {
.good-item {
background-color: #ffffff;
border-radius: 18rpx;
padding: 20rpx;
}
}
.shop-icon {
width: 24rpx;
height: 24rpx;
}
.go-look {
color: #ffffff;
padding: 6rpx 26rpx;
background: linear-gradient(90deg, #FF4502 0%, #FF8903 100%);
border-radius: 30rpx;
}
.white-right-arrow {
width: 16rpx;
height: 16rpx;
background: url(../.././static/common/white_right_arrow.png) no-repeat center center;
background-size: 100%;
}
.gray-btn {
padding: 6rpx 10rpx;
background: #F1F1F1;
border-radius: 20rpx 20rpx 20rpx 20rpx;
}
</style>
\ No newline at end of file
<template>
<view class="shop-car-item">
<view class="title u-f u-f-jcfs u-f-aic mg-bot-20">
<text style="width: 32rpx;height: 32rpx;" :class="['mg-right-16', isChecked ? 'check' : 'uncheck']" @click="handleCheck"></text>
<text class="fs24 fw400 light-black mg-right-10">{{item.storeName}}</text>
<text class="fs24 fw400 light-gray mg-right-10">{{item.storeNum}}家店通用</text>
<image style="width: 16rpx;height: 16rpx;" src="../.././static/common/sg_right_arrow.png" />
</view>
<view class="u-f u-f-jcfs u-f-aic">
<text style="width: 32rpx;height: 32rpx;" :class="['mg-right-16', isChecked ? 'check' : 'uncheck']" @click="handleCheck"></text>
<view>
<image
:src="item.goodsImage"
style="width: 128rpx;height: 128rpx;background-color:#F9F9F9"
:mode="'scaleToFill'"
class="mg-right-10 border-radius-9"
></image>
</view>
<view class="u-f u-f-fdc" style="flex: calc(100% - 186rpx)">
<view class="fs28 light-black fw400 mg-bot-10 one-line-ellipsis">{{item.goodsName}}</view>
<view class="mg-bot-10 u-f u-f-aic u-f-jcfs">
<text class="light-gray fs24 mg-right-8">{{item.goodsSpecification}}</text>
<text class="gray-down-arrow"></text>
</view>
<view class="u-f u-f-aic u-f-jcsb">
<view class="u-f u-f-jcfs u-f-aic">
<view class="mg-right-10">
<text class="fs24 main-color"></text>
<text class="fs32 main-color">{{item.commodityPrice}}</text>
</view>
<view class="fs24 light-gray delete-line">
<text></text>
<text>{{item.goodsOriginalPrice}}</text>
</view>
</view>
<view>
<uni-number :min="1" :value="item.goodsNum" @change="handleChangeNum"></uni-number>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import uniNumber from "../.././components/uni-number-box/uni-number-box.vue"
export default {
components: {
uniNumber
},
emits: ['checked', 'change-num'],
props: {
item: {
type: Object,
default: {}
}
},
data() {
return {
isChecked: this.item.isChecked
}
},
methods: {
handleCheck() {
this.isChecked = !this.isChecked
this.$emit('checked', { shopCarId: this.item.shopCarId, isChecked: this.isChecked })
},
handleChangeNum(value) {
this.$emit('change-num', { shopCarId: this.item.shopCarId, goodsId: this.item.goodsId, goodsNum: value })
}
},
watch: {
'item.isChecked': function(newVal, oldVal) {
this.isChecked = newVal
}
}
}
</script>
<style lang="scss" scoped>
.shop-car-item {
padding: 20rpx 10rpx;
background: #FFFFFF;
border-radius: 18rpx 18rpx 18rpx 18rpx;
}
.gray-down-arrow {
width: 16rpx;
height: 16rpx;
// background: url(../.././static/common/gray_down_arrow.png) no-repeat center center;
background-size: 100%;
}
.small-gray-right-arrow {
width: 16rpx;
height: 16rpx;
background: url(../.././static/common/sg_right_arrow.png) no-repeat center center;
background-size: 100%;
}
.uncheck {
color: #ffffff;
border-radius: 50%;
border: 1rpx solid #999999;
background-color: #ffffff;
position: relative;
}
.check {
color: #ffffff;
border-radius: 50%;
position: relative;
&:before {
content: '';
width: 32rpx;
height: 32rpx;
border: 1rpx solid #FF4502;
background-color: #FF4502;
display: inline-block;
border-radius: 50%;
vertical-align: middle;
}
&:after {
content: '';
width: 20rpx;
height: 10rpx;
border: 4rpx solid #ffffff;
border-top: transparent;
border-right: transparent;
text-align: center;
display: block;
position: absolute;
top: 12rpx;
left: 6rpx;
vertical-align: middle;
transform: rotate(-45deg);
}
}
</style>
\ No newline at end of file
<template>
<view class="uni-navbar" :class="{'uni-dark':dark, 'uni-nvue-fixed': fixed}">
<view class="uni-navbar__content" :class="{ 'uni-navbar--fixed': fixed, 'uni-navbar--shadow': shadow, 'uni-navbar--border': border }"
:style="{ 'background-color': themeBgColor }" >
<status-bar v-if="statusBar" />
<view :style="{ height:navbarHeight, width: totalWidth + 'px'}"
class="uni-navbar__header">
<view @tap="onClickLeft" class="uni-navbar__header-btns uni-navbar__header-btns-left"
:style="{width:leftIconWidth}">
<slot name="left">
<view class="uni-navbar__content_view" v-if="leftIcon.length > 0">
<uni-icons :color="themeColor" :type="leftIcon" size="20" />
</view>
<view :class="{ 'uni-navbar-btn-icon-left': !leftIcon.length > 0 }" class="uni-navbar-btn-text"
v-if="leftText.length">
<text :style="{ color: themeColor, fontSize: '12px' }">{{ leftText }}</text>
</view>
</slot>
</view>
<view class="uni-navbar__header-container" @tap="onClickTitle">
<slot>
<view class="uni-navbar__header-container-inner" v-if="title.length>0">
<text class="uni-nav-bar-text uni-ellipsis-1"
:style="{color: themeColor }">{{ title }}</text>
</view>
</slot>
</view>
<view @click="onClickRight" class="uni-navbar__header-btns uni-navbar__header-btns-right"
:style="{width:rightIconWidth}">
<slot name="right">
<view v-if="rightIcon.length">
<uni-icons :color="themeColor" :type="rightIcon" size="22" />
</view>
<view class="uni-navbar-btn-text" v-if="rightText.length && !rightIcon.length">
<text class="uni-nav-bar-right-text" :style="{ color: themeColor}">{{ rightText }}</text>
</view>
</slot>
</view>
</view>
</view>
</view>
</template>
<script>
import statusBar from "./uni-status-bar.vue";
const getVal = (val) => typeof val === 'number' ? val + 'px' : val;
/**
*
*
* NavBar 自定义导航栏
* @description 导航栏组件,主要用于头部导航
* @tutorial https://ext.dcloud.net.cn/plugin?id=52
* @property {Boolean} dark 开启黑暗模式
* @property {String} title 标题文字
* @property {String} leftText 左侧按钮文本
* @property {String} rightText 右侧按钮文本
* @property {String} leftIcon 左侧按钮图标(图标类型参考 [Icon 图标](http://ext.dcloud.net.cn/plugin?id=28) type 属性)
* @property {String} rightIcon 右侧按钮图标(图标类型参考 [Icon 图标](http://ext.dcloud.net.cn/plugin?id=28) type 属性)
* @property {String} color 图标和文字颜色
* @property {String} backgroundColor 导航栏背景颜色
* @property {Boolean} fixed = [true|false] 是否固定顶部
* @property {Boolean} statusBar = [true|false] 是否包含状态栏
* @property {Boolean} shadow = [true|false] 导航栏下是否有阴影
* @property {Boolean} stat 是否开启统计标题上报
* @event {Function} clickLeft 左侧按钮点击时触发
* @event {Function} clickRight 右侧按钮点击时触发
* @event {Function} clickTitle 中间标题点击时触发
*/
export default {
name: "UniNavBar",
components: {
statusBar
},
data() {
return {
totalWidth: 281
}
},
emits: ['click-left', 'click-right', 'click-title'],
props: {
dark: {
type: Boolean,
default: false
},
title: {
type: String,
default: ""
},
leftText: {
type: String,
default: ""
},
rightText: {
type: String,
default: ""
},
leftIcon: {
type: String,
default: ""
},
rightIcon: {
type: String,
default: ""
},
fixed: {
type: [Boolean, String],
default: false
},
color: {
type: String,
default: ""
},
backgroundColor: {
type: String,
default: ""
},
statusBar: {
type: [Boolean, String],
default: false
},
shadow: {
type: [Boolean, String],
default: false
},
border: {
type: [Boolean, String],
default: true
},
height: {
type: [Number, String],
default: 44
},
leftWidth: {
type: [Number, String],
default: 60
},
rightWidth: {
type: [Number, String],
default: 60
},
stat: {
type: [Boolean, String],
default: ''
}
},
computed: {
themeBgColor() {
if (this.dark) {
// 默认值
if (this.backgroundColor) {
return this.backgroundColor
} else {
return this.dark ? '#333' : '#FFF'
}
}
return this.backgroundColor || '#FFF'
},
themeColor() {
if (this.dark) {
// 默认值
if (this.color) {
return this.color
} else {
return this.dark ? '#fff' : '#333'
}
}
return this.color || '#333'
},
navbarHeight() {
return getVal(this.height)
},
leftIconWidth() {
return getVal(this.leftWidth)
},
rightIconWidth() {
return getVal(this.rightWidth)
}
},
mounted() {
if (uni.report && this.stat && this.title !== '') {
uni.report('title', this.title)
}
let menuBtn = uni.getMenuButtonBoundingClientRect()
let left = menuBtn.left
this.totalWidth = left
},
methods: {
onClickLeft() {
this.$emit("click-left");
},
onClickRight() {
this.$emit("click-right");
},
onClickTitle() {
this.$emit("click-title");
}
}
};
</script>
<style lang="scss" scoped>
$nav-height: 44px;
.uni-nvue-fixed {
/* #ifdef APP-NVUE */
position: sticky;
/* #endif */
}
.uni-navbar {
// box-sizing: border-box;
}
.uni-nav-bar-text {
/* #ifdef APP-PLUS */
font-size: 34rpx;
/* #endif */
/* #ifndef APP-PLUS */
font-size: 14px;
/* #endif */
}
.uni-nav-bar-right-text {
font-size: 12px;
}
.uni-navbar__content {
position: relative;
// background-color: #fff;
// box-sizing: border-box;
background-color: transparent;
}
.uni-navbar__content_view {
// box-sizing: border-box;
}
.uni-navbar-btn-text {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: flex-start;
align-items: center;
line-height: 12px;
}
.uni-navbar__header {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
padding: 0 10px;
flex-direction: row;
height: $nav-height;
font-size: 12px;
}
.uni-navbar__header-btns {
/* #ifndef APP-NVUE */
overflow: hidden;
display: flex;
/* #endif */
flex-wrap: nowrap;
flex-direction: row;
width: 120rpx;
// padding: 0 6px;
justify-content: center;
align-items: center;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
}
.uni-navbar__header-btns-left {
display: flex;
width: 120rpx;
justify-content: flex-start;
align-items: center;
}
.uni-navbar__header-btns-right {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.uni-navbar__header-container {
display: flex;
flex: 1;
padding: 0 10px;
overflow: hidden;
align-items: center;
}
.uni-navbar__header-container-inner {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: row;
align-items: center;
justify-content: center;
font-size: 12px;
overflow: hidden;
// box-sizing: border-box;
}
.uni-navbar__placeholder-view {
height: $nav-height;
}
.uni-navbar--fixed {
position: fixed;
z-index: 998;
/* #ifdef H5 */
left: var(--window-left);
right: var(--window-right);
/* #endif */
/* #ifndef H5 */
left: 0;
right: 0;
/* #endif */
}
.uni-navbar--shadow {
box-shadow: 0 1px 6px #ccc;
}
.uni-navbar--border {
border-bottom-width: 1rpx;
border-bottom-style: solid;
border-bottom-color: #eee;
}
.uni-ellipsis-1 {
overflow: hidden;
/* #ifndef APP-NVUE */
white-space: nowrap;
text-overflow: ellipsis;
/* #endif */
/* #ifdef APP-NVUE */
lines: 1;
text-overflow: ellipsis;
/* #endif */
}
// 暗主题配置
.uni-dark {}
</style>
<template>
<view :style="{ height: statusBarHeight }" class="uni-status-bar">
<slot />
</view>
</template>
<script>
export default {
name: 'UniStatusBar',
data() {
return {
statusBarHeight: 20
}
},
mounted() {
this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight + 'px'
}
}
</script>
<style lang="scss">
.uni-status-bar {
// width: 750rpx;
height: 20px;
// height: var(--status-bar-height);
}
</style>
<template>
<view class="uni-numbox">
<view @click="_calcValue('minus')" class="uni-numbox__minus uni-numbox-btns" :style="{background}">
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue <= min || disabled }" :style="{color}">-</text>
</view>
<input :disabled="disabled" @focus="_onFocus" @blur="_onBlur" class="uni-numbox__value" type="number"
v-model="inputValue" :style="{background, color}" />
<view @click="_calcValue('plus')" class="uni-numbox__plus uni-numbox-btns" :style="{background}">
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue >= max || disabled }" :style="{color}">+</text>
</view>
</view>
</template>
<script>
/**
* NumberBox 数字输入框
* @description 带加减按钮的数字输入框
* @tutorial https://ext.dcloud.net.cn/plugin?id=31
* @property {Number} value 输入框当前值
* @property {Number} min 最小值
* @property {Number} max 最大值
* @property {Number} step 每次点击改变的间隔大小
* @property {String} background 背景色
* @property {String} color 字体颜色(前景色)
* @property {Boolean} disabled = [true|false] 是否为禁用状态
* @event {Function} change 输入框值改变时触发的事件,参数为输入框当前的 value
* @event {Function} focus 输入框聚焦时触发的事件,参数为 event 对象
* @event {Function} blur 输入框失焦时触发的事件,参数为 event 对象
*/
export default {
name: "UniNumberBox",
emits: ['change', 'input', 'update:modelValue', 'blur', 'focus'],
props: {
value: {
type: [Number, String],
default: 1
},
modelValue: {
type: [Number, String],
default: 1
},
min: {
type: Number,
default: 0
},
max: {
type: Number,
default: 100
},
step: {
type: Number,
default: 1
},
background: {
type: String,
default: '#f5f5f5'
},
color: {
type: String,
default: '#333'
},
disabled: {
type: Boolean,
default: false
}
},
data() {
return {
inputValue: 0
};
},
watch: {
value(val) {
this.inputValue = +val;
},
modelValue(val) {
this.inputValue = +val;
}
},
created() {
if (this.value === 1) {
this.inputValue = +this.modelValue;
}
if (this.modelValue === 1) {
this.inputValue = +this.value;
}
},
methods: {
_calcValue(type) {
if (this.disabled) {
return;
}
const scale = this._getDecimalScale();
let value = this.inputValue * scale;
let step = this.step * scale;
if (type === "minus") {
value -= step;
if (value < (this.min * scale)) {
return;
}
if (value > (this.max * scale)) {
value = this.max * scale
}
}
if (type === "plus") {
value += step;
if (value > (this.max * scale)) {
return;
}
if (value < (this.min * scale)) {
value = this.min * scale
}
}
this.inputValue = (value / scale).toFixed(String(scale).length - 1);
this.$emit("change", +this.inputValue);
// TODO vue2 兼容
this.$emit("input", +this.inputValue);
// TODO vue3 兼容
this.$emit("update:modelValue", +this.inputValue);
},
_getDecimalScale() {
let scale = 1;
// 浮点型
if (~~this.step !== this.step) {
scale = Math.pow(10, String(this.step).split(".")[1].length);
}
return scale;
},
_onBlur(event) {
this.$emit('blur', event)
let value = event.detail.value;
if (!value) {
// this.inputValue = 0;
return;
}
value = +value;
if (value > this.max) {
value = this.max;
} else if (value < this.min) {
value = this.min;
}
const scale = this._getDecimalScale();
this.inputValue = value.toFixed(String(scale).length - 1);
this.$emit("change", +this.inputValue);
this.$emit("input", +this.inputValue);
},
_onFocus(event) {
this.$emit('focus', event)
}
}
};
</script>
<style lang="scss" scoped>
$box-height: 26px;
$bg: #f5f5f5;
$br: 2px;
$color: #333;
.uni-numbox {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
}
.uni-numbox-btns {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
justify-content: center;
padding: 0 8px;
background-color: $bg;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
}
.uni-numbox__value {
margin: 0 2px;
background-color: $bg;
width: 60px;
height: $box-height;
text-align: center;
font-size: 14px;
border-left-width: 0;
border-right-width: 0;
color: $color;
border-radius: 30rpx !important;
}
.uni-numbox__minus {
// border-top-left-radius: $br;
// border-bottom-left-radius: $br;
background-color: transparent!important;
}
.uni-numbox__plus {
background-color: transparent !important;
// border-top-right-radius: $br;
// border-bottom-right-radius: $br;
}
.uni-numbox--text {
// fix nvue
line-height: 30px;
font-size: 20px;
font-weight: 400;
color: $color;
}
.uni-numbox .uni-numbox--disabled {
color: #c0c0c0 !important;
/* #ifdef H5 */
cursor: not-allowed;
/* #endif */
}
</style>
<template>
<view>
<view class="uni-mask" v-show="show" :style="{ top: offsetTop + 'px' }" @click="hide" @touchmove.stop.prevent="moveHandle"></view>
<view class="uni-popup" :class="'uni-popup-' + position + ' ' + 'uni-popup-' + mode" v-show="show">
{{ msg }}
<slot></slot>
<view v-if="position === 'middle' && mode === 'insert'" :class="{
'uni-close-bottom': buttonMode === 'bottom',
'uni-close-right': buttonMode === 'right'
}" @click="closeMask">
<image style="width: 60rpx;height: 60rpx;" src="../../static/icon_x.png"></image>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'uni-popup',
props: {
/**
* 页面显示
*/
show: {
type: Boolean,
default: false
},
/**
* 对齐方式
*/
position: {
type: String,
//top - 顶部, middle - 居中, bottom - 底部
default: 'middle'
},
/**
* 显示模式
*/
mode: {
type: String,
default: 'insert'
},
/**
* 额外信息
*/
msg: {
type: String,
default: ''
},
/**
* h5遮罩是否到顶
*/
h5Top: {
type: Boolean,
default: false
},
buttonMode: {
type: String,
default: 'bottom'
}
},
data() {
return {
offsetTop: 0
};
},
watch: {
h5Top(newVal) {
if (newVal) {
this.offsetTop = 44;
} else {
this.offsetTop = 0;
}
}
},
methods: {
hide() {
if (this.mode === 'insert' && this.position === 'middle') return;
this.$emit('hidePopup');
},
closeMask() {
if (this.mode === 'insert') {
this.$emit('hidePopup');
}
},
moveHandle() {}
},
created() {
let offsetTop = 0;
//#ifdef H5
if (!this.h5Top) {
offsetTop = 120;
} else {
offsetTop = 0;
}
//#endif
this.offsetTop = 0;
}
};
</script>
<style>
.uni-mask {
position: fixed;
z-index: 998;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.3);
}
.uni-popup {
position: fixed;
z-index: 999;
background-color: #ffffff;
}
.uni-popup-middle {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.uni-popup-middle.uni-popup-insert {
min-width: 380upx;
min-height: 380upx;
max-width: 100%;
max-height: 80%;
transform: translate(-50%, -50%);
background: none;
box-shadow: none;
}
.uni-popup-middle.uni-popup-fixed {
border-radius: 10upx;
padding: 30upx;
}
.uni-close-bottom,
.uni-close-right {
position: absolute;
bottom: -90upx;
text-align: center;
border-radius: 50%;
color: #f5f5f5;
font-size: 60upx;
font-weight: bold;
opacity: 0.8;
z-index: -1;
}
.uni-close-right {
right: -60upx;
top: -80upx;
}
.uni-close-bottom:after {
content: '';
position: absolute;
width: 0px;
top: -200upx;
bottom: 56upx;
left: 50%;
transform: translate(-50%, -0%);
opacity: 0.8;
}
.uni-popup-top {
top: 0;
left: 0;
width: 100%;
height: 100upx;
line-height: 100upx;
text-align: center;
}
.uni-popup-bottom {
left: 0;
bottom: 0;
width: 100%;
/* min-height: 100upx;
line-height: 100upx; */
text-align: center;
}
.closeIcon,.uni-icon-close:before {
content: '\e404';
}
</style>
\ 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'
import uviewPlus from '@/uni_modules/uview-plus'
// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
// import VConsole from 'vconsole';
// let vConsole = new VConsole();
// console.log("test");
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
// #endif
// #ifdef VUE3
import {
createSSRApp
} from 'vue'
// 挂载全局方 法
import config from "./common/config.js"
import request from "./common/request.js";
import User from "./common/user.js"
import {
debounce
} from "./common/utils.js"
import shares from './utils/share.js'
export function createApp() {
const app = createSSRApp(App)
app.mixin(shares)
app.use(uviewPlus)
app.config.globalProperties.$config = config
app.config.globalProperties.$http = request
app.config.globalProperties.$debounce = debounce
app.config.globalProperties.User = User
return {
app
}
}
// #endif
\ No newline at end of file
{
"name" : "car-life-wx",
"appid" : "__UNI__563975F",
"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" : {
"dSYMs" : false
},
/* SDK配置 */
"sdkConfigs" : {
"ad" : {}
}
}
},
/* 快应用特有相关 */
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
"appid" : "wx2455f35fd27832e1",
"appsectet" : "62774accff6b5c2b3c377d579c9bbb5b",
"setting" : {
"urlCheck" : false,
"es6" : true,
"postcss" : true,
"minified" : true
},
"usingComponents" : true,
"permission" : {
"scope.userLocation" : {
"desc" : "获取位置"
}
},
// chooseAddress,chooseLocation,choosePoi,getFuzzyLocation,getLocation,onLocationChange,startLocationUpdate,startLocationUpdateBackground
"requiredPrivateInfos" : [
"chooseAddress",
"chooseLocation",
"choosePoi",
"getLocation",
"onLocationChange",
"startLocationUpdate",
"startLocationUpdateBackground"
]
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "3"
}
{
"name": "cheshenghuo",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"vconsole": "^3.15.1"
}
},
"node_modules/@babel/runtime": {
"version": "7.26.0",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.26.0.tgz",
"integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/copy-text-to-clipboard": {
"version": "3.2.0",
"resolved": "https://registry.npmmirror.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz",
"integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/core-js": {
"version": "3.39.0",
"resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.39.0.tgz",
"integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/mutation-observer": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/mutation-observer/-/mutation-observer-1.0.3.tgz",
"integrity": "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA=="
},
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
},
"node_modules/vconsole": {
"version": "3.15.1",
"resolved": "https://registry.npmmirror.com/vconsole/-/vconsole-3.15.1.tgz",
"integrity": "sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==",
"dependencies": {
"@babel/runtime": "^7.17.2",
"copy-text-to-clipboard": "^3.0.1",
"core-js": "^3.11.0",
"mutation-observer": "^1.0.3"
}
}
}
}
{
"dependencies": {
"vconsole": "^3.15.1"
}
}
This diff is collapsed.
<template>
<view class="AboutThePlatformIndex">
<u-navbar title="关于平台" leftIconColor="#000" rightIcon='../../static/common/white_left_arrrow.png' placeholder
leftIconSize='38rpx' autoBack="true">
</u-navbar>
</view>
</template>
<script>
export default {
data() {
return {
}
},
methods: {
}
}
</script>
<style lang="scss">
.AboutThePlatformIndex{}
</style>
<template>
<view class="RecordOfMaintenanceIndex">
<u-navbar title="养护记录" leftIconColor="#000" rightIcon='../../static/common/white_left_arrrow.png' placeholder
leftIconSize='38rpx' autoBack="true">
</u-navbar>
<view class="contablist">
<view class="listItem" v-for="(item,index) in tabsList" :key="index" @click="ONtab(item,index)">
<view :class="{'ckeckLabel':tabIndex==index,'label':true}">
{{item.name}}
</view>
<image src="../../static/common/curve.png" mode="" v-if="tabIndex==index"></image>
</view>
</view>
<view class="cardList">
<view class="card" v-if="list.length" v-for="(item,index) in list" :key="index">
<view class="cardItem">
<view class="cardLabel">
店铺名称
</view>
<view class="cardText">
{{item.storeName}}
</view>
</view>
<view class="cardItem">
<view class="cardLabel">
到店日期
</view>
<view class="cardText">
{{item.dateOfArrival}}
</view>
</view>
<view class="cardItem">
<view class="cardLabel">
消费金额
</view>
<view class="cardPrice">
{{item.consumptionAmount}}
</view>
</view>
<view class="cardItem">
<view class="cardLabel">
消费内容
</view>
<view class="cardText">
{{item.consumptionContent}}
</view>
</view>
<view class="carddesc">
{{item.maintainType}}
</view>
</view>
<view class="uempty" v-if="list.length <= 1">
<image src="../../static/icon_xx_k.png"></image>
<text>暂无数据</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
// tabsList: ['保养', '换轮胎', '贴膜', '维修检查', '喷漆', '换电瓶', '改装'],
tabsList: [],
tabIndex: 0,
pageNum: 1,
pageSize: 10,
tabsVal: '保养',
list: [],
}
},
onShow() {
this.getListData()
this.getStoreTypeListData()
},
methods: {
getStoreTypeListData() {
this.$http.get('/api/client/index/storeTypeList', {
storeTypeId: 1,
}).then(res => {
this.tabsList = res.data.data
})
},
getListData() {
this.$http.post('/api/client/maintain/list', {
pageNum: this.pageNum,
pageSize: this.pageSize,
maintainType: this.tabsVal
}).then((res) => {
this.list = res.data.data.rows
})
},
ONtab(data, index) {
this.tabIndex = index
this.tabsVal = data.name
this.getListData()
}
}
}
</script>
<style lang="scss">
.RecordOfMaintenanceIndex {
padding: 20rpx;
box-sizing: border-box;
background-color: #fafbff;
min-height: 100vh;
.uempty{
image{
width: 376rpx;
display: block;
margin: 0 auto;
}
text{
display: block;
text-align: center;
color: #ccc;
}
}
.contablist {
display: flex;
overflow-x: auto;
margin-top: 20rpx;
.listItem {
margin-right: 25rpx;
text-align: center;
flex: none;
.label {
font-weight: 400;
font-size: 30rpx;
color: #999999;
}
.ckeckLabel {
font-weight: 400;
font-size: 30rpx;
color: #333333;
}
image {
display: block;
margin: auto;
width: 30rpx;
margin-top: 7rpx;
height: 8rpx;
}
}
}
.cardList {
margin-top: 24rpx;
.card {
margin-bottom: 24rpx;
padding: 30rpx 20rpx;
width: 702rpx;
height: 378rpx;
background: #FFFFFF;
border-radius: 18rpx 18rpx 18rpx 18rpx;
box-sizing: border-box;
.cardItem {
display: flex;
align-items: center;
margin-bottom: 31rpx;
.cardLabel {
margin-right: auto;
font-weight: 400;
font-size: 28rpx;
color: #999999;
}
.cardText {
font-weight: 400;
font-size: 28rpx;
color: #333333;
}
.cardPrice {
font-weight: 400;
font-size: 28rpx;
color: #FF4502;
}
.carddesc {
font-weight: 400;
font-size: 28rpx;
color: #333333;
}
}
}
}
/* 隐藏滚动条 */
.contablist::-webkit-scrollbar {
display: none;
/* 隐藏滚动条 */
}
}
</style>
\ No newline at end of file
<template>
<view class="VehicleConditionReportIndex">
<u-navbar title="车况报告" leftIconColor="#000" rightIcon='../../static/common/white_left_arrrow.png' placeholder
leftIconSize='38rpx' autoBack="true">
</u-navbar>
<view class="content">
<view class="ConTitle">
您的爱车
</view>
<view class="myCar">
<view class="msgItem" v-for="(item,index) in myCarmsgList">
<view class="label">
{{item.label}}
</view>
<view class="name">
{{item.name}}
</view>
</view>
</view>
<view class="ConTitle">
保养状况
</view>
<view class="maintenanceStatus">
<view class="maintenanceStatusItem" v-for="(item,index) in maintenanceList">
<view class="label">
{{item.label}}
</view>
<view class="dispense" v-if="index==2">
{{item.name}}
</view>
<view class="name" v-else>
{{item.name}}
</view>
</view>
</view>
<view class="ConTitle">
保养提示
</view>
<view class="maintenanceHint">
{{hint}}
</view>
<view class="maintenancerecord" @click="onsubmit">
保养记录
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
myCarmsgList: [{
label: "车辆品牌",
name: ""
}, {
label: "车辆型号",
name: ""
}, {
label: "车辆牌照",
name: ""
}, {
label: "上路时间",
name: ""
}, ],
maintenanceList: [{
label: "车辆最近保养日期",
name: ""
}, {
label: "建议保养日期",
name: "2024-05-06"
}, {
label: "无需保养",
name: ""
}, ],
hint: "",
}
},
onShow() {
this.getVehicleConditionReportData()
},
methods: {
getVehicleConditionReportData() {
this.$http.get('/api/client/maintain/vehicleConditionReport').then((res) => {
this.myCarmsgList[0].name = res.data.data.vehicleBrand
this.myCarmsgList[1].name = res.data.data.vehicleModel
this.myCarmsgList[2].name = res.data.data.plateNo
this.myCarmsgList[3].name = res.data.data.startTime
this.maintenanceList[0].name = res.data.data.maintainDate
this.maintenanceList[1].name = res.data.data.suggestedMainDate
this.maintenanceList[2].name = res.data.data.maintainStatus
this.hint = res.data.data.maintainReminder
console.log(res.data.data);
})
},
onsubmit(){
this.User.navigate({url: '/pages/RecordOfMaintenance/RecordOfMaintenance'})
}
}
}
</script>
<style lang="scss">
.VehicleConditionReportIndex {
background-color: #fafbff;
min-height: 100vh;
padding-top: 30rpx;
box-sizing: border-box;
.content {
width: 702rpx;
margin: auto;
overflow: hidden;
.ConTitle {
margin-top: 30rpx;
margin-bottom: 16rpx;
padding-left: 12rpx;
font-weight: 400;
font-size: 28rpx;
color: #333333;
border-left: 6rpx #FF4502 solid;
}
.myCar {
padding: 30rpx 20rpx;
width: 702rpx;
height: 305rpx;
background: #FFFFFF;
border-radius: 18rpx 18rpx 18rpx 18rpx;
box-sizing: border-box;
.msgItem {
display: flex;
margin-bottom: 31rpx;
align-items: center;
&:last-child {
margin-bottom: 0;
}
}
}
.maintenanceStatus {
padding: 30rpx 20rpx;
box-sizing: border-box;
width: 702rpx;
height: 245rpx;
background: #FFFFFF;
border-radius: 18rpx 18rpx 18rpx 18rpx;
.maintenanceStatusItem {
display: flex;
margin-bottom: 31rpx;
align-items: center;
.dispense {
display: flex;
align-items: center;
justify-content: center;
margin-left: auto;
padding: 8rpx 10rpx;
width: 131rpx;
height: 41rpx;
background: #008636;
border-radius: 5rpx 5rpx 5rpx 5rpx;
font-weight: 400;
font-size: 26rpx;
color: #FFFFFF;
}
&:last-child {
margin-bottom: 0;
}
}
}
.maintenanceHint {
display: flex;
align-items: center;
padding: 20rpx 20rpx;
box-sizing: border-box;
width: 702rpx;
// height: 96rpx;
background: #FFFFFF;
border-radius: 18rpx 18rpx 18rpx 18rpx;
font-weight: 400;
font-size: 28rpx;
color: #333333;
}
.maintenancerecord {
display: flex;
align-items: center;
justify-content: center;
margin: auto;
margin-top: 110rpx;
width: 702rpx;
height: 80rpx;
background: linear-gradient(90deg, #FF4502 0%, #FF8903 100%);
border-radius: 41rpx 41rpx 41rpx 41rpx;
font-weight: 400;
font-size: 28rpx;
color: #FFFFFF;
}
.label {
font-weight: 400;
font-size: 28rpx;
color: #999999;
}
.name {
margin-left: auto;
text-align: end;
font-weight: 400;
font-size: 28rpx;
color: #333333;
}
}
}
</style>
\ No newline at end of file
<template>
<view class="add-car mg-lr-24">
<view class="add-car-info" v-if="showAddCar">
<view class="input-view u-f u-f-fdr u-f-aic u-f-fwnw">
<image class="search-icon" src="../../static/common/search.png"></image>
<input confirm-type="search" class="nav-bar-input" type="text" placeholder="搜索" />
</view>
<view class="hot-brand mg-bot-40">
<view class="">
<common-title :msg="'热门品牌'"></common-title>
</view>
<view class="hot-brand-list u-f u-f-jcsb u-f-fww mg-top-24">
<view class="hot-brand-item mg-bot-30" v-for="(item,index) in hotCar" :key="index"
@click="handleCarTypeSelect(item)">
<view class="hot-brand-content u-f u-f-aic u-f-fdc">
<!-- 车图 -->
<view style="width: 84rpx;height:84rpx" class="mg-bot-18">
<image :src="item.logo" :mode="'scaleToFill'" style="width: 100%;height:100%"></image>
</view>
<text class="fs24 light-black">{{item.name}}</text>
</view>
</view>
</view>
</view>
<!-- <view class="car-brand-list">
<view class="mg-bot-40" v-for="itemList in allCar" :key="itemList.letter">
<view class="fw400 fs28 light-black mg-bot-24">{{itemList.letter}}</view>
<view class="fw400 fs26 light-black mg-bot-28 u-f u-f-jcfs u-f-aic" v-for="item in itemList.carList"
:key="item.id">
<image :style="{width: '84rpx', height: '84rpx'}" src="../.././static/car-brand.png"
:mode="'widthFix'" class="mg-right-10"></image>
<text class="light-black">{{item.name}}</text>
</view>
</view>
</view> -->
<indexAddress :carList="carList" @select="handleCarTypeSelect"></indexAddress>
<!-- 右侧导航开始 -->
<!-- <view class="navgate">
<scroll-view :scroll-y="true" :scroll-into-view="tracingLeftPoint" :scroll-with-animation="true"
style="height: 486rpx;" :show-scrollbar="false">
<view
:class="['navgate-item deep-gray u-f u-f-aic u-f-jcc', acitiveRightMenu === item.id ? 'active' : '' ]"
v-for="item in rightMenu" :key="item.id" @click="handleRightScroll(item.id, item.name)">
{{item.name}}
</view>
</scroll-view>
</view> -->
<!-- 右侧导航结束 -->
</view>
<!-- 输入车牌号开始 -->
<view class="fill-car-brand" v-else>
<view class="fw400 fs30 light-black mg-bot-24">输入车牌自动识别车型</view>
<carNumberInput @numberInputResult="numberInputResult" :defaultStr="defaultNum"></carNumberInput>
<view class="light-gray fs24">蚂蚁车生活不会泄露您的个人信息,仅用于适配商品</view>
<view class="identify-car-brand u-f u-f-aic u-f-jcc" v-show="false">
<text :class="['btn fs28', activeIdentifyBtn ? 'active' : '']" @click="handleIdentifyCar">识别</text>
</view>
<view class="light-gray fs28 fw400" style="text-align: center;">未识别车型</view>
<view class="identify-car-brand u-f u-f-aic u-f-jcc">
<text class="line-btn light-black fs28" @click="handleOtherAddCar">其他加车方式</text>
</view>
</view>
<!-- 输入车牌号结束 -->
<!-- 系统消息通知开始 -->
<!-- <uni-popup :position="'middle'" :mode="''" background-color="transparent" :show="showPopup&&!fatype"
@hidePopup="handleHidePopup"> -->
<uni-popup :position="'middle'" :mode="''" background-color="transparent" :show="false"
@hidePopup="handleHidePopup">
<view class="sys-mes-nofity">
<view class="top"></view>
<image class="carNoImg" src="/static/common/carNoImg.png" mode=""></image>
<view class="u-f u-f-jcc u-f-aic fs30 fw400 main-color mg-bot-18 mg-top-28">输入车牌识别车型</view>
<view class="u-f u-f-jcc u-f-aic fs24 fw400 light-gray mg-bot-46">精准适配商品和服务</view>
<view class="u-f u-f-jcsb mg-lr-100">
<view class="cancel-btn" @click="showPopup = false">取消</view>
<view class="main-color-btn" @click="handleTry">去试试</view>
</view>
</view>
</uni-popup>
<!-- 系统消息通知结束 -->
</view>
</template>
<script>
import commonTitle from '../../components/common-title/common-title.vue'
import uniPopup from "../../components/uni-popup/uni-popup.vue"
import carNumberInput from '../../uni_modules/car-number-input/components/car-number-input/car-number-input'
import indexAddress from '../../uni_modules/t-index-address/components/t-index-address/t-index-address'
export default {
components: {
commonTitle,
uniPopup,
carNumberInput,
indexAddress
},
data() {
return {
showAddCar: true,
showPopup: true,
tracingLeftPoint: "",
acitiveRightMenu: 1,
carList: [],
hotCar: [],
fatype: "",
formData: {}
}
},
computed: {
activeIdentifyBtn() {
// let allFill = this.input.number1 && this.input.number2 && this.input.number3 && this.input.number4 && this
// .input.number5 && this.input.number6 && this.input.number7
// return allFill
}
},
onLoad(opt) {
this.formData = opt.formData ? JSON.parse(decodeURIComponent(opt.formData)) : {}
console.log(opt, 'opt');
this.fatype = opt.type ? opt.type : ""
},
onShow() {
this.getCarBrandList()
this.getPopularVehicles()
},
methods: {
//获取车型列表
async getCarBrandList() {
let res = await this.$http.get('/api/client/vehicle/getBrandList')
console.log(res.data.data, 'res');
let carList = res.data.data
console.log(carList);
this.carList = carList
},
// 打开车牌选择器
carInputClick() {
console.log(this.$refs);
this.$refs.plateNumber.open();
},
//热门品牌
getPopularVehicles() {
this.$http.get('/api/client/vehicle/popularVehicles').then(res => {
this.hotCar = res.data.data
})
},
numberInputResult(e) {
console.log('结果--' + e)
},
handleHidePopup() {
this.showPopup = false;
},
handleRightScroll(id, name) {
// let distance = this.getScrollDistance(id)
// console.log("distance", distance)
// uni.pageScrollTo({
// scrollTop: distance,
// duration: 300
// });
this.acitiveRightMenu = id
// this.tracingLeftPoint = 'scroll' + id
},
getScrollDistance(id) {
var distance = 0;
console.log("getScrollDistance", id);
if (id !== 1) {
for (let i = 0; i < id; i++) {
let length = this.allCity[i].cityList.length
distance += uni.upx2px(38 + 40) + uni.upx2px(length * (35 + 40))
}
}
return distance;
},
handleIdentifyCar() {
uni.showToast({
title: '未识别到该车车型请使用其他方式',
icon: 'none',
duration: 2000
});
},
handleOtherAddCar() {
this.showAddCar = true;
},
handleTry() {
this.handleHidePopup()
this.showAddCar = false;
},
handleCarTypeSelect(item) {
uni.navigateTo({
url: '/pages/car-type-select/car-type-select?data=' + encodeURIComponent(JSON.stringify(
item)) + '&fatype=' + this.fatype+'&formData='+encodeURIComponent(JSON.stringify(this.formData))
})
}
}
}
</script>
<style lang="scss" scoped>
$nav-height: 68rpx;
.add-car {
.add-car-info {
.input-view {
background-color: #ffffff;
border: 1rpx solid #333333;
height: $nav-height;
line-height: $nav-height;
border-radius: 34rpx;
padding: 0 15px;
color: #999999;
margin-bottom: 22rpx;
.search-icon {
width: 30rpx;
height: 30rpx;
// background: url('../../static/common/search.png') no-repeat center center;
background-size: 100%;
}
.nav-bar-input {
height: 100%;
padding: 0 5px;
font-size: 12px;
}
}
.hot-brand {
.hot-brand-list {
.hot-brand-item {
width: calc(20% - 64rpx);
margin-right: 64rpx;
}
}
}
.navgate {
position: fixed;
right: 0rpx;
top: 50%;
transform: translateY(-50%);
width: 42rpx;
z-index: 999;
.navgate-item {
width: 30rpx;
height: 30rpx;
margin-top: 7rpx;
font-weight: 400;
font-size: 18rpx;
&.active {
border-radius: 50%;
color: #ffffff;
background: #FF4502;
}
}
}
}
.fill-car-brand {
.fill-car-box {
.fc-item {
width: calc((100% / 9) - 8rpx);
height: 100rpx;
background-color: #F8F8F8;
margin-right: 8rpx;
border-radius: 8rpx;
&:last-child {
margin-right: 0;
}
&.new-energy {
background: #F1FFF3;
border: 1rpx dashed #00CD22;
}
.circle {
width: 10rpx;
height: 10rpx;
background-color: #333333;
border-radius: 50%;
}
view {
.my-input {
width: 100%;
height: 100%;
background-color: #F8F8F8;
}
}
}
}
.identify-car-brand {
margin-top: 75rpx;
margin-bottom: 58rpx;
.btn {
color: #ffffff;
width: 414rpx;
height: 72rpx;
line-height: 72rpx;
text-align: center;
background-color: #383838;
border-radius: 40rpx;
&.active {
background: linear-gradient(90deg, #FF4502 0%, #FF8903 100%);
}
}
.line-btn {
width: 414rpx;
height: 72rpx;
line-height: 72rpx;
text-align: center;
background-color: #ffffff;
border: 1rpx solid #333333;
border-radius: 40rpx;
}
}
}
}
.sys-mes-nofity {
width: 100%;
height: 615rpx;
background-color: #ffffff;
position: relative;
border-radius: 14rpx;
.top {
border-radius: 14rpx;
height: 88rpx;
background: linear-gradient(180deg, #FFE3D9 0%, #FFFFFF 100%);
}
.carNoImg {
width: 590rpx;
height: 256rpx;
}
}
</style>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<view class="type-num-select mg-lr-24">
<view class="car-brand u-f u-f-jcfs u-f-aic mg-bot-16">
<image :src="carData.logo" class="mg-right-20"></image>
<text>{{carData.name}}</text>
</view>
<view class="tab-list u-f mg-bot-28">
<view :class="['item fs26 light-black', activeTab == 'allCar' ? 'active' : '']"
@click="handleTab('allCar')">全部车型</view>
<view :class="['item fs26 light-black', activeTab == item.year ? 'active' : '']"
v-for="(item,index) in carBrandTab" :key="index" @click="handleTab(item.year)">{{item.year}}</view>
</view>
<view class="tab-content">
<view class="tc-list" v-for="(item,index) in carBrand" :key="index">
<common-title :msg="item.year"></common-title>
<view class="light-black fs26" style="padding-top: 30rpx;padding-bottom:40rpx;" v-for="(ite,ind) in item.children" :key="ite.id"
@click="jumpToCarInfo(ite)">{{ite.name}}</view>
</view>
</view>
</view>
</template>
<script>
import commonTitle from "../.././components/common-title/common-title.vue"
export default {
components: {
commonTitle
},
data() {
return {
activeTab: 'allCar',
filterTabContent: [],
carData: '',
carBrand: [],
carBrandTab: [] ,
vehicleBrandId:'',
fatype:"",
formData:{}
}
},
onLoad(options) {
let data = JSON.parse(decodeURIComponent(options.data))
this.formData = options.formData ? JSON.parse(decodeURIComponent(options.formData)) : {}
console.log(data, 'options')
// console.log(options,'options');
this.carData = data
this.vehicleBrandId = options.vehicleBrandId
this.fatype=options.fatype
this.getCarBrandYearList()
// this.getCarDetails()
},
methods: {
//获取车型年份
getCarBrandYearList() {
console.log(this.carData.id);
this.$http.get('/api/client/vehicle/carBrandInfoList', {
carBrandId: this.carData.id,
year: this.activeTab == 'allCar' ? '' : this.activeTab
}).then(res => {
this.carBrand = res.data.data
})
this.$http.get('/api/client/vehicle/carBrandInfoList', {
carBrandId: this.carData.id,
}).then(res => {
this.carBrandTab = res.data.data
})
},
handleTab(year) {
this.activeTab = year;
this.getCarBrandYearList()
// if (this.activeTab !== 'allCar') {
// console.log("year", year)
// // this.filterTabContent = this.tabContnt.filter(item => item.id == id)
// console.log("this.tabContnt", this.tabContnt)
// } else {
// this.filterTabContent = this.tabContnt
// }
},
jumpToCarInfo(item) {
console.log(item);
let data = {
brandLogo:item.logo,
vehicleBrand:this.carData.vehicleBrand,
vehicleModel:this.carData.name,
vehicleBrandId:this.vehicleBrandId,
vehicleModelId:this.carData.id,
vehicleConfigId:item.id,
vehicleConfig:item.name
}
console.log(data);
console.log(this.fatype,'fatype');
if(!this.fatype){
uni.redirectTo({
url: '/pages/car-info/car-info?data='+ encodeURIComponent(JSON.stringify(data))
})
}else if(this.fatype==99) {
// 首页二手车
uni.navigateTo({
url:'/pages/ershou-car/ershou-car?formData=' + encodeURIComponent(JSON.stringify(this.formData))+'&data='+ encodeURIComponent(JSON.stringify(data))
})
} else if(this.fatype==98) {
// 首页保险救援
uni.navigateTo({
url:'/pages/insurance-rescue/insurance-rescue?formData=' + encodeURIComponent(JSON.stringify(this.formData))+'&data='+ encodeURIComponent(JSON.stringify(data))
})
}
}
},
mounted() {
this.filterTabContent = this.tabContnt
}
}
</script>
<style lang="scss" scoped>
.type-num-select {
margin-bottom: 74rpx;
image {
width: 108rpx;
height: 80rpx;
}
.tab-list {
flex-wrap: wrap;
.item {
text-align: center;
padding: 10rpx 20rpx;
background: #FFFFFF;
border-radius: 8rpx 8rpx 8rpx 8rpx;
border: 1rpx solid #D9D9D9;
margin-right: 10rpx;
margin-bottom: 10rpx;
// &:nth-child(4n) {
// margin-right: 0;
// }
&.active {
color: #FF4502;
border: 1rpx solid #FF4502;
}
}
}
}
</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.
<template>
<view class="mg-lr-24">
<view class="white-bg-wrap">
<view class="ue-user u-f u-f-jcfs u-f-aic mg-top-16">
<image class="avatar mg-right-10" :src="reviewsInfo.avatarUrl"></image>
<view class="user-desc">
<view class="fs26 fw400 light-black mg-bot-8">{{reviewsInfo.nickName}}</view>
<view class="u-f u-f-aic">
<view style="color: #999999;font-size: 24rpx;margin-right: 10rpx;">
{{reviewsInfo.createTime}}
</view>
<image style="width: 30rpx;height: 30rpx;" src="/static/common/star.png"
v-for="i in reviewsInfo.score" :key="i" mode="">
</image>
<view style="color: #F2CB51;font-size: 24rpx;">
{{reviewsInfo.score}}.0分
</view>
</view>
</view>
</view>
<view class="ue-content mg-top-24">
<view>
<view class="light-black ellipsis mg-bot-10 fs24 fw400">{{reviewsInfo.commentContent}}</view>
</view>
<view class="image-list u-f u-f-jcfs u-f-fww mg-bot-14">
<view class="image-item mg-right-12" v-for="(innerItem, idx) in reviewsInfo.commentImageList"
:key="idx">
<image :mode="'widthFix'" style="width: 100%;height: 100%;border-radius: 8rpx;"
:src="innerItem"></image>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
reviewsInfo: {
nickName: '',
avatarUrl: '',
score: '',
commentContent: '',
commentImageList: [],
createTime: ''
}
}
},
onLoad(option) {
this.init(option)
},
methods: {
init(option) {
this.reviewsInfo.nickName = option.nickName
this.reviewsInfo.avatarUrl = option.avatarUrl
this.reviewsInfo.score = option.score
this.reviewsInfo.commentContent = option.commentContent
this.reviewsInfo.commentImageList = JSON.parse(option.commentImageList) || []
this.reviewsInfo.createTime = option.createTime
}
}
}
</script>
<style>
page {
background-color: #F9F9F9;
}
</style>
<style lang="scss" scoped>
.ue-user {
.avatar {
width: 78rpx;
height: 78rpx;
}
}
.ue-content {
.image-list {
.image-item {
width: calc(25% - 12rpx);
&:last-child {
margin-right: 0;
}
}
}
}
</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.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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