放入基础模块
10
App.vue
@@ -10,8 +10,14 @@
|
||||
console.log('App Hide')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
<style>
|
||||
page{
|
||||
background: #F5F5F5;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
<style lang="scss">
|
||||
@import "uview-ui/index.scss";
|
||||
</style>
|
||||
|
||||
137
components/goods-list/goods-list.vue
Normal file
@@ -0,0 +1,137 @@
|
||||
|
||||
<template>
|
||||
<view class="goods--list">
|
||||
<block v-if="list.length > 0">
|
||||
<view class="goods--item" v-for="(item, index) in list" :key="index" @click="goods(item)">
|
||||
<view class="cover">
|
||||
<image class="cover--src" :src="item.cover" mode="aspectFill" />
|
||||
</view>
|
||||
<view class="content">
|
||||
<view class="title">{{item.name}}</view>
|
||||
<view class="content-flex">
|
||||
<view class="price eb" v-if="priceType === 'EB'">
|
||||
{{item.price}}<text>易币</text>
|
||||
</view>
|
||||
<view class="price cny" v-if="priceType === 'CNY'">
|
||||
<text>¥</text>{{item.original_price}}
|
||||
</view>
|
||||
<view class="sales">
|
||||
<slot name="statistics" :value="item">
|
||||
月易量{{item.sales}}
|
||||
</slot>
|
||||
</view>
|
||||
</view>
|
||||
<slot name="footer" :value="item" />
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="goods--null">
|
||||
<view>{{toast}}</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name : 'goodsList',
|
||||
props : {
|
||||
// 数据列表
|
||||
list: {
|
||||
type : Array,
|
||||
default : () => {
|
||||
return new Array
|
||||
}
|
||||
},
|
||||
// 价格类型
|
||||
priceType: {
|
||||
type : String,
|
||||
default : 'EB'
|
||||
},
|
||||
// 列表空提示
|
||||
toast : {
|
||||
type : String,
|
||||
default : '暂无商品数据 -_-!'
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
goods(e){
|
||||
this.$emit('on-goods', e)
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.goods--list{
|
||||
padding: calc(#{$padding} - 10rpx);
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
.goods--item{
|
||||
background: white;
|
||||
box-sizing: border-box;
|
||||
width: calc(50% - 20rpx);
|
||||
margin: 10rpx;
|
||||
border-radius: $radius/2;
|
||||
overflow: hidden;
|
||||
.cover{
|
||||
position: relative;
|
||||
width: 100%;
|
||||
padding-top: 100%;
|
||||
.cover--src{
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
.content{
|
||||
padding: $padding/2;
|
||||
.title{
|
||||
font-size: $title-size-lg;
|
||||
line-height: 40rpx;
|
||||
height: 80rpx;
|
||||
text-align: justify;
|
||||
@extend .ellipsis;
|
||||
}
|
||||
.content-flex{
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding-top: $padding/2;
|
||||
.price{
|
||||
width: 50%;
|
||||
color: $text-price;
|
||||
font-weight: bold;
|
||||
font-size: $title-size;
|
||||
@extend .nowrap;
|
||||
text{
|
||||
font-size: $title-size-sm;
|
||||
font-weight: normal;
|
||||
padding-left: $padding/4;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
}
|
||||
.sales{
|
||||
width: 50%;
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
line-height: 50rpx;
|
||||
text-align: right;
|
||||
@extend .nowrap;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 数据空
|
||||
.goods--null{
|
||||
width: 100%;
|
||||
padding: 20vh 0;
|
||||
text-align: center;
|
||||
font-size: $title-size-m;
|
||||
color: $text-gray;
|
||||
}
|
||||
</style>
|
||||
904
components/tn-datepicker/tn-datepicker.vue
Normal file
@@ -0,0 +1,904 @@
|
||||
<template>
|
||||
<view v-if="isShow" class="picker">
|
||||
<view @click="onCancel" style="position: fixed;width: 100%;height: 100%;left: 0;top: 0;background: rgba(60,60,60,0.5)"></view>
|
||||
<!-- 日期选择器 -->
|
||||
<view v-if="type!='time'" :class="isShow?'myfirst':''" class="picker-modal">
|
||||
<view class="picker-header">
|
||||
<view class="close" @click="onCancel" style="font-size: 22px;width: 50upx;"></view>
|
||||
<view style="flex: 1;font-size: 16px; text-align: center;color: rgb(102,101,91);">选择日期</view>
|
||||
<view style="width: 50upx;"></view>
|
||||
</view>
|
||||
<view class="picker-week-header">
|
||||
<view v-for="(item, index) in weekArr" :key="index">{{item}}</view>
|
||||
</view>
|
||||
<scroll-view class="picker-modal-body" @scroll="scrollPage" scroll-y="true" id="target">
|
||||
<view class="picker-modal-header-title" style="position: fixed;height: 93upx;line-height: 93upx;margin-top:-1px;right: 1px;background: #fff;z-index: 999;">{{dateTitleArr[scrollIndex]}}</view>
|
||||
|
||||
<view class="picker-calendar-box" :id="'calendar_module'+calendar_Index" v-for="(calendar,calendar_Index) in calendars"
|
||||
:key="calendar_Index">
|
||||
<view class="picker-modal-header-title" :class="" style="color:rgb(77,77,77); font-size: 16px; width: 100%;height: 90upx;line-height: 90upx;text-align: center;">{{dateTitleArr[calendar_Index]}}</view>
|
||||
<view class="picker-calendar">
|
||||
<view class="picker-calendar-view" v-for="(date,dateIndex) in calendar" :key="dateIndex">
|
||||
<view v-show="!date.isOtherMonth || calendar_Index == 0" @click="onSelectDate(date)">
|
||||
<!-- 背景样式 -->
|
||||
<view v-show="date.bgStyle.type" :class="'picker-calendar-view-'+date.bgStyle.type" :style="{background: date.bgStyle.background}"></view>
|
||||
<!-- 正常和选中样式 -->
|
||||
<view class="picker-calendar-view-item" :style="{opacity: date.statusStyle.opacity, color: date.statusStyle.color, background: date.statusStyle.background}">
|
||||
<text>{{date.title}}</text>
|
||||
</view>
|
||||
<!-- 小圆点样式 -->
|
||||
<view class="picker-calendar-view-dot" :style="{opacity: date.dotStyle.opacity, background: date.dotStyle.background}"></view>
|
||||
<!-- 信息样式 -->
|
||||
<view v-show="date.tips" class="picker-calendar-view-tips">{{date.tips}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="picker-modal-footer" v-show="checkeds.length==2" style="position: fixed;bottom: 0;z-index: 1002;">
|
||||
<view style="position: absolute;width: 100%;height: 100%;background: #fff;z-index: -1;left:0;top:1px;"></view>
|
||||
<view class="picker-modal-footer-btnOK" :style="{'background':color}" @click="onConfirm">完成</view>
|
||||
</view>
|
||||
<view class="picker-modal-footer" v-show="checkeds.length==2"></view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/**
|
||||
* 工具函数库
|
||||
*/
|
||||
const DateTools = {
|
||||
/**
|
||||
* 获取公历节日
|
||||
* @param date Date对象
|
||||
*/
|
||||
getHoliday(date) {
|
||||
let holidays = {
|
||||
'0101': '元旦',
|
||||
'0214': '情人',
|
||||
'0308': '妇女',
|
||||
'0312': '植树',
|
||||
'0401': '愚人',
|
||||
'0501': '劳动',
|
||||
'0504': '青年',
|
||||
'0601': '儿童',
|
||||
'0701': '建党',
|
||||
'0801': '建军',
|
||||
'0903': '抗日',
|
||||
'0910': '教师',
|
||||
'1001': '国庆',
|
||||
'1031': '万圣',
|
||||
'1224': '平安',
|
||||
'1225': '圣诞'
|
||||
};
|
||||
let value = this.format(date, 'mmdd');
|
||||
if (holidays[value]) return holidays[value];
|
||||
return false;
|
||||
},
|
||||
/**
|
||||
* 解析标准日期格式
|
||||
* @param s 日期字符串
|
||||
* @return 返回Date对象
|
||||
*/
|
||||
parse: s => new Date(s.replace(/(年|月|-)/g, '/').replace(/(日)/g, '')),
|
||||
/**
|
||||
* 比较日期是否为同一天
|
||||
* @param a Date对象
|
||||
* @param b Date对象
|
||||
* @return Boolean
|
||||
*/
|
||||
isSameDay: (a, b) => a.getMonth() == b.getMonth() && a.getFullYear() == b.getFullYear() && a.getDate() == b.getDate(),
|
||||
/**
|
||||
* 格式化Date对象
|
||||
* @param d 日期对象
|
||||
* @param f 格式字符串
|
||||
* @return 返回格式化后的字符串
|
||||
*/
|
||||
format(d, f) {
|
||||
var o = {
|
||||
"m+": d.getMonth() + 1,
|
||||
"d+": d.getDate(),
|
||||
"h+": d.getHours(),
|
||||
"i+": d.getMinutes(),
|
||||
"s+": d.getSeconds(),
|
||||
"q+": Math.floor((d.getMonth() + 3) / 3),
|
||||
};
|
||||
if (/(y+)/.test(f))
|
||||
f = f.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length));
|
||||
for (var k in o)
|
||||
if (new RegExp("(" + k + ")").test(f))
|
||||
f = f.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
||||
return f;
|
||||
},
|
||||
/**
|
||||
* 用于format格式化后的反解析
|
||||
* @param s 日期字符串
|
||||
* @param f 格式字符串
|
||||
* @return 返回Date对象
|
||||
*/
|
||||
inverse(s, f) {
|
||||
var o = {
|
||||
"y": '',
|
||||
"m": '',
|
||||
"d": '',
|
||||
"h": '',
|
||||
"i": '',
|
||||
"s": '',
|
||||
};
|
||||
let d = new Date();
|
||||
if (s.length != f.length) return d;
|
||||
for (let i in f)
|
||||
if (o[f[i]] != undefined) o[f[i]] += s[i];
|
||||
if (o.y) d.setFullYear(o.y.length < 4 ? (d.getFullYear() + '').substr(0, 4 - o.y.length) + o.y : o.y);
|
||||
o.m && d.setMonth(o.m - 1, 1);
|
||||
o.d && d.setDate(o.d - 0);
|
||||
o.h && d.setHours(o.h - 0);
|
||||
o.i && d.setMinutes(o.i - 0);
|
||||
o.s && d.setSeconds(o.s - 0);
|
||||
return d;
|
||||
},
|
||||
/**
|
||||
* 获取日历数组(42天)
|
||||
* @param date 日期对象或日期字符串
|
||||
* @param proc 处理日历(和forEach类似),传递一个数组中的item
|
||||
* @return Array
|
||||
*/
|
||||
getCalendar(date, proc,beforeDateDisable) {
|
||||
let it = new Date(date),
|
||||
calendars = [];
|
||||
let nowDate = new Date(new Date(new Date().toLocaleDateString()).getTime());
|
||||
it.setDate(1);
|
||||
if(it.getDay()>0){
|
||||
it.setDate(it.getDate() - (it.getDay() == 0 ? 7 : it.getDay())); //偏移量
|
||||
}
|
||||
for (let i = 0; i < 42; i++) {
|
||||
let tmp = {
|
||||
dateObj: new Date(it),
|
||||
title: it.getDate(),
|
||||
isOtherMonth: it.getMonth() < date.getMonth() || it.getMonth() > date.getMonth()
|
||||
};
|
||||
if(beforeDateDisable){
|
||||
tmp.isBeforeNowDay = it<nowDate;
|
||||
}
|
||||
if (tmp.title == 1 && calendars.length > 7) {
|
||||
break;
|
||||
}
|
||||
calendars.push(Object.assign(tmp, proc ? proc(tmp) : {}));
|
||||
|
||||
it.setDate(it.getDate() + 1);
|
||||
}
|
||||
return calendars;
|
||||
},
|
||||
/**
|
||||
* 获取日期到指定的月份1号(不改变原来的date对象)
|
||||
* @param d Date对象
|
||||
* @param v 指定的月份
|
||||
* @return Date对象
|
||||
*/
|
||||
getDateToMonth(d, v) {
|
||||
let n = new Date(d);
|
||||
n.setMonth(v, 1);
|
||||
return n;
|
||||
},
|
||||
/**
|
||||
* 把时间数组转为时间字符串
|
||||
* @param t Array[时,分,秒]
|
||||
* @param showSecinds 是否显示秒
|
||||
* @return 字符串 时:分[:秒]
|
||||
*/
|
||||
formatTimeArray(t, s) {
|
||||
let r = [...t];
|
||||
if (!s) r.length = 2;
|
||||
r.forEach((v, k) => r[k] = ('0' + v).slice(-2));
|
||||
return r.join(':');
|
||||
}
|
||||
};
|
||||
|
||||
export default {
|
||||
props: {
|
||||
//颜色
|
||||
color: {
|
||||
type: String,
|
||||
default: 'rgb(230,86,86)'
|
||||
},
|
||||
//显示未来几个月
|
||||
beforeDateDisable: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//显示未来几个月
|
||||
monthNum: {
|
||||
type: Number,
|
||||
default: 6
|
||||
},
|
||||
//是否显示秒 针对type为datetime或time时生效
|
||||
showSeconds: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//初始的值
|
||||
value: [String, Array],
|
||||
//类型date time datetime range rangetime
|
||||
type: {
|
||||
type: String,
|
||||
default: 'range'
|
||||
},
|
||||
//是否显示
|
||||
show: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//初始格式
|
||||
format: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
//显示公历节日
|
||||
showHoliday: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
//显示提示
|
||||
showTips: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//开始文案 针对type为范围选择时生效
|
||||
beginText: {
|
||||
type: String,
|
||||
default: '开始'
|
||||
},
|
||||
//结束文案 针对type为范围选择时生效
|
||||
endText: {
|
||||
type: String,
|
||||
default: '结束'
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
isShow: false, //是否显示
|
||||
isMultiSelect: false, //是否为多选
|
||||
isContainTime: false, //是否包含时间
|
||||
date: {}, //当前日期对象
|
||||
weekArr: ["日", "一", "二", "三", "四", "五", "六"],
|
||||
scrollTopArr: [],
|
||||
scrollIndex: 0,
|
||||
dateTitleArr: [],
|
||||
title: '初始化', //标题
|
||||
calendars: [], //日历数组
|
||||
calendarIndex: 1, //当前日历索引
|
||||
checkeds: [], //选中的日期对象集合
|
||||
showTimePicker: false, //是否显示时间选择器
|
||||
timeValue: [0, 0, 0], //时间选择器的值
|
||||
timeType: 'begin', //当前时间选择的类型
|
||||
beginTime: [0, 0, 0], //当前所选的开始时间值
|
||||
endTime: [0, 0, 0], //当前所选的结束时间值
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//监听滚动条
|
||||
scrollPage(e) {
|
||||
let scrollIndex = 0;
|
||||
if (this.scrollTopArr.length >= 6) {
|
||||
this.scrollTopArr.some(function(item, index) {
|
||||
if (e.detail.scrollTop >= item) {
|
||||
scrollIndex = index;
|
||||
}
|
||||
})
|
||||
}
|
||||
this.scrollIndex = scrollIndex;
|
||||
},
|
||||
//设置值
|
||||
setValue(value) {
|
||||
this.date = new Date();
|
||||
this.checkeds = [];
|
||||
this.isMultiSelect = this.type.indexOf('range') >= 0;
|
||||
this.isContainTime = this.type.indexOf('time') >= 0;
|
||||
//将字符串解析为Date对象
|
||||
let parseDateStr = (str) => (this.format ? DateTools.inverse(str, this.format) : DateTools.parse(str));
|
||||
if (value) {
|
||||
if (this.isMultiSelect) {
|
||||
Array.isArray(value) && value.forEach((dateStr, index) => {
|
||||
let date = parseDateStr(dateStr);
|
||||
let time = [date.getHours(), date.getMinutes(), date.getSeconds()];
|
||||
if (index == 0) this.beginTime = time;
|
||||
else this.endTime = time;
|
||||
this.checkeds.push(date);
|
||||
});
|
||||
} else {
|
||||
if (this.type == 'time') {
|
||||
let date = parseDateStr('2019/1/1 ' + value);
|
||||
this.beginTime = [date.getHours(), date.getMinutes(), date.getSeconds()];
|
||||
this.onShowTimePicker('begin');
|
||||
} else {
|
||||
this.checkeds.push(parseDateStr(value));
|
||||
if (this.isContainTime) this.beginTime = [
|
||||
this.checkeds[0].getHours(),
|
||||
this.checkeds[0].getMinutes(),
|
||||
this.checkeds[0].getSeconds()
|
||||
];
|
||||
}
|
||||
}
|
||||
if (this.checkeds.length) this.date = new Date(this.checkeds[0]);
|
||||
} else {
|
||||
if (this.isContainTime) {
|
||||
this.beginTime = [this.date.getHours(), this.date.getMinutes(), this.date.getSeconds()];
|
||||
if (this.isMultiSelect) this.endTime = [...this.beginTime];
|
||||
}
|
||||
this.checkeds.push(new Date(this.date));
|
||||
}
|
||||
if (this.type != 'time') this.refreshCalendars(true);
|
||||
else this.onShowTimePicker('begin');
|
||||
},
|
||||
//设置时间选择器的显示状态
|
||||
onShowTimePicker(type) {
|
||||
this.showTimePicker = true;
|
||||
this.timeType = type;
|
||||
this.timeValue = type == 'begin' ? [...this.beginTime] : [...this.endTime];
|
||||
},
|
||||
//处理日历
|
||||
procCalendar(item) {
|
||||
//定义初始样式
|
||||
item.statusStyle = {
|
||||
opacity: 1,
|
||||
color: item.isOtherMonth ? '#ddd' : 'rgb(108,108,108)',
|
||||
background: 'transparent'
|
||||
};
|
||||
if(item.isBeforeNowDay || item.isOtherMonth){
|
||||
item.statusStyle.color = '#ddd';
|
||||
item.isGray = true;
|
||||
}
|
||||
item.bgStyle = {
|
||||
type: '',
|
||||
background: 'transparent'
|
||||
};
|
||||
item.dotStyle = {
|
||||
opacity: 1,
|
||||
background: 'transparent'
|
||||
};
|
||||
item.tips = "";
|
||||
//标记今天的日期
|
||||
if (DateTools.isSameDay(new Date(), item.dateObj)) {
|
||||
item.statusStyle.color = this.color;
|
||||
if (item.isOtherMonth) item.statusStyle.opacity = 0.3;
|
||||
}
|
||||
//标记选中项
|
||||
this.checkeds.forEach(date => {
|
||||
if (DateTools.isSameDay(date, item.dateObj)) {
|
||||
item.statusStyle.background = this.color;
|
||||
item.statusStyle.color = '#fff';
|
||||
item.statusStyle.opacity = 1;
|
||||
if (this.isMultiSelect && this.showTips) item.tips = this.beginText;
|
||||
}
|
||||
});
|
||||
//节假日或今日的日期标点
|
||||
if (item.statusStyle.background != this.color) {
|
||||
let holiday = this.showHoliday ? DateTools.getHoliday(item.dateObj) : false;
|
||||
if (holiday || DateTools.isSameDay(new Date(), item.dateObj)) {
|
||||
item.title = holiday || item.title;
|
||||
item.dotStyle.background = this.color;
|
||||
if (item.isOtherMonth) item.dotStyle.opacity = 0.2;
|
||||
}
|
||||
} else {
|
||||
item.title = item.dateObj.getDate();
|
||||
}
|
||||
//有两个日期
|
||||
if (this.checkeds.length == 2) {
|
||||
if (DateTools.isSameDay(this.checkeds[0], item.dateObj)) { //开始日期
|
||||
item.bgStyle.type = 'bgbegin';
|
||||
}
|
||||
if (DateTools.isSameDay(this.checkeds[1], item.dateObj)) { //结束日期
|
||||
if (this.isMultiSelect && this.showTips) item.tips = item.bgStyle.type ? this.beginText + ' / ' + this.endText :
|
||||
this.endText;
|
||||
if (!item.bgStyle.type) { //开始日期不等于结束日期
|
||||
item.bgStyle.type = 'bgend';
|
||||
} else {
|
||||
item.bgStyle.type = '';
|
||||
}
|
||||
}
|
||||
if (!item.bgStyle.type && (+item.dateObj > +this.checkeds[0] && +item.dateObj < +this.checkeds[1])) { //中间的日期
|
||||
item.bgStyle.type = 'bg';
|
||||
item.statusStyle.color = this.color;
|
||||
}
|
||||
if (item.bgStyle.type) {
|
||||
item.bgStyle.background = this.color;
|
||||
item.dotStyle.opacity = 1;
|
||||
item.statusStyle.opacity = 1;
|
||||
}
|
||||
}
|
||||
},
|
||||
//刷新日历
|
||||
refreshCalendars(refresh = false) {
|
||||
let date = new Date(this.date);
|
||||
let before = DateTools.getDateToMonth(date, date.getMonth() - 1);
|
||||
let after = DateTools.getDateToMonth(date, date.getMonth() + 1);
|
||||
|
||||
let _this = this;
|
||||
let mArr = [];
|
||||
for (let m_num = 0; m_num < this.monthNum; m_num++) {
|
||||
let new_date = DateTools.getDateToMonth(date, date.getMonth() + m_num);
|
||||
_this.dateTitleArr.push(DateTools.format(new_date, 'yyyy年mm月'))
|
||||
mArr.push(new_date)
|
||||
}
|
||||
mArr.some(function(item, index) {
|
||||
_this.calendars.splice(index, 1, DateTools.getCalendar(item, _this.procCalendar,_this.beforeDateDisable));
|
||||
})
|
||||
this.title = DateTools.format(this.date, 'yyyy年mm月');
|
||||
|
||||
setTimeout(function(){
|
||||
let domArr = [];
|
||||
let h = 0;
|
||||
const query = uni.createSelectorQuery().in(_this);
|
||||
for (let m_domNum = 0; m_domNum < _this.monthNum; m_domNum++) {
|
||||
let className = '#calendar_module' + m_domNum;
|
||||
let view = uni.createSelectorQuery().select(className);
|
||||
//console.log(view);
|
||||
view.fields({
|
||||
size: true, // 是否返回节点尺寸
|
||||
}, data => { // data是方法的回调函数,参数是指定的相关节点信息。
|
||||
// console.log(data);
|
||||
let model = {};
|
||||
model.top = h; // 顶部高度
|
||||
h += data.height;
|
||||
model.bottom = h; // 底部高度
|
||||
domArr.push(model.top);
|
||||
}).exec();
|
||||
}
|
||||
_this.scrollTopArr = domArr;
|
||||
},100)
|
||||
},
|
||||
//选中日期
|
||||
onSelectDate(date) {
|
||||
if(date.isGray){
|
||||
return;
|
||||
}
|
||||
if (~this.type.indexOf('range') && this.checkeds.length == 2) this.checkeds = [];
|
||||
else if (!(~this.type.indexOf('range')) && this.checkeds.length) this.checkeds = [];
|
||||
this.checkeds.push(new Date(date.dateObj));
|
||||
this.checkeds.sort((a, b) => a - b); //从小到大排序
|
||||
this.calendars.forEach(calendar => {
|
||||
calendar.forEach(this.procCalendar); //重新处理
|
||||
});
|
||||
},
|
||||
//时间选择取消
|
||||
onCancelTime() {
|
||||
this.showTimePicker = false;
|
||||
this.type == 'time' && this.onCancel();
|
||||
},
|
||||
//时间选择确定
|
||||
onConfirmTime() {
|
||||
if (this.timeType == 'begin') this.beginTime = this.timeValue;
|
||||
else this.endTime = this.timeValue;
|
||||
this.showTimePicker = false;
|
||||
this.type == 'time' && this.onConfirm();
|
||||
},
|
||||
//取消
|
||||
onCancel() {
|
||||
this.$emit('cancel', false);
|
||||
},
|
||||
//确定
|
||||
onConfirm() {
|
||||
let result = {
|
||||
value: null,
|
||||
date: null
|
||||
};
|
||||
//定义默认格式
|
||||
let defaultFormat = {
|
||||
'date': 'yyyy/mm/dd',
|
||||
'time': 'hh:ii' + (this.showSeconds ? ':ss' : ''),
|
||||
'datetime': ''
|
||||
};
|
||||
defaultFormat['datetime'] = defaultFormat.date + ' ' + defaultFormat.time;
|
||||
let fillTime = (date, timeArr) => {
|
||||
date.setHours(timeArr[0], timeArr[1]);
|
||||
if (this.showSeconds) date.setSeconds(timeArr[2]);
|
||||
};
|
||||
if (this.type == 'time') {
|
||||
let date = new Date();
|
||||
fillTime(date, this.beginTime);
|
||||
result.value = DateTools.format(date, this.format ? this.format : defaultFormat.time);
|
||||
result.date = date;
|
||||
} else {
|
||||
if (this.isMultiSelect) {
|
||||
let values = [],
|
||||
dates = [];
|
||||
if (this.checkeds.length < 2) return uni.showToast({
|
||||
icon: 'none',
|
||||
title: '请选择两个日期'
|
||||
});
|
||||
this.checkeds.forEach((date, index) => {
|
||||
let newDate = new Date(date);
|
||||
if (this.isContainTime) {
|
||||
let time = [this.beginTime, this.endTime];
|
||||
fillTime(newDate, time[index]);
|
||||
}
|
||||
values.push(DateTools.format(newDate, this.format ? this.format : defaultFormat[this.isContainTime ?
|
||||
'datetime' : 'date']));
|
||||
dates.push(newDate);
|
||||
});
|
||||
result.value = values;
|
||||
result.date = dates;
|
||||
} else {
|
||||
let newDate = new Date(this.checkeds[0]);
|
||||
if (this.isContainTime) {
|
||||
newDate.setHours(this.beginTime[0], this.beginTime[1]);
|
||||
if (this.showSeconds) newDate.setSeconds(this.beginTime[2]);
|
||||
}
|
||||
result.value = DateTools.format(newDate, this.format ? this.format : defaultFormat[this.isContainTime ?
|
||||
'datetime' : 'date']);
|
||||
result.date = newDate;
|
||||
}
|
||||
}
|
||||
this.$emit('confirm', result);
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
BeginTitle() {
|
||||
let value = '未选择';
|
||||
if (this.checkeds.length) value = DateTools.format(this.checkeds[0], 'yy/mm/dd');
|
||||
return value;
|
||||
},
|
||||
EndTitle() {
|
||||
let value = '未选择';
|
||||
if (this.checkeds.length == 2) value = DateTools.format(this.checkeds[1], 'yy/mm/dd');
|
||||
return value;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
show(newValue, oldValue) {
|
||||
newValue && this.setValue(this.value);
|
||||
this.isShow = newValue;
|
||||
},
|
||||
value(newValue, oldValue) {
|
||||
setTimeout(() => {
|
||||
this.setValue(newValue);
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.close {
|
||||
position: relative;
|
||||
width: 35upx;
|
||||
height: 35upx;
|
||||
}
|
||||
|
||||
.close::before,
|
||||
.close::after {
|
||||
position: absolute;
|
||||
content: ' ';
|
||||
background-color: rgb(101, 100, 91);
|
||||
left: 20upx;
|
||||
width: 1px;
|
||||
height: 35upx;
|
||||
}
|
||||
|
||||
.close::before {
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
.close::after {
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
|
||||
|
||||
@keyframes myfirst
|
||||
{
|
||||
0% {top: 100vh;}
|
||||
100% {top: 30vh;}
|
||||
}
|
||||
|
||||
@-moz-keyframes myfirst /* Firefox */
|
||||
{
|
||||
0% {top: 100vh;}
|
||||
100% {top: 30vh;}
|
||||
}
|
||||
|
||||
@-webkit-keyframes myfirst /* Safari 和 Chrome */
|
||||
{
|
||||
0% {top: 100vh;}
|
||||
100% {top: 30vh;}
|
||||
}
|
||||
|
||||
@-o-keyframes myfirst /* Opera */
|
||||
{
|
||||
0% {top: 100vh;}
|
||||
100% {top: 30vh;}
|
||||
}
|
||||
|
||||
|
||||
|
||||
$z-index: 100;
|
||||
$cell-spacing: 20upx;
|
||||
$calendar-size: 630upx;
|
||||
$calendar-item-size: 100upx;
|
||||
|
||||
.picker {
|
||||
position: fixed;
|
||||
z-index: $z-index;
|
||||
background: rgba(60, 60, 60, 0);
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size: 28upx;
|
||||
|
||||
&-header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
padding: 20upx 30upx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
&-week-header {
|
||||
font-size: 16px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
border-bottom: 2px solid rgb(244, 244, 244);
|
||||
padding: 10px 20px;
|
||||
color: rgb(136, 136, 136);
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
&-week-header>view:first-child {
|
||||
color: rgb(214, 142, 135);
|
||||
}
|
||||
|
||||
&-week-header>view:last-child {
|
||||
color: rgb(214, 142, 135);
|
||||
}
|
||||
|
||||
&-btn {
|
||||
padding: $cell-spacing*0.5 $cell-spacing;
|
||||
border-radius: 12upx;
|
||||
color: #666;
|
||||
|
||||
&-active {
|
||||
background: rgba(0, 0, 0, .1);
|
||||
}
|
||||
}
|
||||
|
||||
&-display {
|
||||
color: #666;
|
||||
|
||||
&-text {
|
||||
color: #000;
|
||||
margin: 0 $cell-spacing*0.5;
|
||||
}
|
||||
|
||||
&-link {
|
||||
display: inline-block;
|
||||
|
||||
&-active {
|
||||
background: rgba(0, 0, 0, .1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-time {
|
||||
width: 100%; //$calendar-size - 80upx !important;
|
||||
left: ((750upx - $calendar-size) / 2 + 40upx) !important;
|
||||
}
|
||||
|
||||
&-modal {
|
||||
background: #fff;
|
||||
box-sizing: border-box;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0; //(750upx - $calendar-size) / 2;
|
||||
width: 100%; //$calendar-size;
|
||||
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.1);
|
||||
border-radius: 12upx;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
height: 70vh;
|
||||
|
||||
|
||||
animation: myfirst 0.5s;
|
||||
-moz-animation: myfirst 0.5s; /* Firefox */
|
||||
-webkit-animation: myfirst 0.5s; /* Safari 和 Chrome */
|
||||
-o-animation: myfirst 0.5s; /* Opera */
|
||||
|
||||
|
||||
&-header {
|
||||
text-align: center;
|
||||
line-height: 80upx;
|
||||
font-size: 32upx;
|
||||
|
||||
&-title {
|
||||
display: inline-block;
|
||||
width: 40%;
|
||||
color: rgb(77, 77, 77);
|
||||
font-size: 16px;
|
||||
width: 100%;
|
||||
height: 90upx;
|
||||
line-height: 90upx;
|
||||
text-align: center;
|
||||
border-bottom: 1px solid rgb(244, 244, 244);
|
||||
}
|
||||
|
||||
.picker-icon {
|
||||
display: inline-block;
|
||||
line-height: 50upx;
|
||||
width: 50upx;
|
||||
height: 50upx;
|
||||
border-radius: 50upx;
|
||||
text-align: center;
|
||||
margin: 10upx;
|
||||
background: #fff;
|
||||
font-size: 36upx;
|
||||
|
||||
&-active {
|
||||
background: rgba(0, 0, 0, .1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-body {
|
||||
width: 100%; //$calendar-size !important;
|
||||
position: relative;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
&-time {
|
||||
width: 100%;
|
||||
height: 180upx;
|
||||
text-align: center;
|
||||
line-height: 60upx;
|
||||
}
|
||||
|
||||
&-footer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: $cell-spacing;
|
||||
height: 130upx;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
border-top: 1px solid rgb(244, 244, 244);
|
||||
|
||||
&-btnOK {
|
||||
width: calc(100% - 100upx);
|
||||
height: 100%;
|
||||
margin: 0 auto;
|
||||
border-radius: 6upx;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 16px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
&-info {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
&-btn {
|
||||
flex-shrink: 0;
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-calendar {
|
||||
width: 100%;
|
||||
height: calc(100% - 90upx);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
flex-direction: row;
|
||||
|
||||
&-box {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
&-view:nth-child(7n){
|
||||
width: 14.2%;
|
||||
}
|
||||
&-view {
|
||||
position: relative;
|
||||
width: 14.3%; //$calendar-item-size;
|
||||
height: $calendar-item-size;
|
||||
text-align: center;
|
||||
|
||||
&-bgbegin,
|
||||
&-bg,
|
||||
&-bgend,
|
||||
&-item,
|
||||
&-dot,
|
||||
&-tips {
|
||||
position: absolute;
|
||||
transition: .2s;
|
||||
}
|
||||
|
||||
&-bgbegin,
|
||||
&-bg,
|
||||
&-bgend {
|
||||
opacity: .15;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
&-bg {
|
||||
left: 0;
|
||||
top: 0%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-bgbegin {
|
||||
border-radius: $calendar-item-size 0 0 $calendar-item-size;
|
||||
top: 0%;
|
||||
left: 0%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-bgend {
|
||||
border-radius: 0 $calendar-item-size $calendar-item-size 0;
|
||||
top: 0%;
|
||||
left: 0%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-item {
|
||||
left: 0%;
|
||||
top: 0%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 5px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
&-dot {
|
||||
right: 10%;
|
||||
top: 10%;
|
||||
width: 12upx;
|
||||
height: 12upx;
|
||||
border-radius: 12upx;
|
||||
}
|
||||
|
||||
&-tips {
|
||||
bottom: 100%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
background: #4E4B46;
|
||||
color: #fff;
|
||||
border-radius: 12upx;
|
||||
padding: 10upx 20upx;
|
||||
font-size: 24upx;
|
||||
width: max-content;
|
||||
margin-bottom: 5px;
|
||||
pointer-events: none;
|
||||
z-index: 1000;
|
||||
|
||||
&:after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-style: solid;
|
||||
border-width: 5px 5px 0 5px;
|
||||
border-color: #4E4B46 transparent transparent transparent;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
94
pages.json
@@ -1,24 +1,102 @@
|
||||
{
|
||||
"pages": [{
|
||||
"path": "pages/index/index"
|
||||
"path": "pages/index/index",
|
||||
"name": "Index",
|
||||
"style": {
|
||||
"navigationBarTitleText":"发现能量"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/found/index"
|
||||
"path": "pages/found/index",
|
||||
"name": "Found",
|
||||
"style": {
|
||||
"navigationBarTitleText":"发现更多"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/user/index"
|
||||
"path": "pages/user/index",
|
||||
"name": "User",
|
||||
"style": {
|
||||
"navigationBarTitleText":"节点中心"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/instrument/basics",
|
||||
"name": "instrumentBasics",
|
||||
"style": {
|
||||
"navigationBarTitleText":"企业基础信息"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/goods/management",
|
||||
"name": "goodsManagement",
|
||||
"style": {
|
||||
"navigationBarTitleText":"商品权证管理"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/goods/addClassify",
|
||||
"name": "goodsaddClassify",
|
||||
"style": {
|
||||
"navigationBarTitleText":"发布商品类目"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/goods/add",
|
||||
"name": "goodsAdd",
|
||||
"style": {
|
||||
"navigationBarTitleText":"商品权证创建"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/goods/goodsAuth",
|
||||
"name": "goodsAddAuth",
|
||||
"style": {
|
||||
"navigationBarTitleText":"商品权证认证"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/coupons/management",
|
||||
"name": "couponsManagement",
|
||||
"style": {
|
||||
"navigationBarTitleText":"创建优惠券"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/coupons/add",
|
||||
"name": "couponsAdd",
|
||||
"style": {
|
||||
"navigationBarTitleText":"创建优惠券"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/coupons/magDetails",
|
||||
"name": "couponsDetails",
|
||||
"style": {
|
||||
"navigationBarTitleText":"优惠券管理"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/coupons/selectGoods",
|
||||
"name": "couponsSelectGoods",
|
||||
"style": {
|
||||
"navigationBarTitleText":"关联产品"
|
||||
}
|
||||
}],
|
||||
"globalStyle": {
|
||||
"navigationStyle": "custom",
|
||||
"backgroundColor": "#F8F8F8"
|
||||
"backgroundColor": "#F5F5F5"
|
||||
},
|
||||
"tabBar": {
|
||||
"tabBar": {
|
||||
"borderStyle": "white",
|
||||
"backgroundColor": "#FFFFFF",
|
||||
"selectedColor" : "#774ffd",
|
||||
"iconWidth":"26px",
|
||||
"spacing": "0",
|
||||
"height":"60px",
|
||||
"list": [{
|
||||
"text": "发现能量",
|
||||
"text": "发现能量",
|
||||
"iconPath":"static/tabBar/tabBar_icon_00.png",
|
||||
"selectedIconPath":"static/tabBar/tabBar_show_00.png",
|
||||
"pagePath": "pages/index/index"
|
||||
}, {
|
||||
"text": "发现更多",
|
||||
"text": "发现更多",
|
||||
"iconPath":"static/tabBar/tabBar_icon_01.png",
|
||||
"selectedIconPath":"static/tabBar/tabBar_show_01.png",
|
||||
"pagePath": "pages/found/index"
|
||||
}, {
|
||||
"text": "节点中心",
|
||||
"text": "节点中心",
|
||||
"iconPath":"static/tabBar/tabBar_icon_02.png",
|
||||
"selectedIconPath":"static/tabBar/tabBar_show_02.png",
|
||||
"pagePath": "pages/user/index"
|
||||
}]
|
||||
},
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
优惠券
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
@@ -1,549 +1,17 @@
|
||||
<template>
|
||||
<view class="crystal">
|
||||
<!-- 公共提示弹出 start -->
|
||||
<order-tips title="温馨提示" content="恭喜您,签到成功" :tipsState="sign.signShow" @tipseject="signject" />
|
||||
<!-- 公共提示弹出 end -->
|
||||
|
||||
<!-- 公共提示弹出 start -->
|
||||
<order-tips :title="tips.tipsTitle" :content="tips.tipsContent" :tipsState="tips.tipsState" @tipseject="tipseject" />
|
||||
<!-- 公共提示弹出 end -->
|
||||
|
||||
<!-- 账户余额 -->
|
||||
<view class="total">
|
||||
<view class="item ellipsis"><image src="@/static/icons/gemstone-icon.png"/>原石 {{ account.coin }}</view>
|
||||
<view class="item ellipsis"><image src="@/static/icons/crystal-icon.png"/>水晶 {{ account.crystal }}</view>
|
||||
</view>
|
||||
<!-- 矿石 -->
|
||||
<view class="ore">
|
||||
<image src="/static/img/crystal-ore.png" mode="widthFix" />
|
||||
<view class="ore-lists">
|
||||
<view class="oct-float ore-item" v-for="(item, index) in crystalArr" :key="index" @click="ledCrystal(index)">
|
||||
<block v-if="item.amount !== null">
|
||||
<image src="/static/img/crystal-ore-icon.png" mode="widthFix" class="icon" />
|
||||
<view class="text">水晶{{ item.amount || '-'}}</view>
|
||||
</block>
|
||||
</view>
|
||||
<navigator url="../index/index" open-type="switchTab" hover-class="none" class="oct-float ore-item-nav">
|
||||
<image src="/static/img/gemstone-ore-icon.png" mode="widthFix" class="icon" />
|
||||
<view class="text">购物<uni-icons type="arrowright" color="#FFFFFF" size="14"></uni-icons></view>
|
||||
</navigator>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 任务分类 -->
|
||||
<scroll-view class="task-block" scroll-x="true">
|
||||
<!-- url="../index/index" open-type="switchTab" -->
|
||||
<view class="item" v-for="(item, index) in categoryArr" :key="index" @click="JumpUrl(item.url, item.title)">
|
||||
<view class="text">{{ item.remark }}</view>
|
||||
<view class="icon">
|
||||
<image :src="item.cover" />
|
||||
</view>
|
||||
<view class="title">{{ item.title }}</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
<!-- 内容 -->
|
||||
<view class="content">
|
||||
<!-- 签到 -->
|
||||
<view class="signCont">
|
||||
<view class="content-title">
|
||||
<view class="content-title-text">
|
||||
每日签到
|
||||
<view class="tips">
|
||||
累计天数越多。水晶奖励越多
|
||||
</view>
|
||||
</view>
|
||||
<view class="content-titl-btn" v-if="sign.signCan" @click="signClick">
|
||||
立即签到
|
||||
</view>
|
||||
</view>
|
||||
<view class="sign">
|
||||
<view class="sign-list">
|
||||
<view class="item" v-for="(item, index) in sign.signArr" :key="index">
|
||||
<view class="item-icon item-done" v-if="item.sign">
|
||||
<image src="../../static/img/crystal-sign.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
<view class="item-icon show" :class="{ active: index == 3 || index == 7 }" v-else><text>+{{ item.crystal }}</text></view>
|
||||
<view class="item-title">{{ item.text }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="sign-text">再签到{{ sign.nextTask.day }}天额外赠送{{ sign.nextTask.diff }}个水晶奖励</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 水晶任务 -->
|
||||
<view class="content-title">
|
||||
<view class="content-title-text">
|
||||
水晶任务
|
||||
</view>
|
||||
</view>
|
||||
<view class="task">
|
||||
<view class="task-item" v-for="(item, index) in task" :key="index" @click="JumpUrl(item.url, item.title)">
|
||||
<image class="task-icon" :src="item.ico" mode="aspectFill"></image>
|
||||
<view class="task-title">{{item.title || '-'}}</view>
|
||||
<view class="task-subtitle">{{item.remark || '-'}}</view>
|
||||
<view class="task-label">{{item.tips || '-'}}<image class="task-label-icon" src="../../static/img/user-crystalMark-grey.png" @click.stop="crystalShow"></image></view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="crystal">
|
||||
发现更多
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import { crystals, thawlog, task, category, sign, operateSign } from '@/apis/interfaces/crystal'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
account: {
|
||||
coin: 0,
|
||||
crystal: '0.00'
|
||||
},
|
||||
yesterday: '0.00',
|
||||
crystalArr: [],
|
||||
categoryArr: [], // 分类列表
|
||||
ids: [],
|
||||
task: [],
|
||||
sign: {
|
||||
signArr : [],
|
||||
nextTask: '',
|
||||
signCan : false,
|
||||
signShow: false
|
||||
},
|
||||
tips : {
|
||||
tipsTitle : '', // 弹出的动态名称
|
||||
tipsContent : '', // 弹出的动态内容
|
||||
tipsState : false // 弹出的动态状态
|
||||
}
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
// 获取水晶领取信息
|
||||
crystals().then(res => {
|
||||
this.account = {
|
||||
coin: res.coin,
|
||||
crystal: res.crystal
|
||||
}
|
||||
this.crystalArr = res.crystal_array
|
||||
this.ids = res.all_ids
|
||||
this.yesterday = res.yesterday_crystal
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: err.message
|
||||
})
|
||||
})
|
||||
// 获取水晶任务
|
||||
task().then(res => {
|
||||
this.task = res
|
||||
})
|
||||
|
||||
// 获取水晶分类
|
||||
category().then(res => {
|
||||
this.categoryArr = res
|
||||
})
|
||||
|
||||
// 获取水晶签到信息
|
||||
this.signInfo();
|
||||
|
||||
},
|
||||
methods: {
|
||||
ledCrystal(index) {
|
||||
// 领取水晶
|
||||
thawlog({
|
||||
thaw_id: this.crystalArr[index].log_id,
|
||||
all_ids: this.ids
|
||||
}).then(res => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '+' + this.crystalArr[index].amount + '水晶',
|
||||
duration: 2000
|
||||
})
|
||||
this.$set(this.account, 'crystal', res.crystal)
|
||||
this.ids = res.all_ids
|
||||
if (JSON.stringify(res.last) === '[]') {
|
||||
this.$set(this.crystalArr, index, {
|
||||
amount: null
|
||||
})
|
||||
return
|
||||
}
|
||||
this.$set(this.crystalArr, index, res.last)
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: err
|
||||
})
|
||||
})
|
||||
},
|
||||
// 商品详情
|
||||
onTack(e) {
|
||||
uni.navigateTo({
|
||||
url: '../goods/goods?id=' + e.goods_id
|
||||
})
|
||||
},
|
||||
// 提示信息
|
||||
onShowToast() {
|
||||
uni.showToast({
|
||||
title: '暂未开放,敬请期待',
|
||||
icon : 'none'
|
||||
})
|
||||
},
|
||||
// 水晶签到信息
|
||||
signInfo() {
|
||||
sign().then(res => {
|
||||
this.sign.signArr = res.lists
|
||||
this.sign.nextTask = res.next_task
|
||||
this.sign.signCan = res.can_sign
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: err
|
||||
})
|
||||
})
|
||||
},
|
||||
// 签到
|
||||
signClick() {
|
||||
uni.vibrateShort({
|
||||
success: () => {
|
||||
operateSign().then(res => {
|
||||
// 获取水晶签到信息
|
||||
this.signInfo();
|
||||
|
||||
this.sign.signShow = !this.sign.signShow
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: err
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
// 提示语-组件返回参数
|
||||
signject(val) {
|
||||
console.log(val)
|
||||
this.sign.signShow = val.tipsState
|
||||
},
|
||||
|
||||
// 水晶分类跳转
|
||||
JumpUrl(open, title) {
|
||||
var type = open.openType;
|
||||
switch(type){
|
||||
case 'switchTab':
|
||||
uni.switchTab({
|
||||
url: open.path
|
||||
})
|
||||
break;
|
||||
case 'web':
|
||||
uni.navigateTo({
|
||||
url: `/pages/web-view/index?title=${title}&url=${open.url}`
|
||||
})
|
||||
break;
|
||||
case 'navigateTo':
|
||||
uni.navigateTo({
|
||||
url: open.path
|
||||
})
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
// 水晶原则提示语
|
||||
crystalShow () {
|
||||
this.tips.tipsTitle = '水晶规则'
|
||||
this.tips.tipsContent = '水晶是用户获取原石的影响因子,同一时段内,水晶越高,获取的原石越多.'
|
||||
this.tips.tipsState = !this.tips.tipsState
|
||||
},
|
||||
// 水晶原则提示语-组件返回参数
|
||||
tipseject(val) {
|
||||
this.tips.tipsState = val.tipsState
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
/* 水晶漂浮动画 */
|
||||
.oct-float {
|
||||
animation: 4s octfloat infinite;
|
||||
}
|
||||
@keyframes octfloat {
|
||||
0% {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
50% {
|
||||
margin-top: 15rpx;
|
||||
}
|
||||
|
||||
100% {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 背景
|
||||
.crystal{
|
||||
background: $mian-color-deep;
|
||||
min-height: 100vh;
|
||||
padding-top: var(--status-bar-height);
|
||||
box-sizing: border-box;
|
||||
background-image: url(@/static/background/crystal-background.png);
|
||||
background-size: 100%;
|
||||
background-position: top center;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
// 底部内容
|
||||
.content{
|
||||
margin-top: $margin * 2;
|
||||
padding: $padding;
|
||||
background: white;
|
||||
border-radius: $radius $radius 0 0;
|
||||
// 标题
|
||||
.content-title{
|
||||
padding: 0 $padding / 2;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
color: $text-color;
|
||||
position: relative;
|
||||
.content-title-text {
|
||||
font-weight: bold;
|
||||
font-size: $title-size + 4;
|
||||
width: calc(100% - 160rpx);
|
||||
margin-bottom: $margin;
|
||||
.tips {
|
||||
font-weight: normal;
|
||||
font-size: $title-size-sm;
|
||||
margin-top: $margin - 10;
|
||||
color: $uni-text-color;
|
||||
}
|
||||
}
|
||||
.content-titl-btn {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: $margin;
|
||||
background-image: linear-gradient(to left, $mian-color-deep, $mian-color);
|
||||
color: $uni-text-color-inverse;
|
||||
font-size: $title-size-sm;
|
||||
line-height: 60rpx;
|
||||
line-height: 60rpx;
|
||||
border-radius: $radius * 2;
|
||||
width: 160rpx;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
// 签到
|
||||
.sign{
|
||||
padding-top: $padding;
|
||||
padding-bottom: $padding * 2;
|
||||
.sign-list{
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
.item{
|
||||
text-align: center;
|
||||
.item-icon{
|
||||
display: inline-block;
|
||||
background-image: linear-gradient(to left, $mian-color-deep, $mian-color);
|
||||
color: white;
|
||||
width: 54rpx;
|
||||
height: 54rpx;
|
||||
line-height: 50rpx;
|
||||
border-radius: 50%;
|
||||
border:solid 2rpx $mian-color;
|
||||
box-sizing: border-box;
|
||||
&.item-done {
|
||||
background-image: linear-gradient(to left, #999, #999);
|
||||
border-color: #999;
|
||||
}
|
||||
image {
|
||||
width: 34rpx;
|
||||
height: 34rpx;
|
||||
margin-top: 8rpx;
|
||||
}
|
||||
&.active {
|
||||
background-image: linear-gradient(to left, #ee1d23, #ef8c85);
|
||||
border-color: #fd6165;
|
||||
}
|
||||
text {
|
||||
font-size: $title-size-sm;
|
||||
transform: scale(.8);
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
.item-title{
|
||||
color: $text-gray;
|
||||
padding-top: $padding / 2;
|
||||
font-size: $title-size-sm - 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
.sign-text{
|
||||
padding: $padding ($padding / 2) 0;
|
||||
color: $mian-color-deep;
|
||||
font-size: $title-size-m;
|
||||
}
|
||||
}
|
||||
// 水晶任务
|
||||
.task{
|
||||
padding: 0 ($padding / 2) $padding * 2;
|
||||
.task-item{
|
||||
position: relative;
|
||||
margin: 0 ($margin / 2);
|
||||
border-bottom: solid 1rpx $border-color;
|
||||
padding: $padding 200rpx $padding 90rpx;
|
||||
&:last-child{
|
||||
border-bottom: none;
|
||||
}
|
||||
.task-icon{
|
||||
position: absolute;
|
||||
top: $padding + 8;
|
||||
left: 0;
|
||||
width: 70rpx;
|
||||
height: 70rpx;
|
||||
// background: $border-color-lg;
|
||||
}
|
||||
.task-title{
|
||||
font-size: $title-size;
|
||||
color: $text-color;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
.task-subtitle{
|
||||
color: $text-gray-lg;
|
||||
font-size: $uni-font-size-sm;
|
||||
line-height: 30rpx;
|
||||
}
|
||||
.task-label{
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: $padding;
|
||||
line-height: 80rpx;
|
||||
font-size: $uni-font-size-sm;
|
||||
color: $text-color;
|
||||
display: flex;
|
||||
.task-label-icon {
|
||||
width: $uni-img-size-sm - 6;
|
||||
height: $uni-img-size-sm - 6;
|
||||
margin: $margin + 4 0 0 $margin - 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 数据统计
|
||||
.total {
|
||||
position: relative;
|
||||
margin: $margin ($margin + $margin/2);
|
||||
background: rgba($color: $mian-color-deep, $alpha: .6);
|
||||
padding: 0;
|
||||
display: flex;
|
||||
border-radius: $radius;
|
||||
.item {
|
||||
width: 50%;
|
||||
padding: 0 $padding;
|
||||
text-align: center;
|
||||
color: white;
|
||||
font-size: $title-size-m;
|
||||
line-height: 90rpx;
|
||||
image{
|
||||
width: 38rpx;
|
||||
height: 38rpx;
|
||||
vertical-align: top;
|
||||
margin-top: calc((90rpx - 38rpx) / 2);
|
||||
margin-right: $margin / 2;
|
||||
}
|
||||
}
|
||||
|
||||
&::before {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
content: "";
|
||||
width: 2rpx;
|
||||
left: 50%;
|
||||
background: linear-gradient(to bottom, transparent, rgba(255, 255, 255, .7), transparent);
|
||||
}
|
||||
}
|
||||
// 矿石
|
||||
.ore {
|
||||
position: relative;
|
||||
&>image {
|
||||
width: 100%;
|
||||
}
|
||||
.ore-lists {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
.oct-float-item{
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
.text {
|
||||
margin-top: $margin / 2;
|
||||
color: white;
|
||||
font-size: $title-size-sm;
|
||||
line-height: 40rpx;
|
||||
text-shadow: 0 3rpx 3rpx rgba($color: #000000, $alpha: .2);
|
||||
}
|
||||
.icon {
|
||||
width: 58rpx;
|
||||
vertical-align: top;
|
||||
}
|
||||
}
|
||||
.ore-item-nav{
|
||||
@extend .oct-float-item;
|
||||
right: $margin * 3;
|
||||
top: 12%;
|
||||
}
|
||||
.ore-item {
|
||||
@extend .oct-float-item;
|
||||
&:nth-child(1) { top: 16%; left: 13%; }
|
||||
&:nth-child(2) { top: 50%; right: 10%; }
|
||||
&:nth-child(3) { top: 23%; right: 20%; }
|
||||
&:nth-child(4) { top: 70%; left: 33%;}
|
||||
&:nth-child(5) { top: 40%; left: 20%; }
|
||||
&:nth-child(6) { top: 58%; left: 10%;}
|
||||
&:nth-child(7) { top: 10%; right: 43%;}
|
||||
&:nth-child(8) { top: 46%; right: 29%;}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 任务
|
||||
.task-block {
|
||||
white-space: nowrap;
|
||||
.item {
|
||||
background: rgba($color: $mian-color, $alpha: .2);
|
||||
display: inline-block;
|
||||
margin-left: $margin;
|
||||
width: 210rpx;
|
||||
padding: $padding * 2 $padding;
|
||||
border-radius: $radius;
|
||||
box-sizing: 0 0 4rpx 4rpx rgba($color: #000000, $alpha: .06);
|
||||
text-align: center;
|
||||
&:first-child {
|
||||
margin-left: $margin + $margin/2;
|
||||
}
|
||||
&:last-child {
|
||||
margin-right: $margin + $margin/2;
|
||||
}
|
||||
.icon {
|
||||
display: inline-block;
|
||||
margin: $margin 0;
|
||||
width: 98rpx;
|
||||
height: 98rpx;
|
||||
line-height: 98rpx;
|
||||
background: $mian-color-deep;
|
||||
border-radius: 50%;
|
||||
text-align: center;
|
||||
image {
|
||||
width: 56rpx;
|
||||
height: 56rpx;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
.text {
|
||||
font-size: $title-size-m;
|
||||
color: $mian-color;
|
||||
}
|
||||
.title {
|
||||
font-size: $title-size;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -1,185 +0,0 @@
|
||||
<template>
|
||||
<view class="GoodsAuthentication">
|
||||
<view class="authenticationTop">区块链溯源码:{{info.token}}</view>
|
||||
<!-- 商品认证 商品和服务 -->
|
||||
<view class="authenticationItem">
|
||||
<view class="authenticationItemTitle">商品认证</view>
|
||||
<view class="authenticationItemcontent" v-if="info.goods">
|
||||
<view class="authenticationItemcontentItem">
|
||||
<view class="title">{{info.goods.type ===1?'商品名称':'项目名称'}}: </view>
|
||||
<view class="content">{{info.goods.name || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem" v-if="info.goods.type ===1">
|
||||
<view class="title">生产批次:</view>
|
||||
<view class="content">{{info.goods.batch || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem" v-if="info.goods.type ===2" >
|
||||
<view class="title">项目分类:</view>
|
||||
<view class="content">{{info.goods.category || '暂无数据'}}</view>
|
||||
</view>
|
||||
|
||||
<view class="authenticationItemcontentItem" v-if="info.goods.type ===1">
|
||||
<view class="title">规格:</view>
|
||||
<view class="content">{{info.goods.skus[0].unit || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem">
|
||||
<view class="title">数量:</view>
|
||||
<view class="content">{{info.goods.skus[0].stock || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem">
|
||||
<view class="title">售价:</view>
|
||||
<view class="content">{{info.goods.skus[0].price || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem" v-if="info.goods.type ===1">
|
||||
<view class="title">生产日期:</view>
|
||||
<view class="content">{{info.goods.producted_at || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem" >
|
||||
<view class="title">{{info.goods.type ===1?'保质期':'有效期'}}:</view>
|
||||
<view class="content">{{info.goods.expiried_at || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem" v-if="info.goods.type ===1">
|
||||
<view class="title">生产厂家:</view>
|
||||
<view class="content">{{info.goods.product_name || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem" v-if="info.goods.type ===1">
|
||||
<view class="title">生产地:</view>
|
||||
<view class="content">{{info.goods.product_address || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem" >
|
||||
<view class="title">供应商:</view>
|
||||
<view class="content">{{info.goods.skus[0].price || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem" >
|
||||
<view class="title">经营许可证:</view>
|
||||
<view class="content">{{info.goods.lisence || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem" >
|
||||
<view class="title">实物照片:</view>
|
||||
<image class="img" v-if="info.goods.cover" :src="info.goods.cover" @click="priveImg(info.goods.cover)" mode="aspectFill" />
|
||||
<view class="content" v-else>暂无数据</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 企业认证 (商品和服务通用) -->
|
||||
<view class="authenticationItem">
|
||||
<view class="authenticationItemTitle">企业认证</view>
|
||||
<view class="authenticationItemcontent" v-if="info.certification">
|
||||
<view class="authenticationItemcontentItem" >
|
||||
<view class="title">企业名称:</view>
|
||||
<view class="content">{{info.certification.name || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem">
|
||||
<view class="title">企业地址:</view>
|
||||
<view class="content">{{info.certification.address || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem">
|
||||
<view class="title">统一信用代码:</view>
|
||||
<view class="content">{{info.certification.certification.code || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem">
|
||||
<view class="title">行业:</view>
|
||||
<view class="content">{{info.certification.industry.title || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem">
|
||||
<view class="title">经营范围:</view>
|
||||
<view class="content">{{info.certification.range || '暂无数据'}}</view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem">
|
||||
<view class="title">联系电话:</view>
|
||||
<u-icon name="phone-fill" v-if='info.certification.contack' @click="call(info.certification.contact)"
|
||||
color="#2979ff" label-color="#2979ff" label-size="26" :label='info.certification.contact' />
|
||||
<view class="content" v-else> 暂无数据 </view>
|
||||
</view>
|
||||
<view class="authenticationItemcontentItem">
|
||||
<view class="title">营业执照:</view>
|
||||
<image class="img" v-if='info.certification.certification.license' :src="info.certification.certification.license" @click="priveImg(info.certification.certification.license)" mode="aspectFill" />
|
||||
<view class="content" v-else>暂无数据</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 弹窗提示喽 -->
|
||||
<u-toast ref="uToast" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { managesAttestation } from '@/apis/interfaces/goods'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
info: ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
managesAttestation(this.$Route.query.id).then(res=>{
|
||||
this.info = res
|
||||
})
|
||||
},
|
||||
methods: {}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
page {
|
||||
background-color: #F7F7F7;
|
||||
}
|
||||
|
||||
.GoodsAuthentication {
|
||||
padding: 30rpx;
|
||||
|
||||
.authenticationTop {
|
||||
width: 100%;
|
||||
padding: 20rpx 50rpx;
|
||||
background-color: #c82626;
|
||||
font-size: 26rpx;
|
||||
color: #fff;
|
||||
border-radius: 60rpx;
|
||||
word-break: break-all;
|
||||
text-align: center;
|
||||
}
|
||||
// 商品认证
|
||||
.authenticationItem{
|
||||
width: 100%;
|
||||
min-height: 300rpx;
|
||||
margin-top: 20rpx;
|
||||
.authenticationItemTitle{
|
||||
font-size: 30rpx;
|
||||
color: #333333;
|
||||
font-weight: 600;
|
||||
padding: 30rpx 20rpx;
|
||||
}
|
||||
.authenticationItemcontent{
|
||||
width: 100%;
|
||||
min-height: 500rpx;
|
||||
background-color: #fff;
|
||||
border-radius: 20rpx;
|
||||
border: solid rgba(200,38,0,.05) 6rpx;
|
||||
box-shadow:2rpx 2rpx 20rpx 0rpx rgba(200,38,0,.051);
|
||||
padding:10rpx 20rpx;
|
||||
.authenticationItemcontentItem{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
box-sizing: border-box;
|
||||
padding: 20rpx 0;
|
||||
font-size: 24rpx;
|
||||
.title{
|
||||
width: 180rpx;
|
||||
}
|
||||
.content{
|
||||
text-overflow: ellipsis;
|
||||
width: calc( 100% - 180rpx);
|
||||
}
|
||||
.img{
|
||||
width: 340rpx;
|
||||
height: 200rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,116 +0,0 @@
|
||||
<template>
|
||||
<view class="GoodsChain">
|
||||
<image src="https://e-chain.cnskl.com/storage/imageresource/chain-bg.png" class='chainBg' />
|
||||
<view class="chain-content">
|
||||
<view class="chain-center">
|
||||
<image src="/static/images/service-logi.png" mode="aspectFill" class="logo" />
|
||||
<view class="name">易品新境区块链溯源证书</view>
|
||||
<view class="no">区块链溯源证书:{{info.token}}</view>
|
||||
<view class="content">
|
||||
<view class="con-item">兹证明:</view>
|
||||
<view class="con-item" v-if="info.company">
|
||||
{{info.company.name}},产品符合溯源规范,认证内容如下:特授权其产品在易品新境区块链溯源商城出售!
|
||||
</view>
|
||||
<view class="con-item">交易哈希: {{info.hash}}</view>
|
||||
<view class="con-item">区块链高度: {{info.height}}</view>
|
||||
</view>
|
||||
<view class="date" v-if="info.applied_at">授权时间: {{info.applied_at}}</view>
|
||||
<view class="date">有效期至: {{info.ended_at}}</view>
|
||||
<view class="companyInfo">易品新境区块链有限公司</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 弹窗提示喽 -->
|
||||
<u-toast ref="uToast" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { managesChain } from '@/apis/interfaces/goods'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
info: ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
managesChain(this.$Route.query.id).then(res=>{
|
||||
this.info = res
|
||||
})
|
||||
},
|
||||
methods: {}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
page {
|
||||
background-color: #F7F7F7;
|
||||
}
|
||||
|
||||
.GoodsChain {
|
||||
background-color:fff;
|
||||
width: 100%;
|
||||
min-height: 100vh;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
.chainBg{
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 2;
|
||||
}
|
||||
.chain-content{
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
z-index: 2;
|
||||
padding: 18vh 10vw 15vh 10vw ;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
z-index: 3;
|
||||
.chain-center{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.logo{
|
||||
width: 160rpx;
|
||||
height: 160rpx;
|
||||
border-radius: 50%;
|
||||
position: relative;
|
||||
margin-left: -80rpx;
|
||||
left: 50%;
|
||||
margin-bottom: 20rpx;
|
||||
border: solid rgba($color: #fff, $alpha: .3) 10rpx;
|
||||
}
|
||||
.name{
|
||||
font-size: 40rpx;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
}
|
||||
.no{
|
||||
font-size: 26rpx;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
margin-top: 10rpx;
|
||||
}
|
||||
|
||||
.content{
|
||||
margin-top: 60rpx;
|
||||
font-size: 28rpx;
|
||||
padding: 0 20rpx;
|
||||
.con-item{
|
||||
margin-bottom: 30rpx;
|
||||
word-break: break-all;
|
||||
}
|
||||
}
|
||||
.date{
|
||||
text-align: right;
|
||||
margin-bottom: 10rpx;
|
||||
padding-right: 20rpx;
|
||||
}
|
||||
.companyInfo{
|
||||
text-align: right;
|
||||
margin-bottom: 40rpx;
|
||||
padding-right: 20rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,737 +0,0 @@
|
||||
<template>
|
||||
<view class="content" v-if="!loding">
|
||||
<!-- 轮播主图 -->
|
||||
<view class="goods-covers">
|
||||
<swiper class="swiper" indicator-dots indicator-active-color="#c82626">
|
||||
<block v-if="goodsObj.pictures.length > 0">
|
||||
<swiper-item v-for="(item, index) in goodsObj.pictures" :key="index">
|
||||
<image class="swiper-item" :src="item" mode="aspectFill"/>
|
||||
</swiper-item>
|
||||
</block>
|
||||
</swiper>
|
||||
</view>
|
||||
<!-- 产品详情 -->
|
||||
<view class="goods-content">
|
||||
<view class="header">
|
||||
<view class="flex-box">
|
||||
<view class="price"><text>¥</text>{{goodsObj.price.show}}</view>
|
||||
<view class="sales">累计易货{{goodsObj.sales}}次</view>
|
||||
</view>
|
||||
<view class="coupon" v-if="couponSee.length > 0" @click="couponsOpne">
|
||||
<view class="coupon-list" v-for="(item, index) in couponSee" :key="index">
|
||||
<view class="coupon-label">
|
||||
{{item.title}}
|
||||
</view>
|
||||
</view>
|
||||
<view class="coupon-btn">领券<image class="coupon-btn-img" src="../../static/icons/goods_row.png" mode="aspectFill"></image></view>
|
||||
</view>
|
||||
<view class="title"><view class="title-hot">热卖</view>{{goodsObj.name}}</view>
|
||||
<!-- <view class="sub-title">{{goodsObj.description}}</view> -->
|
||||
</view>
|
||||
<!-- 商家信息 -->
|
||||
<view class="store">
|
||||
<image class="logo" :src="goodsObj.shop.cover" mode="aspectFill"></image>
|
||||
<view class="store-cont">
|
||||
<view class="store-title">{{goodsObj.shop.name}}</view>
|
||||
<view class="rate">
|
||||
<uni-rate
|
||||
:readonly="true"
|
||||
color="#ddd"
|
||||
active-color="#c82626"
|
||||
:value="2.5"
|
||||
:size="14"
|
||||
/>
|
||||
</view>
|
||||
<view class="openbtn" @click="onOpenWechat">进店<image class="openbtn-img" src="../../static/icons/equity_arrow_right.png" mode="aspectFill"></image></view>
|
||||
</view>
|
||||
<view class="tooSee">
|
||||
<view class="tooSee-label" @click="$Router.push({name: 'GoodsChain', params: {id: goodsObj.goods_id}})">
|
||||
区块链证书
|
||||
<image class="tooSee-label-img" src="../../static/icons/equity_arrow_right.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
<view class="tooSee-label" @click="$Router.push({name: 'GoodsAttestation', params: {id: goodsObj.goods_id}})">
|
||||
商品认证
|
||||
<image class="tooSee-label-img" src="../../static/icons/equity_arrow_right.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
<view class="tooSee-label" @click="$Router.push({name: 'GoodstracedTo', params: {id: goodsObj.goods_id}})">
|
||||
商品溯源
|
||||
<image class="tooSee-label-img" src="../../static/icons/equity_arrow_right.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 产品规格 -->
|
||||
<view class="size">
|
||||
<view class="size-item nowrap">
|
||||
<label class="title">规格</label>
|
||||
{{goodsObj.skus[0].goods_name}}
|
||||
</view>
|
||||
<view class="size-item nowrap">
|
||||
<label class="title">说明</label>
|
||||
特价商品不可与优惠券叠加使用
|
||||
</view>
|
||||
<view class="size-item nowrap">
|
||||
<label class="title">服务</label>
|
||||
<view class="goods-serve" @click="serveOpne">
|
||||
<image class="goods-serve-img" src="../../static/icons/goods_buy.png" mode="aspectFill"></image>
|
||||
<view class="nowrap goods-serve-name"><text v-for="(item, index) in goodsObj.services">{{item.name}}</text></view>
|
||||
<image class="goods-serve-img" src="../../static/icons/goods_spot.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 产品详情 -->
|
||||
<view class="product">
|
||||
<block v-for="(item, index) in goodsObj.content" :key="index">
|
||||
<image :src="item" mode="widthFix"></image>
|
||||
</block>
|
||||
</view>
|
||||
</view>
|
||||
<!-- footer -->
|
||||
<view class="footer">
|
||||
<button class="btn" size="default" @click="buyGoods">立即购买</button>
|
||||
</view>
|
||||
|
||||
<!-- 优惠券弹出 -->
|
||||
<uni-popup ref="couponsPopup">
|
||||
<view class="coupons-popup">
|
||||
<view class="coupons-header">
|
||||
<view class="title">优惠券</view>
|
||||
<image @click="couponsClose" class="close" src="../../static/icons/goods_close.png" mode=""></image>
|
||||
</view>
|
||||
<view class="coupons-cont">
|
||||
<view class="coupons-name">
|
||||
可领取的优惠券
|
||||
</view>
|
||||
<view class="coupons-list" v-for="(item , index) in coupons" :key="index">
|
||||
<view class="coupons-tips" v-if="item.type">
|
||||
<!-- value == 1服务券 value == 2代金券 value == 3提货券 -->
|
||||
<text class="coupons-tips-text" v-if="item.type.value == '1'">服务券</text>
|
||||
<text class="coupons-tips-text" v-else-if="item.type.value == '2'">代金券</text>
|
||||
<text class="coupons-tips-text" v-else>提货券</text>
|
||||
</view>
|
||||
<view class="coupons-left" v-if="item.type.value == '2'">
|
||||
<view class="coupons-number">
|
||||
<text>¥</text>{{item.price}}
|
||||
</view>
|
||||
<view class="coupons-full">
|
||||
满{{item.full}}可用
|
||||
</view>
|
||||
</view>
|
||||
<view class="coupons-left" v-else-if="item.type.value == '3'">
|
||||
<view class="coupons-number coupons-small">
|
||||
提货券
|
||||
</view>
|
||||
</view>
|
||||
<view class="coupons-center">
|
||||
<view class="nowrap coupons-title">
|
||||
{{item.title}}
|
||||
</view>
|
||||
<view class="coupons-time" v-if="item.time">
|
||||
{{item.time.interval}}
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view v-if="item.can.get" class="coupons-right" @click="drawCoupons(item.coupon_id, index)">
|
||||
领取
|
||||
</view>
|
||||
<view v-else class="coupons-right coupons-right-active">
|
||||
已领取
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="coupons-true" @click="couponsClose">
|
||||
确定
|
||||
</view>
|
||||
</view>
|
||||
</uni-popup>
|
||||
|
||||
<!-- 服务保障弹出 -->
|
||||
<uni-popup ref="servePopup">
|
||||
<view class="coupons-popup">
|
||||
<view class="coupons-header">
|
||||
<view class="title">保障</view>
|
||||
<image @click="serveClose" class="close" src="../../static/icons/goods_close.png" mode=""></image>
|
||||
</view>
|
||||
<view class="serve-cont">
|
||||
<view class="serve-label" v-for="(item, index) in goodsObj.services" :key="index">
|
||||
<view class="serve-label-name">
|
||||
{{item.name}}
|
||||
</view>
|
||||
<view class="serve-label-text">
|
||||
{{item.content}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="coupons-true" @click="serveClose">
|
||||
确定
|
||||
</view>
|
||||
</view>
|
||||
</uni-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { goods, managesCoupons } from '@/apis/interfaces/goods'
|
||||
import userAuth from '@/public/userAuth'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
loding : true,
|
||||
goodsObj : {},
|
||||
identity : '',
|
||||
company : {},
|
||||
coupons : {},
|
||||
couponSee : ""
|
||||
};
|
||||
},
|
||||
created() {
|
||||
goods(this.$Route.query.id).then(res=>{
|
||||
this.loding = false
|
||||
this.goodsObj = res
|
||||
this.identity = res.identity.id || ''
|
||||
this.company = res.company
|
||||
this.couponSee= res.coupons.slice(0, 3)
|
||||
this.coupons = res.coupons
|
||||
})
|
||||
},
|
||||
methods:{
|
||||
// 提交购买单
|
||||
buyGoods(){
|
||||
let token = this.$store.getters.getToken
|
||||
if(token == ''){
|
||||
let userLogin = new userAuth()
|
||||
userLogin.Login()
|
||||
return
|
||||
}
|
||||
this.$Router.push({
|
||||
name: 'Buy',
|
||||
params: {
|
||||
skuId: this.goodsObj.skus[0].sku_id,
|
||||
qty : this.goodsObj.skus[0].number
|
||||
}
|
||||
})
|
||||
},
|
||||
// 打开微信小程序
|
||||
onOpenWechat(){
|
||||
plus.share.getServices(res => {
|
||||
let sweixin = null;
|
||||
for(let val of res){
|
||||
if(val.id === 'weixin'){
|
||||
sweixin = val
|
||||
}
|
||||
}
|
||||
/** 以此为例子 显示跳转引导页
|
||||
* 'index_4'
|
||||
* index 跳小程序企业首页
|
||||
* 4 企业id
|
||||
**/
|
||||
if(sweixin != null){
|
||||
sweixin.launchMiniProgram({
|
||||
id : this.company.original_id,
|
||||
path: 'pages/login/guide?scene=index_' + this.company.company_id
|
||||
})
|
||||
}else{
|
||||
uni.showToast({
|
||||
title: '当前环境不支持打开微信小程序',
|
||||
icon : 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 领取优惠券
|
||||
drawCoupons(id){
|
||||
let token = this.$store.getters.getToken
|
||||
if(token == ''){
|
||||
let userLogin = new userAuth()
|
||||
userLogin.Login()
|
||||
return
|
||||
}
|
||||
managesCoupons(id).then(res=>{
|
||||
uni.showToast({
|
||||
title: '领取成功',
|
||||
type: 'primary',
|
||||
duration: 3000
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
icon : 'none',
|
||||
title: err.message
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// 选择优惠券-显示
|
||||
couponsOpne(){
|
||||
this.$refs.couponsPopup.open('bottom')
|
||||
},
|
||||
|
||||
// 选择优惠券-隐藏
|
||||
couponsClose(){
|
||||
this.$refs.couponsPopup.close()
|
||||
},
|
||||
|
||||
// 查看保障服务-显示
|
||||
serveOpne(){
|
||||
this.$refs.servePopup.open('bottom')
|
||||
},
|
||||
|
||||
// 查看保障服务-隐藏
|
||||
serveClose() {
|
||||
this.$refs.servePopup.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.content{
|
||||
position: relative;
|
||||
padding-top: 100%;
|
||||
|
||||
}
|
||||
// 轮播图
|
||||
.goods-covers{
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
width: 100%;
|
||||
padding-top: 100%;
|
||||
.swiper{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.swiper-item{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 商品详情
|
||||
.goods-content{
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
background-color: white;
|
||||
border-radius: $radius $radius 0 0;
|
||||
padding-bottom: calc((#{$padding} * 2) + (env(safe-area-inset-bottom) / 2) + 90rpx);
|
||||
padding-bottom: calc((#{$padding} * 2) + (constant(safe-area-inset-bottom) / 2) + 90rpx);
|
||||
// 详情
|
||||
.header{
|
||||
padding: 0 $padding $padding;
|
||||
.title{
|
||||
font-size: $title-size;
|
||||
font-weight: bold;
|
||||
line-height: 50rpx;
|
||||
display: flex;
|
||||
.title-hot {
|
||||
background-color: #fee195;
|
||||
font-size: 24rpx;
|
||||
border-radius: 50rpx;
|
||||
padding: 0 10rpx;
|
||||
height: 34rpx;
|
||||
line-height: 36rpx;
|
||||
margin: 6rpx 10rpx 0 0;
|
||||
}
|
||||
}
|
||||
.sub-title{
|
||||
line-height: 40rpx;
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
padding-bottom: $padding/3;
|
||||
}
|
||||
.flex-box{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 90rpx;
|
||||
.price{
|
||||
font-weight: bold;
|
||||
color: $text-price;
|
||||
font-size: $title-size + 14;
|
||||
text{
|
||||
font-size: 70%;
|
||||
}
|
||||
width: calc(60% - #{$padding});
|
||||
}
|
||||
.sales{
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
width: 40%;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
||||
// 新增优惠券
|
||||
.coupon {
|
||||
background-color: #fef2f2;
|
||||
color: #e1293f;
|
||||
border-radius: 8rpx;
|
||||
border: 1rpx solid #ffe5e5;
|
||||
padding: $padding - 15;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
position: relative;
|
||||
margin-bottom: $margin - 10;
|
||||
.coupon-list {
|
||||
font-size: 22rpx;
|
||||
.coupon-label {
|
||||
display: inline-block;
|
||||
border: 1rpx solid #e998a1;
|
||||
border-radius: 50rpx;
|
||||
padding: 0 15rpx;
|
||||
height: 34rpx;
|
||||
line-height: 34rpx;
|
||||
margin-right: $margin - 10;
|
||||
}
|
||||
}
|
||||
.coupon-btn {
|
||||
position: absolute;
|
||||
right: $padding - 20;
|
||||
top: 0;
|
||||
line-height: 60rpx;
|
||||
font-size: 24rpx;
|
||||
display: flex;
|
||||
font-weight: 700;
|
||||
.coupon-btn-img {
|
||||
width: 22rpx;
|
||||
height: 22rpx;
|
||||
margin: 20rpx 0 0 4rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 新增服务
|
||||
.goods-serve {
|
||||
display: flex;
|
||||
.goods-serve-img {
|
||||
width: 36rpx;
|
||||
height: 36rpx;
|
||||
margin-top: 24rpx;
|
||||
}
|
||||
.goods-serve-name {
|
||||
margin: 0 30rpx 0 20rpx;
|
||||
width: calc(100% - 122rpx);
|
||||
text {
|
||||
padding-right: $padding;
|
||||
position: relative;
|
||||
&:last-child {
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 店铺
|
||||
.store{
|
||||
position: relative;
|
||||
margin: 0 $margin;
|
||||
background: #F8F8F8;
|
||||
border-radius: $radius/2;
|
||||
padding: $padding;
|
||||
min-height: 220rpx;
|
||||
.logo{
|
||||
position: absolute;
|
||||
left: $margin;
|
||||
top: $margin;
|
||||
width: 98rpx;
|
||||
height: 98rpx;
|
||||
border-radius: $radius/2;
|
||||
}
|
||||
.store-cont {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
padding-left: 150rpx;
|
||||
padding-top: 20rpx;
|
||||
box-sizing: border-box;
|
||||
height: 140rpx;
|
||||
}
|
||||
.tooSee {
|
||||
position: absolute;
|
||||
top: 150rpx;
|
||||
left: 0;
|
||||
font-size: 24rpx;
|
||||
padding-left: $padding;
|
||||
box-sizing: border-box;
|
||||
.tooSee-label {
|
||||
background-color: #fd683e;
|
||||
border-radius: 8rpx 4rpx 4rpx 6rpx;
|
||||
color: #FFFFFF;
|
||||
height: 48rpx;
|
||||
line-height: 48rpx;
|
||||
padding: 0 $padding - 15;
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
margin-right: $margin * 2;
|
||||
position: relative;
|
||||
&::after, &::before{
|
||||
content: '';
|
||||
position: absolute;
|
||||
}
|
||||
&::after {
|
||||
right: -40rpx;
|
||||
top: 0;
|
||||
background-color: #f64c37;
|
||||
width: 40rpx;
|
||||
height: 100%;
|
||||
border-radius: 4rpx 8rpx 8rpx 4rpx;
|
||||
}
|
||||
&::before {
|
||||
right: -1rpx;
|
||||
top: 5%;
|
||||
border: 1rpx dashed #fb745a;
|
||||
height: 90%;
|
||||
z-index: 2;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
&:last-child {
|
||||
margin: 0;
|
||||
}
|
||||
&:first-child {
|
||||
background-color: #f2d7aa;
|
||||
color: #362507;
|
||||
}
|
||||
&:first-child::after {
|
||||
background-color: #f1d599;
|
||||
}
|
||||
&:first-child::before {
|
||||
border-color: #fae2b9;
|
||||
}
|
||||
.tooSee-label-img {
|
||||
position: absolute;
|
||||
right: -34rpx;
|
||||
top: 12rpx;
|
||||
width: 28rpx;
|
||||
height: 28rpx;
|
||||
z-index: 9;
|
||||
}
|
||||
&:first-child .tooSee-label-img {
|
||||
filter: brightness(.2)
|
||||
}
|
||||
}
|
||||
}
|
||||
.store-title{
|
||||
font-size: $title-size-lg;
|
||||
font-weight: bold;
|
||||
line-height: 60rpx;
|
||||
color: $text-color;
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
// rate
|
||||
.openbtn{
|
||||
position: absolute;
|
||||
right: $margin - 10;
|
||||
top: $margin * 3.5;
|
||||
color: #848484;
|
||||
height: 60rpx;
|
||||
line-height: 60rpx;
|
||||
text-align: center;
|
||||
font-size: $title-size-m;
|
||||
margin-top: -30rpx;
|
||||
display: flex;
|
||||
.openbtn-img {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
filter: brightness(.5);
|
||||
margin-top: 14rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 产品规格
|
||||
.size{
|
||||
margin-top: $margin;
|
||||
border-top: solid 20rpx #F8F8F8;
|
||||
border-bottom: solid 20rpx #F8F8F8;
|
||||
.size-item{
|
||||
position: relative;
|
||||
padding: 0 $padding 0 ($padding + 100);
|
||||
line-height: 90rpx;
|
||||
font-size: $title-size-m;
|
||||
&::after{
|
||||
position: absolute;
|
||||
left: $margin;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
content: " ";
|
||||
height: 1rpx;
|
||||
background-color: $border-color;
|
||||
}
|
||||
&:last-child::after{
|
||||
display: none;
|
||||
}
|
||||
.title{
|
||||
position: absolute;
|
||||
left: $margin;
|
||||
top: 0;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 产品详情
|
||||
.product{
|
||||
image{
|
||||
vertical-align: top;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 立即购买
|
||||
.footer{
|
||||
padding: $padding;
|
||||
background: white;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
z-index: 99;
|
||||
box-sizing: border-box;
|
||||
.btn[size='default']{
|
||||
width: 100%;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
padding: 0;
|
||||
border-radius: 0;
|
||||
box-sizing: border-box;
|
||||
background: $text-price;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: $title-size;
|
||||
margin-bottom: calc(env(safe-area-inset-bottom) / 2);
|
||||
margin-bottom: calc(constant(safe-area-inset-bottom) / 2);
|
||||
}
|
||||
}
|
||||
|
||||
// 优惠券弹出样式
|
||||
.coupons-popup {
|
||||
background-color: #FFFFFF;
|
||||
border-radius: 40rpx 40rpx 0 0;
|
||||
padding: $padding;
|
||||
box-sizing: border-box;
|
||||
.coupons-header {
|
||||
text-align: center;
|
||||
position: relative;
|
||||
margin-bottom: $margin*1.5;
|
||||
.title {
|
||||
font-weight: 700;
|
||||
}
|
||||
.close {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
z-index: 2;
|
||||
width: 38rpx;
|
||||
height: 38rpx;
|
||||
}
|
||||
}
|
||||
.coupons-cont {
|
||||
.coupons-name {
|
||||
color: #616065;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
.coupons-list {
|
||||
border: 2rpx solid #d6b9be;
|
||||
border-radius: 10rpx;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
margin-top: $margin;
|
||||
.coupons-tips {
|
||||
background-color: #211e17;
|
||||
color: #efe8d8;
|
||||
position: absolute;
|
||||
border-radius: 0 0 20rpx 0;
|
||||
padding: 0 8rpx;
|
||||
height: 34rpx;
|
||||
line-height: 34rpx;
|
||||
left: 0;
|
||||
top: 0;
|
||||
.coupons-tips-text {
|
||||
font-size: 24rpx;
|
||||
transform:scale(.85);
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
.coupons-left {
|
||||
background-color: #fdedee;
|
||||
color: #e1293f;
|
||||
width: 190rpx;
|
||||
text-align: center;
|
||||
padding: $padding - 10 0;
|
||||
border-right: 2rpx dashed #eccdd4;
|
||||
.coupons-number {
|
||||
font-size: 40rpx;
|
||||
font-weight: 600;
|
||||
text {
|
||||
font-size: 24rpx;
|
||||
}
|
||||
&.coupons-small {
|
||||
font-size: 32rpx;
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
}
|
||||
.coupons-full {
|
||||
font-size: 24rpx;
|
||||
}
|
||||
}
|
||||
.coupons-center {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
padding: $padding - 10 130rpx 0 220rpx;
|
||||
box-sizing: border-box;
|
||||
font-size: 28rpx;
|
||||
.coupons-time {
|
||||
font-size: 24rpx;
|
||||
margin-top: 10rpx;
|
||||
color: #514c51;
|
||||
}
|
||||
}
|
||||
.coupons-right {
|
||||
position: absolute;
|
||||
right: 20rpx;
|
||||
top: 36rpx;
|
||||
width: 110rpx;
|
||||
text-align: center;
|
||||
background-color: #e1293f;
|
||||
color: #FFFFFF;
|
||||
border-radius: 80rpx;
|
||||
font-size: 24rpx;
|
||||
line-height: 52rpx;
|
||||
&.coupons-right-active {
|
||||
background-color: #adadad;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.coupons-true {
|
||||
background-image: linear-gradient(to right, #e1293f, #fd275d);
|
||||
color: #FFFFFF;
|
||||
border-radius: 80rpx;
|
||||
line-height: 84rpx;
|
||||
text-align: center;
|
||||
margin-top: $margin*5;
|
||||
}
|
||||
}
|
||||
|
||||
// 新增服务保障样式
|
||||
.serve-label {
|
||||
margin-top: $margin + 10;
|
||||
font-size: 28rpx;
|
||||
.serve-label-name {
|
||||
font-weight: 700;
|
||||
margin-bottom: $margin - 10;
|
||||
}
|
||||
.serve-label-text {
|
||||
line-height: 44rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.serve-cont {
|
||||
height: 40vh;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
</style>
|
||||
@@ -1,484 +1,19 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- 水晶获得公告 -->
|
||||
<view class="notice" v-if="notice.length >= 1">
|
||||
<swiper class="notice-swiper" :vertical="true" autoplay circular>
|
||||
<swiper-item v-for="(item, index) in notice" :key="index">
|
||||
<view class="notice-item">
|
||||
<image class="notice-cover" :src="item.avatar" mode="aspectFill"></image>
|
||||
<view class="notice-title ellipsis">{{item.nickname}} {{item.title}} {{item.amount}}</view>
|
||||
</view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
<!-- 账户余额 -->
|
||||
<view class="info">
|
||||
<view class="info-number">
|
||||
<image class="number-background number-rotate" src="@/static/background/chain-back-01.png" />
|
||||
<view class="info-content webkit-box">
|
||||
<view class="text">{{isAuth ? '持有原石量': '恒量发行原石量'}}<uni-icons class="help-icon" @click="showHelp('occ')" type="help-filled" size="18" color="#fff" /></view>
|
||||
<view class="number">{{occ}}</view>
|
||||
<view class="login" @click="$Router.push({name: 'Login'})" v-if="!isAuth">立即登录</view>
|
||||
<view class="login" @click="openWallet" v-else>我的钱包</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 公告信息 -->
|
||||
<!-- <view class="increase">今日消费100元,预计原石单价增长0.1%</view> -->
|
||||
<!-- 平台概况 -->
|
||||
<view class="situation">
|
||||
<view class="header">
|
||||
<view class="header-item">
|
||||
<view class="title">平台原石余量<uni-icons class="help-icon" @click="showHelp('occBalance')" type="help-filled" size="18" color="#009b69" /></view>
|
||||
<view class="number ellipsis">{{ occBalance }}</view>
|
||||
</view>
|
||||
<view class="header-item">
|
||||
<view class="title">昨日瓜分水晶<uni-icons class="help-icon" @click="showHelp('yesterdayCrystal')" type="help-filled" size="18" color="#009b69" /></view>
|
||||
<view class="number ellipsis">{{ yesterdayCrystal }}</view>
|
||||
</view>
|
||||
<view class="header-item">
|
||||
<view class="title">区块链高度<uni-icons class="help-icon" @click="showHelp('blockHeight')" type="help-filled" size="18" color="#009b69" /></view>
|
||||
<view class="number ellipsis">{{ blockHeight }}</view>
|
||||
</view>
|
||||
<view class="header-item">
|
||||
<view class="title">平台累计盈利额<uni-icons class="help-icon" @click="showHelp('gain')" type="help-filled" size="18" color="#009b69" /></view>
|
||||
<view class="number ellipsis">{{ gain }}</view>
|
||||
</view>
|
||||
<view class="header-item">
|
||||
<view class="title">已开通节点数<uni-icons class="help-icon" @click="showHelp('nodeNumber')" type="help-filled" size="18" color="#009b69" /></view>
|
||||
<view class="number ellipsis">{{ nodeNumber }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 节点信息 -->
|
||||
<view class="node-info">
|
||||
<view class="node-item">
|
||||
<view class="title">轻节点</view>
|
||||
<view class="number ellipsis">{{occs.light || '-'}}</view>
|
||||
</view>
|
||||
<view class="node-item">
|
||||
<view class="title">合作节点</view>
|
||||
<view class="number ellipsis">{{occs.cooperation || '-'}}</view>
|
||||
</view>
|
||||
<view class="node-item">
|
||||
<view class="title">主节点</view>
|
||||
<view class="number ellipsis">{{occs.main || '-'}}</view>
|
||||
</view>
|
||||
<view class="node-item">
|
||||
<view class="title">超级节点</view>
|
||||
<view class="number ellipsis">{{occs.super || '-'}}</view>
|
||||
</view>
|
||||
<view class="node-item">
|
||||
<view class="title">运营节点</view>
|
||||
<view class="number ellipsis">{{occs.operating || '-'}}</view>
|
||||
</view>
|
||||
<view class="node-item">
|
||||
<view class="title">技术节点</view>
|
||||
<view class="number ellipsis">{{occs.technology || '-'}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 平台盈利额,原石数量 -->
|
||||
<view class="chart">
|
||||
<view class="title">平台累计营业额和原石价值走势图</view>
|
||||
<view class="chart-f2">
|
||||
<l-f2 ref="chartChange"></l-f2>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
发现能量
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { occ } from '@/apis/interfaces/chain'
|
||||
import { certified, security } from '@/apis/interfaces/index'
|
||||
import F2 from '@/uni_modules/lime-f2/components/lime-f2/f2.min.js'
|
||||
import lF2 from '@/uni_modules/lime-f2/components/lime-f2/'
|
||||
export default {
|
||||
components: {
|
||||
lF2
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
occs: {},
|
||||
blockHeight: 0,
|
||||
occBalance: 0,
|
||||
occ: 0,
|
||||
yesterdayCrystal: 0,
|
||||
gain: 0,
|
||||
nodeNumber: 0,
|
||||
notice: [],
|
||||
isAuth: false,
|
||||
helpToast: {
|
||||
occ: '恒量发行原石量',
|
||||
occBalance: '平台原石量',
|
||||
yesterdayCrystal: '昨日瓜分水晶',
|
||||
blockHeight: '区块链高度',
|
||||
gain: '平台累计盈利额',
|
||||
nodeNumber: '已开通节点数'
|
||||
}
|
||||
|
||||
};
|
||||
},
|
||||
onShow() {
|
||||
if(this.$store.state.token != '') this.isAuth = true
|
||||
this.getOcc()
|
||||
},
|
||||
methods:{
|
||||
// 求助信息
|
||||
showHelp(type) {
|
||||
uni.showModal({
|
||||
title: '提示',
|
||||
content: this.helpToast[type],
|
||||
showCancel: false
|
||||
})
|
||||
},
|
||||
// 原石钱包
|
||||
openWallet(){
|
||||
Promise.all([certified(), security()]).then(res=> {
|
||||
let certified = res[0],
|
||||
security = res[1]
|
||||
if(!certified){
|
||||
uni.showModal({
|
||||
title: '提示',
|
||||
content: '您还为完成个人认证,无法激活您的钱包',
|
||||
confirmText: '去认证',
|
||||
confirmColor: '#009B69',
|
||||
cancelColor: '#666666',
|
||||
cancelText: '稍后再说',
|
||||
success: res=> {
|
||||
if(res.confirm) {
|
||||
uni.navigateTo({
|
||||
url: '/pages/certification/personal'
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
if(!security) {
|
||||
uni.showModal({
|
||||
title: '激活提示',
|
||||
content: '您的钱包未激活,是否立即导出助记词并激活您的钱包?',
|
||||
confirmText: '去激活',
|
||||
confirmColor: '#009B69',
|
||||
cancelColor: '#666666',
|
||||
cancelText: '稍后再说',
|
||||
success: res=> {
|
||||
if(res.confirm) {
|
||||
uni.navigateTo({
|
||||
url: '/pages/wallet/add'
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
uni.navigateTo({
|
||||
url: '/pages/wallet/property'
|
||||
})
|
||||
})
|
||||
},
|
||||
// occ信息
|
||||
getOcc(){
|
||||
occ().then(res => {
|
||||
this.occs = res.occs
|
||||
this.yesterdayCrystal = res.yesterday_crystal
|
||||
this.occ = res.occ
|
||||
this.occBalance = res.occ_balance
|
||||
this.blockHeight = res.block_height
|
||||
this.gain = res.gain
|
||||
this.nodeNumber = res.node_number
|
||||
this.notice = res.notice
|
||||
if(res.help_toast) this.helpToast = res.help_toast
|
||||
this.showCartc(res.movements)
|
||||
}).catch(err => {
|
||||
console.log(err)
|
||||
})
|
||||
},
|
||||
// 绘制图表
|
||||
showCartc(data){
|
||||
// 图表信息
|
||||
this.$refs.chartChange.init(config => {
|
||||
config.appendPadding = [10, 15, 10, 15]
|
||||
|
||||
const chart = new F2.Chart(config);
|
||||
chart.source(data, {
|
||||
date: {
|
||||
range: [0, 1],
|
||||
type: 'timeCat',
|
||||
mask: 'MM-DD'
|
||||
},
|
||||
value: {
|
||||
tickCount: 5
|
||||
}
|
||||
});
|
||||
chart.axis('time', {
|
||||
line: null,
|
||||
label: function label(text, index, total) {
|
||||
const textCfg = {};
|
||||
if (index === 0) {
|
||||
textCfg.textAlign = 'left';
|
||||
} else if (index === total - 1) {
|
||||
textCfg.textAlign = 'right';
|
||||
}
|
||||
return textCfg;
|
||||
}
|
||||
});
|
||||
chart.axis('tem', {
|
||||
grid: function grid(text) {
|
||||
if (text === '0%') {
|
||||
return {
|
||||
lineDash: null,
|
||||
lineWidth: 1
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
chart.tooltip({
|
||||
showCrosshairs: true
|
||||
});
|
||||
chart.legend({
|
||||
position: 'bottom',
|
||||
offsetY: 0,
|
||||
offsetX: 30
|
||||
});
|
||||
chart.area()
|
||||
.position('date*value')
|
||||
.color('name', [ '#009b69', '#9f8052' ])
|
||||
.shape('smooth')
|
||||
chart.line()
|
||||
.position('date*value')
|
||||
.color('name', [ '#009b69', '#9f8052' ])
|
||||
.shape('smooth', name=> {
|
||||
if (name === '预期收益率') {
|
||||
return 'line';
|
||||
}
|
||||
if (name === '实际收益率') {
|
||||
return 'dash';
|
||||
}
|
||||
});
|
||||
chart.render();
|
||||
return chart;
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 气泡漂浮 */
|
||||
.number-float{
|
||||
animation: 4s octfloat infinite;
|
||||
}
|
||||
@keyframes octfloat{
|
||||
0%{
|
||||
margin-top: 0;
|
||||
}
|
||||
50%{
|
||||
margin-top: 15rpx;
|
||||
}
|
||||
100%{
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
/* 背景旋转 */
|
||||
.number-rotate{
|
||||
animation: 30s octrotate infinite linear;
|
||||
}
|
||||
@keyframes octrotate{
|
||||
from{
|
||||
transform:rotate(0deg);
|
||||
}
|
||||
to{
|
||||
transform:rotate(360deg);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss">
|
||||
// 背景
|
||||
.content{
|
||||
background: $mian-color-deep;
|
||||
min-height: 100vh;
|
||||
padding-top: var(--status-bar-height);
|
||||
box-sizing: border-box;
|
||||
background-image: url(@/static/background/chain-back-00.png);
|
||||
background-size: 100%;
|
||||
background-position: top center;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
// 求助icon
|
||||
.help-icon{
|
||||
vertical-align: middle;
|
||||
margin-bottom: 4px;
|
||||
margin-left: $margin/2;
|
||||
opacity: .7;
|
||||
}
|
||||
// 原石账户
|
||||
.info{
|
||||
margin-top: calc(#{$margin * 2} + 60rpx);
|
||||
padding: var(--status-bar-height) $padding * 2 $padding * 3;
|
||||
text-align: center;
|
||||
.info-number{
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 568rpx;
|
||||
height: 568rpx;
|
||||
.number-background{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.info-content{
|
||||
position: absolute;
|
||||
top: 12%;
|
||||
left: 12%;
|
||||
width: 76%;
|
||||
height: 76%;
|
||||
background-image: url(@/static/background/chain-back-02.png);
|
||||
background-size: cover;
|
||||
color: white;
|
||||
.text{
|
||||
font-size: $title-size-m;
|
||||
text-shadow: 2rpx 2rpx 0 rgba($color: $mian-color-deep, $alpha: .5);
|
||||
}
|
||||
.number{
|
||||
font-weight: bold;
|
||||
font-size: $title-size + 8;
|
||||
line-height: 70rpx;
|
||||
text-shadow: 2rpx 2rpx 0 rgba($color: $mian-color-deep, $alpha: .5);
|
||||
}
|
||||
.login{
|
||||
margin-top: $margin;
|
||||
background-color: $mian-color;
|
||||
display: inline-block;
|
||||
padding: ( $padding / 2 ) $padding;
|
||||
font-size: $title-size-m;
|
||||
border-radius: 30rpx;
|
||||
border:solid 1rpx $mian-color-deep;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 预计增长
|
||||
.increase{
|
||||
margin: 0 ($margin + $margin / 2) ($margin * 2);
|
||||
background: rgba($color: $mian-color, $alpha: .1);
|
||||
text-align: center;
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
font-size: $title-size-m;
|
||||
color: $mian-color;
|
||||
border-radius: $radius-sm;
|
||||
padding: 0 $padding;
|
||||
}
|
||||
// 公告信息
|
||||
.notice{
|
||||
position: fixed;
|
||||
top: $margin * 2;
|
||||
left: $margin + $margin / 2;
|
||||
right: $margin + $margin / 2;
|
||||
padding-top: var(--status-bar-height);
|
||||
z-index: 99;
|
||||
.notice-swiper{
|
||||
height: 60rpx;
|
||||
}
|
||||
.notice-item{
|
||||
position: relative;
|
||||
height: 60rpx;
|
||||
padding-left: 80rpx;
|
||||
padding-right: $padding * 2;
|
||||
display: inline-block;
|
||||
background: rgba($color: $mian-color-deep, $alpha: .3);
|
||||
border-radius: 30rpx;
|
||||
box-sizing: border-box;
|
||||
max-width: 100%;
|
||||
.notice-cover{
|
||||
position: absolute;
|
||||
height: 60rpx;
|
||||
width: 60rpx;
|
||||
left: 0;
|
||||
top: 0;
|
||||
background-color: $mian-color-deep;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.notice-title{
|
||||
line-height: 60rpx;
|
||||
color: white;
|
||||
font-size: $title-size-m;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 平台概况
|
||||
.situation{
|
||||
margin: 0 ($margin + $margin / 2);
|
||||
background-image: linear-gradient(to bottom, rgba($color: $mian-color, $alpha: .1), $mian-color-deep);
|
||||
border-radius: $radius-sm;
|
||||
padding: $padding;
|
||||
// 平台统计
|
||||
.header{
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: $margin*2;
|
||||
.number{
|
||||
color: white;
|
||||
font-size: $title-size + 4;
|
||||
font-weight: bold;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
.title{
|
||||
color: $mian-color;
|
||||
font-weight: bold;
|
||||
font-size: $title-size-sm;
|
||||
}
|
||||
.header-item{
|
||||
width: 50%;
|
||||
padding: $padding $padding / 2;
|
||||
box-sizing: border-box;
|
||||
&:first-child{
|
||||
width: 100%;
|
||||
.number{
|
||||
font-size: $title-size + 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 节点信息
|
||||
.node-info{
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin: 0 -$margin / 2;
|
||||
.node-item{
|
||||
background: rgba($color: $mian-color, $alpha: .2);
|
||||
width: calc(50% - #{$margin});
|
||||
margin: $margin / 2;
|
||||
padding: $padding;
|
||||
box-sizing: border-box;
|
||||
border-radius: $radius-sm;
|
||||
}
|
||||
.number{
|
||||
font-size: $title-size + 4;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
}
|
||||
.title{
|
||||
font-size: $title-size-m;
|
||||
font-weight: bold;
|
||||
color: rgba($color: white, $alpha: .7);
|
||||
}
|
||||
}
|
||||
// 图表
|
||||
.chart{
|
||||
background: rgba($color: $mian-color, $alpha: .2);
|
||||
padding: $padding;
|
||||
border-radius: $radius-sm;
|
||||
margin-top: $margin*2;
|
||||
.title{
|
||||
text-align: center;
|
||||
line-height: 80rpx;
|
||||
color: rgba($color: $mian-color, $alpha: 1.0);
|
||||
font-size: $title-size-m;
|
||||
}
|
||||
.chart-f2{
|
||||
height: 200px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -76,7 +76,6 @@
|
||||
</view>
|
||||
<view class="ios-bottom"></view>
|
||||
</uni-popup>
|
||||
<!-- :status="more" -->
|
||||
</view>
|
||||
</template>
|
||||
|
||||
@@ -1,353 +0,0 @@
|
||||
<template>
|
||||
<view v-if="!loding">
|
||||
<!-- 产品信息 -->
|
||||
<view class="goods">
|
||||
<image class="cover" :src="info.goods.cover" mode="aspectFill"></image>
|
||||
<view class="content">
|
||||
<view class="title nowrap">数字权证</view>
|
||||
<view class="text nowrap">锚定商品:{{info.goods.goods_name}}</view>
|
||||
<view class="text nowrap">提供企业:{{info.company.name}}</view>
|
||||
<view class="text nav-goods nowrap" @click="onGoods">查看锚定商品信息<uni-icons type="arrowright" size="12" color="#e93340"></uni-icons></view>
|
||||
</view>
|
||||
<view class="info">
|
||||
<view class="info-item">
|
||||
<label>转让用户</label>
|
||||
{{info.user.username}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>转让单价</label>
|
||||
¥{{info.price}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>出售数量</label>
|
||||
{{info.stock}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>剩余转让数量</label>
|
||||
{{info.surplus}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>区块HASH</label>
|
||||
{{info.hash}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>转让时间</label>
|
||||
{{info.created_at}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<button class="buy-btn" type="default" @click="openLay">我要购买</button>
|
||||
<!-- 购买弹窗 -->
|
||||
<uni-popup ref="buyLay" :safe-area="true" background-color="#ffffff">
|
||||
<view class="popup">
|
||||
<view class="title">我要购买</view>
|
||||
<view class="des">
|
||||
剩余转让数量
|
||||
<text>{{info.surplus}}</text>
|
||||
</view>
|
||||
<view class="des">
|
||||
数量
|
||||
<uni-number-box v-model='stock' :min="1" :max="info.surplus" @change="countPrice"></uni-number-box>
|
||||
</view>
|
||||
<view class="des">
|
||||
订单总价
|
||||
<text class="price">¥{{price}}</text>
|
||||
</view>
|
||||
<view class="btn" @click="buy">提交订单</view>
|
||||
</view>
|
||||
</uni-popup>
|
||||
<!-- 支付方式 -->
|
||||
<uni-popup ref="payLay" :safe-area="true" background-color="#ffffff">
|
||||
<view class="popup">
|
||||
<view class="title">支付方式</view>
|
||||
<radio-group class="pay-group" @change="payType">
|
||||
<view class="item">
|
||||
<label>
|
||||
<radio class="pay-radio" value="eb" checked color="#e93340" />
|
||||
<view class="pay-title">易货额支付</view>
|
||||
<view class="pay-sub-title">可用{{account.eb}},冻结{{account.frozenEb}}</view>
|
||||
</label>
|
||||
</view>
|
||||
<view class="item">
|
||||
<label>
|
||||
<radio class="pay-radio" value="wechat" color="#e93340" />
|
||||
<view class="pay-title">微信支付</view>
|
||||
</label>
|
||||
</view>
|
||||
</radio-group>
|
||||
<view class="btn" @click="orderPay">立即支付</view>
|
||||
</view>
|
||||
</uni-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { marketsInfo, marketsBuy, marketsPay } from '@/apis/interfaces/market'
|
||||
import userAuth from '@/public/userAuth'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
payValue: 'eb',
|
||||
orderNo : '',
|
||||
price : '0.00',
|
||||
stock : 1,
|
||||
loding : true,
|
||||
info : {},
|
||||
account : {
|
||||
eb : '0.00',
|
||||
frozenEb: '0.00'
|
||||
}
|
||||
};
|
||||
},
|
||||
onShow() {
|
||||
marketsInfo(this.$Route.query.marketId).then(res =>{
|
||||
this.info = res
|
||||
this.price = res.price
|
||||
this.loding = false
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
methods:{
|
||||
// 查看锚定产品
|
||||
onGoods(){
|
||||
this.$Router.push({name: 'marketGoods', params: { id: this.info.goods.goods_id }})
|
||||
},
|
||||
// 选择购买方式
|
||||
payType(e){
|
||||
this.payValue = e.detail.value
|
||||
},
|
||||
// 购买弹窗
|
||||
openLay(){
|
||||
let token = this.$store.getters.getToken
|
||||
if(token == ''){
|
||||
let userLogin = new userAuth()
|
||||
userLogin.Login()
|
||||
return
|
||||
}
|
||||
this.$refs.buyLay.open('bottom')
|
||||
},
|
||||
// 计算价格
|
||||
countPrice(e){
|
||||
this.price = (e * this.info.price).toFixed(2)
|
||||
},
|
||||
// 提交购买单
|
||||
buy(){
|
||||
marketsBuy(this.info.market_id, {
|
||||
qty: this.stock
|
||||
}).then(res => {
|
||||
this.account = res.account
|
||||
this.orderNo = res.market_order_no
|
||||
this.$refs.buyLay.close()
|
||||
this.$refs.payLay.open('bottom')
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 支付
|
||||
orderPay(){
|
||||
let data = {}
|
||||
marketsPay(this.orderNo, this.payValue).then(res => {
|
||||
switch (this.payValue){
|
||||
case 'eb':
|
||||
this.$refs.payLay.close()
|
||||
this.$Router.push({
|
||||
name : 'payResults',
|
||||
params : {
|
||||
index: 1,
|
||||
price: this.price,
|
||||
type : 'eb',
|
||||
total: '可在我的资产下我的权证中查看购买的数字权证'
|
||||
}
|
||||
})
|
||||
break
|
||||
case 'wechat':
|
||||
this.wxPay(JSON.parse(res))
|
||||
break
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 微信支付
|
||||
wxPay(payConfig){
|
||||
uni.requestPayment({
|
||||
provider : 'wxpay',
|
||||
orderInfo : payConfig,
|
||||
success : payRes => {
|
||||
console.log(payRes)
|
||||
},
|
||||
fail : payErr => {
|
||||
uni.showToast({
|
||||
title: payErr.errMsg,
|
||||
icon : 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 支付方式
|
||||
.pay-group{
|
||||
margin: 0 ($margin * 2);
|
||||
.item{
|
||||
position: relative;
|
||||
border-bottom: solid 1rpx $border-color;
|
||||
padding: $padding 0;
|
||||
&:last-child{
|
||||
border-bottom: none;
|
||||
}
|
||||
.pay-radio{
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 50%;
|
||||
margin-top: -25rpx;
|
||||
}
|
||||
.pay-sub-title{
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
.pay-title{
|
||||
font-weight: bold;
|
||||
line-height: 50rpx;
|
||||
color: $text-color;
|
||||
font-size: $title-size-lg;
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 我要购买按钮
|
||||
.buy-btn{
|
||||
margin: 0 $margin;
|
||||
background: $text-price;
|
||||
color: white;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
padding: 0;
|
||||
border-radius: $radius/2;
|
||||
font-size: $title-size;
|
||||
font-weight: bold;
|
||||
&::after{
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
// 产品信息
|
||||
.goods{
|
||||
min-height: 168rpx;
|
||||
position: relative;
|
||||
background: white;
|
||||
border-radius: $radius/2;
|
||||
margin: $margin;
|
||||
padding: $padding;
|
||||
.cover{
|
||||
position: absolute;
|
||||
left: $padding;
|
||||
top: $padding;
|
||||
width: 168rpx;
|
||||
height: 168rpx;
|
||||
}
|
||||
.content{
|
||||
padding-left: calc(168rpx + #{$padding});
|
||||
.title{
|
||||
position: relative;
|
||||
font-size: $title-size-lg;
|
||||
color: $text-color;
|
||||
font-weight: bold;
|
||||
line-height: 52rpx;
|
||||
padding-right: 60rpx;
|
||||
text{
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
width: 60rpx;
|
||||
text-align: right;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
.text{
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
height: 40rpx;
|
||||
line-height: 40rpx;
|
||||
&.nav-goods{
|
||||
color: $text-price;
|
||||
}
|
||||
}
|
||||
}
|
||||
.info{
|
||||
margin-top: $margin;
|
||||
border-top: solid 1rpx $border-color;
|
||||
padding-top: $padding;
|
||||
.info-item{
|
||||
padding-left: 200rpx;
|
||||
height: 60rpx;
|
||||
line-height: 60rpx;
|
||||
position: relative;
|
||||
text-align: right;
|
||||
font-size: $title-size-m;
|
||||
@extend .nowrap;
|
||||
label{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 200rpx;
|
||||
text-align: left;
|
||||
color: $text-gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 购买产品
|
||||
.popup {
|
||||
width: 100%;
|
||||
background-color: #fff;
|
||||
padding-bottom: $padding;
|
||||
.title {
|
||||
font-size: 36rpx;
|
||||
text-align: center;
|
||||
padding: 50rpx 30rpx 30rpx 30rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.btn {
|
||||
background-color: $text-price;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
font-size: $title-size;
|
||||
margin: $padding * 2;
|
||||
border-radius: $radius/2;
|
||||
}
|
||||
.des {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
box-sizing: border-box;
|
||||
padding: $padding $padding * 2;
|
||||
color: $text-gray;
|
||||
font-size: $title-size-lg;
|
||||
text{
|
||||
color: $text-color;
|
||||
}
|
||||
.price{
|
||||
color: $main-color;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,116 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="goods-cover">
|
||||
<swiper class="swiper" circular indicator-dots indicator-active-color="#e93340">
|
||||
<swiper-item v-for="(item, index) in cover" :key="index">
|
||||
<view class="swiper-item">
|
||||
<image class="swiper-cover" :src="item" mode="aspectFill" />
|
||||
</view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
<view class="info">
|
||||
<view class="info-item">
|
||||
<label>锚定商品</label>
|
||||
{{info.name}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>商品规格</label>
|
||||
{{info.skusUnit}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>提供企业</label>
|
||||
{{info.companyName}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>企业诚信</label>
|
||||
{{info.integrity}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>权证销量</label>
|
||||
{{info.sales}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>发布时间</label>
|
||||
{{info.createdAt}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { goods } from '@/apis/interfaces/goods'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
cover: [],
|
||||
info : {}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
goods(this.$Route.query.id).then(res => {
|
||||
console.log(res)
|
||||
this.cover = res.pictures
|
||||
this.info = {
|
||||
name : res.name,
|
||||
companyName : res.company.name,
|
||||
createdAt : res.created_at,
|
||||
sales : res.sales,
|
||||
integrity : res.company.integrity,
|
||||
skusUnit : res.skus[0].unit
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// 数权
|
||||
.goods-cover{
|
||||
width: 100%;
|
||||
padding-top: 100%;
|
||||
position: relative;
|
||||
background: #f5f5f5;
|
||||
.swiper{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.swiper-item{
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
.swiper-cover{
|
||||
@extend .swiper-item;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 锚定商品详情
|
||||
.info{
|
||||
background: white;
|
||||
padding: $padding;
|
||||
.info-item{
|
||||
padding-left: 200rpx;
|
||||
height: 70rpx;
|
||||
line-height: 70rpx;
|
||||
position: relative;
|
||||
text-align: right;
|
||||
font-size: $title-size-m;
|
||||
@extend .nowrap;
|
||||
label{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 200rpx;
|
||||
text-align: left;
|
||||
color: $text-gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,153 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="tabs">
|
||||
<view class="tabs-item" :class="{'show': tabIndex == 0}" @click="onTabs" data-index="0">最新</view>
|
||||
<view class="tabs-item" :class="{'show': tabIndex == 1}" @click="onTabs" data-index="1">
|
||||
价格
|
||||
<image
|
||||
class="icon"
|
||||
mode="widthFix" :src="require(marketType == 'asc' ? '@/static/icons/market_icon_low.png': '@/static/icons/market_icon_high.png')"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
<view class="lists">
|
||||
<view class="item" v-for="(item, index) in marketArray" :key="index" @click="onDetails(item)">
|
||||
<image class="cover" :src="item.goods.cover" mode="aspectFill"></image>
|
||||
<view class="content">
|
||||
<view class="title nowrap">数字权证<text>{{item.surplus}}/{{item.stock}}</text></view>
|
||||
<view class="text nowrap">锚定商品:{{item.goods.goods_name}}</view>
|
||||
<view class="text nowrap">提供企业:{{item.company.name}}</view>
|
||||
<view class="text nowrap">转让用户:{{item.user.nickname}}</view>
|
||||
</view>
|
||||
<view class="price">¥{{item.price}}/个</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { markets } from '@/apis/interfaces/market'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tabIndex : 0,
|
||||
marketType : 'asc',
|
||||
marketArray : [],
|
||||
page : {}
|
||||
};
|
||||
},
|
||||
onShow() {
|
||||
this.getMarkets()
|
||||
},
|
||||
methods:{
|
||||
// 筛选产品
|
||||
onTabs(e){
|
||||
let index = e.target.dataset.index
|
||||
if(index == 0 && index == this.tabIndex) return
|
||||
if(index == 1 && index == this.tabIndex) this.marketType = this.marketType == 'asc' ? 'desc': 'asc'
|
||||
this.tabIndex = index
|
||||
this.getMarkets()
|
||||
},
|
||||
// 获取转让市场
|
||||
getMarkets(){
|
||||
markets({
|
||||
sort: this.tabIndex == 1 ? this.marketType : ''
|
||||
}).then(res => {
|
||||
this.marketArray = res.data
|
||||
this.page = res.page
|
||||
})
|
||||
},
|
||||
// 转让商品详情
|
||||
onDetails(e){
|
||||
this.$Router.push({name: 'marketDetails', params: {marketId: e.market_id}})
|
||||
console.log(e)
|
||||
}
|
||||
},
|
||||
onNavigationBarButtonTap(){
|
||||
this.$Router.push({name: "marketLogs"})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.tabs{
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 9;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
background: white;
|
||||
height: 70rpx;
|
||||
line-height: 70rpx;
|
||||
text-align: center;
|
||||
.tabs-item{
|
||||
font-size: $title-size-m;
|
||||
color: $text-gray;
|
||||
.icon{
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
vertical-align: middle;
|
||||
margin-left: $margin / 3;
|
||||
margin-bottom: 4rpx;
|
||||
}
|
||||
&.show{
|
||||
color: $text-price;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 列表
|
||||
.lists{
|
||||
padding: 70rpx $padding $padding;
|
||||
.item{
|
||||
min-height: 168rpx;
|
||||
position: relative;
|
||||
background: white;
|
||||
border-radius: $radius/2;
|
||||
margin-top: $margin;
|
||||
padding: $padding;
|
||||
.cover{
|
||||
position: absolute;
|
||||
left: $padding;
|
||||
top: $padding;
|
||||
width: 168rpx;
|
||||
height: 168rpx;
|
||||
}
|
||||
.content{
|
||||
padding-left: calc(168rpx + #{$padding});
|
||||
.title{
|
||||
position: relative;
|
||||
font-size: $title-size-lg;
|
||||
color: $text-color;
|
||||
font-weight: bold;
|
||||
line-height: 52rpx;
|
||||
padding-right: 60rpx;
|
||||
text{
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
width: 60rpx;
|
||||
text-align: right;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
.text{
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
height: 40rpx;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
}
|
||||
.price{
|
||||
margin-top: $margin - 10;
|
||||
padding-top: $padding - 10;
|
||||
font-size: $title-size-m;
|
||||
text-align: right;
|
||||
border-top: solid 1rpx $border-color;
|
||||
font-weight: bold;
|
||||
color: $text-price;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,166 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="tabs" v-if="$Route.query.type === 'my'">
|
||||
<view class="item" :class="{ 'show' : tab == 'sell'}" @click="onTasb('sell')">我转让的</view>
|
||||
<view class="item" :class="{ 'show' : tab == 'buys' }" @click="onTasb('buys')">我买到的</view>
|
||||
</view>
|
||||
<block v-if="logs.length > 0">
|
||||
<view :class="{'paddingTop': $Route.query.type === 'my'}">
|
||||
<view class="logs" v-for="(item, index) in logs" :key="index">
|
||||
<view class="logs-item">
|
||||
<label>交易权证</label>
|
||||
{{item.goods.goods_name}}
|
||||
</view>
|
||||
<view class="logs-item">
|
||||
<label>交易单价</label>
|
||||
¥{{item.price}}
|
||||
</view>
|
||||
<view class="logs-item">
|
||||
<label>交易数量</label>
|
||||
{{item.qty}}
|
||||
</view>
|
||||
<view class="logs-item">
|
||||
<label>转让用户</label>
|
||||
{{item.sellUser.nickname}}
|
||||
</view>
|
||||
<view class="logs-item">
|
||||
<label>购买用户</label>
|
||||
{{item.buyUser.nickname}}
|
||||
</view>
|
||||
<view class="logs-item">
|
||||
<label>交易时间</label>
|
||||
{{item.created_at}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="list-null">
|
||||
<image class="icon" src="@/static/icons/listnull-icon.png" mode="widthFix" />
|
||||
<view class="sub-title">暂无数据</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { marketsLogs, marketsOrdersLogs } from '@/apis/interfaces/market'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
logs: [],
|
||||
page: {},
|
||||
tab : 'sell'
|
||||
};
|
||||
},
|
||||
created(){
|
||||
this.getList()
|
||||
},
|
||||
methods:{
|
||||
onTasb(e){
|
||||
this.tab = e
|
||||
this.getList()
|
||||
},
|
||||
// 获取列表
|
||||
getList(){
|
||||
if(this.$Route.query.type === 'my'){
|
||||
marketsOrdersLogs({}, this.tab).then(res =>{
|
||||
console.log(res)
|
||||
this.logs = res.data
|
||||
this.page = res.page
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
return
|
||||
}
|
||||
marketsLogs().then(res => {
|
||||
this.logs = res.data
|
||||
this.page = res.page
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.tabs{
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
z-index: 99;
|
||||
background-color: white;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
.item{
|
||||
border-bottom: solid 2rpx white;
|
||||
box-sizing: border-box;
|
||||
&.show{
|
||||
border-color: $text-price;
|
||||
color: $text-price;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.paddingTop{
|
||||
padding-top: 90rpx;
|
||||
}
|
||||
|
||||
.logs{
|
||||
background: white;
|
||||
margin-top: $margin;
|
||||
padding: ($padding - 10) $padding;
|
||||
.logs-item{
|
||||
padding-left: 200rpx;
|
||||
height: 50rpx;
|
||||
line-height: 50rpx;
|
||||
position: relative;
|
||||
text-align: right;
|
||||
font-size: $title-size-m;
|
||||
@extend .nowrap;
|
||||
label{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 200rpx;
|
||||
text-align: left;
|
||||
color: $text-gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 空提示
|
||||
.list-null{
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
box-sizing: border-box;
|
||||
text-align: center;
|
||||
background: white;
|
||||
padding-bottom: 20vh;
|
||||
@extend .vertical;
|
||||
.sub-title{
|
||||
color: $text-gray;
|
||||
font-size: $title-size-m;
|
||||
}
|
||||
.icon{
|
||||
width: 288rpx;
|
||||
}
|
||||
}
|
||||
.employees-null{
|
||||
text-align: center;
|
||||
line-height: 10vh;
|
||||
padding-bottom: $padding;
|
||||
font-size: $title-size-m;
|
||||
color: $text-gray;
|
||||
}
|
||||
</style>
|
||||
@@ -1,169 +0,0 @@
|
||||
<template>
|
||||
<view class="NumberWeight">
|
||||
<!-- 有订单列表 -->
|
||||
<view v-if="lists.length > 0">
|
||||
<block v-for="(item, index) in lists" :key="index">
|
||||
<view class="order-item">
|
||||
<view class="order-info">
|
||||
<image class="order-cover" :src="item.goods.cover" mode="aspectFill"></image>
|
||||
<view class="title">数字权证<text>{{item.surplus}}/{{item.stock}}</text></view>
|
||||
<view class="text">锚定商品:{{item.goods.goods_name}}</view>
|
||||
<view class="text">交易哈希:{{item.hash}}</view>
|
||||
<view class="text">发布时间:{{item.created_at}}</view>
|
||||
</view>
|
||||
<view class="order-tool">
|
||||
<view class="price">{{item.price}}/个</view>
|
||||
<view class="order-btn" v-if="item.status.value === 1" @click="removeGoods(item.market_id, index)">取消转让</view>
|
||||
<view class="order-status" v-if="item.status.value === 2">{{item.status.text}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<!-- 没有订单列表 -->
|
||||
<no-list v-if="lists.length === 0" name="no-order" txt="暂无数据~" />
|
||||
<u-toast ref="uToast" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { marketsMag, marketsCancel } from '@/apis/interfaces/market';
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
lists: [],
|
||||
page: 1,
|
||||
total: 0
|
||||
};
|
||||
},
|
||||
onLoad() {
|
||||
this.getList();
|
||||
},
|
||||
onReachBottom() {
|
||||
if (this.total > this.lists.length) {
|
||||
this.page = this.page + 1;
|
||||
this.getList();
|
||||
} else {
|
||||
this.$refs.uToast.show({
|
||||
title: '吼吼吼~我是有底的~',
|
||||
type: 'error',
|
||||
icon: false,
|
||||
duration: 3000
|
||||
});
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getList() {
|
||||
let data = {
|
||||
perPage: 10,
|
||||
page: this.page
|
||||
};
|
||||
marketsMag(data)
|
||||
.then(res => {
|
||||
console.log(res.markets.data);
|
||||
this.lists = this.lists.concat(res.markets.data);
|
||||
this.total = res.markets.page.total;
|
||||
})
|
||||
.catch(err => {
|
||||
this.$refs.uToast.show({
|
||||
title: err.message,
|
||||
type: 'error',
|
||||
icon: false,
|
||||
duration: 3000
|
||||
});
|
||||
});
|
||||
},
|
||||
// 取消转让
|
||||
removeGoods(id, index) {
|
||||
marketsCancel(id).then(res => {
|
||||
uni.showToast({
|
||||
icon : 'none',
|
||||
title: res
|
||||
})
|
||||
let statusObj = this.lists[index]
|
||||
statusObj.status = {
|
||||
value: 2,
|
||||
text : '已取消',
|
||||
}
|
||||
this.$set(this.lists, index, statusObj)
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
icon : 'none',
|
||||
title: err.message
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
onNavigationBarButtonTap(){
|
||||
this.$Router.push({name: "marketLogs", params: {type: 'my'}})
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.NumberWeight {
|
||||
box-sizing: border-box;
|
||||
// 订单列表
|
||||
.order-item {
|
||||
background-color: white;
|
||||
margin: $margin;
|
||||
border-radius: $radius;
|
||||
padding: $padding;
|
||||
.order-info{
|
||||
position: relative;
|
||||
padding-left: 188rpx;
|
||||
min-height: 168rpx;
|
||||
.order-cover{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 168rpx;
|
||||
width: 168rpx;
|
||||
}
|
||||
.title{
|
||||
font-weight: bold;
|
||||
font-size: $title-size-lg;
|
||||
color: $text-color;
|
||||
line-height: 48rpx;
|
||||
height: 48rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
text{
|
||||
font-size: 80%;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
.text{
|
||||
line-height: 40rpx;
|
||||
height: 40rpx;
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
@extend .nowrap;
|
||||
}
|
||||
}
|
||||
.order-tool{
|
||||
margin-top: $margin - 10;
|
||||
padding-top: $padding - 10;
|
||||
border-top: solid 1rpx $border-color;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
.price{
|
||||
color: $text-price;
|
||||
font-weight: bold;
|
||||
font-size: $title-size-m;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
.order-btn{
|
||||
background: $text-price;
|
||||
color: white;
|
||||
padding: 0 $padding;
|
||||
line-height: 50rpx;
|
||||
border-radius: 25rpx;
|
||||
font-size: $title-size-m;
|
||||
}
|
||||
.order-status{
|
||||
color: $text-gray-m;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,239 +0,0 @@
|
||||
<template>
|
||||
<view v-if="!loding">
|
||||
<!-- 产品信息 -->
|
||||
<view class="goods">
|
||||
<image class="cover" :src="info.goods.cover" mode="aspectFill"></image>
|
||||
<view class="content">
|
||||
<view class="title nowrap">数字权证</view>
|
||||
<view class="text nowrap">锚定商品:{{info.goods.goods_name}}</view>
|
||||
<view class="text nowrap">提供企业:{{info.goods.company.name}}</view>
|
||||
<view class="text nav-goods nowrap" @click="onGoods">查看锚定商品信息<uni-icons type="arrowright" size="12" color="#e93340"></uni-icons></view>
|
||||
</view>
|
||||
<view class="info">
|
||||
<view class="info-item">
|
||||
<label>权证销售单价</label>
|
||||
1000.00
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>拥有数量</label>
|
||||
{{info.account.balance}}
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>转让价格</label>
|
||||
<input class="info-input" type="digit" v-model="pirce" placeholder="输入转让价格" maxlength="5" @blur="calculatePirce" />
|
||||
</view>
|
||||
<view class="info-item info-flex">
|
||||
<label>转让数量</label>
|
||||
<uni-number-box class="info-number" v-model='stock' :min="1" :max="info.account.balance" @change="countPrice"></uni-number-box>
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<label>预估转让收益</label>
|
||||
<view class="price">{{forecast}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<button class="buy-btn" type="default" @click="onCreate">确认转让</button>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { marketsCreateInfo, marketsCreate } from '@/apis/interfaces/market'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
loding : true,
|
||||
pirce : '',
|
||||
stock : 1,
|
||||
info : {},
|
||||
forecast: '0.00'
|
||||
};
|
||||
},
|
||||
onShow() {
|
||||
marketsCreateInfo(this.$Route.query.symbol).then(res =>{
|
||||
this.info = res
|
||||
this.loding = false
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
methods:{
|
||||
// 查看锚定产品
|
||||
onGoods(){
|
||||
this.$Router.push({name: 'marketGoods', params: { id: this.info.goods.goods_id }})
|
||||
},
|
||||
// 转让数量
|
||||
countPrice(e){
|
||||
this.stock = e
|
||||
this.calculatePirce()
|
||||
},
|
||||
// 计算预估收益
|
||||
calculatePirce(){
|
||||
this.forecast = (this.pirce * this.stock).toFixed(2)
|
||||
},
|
||||
// 提交转让市场
|
||||
onCreate(){
|
||||
marketsCreate({
|
||||
symbol : this.$Route.query.symbol,
|
||||
qty : this.stock,
|
||||
price : this.pirce || 0
|
||||
}).then(res => {
|
||||
uni.showModal({
|
||||
title : '提示',
|
||||
content : res,
|
||||
showCancel : false,
|
||||
success : () => {
|
||||
this.$Router.back()
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
console.log(err)
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 转让权证
|
||||
.buy-btn{
|
||||
margin: 0 $margin;
|
||||
background: $text-price;
|
||||
color: white;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
padding: 0;
|
||||
border-radius: $radius/2;
|
||||
font-size: $title-size;
|
||||
font-weight: bold;
|
||||
&::after{
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
// 产品信息
|
||||
.goods{
|
||||
min-height: 168rpx;
|
||||
position: relative;
|
||||
background: white;
|
||||
border-radius: $radius/2;
|
||||
margin: $margin;
|
||||
padding: $padding;
|
||||
.cover{
|
||||
position: absolute;
|
||||
left: $padding;
|
||||
top: $padding;
|
||||
width: 168rpx;
|
||||
height: 168rpx;
|
||||
}
|
||||
.content{
|
||||
padding-left: calc(168rpx + #{$padding});
|
||||
.title{
|
||||
position: relative;
|
||||
font-size: $title-size-lg;
|
||||
color: $text-color;
|
||||
font-weight: bold;
|
||||
line-height: 52rpx;
|
||||
padding-right: 60rpx;
|
||||
text{
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
width: 60rpx;
|
||||
text-align: right;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
.text{
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
height: 40rpx;
|
||||
line-height: 40rpx;
|
||||
&.nav-goods{
|
||||
color: $text-price;
|
||||
}
|
||||
}
|
||||
}
|
||||
.info{
|
||||
margin-top: $margin;
|
||||
border-top: solid 1rpx $border-color;
|
||||
padding-top: $padding;
|
||||
.info-item{
|
||||
padding-left: 200rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
position: relative;
|
||||
text-align: right;
|
||||
font-size: $title-size-lg;
|
||||
&.info-flex{
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
}
|
||||
@extend .nowrap;
|
||||
label{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 200rpx;
|
||||
text-align: left;
|
||||
color: $text-gray;
|
||||
}
|
||||
.info-input{
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
font-size: $title-size-lg;
|
||||
}
|
||||
.price{
|
||||
color: $text-price;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 购买产品
|
||||
.popup {
|
||||
width: 100%;
|
||||
background-color: #fff;
|
||||
padding-bottom: $padding;
|
||||
.title {
|
||||
font-size: 36rpx;
|
||||
text-align: center;
|
||||
padding: 50rpx 30rpx 30rpx 30rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.btn {
|
||||
background-color: $text-price;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
font-size: $title-size;
|
||||
margin: $padding * 2;
|
||||
border-radius: $radius/2;
|
||||
}
|
||||
.des {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
box-sizing: border-box;
|
||||
padding: $padding $padding * 2;
|
||||
color: $text-gray;
|
||||
font-size: $title-size-lg;
|
||||
text{
|
||||
color: $text-color;
|
||||
}
|
||||
.price{
|
||||
color: $main-color;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,249 +0,0 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<view class="codeContent">
|
||||
<image class="codeContent-back" src="../../static/icons/store_codeBack.png" mode="widthFix"></image>
|
||||
<image class="codeContent-cont" src="../../static/icons/store_contBack.png" mode="widthFix"></image>
|
||||
<view class="textContent">
|
||||
<view class="company">
|
||||
<image class="company-logo" :src="companyInfo.cover" mode="aspectFill"></image>
|
||||
<view class="company-cont">
|
||||
<view class="nowrap company-name">{{companyInfo.name}}</view>
|
||||
<view class="company-tips">易货平台</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="code">
|
||||
<image class="code-img" :src="companyInfo.code" mode="aspectFit"></image>
|
||||
<!-- <view class="code-text">简单扫一扫,即可进入平台</view> -->
|
||||
</view>
|
||||
<!-- @click="shareCanvas" -->
|
||||
<view class="codeBnt">
|
||||
扫码推广
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
|
||||
<canvas class="codeImg" canvas-id="qrcodeCard"></canvas>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { companiesCode } from '@/apis/interfaces/store'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
companyInfo : ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
companiesCode().then(res=>{
|
||||
this.companyInfo = res
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 绘制图片
|
||||
shareCanvas(e){
|
||||
uni.showLoading({
|
||||
title: '加载中',
|
||||
})
|
||||
|
||||
// 下载头像
|
||||
let avatarImg = new Promise(success=>{
|
||||
uni.getImageInfo({
|
||||
src : this.companyInfo.cover,
|
||||
success : res => {
|
||||
success(res.path)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// 下载二维码
|
||||
let codeImg = new Promise(success => {
|
||||
uni.getImageInfo({
|
||||
src : this.companyInfo.code,
|
||||
success : res => {
|
||||
success(res.path)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
Promise.all([avatarImg, codeImg]).then(res => {
|
||||
// 绘制海报
|
||||
const ctx = uni.createCanvasContext('qrcodeCard')
|
||||
ctx.save()
|
||||
|
||||
// 绘制背景图片
|
||||
ctx.drawImage('../../static/icons/store_downBack', 0, 0, 375, 603)
|
||||
|
||||
// 绘制头像
|
||||
ctx.drawImage(res[0], 0, 0, 60, 60)
|
||||
|
||||
// 绘制二维码
|
||||
ctx.drawImage(res[1], 140, 250, 110, 110)
|
||||
|
||||
// 文字
|
||||
ctx.setFontSize(16)
|
||||
ctx.fillText(this.companyInfo.name, 194, 180 , 270)
|
||||
|
||||
ctx.setFontSize(16)
|
||||
ctx.fillText('邀请你加入易货平台', 194, 180 , 270)
|
||||
|
||||
ctx.save();
|
||||
ctx.beginPath(); //开始绘制
|
||||
ctx.arc(50 / 2 + 170, 50 / 2 + 110, 50 / 2, 0, Math.PI * 2, false);
|
||||
ctx.clip();
|
||||
|
||||
// 保存图片
|
||||
ctx.draw(true, () => {
|
||||
uni.hideLoading()
|
||||
uni.canvasToTempFilePath({
|
||||
canvasId: 'qrcodeCard',
|
||||
x: 0,
|
||||
y: 0,
|
||||
success: res => {
|
||||
uni.saveImageToPhotosAlbum({
|
||||
filePath: res.tempFilePath,
|
||||
success : res=>{
|
||||
if (res.errMsg == "saveImageToPhotosAlbum:ok"){
|
||||
uni.showToast({
|
||||
title: '分享海报已保存至相册',
|
||||
icon : 'none'
|
||||
})
|
||||
}else{
|
||||
uni.hideLoading()
|
||||
}
|
||||
},
|
||||
fail : err=>{
|
||||
if (err.errMsg == "saveImageToPhotosAlbum:fail auth deny"){
|
||||
uni.showModal({
|
||||
title : '提示',
|
||||
content : '暂未授权小程序写入您的相册,无法存储二维码海报',
|
||||
confirmColor: '#d82526',
|
||||
confirmText : '去设置',
|
||||
success : res=>{
|
||||
if (res.confirm){
|
||||
uni.openSetting()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
}).catch(err=>{
|
||||
uni.showToast({
|
||||
title: '海报下载,请检查网络',
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.content {
|
||||
background-color: #e93340;
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
}
|
||||
|
||||
.codeContent {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
.codeContent-back {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
}
|
||||
.codeContent-cont {
|
||||
left: 5%;
|
||||
width: 90%;
|
||||
top: 100px;
|
||||
z-index: 2;
|
||||
position: absolute;
|
||||
}
|
||||
.codeContent-tips {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 20rpx;
|
||||
width: 200rpx;
|
||||
z-index: 2;
|
||||
}
|
||||
.textContent {
|
||||
position: absolute;
|
||||
padding: 20rpx 20rpx 0 40rpx;
|
||||
box-sizing: border-box;
|
||||
width: 70%;
|
||||
z-index: 3;
|
||||
left: 15%;
|
||||
right: 15%;
|
||||
top: 140px;
|
||||
}
|
||||
.company {
|
||||
width: 100%;
|
||||
.company-logo {
|
||||
width: 120rpx;
|
||||
height: 120rpx;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.company-cont {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 230rpx;
|
||||
left: 0;
|
||||
top: 0;
|
||||
padding: 20rpx 20rpx 30rpx 210rpx;
|
||||
font-size: $title-size;
|
||||
.company-name {
|
||||
font-weight: 600;
|
||||
margin: 10rpx 0;
|
||||
}
|
||||
.company-tips {
|
||||
font-size: 26rpx;
|
||||
color: #787878;
|
||||
}
|
||||
}
|
||||
}
|
||||
.code {
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
margin-bottom: $margin;
|
||||
.code-img {
|
||||
width: 90%;
|
||||
}
|
||||
.code-text {
|
||||
color: #787878;
|
||||
margin-top: $margin - 10;
|
||||
font-size: $title-size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.codeBnt {
|
||||
background-color: #e1293f;
|
||||
text-align: center;
|
||||
border-radius: 10rpx;
|
||||
line-height: 90rpx;
|
||||
font-weight: 600;
|
||||
font-size: $title-size;
|
||||
color: #FFFFFF;
|
||||
box-shadow: 4rpx 0 10rpx rgba(155,0,19,.5);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* canvas */
|
||||
.codeImg {
|
||||
position: absolute;
|
||||
left: -1000%;
|
||||
height: 603px;
|
||||
width: 375px;
|
||||
background: white;
|
||||
}
|
||||
</style>
|
||||
@@ -1,141 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<!-- 订单分类 -->
|
||||
<scroll-view class="nav" scroll-x="true" scroll-with-animation="true">
|
||||
<view :class="['nav-item', selectNavId === item.state ? 'nav-item-selected':'']" v-for="(item,index) in navList" :key="index" @click="selectNav(item.state)">
|
||||
{{item.name}}
|
||||
</view>
|
||||
</scroll-view>
|
||||
|
||||
<!-- 订单列表 -->
|
||||
<store-order v-if="returnInfo.length > 0" :list="returnInfo" listType="deliver" />
|
||||
|
||||
<view v-else class="pack-center">
|
||||
<image src="../../static/icons/order-null.png"></image>
|
||||
<view>您还没有相关订单</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { storeDeliver } from '@/apis/interfaces/store'
|
||||
import storeOrder from '@/components/store-order/store-order'
|
||||
export default {
|
||||
comments:{
|
||||
storeOrder
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
returnInfo : '' ,// 列表
|
||||
navList : [{
|
||||
name : '待发货',
|
||||
state : '1'
|
||||
},{
|
||||
name : '已发货',
|
||||
state : '2'
|
||||
},{
|
||||
name : '待提货',
|
||||
state : '3'
|
||||
},{
|
||||
name : '已提货',
|
||||
state : '4'
|
||||
}
|
||||
],
|
||||
selectNavId : '1'
|
||||
}
|
||||
},
|
||||
created() {
|
||||
},
|
||||
onShow() {
|
||||
// 获取退货单列表
|
||||
this.returnData();
|
||||
},
|
||||
methods: {
|
||||
// 退货单列表
|
||||
returnData(){
|
||||
storeDeliver(this.selectNavId).then(res=>{
|
||||
console.log(res)
|
||||
this.returnInfo = res.data
|
||||
})
|
||||
},
|
||||
|
||||
// 选择订单
|
||||
selectNav(id) {
|
||||
if (this.selectNavId !== id) {
|
||||
this.selectNavId = id
|
||||
this.returnData()
|
||||
}
|
||||
},
|
||||
|
||||
// 我要发货
|
||||
goSend(orderNo) {
|
||||
console.log(orderNo)
|
||||
return
|
||||
uni.showModal({
|
||||
title: '是否签收此订单?',
|
||||
success: res => {
|
||||
if(res.confirm) {
|
||||
storeSign(orderNo).then(() => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '签收成功'
|
||||
})
|
||||
setTimeout(()=>{
|
||||
this.returnData()
|
||||
},3000)
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: err.message
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 订单nav
|
||||
.nav {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
box-sizing: border-box;
|
||||
white-space: nowrap;
|
||||
font-size: $title-size*0.95;
|
||||
padding: 0 30rpx;
|
||||
background-color: #fff;
|
||||
color: #666;
|
||||
position: sticky;
|
||||
top: 0rpx;
|
||||
z-index: 1;
|
||||
.nav-item {
|
||||
width: 25%;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
border-bottom: solid 4rpx #fff;
|
||||
padding: 30rpx 0;
|
||||
}
|
||||
.nav-item-selected {
|
||||
color: $main-color;
|
||||
}
|
||||
}
|
||||
|
||||
// 暂无订单
|
||||
.pack-center {
|
||||
text-align: center;
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
padding-top: 50%;
|
||||
image {
|
||||
width: $uni-img-size-lg * 2;
|
||||
height:$uni-img-size-lg * 2;
|
||||
border-radius: $uni-border-radius-circle;
|
||||
margin-bottom: $margin;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,166 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<form @submit="sendSubmit">
|
||||
<view class="nickname">
|
||||
<view class="examineTitle">
|
||||
选择发货方式
|
||||
</view>
|
||||
<view class="toExamine" v-if="send.sendWay[send.sendIndex]">
|
||||
<picker mode="selector" :value="send.sendIndex" range-key="name" :range="send.sendWay" @change="wayChange">
|
||||
<view>{{send.sendWay[send.sendIndex].name}}</view>
|
||||
</picker>
|
||||
<image class="toExamine-row" src="../../static/icons/goods_row.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="nickname" v-if="send.sendIndex == 0">
|
||||
<view class="examineTitle">
|
||||
选择物流公司
|
||||
</view>
|
||||
<view class="toExamine" v-if="state.array[state.index]">
|
||||
<picker mode="selector" :value="state.index" range-key="name" :range="state.array" @change="sexChange">
|
||||
<view>{{state.array[state.index].name}}</view>
|
||||
</picker>
|
||||
<image class="toExamine-row" src="../../static/icons/goods_row.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="nickname" v-if="send.sendIndex == 0">
|
||||
<view class="examineTitle">
|
||||
填写物流单号
|
||||
</view>
|
||||
<input class="remarks" @blur="bindExpressNo" auto-height placeholder="" />
|
||||
</view>
|
||||
|
||||
<!-- 选择其他方式显示 -->
|
||||
<view class="nickname" v-if="send.sendIndex == 1">
|
||||
<view class="examineTitle">
|
||||
送货人姓名
|
||||
</view>
|
||||
<input class="remarks" name="courier_name" auto-height placeholder="" />
|
||||
</view>
|
||||
<view class="nickname" v-if="send.sendIndex == 1">
|
||||
<view class="examineTitle">
|
||||
送货人联系方式
|
||||
</view>
|
||||
<input class="remarks" name="courier_mobile" auto-height placeholder="" />
|
||||
</view>
|
||||
<button class="submit" form-type="submit" type="default">提交</button>
|
||||
</form>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { deliverFront, deliverForm } from '@/apis/interfaces/store'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
send : {
|
||||
sendWay : [{
|
||||
id : 'post',
|
||||
name : '邮寄'
|
||||
},{
|
||||
id : 'other',
|
||||
name : '其他'
|
||||
}],
|
||||
sendIndex : 0,
|
||||
},
|
||||
state : {
|
||||
// 快递筛选
|
||||
array : [],
|
||||
// 快递筛选默认下标
|
||||
index : 0,
|
||||
},
|
||||
expressNo : '',
|
||||
courierName : '',
|
||||
courierMobile : ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
deliverFront(this.$Route.query.id).then(res=>{
|
||||
this.state.array = res
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 选择发货方式
|
||||
wayChange(e) {
|
||||
this.send.sendIndex = e.detail.value
|
||||
this.expressNo = ''
|
||||
this.courierName = ''
|
||||
this.courierMobile = ''
|
||||
},
|
||||
|
||||
// 筛选
|
||||
sexChange(e) {
|
||||
this.state.index = e.detail.value
|
||||
},
|
||||
|
||||
// 物流单号
|
||||
bindExpressNo(val) {
|
||||
this.expressNo = val.detail.value
|
||||
},
|
||||
|
||||
// 送货人姓名
|
||||
bindCourierName(val) {
|
||||
this.courierName = val.detail.value
|
||||
},
|
||||
|
||||
// 送货人联系方式
|
||||
bindCourierMobile(val) {
|
||||
this.courierMobile = val.detail.value
|
||||
},
|
||||
|
||||
// 提交表单
|
||||
sendSubmit() {
|
||||
deliverForm(this.$Route.query.id,{
|
||||
type : this.send.sendWay[this.send.sendIndex].id || '',
|
||||
express_id : this.state.array[this.state.index].id || '',
|
||||
express_no : this.expressNo || '',
|
||||
courier_name : this.courierName || '',
|
||||
courier_mobile : this.courierMobile || ''
|
||||
}).then(res=>{
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '发送成功'
|
||||
})
|
||||
this.$Router.back()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.nickname {
|
||||
background-color: #FFFFFF;
|
||||
padding: $padding;
|
||||
margin-bottom: $margin;
|
||||
display: flex;
|
||||
position: relative;
|
||||
font-size: $title-size-lg;
|
||||
.examineTitle {
|
||||
width: 210rpx;
|
||||
}
|
||||
.remarks {
|
||||
width: calc(100% - 210rpx);
|
||||
font-size: $title-size-lg;
|
||||
color: $text-color;
|
||||
}
|
||||
.toExamine {
|
||||
position: absolute;
|
||||
top: $padding;
|
||||
right: $padding;
|
||||
display: flex;
|
||||
.toExamine-row {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin-top: 6rpx;
|
||||
filter: grayscale(100%);
|
||||
}
|
||||
}
|
||||
}
|
||||
.submit {
|
||||
background: #e93340;
|
||||
color: white;
|
||||
border-color: #e93340;
|
||||
margin: $margin*4 $margin 0;
|
||||
}
|
||||
</style>
|
||||
@@ -1,114 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<form @submit="sendSubmit">
|
||||
<view class="nickname">
|
||||
<view class="examineTitle">
|
||||
退换单操作
|
||||
</view>
|
||||
<view class="toExamine">
|
||||
<picker mode="selector" :value="state.index" range-key="name" :range="state.array" @change="sexChange">
|
||||
<view>{{state.array[state.index].name}}</view>
|
||||
</picker>
|
||||
<image class="toExamine-row" src="../../static/icons/goods_row.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="nickname">
|
||||
<view class="examineTitle">
|
||||
退换单备注:
|
||||
</view>
|
||||
<textarea class="remarks" @blur="bindTextAreaBlur" auto-height placeholder="请填写备注" />
|
||||
</view>
|
||||
|
||||
<button class="submit" form-type="submit" type="default">提交</button>
|
||||
</form>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { storeAudit } from '@/apis/interfaces/store'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
state : {
|
||||
// 退货单-筛选
|
||||
array : [{
|
||||
id : 'agree',
|
||||
name: '审核通过'
|
||||
},{
|
||||
id : 'refuse',
|
||||
name: '审核驳回'
|
||||
}],
|
||||
|
||||
// 退货单筛选默认下标
|
||||
index : 0,
|
||||
},
|
||||
remarks : ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
bindTextAreaBlur(val) {
|
||||
this.remarks = val.detail.value
|
||||
},
|
||||
|
||||
// 筛选
|
||||
sexChange(e) {
|
||||
this.state.index = e.detail.value
|
||||
},
|
||||
|
||||
sendSubmit(){
|
||||
let newState = this.state.array[this.state.index].id,
|
||||
newRemark = this.remarks
|
||||
storeAudit(this.$Route.query.id, {
|
||||
state : newState,
|
||||
remark: newRemark
|
||||
}).then(res=>{
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '审核成功'
|
||||
})
|
||||
this.$Router.back()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.nickname {
|
||||
background-color: #FFFFFF;
|
||||
padding: $padding;
|
||||
margin-bottom: $margin;
|
||||
display: flex;
|
||||
position: relative;
|
||||
font-size: $title-size-lg;
|
||||
.examineTitle {
|
||||
width: 210rpx;
|
||||
}
|
||||
.remarks {
|
||||
width: calc(100% - 210rpx);
|
||||
font-size: $title-size-lg;
|
||||
color: $text-color;
|
||||
}
|
||||
.toExamine {
|
||||
position: absolute;
|
||||
top: $padding;
|
||||
right: $padding;
|
||||
display: flex;
|
||||
.toExamine-row {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin-top: 6rpx;
|
||||
filter: grayscale(100%);
|
||||
}
|
||||
}
|
||||
}
|
||||
.submit {
|
||||
background: #e93340;
|
||||
color: white;
|
||||
border-color: #e93340;
|
||||
margin: $margin*4 $margin 0;
|
||||
}
|
||||
</style>
|
||||
@@ -1,296 +0,0 @@
|
||||
<template>
|
||||
<view class="content" v-if="!loding">
|
||||
<block v-if="this.$store.state.token != ''">
|
||||
<block v-if="!certification">
|
||||
<!-- 企业认证 -->
|
||||
<view class="statusBar">
|
||||
<view class="statusBar-title">企业工具</view>
|
||||
</view>
|
||||
<view class="store-login">
|
||||
<block v-if="appliesState.code === -1">
|
||||
<image class="icon" src="@/static/icons/approve-icon.png" mode="widthFix"></image>
|
||||
<view class="sub-title">{{appliesState.message}}</view>
|
||||
<button type="default" @click="onRightBtn">认证并开通</button>
|
||||
</block>
|
||||
<block v-else-if="appliesState.code === 2">
|
||||
<image class="icon" src="@/static/icons/approve-icon.png" mode="widthFix"></image>
|
||||
<view class="title">认证失败</view>
|
||||
<view class="sub-title">{{appliesState.message}}</view>
|
||||
<button type="default" @click="$Router.push({name: 'Approve', params: {formType: 'put'}})">重新提交认证</button>
|
||||
</block>
|
||||
<block v-else-if="appliesState.code === 0">
|
||||
<image class="icon" src="@/static/icons/audit-icon.png" mode="widthFix"></image>
|
||||
<view class="sub-title">{{appliesState.message}}</view>
|
||||
</block>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="statusBar">
|
||||
<view class="statusBar-box">
|
||||
<image class="logo" :src="company.logo" mode="aspectFill"></image>
|
||||
<view class="company">
|
||||
<view class="name">{{company.name}}<image @click="$Router.push({name: 'Basics'})" class="name-img" src="../../static/icons/store_icon_pen.png" mode="aspectFill"></image></view>
|
||||
<view class="tool">
|
||||
<view class="faith"><image class="faith-img" src="../../static/icons/store_icon_row.png" mode="aspectFill"></image>诚信{{company.faith}}</view>
|
||||
<view class="btn"><image class="btn-img" src="../../static/icons/store_icon_icon.png" mode="aspectFill"></image>{{company.identity}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 老板 -->
|
||||
<boss v-if="!employee" :word-data="workbench"/>
|
||||
<!-- 员工 -->
|
||||
<staff v-if="employee" :tool-list="toolList"/>
|
||||
</block>
|
||||
</block>
|
||||
<!-- 登录提示 -->
|
||||
<block v-else>
|
||||
<view class="statusBar">
|
||||
<view class="statusBar-title">企业工具</view>
|
||||
</view>
|
||||
<view class="store-login">
|
||||
<image class="icon" src="@/static/icons/login-icon.png" mode="widthFix"></image>
|
||||
<view class="sub-title">一键开启您的易货之旅</view>
|
||||
<button type="default" @click="login">登录</button>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { index } from '@/apis/interfaces/store'
|
||||
import { isallow, appliesQuery } from '@/apis/interfaces/company'
|
||||
import { employeesTool } from '@/apis/interfaces/employees'
|
||||
import boss from '@/components/store-boss/store-boss'
|
||||
import staff from '@/components/store-staff/store-staff'
|
||||
import userAuth from '@/public/userAuth'
|
||||
export default {
|
||||
components:{
|
||||
boss,
|
||||
staff
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loding : true,
|
||||
appliesState : {},
|
||||
certification: false,
|
||||
employee : false,
|
||||
workbench : {},
|
||||
company : {},
|
||||
toolList : ''
|
||||
}
|
||||
},
|
||||
onShow(){
|
||||
this.getIndex()
|
||||
},
|
||||
methods: {
|
||||
// 首页数据
|
||||
getIndex(){
|
||||
if(this.$store.state.token == ''){
|
||||
this.loding = false
|
||||
return
|
||||
}
|
||||
index().then(res => {
|
||||
this.certification = res.is_certification
|
||||
if(!res.is_certification){
|
||||
this.getAppliesQuery()
|
||||
return
|
||||
}
|
||||
this.company = {
|
||||
logo : res.cover,
|
||||
name : res.name,
|
||||
identity: res.company_identity,
|
||||
faith : res.integrity
|
||||
}
|
||||
this.workbench = {
|
||||
identity: res.identity_time,
|
||||
grade : res.identity_sign,
|
||||
top : res.top,
|
||||
middle : res.middle,
|
||||
order : res.order
|
||||
}
|
||||
this.employee = res.is_employee
|
||||
this.loding = false
|
||||
|
||||
// 若为员工身份-则调取员工管理信息
|
||||
if(res.is_employee) {
|
||||
employeesTool().then(res=>{
|
||||
this.toolList = res.permission
|
||||
})
|
||||
}
|
||||
|
||||
}).catch(err =>{
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 查询企业认证状态
|
||||
getAppliesQuery(){
|
||||
appliesQuery().then(res=>{
|
||||
this.appliesState = res
|
||||
this.loding = false
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 登录
|
||||
login(){
|
||||
let auth = new userAuth()
|
||||
auth.Login().then(res => {
|
||||
if(res.auth) this.getIndex()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 开通vip
|
||||
onRightBtn(){
|
||||
isallow().then(res =>{
|
||||
this.$Router.push({name: 'Approve'})
|
||||
}).catch(err =>{
|
||||
uni.showModal({
|
||||
title : '提示',
|
||||
content : '暂未开通商家vip无法开通店铺工具',
|
||||
confirmText : '立即开通',
|
||||
success : res=> {
|
||||
if(res.confirm){
|
||||
this.$Router.push({name: 'Vip'})
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 登录提示
|
||||
.store-login{
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
z-index: 9;
|
||||
background: white;
|
||||
text-align: center;
|
||||
@extend .vertical;
|
||||
button{
|
||||
margin-top: $margin*3;
|
||||
display: inline-block;
|
||||
width: 50%;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
border-radius: $radius/2;
|
||||
background: $text-price;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: $title-size;
|
||||
}
|
||||
.sub-title{
|
||||
color: $text-gray;
|
||||
font-size: $title-size-m;
|
||||
}
|
||||
.icon{
|
||||
width: 288rpx;
|
||||
}
|
||||
}
|
||||
// Bar
|
||||
.statusBar{
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
z-index: 99;
|
||||
background: $text-price;
|
||||
@extend .ios-top;
|
||||
.statusBar-box{
|
||||
min-height: 90rpx;
|
||||
position: relative;
|
||||
padding: $padding $padding $padding ($padding + 88);
|
||||
color: white;
|
||||
.logo{
|
||||
position: absolute;
|
||||
left: $padding;
|
||||
width: 94rpx;
|
||||
height: 94rpx;
|
||||
border-radius: 50%;
|
||||
border: 4rpx solid #ed8483;
|
||||
box-sizing: border-box;
|
||||
box-shadow: 0 4rpx 15rpx rgba(109,1,0,.8);
|
||||
}
|
||||
.company{
|
||||
width: calc(100% - 94rpx);
|
||||
padding-left: 30rpx;
|
||||
box-sizing: border-box;
|
||||
.name{
|
||||
line-height: 40rpx;
|
||||
@extend .nowrap;
|
||||
font-size: $title-size;
|
||||
.name-img {
|
||||
width: 30rpx;
|
||||
height: 30rpx;
|
||||
margin: 7rpx 0 0 15rpx;
|
||||
}
|
||||
}
|
||||
.tool {
|
||||
display: flex;
|
||||
margin-top: 13rpx;
|
||||
.faith{
|
||||
line-height: 40rpx;
|
||||
height: 38rpx;
|
||||
@extend .nowrap;
|
||||
font-size: 24rpx;
|
||||
background-color: rgba(0,0,0,.15);
|
||||
padding: 0 15rpx;
|
||||
border-radius: 60rpx;
|
||||
margin-right: 30rpx;
|
||||
display: flex;
|
||||
.faith-img {
|
||||
width: 28rpx;
|
||||
height: 28rpx;
|
||||
margin: 5rpx 4rpx 0 0;
|
||||
}
|
||||
}
|
||||
.btn{
|
||||
line-height: 40rpx;
|
||||
height: 38rpx;
|
||||
font-size: 24rpx;
|
||||
padding: 0 15rpx 0 30rpx;
|
||||
background-color: #913335;
|
||||
display: inline-block;
|
||||
border-radius: 0 60rpx 60rpx 0;
|
||||
position: relative;
|
||||
text-transform: uppercase;
|
||||
.btn-img {
|
||||
position: absolute;
|
||||
width: 38rpx;
|
||||
height: 38rpx;
|
||||
left: -20rpx;
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.statusBar-title{
|
||||
line-height: 88rpx;
|
||||
min-height: 88rpx;
|
||||
color: white;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.content{
|
||||
padding-top: calc(var(--status-bar-height) + #{$padding * 2} + 65rpx);
|
||||
padding-bottom: $padding;
|
||||
}
|
||||
</style>
|
||||
@@ -1,83 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="logsBack">
|
||||
<view class="logsList" v-for="(item ,index) in logArr" :key="index">
|
||||
<view class="logsLabel">
|
||||
<view class="logsLabel-name">操作来源:</view>
|
||||
<view class="logsTips" :class="[item.isMy ? 'active' : '']">{{ item.isMy ? '个人' : '商家' }}</view>
|
||||
</view>
|
||||
<view class="logsLabel" v-if="item.title">
|
||||
<view class="logsLabel-name">申请原因:</view>
|
||||
<view class="logsLabel-text">{{ item.title }}</view>
|
||||
</view>
|
||||
<view class="logsLabel" v-if="item.state_text">
|
||||
<view class="logsLabel-name">申请状态:</view>
|
||||
<view class="logsLabel-text">{{ item.state_text }}</view>
|
||||
</view>
|
||||
<view class="logsLabel" v-if="item.remark">
|
||||
<view class="logsLabel-name">补充描述:</view>
|
||||
<view class="logsLabel-text">{{ item.remark }}</view>
|
||||
</view>
|
||||
<view class="logsLabel">
|
||||
<view class="logsLabel-name">退款时间:</view>
|
||||
<view class="logsLabel-text">{{ item.created_at }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { orderJournal } from '@/apis/interfaces/store'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
logArr : '', //订单数组列表
|
||||
}
|
||||
},
|
||||
created() {
|
||||
orderJournal(this.$Route.query.id).then(res=>{
|
||||
this.logArr = res
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.logsBack {
|
||||
background: #f7f7f7;
|
||||
padding: $padding;
|
||||
box-sizing: border-box;
|
||||
font-size: $title-size-sm;
|
||||
.logsList {
|
||||
background: #fff;
|
||||
padding: $padding;
|
||||
box-sizing: border-box;
|
||||
border-radius: 10rpx;
|
||||
margin-bottom: $margin;
|
||||
position: relative;
|
||||
}
|
||||
.logsTips {
|
||||
color: #e1293f;
|
||||
&.active {
|
||||
color: #e1293f;
|
||||
}
|
||||
}
|
||||
.logsLabel {
|
||||
padding: $padding 0;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
.logsLabel-name {
|
||||
margin-right: $margin;
|
||||
width: 140rpx;
|
||||
}
|
||||
.logsLabel-text {
|
||||
color: $text-gray;
|
||||
width: calc(100% - 140rpx - #{$margin});
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,161 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<!-- 物流状态 start -->
|
||||
<view class="state" v-if="logistic.length > 0">
|
||||
<view class="take">
|
||||
<view class="take-tips">
|
||||
收
|
||||
</view>
|
||||
<view class="take-text">
|
||||
收货地址:发接口返回绝对是放假客户端上看见发货数据库大黄蜂教科书的浩丰科技
|
||||
</view>
|
||||
</view>
|
||||
<view class="list">
|
||||
<!-- v-for="(item, index) in logistic" :key="index" -->
|
||||
<view class="list-label">
|
||||
<view class="list-name">
|
||||
<text>发货中</text> 2020-15-12
|
||||
</view>
|
||||
<view class="list-time">
|
||||
华东师范邯郸市科技发货圣诞节客服
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="pack-center" v-else>
|
||||
<image src="../../static/icons/store_logistic.png" mode="aspectFill"></image>
|
||||
<view>{{message}} </view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { deliverLogistic } from '@/apis/interfaces/store'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
message : '',
|
||||
logistic: ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
deliverLogistic(this.$Route.query.id).then(res=>{
|
||||
console.log(res)
|
||||
}).catch(err => {
|
||||
this.message = err.message
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
page {
|
||||
background-color: #f6f6f6;
|
||||
}
|
||||
|
||||
// 物流状态
|
||||
.state {
|
||||
background-color: $uni-bg-color;
|
||||
margin-top: $margin;
|
||||
padding: $padding;
|
||||
font-size: $title-size-m;
|
||||
color: $text-gray;
|
||||
.take {
|
||||
display: flex;
|
||||
padding-bottom: $padding;
|
||||
position: relative;
|
||||
&::before {
|
||||
position: absolute;
|
||||
content: '';
|
||||
left: $uni-img-size-sm / 3 + 2;
|
||||
top: $margin;
|
||||
background-color: $uni-text-color-grey;
|
||||
width: 2rpx;
|
||||
height: 100%;
|
||||
}
|
||||
.take-tips {
|
||||
background-color: #e53d4c;
|
||||
width: $uni-img-size-sm;
|
||||
height: $uni-img-size-sm;
|
||||
border-radius: $uni-border-radius-circle;
|
||||
font-size: $title-size-sm;
|
||||
transform: scale(.9);
|
||||
text-align: center;
|
||||
color: $uni-text-color-inverse;
|
||||
margin-top: 10rpx;
|
||||
margin-left: -4rpx;
|
||||
}
|
||||
.take-text {
|
||||
margin-left: $margin;
|
||||
line-height: 40rpx;
|
||||
margin-top: $margin - 10;
|
||||
width: calc(100% - #{$uni-img-size-sm} + #{$margin});
|
||||
}
|
||||
}
|
||||
.list {
|
||||
font-size: $title-size-sm;
|
||||
.list-label {
|
||||
padding-left: $padding * 3;
|
||||
padding-bottom: $padding;
|
||||
padding-top: $padding - 10;
|
||||
position: relative;
|
||||
&::after {
|
||||
position: absolute;
|
||||
content: '';
|
||||
left: $uni-img-size-sm / 3 - 4;
|
||||
top: $margin;
|
||||
background-color: $uni-text-color-grey;
|
||||
width: $uni-img-size-sm / 3;
|
||||
height: $uni-img-size-sm / 3;
|
||||
border-radius: $uni-border-radius-circle;
|
||||
z-index: 9;
|
||||
}
|
||||
&::before {
|
||||
position: absolute;
|
||||
content: '';
|
||||
left: $uni-img-size-sm / 3 + 2;
|
||||
top: $margin;
|
||||
background-color: $uni-text-color-grey;
|
||||
width: 2rpx;
|
||||
height: 100%;
|
||||
}
|
||||
&:first-child {
|
||||
color: #e53d4c;
|
||||
}
|
||||
&:last-child::before {
|
||||
background-color: $uni-bg-color;
|
||||
}
|
||||
&:first-child::after {
|
||||
background-color: #e53d4c;
|
||||
}
|
||||
.list-name {
|
||||
margin-bottom: $margin - 10;
|
||||
text {
|
||||
font-weight: 600;
|
||||
padding-right: $padding;
|
||||
}
|
||||
}
|
||||
.list-time {
|
||||
font-size: $uni-font-size-sm;
|
||||
line-height: 34rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 暂无订单
|
||||
.pack-center {
|
||||
text-align: center;
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
padding-top: 50%;
|
||||
image {
|
||||
width: $uni-img-size-lg * 2;
|
||||
height:$uni-img-size-lg * 2;
|
||||
margin: 0 auto $margin;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,38 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<!-- 订单详情 -->
|
||||
<store-order-details :info="info" :listType="newType" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { deliverDetails, orderDetails } from '@/apis/interfaces/store'
|
||||
import storeOrderDet from '@/components/store-order-details/store-order-details'
|
||||
export default {
|
||||
comments:{
|
||||
storeOrderDet
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
info : '',
|
||||
newType : ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.newType = this.$Route.query.type
|
||||
if(this.$Route.query.type == 'deliver') {
|
||||
deliverDetails(this.$Route.query.id).then(res=>{
|
||||
this.info = res
|
||||
})
|
||||
return
|
||||
}
|
||||
orderDetails(this.$Route.query.id).then(res=>{
|
||||
this.info = res
|
||||
})
|
||||
|
||||
},
|
||||
methods: {}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
@@ -1,171 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<!-- 订单分类 -->
|
||||
<scroll-view class="nav" scroll-x="true" scroll-with-animation="true">
|
||||
<view :class="['nav-item', selectNavId === item.id ? 'nav-item-selected':'']" v-for="(item,index) in navList" :key="index" @click="selectNav(item.id)">
|
||||
{{item.name}}
|
||||
</view>
|
||||
</scroll-view>
|
||||
|
||||
<!-- 订单列表 -->
|
||||
<store-order v-if="returnInfo.length > 0" :list="returnInfo" />
|
||||
|
||||
<view v-else class="pack-center">
|
||||
<image src="../../static/icons/order-null.png"></image>
|
||||
<view>您还没有相关订单</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { storeReturn, storeSign, storeToken } from '@/apis/interfaces/store'
|
||||
import storeOrder from '@/components/store-order/store-order'
|
||||
export default {
|
||||
comments:{
|
||||
storeOrder
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
returnInfo : '' ,// 列表
|
||||
navList : [{
|
||||
name : '待审核',
|
||||
id : 'apply'
|
||||
},{
|
||||
name : '待返货',
|
||||
id : 'deliver'
|
||||
},{
|
||||
name : '待签收',
|
||||
id : 'delivered'
|
||||
},{
|
||||
name : '已签收',
|
||||
id : 'signed'
|
||||
},
|
||||
{
|
||||
name : '待确认退货',
|
||||
id : 'process'
|
||||
},
|
||||
{
|
||||
name : '完成退货',
|
||||
id : 'completed'
|
||||
}
|
||||
],
|
||||
selectNavId : 'apply'
|
||||
}
|
||||
},
|
||||
created() {
|
||||
},
|
||||
onShow() {
|
||||
// 获取退货单列表
|
||||
this.returnData();
|
||||
},
|
||||
methods: {
|
||||
// 退货单列表
|
||||
returnData(){
|
||||
storeReturn(this.selectNavId).then(res=>{
|
||||
this.returnInfo = res.data
|
||||
})
|
||||
},
|
||||
|
||||
// 选择订单
|
||||
selectNav(id) {
|
||||
if (this.selectNavId !== id) {
|
||||
this.selectNavId = id
|
||||
this.returnData()
|
||||
}
|
||||
},
|
||||
|
||||
// 签收订单
|
||||
goSign(orderNo,index) {
|
||||
uni.showModal({
|
||||
title: '是否签收此订单?',
|
||||
success: res => {
|
||||
if(res.confirm) {
|
||||
storeSign(orderNo).then(() => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '签收成功'
|
||||
})
|
||||
setTimeout(()=>{
|
||||
this.returnData()
|
||||
},3000)
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: err.message
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 确认退货
|
||||
goReToken(orderNo,index) {
|
||||
uni.showModal({
|
||||
title: '是否确认退货此订单?',
|
||||
success: res => {
|
||||
if(res.confirm) {
|
||||
storeToken(orderNo).then(() => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '退货成功'
|
||||
})
|
||||
setTimeout(()=>{
|
||||
this.returnData()
|
||||
},3000)
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: err.message
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 订单nav
|
||||
.nav {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
box-sizing: border-box;
|
||||
white-space: nowrap;
|
||||
font-size: $title-size*0.95;
|
||||
padding: 0 30rpx;
|
||||
background-color: #fff;
|
||||
color: #666;
|
||||
position: sticky;
|
||||
top: 0rpx;
|
||||
z-index: 1;
|
||||
.nav-item {
|
||||
display: inline-block;
|
||||
border-bottom: solid 4rpx #fff;
|
||||
padding: 30rpx 10rpx;
|
||||
margin-right: 10rpx;
|
||||
}
|
||||
.nav-item-selected {
|
||||
border-bottom: solid 4rpx $main-color;
|
||||
color: $main-color;
|
||||
}
|
||||
}
|
||||
|
||||
// 暂无订单
|
||||
.pack-center {
|
||||
text-align: center;
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
padding-top: 50%;
|
||||
image {
|
||||
width: $uni-img-size-lg * 2;
|
||||
height:$uni-img-size-lg * 2;
|
||||
border-radius: $uni-border-radius-circle;
|
||||
margin-bottom: $margin;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,206 +0,0 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- tabs -->
|
||||
<view class="tabs">
|
||||
<view class="item" :class="{'show': tabsIndex == 'day'}" @click="onTbas('day')">日访客</view>
|
||||
<view class="item" :class="{'show': tabsIndex == 'month'}" @click="onTbas('month')">月访客</view>
|
||||
<view class="item" :class="{'show': tabsIndex == 'year'}" @click="onTbas('year')">年访客</view>
|
||||
</view>
|
||||
<!-- 统计信息 -->
|
||||
<view class="statistics">
|
||||
<picker mode="date" :fields="tabsIndex" :value="dateValue" :end="endDate" @change="pickerDate">
|
||||
<view class="statistics-date">
|
||||
{{dateValue}}<uni-icons class="arrowdown" type="arrowdown" color="#555"></uni-icons>
|
||||
</view>
|
||||
</picker>
|
||||
<view class="statistics-text">
|
||||
<text>访客量 {{visitor.factor}} 人</text>
|
||||
<text>累计访客量 {{visitor.all}} 人</text>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 数据列表 -->
|
||||
<block v-if="orders.length > 0">
|
||||
<view class="lists">
|
||||
<view class="item" v-for="(item, index) in orders" :key="index">
|
||||
<image class="cover" :src="item.avatar" mode="aspectFill"></image>
|
||||
<view class="title">{{item.nickname || '-'}}</view>
|
||||
<view class="sub-title">访问记录: {{item.content || '-'}}</view>
|
||||
<view class="sub-title">手机号码: {{item.mobile || '-'}}</view>
|
||||
<view class="sub-title">访问时间: {{item.date || '-'}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="list-null">
|
||||
<image class="icon" src="@/static/icons/listnull-icon.png" mode="widthFix"></image>
|
||||
<view class="sub-title">暂无相关访客记录</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { visitors } from '@/apis/interfaces/store'
|
||||
import getDate from '@/public/date'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tabsIndex: 'day',
|
||||
dateValue: '',
|
||||
endDate : '',
|
||||
visitor : {
|
||||
factor: 0,
|
||||
all: 0
|
||||
},
|
||||
orders : []
|
||||
};
|
||||
},
|
||||
created() {
|
||||
getDate().then(res => {
|
||||
this.dateValue = res
|
||||
this.endDate = res
|
||||
this.getLists()
|
||||
})
|
||||
},
|
||||
methods:{
|
||||
// tabs筛选
|
||||
onTbas(type){
|
||||
getDate(type).then(res => {
|
||||
this.tabsIndex = type
|
||||
this.dateValue = res
|
||||
this.getLists()
|
||||
})
|
||||
},
|
||||
// 日期筛选
|
||||
pickerDate(e){
|
||||
let dateValue = e.detail.value
|
||||
this.dateValue = dateValue
|
||||
this.getLists()
|
||||
},
|
||||
// 获取列表
|
||||
getLists(){
|
||||
visitors({
|
||||
type: this.tabsIndex,
|
||||
date: this.dateValue
|
||||
}).then(res => {
|
||||
console.log(res)
|
||||
this.visitor = res.total
|
||||
this.orders = res.lists.data
|
||||
this.pages = res.lists.page
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// 空提示
|
||||
.list-null{
|
||||
width: 100vw;
|
||||
height: 40vh;
|
||||
background: white;
|
||||
text-align: center;
|
||||
@extend .vertical;
|
||||
.sub-title{
|
||||
color: $text-gray;
|
||||
font-size: $title-size-m;
|
||||
@extend .nowrap;
|
||||
}
|
||||
.icon{
|
||||
width: 288rpx;
|
||||
}
|
||||
}
|
||||
// content
|
||||
.content{
|
||||
padding-top: 80rpx;
|
||||
}
|
||||
// tabs
|
||||
.tabs{
|
||||
position: fixed;
|
||||
z-index: 9;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
background: white;
|
||||
justify-content: space-around;
|
||||
line-height: 80rpx;
|
||||
font-size: $title-size-m;
|
||||
color: $text-gray;
|
||||
.item.show{
|
||||
color: $text-price;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
// 统计信息
|
||||
.statistics{
|
||||
margin-top: $margin;
|
||||
background-color: white;
|
||||
border-bottom: solid 1rpx $border-color;
|
||||
padding: $padding;
|
||||
.statistics-date{
|
||||
font-size: $title-size + 4;
|
||||
font-weight: bold;
|
||||
line-height: 60rpx;
|
||||
.arrowdown{
|
||||
margin-left: $margin/2;
|
||||
}
|
||||
}
|
||||
.statistics-text{
|
||||
font-size: $title-size-sm;
|
||||
color: gray;
|
||||
line-height: 50rpx;
|
||||
text{
|
||||
margin-left: $margin;
|
||||
&:first-child{
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 客户列表
|
||||
.lists{
|
||||
padding: $padding/2 0;
|
||||
background: white;
|
||||
.item{
|
||||
padding: ($padding/2) $padding ($padding/2) ($padding*2 + 68);
|
||||
position: relative;
|
||||
min-height: 68rpx;
|
||||
&::after{
|
||||
position: absolute;
|
||||
left: $padding*2 + 68;
|
||||
top: 0;
|
||||
right: 0;
|
||||
content: ' ';
|
||||
border-bottom: solid 1rpx $border-color;
|
||||
}
|
||||
&:first-child::after{
|
||||
display: none;
|
||||
}
|
||||
.cover{
|
||||
position: absolute;
|
||||
left: $padding;
|
||||
top: $padding/2;
|
||||
width: 68rpx;
|
||||
height: 68rpx;
|
||||
border-radius: 50%;
|
||||
background: #eee;
|
||||
}
|
||||
.title{
|
||||
position: relative;
|
||||
line-height: 58rpx;
|
||||
font-size: $title-size-lg;
|
||||
}
|
||||
.sub-title{
|
||||
line-height: 40rpx;
|
||||
font-size: $title-size-sm;
|
||||
color: $text-gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,6 +1,13 @@
|
||||
<template>
|
||||
<view>
|
||||
节点中心
|
||||
<view class="btns">
|
||||
<view class="item" @click="$Router.push({name: 'instrumentBasics'})">基础信息</view>
|
||||
<view class="item" @click="$Router.push({name: 'goodsManagement'})">商品权证</view>
|
||||
<view class="item" @click="$Router.push({name: 'instrumentBasics'})">优惠券管理</view>
|
||||
<view class="item" @click="$Router.push({name: 'instrumentBasics'})">店员管理</view>
|
||||
<view class="item" @click="$Router.push({name: 'instrumentCustomer'})">成交客户</view>
|
||||
<view class="item" @click="$Router.push({name: 'instrumentBasics'})">店员管理</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
@@ -15,5 +22,15 @@
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
.btns{
|
||||
padding: 30rpx 0;
|
||||
.item{
|
||||
background: white;
|
||||
margin: $margin;
|
||||
border-radius: $radius/2;
|
||||
line-height: 90rpx;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
30
public/date.js
Normal file
@@ -0,0 +1,30 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 日期
|
||||
*/
|
||||
|
||||
export default getDate = (type) =>{
|
||||
return new Promise((resolve, reject) => {
|
||||
const date = new Date()
|
||||
const year = date.getFullYear()
|
||||
const month = (date.getMonth() + 1) <= 9 ? '0' + (date.getMonth() + 1) : date.getMonth()
|
||||
const day = date.getDate()
|
||||
|
||||
switch(type){
|
||||
case 'day':
|
||||
resolve(year + '-' + month + '-' + day)
|
||||
break
|
||||
case 'month':
|
||||
resolve(year + '-' + month)
|
||||
break
|
||||
case 'year':
|
||||
resolve(year)
|
||||
break
|
||||
default:
|
||||
resolve(year + '-' + month + '-' + day)
|
||||
}
|
||||
})
|
||||
}
|
||||
135
public/userAuth.js
Normal file
@@ -0,0 +1,135 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 登录
|
||||
*/
|
||||
|
||||
import { router } from '../router'
|
||||
import { keyAuth } from '../apis/interfaces/auth'
|
||||
import store from '../store'
|
||||
|
||||
class userAuth {
|
||||
constructor() {
|
||||
this.univerfyConfig = {
|
||||
fullScreen : true,
|
||||
authButton: {
|
||||
'title': '一键登录',
|
||||
'normalColor': '#c82626',
|
||||
'highlightColor': '#a61010',
|
||||
'disabledColor': '#d86767',
|
||||
'borderRadius': '0'
|
||||
},
|
||||
otherLoginButton: {
|
||||
'title': '其他手机号码',
|
||||
'borderColor': '#c82626',
|
||||
'borderRadius': '0',
|
||||
'textColor': '#c82626'
|
||||
},
|
||||
privacyTerms: {
|
||||
'checkedImage': '/static/icons/checked-icon.png',
|
||||
'uncheckedImage': '/static/icons/unchecked-icon.png',
|
||||
'textColor': '#555555',
|
||||
'termsColor': '#c82626',
|
||||
'suffix': '并使用本机号码登录/注册',
|
||||
'privacyItems': [{
|
||||
'url': 'https://www.baidu.com',
|
||||
'title': '用户隐私规格'
|
||||
},{
|
||||
'url': 'https://www.baidu.com',
|
||||
'title': '用户服务协议'
|
||||
}]
|
||||
},
|
||||
buttons: {
|
||||
'iconWidth': '45px',
|
||||
'list': [{
|
||||
"provider": '微信登录',
|
||||
"iconPath": '/static/icons/wechat.png',
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
||||
// 预登录
|
||||
Login(){
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.showLoading({
|
||||
title: '加载中',
|
||||
mask : true
|
||||
})
|
||||
uni.preLogin({
|
||||
provider: 'univerify',
|
||||
success : res=> {
|
||||
this.keyLogin().then(() => {
|
||||
resolve({
|
||||
auth: true
|
||||
})
|
||||
}).catch(errMsg => {
|
||||
reject(errMsg)
|
||||
})
|
||||
},
|
||||
fail : err=> {
|
||||
router.push({name: 'Login'})
|
||||
},
|
||||
complete() {
|
||||
uni.hideLoading()
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
// 一键登录
|
||||
keyLogin(){
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.login({
|
||||
provider : 'univerify',
|
||||
univerifyStyle : {...this.univerfyConfig},
|
||||
success: authResult => {
|
||||
keyAuth({
|
||||
access_token: authResult.authResult.access_token,
|
||||
openid : authResult.authResult.openid
|
||||
}).then(res => {
|
||||
uni.closeAuthView()
|
||||
store.commit('setToken', res.token_type + ' ' + res.access_token)
|
||||
resolve()
|
||||
if(!res.is_company){
|
||||
router.push({name: "Registered"})
|
||||
return
|
||||
}
|
||||
}).catch(err => {
|
||||
reject(err)
|
||||
})
|
||||
},
|
||||
fail : err => {
|
||||
uni.closeAuthView()
|
||||
switch(err.code){
|
||||
case 30002:
|
||||
router.push({name: "Login"})
|
||||
break
|
||||
case 30008:
|
||||
this.wechatAuth()
|
||||
break
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信登录
|
||||
*/
|
||||
wechatAuth(){
|
||||
uni.showToast({
|
||||
title: '微信登录',
|
||||
icon : 'none'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理登录状态维护
|
||||
*/
|
||||
updAuthToken(){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
export default userAuth
|
||||
@@ -9,9 +9,7 @@
|
||||
$text-color: #333;
|
||||
$text-gray: #555;
|
||||
$text-gray-m: #999;
|
||||
$text-price: #e93340;
|
||||
$main-color: #e93340;
|
||||
$main-color-light: #e93340;
|
||||
$text-price: #8b64fd;
|
||||
|
||||
// 边框颜色
|
||||
$border-color: #ddd;
|
||||
@@ -111,7 +109,6 @@ $padding: 30rpx;
|
||||
-webkit-line-clamp: 5;
|
||||
}
|
||||
|
||||
|
||||
// 修改nvtab
|
||||
$mainColor: white;
|
||||
|
||||
|
||||
BIN
static/icons/add-icon.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
static/icons/approve-icon.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
static/icons/audit-icon.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
static/icons/checked-icon.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
static/icons/e-logo-white.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
static/icons/e-logo.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
static/icons/equity_arrow_icon.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
static/icons/equity_arrow_right.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
static/icons/equity_arrow_up.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
static/icons/equity_coupons_01.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
static/icons/equity_coupons_02.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
static/icons/equity_coupons_03.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
static/icons/equity_nav.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
static/icons/fire.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
static/icons/goods_buy.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
static/icons/goods_close.png
Normal file
|
After Width: | Height: | Size: 558 B |
BIN
static/icons/goods_row.png
Normal file
|
After Width: | Height: | Size: 686 B |
BIN
static/icons/goods_spot.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
static/icons/listnull-icon.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
static/icons/login-icon.png
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
BIN
static/icons/market_icon_high.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
static/icons/market_icon_low.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
static/icons/order-null.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
static/icons/order_icon_00.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
static/icons/order_icon_01.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
static/icons/order_icon_02.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
static/icons/order_icon_03.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
static/icons/order_icon_04.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
static/icons/payWay_icon_00.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
static/icons/payWay_icon_01.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
static/icons/property_icon_00.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
static/icons/property_icon_01.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
static/icons/property_poster.png
Normal file
|
After Width: | Height: | Size: 585 B |
BIN
static/icons/search-icon.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
static/icons/store_codeBack.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
static/icons/store_contBack.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
static/icons/store_down.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
static/icons/store_downBack.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
static/icons/store_icon_icon.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
static/icons/store_icon_pen.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
static/icons/store_icon_row.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
static/icons/store_icon_vip.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
static/icons/store_logistic.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/icons/ticket-icon.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
static/icons/tool_icon_00.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
static/icons/tool_icon_01.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
static/icons/tool_icon_02.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
static/icons/tool_icon_03.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
static/icons/tool_icon_04.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
static/icons/tool_icon_05.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
static/icons/tool_icon_06.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
static/icons/tool_icon_07.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
static/icons/tool_icon_08.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
static/icons/unchecked-icon.png
Normal file
|
After Width: | Height: | Size: 944 B |
BIN
static/icons/user_icon_00.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
static/icons/user_icon_01.png
Normal file
|
After Width: | Height: | Size: 9.6 KiB |
BIN
static/icons/user_icon_02.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
static/icons/user_icon_03.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
static/icons/user_icon_04.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
static/icons/vip_icon.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
static/icons/vip_pay_title.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
static/icons/vip_privilege_tips.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
static/icons/vip_privilege_tittle.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
static/icons/vip_yearsIcon.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
static/icons/wechat.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 3.5 KiB |