iot-ui-app/pages/configuration/configuration-list.vue

567 lines
15 KiB
Vue

<template>
<view class="configuration-box">
<view class="device-search">
<u-dropdown active-color="#1b85e9">
<u-dropdown-item v-model="dataType" title="组态类型" :options="typeOptions" @change="searchChange"></u-dropdown-item>
</u-dropdown>
<u-search placeholder="请输入组态名称搜索" margin="0 10rpx" class="uni-search-bar" v-model="searchVal" @custom="searchChange" @clear="searchChange" @search="searchChange"></u-search>
</view>
<mescroll-body ref="mescrollRef" top="160" @init="mescrollInit" @down="downCallback" :up="upOption" @up="upCallback">
<view class="configuration-list">
<view class="configuration-item" v-for="(item,index) in configurationList" :key="index" @click.stop="goDetail(item)">
<view class="item-img-box">
<image :src="item.iconPath" mode="aspectFit"></image>
</view>
<view class="item-content">
<view class="content-left">
<view class="content-top">
<text class="content-name">{{item.sceneName}}</text>
</view>
<view class="content-time">{{item.createdAt}}</view>
<!-- <view class="content-bottom">
<view class="content-btn-box" @click.stop="clickShare(index)">
<u-icon name="zhuanfa" color="#a5a4a5" size="42"></u-icon>
</view>
<text @click.stop="clickShare(index)">分享</text>
</view> -->
<view class="content-btn-box">
<button type="primary">预览</button>
<button type="primary" @click.stop="clickShare(index)">分享</button>
</view>
</view>
<!-- <u-icon name="arrow-right" color="#a5a4a5" size="42"></u-icon> -->
</view>
</view>
</view>
</mescroll-body>
<!-- 分享弹框 -->
<u-popup v-model="shareShow" width="600" border-radius="10" class="share-popup" mode="center">
<view class="title">
请选择分享方式
</view>
<view class="popup-box">
<!-- #ifdef MP-WEIXIN -->
<view class="box-item" @click="shareFriend">
<button type="default" plain="true" open-type="share">
<view class="icon-bg" style="background-color: #44a941;">
<u-icon name="weixin-fill" color="#fff" size="28"></u-icon>
</view>
</button>
<text>分享小程序</text>
</view>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<!-- #endif -->
<view class="box-item" @click="goShareList">
<button type="default" plain="true">
<view class="icon-bg" style="background-color: #f36038;">
<u-icon name="attach" color="#fff" size="28"></u-icon>
</view>
</button>
<text>分享链接</text>
</view>
</view>
<view class="cancel-share" @click="cancelShare">
取消分享
</view>
</u-popup>
<!-- 生成海报 -->
<hch-poster ref="hchPoster" @cancel="handleCancel" :posterData.sync="posterData" />
</view>
</template>
<script>
let typeOptions=[
{
label: '全部',
value: '',
},
{
label: '2D',
value: '2d',
},
{
label: '3D',
value: '3d',
},
{
label: 'GIS',
value: 'gis',
}
]
import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js"
import HchPoster from "@/components/hch-poster/hch-poster.vue"
export default{
mixins: [MescrollMixin],
data(){
return {
expire:0,
token:'',
// 所属项目名称
projectName:1,
typeOptions:typeOptions,
configurationList:[],
dataType:'',
searchVal:'',
upOption:{
noMoreSize: 4,
textNoMore: '---- 已经到底啦 ----',
empty:{
tip: '~ 搜索无数据 ~' // 提示
}
},
shareShow:false,
shareIndex:null, //当前点击分享的索引
shareToken:'',
filePrefix:'',
// 海报模板数据
posterData: {
poster: {
//根据屏幕大小自动生成海报背景大小
url: "https://am-img.gkiiot.com/iotos/app/img/configuration/white-bg.png",//图片地址
r: 10, //圆角半径
w: 300, //海报宽度
h: 480, //海报高度
p: 20 //海报内边距padding
},
mainImg: {
//海报主商品图
url: "https://am-img.gkiiot.com/iotos/app/img/configuration/white-bg.png",//图片地址
r: 10, //圆角半径
w: 250, //宽度
h: 200 //高度
},
title: {
//商品标题
text: "标题",//文本
fontSize: 16, //字体大小
color: "#000", //颜色
lineHeight: 25, //行高
mt: 20 //margin-top
},
codeImg: {
//小程序码
url: "https://am-img.gkiiot.com/iotos/app/img/configuration/white-bg.png",//图片地址
w: 100, //宽度
h: 100, //高度
mt: 20, //margin-top
r: 50 //圆角半径
},
tips: [
//提示信息
{
text: "小程序码",//文本
fontSize: 14,//字体大小
color: "#2f1709",//字体颜色
align: "center",//对齐方式
lineHeight: 25,//行高
mt: 20//margin-top
},
{
text: "长按/扫描识别查看",//文本
fontSize: 12,//字体大小
color: "#2f1709",//字体颜色
align: "center",//对齐方式
lineHeight: 25,//行高
mt: 20//margin-top
}
]
}
}
},
components:{
HchPoster
},
onShareAppMessage(res) {
if (res.from === 'button') {// 来自页面内分享按钮
console.log(res.target)
return this.$u.mpShare
}
},
// #ifdef MP-WEIXIN
onShareTimeline() {
return this.$u.mpShare
},
// #endif
onLoad() {
this.getToken();
this.$u.mpShare = {
title: '', // 默认为小程序名称
path: '', // 默认为当前页面路径
imageUrl: '' // 默认为当前页面的截图
}
this.getFilePrefix();
this.configurationList=[];
this.pageNum=1;
// this.getConfigurationList();
},
methods:{
// 获取token和有效期
getToken(){
uni.getStorage({
key:'token',
}).then(res => {
// 如果返回数组为两位就是正确
if(res.length==2){
this.token = res[1].data;
}
return uni.getStorage({
key:'expire',
})
}).then(res => {
if(res.length==2){
this.expire = res[1].data;
}
})
},
getFilePrefix(){
let configList = uni.getStorageSync('configList');
let configIndex = uni.getStorageSync('configIndex');
if(!configList || configIndex==-1){
uni.showToast({
title: '请求域名为空,请先添加',
icon: 'none',
duration: 1500
})
setTimeout(()=>{
uni.navigateTo({
url:'/pages/tabbar/config'
})
},1500)
}else{
this.filePrefix = configList[configIndex].protocol + configList[configIndex].address;
}
},
searchChange(e) {
this.configurationList = []// 先置空列表,显示加载进度
this.mescroll.resetUpScroll() // 再刷新列表数据
},
// 获取产品列表
upCallback(page){
let params = {
page: page.num,
pageSize: page.size,
dataType:this.dataType,
"Wheres": {
"wheres": [
{"fields": ["sceneName"],"operator": "keyword","value": this.searchVal}
]
},
}
this.$api.configurationApi.getConfigurationListData(params).then(res => {
if(res.code === 0){
let curPageData = res.data && res.data.list;
let curPageLen = curPageData && curPageData.length || 0;
let totalSize = res.data.totalCount;
this.$nextTick(()=>{
// 隐藏下拉刷新和上拉加载的状态;
this.mescroll.endBySize(curPageLen, totalSize);
})
//设置列表数据
if(page.num == 1) this.configurationList = []; //如果是第一页需手动制空列表
let data = curPageData.map(item=>{
if(!item.iconImage || item.iconImage == ''){
item.iconPath = 'https://am-img.gkiiot.com/iotos/app/img/configuration/default.jpg'
}else{
item.iconPath = this.filePrefix + item.iconImage
}
item.url = this.filePrefix + '/console/' + item.dataType + '/preview?sceneId=' + item.uuid;
return item;
})
this.configurationList = curPageLen > 0 && this.configurationList.concat(data); //追加新数据
this.total = totalSize;
}else{
this.$u.toast(res.msg);
this.mescroll.endErr();
}
}, error => {
this.$u.toast('服务器开小差了呢,请您稍后再试')
})
},
// 点击分享
clickShare(index){
console.log("点击分享",index)
// #ifdef MP-WEIXIN
this.shareShow = true;
this.shareIndex = index;
// #endif
// #ifndef MP-WEIXIN
uni.navigateTo({
url:'./configuration-share?uuid=' + this.configurationList[index].uuid + '&name=' + this.configurationList[index].sceneName + '&imgPath=' + encodeURIComponent(this.configurationList[index].iconPath)
})
// #endif
// this.$u.toast('功能开发中');
// console.log(this.configurationList[index])
// this.shareShow = true;
// this.shareIndex = index;
},
// 跳转分享列表
goShareList(){
uni.navigateTo({
url:'./configuration-share?uuid=' + this.configurationList[this.shareIndex].uuid + '&name=' + this.configurationList[this.shareIndex].sceneName + '&imgPath=' + encodeURIComponent(this.configurationList[this.shareIndex].iconPath)
})
},
// 分享给好友(小程序)
shareFriend(){
let obj = this.configurationList[this.shareIndex];
let url = obj.url + '&expires=' + this.expire + '&token=' + this.token;
this.$u.mpShare = {
title: obj.sceneName, // 默认为小程序名称
path: '/pages/configuration/configuration-detail?name=' + encodeURIComponent(obj.sceneName) + '&url=' + encodeURIComponent(url), // 默认为当前页面路径
imageUrl: obj.iconPath // 默认为当前页面的截图
}
},
// 分享给好友(app)
appShareFriend(){
let obj = this.configurationList[this.shareIndex];
uni.share({
provider: 'weixin',
scene: "WXSceneSession",
type: 5,
imageUrl: this.filePrefix+obj.iconPath,
title: obj.name,
miniProgram: {
id: 'gh_74c767462f0a',
path: '/pages/hcwl/configuration/configuration-detail?name=' + encodeURIComponent(obj.name) + '&url=' + encodeURIComponent(obj.url),
type: 0,
webUrl: '/pages/hcwl/configuration/configuration-detail?name=' + encodeURIComponent(obj.name) + '&url=' + encodeURIComponent(obj.url)
},
success: (res) => {
this.$u.toast('分享成功',res);
},
fail: (e) => {
this.$u.toast('分享失败',e);
},
complete:(e) => {
console.log('分享操作结束!')
}
});
},
// 获取小程序码
getQrCode(){
let obj = this.configurationList[this.shareIndex];
console.log("当前点击数据",obj)
let id = encodeURIComponent(obj.id);
let opt = {
url: '/prod-api/system/open/wechat/er/image',
method: "POST",
}
let params = {
page:'pages/configuration/configuration-transfer',
// page:'pages/productList/transfer',
scene: id
}
this.$request.TokenRequest(opt,params).then(res => {
console.log("获取二维码成功",res);
if(res.code != 200){
this.$u.toast('生成海报失败!');
return;
}
this.shareShow = false;
this.$set(this.posterData.mainImg,'url',this.filePrefix+obj.iconPath)
this.$set(this.posterData.title,'text',obj.name)
this.$set(this.posterData.codeImg,'url',res.data)
console.log("当前海报信息",this.posterData)
this.$nextTick(()=>{
this.$refs.hchPoster.posterShow()
})
}, error => {
this.$u.toast('获取二维码失败!');
console.log("获取二维码失败",error)
})
},
// 取消海报生成
handleCancel(){
console.log("取消海报生成")
},
// 取消分享
cancelShare(){
this.shareShow = false;
},
// 跳转详情页
goDetail(item){
console.log("跳转详情页",item)
let url = item.url + '&expires=' + this.expire + '&token=' + this.token;
uni.navigateTo({
url:'./configuration-detail?name=' + encodeURIComponent(item.sceneName) + '&url=' + encodeURIComponent(url)
})
},
// 上拉加载更多
reachBottom() {
console.log("这里上拉加载更多")
if(!this.isLoadMore){ //此处判断,上锁,防止重复请求
this.loadStatus = 'loading';
this.isLoadMore=true
this.pageNum+=1
this.getConfigurationList()
}
},
}
}
</script>
<style lang="scss" scoped>
.configuration-box{
background: #f5f5f5;
// height: 100vh;
}
.device-search{
position: fixed;
top: 0;
left: 0;
box-sizing: border-box;
height: 160rpx;
background-color: #fff;
width: 100%;
z-index: 999;
.uni-search-bar{
// padding: 0 10rpx;
}
}
// .scroll-box{
// // height: calc(100% - var(--status-bar-height) - 48px - 120rpx);
// height: calc(100% - var(--status-bar-height) - 48px);
// /* #ifdef APP-PLUS */
// height: calc(100% - var(--status-bar-height) - 44px);
// /* #endif */
// }
.configuration-list{
padding: 10rpx 24rpx;
.configuration-item{
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 0;
// height: 115rpx;
border-bottom: 1px solid #e0dede;
.item-img-box{
width: 192rpx;
height: 150rpx;
margin-right: 20rpx;
background-color: #eee;
image{
width: 100%;
height: 100%;
}
}
.item-content{
flex: 1;
height: 150rpx;
// display: flex;
// justify-content: space-between;
.content-left{
display: flex;
flex-direction: column;
justify-content: space-between;
flex:1;
.content-top{
font-weight: bold;
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
}
.content-time{
font-size: 24rpx;
color: #999;
margin: 4rpx 0 16rpx 0;
}
.content-btn-box{
display: flex;
align-items: center;
// justify-content: space-around;
button{
width: 200rpx;
height: 60rpx;
margin-left: 0;
font-size: 26rpx;
padding: 0;
background: #2979ff;
display: flex;
justify-content: center;
align-items: center;
&:first-child{
margin-right: 30rpx;
}
}
}
.content-bottom{
display: flex;
align-items: center;
// justify-content: space-between;
// margin-top: 10rpx;
.content-bottom-left{
display: flex;
align-items: center;
font-size: 24rpx;
color: #999;
.content-txt{
margin: 0 10rpx;
&:first-of-type{
margin-right: 30rpx;
}
}
}
.content-btn-box{
margin-right: 10rpx;
::v-deep button{
background-color: #1b85e9;
padding: 10rpx 30rpx;
}
}
}
}
}
}
}
// 分享弹框
.share-popup{
.title{
background-color: #eeeff1;
display: flex;
justify-content: center;
align-items: center;
height: 100rpx;
font-size: 30rpx;
}
.popup-box{
display: flex;
justify-content: space-around;
align-items: center;
.box-item{
padding: 20rpx 0;
button{
border: 0px solid #fff;
background: #fff;
padding: 10px;
display: flex;
flex-direction: column;
align-items: center;
.icon-bg{
width: 50rpx;
height: 50rpx;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
}
}
}
}
.cancel-share{
border-top: 1px solid #f0f0f0;
display: flex;
justify-content: center;
align-items: center;
height: 100rpx;
font-size: 30rpx;
color: #666;
}
}
</style>