作者 卢胜

bugxiugai

正在显示 48 个修改的文件 包含 3894 行增加1048 行删除
... ... @@ -14,7 +14,6 @@
console.log('获取code');
getApp().authorization()
} else if (e.query.code) {
console.log(2);
getApp().getOpenid(e.query.code)
}
// else {
... ... @@ -106,7 +105,12 @@
display: flex;
align-items: center;
}
.flexbetom {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
}
.fw700 {
font-weight: 700;
}
... ...
... ... @@ -48,6 +48,9 @@ export const sort_list = (data) => request({url: 'arc/sort_list',method: 'post'
export const arc_list = (data) => request({url: 'arc/arc_list',method: 'post',data: data})
// 详情资讯
export const arc_detail = (arc_id) => request({url: 'arc/arc_detail',method: 'post',data: {arc_id}})
export const arc_detail = (arc_id,url) => request({url: 'arc/arc_detail',method: 'post',data: {arc_id,url}})
// 全部分类
export const sort_all = (keyword) => request({url: 'product/sort_all',method: 'post',data: {keyword}})
\ No newline at end of file
export const sort_all = (keyword) => request({url: 'product/sort_all',method: 'post',data: {keyword}})
//搜索弹窗分类
export const sort_search = (keyword) => request({url: 'product/sort_search',method: 'post',data: {keyword}})
... ...
<template>
<!--增加audio标签支持-->
<audio
:id="node.attr.id"
:class="node.classStr"
:style="node.styleStr"
:src="node.attr.src"
:loop="node.attr.loop"
:poster="node.attr.poster"
:name="node.attr.name"
:author="node.attr.author"
controls></audio>
</template>
<script>
export default {
name: 'wxParseAudio',
props: {
node: {
type: Object,
default() {
return {};
},
},
},
};
</script>
... ...
<template>
<image
:mode="node.attr.mode"
:lazy-load="node.attr.lazyLoad"
:class="node.classStr"
:style="newStyleStr || node.styleStr"
:data-src="node.attr.src"
:src="node.attr.src"
@tap="wxParseImgTap"
@load="wxParseImgLoad"
/>
</template>
<script>
export default {
name: 'wxParseImg',
data() {
return {
newStyleStr: '',
preview: true,
};
},
props: {
node: {
type: Object,
default() {
return {};
},
},
},
methods: {
wxParseImgTap(e) {
if (!this.preview) return;
const { src } = e.currentTarget.dataset;
if (!src) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {// TODO 遍历获取父节点执行方法
parent = parent.$parent;
}
parent.preview(src, e);
},
// 图片视觉宽高计算函数区
wxParseImgLoad(e) {
const { src } = e.currentTarget.dataset;
if (!src) return;
const { width, height } = e.mp.detail;
const recal = this.wxAutoImageCal(width, height);
const { imageheight, imageWidth } = recal;
const { padding, mode } = this.node.attr;
const { styleStr } = this.node;
const imageHeightStyle = mode === 'widthFix' ? '' : `height: ${imageheight}px;`;
this.newStyleStr = `${styleStr}; ${imageHeightStyle}; width: ${imageWidth}px; padding: 0 ${+padding}px;`;
},
// 计算视觉优先的图片宽高
wxAutoImageCal(originalWidth, originalHeight) {
// 获取图片的原始长宽
const { padding } = this.node.attr;
const windowWidth = this.node.$screen.width - (2 * padding);
const results = {};
if (originalWidth < 60 || originalHeight < 60) {
const { src } = this.node.attr;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.removeImageUrl(src);
this.preview = false;
}
// 判断按照那种方式进行缩放
if (originalWidth > windowWidth) {
// 在图片width大于手机屏幕width时候
results.imageWidth = windowWidth;
results.imageheight = windowWidth * (originalHeight / originalWidth);
} else {
// 否则展示原来的数据
results.imageWidth = originalWidth;
results.imageheight = originalHeight;
}
return results;
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--table类型-->
<block v-else-if="node.tag == 'table'">
<view :class="node.classStr" class="table" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate1';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate0',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;// TODO currentTarget才有dataset
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {// TODO 遍历获取父节点执行方法
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view :class="(node.tag == 'li' ? node.classStr : (node.node==='text'?'text':''))">
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<!-- <view :class="node.classStr" :style="node.styleStr"> -->
<view :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate2';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate1',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate11';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate10',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<!--button类型-->
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
{{node.text}}
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
{{node.text}}
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
{{node.text}}
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate11',
props: {
node: {},
},
components: {
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate3';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate2',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate4';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate3',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate5';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate4',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate6';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate5',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate7';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate6',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate8';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate7',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate9';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate8',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<view>
<!--判断是否是标签节点-->
<block v-if="node.node == 'element'">
<block v-if="node.tag == 'button'">
<button type="default" size="mini">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</button>
</block>
<!--li类型-->
<block v-else-if="node.tag == 'li'">
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--video类型-->
<block v-else-if="node.tag == 'video'">
<wx-parse-video :node="node" />
</block>
<!--audio类型-->
<block v-else-if="node.tag == 'audio'">
<wx-parse-audio :node="node" />
</block>
<!--img类型-->
<block v-else-if="node.tag == 'img'">
<wx-parse-img :node="node" />
</block>
<!--a类型-->
<block v-else-if="node.tag == 'a'">
<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
<!--br类型-->
<block v-else-if="node.tag == 'br'">
<text>\n</text>
</block>
<!--其他标签-->
<block v-else>
<view :class="node.classStr" :style="node.styleStr">
<block v-for="(node, index) of node.nodes" :key="index">
<wx-parse-template :node="node" />
</block>
</view>
</block>
</block>
<!--判断是否是文本节点-->
<block v-else-if="node.node == 'text'">{{node.text}}</block>
</view>
</template>
<script>
import wxParseTemplate from './wxParseTemplate10';
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
export default {
name: 'wxParseTemplate9',
props: {
node: {},
},
components: {
wxParseTemplate,
wxParseImg,
wxParseVideo,
wxParseAudio,
},
methods: {
wxParseATap(e) {
const {
href
} = e.currentTarget.dataset;
if (!href) return;
let parent = this.$parent;
while(!parent.preview || typeof parent.preview !== 'function') {
parent = parent.$parent;
}
parent.navigate(href, e);
},
},
};
</script>
... ...
<template>
<!--增加video标签支持,并循环添加-->
<view :class="node.classStr" :style="node.styleStr">
<video :class="node.classStr" class="video-video" :src="node.attr.src"></video>
</view>
</template>
<script>
export default {
name: 'wxParseVideo',
props: {
node: {},
},
};
</script>
... ...
/**
* html2Json 改造来自: https://github.com/Jxck/html2json
*
*
* author: Di (微信小程序开发工程师)
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
* 垂直微信小程序开发交流社区
*
* github地址: https://github.com/icindy/wxParse
*
* for: 微信小程序富文本解析
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
*/
import wxDiscode from './wxDiscode';
import HTMLParser from './htmlparser';
function makeMap(str) {
const obj = {};
const items = str.split(',');
for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
return obj;
}
// Block Elements - HTML 5
const block = makeMap('br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
// Inline Elements - HTML 5
const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
// Elements that you can, intentionally, leave open
// (and which close themselves)
const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
function removeDOCTYPE(html) {
const isDocument = /<body.*>([^]*)<\/body>/.test(html);
return isDocument ? RegExp.$1 : html;
}
function trimHtml(html) {
return html
.replace(/<!--.*?-->/gi, '')
.replace(/\/\*.*?\*\//gi, '')
.replace(/[ ]+</gi, '<')
.replace(/<script[^]*<\/script>/gi, '')
.replace(/<style[^]*<\/style>/gi, '');
}
function getScreenInfo() {
const screen = {};
wx.getSystemInfo({
success: (res) => {
screen.width = res.windowWidth;
screen.height = res.windowHeight;
},
});
return screen;
}
function html2json(html, customHandler, imageProp, host) {
// 处理字符串
html = removeDOCTYPE(html);
html = trimHtml(html);
html = wxDiscode.strDiscode(html);
// 生成node节点
const bufArray = [];
const results = {
nodes: [],
imageUrls: [],
};
const screen = getScreenInfo();
function Node(tag) {
this.node = 'element';
this.tag = tag;
this.$screen = screen;
}
HTMLParser(html, {
start(tag, attrs, unary) {
// node for this element
const node = new Node(tag);
if (bufArray.length !== 0) {
const parent = bufArray[0];
if (parent.nodes === undefined) {
parent.nodes = [];
}
}
if (block[tag]) {
node.tagType = 'block';
} else if (inline[tag]) {
node.tagType = 'inline';
} else if (closeSelf[tag]) {
node.tagType = 'closeSelf';
}
node.attr = attrs.reduce((pre, attr) => {
const { name } = attr;
let { value } = attr;
if (name === 'class') {
node.classStr = value;
}
// has multi attibutes
// make it array of attribute
if (name === 'style') {
node.styleStr = value;
}
if (value.match(/ /)) {
value = value.split(' ');
}
// if attr already exists
// merge it
if (pre[name]) {
if (Array.isArray(pre[name])) {
// already array, push to last
pre[name].push(value);
} else {
// single value, make it array
pre[name] = [pre[name], value];
}
} else {
// not exist, put it
pre[name] = value;
}
return pre;
}, {});
// 优化样式相关属性
if (node.classStr) {
node.classStr += ` ${node.tag}`;
} else {
node.classStr = node.tag;
}
if (node.tagType === 'inline') {
node.classStr += ' inline';
}
// 对img添加额外数据
if (node.tag === 'img') {
let imgUrl = node.attr.src;
imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain);
Object.assign(node.attr, imageProp, {
src: imgUrl || '',
});
if (imgUrl) {
results.imageUrls.push(imgUrl);
}
}
// 处理a标签属性
if (node.tag === 'a') {
node.attr.href = node.attr.href || '';
}
// 处理font标签样式属性
if (node.tag === 'font') {
const fontSize = [
'x-small',
'small',
'medium',
'large',
'x-large',
'xx-large',
'-webkit-xxx-large',
];
const styleAttrs = {
color: 'color',
face: 'font-family',
size: 'font-size',
};
if (!node.styleStr) node.styleStr = '';
Object.keys(styleAttrs).forEach((key) => {
if (node.attr[key]) {
const value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key];
node.styleStr += `${styleAttrs[key]}: ${value};`;
}
});
}
// 临时记录source资源
if (node.tag === 'source') {
results.source = node.attr.src;
}
if (customHandler.start) {
customHandler.start(node, results);
}
if (unary) {
// if this tag doesn't have end tag
// like <img src="hoge.png"/>
// add to parents
const parent = bufArray[0] || results;
if (parent.nodes === undefined) {
parent.nodes = [];
}
parent.nodes.push(node);
} else {
bufArray.unshift(node);
}
},
end(tag) {
// merge into parent tag
const node = bufArray.shift();
if (node.tag !== tag) {
console.error('invalid state: mismatch end tag');
}
// 当有缓存source资源时于于video补上src资源
if (node.tag === 'video' && results.source) {
node.attr.src = results.source;
delete results.source;
}
if (customHandler.end) {
customHandler.end(node, results);
}
if (bufArray.length === 0) {
results.nodes.push(node);
} else {
const parent = bufArray[0];
if (!parent.nodes) {
parent.nodes = [];
}
parent.nodes.push(node);
}
},
chars(text) {
if (!text.trim()) return;
const node = {
node: 'text',
text,
};
if (customHandler.chars) {
customHandler.chars(node, results);
}
if (bufArray.length === 0) {
results.nodes.push(node);
} else {
const parent = bufArray[0];
if (parent.nodes === undefined) {
parent.nodes = [];
}
parent.nodes.push(node);
}
},
});
return results;
}
export default html2json;
... ...
/**
*
* htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser
*
* author: Di (微信小程序开发工程师)
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
* 垂直微信小程序开发交流社区
*
* github地址: https://github.com/icindy/wxParse
*
* for: 微信小程序富文本解析
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
*/
// Regular Expressions for parsing tags and attributes
const startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
const endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
const attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
function makeMap(str) {
const obj = {};
const items = str.split(',');
for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
return obj;
}
// Empty Elements - HTML 5
const empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr');
// Block Elements - HTML 5
const block = makeMap('address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
// Inline Elements - HTML 5
const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
// Elements that you can, intentionally, leave open
// (and which close themselves)
const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
// Attributes that have their values filled in disabled="disabled"
const fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected');
function HTMLParser(html, handler) {
let index;
let chars;
let match;
let last = html;
const stack = [];
stack.last = () => stack[stack.length - 1];
function parseEndTag(tag, tagName) {
// If no tag name is provided, clean shop
let pos;
if (!tagName) {
pos = 0;
} else {
// Find the closest opened tag of the same type
tagName = tagName.toLowerCase();
for (pos = stack.length - 1; pos >= 0; pos -= 1) {
if (stack[pos] === tagName) break;
}
}
if (pos >= 0) {
// Close all the open elements, up the stack
for (let i = stack.length - 1; i >= pos; i -= 1) {
if (handler.end) handler.end(stack[i]);
}
// Remove the open elements from the stack
stack.length = pos;
}
}
function parseStartTag(tag, tagName, rest, unary) {
tagName = tagName.toLowerCase();
if (block[tagName]) {
while (stack.last() && inline[stack.last()]) {
parseEndTag('', stack.last());
}
}
if (closeSelf[tagName] && stack.last() === tagName) {
parseEndTag('', tagName);
}
unary = empty[tagName] || !!unary;
if (!unary) stack.push(tagName);
if (handler.start) {
const attrs = [];
rest.replace(attr, function genAttr(matches, name) {
const value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : '');
attrs.push({
name,
value,
escaped: value.replace(/(^|[^\\])"/g, '$1\\"'), // "
});
});
if (handler.start) {
handler.start(tagName, attrs, unary);
}
}
}
while (html) {
chars = true;
if (html.indexOf('</') === 0) {
match = html.match(endTag);
if (match) {
html = html.substring(match[0].length);
match[0].replace(endTag, parseEndTag);
chars = false;
}
// start tag
} else if (html.indexOf('<') === 0) {
match = html.match(startTag);
if (match) {
html = html.substring(match[0].length);
match[0].replace(startTag, parseStartTag);
chars = false;
}
}
if (chars) {
index = html.indexOf('<');
let text = '';
while (index === 0) {
text += '<';
html = html.substring(1);
index = html.indexOf('<');
}
text += index < 0 ? html : html.substring(0, index);
html = index < 0 ? '' : html.substring(index);
if (handler.chars) handler.chars(text);
}
if (html === last) throw new Error(`Parse Error: ${html}`);
last = html;
}
// Clean up any remaining tags
parseEndTag();
}
export default HTMLParser;
... ...
// HTML 支持的数学符号
function strNumDiscode(str) {
str = str.replace(/&forall;/g, '∀');
str = str.replace(/&part;/g, '∂');
str = str.replace(/&exist;/g, '∃');
str = str.replace(/&empty;/g, '∅');
str = str.replace(/&nabla;/g, '∇');
str = str.replace(/&isin;/g, '∈');
str = str.replace(/&notin;/g, '∉');
str = str.replace(/&ni;/g, '∋');
str = str.replace(/&prod;/g, '∏');
str = str.replace(/&sum;/g, '∑');
str = str.replace(/&minus;/g, '−');
str = str.replace(/&lowast;/g, '∗');
str = str.replace(/&radic;/g, '√');
str = str.replace(/&prop;/g, '∝');
str = str.replace(/&infin;/g, '∞');
str = str.replace(/&ang;/g, '∠');
str = str.replace(/&and;/g, '∧');
str = str.replace(/&or;/g, '∨');
str = str.replace(/&cap;/g, '∩');
str = str.replace(/&cup;/g, '∪');
str = str.replace(/&int;/g, '∫');
str = str.replace(/&there4;/g, '∴');
str = str.replace(/&sim;/g, '∼');
str = str.replace(/&cong;/g, '≅');
str = str.replace(/&asymp;/g, '≈');
str = str.replace(/&ne;/g, '≠');
str = str.replace(/&le;/g, '≤');
str = str.replace(/&ge;/g, '≥');
str = str.replace(/&sub;/g, '⊂');
str = str.replace(/&sup;/g, '⊃');
str = str.replace(/&nsub;/g, '⊄');
str = str.replace(/&sube;/g, '⊆');
str = str.replace(/&supe;/g, '⊇');
str = str.replace(/&oplus;/g, '⊕');
str = str.replace(/&otimes;/g, '⊗');
str = str.replace(/&perp;/g, '⊥');
str = str.replace(/&sdot;/g, '⋅');
return str;
}
// HTML 支持的希腊字母
function strGreeceDiscode(str) {
str = str.replace(/&Alpha;/g, 'Α');
str = str.replace(/&Beta;/g, 'Β');
str = str.replace(/&Gamma;/g, 'Γ');
str = str.replace(/&Delta;/g, 'Δ');
str = str.replace(/&Epsilon;/g, 'Ε');
str = str.replace(/&Zeta;/g, 'Ζ');
str = str.replace(/&Eta;/g, 'Η');
str = str.replace(/&Theta;/g, 'Θ');
str = str.replace(/&Iota;/g, 'Ι');
str = str.replace(/&Kappa;/g, 'Κ');
str = str.replace(/&Lambda;/g, 'Λ');
str = str.replace(/&Mu;/g, 'Μ');
str = str.replace(/&Nu;/g, 'Ν');
str = str.replace(/&Xi;/g, 'Ν');
str = str.replace(/&Omicron;/g, 'Ο');
str = str.replace(/&Pi;/g, 'Π');
str = str.replace(/&Rho;/g, 'Ρ');
str = str.replace(/&Sigma;/g, 'Σ');
str = str.replace(/&Tau;/g, 'Τ');
str = str.replace(/&Upsilon;/g, 'Υ');
str = str.replace(/&Phi;/g, 'Φ');
str = str.replace(/&Chi;/g, 'Χ');
str = str.replace(/&Psi;/g, 'Ψ');
str = str.replace(/&Omega;/g, 'Ω');
str = str.replace(/&alpha;/g, 'α');
str = str.replace(/&beta;/g, 'β');
str = str.replace(/&gamma;/g, 'γ');
str = str.replace(/&delta;/g, 'δ');
str = str.replace(/&epsilon;/g, 'ε');
str = str.replace(/&zeta;/g, 'ζ');
str = str.replace(/&eta;/g, 'η');
str = str.replace(/&theta;/g, 'θ');
str = str.replace(/&iota;/g, 'ι');
str = str.replace(/&kappa;/g, 'κ');
str = str.replace(/&lambda;/g, 'λ');
str = str.replace(/&mu;/g, 'μ');
str = str.replace(/&nu;/g, 'ν');
str = str.replace(/&xi;/g, 'ξ');
str = str.replace(/&omicron;/g, 'ο');
str = str.replace(/&pi;/g, 'π');
str = str.replace(/&rho;/g, 'ρ');
str = str.replace(/&sigmaf;/g, 'ς');
str = str.replace(/&sigma;/g, 'σ');
str = str.replace(/&tau;/g, 'τ');
str = str.replace(/&upsilon;/g, 'υ');
str = str.replace(/&phi;/g, 'φ');
str = str.replace(/&chi;/g, 'χ');
str = str.replace(/&psi;/g, 'ψ');
str = str.replace(/&omega;/g, 'ω');
str = str.replace(/&thetasym;/g, 'ϑ');
str = str.replace(/&upsih;/g, 'ϒ');
str = str.replace(/&piv;/g, 'ϖ');
str = str.replace(/&middot;/g, '·');
return str;
}
function strcharacterDiscode(str) {
// 加入常用解析
str = str.replace(/&nbsp;/g, ' ');
str = str.replace(/&ensp;/g, ' ');
str = str.replace(/&emsp;/g, ' ');
str = str.replace(/&quot;/g, "'");
str = str.replace(/&amp;/g, '&');
str = str.replace(/&lt;/g, '<');
str = str.replace(/&gt;/g, '>');
str = str.replace(/&#8226;/g, '•');
return str;
}
// HTML 支持的其他实体
function strOtherDiscode(str) {
str = str.replace(/&OElig;/g, 'Œ');
str = str.replace(/&oelig;/g, 'œ');
str = str.replace(/&Scaron;/g, 'Š');
str = str.replace(/&scaron;/g, 'š');
str = str.replace(/&Yuml;/g, 'Ÿ');
str = str.replace(/&fnof;/g, 'ƒ');
str = str.replace(/&circ;/g, 'ˆ');
str = str.replace(/&tilde;/g, '˜');
str = str.replace(/&ensp;/g, '');
str = str.replace(/&emsp;/g, '');
str = str.replace(/&thinsp;/g, '');
str = str.replace(/&zwnj;/g, '');
str = str.replace(/&zwj;/g, '');
str = str.replace(/&lrm;/g, '');
str = str.replace(/&rlm;/g, '');
str = str.replace(/&ndash;/g, '–');
str = str.replace(/&mdash;/g, '—');
str = str.replace(/&lsquo;/g, '‘');
str = str.replace(/&rsquo;/g, '’');
str = str.replace(/&sbquo;/g, '‚');
str = str.replace(/&ldquo;/g, '“');
str = str.replace(/&rdquo;/g, '”');
str = str.replace(/&bdquo;/g, '„');
str = str.replace(/&dagger;/g, '†');
str = str.replace(/&Dagger;/g, '‡');
str = str.replace(/&bull;/g, '•');
str = str.replace(/&hellip;/g, '…');
str = str.replace(/&permil;/g, '‰');
str = str.replace(/&prime;/g, '′');
str = str.replace(/&Prime;/g, '″');
str = str.replace(/&lsaquo;/g, '‹');
str = str.replace(/&rsaquo;/g, '›');
str = str.replace(/&oline;/g, '‾');
str = str.replace(/&euro;/g, '€');
str = str.replace(/&trade;/g, '™');
str = str.replace(/&larr;/g, '←');
str = str.replace(/&uarr;/g, '↑');
str = str.replace(/&rarr;/g, '→');
str = str.replace(/&darr;/g, '↓');
str = str.replace(/&harr;/g, '↔');
str = str.replace(/&crarr;/g, '↵');
str = str.replace(/&lceil;/g, '⌈');
str = str.replace(/&rceil;/g, '⌉');
str = str.replace(/&lfloor;/g, '⌊');
str = str.replace(/&rfloor;/g, '⌋');
str = str.replace(/&loz;/g, '◊');
str = str.replace(/&spades;/g, '♠');
str = str.replace(/&clubs;/g, '♣');
str = str.replace(/&hearts;/g, '♥');
str = str.replace(/&diams;/g, '♦');
str = str.replace(/&#39;/g, "'");
return str;
}
function strDiscode(str) {
str = strNumDiscode(str);
str = strGreeceDiscode(str);
str = strcharacterDiscode(str);
str = strOtherDiscode(str);
return str;
}
function urlToHttpUrl(url, domain) {
if (/^\/\//.test(url)) {
return `https:${url}`;
} else if (/^\//.test(url)) {
return `https://${domain}${url}`;
}
return url;
}
export default {
strDiscode,
urlToHttpUrl,
};
... ...
## uParse 适用于 uni-app/mpvue 的富文本解析组件
> 支持 Html、Markdown 解析,Fork自: [mpvue-wxParse](https://github.com/F-loat/mpvue-wxParse)
## 属性
| 名称 | 类型 | 默认值 | 描述 |
| -----------------|--------------- | ------------- | ---------------- |
| loading | Boolean | false | 数据加载状态 |
| className | String | — | 自定义 class 名称 |
| content | String | — | 渲染内容 |
| noData | String | 数据不能为空 | 空数据时的渲染展示 |
| startHandler | Function | 见源码 | 自定义 parser 函数 |
| endHandler | Function | null | 自定义 parser 函数 |
| charsHandler | Function | null | 自定义 parser 函数 |
| imageProp | Object | 见下文 | 图片相关参数 |
### 自定义 parser 函数具体介绍
* 传入的参数为当前节点 `node` 对象及解析结果 `results` 对象,例如 `startHandler(node, results)`
* 无需返回值,通过对传入的参数直接操作来完成需要的改动
* 自定义函数会在原解析函数处理之后执行
### imageProp 对象具体属性
| 名称 | 类型 | 默认值 | 描述 |
| -----------------|--------------- | ------------- | ------------------ |
| mode | String | 'aspectFit' | 图片裁剪、缩放的模式 |
| padding | Number | 0 | 图片内边距 |
| lazyLoad | Boolean | false | 图片懒加载 |
| domain | String | '' | 图片服务域名 |
## 事件
| 名称 | 参数 | 描述 |
| -----------------|----------------- | ---------------- |
| preview | 图片地址,原始事件 | 预览图片时触发 |
| navigate | 链接地址,原始事件 | 点击链接时触发 |
## 基本使用方法
``` vue
<template>
<div>
<u-parse :content="article" @preview="preview" @navigate="navigate" />
</div>
</template>
<script>
import uParse from '@/components/u-parse/u-parse.vue'
export default {
components: {
uParse
},
data () {
return {
article: '<div>我是HTML代码</div>'
}
},
methods: {
preview(src, e) {
// do something
},
navigate(href, e) {
// do something
}
}
}
</script>
<style>
@import url("@/components/u-parse/u-parse.css");
</style>
```
## 渲染 Markdown
> 先将 markdown 转换为 html 即可
```
npm install marked
```
``` js
import marked from 'marked'
import uParse from '@/components/u-parse/u-parse.vue'
export default {
components: {
uParse
},
data () {
return {
article: marked(`#hello, markdown!`)
}
}
}
```
... ...
/**
* author: Di (微信小程序开发工程师)
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
* 垂直微信小程序开发交流社区
*
* github地址: https://github.com/icindy/wxParse
*
* for: 微信小程序富文本解析
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
*/
.wxParse {
width: 100%;
font-family: Helvetica, sans-serif;
font-size: 30upx;
color: #666;
line-height: 1.8;
}
.wxParse view {
word-break: hyphenate;
}
.wxParse .inline {
display: inline;
margin: 0;
padding: 0;
}
.wxParse .div {
margin: 0;
padding: 0;
}
.wxParse .h1 .text {
font-size: 2em;
margin: 0.67em 0;
}
.wxParse .h2 .text {
font-size: 1.5em;
margin: 0.83em 0;
}
.wxParse .h3 .text {
font-size: 1.17em;
margin: 1em 0;
}
.wxParse .h4 .text {
margin: 1.33em 0;
}
.wxParse .h5 .text {
font-size: 0.83em;
margin: 1.67em 0;
}
.wxParse .h6 .text {
font-size: 0.67em;
margin: 2.33em 0;
}
.wxParse .h1 .text,
.wxParse .h2 .text,
.wxParse .h3 .text,
.wxParse .h4 .text,
.wxParse .h5 .text,
.wxParse .h6 .text,
.wxParse .b,
.wxParse .strong {
font-weight: bolder;
}
.wxParse .p {
margin: 1em 0;
}
.wxParse .i,
.wxParse .cite,
.wxParse .em,
.wxParse .var,
.wxParse .address {
font-style: italic;
}
.wxParse .pre,
.wxParse .tt,
.wxParse .code,
.wxParse .kbd,
.wxParse .samp {
font-family: monospace;
}
.wxParse .pre {
overflow: auto;
background: #f5f5f5;
padding: 16upx;
white-space: pre;
margin: 1em 0upx;
}
.wxParse .code {
display: inline;
background: #f5f5f5;
}
.wxParse .big {
font-size: 1.17em;
}
.wxParse .small,
.wxParse .sub,
.wxParse .sup {
font-size: 0.83em;
}
.wxParse .sub {
vertical-align: sub;
}
.wxParse .sup {
vertical-align: super;
}
.wxParse .s,
.wxParse .strike,
.wxParse .del {
text-decoration: line-through;
}
.wxParse .strong,
.wxParse .s {
display: inline;
}
.wxParse .a {
color: deepskyblue;
}
.wxParse .video {
text-align: center;
margin: 22upx 0;
}
.wxParse .video-video {
width: 100%;
}
.wxParse .img {
display: inline-block;
width: 0;
height: 0;
max-width: 100%;
overflow: hidden;
}
.wxParse .blockquote {
margin: 10upx 0;
padding: 22upx 0 22upx 22upx;
font-family: Courier, Calibri, "宋体";
background: #f5f5f5;
border-left: 6upx solid #dbdbdb;
}
.wxParse .blockquote .p {
margin: 0;
}
.wxParse .ul, .wxParse .ol {
display: block;
margin: 1em 0;
padding-left: 33upx;
}
.wxParse .ol {
list-style-type: disc;
}
.wxParse .ol {
list-style-type: decimal;
}
.wxParse .ol>weixin-parse-template,.wxParse .ul>weixin-parse-template {
display: list-item;
align-items: baseline;
text-align: match-parent;
}
.wxParse .ol>.li,.wxParse .ul>.li {
display: list-item;
align-items: baseline;
text-align: match-parent;
}
.wxParse .ul .ul, .wxParse .ol .ul {
list-style-type: circle;
}
.wxParse .ol .ol .ul, .wxParse .ol .ul .ul, .wxParse .ul .ol .ul, .wxParse .ul .ul .ul {
list-style-type: square;
}
.wxParse .u {
text-decoration: underline;
}
.wxParse .hide {
display: none;
}
.wxParse .del {
display: inline;
}
.wxParse .figure {
overflow: hidden;
}
.wxParse .table {
width: 100%;
}
.wxParse .thead, .wxParse .tfoot, .wxParse .tr {
display: flex;
flex-direction: row;
}
.wxParse .tr {
width:100%;
display: flex;
border-right: 2upx solid #e0e0e0;
border-bottom: 2upx solid #e0e0e0;
}
.wxParse .th,
.wxParse .td {
display: flex;
width: 1276upx;
overflow: auto;
flex: 1;
padding: 11upx;
border-left: 2upx solid #e0e0e0;
}
.wxParse .td:last {
border-top: 2upx solid #e0e0e0;
}
.wxParse .th {
background: #f0f0f0;
border-top: 2upx solid #e0e0e0;
}
... ...
<!--**
* forked from:https://github.com/F-loat/mpvue-wxParse
*
* github地址: https://github.com/dcloudio/uParse
*
* for: uni-app框架下 富文本解析
*/-->
<template>
<!--基础元素-->
<div class="wxParse" :class="className" v-if="!loading">
<block v-for="(node,index) of nodes" :key="index">
<wxParseTemplate :node="node" />
</block>
</div>
</template>
<script>
import HtmlToJson from './libs/html2json';
import wxParseTemplate from './components/wxParseTemplate0';
export default {
name: 'wxParse',
props: {
loading: {
type: Boolean,
default: false,
},
className: {
type: String,
default: '',
},
content: {
type: String,
default: '',
},
noData: {
type: String,
default: '<div style="color: red;">数据不能为空</div>',
},
startHandler: {
type: Function,
default() {
return (node) => {
node.attr.class = null;
node.attr.style = null;
};
},
},
endHandler: {
type: Function,
default: null,
},
charsHandler: {
type: Function,
default: null,
},
imageProp: {
type: Object,
default() {
return {
mode: 'aspectFit',
padding: 0,
lazyLoad: false,
domain: '',
};
},
},
},
components: {
wxParseTemplate,
},
data() {
return {
imageUrls: [],
};
},
computed: {
nodes() {
const {
content,
noData,
imageProp,
startHandler,
endHandler,
charsHandler,
} = this;
const parseData = content || noData;
const customHandler = {
start: startHandler,
end: endHandler,
chars: charsHandler,
};
const results = HtmlToJson(parseData, customHandler, imageProp, this);
this.imageUrls = results.imageUrls;
console.log(results)
return results.nodes;
},
},
methods: {
navigate(href, $event) {
this.$emit('navigate', href, $event);
},
preview(src, $event) {
if (!this.imageUrls.length) return;
wx.previewImage({
current: src,
urls: this.imageUrls,
});
this.$emit('preview', src, $event);
},
removeImageUrl(src) {
const { imageUrls } = this;
imageUrls.splice(imageUrls.indexOf(src), 1);
},
},
};
</script>
... ...
{
"name" : "Bitcoin",
"appid" : "__UNI__D80DC8B",
"appid" : "__UNI__D7F2A57",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
... ...
... ... @@ -207,6 +207,15 @@
}
}
,{
"path" : "pages/index/grant",
"style" :
{
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
... ...
<template>
<view class="buydetail">
<view class="buytop">
<text class="buytitle"> 数字货币</text>
<!-- <text class="buytitle"> 数字货币</text> -->
<view class="buybox flexA">
<image :src="list1[0]" mode=""></image>
<view class="buymiss">
... ... @@ -120,9 +120,11 @@
is_cert: "",
},
show: false,
opid:"",
}
},
onLoad(options) {
this.opid=uni.getStorageSync('openId')
this.product_id = options.id
this.product_detail()
this.last_buy_data()
... ...
... ... @@ -6,11 +6,16 @@
<view class="time">
发布时间{{detail.publishtime}}
</view>
<image src="../../static/ic_fenxiang.png" mode=""></image>
<image src="../../static/ic_fenxiang.png" mode="" @click="shareModel=true"></image>
</view>
<rich-text :nodes="detail.content"></rich-text>
</view>
<view class="share" v-if="shareModel" @click="shareModel=false">
<image src="/static/detailShare.png" mode=""></image>
<view class="">
点击这里进行分享
</view>
</view>
</view>
</template>
... ... @@ -18,6 +23,8 @@
import {
arc_detail
} from '@/api/index.js'
var jweixin = require('jweixin-module');
console.log(jweixin, "000")
export default {
data() {
return {
... ... @@ -26,19 +33,31 @@
title: "",
publishtime: "",
content: "",
}
},
shareModel: false,
Images: "http://yuanjie.n.broing.cn/assets/img/share_logo.jpg",
jssdk:{},
}
},
onLoad(options) {
this.id = options.id
let title = uni.getStorageSync("deltitle")
uni.setNavigationBarTitle({
title: title //这是修改后的导航栏文字
})
this.arc_detail()
},
onUnload() {
uni.removeStorageSync("deltitle")
},
methods: {
//详情
async arc_detail() {
try {
const res = await arc_detail(this.id)
const res = await arc_detail(this.id, window.location.href)
this.detail = res.detail
this.jssdk = res.jssdk
this.share()
console.log('arc_detail', res)
// 保存数据
} catch (err) {
... ... @@ -49,6 +68,83 @@
console.log('arc_detail', err)
}
},
share() {
let that = this;
jweixin.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: that.jssdk.appId, // 必填,公众号的唯一标识
timestamp: that.jssdk.timestamp, // 必填,生成签名的时间戳
nonceStr: that.jssdk.nonceStr, // 必填,生成签名的随机串
signature: that.jssdk.signature, // 必填,签名
jsApiList: that.jssdk.jsApiList // 必填,需要使用的JS接口列表
})
jweixin.error(function(res) {
console.log(res, '错误')
});
console.log('分享了', that.jssdk.signature);
jweixin.ready(function() {
//分享给朋友
jweixin.onMenuShareAppMessage({
title: that.detail.title, // 分享标题
link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
desc: "【琉璃藏宝阁】数字藏品流转平台,顺利“琉”转,藏品“璃”手",
imgUrl: that.Images, // 分享图标
success: function() {
// 用户点击了分享后执行的回调函数
uni.showToast({
title: '分享成功',
duration: 2000
});
},
cancel: function(res) {
console.log('取消分享')
}
});
jweixin.updateAppMessageShareData({
title: that.detail.title, // 分享标题
link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
desc: "【琉璃藏宝阁】数字藏品流转平台,顺利“琉”转,藏品“璃”手",
imgUrl: that.Images, // 分享图标
success: function() {
console.log('设置分享给朋友成功')
},
cancel: function(res) {
console.log('取消分享')
}
});
//分享到朋友圈
jweixin.onMenuShareTimeline({
title: that.detail.title, // 分享标题
link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
desc: "【琉璃藏宝阁】数字藏品流转平台,顺利“琉”转,藏品“璃”手",
imgUrl: that.Images, // 分享图标
success: function() {
// 用户点击了分享后执行的回调函数
uni.showToast({
title: '分享成功',
duration: 2000
});
},
cancel: function(res) {
console.log('取消分享')
}
});
jweixin.updateTimelineShareData({
title: that.detail.title, // 分享标题
link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
desc: "【琉璃藏宝阁】数字藏品流转平台,顺利“琉”转,藏品“璃”手",
imgUrl: that.Images, // 分享图标
success: function() {
console.log('设置分享到朋友圈成功')
},
cancel: function(res) {
console.log('取消分享')
}
});
});
},
}
}
</script>
... ... @@ -70,4 +166,30 @@
}
}
}
.share {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .6);
image {
position: fixed;
right: 80rpx;
top: 4rpx;
width: 188rpx;
height: 262rpx;
}
view {
position: fixed;
right: 80rpx;
top: 300rpx;
color: rgba(255, 255, 255, 1);
font-size: 36rpx;
font-weight: 700;
}
}
</style>
... ...
... ... @@ -2,7 +2,7 @@
<view class="Detail">
<view class="topbg">
<view class="bgimage">
<u-swiper :list="list1" @change="change" @click="click" :height="375"></u-swiper>
<u-swiper :list="list1" @change="change" @click="onclick" :height="375"></u-swiper>
</view>
<view class="topmain">
<view class="toptitle">
... ... @@ -195,13 +195,19 @@
},
onShow() {
},
},
onLoad(options) {
this.id = options.id
this.product_detail()
this.report_list()
this.report_list()
},
methods: {
onclick(index){
uni.previewImage({
current: index,
urls: this.list1,
});
},
goTop(){
uni.pageScrollTo({
scrollTop: 0
... ... @@ -244,6 +250,7 @@
jweixin.onMenuShareAppMessage({
title: that.detail.name, // 分享标题
link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
desc:"【琉璃藏宝阁】数字藏品流转平台,顺利“琉”转,藏品“璃”手",
imgUrl: that.detail.images_preview[0], // 分享图标
success: function() {
// 用户点击了分享后执行的回调函数
... ... @@ -259,6 +266,7 @@
jweixin.updateAppMessageShareData({
title: that.detail.name, // 分享标题
link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
desc:"【琉璃藏宝阁】数字藏品流转平台,顺利“琉”转,藏品“璃”手",
imgUrl: that.detail.images_preview[0], // 分享图标
success: function() {
console.log('设置分享给朋友成功')
... ... @@ -271,6 +279,7 @@
jweixin.onMenuShareTimeline({
title: that.detail.name, // 分享标题
link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
desc:"【琉璃藏宝阁】数字藏品流转平台,顺利“琉”转,藏品“璃”手",
imgUrl: that.detail.images_preview[0], // 分享图标
success: function() {
// 用户点击了分享后执行的回调函数
... ... @@ -286,6 +295,7 @@
jweixin.updateTimelineShareData({
title: that.detail.name, // 分享标题
link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
desc:"【琉璃藏宝阁】数字藏品流转平台,顺利“琉”转,藏品“璃”手",
imgUrl: that.detail.images_preview[0], // 分享图标
success: function() {
console.log('设置分享到朋友圈成功')
... ... @@ -513,7 +523,9 @@
width: 168rpx;
}
.namelast {
.namelast {
width: 420rpx;
word-break: break-all;
color: rgba(0, 0, 0, 1);
font-size: 28rpx;
font-weight: 400;
... ...
<template>
<view>
<view>
<!-- url为要跳转外链的地址-->
<web-view :src="urls">
</web-view>
</view>
</view>
</template>
<!-- 公众号跳转
要跳转之前的位置js
gotogrant(url) {
console.log(url)
var url = url;
uni.navigateTo({
// 此处的链接为小程序上面新建的webview页面路径,参数url为要跳转外链的地址
url: "/pages/index/grant?url=" + encodeURIComponent(url)
});
}, -->
<script>
export default {
data() {
return {
urls:""
}
},
onLoad(val) {
console.log(val)
//解码
this.urls = decodeURIComponent(val.url);
// 设置当前的title 如果外链中有的话将被覆盖
// if(this.isNotEmpty(val.title)){
// this.setTitle(val.title);
// }
},
methods: {
isNotEmpty(obj) {
if (typeof obj == undefined || obj == null || obj == "" || obj == "undefined" || obj.length == 0) {
return false;
} else {
return true;
}
},
// 设置title
setTitle(title) {
uni.setNavigationBarTitle({
title: title
})
},
}
}
//公众号跳转
// gotogrant(url) {
// console.log(url)
// var url = url;
// uni.navigateTo({
// // 此处的链接为小程序上面新建的webview页面路径,参数url为要跳转外链的地址
// url: "/pages/index/grant?url=" + encodeURIComponent(url)
// });
// }
</script>
... ...
... ... @@ -3,7 +3,7 @@
<view class="logo">
<image src="/static/ic_logo.png" mode=""></image>
<view class="search" @click="gosourch">
<view class="tosear" >
<view class="tosear">
<input type="text" value="" placeholder="搜索"
placeholder-style="text-align: center;font-size: 28rpx; color: rgba(194,194,194,1);" />
<image src="/static/icon-search.png" mode=""></image>
... ... @@ -12,14 +12,14 @@
</view>
<view class="top">
<view class="banner">
<u-swiper keyName="image_preview" :list="list1" @click="click" :indicator="true" indicatorMode="dot"
<u-swiper keyName="image_preview" :list="list1" @click="toclick" :indicator="true" indicatorMode="dot"
radius="12" height="160" :circular="true">
</u-swiper>
</view>
</view>
<view class="contail">
<view class="nev">
<view class="bar" v-for="(item,index) in categoryList" :key="index" @click="tocate(item.id)">
<view class="bar" v-for="(item,index) in categoryList" :key="index" @click="tocate(item.id,item.name)">
<image class="barimg" :src="item.image_preview" mode=""></image>
<text>{{item.name}}</text>
</view>
... ... @@ -34,26 +34,27 @@
<view class="title">
相关资讯
</view>
<view class="more" @click="torealtime(1)">
<view class="more" @click="torealtime(1,'相关资讯')">
更多
<image src="/static/ic-arrow.png" mode=""></image>
</view>
</view>
<view class="newbar">
<view v-for="(item,index) in informationList" :key="index" @click="oncusdetail(item.id)">·{{item.title}}</view>
<view v-for="(item,index) in informationList" :key="index" @click="oncusdetail(item.id,item.title)">
·{{item.title}}</view>
</view>
</view>
<view class="rightbox" @click="torealtime(2)">
<view class="rightbox" @click="torealtime(2,'热门活动')">
<view class="righttitle">
<view class="title">
热门活动
</view>
<view class="active">
<!-- <view class="active">
充值活动
</view>
</view> -->
</view>
<view class="activeimg">
<image src="/static/Rectangle 2372.png" mode=""></image>
<image src="/static/6.jpg" mode="widthFix" ></image>
<!-- <image src="/static/logo.png" mode=""></image>
<image src="/static/logo.png" mode=""></image> -->
</view>
... ... @@ -124,8 +125,8 @@
return {
title: 'Hello',
list1: [],
nevlist: [1, 2, 3, 4, , 6, 7],
leftlist: [1, 2, 3],
nevlist: [],
leftlist: [],
fallindex: 1,
//瀑布
list: [],
... ... @@ -139,7 +140,7 @@
onShow() {
this.initial()
},
onLoad() {
onLoad(e) {
this.product_list(true)
},
onReachBottom() {
... ... @@ -147,31 +148,40 @@
this.product_list()
},
methods: {
goTop(){
toclick(index) {
console.log(this.list1[index].href)
uni.navigateTo({
// 此处的链接为小程序上面新建的webview页面路径,参数url为要跳转外链的地址
url: "/pages/index/grant?url=" + encodeURIComponent(this.list1[index].href)
});
},
goTop() {
uni.pageScrollTo({
scrollTop: 0
});
},
// 资讯详情
oncusdetail(e) {
oncusdetail(e,title) {
uni.setStorageSync("deltitle",title)
uni.navigateTo({
url: "/pages/index/consultationDetails?id=" + e
})
},
tocate(id) {
tocate(id, name) {
uni.navigateTo({
url: "/pages/index/product?sort_id="+id
url: "/pages/index/product?sort_id=" + id + "&sort_name=" + name
})
},
toallCate(){
toallCate() {
uni.navigateTo({
url: "/pages/index/category"
})
},
//咨询列表
torealtime(e) {
torealtime(e,title) {
uni.navigateTo({
url: "/pages/index/realTimeInfo?type=" + e
url: "/pages/index/realTimeInfo?type=" + e+"&title="+title
})
},
async product_report() {
... ... @@ -208,17 +218,17 @@
}
},
//产品列表
async product_list(x,state) {
async product_list(x, state) {
let obj = {
type: this.fallindex,
page: this.currentpage,
ids: this.fallindex == 1 && state? this.idgroup.join(",") : "",
ids: this.fallindex == 1 && state ? this.idgroup.join(",") : "",
pagenum: 15,
}
try {
const res = await product_list(obj)
console.log('产品列表', res)
this.idgroup=[]
this.idgroup = []
this.list = x ? res.list.data : this.list.concat(res.list.data)
this.list.forEach((item, index) => {
item.image = item.images_preview[0]
... ... @@ -268,12 +278,12 @@
}
},
changefall(e) {
let state = this.fallindex==e?1:0
let state = this.fallindex == e ? 1 : 0
this.fallindex = e
console.log(this.fallindex)
this.currentpage=1
this.list=[]
this.product_list(true,state)
this.currentpage = 1
this.list = []
this.product_list(true, state)
},
//跳转详情
godetail(item) {
... ... @@ -609,6 +619,7 @@
}
}
}
.goTop {
width: 96rpx;
height: 96rpx;
... ...
... ... @@ -48,14 +48,23 @@
keyword: "",
currentpage: 1,
sort_id: "",
sort_name:"",
}
},
onLoad(options) {
if (options.ktext) {
this.keyword = options.ktext
uni.setNavigationBarTitle({
title: "产品" //这是修改后的导航栏文字
})
}
if (options.sort_id) {
this.sort_id = options.sort_id
this.sort_name = options.sort_name
let that =this
uni.setNavigationBarTitle({
title: that.sort_name //这是修改后的导航栏文字
})
}
this.product_list(true)
},
... ...
... ... @@ -8,7 +8,7 @@
<view class="banner">
<scroll-view scroll-x="true" style="white-space:nowrap ">
<view class="nav" :class="{newnav:chooseindex==index}" v-for="(item,index) in typelist" :key="index"
@click="choose(index,item.id)">{{item.name}}
@click="choose(index,item.id,item.name)">{{item.name}}
<view class="tip" v-if="chooseindex==index">
</view>
</view>
... ... @@ -17,7 +17,7 @@
</view>
<view class="group">
<scroll-view scroll-y="true" @scrolltolower="scrolltolower" style="height: 100vh">
<view class="item" v-for="(item,idx) in sortlist" :key="idx" @click="ondetail(item.id)">
<view class="item" v-for="(item,idx) in sortlist" :key="idx" @click="ondetail(item.id,item.title)">
<view class="bot flexA">
<view class="left flexA">
<image :src="item.image_preview" mode=""></image>
... ... @@ -47,14 +47,21 @@
keyword: "",
sortlist: [],
currentpage: 1,
nametitle: "",
}
},
onLoad(options) {
this.type = options.type
let title=options.title
uni.setNavigationBarTitle({
title: title //这是修改后的导航栏文字
})
this.sort_list(true)
},
methods: {
ondetail(e) {
ondetail(e,title) {
uni.setStorageSync("deltitle",title)
uni.navigateTo({
url: "/pages/index/consultationDetails?id=" + e
})
... ... @@ -70,17 +77,20 @@
this.arc_list(true)
},
//类型选择
choose(e, id) {
this.chooseindex = e
this.sortlist = []
this.sort_id = id
this.arc_list(true)
choose(e, id, name) {
let that =this
that.chooseindex = e
that.sortlist = []
that.sort_id = id
that.nametitle = name
console.log(that.nametitle, name)
that.arc_list(true)
},
// 分类
async sort_list() {
console.log(this.type,"000")
console.log(this.type, "000")
let obj = {
type:this.type,
type: this.type,
keyword: this.keyword,
}
try {
... ...
<template>
<view class="top">
<u-search :showAction="true" actionText="搜索" :clearabled="true" v-model="ktext" @custom="onsouch(ktext)">
<u-search :showAction="true" actionText="搜索" :clearabled="true" v-model="ktext" @custom="onsouch(ktext)" @search="onsouch(ktext)">
</u-search>
<view class="main">
<view class="title" v-if="hostlist.length">
... ...
<template>
<view class="Send">
<view class="contail">
<view class="main">
<view class="bar">
<view class="name">
物品名称:
</view>
<view class="nameinput">
<input v-model="form.name" type="text" placeholder="请输入">
</view>
</view>
<view class="bar">
<view class="name">
所属分类:
</view>
<view class="barchoose flexA" @click="showCategory = true">
<text :style="{color:sortName=='请选择'?'grey':'#000'}">{{sortName}}</text>
<image src="/static/ic-arrow2.png" mode=""></image>
</view>
</view>
<view class="bar">
<view class="name">
价格:
</view>
<view class="nameinput">
<input @input="checkNumber" v-model="form.price" type="text" placeholder="请输入(元)">
</view>
</view>
<view class="newbar">
<view class="name">
物品介绍:
</view>
<u--textarea :autoHeight="true" maxlength="300" v-model="form.description" border="none" placeholder="请输入"></u--textarea>
</view>
<view class="newbar">
<view class="name">
物品图片:(最多五张)
</view>
<view class="upimg">
<u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple
:maxCount="5"></u-upload>
</view>
</view>
</view>
<u-gap height="12" bgColor="#F6F6F6"></u-gap>
<view class="main">
<view class="title">
卖家信息
</view>
<view class="bar">
<view class="name">
姓名:
</view>
<view class="nameinput">
<input v-model="form.seller_name" type="text" placeholder="选填">
</view>
</view>
<view class="bar">
<view class="name">
手机号:
</view>
<view class="nameinput">
<input v-model="form.seller_mobile" type="text" placeholder="选填">
</view>
</view>
<view class="bar">
<view class="name">
<text>*</text>发送账户:
</view>
<view class="nameinput">
<input v-model="form.package_add" type="text" placeholder="请输入手机号或钱包地址">
</view>
</view>
<view class="bar">
<view class="name">
<text>*</text>微信号:
</view>
<view class="nameinput">
<input v-model="form.wechat_num" type="text" placeholder="请输入">
</view>
</view>
<view class="bar">
<view class="name">
<text>*</text>保证金:{{lastInfo.cert_withdraw_price}}
</view>
<view class="barlast" v-if="lastInfo.is_cert_withdraw!=1">
去缴纳<image src="/static/arrowR.png" mode=""></image>
<template>
<view class="Send">
<view class="contail">
<view class="main">
<view class="bar">
<view class="name">
物品名称:
</view>
<view class="barlast" v-else style="color: #18D18E;">
已缴纳
</view>
</view>
<view class="bar" @click="show = true">
<view class="name">
<text>*</text>实名认证:
</view>
<view class="barlast" v-if="lastInfo.is_cert==0" >
去认证<image src="/static/arrowR.png" mode=""></image>
<view class="nameinput">
<input v-model="form.name" type="text" placeholder="请输入">
</view>
</view>
<view class="bar">
<view class="name">
所属分类:
</view>
<!-- @click="showCategory = true" -->
<view class="barchoose flexA">
<input type="text" v-model="sortName" placeholder="搜索选择所属分类"
placeholder-style="font-size: 32rpx;" @input="showbox" >
<!-- <text :style="{color:sortName=='请选择'?'grey':'#000'}">{{sortName}}</text> -->
<!-- <image src="/static/ic-arrow2.png" mode=""></image> -->
</view>
<view class="barbox" v-if="sortName&&isshowbox">
<scroll-view scroll-y="true" style="height: 100%;">
<view class="bartip" v-for="(item,index) in columns" :key="index" @click="selctCategory(item)">{{item.name}}</view>
</scroll-view>
</view>
</view>
<view class="bar">
<view class="name">
价格:
</view>
<view class="nameinput">
<input @input="checkNumber" v-model="form.price" type="text" placeholder="请输入(元)">
</view>
</view>
<view class="newbar">
<view class="name">
物品介绍:
</view>
<u--textarea :autoHeight="true" maxlength="300" v-model="form.description" border="none"
placeholder="请输入"></u--textarea>
</view>
<view class="newbar">
<view class="name">
物品图片:(最多五张)
</view>
<view class="upimg">
<u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple
:maxCount="5"></u-upload>
</view>
</view>
</view>
<u-gap height="12" bgColor="#F6F6F6"></u-gap>
<view class="main">
<view class="title">
卖家信息
</view>
<view class="bar">
<view class="name">
姓名:
</view>
<view class="nameinput">
<input v-model="form.seller_name" type="text" placeholder="选填">
</view>
</view>
<view class="bar">
<view class="name">
手机号:
</view>
<view class="nameinput">
<input v-model="form.seller_mobile" type="text" placeholder="选填">
</view>
</view>
<view class="bar">
<view class="name">
<text>*</text>发送账户:
</view>
<view class="nameinput">
<input v-model="form.package_add" type="text" placeholder="请输入手机号或钱包地址">
</view>
</view>
<view class="bar">
<view class="name">
<text>*</text>微信号:
</view>
<view class="nameinput">
<input v-model="form.wechat_num" type="text" placeholder="请输入">
</view>
</view>
<view class="bar">
<view class="name">
<text>*</text>保证金:{{lastInfo.cert_withdraw_price}}
</view>
<view class="barlast" v-if="lastInfo.is_cert_withdraw!=1">
去缴纳<image src="/static/arrowR.png" mode=""></image>
</view>
<view class="barlast" v-else style="color: #18D18E;">
已缴纳
</view>
</view>
<view class="bar" @click="show = true">
<view class="name">
<text>*</text>实名认证:
</view>
<view class="barlast" v-if="lastInfo.is_cert==0">
去认证<image src="/static/arrowR.png" mode=""></image>
</view>
<view class="barlast" v-else style="color: #18D18E;">
已认证
</view>
</view>
</view>
</view>
</view>
<view style="height: 200rpx;"></view>
<view class="btn">
<view class="paybtn" @click="send">
提交
</view>
</view>
<view style="height: 200rpx;"></view>
<view class="btn">
<view class="paybtn" @click="send">
提交
</view>
</view>
<u-popup :show="showmoney" :closeOnClickOverlay="false" @close="close" @open="open" mode="center" :round="12">
<view class="popname">
<view class="title">
缴纳保证金
</view>
<view class="contant">
为了保证平台用户交易的安全性,您需要缴纳{{lastInfo.cert_withdraw_price}}元保证金后方可在平台中进行发布物品操作。交易完成后,可在余额中心中进行退回。
</view>
<view class="btngroup" >
<view class="concle" @click="back">
暂不缴纳
</view>
<view class="requt" @click="authorization">
立即缴纳
</view>
</view>
</view>
<u-popup :show="showmoney" :closeOnClickOverlay="false" @close="close" @open="open" mode="center"
:round="12">
<view class="popname">
<view class="title">
缴纳保证金
</view>
<view class="contant">
为了保证平台用户交易的安全性,您需要缴纳{{lastInfo.cert_withdraw_price}}元保证金后方可在平台中进行发布物品操作。交易完成后,可在余额中心中进行退回。
</view>
<view class="btngroup">
<view class="concle" @click="back">
暂不缴纳
</view>
<view class="requt" @click="authorization">
立即缴纳
</view>
</view>
</view>
</u-popup>
<u-popup :show="show" :closeOnClickOverlay="false" @close="close" @open="open" mode="center" :round="12">
<view class="popname">
... ... @@ -139,7 +149,7 @@
<view class="contant">
为了保证平台用户交易的安全性,您需要实名认证后,才能在平台中进行发布物品操作
</view>
<view class="btngroup" >
<view class="btngroup">
<view class="concle" @click="back">
暂不认证
</view>
... ... @@ -148,167 +158,215 @@
</view>
</view>
</view>
</u-popup>
</u-popup>
</view>
<u-picker :show="showCategory" @cancel="showCategory=false" @confirm="selctCategory" :columns="columns" keyName="name"></u-picker>
<Botton :flag="3"></Botton>
</view>
</template>
<!-- <u-picker :show="showCategory" @cancel="showCategory=false" @confirm="selctCategory" :columns="columns"
keyName="name"></u-picker> -->
<Botton :flag="3"></Botton>
</view>
</template>
<script>
var that
var that
var wx = require('jweixin-module')
import {baseURL} from '@/utils/request.js'
import {
baseURL
} from '@/utils/request.js'
import Botton from "@/components/Botton.vue"
import {sortList,product_detail} from '@/api/index'
import {toa} from '@/utils/toast.js'
import { getCategory,sendProduct,getLastInfo,payGuarantee,authorization ,getOpenid,userCertWithdraw} from '@/api/send'
import {
sortList,
product_detail,
sort_search
} from '@/api/index'
import {
toa
} from '@/utils/toast.js'
import {
getCategory,
sendProduct,
getLastInfo,
payGuarantee,
authorization,
getOpenid,
userCertWithdraw
} from '@/api/send'
export default {
name:'send',
name: 'send',
components: {
Botton
},
data() {
return {
fileList1: [],
show: false,
},
data() {
return {
fileList1: [],
show: false,
showmoney: false,
showCategory:false,
content:'',
showCategory: false,
content: '',
isshowbox: true,
columns: [],
lastInfo:{},
sortName:'请选择',
form:{
product_id:'', // string 否 物品id
name:'', // string 是 物品名称
sort_id:'', // integer 是 所属分类
price:'', // string 是 价格
description:'', // string 是 物品介绍
images:'', // string 是 物品图片
seller_name:'', // string 否 卖家姓名
seller_mobile:'', // string 否 手机号
package_add:'', // string 是 钱包地址
wechat_num:'', // string 是 微信号
lastInfo: {},
sortName: '',
form: {
product_id: '', // string 否 物品id
name: '', // string 是 物品名称
sort_id: '', // integer 是 所属分类
price: '', // string 是 价格
description: '', // string 是 物品介绍
images: '', // string 是 物品图片
seller_name: '', // string 否 卖家姓名
seller_mobile: '', // string 否 手机号
package_add: '', // string 是 钱包地址
wechat_num: '', // string 是 微信号
},
code:''
}
code: ''
}
},
onLoad(e) {
that = this
if(e.id){
if (e.id) {
this.form.product_id = e.id
this.getDetail()
}
this.code = e.code || ''
this.getLastInfo()
this.sortList()
if(this.code){
if (this.code) {
this.getOpenid()
}
},
onShow() {
},
onShow() {},
methods: {
back(){
//所属分类搜索
async showbox() {
let that = this
that.isshowbox = true
try {
const res = await sort_search(that.sortName)
console.log('sort_search', res)
that.columns = res.list
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('sort_search', err)
}
},
//所属分类确定
// showok() {
// that.isshowbox = false
// },
//列表选择
back() {
uni.navigateBack({})
this.showmoney=false
this.showmoney = false
},
// 获取openid
async getOpenid(){
try {
const res = await getOpenid(this.code)
console.log('getOpenid', res)
uni.setStorageSync('openId',res.openid)
this.userCertWithdraw()
// 保存数据
} catch (err) {
setTimeout(()=>{
uni.showToast({ title:err,icon:'none' })
},300)
uni.redirectTo({
url:'/pages/index/index'
})
console.log('getOpenid', err)
}
async getOpenid() {
try {
const res = await getOpenid(this.code)
console.log('getOpenid', res)
uni.setStorageSync('openId', res.openid)
this.userCertWithdraw()
// 保存数据
} catch (err) {
setTimeout(() => {
uni.showToast({
title: err,
icon: 'none'
})
}, 300)
uni.redirectTo({
url: '/pages/index/index'
})
console.log('getOpenid', err)
}
},
// 缴纳保证金
async userCertWithdraw(){
try {
const openId = uni.getStorageSync('openId')
const res = await userCertWithdraw(openId)
console.log(res.pay_data);
console.log('userCertWithdraw', res)
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: res.pay_data.appId, // 必填,公众号的唯一标识
timestamp: res.pay_data.timeStamp, // 必填,生成签名的时间戳
nonceStr: res.pay_data.nonceStr, // 必填,生成签名的随机串
signature: res.pay_data.paySign, // 必填,签名
jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表
})
wx.ready(function () {
wx.chooseWXPay({
timestamp: res.pay_data.timeStamp, // 时间戳
nonceStr: res.pay_data.nonceStr, // 随机数
package: res.pay_data.package, //
signType: res.pay_data.signType,
paySign: res.pay_data.paySign, // 签名
success: function () {
that.lastInfo.is_cert_withdraw = 1
that.showmoney = false
that.getLastInfo()
toa.success('支付成功')
},
cancel: function () {
setTimeout(()=>{
toa.toast('取消失败')
},200)
uni.navigateBack({})
},
fail: function () {
setTimeout(()=>{
toa.toast('支付失败')
},200)
uni.navigateBack({})
}
})
})
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('userCertWithdraw', err)
}
async userCertWithdraw() {
try {
const openId = uni.getStorageSync('openId')
const res = await userCertWithdraw(openId)
console.log(res.pay_data);
console.log('userCertWithdraw', res)
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: res.pay_data.appId, // 必填,公众号的唯一标识
timestamp: res.pay_data.timeStamp, // 必填,生成签名的时间戳
nonceStr: res.pay_data.nonceStr, // 必填,生成签名的随机串
signature: res.pay_data.paySign, // 必填,签名
jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表
})
wx.ready(function() {
wx.chooseWXPay({
timestamp: res.pay_data.timeStamp, // 时间戳
nonceStr: res.pay_data.nonceStr, // 随机数
package: res.pay_data.package, //
signType: res.pay_data.signType,
paySign: res.pay_data.paySign, // 签名
success: function() {
that.lastInfo.is_cert_withdraw = 1
that.showmoney = false
that.getLastInfo()
toa.success('支付成功')
},
cancel: function() {
setTimeout(() => {
toa.toast('取消失败')
}, 200)
uni.navigateBack({})
},
fail: function() {
setTimeout(() => {
toa.toast('支付失败')
}, 200)
uni.navigateBack({})
}
})
})
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('userCertWithdraw', err)
}
},
// 获取详情
async getDetail(){
try {
const res = await product_detail(this.form.product_id)
// this.form = res.detail
this.form.sort_id = res.detail.sort.id
this.sortName = res.detail.sort.name
this.form.product_id = res.detail.id
this.form.name = res.detail.name
this.form.price = res.detail.price
this.form.description = res.detail.description
res.detail.fileList.forEach(it=>{
it.shortUrl = it.url
it.url = it.fullUrl
})
this.fileList1 = res.detail.fileList
console.log(this.fileList1,'图片');
console.log('getDetail', res)
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('getDetail', err)
}
async getDetail() {
try {
const res = await product_detail(this.form.product_id)
// this.form = res.detail
this.form.sort_id = res.detail.sort.id
this.sortName = res.detail.sort.name
this.form.product_id = res.detail.id
this.form.name = res.detail.name
this.form.price = res.detail.price
this.form.description = res.detail.description
res.detail.fileList.forEach(it => {
it.shortUrl = it.url
it.url = it.fullUrl
})
this.fileList1 = res.detail.fileList
console.log(this.fileList1, '图片');
console.log('getDetail', res)
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('getDetail', err)
}
},
checkNumber(e) {
let val = e.target.value.replace(/(^\s*)|(\s*$)/g, "")
var reg = /[^\d.]/g
// 只能是数字和小数点,不能是其他输入
val = val.replace(reg, "")
// // 保证第一位只能是数字,不能是点
... ... @@ -322,347 +380,395 @@
this.form.price = val;
})
},
async sortList(){
try {
const res = await sortList(2)
this.columns = [res.list]
console.log('sortList', res)
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('sortList', err)
}
async sortList() {
try {
const res = await sortList(2)
this.columns = res.list
console.log('sortList', this.columns, "0")
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('sortList', err)
}
},
async getLastInfo() {
try {
const res = await getLastInfo()
this.lastInfo = res.detail
console.log(1);
if (res.detail.is_cert == 0) {
return this.show = true
}
if (res.detail.is_cert_withdraw != 1 && !this.code) {
this.showmoney = true
}
console.log(2);
console.log(res.detail.is_cert_withdraw != 1, !this.code);
this.form.seller_mobile = res.detail.seller_mobile
this.form.seller_name = res.detail.seller_name
this.form.package_add = res.detail.package_add
this.form.wechat_num = res.detail.wechat_num
console.log('getLastInfo', res)
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('getLastInfo', err)
}
},
open() {
// console.log('open');
},
close() {
this.show = false
this.showmoney = false
// console.log('close');
},
async getLastInfo(){
try {
const res = await getLastInfo()
this.lastInfo = res.detail
console.log(1);
if(res.detail.is_cert==0){ return this.show = true}
if(res.detail.is_cert_withdraw!=1 && !this.code){ this.showmoney = true}
console.log(2);
console.log(res.detail.is_cert_withdraw!=1,!this.code);
this.form.seller_mobile = res.detail.seller_mobile
this.form.seller_name = res.detail.seller_name
this.form.package_add = res.detail.package_add
this.form.wechat_num = res.detail.wechat_num
console.log('getLastInfo', res)
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('getLastInfo', err)
}
},
open() {
// console.log('open');
},
close() {
this.show = false
this.showmoney = false
// console.log('close');
},
// 删除图片
deletePic(event) {
this[`fileList${event.name}`].splice(event.index, 1)
},
// 新增图片
async afterRead(event) {
// 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
let lists = [].concat(event.file)
let fileListLen = this[`fileList${event.name}`].length
lists.map((item) => {
this[`fileList${event.name}`].push({
...item,
status: 'uploading',
message: '上传中'
})
})
for (let i = 0; i < lists.length; i++) {
// 删除图片
deletePic(event) {
this[`fileList${event.name}`].splice(event.index, 1)
},
// 新增图片
async afterRead(event) {
// 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
let lists = [].concat(event.file)
let fileListLen = this[`fileList${event.name}`].length
lists.map((item) => {
this[`fileList${event.name}`].push({
...item,
status: 'uploading',
message: '上传中'
})
})
for (let i = 0; i < lists.length; i++) {
const result = await this.uploadFilePromise(lists[i].url)
console.log(result,'获取的结构');
let item = this[`fileList${event.name}`][fileListLen]
this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
status: 'success',
message: '',
console.log(result, '获取的结构');
let item = this[`fileList${event.name}`][fileListLen]
this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
status: 'success',
message: '',
url: result.fullurl,
shortUrl:result.url
}))
fileListLen++
}
},
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
let a = uni.uploadFile({
url: baseURL + 'common/upload', // 仅为示例,非真实的接口地址
filePath: url,
name: 'file',
shortUrl: result.url
}))
fileListLen++
}
},
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
let a = uni.uploadFile({
url: baseURL + 'common/upload', // 仅为示例,非真实的接口地址
filePath: url,
name: 'file',
formData: {
token:uni.getStorageSync('token') || ''
},
success: (res) => {
setTimeout(() => {
resolve(JSON.parse(res.data).data)
}, 1000)
}
});
})
token: uni.getStorageSync('token') || ''
},
success: (res) => {
setTimeout(() => {
resolve(JSON.parse(res.data).data)
}, 1000)
}
});
})
},
selctCategory(e){
this.sortName = e.value[0].name
this.form.sort_id = e.value[0].id
this.showCategory = false
console.log(e);
selctCategory(e) {
console.log(e)
this.sortName = e.name
this.form.sort_id = e.id
this.isshowbox = false
console.log(this.sortName,this.form.sort_id);
},
// 发布
send(){
send() {
console.log(this.lastInfo);
if(this.lastInfo.is_cert_withdraw!=1 ) return this.showmoney = true
if(this.lastInfo.is_cert==0) return this.show = true
if(this.fileList1.length){
this.form.images = this.fileList1.map(it=>it.shortUrl).join(',')
if (this.lastInfo.is_cert_withdraw != 1) return this.showmoney = true
if (this.lastInfo.is_cert == 0) return this.show = true
if (this.fileList1.length) {
this.form.images = this.fileList1.map(it => it.shortUrl).join(',')
}
console.log(this.form);
this.sendProduct()
},
async sendProduct(){
try {
const res = await sendProduct(this.form)
console.log('sendProduct', res)
setTimeout(()=>{
toa.success(this.form.product_id?'修改成功':'发布成功')
},400)
uni.redirectTo({
url:'/pages/mine/myRelease'
})
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('sendProduct', err)
}
async sendProduct() {
try {
const res = await sendProduct(this.form)
console.log('sendProduct', res)
setTimeout(() => {
toa.success(this.form.product_id ? '修改成功' : '发布成功')
}, 400)
uni.redirectTo({
url: '/pages/mine/myRelease'
})
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('sendProduct', err)
}
},
goRealName(){
goRealName() {
uni.navigateTo({
url:'/pages/index/realName'
url: '/pages/index/realName'
})
},
// 拿code
async authorization(){
try {
const openId = uni.getStorageSync('openId')
if(openId) return this.userCertWithdraw()
const res = await authorization(window.location.href)
console.log('authorization', res)
window.location.href = res.url
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('authorization', err)
}
async authorization() {
try {
const openId = uni.getStorageSync('openId')
if (openId) return this.userCertWithdraw()
const res = await authorization(window.location.href)
console.log('authorization', res)
window.location.href = res.url
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('authorization', err)
}
},
}
}
</script>
<style lang="scss">
page {
background-color: #ffffff;
}
.Send {
.contail {
padding-bottom: 160rpx;
.title {
padding: 32rpx;
box-sizing: border-box;
color: rgba(0, 0, 0, 1);
font-size: 28rpx;
font-weight: 600;
font-family: "PingFang SC";
}
.main {
padding: 0 32rpx;
.bar {
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 32rpx 0;
border-bottom: 1px solid #F0f0f0;
.name {
color: rgba(0, 0, 0, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
text {
color: rgba(252, 67, 56, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
}
}
.barchoose {
color: rgba(0, 0, 0, 0.4);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
image{
width: 24rpx;
height: 16rpx;
}
}
.barlast {
display: flex;
align-items: center;
color: rgba(33, 83, 212, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
image {
margin-left: 12rpx;
width: 16rpx;
height: 32rpx;
}
}
input {
text-align: right;
}
}
.newbar {
padding: 32rpx 0;
box-sizing: border-box;
border-bottom: 1px solid #F0f0f0;
.name {
color: rgba(0, 0, 0, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
}
textarea {
margin-top: 32rpx;
padding: 24rpx;
width: 100%;
height: 200rpx;
box-sizing: border-box;
background-color: #F6F6F6;
}
.upimg {
margin-top: 32rpx;
}
}
}
.popname {
padding: 32rpx;
box-sizing: border-box;
width: 622rpx;
text-align: center;
.title {
color: rgba(0, 0, 0, 0.9);
font-size: 32rpx;
font-weight: 600;
font-family: "PingFang SC";
text-align: center;
}
.contant {
color: rgba(179, 179, 179, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
text-align: center;
}
.btngroup {
margin-top: 80rpx;
display: flex;
align-items: center;
justify-content: space-between;
.concle {
width: 264rpx;
height: 76rpx;
border-radius: 16rpx;
opacity: 1;
line-height: 76rpx;
color: rgba(0, 0, 0, 0.9);
font-size: 28rpx;
font-weight: 500;
font-family: "PingFang SC";
text-align: center;
background: rgba(246, 246, 246, 1);
}
.requt {
width: 264rpx;
height: 76rpx;
color: rgba(0, 0, 0, 0.9);
font-size: 28rpx;
font-weight: 500;
font-family: "PingFang SC";
text-align: center;
line-height: 76rpx;
border-radius: 16rpx;
opacity: 1;
background: rgba(254, 208, 0, 1);
}
}
}
.btn {
position: fixed;
bottom: 50rpx;
left: 0;
width: 100%;
// height: 128rpx;
}
}
</script>
<style lang="scss">
page {
background-color: #ffffff;
}
.Send {
.contail {
padding-bottom: 160rpx;
.title {
padding: 32rpx;
box-sizing: border-box;
color: rgba(0, 0, 0, 1);
font-size: 28rpx;
font-weight: 600;
font-family: "PingFang SC";
}
.main {
padding: 0 32rpx;
.bar {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 32rpx 0;
border-bottom: 1px solid #F0f0f0;
.name {
color: rgba(0, 0, 0, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
text {
color: rgba(252, 67, 56, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
}
}
.barchoose {
color: rgba(0, 0, 0, 0.4);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
input {
text-align: right;
}
image {
width: 24rpx;
height: 16rpx;
}
}
.barlast {
display: flex;
align-items: center;
color: rgba(33, 83, 212, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
image {
margin-left: 12rpx;
width: 16rpx;
height: 32rpx;
}
}
.nameinput {
flex: 1;
input {
text-align: right;
}
}
.barbox {
position: absolute;
right: 0;
z-index: 99;
bottom: -400rpx;
padding: 0 24rpx;
height: 400rpx;
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
box-sizing: border-box;
background-color: #ffffff;
border: 1px solid #F0f0f0;
box-shadow: 5rpx 5rpx 5rpx rgba(0, 0, 0, 0.1);
.bartip {
padding: 24rpx 0;
box-sizing: border-box;
}
}
}
.newbar {
padding: 32rpx 0;
box-sizing: border-box;
border-bottom: 1px solid #F0f0f0;
.name {
color: rgba(0, 0, 0, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
}
textarea {
margin-top: 32rpx;
padding: 24rpx;
width: 100%;
height: 200rpx;
box-sizing: border-box;
background-color: #F6F6F6;
}
.upimg {
margin-top: 32rpx;
}
}
}
.popname {
padding: 32rpx;
box-sizing: border-box;
width: 622rpx;
text-align: center;
.title {
color: rgba(0, 0, 0, 0.9);
font-size: 32rpx;
font-weight: 600;
font-family: "PingFang SC";
text-align: center;
}
.contant {
color: rgba(179, 179, 179, 1);
font-size: 28rpx;
font-weight: 400;
font-family: "PingFang SC";
text-align: center;
}
.btngroup {
margin-top: 80rpx;
display: flex;
align-items: center;
justify-content: space-between;
.concle {
width: 264rpx;
height: 76rpx;
border-radius: 16rpx;
opacity: 1;
line-height: 76rpx;
color: rgba(0, 0, 0, 0.9);
font-size: 28rpx;
font-weight: 500;
font-family: "PingFang SC";
text-align: center;
background: rgba(246, 246, 246, 1);
}
.requt {
width: 264rpx;
height: 76rpx;
color: rgba(0, 0, 0, 0.9);
font-size: 28rpx;
font-weight: 500;
font-family: "PingFang SC";
text-align: center;
line-height: 76rpx;
border-radius: 16rpx;
opacity: 1;
background: rgba(254, 208, 0, 1);
}
}
}
.btn {
position: fixed;
bottom: 50rpx;
left: 0;
width: 100%;
// height: 128rpx;
padding: 16rpx 32rpx;
padding-bottom: 100rpx;
box-sizing: border-box;
opacity: 1;
background: rgba(255, 255, 255, 1);
.paybtn {
width: 100%;
height: 96rpx;
line-height: 96rpx;
text-align: center;
border-radius: 28rpx;
opacity: 1;
color: rgba(0, 0, 0, 0.9);
font-size: 32rpx;
font-weight: 600;
font-family: "PingFang SC";
background: linear-gradient(134.8deg, rgba(255, 232, 100, 1) 0%, rgba(255, 216, 0, 1) 100%);
}
}
}
padding-bottom: 100rpx;
box-sizing: border-box;
opacity: 1;
background: rgba(255, 255, 255, 1);
.paybtn {
width: 100%;
height: 96rpx;
line-height: 96rpx;
text-align: center;
border-radius: 28rpx;
opacity: 1;
color: rgba(0, 0, 0, 0.9);
font-size: 32rpx;
font-weight: 600;
font-family: "PingFang SC";
background: linear-gradient(134.8deg, rgba(255, 232, 100, 1) 0%, rgba(255, 216, 0, 1) 100%);
}
}
}
}
.u-textarea {
margin-top: 32rpx;
min-height: 200rpx;
background: #f4f5f7;
}
/deep/ .uni-textarea-wrapper {
height: 100% !important;
}
}
</style>
... ...
<template>
<view class="">
<rich-text :nodes="text"></rich-text>
</view>
</template>
<view class="" style="padding: 32rpx;">
<!-- <rich-text :nodes="text"></rich-text> -->
<u-parse :content="text" noData="数据加载中..." @preview="preview" @navigate="navigate" ></u-parse>
</view>
</template>
<script>
import { getAgreement } from '@/api/login.js'
import {
getAgreement
} from '@/api/login.js'
import uParse from '@/components/u-parse/u-parse.vue'
export default {
components: {
uParse
},
data() {
return {
text: '',
type:''
type: ''
}
},
onLoad(e) {
this.type = e.type
wx.setNavigationBarTitle({ title: e.type==1?'用户协议':e.type==2?'隐私政策':'' })
wx.setNavigationBarTitle({
title: e.type == 1 ? '用户协议' : e.type == 2 ? '隐私政策' : ''
})
this.getAgreement()
},
methods: {
async getAgreement(){
try {
const res = await getAgreement(this.type)
this.text = res.agreement
console.log('getAgreement', res)
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('getAgreement', err)
}
async getAgreement() {
uni.showLoading({
title: '加载中',
mask: true
})
try {
const res = await getAgreement(this.type)
this.text = res.agreement
uni.hideLoading();
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
}
},
},
}
</script>
<style>
}
</script>
<style>
@import url("@/components/u-parse/u-parse.css");
</style>
... ...
... ... @@ -5,10 +5,10 @@
<view class="bar flexwrap">
<view class="name">
用户名
手机号
</view>
<view class="last name">
<input v-model="account" maxlength="16" type="text" value="" placeholder="请输入用户名" />
<input v-model="account" maxlength="16" type="text" value="" placeholder="请输入手机号" />
</view>
</view>
<view class="bar flexwrap">
... ... @@ -16,7 +16,7 @@
密码:
</view>
<view class="last name">
<input v-model="password" maxlength="16" type="password" value="" placeholder="请输入密码" />
<input v-model="password" maxlength="16" type="password" value="" placeholder="请输入密码"/>
</view>
</view>
<view class="loginbtn" @click="doLogin">
... ...
... ... @@ -17,7 +17,7 @@
验证码:
</view>
<view class="lastname">
<input v-model="captcha" maxlength="" type="number" value="" placeholder="请输入验证码" />
<input v-model="captcha" maxlength="4" type="number" value="" placeholder="请输入验证码" />
<view class="code" @click="getCode">
{{num==0?'获取验证码':num + '秒重新发送'}}
</view>
... ...
<template>
<view class="login">
<view class="icon">
<image class="bgimg" src="../../static/ic_logo.png" mode=""></image>
<view class="bar flexwrap">
<view class="name">
用户名:
</view>
<view class="lastname">
<input v-model="username" maxlength="16" type="text" value="" placeholder="请输入用户名" />
</view>
</view>
<view class="bar flexwrap">
<view class="name">
密码:
</view>
<view class="lastname">
<input v-model="password" maxlength="16" type="text" value="" placeholder="请输入密码" />
</view>
</view>
<view class="bar flexwrap">
<view class="name">
手机号:
</view>
<view class="lastname">
<input v-model="mobile" maxlength="11" type="number" value="" placeholder="请输入手机号" />
</view>
</view>
<view class="bar flexwrap">
<view class="name">
验证码:
</view>
<view class="lastname">
<input v-model="code" maxlength="6" type="text" value="" placeholder="请输入验证码" />
<view class="code" @click="getCode">
{{num==0?'获取验证码':num + '秒重新发送'}}
</view>
</view>
</view>
<view class="loginbtn" @click="toRegister">
注册
</view>
<view class="passway" @click="goLogin">
<text>已有账号,直接登录</text>
</view>
<view class="user">
<image v-if="isSelect" @click="isSelect=!isSelect" src="/static/icon25.png" mode=""></image>
<image v-else @click="isSelect=!isSelect" src="/static/icon24.png" mode=""></image>
我已阅读并同意
<text style="margin-left: 10rpx;" @click="toAgree(1)"> 用户协议、</text><text @click="toAgree(2)">隐私政策</text>
</view>
<template>
<view class="login">
<view class="icon">
<image class="bgimg" src="../../static/ic_logo.png" mode=""></image>
<view class="bar flexwrap">
<view class="name">
用户名:
</view>
<view class="lastname">
<input v-model="username" maxlength="16" type="text" value="" placeholder="请输入用户名" />
</view>
</view>
<view class="bar flexwrap">
<view class="name">
密码:
</view>
<view class="lastname">
<input v-model="password" maxlength="16" type="text" value="" placeholder="请输入密码" />
</view>
</view>
<view class="bar flexwrap">
<view class="name">
手机号:
</view>
<view class="lastname">
<input v-model="mobile" maxlength="11" type="number" value="" placeholder="请输入手机号" />
</view>
</view>
<view class="bar flexwrap">
<view class="name">
验证码:
</view>
<view class="lastname">
<input v-model="code" maxlength="4" type="text" value="" placeholder="请输入验证码" />
<view class="code" @click="getCode">
{{num==0?'获取验证码':num + '秒重新发送'}}
</view>
</view>
</view>
<view class="loginbtn" @click="toRegister">
注册
</view>
<view class="passway" @click="goLogin">
<text>已有账号,直接登录</text>
</view>
<view class="user">
<image v-if="isSelect" @click="isSelect=!isSelect" src="/static/icon25.png" mode=""></image>
<image v-else @click="isSelect=!isSelect" src="/static/icon24.png" mode=""></image>
我已阅读并同意
<text style="margin-left: 10rpx;" @click="toAgree(1)"> 用户协议、</text><text @click="toAgree(2)">隐私政策</text>
</view>
</view>
</view>
</template>
</view>
</template>
<script>
import {sendCode,register} from '@/api/login.js'
import {toa} from '@/utils/toast.js'
export default {
data() {
return {
username:'',
password:'',
mobile:'',
code:'',
clearId:'',
num:0,
isSelect:false
};
import {
sendCode,
register
} from '@/api/login.js'
import {
toa
} from '@/utils/toast.js'
export default {
data() {
return {
username: '',
password: '',
mobile: '',
code: '',
clearId: '',
num: 0,
isSelect: false
};
},
methods: {
goLogin() {
... ... @@ -77,178 +81,185 @@
// url:'/pages/login/login'
// })
},
toRegister(){
if(!this.username) return toa.toast('请输入用户名')
if(!this.password) return toa.toast('请输入密码')
if(!this.mobile) return toa.toast('请输入手机号')
if(!this.code) return toa.toast('请输入验证码')
if(!this.isSelect) return toa.toast('请先同意用户协议和隐私政策')
toRegister() {
if (!this.username) return toa.toast('请输入用户名')
if (!this.password) return toa.toast('请输入密码')
if (!this.mobile) return toa.toast('请输入手机号')
if (!this.code) return toa.toast('请输入验证码')
if (!this.isSelect) return toa.toast('请先同意用户协议和隐私政策')
this.register()
},
async register(){
try {
const res = await register(this.username,this.password,this.mobile,this.code)
console.log('register', res)
setTimeout(()=>{
toa.success('注册成功')
},200)
uni.navigateBack({})
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('register', err)
}
async register() {
try {
const res = await register(this.username, this.password, this.mobile, this.code)
console.log('register', res)
setTimeout(() => {
toa.success('注册成功')
}, 200)
uni.navigateBack({})
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('register', err)
}
},
getCode(){
if(this.num>0) return
if(!this.mobile) return toa.toast('请先输入手机号')
if (!(/^1[34578]\d{9}$/.test(this.mobile))) return toa.toast('请输入正确手机号')
getCode() {
if (this.num > 0) return
if (!this.mobile) return toa.toast('请先输入手机号')
if (!(/^1[345789]\d{9}$/.test(this.mobile))) return toa.toast('请输入正确手机号')
this.sendCode()
},
async sendCode(){
try {
const res = await sendCode(this.mobile,'register')
toa.success('发送成功')
this.setInter()
console.log('sendCode', res)
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('sendCode', err)
}
async sendCode() {
try {
const res = await sendCode(this.mobile, 'register')
toa.success('发送成功')
this.setInter()
console.log('sendCode', res)
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('sendCode', err)
}
},
setInter (){
this.num=60
this.clearId = setInterval(() => {
this.num --
}, 1000)
setInter() {
this.num = 60
this.clearId = setInterval(() => {
this.num--
}, 1000)
},
toAgree(type){
toAgree(type) {
uni.navigateTo({
url:'/pages/login/agreement?type='+ type
url: '/pages/login/agreement?type=' + type
})
}
},
onHide(){
onHide() {
this.num = 0
clearInterval(this.clearId)
},
watch: {
num(newValue, oldValue) {
if(newValue==0){
if (newValue == 0) {
this.num = 0
clearInterval(this.clearId)
}
}
},
}
</script>
<style lang="scss">
.login {
padding: 0 48rpx;
box-sizing: border-box;
.icon {
.bgimg {
margin-top: 100rpx;
margin-left: 50%;
transform: translate(-50%);
margin-bottom: 24rpx;
width: 184rpx;
height: 184rpx;
}
.bar {
border-bottom: 1px solid #f0f0f0;
padding: 40rpx 0;
color: rgba(0, 0, 0, 1);
font-size: 32rpx;
font-weight: 500;
font-family: "PingFang SC";
.name {
width: 180rpx;
}
.lastname {
flex: 1;
position: relative;
input {
},
}
</script>
<style lang="scss">
.login {
padding: 0 48rpx;
padding-bottom: 32rpx;
box-sizing: border-box;
.icon {
.bgimg {
margin-top: 100rpx;
margin-left: 50%;
transform: translate(-50%);
margin-bottom: 24rpx;
width: 184rpx;
height: 184rpx;
}
.bar {
border-bottom: 1px solid #f0f0f0;
padding: 40rpx 0;
color: rgba(0, 0, 0, 1);
font-size: 32rpx;
font-weight: 500;
font-family: "PingFang SC";
.name {
width: 180rpx;
}
.lastname {
flex: 1;
position: relative;
input {
// width: 260rpx;
width: 100%;
}
.code {
position: absolute;
right: 0;
top: 50%;
transform: translate(-10%, -50%);
color: rgba(0, 0, 0, 0.26);
font-size: 32rpx;
font-weight: 400;
font-family: "PingFang SC";
}
}
}
.loginbtn {
margin-top: 100rpx;
height: 88rpx;
border-radius: 28rpx;
opacity: 1;
color: rgba(0, 0, 0, 0.9);
font-size: 32rpx;
font-weight: 600;
font-family: "PingFang SC";
text-align: center;
line-height: 88rpx;
background: rgba(254, 208, 0, 1);
}
.passway {
text-align: right;
margin-top: 16rpx;
text {
color: rgba(254, 208, 0, 1);
font-size: 26rpx;
font-weight: 400;
font-family: "PingFang SC";
}
}
width: 100%;
}
.code {
position: absolute;
right: 0;
top: 50%;
transform: translate(-10%, -50%);
color: rgba(0, 0, 0, 0.26);
font-size: 32rpx;
font-weight: 400;
font-family: "PingFang SC";
}
}
}
.loginbtn {
margin-top: 100rpx;
height: 88rpx;
border-radius: 28rpx;
opacity: 1;
color: rgba(0, 0, 0, 0.9);
font-size: 32rpx;
font-weight: 600;
font-family: "PingFang SC";
text-align: center;
line-height: 88rpx;
background: rgba(254, 208, 0, 1);
}
.passway {
text-align: right;
margin-top: 16rpx;
text {
color: rgba(254, 208, 0, 1);
font-size: 26rpx;
font-weight: 400;
font-family: "PingFang SC";
}
}
.user {
position: absolute;
width: 100%;
left: 50%;
bottom: 16rpx;
transform: translateX(-50%);
// margin-top: 200rpx;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
color: rgba(100, 101, 102, 1);
font-size: 24rpx;
font-weight: 400;
font-family: "PingFang SC";
image {
margin-right: 22rpx;
width: 36rpx;
height: 36rpx;
}
text {
margin-right: 24rpx;
color: rgba(87, 107, 149, 1);
font-size: 24rpx;
font-weight: 400;
font-family: "PingFang SC";
}
}
}
}
// position: fixed;
// width: 100%;
// left: 50%;
// bottom: 64rpx;
// transform: translateX(-50%);
margin-top: 100rpx;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
color: rgba(100, 101, 102, 1);
font-size: 24rpx;
font-weight: 400;
font-family: "PingFang SC";
image {
margin-right: 22rpx;
width: 36rpx;
height: 36rpx;
}
text {
margin-right: 24rpx;
color: rgba(87, 107, 149, 1);
font-size: 24rpx;
font-weight: 400;
font-family: "PingFang SC";
}
}
}
}
</style>
... ...
... ... @@ -5,7 +5,8 @@
<u-tabs :list="list2" lineColor="#FED000" :scrollable="false" @click="onclick"></u-tabs>
</u-sticky>
<view class="group">
<view class="item" v-for="(item,idx) in showlist" :key="idx" @click.stop="ondetail(item.id,item.orderinfo.product_id)">
<view class="item" v-for="(item,idx) in showlist" :key="idx"
@click.stop="ondetail(item.id,item.orderinfo.product_id)">
<view class="top flexA">
<view class="left flexA">
<image src="/static/order.png" mode=""></image>
... ... @@ -45,8 +46,10 @@
<view v-if="item.license_preview" class="flexC yellow"
@click.stop="openshow(item.id,idx,item.license_preview,item.status)">交易证明
</view>
<view v-if="reChest(item.status)" class="flexC" @click.stop="order_confirm(item.id,idx,1)">已收货</view>
<view v-if="reChest(item.status)" class="flexC" @click.stop="order_confirm(item.id,idx,2)">未收货</view>
<view v-if="reChest(item.status)" class="flexC" @click.stop="order_confirm(item.id,idx,1)">已收货
</view>
<view v-if="reChest(item.status)" class="flexC" @click.stop="order_confirm(item.id,idx,2)">未收货
</view>
</view>
</view>
</view>
... ... @@ -55,7 +58,7 @@
<view class="popTitle">
转赠证明
</view>
<image class="popImage" :src="showimg" mode="aspectFit"></image>
<image class="popImage" :src="showimg" mode="aspectFit"></image>
<view class="popBtn flexA">
<view class="btn flexC" v-if="reChest(showstatus)" @click="order_confirm(showid,showindex,2)">未收货
</view>
... ... @@ -94,6 +97,10 @@
showindex: "",
showstatus: "",
showimg: "",
//弹窗数据
conid: "",
conidx: "",
contype: "",
}
},
onLoad() {
... ... @@ -101,29 +108,30 @@
},
methods: {
// 跳转详情
ondetail(id,shopId) {
ondetail(id, shopId) {
console.log(id)
uni.navigateTo({
url: `/pages/mine/order_detail?id=${id}&shopId=${shopId}`
})
},
//确认收货
async order_confirm(id, idx, type) {
async reqedconfirm() {
let obj = {
order_id: id,
type: type,
order_id: this.conid,
type: this.contype,
}
console.log(this.conid,this.contype,this.conidx,"000")
try {
const res = await order_confirm(obj)
console.log('order_confirm', res)
this.show = false
if (this.typeindex == 2) {
this.showlist.splice(idx, 1)
this.showlist.splice(this.conidx, 1)
} else {
if (type == 2) {
this.showlist[idx].status = 5
if (this.contype == 2) {
this.showlist[this.conidx].status = 5
} else {
this.showlist[idx].status = 6
this.showlist[this.conidx].status = 6
}
}
// 保存数据
... ... @@ -135,6 +143,33 @@
console.log('order_confirm', err)
}
},
//确认收货
async order_confirm(id, idx, type) {
let that = this
that.conid = id
that.conidx = idx
that.contype = type
if (type == 1) {
uni.showModal({
content: "是否确认收货",
success(res) {
if (res.confirm) {
that.reqedconfirm()
}
}
})
} else {
uni.showModal({
content: "是否未收到货",
success(res) {
if (res.confirm) {
that.reqedconfirm()
}
}
})
}
},
// 查看交易证明
openshow(id, index, img, status) {
this.showimg = img
... ... @@ -236,7 +271,7 @@
color: rgba(0, 0, 0, 0.6);
font-size: 26rpx;
}
}
... ... @@ -272,6 +307,7 @@
.right {
font-size: 30rpx;
font-weight: 700;
.staright {
margin-top: 12rpx;
color: rgba(0, 0, 0, 0.3);
... ...
... ... @@ -56,10 +56,10 @@
<image :src="`/static/bot${idx+1}.png`" mode=""></image>
{{item.name}}
</view>
<view class="item" v-for="(item,idx) in botList" :key="item.id" @click="toBotDetail(item.id)">
<!-- <view class="item" v-for="(item,idx) in botList" :key="item.id" @click="toBotDetail(item.id)">
<image :src="item.image_preview" mode=""></image>
{{item.title}}
</view>
</view> -->
</view>
</view>
... ... @@ -155,7 +155,9 @@
setTimeout(()=>{
toa.success('退出成功')
},200)
uni.clearStorage()
// uni.clearStorage()
uni.removeStorageSync('token')
uni.removeStorageSync('userInfo')
uni.navigateTo({
url:'/pages/login/login'
})
... ... @@ -385,7 +387,7 @@
padding: 32rpx 0;
box-sizing: border-box;
width: 702rpx;
height: 464rpx;
border-radius: 24rpx;
opacity: 1;
background: rgba(255, 255, 255, 1);
... ...
... ... @@ -6,7 +6,7 @@
<image src="/static/2.png" mode=""></image>
<text>{{detail.buyer_name}}</text>
</view>
<view class="topbox" @click="ondetail(detail.id)">
<view class="topbox" @click="ondetail">
<view class="boxtop flexD">
<view class="order">
订单号:{{detail.order_no}}
... ... @@ -84,7 +84,7 @@
},
methods: {
//跳转详情
ondetail(item) {
ondetail() {
uni.navigateTo({
url: "/pages/index/detail?id=" + this.shopId
})
... ...
... ... @@ -4,7 +4,7 @@
<u-tabs :list="list2" lineColor="#FED000" :scrollable="false" @click="onclick"></u-tabs>
</u-sticky>
<view class="group">
<view class="item" v-for="(item,idx) in list" :key="idx" @click.stop="ondetail(item.id)">
<view class="item" v-for="(item,idx) in list" :key="idx" @click.stop="ondetail(item.id,item.orderinfo.product_id)">
<view class="top flexA">
<view class="left flexA">
<image src="/static/order.png" mode=""></image>
... ... @@ -17,7 +17,7 @@
<text v-if="item.status==2">待发送</text>
<text v-if="item.status==3">待买家确认</text>
<text v-if="item.status==4">已收货</text>
<text v-if="item.status==5" >平台裁决</text>
<text v-if="item.status==5">平台裁决</text>
<text v-if="item.status==6">已完成</text>
<text v-if="item.status==7">交易失败</text>
</view>
... ... @@ -31,7 +31,7 @@
<view class="name">买方:{{item.buyer_name}}</view>
</view>
</view>
<view class="right" >
<view class="right">
<text style="font-size: 20rpx;">¥</text>{{item.orderinfo.price}}
<view style=" color: rgba(0,0,0,0.4);font-size: 24rpx;" v-if="item.status==5">
审核中
... ... @@ -45,9 +45,12 @@
<view class="botBtn flexA">
<view v-if="reseller(item.status)" class="flexC" @click.stop="openshowBuyer(item)">买家信息</view>
<view v-if="reseller(item.status)" class="flexC" @click.stop="order_send(item.id,idx)">发货</view>
<view v-if="!item.license_preview&&(item.status==2||item.status==3)" class="flexC yellow" @click.stop="openimag(item.id,idx,1)">上传转赠证明</view>
<view v-if="item.license_preview" class="flexC yellow" @click.stop="openshow(item.license_preview)">查看交易证明</view>
<view v-if="item.license_preview" class="flexC yellow" @click.stop="openimag(item.id,idx,2)">重新上传证明</view>
<view v-if="!item.license_preview&&(item.status==2||item.status==3)" class="flexC yellow"
@click.stop="openimag(item.id,idx,1)">上传转赠证明</view>
<view v-if="item.license_preview" class="flexC yellow" @click.stop="openshow(item.license_preview)">
查看交易证明</view>
<view v-if="item.license_preview" class="flexC yellow" @click.stop="openimag(item.id,idx,2)">重新上传证明
</view>
</view>
</view>
</view>
... ... @@ -69,31 +72,41 @@
买家信息
</view>
<view class="list flexA" v-if="code">
<view class="left"><text style="color: #FC4338;">*</text>接收账户:</view>
<view class="right flexA">
<view class="fw700">{{code}}</view>
<view style="margin-left: 16rpx;color: rgba(0,0,0,0.4);" @click.stop="copy(code)">复制</view>
<view class="left flexwrap">
<text style="color: #FC4338;">*</text>
<text class="leftsize">接收账户:</text>
<view class="fw700">{{code}}</view></view>
<view class="right">
<view style="margin-left: 16rpx;color: rgba(0,0,0,0.4); " @click.stop="copy(code)">复制</view>
</view>
</view>
<view class="list flexA">
<view class="left"><text style="color: #FC4338;">*</text>微信号:</view>
<view class="right flexA">
<view class="fw700">{{wechart}}</view>
<view class="left flexwrap">
<text style="color: #FC4338;">*</text>
<text class="leftsize">微信号:</text>
<view class="fw700">{{wechart}}</view></view>
<view class="right ">
<view style="margin-left: 16rpx;color: rgba(0,0,0,0.4);" @click.stop="copy(wechart)">复制</view>
</view>
</view>
<view class="list flexA" v-if="name">
<view class="left">联系人:</view>
<view class="left">
<text class="leftsize">联系人:</text>
</view>
<view class="right flexA">
<view class="fw700">{{name}}</view>
</view>
</view>
<view class="list flexA" v-if="phone">
<view class="left">联系电话:</view>
<view class="left">
<text class="leftsize">联系电话:</text>
</view>
<view class="right flexA">
<view class="fw700">{{phone}}</view>
<view style="margin-left: 16rpx;" >
<a :href="'tel:' + phone" ><image src="/static/phone.png" mode=""></image></a>
<view style="margin-left: 16rpx;">
<a :href="'tel:' + phone">
<image src="/static/phone.png" mode=""></image>
</a>
</view>
</view>
</view>
... ... @@ -153,16 +166,16 @@
},
methods: {
//拨打买家电话
gophone(phone){
gophone(phone) {
console.log(phone)
uni.makePhoneCall({
phoneNumber:phone//仅为示例
phoneNumber: phone //仅为示例
});
},
// 跳转详情
ondetail(id){
ondetail(id,shopId) {
uni.navigateTo({
url:"/pages/mine/order_detail?id="+id
url: `/pages/mine/order_detail?id=${id}&shopId=${shopId}`
})
},
// 状态筛选
... ... @@ -183,7 +196,7 @@
console.log(this.licenimg)
},
//上传证明
openimag(id, imgindex,type) {
openimag(id, imgindex, type) {
let that = this
that.imgid = id
that.imgindex = imgindex
... ... @@ -201,7 +214,7 @@
},
success: (uploadFileRes) => {
uni.showToast({
title:type==1?'上传证明成功':'重新上传证明成功'
title: type == 1 ? '上传证明成功' : '重新上传证明成功'
})
let data = JSON.parse(uploadFileRes.data);
console.log(data);
... ... @@ -336,7 +349,7 @@
.left {
color: rgba(50, 50, 51, 1);
font-size: 26rpx;
image {
margin-right: 8rpx;
width: 32rpx;
... ... @@ -345,7 +358,7 @@
}
.right {
color: rgba(0, 0, 0, 0.6);
font-size: 26rpx;
}
... ... @@ -383,7 +396,8 @@
text-align: center;
font-size: 30rpx;
font-weight: 700;
a{
a {
text-decoration: none;
color: #000000;
}
... ... @@ -406,7 +420,7 @@
margin-right: 24rpx;
color: rgba(0, 0, 0, 0.6);
font-size: 24rpx;
padding: 12rpx 14rpx;
padding: 12rpx 14rpx;
// width: 144rpx;
height: 56rpx;
border-radius: 12rpx;
... ... @@ -420,7 +434,8 @@
border-color: rgba(254, 208, 0, 1);
color: rgba(0, 0, 0, 0.9);
}
.yellow:nth-last-child(1){
.yellow:nth-last-child(1) {
margin-right: 0;
}
}
... ... @@ -489,8 +504,19 @@
color: rgba(0, 0, 0, 0.9);
font-size: 28rpx;
justify-content: space-between;
.left{
flex: 1;
.leftsize{
width: 150rpx;
}
.fw700{
word-break: break-all;
flex: 1;
}
}
.right {
image {
margin-top: 5rpx;
width: 32rpx;
... ...
<template>
<view class="">
<image class="bg" src="/static/takeMoneyBg.png" mode=""></image>
<image class="bg" src="/static/takeMoneyBg.png" mode=""></image>
<view class="top">
<view >账户余额:</view>
<view > <text style="32rpx">¥</text>{{money}}</view>
<view v-if="type==1">账户余额:</view>
<view v-else>保证金余额:</view>
<view> <text style="32rpx">¥</text>{{money}}</view>
</view>
<view class="center">
<view class="title" v-if="type==1">提现金额</view>
<view class="inputPrice" v-if="type==1">
<view class="">
¥<input type="text" @input="checkNumber" v-model="form.price"/>
¥<input type="text" @input="checkNumber" v-model="form.price" />
</view>
<view class="right" @click="takePrice">全部提现</view>
</view>
<!-- 支付要输入的信息 -->
<view class="payInput" v-if="form.withdraw_type==2">
<view class="payInput" v-if="form.withdraw_type==2">
<view class="list">
<view class="input" >支付宝收款姓名:</view>
<view class="input">支付宝收款姓名:</view>
<input type="text" v-model="form.withdraw_name" placeholder="请输入" value="" />
</view>
<view class="list">
<view class="input">支付宝绑定的账号:</view>
<input type="text" v-model="form.withdraw_mobile" maxlength="11" placeholder="请输入" value="" />
<input type="text" v-model="form.withdraw_mobile" placeholder="请输入" value="" />
</view>
</view>
<view class="payInput" v-if="form.withdraw_type==3">
<view class="payInput" v-if="form.withdraw_type==3">
<view class="list">
<view class="input">提现银行:</view>
<input type="text" v-model="form.bank_name" placeholder="请选择" value="" />
</view>
<view class="list">
<view class="input">银行卡号:</view>
<input type="number" v-model="form.bank_num" placeholder="请输入" value="" />
<input type="number" v-model="form.bank_num" placeholder="请输入" value="" />
</view>
<view class="list">
<view class="input">持卡人姓名:</view>
<input type="number" v-model="form.name" maxlength="11" placeholder="请输入" value="" />
<input type="text" v-model="form.name" placeholder="请输入" value="" />
</view>
</view>
<view class="line" v-if="type==1"></view>
<view class="title" style="margin-top: 30rpx;">提现方式</view>
<!-- 提现方式 -->
<view class="payType">
<view class="list" @click="toggleType(1)">
... ... @@ -51,7 +52,7 @@
</view>
<view class="right">
<image v-if="form.withdraw_type==1" src="/static/checked.png" mode=""></image>
<image v-else src="/static/notCheck.png" mode=""></image>
<image v-else src="/static/notCheck.png" mode=""></image>
</view>
</view>
<view class="list" @click="toggleType(2)">
... ... @@ -61,7 +62,7 @@
</view>
<view class="right">
<image v-if="form.withdraw_type==2" src="/static/checked.png" mode=""></image>
<image v-else src="/static/notCheck.png" mode=""></image>
<image v-else src="/static/notCheck.png" mode=""></image>
</view>
</view>
<view class="list" @click="toggleType(3)">
... ... @@ -71,80 +72,93 @@
</view>
<view class="right">
<image v-if="form.withdraw_type==3" src="/static/checked.png" mode=""></image>
<image v-else src="/static/notCheck.png" mode=""></image>
<image v-else src="/static/notCheck.png" mode=""></image>
</view>
</view>
</view>
<view class="Withdrawal flexC" @click="takeMoney">提现</view>
<view class="tips">
温馨提示:为了平台更好的服务于平台用户,提示时平台将会提取交易金额的10%手续费用于维持平台的运营工作
<view class="tips" v-if="type==1">
温馨提示:为了能给您带来更好的服务,琉璃藏宝阁平台将抽取订单余额的{{withdraw_percent}}%作为交易手续费,账户余额为抽取手续费之后的金额,提现足额到账。
</view>
<view class="tips" v-else>
温馨提示:保证金不收取任何手续费,可随时提现。若您违反了琉璃藏宝阁平台用户规则,平台将扣除部分保证金。
</view>
</view>
</view>
</template>
</view>
</template>
<script>
import {toa} from '@/utils/toast.js'
import { getUserInfo,takeMoney,takeBail } from '@/api/mine.js'
export default{
import {
toa
} from '@/utils/toast.js'
import {
getUserInfo,
takeMoney,
takeBail
} from '@/api/mine.js'
export default {
data() {
return {
payType:'1',
money:0,
price:'',
form:{
price:'', // integer 否 提现金额
withdraw_type:1, // integer 是 提现方式:1=微信2=支付宝3=银行卡
withdraw_name:'', // string 否 支付宝收款姓名
withdraw_mobile:'', // string 否 支付宝绑定的手机号
bank_name:'', // string 否 提现银行
bank_num:'', // string 否 银行卡号
name:'', // string 否 持卡人姓名
payType: '1',
money: 0,
price: '',
form: {
price: '', // integer 否 提现金额
withdraw_type: 1, // integer 是 提现方式:1=微信2=支付宝3=银行卡
withdraw_name: '', // string 否 支付宝收款姓名
withdraw_mobile: '', // string 否 支付宝绑定的手机号
bank_name: '', // string 否 提现银行
bank_num: '', // string 否 银行卡号
name: '', // string 否 持卡人姓名
},
type:1
type: 1,
withdraw_percent:"",
}
},
onLoad(e) {
// 1 是余额 2是保证金
this.type= e.type
this.type = e.type
},
onShow() {
this.getUserInfo()
this.getUserInfo()
},
methods: {
async getUserInfo(){
try {
const res = await getUserInfo()
if(this.type==1){
this.money = res.user.money
}else {
this.money = res.user.score
this.form.price = res.user.score
async getUserInfo() {
try {
const res = await getUserInfo()
if (this.type == 1) {
this.money = res.user.money
this.withdraw_percent=res.user.withdraw_percent
} else {
this.money = res.user.score
this.form.price = res.user.score
}
console.log('getUserInfo', res)
// 保存数据
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
console.log('getUserInfo', err)
}
console.log('getUserInfo', res)
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('getUserInfo', err)
}
},
// 切换支付方式
toggleType(type){
toggleType(type) {
this.form.withdraw_type = type
},
// 提现全部按钮
takePrice(){
if(this.money<=0) return toa.toast('账户余额不足')
takePrice() {
if (this.money <= 0) return toa.toast('账户余额不足')
this.form.price = this.money
},
checkNumber(e) {
let val = e.target.value.replace(/(^\s*)|(\s*$)/g, "")
var reg = /[^\d.]/g
// 只能是数字和小数点,不能是其他输入
val = val.replace(reg, "")
// // 保证第一位只能是数字,不能是点
... ... @@ -158,79 +172,86 @@
this.form.price = val;
})
},
// 提现功能按钮
takeMoney(){
if(this.money<=0) return toa.toast('账户余额不足')
if(!this.money) return toa.toast('请输入提现金额')
if(this.form.withdraw_type==1 && this.form.price<1) return toa.toast('微信提现最少提现1元')
if(this.form.withdraw_type==2 && !this.form.withdraw_name ) return toa.toast('请输入支付宝收款姓名')
if(this.form.withdraw_type==2 && !this.form.withdraw_mobile ) return toa.toast('请输入支付宝收款手机号')
if(this.form.withdraw_type==3 && !this.form.bank_name ) return toa.toast('请输入银行卡提现银行')
if(this.form.withdraw_type==3 && !this.form.bank_num ) return toa.toast('请输入银行卡号')
if(this.form.withdraw_type==3 && !this.form.name ) return toa.toast('请输入持卡人姓名')
takeMoney() {
if (this.money <= 0) return toa.toast('账户余额不足')
if (!this.money) return toa.toast('请输入提现金额')
if (this.form.withdraw_type == 1 && this.form.price < 1) return toa.toast('微信提现最少提现1元')
if (this.form.withdraw_type == 2 && !this.form.withdraw_name) return toa.toast('请输入支付宝收款姓名')
if (this.form.withdraw_type == 2 && !this.form.withdraw_mobile) return toa.toast('请输入支付宝收款手机号')
if (this.form.withdraw_type == 3 && !this.form.bank_name) return toa.toast('请输入银行卡提现银行')
if (this.form.withdraw_type == 3 && !this.form.bank_num) return toa.toast('请输入银行卡号')
if (this.form.withdraw_type == 3 && !this.form.name) return toa.toast('请输入持卡人姓名')
console.log(this.form);
if(this.type==1){
if(this.form.withdraw_type==1){
if (this.type == 1) {
if (this.form.withdraw_type == 1) {
toa.toast('微信提现暂未开放,敬请期待')
}else {
} else {
this.toTakeMoney()
}
}else {
if(this.form.withdraw_type==1){
} else {
if (this.form.withdraw_type == 1) {
toa.toast('微信提现暂未开放,敬请期待')
}else {
} else {
this.takeBail()
}
}
},
async toTakeMoney(){
async toTakeMoney() {
try {
const res = await takeMoney(this.form)
setTimeout(()=>{
toa.success('提现提交成功,请等待审核')
},200)
for (let key in this.form) {
this.form[key]=''
}
this.form.withdraw_type = 1
this.getUserInfo()
console.log('takeMoney', res)
// 保存数据
const res = await takeMoney(this.form)
setTimeout(() => {
toa.success('提现提交成功,请等待审核')
}, 200)
for (let key in this.form) {
this.form[key] = ''
}
this.form.withdraw_type = 1
this.getUserInfo()
console.log('takeMoney', res)
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('takeMoney', err)
uni.showToast({
title: err,
icon: 'none'
})
console.log('takeMoney', err)
}
},
async takeBail(){
async takeBail() {
try {
const res = await takeBail(this.form)
setTimeout(()=>{
toa.success('提现提交成功,请等待审核')
},200)
for (let key in this.form) {
this.form[key]=''
}
this.form.withdraw_type = 1
this.getUserInfo()
console.log('takeMoney', res)
// 保存数据
const res = await takeBail(this.form)
setTimeout(() => {
toa.success('提现提交成功,请等待审核')
}, 200)
for (let key in this.form) {
this.form[key] = ''
}
this.form.withdraw_type = 1
this.getUserInfo()
console.log('takeMoney', res)
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('takeMoney', err)
uni.showToast({
title: err,
icon: 'none'
})
console.log('takeMoney', err)
}
}
},
}
</script>
}
</script>
<style lang="less">
page {
background: #f6f6f6;
}
.bg {
overflow: hidden;
position: absolute;
... ... @@ -239,20 +260,24 @@
width: 100%;
height: 366rpx;
}
.top {
position: absolute;
left: 32rpx;
top: 64rpx;
view:nth-child(1) {
color: rgba(0,0,0,0.4);
font-size: 28rpx;
color: rgba(0, 0, 0, 0.4);
font-size: 28rpx;
}
view:nth-child(2) {
color: rgba(0,0,0,0.9);
font-size: 64rpx;
font-weight: 700;
color: rgba(0, 0, 0, 0.9);
font-size: 64rpx;
font-weight: 700;
}
}
.center {
position: absolute;
width: 686rpx;
... ... @@ -263,12 +288,14 @@
transform: translateX(-50%);
background: #fff;
box-sizing: border-box;
.line {
margin: 32rpx 0;
width: 622rpx;
height: 1rpx;
background: rgba(240,242,245,1);
background: rgba(240, 242, 245, 1);
}
// 收到的信息
.payInput {
.list {
... ... @@ -276,49 +303,58 @@
justify-content: space-between;
font-size: 28rpx;
margin: 32rpx 0;
.input {
flex: 1;
font-weight: 700;
}
input {
text-align: right;
width:300rpx;
width: 300rpx;
}
}
}
.title {
font-weight: 700;
margin-bottom: 32rpx;
font-weight: 700;
}
.inputPrice {
display: flex;
justify-content: space-between;
align-items: center;
view {
font-weight: 700;
display: flex;
align-items: center;
font-size: 52rpx;
font-size: 52rpx;
input {
margin-left: 20rpx;
font-weight: 400;
}
}
.right {
color: rgba(33,83,212,1);
font-size: 28rpx;
font-weight: 400;
color: rgba(33, 83, 212, 1);
font-size: 28rpx;
font-weight: 400;
}
}
}
.payType {
.list{
.list {
margin-bottom: 32rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.left {
image {
margin-right: 24rpx;
... ... @@ -326,6 +362,7 @@
height: 48rpx;
}
}
.right {
image {
width: 36rpx;
... ... @@ -333,19 +370,21 @@
}
}
}
.Withdrawal {
margin: 100rpx auto 0;
width: 622rpx;
height: 88rpx;
color: rgba(0,0,0,0.9);
font-size: 32rpx;
font-weight: 700;
color: rgba(0, 0, 0, 0.9);
font-size: 32rpx;
font-weight: 700;
border-radius: 28rpx;
background: linear-gradient(90deg, rgba(255,230,89,1) 0%, rgba(255,216,0,1) 100%);
background: linear-gradient(90deg, rgba(255, 230, 89, 1) 0%, rgba(255, 216, 0, 1) 100%);
}
.tips {
margin-top: 16rpx;
color: rgba(0,0,0,0.4);
font-size: 24rpx;
}
color: rgba(0, 0, 0, 0.4);
font-size: 24rpx;
}
</style>
... ...
... ... @@ -35,7 +35,7 @@
<view v-if="isSend==1" class="topState flexC" :class="item2.status==1?'Sale':'Sold'">
{{item2.status==1?'售卖中':'已卖出'}}
</view>
<view class="bot" v-if="isSend==1">
<view class="bot" v-if="isSend==1&&item2.status==1">
<image @click.stop="edit(item2)" src="/static/edit.png" mode=""></image>
<image @click.stop="del(item2,index2)" src="/static/del.png" mode=""></image>
</view>
... ...
<!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>琉璃藏宝阁</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/static/index.a5c69d49.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.f3bf79df.js></script><script src=/static/js/index.e92a2594.js></script></body></html>
\ No newline at end of file
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/static/index.2772579d.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.25d822ea.js></script><script src=/static/js/index.f0cd1748.js></script></body></html>
\ No newline at end of file
... ...
uni-tabbar{display:block;box-sizing:border-box;width:100%;z-index:998}uni-tabbar .uni-tabbar{display:-webkit-box;display:-webkit-flex;display:flex;z-index:998;box-sizing:border-box}uni-tabbar.uni-tabbar-bottom,uni-tabbar.uni-tabbar-bottom .uni-tabbar,uni-tabbar.uni-tabbar-top,uni-tabbar.uni-tabbar-top .uni-tabbar{position:fixed;left:var(--window-left);right:var(--window-right)}.uni-app--showlayout+uni-tabbar.uni-tabbar-bottom,.uni-app--showlayout+uni-tabbar.uni-tabbar-bottom .uni-tabbar,.uni-app--showlayout+uni-tabbar.uni-tabbar-top,.uni-app--showlayout+uni-tabbar.uni-tabbar-top .uni-tabbar{left:var(--window-margin);right:var(--window-margin)}uni-tabbar.uni-tabbar-bottom .uni-tabbar{bottom:0;padding-bottom:0;padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)}uni-tabbar .uni-tabbar~.uni-placeholder{width:100%;margin-bottom:0;margin-bottom:constant(safe-area-inset-bottom);margin-bottom:env(safe-area-inset-bottom)}uni-tabbar .uni-tabbar *{box-sizing:border-box}uni-tabbar .uni-tabbar__item{-webkit-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;flex:1;font-size:0;text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}uni-tabbar .uni-tabbar__bd,uni-tabbar .uni-tabbar__item{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal}uni-tabbar .uni-tabbar__bd{position:relative;-webkit-flex-direction:column;flex-direction:column;cursor:pointer}uni-tabbar .uni-tabbar__icon{position:relative;display:inline-block;margin-top:5px}uni-tabbar .uni-tabbar__icon.uni-tabbar__icon__diff{margin-top:0;width:34px;height:34px}uni-tabbar .uni-tabbar__icon img{width:100%;height:100%}uni-tabbar .uni-tabbar__label{position:relative;text-align:center;font-size:10px}uni-tabbar .uni-tabbar-border{position:absolute;left:0;top:0;width:100%;height:1px;-webkit-transform:scaleY(.5);transform:scaleY(.5)}uni-tabbar .uni-tabbar__reddot{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background-color:#f43530;color:#fff;-webkit-transform:translate(40%,-20%);transform:translate(40%,-20%)}uni-tabbar .uni-tabbar__badge{width:auto;height:16px;line-height:16px;border-radius:16px;min-width:16px;padding:0 2px;font-size:12px;text-align:center;white-space:nowrap}uni-tabbar .uni-tabbar__mid{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;position:absolute;bottom:0;background-size:100% 100%}uni-content,uni-tabbar .uni-tabbar__mid{display:-webkit-box;display:-webkit-flex;display:flex}uni-content{-webkit-box-flex:1;-webkit-flex:1 0 auto;flex:1 0 auto;height:100%}uni-main{-webkit-box-flex:1;-webkit-flex:1;flex:1;width:100%}uni-top-window+uni-content{height:calc(100vh - var(--top-window-height))}uni-left-window{width:var(--window-left);-webkit-box-ordinal-group:0;-webkit-order:-1;order:-1}uni-left-window,uni-right-window{position:relative;overflow-x:hidden}uni-right-window{width:var(--window-right)}uni-left-window[data-show],uni-right-window[data-show]{position:absolute}uni-right-window[data-show]{right:0}.uni-left-window,.uni-right-window,uni-content .uni-mask{z-index:997}.uni-mask+.uni-left-window,.uni-mask+.uni-right-window{position:fixed}.uni-top-window{position:fixed;left:var(--window-margin);right:var(--window-margin);top:0;z-index:998;overflow:hidden}uni-toast{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999;display:block;box-sizing:border-box;pointer-events:none;font-size:16px}uni-toast .uni-sample-toast{position:fixed;z-index:999;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;max-width:80%}uni-toast .uni-simple-toast__text{display:inline-block;vertical-align:middle;color:#fff;background-color:rgba(17,17,17,.7);padding:10px 20px;border-radius:5px;font-size:13px;text-align:center;max-width:100%;word-break:break-all;white-space:normal}uni-toast .uni-mask{pointer-events:auto}uni-toast .uni-toast{position:fixed;z-index:999;width:8em;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:rgba(17,17,17,.7);text-align:center;border-radius:5px;color:#fff}uni-toast .uni-toast *{box-sizing:border-box}uni-toast .uni-toast__icon{margin:20px 0 0;width:38px;height:38px;vertical-align:baseline}uni-toast .uni-icon_toast{margin:15px 0 0}uni-toast .uni-icon_toast.uni-icon-success-no-circle:before{color:#fff;font-size:55px}uni-toast .uni-icon_toast.uni-icon-error:before{color:#fff;font-size:50px}uni-toast .uni-icon_toast.uni-loading{margin:20px 0 0;width:38px;height:38px;vertical-align:baseline}uni-toast .uni-toast__content{margin:0 0 15px}uni-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999;display:block;box-sizing:border-box}uni-modal .uni-modal{position:fixed;z-index:999;width:80%;max-width:300px;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:#fff;text-align:center;border-radius:3px;overflow:hidden}uni-modal .uni-modal *{box-sizing:border-box}uni-modal .uni-modal__hd{padding:1em 1.6em .3em}uni-modal .uni-modal__title{font-weight:400;font-size:18px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}uni-modal .uni-modal__bd,uni-modal .uni-modal__title{word-wrap:break-word;word-break:break-all;white-space:pre-wrap}uni-modal .uni-modal__bd{padding:1.3em 1.6em 1.3em;min-height:40px;font-size:15px;line-height:1.4;color:#999;max-height:400px;overflow-x:hidden;overflow-y:auto}uni-modal .uni-modal__textarea{resize:none;border:0;margin:0;width:90%;padding:10px;font-size:20px;outline:none;border:none;background-color:#eee;text-decoration:inherit}uni-modal .uni-modal__ft{position:relative;line-height:48px;font-size:18px;display:-webkit-box;display:-webkit-flex;display:flex}uni-modal .uni-modal__ft:after{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}uni-modal .uni-modal__btn{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#3cc51f;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0);position:relative;cursor:pointer}uni-modal .uni-modal__btn:active{background-color:#eee}uni-modal .uni-modal__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}uni-modal .uni-modal__btn:first-child:after{display:none}uni-modal .uni-modal__btn_default{color:#353535}uni-modal .uni-modal__btn_primary{color:#007aff}uni-actionsheet{display:block;box-sizing:border-box}uni-actionsheet .uni-actionsheet{position:fixed;left:6px;right:6px;bottom:6px;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:999;visibility:hidden;-webkit-transition:visibility .3s,-webkit-transform .3s;transition:visibility .3s,-webkit-transform .3s;transition:transform .3s,visibility .3s;transition:transform .3s,visibility .3s,-webkit-transform .3s}uni-actionsheet .uni-actionsheet.uni-actionsheet_toggle{visibility:visible;-webkit-transform:translate(0);transform:translate(0)}uni-actionsheet .uni-actionsheet *{box-sizing:border-box}uni-actionsheet .uni-actionsheet__action,uni-actionsheet .uni-actionsheet__menu{border-radius:5px;background-color:#fcfcfd}uni-actionsheet .uni-actionsheet__action{margin-top:6px}uni-actionsheet .uni-actionsheet__cell,uni-actionsheet .uni-actionsheet__title{position:relative;padding:10px 6px;text-align:center;font-size:18px;text-overflow:ellipsis;overflow:hidden;cursor:pointer}uni-actionsheet .uni-actionsheet__title{position:absolute;top:0;right:0;left:0;z-index:1;background-color:#fff;border-radius:5px 5px 0 0;border-bottom:1px solid #e5e5e5}uni-actionsheet .uni-actionsheet__cell:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}uni-actionsheet .uni-actionsheet__cell:active{background-color:#ececec}uni-actionsheet .uni-actionsheet__cell:first-child:before{display:none}@media screen and (min-width:500px) and (min-height:500px){.uni-mask.uni-actionsheet__mask{background:none}uni-actionsheet .uni-actionsheet{width:300px;left:50%;right:auto;top:50%;bottom:auto;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;-webkit-transition:opacity .3s,visibility .3s;transition:opacity .3s,visibility .3s}uni-actionsheet .uni-actionsheet.uni-actionsheet_toggle{opacity:1;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}uni-actionsheet .uni-actionsheet__menu{box-shadow:0 0 20px 5px rgba(0,0,0,.3)}uni-actionsheet .uni-actionsheet__action{display:none}}*{margin:0;-webkit-tap-highlight-color:transparent}@font-face{font-weight:400;font-style:normal;font-family:uni;src:url("data:application/octet-stream;base64,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") format("truetype")}@font-face{font-weight:400;font-style:normal;font-family:unibtn;src:url("data:application/octet-stream;base64,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") format("truetype")}body,html{-webkit-user-select:none;user-select:none;width:100%;height:100%}body{overflow-x:hidden}[class*=" uni-icon-"],[class^=uni-icon-]{display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 uni;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}[class*=" uni-btn-icon"],[class^=uni-btn-icon]{display:inline-block;font:normal normal normal 14px/1 unibtn;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}[class*=" uni-btn-icon"]:before,[class^=uni-btn-icon]:before{margin:0;box-sizing:border-box}.uni-icon-success-no-circle:before{content:"\EA08"}.uni-icon-error:before{content:"\EA0B"}.uni-loading,uni-button[loading]:before{background:rgba(0,0,0,0) url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=") no-repeat}.uni-loading{width:20px;height:20px;display:inline-block;vertical-align:middle;-webkit-animation:uni-loading 1s steps(12) infinite;animation:uni-loading 1s steps(12) infinite;background-size:100%}@-webkit-keyframes uni-loading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes uni-loading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.uni-mask{position:fixed;z-index:999;top:0;right:0;left:0;bottom:0;background:rgba(0,0,0,.5)}.uni-fade-enter-active,.uni-fade-leave-active{-webkit-transition-duration:.25s;transition-duration:.25s;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:ease;transition-timing-function:ease}.uni-fade-enter,.uni-fade-leave-active{opacity:0}[nvue] uni-label,[nvue] uni-scroll-view,[nvue] uni-swiper-item,[nvue] uni-view{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-shrink:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:auto;flex-basis:auto;-webkit-box-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start}[nvue] uni-button{margin:0}[nvue-dir-row] uni-label,[nvue-dir-row] uni-swiper-item,[nvue-dir-row] uni-view{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row}[nvue-dir-column] uni-label,[nvue-dir-column] uni-swiper-item,[nvue-dir-column] uni-view{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}[nvue-dir-row-reverse] uni-label,[nvue-dir-row-reverse] uni-swiper-item,[nvue-dir-row-reverse] uni-view{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}[nvue-dir-column-reverse] uni-label,[nvue-dir-column-reverse] uni-swiper-item,[nvue-dir-column-reverse] uni-view{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;flex-direction:column-reverse}[nvue] uni-image,[nvue] uni-input,[nvue] uni-scroll-view,[nvue] uni-swiper,[nvue] uni-swiper-item,[nvue] uni-text,[nvue] uni-textarea,[nvue] uni-video,[nvue] uni-view{position:relative;border:0 solid #000;box-sizing:border-box}[nvue] uni-swiper-item{position:absolute}uni-app{width:100%;height:100%}uni-app,uni-page-head{display:block;box-sizing:border-box}uni-page-head .uni-page-head{position:fixed;left:var(--window-left);right:var(--window-right);height:44px;height:calc(44px + constant(safe-area-inset-top));height:calc(44px + env(safe-area-inset-top));padding:7px 3px;padding-top:calc(7px + constant(safe-area-inset-top));padding-top:calc(7px + env(safe-area-inset-top));display:-webkit-box;display:-webkit-flex;display:flex;overflow:hidden;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;box-sizing:border-box;z-index:998;color:#fff;background-color:#000;-webkit-transition-property:all;transition-property:all}uni-page-head .uni-page-head-titlePenetrate,uni-page-head .uni-page-head-titlePenetrate .uni-page-head-bd,uni-page-head .uni-page-head-titlePenetrate .uni-page-head-bd *{pointer-events:none}uni-page-head .uni-page-head-titlePenetrate *{pointer-events:auto}uni-page-head .uni-page-head.uni-page-head-transparent .uni-page-head-ft>div{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}uni-page-head .uni-page-head~.uni-placeholder{width:100%;height:44px;height:calc(44px + constant(safe-area-inset-top));height:calc(44px + env(safe-area-inset-top))}uni-page-head .uni-placeholder-titlePenetrate{pointer-events:none}uni-page-head .uni-page-head *{box-sizing:border-box}uni-page-head .uni-page-head-hd{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;font-size:16px}uni-page-head .uni-page-head-bd{position:absolute;left:70px;right:70px;min-width:0}.uni-page-head-btn{position:relative;width:auto;margin:0 2px;word-break:keep-all;white-space:pre;cursor:pointer}.uni-page-head-transparent .uni-page-head-btn{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;width:32px;height:32px;border-radius:50%;background-color:rgba(0,0,0,.5)}uni-page-head .uni-btn-icon{overflow:hidden;min-width:1em}.uni-page-head-btn-red-dot:after{content:attr(badge-text);position:absolute;right:0;top:0;background-color:red;color:#fff;width:18px;height:18px;line-height:18px;border-radius:18px;overflow:hidden;-webkit-transform:scale(.5) translate(40%,-40%);transform:scale(.5) translate(40%,-40%);-webkit-transform-origin:100% 0;transform-origin:100% 0}.uni-page-head-btn-red-dot[badge-text]:after{font-size:12px;width:auto;min-width:18px;max-width:42px;text-align:center;padding:0 3px;-webkit-transform:scale(.7) translate(40%,-40%);transform:scale(.7) translate(40%,-40%)}.uni-page-head-btn-select>.uni-btn-icon:after{display:inline-block;font-family:unibtn;content:"\e601";margin-left:2px;-webkit-transform:rotate(-90deg) scale(.8);transform:rotate(-90deg) scale(.8)}.uni-page-head-search{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex:1;flex:1;margin:0 2px;line-height:30px;font-size:15px}.uni-page-head-search-input{width:100%;height:100%;padding-left:34px;text-align:left}.uni-page-head-search-placeholder{position:absolute;max-width:100%;height:100%;padding-left:34px;overflow:hidden;word-break:keep-all;white-space:pre}.uni-page-head-search-placeholder-right{right:0}.uni-page-head-search-placeholder-center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.uni-page-head-search-placeholder:before{position:absolute;top:0;left:2px;width:30px;content:"\ea0e";display:block;font-size:20px;font-family:uni;text-align:center}uni-page-head .uni-page-head-ft{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse;font-size:13px}uni-page-head .uni-page-head__title{font-weight:700;font-size:16px;line-height:30px;text-align:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}uni-page-head .uni-page-head__title .uni-loading{width:16px;height:16px;margin-top:-3px}uni-page-head .uni-page-head__title .uni-page-head__title_image{width:auto;height:26px;vertical-align:middle}uni-page-head .uni-page-head-shadow{overflow:visible}uni-page-head .uni-page-head-shadow:after{content:"";position:absolute;left:0;right:0;top:100%;height:5px;background-size:100% 100%}uni-page-head .uni-page-head-shadow-grey:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}uni-page-head .uni-page-head-shadow-blue:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-blue.png)}uni-page-head .uni-page-head-shadow-green:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-green.png)}uni-page-head .uni-page-head-shadow-orange:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-orange.png)}uni-page-head .uni-page-head-shadow-red:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-red.png)}uni-page-head .uni-page-head-shadow-yellow:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-yellow.png)}uni-page-head .uni-icon-clear{-webkit-align-self:center;align-self:center;padding-right:5px}uni-page-wrapper{display:block;height:100%;position:relative}uni-page-head[uni-page-head-type=default]~uni-page-wrapper{height:calc(100% - 44px);height:calc(100% - 44px - constant(safe-area-inset-top));height:calc(100% - 44px - env(safe-area-inset-top))}uni-page-body,uni-page-refresh{display:block;box-sizing:border-box;width:100%}uni-page-refresh{position:absolute;top:0;height:40px}uni-page-refresh .uni-page-refresh{position:absolute;top:-45px;left:50%;-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0);background:#fff;box-shadow:0 1px 6px rgba(0,0,0,.117647),0 1px 4px rgba(0,0,0,.117647);display:none;z-index:997}uni-page-refresh .uni-page-refresh,uni-page-refresh .uni-page-refresh-inner{width:40px;height:40px;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;border-radius:50%}uni-page-refresh .uni-page-refresh-inner{line-height:0}uni-page-refresh.uni-page-refresh--aborting .uni-page-refresh,uni-page-refresh.uni-page-refresh--pulling .uni-page-refresh,uni-page-refresh.uni-page-refresh--reached .uni-page-refresh,uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh,uni-page-refresh.uni-page-refresh--restoring .uni-page-refresh,uni-page-refresh .uni-page-refresh-inner{display:-webkit-box;display:-webkit-flex;display:flex}uni-page-refresh.uni-page-refresh--aborting .uni-page-refresh__spinner,uni-page-refresh.uni-page-refresh--pulling .uni-page-refresh__spinner,uni-page-refresh.uni-page-refresh--reached .uni-page-refresh__spinner,uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh__icon,uni-page-refresh.uni-page-refresh--restoring .uni-page-refresh__icon{display:none}uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh__spinner{-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation:uni-page-refresh-rotate 2s linear infinite;animation:uni-page-refresh-rotate 2s linear infinite}uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh__path{stroke-dasharray:1,200;stroke-dashoffset:0;stroke-linecap:round;-webkit-animation:uni-page-refresh-dash 1.5s ease-in-out infinite,uni-page-refresh-colorful 6s ease-in-out infinite;animation:uni-page-refresh-dash 1.5s ease-in-out infinite,uni-page-refresh-colorful 6s ease-in-out infinite}@-webkit-keyframes uni-page-refresh-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes uni-page-refresh-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes uni-page-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes uni-page-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}uni-page{display:block;width:100%;height:100%}.uni-async-error{position:absolute;left:0;right:0;top:0;bottom:0;color:#999;padding:100px 10px;text-align:center}.uni-async-loading{box-sizing:border-box;width:100%;padding:50px;text-align:center}.uni-async-loading .uni-loading{width:30px;height:30px}@font-face{font-weight:400;font-style:normal;font-family:unimapbtn;src:url("data:application/octet-stream;base64,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") format("truetype")}.uni-system-choose-location{display:block;position:absolute;left:0;top:0;width:100%;height:100%;background:#f8f8f8}.uni-system-choose-location .map{position:absolute;top:0;left:0;width:100%;height:300px}.uni-system-choose-location .map-location{position:absolute;left:50%;bottom:50%;width:32px;height:52px;margin-left:-16px;cursor:pointer;background-size:100%}.uni-system-choose-location .map-move{position:absolute;bottom:50px;right:10px;width:40px;height:40px;box-sizing:border-box;line-height:40px;background-color:#fff;border-radius:50%;pointer-events:auto;cursor:pointer;box-shadow:0 0 5px 1px rgba(0,0,0,.3)}.uni-system-choose-location .map-move>i{display:block;width:100%;height:100%;font:normal normal normal 14px/1 unimapbtn;line-height:inherit;text-align:center;font-size:24px;text-rendering:auto;-webkit-font-smoothing:antialiased}.uni-system-choose-location .nav{position:absolute;top:0;left:0;width:100%;height:44px;background-color:rgba(0,0,0,0);background-image:-webkit-linear-gradient(top,rgba(0,0,0,.3),rgba(0,0,0,0));background-image:linear-gradient(180deg,rgba(0,0,0,.3),rgba(0,0,0,0))}.uni-system-choose-location .nav-btn{position:absolute;box-sizing:border-box;top:0;left:0;width:60px;height:44px;padding:6px;line-height:32px;font-size:26px;color:#fff;text-align:center;cursor:pointer}.uni-system-choose-location .nav-btn.confirm{left:auto;right:0}.uni-system-choose-location .nav-btn.disable{opacity:.4}.uni-system-choose-location .nav-btn>.uni-btn-icon{display:block;width:100%;height:100%;line-height:inherit;border-radius:2px}.uni-system-choose-location .nav-btn.confirm>.uni-btn-icon{background-color:#007aff}.uni-system-choose-location .menu{position:absolute;top:300px;left:0;width:100%;bottom:0;background-color:#fff}.uni-system-choose-location .search{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;height:50px;padding:8px;line-height:34px;box-sizing:border-box;background-color:#fff}.uni-system-choose-location .search-input{-webkit-box-flex:1;-webkit-flex:1;flex:1;height:100%;border-radius:5px;padding:0 5px;background:#ebebeb}.uni-system-choose-location .search-btn{margin-left:5px;color:#007aff;font-size:17px;text-align:center}.uni-system-choose-location .list{position:absolute;top:50px;left:0;width:100%;bottom:0;padding-bottom:10px}.uni-system-choose-location .list-loading{display:-webkit-box;display:-webkit-flex;display:flex;height:50px;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.uni-system-choose-location .list-item{position:relative;padding:10px;padding-right:40px;cursor:pointer}.uni-system-choose-location .list-item.selected:before{position:absolute;top:50%;right:10px;width:30px;height:30px;margin-top:-15px;text-align:center;content:"\e651";font:normal normal normal 14px/1 unibtn;font-size:24px;line-height:30px;color:#007aff;text-rendering:auto;-webkit-font-smoothing:antialiased}.uni-system-choose-location .list-item:not(:last-child):after{position:absolute;content:"";height:1px;left:10px;bottom:0;width:100%;background-color:#d3d3d3}.uni-system-choose-location .list-item-title{font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.uni-system-choose-location .list-item-detail{font-size:12px;color:grey;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media screen and (min-width:800px){.uni-system-choose-location .map{top:0;height:100%}.uni-system-choose-location .map-move{bottom:10px;right:320px}.uni-system-choose-location .menu{top:54px;left:auto;right:10px;width:300px;bottom:10px;max-height:600px;box-shadow:0 0 20px 5px rgba(0,0,0,.3)}}.uni-system-open-location{display:block;position:absolute;left:0;top:0;width:100%;height:100%;background:#f8f8f8;z-index:999}.uni-system-open-location .map{position:absolute;top:0;left:0;width:100%;bottom:80px;height:auto}.uni-system-open-location .info{position:absolute;bottom:0;left:0;width:100%;height:80px;background-color:#fff;padding:15px;box-sizing:border-box;line-height:1.5}.uni-system-open-location .info>.name{font-size:17px;color:#111}.uni-system-open-location .info>.address{font-size:14px;color:#666}.uni-system-open-location .info>.nav{position:absolute;top:50%;right:15px;width:50px;height:50px;border-radius:50%;margin-top:-25px;background-color:#007aff}.uni-system-open-location .info>.nav>svg{display:block;width:100%;height:100%;padding:10px;box-sizing:border-box}.uni-system-open-location .map-move{position:absolute;bottom:50px;right:10px;width:40px;height:40px;box-sizing:border-box;line-height:40px;background-color:#fff;border-radius:50%;pointer-events:auto;cursor:pointer;box-shadow:0 0 5px 1px rgba(0,0,0,.3)}.uni-system-open-location .map-move>i{display:block;width:100%;height:100%;font:normal normal normal 14px/1 unimapbtn;line-height:inherit;text-align:center;font-size:24px;text-rendering:auto;-webkit-font-smoothing:antialiased}.uni-system-open-location .nav-btn-back{position:absolute;box-sizing:border-box;top:0;left:0;width:44px;height:44px;padding:6px;line-height:32px;font-size:26px;color:#fff;text-align:center;cursor:pointer}.uni-system-open-location .nav-btn-back>.uni-btn-icon{display:block;width:100%;height:100%;line-height:inherit;border-radius:50%;background-color:rgba(0,0,0,.5)}.uni-system-open-location .map-content{position:absolute;left:0;top:0;width:100%;bottom:0;overflow:hidden}.uni-system-open-location .map-content.fix-position{top:-74px;bottom:-44px}.uni-system-open-location .map-content>iframe{width:100%;height:100%;border:none}.uni-system-open-location .actTonav{position:absolute;right:16px;bottom:56px;width:60px;height:60px;border-radius:60px}.image-view-area,.image-view-view{position:absolute;left:0;top:0;width:100%;height:100%}.image-view-img{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-height:100%;max-width:100%}.uni-system-preview-image{display:block;position:fixed;left:0;top:0;width:100%;height:100%;z-index:999;background:rgba(0,0,0,.8)}.uni-system-preview-image-swiper{position:absolute;left:0;top:0;width:100%;height:100%}uni-audio{display:none}uni-audio[controls]{display:inline-block}uni-audio[hidden]{display:none}.uni-audio-default{max-width:100%;min-width:302px;height:65px;background:#fcfcfc;border:1px solid #e0e0e0;border-radius:2.5px;display:inline-block;overflow:hidden}.uni-audio-left{width:65px;height:65px;float:left;background-color:#e6e6e6;background-size:100% 100%;background-position:50% 50%}.uni-audio-button{width:24px;height:24px;margin:20.5px;background-size:cover}.uni-audio-button.play{background-image:url(data:image/png;base64,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)}.uni-audio-button.pause{background-image:url(data:image/png;base64,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)}.uni-audio-right{box-sizing:border-box;height:65px;margin-left:65px;padding:11px 16.5px 13.5px 15px;overflow:hidden}.uni-audio-time{margin-top:3.5px;height:16.5px;font-size:12px;color:#888;float:right}.uni-audio-info{margin-right:70px;overflow:hidden}.uni-audio-name{height:22.5px;line-height:22.5px;margin-bottom:3.5px;font-size:14px;color:#353535}.uni-audio-author,.uni-audio-name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.uni-audio-author{height:14.5px;line-height:14.5px;font-size:12px;color:#888}uni-button{position:relative;display:block;margin-left:auto;margin-right:auto;padding-left:14px;padding-right:14px;box-sizing:border-box;font-size:18px;text-align:center;text-decoration:none;line-height:2.55555556;border-radius:5px;-webkit-tap-highlight-color:transparent;overflow:hidden;color:#000;background-color:#f8f8f8;cursor:pointer}uni-button[hidden]{display:none!important}uni-button:after{content:" ";width:200%;height:200%;position:absolute;top:0;left:0;border:1px solid rgba(0,0,0,.2);-webkit-transform:scale(.5);transform:scale(.5);-webkit-transform-origin:0 0;transform-origin:0 0;box-sizing:border-box;border-radius:10px}uni-button[native]{padding-left:0;padding-right:0}uni-button[native] .uni-button-cover-view-wrapper{border:inherit;border-color:inherit;border-radius:inherit;background-color:inherit}uni-button[native] .uni-button-cover-view-inner{padding-left:14px;padding-right:14px}uni-button uni-cover-view{line-height:inherit;white-space:inherit}uni-button[type=default]{color:#000;background-color:#f8f8f8}uni-button[type=primary]{color:#fff;background-color:#007aff}uni-button[type=warn]{color:#fff;background-color:#e64340}uni-button[disabled]{color:hsla(0,0%,100%,.6);cursor:not-allowed}uni-button[disabled]:not([type]),uni-button[disabled][type=default]{color:rgba(0,0,0,.3);background-color:#f7f7f7}uni-button[disabled][type=primary]{background-color:rgba(0,122,255,.6)}uni-button[disabled][type=warn]{background-color:#ec8b89}uni-button[type=primary][plain]{color:#007aff;border:1px solid #007aff;background-color:rgba(0,0,0,0)}uni-button[type=primary][plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[type=primary][plain]:after{border-width:0}uni-button[type=default][plain]{color:#353535;border:1px solid #353535;background-color:rgba(0,0,0,0)}uni-button[type=default][plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[type=default][plain]:after{border-width:0}uni-button[plain]{color:#353535;border:1px solid #353535;background-color:rgba(0,0,0,0)}uni-button[plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[plain]:after{border-width:0}uni-button[plain][native] .uni-button-cover-view-inner{padding:0}uni-button[type=warn][plain]{color:#e64340;border:1px solid #e64340;background-color:rgba(0,0,0,0)}uni-button[type=warn][plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[type=warn][plain]:after{border-width:0}uni-button[size=mini]{display:inline-block;line-height:2.3;font-size:13px;padding:0 1.34em}uni-button[size=mini][native]{padding:0}uni-button[size=mini][native] .uni-button-cover-view-inner{padding:0 1.34em}uni-button[loading]:not([disabled]){cursor:progress}uni-button[loading]:before{content:" ";display:inline-block;width:18px;height:18px;vertical-align:middle;-webkit-animation:uni-loading 1s steps(12) infinite;animation:uni-loading 1s steps(12) infinite;background-size:100%}uni-button[loading][type=primary]{color:hsla(0,0%,100%,.6);background-color:#0062cc}uni-button[loading][type=primary][plain]{color:#007aff;background-color:rgba(0,0,0,0)}uni-button[loading][type=default]{color:rgba(0,0,0,.6);background-color:#dedede}uni-button[loading][type=default][plain]{color:#353535;background-color:rgba(0,0,0,0)}uni-button[loading][type=warn]{color:hsla(0,0%,100%,.6);background-color:#ce3c39}uni-button[loading][type=warn][plain]{color:#e64340;background-color:rgba(0,0,0,0)}uni-button[loading][native]:before{content:none}.button-hover{color:rgba(0,0,0,.6);background-color:#dedede}.button-hover[plain]{color:rgba(53,53,53,.6);border-color:rgba(53,53,53,.6);background-color:rgba(0,0,0,0)}.button-hover[type=primary]{color:hsla(0,0%,100%,.6);background-color:#0062cc}.button-hover[type=primary][plain]{color:rgba(26,173,25,.6);border-color:rgba(26,173,25,.6);background-color:rgba(0,0,0,0)}.button-hover[type=default]{color:rgba(0,0,0,.6);background-color:#dedede}.button-hover[type=default][plain]{color:rgba(53,53,53,.6);border-color:rgba(53,53,53,.6);background-color:rgba(0,0,0,0)}.button-hover[type=warn]{color:hsla(0,0%,100%,.6);background-color:#ce3c39}.button-hover[type=warn][plain]{color:rgba(230,67,64,.6);border-color:rgba(230,67,64,.6);background-color:rgba(0,0,0,0)}uni-canvas{width:300px;height:150px;display:block;position:relative}uni-canvas>canvas{position:absolute;top:0;left:0;width:100%;height:100%}uni-checkbox-group[hidden]{display:none}uni-checkbox{-webkit-tap-highlight-color:transparent;display:inline-block;cursor:pointer}uni-checkbox[hidden]{display:none}uni-checkbox[disabled]{cursor:not-allowed}uni-checkbox .uni-checkbox-wrapper{display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;vertical-align:middle}uni-checkbox .uni-checkbox-input{margin-right:5px;-webkit-appearance:none;appearance:none;outline:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:3px;width:22px;height:22px;position:relative}uni-checkbox:not([disabled]) .uni-checkbox-input:hover{border-color:#007aff}uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked{color:#007aff}uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked:before{font:normal normal normal 14px/1 uni;content:"\EA08";font-size:22px;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%) scale(.73);-webkit-transform:translate(-50%,-48%) scale(.73)}uni-checkbox .uni-checkbox-input.uni-checkbox-input-disabled{background-color:#e1e1e1}uni-checkbox .uni-checkbox-input.uni-checkbox-input-disabled:before{color:#adadad}uni-checkbox-group{display:block}.ql-container{display:block;position:relative;box-sizing:border-box;-webkit-user-select:text;user-select:text;outline:none;overflow:hidden;width:100%;height:200px;min-height:200px}.ql-container[hidden]{display:none}.ql-container .ql-editor{position:relative;font-size:inherit;line-height:inherit;font-family:inherit;min-height:inherit;width:100%;height:100%;padding:0;overflow-x:hidden;overflow-y:auto;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-overflow-scrolling:touch}.ql-container .ql-editor::-webkit-scrollbar{width:0!important}.ql-container .ql-editor.scroll-disabled{overflow:hidden}.ql-container .ql-image-overlay{display:-webkit-box;display:-webkit-flex;display:flex;position:absolute;box-sizing:border-box;border:1px dashed #ccc;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-user-select:none;user-select:none}.ql-container .ql-image-overlay .ql-image-size{position:absolute;padding:4px 8px;text-align:center;background-color:#fff;color:#888;border:1px solid #ccc;box-sizing:border-box;opacity:.8;right:4px;top:4px;font-size:12px;display:inline-block;width:auto}.ql-container .ql-image-overlay .ql-image-toolbar{position:relative;text-align:center;box-sizing:border-box;background:#000;border-radius:5px;color:#fff;font-size:0;min-height:24px;z-index:100}.ql-container .ql-image-overlay .ql-image-toolbar span{display:inline-block;cursor:pointer;padding:5px;font-size:12px;border-right:1px solid #fff}.ql-container .ql-image-overlay .ql-image-toolbar span:last-child{border-right:0}.ql-container .ql-image-overlay .ql-image-toolbar span.triangle-up{padding:0;position:absolute;top:-12px;left:50%;-webkit-transform:translatex(-50%);transform:translatex(-50%);width:0;height:0;border-width:6px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.ql-container .ql-image-overlay .ql-image-handle{position:absolute;height:12px;width:12px;border-radius:50%;border:1px solid #ccc;box-sizing:border-box;background:#fff}.ql-container img{display:inline-block;max-width:100%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;height:100%;outline:none;overflow-y:auto;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6,.ql-editor ol,.ql-editor p,.ql-editor pre,.ql-editor ul{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:"\2022"}.ql-editor ul[data-checked=false],.ql-editor ul[data-checked=true]{pointer-events:none}.ql-editor ul[data-checked=false]>li *,.ql-editor ul[data-checked=true]>li *{pointer-events:all}.ql-editor ul[data-checked=false]>li:before,.ql-editor ul[data-checked=true]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:"\2611"}.ql-editor ul[data-checked=false]>li:before{content:"\2610"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:2em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) ". "}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) ". "}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) ". "}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) ". "}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) ". "}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) ". "}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) ". "}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) ". "}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) ". "}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) ". "}.ql-editor .ql-indent-1:not(.ql-direction-rtl),.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:2em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:2em}.ql-editor .ql-indent-2:not(.ql-direction-rtl),.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:4em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:4em}.ql-editor .ql-indent-3:not(.ql-direction-rtl),.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:6em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor .ql-indent-4:not(.ql-direction-rtl),.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:8em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:8em}.ql-editor .ql-indent-5:not(.ql-direction-rtl),.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:10em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:10em}.ql-editor .ql-indent-6:not(.ql-direction-rtl),.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:12em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor .ql-indent-7:not(.ql-direction-rtl),.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:14em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:14em}.ql-editor .ql-indent-8:not(.ql-direction-rtl),.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:16em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:16em}.ql-editor .ql-indent-9:not(.ql-direction-rtl),.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:18em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:rgba(0,0,0,.6);content:attr(data-placeholder);font-style:italic;pointer-events:none;position:absolute}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}uni-icon{display:inline-block;font-size:0;box-sizing:border-box}uni-icon[hidden]{display:none}uni-icon>i{font:normal normal normal 14px/1 weui}uni-icon>i:before{margin:0;box-sizing:border-box}@font-face{font-weight:400;font-style:normal;font-family:weui;src:url("data:application/octet-stream;base64,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") format("truetype")}.uni-icon-success:before{content:"\EA06"}.uni-icon-success_circle:before{content:"\EA07"}.uni-icon-success_no_circle:before{content:"\EA08"}.uni-icon-safe_success:before{content:"\EA04"}.uni-icon-safe_warn:before{content:"\EA05"}.uni-icon-info:before{content:"\EA03"}.uni-icon-info_circle:before{content:"\EA0C"}.uni-icon-warn:before{content:"\EA0B"}.uni-icon-waiting:before{content:"\EA09"}.uni-icon-waiting_circle:before{content:"\EA0A"}.uni-icon-circle:before{content:"\EA01"}.uni-icon-cancel:before{content:"\EA0D"}.uni-icon-download:before{content:"\EA02"}.uni-icon-search:before{content:"\EA0E"}.uni-icon-clear:before{content:"\EA0F"}.uni-icon-safe_success,.uni-icon-success,.uni-icon-success_circle,.uni-icon-success_no_circle{color:#007aff}.uni-icon-safe_warn{color:#ffbe00}.uni-icon-info{color:#10aeff}.uni-icon-info_circle{color:#007aff}.uni-icon-warn{color:#f76260}.uni-icon-waiting,.uni-icon-waiting_circle{color:#10aeff}.uni-icon-circle{color:#c9c9c9}.uni-icon-cancel{color:#f43530}.uni-icon-download{color:#007aff}.uni-icon-clear,.uni-icon-search{color:#b2b2b2}uni-image{width:320px;height:240px;display:inline-block;overflow:hidden;position:relative}uni-image[hidden]{display:none}uni-image>div,uni-image>img{width:100%;height:100%}uni-image>img{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;display:block;position:absolute;top:0;left:0;opacity:0}uni-image>.uni-image-will-change{will-change:transform}uni-input{display:block;font-size:16px;line-height:1.4em;height:1.4em;min-height:1.4em;overflow:hidden}uni-input[hidden]{display:none}.uni-input-form,.uni-input-input,.uni-input-placeholder,.uni-input-wrapper{outline:none;border:none;padding:0;margin:0;text-decoration:inherit}.uni-input-form,.uni-input-wrapper{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;width:100%;height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.uni-input-input,.uni-input-placeholder{width:100%}.uni-input-placeholder{position:absolute;top:auto!important;left:0;color:grey;overflow:hidden;text-overflow:clip;white-space:pre;word-break:keep-all;pointer-events:none;line-height:inherit}.uni-input-input{position:relative;display:block;height:100%;background:none;color:inherit;opacity:1;font:inherit;line-height:inherit;letter-spacing:inherit;text-align:inherit;text-indent:inherit;text-transform:inherit;text-shadow:inherit}.uni-input-input[type=search]::-webkit-search-cancel-button,.uni-input-input[type=search]::-webkit-search-decoration{display:none}.uni-input-input::-webkit-inner-spin-button,.uni-input-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.uni-input-input[type=number]{-moz-appearance:textfield}.uni-input-input:disabled{-webkit-text-fill-color:currentcolor}.uni-label-pointer{cursor:pointer}uni-movable-area{display:block;position:relative;width:10px;height:10px}uni-movable-area[hidden]{display:none}uni-movable-view{display:inline-block;width:10px;height:10px;top:0;left:0;position:absolute;cursor:grab}uni-movable-view[hidden]{display:none}uni-navigator{height:auto;width:auto;display:block;cursor:pointer}uni-navigator[hidden]{display:none}.navigator-hover{background-color:rgba(0,0,0,.1);opacity:.7}uni-picker-view-column{-webkit-flex:1;-webkit-box-flex:1;flex:1;position:relative;height:100%;overflow:hidden}uni-picker-view-column[hidden]{display:none}.uni-picker-view-group{height:100%;overflow:hidden}.uni-picker-view-mask{transform:translateZ(0);-webkit-transform:translateZ(0)}.uni-picker-view-indicator,.uni-picker-view-mask{position:absolute;left:0;width:100%;z-index:3;pointer-events:none}.uni-picker-view-mask{top:0;height:100%;margin:0 auto;background:-webkit-linear-gradient(top,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),-webkit-linear-gradient(bottom,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background:linear-gradient(180deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),linear-gradient(0deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background-position:top,bottom;background-size:100% 102px;background-repeat:no-repeat}.uni-picker-view-indicator{height:34px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.uni-picker-view-content{position:absolute;top:0;left:0;width:100%;will-change:transform;padding:102px 0;cursor:pointer}.uni-picker-view-content>*{height:34px;overflow:hidden}.uni-picker-view-indicator:before{top:0;border-top:1px solid #e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.uni-picker-view-indicator:after{bottom:0;border-bottom:1px solid #e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.uni-picker-view-indicator:after,.uni-picker-view-indicator:before{content:" ";position:absolute;left:0;right:0;height:1px;color:#e5e5e5}uni-picker-view{display:block}uni-picker-view .uni-picker-view-wrapper{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;overflow:hidden;height:100%}uni-picker-view[hidden]{display:none}uni-progress{display:-webkit-flex;display:-webkit-box;display:flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center}uni-progress[hidden]{display:none}.uni-progress-bar{-webkit-flex:1;-webkit-box-flex:1;flex:1}.uni-progress-inner-bar{width:0;height:100%}.uni-progress-info{margin-top:0;margin-bottom:0;min-width:2em;margin-left:15px;font-size:16px}uni-radio-group[hidden]{display:none}uni-radio{-webkit-tap-highlight-color:transparent;display:inline-block;cursor:pointer}uni-radio[hidden]{display:none}uni-radio[disabled]{cursor:not-allowed}uni-radio .uni-radio-wrapper{display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;vertical-align:middle}uni-radio .uni-radio-input{-webkit-appearance:none;appearance:none;margin-right:5px;outline:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:50%;width:22px;height:22px;position:relative}uni-radio:not([disabled]) .uni-radio-input:hover{border-color:#007aff}uni-radio .uni-radio-input.uni-radio-input-checked:before{font:normal normal normal 14px/1 uni;content:"\EA08";color:#fff;font-size:18px;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%) scale(.73);-webkit-transform:translate(-50%,-48%) scale(.73)}uni-radio .uni-radio-input.uni-radio-input-disabled{background-color:#e1e1e1;border-color:#d1d1d1}uni-radio .uni-radio-input.uni-radio-input-disabled:before{color:#adadad}uni-radio-group{display:block}@-webkit-keyframes once-show{0%{top:0}}@keyframes once-show{0%{top:0}}uni-resize-sensor,uni-resize-sensor>div{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden}uni-resize-sensor{display:block;z-index:-1;visibility:hidden;-webkit-animation:once-show 1ms;animation:once-show 1ms}uni-resize-sensor>div>div{position:absolute;left:0;top:0}uni-resize-sensor>div:first-child>div{width:100000px;height:100000px}uni-resize-sensor>div:last-child>div{width:200%;height:200%}uni-scroll-view{display:block;width:100%}uni-scroll-view[hidden]{display:none}.uni-scroll-view{position:relative;-webkit-overflow-scrolling:touch;max-height:inherit}.uni-scroll-view,.uni-scroll-view-content{width:100%;height:100%}.uni-scroll-view-refresher{position:relative;overflow:hidden}.uni-scroll-view-refresh{position:absolute;top:0;left:0;right:0;bottom:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row}.uni-scroll-view-refresh,.uni-scroll-view-refresh-inner{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.uni-scroll-view-refresh-inner{line-height:0;width:40px;height:40px;border-radius:50%;background-color:#fff;box-shadow:0 1px 6px rgba(0,0,0,.117647),0 1px 4px rgba(0,0,0,.117647)}.uni-scroll-view-refresh__spinner{-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation:uni-scroll-view-refresh-rotate 2s linear infinite;animation:uni-scroll-view-refresh-rotate 2s linear infinite}.uni-scroll-view-refresh__spinner>circle{stroke:currentColor;stroke-linecap:round;-webkit-animation:uni-scroll-view-refresh-dash 2s linear infinite;animation:uni-scroll-view-refresh-dash 2s linear infinite}@-webkit-keyframes uni-scroll-view-refresh-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes uni-scroll-view-refresh-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes uni-scroll-view-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes uni-scroll-view-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}uni-slider{margin:10px 18px;padding:0;display:block}uni-slider[hidden]{display:none}uni-slider .uni-slider-wrapper{display:-webkit-flex;display:-webkit-box;display:flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;min-height:16px}uni-slider .uni-slider-tap-area{-webkit-flex:1;-webkit-box-flex:1;flex:1;padding:8px 0}uni-slider .uni-slider-handle-wrapper{position:relative;height:2px;border-radius:5px;background-color:#e9e9e9;cursor:pointer;-webkit-tap-highlight-color:transparent}uni-slider .uni-slider-handle-wrapper,uni-slider .uni-slider-track{-webkit-transition:background-color .3s ease;transition:background-color .3s ease}uni-slider .uni-slider-track{height:100%;border-radius:6px;background-color:#007aff}uni-slider .uni-slider-handle,uni-slider .uni-slider-thumb{position:absolute;left:50%;top:50%;cursor:pointer;border-radius:50%;-webkit-transition:border-color .3s ease;transition:border-color .3s ease}uni-slider .uni-slider-handle{width:28px;height:28px;margin-top:-14px;margin-left:-14px;background-color:rgba(0,0,0,0);z-index:3;cursor:grab}uni-slider .uni-slider-thumb{z-index:2;box-shadow:0 0 4px rgba(0,0,0,.2)}uni-slider .uni-slider-step{position:absolute;width:100%;height:2px;background:rgba(0,0,0,0);z-index:1}uni-slider .uni-slider-value{width:3ch;color:#888;font-size:14px;margin-left:1em}uni-slider .uni-slider-disabled .uni-slider-track{background-color:#ccc}uni-slider .uni-slider-disabled .uni-slider-thumb{background-color:#fff;border-color:#ccc}uni-swiper-item{display:block;overflow:hidden;will-change:transform;position:absolute;width:100%;height:100%;cursor:grab}uni-swiper-item[hidden]{display:none}uni-swiper{display:block;height:150px}uni-swiper[hidden]{display:none}uni-swiper .uni-swiper-wrapper{overflow:hidden;position:relative;width:100%;height:100%;-webkit-transform:translateZ(0);transform:translateZ(0)}uni-swiper .uni-swiper-slides{position:absolute;left:0;top:0;right:0;bottom:0}uni-swiper .uni-swiper-slide-frame{position:absolute;left:0;top:0;width:100%;height:100%;will-change:transform}uni-swiper .uni-swiper-dots{position:absolute;font-size:0}uni-swiper .uni-swiper-dots-horizontal{left:50%;bottom:10px;text-align:center;white-space:nowrap;-webkit-transform:translate(-50%);transform:translate(-50%)}uni-swiper .uni-swiper-dots-horizontal .uni-swiper-dot{margin-right:8px}uni-swiper .uni-swiper-dots-horizontal .uni-swiper-dot:last-child{margin-right:0}uni-swiper .uni-swiper-dots-vertical{right:10px;top:50%;text-align:right;-webkit-transform:translateY(-50%);transform:translateY(-50%)}uni-swiper .uni-swiper-dots-vertical .uni-swiper-dot{display:block;margin-bottom:9px}uni-swiper .uni-swiper-dots-vertical .uni-swiper-dot:last-child{margin-bottom:0}uni-swiper .uni-swiper-dot{display:inline-block;width:8px;height:8px;cursor:pointer;-webkit-transition-property:background-color;transition-property:background-color;-webkit-transition-timing-function:ease;transition-timing-function:ease;background:rgba(0,0,0,.3);border-radius:50%}uni-swiper .uni-swiper-dot-active{background-color:#000}uni-switch{-webkit-tap-highlight-color:transparent;display:inline-block;cursor:pointer}uni-switch[hidden]{display:none}uni-switch[disabled]{cursor:not-allowed}uni-switch .uni-switch-wrapper{display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;vertical-align:middle}uni-switch .uni-switch-input{-webkit-appearance:none;appearance:none;position:relative;width:52px;height:32px;margin-right:5px;border:1px solid #dfdfdf;outline:0;border-radius:16px;box-sizing:border-box;background-color:#dfdfdf;-webkit-transition:background-color .1s,border .1s;transition:background-color .1s,border .1s}uni-switch[disabled] .uni-switch-input{opacity:.7}uni-switch .uni-switch-input:before{width:50px;background-color:#fdfdfd}uni-switch .uni-switch-input:after,uni-switch .uni-switch-input:before{content:" ";position:absolute;top:0;left:0;height:30px;border-radius:15px;transition:-webkit-transform .3s;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}uni-switch .uni-switch-input:after{width:30px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4)}uni-switch .uni-switch-input.uni-switch-input-checked{border-color:#007aff;background-color:#007aff}uni-switch .uni-switch-input.uni-switch-input-checked:before{-webkit-transform:scale(0);transform:scale(0)}uni-switch .uni-switch-input.uni-switch-input-checked:after{-webkit-transform:translateX(20px);transform:translateX(20px)}uni-switch .uni-checkbox-input{margin-right:5px;-webkit-appearance:none;appearance:none;outline:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:3px;width:22px;height:22px;position:relative;color:#007aff}uni-switch:not([disabled]) .uni-checkbox-input:hover{border-color:#007aff}uni-switch .uni-checkbox-input.uni-checkbox-input-checked:before{font:normal normal normal 14px/1 uni;content:"\EA08";color:inherit;font-size:22px;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%) scale(.73);-webkit-transform:translate(-50%,-48%) scale(.73)}uni-switch .uni-checkbox-input.uni-checkbox-input-disabled{background-color:#e1e1e1}uni-switch .uni-checkbox-input.uni-checkbox-input-disabled:before{color:#adadad}uni-text[selectable]{cursor:auto;user-select:text;-webkit-user-select:text}uni-textarea{width:300px;height:150px;display:block;position:relative;font-size:16px;line-height:normal;white-space:pre-wrap;word-break:break-all}uni-textarea[hidden]{display:none}.uni-textarea-compute,.uni-textarea-line,.uni-textarea-placeholder,.uni-textarea-textarea,.uni-textarea-wrapper{outline:none;border:none;padding:0;margin:0;text-decoration:inherit}.uni-textarea-wrapper{display:block;position:relative;width:100%;height:100%;min-height:inherit}.uni-textarea-compute,.uni-textarea-line,.uni-textarea-placeholder,.uni-textarea-textarea{position:absolute;width:100%;height:100%;left:0;top:0;white-space:inherit;word-break:inherit}.uni-textarea-placeholder{color:grey;overflow:hidden}.uni-textarea-compute,.uni-textarea-line{visibility:hidden;height:auto}.uni-textarea-line{width:1em}.uni-textarea-textarea{resize:none;background:none;color:inherit;opacity:1;font:inherit;line-height:inherit;letter-spacing:inherit;text-align:inherit;text-indent:inherit;text-transform:inherit;text-shadow:inherit}.uni-textarea-textarea-fix-margin{width:auto;right:0;margin:0 -3px}.uni-textarea-textarea:disabled{-webkit-text-fill-color:currentcolor}uni-view{display:block}uni-view[hidden]{display:none}uni-ad{display:block;overflow:hidden}uni-ad[hidden]{display:none}uni-cover-image{display:block;line-height:1.2;overflow:hidden;pointer-events:auto}uni-cover-image,uni-cover-image img{height:100%;width:100%}uni-cover-image[hidden]{display:none}uni-cover-image .uni-cover-image{width:100%;height:100%;text-overflow:inherit;overflow:inherit;white-space:nowrap;-webkit-align-items:inherit;-webkit-box-align:inherit;align-items:inherit;-webkit-justify-content:inherit;-webkit-box-pack:inherit;justify-content:inherit;-webkit-flex-direction:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;flex-direction:inherit;font-size:0;display:inherit}uni-cover-view{display:block;line-height:1.2;overflow:hidden;white-space:nowrap;pointer-events:auto}uni-cover-view[hidden]{display:none}uni-cover-view .uni-cover-view{width:100%;height:100%;text-overflow:inherit;overflow:hidden;white-space:inherit;-webkit-align-items:inherit;-webkit-box-align:inherit;align-items:inherit;-webkit-justify-content:inherit;-webkit-box-pack:inherit;justify-content:inherit;-webkit-flex-direction:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;flex-direction:inherit;-webkit-flex-wrap:inherit;flex-wrap:inherit;display:inherit;overflow:inherit}uni-map{position:relative;width:300px;height:150px;display:block}uni-map[hidden]{display:none}uni-picker{position:relative;display:block;cursor:pointer}uni-picker[hidden]{display:none}uni-picker[disabled]{cursor:not-allowed}.uni-picker-container{display:none;position:fixed;left:0;right:0;top:0;bottom:0;box-sizing:border-box;z-index:999;font-size:16px}.uni-picker-container .uni-picker-custom *{box-sizing:border-box}.uni-picker-container .uni-picker-custom{position:fixed;left:0;bottom:0;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:999;width:100%;background-color:#efeff4;visibility:hidden;-webkit-transition:visibility .3s,-webkit-transform .3s;transition:visibility .3s,-webkit-transform .3s;transition:transform .3s,visibility .3s;transition:transform .3s,visibility .3s,-webkit-transform .3s}.uni-picker-container .uni-picker-custom.uni-picker-toggle{visibility:visible;-webkit-transform:translate(0);transform:translate(0)}.uni-picker-container .uni-picker-content{position:relative;display:block;width:100%;height:238px;background-color:#fff}.uni-picker-container .uni-picker-item{padding:0;height:34px;line-height:34px;text-align:center;color:#000;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer}.uni-picker-container .uni-picker-header{display:block;position:relative;text-align:center;width:100%;height:45px;background-color:#fff}.uni-picker-container .uni-picker-header:after{content:"";position:absolute;left:0;bottom:0;right:0;height:1px;clear:both;border-bottom:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.uni-picker-container .uni-picker-action{display:block;max-width:50%;top:0;height:100%;box-sizing:border-box;padding:0 14px;font-size:17px;line-height:45px;overflow:hidden;cursor:pointer}.uni-picker-container .uni-picker-action.uni-picker-action-cancel{float:left;color:#888}.uni-picker-container .uni-picker-action.uni-picker-action-confirm{float:right;color:#007aff}.uni-picker-container .uni-picker-select{display:none}.uni-picker-system{position:absolute;display:none;display:block;top:0;left:0;width:100%;height:100%;overflow:hidden}.uni-picker-system>input{position:absolute;border:none;height:100%;opacity:0;cursor:pointer}.uni-picker-system>input.firefox{top:0;left:0;width:100%}.uni-picker-system>input.chrome{top:0;left:0;width:2em;font-size:32px;height:32px}@media screen and (min-width:500px) and (min-height:500px){.uni-mask.uni-picker-mask{background:none}.uni-picker-container .uni-picker-custom{width:300px;left:50%;right:auto;top:50%;bottom:auto;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;border-radius:5px;-webkit-transition:opacity .3s,visibility .3s;transition:opacity .3s,visibility .3s;box-shadow:0 0 20px 5px rgba(0,0,0,.3)}.uni-picker-container .uni-picker-header{border-radius:5px 5px 0 0}.uni-picker-container .uni-picker-content{-webkit-transform:translate(0);transform:translate(0);overflow:hidden;border-radius:0 0 5px 5px}.uni-picker-container .uni-picker-custom.uni-picker-toggle{opacity:1;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.uni-selector-select .uni-picker-content,.uni-selector-select .uni-picker-header{display:none}.uni-selector-select .uni-picker-select{display:block;max-height:300px;overflow:auto;background-color:#fff;border-radius:5px;padding:6px 0}.uni-selector-select .uni-picker-item{padding:0 10px;color:#555}.uni-selector-select .uni-picker-item:hover{background-color:#f6f6f6}.uni-selector-select .uni-picker-item.selected{color:#007aff}}uni-video{width:300px;height:225px;display:inline-block;line-height:0;overflow:hidden;position:relative}uni-video[hidden]{display:none}.uni-video-container{width:100%;height:100%;background-color:#000;display:inline-block;position:absolute;top:0;left:0;overflow:hidden;object-position:inherit}.uni-video-container.uni-video-type-fullscreen{position:fixed;z-index:999}.uni-video-video{width:100%;height:100%;object-position:inherit}.uni-video-cover{bottom:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;background-color:rgba(1,1,1,.5);z-index:1}.uni-video-cover,.uni-video-slots{position:absolute;top:0;left:0;width:100%}.uni-video-slots{height:100%;overflow:hidden;pointer-events:none}.uni-video-cover-play-button{width:40px;height:40px;background-size:50%;background-repeat:no-repeat;background-position:50% 50%;cursor:pointer}.uni-video-cover-duration{color:#fff;font-size:16px;line-height:1;margin-top:10px}.uni-video-bar{height:44px;background-color:rgba(0,0,0,.5);overflow:hidden;position:absolute;bottom:0;right:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;padding:0 10px;z-index:0;-webkit-transform:translateZ(0);transform:translateZ(0)}.uni-video-bar.uni-video-bar-full{left:0}.uni-video-controls{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;margin:0 8.5px}.uni-video-control-button{width:13px;height:15px;padding:14.5px 12.5px 14.5px 12.5px;margin-left:-8.5px;box-sizing:content-box;cursor:pointer}.uni-video-control-button:after{content:"";display:block;width:100%;height:100%;background-size:100%;background-position:50% 50%;background-repeat:no-repeat}.uni-video-control-button.uni-video-control-button-play:after,.uni-video-cover-play-button{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAeCAYAAAAy2w7YAAAAAXNSR0IArs4c6QAAAWhJREFUSA1j+P///0cgBoHjQGzCQCsAtgJB/AMy5wCxGNXtQ9iBwvoA5BUCMQvVLEQxHpNzDSjkRhXLMM3GKrIeKKpEkYVYjcUu+AMo3ALE3GRZiN1MvKKPgbIRJFuG10j8koeA0gZEW4jfLIKyf4EqpgOxMEELCRpFnIJ3QGU5QMyM00LizCFa1SWgSkeslhFtBGkKVwGVy6FYSJp+klR/A6quB2JOkIWMIK0oNlOf8xBoZDE9LAI7nYn6HsBq4l96WHQEaLUpAyiOaASeAM2NgvuPBpaACt82IEYtfKls0UagecpwXyAzqGTRdaA57sjmYrAptAjUsCkGYlYMg9EFyLQI1IiZB8Ti6Obh5JNh0QmgHlOcBuKSIMGi50C18UDMiMssvOJEWPQLqKYbiHnxGkRIkoBF24DyaoTMIEoeh0W3geI+RBlArCI0iz4D+RVAzEasfqLVAQ19AcSg5LoYiKWI1kiiQgCMBLnEEcfDSgAAAABJRU5ErkJggg==")}.uni-video-control-button.uni-video-control-button-pause:after{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAgCAYAAAAffCjxAAAAAXNSR0IArs4c6QAAAFlJREFUSA3tksEKACAIQ7X//5zq98wOgQayum8QaGweHhMzG/6OujzKAymn+0LMqivu1XznWmX8/echTIyMyAgTwA72iIwwAexgj8gIE8CO3aMRbDPMaEy5BRGaKcZv8YxRAAAAAElFTkSuQmCC")}.uni-video-current-time,.uni-video-duration{height:14.5px;line-height:14.5px;margin-top:15px;margin-bottom:14.5px;font-size:12px;color:#cbcbcb}.uni-video-progress-container{-webkit-box-flex:2;-webkit-flex-grow:2;flex-grow:2;position:relative}.uni-video-progress{height:2px;margin:21px 12px;background-color:hsla(0,0%,100%,.4);position:relative;cursor:pointer}.uni-video-progress-buffered{position:absolute;left:0;top:0;width:0;height:100%;-webkit-transition:width .1s;transition:width .1s;background-color:hsla(0,0%,100%,.8)}.uni-video-ball{width:16px;height:16px;padding:14px;position:absolute;top:-21px;box-sizing:content-box;left:0;margin-left:-22px}.uni-video-inner{width:100%;height:100%;background-color:#fff;border-radius:50%}.uni-video-danmu-button{white-space:nowrap;line-height:1;padding:2px 10px;border:1px solid #fff;border-radius:5px;font-size:13px;color:#fff;margin:0 8.5px;cursor:pointer}.uni-video-danmu-button.uni-video-danmu-button-active{border-color:#48c23d;color:#48c23d}.uni-video-fullscreen{width:17px;height:17px;padding:8.5px;box-sizing:content-box;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAAAXNSR0IArs4c6QAAAQRJREFUWAnt1d0NwiAQB/CmS7hHX5zFxLF0Ah2hE/lg7BT4PyMJUj6Oyt299BIioZT7ARYG59wLpTXmoXOMGO/QecxtwyWW4o42AupGALkFdX1MkHxE3Q7jIbQPqNthQogpJoZkMLRlsn/gFMQEk4OoY0oQVUwNoobhQFQwgMxUKFkt0C8+Zy61d8SeR5iHWCLOwF/MCb8Tp//ex3QFsE1HlCfKFUX2OijNFMnPKD7k76YcBoL402Zh8B77+MjlXrVvwfglXA32b0MrRgxCE2nBiEJaMOIQLkYFwsGoQWoYVUgJow4pYD4Weq4ayBqfwDYQmnUK0301kITujuawu65/l2B5A4z3Qe+Ut7EBAAAAAElFTkSuQmCC");background-size:50%;background-position:50% 50%;background-repeat:no-repeat;cursor:pointer}.uni-video-fullscreen.uni-video-type-fullscreen{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAABBElEQVRYhcXWwQ3CMAwF0O+qOzAKQzAAl0pMxQQwQhmGKwcERxbgc4lEVdHUbm3zJR8qJemTo6YByS3JO8kjyQbGkHQpkOz4zcmK8YQ0BWDCkOxL+UDKombMYKwfZAkmDGLFhEIsmHCIFpMC0WDSIHOYVEgNkw6pYPIhE5j/QCoYF0g7eEkPYGej+cX82x/l6aIAIOb9CcrajrjFE/IAQGP1IgIRcYVsVs32+vx+nC9nWq6dAZDhOaPHBEDGh54O4w0pa9oxEZBFmCjIBGb6Qh4JMWGiIWpMBkSFyYLMYjIhNUw7N9GQi2aQiLxJHspjV+rl1hFrRp25uV2MRGQRBsAewPUD/HhJVOOuCzwAAAAASUVORK5CYII=")}.uni-video-danmu{position:absolute;top:0;left:0;bottom:0;width:100%;margin-top:14px;margin-bottom:44px;font-size:14px;line-height:14px;overflow:visible}.uni-video-danmu-item{line-height:1;position:absolute;color:#fff;white-space:nowrap;left:100%;-webkit-transform:translatex(0);transform:translatex(0);-webkit-transition-property:left,-webkit-transform;transition-property:left,-webkit-transform;transition-property:left,transform;transition-property:left,transform,-webkit-transform;-webkit-transition-duration:3s;transition-duration:3s;-webkit-transition-timing-function:linear;transition-timing-function:linear}.uni-video-toast{pointer-events:none;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-radius:5px;background-color:hsla(0,0%,100%,.8);color:#000;display:none}.uni-video-toast.uni-video-toast-volume{width:100px;height:100px;display:block}.uni-video-toast-volume .uni-video-toast-title{width:100%;font-size:12px;line-height:16px;text-align:center;margin-top:10px;display:block}.uni-video-toast-volume .uni-video-toast-icon{fill:#000;width:50%;height:50%;margin-left:25%;display:block}.uni-video-toast-volume .uni-video-toast-value{width:80px;height:5px;margin-top:5px;margin-left:10px}.uni-video-toast-volume .uni-video-toast-value>.uni-video-toast-value-content{overflow:hidden}.uni-video-toast-volume-grids{width:80px;height:5px}.uni-video-toast-volume-grids-item{float:left;width:7.1px;height:5px;background-color:#000}.uni-video-toast-volume-grids-item:not(:first-child){margin-left:1px}.uni-video-toast.uni-video-toast-progress{display:block;background-color:rgba(0,0,0,.8);color:#fff;font-size:14px;line-height:18px;padding:6px}uni-web-view{position:absolute;left:0;right:0;top:0;bottom:0}body::after{position:fixed;content:'';left:-1000px;top:-1000px;-webkit-animation:shadow-preload .1s;-webkit-animation-delay:3s;animation:shadow-preload .1s;animation-delay:3s}@-webkit-keyframes shadow-preload{0%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}100%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}}@keyframes shadow-preload{0%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}100%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}}
\ No newline at end of file