提交 f7e56287 编写于 作者: 张平's avatar 张平

Merge branch 'dev-phase1-0111' into 'release'

新增客服系统  code reviewer: 张平

新增客服系统

See merge request !1
无法预览此类型文件
...@@ -50,14 +50,14 @@ module.exports = { ...@@ -50,14 +50,14 @@ module.exports = {
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url', loader: 'url',
query: { query: {
limit: 10000, limit: 50000,
name: utils.assetsPath('img/[name].[ext]') name: utils.assetsPath('img/[name].[ext]')
} }
}, { }, {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url', loader: 'url',
query: { query: {
limit: 10000, limit: 50000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]') name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
} }
}] }]
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
<div id="app"> <div id="app">
<router-view></router-view> <router-view></router-view>
</div> </div>
<script src="https://unpkg.com/qiniu-js@2.2.0/dist/qiniu.min.js"></script> <!-- <script src="qiniu.min.js"></script> -->
<!-- <script src="https://unpkg.com/qiniu-js@2.2.0/dist/qiniu.min.js"></script> -->
</body> </body>
</html> </html>
因为 它太大了无法显示 源差异 。您可以改为 查看blob
无法预览此类型文件
<template> <template>
<div> <div>
<v-header :userName="userName" :authList="authList"></v-header> <v-header :userName="userName" :authList="authList"></v-header>
<v-slidebar :tokenValue="token"></v-slidebar> <v-slidebar v-if="systemType" :tokenValue="token" :systemType="systemType"></v-slidebar>
<el-container> <el-container>
<div class="content" id="body-content"> <div class="content" id="body-content">
<transition name="router-fade" mode="out-in"> <transition name="router-fade" mode="out-in">
<keep-alive> <keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view> <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive> </keep-alive>
</transition> </transition>
<transition name="router-fade" mode="out-in"> <transition name="router-fade" mode="out-in">
<router-view v-if="!$route.meta.keepAlive"></router-view> <router-view v-if="!$route.meta.keepAlive"></router-view>
</transition> </transition>
<v-footer></v-footer> <v-footer></v-footer>
</div> </div>
</el-container> </el-container>
</div> </div>
</template> </template>
<script> <script>
import VHeader from './views/layout/header.vue' import VHeader from "./views/layout/header.vue";
import VSlidebar from './views/layout/slidebar.vue' import VSlidebar from "./views/layout/slidebar.vue";
import VFooter from './views/layout/footer.vue' import VFooter from "./views/layout/footer.vue";
import { base64decode, isNotEmptyUtils, getUrlParamsMap, ssoLogin } from "./utils/utils.js" import {
import { mapActions, mapGetters } from 'vuex' base64decode,
import { getLoginUrl, getInnerLoginUrl } from './utils/index.js' isNotEmptyUtils,
let vm = null getUrlParamsMap,
ssoLogin
} from "./utils/utils.js";
import { mapActions, mapGetters } from "vuex";
import { getLoginUrl, getInnerLoginUrl } from "./utils/index.js";
let vm = null;
export default { export default {
components:{ components: {
VHeader, VHeader,
VSlidebar, VSlidebar,
VFooter VFooter
}, },
data() { data() {
return { return {
idType: 0, token: "",
token: '', userName: "",
userName: '', authList: [],
authList: [] systemType: 0,
} };
}, },
computed:{ computed: {
...mapGetters([ ...mapGetters(["_token"])
'_token' },
]) created() {
}, vm = this;
created() { vm.getToken();
vm = this },
vm.getToken() mounted() {},
}, methods: {
mounted() { // 解密token
getToken() {
}, let href = window.location.href;
methods: { let offset = href.indexOf("?");
// 解密token //localStorage.setItem('storageToken','CBC0F7B0C9D34806958B18E23C881A09')
getToken() { if (offset !== -1) {
let href = window.location.href let paramStr = href.substring(offset + 1, href.length);
let offset = href.indexOf("?") let pars = base64decode(paramStr);
//localStorage.setItem('storageToken','CBC0F7B0C9D34806958B18E23C881A09') let paramMap = getUrlParamsMap(pars, "&");
if(offset !== -1) { if (
let paramStr = href.substring(offset + 1, href.length) isNotEmptyUtils(paramMap["token"]) &&
let pars = base64decode(paramStr) isNotEmptyUtils(paramMap["ssoOrigin"])
let paramMap = getUrlParamsMap(pars, "&") ) {
if (isNotEmptyUtils(paramMap["token"]) && isNotEmptyUtils(paramMap["ssoOrigin"])) { vm.token = paramMap["token"];
vm.token = paramMap["token"] localStorage.setItem("storageToken", vm.token);
localStorage.setItem('storageToken', vm.token) ssoLogin(href, paramMap);
ssoLogin(href, paramMap) //vm.$router.push({ path: 'home' })
//vm.$router.push({ path: 'home' }) } else {
} else { if (!localStorage.getItem("storageToken")) {
if(!localStorage.getItem('storageToken')) { window.location.href = getInnerLoginUrl(); // 没有token返回登录页面
window.location.href = getInnerLoginUrl() // 没有token返回登录页面 return;
return }
} }
} } else {
}else { if (!localStorage.getItem("storageToken")) {
if(!localStorage.getItem('storageToken')) { window.location.href = getInnerLoginUrl(); // 没有token返回登录页面
window.location.href = getInnerLoginUrl() // 没有token返回登录页面 return;
return }
} }
} vm.changeToken(vm.token);
vm.changeToken(vm.token) vm.getUserAuth();
vm.getUserAuth() },
}, // 修改token
// 修改token ...mapActions(["changeToken"]),
...mapActions([ // 获取用户权限
'changeToken', getUserAuth(token) {
'changeIdType' let req = null;
]), req = {
// 获取用户权限 system_type: "26"
getUserAuth(token) { };
let req = null vm.POST("/contents/login/header", req).then(res => {
req = { if (res.code == "000000") {
system_type: '26' let systemType = 0, authList = res.data.systemInfoList;
} let s = authList.find( item => {
vm.POST('/contents/login/header',req).then((res) => { return item.systemNameAbbreviation == 'PCIM';
if(res.code == '000000') { });
vm.userName = res.data.userName if(s) {
vm.authList = res.data.systemInfoList systemType = s.id;
} }
}) this.systemType = systemType;
} this.showSlidebar = true;
} vm.userName = res.data.userName;
} vm.authList = authList;
}
});
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
// @import './style/common'; // @import './style/common';
@import './style/global'; @import "./style/global";
@import './style/mixin.scss'; @import "./style/mixin.scss";
.router-fade-enter-active, .router-fade-leave-active { .router-fade-enter-active,
transition: opacity .1s; .router-fade-leave-active {
} transition: opacity 0.1s;
.router-fade-enter, .router-fade-leave-active { }
opacity: 0; .router-fade-enter,
} .router-fade-leave-active {
.el-container { opacity: 0;
margin-left: 255px; }
overflow: hidden; .el-container {
.content { margin-left: 255px;
background: #F0F2F5; overflow: hidden;
position: absolute; .content {
left: 255px; background: #f0f2f5;
right: 0; position: absolute;
top: 64px; left: 255px;
bottom: 0; right: 0;
width: auto; top: 64px;
box-sizing: border-box; bottom: 0;
overflow-y: scroll; width: auto;
} box-sizing: border-box;
} overflow-y: scroll;
}
}
</style> </style>
<template>
<div class="img-container">
<img :src="imgData.url" />
</div>
</template>
<script>
export default {
name: 'imgSize',
props: {
imgData: {
type: Object,
default: {}
}
},
data() {
return {
imgWidth: 0,
imgHeight: 0,
imgProportion: 0
}
},
mounted() {
this.imgWidth = this.imgData.width;
this.imgHeight = this.imgData.height;
this.imgProportion = (this.imgWidth / this.imgHeight).toFixed(1);
console.log("==========dddddddddd",this.imgProportion)
if(this.imgProportion > 0.6) {
}
},
methods: {
}
}
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<section class="user-info-wrapper">
<div class="user-avt">
<img :src="userInfo.avatarImageUrl" alt />
</div>
<p class="user-name">{{userInfo.name}}</p>
<p class="user-mb">{{userInfo.mobilePhone}}</p>
<p>
<el-button
class="footer"
style="width: 100px;"
type="primary"
size="small"
@click="clipboardAction"
>复制手机号</el-button>
</p>
<section class="other-info-wrapper">
<article class="other-info">
<div class="icon">
<img src="../../assets/image/IM/icon-contacts.png" alt />
</div>
<span class="desc">{{userInfo.userTypeValue}}</span>
</article>
<article class="other-info">
<div class="icon">
<img src="../../assets/image/IM/icon-id-card.png" alt />
</div>
<div class="icon-s">
<img v-if="userInfo.certifyStatus" src="../../assets/image/IM/check-yes.png" alt />
<img v-else src="../../assets/image/IM/check-no.png" alt />
</div>
<span class="desc mr12">实名认证</span>
<div class="icon-s">
<img v-if="userInfo.status" src="../../assets/image/IM/check-yes.png" alt />
<img v-else src="../../assets/image/IM/check-no.png" alt />
</div>
<span class="desc">执业认证</span>
</article>
<article class="other-info">
<div class="icon">
<img src="../../assets/image/IM/icon-org.png" alt />
</div>
<span class="desc">{{userInfo.hospitalName ? userInfo.hospitalName : '无机构'}}</span>
</article>
</section>
<section class="qt-wrapper">
<p class="title">问题归类</p>
<el-select
style="width:100%;"
multiple
v-model="stickerIdList"
size="mini"
@remove-tag="removeTag"
placeholder="请选择问题归类"
@visible-change="stickerSave"
>
<el-option
v-for="(item, index) in stickerList"
:key="index"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</section>
</section>
</template>
<script>
let clipboard = null;
export default {
props: {
userInfo: {
type: Object,
default: () => {
return {
name: " ",
mobilePhone: " ",
isShowCopyBtn: true
};
}
},
taskLogId: {
type: String | Number,
default: ''
}
},
data() {
return {
stickerList: [],
stickerIdList: []
};
},
computed: {
},
watch: {
taskLogId(newVal) {
this.getStikerInfo(newVal);
}
},
created() {
this.getStickerList();
},
methods: {
// 查询所有的问题分类
getStickerList() {
this.GET(`/im/sticker/list`).then(res => {
if (res.code === "000000") {
console.log("in getStickerList", res);
this.stickerList = res.data || [];
} else {
this.$message({
message: res.message,
type: "warning"
});
}
});
},
// 根据tasklogid查询问题分类
getStikerInfo(taskLogId) {
this.GET(`/im/sticker/info?taskLogId=${taskLogId}`).then(res => {
if (res.code === "000000") {
let stickerIdList = [], stickerList = res.data || [];
stickerList.forEach( item => {
stickerIdList.push(item.id);
})
this.stickerIdList = stickerIdList;
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 删除时,也要保存
removeTag() {
console.log(this.stickerIdList);
this.stickerSave(false);
},
// 保存用户问题分类
stickerSave(status) {
// 下拉框出现(status==true),直接退出
if(status) return;
let params = {
stickerIdList: this.stickerIdList,
taskLogId: this.taskLogId,
}
this.POST(`/im/sticker/save`, params).then(res => {
if (res.code === "000000") {
console.log("in getStickerSave", res);
} else {
this.$message({
message: res.message,
type: "warning"
});
}
});
},
// 粘帖文本
clipboardAction() {
const _this = this;
clipboard && clipboard.destroy(); // 不是单例的,所以每次都要销毁
clipboard = new this.ClipboardJS(".footer", {
// .footer:文档的CSS类名
text: function(trigger) {
console.log(_this.userInfo.mobilePhoneCopy);
_this.$message.success('复制成功');
return _this.userInfo.mobilePhoneCopy; // 要粘贴的文案
}
});
}
}
};
</script>
<style lang="scss" scoped>
.user-info-wrapper {
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
text-align: center;
.user-avt {
margin: 24px 0 10px;
& > img {
display: inline-block;
width: 64px;
height: 64px;
border-radius: 32px;
}
}
.user-name {
height: 28px;
line-height: 1;
font-size: 20px;
font-weight: 700;
}
.user-mb {
height: 20px;
line-height: 1;
margin: 4px 0;
font-size: 14px;
color: #666666;
}
.other-info-wrapper {
margin: 20px 24px 50px;
.other-info {
display: flex;
flex-direction: row;
margin: 12px 0;
align-items: center;
.icon {
width: 16px;
height: 16px;
margin-right: 8px;
& > img {
width: 16px;
height: 16px;
}
}
.icon-s {
width: 12px;
height: 12px;
margin-right: 4px;
& > img {
width: 12px;
height: 12px;
}
}
.desc {
height: 14px;
line-height: 1;
color: #000000;
opacity: 0.65;
&.mr12 {
margin-right: 12px;
}
}
}
}
.qt-wrapper {
margin: 0 25px;
.title {
text-align: left;
font-weight: 700;
margin-bottom: 10px;
color: #333333;
}
}
}
</style>
<template> <template>
<div class="bread-crumb"> <div class="bread-crumb">
<el-breadcrumb separator="/"> <el-breadcrumb separator="/">
<el-breadcrumb-item>{{curmbFirst}}</el-breadcrumb-item> <el-breadcrumb-item :to="{ path: jumPathThird }">{{curmbFirst}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbSecond" :to="{ path: jumPathThird }">{{curmbSecond}}</el-breadcrumb-item> <el-breadcrumb-item v-if="curmbSecond">{{curmbSecond}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbThird">{{curmbThird}}</el-breadcrumb-item> <el-breadcrumb-item v-if="curmbThird">{{curmbThird}}</el-breadcrumb-item>
</el-breadcrumb> </el-breadcrumb>
</div> </div>
...@@ -25,7 +25,7 @@ export default { ...@@ -25,7 +25,7 @@ export default {
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.bread-crumb { .bread-crumb {
position: fixed; position: fixed;
left: 255px; left: 255px;
......
...@@ -4,16 +4,23 @@ import VueRouter from 'vue-router' ...@@ -4,16 +4,23 @@ import VueRouter from 'vue-router'
import routes from './router/router' import routes from './router/router'
import store from './store/' import store from './store/'
const mixins = require('@/utils/mixins'); const mixins = require('@/utils/mixins');
import FastClick from 'fastclick'
import vueFilters from '@/utils/filter' import vueFilters from '@/utils/filter'
// 引入ElementUI // 引入ElementUI
import ElementUI from 'element-ui' import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'; import 'element-ui/lib/theme-chalk/index.css';
import vViewer from 'v-viewer';
import 'viewerjs/dist/viewer.css';
import ClipboardJS from 'clipboard';
import '@/utils/directive';
Vue.prototype.ClipboardJS = ClipboardJS;
Vue.use(vViewer, {
button: false
});
// 可调试 // 可调试
// Vue.config.devtools = true; // Vue.config.devtools = true;
// Vue.use(Logger, { prefix: new Date(), isDev: process.env.NODE_ENV === 'development', cLevel: 'debug' })
Vue.use(ElementUI) Vue.use(ElementUI)
...@@ -22,11 +29,6 @@ for(let key in vueFilters) { ...@@ -22,11 +29,6 @@ for(let key in vueFilters) {
Vue.filter(key, vueFilters[key]) Vue.filter(key, vueFilters[key])
} }
if ('addEventListener' in document) {
document.addEventListener('DOMContentLoaded', function() {
FastClick.attach(document.body);
}, false);
}
Vue.use(VueRouter) Vue.use(VueRouter)
const router = new VueRouter({ const router = new VueRouter({
......
/**
* G-Logger
* version 1.0.0
* Author: Anndy Yang(Guang Jun)
* description: 模拟log4j的日志插件(Vue插件,同时支持浏览器环境)
*
* log4j提供了4种日志级别和2个日志开关。
官方网址: http://logging.apache.org/log4j/1.2/
DEBUG:输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。
INFO: 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。
WARN: 输出警告信息;表明会出现潜在错误的情形。
ERROR:输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。
FATAL: 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。
ALL level:打开所有日志记录开关;是最低等级的,用于打开所有日志记录。
OFF level:关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录。
按照范围从小到大排序:OFF level > FATAL > ERROR > WARN > INFO > DEBUG > ALL level;范围大的会包含范围小的。
例如日志设置为INFO级别,则FATAL、ERROR、WARN、INFO的日志开关都是打开的,而DEBUG的日志开关将是关闭的。
Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。
*/
const gLogger = {}
gLogger.install = function (Vue, options) {
if (gLogger.installed) return
let logger = {
isDev: true,
cLevel: 'debug',
prefix: 'gLogger Says'
// levels: ['off', 'fatal', 'error', 'warn', 'info', 'debug', 'all']
}
if (options) {
for (const key of Object.keys(options)) {
logger[key] = options[key]
}
}
logger.levels = ['off', 'fatal', 'error', 'warn', 'info', 'debug', 'all']
for (const level of logger.levels) {
logger[level] = function () {
if (!this.isDev || typeof console === 'undefined') return
let levelIndex = logger.levels.indexOf(level)
// 如果是OFF级别,则不输出日志
if (levelIndex === 0) return
let cLevelIndex = logger.levels.indexOf(logger.cLevel)
// 如果当前级别底,则不输出日志
if(cLevelIndex < levelIndex) return
let args = Array.from(arguments)
args.unshift(`[${this.prefix} :: ${level}]`.toUpperCase())
console.log(...args)
}
}
Vue.prototype.$log = logger
if (window) window.logger = logger
}
export default gLogger
\ No newline at end of file
/**
* Swiper 3.4.1
* Most modern mobile touch slider and framework with hardware accelerated transitions
*
* http://www.idangero.us/swiper/
*
* Copyright 2016, Vladimir Kharlampidi
* The iDangero.us
* http://www.idangero.us/
*
* Licensed under MIT
*
* Released on: December 13, 2016
*/
!function(){"use strict";function e(e){e.fn.swiper=function(a){var s;return e(this).each(function(){var e=new t(this,a);s||(s=e)}),s}}var a,t=function(e,i){function r(e){return Math.floor(e)}function n(){var e=b.params.autoplay,a=b.slides.eq(b.activeIndex);a.attr("data-swiper-autoplay")&&(e=a.attr("data-swiper-autoplay")||b.params.autoplay),b.autoplayTimeoutId=setTimeout(function(){b.params.loop?(b.fixLoop(),b._slideNext(),b.emit("onAutoplay",b)):b.isEnd?i.autoplayStopOnLast?b.stopAutoplay():(b._slideTo(0),b.emit("onAutoplay",b)):(b._slideNext(),b.emit("onAutoplay",b))},e)}function o(e,t){var s=a(e.target);if(!s.is(t))if("string"==typeof t)s=s.parents(t);else if(t.nodeType){var i;return s.parents().each(function(e,a){a===t&&(i=t)}),i?t:void 0}if(0!==s.length)return s[0]}function l(e,a){a=a||{};var t=window.MutationObserver||window.WebkitMutationObserver,s=new t(function(e){e.forEach(function(e){b.onResize(!0),b.emit("onObserverUpdate",b,e)})});s.observe(e,{attributes:"undefined"==typeof a.attributes||a.attributes,childList:"undefined"==typeof a.childList||a.childList,characterData:"undefined"==typeof a.characterData||a.characterData}),b.observers.push(s)}function p(e){e.originalEvent&&(e=e.originalEvent);var a=e.keyCode||e.charCode;if(!b.params.allowSwipeToNext&&(b.isHorizontal()&&39===a||!b.isHorizontal()&&40===a))return!1;if(!b.params.allowSwipeToPrev&&(b.isHorizontal()&&37===a||!b.isHorizontal()&&38===a))return!1;if(!(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey||document.activeElement&&document.activeElement.nodeName&&("input"===document.activeElement.nodeName.toLowerCase()||"textarea"===document.activeElement.nodeName.toLowerCase()))){if(37===a||39===a||38===a||40===a){var t=!1;if(b.container.parents("."+b.params.slideClass).length>0&&0===b.container.parents("."+b.params.slideActiveClass).length)return;var s={left:window.pageXOffset,top:window.pageYOffset},i=window.innerWidth,r=window.innerHeight,n=b.container.offset();b.rtl&&(n.left=n.left-b.container[0].scrollLeft);for(var o=[[n.left,n.top],[n.left+b.width,n.top],[n.left,n.top+b.height],[n.left+b.width,n.top+b.height]],l=0;l<o.length;l++){var p=o[l];p[0]>=s.left&&p[0]<=s.left+i&&p[1]>=s.top&&p[1]<=s.top+r&&(t=!0)}if(!t)return}b.isHorizontal()?(37!==a&&39!==a||(e.preventDefault?e.preventDefault():e.returnValue=!1),(39===a&&!b.rtl||37===a&&b.rtl)&&b.slideNext(),(37===a&&!b.rtl||39===a&&b.rtl)&&b.slidePrev()):(38!==a&&40!==a||(e.preventDefault?e.preventDefault():e.returnValue=!1),40===a&&b.slideNext(),38===a&&b.slidePrev())}}function d(){var e="onwheel",a=e in document;if(!a){var t=document.createElement("div");t.setAttribute(e,"return;"),a="function"==typeof t[e]}return!a&&document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0&&(a=document.implementation.hasFeature("Events.wheel","3.0")),a}function u(e){e.originalEvent&&(e=e.originalEvent);var a=0,t=b.rtl?-1:1,s=c(e);if(b.params.mousewheelForceToAxis)if(b.isHorizontal()){if(!(Math.abs(s.pixelX)>Math.abs(s.pixelY)))return;a=s.pixelX*t}else{if(!(Math.abs(s.pixelY)>Math.abs(s.pixelX)))return;a=s.pixelY}else a=Math.abs(s.pixelX)>Math.abs(s.pixelY)?-s.pixelX*t:-s.pixelY;if(0!==a){if(b.params.mousewheelInvert&&(a=-a),b.params.freeMode){var i=b.getWrapperTranslate()+a*b.params.mousewheelSensitivity,r=b.isBeginning,n=b.isEnd;if(i>=b.minTranslate()&&(i=b.minTranslate()),i<=b.maxTranslate()&&(i=b.maxTranslate()),b.setWrapperTransition(0),b.setWrapperTranslate(i),b.updateProgress(),b.updateActiveIndex(),(!r&&b.isBeginning||!n&&b.isEnd)&&b.updateClasses(),b.params.freeModeSticky?(clearTimeout(b.mousewheel.timeout),b.mousewheel.timeout=setTimeout(function(){b.slideReset()},300)):b.params.lazyLoading&&b.lazy&&b.lazy.load(),b.emit("onScroll",b,e),b.params.autoplay&&b.params.autoplayDisableOnInteraction&&b.stopAutoplay(),0===i||i===b.maxTranslate())return}else{if((new window.Date).getTime()-b.mousewheel.lastScrollTime>60)if(a<0)if(b.isEnd&&!b.params.loop||b.animating){if(b.params.mousewheelReleaseOnEdges)return!0}else b.slideNext(),b.emit("onScroll",b,e);else if(b.isBeginning&&!b.params.loop||b.animating){if(b.params.mousewheelReleaseOnEdges)return!0}else b.slidePrev(),b.emit("onScroll",b,e);b.mousewheel.lastScrollTime=(new window.Date).getTime()}return e.preventDefault?e.preventDefault():e.returnValue=!1,!1}}function c(e){var a=10,t=40,s=800,i=0,r=0,n=0,o=0;return"detail"in e&&(r=e.detail),"wheelDelta"in e&&(r=-e.wheelDelta/120),"wheelDeltaY"in e&&(r=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(i=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(i=r,r=0),n=i*a,o=r*a,"deltaY"in e&&(o=e.deltaY),"deltaX"in e&&(n=e.deltaX),(n||o)&&e.deltaMode&&(1===e.deltaMode?(n*=t,o*=t):(n*=s,o*=s)),n&&!i&&(i=n<1?-1:1),o&&!r&&(r=o<1?-1:1),{spinX:i,spinY:r,pixelX:n,pixelY:o}}function m(e,t){e=a(e);var s,i,r,n=b.rtl?-1:1;s=e.attr("data-swiper-parallax")||"0",i=e.attr("data-swiper-parallax-x"),r=e.attr("data-swiper-parallax-y"),i||r?(i=i||"0",r=r||"0"):b.isHorizontal()?(i=s,r="0"):(r=s,i="0"),i=i.indexOf("%")>=0?parseInt(i,10)*t*n+"%":i*t*n+"px",r=r.indexOf("%")>=0?parseInt(r,10)*t+"%":r*t+"px",e.transform("translate3d("+i+", "+r+",0px)")}function h(e){return 0!==e.indexOf("on")&&(e=e[0]!==e[0].toUpperCase()?"on"+e[0].toUpperCase()+e.substring(1):"on"+e),e}if(!(this instanceof t))return new t(e,i);var g={direction:"horizontal",touchEventsTarget:"container",initialSlide:0,speed:300,autoplay:!1,autoplayDisableOnInteraction:!0,autoplayStopOnLast:!1,iOSEdgeSwipeDetection:!1,iOSEdgeSwipeThreshold:20,freeMode:!1,freeModeMomentum:!0,freeModeMomentumRatio:1,freeModeMomentumBounce:!0,freeModeMomentumBounceRatio:1,freeModeMomentumVelocityRatio:1,freeModeSticky:!1,freeModeMinimumVelocity:.02,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",coverflow:{rotate:50,stretch:0,depth:100,modifier:1,slideShadows:!0},flip:{slideShadows:!0,limitRotation:!0},cube:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94},fade:{crossFade:!1},parallax:!1,zoom:!1,zoomMax:3,zoomMin:1,zoomToggle:!0,scrollbar:null,scrollbarHide:!0,scrollbarDraggable:!1,scrollbarSnapOnRelease:!1,keyboardControl:!1,mousewheelControl:!1,mousewheelReleaseOnEdges:!1,mousewheelInvert:!1,mousewheelForceToAxis:!1,mousewheelSensitivity:1,mousewheelEventsTarged:"container",hashnav:!1,hashnavWatchState:!1,history:!1,replaceState:!1,breakpoints:void 0,spaceBetween:0,slidesPerView:1,slidesPerColumn:1,slidesPerColumnFill:"column",slidesPerGroup:1,centeredSlides:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,onlyExternal:!1,threshold:0,touchMoveStopPropagation:!0,touchReleaseOnEdges:!1,uniqueNavElements:!0,pagination:null,paginationElement:"span",paginationClickable:!1,paginationHide:!1,paginationBulletRender:null,paginationProgressRender:null,paginationFractionRender:null,paginationCustomRender:null,paginationType:"bullets",resistance:!0,resistanceRatio:.85,nextButton:null,prevButton:null,watchSlidesProgress:!1,watchSlidesVisibility:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,lazyLoading:!1,lazyLoadingInPrevNext:!1,lazyLoadingInPrevNextAmount:1,lazyLoadingOnTransitionStart:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,control:void 0,controlInverse:!1,controlBy:"slide",normalizeSlideIndex:!0,allowSwipeToPrev:!0,allowSwipeToNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",passiveListeners:!0,containerModifierClass:"swiper-container-",slideClass:"swiper-slide",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",bulletClass:"swiper-pagination-bullet",bulletActiveClass:"swiper-pagination-bullet-active",buttonDisabledClass:"swiper-button-disabled",paginationCurrentClass:"swiper-pagination-current",paginationTotalClass:"swiper-pagination-total",paginationHiddenClass:"swiper-pagination-hidden",paginationProgressbarClass:"swiper-pagination-progressbar",paginationClickableClass:"swiper-pagination-clickable",paginationModifierClass:"swiper-pagination-",lazyLoadingClass:"swiper-lazy",lazyStatusLoadingClass:"swiper-lazy-loading",lazyStatusLoadedClass:"swiper-lazy-loaded",lazyPreloaderClass:"swiper-lazy-preloader",notificationClass:"swiper-notification",preloaderClass:"preloader",zoomContainerClass:"swiper-zoom-container",observer:!1,observeParents:!1,a11y:!1,prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}",runCallbacksOnInit:!0},f=i&&i.virtualTranslate;i=i||{};var v={};for(var w in i)if("object"!=typeof i[w]||null===i[w]||(i[w].nodeType||i[w]===window||i[w]===document||"undefined"!=typeof s&&i[w]instanceof s||"undefined"!=typeof jQuery&&i[w]instanceof jQuery))v[w]=i[w];else{v[w]={};for(var y in i[w])v[w][y]=i[w][y]}for(var x in g)if("undefined"==typeof i[x])i[x]=g[x];else if("object"==typeof i[x])for(var T in g[x])"undefined"==typeof i[x][T]&&(i[x][T]=g[x][T]);var b=this;if(b.params=i,b.originalParams=v,b.classNames=[],"undefined"!=typeof a&&"undefined"!=typeof s&&(a=s),("undefined"!=typeof a||(a="undefined"==typeof s?window.Dom7||window.Zepto||window.jQuery:s))&&(b.$=a,b.currentBreakpoint=void 0,b.getActiveBreakpoint=function(){if(!b.params.breakpoints)return!1;var e,a=!1,t=[];for(e in b.params.breakpoints)b.params.breakpoints.hasOwnProperty(e)&&t.push(e);t.sort(function(e,a){return parseInt(e,10)>parseInt(a,10)});for(var s=0;s<t.length;s++)e=t[s],e>=window.innerWidth&&!a&&(a=e);return a||"max"},b.setBreakpoint=function(){var e=b.getActiveBreakpoint();if(e&&b.currentBreakpoint!==e){var a=e in b.params.breakpoints?b.params.breakpoints[e]:b.originalParams,t=b.params.loop&&a.slidesPerView!==b.params.slidesPerView;for(var s in a)b.params[s]=a[s];b.currentBreakpoint=e,t&&b.destroyLoop&&b.reLoop(!0)}},b.params.breakpoints&&b.setBreakpoint(),b.container=a(e),0!==b.container.length)){if(b.container.length>1){var S=[];return b.container.each(function(){S.push(new t(this,i))}),S}b.container[0].swiper=b,b.container.data("swiper",b),b.classNames.push(b.params.containerModifierClass+b.params.direction),b.params.freeMode&&b.classNames.push(b.params.containerModifierClass+"free-mode"),b.support.flexbox||(b.classNames.push(b.params.containerModifierClass+"no-flexbox"),b.params.slidesPerColumn=1),b.params.autoHeight&&b.classNames.push(b.params.containerModifierClass+"autoheight"),(b.params.parallax||b.params.watchSlidesVisibility)&&(b.params.watchSlidesProgress=!0),b.params.touchReleaseOnEdges&&(b.params.resistanceRatio=0),["cube","coverflow","flip"].indexOf(b.params.effect)>=0&&(b.support.transforms3d?(b.params.watchSlidesProgress=!0,b.classNames.push(b.params.containerModifierClass+"3d")):b.params.effect="slide"),"slide"!==b.params.effect&&b.classNames.push(b.params.containerModifierClass+b.params.effect),"cube"===b.params.effect&&(b.params.resistanceRatio=0,b.params.slidesPerView=1,b.params.slidesPerColumn=1,b.params.slidesPerGroup=1,b.params.centeredSlides=!1,b.params.spaceBetween=0,b.params.virtualTranslate=!0,b.params.setWrapperSize=!1),"fade"!==b.params.effect&&"flip"!==b.params.effect||(b.params.slidesPerView=1,b.params.slidesPerColumn=1,b.params.slidesPerGroup=1,b.params.watchSlidesProgress=!0,b.params.spaceBetween=0,b.params.setWrapperSize=!1,"undefined"==typeof f&&(b.params.virtualTranslate=!0)),b.params.grabCursor&&b.support.touch&&(b.params.grabCursor=!1),b.wrapper=b.container.children("."+b.params.wrapperClass),b.params.pagination&&(b.paginationContainer=a(b.params.pagination),b.params.uniqueNavElements&&"string"==typeof b.params.pagination&&b.paginationContainer.length>1&&1===b.container.find(b.params.pagination).length&&(b.paginationContainer=b.container.find(b.params.pagination)),"bullets"===b.params.paginationType&&b.params.paginationClickable?b.paginationContainer.addClass(b.params.paginationModifierClass+"clickable"):b.params.paginationClickable=!1,b.paginationContainer.addClass(b.params.paginationModifierClass+b.params.paginationType)),(b.params.nextButton||b.params.prevButton)&&(b.params.nextButton&&(b.nextButton=a(b.params.nextButton),b.params.uniqueNavElements&&"string"==typeof b.params.nextButton&&b.nextButton.length>1&&1===b.container.find(b.params.nextButton).length&&(b.nextButton=b.container.find(b.params.nextButton))),b.params.prevButton&&(b.prevButton=a(b.params.prevButton),b.params.uniqueNavElements&&"string"==typeof b.params.prevButton&&b.prevButton.length>1&&1===b.container.find(b.params.prevButton).length&&(b.prevButton=b.container.find(b.params.prevButton)))),b.isHorizontal=function(){return"horizontal"===b.params.direction},b.rtl=b.isHorizontal()&&("rtl"===b.container[0].dir.toLowerCase()||"rtl"===b.container.css("direction")),b.rtl&&b.classNames.push(b.params.containerModifierClass+"rtl"),b.rtl&&(b.wrongRTL="-webkit-box"===b.wrapper.css("display")),b.params.slidesPerColumn>1&&b.classNames.push(b.params.containerModifierClass+"multirow"),b.device.android&&b.classNames.push(b.params.containerModifierClass+"android"),b.container.addClass(b.classNames.join(" ")),b.translate=0,b.progress=0,b.velocity=0,b.lockSwipeToNext=function(){b.params.allowSwipeToNext=!1,b.params.allowSwipeToPrev===!1&&b.params.grabCursor&&b.unsetGrabCursor()},b.lockSwipeToPrev=function(){b.params.allowSwipeToPrev=!1,b.params.allowSwipeToNext===!1&&b.params.grabCursor&&b.unsetGrabCursor()},b.lockSwipes=function(){b.params.allowSwipeToNext=b.params.allowSwipeToPrev=!1,b.params.grabCursor&&b.unsetGrabCursor()},b.unlockSwipeToNext=function(){b.params.allowSwipeToNext=!0,b.params.allowSwipeToPrev===!0&&b.params.grabCursor&&b.setGrabCursor()},b.unlockSwipeToPrev=function(){b.params.allowSwipeToPrev=!0,b.params.allowSwipeToNext===!0&&b.params.grabCursor&&b.setGrabCursor()},b.unlockSwipes=function(){b.params.allowSwipeToNext=b.params.allowSwipeToPrev=!0,b.params.grabCursor&&b.setGrabCursor()},b.setGrabCursor=function(e){b.container[0].style.cursor="move",b.container[0].style.cursor=e?"-webkit-grabbing":"-webkit-grab",b.container[0].style.cursor=e?"-moz-grabbin":"-moz-grab",b.container[0].style.cursor=e?"grabbing":"grab"},b.unsetGrabCursor=function(){b.container[0].style.cursor=""},b.params.grabCursor&&b.setGrabCursor(),b.imagesToLoad=[],b.imagesLoaded=0,b.loadImage=function(e,a,t,s,i,r){function n(){r&&r()}var o;e.complete&&i?n():a?(o=new window.Image,o.onload=n,o.onerror=n,s&&(o.sizes=s),t&&(o.srcset=t),a&&(o.src=a)):n()},b.preloadImages=function(){function e(){"undefined"!=typeof b&&null!==b&&b&&(void 0!==b.imagesLoaded&&b.imagesLoaded++,b.imagesLoaded===b.imagesToLoad.length&&(b.params.updateOnImagesReady&&b.update(),b.emit("onImagesReady",b)))}b.imagesToLoad=b.container.find("img");for(var a=0;a<b.imagesToLoad.length;a++)b.loadImage(b.imagesToLoad[a],b.imagesToLoad[a].currentSrc||b.imagesToLoad[a].getAttribute("src"),b.imagesToLoad[a].srcset||b.imagesToLoad[a].getAttribute("srcset"),b.imagesToLoad[a].sizes||b.imagesToLoad[a].getAttribute("sizes"),!0,e)},b.autoplayTimeoutId=void 0,b.autoplaying=!1,b.autoplayPaused=!1,b.startAutoplay=function(){return"undefined"==typeof b.autoplayTimeoutId&&(!!b.params.autoplay&&(!b.autoplaying&&(b.autoplaying=!0,b.emit("onAutoplayStart",b),void n())))},b.stopAutoplay=function(e){b.autoplayTimeoutId&&(b.autoplayTimeoutId&&clearTimeout(b.autoplayTimeoutId),b.autoplaying=!1,b.autoplayTimeoutId=void 0,b.emit("onAutoplayStop",b))},b.pauseAutoplay=function(e){b.autoplayPaused||(b.autoplayTimeoutId&&clearTimeout(b.autoplayTimeoutId),b.autoplayPaused=!0,0===e?(b.autoplayPaused=!1,n()):b.wrapper.transitionEnd(function(){b&&(b.autoplayPaused=!1,b.autoplaying?n():b.stopAutoplay())}))},b.minTranslate=function(){return-b.snapGrid[0]},b.maxTranslate=function(){return-b.snapGrid[b.snapGrid.length-1]},b.updateAutoHeight=function(){var e,a=[],t=0;if("auto"!==b.params.slidesPerView&&b.params.slidesPerView>1)for(e=0;e<Math.ceil(b.params.slidesPerView);e++){var s=b.activeIndex+e;if(s>b.slides.length)break;a.push(b.slides.eq(s)[0])}else a.push(b.slides.eq(b.activeIndex)[0]);for(e=0;e<a.length;e++)if("undefined"!=typeof a[e]){var i=a[e].offsetHeight;t=i>t?i:t}t&&b.wrapper.css("height",t+"px")},b.updateContainerSize=function(){var e,a;e="undefined"!=typeof b.params.width?b.params.width:b.container[0].clientWidth,a="undefined"!=typeof b.params.height?b.params.height:b.container[0].clientHeight,0===e&&b.isHorizontal()||0===a&&!b.isHorizontal()||(e=e-parseInt(b.container.css("padding-left"),10)-parseInt(b.container.css("padding-right"),10),a=a-parseInt(b.container.css("padding-top"),10)-parseInt(b.container.css("padding-bottom"),10),b.width=e,b.height=a,b.size=b.isHorizontal()?b.width:b.height)},b.updateSlidesSize=function(){b.slides=b.wrapper.children("."+b.params.slideClass),b.snapGrid=[],b.slidesGrid=[],b.slidesSizesGrid=[];var e,a=b.params.spaceBetween,t=-b.params.slidesOffsetBefore,s=0,i=0;if("undefined"!=typeof b.size){"string"==typeof a&&a.indexOf("%")>=0&&(a=parseFloat(a.replace("%",""))/100*b.size),b.virtualSize=-a,b.rtl?b.slides.css({marginLeft:"",marginTop:""}):b.slides.css({marginRight:"",marginBottom:""});var n;b.params.slidesPerColumn>1&&(n=Math.floor(b.slides.length/b.params.slidesPerColumn)===b.slides.length/b.params.slidesPerColumn?b.slides.length:Math.ceil(b.slides.length/b.params.slidesPerColumn)*b.params.slidesPerColumn,"auto"!==b.params.slidesPerView&&"row"===b.params.slidesPerColumnFill&&(n=Math.max(n,b.params.slidesPerView*b.params.slidesPerColumn)));var o,l=b.params.slidesPerColumn,p=n/l,d=p-(b.params.slidesPerColumn*p-b.slides.length);for(e=0;e<b.slides.length;e++){o=0;var u=b.slides.eq(e);if(b.params.slidesPerColumn>1){var c,m,h;"column"===b.params.slidesPerColumnFill?(m=Math.floor(e/l),h=e-m*l,(m>d||m===d&&h===l-1)&&++h>=l&&(h=0,m++),c=m+h*n/l,u.css({"-webkit-box-ordinal-group":c,"-moz-box-ordinal-group":c,"-ms-flex-order":c,"-webkit-order":c,order:c})):(h=Math.floor(e/p),m=e-h*p),u.css("margin-"+(b.isHorizontal()?"top":"left"),0!==h&&b.params.spaceBetween&&b.params.spaceBetween+"px").attr("data-swiper-column",m).attr("data-swiper-row",h)}"none"!==u.css("display")&&("auto"===b.params.slidesPerView?(o=b.isHorizontal()?u.outerWidth(!0):u.outerHeight(!0),b.params.roundLengths&&(o=r(o))):(o=(b.size-(b.params.slidesPerView-1)*a)/b.params.slidesPerView,b.params.roundLengths&&(o=r(o)),b.isHorizontal()?b.slides[e].style.width=o+"px":b.slides[e].style.height=o+"px"),b.slides[e].swiperSlideSize=o,b.slidesSizesGrid.push(o),b.params.centeredSlides?(t=t+o/2+s/2+a,0===e&&(t=t-b.size/2-a),Math.abs(t)<.001&&(t=0),i%b.params.slidesPerGroup===0&&b.snapGrid.push(t),b.slidesGrid.push(t)):(i%b.params.slidesPerGroup===0&&b.snapGrid.push(t),b.slidesGrid.push(t),t=t+o+a),b.virtualSize+=o+a,s=o,i++)}b.virtualSize=Math.max(b.virtualSize,b.size)+b.params.slidesOffsetAfter;var g;if(b.rtl&&b.wrongRTL&&("slide"===b.params.effect||"coverflow"===b.params.effect)&&b.wrapper.css({width:b.virtualSize+b.params.spaceBetween+"px"}),b.support.flexbox&&!b.params.setWrapperSize||(b.isHorizontal()?b.wrapper.css({width:b.virtualSize+b.params.spaceBetween+"px"}):b.wrapper.css({height:b.virtualSize+b.params.spaceBetween+"px"})),b.params.slidesPerColumn>1&&(b.virtualSize=(o+b.params.spaceBetween)*n,b.virtualSize=Math.ceil(b.virtualSize/b.params.slidesPerColumn)-b.params.spaceBetween,b.isHorizontal()?b.wrapper.css({width:b.virtualSize+b.params.spaceBetween+"px"}):b.wrapper.css({height:b.virtualSize+b.params.spaceBetween+"px"}),b.params.centeredSlides)){for(g=[],e=0;e<b.snapGrid.length;e++)b.snapGrid[e]<b.virtualSize+b.snapGrid[0]&&g.push(b.snapGrid[e]);b.snapGrid=g}if(!b.params.centeredSlides){for(g=[],e=0;e<b.snapGrid.length;e++)b.snapGrid[e]<=b.virtualSize-b.size&&g.push(b.snapGrid[e]);b.snapGrid=g,Math.floor(b.virtualSize-b.size)-Math.floor(b.snapGrid[b.snapGrid.length-1])>1&&b.snapGrid.push(b.virtualSize-b.size)}0===b.snapGrid.length&&(b.snapGrid=[0]),0!==b.params.spaceBetween&&(b.isHorizontal()?b.rtl?b.slides.css({marginLeft:a+"px"}):b.slides.css({marginRight:a+"px"}):b.slides.css({marginBottom:a+"px"})),b.params.watchSlidesProgress&&b.updateSlidesOffset()}},b.updateSlidesOffset=function(){for(var e=0;e<b.slides.length;e++)b.slides[e].swiperSlideOffset=b.isHorizontal()?b.slides[e].offsetLeft:b.slides[e].offsetTop},b.currentSlidesPerView=function(){var e,a,t=1;if(b.params.centeredSlides){var s,i=b.slides[b.activeIndex].swiperSlideSize;for(e=b.activeIndex+1;e<b.slides.length;e++)b.slides[e]&&!s&&(i+=b.slides[e].swiperSlideSize,t++,i>b.size&&(s=!0));for(a=b.activeIndex-1;a>=0;a--)b.slides[a]&&!s&&(i+=b.slides[a].swiperSlideSize,t++,i>b.size&&(s=!0))}else for(e=b.activeIndex+1;e<b.slides.length;e++)b.slidesGrid[e]-b.slidesGrid[b.activeIndex]<b.size&&t++;return t},b.updateSlidesProgress=function(e){if("undefined"==typeof e&&(e=b.translate||0),0!==b.slides.length){"undefined"==typeof b.slides[0].swiperSlideOffset&&b.updateSlidesOffset();var a=-e;b.rtl&&(a=e),b.slides.removeClass(b.params.slideVisibleClass);for(var t=0;t<b.slides.length;t++){var s=b.slides[t],i=(a+(b.params.centeredSlides?b.minTranslate():0)-s.swiperSlideOffset)/(s.swiperSlideSize+b.params.spaceBetween);if(b.params.watchSlidesVisibility){var r=-(a-s.swiperSlideOffset),n=r+b.slidesSizesGrid[t],o=r>=0&&r<b.size||n>0&&n<=b.size||r<=0&&n>=b.size;o&&b.slides.eq(t).addClass(b.params.slideVisibleClass)}s.progress=b.rtl?-i:i}}},b.updateProgress=function(e){"undefined"==typeof e&&(e=b.translate||0);var a=b.maxTranslate()-b.minTranslate(),t=b.isBeginning,s=b.isEnd;0===a?(b.progress=0,b.isBeginning=b.isEnd=!0):(b.progress=(e-b.minTranslate())/a,b.isBeginning=b.progress<=0,b.isEnd=b.progress>=1),b.isBeginning&&!t&&b.emit("onReachBeginning",b),b.isEnd&&!s&&b.emit("onReachEnd",b),b.params.watchSlidesProgress&&b.updateSlidesProgress(e),b.emit("onProgress",b,b.progress)},b.updateActiveIndex=function(){var e,a,t,s=b.rtl?b.translate:-b.translate;for(a=0;a<b.slidesGrid.length;a++)"undefined"!=typeof b.slidesGrid[a+1]?s>=b.slidesGrid[a]&&s<b.slidesGrid[a+1]-(b.slidesGrid[a+1]-b.slidesGrid[a])/2?e=a:s>=b.slidesGrid[a]&&s<b.slidesGrid[a+1]&&(e=a+1):s>=b.slidesGrid[a]&&(e=a);b.params.normalizeSlideIndex&&(e<0||"undefined"==typeof e)&&(e=0),t=Math.floor(e/b.params.slidesPerGroup),t>=b.snapGrid.length&&(t=b.snapGrid.length-1),e!==b.activeIndex&&(b.snapIndex=t,b.previousIndex=b.activeIndex,b.activeIndex=e,b.updateClasses(),b.updateRealIndex())},b.updateRealIndex=function(){b.realIndex=parseInt(b.slides.eq(b.activeIndex).attr("data-swiper-slide-index")||b.activeIndex,10)},b.updateClasses=function(){b.slides.removeClass(b.params.slideActiveClass+" "+b.params.slideNextClass+" "+b.params.slidePrevClass+" "+b.params.slideDuplicateActiveClass+" "+b.params.slideDuplicateNextClass+" "+b.params.slideDuplicatePrevClass);var e=b.slides.eq(b.activeIndex);e.addClass(b.params.slideActiveClass),i.loop&&(e.hasClass(b.params.slideDuplicateClass)?b.wrapper.children("."+b.params.slideClass+":not(."+b.params.slideDuplicateClass+')[data-swiper-slide-index="'+b.realIndex+'"]').addClass(b.params.slideDuplicateActiveClass):b.wrapper.children("."+b.params.slideClass+"."+b.params.slideDuplicateClass+'[data-swiper-slide-index="'+b.realIndex+'"]').addClass(b.params.slideDuplicateActiveClass));var t=e.next("."+b.params.slideClass).addClass(b.params.slideNextClass);b.params.loop&&0===t.length&&(t=b.slides.eq(0),t.addClass(b.params.slideNextClass));var s=e.prev("."+b.params.slideClass).addClass(b.params.slidePrevClass);if(b.params.loop&&0===s.length&&(s=b.slides.eq(-1),s.addClass(b.params.slidePrevClass)),i.loop&&(t.hasClass(b.params.slideDuplicateClass)?b.wrapper.children("."+b.params.slideClass+":not(."+b.params.slideDuplicateClass+')[data-swiper-slide-index="'+t.attr("data-swiper-slide-index")+'"]').addClass(b.params.slideDuplicateNextClass):b.wrapper.children("."+b.params.slideClass+"."+b.params.slideDuplicateClass+'[data-swiper-slide-index="'+t.attr("data-swiper-slide-index")+'"]').addClass(b.params.slideDuplicateNextClass),s.hasClass(b.params.slideDuplicateClass)?b.wrapper.children("."+b.params.slideClass+":not(."+b.params.slideDuplicateClass+')[data-swiper-slide-index="'+s.attr("data-swiper-slide-index")+'"]').addClass(b.params.slideDuplicatePrevClass):b.wrapper.children("."+b.params.slideClass+"."+b.params.slideDuplicateClass+'[data-swiper-slide-index="'+s.attr("data-swiper-slide-index")+'"]').addClass(b.params.slideDuplicatePrevClass)),b.paginationContainer&&b.paginationContainer.length>0){var r,n=b.params.loop?Math.ceil((b.slides.length-2*b.loopedSlides)/b.params.slidesPerGroup):b.snapGrid.length;if(b.params.loop?(r=Math.ceil((b.activeIndex-b.loopedSlides)/b.params.slidesPerGroup),r>b.slides.length-1-2*b.loopedSlides&&(r-=b.slides.length-2*b.loopedSlides),r>n-1&&(r-=n),r<0&&"bullets"!==b.params.paginationType&&(r=n+r)):r="undefined"!=typeof b.snapIndex?b.snapIndex:b.activeIndex||0,"bullets"===b.params.paginationType&&b.bullets&&b.bullets.length>0&&(b.bullets.removeClass(b.params.bulletActiveClass),b.paginationContainer.length>1?b.bullets.each(function(){a(this).index()===r&&a(this).addClass(b.params.bulletActiveClass)}):b.bullets.eq(r).addClass(b.params.bulletActiveClass)),"fraction"===b.params.paginationType&&(b.paginationContainer.find("."+b.params.paginationCurrentClass).text(r+1),b.paginationContainer.find("."+b.params.paginationTotalClass).text(n)),"progress"===b.params.paginationType){var o=(r+1)/n,l=o,p=1;b.isHorizontal()||(p=o,l=1),b.paginationContainer.find("."+b.params.paginationProgressbarClass).transform("translate3d(0,0,0) scaleX("+l+") scaleY("+p+")").transition(b.params.speed)}"custom"===b.params.paginationType&&b.params.paginationCustomRender&&(b.paginationContainer.html(b.params.paginationCustomRender(b,r+1,n)),b.emit("onPaginationRendered",b,b.paginationContainer[0]))}b.params.loop||(b.params.prevButton&&b.prevButton&&b.prevButton.length>0&&(b.isBeginning?(b.prevButton.addClass(b.params.buttonDisabledClass),b.params.a11y&&b.a11y&&b.a11y.disable(b.prevButton)):(b.prevButton.removeClass(b.params.buttonDisabledClass),b.params.a11y&&b.a11y&&b.a11y.enable(b.prevButton))),b.params.nextButton&&b.nextButton&&b.nextButton.length>0&&(b.isEnd?(b.nextButton.addClass(b.params.buttonDisabledClass),b.params.a11y&&b.a11y&&b.a11y.disable(b.nextButton)):(b.nextButton.removeClass(b.params.buttonDisabledClass),b.params.a11y&&b.a11y&&b.a11y.enable(b.nextButton))))},b.updatePagination=function(){if(b.params.pagination&&b.paginationContainer&&b.paginationContainer.length>0){var e="";if("bullets"===b.params.paginationType){for(var a=b.params.loop?Math.ceil((b.slides.length-2*b.loopedSlides)/b.params.slidesPerGroup):b.snapGrid.length,t=0;t<a;t++)e+=b.params.paginationBulletRender?b.params.paginationBulletRender(b,t,b.params.bulletClass):"<"+b.params.paginationElement+' class="'+b.params.bulletClass+'"></'+b.params.paginationElement+">";b.paginationContainer.html(e),b.bullets=b.paginationContainer.find("."+b.params.bulletClass),b.params.paginationClickable&&b.params.a11y&&b.a11y&&b.a11y.initPagination()}"fraction"===b.params.paginationType&&(e=b.params.paginationFractionRender?b.params.paginationFractionRender(b,b.params.paginationCurrentClass,b.params.paginationTotalClass):'<span class="'+b.params.paginationCurrentClass+'"></span> / <span class="'+b.params.paginationTotalClass+'"></span>',b.paginationContainer.html(e)),"progress"===b.params.paginationType&&(e=b.params.paginationProgressRender?b.params.paginationProgressRender(b,b.params.paginationProgressbarClass):'<span class="'+b.params.paginationProgressbarClass+'"></span>',b.paginationContainer.html(e)),"custom"!==b.params.paginationType&&b.emit("onPaginationRendered",b,b.paginationContainer[0])}},b.update=function(e){function a(){b.rtl?-b.translate:b.translate;s=Math.min(Math.max(b.translate,b.maxTranslate()),b.minTranslate()),b.setWrapperTranslate(s),b.updateActiveIndex(),b.updateClasses()}if(b)if(b.updateContainerSize(),b.updateSlidesSize(),b.updateProgress(),b.updatePagination(),b.updateClasses(),b.params.scrollbar&&b.scrollbar&&b.scrollbar.set(),e){var t,s;b.controller&&b.controller.spline&&(b.controller.spline=void 0),b.params.freeMode?(a(),b.params.autoHeight&&b.updateAutoHeight()):(t=("auto"===b.params.slidesPerView||b.params.slidesPerView>1)&&b.isEnd&&!b.params.centeredSlides?b.slideTo(b.slides.length-1,0,!1,!0):b.slideTo(b.activeIndex,0,!1,!0),t||a())}else b.params.autoHeight&&b.updateAutoHeight()},b.onResize=function(e){b.params.breakpoints&&b.setBreakpoint();var a=b.params.allowSwipeToPrev,t=b.params.allowSwipeToNext;b.params.allowSwipeToPrev=b.params.allowSwipeToNext=!0,b.updateContainerSize(),b.updateSlidesSize(),("auto"===b.params.slidesPerView||b.params.freeMode||e)&&b.updatePagination(),b.params.scrollbar&&b.scrollbar&&b.scrollbar.set(),b.controller&&b.controller.spline&&(b.controller.spline=void 0);var s=!1;if(b.params.freeMode){var i=Math.min(Math.max(b.translate,b.maxTranslate()),b.minTranslate());b.setWrapperTranslate(i),b.updateActiveIndex(),b.updateClasses(),b.params.autoHeight&&b.updateAutoHeight()}else b.updateClasses(),s=("auto"===b.params.slidesPerView||b.params.slidesPerView>1)&&b.isEnd&&!b.params.centeredSlides?b.slideTo(b.slides.length-1,0,!1,!0):b.slideTo(b.activeIndex,0,!1,!0);b.params.lazyLoading&&!s&&b.lazy&&b.lazy.load(),b.params.allowSwipeToPrev=a,b.params.allowSwipeToNext=t},b.touchEventsDesktop={start:"mousedown",move:"mousemove",end:"mouseup"},window.navigator.pointerEnabled?b.touchEventsDesktop={start:"pointerdown",move:"pointermove",end:"pointerup"}:window.navigator.msPointerEnabled&&(b.touchEventsDesktop={start:"MSPointerDown",move:"MSPointerMove",end:"MSPointerUp"}),b.touchEvents={start:b.support.touch||!b.params.simulateTouch?"touchstart":b.touchEventsDesktop.start,move:b.support.touch||!b.params.simulateTouch?"touchmove":b.touchEventsDesktop.move,end:b.support.touch||!b.params.simulateTouch?"touchend":b.touchEventsDesktop.end},(window.navigator.pointerEnabled||window.navigator.msPointerEnabled)&&("container"===b.params.touchEventsTarget?b.container:b.wrapper).addClass("swiper-wp8-"+b.params.direction),b.initEvents=function(e){var a=e?"off":"on",t=e?"removeEventListener":"addEventListener",s="container"===b.params.touchEventsTarget?b.container[0]:b.wrapper[0],r=b.support.touch?s:document,n=!!b.params.nested;if(b.browser.ie)s[t](b.touchEvents.start,b.onTouchStart,!1),r[t](b.touchEvents.move,b.onTouchMove,n),r[t](b.touchEvents.end,b.onTouchEnd,!1);else{if(b.support.touch){var o=!("touchstart"!==b.touchEvents.start||!b.support.passiveListener||!b.params.passiveListeners)&&{passive:!0,capture:!1};s[t](b.touchEvents.start,b.onTouchStart,o),s[t](b.touchEvents.move,b.onTouchMove,n),s[t](b.touchEvents.end,b.onTouchEnd,o)}(i.simulateTouch&&!b.device.ios&&!b.device.android||i.simulateTouch&&!b.support.touch&&b.device.ios)&&(s[t]("mousedown",b.onTouchStart,!1),document[t]("mousemove",b.onTouchMove,n),document[t]("mouseup",b.onTouchEnd,!1))}window[t]("resize",b.onResize),b.params.nextButton&&b.nextButton&&b.nextButton.length>0&&(b.nextButton[a]("click",b.onClickNext),b.params.a11y&&b.a11y&&b.nextButton[a]("keydown",b.a11y.onEnterKey)),b.params.prevButton&&b.prevButton&&b.prevButton.length>0&&(b.prevButton[a]("click",b.onClickPrev),b.params.a11y&&b.a11y&&b.prevButton[a]("keydown",b.a11y.onEnterKey)),b.params.pagination&&b.params.paginationClickable&&(b.paginationContainer[a]("click","."+b.params.bulletClass,b.onClickIndex),b.params.a11y&&b.a11y&&b.paginationContainer[a]("keydown","."+b.params.bulletClass,b.a11y.onEnterKey)),(b.params.preventClicks||b.params.preventClicksPropagation)&&s[t]("click",b.preventClicks,!0);
},b.attachEvents=function(){b.initEvents()},b.detachEvents=function(){b.initEvents(!0)},b.allowClick=!0,b.preventClicks=function(e){b.allowClick||(b.params.preventClicks&&e.preventDefault(),b.params.preventClicksPropagation&&b.animating&&(e.stopPropagation(),e.stopImmediatePropagation()))},b.onClickNext=function(e){e.preventDefault(),b.isEnd&&!b.params.loop||b.slideNext()},b.onClickPrev=function(e){e.preventDefault(),b.isBeginning&&!b.params.loop||b.slidePrev()},b.onClickIndex=function(e){e.preventDefault();var t=a(this).index()*b.params.slidesPerGroup;b.params.loop&&(t+=b.loopedSlides),b.slideTo(t)},b.updateClickedSlide=function(e){var t=o(e,"."+b.params.slideClass),s=!1;if(t)for(var i=0;i<b.slides.length;i++)b.slides[i]===t&&(s=!0);if(!t||!s)return b.clickedSlide=void 0,void(b.clickedIndex=void 0);if(b.clickedSlide=t,b.clickedIndex=a(t).index(),b.params.slideToClickedSlide&&void 0!==b.clickedIndex&&b.clickedIndex!==b.activeIndex){var r,n=b.clickedIndex,l="auto"===b.params.slidesPerView?b.currentSlidesPerView():b.params.slidesPerView;if(b.params.loop){if(b.animating)return;r=parseInt(a(b.clickedSlide).attr("data-swiper-slide-index"),10),b.params.centeredSlides?n<b.loopedSlides-l/2||n>b.slides.length-b.loopedSlides+l/2?(b.fixLoop(),n=b.wrapper.children("."+b.params.slideClass+'[data-swiper-slide-index="'+r+'"]:not(.'+b.params.slideDuplicateClass+")").eq(0).index(),setTimeout(function(){b.slideTo(n)},0)):b.slideTo(n):n>b.slides.length-l?(b.fixLoop(),n=b.wrapper.children("."+b.params.slideClass+'[data-swiper-slide-index="'+r+'"]:not(.'+b.params.slideDuplicateClass+")").eq(0).index(),setTimeout(function(){b.slideTo(n)},0)):b.slideTo(n)}else b.slideTo(n)}};var C,z,M,E,P,I,k,L,D,B,H="input, select, textarea, button, video",G=Date.now(),X=[];b.animating=!1,b.touches={startX:0,startY:0,currentX:0,currentY:0,diff:0};var Y,A;b.onTouchStart=function(e){if(e.originalEvent&&(e=e.originalEvent),Y="touchstart"===e.type,Y||!("which"in e)||3!==e.which){if(b.params.noSwiping&&o(e,"."+b.params.noSwipingClass))return void(b.allowClick=!0);if(!b.params.swipeHandler||o(e,b.params.swipeHandler)){var t=b.touches.currentX="touchstart"===e.type?e.targetTouches[0].pageX:e.pageX,s=b.touches.currentY="touchstart"===e.type?e.targetTouches[0].pageY:e.pageY;if(!(b.device.ios&&b.params.iOSEdgeSwipeDetection&&t<=b.params.iOSEdgeSwipeThreshold)){if(C=!0,z=!1,M=!0,P=void 0,A=void 0,b.touches.startX=t,b.touches.startY=s,E=Date.now(),b.allowClick=!0,b.updateContainerSize(),b.swipeDirection=void 0,b.params.threshold>0&&(L=!1),"touchstart"!==e.type){var i=!0;a(e.target).is(H)&&(i=!1),document.activeElement&&a(document.activeElement).is(H)&&document.activeElement.blur(),i&&e.preventDefault()}b.emit("onTouchStart",b,e)}}}},b.onTouchMove=function(e){if(e.originalEvent&&(e=e.originalEvent),!Y||"mousemove"!==e.type){if(e.preventedByNestedSwiper)return b.touches.startX="touchmove"===e.type?e.targetTouches[0].pageX:e.pageX,void(b.touches.startY="touchmove"===e.type?e.targetTouches[0].pageY:e.pageY);if(b.params.onlyExternal)return b.allowClick=!1,void(C&&(b.touches.startX=b.touches.currentX="touchmove"===e.type?e.targetTouches[0].pageX:e.pageX,b.touches.startY=b.touches.currentY="touchmove"===e.type?e.targetTouches[0].pageY:e.pageY,E=Date.now()));if(Y&&b.params.touchReleaseOnEdges&&!b.params.loop)if(b.isHorizontal()){if(b.touches.currentX<b.touches.startX&&b.translate<=b.maxTranslate()||b.touches.currentX>b.touches.startX&&b.translate>=b.minTranslate())return}else if(b.touches.currentY<b.touches.startY&&b.translate<=b.maxTranslate()||b.touches.currentY>b.touches.startY&&b.translate>=b.minTranslate())return;if(Y&&document.activeElement&&e.target===document.activeElement&&a(e.target).is(H))return z=!0,void(b.allowClick=!1);if(M&&b.emit("onTouchMove",b,e),!(e.targetTouches&&e.targetTouches.length>1)){if(b.touches.currentX="touchmove"===e.type?e.targetTouches[0].pageX:e.pageX,b.touches.currentY="touchmove"===e.type?e.targetTouches[0].pageY:e.pageY,"undefined"==typeof P){var t;b.isHorizontal()&&b.touches.currentY===b.touches.startY||!b.isHorizontal()&&b.touches.currentX===b.touches.startX?P=!1:(t=180*Math.atan2(Math.abs(b.touches.currentY-b.touches.startY),Math.abs(b.touches.currentX-b.touches.startX))/Math.PI,P=b.isHorizontal()?t>b.params.touchAngle:90-t>b.params.touchAngle)}if(P&&b.emit("onTouchMoveOpposite",b,e),"undefined"==typeof A&&b.browser.ieTouch&&(b.touches.currentX===b.touches.startX&&b.touches.currentY===b.touches.startY||(A=!0)),C){if(P)return void(C=!1);if(A||!b.browser.ieTouch){b.allowClick=!1,b.emit("onSliderMove",b,e),e.preventDefault(),b.params.touchMoveStopPropagation&&!b.params.nested&&e.stopPropagation(),z||(i.loop&&b.fixLoop(),k=b.getWrapperTranslate(),b.setWrapperTransition(0),b.animating&&b.wrapper.trigger("webkitTransitionEnd transitionend oTransitionEnd MSTransitionEnd msTransitionEnd"),b.params.autoplay&&b.autoplaying&&(b.params.autoplayDisableOnInteraction?b.stopAutoplay():b.pauseAutoplay()),B=!1,!b.params.grabCursor||b.params.allowSwipeToNext!==!0&&b.params.allowSwipeToPrev!==!0||b.setGrabCursor(!0)),z=!0;var s=b.touches.diff=b.isHorizontal()?b.touches.currentX-b.touches.startX:b.touches.currentY-b.touches.startY;s*=b.params.touchRatio,b.rtl&&(s=-s),b.swipeDirection=s>0?"prev":"next",I=s+k;var r=!0;if(s>0&&I>b.minTranslate()?(r=!1,b.params.resistance&&(I=b.minTranslate()-1+Math.pow(-b.minTranslate()+k+s,b.params.resistanceRatio))):s<0&&I<b.maxTranslate()&&(r=!1,b.params.resistance&&(I=b.maxTranslate()+1-Math.pow(b.maxTranslate()-k-s,b.params.resistanceRatio))),r&&(e.preventedByNestedSwiper=!0),!b.params.allowSwipeToNext&&"next"===b.swipeDirection&&I<k&&(I=k),!b.params.allowSwipeToPrev&&"prev"===b.swipeDirection&&I>k&&(I=k),b.params.threshold>0){if(!(Math.abs(s)>b.params.threshold||L))return void(I=k);if(!L)return L=!0,b.touches.startX=b.touches.currentX,b.touches.startY=b.touches.currentY,I=k,void(b.touches.diff=b.isHorizontal()?b.touches.currentX-b.touches.startX:b.touches.currentY-b.touches.startY)}b.params.followFinger&&((b.params.freeMode||b.params.watchSlidesProgress)&&b.updateActiveIndex(),b.params.freeMode&&(0===X.length&&X.push({position:b.touches[b.isHorizontal()?"startX":"startY"],time:E}),X.push({position:b.touches[b.isHorizontal()?"currentX":"currentY"],time:(new window.Date).getTime()})),b.updateProgress(I),b.setWrapperTranslate(I))}}}}},b.onTouchEnd=function(e){if(e.originalEvent&&(e=e.originalEvent),M&&b.emit("onTouchEnd",b,e),M=!1,C){b.params.grabCursor&&z&&C&&(b.params.allowSwipeToNext===!0||b.params.allowSwipeToPrev===!0)&&b.setGrabCursor(!1);var t=Date.now(),s=t-E;if(b.allowClick&&(b.updateClickedSlide(e),b.emit("onTap",b,e),s<300&&t-G>300&&(D&&clearTimeout(D),D=setTimeout(function(){b&&(b.params.paginationHide&&b.paginationContainer.length>0&&!a(e.target).hasClass(b.params.bulletClass)&&b.paginationContainer.toggleClass(b.params.paginationHiddenClass),b.emit("onClick",b,e))},300)),s<300&&t-G<300&&(D&&clearTimeout(D),b.emit("onDoubleTap",b,e))),G=Date.now(),setTimeout(function(){b&&(b.allowClick=!0)},0),!C||!z||!b.swipeDirection||0===b.touches.diff||I===k)return void(C=z=!1);C=z=!1;var i;if(i=b.params.followFinger?b.rtl?b.translate:-b.translate:-I,b.params.freeMode){if(i<-b.minTranslate())return void b.slideTo(b.activeIndex);if(i>-b.maxTranslate())return void(b.slides.length<b.snapGrid.length?b.slideTo(b.snapGrid.length-1):b.slideTo(b.slides.length-1));if(b.params.freeModeMomentum){if(X.length>1){var r=X.pop(),n=X.pop(),o=r.position-n.position,l=r.time-n.time;b.velocity=o/l,b.velocity=b.velocity/2,Math.abs(b.velocity)<b.params.freeModeMinimumVelocity&&(b.velocity=0),(l>150||(new window.Date).getTime()-r.time>300)&&(b.velocity=0)}else b.velocity=0;b.velocity=b.velocity*b.params.freeModeMomentumVelocityRatio,X.length=0;var p=1e3*b.params.freeModeMomentumRatio,d=b.velocity*p,u=b.translate+d;b.rtl&&(u=-u);var c,m=!1,h=20*Math.abs(b.velocity)*b.params.freeModeMomentumBounceRatio;if(u<b.maxTranslate())b.params.freeModeMomentumBounce?(u+b.maxTranslate()<-h&&(u=b.maxTranslate()-h),c=b.maxTranslate(),m=!0,B=!0):u=b.maxTranslate();else if(u>b.minTranslate())b.params.freeModeMomentumBounce?(u-b.minTranslate()>h&&(u=b.minTranslate()+h),c=b.minTranslate(),m=!0,B=!0):u=b.minTranslate();else if(b.params.freeModeSticky){var g,f=0;for(f=0;f<b.snapGrid.length;f+=1)if(b.snapGrid[f]>-u){g=f;break}u=Math.abs(b.snapGrid[g]-u)<Math.abs(b.snapGrid[g-1]-u)||"next"===b.swipeDirection?b.snapGrid[g]:b.snapGrid[g-1],b.rtl||(u=-u)}if(0!==b.velocity)p=b.rtl?Math.abs((-u-b.translate)/b.velocity):Math.abs((u-b.translate)/b.velocity);else if(b.params.freeModeSticky)return void b.slideReset();b.params.freeModeMomentumBounce&&m?(b.updateProgress(c),b.setWrapperTransition(p),b.setWrapperTranslate(u),b.onTransitionStart(),b.animating=!0,b.wrapper.transitionEnd(function(){b&&B&&(b.emit("onMomentumBounce",b),b.setWrapperTransition(b.params.speed),b.setWrapperTranslate(c),b.wrapper.transitionEnd(function(){b&&b.onTransitionEnd()}))})):b.velocity?(b.updateProgress(u),b.setWrapperTransition(p),b.setWrapperTranslate(u),b.onTransitionStart(),b.animating||(b.animating=!0,b.wrapper.transitionEnd(function(){b&&b.onTransitionEnd()}))):b.updateProgress(u),b.updateActiveIndex()}return void((!b.params.freeModeMomentum||s>=b.params.longSwipesMs)&&(b.updateProgress(),b.updateActiveIndex()))}var v,w=0,y=b.slidesSizesGrid[0];for(v=0;v<b.slidesGrid.length;v+=b.params.slidesPerGroup)"undefined"!=typeof b.slidesGrid[v+b.params.slidesPerGroup]?i>=b.slidesGrid[v]&&i<b.slidesGrid[v+b.params.slidesPerGroup]&&(w=v,y=b.slidesGrid[v+b.params.slidesPerGroup]-b.slidesGrid[v]):i>=b.slidesGrid[v]&&(w=v,y=b.slidesGrid[b.slidesGrid.length-1]-b.slidesGrid[b.slidesGrid.length-2]);var x=(i-b.slidesGrid[w])/y;if(s>b.params.longSwipesMs){if(!b.params.longSwipes)return void b.slideTo(b.activeIndex);"next"===b.swipeDirection&&(x>=b.params.longSwipesRatio?b.slideTo(w+b.params.slidesPerGroup):b.slideTo(w)),"prev"===b.swipeDirection&&(x>1-b.params.longSwipesRatio?b.slideTo(w+b.params.slidesPerGroup):b.slideTo(w))}else{if(!b.params.shortSwipes)return void b.slideTo(b.activeIndex);"next"===b.swipeDirection&&b.slideTo(w+b.params.slidesPerGroup),"prev"===b.swipeDirection&&b.slideTo(w)}}},b._slideTo=function(e,a){return b.slideTo(e,a,!0,!0)},b.slideTo=function(e,a,t,s){"undefined"==typeof t&&(t=!0),"undefined"==typeof e&&(e=0),e<0&&(e=0),b.snapIndex=Math.floor(e/b.params.slidesPerGroup),b.snapIndex>=b.snapGrid.length&&(b.snapIndex=b.snapGrid.length-1);var i=-b.snapGrid[b.snapIndex];if(b.params.autoplay&&b.autoplaying&&(s||!b.params.autoplayDisableOnInteraction?b.pauseAutoplay(a):b.stopAutoplay()),b.updateProgress(i),b.params.normalizeSlideIndex)for(var r=0;r<b.slidesGrid.length;r++)-Math.floor(100*i)>=Math.floor(100*b.slidesGrid[r])&&(e=r);return!(!b.params.allowSwipeToNext&&i<b.translate&&i<b.minTranslate())&&(!(!b.params.allowSwipeToPrev&&i>b.translate&&i>b.maxTranslate()&&(b.activeIndex||0)!==e)&&("undefined"==typeof a&&(a=b.params.speed),b.previousIndex=b.activeIndex||0,b.activeIndex=e,b.updateRealIndex(),b.rtl&&-i===b.translate||!b.rtl&&i===b.translate?(b.params.autoHeight&&b.updateAutoHeight(),b.updateClasses(),"slide"!==b.params.effect&&b.setWrapperTranslate(i),!1):(b.updateClasses(),b.onTransitionStart(t),0===a||b.browser.lteIE9?(b.setWrapperTranslate(i),b.setWrapperTransition(0),b.onTransitionEnd(t)):(b.setWrapperTranslate(i),b.setWrapperTransition(a),b.animating||(b.animating=!0,b.wrapper.transitionEnd(function(){b&&b.onTransitionEnd(t)}))),!0)))},b.onTransitionStart=function(e){"undefined"==typeof e&&(e=!0),b.params.autoHeight&&b.updateAutoHeight(),b.lazy&&b.lazy.onTransitionStart(),e&&(b.emit("onTransitionStart",b),b.activeIndex!==b.previousIndex&&(b.emit("onSlideChangeStart",b),b.activeIndex>b.previousIndex?b.emit("onSlideNextStart",b):b.emit("onSlidePrevStart",b)))},b.onTransitionEnd=function(e){b.animating=!1,b.setWrapperTransition(0),"undefined"==typeof e&&(e=!0),b.lazy&&b.lazy.onTransitionEnd(),e&&(b.emit("onTransitionEnd",b),b.activeIndex!==b.previousIndex&&(b.emit("onSlideChangeEnd",b),b.activeIndex>b.previousIndex?b.emit("onSlideNextEnd",b):b.emit("onSlidePrevEnd",b))),b.params.history&&b.history&&b.history.setHistory(b.params.history,b.activeIndex),b.params.hashnav&&b.hashnav&&b.hashnav.setHash()},b.slideNext=function(e,a,t){if(b.params.loop){if(b.animating)return!1;b.fixLoop();b.container[0].clientLeft;return b.slideTo(b.activeIndex+b.params.slidesPerGroup,a,e,t)}return b.slideTo(b.activeIndex+b.params.slidesPerGroup,a,e,t)},b._slideNext=function(e){return b.slideNext(!0,e,!0)},b.slidePrev=function(e,a,t){if(b.params.loop){if(b.animating)return!1;b.fixLoop();b.container[0].clientLeft;return b.slideTo(b.activeIndex-1,a,e,t)}return b.slideTo(b.activeIndex-1,a,e,t)},b._slidePrev=function(e){return b.slidePrev(!0,e,!0)},b.slideReset=function(e,a,t){return b.slideTo(b.activeIndex,a,e)},b.disableTouchControl=function(){return b.params.onlyExternal=!0,!0},b.enableTouchControl=function(){return b.params.onlyExternal=!1,!0},b.setWrapperTransition=function(e,a){b.wrapper.transition(e),"slide"!==b.params.effect&&b.effects[b.params.effect]&&b.effects[b.params.effect].setTransition(e),b.params.parallax&&b.parallax&&b.parallax.setTransition(e),b.params.scrollbar&&b.scrollbar&&b.scrollbar.setTransition(e),b.params.control&&b.controller&&b.controller.setTransition(e,a),b.emit("onSetTransition",b,e)},b.setWrapperTranslate=function(e,a,t){var s=0,i=0,n=0;b.isHorizontal()?s=b.rtl?-e:e:i=e,b.params.roundLengths&&(s=r(s),i=r(i)),b.params.virtualTranslate||(b.support.transforms3d?b.wrapper.transform("translate3d("+s+"px, "+i+"px, "+n+"px)"):b.wrapper.transform("translate("+s+"px, "+i+"px)")),b.translate=b.isHorizontal()?s:i;var o,l=b.maxTranslate()-b.minTranslate();o=0===l?0:(e-b.minTranslate())/l,o!==b.progress&&b.updateProgress(e),a&&b.updateActiveIndex(),"slide"!==b.params.effect&&b.effects[b.params.effect]&&b.effects[b.params.effect].setTranslate(b.translate),b.params.parallax&&b.parallax&&b.parallax.setTranslate(b.translate),b.params.scrollbar&&b.scrollbar&&b.scrollbar.setTranslate(b.translate),b.params.control&&b.controller&&b.controller.setTranslate(b.translate,t),b.emit("onSetTranslate",b,b.translate)},b.getTranslate=function(e,a){var t,s,i,r;return"undefined"==typeof a&&(a="x"),b.params.virtualTranslate?b.rtl?-b.translate:b.translate:(i=window.getComputedStyle(e,null),window.WebKitCSSMatrix?(s=i.transform||i.webkitTransform,s.split(",").length>6&&(s=s.split(", ").map(function(e){return e.replace(",",".")}).join(", ")),r=new window.WebKitCSSMatrix("none"===s?"":s)):(r=i.MozTransform||i.OTransform||i.MsTransform||i.msTransform||i.transform||i.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),t=r.toString().split(",")),"x"===a&&(s=window.WebKitCSSMatrix?r.m41:16===t.length?parseFloat(t[12]):parseFloat(t[4])),"y"===a&&(s=window.WebKitCSSMatrix?r.m42:16===t.length?parseFloat(t[13]):parseFloat(t[5])),b.rtl&&s&&(s=-s),s||0)},b.getWrapperTranslate=function(e){return"undefined"==typeof e&&(e=b.isHorizontal()?"x":"y"),b.getTranslate(b.wrapper[0],e)},b.observers=[],b.initObservers=function(){if(b.params.observeParents)for(var e=b.container.parents(),a=0;a<e.length;a++)l(e[a]);l(b.container[0],{childList:!1}),l(b.wrapper[0],{attributes:!1})},b.disconnectObservers=function(){for(var e=0;e<b.observers.length;e++)b.observers[e].disconnect();b.observers=[]},b.createLoop=function(){b.wrapper.children("."+b.params.slideClass+"."+b.params.slideDuplicateClass).remove();var e=b.wrapper.children("."+b.params.slideClass);"auto"!==b.params.slidesPerView||b.params.loopedSlides||(b.params.loopedSlides=e.length),b.loopedSlides=parseInt(b.params.loopedSlides||b.params.slidesPerView,10),b.loopedSlides=b.loopedSlides+b.params.loopAdditionalSlides,b.loopedSlides>e.length&&(b.loopedSlides=e.length);var t,s=[],i=[];for(e.each(function(t,r){var n=a(this);t<b.loopedSlides&&i.push(r),t<e.length&&t>=e.length-b.loopedSlides&&s.push(r),n.attr("data-swiper-slide-index",t)}),t=0;t<i.length;t++)b.wrapper.append(a(i[t].cloneNode(!0)).addClass(b.params.slideDuplicateClass));for(t=s.length-1;t>=0;t--)b.wrapper.prepend(a(s[t].cloneNode(!0)).addClass(b.params.slideDuplicateClass))},b.destroyLoop=function(){b.wrapper.children("."+b.params.slideClass+"."+b.params.slideDuplicateClass).remove(),b.slides.removeAttr("data-swiper-slide-index")},b.reLoop=function(e){var a=b.activeIndex-b.loopedSlides;b.destroyLoop(),b.createLoop(),b.updateSlidesSize(),e&&b.slideTo(a+b.loopedSlides,0,!1)},b.fixLoop=function(){var e;b.activeIndex<b.loopedSlides?(e=b.slides.length-3*b.loopedSlides+b.activeIndex,e+=b.loopedSlides,b.slideTo(e,0,!1,!0)):("auto"===b.params.slidesPerView&&b.activeIndex>=2*b.loopedSlides||b.activeIndex>b.slides.length-2*b.params.slidesPerView)&&(e=-b.slides.length+b.activeIndex+b.loopedSlides,e+=b.loopedSlides,b.slideTo(e,0,!1,!0))},b.appendSlide=function(e){if(b.params.loop&&b.destroyLoop(),"object"==typeof e&&e.length)for(var a=0;a<e.length;a++)e[a]&&b.wrapper.append(e[a]);else b.wrapper.append(e);b.params.loop&&b.createLoop(),b.params.observer&&b.support.observer||b.update(!0)},b.prependSlide=function(e){b.params.loop&&b.destroyLoop();var a=b.activeIndex+1;if("object"==typeof e&&e.length){for(var t=0;t<e.length;t++)e[t]&&b.wrapper.prepend(e[t]);a=b.activeIndex+e.length}else b.wrapper.prepend(e);b.params.loop&&b.createLoop(),b.params.observer&&b.support.observer||b.update(!0),b.slideTo(a,0,!1)},b.removeSlide=function(e){b.params.loop&&(b.destroyLoop(),b.slides=b.wrapper.children("."+b.params.slideClass));var a,t=b.activeIndex;if("object"==typeof e&&e.length){for(var s=0;s<e.length;s++)a=e[s],b.slides[a]&&b.slides.eq(a).remove(),a<t&&t--;t=Math.max(t,0)}else a=e,b.slides[a]&&b.slides.eq(a).remove(),a<t&&t--,t=Math.max(t,0);b.params.loop&&b.createLoop(),b.params.observer&&b.support.observer||b.update(!0),b.params.loop?b.slideTo(t+b.loopedSlides,0,!1):b.slideTo(t,0,!1)},b.removeAllSlides=function(){for(var e=[],a=0;a<b.slides.length;a++)e.push(a);b.removeSlide(e)},b.effects={fade:{setTranslate:function(){for(var e=0;e<b.slides.length;e++){var a=b.slides.eq(e),t=a[0].swiperSlideOffset,s=-t;b.params.virtualTranslate||(s-=b.translate);var i=0;b.isHorizontal()||(i=s,s=0);var r=b.params.fade.crossFade?Math.max(1-Math.abs(a[0].progress),0):1+Math.min(Math.max(a[0].progress,-1),0);a.css({opacity:r}).transform("translate3d("+s+"px, "+i+"px, 0px)")}},setTransition:function(e){if(b.slides.transition(e),b.params.virtualTranslate&&0!==e){var a=!1;b.slides.transitionEnd(function(){if(!a&&b){a=!0,b.animating=!1;for(var e=["webkitTransitionEnd","transitionend","oTransitionEnd","MSTransitionEnd","msTransitionEnd"],t=0;t<e.length;t++)b.wrapper.trigger(e[t])}})}}},flip:{setTranslate:function(){for(var e=0;e<b.slides.length;e++){var t=b.slides.eq(e),s=t[0].progress;b.params.flip.limitRotation&&(s=Math.max(Math.min(t[0].progress,1),-1));var i=t[0].swiperSlideOffset,r=-180*s,n=r,o=0,l=-i,p=0;if(b.isHorizontal()?b.rtl&&(n=-n):(p=l,l=0,o=-n,n=0),t[0].style.zIndex=-Math.abs(Math.round(s))+b.slides.length,b.params.flip.slideShadows){var d=b.isHorizontal()?t.find(".swiper-slide-shadow-left"):t.find(".swiper-slide-shadow-top"),u=b.isHorizontal()?t.find(".swiper-slide-shadow-right"):t.find(".swiper-slide-shadow-bottom");0===d.length&&(d=a('<div class="swiper-slide-shadow-'+(b.isHorizontal()?"left":"top")+'"></div>'),t.append(d)),0===u.length&&(u=a('<div class="swiper-slide-shadow-'+(b.isHorizontal()?"right":"bottom")+'"></div>'),t.append(u)),d.length&&(d[0].style.opacity=Math.max(-s,0)),u.length&&(u[0].style.opacity=Math.max(s,0))}t.transform("translate3d("+l+"px, "+p+"px, 0px) rotateX("+o+"deg) rotateY("+n+"deg)")}},setTransition:function(e){if(b.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),b.params.virtualTranslate&&0!==e){var t=!1;b.slides.eq(b.activeIndex).transitionEnd(function(){if(!t&&b&&a(this).hasClass(b.params.slideActiveClass)){t=!0,b.animating=!1;for(var e=["webkitTransitionEnd","transitionend","oTransitionEnd","MSTransitionEnd","msTransitionEnd"],s=0;s<e.length;s++)b.wrapper.trigger(e[s])}})}}},cube:{setTranslate:function(){var e,t=0;b.params.cube.shadow&&(b.isHorizontal()?(e=b.wrapper.find(".swiper-cube-shadow"),0===e.length&&(e=a('<div class="swiper-cube-shadow"></div>'),b.wrapper.append(e)),e.css({height:b.width+"px"})):(e=b.container.find(".swiper-cube-shadow"),0===e.length&&(e=a('<div class="swiper-cube-shadow"></div>'),b.container.append(e))));for(var s=0;s<b.slides.length;s++){var i=b.slides.eq(s),r=90*s,n=Math.floor(r/360);b.rtl&&(r=-r,n=Math.floor(-r/360));var o=Math.max(Math.min(i[0].progress,1),-1),l=0,p=0,d=0;s%4===0?(l=4*-n*b.size,d=0):(s-1)%4===0?(l=0,d=4*-n*b.size):(s-2)%4===0?(l=b.size+4*n*b.size,d=b.size):(s-3)%4===0&&(l=-b.size,d=3*b.size+4*b.size*n),b.rtl&&(l=-l),b.isHorizontal()||(p=l,l=0);var u="rotateX("+(b.isHorizontal()?0:-r)+"deg) rotateY("+(b.isHorizontal()?r:0)+"deg) translate3d("+l+"px, "+p+"px, "+d+"px)";if(o<=1&&o>-1&&(t=90*s+90*o,b.rtl&&(t=90*-s-90*o)),i.transform(u),b.params.cube.slideShadows){var c=b.isHorizontal()?i.find(".swiper-slide-shadow-left"):i.find(".swiper-slide-shadow-top"),m=b.isHorizontal()?i.find(".swiper-slide-shadow-right"):i.find(".swiper-slide-shadow-bottom");0===c.length&&(c=a('<div class="swiper-slide-shadow-'+(b.isHorizontal()?"left":"top")+'"></div>'),i.append(c)),0===m.length&&(m=a('<div class="swiper-slide-shadow-'+(b.isHorizontal()?"right":"bottom")+'"></div>'),i.append(m)),c.length&&(c[0].style.opacity=Math.max(-o,0)),m.length&&(m[0].style.opacity=Math.max(o,0))}}if(b.wrapper.css({"-webkit-transform-origin":"50% 50% -"+b.size/2+"px","-moz-transform-origin":"50% 50% -"+b.size/2+"px","-ms-transform-origin":"50% 50% -"+b.size/2+"px","transform-origin":"50% 50% -"+b.size/2+"px"}),b.params.cube.shadow)if(b.isHorizontal())e.transform("translate3d(0px, "+(b.width/2+b.params.cube.shadowOffset)+"px, "+-b.width/2+"px) rotateX(90deg) rotateZ(0deg) scale("+b.params.cube.shadowScale+")");else{var h=Math.abs(t)-90*Math.floor(Math.abs(t)/90),g=1.5-(Math.sin(2*h*Math.PI/360)/2+Math.cos(2*h*Math.PI/360)/2),f=b.params.cube.shadowScale,v=b.params.cube.shadowScale/g,w=b.params.cube.shadowOffset;e.transform("scale3d("+f+", 1, "+v+") translate3d(0px, "+(b.height/2+w)+"px, "+-b.height/2/v+"px) rotateX(-90deg)")}var y=b.isSafari||b.isUiWebView?-b.size/2:0;b.wrapper.transform("translate3d(0px,0,"+y+"px) rotateX("+(b.isHorizontal()?0:t)+"deg) rotateY("+(b.isHorizontal()?-t:0)+"deg)")},setTransition:function(e){b.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),b.params.cube.shadow&&!b.isHorizontal()&&b.container.find(".swiper-cube-shadow").transition(e)}},coverflow:{setTranslate:function(){for(var e=b.translate,t=b.isHorizontal()?-e+b.width/2:-e+b.height/2,s=b.isHorizontal()?b.params.coverflow.rotate:-b.params.coverflow.rotate,i=b.params.coverflow.depth,r=0,n=b.slides.length;r<n;r++){var o=b.slides.eq(r),l=b.slidesSizesGrid[r],p=o[0].swiperSlideOffset,d=(t-p-l/2)/l*b.params.coverflow.modifier,u=b.isHorizontal()?s*d:0,c=b.isHorizontal()?0:s*d,m=-i*Math.abs(d),h=b.isHorizontal()?0:b.params.coverflow.stretch*d,g=b.isHorizontal()?b.params.coverflow.stretch*d:0;Math.abs(g)<.001&&(g=0),Math.abs(h)<.001&&(h=0),Math.abs(m)<.001&&(m=0),Math.abs(u)<.001&&(u=0),Math.abs(c)<.001&&(c=0);var f="translate3d("+g+"px,"+h+"px,"+m+"px) rotateX("+c+"deg) rotateY("+u+"deg)";if(o.transform(f),o[0].style.zIndex=-Math.abs(Math.round(d))+1,b.params.coverflow.slideShadows){var v=b.isHorizontal()?o.find(".swiper-slide-shadow-left"):o.find(".swiper-slide-shadow-top"),w=b.isHorizontal()?o.find(".swiper-slide-shadow-right"):o.find(".swiper-slide-shadow-bottom");0===v.length&&(v=a('<div class="swiper-slide-shadow-'+(b.isHorizontal()?"left":"top")+'"></div>'),o.append(v)),0===w.length&&(w=a('<div class="swiper-slide-shadow-'+(b.isHorizontal()?"right":"bottom")+'"></div>'),o.append(w)),v.length&&(v[0].style.opacity=d>0?d:0),w.length&&(w[0].style.opacity=-d>0?-d:0)}}if(b.browser.ie){var y=b.wrapper[0].style;y.perspectiveOrigin=t+"px 50%"}},setTransition:function(e){b.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e)}}},b.lazy={initialImageLoaded:!1,loadImageInSlide:function(e,t){if("undefined"!=typeof e&&("undefined"==typeof t&&(t=!0),0!==b.slides.length)){var s=b.slides.eq(e),i=s.find("."+b.params.lazyLoadingClass+":not(."+b.params.lazyStatusLoadedClass+"):not(."+b.params.lazyStatusLoadingClass+")");!s.hasClass(b.params.lazyLoadingClass)||s.hasClass(b.params.lazyStatusLoadedClass)||s.hasClass(b.params.lazyStatusLoadingClass)||(i=i.add(s[0])),0!==i.length&&i.each(function(){var e=a(this);e.addClass(b.params.lazyStatusLoadingClass);var i=e.attr("data-background"),r=e.attr("data-src"),n=e.attr("data-srcset"),o=e.attr("data-sizes");b.loadImage(e[0],r||i,n,o,!1,function(){if(i?(e.css("background-image",'url("'+i+'")'),e.removeAttr("data-background")):(n&&(e.attr("srcset",n),e.removeAttr("data-srcset")),o&&(e.attr("sizes",o),e.removeAttr("data-sizes")),r&&(e.attr("src",r),e.removeAttr("data-src"))),e.addClass(b.params.lazyStatusLoadedClass).removeClass(b.params.lazyStatusLoadingClass),s.find("."+b.params.lazyPreloaderClass+", ."+b.params.preloaderClass).remove(),b.params.loop&&t){var a=s.attr("data-swiper-slide-index");if(s.hasClass(b.params.slideDuplicateClass)){var l=b.wrapper.children('[data-swiper-slide-index="'+a+'"]:not(.'+b.params.slideDuplicateClass+")");b.lazy.loadImageInSlide(l.index(),!1)}else{var p=b.wrapper.children("."+b.params.slideDuplicateClass+'[data-swiper-slide-index="'+a+'"]');b.lazy.loadImageInSlide(p.index(),!1)}}b.emit("onLazyImageReady",b,s[0],e[0])}),b.emit("onLazyImageLoad",b,s[0],e[0])})}},load:function(){var e,t=b.params.slidesPerView;if("auto"===t&&(t=0),b.lazy.initialImageLoaded||(b.lazy.initialImageLoaded=!0),b.params.watchSlidesVisibility)b.wrapper.children("."+b.params.slideVisibleClass).each(function(){b.lazy.loadImageInSlide(a(this).index())});else if(t>1)for(e=b.activeIndex;e<b.activeIndex+t;e++)b.slides[e]&&b.lazy.loadImageInSlide(e);else b.lazy.loadImageInSlide(b.activeIndex);if(b.params.lazyLoadingInPrevNext)if(t>1||b.params.lazyLoadingInPrevNextAmount&&b.params.lazyLoadingInPrevNextAmount>1){var s=b.params.lazyLoadingInPrevNextAmount,i=t,r=Math.min(b.activeIndex+i+Math.max(s,i),b.slides.length),n=Math.max(b.activeIndex-Math.max(i,s),0);for(e=b.activeIndex+t;e<r;e++)b.slides[e]&&b.lazy.loadImageInSlide(e);for(e=n;e<b.activeIndex;e++)b.slides[e]&&b.lazy.loadImageInSlide(e)}else{var o=b.wrapper.children("."+b.params.slideNextClass);o.length>0&&b.lazy.loadImageInSlide(o.index());var l=b.wrapper.children("."+b.params.slidePrevClass);l.length>0&&b.lazy.loadImageInSlide(l.index())}},onTransitionStart:function(){b.params.lazyLoading&&(b.params.lazyLoadingOnTransitionStart||!b.params.lazyLoadingOnTransitionStart&&!b.lazy.initialImageLoaded)&&b.lazy.load()},onTransitionEnd:function(){b.params.lazyLoading&&!b.params.lazyLoadingOnTransitionStart&&b.lazy.load()}},b.scrollbar={isTouched:!1,setDragPosition:function(e){var a=b.scrollbar,t=b.isHorizontal()?"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].pageX:e.pageX||e.clientX:"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].pageY:e.pageY||e.clientY,s=t-a.track.offset()[b.isHorizontal()?"left":"top"]-a.dragSize/2,i=-b.minTranslate()*a.moveDivider,r=-b.maxTranslate()*a.moveDivider;s<i?s=i:s>r&&(s=r),s=-s/a.moveDivider,b.updateProgress(s),b.setWrapperTranslate(s,!0)},dragStart:function(e){var a=b.scrollbar;a.isTouched=!0,e.preventDefault(),e.stopPropagation(),a.setDragPosition(e),clearTimeout(a.dragTimeout),a.track.transition(0),b.params.scrollbarHide&&a.track.css("opacity",1),b.wrapper.transition(100),a.drag.transition(100),b.emit("onScrollbarDragStart",b)},dragMove:function(e){var a=b.scrollbar;a.isTouched&&(e.preventDefault?e.preventDefault():e.returnValue=!1,a.setDragPosition(e),b.wrapper.transition(0),a.track.transition(0),a.drag.transition(0),b.emit("onScrollbarDragMove",b))},dragEnd:function(e){var a=b.scrollbar;a.isTouched&&(a.isTouched=!1,b.params.scrollbarHide&&(clearTimeout(a.dragTimeout),a.dragTimeout=setTimeout(function(){a.track.css("opacity",0),a.track.transition(400)},1e3)),b.emit("onScrollbarDragEnd",b),b.params.scrollbarSnapOnRelease&&b.slideReset())},draggableEvents:function(){return b.params.simulateTouch!==!1||b.support.touch?b.touchEvents:b.touchEventsDesktop}(),enableDraggable:function(){var e=b.scrollbar,t=b.support.touch?e.track:document;a(e.track).on(e.draggableEvents.start,e.dragStart),a(t).on(e.draggableEvents.move,e.dragMove),a(t).on(e.draggableEvents.end,e.dragEnd)},disableDraggable:function(){var e=b.scrollbar,t=b.support.touch?e.track:document;a(e.track).off(e.draggableEvents.start,e.dragStart),a(t).off(e.draggableEvents.move,e.dragMove),a(t).off(e.draggableEvents.end,e.dragEnd)},set:function(){if(b.params.scrollbar){var e=b.scrollbar;e.track=a(b.params.scrollbar),b.params.uniqueNavElements&&"string"==typeof b.params.scrollbar&&e.track.length>1&&1===b.container.find(b.params.scrollbar).length&&(e.track=b.container.find(b.params.scrollbar)),e.drag=e.track.find(".swiper-scrollbar-drag"),0===e.drag.length&&(e.drag=a('<div class="swiper-scrollbar-drag"></div>'),e.track.append(e.drag)),e.drag[0].style.width="",e.drag[0].style.height="",e.trackSize=b.isHorizontal()?e.track[0].offsetWidth:e.track[0].offsetHeight,e.divider=b.size/b.virtualSize,e.moveDivider=e.divider*(e.trackSize/b.size),e.dragSize=e.trackSize*e.divider,b.isHorizontal()?e.drag[0].style.width=e.dragSize+"px":e.drag[0].style.height=e.dragSize+"px",e.divider>=1?e.track[0].style.display="none":e.track[0].style.display="",b.params.scrollbarHide&&(e.track[0].style.opacity=0)}},setTranslate:function(){if(b.params.scrollbar){var e,a=b.scrollbar,t=(b.translate||0,a.dragSize);e=(a.trackSize-a.dragSize)*b.progress,b.rtl&&b.isHorizontal()?(e=-e,e>0?(t=a.dragSize-e,e=0):-e+a.dragSize>a.trackSize&&(t=a.trackSize+e)):e<0?(t=a.dragSize+e,e=0):e+a.dragSize>a.trackSize&&(t=a.trackSize-e),b.isHorizontal()?(b.support.transforms3d?a.drag.transform("translate3d("+e+"px, 0, 0)"):a.drag.transform("translateX("+e+"px)"),a.drag[0].style.width=t+"px"):(b.support.transforms3d?a.drag.transform("translate3d(0px, "+e+"px, 0)"):a.drag.transform("translateY("+e+"px)"),a.drag[0].style.height=t+"px"),b.params.scrollbarHide&&(clearTimeout(a.timeout),a.track[0].style.opacity=1,a.timeout=setTimeout(function(){a.track[0].style.opacity=0,a.track.transition(400)},1e3))}},setTransition:function(e){b.params.scrollbar&&b.scrollbar.drag.transition(e)}},b.controller={LinearSpline:function(e,a){this.x=e,this.y=a,this.lastIndex=e.length-1;var t,s;this.x.length;this.interpolate=function(e){return e?(s=i(this.x,e),t=s-1,(e-this.x[t])*(this.y[s]-this.y[t])/(this.x[s]-this.x[t])+this.y[t]):0};var i=function(){var e,a,t;return function(s,i){for(a=-1,e=s.length;e-a>1;)s[t=e+a>>1]<=i?a=t:e=t;return e}}()},getInterpolateFunction:function(e){b.controller.spline||(b.controller.spline=b.params.loop?new b.controller.LinearSpline(b.slidesGrid,e.slidesGrid):new b.controller.LinearSpline(b.snapGrid,e.snapGrid))},setTranslate:function(e,a){function s(a){e=a.rtl&&"horizontal"===a.params.direction?-b.translate:b.translate,"slide"===b.params.controlBy&&(b.controller.getInterpolateFunction(a),r=-b.controller.spline.interpolate(-e)),r&&"container"!==b.params.controlBy||(i=(a.maxTranslate()-a.minTranslate())/(b.maxTranslate()-b.minTranslate()),r=(e-b.minTranslate())*i+a.minTranslate()),b.params.controlInverse&&(r=a.maxTranslate()-r),a.updateProgress(r),a.setWrapperTranslate(r,!1,b),a.updateActiveIndex()}var i,r,n=b.params.control;if(b.isArray(n))for(var o=0;o<n.length;o++)n[o]!==a&&n[o]instanceof t&&s(n[o]);else n instanceof t&&a!==n&&s(n)},setTransition:function(e,a){function s(a){
a.setWrapperTransition(e,b),0!==e&&(a.onTransitionStart(),a.wrapper.transitionEnd(function(){r&&(a.params.loop&&"slide"===b.params.controlBy&&a.fixLoop(),a.onTransitionEnd())}))}var i,r=b.params.control;if(b.isArray(r))for(i=0;i<r.length;i++)r[i]!==a&&r[i]instanceof t&&s(r[i]);else r instanceof t&&a!==r&&s(r)}},b.hashnav={onHashCange:function(e,a){var t=document.location.hash.replace("#",""),s=b.slides.eq(b.activeIndex).attr("data-hash");t!==s&&b.slideTo(b.wrapper.children("."+b.params.slideClass+'[data-hash="'+t+'"]').index())},attachEvents:function(e){var t=e?"off":"on";a(window)[t]("hashchange",b.hashnav.onHashCange)},setHash:function(){if(b.hashnav.initialized&&b.params.hashnav)if(b.params.replaceState&&window.history&&window.history.replaceState)window.history.replaceState(null,null,"#"+b.slides.eq(b.activeIndex).attr("data-hash")||"");else{var e=b.slides.eq(b.activeIndex),a=e.attr("data-hash")||e.attr("data-history");document.location.hash=a||""}},init:function(){if(b.params.hashnav&&!b.params.history){b.hashnav.initialized=!0;var e=document.location.hash.replace("#","");if(e)for(var a=0,t=0,s=b.slides.length;t<s;t++){var i=b.slides.eq(t),r=i.attr("data-hash")||i.attr("data-history");if(r===e&&!i.hasClass(b.params.slideDuplicateClass)){var n=i.index();b.slideTo(n,a,b.params.runCallbacksOnInit,!0)}}b.params.hashnavWatchState&&b.hashnav.attachEvents()}},destroy:function(){b.params.hashnavWatchState&&b.hashnav.attachEvents(!0)}},b.history={init:function(){if(b.params.history){if(!window.history||!window.history.pushState)return b.params.history=!1,void(b.params.hashnav=!0);b.history.initialized=!0,this.paths=this.getPathValues(),(this.paths.key||this.paths.value)&&(this.scrollToSlide(0,this.paths.value,b.params.runCallbacksOnInit),b.params.replaceState||window.addEventListener("popstate",this.setHistoryPopState))}},setHistoryPopState:function(){b.history.paths=b.history.getPathValues(),b.history.scrollToSlide(b.params.speed,b.history.paths.value,!1)},getPathValues:function(){var e=window.location.pathname.slice(1).split("/"),a=e.length,t=e[a-2],s=e[a-1];return{key:t,value:s}},setHistory:function(e,a){if(b.history.initialized&&b.params.history){var t=b.slides.eq(a),s=this.slugify(t.attr("data-history"));window.location.pathname.includes(e)||(s=e+"/"+s),b.params.replaceState?window.history.replaceState(null,null,s):window.history.pushState(null,null,s)}},slugify:function(e){return e.toString().toLowerCase().replace(/\s+/g,"-").replace(/[^\w\-]+/g,"").replace(/\-\-+/g,"-").replace(/^-+/,"").replace(/-+$/,"")},scrollToSlide:function(e,a,t){if(a)for(var s=0,i=b.slides.length;s<i;s++){var r=b.slides.eq(s),n=this.slugify(r.attr("data-history"));if(n===a&&!r.hasClass(b.params.slideDuplicateClass)){var o=r.index();b.slideTo(o,e,t)}}else b.slideTo(0,e,t)}},b.disableKeyboardControl=function(){b.params.keyboardControl=!1,a(document).off("keydown",p)},b.enableKeyboardControl=function(){b.params.keyboardControl=!0,a(document).on("keydown",p)},b.mousewheel={event:!1,lastScrollTime:(new window.Date).getTime()},b.params.mousewheelControl&&(b.mousewheel.event=navigator.userAgent.indexOf("firefox")>-1?"DOMMouseScroll":d()?"wheel":"mousewheel"),b.disableMousewheelControl=function(){if(!b.mousewheel.event)return!1;var e=b.container;return"container"!==b.params.mousewheelEventsTarged&&(e=a(b.params.mousewheelEventsTarged)),e.off(b.mousewheel.event,u),!0},b.enableMousewheelControl=function(){if(!b.mousewheel.event)return!1;var e=b.container;return"container"!==b.params.mousewheelEventsTarged&&(e=a(b.params.mousewheelEventsTarged)),e.on(b.mousewheel.event,u),!0},b.parallax={setTranslate:function(){b.container.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(){m(this,b.progress)}),b.slides.each(function(){var e=a(this);e.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(){var a=Math.min(Math.max(e[0].progress,-1),1);m(this,a)})})},setTransition:function(e){"undefined"==typeof e&&(e=b.params.speed),b.container.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(){var t=a(this),s=parseInt(t.attr("data-swiper-parallax-duration"),10)||e;0===e&&(s=0),t.transition(s)})}},b.zoom={scale:1,currentScale:1,isScaling:!1,gesture:{slide:void 0,slideWidth:void 0,slideHeight:void 0,image:void 0,imageWrap:void 0,zoomMax:b.params.zoomMax},image:{isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},velocity:{x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0},getDistanceBetweenTouches:function(e){if(e.targetTouches.length<2)return 1;var a=e.targetTouches[0].pageX,t=e.targetTouches[0].pageY,s=e.targetTouches[1].pageX,i=e.targetTouches[1].pageY,r=Math.sqrt(Math.pow(s-a,2)+Math.pow(i-t,2));return r},onGestureStart:function(e){var t=b.zoom;if(!b.support.gestures){if("touchstart"!==e.type||"touchstart"===e.type&&e.targetTouches.length<2)return;t.gesture.scaleStart=t.getDistanceBetweenTouches(e)}return t.gesture.slide&&t.gesture.slide.length||(t.gesture.slide=a(this),0===t.gesture.slide.length&&(t.gesture.slide=b.slides.eq(b.activeIndex)),t.gesture.image=t.gesture.slide.find("img, svg, canvas"),t.gesture.imageWrap=t.gesture.image.parent("."+b.params.zoomContainerClass),t.gesture.zoomMax=t.gesture.imageWrap.attr("data-swiper-zoom")||b.params.zoomMax,0!==t.gesture.imageWrap.length)?(t.gesture.image.transition(0),void(t.isScaling=!0)):void(t.gesture.image=void 0)},onGestureChange:function(e){var a=b.zoom;if(!b.support.gestures){if("touchmove"!==e.type||"touchmove"===e.type&&e.targetTouches.length<2)return;a.gesture.scaleMove=a.getDistanceBetweenTouches(e)}a.gesture.image&&0!==a.gesture.image.length&&(b.support.gestures?a.scale=e.scale*a.currentScale:a.scale=a.gesture.scaleMove/a.gesture.scaleStart*a.currentScale,a.scale>a.gesture.zoomMax&&(a.scale=a.gesture.zoomMax-1+Math.pow(a.scale-a.gesture.zoomMax+1,.5)),a.scale<b.params.zoomMin&&(a.scale=b.params.zoomMin+1-Math.pow(b.params.zoomMin-a.scale+1,.5)),a.gesture.image.transform("translate3d(0,0,0) scale("+a.scale+")"))},onGestureEnd:function(e){var a=b.zoom;!b.support.gestures&&("touchend"!==e.type||"touchend"===e.type&&e.changedTouches.length<2)||a.gesture.image&&0!==a.gesture.image.length&&(a.scale=Math.max(Math.min(a.scale,a.gesture.zoomMax),b.params.zoomMin),a.gesture.image.transition(b.params.speed).transform("translate3d(0,0,0) scale("+a.scale+")"),a.currentScale=a.scale,a.isScaling=!1,1===a.scale&&(a.gesture.slide=void 0))},onTouchStart:function(e,a){var t=e.zoom;t.gesture.image&&0!==t.gesture.image.length&&(t.image.isTouched||("android"===e.device.os&&a.preventDefault(),t.image.isTouched=!0,t.image.touchesStart.x="touchstart"===a.type?a.targetTouches[0].pageX:a.pageX,t.image.touchesStart.y="touchstart"===a.type?a.targetTouches[0].pageY:a.pageY))},onTouchMove:function(e){var a=b.zoom;if(a.gesture.image&&0!==a.gesture.image.length&&(b.allowClick=!1,a.image.isTouched&&a.gesture.slide)){a.image.isMoved||(a.image.width=a.gesture.image[0].offsetWidth,a.image.height=a.gesture.image[0].offsetHeight,a.image.startX=b.getTranslate(a.gesture.imageWrap[0],"x")||0,a.image.startY=b.getTranslate(a.gesture.imageWrap[0],"y")||0,a.gesture.slideWidth=a.gesture.slide[0].offsetWidth,a.gesture.slideHeight=a.gesture.slide[0].offsetHeight,a.gesture.imageWrap.transition(0),b.rtl&&(a.image.startX=-a.image.startX),b.rtl&&(a.image.startY=-a.image.startY));var t=a.image.width*a.scale,s=a.image.height*a.scale;if(!(t<a.gesture.slideWidth&&s<a.gesture.slideHeight)){if(a.image.minX=Math.min(a.gesture.slideWidth/2-t/2,0),a.image.maxX=-a.image.minX,a.image.minY=Math.min(a.gesture.slideHeight/2-s/2,0),a.image.maxY=-a.image.minY,a.image.touchesCurrent.x="touchmove"===e.type?e.targetTouches[0].pageX:e.pageX,a.image.touchesCurrent.y="touchmove"===e.type?e.targetTouches[0].pageY:e.pageY,!a.image.isMoved&&!a.isScaling){if(b.isHorizontal()&&Math.floor(a.image.minX)===Math.floor(a.image.startX)&&a.image.touchesCurrent.x<a.image.touchesStart.x||Math.floor(a.image.maxX)===Math.floor(a.image.startX)&&a.image.touchesCurrent.x>a.image.touchesStart.x)return void(a.image.isTouched=!1);if(!b.isHorizontal()&&Math.floor(a.image.minY)===Math.floor(a.image.startY)&&a.image.touchesCurrent.y<a.image.touchesStart.y||Math.floor(a.image.maxY)===Math.floor(a.image.startY)&&a.image.touchesCurrent.y>a.image.touchesStart.y)return void(a.image.isTouched=!1)}e.preventDefault(),e.stopPropagation(),a.image.isMoved=!0,a.image.currentX=a.image.touchesCurrent.x-a.image.touchesStart.x+a.image.startX,a.image.currentY=a.image.touchesCurrent.y-a.image.touchesStart.y+a.image.startY,a.image.currentX<a.image.minX&&(a.image.currentX=a.image.minX+1-Math.pow(a.image.minX-a.image.currentX+1,.8)),a.image.currentX>a.image.maxX&&(a.image.currentX=a.image.maxX-1+Math.pow(a.image.currentX-a.image.maxX+1,.8)),a.image.currentY<a.image.minY&&(a.image.currentY=a.image.minY+1-Math.pow(a.image.minY-a.image.currentY+1,.8)),a.image.currentY>a.image.maxY&&(a.image.currentY=a.image.maxY-1+Math.pow(a.image.currentY-a.image.maxY+1,.8)),a.velocity.prevPositionX||(a.velocity.prevPositionX=a.image.touchesCurrent.x),a.velocity.prevPositionY||(a.velocity.prevPositionY=a.image.touchesCurrent.y),a.velocity.prevTime||(a.velocity.prevTime=Date.now()),a.velocity.x=(a.image.touchesCurrent.x-a.velocity.prevPositionX)/(Date.now()-a.velocity.prevTime)/2,a.velocity.y=(a.image.touchesCurrent.y-a.velocity.prevPositionY)/(Date.now()-a.velocity.prevTime)/2,Math.abs(a.image.touchesCurrent.x-a.velocity.prevPositionX)<2&&(a.velocity.x=0),Math.abs(a.image.touchesCurrent.y-a.velocity.prevPositionY)<2&&(a.velocity.y=0),a.velocity.prevPositionX=a.image.touchesCurrent.x,a.velocity.prevPositionY=a.image.touchesCurrent.y,a.velocity.prevTime=Date.now(),a.gesture.imageWrap.transform("translate3d("+a.image.currentX+"px, "+a.image.currentY+"px,0)")}}},onTouchEnd:function(e,a){var t=e.zoom;if(t.gesture.image&&0!==t.gesture.image.length){if(!t.image.isTouched||!t.image.isMoved)return t.image.isTouched=!1,void(t.image.isMoved=!1);t.image.isTouched=!1,t.image.isMoved=!1;var s=300,i=300,r=t.velocity.x*s,n=t.image.currentX+r,o=t.velocity.y*i,l=t.image.currentY+o;0!==t.velocity.x&&(s=Math.abs((n-t.image.currentX)/t.velocity.x)),0!==t.velocity.y&&(i=Math.abs((l-t.image.currentY)/t.velocity.y));var p=Math.max(s,i);t.image.currentX=n,t.image.currentY=l;var d=t.image.width*t.scale,u=t.image.height*t.scale;t.image.minX=Math.min(t.gesture.slideWidth/2-d/2,0),t.image.maxX=-t.image.minX,t.image.minY=Math.min(t.gesture.slideHeight/2-u/2,0),t.image.maxY=-t.image.minY,t.image.currentX=Math.max(Math.min(t.image.currentX,t.image.maxX),t.image.minX),t.image.currentY=Math.max(Math.min(t.image.currentY,t.image.maxY),t.image.minY),t.gesture.imageWrap.transition(p).transform("translate3d("+t.image.currentX+"px, "+t.image.currentY+"px,0)")}},onTransitionEnd:function(e){var a=e.zoom;a.gesture.slide&&e.previousIndex!==e.activeIndex&&(a.gesture.image.transform("translate3d(0,0,0) scale(1)"),a.gesture.imageWrap.transform("translate3d(0,0,0)"),a.gesture.slide=a.gesture.image=a.gesture.imageWrap=void 0,a.scale=a.currentScale=1)},toggleZoom:function(e,t){var s=e.zoom;if(s.gesture.slide||(s.gesture.slide=e.clickedSlide?a(e.clickedSlide):e.slides.eq(e.activeIndex),s.gesture.image=s.gesture.slide.find("img, svg, canvas"),s.gesture.imageWrap=s.gesture.image.parent("."+e.params.zoomContainerClass)),s.gesture.image&&0!==s.gesture.image.length){var i,r,n,o,l,p,d,u,c,m,h,g,f,v,w,y,x,T;"undefined"==typeof s.image.touchesStart.x&&t?(i="touchend"===t.type?t.changedTouches[0].pageX:t.pageX,r="touchend"===t.type?t.changedTouches[0].pageY:t.pageY):(i=s.image.touchesStart.x,r=s.image.touchesStart.y),s.scale&&1!==s.scale?(s.scale=s.currentScale=1,s.gesture.imageWrap.transition(300).transform("translate3d(0,0,0)"),s.gesture.image.transition(300).transform("translate3d(0,0,0) scale(1)"),s.gesture.slide=void 0):(s.scale=s.currentScale=s.gesture.imageWrap.attr("data-swiper-zoom")||e.params.zoomMax,t?(x=s.gesture.slide[0].offsetWidth,T=s.gesture.slide[0].offsetHeight,n=s.gesture.slide.offset().left,o=s.gesture.slide.offset().top,l=n+x/2-i,p=o+T/2-r,c=s.gesture.image[0].offsetWidth,m=s.gesture.image[0].offsetHeight,h=c*s.scale,g=m*s.scale,f=Math.min(x/2-h/2,0),v=Math.min(T/2-g/2,0),w=-f,y=-v,d=l*s.scale,u=p*s.scale,d<f&&(d=f),d>w&&(d=w),u<v&&(u=v),u>y&&(u=y)):(d=0,u=0),s.gesture.imageWrap.transition(300).transform("translate3d("+d+"px, "+u+"px,0)"),s.gesture.image.transition(300).transform("translate3d(0,0,0) scale("+s.scale+")"))}},attachEvents:function(e){var t=e?"off":"on";if(b.params.zoom){var s=(b.slides,!("touchstart"!==b.touchEvents.start||!b.support.passiveListener||!b.params.passiveListeners)&&{passive:!0,capture:!1});b.support.gestures?(b.slides[t]("gesturestart",b.zoom.onGestureStart,s),b.slides[t]("gesturechange",b.zoom.onGestureChange,s),b.slides[t]("gestureend",b.zoom.onGestureEnd,s)):"touchstart"===b.touchEvents.start&&(b.slides[t](b.touchEvents.start,b.zoom.onGestureStart,s),b.slides[t](b.touchEvents.move,b.zoom.onGestureChange,s),b.slides[t](b.touchEvents.end,b.zoom.onGestureEnd,s)),b[t]("touchStart",b.zoom.onTouchStart),b.slides.each(function(e,s){a(s).find("."+b.params.zoomContainerClass).length>0&&a(s)[t](b.touchEvents.move,b.zoom.onTouchMove)}),b[t]("touchEnd",b.zoom.onTouchEnd),b[t]("transitionEnd",b.zoom.onTransitionEnd),b.params.zoomToggle&&b.on("doubleTap",b.zoom.toggleZoom)}},init:function(){b.zoom.attachEvents()},destroy:function(){b.zoom.attachEvents(!0)}},b._plugins=[];for(var O in b.plugins){var N=b.plugins[O](b,b.params[O]);N&&b._plugins.push(N)}return b.callPlugins=function(e){for(var a=0;a<b._plugins.length;a++)e in b._plugins[a]&&b._plugins[a][e](arguments[1],arguments[2],arguments[3],arguments[4],arguments[5])},b.emitterEventListeners={},b.emit=function(e){b.params[e]&&b.params[e](arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]);var a;if(b.emitterEventListeners[e])for(a=0;a<b.emitterEventListeners[e].length;a++)b.emitterEventListeners[e][a](arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]);b.callPlugins&&b.callPlugins(e,arguments[1],arguments[2],arguments[3],arguments[4],arguments[5])},b.on=function(e,a){return e=h(e),b.emitterEventListeners[e]||(b.emitterEventListeners[e]=[]),b.emitterEventListeners[e].push(a),b},b.off=function(e,a){var t;if(e=h(e),"undefined"==typeof a)return b.emitterEventListeners[e]=[],b;if(b.emitterEventListeners[e]&&0!==b.emitterEventListeners[e].length){for(t=0;t<b.emitterEventListeners[e].length;t++)b.emitterEventListeners[e][t]===a&&b.emitterEventListeners[e].splice(t,1);return b}},b.once=function(e,a){e=h(e);var t=function(){a(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4]),b.off(e,t)};return b.on(e,t),b},b.a11y={makeFocusable:function(e){return e.attr("tabIndex","0"),e},addRole:function(e,a){return e.attr("role",a),e},addLabel:function(e,a){return e.attr("aria-label",a),e},disable:function(e){return e.attr("aria-disabled",!0),e},enable:function(e){return e.attr("aria-disabled",!1),e},onEnterKey:function(e){13===e.keyCode&&(a(e.target).is(b.params.nextButton)?(b.onClickNext(e),b.isEnd?b.a11y.notify(b.params.lastSlideMessage):b.a11y.notify(b.params.nextSlideMessage)):a(e.target).is(b.params.prevButton)&&(b.onClickPrev(e),b.isBeginning?b.a11y.notify(b.params.firstSlideMessage):b.a11y.notify(b.params.prevSlideMessage)),a(e.target).is("."+b.params.bulletClass)&&a(e.target)[0].click())},liveRegion:a('<span class="'+b.params.notificationClass+'" aria-live="assertive" aria-atomic="true"></span>'),notify:function(e){var a=b.a11y.liveRegion;0!==a.length&&(a.html(""),a.html(e))},init:function(){b.params.nextButton&&b.nextButton&&b.nextButton.length>0&&(b.a11y.makeFocusable(b.nextButton),b.a11y.addRole(b.nextButton,"button"),b.a11y.addLabel(b.nextButton,b.params.nextSlideMessage)),b.params.prevButton&&b.prevButton&&b.prevButton.length>0&&(b.a11y.makeFocusable(b.prevButton),b.a11y.addRole(b.prevButton,"button"),b.a11y.addLabel(b.prevButton,b.params.prevSlideMessage)),a(b.container).append(b.a11y.liveRegion)},initPagination:function(){b.params.pagination&&b.params.paginationClickable&&b.bullets&&b.bullets.length&&b.bullets.each(function(){var e=a(this);b.a11y.makeFocusable(e),b.a11y.addRole(e,"button"),b.a11y.addLabel(e,b.params.paginationBulletMessage.replace(/{{index}}/,e.index()+1))})},destroy:function(){b.a11y.liveRegion&&b.a11y.liveRegion.length>0&&b.a11y.liveRegion.remove()}},b.init=function(){b.params.loop&&b.createLoop(),b.updateContainerSize(),b.updateSlidesSize(),b.updatePagination(),b.params.scrollbar&&b.scrollbar&&(b.scrollbar.set(),b.params.scrollbarDraggable&&b.scrollbar.enableDraggable()),"slide"!==b.params.effect&&b.effects[b.params.effect]&&(b.params.loop||b.updateProgress(),b.effects[b.params.effect].setTranslate()),b.params.loop?b.slideTo(b.params.initialSlide+b.loopedSlides,0,b.params.runCallbacksOnInit):(b.slideTo(b.params.initialSlide,0,b.params.runCallbacksOnInit),0===b.params.initialSlide&&(b.parallax&&b.params.parallax&&b.parallax.setTranslate(),b.lazy&&b.params.lazyLoading&&(b.lazy.load(),b.lazy.initialImageLoaded=!0))),b.attachEvents(),b.params.observer&&b.support.observer&&b.initObservers(),b.params.preloadImages&&!b.params.lazyLoading&&b.preloadImages(),b.params.zoom&&b.zoom&&b.zoom.init(),b.params.autoplay&&b.startAutoplay(),b.params.keyboardControl&&b.enableKeyboardControl&&b.enableKeyboardControl(),b.params.mousewheelControl&&b.enableMousewheelControl&&b.enableMousewheelControl(),b.params.hashnavReplaceState&&(b.params.replaceState=b.params.hashnavReplaceState),b.params.history&&b.history&&b.history.init(),b.params.hashnav&&b.hashnav&&b.hashnav.init(),b.params.a11y&&b.a11y&&b.a11y.init(),b.emit("onInit",b)},b.cleanupStyles=function(){b.container.removeClass(b.classNames.join(" ")).removeAttr("style"),b.wrapper.removeAttr("style"),b.slides&&b.slides.length&&b.slides.removeClass([b.params.slideVisibleClass,b.params.slideActiveClass,b.params.slideNextClass,b.params.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-column").removeAttr("data-swiper-row"),b.paginationContainer&&b.paginationContainer.length&&b.paginationContainer.removeClass(b.params.paginationHiddenClass),b.bullets&&b.bullets.length&&b.bullets.removeClass(b.params.bulletActiveClass),b.params.prevButton&&a(b.params.prevButton).removeClass(b.params.buttonDisabledClass),b.params.nextButton&&a(b.params.nextButton).removeClass(b.params.buttonDisabledClass),b.params.scrollbar&&b.scrollbar&&(b.scrollbar.track&&b.scrollbar.track.length&&b.scrollbar.track.removeAttr("style"),b.scrollbar.drag&&b.scrollbar.drag.length&&b.scrollbar.drag.removeAttr("style"))},b.destroy=function(e,a){b.detachEvents(),b.stopAutoplay(),b.params.scrollbar&&b.scrollbar&&b.params.scrollbarDraggable&&b.scrollbar.disableDraggable(),b.params.loop&&b.destroyLoop(),a&&b.cleanupStyles(),b.disconnectObservers(),b.params.zoom&&b.zoom&&b.zoom.destroy(),b.params.keyboardControl&&b.disableKeyboardControl&&b.disableKeyboardControl(),b.params.mousewheelControl&&b.disableMousewheelControl&&b.disableMousewheelControl(),b.params.a11y&&b.a11y&&b.a11y.destroy(),b.params.history&&!b.params.replaceState&&window.removeEventListener("popstate",b.history.setHistoryPopState),b.params.hashnav&&b.hashnav&&b.hashnav.destroy(),b.emit("onDestroy"),e!==!1&&(b=null)},b.init(),b}};t.prototype={isSafari:function(){var e=window.navigator.userAgent.toLowerCase();return e.indexOf("safari")>=0&&e.indexOf("chrome")<0&&e.indexOf("android")<0}(),isUiWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),isArray:function(e){return"[object Array]"===Object.prototype.toString.apply(e)},browser:{ie:window.navigator.pointerEnabled||window.navigator.msPointerEnabled,ieTouch:window.navigator.msPointerEnabled&&window.navigator.msMaxTouchPoints>1||window.navigator.pointerEnabled&&window.navigator.maxTouchPoints>1,lteIE9:function(){var e=document.createElement("div");return e.innerHTML="<!--[if lte IE 9]><i></i><![endif]-->",1===e.getElementsByTagName("i").length}()},device:function(){var e=window.navigator.userAgent,a=e.match(/(Android);?[\s\/]+([\d.]+)?/),t=e.match(/(iPad).*OS\s([\d_]+)/),s=e.match(/(iPod)(.*OS\s([\d_]+))?/),i=!t&&e.match(/(iPhone\sOS|iOS)\s([\d_]+)/);return{ios:t||i||s,android:a}}(),support:{touch:window.Modernizr&&Modernizr.touch===!0||function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)}(),transforms3d:window.Modernizr&&Modernizr.csstransforms3d===!0||function(){var e=document.createElement("div").style;return"webkitPerspective"in e||"MozPerspective"in e||"OPerspective"in e||"MsPerspective"in e||"perspective"in e}(),flexbox:function(){for(var e=document.createElement("div").style,a="alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient".split(" "),t=0;t<a.length;t++)if(a[t]in e)return!0}(),observer:function(){return"MutationObserver"in window||"WebkitMutationObserver"in window}(),passiveListener:function(){var e=!1;try{var a=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("testPassiveListener",null,a)}catch(e){}return e}(),gestures:function(){return"ongesturestart"in window}()},plugins:{}};for(var s=(function(){var e=function(e){var a=this,t=0;for(t=0;t<e.length;t++)a[t]=e[t];return a.length=e.length,this},a=function(a,t){var s=[],i=0;if(a&&!t&&a instanceof e)return a;if(a)if("string"==typeof a){var r,n,o=a.trim();if(o.indexOf("<")>=0&&o.indexOf(">")>=0){var l="div";for(0===o.indexOf("<li")&&(l="ul"),0===o.indexOf("<tr")&&(l="tbody"),0!==o.indexOf("<td")&&0!==o.indexOf("<th")||(l="tr"),0===o.indexOf("<tbody")&&(l="table"),0===o.indexOf("<option")&&(l="select"),n=document.createElement(l),n.innerHTML=a,i=0;i<n.childNodes.length;i++)s.push(n.childNodes[i])}else for(r=t||"#"!==a[0]||a.match(/[ .<>:~]/)?(t||document).querySelectorAll(a):[document.getElementById(a.split("#")[1])],i=0;i<r.length;i++)r[i]&&s.push(r[i])}else if(a.nodeType||a===window||a===document)s.push(a);else if(a.length>0&&a[0].nodeType)for(i=0;i<a.length;i++)s.push(a[i]);return new e(s)};return e.prototype={addClass:function(e){if("undefined"==typeof e)return this;for(var a=e.split(" "),t=0;t<a.length;t++)for(var s=0;s<this.length;s++)this[s].classList.add(a[t]);return this},removeClass:function(e){for(var a=e.split(" "),t=0;t<a.length;t++)for(var s=0;s<this.length;s++)this[s].classList.remove(a[t]);return this},hasClass:function(e){return!!this[0]&&this[0].classList.contains(e)},toggleClass:function(e){for(var a=e.split(" "),t=0;t<a.length;t++)for(var s=0;s<this.length;s++)this[s].classList.toggle(a[t]);return this},attr:function(e,a){if(1===arguments.length&&"string"==typeof e)return this[0]?this[0].getAttribute(e):void 0;for(var t=0;t<this.length;t++)if(2===arguments.length)this[t].setAttribute(e,a);else for(var s in e)this[t][s]=e[s],this[t].setAttribute(s,e[s]);return this},removeAttr:function(e){for(var a=0;a<this.length;a++)this[a].removeAttribute(e);return this},data:function(e,a){if("undefined"!=typeof a){for(var t=0;t<this.length;t++){var s=this[t];s.dom7ElementDataStorage||(s.dom7ElementDataStorage={}),s.dom7ElementDataStorage[e]=a}return this}if(this[0]){var i=this[0].getAttribute("data-"+e);return i?i:this[0].dom7ElementDataStorage&&e in this[0].dom7ElementDataStorage?this[0].dom7ElementDataStorage[e]:void 0}},transform:function(e){for(var a=0;a<this.length;a++){var t=this[a].style;t.webkitTransform=t.MsTransform=t.msTransform=t.MozTransform=t.OTransform=t.transform=e}return this},transition:function(e){"string"!=typeof e&&(e+="ms");for(var a=0;a<this.length;a++){var t=this[a].style;t.webkitTransitionDuration=t.MsTransitionDuration=t.msTransitionDuration=t.MozTransitionDuration=t.OTransitionDuration=t.transitionDuration=e}return this},on:function(e,t,s,i){function r(e){var i=e.target;if(a(i).is(t))s.call(i,e);else for(var r=a(i).parents(),n=0;n<r.length;n++)a(r[n]).is(t)&&s.call(r[n],e)}var n,o,l=e.split(" ");for(n=0;n<this.length;n++)if("function"==typeof t||t===!1)for("function"==typeof t&&(s=arguments[1],i=arguments[2]||!1),o=0;o<l.length;o++)this[n].addEventListener(l[o],s,i);else for(o=0;o<l.length;o++)this[n].dom7LiveListeners||(this[n].dom7LiveListeners=[]),this[n].dom7LiveListeners.push({listener:s,liveListener:r}),this[n].addEventListener(l[o],r,i);return this},off:function(e,a,t,s){for(var i=e.split(" "),r=0;r<i.length;r++)for(var n=0;n<this.length;n++)if("function"==typeof a||a===!1)"function"==typeof a&&(t=arguments[1],s=arguments[2]||!1),this[n].removeEventListener(i[r],t,s);else if(this[n].dom7LiveListeners)for(var o=0;o<this[n].dom7LiveListeners.length;o++)this[n].dom7LiveListeners[o].listener===t&&this[n].removeEventListener(i[r],this[n].dom7LiveListeners[o].liveListener,s);return this},once:function(e,a,t,s){function i(n){t(n),r.off(e,a,i,s)}var r=this;"function"==typeof a&&(a=!1,t=arguments[1],s=arguments[2]),r.on(e,a,i,s)},trigger:function(e,a){for(var t=0;t<this.length;t++){var s;try{s=new window.CustomEvent(e,{detail:a,bubbles:!0,cancelable:!0})}catch(t){s=document.createEvent("Event"),s.initEvent(e,!0,!0),s.detail=a}this[t].dispatchEvent(s)}return this},transitionEnd:function(e){function a(r){if(r.target===this)for(e.call(this,r),t=0;t<s.length;t++)i.off(s[t],a)}var t,s=["webkitTransitionEnd","transitionend","oTransitionEnd","MSTransitionEnd","msTransitionEnd"],i=this;if(e)for(t=0;t<s.length;t++)i.on(s[t],a);return this},width:function(){return this[0]===window?window.innerWidth:this.length>0?parseFloat(this.css("width")):null},outerWidth:function(e){return this.length>0?e?this[0].offsetWidth+parseFloat(this.css("margin-right"))+parseFloat(this.css("margin-left")):this[0].offsetWidth:null},height:function(){return this[0]===window?window.innerHeight:this.length>0?parseFloat(this.css("height")):null},outerHeight:function(e){return this.length>0?e?this[0].offsetHeight+parseFloat(this.css("margin-top"))+parseFloat(this.css("margin-bottom")):this[0].offsetHeight:null},offset:function(){if(this.length>0){var e=this[0],a=e.getBoundingClientRect(),t=document.body,s=e.clientTop||t.clientTop||0,i=e.clientLeft||t.clientLeft||0,r=window.pageYOffset||e.scrollTop,n=window.pageXOffset||e.scrollLeft;return{top:a.top+r-s,left:a.left+n-i}}return null},css:function(e,a){var t;if(1===arguments.length){if("string"!=typeof e){for(t=0;t<this.length;t++)for(var s in e)this[t].style[s]=e[s];return this}if(this[0])return window.getComputedStyle(this[0],null).getPropertyValue(e)}if(2===arguments.length&&"string"==typeof e){for(t=0;t<this.length;t++)this[t].style[e]=a;return this}return this},each:function(e){for(var a=0;a<this.length;a++)e.call(this[a],a,this[a]);return this},html:function(e){if("undefined"==typeof e)return this[0]?this[0].innerHTML:void 0;for(var a=0;a<this.length;a++)this[a].innerHTML=e;return this},text:function(e){if("undefined"==typeof e)return this[0]?this[0].textContent.trim():null;for(var a=0;a<this.length;a++)this[a].textContent=e;return this},is:function(t){if(!this[0])return!1;var s,i;if("string"==typeof t){var r=this[0];if(r===document)return t===document;if(r===window)return t===window;if(r.matches)return r.matches(t);if(r.webkitMatchesSelector)return r.webkitMatchesSelector(t);if(r.mozMatchesSelector)return r.mozMatchesSelector(t);if(r.msMatchesSelector)return r.msMatchesSelector(t);for(s=a(t),i=0;i<s.length;i++)if(s[i]===this[0])return!0;return!1}if(t===document)return this[0]===document;if(t===window)return this[0]===window;if(t.nodeType||t instanceof e){for(s=t.nodeType?[t]:t,i=0;i<s.length;i++)if(s[i]===this[0])return!0;return!1}return!1},index:function(){if(this[0]){for(var e=this[0],a=0;null!==(e=e.previousSibling);)1===e.nodeType&&a++;return a}},eq:function(a){if("undefined"==typeof a)return this;var t,s=this.length;return a>s-1?new e([]):a<0?(t=s+a,new e(t<0?[]:[this[t]])):new e([this[a]])},append:function(a){var t,s;for(t=0;t<this.length;t++)if("string"==typeof a){var i=document.createElement("div");for(i.innerHTML=a;i.firstChild;)this[t].appendChild(i.firstChild)}else if(a instanceof e)for(s=0;s<a.length;s++)this[t].appendChild(a[s]);else this[t].appendChild(a);return this},prepend:function(a){var t,s;for(t=0;t<this.length;t++)if("string"==typeof a){var i=document.createElement("div");for(i.innerHTML=a,s=i.childNodes.length-1;s>=0;s--)this[t].insertBefore(i.childNodes[s],this[t].childNodes[0])}else if(a instanceof e)for(s=0;s<a.length;s++)this[t].insertBefore(a[s],this[t].childNodes[0]);else this[t].insertBefore(a,this[t].childNodes[0]);return this},insertBefore:function(e){for(var t=a(e),s=0;s<this.length;s++)if(1===t.length)t[0].parentNode.insertBefore(this[s],t[0]);else if(t.length>1)for(var i=0;i<t.length;i++)t[i].parentNode.insertBefore(this[s].cloneNode(!0),t[i])},insertAfter:function(e){for(var t=a(e),s=0;s<this.length;s++)if(1===t.length)t[0].parentNode.insertBefore(this[s],t[0].nextSibling);else if(t.length>1)for(var i=0;i<t.length;i++)t[i].parentNode.insertBefore(this[s].cloneNode(!0),t[i].nextSibling)},next:function(t){return new e(this.length>0?t?this[0].nextElementSibling&&a(this[0].nextElementSibling).is(t)?[this[0].nextElementSibling]:[]:this[0].nextElementSibling?[this[0].nextElementSibling]:[]:[])},nextAll:function(t){var s=[],i=this[0];if(!i)return new e([]);for(;i.nextElementSibling;){var r=i.nextElementSibling;t?a(r).is(t)&&s.push(r):s.push(r),i=r}return new e(s)},prev:function(t){return new e(this.length>0?t?this[0].previousElementSibling&&a(this[0].previousElementSibling).is(t)?[this[0].previousElementSibling]:[]:this[0].previousElementSibling?[this[0].previousElementSibling]:[]:[])},prevAll:function(t){var s=[],i=this[0];if(!i)return new e([]);for(;i.previousElementSibling;){var r=i.previousElementSibling;t?a(r).is(t)&&s.push(r):s.push(r),i=r}return new e(s)},parent:function(e){for(var t=[],s=0;s<this.length;s++)e?a(this[s].parentNode).is(e)&&t.push(this[s].parentNode):t.push(this[s].parentNode);return a(a.unique(t))},parents:function(e){for(var t=[],s=0;s<this.length;s++)for(var i=this[s].parentNode;i;)e?a(i).is(e)&&t.push(i):t.push(i),i=i.parentNode;return a(a.unique(t))},find:function(a){for(var t=[],s=0;s<this.length;s++)for(var i=this[s].querySelectorAll(a),r=0;r<i.length;r++)t.push(i[r]);return new e(t)},children:function(t){for(var s=[],i=0;i<this.length;i++)for(var r=this[i].childNodes,n=0;n<r.length;n++)t?1===r[n].nodeType&&a(r[n]).is(t)&&s.push(r[n]):1===r[n].nodeType&&s.push(r[n]);return new e(a.unique(s))},remove:function(){for(var e=0;e<this.length;e++)this[e].parentNode&&this[e].parentNode.removeChild(this[e]);return this},add:function(){var e,t,s=this;for(e=0;e<arguments.length;e++){var i=a(arguments[e]);for(t=0;t<i.length;t++)s[s.length]=i[t],s.length++}return s}},a.fn=e.prototype,a.unique=function(e){for(var a=[],t=0;t<e.length;t++)a.indexOf(e[t])===-1&&a.push(e[t]);return a},a}()),i=["jQuery","Zepto","Dom7"],r=0;r<i.length;r++)window[i[r]]&&e(window[i[r]]);var n;n="undefined"==typeof s?window.Dom7||window.Zepto||window.jQuery:s,n&&("transitionEnd"in n.fn||(n.fn.transitionEnd=function(e){function a(r){if(r.target===this)for(e.call(this,r),t=0;t<s.length;t++)i.off(s[t],a)}var t,s=["webkitTransitionEnd","transitionend","oTransitionEnd","MSTransitionEnd","msTransitionEnd"],i=this;if(e)for(t=0;t<s.length;t++)i.on(s[t],a);return this}),"transform"in n.fn||(n.fn.transform=function(e){for(var a=0;a<this.length;a++){var t=this[a].style;t.webkitTransform=t.MsTransform=t.msTransform=t.MozTransform=t.OTransform=t.transform=e}return this}),"transition"in n.fn||(n.fn.transition=function(e){"string"!=typeof e&&(e+="ms");for(var a=0;a<this.length;a++){var t=this[a].style;t.webkitTransitionDuration=t.MsTransitionDuration=t.msTransitionDuration=t.MozTransitionDuration=t.OTransitionDuration=t.transitionDuration=e;
}return this}),"outerWidth"in n.fn||(n.fn.outerWidth=function(e){return this.length>0?e?this[0].offsetWidth+parseFloat(this.css("margin-right"))+parseFloat(this.css("margin-left")):this[0].offsetWidth:null})),window.Swiper=t}(),"undefined"!=typeof module?module.exports=window.Swiper:"function"==typeof define&&define.amd&&define([],function(){"use strict";return window.Swiper});
//# sourceMappingURL=maps/swiper.min.js.map
import App from '../App' import App from '../App'
const home = r => require.ensure([], () => r(require('../views/home')), 'home') // 等待会话
const blank = r => require.ensure([], () => r(require('../views/blank')), 'blank') const waitingSessionList = r => require.ensure([], () => r(require('../views/IM/waiting-session/list.vue')), 'waitingSessionList')
// 消息查询
const searchMessageList = r => require.ensure([], () => r(require('../views/IM/search-message/list.vue')), 'searchMessageList')
const searchMessageDetail = r => require.ensure([], () => r(require('../views/IM/search-message/detail.vue')), 'searchMessageDetail')
const discuss = r => require.ensure([], () => r(require('../views/discuss/index.vue')), 'index') // 当前会话
const creatDiscuss = r => require.ensure([], () => r(require('../views/discuss/add-edit.vue')), 'creatDiscuss') const currentSessionList = r => require.ensure([], () => r(require('../views/IM/current-session/index.vue')), 'currentMessageIndex')
const questionNaire = r => require.ensure([], () => r(require('../views/question-naire/question-list.vue')), 'questionNaire')
// 我要群发
const topicList = r => require.ensure([], () => r(require('../views/topicManage/index.vue')), 'topicList') const chainMessage = r => require.ensure([], () => r(require('../views/IM/chain-message/index.vue')), 'chainMessage')
const reportSet = r => require.ensure([], () => r(require('../views/report/reportSet.vue')), 'reportSet')
// 历史群发
const chainHistoryList = r => require.ensure([], () => r(require('../views/IM/chain-history/list.vue')), 'chainHistoryList')
const chainHistoryDetail = r => require.ensure([], () => r(require('../views/IM/chain-history/detail.vue')), 'chainHistoryDetail')
export default [{ export default [{
path: '/', path: '/',
...@@ -19,35 +24,29 @@ export default [{ ...@@ -19,35 +24,29 @@ export default [{
children: [ children: [
{ {
path: '', path: '',
redirect: '/home' redirect: '/waiting-session-list'
},{ }, {
path: '/questionNaire', path: '/waiting-session-list',
component: questionNaire component: waitingSessionList
},{ }, {
path: '/home', path: '/search-message-list',
component: home component: searchMessageList
}, }, {
path: '/search-message-detail',
component: searchMessageDetail
}, {
path: '/current-session-list',
component: currentSessionList
}, {
path: '/chain-message',
component: chainMessage
}, {
path: '/chain-history-list',
component: chainHistoryList
}, {
path: '/chain-history-detail',
component: chainHistoryDetail
}
{
path: '/discuss-list',
component: discuss
},
{
path: '/creat-discuss',
component: creatDiscuss
},
{
path: '/question-naire',
component: questionNaire
},
{
path: '/topic-list',
component: topicList
},
{
path: '/report-set',
component: reportSet
},
] ]
}] }]
\ No newline at end of file
import education from './education/getters' import education from './im/getters'
import { containObject } from '../utils/utils' import { containObject } from '../utils/utils'
......
const common = { const common = {
state: { state: {
_token: '', _token: '',
idType: '' isFromAssignTask: false,
}, },
mutations: { mutations: {
CHANGE_TOKEN: (state, data) => { CHANGE_TOKEN: (state, data) => {
state._token = data state._token = data
}, },
CHANGE_IDTYPE: (state, data) => { SET_IS_FROM_ASSIGN_TASK: (state, status) => {
state.idType = data state.isFromAssignTask = status;
} }
}, },
actions: { actions: {
changeToken({ commit }, tokenData) { changeToken({ commit }, tokenData) {
commit('CHANGE_TOKEN', tokenData) commit('CHANGE_TOKEN', tokenData)
}, },
changeIdType({ commit }, idTypeData) {
commit('CHANGE_IDTYPE', idTypeData)
}
} }
} }
......
const getters = { const getters = {
_token: state => state.common._token, _token: state => state.common._token,
idType: state => state.common.idType isFromAssignTask: state => state.common.isFromAssignTask,
} }
export default getters export default getters
import Vue from 'vue' import Vue from 'vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import common from './education/common' import common from './im/common'
import getters from './getters' import getters from './getters'
Vue.use(Vuex) Vue.use(Vuex)
......
...@@ -231,4 +231,37 @@ html,body{ ...@@ -231,4 +231,37 @@ html,body{
} }
.el-breadcrumb__inner.is-link:hover { .el-breadcrumb__inner.is-link:hover {
color: #449284 !important; color: #449284 !important;
} }
\ No newline at end of file
.current-session-wrap {
// .c-bottom .el-input__inner {
// height: 44px;
// line-height: 44px;
// padding-right: 100px;
// }
// .el-input.is-active .el-input__inner,
// .el-input__inner:focus {
// border-color: #eff5f7;
// }
// .link-form .el-form-item {
// margin-bottom: 15px;
// }
.c-bottom .el-textarea__inner {
height: 44px;
line-height: 22px;
padding-right: 100px;
resize: none;
}
.el-input.is-active .el-textarea__inner,
.el-textarea__inner:focus {
border-color: #eff5f7;
}
.link-form .el-form-item {
margin-bottom: 15px;
}
}
.viewer-button.viewer-close {
display: none;
}
\ No newline at end of file
...@@ -120,3 +120,7 @@ ...@@ -120,3 +120,7 @@
border-color: #ecedf1; border-color: #ecedf1;
border-radius: 2px; border-radius: 2px;
} }
.el-button--text > span{
font-weight: 700;
color: #449284 !important;
}
import Vue from 'vue'
Vue.directive('loadmore', {
bind (el, binding) {
// 获取element-ui定义好的scroll盒子
const SELECTWRAP_DOM = el.querySelector('.scroll-box')
console.log(SELECTWRAP_DOM);
let flag = true, timeoutId = null;
SELECTWRAP_DOM.addEventListener('scroll', function () {
// console.log(this.scrollHeight, this.scrollTop, this.clientHeight);
const CONDITION = this.scrollTop == 0;
if (CONDITION) {
if(flag) {
flag = false;
timeoutId && clearTimeout(timeoutId);
timeoutId = setTimeout( () => {
binding.value()
flag = true;
}, 150)
}
}
});
}
})
\ No newline at end of file
...@@ -3,13 +3,12 @@ ...@@ -3,13 +3,12 @@
*/ */
export const envConfig = { export const envConfig = {
development: { development: {
// baseUrl: 'https://dev-sc.yunqueyi.com/', baseUrl: 'https://dev-sc.yunqueyi.com',
// // baseUrl: 'http://10.177.15.180:10202/', // // baseUrl: 'http://10.177.15.180:10202/',
// // baseUrl: 'http://192.168.140.14:10201/', // // baseUrl: 'http://192.168.140.14:10201/',
// baseUrl: 'https://test1-sc.yunqueyi.com/', // baseUrl: 'https://test1-sc.yunqueyi.com',
//baseUrl: 'https://uat-sc.yunqueyi.com/', // baseUrl: 'https://uat-sc.yunqueyi.com',
baseUrl: 'https://uat-sc.yunqueyi.com',
qiniuFileUrl: "https://dev-sc.yunqueyi.com/contents/admin/qiniu/token1", qiniuFileUrl: "https://dev-sc.yunqueyi.com/contents/admin/qiniu/token1",
qiniuResourceUrl: "https://test1-videos.yunqueyi.com", qiniuResourceUrl: "https://test1-videos.yunqueyi.com",
...@@ -17,7 +16,9 @@ export const envConfig = { ...@@ -17,7 +16,9 @@ export const envConfig = {
loginUrl: 'https://dev-saas.yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://dev-saas.yunqueyi.com/pica-login/work_station.html',
//innerLoginUrl: 'http://localhost:8090/PICA_SSO_FE/html/pica_index.html', //innerLoginUrl: 'http://localhost:8090/PICA_SSO_FE/html/pica_index.html',
innerLoginUrl: 'https://dev-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'https://dev-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
yuequeyiIndexUrl: 'https://dev-saas.yunqueyi.com/pica_index.html' yuequeyiIndexUrl: 'https://dev-saas.yunqueyi.com/pica_index.html',
phomeDemain: 'https://dev-phome.yunqueyi.com',
picakfAccId: 'picakf_dev',
}, },
dev: { dev: {
baseUrl: 'https://dev-sc.yunqueyi.com', baseUrl: 'https://dev-sc.yunqueyi.com',
...@@ -26,7 +27,9 @@ export const envConfig = { ...@@ -26,7 +27,9 @@ export const envConfig = {
qiniuImgUrl: "https://test1-file.yunqueyi.com", qiniuImgUrl: "https://test1-file.yunqueyi.com",
loginUrl: 'https://dev-saas.yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://dev-saas.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://dev-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'https://dev-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
yuequeyiIndexUrl: 'https://dev-saas.yunqueyi.com/pica_index.html' yuequeyiIndexUrl: 'https://dev-saas.yunqueyi.com/pica_index.html',
phomeDemain: 'https://dev-phome.yunqueyi.com',
picakfAccId: 'picakf_dev',
}, },
test: { test: {
baseUrl: 'https://test1-sc.yunqueyi.com', baseUrl: 'https://test1-sc.yunqueyi.com',
...@@ -35,7 +38,9 @@ export const envConfig = { ...@@ -35,7 +38,9 @@ export const envConfig = {
qiniuImgUrl: "https://test1-file.yunqueyi.com", qiniuImgUrl: "https://test1-file.yunqueyi.com",
loginUrl: 'https://test1.yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://test1.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://test1-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'https://test1-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
yuequeyiIndexUrl: 'https://test1.yunqueyi.com/pica_index.html' yuequeyiIndexUrl: 'https://test1.yunqueyi.com/pica_index.html',
phomeDemain: 'https://test1-phome.yunqueyi.com',
picakfAccId: 'picakf_test',
}, },
uat: { uat: {
baseUrl: 'https://uat-sc.yunqueyi.com', baseUrl: 'https://uat-sc.yunqueyi.com',
...@@ -46,7 +51,9 @@ export const envConfig = { ...@@ -46,7 +51,9 @@ export const envConfig = {
qiniuResourceUrl: "https://test1-videos.yunqueyi.com", qiniuResourceUrl: "https://test1-videos.yunqueyi.com",
loginUrl: 'https://uat.yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://uat.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://uat-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'https://uat-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
yuequeyiIndexUrl: 'https://uat.yunqueyi.com/pica_index.html' yuequeyiIndexUrl: 'https://uat.yunqueyi.com/pica_index.html',
phomeDemain: 'https://uat-phome.yunqueyi.com',
picakfAccId: 'picakf_uat',
}, },
pro: { pro: {
baseUrl: 'https://sc.yunqueyi.com', baseUrl: 'https://sc.yunqueyi.com',
...@@ -55,6 +62,8 @@ export const envConfig = { ...@@ -55,6 +62,8 @@ export const envConfig = {
qiniuImgUrl: "https://files.yunqueyi.com", qiniuImgUrl: "https://files.yunqueyi.com",
loginUrl: 'https://yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'https://sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
yuequeyiIndexUrl: 'https://www.yunqueyi.com/pica_index.html' yuequeyiIndexUrl: 'https://www.yunqueyi.com/pica_index.html',
phomeDemain: 'https://phome.yunqueyi.com',
picakfAccId: 'picakf',
} }
} }
...@@ -24,7 +24,6 @@ service.interceptors.request.use(config => { ...@@ -24,7 +24,6 @@ service.interceptors.request.use(config => {
// } // }
return config return config
}, error => { }, error => {
// logger.debug('service.interceptors.request: ', error)
Promise.reject(error) Promise.reject(error)
}) })
...@@ -43,8 +42,6 @@ service.interceptors.response.use( ...@@ -43,8 +42,6 @@ service.interceptors.response.use(
//} //}
}, },
error => { error => {
// logger.error('err' + error)
return Promise.reject(error) return Promise.reject(error)
} }
) )
......
const vueFilter = { const vueFilter = {
liveDateFilter: (value) => { liveDateFilter: (value) => {
if (!value) return ''; if (!value) return '';
return new Date(value).format("yyyy-MM-dd hh:mm:ss"); return new Date(value).format("yyyy-MM-dd hh:mm:ss");
}, },
liveFilter: (value) => { continueTimesFilter: (value, flag) => {
if(value.liveStatus == 1){ if (!value) return '';
return '未开始' var duration = value / 1000;
} else if(value.liveStatus == 5) { var s = Math.floor(duration % 60).toString();
return '直播中' if (s.length < 2) {
}else if(value.liveStatus == 10 && value.lookBackStatus == 2){ s = '0' + s;
return '已结束(不可回看)' }
}else if(value.liveStatus == 10 && value.lookBackStatus == 1) { var m = Math.floor((duration % 3600) / 60).toString();
return '已结束(可回看)' if (m.length < 2) {
} m = '0' + m;
}, }
liveStatusFilter: (value) => { var h = Math.floor(duration / 60 / 60).toString();
if(value == 1) return "隐藏" if (h.length < 2) {
else return "发布" h = '0' + h;
}, }
liveTeacherType: (value) => { if (flag) {
let doctorName = [] return h + ':' + m + ':' + s;
if(value.length > 3) { } else {
for(let i = 0; i < 3; i++) { if (parseInt(h) >= 1) {
doctorName.push(value[i].doctorName) return h + '时' + m + '分' + s + '秒';
} } else {
return doctorName.join("、") + '...' return m + '分' + s + '秒';
}else{ }
for(let i = 0; i < value.length; i++) { }
doctorName.push(value[i].doctorName) },
} liveFilter: (value) => {
return doctorName.join("、") if (value.liveStatus == 1) {
} return '未开始'
}, } else if (value.liveStatus == 5) {
controlType: (value) => { return '直播中'
if(value == 1) { } else if (value.liveStatus == 10 && value.lookBackStatus == 2) {
return '分页1' return '已结束(不可回看)'
}else if(value == 2) { } else if (value.liveStatus == 10 && value.lookBackStatus == 1) {
return '分页2' return '已结束(可回看)'
}else if(value == 3) { }
return '图片1' },
}else if(value == 4) { liveStatusFilter: (value) => {
return '图片2' if (value == 1) return "隐藏"
}else if(value == 6) { else return "发布"
return '视频' },
} liveTeacherType: (value) => {
}, let doctorName = []
tabControlType: (value) => { if (value.length > 3) {
if(value == 3) { for (let i = 0; i < 3; i++) {
return '图片1' doctorName.push(value[i].doctorName)
}else if(value == 4) { }
return '图片2' return doctorName.join("、") + '...'
}else if(value == 6) { } else {
return '视频' for (let i = 0; i < value.length; i++) {
} doctorName.push(value[i].doctorName)
}, }
refreshType: (value) => { return doctorName.join("、")
if(value == 1) return "支持" }
else return "不支持" },
}, controlType: (value) => {
moudleType: (value) => { if (value == 1) {
if(value == 1) return "未激活" return '分页1'
else return "激活" } else if (value == 2) {
}, return '分页2'
dateFilter: (value) => { } else if (value == 3) {
if (!value) return ''; return '图片1'
return new Date(value).format("yyyy-MM-dd hh:mm"); } else if (value == 4) {
}, return '图片2'
appColumnStatusFilter: (value) => { } else if (value == 6) {
if(value == 1) return "未提交" return '视频'
else if(value == 4) return "已提交" }
}, },
statusFilter: (value) => { tabControlType: (value) => {
if(value == 1) return "已创建" if (value == 3) {
else if(value == 5) return "已发布" return '图片1'
else return "已下架" } else if (value == 4) {
}, return '图片2'
linkTypeFilter: (value) => { // 跳转类型 } else if (value == 6) {
if(value == 1) return '链接' return '视频'
else if(value == 4) return '模块' }
else return '无跳转' },
}, refreshType: (value) => {
teacherStatusFilter: (value) => { if (value == 1) return "支持"
if(value == 1) return "已下架" else return "不支持"
else return "已发布" },
}, moudleType: (value) => {
moduleTypeFilter: (value,data) => { // 模块类型 if (value == 1) return "未激活"
for(let key in data) { else return "激活"
if(value == key) { },
return data[key] dateFilter: (value) => {
} if (!value) return '';
} return new Date(value).format("yyyy-MM-dd hh:mm");
}, },
contentCreatedType: (value,data) => { appColumnStatusFilter: (value) => {
for(let i = 0; i< data.length;i++) { if (value == 1) return "未提交"
if(value == data[i].id) { else if (value == 4) return "已提交"
return data[i].name },
} statusFilter: (value) => {
} if (value == 1) return "已创建"
else if (value == 5) return "已发布"
else return "已下架"
},
linkTypeFilter: (value) => { // 跳转类型
if (value == 1) return '链接'
else if (value == 4) return '模块'
else return '无跳转'
},
teacherStatusFilter: (value) => {
if (value == 1) return "已下架"
else return "已发布"
},
moduleTypeFilter: (value, data) => { // 模块类型
for (let key in data) {
if (value == key) {
return data[key]
}
}
},
contentCreatedType: (value, data) => {
for (let i = 0; i < data.length; i++) {
if (value == data[i].id) {
return data[i].name
}
}
}, },
contentModifiedType: (value,data) => { contentModifiedType: (value, data) => {
for(var i=0; i < data.length;i++) { for (var i = 0; i < data.length; i++) {
if(value == data[i].id) { if (value == data[i].id) {
return data[i].name return data[i].name
} }
} }
}, },
columnPositionType: (value,data) => { // 位置 columnPositionType: (value, data) => { // 位置
for(let key in data) { for (let key in data) {
if(value == key) { if (value == key) {
return data[key] return data[key]
} }
} }
}, },
// 项目组件 // 项目组件
statusFileter: (value) => { statusFileter: (value) => {
if(value == 1) { if (value == 1) {
return '草稿' return '草稿'
}else if(value == 2) { } else if (value == 2) {
return '未启用' return '未启用'
}else if(value == 3) { } else if (value == 3) {
return '已启用' return '已启用'
}else { } else {
return '已禁用' return '已禁用'
} }
}, },
//项目管理 //项目管理
statusProject: (value) => { statusProject: (value) => {
if(value == 1) { if (value == 1) {
return '草稿' return '草稿'
}else if(value == 2) { } else if (value == 2) {
return '未上架' return '未上架'
}else if(value == 3) { } else if (value == 3) {
return '审批中' return '审批中'
}else if(value == 4) { } else if (value == 4) {
return '已上架' return '已上架'
}else if(value == 5) { } else if (value == 5) {
return '已下架' return '已下架'
}else { } else {
return '已拒绝' return '已拒绝'
} }
}, },
projeceRoleType: (value) => { projeceRoleType: (value) => {
if(value == "L1") { if (value == "L1") {
return '内部管理员' return '内部管理员'
}else if(value == "L2") { } else if (value == "L2") {
return '项目负责人' return '项目负责人'
}else if(value == "L3") { } else if (value == "L3") {
return '次级负责人' return '次级负责人'
} else if(value == "L4") { } else if (value == "L4") {
return '普通用户' return '普通用户'
} }
}, },
// 问卷 // 问卷
questionStatus: (value) => { questionStatus: (value) => {
if(value == 1) { if (value == 1) {
return '下线' return '下线'
}else { } else {
return '上线' return '上线'
} }
}, },
modifyType: (value,data) => { modifyType: (value, data) => {
let userName = '' let userName = ''
for(let i=0; i < data.length;i++) { for (let i = 0; i < data.length; i++) {
if(value == data[i].id) { if (value == data[i].id) {
userName = data[i].userName userName = data[i].userName
break break
}else { } else {
userName = '' userName = ''
} }
} }
return userName return userName
} },
// 时间处理
timeFormat: (value) => {
let cTime = new Date().getTime();
// var $time = document.getElementById("share-time");
// var date = $time.innerHTML.trim();
var tt = new Date(parseInt(value));
var days = parseInt((cTime - value) / 86400000);
var today = new Date().getDate();
var year = tt.getFullYear();
var mouth = tt.getMonth() + 1;
var day = tt.getDate();
var time = tt.getHours() < 10 ? "0" + tt.getHours() : tt.getHours();
var min = tt.getMinutes() < 10 ? "0" + tt.getMinutes() : tt.getMinutes();
var result, offset;
offset = Math.abs(today - day);
if (days < 4 && offset < 4) {
if (offset === 0) {
result = "今天" + time + ":" + min;
} else if (offset === 1) {
result = "昨天" + time + ":" + min;
} else if (offset === 2) {
result = "前天" + time + ":" + min;
}
} else {
result = year + "-" + mouth + "-" + day + " " + time + ":" + min;
}
// $time.innerHTML = result;
return result;
},
// 将字符串截短至指定长度,并用在最后追加特定字符串(例如:...)
shortName: function (value, length = 10, append = '...') {
if (value && value.length > length) {
return value.substring(0, length) + append
} else {
return value
}
},
} }
export default vueFilter export default vueFilter
\ No newline at end of file
...@@ -42,36 +42,10 @@ function getUrlParmByCode(paramList) { ...@@ -42,36 +42,10 @@ function getUrlParmByCode(paramList) {
return '' return ''
} }
// 计算高度
export function resizeHeight(cMinusHeight = 152, iMinuxHeight = 210, refHeightId = 'sidebarWrapperId',
containerHeightId = 'appContainerId', innerHeightId = 'elTableId'){
if (!p_getElm(refHeightId) || !p_getElm(containerHeightId) || !p_getElm(innerHeightId)) {
// window.onresize = null
logger.warn('No certain dom id!!!');
}
let containerHeight = p_getElm(refHeightId).getBoundingClientRect().height - 50
p_getElm(containerHeightId).style.height = containerHeight - cMinusHeight + 'px'
p_getElm(innerHeightId).style.height = containerHeight - iMinuxHeight + 'px'
if(p_getElm('elTableIdInner')){
p_getElm('elTableIdInner').style.height = containerHeight - iMinuxHeight + 'px'
}
window.onresize = function() {
containerHeight = p_getElm(refHeightId).getBoundingClientRect().height - 50
p_getElm(containerHeightId).style.height = containerHeight - cMinusHeight + 'px'
p_getElm(innerHeightId).style.height = containerHeight - iMinuxHeight + 'px'
if (p_getElm('elTableIdInner')) {
p_getElm('elTableIdInner').style.height = containerHeight - iMinuxHeight + 'px'
}
}
}
function p_getElm(elmId) { function p_getElm(elmId) {
return document.getElementById(elmId) return document.getElementById(elmId)
} }
export function deepCopy(obj) { export function deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {}; var result = Array.isArray(obj) ? [] : {};
for (var key in obj) { for (var key in obj) {
...@@ -168,6 +142,7 @@ export function getYunQueYiUrl() { ...@@ -168,6 +142,7 @@ export function getYunQueYiUrl() {
export function uploadVideo() { export function uploadVideo() {
return getConfigByEnvType('qiniuResourceUrl') return getConfigByEnvType('qiniuResourceUrl')
} }
export function uploadImg() { export function uploadImg() {
return getConfigByEnvType('qiniuImgUrl') return getConfigByEnvType('qiniuImgUrl')
} }
...@@ -177,3 +152,14 @@ function getConfigByEnvType(urlType) { ...@@ -177,3 +152,14 @@ function getConfigByEnvType(urlType) {
return envConfig[process.env.BUILD_ENV][urlType] return envConfig[process.env.BUILD_ENV][urlType]
} }
// 获取客服的云信ID
export function getPicaKFAccid() {
return getConfigByEnvType('picakfAccId')
}
// 获取客服的云信ID
export function getPhomeDemain() {
return getConfigByEnvType('phomeDemain')
}
import {isEmptyUtils, isNotEmptyUtils, subString} from "./utils"; import {isEmptyUtils, isNotEmptyUtils, subString} from "./utils";
import fetchQiniu from './fetch-qiniu.js'; import fetchQiniu from './fetch-qiniu.js';
import { getQiniuToken1, uploadVideo, uploadImg } from './index' import { getQiniuToken1, uploadVideo, uploadImg } from './index'
import fetch from "./fetch";
const qiniu = require('qiniu-js');
let fileApiUrl = getQiniuToken1() let fileApiUrl = getQiniuToken1()
//该对象有一个 unsubscribe 方法取消订阅,同时终止上传行为。 //该对象有一个 unsubscribe 方法取消订阅,同时终止上传行为。
...@@ -109,6 +111,139 @@ const doQiniuAction1 = (fileType) => { ...@@ -109,6 +111,139 @@ const doQiniuAction1 = (fileType) => {
}); });
}; };
/**
*
* @param self
* @param file
* @param filePath
* @param previewId
* @param progressId
* @returns {Promise}
*/
export const qiniuUpload = (self, file, filePath, previewId, progressId) => {
// var deferred = $q.defer();
return new Promise(function (resolve, reject) {
if (isEmptyUtils(file) || isEmptyUtils(filePath)) {
console.error('七牛上传失败:非法参数');
reject();
}
let key = filePath ? filePath : getFilePath(file);
//修改状态为上传
self.qiniuUploadStatus = true;
// let token = "BRVB4TpxVFA5Wo6lIpfltmWKOltzGar46tvC3BlR:UHn0LDElwjP4jEZTXdq_1qV6_hw=:eyJzY29wZSI6InBpY2EtdGVzdCIsInJldHVybkJvZHkiOiJ7XCJrZXlcIjpcIiQoa2V5KVwiLFwiaGFzaFwiOlwiJChldGFnKVwiLFwiYnVja2V0XCI6XCIkKGJ1Y2tldClcIixcImZzaXplXCI6JChmc2l6ZSksXCJmbmFtZVwiOiQoZm5hbWUpLFwiZXh0XCI6JChleHQpfSIsImRlYWRsaW5lIjoxNTI5NDk0MTc1fQ==";
doQiniuAction().then(function (token) {
let putExtra = {
fname: file.name, //原文件名
params: {}, //用来放置自定义变量
mimeType: mimeTypeArray || null //null || array,用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
};
let config = {
useCdnDomain: true, //表示是否使用 cdn 加速域名,为布尔值,true 表示使用,默认为 false。
region: null //选择上传域名区域;当为 null 或 undefined 时,自动分析上传域名区域
};
/*
* qiniu.upload 返回一个 observable 对象用来控制上传行为,observable 对像通过 subscribe 方法可以被 observer 所订阅,
* 订阅同时会开始触发上传,同时返回一个 subscription 对象,该对象有一个 unsubscribe 方法取消订阅,同时终止上传行为。
* */
let observable = qiniu.upload(file, key, token, putExtra, config);
/**
* 接收上传进度信息,res 参数是一个带有 total 字段的 object,包含loaded、total、percent三个属性,提供上传进
* total.loaded: number,已上传大小,单位为字节。
* total.total: number,本次上传的总量控制信息,单位为字节,注意这里的 total 跟文件大小并不一致。
* total.percent: number,当前上传进度,范围:0~100
* */
let next = function (res) {
//res值{"total":{"loaded":18184,"size":18185,"percent":99.99450096233159}}
//获取百分比进度
let progress = res.total.percent.toFixed(2);
self.uploadProgress = Number(progress);
console.log('Progress1: ' + progress);
};
/**
* 接收上传完成后的后端返回信息,res 参数为一个 object, 为上传成功后后端返回的信息
* ,具体返回结构取决于后端sdk的配置,可参考上传策略(https://developer.qiniu.com/kodo/manual/1206/put-policy)
* */
let complete = function (res) {
console.log("七牛上传完成");
setTimeout(function(){
result.key = res.key;
result.path = '/' + res.key;
result.fullPath = domain + '/' + res.key + '?v=' + new Date().getTime();
result.size = res.fsize;
result.name = res.fname ;
result.ext = res.ext;
resolve(result);
self.qiniuUploadStatus = false;
if (isNotEmptyUtils(previewId)) {
let address = domain + result.path;
console.log('文件路径: ' + address);
//显示图片
let $img = $('<img>').attr("src", address);
let obj = $("#" + previewId);
obj.empty().append($img);
obj.css('max-width', '100%');
}
},2000);
};
/**
* 上传错误后触发,当不是 xhr 请求错误时,会把当前错误产生原因直接抛出,诸如 JSON 解析异常等;当产生 xhr 请求错误时,参数 err 为一个包含 code、message、isRequestError 三个属性的 object:
* err.isRequestError: 用于区分是否 xhr 请求错误;当 xhr 请求出现错误并且后端通过 HTTP 状态码返回了错误信息时,该参数为 true;否则为 undefined 。
* err.reqId: string,xhr请求错误的 X-Reqid。
* err.code: number,请求错误状态码,只有在 err.isRequestError 为 true 的时候才有效,可查阅码值对应说明。
* err.message: string,错误信息,包含错误码,当后端返回提示信息时也会有相应的错误信息。
* */
let error = function (err) {
//修改状态为非上传
// status = false;
self.qiniuUploadStatus = false
localStorage.removeItem('qiniuToken');
console.log("七牛上传失败,详细信息请参考:https://developer.qiniu.com/kodo/api/3928/error-responses");
//输出简略错误信息
if (err.isRequestError){
qiniuErrorCheck(err.code)
}else {
console.error(err);
}
/*modalClick("提示", "上传失败!", "确定", function () {
$('#model-modify').modal('hide');
}, "", null);*/
// deferred.reject(new Error('七牛上传失败'));
// return deferred.promise;
return reject(new Error('七牛上传失败'));
};
// 上传开始
subscription = observable.subscribe(next, error, complete);
});
// return deferred.promise;
});
};
/** /**
* 获取时间戳 * 获取时间戳
* @param {Date} [date]日期对象,为空时,返回当前时间戳 * @param {Date} [date]日期对象,为空时,返回当前时间戳
...@@ -164,7 +299,7 @@ export const getFilePath = (file,fileName,folder) => { ...@@ -164,7 +299,7 @@ export const getFilePath = (file,fileName,folder) => {
//文件全路径(文件路径 + 文件名) 扩展名​/年/月/日/ //文件全路径(文件路径 + 文件名) 扩展名​/年/月/日/
// var filePath = ext + "/" + date.format('yyyy/MM/dd') + "/" + (isEmptyUtils(folder) ? "" : (folder + "/")) + fileName; // var filePath = ext + "/" + date.format('yyyy/MM/dd') + "/" + (isEmptyUtils(folder) ? "" : (folder + "/")) + fileName;
//var filePath = ext + "/" + "common/" + file.name.split('.')[0] + '-' + timeStamp(date) + "." + suffix; //var filePath = ext + "/" + "common/" + file.name.split('.')[0] + '-' + timeStamp(date) + "." + suffix;
var filePath = ext + "/" + "protal/project/" + timeStamp(date) + "." + suffix; var filePath = ext + "/" + "admin/im/" + timeStamp(date) + "." + suffix;
console.log('filePath==============',filePath); console.log('filePath==============',filePath);
return filePath; return filePath;
...@@ -180,24 +315,16 @@ export const getFilePath = (file,fileName,folder) => { ...@@ -180,24 +315,16 @@ export const getFilePath = (file,fileName,folder) => {
* @param fileType 1--图片和文件 空为视频 * @param fileType 1--图片和文件 空为视频
* @returns {Promise} * @returns {Promise}
*/ */
export const doUpload = (self,file, filePath, previewId,progressId, fileType) => { export const doUpload = (self, file, filePath, previewId, progressId, fileType) => {
// var deferred = $q.defer();
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
if (isEmptyUtils(file) || isEmptyUtils(filePath)) { if (isEmptyUtils(file) || isEmptyUtils(filePath)) {
console.error('七牛上传失败:非法参数'); console.error('七牛上传失败:非法参数');
reject(); reject();
} }
let key = filePath ? filePath : getFilePath(file); let key = filePath ? filePath : getFilePath(file);
//修改状态为上传 //修改状态为上传
self.qiniuUploadStatus = true; self.qiniuUploadStatus = true;
// let token = "BRVB4TpxVFA5Wo6lIpfltmWKOltzGar46tvC3BlR:UHn0LDElwjP4jEZTXdq_1qV6_hw=:eyJzY29wZSI6InBpY2EtdGVzdCIsInJldHVybkJvZHkiOiJ7XCJrZXlcIjpcIiQoa2V5KVwiLFwiaGFzaFwiOlwiJChldGFnKVwiLFwiYnVja2V0XCI6XCIkKGJ1Y2tldClcIixcImZzaXplXCI6JChmc2l6ZSksXCJmbmFtZVwiOiQoZm5hbWUpLFwiZXh0XCI6JChleHQpfSIsImRlYWRsaW5lIjoxNTI5NDk0MTc1fQ==";
doQiniuAction1(fileType).then(function (token) { doQiniuAction1(fileType).then(function (token) {
let putExtra = { let putExtra = {
fname: file.name, //原文件名 fname: file.name, //原文件名
...@@ -228,34 +355,14 @@ export const doUpload = (self,file, filePath, previewId,progressId, fileType) => ...@@ -228,34 +355,14 @@ export const doUpload = (self,file, filePath, previewId,progressId, fileType) =>
//获取百分比进度 //获取百分比进度
let progress = res.total.percent.toFixed(2); let progress = res.total.percent.toFixed(2);
self.uploadProgress = Number(progress); self.uploadProgress = Number(progress);
if(progressId == 'uploadProgress1') { if(progressId == 'uploadProgress1') {
self.uploadProgress1 = Number(progress); self.uploadProgress1 = Number(progress);
} }
if(progressId == 'uploadProgress2') { if(progressId == 'uploadProgress2') {
self.uploadProgress2 = Number(progress); self.uploadProgress2 = Number(progress);
} }
console.log('Progress: ' + progress); console.log('Progress2: ' + progress);
//如果有进度条
/*if (isNotEmptyUtils(progressId)) {
let obj = $("#" + progressId);
//开始上传时,显示进度条
if (isNotEmptyUtils(obj.parent())) {
//修改状态为上传
// status = true;
self.qiniuUploadStatus = true;
obj.parent().removeClass("hidden");
obj.fadeIn("fast");
}
obj.css("width", progress + '%');
obj.text(progress + '%');
//上传完成,2秒后淡出进度条
if (progress === "100.00") {
//修改状态为非上传
// status = false;
self.qiniuUploadStatus = true;
obj.fadeOut(2000);
}
}*/
}; };
/** /**
...@@ -267,38 +374,19 @@ export const doUpload = (self,file, filePath, previewId,progressId, fileType) => ...@@ -267,38 +374,19 @@ export const doUpload = (self,file, filePath, previewId,progressId, fileType) =>
setTimeout(function(){ setTimeout(function(){
result.key = res.key; result.key = res.key;
result.path = '/' + res.key; result.path = '/' + res.key;
// result.fullPath = domain + '/' + res.key + '_' + new Date().getTime();
if(!fileType) { // 图片 文件 if(!fileType) { // 图片 文件
console.log('---domain-------',domain)
result.fullPath = domain + '/' + res.key; result.fullPath = domain + '/' + res.key;
}else{ // 视频 }else{ // 视频
console.log('----domain1------',domain1)
result.fullPath = domain1 + '/' + res.key; result.fullPath = domain1 + '/' + res.key;
} }
result.size = res.fsize; result.size = res.fsize;
result.name = res.fname ; result.name = res.fname ;
result.ext = res.ext; result.ext = res.ext;
// deferred.resolve(result);
resolve(result); resolve(result);
// self.model.qCloudUrl = result.fullPath;
// $("#introVideoLecture").attr("src", self.model.qCloudUrl);
//修改状态为非上传
// status = false;
self.qiniuUploadStatus = false; self.qiniuUploadStatus = false;
// if (isNotEmptyUtils(previewId)) {
// let address = domain + result.path;
// console.log('文件路径: ' + address);
// //显示图片
// let uplodImg = $('<img>').attr("src", address);
// let obj = $("#" + previewId);
// obj.empty().append(uplodImg);
// obj.css('max-width', '100%');
// }
},500); },500);
}; };
/** /**
...@@ -320,12 +408,6 @@ export const doUpload = (self,file, filePath, previewId,progressId, fileType) => ...@@ -320,12 +408,6 @@ export const doUpload = (self,file, filePath, previewId,progressId, fileType) =>
}else { }else {
console.error(err); console.error(err);
} }
/*modalClick("提示", "上传失败!", "确定", function () {
$('#model-modify').modal('hide');
}, "", null);*/
// deferred.reject(new Error('七牛上传失败'));
// return deferred.promise;
return reject(new Error('七牛上传失败')); return reject(new Error('七牛上传失败'));
}; };
...@@ -334,9 +416,11 @@ export const doUpload = (self,file, filePath, previewId,progressId, fileType) => ...@@ -334,9 +416,11 @@ export const doUpload = (self,file, filePath, previewId,progressId, fileType) =>
}); });
// 保存到全局对象
// return deferred.promise; window.QNSubscription = subscription;
}); });
}; };
// 取消上传
export const unsubscribe = () => {
subscription.unsubscribe();
}
...@@ -7,11 +7,14 @@ export const containObject = function(...obj1) { ...@@ -7,11 +7,14 @@ export const containObject = function(...obj1) {
// 获取页面自适应高度 // 获取页面自适应高度
export function resizeHeight(cMinusHeight = 152, iMinuxHeight = 210, refHeightId = 'slidebar-container', export function resizeHeight(cMinusHeight = 152, iMinuxHeight = 210, refHeightId = 'slidebar-container',
containerHeightId = 'screenSet'){ containerHeightId = 'screenSet'){
let containerHeight = p_getElm(refHeightId).getBoundingClientRect().height - 15 // let containerHeight = p_getElm(refHeightId).getBoundingClientRect().height - 15;
p_getElm(containerHeightId).style.height = containerHeight - cMinusHeight + 'px' let containerHeight = document.body.clientHeight - 80;
p_getElm(containerHeightId).style.height = containerHeight - cMinusHeight + 'px';
window.onresize = function() { window.onresize = function() {
containerHeight = p_getElm(refHeightId).getBoundingClientRect().height - 15 if(p_getElm(refHeightId) && p_getElm(containerHeightId)) {
p_getElm(containerHeightId).style.height = containerHeight - cMinusHeight + 'px' containerHeight = p_getElm(refHeightId).getBoundingClientRect().height - 15;
p_getElm(containerHeightId).style.height = containerHeight - cMinusHeight + 'px';
}
} }
} }
...@@ -780,3 +783,36 @@ export const setOptionLabel = (self,selfModel,selfEId,selfEName,list,listEId,lis ...@@ -780,3 +783,36 @@ export const setOptionLabel = (self,selfModel,selfEId,selfEName,list,listEId,lis
} }
return; return;
}; };
// 将文件大小B转为MB
export const betaHandle = (limit) => {
var size = "";
if(limit < 1024){ //小于0.1KB,则转化成B
size = limit + "B"
}else if(limit < (1024 * 1024)){ //小于0.1MB,则转化成KB
size = (limit/1024).toFixed(0) + "KB"
}else if(limit < (1024 * 1024 * 1024)){ //小于0.1GB,则转化成MB
size = (limit/(1024 * 1024)).toFixed(1) + "MB"
}else{ //其他转化成GB
size = (limit/(1024 * 1024 * 1024)).toFixed(1) + "GB"
}
return size;
}
//转换年月日方法
export const timeHandle = (str) => {
let date = new Date(str * 1);
let Y = date.getFullYear() + '-';
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
let D = change(date.getDate()) + ' ';
let h = change(date.getHours()) + ':';
let m = change(date.getMinutes());
return Y + M + D + h + m
}
//补0操作
const change = (num) => {
if(parseInt(num) < 10){
num = '0'+ num;
}
return num;
}
\ No newline at end of file
<template>
<div class="chain-history-detail">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond" :jumPathThird="jumPathThird"></bread-crumb>
<div class="component-content screenSet" id="screenSet">
<div class="title">群发标题:<span>{{detailData.title}}</span></div>
<div class="user-list">目标用户:<span @click="downFile">{{detailData.fileName}}</span></div>
<div class="msg-container" v-for="(item, index) in detailData.contentModelList" :key="index">
<div v-if="item.type == 0" class="text-content">
<div>{{item.info}}</div>
</div>
<div v-if="item.type == 1" class="img-content" v-viewer>
<img :src="item.url" />
<!-- <img-size :imgData="item"></img-size> -->
</div>
<div v-if="item.type == 2" class="file-content">
<div class="file-con" @click="openPDF(item.url)">
<div class="file-left">
<span class="name">{{item.info | shortName(23)}}</span>
<span class="size">{{item.fileSize}}</span>
</div>
<div class="file-right">
<img src="../../../assets/image/IM/icon-pdf.png" alt />
</div>
</div>
</div>
<div v-if="item.type == 3" class="link-content">
<div class="link-text">{{item.info}}</div>
</div>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from "@/components/breadcrumb.vue";
import ImgSize from "@/components/IM/img-size.vue";
import { doUpload, getFilePath } from "@/utils/qiniu-util";
import { openLoading, closeLoading, betaHandle } from "@/utils/utils";
import * as commonUtil from "@/utils/utils";
export default {
components: {
BreadCrumb,
ImgSize
},
data() {
return {
jumPathThird: '/chain-history-list',
curmbFirst: "历史群发",
curmbSecond: "任务详情",
detailData: {
title: '',
fileName: '',
contentModelList: []
},
historyId: '',
};
},
created() {
this.historyId = this.$route.query.id;
},
// 挂载到Dom完成时
mounted() {
commonUtil.resizeHeight();
this.getData();
},
methods: {
// 获取历史群发数据
getData() {
this.loading = true;
let url = `/im/group/info/${this.historyId}`
this.GET(url).then(res => {
this.loading = false;
if (res.code == "000000") {
this.detailData = res.data;
this.detailData.contentModelList.map((item) => {
if(item.type == 2) {
item.fileSize = betaHandle(item.fileSize);
}
})
}
});
},
// 下载目标文件
downFile() {
let a = document.createElement('a');
a.setAttribute('href', this.detailData.fileUrl);
a.click();
},
// 打开PDF
openPDF(url) {
window.open(url, "__blank");
}
}
};
</script>
<style lang="scss" scoped>
.chain-history-detail {
.component-content {
padding: 24px 32px;
background: #fff;
overflow: auto;
.title {
font-size: 14px;
color: #000;
padding: 0 5px 10px 0;
}
.user-list {
font-size: 14px;
color: #000;
padding: 0 5px 20px 0;
border-bottom: 1px solid #F0F1F2;
span {
color: #0D9078;
}
}
.text-content {
padding: 16px 0;
color: #333333;
border-bottom: 1px solid #F0F1F2;
}
.img-content {
padding: 16px 0;
border-bottom: 1px solid #F0F1F2;
cursor: pointer;
& > img {
width: 170px;
height: 108px;
border-radius: 8px;
}
}
.file-content {
padding: 16px 0;
border-bottom: 1px solid #F0F1F2;
.file-con {
display: flex;
flex-direction: row;
max-width: 260px;
text-align: left;
padding: 10px 15px;
background: #f0f1f2;
border-radius: 8px;
cursor: pointer;
.file-left {
display: flex;
flex-direction: column;
justify-content: space-around;
width: 231px;
.name {
font-size: 13px;
color: #333333;
}
.size {
font-size: 12px;
color: #999999;
}
}
.file-right {
width: 36px;
height: 44px;
& > img {
width: 36px;
height: 100%;
border-radius: 3px;
}
}
}
}
.link-content {
padding: 16px 0;
color: #2f86f6;
border-bottom: 1px solid #F0F1F2;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="chain-history-wrap">
<div class="component-content screenSet" id="screenSet">
<el-row :gutter="30" class="row" type="flex" style="margin-top: 10px;margin-right:0px;">
<el-form ref="serchForm" inline :model="searchParam" label-width="15px" style="width:100%;text-align:right;">
<el-form-item label="">
<el-input clearable v-model="searchParam.messageLogId" size="mini" placeholder="请输入任务编号" @change="search(1)">
<el-button slot="append" icon="el-icon-search"></el-button>
</el-input>
</el-form-item>
<el-form-item label="" style="position:relative;top:-8px;left:0;margin-bottom: 0px;">
<el-date-picker
v-model="date"
size="mini"
type="date"
placeholder="请选择日期"
@change="search(1)"></el-date-picker>
</el-form-item>
</el-form>
</el-row>
<el-table :data="tableData" style="width: 100%" v-loading="loading">
<el-table-column prop="id" label="任务ID" min-width="50" align="center"></el-table-column>
<el-table-column prop="title" label="任务名" min-width="100" align="center"></el-table-column>
<el-table-column prop="totalNumber" label="群发人数" min-width="50" align="center"></el-table-column>
<el-table-column label="发送日期" min-width="100" align="center">
<template slot-scope="scope">
<span>{{scope.row.createdTime | dateFilter}}</span>
</template>
</el-table-column>
<el-table-column prop="createdName" label="发送者" min-width="50" align="center"></el-table-column>
<el-table-column label="发送状态" min-width="50" align="center">
<template slot-scope="scope">
<span>{{scope.row.status | statusFilter}}</span>
</template>
</el-table-column>
<el-table-column label="任务详情" fixed="right" align="center" min-width="100">
<template slot-scope="scope">
<el-button type="text" size="small" @click="edit(scope.row)">查看</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../../assets/image/no-content1.png" />
<p>没有查询到相关结果</p>
</div>
</div>
</el-table>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchParam.pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000, 1500, 2000]"
:page-size="searchParam.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from "@/components/breadcrumb.vue";
import { doUpload, getFilePath } from "@/utils/qiniu-util";
import { validateWord } from "@/utils/validate.js";
import { openLoading, closeLoading } from "@/utils/utils";
import * as commonUtil from "@/utils/utils";
let vm = null;
export default {
data() {
return {
searchParam: {
chooseDate: '',
messageLogId: '',
pageNo: 1,
pageSize: 15
},
tableData: [],
totalRows: 0,
loading: false,
date: ''
};
},
computed: {},
filters: {
dateFilter(val) {
return new Date(val).format("yyyy-MM-dd")
},
statusFilter(index) {
let str = "";
if (index == 1 || index == 0) {
str = "发送中";
} else if (index == 2) {
str = "已发送";
} else if (index == 3) {
str = "发送失败";
}
return str;
}
},
created() {
},
// 挂载到Dom完成时
mounted() {
commonUtil.resizeHeight(92);
this.search();
},
methods: {
// 列表查询
search(a) {
if(a) this.searchParam.pageNo = 1;
this.loading = true;
this.searchParam.chooseDate = this.date ? new Date(this.date).getTime() : '';
const {pageNo, pageSize, chooseDate, messageLogId} = this.searchParam;
let url = `/im/group/list?pageNo=${pageNo}&pageSize=${pageSize}&chooseDate=${chooseDate}&messageLogId=${messageLogId}`;
this.GET(url).then(res => {
this.loading = false;
if (res.code == "000000") {
this.tableData = res.data.list;
this.totalRows = res.data.total;
}
});
},
// 查看消息详情
edit(row) {
this.$router.push({ path: `/chain-history-detail`,query: {id: row.id}});
},
handleSizeChange(value) {
this.searchParam.pageSize = value;
this.search();
},
handleCurrentChange(value) {
this.searchParam.pageNo = value;
this.search();
}
}
};
</script>
<style lang="scss" scoped>
.chain-history-wrap {
margin-top: -60px;
.component-content {
padding: 10px;
background: #fff;
// margin: 84px 20px 20px;
overflow: auto;
.search-title {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 10px 12px;
font-size: 12px;
margin-bottom: 20px;
border-bottom: 1px solid #efefef;
.num {
color: #449284;
}
}
.create-button {
padding: 0 0 15px;
margin-top: 0 !important;
text-align: right;
}
.table-empty {
img {
width: 100px;
}
p {
margin-top: -50px;
}
}
}
}
</style>
\ No newline at end of file
<template>
<div class="chain-message-wrap">
<div class="component-content" id="screenSet">
<div class="search-title">
<p>群发消息</p>
</div>
<el-form class="form" ref="form" :model="searchParam">
<el-form-item label="群发标题">
<el-input clearable v-model="searchParam.title" size="mini" maxlength="20" placeholder="请输入群发标题" style="width: 300px;"></el-input>
</el-form-item>
<el-form-item label="目标用户">
<el-input clearable v-model="excelfileName" readonly size="mini" placeholder="请上传目标用户" style="width: 300px;"></el-input>
<el-upload
class="upload-demo"
accept=".xlsx"
action="#"
:before-upload="uploadUserFile"
>
<el-button type="default" size="mini">
<img src="../../../assets/image/IM/upload.png"/>
<span>上传列表</span>
</el-button>
</el-upload>
</el-form-item>
<div class="user-list" @click="downTemplate">
<img src="../../../assets/image/IM/down.png"/>
<span>用户列表模板.xsls</span>
</div>
<div class="content-container" v-for="(item, index) in searchParam.contentModelList" :key="index">
<div class="text-content" v-if="item.type === 0">
<p>文本信息<i class="el-icon-error" @click="deleteText(item,index)"></i></p>
<el-input
:autosize="{ minRows: 4 }"
type="textarea"
clearable
v-model="item.info"
size="mini"
maxlength="499"
show-word-limit
placeholder="请输入文本信息"
style="width: 600px;"></el-input>
</div>
<div class="file-content" v-if="item.type == 1 || item.type == 2">
<p>文件信息<i class="el-icon-error" @click="deleteFile(item,index)"></i></p>
<el-input v-model="item.info" readonly size="mini" placeholder="请上传文件信息" style="width: 300px;"></el-input>
<el-upload
class="upload-demo"
action="#"
accept="image/jpeg,image/jpg,image/png,application/pdf"
:before-upload="uploadImportFile">
<el-button type="default" size="mini" @click="getFileIndex(index)">
<img src="../../../assets/image/IM/upload.png"/>
<span>上传文件</span>
</el-button>
</el-upload>
</div>
<div class="link-content" v-if="item.type == 3">
<p>链接<i class="el-icon-error" @click="deleteLink(item,index)"></i></p>
<el-select clearable v-model="item.info" size="mini" placeholder="请选择链接" style="width: 300px;">
<el-option
v-for="item in linkList"
:key="item.id"
:label="item.title"
:value="item.title">
</el-option>
</el-select>
</div>
</div>
</el-form>
<div class="content-type">
<el-button type="default" size="mini" @click="addText">
<img src="../../../assets/image/IM/file-text.png"/>
<span>文本</span>
</el-button>
<el-button type="default" size="mini" @click="addFile">
<img src="../../../assets/image/IM/folder-open.png"/>
<span>文件</span>
</el-button>
<el-button type="default" size="mini" @click="addLink">
<img src="../../../assets/image/IM/link.png"/>
<span>链接</span>
</el-button>
</div>
<el-button class="confirm-btn" size="mini" @click="confirmSubmit">确认群发</el-button>
</div>
</div>
</template>
<script>
import BreadCrumb from "@/components/breadcrumb.vue";
import { doUpload, getFilePath } from "@/utils/qiniu-util";
import { openLoading, closeLoading, isEmptyUtils } from "@/utils/utils";
import { getPicaKFAccid, getPhomeDemain } from "@/utils";
import * as commonUtil from "@/utils/utils";
export default {
components: {
BreadCrumb
},
data() {
return {
excelfileName:'',
fileName: '',
contentList: [],
searchParam: {
title: '',
fileModel: {},
contentModelList: []
},
linkList: [],
templateFileUrl: '',
fileIndex: 0
};
},
created() {
},
// 挂载到Dom完成时
mounted() {
commonUtil.resizeHeight(92);
this.getFiveContentList();
},
methods: {
// 上传列表
uploadUserFile(file) {
let _this = this;
let arr = file.type.split("/");
let ext = "." + arr[1];
let name = file.name;
let reader = new FileReader();
reader.onload = function(e) {
let fileJson = {
fileName: file.name,
file: e.target.result.substr(e.target.result.indexOf("base64,") + 7),
ext: ext
};
let fileArray = {
type: "",
base64: fileJson
};
_this.excelfileName = file.name;
_this.searchParam.fileModel = fileArray;
}
reader.readAsDataURL(file);
},
// 下载用户模板
downTemplate() {
let a = document.createElement('a');
this.templateFileUrl = 'https://file.yunqueyi.com/im/group/%E7%94%A8%E6%88%B7%E5%88%97%E8%A1%A8%E6%A8%A1%E6%9D%BF.xlsx';
a.setAttribute('href', this.templateFileUrl);
a.click();
},
// 添加文本
addText() {
if(this.searchParam.contentModelList.length < 5) {
this.searchParam.contentModelList.push({
type: 0, // 0 文本 1图片 2PDF 3链接
info: ''
})
}else {
this.$message({
message: '添加内容数不能大于5',
type: 'warning'
});
}
},
// 删除文本
deleteText(item, index) {
this.searchParam.contentModelList.splice(index, 1)
},
// 添加文件
addFile() {
if(this.searchParam.contentModelList.length < 5) {
this.searchParam.contentModelList.push({
type: 1,
info: '',
url: '',
width: 0,
height: 0
})
}else {
this.$message({
message: '添加内容数不能大于5',
type: 'warning'
});
}
},
// 上传文件
getFileIndex(index) {
this.fileIndex = index;
},
uploadImportFile(file) {
let _this = this;
const isLt5M = file.size / 1024 / 1024 < 5;
if (!isLt5M) {
this.$message.error('上传文件不能超过5MB!');
return isLt5M
}
_this.searchParam.contentModelList[this.fileIndex].info = file.name;
if(file.type == 'image/png' || file.type == 'image/jpg' || file.type == "image/jpeg") {
_this.searchParam.contentModelList[this.fileIndex].type = 1; // 图片
let imgFile = new FileReader();
imgFile.readAsDataURL(file);
imgFile.onload = function(theFile) {
let image = new Image();
image.src = theFile.target.result;
image.onload = function() {
let cox = this;
_this.searchParam.contentModelList[_this.fileIndex].width = cox.width;
_this.searchParam.contentModelList[_this.fileIndex].height = cox.height;
}
}
}else if(file.type == 'application/pdf') {
_this.searchParam.contentModelList[this.fileIndex].type = 2; // pdf
}
_this.searchParam.contentModelList[this.fileIndex].fileSize = file.size;
doUpload(_this, file, getFilePath(file,null), 'preview4', 'progress1', 1).then( path => {
_this.fileName = file.name;
_this.searchParam.contentModelList[this.fileIndex].url = path.fullPath;
});
},
// 删除文件
deleteFile(item, index) {
this.searchParam.contentModelList.splice(index, 1)
},
// 添加链接
addLink() {
if(this.searchParam.contentModelList.length < 5) {
this.searchParam.contentModelList.push({
type: 3,
info: '',
url: ''
})
}else {
this.$message({
message: '添加内容数不能大于5',
type: 'warning'
});
}
},
// 获取积木列表
getFiveContentList() {
this.GET(
"/contents/admin/template/queryTemplate?publishFlag=5&pageNo=1&pageSize=99999"
).then(res => {
if (res.code === "000000") {
this.linkList = res.data.templateList || [];
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 删除链接
deleteLink(item, index) {
this.searchParam.contentModelList.splice(index, 1)
},
// 确认群发
confirmSubmit() {
this.loading = true;
let req = this.searchParam;
for(let i = 0; i < req.contentModelList.length; i++) {
if(req.contentModelList[i].type == 3) {
this.linkList.forEach((element, index) => {
if(element.title == req.contentModelList[i].info) {
req.contentModelList[i].url = getPhomeDemain() + `/template_v2/?id=${element.id}`;
}
});
}
}
if(!req.title) {
this.$message({
message: '请输入标题',
type: 'warning'
});
return
}
if(isEmptyUtils(req.fileModel.base64)) {
this.$message({
message: '请上传人员名单',
type: 'warning'
});
return
}
if(req.contentModelList.length < 1) {
this.$message({
message: '请输入群发内容',
type: 'warning'
});
return
}else {
let list = req.contentModelList;
for(let i = 0; i < list.length; i++) {
if(!list[i].info) {
this.$message({
message: '请输入群发内容',
type: 'warning'
});
return
}
}
}
this.$confirm('点击“确定”,将开始执行群发任务,请务必确认内容无误', '群发确认', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.POST("/im/group/messages", req).then(res => {
this.loading = false;
if(res.code == '000000') {
if (res.data.status == 1) {
this.searchParam.title = "";
this.searchParam.fileModel = {};
this.searchParam.contentModelList = [];
this.excelfileName = '';
this.$message({
message: '群发成功',
type: 'success'
});
}else {
this.$message({
message: res.data.message,
type: 'error'
});
}
}
});
})
}
}
};
</script>
<style lang="scss">
.chain-message-wrap {
.component-content {
margin: 20px 20px 0;
padding: 10px;
background: #fff;
overflow: auto;
.search-title {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 10px 12px;
font-size: 12px;
margin-bottom: 20px;
p {
font-size: 16px;
color: #000;
}
}
.form {
padding: 0 10px;
}
.el-form-item .el-form-item__label{
float: none !important;
line-height: 20px;
}
.user-list {
display: inline;
margin-top: -10px;
img {
width: 12px;
height: 12px;
}
span{
color: #1890FF;
font-size: 14px;;
}
}
.upload-demo {
display: inline-block;
button {
position: relative;
width: 104px;
img {
position: absolute;
left: 18%;
top: 17%;
}
span {
padding-left: 10px;
}
}
}
.text-content, .file-content, .link-content {
margin: 10px 0 25px;
font-size: 14px;
color: #000;
opacity: 0.85;
p{
margin-bottom: 10px;
i {
color: #979899;
font-size: 14px;
padding-left: 8px;
}
}
}
.content-type {
margin-top: 20px;
margin-bottom: 20px;
padding: 0 10px;
button {
position: relative;
width: 84px;
img {
position: absolute;
left: 22%;
top: 17%;
}
span {
padding-left: 10px;
}
}
}
.confirm-btn {
margin: 0 10px;
background: #449284;
color: #fff;
}
}
}
</style>
\ No newline at end of file
.current-session-wrap {
.component-content {
display: flex;
flex-direction: row;
// min-height: 600px;
min-width: 1200px;
font-size: 14px;
.left {
width: 270px;
// padding: 0 25px 15px;
border-right: 2px solid #f5f5f5;
.l-header {
display: flex;
flex-direction: row;
height: 52px;
justify-content: space-between;
align-items: center;
padding: 0 25px;
& > span:first-child {
font-size: 16px;
}
& > span:last-child {
color: #0d9078;
cursor: pointer;
}
}
.c-num {
padding: 0 25px;
height: 40px;
line-height: 40px;
background: #fffbe6;
}
.session-list {
width: 100%;
height: 100%;
overflow: scroll;
& > .item {
width: 100%;
display: flex;
height: 72px;
flex-direction: row;
align-items: center;
padding: 0 25px;
cursor: pointer;
.img-wrapper {
// position: relative;
// top: 0;
// left: 0;
width: 40px;
height: 40px;
margin-right: 10px;
img {
width: 100%;
height: 100%;
border-radius: 20px;
}
}
& > .desc {
flex: 1;
.top {
display: flex;
flex-direction: row;
justify-content: space-between;
.name {
}
}
.bottom {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
font-size: 12px;
color: #999999;
.num {
display: inline-block;
min-width: 16px;
padding: 2px 4px;
border-radius: 8px;
text-align: center;
color: #ffffff;
background: #ff4d4f;
}
& > img {
display: block;
width: 15px;
height: 15px;
padding: 2px 0 2px 4px;
}
}
}
&.current {
background: #f8f9fa;
}
}
}
}
.center {
flex: 1;
.c-header {
padding: 0 25px;
height: 56px;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
border-bottom: 2px solid #f5f5f5;
& > .c-header-l {
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
& > img {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 12px;
margin-right: 8px;
}
& > .name {
margin-right: 25px;
color: #333333;
}
& > .time-tip {
font-size: 12px;
color: #999999;
}
}
.close-btn {
width: 100px;
color: #c7c8c9;
cursor: pointer;
}
}
.msg-content {
// width: 100%;
// height: 650px;
word-break: break-all;
overflow: scroll;
display: flex;
flex-direction: column;
margin: 10px 20px;
.msg-item {
display: flex;
flex-direction: row;
margin: 12px 0;
.msg-item-img {
width: 44px;
height: 44px;
margin-right: 8px;
& > img {
width: 100%;
height: 100%;
border-radius: 22px;
}
}
.msg-item-detail {
display: flex;
flex-direction: column;
text-align: left;
font-size: 13px;
& > :first-child {
color: #999999;
margin-bottom: 8px;
}
.send-warpper {
display: flex;
flex-direction: row;
align-items: center;
& > .icon {
width: 20px;
height: 20px;
margin-right: 10px;
}
.mid-text-wrapper {
display: flex;
flex-direction: row;
align-items: center;
& > img {
width: 18px;
height: 18px;
margin-right: 8px;
cursor: pointer;
}
}
.mid-text {
padding: 12px 24px;
display: inline-block;
max-width: 520px;
border-radius: 8px;
background: #ebf5fc;
text-align: justify;
color: #333333;
&.no-support {
display: flex;
align-items: center;
& > img {
width: 14px;
height: 14px;
margin-right: 3px;
}
}
}
.link {
color: #2f86f6;
}
& > .mid-pdf {
width: 260px;
display: flex;
flex-direction: row;
justify-content: space-between;
text-align: left;
padding: 10px 15px;
background: #f0f1f2;
border-radius: 8px;
min-height: 80px;
cursor: pointer;
.midp-left {
display: flex;
flex-direction: column;
justify-content: space-around;
margin-right: 10px;
.name {
font-size: 13px;
color: #333333;
word-break: break-word;
}
.size {
font-size: 12px;
color: #999999;
}
}
.midp-icon {
width: 36px;
height: 44px;
& > img {
width: 36px;
height: 100%;
border-radius: 3px;
}
}
}
& > .mid-img {
display: flex;
flex-direction: row;
align-items: center;
cursor: pointer;
// & > .icon {
// width: 20px;
// height: 20px;
// }
& > .img {
width: 170px;
height: 108px;
border-radius: 8px;
}
}
}
}
&.cr {
flex-direction: row-reverse;
.msg-item-img {
margin-right: 0;
margin-left: 8px;
}
.msg-item-detail {
text-align: right;
& > .mid-text {
background: #f0f1f2;
}
}
}
}
.split-line {
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
margin: 15px 0;
font-size: 14px;
color: #999999;
&::before {
flex: 1;
content: '';
height: 1px;
margin-right: 18px;
background: #f0f1f2;
}
&::after {
flex: 1;
content: '';
height: 1px;
margin-left: 18px;
background: #f0f1f2;
}
}
.error-mg {
display: inline-block;
max-width: 520px;
// height: 24px;
max-width: 520px;
line-height: 16px;
text-align: left;
border-radius: 20px;
opacity: 0.45;
margin: -2px 0 10px;
padding: 4px 12px;
color: #FFFFFF;
background: #000000;
margin-left: 50px;
&.mr {
margin-left: 0;
margin-right: 50px;
}
}
}
.c-bottom {
position: relative;
top: 0;
left: 0;
display: flex;
flex-direction: row;
margin: 16px 12px 16px 25px;
.cb-icon-wrapper {
position: absolute;
top: 0;
right: 70px;
display: flex;
align-items: center;
height: 44px;
img {
width: 20px;
height: 20px;
margin-right: 16px;
cursor: pointer;
}
}
.send-btn {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
width: 60px;
height: 44px;
background: #f3f6f7;
margin-left: 12px;
border-radius: 8px;
cursor: pointer;
& > img {
width: 24px;
height: 24px;
}
&.active {
background: #0d9078;
}
}
}
&.no-content {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
img {
display: block;
width: 120px;
height: 100px;
}
p {
margin-top: 10px;
font-size: 14px;
color: rgba(0, 0, 0, 0.65);
}
}
}
.right {
width: 240px;
border-left: 2px solid #f5f5f5;
}
background: #fff;
.time {
color: #999999;
}
.small {
font-size: 12px;
}
.ld{
-webkit-transition-property: -webkit-transform;
-webkit-transition-duration: 1s;
-moz-transition-property: -moz-transform;
-moz-transition-duration: 1s;
-webkit-animation: rotate 3s linear infinite;
-moz-animation: rotate 3s linear infinite;
-o-animation: rotate 3s linear infinite;
animation: rotate 3s linear infinite;
}
@-webkit-keyframes rotate{from{-webkit-transform: rotate(0deg)}
to{-webkit-transform: rotate(360deg)}
}
@-moz-keyframes rotate{from{-moz-transform: rotate(0deg)}
to{-moz-transform: rotate(359deg)}
}
@-o-keyframes rotate{from{-o-transform: rotate(0deg)}
to{-o-transform: rotate(359deg)}
}
@keyframes rotate{from{transform: rotate(0deg)}
to{transform: rotate(359deg)}
}
}
}
\ No newline at end of file
<template>
<div class="current-session-wrap">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond"></bread-crumb>
<section class="component-content screenSet" id="screenSet">
<article class="left">
<div class="l-header">
<span>我的任务({{this.sessionListData.myTaskCount}})</span>
<span @click="fetchOneTask">再来一个</span>
</div>
<p class="c-num">当前等待会话:{{this.sessionListData.waitingTaskCount}}</p>
<!-- <ul id="sessionListId" class="session-list" :style="{'height': containerHeight + 'px'}"> -->
<ul id="sessionListId" class="session-list">
<li
class="item"
:class="{'current': currentTaskLogId == session.taskLogId}"
v-for="(session, index) in sessionListData.sessionList"
:key="index"
@click="selectSession(session, index)"
>
<div class="img-wrapper">
<img :src="session.avatarImageUrl" alt />
</div>
<div class="desc">
<div class="top">
<span class="name">{{session.toName}}</span>
<span class="time small">{{session.timestampStr}}</span>
</div>
<div class="bottom">
<span>{{session.text | shortName}}</span>
<!-- <span>{{session.lastMsgContent}}</span> -->
<span
v-show="session.status !=3 && currentTaskLogId != session.taskLogId && session.unreadCount"
class="num"
>{{session.unreadCount}}</span>
<img
v-show="session.status == 3"
src="../../../assets/image/IM/icon-exit.png"
@click.stop="closeOneTask(session)"
/>
</div>
</div>
</li>
</ul>
</article>
<article v-show="sessionListData.sessionList.length" class="center" v-loadmore="getOldMSGHistory">
<section class="c-header">
<div class="c-header-l">
<img :src="currentSession.avatarImageUrl" alt />
<span class="name">{{doctorInfo.name}}</span>
<span class="time-tip">当前会话时长:{{currentContinueTimes | continueTimesFilter}}</span>
</div>
<!-- <span class="close-btn">结束会话</span> -->
</section>
<p class="refreshText"></p>
<!-- <section
id="msgContentId"
class="msg-content scroll-box"
:style="{'height': (containerHeight - 35) + 'px'}"
> -->
<section
id="msgContentId"
class="msg-content scroll-box"
>
<article
v-for="(item, index) in messageList"
:key="index"
:style="{'text-align': item.sendOrReceive ? 'right' : 'left'}"
>
<div class="split-line" v-if="item.sessionFlag">本次会话结束</div>
<div class="msg-item" :class="{'cr': item.sendOrReceive}">
<div class="msg-item-img">
<img :src="item.avatarImg" alt />
</div>
<div class="msg-item-detail">
<span class="mid-time">{{item.timestampStr}}</span>
<div class="send-warpper">
<img
v-if="item.sendOrReceive && item.isShowErrorIcon"
class="icon"
src="../../../assets/image/IM/icon-no-send.png"
alt
/>
<img
v-if="item.sendOrReceive && item.isShowLoadingIcon"
class="icon ld"
src="../../../assets/image/IM/icon-fresh-2.png"
alt
/>
<div v-if="item.showType == 1" class="mid-text-wrapper" style="max-width: 520px;">
<!-- <img v-show="item.sendFlag" src="../../../assets/image/IM/icon-no-send.png" alt /> -->
<div class="mid-text">{{item.text}}</div>
</div>
<div v-if="item.showType == 2" class="mid-img" v-viewer>
<img class="img" :src="item.url" alt />
<!-- <img :src="item.imgUrl" alt /> -->
</div>
<div v-if="item.showType == 3" class="mid-pdf" @click="openPDF(item)">
<div class="midp-left">
<span class="name">{{item.text | shortName(23)}}</span>
<span class="size">{{fileSizeChange(item.size)}}</span>
</div>
<div class="midp-icon">
<img src="../../../assets/image/IM/icon-pdf.png" alt />
</div>
</div>
<div v-if="item.showType == 4" class="mid-text">
{{item.text}}
<span class="link">{{item.suffix}}</span>
</div>
<div v-if="item.showType == 5" class="mid-text no-support">
<img src="../../../assets/image/IM/icon-warning-circle.png" alt />
<span>该消息类型PC端暂不支持</span>
</div>
</div>
</div>
</div>
<span
v-if="item.sendOrReceive && item.isShowErrorMsg"
class="error-mg"
:class="{'mr': item.sendOrReceive}"
>{{item.errorMsg}}</span>
</article>
</section>
<section class="c-bottom">
<el-input type="textarea" placeholder="请输入内容" v-model="sendText" maxlength="499"></el-input>
<div class="cb-icon-wrapper">
<el-upload
class="bg-uploader"
action="#"
accept=".jpg, .png, .pdf"
:show-file-list="false"
:before-upload="beforeUploadFile"
>
<img src="../../../assets/image/IM/icon-folder-open.png" alt />
</el-upload>
<img src="../../../assets/image/IM/icon-link.png" @click="preSendLinkMsg" alt />
</div>
<div class="send-btn" :class="{'active': canSend}" @click="sendTextMsg">
<img v-show="canSend" src="../../../assets/image/IM/send-yes.png" alt />
<img v-show="!canSend" src="../../../assets/image/IM/send-no.png" alt />
</div>
</section>
</article>
<article v-show="sessionListData.sessionList.length" class="right">
<UserInfo :userInfo="doctorInfo" :taskLogId="currentTaskLogId"></UserInfo>
</article>
<article v-show="!sessionListData.sessionList.length" class="center no-content">
<img src="../../../assets/image/IM/no-search-list.png" alt="">
<p>任务都做完啦!休息一下吧~</p>
</article>
</section>
<!-- 选择链接弹窗 -->
<el-dialog
title="选择链接"
:show-close="true"
:visible.sync="showSelectDialog"
:close-on-click-modal="false"
width="500px"
class="link-form"
>
<el-form ref="linkFormRef" :rules="rules" :model="linkForm" label-width="100px">
<el-form-item label="普通文本">
<el-col :span="20">
<el-input v-model="linkForm.remark" size="small" maxlength="300"></el-input>
</el-col>
</el-form-item>
<el-form-item label="链接文案" prop="info">
<el-col :span="20">
<el-input v-model="linkForm.info" size="small" maxlength="100"></el-input>
</el-col>
</el-form-item>
<el-form-item label="链接地址" prop="url">
<el-col :span="20">
<el-select
size="small"
style="width: 300px"
clearable
filterable
v-model="linkForm.url"
placeholder="请选择"
>
<el-option
v-for="item in linkList"
:key="item.id"
:label="item.title"
:value="item.id"
></el-option>
</el-select>
</el-col>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer" style="text-align: right;">
<el-button size="small" @click="showSelectDialog = false">取 消</el-button>
<el-button size="small" type="primary" @click="sendLinkMsg">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { mapGetters, mapMutations } from "vuex";
import BreadCrumb from "@/components/breadcrumb.vue";
import { doUpload, getFilePath } from "@/utils/qiniu-util";
import { validateWord } from "@/utils/validate.js";
import {
openLoading,
closeLoading,
betaHandle,
} from "@/utils/utils";
import { getPicaKFAccid, getPhomeDemain } from "@/utils";
import UserInfo from "@/components/IM/user-info.vue";
// const CONTAINER_HEIGHT = 300;
const CONTAINER_HEIGHT = 700;
let forwardMsgIntervalId = null,
sessionIntervalId = null,
continueIntervalId = null,
autoCompletionIntervalId = null;
let _this = null;
export default {
components: {
BreadCrumb,
UserInfo
},
data() {
return {
curmbFirst: "云鹊客服",
curmbSecond: "当前会话",
sendText: "",
sessionListData: {
currentTimestamp: 0,
myTaskCount: 0,
sessionList: [],
waitingTaskCount: 0
},
currentContinueTimes: 0,
currentSessionIndex: 0, // 当前会话序号
currentSession: {},
currentTaskLogId: "", // 当前会话ID
currentToAccId: "",
picakfAccId: "",
historyTimestamp: 0,
realTimestamp: 0,
doctorInfo: {
name: "",
mobilePhone: "",
isShowCopyBtn: true
},
containerHeight: CONTAINER_HEIGHT,
showSelectDialog: false,
linkForm: {
remark: "",
info: "",
url: ""
},
linkList: [],
// 消息列表 showType 1: 文本; 2: 图片; 3: PDF; 4: 链接; 5: 不支持类型;
messageList: [],
rules: {
info: [
{ required: true, message: "请填写链接显示文案", trigger: "blur" }
],
url: [{ required: true, message: "请选择链接", trigger: "change" }]
}
};
},
computed: {
...mapGetters(["isFromAssignTask"]),
canSend() {
return !!this.sendText;
}
},
watch: {
// 监听消息列表的变化,添加sessionFlag(会话结束标志)
messageList: {
handler(newMsgList) {
let l = newMsgList.length;
if (l >= 2) {
for (let i = 1; i < l; i++) {
if (newMsgList[i - 1].taskLogId !== newMsgList[i].taskLogId) {
newMsgList[i].sessionFlag = true;
}
}
}
},
deep: true
},
},
created() {
_this = this;
this.picakfAccId = getPicaKFAccid();
this.kfAvatar = require("../../../assets/image/IM/kf-avatar.png");
this.getSessionList();
sessionIntervalId && clearInterval(sessionIntervalId);
sessionIntervalId = setInterval(() => {
this.getSessionList();
}, 3000);
this.getFiveContentList();
autoCompletionIntervalId && clearInterval(autoCompletionIntervalId);
autoCompletionIntervalId = setInterval(() => {
this.autoCompletionInterval();
}, 2000);
// 监听键盘的回车按键(回车时发送消息,并阻止其在textarea中的回车换行行为)
document.onkeydown = function(ev) {
var event = ev || event;
if (event.keyCode == 13) {
_this.sendTextMsg();
event.preventDefault();
}
};
},
mounted() {
this.$nextTick(() => {
_this.containerHeight = document.body.clientHeight - 80;
_this.getElmByID('screenSet').style.height =
_this.containerHeight - 152 + "px";
console.log('_this.containerHeight', _this.containerHeight);
_this.getElmByID("sessionListId").style.height = _this.containerHeight - 252 + 'px';
_this.getElmByID("msgContentId").style.height = _this.containerHeight - 287 + 'px';
});
},
methods: {
//
...mapMutations(["SET_IS_FROM_ASSIGN_TASK"]),
// 含有敏感信息的消息,自行补全提示文案
// 每30秒监测敏感信息
autoCompletionInterval() {
if(!this.messageList) return;
console.log('in autoCompletionInterval');
// 将带有loading的消息转成失败的
this.messageList.forEach( item => {
if(item.isShowLoadingIcon) {
item.isShowLoadingIcon = false;
item.isShowErrorIcon = true;
}
});
let flag = false, msg;
for(let i = 0; i < this.messageList.length; i ++) {
msg = this.messageList[i];
if(msg.isShowErrorIcon && !msg.isShowErrorMsg) {
flag = true;
break;
}
}
if(flag) {
this.getMSGForwardForAC(msg);
}
},
// 查询医生和居民的消息 - 向前查找
getMSGForwardForAC(msg) {
let session = this.currentSession;
let params = {
doctorAccId: this.currentToAccId,
includeFlag: 0,
lastClientIdServer: session.lastMsgIdClient,
lastMsgIdServer: session.lastMsgIdServer,
lastMsgTimestamp: msg.realTimestamp,
limit: 50,
patientAccId: this.picakfAccId,
unionId: ""
};
this.POST("/im/msg/forward", params).then(res => {
if (res.code === "000000") {
this.contactForwardMessage(res.data, false);
}
});
},
// 获取元素
getElmByID(elmId) {
return document.getElementById(elmId);
},
// 处理发送消息
// 1: 先将消息体直接显示在对话框中
// 2: 设置一个时间戳,以便再次找回
// 3: 保存再次发送的数据
// 4: 设置各种状态(1:isShowErrorIcon; 2:isShowLoadingIcon; 3:isShowErrorMsg)
handleSendMsg(params, sendId) {
let text = "";
let msg = Object.assign({}, params);
msg.fromAccount = this.currentToAccId;
msg.toAccount = this.picakfAccId;
// type: 0, // 类型 0文本 1图片 2pdf 3链接
msg.text = params.info || '';
msg.suffix = params.remark || '';
if(msg.type == 3) {
msg.suffix = params.info;
msg.text = params.remark || '';
}
msg.size = params.fileSize;
msg.url = params.url;
msg.showType = params.type - 0 + 1;
msg.sessionFlag = false;
msg.isShowLoadingIcon = true;
msg.isShowErrorIcon = false;
msg.isShowErrorMsg = false; // 只有在下次拉取新数据时才有可能是为ture
msg.extData = Object.assign({}, params); // 再将发送时的数据
msg.sendId = sendId; //
msg.sendOrReceive = true;
msg.avatarImg = this.kfAvatar;
msg.timestampStr = new Date().format("hh:mm");
msg.realTimestamp = this.realTimestamp;
msg.taskLogId = this.currentTaskLogId;
console.log("####msg####", msg);
this.messageList.push(msg);
this.$nextTick(() => {
var element = document.querySelector(".scroll-box");
element.scrollTop = element.scrollHeight;
});
},
// 查询医生和居民的消息历史(下拉刷新时调用)
getOldMSGHistory() {
// if(this.hasNoHistory) return;
let session = this.currentSession;
let params = {
doctorAccId: this.currentToAccId,
includeFlag: 0, // 不带本条消息
lastClientIdServer: session.lastMsgIdClient,
lastMsgIdServer: session.lastMsgIdServer,
lastMsgTimestamp: this.historyTimestamp,
limit: 20,
patientAccId: this.picakfAccId,
unionId: ""
};
this.POST("/im/msg/history", params).then(res => {
if (res.code === "000000") {
console.log("res", res);
// 将新消息合并到之前的消息中, 并且重置最后一条消息
this.convertMessageList(res.data, 3);
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 查询医生和居民的消息历史(第一次进来时就调用)
getMSGHistory(session) {
let params = {
doctorAccId: this.currentToAccId,
includeFlag: 1, // 带本条消息
lastClientIdServer: session.lastMsgIdClient,
lastMsgIdServer: session.lastMsgIdServer,
lastMsgTimestamp: session.lastMsgTime,
limit: 20,
patientAccId: this.picakfAccId,
unionId: ""
};
this.POST("/im/msg/history", params).then(res => {
if (res.code === "000000") {
this.convertMessageList(res.data, 1);
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 查询医生和居民的消息 - 向前查找
// 将获取消息列表插入到当前消息列表的最后
getMSGForward() {
let session = this.currentSession;
let params = {
doctorAccId: this.currentToAccId,
includeFlag: 0,
lastClientIdServer: session.lastMsgIdClient,
lastMsgIdServer: session.lastMsgIdServer,
lastMsgTimestamp: this.realTimestamp,
limit: 20,
patientAccId: this.picakfAccId,
unionId: ""
};
this.POST("/im/msg/forward", params).then(res => {
if (res.code === "000000") {
this.convertMessageList(res.data, 2);
if(res.data.length) {
this.readAllMsg();
}
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 转换消息格式
// 处理的消息类型只有5种:
// type == TEXT(showType:1)
// type == image 或 picture(showType:2)
// type == custom时,18: PDF文件(showType:3); 19: 链接信息(showType:4); 1 ~ 17: 不支持的消息类型(showType:5);
// directFlag 1: 第一次取数据; 2: 拼接实时消息(push); 3: 拼接历史消息(unshift);
convertMessageList(messageList, directFlag = 1) {
console.log(
"@@@@@@messageList, directFlag@@@@@",
messageList,
directFlag
);
messageList.sort((a, b) => {
return a.timestamp - b.timestamp;
});
let msg = null,
content = null,
text = "",
suffix = "",
showType = 1,
size = 0,
url = "",
cMessageList = [];
messageList.forEach((rawMsg, index) => {
text = "";
suffix = "";
showType = 1;
size = 0;
url = "";
msg = Object.assign({}, rawMsg);
msg.sendOrReceive = rawMsg.fromAccId !== this.currentToAccId;
msg.avatarImg = msg.sendOrReceive
? this.kfAvatar
: this.currentSession.avatarImageUrl;
if (msg.type.toLowerCase() == "custom") {
content = JSON.parse(msg.content);
text = content.content;
// 系统消息:消息由于违规未发送成功(可以不处理)
if (content.bizType == -1) {
showType = -1;
text = content.content;
} else if (content.bizType == 18) {
showType = 3;
text = content.name;
size = content.size;
url = content.url;
} else if (content.bizType == 19) {
showType = 4;
text = content.content;
suffix = content.suffix;
} else {
showType = 5;
}
} else if (
msg.type.toLowerCase() == "image" ||
msg.type.toLowerCase() == "picture"
) {
content = JSON.parse(msg.content);
url = content.url;
text = content.name;
showType = 2;
} else {
showType = 1;
text = msg.content;
}
msg.text = text;
msg.showType = showType;
msg.suffix = suffix;
msg.size = size;
msg.url = url;
msg.sessionFlag = false;
cMessageList.push(msg);
});
console.log("$$$$$$$converted, cMessageList$$$$$$$", cMessageList);
if (directFlag === 1) {
forwardMsgIntervalId && clearInterval(forwardMsgIntervalId);
this.messageList = cMessageList;
this.$nextTick(() => {
const scrollBoxDom = document.querySelector(".scroll-box");
scrollBoxDom.scrollTop = scrollBoxDom.scrollHeight;
});
this.currentContinueTimes =
this.sessionListData.currentTimestamp -
this.currentSession.handleStartTime;
continueIntervalId && clearInterval(continueIntervalId);
continueIntervalId = setInterval(() => {
this.currentContinueTimes += 1000;
}, 1000);
// 最新消息,要合并CUSTOM类型中,bizType是-1的数据(系统消息)
} else if (directFlag === 2) {
this.contactForwardMessage(cMessageList);
} else {
if (cMessageList.length) {
this.messageList.unshift(...cMessageList);
this.$nextTick(() => {
const scrollBoxDom = document.querySelector(".scroll-box");
scrollBoxDom.scrollTop = 1000;
});
}
}
// 重新设置历史与实时的时间戳
if (this.messageList.length) {
this.historyTimestamp = this.messageList[0].timestamp;
let timestamp = this.messageList[this.messageList.length - 1].timestamp;
if (timestamp) {
this.realTimestamp = timestamp;
}
}
// 自己发送消息时,暂时不刷新消息
if (directFlag == 1) {
forwardMsgIntervalId = setInterval(() => {
this.getMSGForward();
}, 3000);
}
this.$forceUpdate();
console.log("this.messageList", this.messageList);
},
// 接接数据
contactForwardMessage(cMessageList, canPush = true) {
let content = {},
signature = "",
msgIndex = -1,
newMsgList = [],
flag = false;
cMessageList.forEach(item => {
content = {};
signature = "";
msgIndex = -1;
newMsgList = [];
if (item.type.toLowerCase() == "custom") {
content = JSON.parse(item.content);
if (content.bizType == -1) {
signature = content.signature;
msgIndex = this.messageList.findIndex(m => {
return m.signature == signature && !m.isShowErrorMsg;
});
if (msgIndex > -1) {
flag = true;
this.messageList[msgIndex].errorMsg = content.content;
this.messageList[msgIndex].isShowErrorMsg = true;
}
this.$forceUpdate();
} else {
flag = true;
canPush && this.messageList.push(item);
}
} else {
flag = true;
canPush && this.messageList.push(item);
}
});
if (flag) {
this.$nextTick(() => {
var element = document.querySelector(".scroll-box");
if (
element.scrollTop >=
element.scrollHeight - element.offsetHeight - 300
) {
element.scrollTop = element.scrollHeight - element.offsetHeight;
}
});
}
},
// 选择一个会话
selectSession(session, index) {
// 点击当前的,不再重新请求数据
if (this.currentTaskLogId == session.taskLogId) return;
console.log("selectSession");
this.currentTaskLogId = session.taskLogId;
this.currentToAccId = session.toAccId;
this.currentSession = session;
this.currentSessionIndex = index;
// 获取当前消息列表(最新的历史消息)
this.getMSGHistory(this.currentSession);
// 获取医生信息
this.getDoctorInfo(this.currentToAccId);
// 调用全部已读
if (session.unreadCount) {
this.readAllMsg();
}
},
// 打开PDF
openPDF(item) {
window.open(item.url, "__blank");
},
// 给我一个任务吧,如果当前没有任务,则要提示
fetchOneTask() {
this.GET("/im/session/kf/fetchOneTask").then(res => {
if (res.code === "000000") {
this.SET_IS_FROM_ASSIGN_TASK(true);
this.currentTaskLogId = "";
this.getSessionList();
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 获取会话列表
getSessionList() {
this.GET("/im/session/kf/list").then(res => {
if (res.code === "000000") {
console.log("in getSessionList", res);
this.sessionListData = res.data || {
currentTimestamp: 0,
myTaskCount: 0,
sessionList: [],
waitingTaskCount: 0
};
let sLength = this.sessionListData.sessionList.length;
let cIndex = sLength - 1;
if (!this.isFromAssignTask) {
this.SET_IS_FROM_ASSIGN_TASK(false);
cIndex = 0;
}
// 第一次进入页面
if (sLength && !this.currentTaskLogId) {
// this.currentSession = this.sessionListData.sessionList[0];
// this.currentSessionIndex = 0;
this.currentSession = this.sessionListData.sessionList[cIndex];
this.currentSessionIndex = cIndex;
this.currentTaskLogId = this.currentSession.taskLogId;
this.currentToAccId = this.currentSession.toAccId;
this.getDoctorInfo(this.currentToAccId);
this.getMSGHistory(this.currentSession);
this.readAllMsg();
// 如果是点击“再来一个”或“给我一个任务吧”按钮分配的任务,则要滚动到最后
if(this.isFromAssignTask) {
this.$nextTick( () => {
let element = this.getElmByID("sessionListId");
if(element) {
element.scrollTop = element.scrollHeight;
}
})
}
}
if (sLength) {
this.convertSessions(this.sessionListData.sessionList);
this.$forceUpdate();
console.log("this.currentSession", this.currentSession);
}
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 将会话列表的数据进行处理,主要是显示文本(text)字段
convertSessions(sessions) {
let convertSessionList = [];
let text = "",
cc;
sessions.forEach((session, index) => {
if (session.lastMsgType.toLowerCase() == "custom") {
cc = JSON.parse(session.lastMsgContent);
text = cc.suffix || cc.content || cc.title || cc.name;
} else if (
session.lastMsgType.toLowerCase() == "image" ||
session.lastMsgType.toLowerCase() == "picture"
) {
text = "[图片]";
} else {
text = session.lastMsgContent;
}
session.text = text;
convertSessionList.push(session);
});
this.sessionListData.sessionList = convertSessionList;
},
// 根据云信id获取医生信息
getDoctorInfo(accId) {
this.GET(`/im/account/accid/doctorinfo?accId=${accId}`).then(res => {
if (res.code === "000000") {
this.doctorInfo = res.data || {};
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 关闭一个任务
closeOneTask(session) {
let params = {
taskLogId: session.taskLogId
};
this.POST(`/im/session/kf/closeOneTask`, params).then(res => {
if (res.code === "000000") {
console.log("in closeOneTask", res);
if (res.data == 1) {
this.currentTaskLogId = "";
this.getSessionList();
}
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 设置全部消息已读
readAllMsg() {
let fromAccount = this.currentToAccId,
toAccount = this.picakfAccId;
let params = {
fromAccount,
toAccount
};
this.POST(`/im/msg/read/all`, params).then(res => {
if (res.code === "000000") {
this.currentSession.unreadCount = 0;
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 根据字段名及其值,从数组中查找对象
findItemByKeyAndVal(arr, key, value, flag = 0) {
if (flag == 0) {
return arr.find(item => {
return item[key] == value;
});
} else if (flag == 1) {
return arr.findIndex(item => {
return item[key] == value;
});
}
},
// 获取积木列表
getFiveContentList() {
this.GET(
"/contents/admin/template/queryTemplate?publishFlag=5&pageNo=1&pageSize=99999"
).then(res => {
if (res.code === "000000") {
console.log("in getFiveContentList", res);
this.linkList = res.data.templateList || [];
} else {
this.$message({
message: res.message,
type: "error"
});
}
});
},
// 上传文件
beforeUploadFile(file) {
console.log("file", file);
let fileSize = file.size / (1024 * 1024);
if (fileSize > 5) {
this.$message({
message: "请上传小于5M的文件",
type: "warning"
});
return;
}
openLoading(_this);
doUpload(
_this,
file,
getFilePath(file, null),
"preview4",
"progress",
""
).then(function(resData) {
closeLoading(_this)
let params = {};
params.fileSize = resData.size;
params.fileExt = resData.ext;
params.url = resData.fullPath;
params.info = resData.name;
params.type = 2;
// 如果是图片,则要获取其宽与高
if (
params.fileExt.toLowerCase() === ".jpg" ||
params.fileExt.toLowerCase() === ".jpeg" ||
params.fileExt.toLowerCase() === ".png"
) {
params.type = 1;
let image = new Image();
image.src = params.url;
image.onload = function() {
let _img = this;
params.width = _img.width;
params.height = _img.height;
_this.sendCommonMsg(params);
};
} else {
_this.sendCommonMsg(params);
}
});
},
// 打开发送链接弹框
preSendLinkMsg() {
this.linkForm = {
remark: "",
info: "",
url: ""
};
this.showSelectDialog = true;
},
// 发送带链接消息
sendLinkMsg() {
this.$refs["linkFormRef"].validate(valid => {
if (valid) {
let params = Object.assign({}, this.linkForm);
params.url = getPhomeDemain() + `/template_v2/?id=${params.url}`;
params.type = 3;
this.sendCommonMsg(params);
this.showSelectDialog = false;
}
});
},
// 发送文本消息
sendTextMsg() {
if (!this.canSend) return;
this.sendCommonMsg({ info: this.sendText });
this.sendText = "";
},
// 发送通用消息
async sendCommonMsg(params) {
let sendMsgParams = {
fromAccount: this.picakfAccId,
toAccount: this.currentToAccId,
fileExt: "", // 文件扩展名称图片或PDF文件)
fileSize: 0, // 文件大小(图片或PDF文件)
height: 0, // 图片高度(仅图片)
width: 0, // 图片宽度(仅图片)
info: "", // 文本内容,图片的名称,pdf的名称,链接显示内容
md5: "", // 图片或文件MD5 暂时由后台生成
remark: "", // 其他信息(链接中的前缀文案)
type: 0, // 类型 0文本 1图片 2pdf 3链接
url: "" // url地址(图片、pdf,链接)
};
params = Object.assign(sendMsgParams, params);
// 将获取新数据的定时器关闭
forwardMsgIntervalId && clearInterval(forwardMsgIntervalId);
let sendId = new Date().getTime();
this.handleSendMsg(params, sendId);
console.log("sendMsgParams", params);
await this.POST("/im/msg/sendMessage", params).then(res => {
if (res.code === "000000") {
// 校验结果:1校验通过 2校验不通过
console.log(res.data.checkFlag);
let msg = this.messageList[this.messageList.length - 1];
if(msg.sendId !== sendId) {
msg = this.getMsgBySendId(sendId);
}
if (res.data.checkFlag == 1) {
this.realTimestamp = res.data.timetag;
msg.isShowLoadingIcon = false;
msg.isShowErrorIcon = false;
msg.isShowErrorMsg = false; // 只有在下次拉取新数据时才有可能是为ture
} else {
msg.signature = res.data.signature;
msg.isShowLoadingIcon = false;
msg.isShowErrorIcon = true;
msg.isShowErrorMsg = false; // 只有在下次拉取新数据时才有可能是为ture
}
} else {
this.$message({
message: res.message,
type: "error"
});
}
}).catch( error => {
let msg = this.messageList[this.messageList.length - 1];
if(msg.sendId !== sendId) {
msg = this.getMsgBySendId(sendId);
}
msg.isShowLoadingIcon = false;
msg.isShowErrorIcon = true;
msg.isShowErrorMsg = false; // 只有在下次拉取新数据时才有可能是为ture
msg.canRepeatSend = true;
});
this.$forceUpdate();
// 重新开启定时器
forwardMsgIntervalId = setInterval(() => {
this.getMSGForward();
}, 3000);
},
// 根据sendId,查找到对应的消息
getMsgBySendId(sendId) {
console.log('------------getMsgBySendId------------');
let l = this.messageList.length, i = l - 1;
for(; i > 0; i --) {
if(this.messageList[i].sendId == sendId) {
break;
}
}
return this.messageList[i];
},
// 文件大小单位转换
fileSizeChange(val) {
return betaHandle(val);
}
},
beforeDestroy() {
console.log("in beforeDestroy", forwardMsgIntervalId);
sessionIntervalId && clearInterval(sessionIntervalId);
forwardMsgIntervalId && clearInterval(forwardMsgIntervalId);
autoCompletionIntervalId && clearInterval(autoCompletionIntervalId);
console.log("in beforeDestroy", forwardMsgIntervalId);
}
};
</script>
<style lang="scss" scoped>
@import "./index.scss";
</style>
\ No newline at end of file
<template>
<div class="search-msg-detail">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond" :jumPathThird="jumPathThird"></bread-crumb>
<div class="detail-content">
<div id="scroll-set">
<div class="item-content" v-for="(item, index) in detailData" :key="index">
<div class="split-line" v-if="item.sessionFlag">本次会话结束</div>
<div v-if="item.content.bizType != -1" class="msg-container" :class="{'has-line': !item.sessionFlag}">
<div class="msg-item-img">
<img v-if="item.fromAccId == picakfAccId" src="../../../assets/image/IM/kf-avatar.png" alt />
<img v-else :src="userAvatar" />
</div>
<div class="msg-content">
<div class="info">
<span v-if="item.fromAccId == picakfAccId">客服</span>
<span v-else>{{userName}}</span>
<span class="mid-time">{{item.timestamp}}</span>
</div>
<div v-if="item.type == 'TEXT'" class="text-content">
<div>{{item.content}}</div>
</div>
<div v-if="item.type == 'PICTURE'" class="img-content" v-viewer>
<img :src="item.content.url" />
</div>
<div v-if="item.type == 'CUSTOM'">
<div v-if="item.content.bizType == 18" class="file-content">
<div class="file-con" @click="downPDF(item.content.url)">
<div class="file-left">
<span class="name">{{item.content.name}}</span>
<span class="size">{{fileSizeChange(item.content.size)}}</span>
</div>
<div class="file-right">
<img src="../../../assets/image/IM/icon-pdf.png" alt />
</div>
</div>
</div>
<div v-if="item.content.bizType == 19" class="link-content">
<div>{{item.content.content}}<span class="link-text">{{item.content.suffix}}</span></div>
</div>
<div v-if="item.content.bizType != -1 && item.content.bizType != 19 && item.content.bizType != 18" class="text-content pc-no-support">
<img src="../../../assets/image/IM/icon-warning-circle.png" alt />
<span>该消息类型PC端暂不支持</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from "@/components/breadcrumb.vue";
import { doUpload, getFilePath } from "@/utils/qiniu-util";
import { openLoading, closeLoading, betaHandle, timeHandle } from "@/utils/utils";
import { getPicaKFAccid } from "@/utils";
export default {
components: {
BreadCrumb
},
data() {
return {
// hasSearchDate: false,
jumPathThird: '/search-message-list',
curmbFirst:'消息查询',
curmbSecond:'消息详情',
picakfAccId: '',
lastMsgTime: '',
doctorAccId: '',
detailData: [],
userAvatar: '',
userName: '',
scroll: true,
ele: '',
topFlag: false,
hasHistoryData: true,
historyTime: '',
hasForwardData: true,
};
},
created() {
// this.hasSearchDate = this.$route.query.hasSearchDate;
this.historyTime = this.$route.query.msgTimestamp;
this.doctorAccId = this.$route.query.doctorAccId;
this.userAvatar = this.$route.query.avatarImageUrl;
this.userName = this.$route.query.userName;
this.picakfAccId = getPicaKFAccid();
},
mounted() {
// this.getDeatailData(1);
this.getHistoryData(1);
let _this = this;
setTimeout(() => {
let el = _this.getElmByID('scroll-set');
// _this.containerHeight = _this.getElmByID('slidebar-container').getBoundingClientRect().height - 15;
_this.containerHeight = document.body.clientHeight - 80;
_this.getElmByID('scroll-set').style.height = _this.containerHeight - 152 + "px";
// if(_this.hasSearchDate) { // 有查询日期 滚动条最顶部
// el.scrollTop = 10;
// }else { // 没有查询日期 滚动条最底部
// el.scrollTop = el.scrollHeight;
// }
el.scrollTop = el.scrollHeight;
let flag = true, timeoutId = null, downflag = true, downtimeoutId = null;
el.addEventListener('scroll', function() {
let allH, sh;
allH = el.scrollTop + el.clientHeight;
sh = el.scrollHeight;
if(el.scrollTop < 1 && _this.hasHistoryData) {
if(flag) {
flag = false;
timeoutId && clearTimeout(timeoutId);
timeoutId = setTimeout( () => {
_this.getHistoryData(0);
flag = true;
}, 150)
}
}
// if((sh - allH < 1) && _this.hasForwardData) {
// if(downflag) {
// downflag = false;
// downtimeoutId && clearTimeout(downtimeoutId);
// downtimeoutId = setTimeout( () => {
// _this.getDeatailData(0);
// downflag = true;
// }, 150)
// }
// }
})
},100);
},
methods: {
// 获取元素
getElmByID(elmId) {
return document.getElementById(elmId);
},
// 获取详情数据以及下拉加载历史数据
// getDeatailData(param) { // 最新的时间在最后面
// let url = '/im/msg/forward';
// let req = {
// doctorAccId: this.doctorAccId,
// includeFlag: param, // 第一次加载是1 上翻历史是0
// lastMsgTimestamp: this.lastMsgTime,
// limit: 20,
// patientAccId: this.picakfAccId,
// unionId: ""
// }
// this.POST(url, req).then((res) => {
// if(res.code == '000000') {
// let arr = [];
// if(res.data.length > 0) {
// this.hasForwardData = true;
// this.historyTime = res.data[0].timestamp;
// this.lastMsgTime = res.data[res.data.length - 1].timestamp;
// arr = this.dataconcatHandle(res.data);
// this.detailData.push(...arr);
// }else {
// this.hasForwardData = false;
// }
// }
// })
// },
// 上翻查看最新消息
getHistoryData(param) { // 最新的时间在最前面
let url = '/im/msg/history';
let req = {
doctorAccId: this.doctorAccId,
includeFlag: param,
lastMsgTimestamp: this.historyTime,
limit: 20,
patientAccId: this.picakfAccId,
unionId: ""
}
this.POST(url, req).then((res) => {
if(res.code == '000000') {
let arr = [], sortArr = [];
if(res.data.length > 0) {
this.hasHistoryData = true;
this.historyTime = res.data[res.data.length - 1].timestamp;
arr = this.dataconcatHandle(res.data.reverse());
this.detailData.unshift(...arr);
let el = this.getElmByID('scroll-set');
el.scrollTop = 500;
}else {
this.hasHistoryData = false;
}
}
})
},
// 按照时间大小排序
timeSort(arrList) {
arrList.sort((a, b) => {
return a.timestamp - b.timestamp;
});
return arrList
},
// 数据合并转换
dataconcatHandle(data) {
let currentTaskId = '';
data.forEach((element, index) => {
element.timestamp = this.timeChange(element.timestamp);
element.sessionFlag = false;
if(index > 0) {
currentTaskId = data[index - 1].taskLogId;
if(element.taskLogId !== currentTaskId) {
element.sessionFlag = true;
}
}
this.$set(element, index, 'sessionFlag');
if(element.type == 'CUSTOM' || element.type == 'PICTURE') {
element.content = JSON.parse(element.content);
}
});
return data;
},
// 时间格式转换
timeChange(data) {
return timeHandle(data)
},
// 文件大小单位转换
fileSizeChange(val) {
return betaHandle(val)
},
// 打开PDF
downPDF(url) {
window.open(url, "__blank");
// window.location.href = url
}
}
};
</script>
<style lang="scss" scoped>
.search-msg-detail {
.detail-content {
margin: 80px 20px 0 20px;
padding: 0 0px 0 20px;
background: #fff;
#scroll-set {
overflow-x: hidden;
overflow: scroll;
}
.split-line {
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
// margin: 15px 0;
font-size: 14px;
color: #333;
&::before {
flex: 1;
content: '';
height: 1px;
margin-right: 18px;
background:#C7C8C9;
}
&::after {
flex: 1;
content: '';
height: 1px;
margin-left: 18px;
background:#C7C8C9;
}
}
.msg-container {
display: flex;
flex-direction: row;
padding-top: 12px;
border: none;
.msg-item-img {
width: 32px;
height: 32px;
margin-right: 8px;
& > img {
width: 100%;
height: 100%;
border-radius: 22px;
}
}
.msg-content {
display: flex;
flex-direction: column;
width: 100%;
text-align: left;
font-size: 13px;
.text-content {
padding: 16px 0;
color: #333333;
//border-bottom: 1px solid #F0F1F2;
}
.text-content.pc-no-support {
img {
float: left;
padding-top: 3px;
padding-right: 5px;
width: 14px;
height: 14px;
}
}
.img-content {
padding: 16px 0;
cursor: pointer;
& > img {
width: 170px;
height: 108px;
border-radius: 8px;
}
}
.file-content {
padding: 16px 0;
.file-con {
display: flex;
flex-direction: row;
max-width: 260px;
text-align: left;
padding: 10px 15px;
background: #f0f1f2;
border-radius: 8px;
cursor: pointer;
.file-left {
display: flex;
flex-direction: column;
justify-content: space-around;
width: 190px;
.name {
font-size: 13px;
color: #333333;
}
.size {
font-size: 12px;
color: #999999;
}
}
.file-right {
width: 36px;
height: 44px;
& > img {
width: 36px;
height: 100%;
border-radius: 3px;
}
}
}
}
.link-content {
padding: 16px 0;
.link-text {
color: #2f86f6;
}
}
}
}
.msg-container.has-line {
border-top: 1px solid #F0F1F2;
}
}
#scroll-set::-webkit-scrollbar {
width: 10px;
height: 5px;
background-color: #F0F1F2 !important;
}
#scroll-set::-webkit-scrollbar-thumb {
background-color: #F0F1F2 !important;
}
#scroll-set:last-child .msg-container {
border-bottom: 1px solid #F0F1F2;
}
}
</style>
\ No newline at end of file
<template>
<div class="message-list-wrap">
<div class="component-content screenSet" id="screenSet">
<el-row :gutter="30" class="row" type="flex" style="margin-top: 10px;margin-right:0px;">
<el-form ref="serchForm" inline :model="searchParam" label-width="15px" style="width:100%;text-align:right;">
<el-form-item label="">
<el-input clearable v-model="searchParam.userMobile" size="mini" placeholder="请输入用户电话" @change="searchMessage(1)">
<el-button slot="append" icon="el-icon-search"></el-button>
</el-input>
</el-form-item>
<el-form-item label="">
<el-input clearable v-model="searchParam.userName" size="mini" placeholder="请输入用户名称" @change="searchMessage(1)">
<el-button slot="append" icon="el-icon-search"></el-button>
</el-input>
</el-form-item>
<el-form-item label="">
<el-input clearable v-model="searchParam.adminName" size="mini" placeholder="请输入客服名" @change="searchMessage(1)">
<el-button slot="append" icon="el-icon-search"></el-button>
</el-input>
</el-form-item>
<el-form-item label="" style="position:relative;top:-8px;left:0;margin-bottom: 0px;">
<el-date-picker
v-model="date"
size="mini"
type="date"
placeholder="请选择日期"
value-format="yyyy-MM-dd"
@change="searchMessage(1)"></el-date-picker>
</el-form-item>
</el-form>
</el-row>
<el-table :data="tableData" style="width: 100%" v-loading="loading">
<el-table-column prop="userName" label="用户名" min-width="50" align="center"></el-table-column>
<el-table-column prop="communicationNumber" label="对话次数" min-width="100" align="center"></el-table-column>
<el-table-column label="用户类型" min-width="50" align="center">
<template slot-scope="scope">
<span>{{scope.row.idType | typeFilter}}</span>
</template>
</el-table-column>
<el-table-column prop="certStatus" label="认证状况" min-width="100" align="center"></el-table-column>
<el-table-column prop="hospitalName" label="所属机构" min-width="50" align="center"></el-table-column>
<el-table-column label="操作" fixed="right" align="center" min-width="100">
<template slot-scope="scope">
<el-button type="text" size="small" @click="edit(scope.row)">查看详细</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../../assets/image/IM/no-search-list.png" />
<p>没有查询到相关结果</p>
</div>
</div>
</el-table>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchParam.pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000, 1500, 2000]"
:page-size="searchParam.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</div>
</div>
</template>
<script>
import { doUpload, getFilePath } from "@/utils/qiniu-util";
import { validateWord } from "@/utils/validate.js";
import { openLoading, closeLoading } from "@/utils/utils";
import * as commonUtil from "@/utils/utils";
let vm = null;
export default {
data() {
return {
date: '',
searchParam: {
adminName: "",
chooseDate: "",
userMobile: "",
userName: "",
pageNo: 1,
pageSize: 15
},
totalRows: 0,
tableData: [],
loading: false,
// hasSearchDate: false // 查询条件不包含日期
};
},
computed: {},
filters: {
typeFilter(index) {
let str = "";
if (index == 1) {
str = "医生";
} else if (index == 2) {
str = "居民";
}
return str;
}
},
created() {
},
// 挂载到Dom完成时
mounted() {
commonUtil.resizeHeight(92);
this.searchMessage();
},
methods: {
// 列表查询
searchMessage(a) {
if(a) this.searchParam.pageNo = 1;
if(a == 2) return;
this.loading = true;
let url = `/im/system/message/list`;
this.searchParam.chooseDate = this.date ? new Date(this.date).getTime() : '';
let params = this.searchParam;
this.GET(url, params).then(res => {
this.loading = false;
if (res.code == "000000") {
this.tableData = res.data.list;
this.totalRows = res.data.total;
}
});
},
// 查看消息详情
edit(row) {
// if(this.searchParam.chooseDate) this.hasSearchDate = true;
this.$router.push({
path: `/search-message-detail`,
query: {
msgTimestamp: row.msgTimestamp,
doctorAccId: row.accId,
userName: row.userName,
avatarImageUrl: row.avatarImageUrl,
// hasSearchDate: this.hasSearchDate
}
});
},
handleSizeChange(value) {
this.searchParam.pageSize = value;
this.searchMessage();
},
handleCurrentChange(value) {
this.searchParam.pageNo = value;
this.searchMessage();
}
}
};
</script>
<style lang="scss" scoped>
.message-list-wrap {
margin-top: -60px;
.component-content {
padding: 10px;
background: #fff;
// margin: 84px 20px 20px;
.search-title {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 10px 12px;
font-size: 12px;
margin-bottom: 20px;
border-bottom: 1px solid #efefef;
.num {
color: #449284;
}
}
.create-button {
padding: 0 0 15px;
margin-top: 0 !important;
text-align: right;
}
.table-empty {
margin-top: 20px;
img {
width: 100px;
}
p {
margin-top: -45px;
}
}
}
}
</style>
\ No newline at end of file
<template>
<div class="wts-list-wrap">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond"></bread-crumb>
<div class="component-content screenSet" id="screenSet">
<div class="search-title">
<p>当前共有<span class="num">{{total}}</span>用户正在等待</p>
<el-button type="primary" size="small" @click="getNextSession()">给我一个任务吧</el-button>
</div>
<el-table :data="tableData" style="width: 100%" v-loading="loading">
<el-table-column prop="userName" label="用户名" min-width="50" align="center"></el-table-column>
<el-table-column prop="waitTime" label="等待时间" min-width="100" align="center">
<template slot-scope="scope">
<span>{{scope.row.waitTime * 1000 | continueTimesFilter(true)}}</span>
</template>
</el-table-column>
<el-table-column prop="idType" label="用户类型" min-width="50" align="center">
<template slot-scope="scope">
<span>{{scope.row.idType | typeFilter}}</span>
</template>
</el-table-column>
<el-table-column prop="certStatus" label="认证状况" min-width="100" align="center"></el-table-column>
<el-table-column prop="hospitalName" label="所属机构" min-width="50" align="center"></el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../../assets/image/IM/no-search-list.png" />
<p>没有查询到相关结果</p>
</div>
</div>
</el-table>
</div>
</div>
</template>
<script>
import { mapGetters, mapMutations } from 'vuex';
import BreadCrumb from "@/components/breadcrumb.vue";
import { doUpload, getFilePath } from "@/utils/qiniu-util";
import { validateWord } from "@/utils/validate.js";
import { openLoading, closeLoading } from "@/utils/utils";
import * as commonUtil from "@/utils/utils";
let vm = null;
// let intervalId = null;
export default {
components: {
BreadCrumb
},
data() {
return {
curmbFirst: "云鹊客服",
curmbSecond: "等待会话",
tableData: [],
total: 0,
loading: false,
};
},
computed: {
},
filters: {
typeFilter(index) {
let str = "";
if (index == 1) {
str = "医生";
} else if (index == 2) {
str = "居民";
}
return str;
}
},
created() {
this.getListData();
// intervalId = setInterval(() => {
// this.getListData();
// }, 10000);
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight();
},
methods: {
...mapMutations(['SET_IS_FROM_ASSIGN_TASK']),
// 获取数据
getListData() {
this.loading = true;
this.GET('/im/task/list?pageNo=1&pageSize=40').then((res) => {
this.loading = false;
if( res.code === '000000') {
this.tableData = res.data.list || [];
this.total = res.data.total;
} else {
this.$message({
message: res.message,
type: 'error'
});
}
})
},
// 给我一个任务吧,如果当前没有任务,则要提示
getNextSession() {
this.GET('/im/session/kf/fetchOneTask').then((res) => {
if( res.code === '000000') {
this.SET_IS_FROM_ASSIGN_TASK(true);
this.$router.push({ path: `/current-session-list` });
} else {
this.$message({
message: res.message,
type: 'error'
});
}
})
},
},
// 离开页面时,清除定时器
beforeDestroy() {
// intervalId && clearInterval(intervalId);
},
};
</script>
<style lang="scss" scoped>
.wts-list-wrap {
.component-content {
padding: 10px;
background: #fff;
// margin: 84px 20px 20px;
.search-title {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 10px 12px;
font-size: 12px;
margin-bottom: 20px;
border-bottom: 1px solid #efefef;
p {
font-size: 16px;
color: #000;
}
.num {
color: #449284;
}
}
.create-button {
padding: 0 0 15px;
margin-top: 0 !important;
text-align: right;
}
.table-empty {
margin-top: 20px;
img {
width: 100px;
}
p {
margin-top: -45px;
}
}
}
}
</style>
\ No newline at end of file
...@@ -20,7 +20,7 @@ export default { ...@@ -20,7 +20,7 @@ export default {
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.blank-wrap { .blank-wrap {
background: #fff; background: #fff;
margin: 20px !important; margin: 20px !important;
......
<template>
<div class="add-manager-wrap">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond"></bread-crumb>
<div class="add-content screenSet" id="screenSet">
<div class="discuss-opt">
<el-form ref="form" :model="form" label-width="100px">
<el-form-item label="讨论主题" required>
<el-col :span="8">
<el-input v-model="form.subject" size="mini" type="textarea" :maxLength="maxTopic"></el-input>
</el-col>
</el-form-item>
<el-form-item label="分类" required>
<el-col :span="8">
<el-select size="mini" v-model="form.deriverName" placeholder="请选择">
<el-option
v-for="item in derivers"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-col>
</el-form-item>
<el-form-item label="内容发布控制">
<div>
<span class="label-name">话题</span>
<el-radio v-model="form.ht" label="1" >允许</el-radio>
<el-radio v-model="form.ht" label="0" >不允许</el-radio>
</div>
<!-- <div>
<span class="label-name">评论</span>
<el-radio v-model="form.pl" label="1" >允许</el-radio>
<el-radio v-model="form.pl" label="0" >不允许</el-radio>
</div> -->
<div>
<span class="label-name">回复</span>
<el-radio v-model="form.displayReplyBtn" :label="1" >允许</el-radio>
<el-radio v-model="form.displayReplyBtn" :label="2" >不允许</el-radio>
<span class="label-name">前端展示数量:</span>
<el-input-number v-model="form.replyShowNum" controls-position="right" :min="0"></el-input-number>
<el-checkbox v-model="form.replyOfficial" style="margin-left: 20px">置顶官方回复</el-checkbox>
</div>
<div>
<span class="label-name">点赞</span>
<el-radio v-model="form.displayLikeBtn" :label="1" >允许</el-radio>
<el-radio v-model="form.displayLikeBtn" :label="2" >不允许</el-radio>
</div>
</el-form-item>
<el-form-item label="审核规则" required>
<div>
<span class="label-name">文字</span>
<el-radio v-model="form.wz" label="2" disabled>先审后显示</el-radio>
<el-radio v-model="form.wz" label="4" disabled>后审先显示</el-radio>
</div>
<div>
<span class="label-name">图片</span>
<el-radio v-model="form.tp" label="8" disabled>先审后显示</el-radio>
<el-radio v-model="form.tp" label="16" disabled>后审先显示</el-radio>
</div>
</el-form-item>
<el-form-item label="开放客群" required>
<el-checkbox label="注册用户" v-model="form.isZC"></el-checkbox>
<el-checkbox label="认证用户" v-model="form.isRZ"></el-checkbox>
</el-form-item>
<el-form-item label="发布按钮文案" required>
<el-row>
<el-col :span="6">
<div>
<span class="label-name label-f">话题发布</span>
<el-input v-model="form.topicBtnText" size="mini" style="width: 100px;" :maxLength="maxBtn"></el-input>
</div>
</el-col>
<el-col :span="10">
<div>
<span class="label-name label-w">输入界面title文案</span>
<el-input v-model="form.inputTitle" size="mini" style="width: 100px;" :maxLength="5"></el-input>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<div>
<span class="label-name label-f">评论发布</span>
<el-input v-model="form.commentBtnText" size="mini" style="width: 100px;" :maxLength="maxBtn"></el-input>
</div>
</el-col>
<el-col :span="12">
<div>
<span class="label-name label-w">输入界面提示文案</span>
<el-input v-model="form.inputReminder" size="mini" style="width: 260px;" :maxLength="15"></el-input>
</div>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="底Bar显示控制">
<el-radio v-model="form.displayBar" :label="1">评论+点赞</el-radio>
<el-radio v-model="form.displayBar" :label="2">仅评论</el-radio>
<el-radio v-model="form.displayBar" :label="3"></el-radio>
</el-form-item>
<el-form-item label="列表排序控制">
<el-radio v-model="form.displayListSort" :label="1">综合排序</el-radio>
<el-radio v-model="form.displayListSort" :label="2">按最新发布时间</el-radio>
<el-radio v-model="form.displayListSort" :label="3">按最高点赞数</el-radio>
</el-form-item>
<el-form-item label="话题列表页标题文案" label-width="140px">
<div>
<el-input v-model="form.commentListDetails" size="mini" style="width: 100px;" :maxLength="maxBtn"></el-input>
</div>
</el-form-item>
<el-form-item label="话题详情页话题文案" label-width="140px">
<div>
<el-input v-model="form.commentDetails" size="mini" style="width: 100px;" :maxLength="maxBtn"></el-input>
</div>
</el-form-item>
<el-form-item label="是否仅显示评论区" label-width="110px">
<el-radio v-model="form.displayOnlyComment" :label="1"></el-radio>
<el-radio v-model="form.displayOnlyComment" :label="2"></el-radio>
</el-form-item>
<el-form-item label="备注">
<el-col :span="8">
<el-input v-model="form.remark" size="mini" type="textarea" :maxLength="maxTopic"></el-input>
</el-col>
</el-form-item>
</el-form>
<div class="btn-box pdrt20">
<el-button type="primary" size="small" class="button-green" @click="save">保存</el-button>
<el-button size="small" class="button-white" @click="goBack">返回</el-button>
</div>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from "../../components/breadcrumb.vue";
import { doUpload, getFilePath } from "../../utils/qiniu-util";
import { returnData } from "../mock";
import { mapGetters } from "vuex";
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
let vm = null;
export default {
components: {
BreadCrumb
},
data() {
return {
curmbFirst:'讨论组件',
curmbSecond:'新建',
derivers:[
{
value:'直播',
label:'直播'
},
{
value:'发现',
label:'发现'
},
{
value:'课程',
label:'课程'
},
{
value:'积木',
label:'积木'
},
],
maxBtn:4,
form:{
subject:'',
ht:'1',
wz:'4',
tp:'16',
user:'1',
isZC:false,
isRZ:false,
zc:4,
rz:8,
topicBtnText:'发布话题',
commentBtnText:'发布评论',
commentDetails:'全部评论',
commentListDetails: '热门话题',
displayTopicBtn:true,//是否显示发布话题按钮
// displayCommentBtn:true,//是否显示评论按钮
displayReplyBtn: 1,//是否显示回复按钮
displayLikeBtn: 1,//是否显示点赞按钮
remark:'',
deriverName:'积木',
replyShowNum: 5,
replyOfficial: false,
inputTitle: '话题发布',
inputReminder: '',
displayBar: 1,
displayListSort: 1,
displayOnlyComment: 2
},
maxTopic:60,
id:0,
};
},
computed: {
...mapGetters(["_token", "idType"])
},
created() {
this.id = this.$route.query.id
if(this.id){
this.curmbSecond = '编辑'
this.getDissById(this.id)
}
},
// 挂载到Dom完成时
mounted: function() {
},
methods: {
//返回
goBack(){
this.$router.back(-1)
},
showError(str){
this.$message({
message: str,
type: 'warning'
});
},
//保存讨论
save(){
let visibility = 0,
auditRules = 0,_this = this;
if(this.form.isRZ){
visibility = 8
}
if(this.form.isZC){
visibility = 4
}
if(this.form.isRZ && this.form.isZC){
visibility = 12
}
if(this.form.subject == ''){
console.log(this.form.subject)
this.showError('请输入讨论主题')
return;
}
if(visibility == 0){
this.showError('请选择开发客群');
return;
}
if(this.form.topicBtnText == ''){
this.showError('请输入话题发布按钮文字');
return;
}
if(this.form.commentBtnText == ''){
this.showError('请输入评论发布按钮文字');
return;
}
if(this.form.inputTitle == ''){
this.showError('请输入输入界面title文案');
return;
}
auditRules = Number(this.form.wz) + Number(this.form.tp)
let parm = {
"auditrules": auditRules,
"commentbtntext": this.form.commentBtnText,
"commentDetails": this.form.commentDetails,
'commentListDetails': this.form.commentListDetails,
//"deleteflag": 0,
//"derivedid": 0,
"category": this.form.deriverName,
// "displaycommentbtn": this.form.pl == 1 ? true : false,
"displaytopicbtn": this.form.ht == 1 ? true : false,
"displayReplyBtn": this.form.displayReplyBtn,
"displayLikeBtn": this.form.displayLikeBtn,
"replyShowNum": this.form.replyShowNum,
"replyOfficial": this.form.replyOfficial ? 1 : 2,
"inputTitle": this.form.inputTitle,
"inputReminder": this.form.inputReminder,
"displayBar": this.form.displayBar,
"displayListSort": this.form.displayListSort,
"displayOnlyComment": this.form.displayOnlyComment,
//"id": 0,
"subject":this.form.subject,
"topicbtntext": _this.form.topicBtnText,
"visibility": visibility,
"remark":this.form.remark
}
if(this.id){
parm.id = Number(this.id)
this.PUT('/interaction/discuss/',parm).then((res) => {
// closeLoading(vm)
if( res.code == '000000' ) {
this.$message({
message: '保存成功!',
type: 'success'
});
setTimeout(()=>{
this.goBack()
},1500)
}
})
}else{
this.POST('/interaction/discuss/',parm).then((res) => {
// closeLoading(vm)
if( res.code == '000000' ) {
this.$message({
message: '保存成功!',
type: 'success'
});
setTimeout(()=>{
this.goBack()
},1500)
}
})
}
},
//获取讨论组件详细
getDissById(id){
this.GET('/interaction/discuss/'+id).then((res) => {
// closeLoading(vm)
if( res.code == '000000' ) {
this.id = res.data.id
this.form.subject = res.data.subject
this.form.deriverName = res.data.category
// 发布按钮文案
this.form.topicBtnText = res.data.topicbtntext == null ? '' : res.data.topicbtntext
this.form.commentBtnText = res.data.commentbtntext
this.form.inputTitle = res.data.inputTitle || '话题发布'
this.form.inputReminder = res.data.inputReminder
// title文案
this.form.commentDetails = res.data.commentDetails
this.form.commentListDetails = res.data.commentListDetails
// 备注
this.form.remark = res.data.remark
//开放客群
if(res.data.visibility == 14 || res.data.visibility == 12){
this.form.isRZ = true
this.form.isZC = true
}else if(res.data.visibility == 6){
this.form.isRZ = false
this.form.isZC = true
}else if(res.data.visibility == 10){
this.form.isRZ = true
this.form.isZC = false
}
//审核规则
if(res.data.auditrules == 18){
this.form.wz = "2"
this.form.tp = "16"
}else if(res.data.auditrules == 10){
this.form.wz = "2"
this.form.tp = "8"
}else if(res.data.auditrules == 12){
this.form.wz = "4"
this.form.tp = "8"
}else if(res.data.auditrules == 20){
this.form.wz = "4"
this.form.tp = "16"
}
//内容发布控制
this.form.ht = res.data.displaytopicbtn ? "1" : "0"
// this.form.pl = res.data.displaycommentbtn ? "1" : "0"
this.form.displayReplyBtn = res.data.displayReplyBtn
this.form.displayLikeBtn = res.data.displayLikeBtn
this.form.replyShowNum = res.data.replyShowNum
this.form.replyOfficial = res.data.replyOfficial == 1 ? true : false
// 底部bar 列表排序 显示评论区
this.form.displayBar = res.data.displayBar
this.form.displayListSort = res.data.displayListSort
this.form.displayOnlyComment = res.data.displayOnlyComment
}
})
}
}
};
</script>
<style lang="scss">
.discuss-opt{
padding:20px;
.btn-box{
text-align: center
}
.label-name{
font-size: 12px;
color:#606266;
padding-right:10px;
display: inline-block;
}
.label-f{
width: 80px;
}
.label-w {
width: 110px
}
.pdrt20{
padding:20px 0;
}
.el-radio__label,.el-checkbox__label{
font-size: 12px;
}
}
.add-manager-wrap {
.add-content {
background: #fff;
}
.rim {
border: 1px solid #dddddd;
}
.step-content {
overflow: hidden;
height: 60px;
margin-top: 66px;
padding-top: 15px;
border-bottom: 1px solid #fff;
.is-text {
display: none;
}
.el-steps--simple {
background: #fff;
}
.button-green {
color: #ffffff;
background: #449284;
border-color: #bfdad5;
border-radius: 2px;
}
.button-white {
color: #606266;
background: #ffffff;
border-color: #ecedf1;
border-radius: 2px;
}
.step-num {
display: block;
font-size: 12px;
border: 2px solid #b8babe;
border-radius: 50%;
width: 25px;
height: 20px;
line-height: 15px;
text-align: center;
color: #b8babe;
}
.is-finish {
color: #c0c4cc;
}
.on-step {
color: #747476;
border-color: #747476;
}
}
.first-step {
margin-top: 20px;
.bg-uploader {
img {
float: left;
}
.bg-img {
width: 84px;
height: 100px;
}
.bg-video {
float: left;
width: 100px;
height: 100px;
}
.limit-text {
float: left;
margin-left: 10px;
margin-top: -10px;
p {
font-size: 12px;
color: #999;
}
}
}
.el-upload__tip {
position: absolute;
top: -6px;
left: 130px;
}
.choose-button {
background: #fff;
color: #409eff;
border: 1px solid #409eff;
}
}
.second-step {
margin: 10px 0 0 20px;
//隐藏树展开
.table-empty {
img {
width: 100px;
}
p {
margin-top: -50px;
}
}
.el-tree-node__expand-icon {
display: none;
}
.el-table__header-wrapper {
.el-checkbox__inner {
//display: none;
//visibility: hidden;
}
}
.department {
margin-top: 20px;
border: 1px solid #dddddd;
}
.el-tabs__nav-wrap::after {
display: none;
}
.el-tabs__active-bar {
display: none;
}
#tab-first,
#tab-second,
#tab-third {
padding-right: 0px;
}
#tab-first::after,
#tab-second::after,
#tab-third::after {
color: #c7cbd2;
margin-left: 20px;
content: "•";
}
.el-tag {
margin: 0 10px 10px 0;
border: 1.3px solid #48a8fe;
color: #1e92fe;
background-color: #e7f6fe;
.el-icon-close {
width: 13px;
height: 13px;
line-height: 13px;
font-size: 12px;
background-color: #0486fe;
border-radius: 50%;
color: #d4edfe;
}
}
}
.third-step {
margin: 30px 0 0px 30px;
padding-bottom: 30px;
}
}
</style>
\ No newline at end of file
<template>
<div class="item-component-wrap">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond">
</bread-crumb>
<div class="component-content screenSet" id="screenSet">
<div class="search-title">查询条件</div>
<el-row :gutter="30" class="row" type="flex" style="margin-top: 10px;">
<el-form ref="serchForm" :model="searchParam" label-width="75px" style="width:100%;">
<el-col :span="6">
<el-form-item label="讨论主题:">
<el-input clearable v-model="searchParam.theme" size="mini" placeholder="请输入主题" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="创建人:">
<el-input clearable v-model="searchParam.name" size="mini" placeholder="请输入创建人名称" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="分类:">
<el-select v-model="categoryStatus" size="mini" placeholder="请选择分类">
<el-option
v-for="(item,index) in category"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="状态:">
<el-select clearable v-model="searchParam.status" size="mini" placeholder="请选择发布状态">
<el-option
v-for="(item,index) in statuSelect"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col style="text-align:right;padding:0 30px 15px 0;">
<el-button type="primary" size="small" @click="search">查询</el-button>
<el-button type="default" size="small" @click="reseat">重置</el-button>
<el-button type="primary" size="small" @click="creatFun('1')">举报设置</el-button>
<el-button type="primary" size="small" @click="creatFun('2')">新建讨论组件</el-button>
</el-col>
</el-form>
</el-row>
<el-table
:data="tableData"
style="width: 100%" v-loading="loading">
<el-table-column prop="id" label="ID编号" min-width="50" align="center"></el-table-column>
<el-table-column prop="subject" label="讨论主题" min-width="100" align="center"></el-table-column>
<el-table-column prop="category" label="分类" min-width="50" align="center"></el-table-column>
<el-table-column prop="remark" label="备注" min-width="100" align="center"></el-table-column>
<el-table-column prop="createdusername" label="创建人" min-width="50" align="center"></el-table-column>
<el-table-column prop="modifiedUsername" label="最后修改人" min-width="100" align="center"></el-table-column>
<el-table-column prop="status" label="状态" min-width="80" align="center">
<template slot-scope="scope">
<span>{{ scope.row.status | filteFun}}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="center" min-width="200">
<template slot-scope="scope">
<el-button type="primary" size="small" @click="edit(scope.row)">编辑</el-button> <el-button type="primary" v-if="scope.row.status == 3 || scope.row.status == 1" size="small" @click="optFun(scope.row,'发布')">发布</el-button>
<el-button type="primary" v-if="scope.row.status == 2" size="small" @click="optFun(scope.row,'下线')">下线</el-button>
<el-button type="primary" size="small" @click="topicManage(scope.row)">话题管理</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png" />
<p>没有查询到相关结果</p>
</div>
</div>
</el-table>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchParam.pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000, 1500, 2000]"
:page-size="searchParam.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from '../../components/breadcrumb.vue'
import { doUpload, getFilePath } from "../../utils/qiniu-util"
import { validateWord } from "../../utils/validate.js"
import { mapGetters } from 'vuex'
import { openLoading, closeLoading } from '../../utils/utils'
import * as commonUtil from '../../utils/utils'
let vm = null
export default {
components: {
BreadCrumb
},
data() {
return {
curmbFirst: '组件',
curmbSecond: '讨论组件',
searchParam: {
theme:'',
type:'',
name:'',
status: '',
pageNo: 1,
pageSize: 15
},
category:[
],
categoryStatus:'',
statuSelect: [
{
label: '未发布',
value: '1'
},{
label: '已发布',
value: '2'
},{
label: '已下架',
value: '3'
}
],
tableData: [],
totalRows: 0,
loading:false,
}
},
computed: {
...mapGetters([
'_token',
'idType'
])
},
filters:{
filteFun(index){
let str = '';
if(index == 1){
str = '未发布'
}else if(index == 2){
str = '已发布'
}else if(index == 3){
str = '已下线'
}
return str
}
},
created() {
this.getData()
//this.sun()
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight()
},
methods: {
// 列表查询
search() {
this.getData()
},
//获取数据
getData(){
let subject = 0,status = 0,name = 0;
if(this.searchParam.theme != ''){
subject = this.searchParam.theme
}
if(this.searchParam.status != ''){
status = this.searchParam.status
}
if(this.searchParam.name != ''){
name = this.searchParam.name
}
console.log(this.categoryStatus)
this.loading = true;
let cStatus = this.categoryStatus ? this.categoryStatus : '0'; //'0'表示默认查所有的
let url = '/interaction/discuss/'+cStatus+'/'+subject+'/'+name+'/'+status+'/'+this.searchParam.pageNo+'/'+this.searchParam.pageSize
this.GET(url).then((res) => {
this.loading = false
if( res.code == '000000' ) {
console.log( res.data)
this.tableData = res.data.resp.discuss || []
this.totalRows = res.data.resp.count
if (res.data.typeList && res.data.typeList.length) {
let arr = [];
for(let i = 0; i < res.data.typeList.length; i++) {
let obj = {};
obj.label = res.data.typeList[i];
obj.value = res.data.typeList[i];
arr.push(obj);
}
this.category = arr;
}
}
})
},
// 重置
reseat() {
this.searchParam = Object.assign({},{
theme:'',
type:'',
name:'',
category:'',
status: '',
pageNo: 1,
pageSize: 15
})
this.category =[],
this.categoryStatus= '',
this.getData()
},
creatFun(index){
if(index == 1){
this.$router.push({path: '/report-set'})
}else if(index == 2){
this.$router.push({path: '/creat-discuss'})
}
},
edit(item){
this.$router.push({path: '/creat-discuss',query:{id:item.id}})
},
topicManage(item){
this.$router.push({path: '/topic-list',query:{id:item.id}})
},
// 发布、下线
optFun(row,str) {
let status = 0;
if(str == '发布'){
status = 2
}else if(str == '下线'){
status = 3
}
this.$confirm('确定要'+str+'该讨论吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.PUT('/interaction/discuss/release',{id: row.id,status:status}).then((res) => {
if(res.code == "000000") {
this.$message({
type: 'success',
message: '操作成功!'
});
this.getData()
}
}).catch(function (error) {
this.$message.error(error);
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消'
})
})
},
handleSizeChange(value) {
this.searchParam.pageSize = value
this.getData()
},
handleCurrentChange(value) {
this.searchParam.pageNo = value
this.getData()
}
}
}
</script>
<style lang="scss">
.item-component-wrap {
.component-content {
padding: 10px;
background: #fff;
// margin: 84px 20px 20px;
.search-title {
padding: 10px 12px;
font-size: 12px;
color: #449284;
border-bottom: 1px solid #efefef;
}
.create-button {
padding: 0 0 15px;
margin-top: 0 !important;
text-align: right;
}
.table-empty {
img{
width: 100px;
}
p {
margin-top: -50px;
}
}
}
}
</style>
\ No newline at end of file
...@@ -93,7 +93,7 @@ export default { ...@@ -93,7 +93,7 @@ export default {
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.home-wrap { .home-wrap {
.message-content { .message-content {
.visitor { .visitor {
......
<template> <template>
<div class="footer-wrap"> <div class="footer-wrap">
<span>Copyright© 2019 云鹊医疗科技 (上海) 有限公司</span> <span>Copyright© 2019 云鹊医疗科技 (上海) 有限公司</span>
<span>沪ICP:16018581号-1</span> <span>沪ICP:16018581号-1</span>
<span><img src="../../assets/image/footer-icon.png"/>京ICP备:14044861号</span> <span>
</div> <img src="../../assets/image/footer-icon.png" />京ICP备:14044861号
</span>
</div>
</template> </template>
<script> <script>
export default { export default {};
}
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.footer-wrap { .footer-wrap {
text-align: center; text-align: center;
height: 75px; height: 75px;
line-height: 75px; line-height: 75px;
font-size: 12px; font-size: 12px;
color: #838486; color: #838486;
span { span {
padding: 0 10px; padding: 0 10px;
} }
img { img {
width: 12px; width: 12px;
padding-right: 5px; padding-right: 5px;
} }
} }
</style> </style>
<template> <template>
<div class="header-container"> <div class="header-container">
<div class="logo"> <div class="logo">
<!-- <img src="../../assets/image/index_logoicon.png"/> --> <!-- <img src="../../assets/image/index_logoicon.png"/> -->
<p>云鹊医</p> <p>云鹊医</p>
</div> </div>
<div class="user-info"> <div class="user-info">
<el-dropdown trigger="click" @command="handleCommand"> <el-dropdown trigger="click" @command="handleCommand">
<div class="el-dropdown-link"> <div class="el-dropdown-link">
<img class="user-logo" src="../../assets/image/mm.jpg"> <img class="user-logo" src="../../assets/image/mm.jpg" />
<span id="headName">{{userName}}</span><i class="el-icon-caret-bottom"></i> <span id="headName">{{userName}}</span>
</div> <i class="el-icon-caret-bottom"></i>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="logout">退出</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<!--导航-->
<div class="user-info">
<el-dropdown trigger="click">
<span class="el-dropdown-link">
{{'系统切换'}}<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown" class="nav-dropdown">
<el-dropdown-item v-for="item in authList" :key="item.id">
<span class="menu-item" @click="forward(item)">{{item.systemName}}</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div> </div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="logout">退出</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div> </div>
<!--导航-->
<div class="user-info">
<el-dropdown trigger="click">
<span class="el-dropdown-link">
{{'系统切换'}}
<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown" class="nav-dropdown">
<el-dropdown-item v-for="item in authList" :key="item.id">
<span class="menu-item" @click="forward(item)">{{item.systemName}}</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template> </template>
<script> <script>
import { getLoginUrl,getInnerLoginUrl, getYunQueYiUrl } from '../../utils/index.js' import {
import { logout, base64encode } from '../../utils/utils.js' getLoginUrl,
import { mapGetters } from 'vuex' getInnerLoginUrl
let vm = null } from "../../utils/index.js";
export default {
props: {
userName: {
type: String,
default: ''
},
authList: {
type: Array
}
},
data() {
return {
name: ''
}
},
computed: {
},
watch: {
authList(newVal, oldVal){
} import { logout, base64encode } from "../../utils/utils.js";
import { mapGetters } from "vuex";
let vm = null;
export default {
props: {
userName: {
type: String,
default: ""
}, },
created() { authList: {
vm = this type: Array
}
},
data() {
return {
name: ""
};
},
computed: {},
watch: {
authList(newVal, oldVal) {}
},
created() {
vm = this;
},
methods: {
handleCommand(command) {
if (command === "logout") {
window.location.href = getInnerLoginUrl()
// let req = {
// token: localStorage.getItem("storageToken")
// };
// vm.POST("/contents/login/log_out", req).then(res => {
// sessionStorage.removeItem("ADMIN_IM_CENTER_NAVS");
// localStorage.removeItem("storageToken");
// window.location.href = getInnerLoginUrl();
// //logout()
// });
}
}, },
methods: { forward(obj) {
handleCommand(command) { let self = this;
if (command === 'logout') { if (obj.systemNameAbbreviation.toLowerCase() === "sso") {
let req = { window.location.href = obj.domainName + "pica_index.html";
token: localStorage.getItem('storageToken') } else {
} let req = {
vm.POST('/contents/login/log_out',req).then((res) => { system_type: obj.id
sessionStorage.removeItem('DISCUSS_CENTER_NAVS') };
localStorage.removeItem('storageToken') vm.POST("/contents/login/forward_page", req).then(
window.location.href = getInnerLoginUrl() function(data) {
//logout() let forwardData = JSON.parse(JSON.stringify(data.data)); //通过这个实现深拷贝
}) let url = forwardData.picapMenuModels[0].url;
} if (url.length > 1) {
}, // window.location.href = url;
forward(obj) {
let self = this;
if (obj.systemNameAbbreviation.toLowerCase() === "sso") {
window.location.href = obj.domainName + "pica_index.html";
} else { } else {
let req = { url = forwardData.picapMenuModels[0].picapSecondMenus[0].url;
system_type: obj.id if (url.length > 1) {
}; // window.location.href = url;
vm.POST('/contents/login/forward_page', req).then(function (data) { } else {
let forwardData = JSON.parse(JSON.stringify(data.data));//通过这个实现深拷贝 url =
let url = forwardData.picapMenuModels[0].url; forwardData.picapMenuModels[0].picapSecondMenus[0]
if (url.length > 1) { .picapThirdMenus[0].url;
// window.location.href = url; }
} else {
url = forwardData.picapMenuModels[0].picapSecondMenus[0].url;
if (url.length > 1) {
// window.location.href = url;
} else {
url = forwardData.picapMenuModels[0].picapSecondMenus[0].picapThirdMenus[0].url;
}
}
let param = "token=" + localStorage.getItem("storageToken") + "&ssoOrigin=" + localStorage.getItem("ssoOrigin") + "&system_type=" + obj.id;
window.location.href = obj.domainName + url + "?" + base64encode(param);
}, function (error) {
errorResponseCheck(error, self);
});
} }
} let param =
"token=" +
localStorage.getItem("storageToken") +
"&ssoOrigin=" +
localStorage.getItem("ssoOrigin") +
"&system_type=" +
obj.id;
window.location.href =
obj.domainName + url + "?" + base64encode(param);
},
function(error) {
errorResponseCheck(error, self);
}
);
}
} }
} }
};
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.header-container { .header-container {
position: relative; position: relative;
left: 0; left: 0;
top: 0; top: 0;
box-sizing: border-box; box-sizing: border-box;
height: 64px; height: 64px;
width: 100%; width: 100%;
z-index: 99999; z-index: 99999;
font-size: 22px; font-size: 22px;
line-height: 64px; line-height: 64px;
color: #fff;
// background-color: #242f42;
.logo {
float: left;
width: 255px;
text-align: center;
color: #fff; color: #fff;
// background-color: #242f42; background: #0b2f3f;
.logo { img {
float: left; width: 24px;
width: 255px; float: left;
text-align: center; margin-left: 24px;
color: #fff; margin-top: 21px;
background: #0B2F3F; }
img{ p {
width: 24px; text-align: left;
float: left; margin-left: 60px;
margin-left: 24px; }
margin-top: 21px; }
} .user-info {
p { float: right;
text-align: left; padding-right: 50px;
margin-left: 60px; font-size: 16px;
} color: #838683;
.el-dropdown-link {
display: flex;
align-items: center;
padding-left: 50px;
color: #838683;
cursor: pointer;
vertical-align: middle;
font-size: 14px;
}
.user-logo {
margin-right: 6px;
width: 30px;
height: 30px;
border-radius: 50%;
}
.el-icon--right,
#headName,
.line,
#login-out {
font-size: 14px;
} }
.user-info { .line {
float: right; display: inline-block;
padding-right: 50px; padding: 0 10px;
font-size: 16px;
color: #838683;
.el-dropdown-link {
position: relative;
display: inline-block;
padding-left: 50px;
color: #838683;
cursor: pointer;
vertical-align: middle;
font-size: 14px;
}
.user-logo {
position: absolute;
left: 10px;
top: 20px;
width: 30px;
height: 30px;
border-radius: 50%;
}
.el-icon--right, #headName,.line, #login-out{
font-size: 14px;
}
.line {
display: inline-block;
padding: 0 10px;
}
} }
}
} }
.el-dropdown-menu__item { .el-dropdown-menu__item {
text-align: center; text-align: center;
} }
.el-dropdown-menu { .el-dropdown-menu {
top: 37px !important; top: 37px !important;
} }
.nav-dropdown{ .nav-dropdown {
.el-dropdown-menu__item{ .el-dropdown-menu__item {
padding: 0; padding: 0;
} }
} }
......
<template> <template>
<div id="slidebar-container" class="slidebar-container"> <div id="slidebar-container" class="slidebar-container">
<el-menu :default-active="onRoutes" class="el-menu-vertical-demo" theme="dark" unique-opened router> <el-menu
<template v-for="(item,_index) in items"> :default-active="onRoutes"
<template v-if="item.subs && item.subs.length"> class="el-menu-vertical-demo"
<el-submenu :index=" 'index_' + _index" :key="item.index"> theme="dark"
<template slot="title"><i :class="item.icon"></i>{{item.title}}</template> unique-opened
<el-menu-item v-for="(subItem,i) in item.subs" :key="i" :index="subItem.index"> router
<i class="sub-icon" :class="subItem.icon"></i> >
{{subItem.title}} <template v-for="(item,_index) in items">
</el-menu-item> <template v-if="item.subs && item.subs.length">
</el-submenu> <el-submenu :index=" 'index_' + _index" :key="item.index">
</template> <template slot="title">
<template v-else> <i :class="item.icon"></i>
<el-menu-item :index="item.index" :key="item.index"> {{item.title}}
<i :class="item.icon"></i>{{ item.title }}
</el-menu-item>
</template>
</template> </template>
</el-menu> <el-menu-item v-for="(subItem,i) in item.subs" :key="i" :index="subItem.index">
</div> <i class="sub-icon" :class="subItem.icon"></i>
{{subItem.title}}
</el-menu-item>
</el-submenu>
</template>
<template v-else>
<el-menu-item :index="item.index" :key="item.index">
<i :class="item.icon"></i>
{{ item.title }}
</el-menu-item>
</template>
</template>
</el-menu>
</div>
</template> </template>
<script> <script>
import { mapGetters } from 'vuex' import { mapGetters } from "vuex";
import { setTimeout } from 'timers' import { setTimeout } from "timers";
import { isNotEmptyUtils } from '../../utils/utils' import { isNotEmptyUtils } from "../../utils/utils";
let vm = null let vm = null;
export default { export default {
props: { props: {
tokenValue: { tokenValue: {
type: String type: String
}
},
data() {
return {
items: [],
// items:[{title:'组件',icon:'el-icon-menu',index:'item',subs:[{title:'讨论组件',icon:'el-icon-setting',index:'discuss-list'},{title:"问卷管理",icon:"el-icon-setting",index:"question-naire"},{title:"举报管理",icon:"el-icon-setting",index:"report-set"}]},]
}
}, },
computed: { systemType: {
onRoutes() { type: Number | String,
return this.$route.path.replace('/', ''); value: 38,
} }
}, },
created() { data() {
vm = this return {
const navs = sessionStorage.getItem('DISCUSS_CENTER_NAVS') items: []
// items:[{title:'组件',icon:'el-icon-menu',index:'item',subs:[{title:'讨论组件',icon:'el-icon-setting',index:'discuss-list'},{title:"问卷管理",icon:"el-icon-setting",index:"question-naire"},{title:"举报管理",icon:"el-icon-setting",index:"report-set"}]},]
};
},
computed: {
onRoutes() {
return this.$route.path.replace("/", "");
}
},
created() {
vm = this;
const navs = sessionStorage.getItem("ADMIN_IM_CENTER_NAVS");
vm.getNav() vm.getNav();
}, },
methods: { methods: {
getNav() { getNav() {
this.POST('/basic-data/menu/list', { systemType: 26 }).then(res => { this.POST("/basic-data/menu/list", { systemType: this.systemType }).then(res => {
if (res.code == '000000') { if (res.code == "000000") {
const { vueMenuDtos } = res.data; let { vueMenuDtos } = res.data;
this.items = vueMenuDtos; // TODO 开发调试时写死, 发布时去掉
sessionStorage.setItem('DISCUSS_CENTER_NAVS', JSON.stringify(vueMenuDtos)); // vueMenuDtos = [{
// 做当前路由无权限时处理 // icon: 'el-icon-setting',
this.checkAuth(this.$route.path.split('/')[1], vueMenuDtos); // index: "waiting-session-list",
} // subs: [],
}); // title: "等待会话"
}, // },{
checkAuth(path, navs) { // icon: 'el-icon-setting',
let navList = getNavs(navs); // index: "current-session-list",
// subs: [],
// title: "当前会话"
// },{
// icon: 'el-icon-setting',
// index: "search-message-list",
// subs: [],
// title: "消息查询"
// },{
// icon: 'el-icon-setting',
// index: "chain-message",
// subs: [],
// title: "我要群发"
// },{
// icon: 'el-icon-setting',
// index: "chain-history-list",
// subs: [],
// title: "历史群发"
// }];
this.items = vueMenuDtos;
sessionStorage.setItem(
"ADMIN_IM_CENTER_NAVS",
JSON.stringify(vueMenuDtos)
);
// 做当前路由无权限时处理
this.checkAuth(this.$route.path.split("/")[1], vueMenuDtos);
}
});
},
checkAuth(path, navs) {
let navList = getNavs(navs);
function getNavs(arr) { function getNavs(arr) {
let nvs = []; let nvs = [];
for (let i = 0; i < arr.length; i++) { for (let i = 0; i < arr.length; i++) {
const nav = arr[i]; const nav = arr[i];
const subs = nav.subs; const subs = nav.subs;
if (subs.length) { if (subs.length) {
nvs = nvs.concat(getNavs(subs)); nvs = nvs.concat(getNavs(subs));
} else { } else {
nvs.push(nav.index); nvs.push(nav.index);
}
} }
return nvs;
}
debugger
if (navList.indexOf(path) == -1) {
this.$router.push(`/${navList[0]}`);
} }
return nvs;
}
if (navList.indexOf(path) == -1) {
this.$router.push(`/${navList[0]}`);
} }
} }
} }
};
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.slidebar-container { .slidebar-container {
display: block; display: block;
position: absolute; position: absolute;
left: 0; left: 0;
top: 64px; top: 64px;
bottom: 0; bottom: 0;
width: 255px; width: 255px;
background: #06232C; background: #06232c;
.el-menu { .el-menu {
background: #06232C; background: #06232c;
border-right: none; border-right: none;
.sub-icon { .sub-icon {
font-size: 12px; font-size: 12px;
} }
.el-menu-item, .el-submenu__title { .el-menu-item,
color: #8FA4AC; .el-submenu__title {
} color: #8fa4ac;
.el-menu-item.is-active { }
color: #fff; .el-menu-item.is-active {
background: #509284 !important color: #fff;
} background: #509284 !important;
.el-menu-item:hover, }
.el-submenu__title:hover, .el-menu-item:hover,
.slidebar-container .el-menu .el-menu-item:hover, .el-submenu__title:hover,
.slidebar-container .el-menu .el-submenu__title:hover { .slidebar-container .el-menu .el-menu-item:hover,
color: #fff; .slidebar-container .el-menu .el-submenu__title:hover {
background: #06232C; color: #fff;
} background: #06232c;
// .el-menu-item:focus, .el-menu-item:hover {
// background: #06232C !important;
// }
} }
// .el-menu-item:focus, .el-menu-item:hover {
// background: #06232C !important;
// }
}
} }
</style> </style>
......
<template>
<div class="question-wrap">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond">
</bread-crumb>
<div class="question-content screenSet" id="screenSet">
<el-row :gutter="30" class="row" type="flex" style="margin-top: 10px;">
<el-form
ref="serchForm"
:model="searchParam"
label-width="75px"
label-suffix=":"
style="width:100%;"
>
<el-col :span="6">
<el-form-item label="问卷名称">
<el-input
v-model="searchParam.name"
size="mini"
placeholder="请输入问卷名称"
></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="状态">
<el-select
clearable
v-model="searchParam.status"
size="mini"
placeholder="请选择问卷状态"
>
<el-option
v-for="(item, index) in statuSelect"
:key="index"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" style="text-align:right;padding:0 30px 15px 0;">
<el-button type="primary" size="small" @click="search(1)"
>查询</el-button
>
<el-button type="default" size="small" @click="reset"
>重置</el-button
>
</el-col>
</el-form>
</el-row>
<el-button
class="add-question"
type="primary"
size="small"
@click="addQuestion"
>新增问卷</el-button
>
<el-table :data="tableData" style="width: 100%" v-loading="loading">
<el-table-column
prop="id"
label="问卷编号"
min-width="50"
align="center"
></el-table-column>
<el-table-column
prop="name"
label="问卷名称"
min-width="100"
align="center"
></el-table-column>
<el-table-column label="最后修改人" min-width="50" align="center">
<template slot-scope="scope">
<span>{{ scope.row.modifiedId | modifyType(modifyArray) }}</span>
</template>
</el-table-column>
<el-table-column label="最后修改时间" min-width="100" align="center">
<template slot-scope="scope">
<span>{{ scope.row.modifiedTime | liveDateFilter }}</span>
</template>
</el-table-column>
<el-table-column label="问卷状态" min-width="80" align="center">
<template slot-scope="scope">
<span>{{ scope.row.status | questionStatus }}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
fixed="right"
align="center"
min-width="200"
>
<template slot-scope="scope">
<el-button
type="primary"
size="small"
@click="editQuestion(scope.row)"
>编辑</el-button
>
<el-button
type="primary"
v-show="scope.row.status == 1"
size="small"
@click="onAndDownLine(scope.row)"
>上线
</el-button>
<el-button
type="primary"
v-show="scope.row.status == 2"
size="small"
@click="onAndDownLine(scope.row)"
>下线
</el-button>
<!-- <el-button type="primary" size="small" @click="reviewQuestion(scope.row)">查看题库</el-button> -->
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png" />
<p>没有查询到相关结果</p>
</div>
</div>
</el-table>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchParam.pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000, 1500, 2000]"
:page-size="searchParam.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows"
>
</el-pagination>
</div>
</div>
<!-- 问卷新增(编辑) -->
<el-dialog
class="img-edit"
:title="questionTitle"
:visible.sync="discussEditVisible"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form
ref="questionForm"
:rules="rules"
:model="questionEditList"
label-width="220px"
label-suffix=":"
size="mini"
>
<el-form-item>
<el-radio-group
v-model="questionEditList.showType"
style="margin-left: -65px;"
:disabled="formStatus != 'create'"
>
<el-radio :label="1">单题显示</el-radio>
<el-radio :label="2">平铺显示</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="问卷标题" prop="name">
<el-input
v-model="questionEditList.name"
maxlength="30"
placeholder="标题最多30字符"
style="width: 300px;"
>
</el-input>
</el-form-item>
<el-form-item label="题库导入" prop="fileName">
<el-col :span="12">
<el-input
class="form-input"
:placeholder="excelFileName"
v-model="fileName"
disabled
style="width: 99%;"
/>
</el-col>
<el-col :span="10">
<el-upload
class="upload-demo"
style="display: inline-block;width: 80px;"
action="#"
accept=".xlsx"
:before-upload="beforeImport"
:limit="1"
>
<el-button type="primary" size="mini">导入题库</el-button>
</el-upload>
<el-button type="default" size="mini" @click="uploadTemplate"
>模板下载</el-button
>
</el-col>
</el-form-item>
<el-form-item
label="下一题按钮"
v-show="questionEditList.showType == 1"
>
<div class="submit-btn" style="margin-right:20px;">
<p>置灰不可点</p>
<el-upload
v-model="questionEditList.nextDisableClickUrl"
class="avatar-uploader"
action="#"
:show-file-list="false"
:before-upload="beforeAvatarUpload_1"
>
<el-button size="mini" type="primary">上传</el-button>
</el-upload>
<div class="uploat-content">
<img
v-show="questionEditList.nextDisableClickUrl"
:src="questionEditList.nextDisableClickUrl"
class="bg-img"
/>
<img
v-show="!questionEditList.nextDisableClickUrl"
class="bg-img"
src="https://files.yunqueyi.com/image/png/common/20190408164003674.png"
/>
</div>
</div>
<div class="submit-btn">
<p>点亮可点</p>
<el-upload
v-model="questionEditList.nextClickUrl"
class="avatar-uploader"
action="#"
:show-file-list="false"
:before-upload="beforeAvatarUpload_2"
>
<el-button size="mini" type="primary">上传</el-button>
</el-upload>
<div class="uploat-content">
<img
v-show="questionEditList.nextClickUrl"
:src="questionEditList.nextClickUrl"
class="bg-img"
/>
<img
v-show="!questionEditList.nextClickUrl"
class="bg-img"
src="https://files.yunqueyi.com/image/png/common/20190408164015812.png"
/>
</div>
</div>
</el-form-item>
<el-form-item label="问卷导言" v-show="questionEditList.showType == 2">
<el-input
type="textarea"
:autosize="{ minRows: 3 }"
v-model="questionEditList.questionIntro"
maxlength="210"
placeholder="最多210字符"
></el-input>
</el-form-item>
<el-form-item
label="业务类型"
v-show="questionEditList.showType == 2"
prop="bizType"
>
<el-radio-group
v-model="questionEditList.bizType"
:disabled="formStatus != 'create'"
>
<el-radio :label="0">普通问卷</el-radio>
<el-radio :label="1">招募问卷</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label="是否需要审核"
v-show="questionEditList.showType == 2"
prop="bizType"
>
<el-radio-group
v-model="questionEditList.auditFlag"
:disabled="formStatus != 'create'"
@change="addAuditFlag"
>
<el-radio :label="2"></el-radio>
<el-radio :label="1"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label="填写完是否需要提示用户分享"
v-show="questionEditList.showType == 2"
>
<el-radio-group
v-model="questionEditList.shareFlag"
:disabled="formStatus != 'create'"
>
<el-radio :label="2"></el-radio>
<el-radio :label="1"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="分享地址" class="spe-label-require" v-show="questionEditList.showType == 2 && questionEditList.shareFlag == 1">
<el-input
v-model="questionEditList.shareUrl"
style="width: 300px;">
</el-input>
</el-form-item>
<el-form-item label="分享的标题" class="spe-label-require" v-show="questionEditList.showType == 2 && questionEditList.shareFlag == 1">
<el-input
v-model="questionEditList.shareTitle"
style="width: 300px;">
</el-input>
</el-form-item>
<el-form-item label="分享的描述" class="spe-label-require" v-show="questionEditList.showType == 2 && questionEditList.shareFlag == 1">
<el-input
v-model="questionEditList.shareIntro"
style="width: 300px;">
</el-input>
</el-form-item>
<el-form-item label="基本信息" v-show="questionEditList.showType == 2">
<el-checkbox v-model="userBase.name" label="true">姓名</el-checkbox>
<el-checkbox v-model="userBase.mobile" label="true"
>手机号</el-checkbox
>
<el-checkbox v-model="userBase.address" label="true"
>地址</el-checkbox
>
</el-form-item>
<div v-show="questionEditList.showType == 2">
<el-form-item class="submit-btn" label="头图">
<el-upload
v-model="questionEditList.headDiagramUrl"
class="avatar-uploader"
action="#"
:show-file-list="false"
:before-upload="beforeAvatarUpload_4"
>
<el-button class="head-btn" size="mini" type="primary"
>上传</el-button
>
</el-upload>
<div class="uploat-content">
<img
v-show="questionEditList.headDiagramUrl"
:src="questionEditList.headDiagramUrl"
class="head-bg-img"
/>
<img
v-show="!questionEditList.headDiagramUrl"
class="head-bg-img"
src="../../assets/image/default.png"
/>
</div>
</el-form-item>
</div>
<el-form-item class="submit-btn" label="提交按钮">
<el-upload
v-model="questionEditList.submitButtomUrl"
class="avatar-uploader"
action="#"
:show-file-list="false"
:before-upload="beforeAvatarUpload_3"
>
<el-button size="mini" type="primary">上传</el-button>
</el-upload>
<div class="uploat-content">
<img
v-show="questionEditList.submitButtomUrl"
:src="questionEditList.submitButtomUrl"
class="bg-img"
/>
<img
v-show="!questionEditList.submitButtomUrl"
class="bg-img"
src="https://files.yunqueyi.com/image/png/common/20190408164026451.png"
/>
</div>
</el-form-item>
<el-form-item label="问卷填写完毕提示文案" prop="promptCopy">
<el-input
v-model="questionEditList.promptCopy"
maxlength="40"
style="width: 300px;"
></el-input>
<span style="font-size:12px;">限40字符</span>
</el-form-item>
<el-form-item
label="登录权限控制"
v-show="questionEditList.showType == 2"
>
<el-checkbox-group v-model="loginAuthList" class="login-auth" >
<el-checkbox label="1" :disabled="questionEditList.auditFlag==1">云鹊医APP</el-checkbox>
<el-checkbox label="2" :disabled="questionEditList.auditFlag==1">云鹊医H5</el-checkbox>
</el-checkbox-group>
<p style="color:red;">注意:如不勾选登录权限则用户信息记录为游客</p>
</el-form-item>
<el-form-item
label="问卷填写次数"
v-show="questionEditList.showType == 2"
prop="limitNum"
>
<el-radio v-model="questionEditList.limitNumFlag" label="0" :disabled="questionEditList.auditFlag==1">
<el-input
v-model="questionEditList.limitNum"
controls-position="right"
:min="1"
style="width: 100px;"
@blur="checkLimitNum"
@focus="beforeInputLimitNum"
:disabled="questionEditList.auditFlag==1"
></el-input>
</el-radio>
<el-radio v-model="questionEditList.limitNumFlag" label="1" :disabled="questionEditList.auditFlag==1"
>不限制填写次数</el-radio
>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer" style="text-align:center;">
<el-button
type="primary"
size="small"
@click="submitQuestion"
style="width:120px;"
>提交</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import BreadCrumb from "../../components/breadcrumb.vue";
import * as commonUtil from "../../utils/utils";
import { getFilePath, doUpload } from "../../utils/qiniu-util";
import { QUESTION_UPLOAD_TEMPLATE } from "../../utils/constants";
let vm = null;
export default {
components: {
BreadCrumb
},
data() {
return {
curmbFirst: "组件",
curmbSecond: "问卷管理",
questionTitle: "问卷新增/编辑",
discussEditVisible: false,
excelFileName: "",
fileName: "",
fileArray: [],
tableData: [],
totalRows: 0,
loading: false,
searchParam: {
name: "",
status: "",
pageSize: 15,
pageNo: 1
},
modifyArray: [],
questionEditList: {
id: "",
showType: 1,
name: "",
nextDisableClickUrl: "",
nextClickUrl: "",
submitButtomUrl: "",
promptCopy: "",
headDiagramUrl: "",
questionIntro: "",
bizType: 0, //业务类型 0普通 ,1 招募
limitNumFlag: "0", //填写次数flag
limitNum: 1, //填写次数
auditFlag: 2,
shareFlag: 2,
shareUrl: '',
shareTitle: '',
shareIntro: '',
},
formStatus: "create",
loginAuthList: [], //登录权限控制
userBase: {}, //基本信息
rules: {
name: [
{
required: true,
message: "请输入问卷标题",
trigger: "blur"
}
],
promptCopy: [
{
required: true,
message: "请输入问卷填写完毕提示文案",
trigger: "blur"
}
],
bizType: [
{
required: true,
message: "请选择业务类型",
trigger: "blur"
}
],
limitNum: [
{
required: true
}
]
},
statuSelect: [
{
label: "下线",
value: 1
},
{
label: "上线",
value: 2
}
]
};
},
created() {
vm = this;
vm.search();
vm.getAllModify();
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight();
},
methods: {
addAuditFlag() {
if(this.questionEditList.auditFlag == 1) {
vm.loginAuthList = ["1","2"];
vm.questionEditList.limitNumFla = '1';
vm.questionEditList.limitNum = 1;
} else {
}
},
// 查询
search(flag) {
if (flag) vm.searchParam.pageNo = 1;
vm.GET("/campaign/adminQuestionnaire/queryList", vm.searchParam).then(
res => {
if (res.code == "000000") {
vm.tableData = res.data.questionnaireList;
vm.totalRows = res.data.total;
}
}
);
},
handleSizeChange(value) {
vm.searchParam.pageSize = value;
vm.search();
},
handleCurrentChange(value) {
vm.searchParam.pageNo = value;
vm.search();
},
reset() {
vm.searchParam.name = "";
vm.searchParam.status = "";
vm.search();
},
// 获取所有修改人
getAllModify() {
vm.GET("/campaign/adminQuestionnaire/getAllUser").then(res => {
if (res.code == "000000") {
vm.modifyArray = res.data;
}
});
},
// 新增问卷
addQuestion() {
vm.discussEditVisible = true;
vm.formStatus = "create";
if (vm.$refs.questionForm !== undefined) {
vm.$refs.questionForm.resetFields();
}
vm.questionEditList = Object.assign(
{},
{
id: "",
showType: 1,
name: "",
nextDisableClickUrl: "",
nextClickUrl: "",
submitButtomUrl: "",
promptCopy: "您已成功提交问卷,感谢您的参与!",
headDiagramUrl: "",
questionIntro: "",
bizType: 0,
limitNumFlag: "0",
limitNum: 1,
auditFlag: 2,
shareFlag: 2,
shareUrl: '',
shareTitle: '',
shareIntro: '',
}
);
vm.loginAuthList = ["1"];
vm.userBase = Object.assign(
{},
{
address: false,
mobile: false,
name: false
}
);
vm.fileName = "";
vm.fileArray = [];
vm.excelFileName = "";
},
// 编辑
editQuestion(row) {
if (vm.$refs.questionForm !== undefined) {
vm.$refs.questionForm.resetFields();
}
vm.discussEditVisible = true;
vm.formStatus = "edit";
vm.excelFileName = "";
vm.fileName = "";
vm.fileArray = [];
vm.GET("/campaign/adminQuestionnaire/getQuestionnaireById", {
id: row.id
}).then(res => {
if (res.code == "000000") {
// console.log(res.data);
let { questionnaireInfo, loginAuthInfo } = res.data.data;
vm.questionEditList = Object.assign({}, questionnaireInfo);
vm.questionEditList = Object.assign({}, vm.questionEditList, {
questionIntro: questionnaireInfo.questionIntro.replace(
/<br>/g,
"\n"
),
limitNumFlag: questionnaireInfo.limitNum < 1 ? "1" : "0",
limitNum:
questionnaireInfo.limitNum < 1 ? 1 : questionnaireInfo.limitNum
});
const userBaseData = JSON.parse(questionnaireInfo.userBase);
vm.userBase = Object.assign({}, vm.userBase, {
address: Boolean(userBaseData.address),
mobile: Boolean(userBaseData.mobile),
name: Boolean(userBaseData.name)
});
vm.loginAuthList = loginAuthInfo;
}
});
},
// 上线/下线
onAndDownLine(row) {
let req = null;
if (row.status == 1) {
req = {
id: row.id,
status: 2
};
} else {
req = {
id: row.id,
status: 1
};
}
vm.GET("/campaign/adminQuestionnaire/upperOrLowerShip", req).then(res => {
if (res.code == "000000") {
vm.search();
}
});
},
// 导入题库
beforeImport(file) {
if (commonUtil.isEmptyUtils(file)) return;
let arr = file.type.split("/");
let ext = "." + arr[1];
let reader = new FileReader();
reader.onload = function(e) {
let fileJson = {
fileName: file.name,
file: e.target.result.substr(e.target.result.indexOf("base64,") + 7),
ext: ext
};
vm.fileArray = [
{
base64: fileJson
}
];
vm.fileName = file.name;
vm.excelFileName = file.name;
vm.$message.info("读取完毕");
};
reader.readAsDataURL(file);
return false;
},
// 模板下载
uploadTemplate() {
window.location.href = QUESTION_UPLOAD_TEMPLATE;
},
// 置灰不可点图片上传
beforeAvatarUpload_1(file) {
if (commonUtil.isEmptyUtils(file)) return;
vm.imgDoUpload(file, 1, 50, 750, 100);
return false;
},
// 点亮图片上传
beforeAvatarUpload_2(file) {
if (commonUtil.isEmptyUtils(file)) return;
vm.imgDoUpload(file, 2, 50, 750, 100);
return false;
},
// 提交图片上传
beforeAvatarUpload_3(file) {
if (commonUtil.isEmptyUtils(file)) return;
vm.imgDoUpload(file, 3, 50, 690, 88);
return false;
},
// 头图图片上传
beforeAvatarUpload_4(file) {
if (commonUtil.isEmptyUtils(file)) return;
vm.imgDoUpload(file, 4, 100, 750, -1);
return false;
},
imgDoUpload(file, urlType, size, w, h) {
const isSize = file.size / 1024 < size;
if (!isSize) {
vm.$message.info("上传图片要小于" + size + "k");
return;
}
var _img = new FileReader();
_img.readAsDataURL(file);
_img.onload = function(theFile) {
let image = new Image();
image.src = theFile.target.result;
image.onload = function() {
let _this = this;
let uploadFlag = false;
if (h == -1) {
if (_this.width != w) {
vm.$message.info("上传图片宽度应为" + w + ",请重新上传");
} else {
uploadFlag = true;
}
} else {
if (_this.width != w || _this.height != h) {
vm.$message.info(
"上传图片尺寸应为" + w + "*" + h + ",请重新上传"
);
} else {
uploadFlag = true;
}
}
if (uploadFlag) {
vm.$message.info("开始上传");
doUpload(
vm,
file,
getFilePath(file, null),
"preview4",
"progress1",
1
).then(function(path) {
if (urlType == 1) {
vm.questionEditList.nextDisableClickUrl = path.fullPath;
} else if (urlType == 2) {
vm.questionEditList.nextClickUrl = path.fullPath;
} else if (urlType == 3) {
vm.questionEditList.submitButtomUrl = path.fullPath;
} else {
vm.questionEditList.headDiagramUrl = path.fullPath;
}
vm.$message.success("上传成功");
});
}
};
};
},
// 提交
submitQuestion() {
if (vm.questionEditList.showType == 1) {
// 单题显示
vm.questionEditList.questionIntro = "";
vm.questionEditList.headDiagramUrl = "";
} else {
vm.questionEditList.nextDisableClickUrl = "";
vm.questionEditList.nextClickUrl = "";
}
if (!vm.questionEditList.id) {
if (commonUtil.isEmptyList(vm.fileArray)) {
vm.$message.info("请导入题库");
return;
}
}
if (vm.questionEditList.showType == 2) {
if (vm.questionEditList.shareFlag == 1) {
if (vm.questionEditList.shareUrl == '') {
vm.$message.info("请填写分享地址");
return;
}
if (vm.questionEditList.shareTitle == '') {
vm.$message.info("请填写分享标题");
return;
}
if (vm.questionEditList.shareIntro == '') {
vm.$message.info("请填写分享描述");
return;
}
}else {
vm.questionEditList.shareUrl = '';
vm.questionEditList.shareTitle = '';
vm.questionEditList.shareIntro = '';
}
}
let req = {
model: JSON.parse(JSON.stringify(vm.questionEditList)),
fileArray: vm.fileArray,
loginAuth: []
};
if (vm.questionEditList.limitNumFlag == 1) {
req.model.limitNum = -1;
}
let reqUserBase = Object.assign({}, vm.userBase, {
address: Number(vm.userBase.address),
mobile: Number(vm.userBase.mobile),
name: Number(vm.userBase.name)
});
req.model.userBase = JSON.stringify(reqUserBase);
vm.loginAuthList.map(u => {
req.loginAuth.push({
value: u
});
});
req.model.questionIntro = vm.questionEditList.questionIntro.replace(
/\n/g,
"<br>"
);
// console.log(req);
vm.$refs.questionForm.validate(valid => {
//console.log(this.discussEditVisible)
if (valid) {
if (vm.formStatus === 'create' && vm.questionEditList.showType == 2) {
vm.$confirm('业务类型提交后无法再次修改, 请确认是否提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
commonUtil.openLoading(vm)
vm.POST(
'/campaign/adminQuestionnaire/insertOrUpdateQuestionnaire',
req
).then(res => {
commonUtil.closeLoading(vm)
if (res.code == '000000') {
vm.discussEditVisible = false
vm.$message({
type: 'success',
message: '操作成功'
})
vm.search()
} else {
vm.$message.info(res.message)
}
})
})
.catch(() => {
vm.$message({
type: 'info',
message: '已取消提交'
})
})
} else {
commonUtil.openLoading(vm)
vm.POST(
'/campaign/adminQuestionnaire/insertOrUpdateQuestionnaire',
req
).then(res => {
commonUtil.closeLoading(vm)
if (res.code == '000000') {
vm.discussEditVisible = false
vm.$message({
type: 'success',
message: '操作成功'
})
vm.search()
} else {
vm.$message.info(res.message)
}
})
}
}
})
},
// 校验输入数字为正整数
checkLimitNum() {
const regexp = /^[1-9]\d*$/;
if (!regexp.test(vm.questionEditList.limitNum)) {
vm.questionEditList = Object.assign({}, vm.questionEditList, {
limitNum: 1
});
}
},
// foucs选中则改变radio
beforeInputLimitNum() {
vm.questionEditList = Object.assign({}, vm.questionEditList, {
limitNumFlag: "0"
});
}
}
};
</script>
<style lang="scss" scoped>
.question-wrap {
.question-content {
background: #fff;
.add-question {
float: right;
margin: 10px;
}
.table-empty {
img {
width: 100px;
}
p {
margin-top: -50px;
}
}
}
.submit-btn {
display: inline-block;
overflow: hidden;
p {
font-size: 12px;
}
.avatar-uploader {
float: right;
.el-button {
margin-left: 10px;
}
.head-btn {
margin-top: 48px !important;
}
}
.uploat-content {
float: left;
.bg-img {
width: 150px;
height: 30px;
}
.head-bg-img {
width: 80px;
height: 80px;
}
}
}
.login-auth {
width: 400px;
.el-checkbox {
display: inline-block;
width: 150px;
text-align: left;
}
}
}
</style>
<style>
.spe-label-require .el-form-item__label:before{
content: '*';
color: #F56C6C;
margin-right: 4px;
}
</style>
<template>
<div class="item-component-wrap">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond">
</bread-crumb>
<div class="component-content screenSet" id="screenSet">
<div class="search-title">查询条件</div>
<el-row :gutter="30" class="row" type="flex" style="margin-top: 10px;">
<el-form ref="serchForm" :model="searchParam" label-width="75px" style="width:100%;">
<el-col :span="6">
<el-form-item label="话题名称:">
<el-input clearable v-model="searchParam.theme" size="mini" placeholder="请输入话题名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="创建日期:">
<el-date-picker v-model="searchParam.time" size="mini" type="date" placeholder="选择日期"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="创建人:">
<el-input clearable v-model="searchParam.name" size="mini" placeholder="请输入组件名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最后修改人:">
<el-input clearable v-model="searchParam.name" size="mini" placeholder="请输入组件名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="状态:">
<el-select clearable v-model="searchParam.status" size="mini" placeholder="请选择发布状态">
<el-option
v-for="(item,index) in statuSelect"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col style="text-align:right;padding:0 30px 15px 0;">
<el-button type="primary" size="small" @click="search">查询</el-button>
<el-button type="default" size="small" @click="reseat">重置</el-button>
<el-button type="primary" size="small" @click="createTopic">新建话题</el-button>
</el-col>
</el-form>
</el-row>
<el-table
:data="tableData"
style="width: 100%" v-loading="loading">
<el-table-column prop="id" label="排序" min-width="50" align="center"></el-table-column>
<el-table-column prop="subject" label="话题名称" min-width="100" align="center"></el-table-column>
<el-table-column prop="createdusername" label="创建人" min-width="50" align="center"></el-table-column>
<el-table-column prop="remark" label="创建日期" min-width="100" align="center"></el-table-column>
<el-table-column prop="createdName" label="最后修改人" min-width="100" align="center"></el-table-column>
<el-table-column prop="createdName" label="修改日期" min-width="100" align="center"></el-table-column>
<el-table-column prop="status" label="状态" min-width="80" align="center">
<template slot-scope="scope">
<span>{{ scope.row.status | filteFun}}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="center" min-width="200">
<template slot-scope="scope">
<el-button type="primary" size="small" @click="edit(scope.row)">编辑</el-button> <el-button type="primary" v-if="scope.row.status == 3 || scope.row.status == 1" size="small" @click="optFun(scope.row,'发布')">发布</el-button>
<el-button type="primary" v-if="scope.row.status == 2" size="small" @click="optFun(scope.row,'下线')">下线</el-button>
<el-button type="primary" size="small" @click="topicManage(scope.row)">置顶</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png" />
<p>没有查询到相关结果</p>
</div>
</div>
</el-table>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchParam.pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000, 1500, 2000]"
:page-size="searchParam.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from '../../components/breadcrumb.vue'
import { doUpload, getFilePath } from "../../utils/qiniu-util"
import { validateWord } from "../../utils/validate.js"
import { mapGetters } from 'vuex'
import { openLoading, closeLoading } from '../../utils/utils'
import * as commonUtil from '../../utils/utils'
let vm = null
export default {
components: {
BreadCrumb
},
data() {
return {
curmbFirst: '组件',
curmbSecond: '举报设置',
searchParam: {
theme:'',
type:'',
name:'',
status: '',
pageNo: 1,
pageSize: 15
},
category:[
{
value:'积木',
label:'积木'
}
],
statuSelect: [
{
label: '未发布',
value: '1'
},{
label: '已发布',
value: '2'
},{
label: '已下架',
value: '3'
}
],
tableData: [],
totalRows: 0,
loading:false,
isShow:true,
}
},
computed: {
...mapGetters([
'_token',
'idType'
])
},
filters:{
filteFun(index){
let str = '';
if(index == 1){
str = '未发布'
}else if(index == 2){
str = '已发布'
}else if(index == 3){
str = '已下线'
}
return str
}
},
created() {
this.getData()
//this.sun()
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight()
},
methods: {
// 列表查询
search() {
this.getData()
},
getFun(obj){
console.log(obj)
this.isShow = false;
},
//获取数据
getData(){
let subject = 0,status = 0,name = 0;
if(this.searchParam.theme != ''){
subject = this.searchParam.theme
}
if(this.searchParam.status != ''){
status = this.searchParam.status
}
if(this.searchParam.name != ''){
name = this.searchParam.name
}
this.loading = true;
let url = '/interaction/discuss/'+subject+'/'+name+'/'+status+'/'+this.searchParam.pageNo+'/'+this.searchParam.pageSize
this.GET(url).then((res) => {
this.loading = false
if( res.code == '000000' ) {
this.tableData = res.data.discuss || []
this.totalRows = res.data.count
}
})
},
// 重置
reseat() {
this.searchParam = Object.assign({},{
theme:'',
type:'',
name:'',
category:'',
status: '',
pageNo: 1,
pageSize: 15
})
this.getData()
},
// 新建组件
createTopic() {
this.isShow = true;
},
edit(item){
this.$router.push({path: 'creat-discuss',query:{id:item.id}})
},
topicManage(item){
},
// 发布、下线
optFun(row,str) {
let status = 0;
if(str == '发布'){
status = 2
}else if(str == '下线'){
status = 3
}
this.$confirm('确定要'+str+'该讨论吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.PUT('/interaction/discuss/',{id: row.id,status:status}).then((res) => {
if(res.code == "000000") {
this.$message({
type: 'success',
message: '操作成功!'
});
this.getData()
}
}).catch(function (error) {
this.$message.error(error);
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消'
})
})
},
handleSizeChange(value) {
this.searchParam.pageSize = value
this.getData()
},
handleCurrentChange(value) {
this.searchParam.pageNo = value
this.getData()
}
}
}
</script>
<style lang="scss">
.item-component-wrap {
.component-content {
padding: 10px;
background: #fff;
// margin: 84px 20px 20px;
.search-title {
padding: 10px 12px;
font-size: 12px;
color: #449284;
border-bottom: 1px solid #efefef;
}
.create-button {
padding: 0 0 15px;
margin-top: 0 !important;
text-align: right;
}
.table-empty {
img{
width: 100px;
}
p {
margin-top: -50px;
}
}
}
}
</style>
<template>
<div class="item-component-wrap">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond">
</bread-crumb>
<div class="component-content screenSet" id="screenSet">
<div class="search-title">预警邮箱</div>
<el-row :gutter="30" class="row" type="flex" style="margin-top: 10px;" v-for="(item,index) in reportData" :key="index">
<el-form label-width="75px" style="width:100%;">
<el-col :span="5">
<el-form-item label="姓名:">
<el-input clearable v-model="item.userName" size="mini" placeholder="请输入接收人姓名"></el-input>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="Dr.id:">
<el-input clearable v-model="item.doctorId" size="mini" placeholder="请输入doctorId"></el-input>
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="邮箱地址:">
<el-col :span="12" style="padding-right: 5px;">
<el-input clearable v-model="item.email" size="mini" placeholder="请输入邮箱前缀"></el-input>
</el-col>
<div class='email-h'>@picahealth.com</div>
</el-form-item>
</el-col>
<el-col :span="2">
<div class="opt-icon">
<i class="el-icon-circle-plus-outline" @click="add"></i>
<i class="el-icon-remove-outline" @click="remove(index)" v-if="index > 0"></i>
</div>
</el-col>
</el-form>
</el-row>
<div class="opt-btn">
<el-button type="primary" size="small" @click="save" :disabled="isSaveBack">保存</el-button>
<el-button size="small" class="button-white" @click="goBack">返回</el-button>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from '../../components/breadcrumb.vue'
import { doUpload, getFilePath } from "../../utils/qiniu-util"
import { validateWord } from "../../utils/validate.js"
import { mapGetters } from 'vuex'
import { openLoading, closeLoading } from '../../utils/utils'
import * as commonUtil from '../../utils/utils'
let vm = null
export default {
components: {
BreadCrumb
},
data() {
return {
curmbFirst: '组件',
curmbSecond: '举报设置',
reportData:[],
isSaveBack:false,
}
},
computed: {
...mapGetters([
'_token',
'idType'
])
},
created() {
this.getData()
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight()
},
methods: {
//返回
goBack(){
this.$router.back(-1)
},
//保存
save(){
let index = this.handelData(this.reportData)
console.log(index)
if(index == 1){
this.$message({
message: '姓名、邮箱或doctorId不能为空!',
type: 'warning'
});
return;
}
if(index == 2){
this.$message({
message: 'doctorId已存在',
type: 'warning'
});
return;
}
if(index == 3){
this.$message({
message: 'doctorId只能是大于0的纯数字!',
type: 'warning',
});
return;
}
let d = this.handelEmail(this.reportData ,2)
let parm = {
informConfigs:d
}
//JSON.stringify(this.reportData)
this.loading = true;
this.isSaveBack = true;
this.POST('/interaction/informConfig/insertAdmin',parm).then((res) => {
this.loading = false
if( res.code == '000000' ) {
this.$message({
message: '保存成功!',
type: 'success'
});
}else{
this.$message({
message: res.message,
type: 'warning'
});
}
setTimeout(()=>{
this.isSaveBack = false;
},2000)
})
},
add(){
this.reportData.push(
{
"doctorId": '',
"email": "",
"userName": ""
},
)
},
remove(index){
this.reportData.splice(index, 1);
},
//保存
saveFun(){
},
handelData(d){
console.log(d)
let index = null,hash = [],r = /^[1-9]+\d*$/;
for(let i=0;i<d.length;i++){
let parm = String(d[i].doctorId)
if(d[i].doctorId == '' || d[i].userName == '' || d[i].email == ''){
index = 1
break;
}
if(!r.test(d[i].doctorId)){
console.log(d[i].doctorId)
index = 3
break;
}
if(hash.indexOf(parm) == -1){
hash.push(parm)
}else{
index = 2;
break;
}
}
return index;
},
//处理邮箱展示
handelEmail(d,str){
let A = [],parm = {};
for(let i=0;i<d.length;i++){
parm = {...d[i]}
if(str == 1){
parm['email'] = d[i].email.split("@")[0]
}else if(str == 2){
parm['email'] = d[i].email + '@picahealth.com'
}
A.push(parm)
}
console.log(A)
return A;
},
//获取数据
getData(){
let parm = {
pageNo:1,
pageSize:20
}
this.GET('/interaction/informConfig/getInformList',parm).then((res) => {
if( res.code == '000000' ) {
if(res.data.length == 0){
this.reportData = [{
"doctorId": '',
"email": "",
"userName": ""
},]
}else{
this.reportData = this.handelEmail(res.data,1) || []
}
}else{
this.$message({
message: res.message,
type: 'warning'
});
}
})
},
}
}
</script>
<style lang="scss">
.item-component-wrap {
.component-content {
padding: 10px;
background: #fff;
// margin: 84px 20px 20px;
.search-title {
padding: 10px 12px;
font-size: 12px;
color: #449284;
border-bottom: 1px solid #efefef;
}
.create-button {
padding: 0 0 15px;
margin-top: 0 !important;
text-align: right;
}
.table-empty {
img{
width: 100px;
}
p {
margin-top: -50px;
}
}
.opt-icon{
line-height: 40px;
i{
margin-right: 10px;
}
}
.opt-btn{
text-align: center
}
.email-h{
float: left;
}
}
}
</style>
<template>
<el-dialog :title="title" :visible.sync="dialogFormVisible" @close="optFun('1')">
<el-form :model="form" class="topicOpt">
<el-form-item label="主题" :label-width="formLabelWidth" required>
<el-input v-model="objInfo.topic.subject" auto-complete="off" clearable size="mini" :maxLength="max" placeholder="请输入主题(最长60个字符)"></el-input>
</el-form-item>
<el-form-item label="内容" :label-width="formLabelWidth" >
<el-input type="textarea" v-model="objInfo.topic.content" auto-complete="off" clearable size="mini" :maxLength="maxL" placeholder="请输入主题(最长1000个字符)" rows="5"></el-input>
</el-form-item>
<el-form-item label="话题配图" :label-width="formLabelWidth" class="teste1">
<!-- <el-upload
action="#"
list-type="picture-card"
:file-list="fileList"
:on-change="selectImg"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove">
<i class="el-icon-plus"></i> -->
<el-upload
action="#"
list-type="picture-card"
:file-list="fileList"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:before-upload="beforeAvatarUpload"
>
<i class="el-icon-plus"></i>
</el-upload>
<el-dialog :visible.sync="dialogVisible" size="tiny" :modal="false" :close-on-click-modal="false">
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="optFun('1')" size="mini">取 消</el-button>
<el-button type="primary" @click="optFun('2')" size="mini" :disabled="isRequestBack">确 定</el-button>
</div>
</el-dialog>
</template>
<script>
import { doUpload, getFilePath } from "../../utils/qiniu-util";
import { mapGetters } from "vuex";
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
let vm = null;
export default {
data() {
return {
formLabelWidth:"80px",
form:{},
id:null,
dialogImageUrl:'',
max:60,
maxL:1000,
dialogVisible:false,
dialogFormVisible:false,
fileList:[],
title:'编辑话题',
reType: ['PUT','POST'],
isEdit:false,
objInfo:{
topic:{
subject:'',
content:''
},
images:[]
},
isRequestBack:false,
};
},
props:{
isShow:{
default:false,
type:Boolean
},
editInfo:{
default:()=>{},
type:Object
},
discussId:{
default:0,
type:Number
}
},
computed: {
...mapGetters(["_token", "idType"]),
},
created() {
this.dialogFormVisible = this.isShow
if(this.editInfo.topic){
this.isEdit = true;
this.objInfo = this.editInfo;
this.objInfo.topic.content = this.objInfo.topic.content.replace(/&nbsp;/g, " ");
}else{
this.title = '新增话题'
this.isEdit = false
}
console.log(this.editInfo);
if(this.objInfo.images.length > 0){
for(let i=0;i<this.objInfo.images.length;i++){
this.fileList.push({
url:this.objInfo.images[i].imageurl,
imageurl:this.objInfo.images[i].imageurl,
id:this.objInfo.images[i].id
})
}
}
},
// 挂载到Dom完成时
mounted: function() {
},
methods: {
handlePictureCardPreview(file){
//console.log(file)
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
selectImg(file){
//console.log(file)
this.fileList.push({
url:file.url,
imageurl:file.url,
})
},
beforeAvatarUpload(file){
//console.log(file)
let imgTypes = ['jpg','png','gif','jpeg']
if(file.type){
let fileType = file.type.split('/')[1];
if(imgTypes.indexOf(fileType) == -1){
this.showError('上传图片格式仅支持png、jpg、jpeg、gif ');
return false;
}
}else{
this.showError('上传图片格式仅支持png,jpg,jpeg,gif!');
return false;
}
// console.log(this.fileList)
if(this.fileList.length > 5 ){
// /、this.$message.info('图片个数不能超过6个')
this.showError('上传图片个数不能超过6个');
return false;
}
this.imgDoUpload(file, 4, 2048, 400, 400)
},
imgDoUpload(file, urlType, size, w, h) {
let vm = this;
const isSize = file.size / 1024 < size;
if (!isSize) {
//vm.$message.info('上传图片要小于' + size + 'k')
//vm.$message.info('上传图片要小于2M')
vm.showError('上传图片要小于2M');
return;
}
var _img = new FileReader()
_img.readAsDataURL(file)
_img.onload = function(theFile) {
let image = new Image()
image.src = theFile.target.result
image.onload = function() {
let _this = this
vm.$message.info('开始上传');
doUpload(vm, file, getFilePath(file, null), 'preview4', 'progress1', 1).then(function(path) {
//console.log(path)
vm.fileList.push({
url:path.fullPath,
imageurl:path.fullPath
})
vm.$message.success('上传成功')
}).catch((res)=>{
console.log(res)
});
}
}
},
handleRemove(file, fileList){
let index = null;
if(this.fileList.length>0){
for(let i=0;i<this.fileList.length;i++){
if(file.url == this.fileList[i].url){
index = i;
break;
}
}
if(index != null){
this.fileList.splice(index,1)
}
//console.log(file)
//console.log(this.fileList)
}
},
optFun(index){
if(index == 1){
this.dialogFormVisible = false;
this.$emit('setFun',false)
}else if(index == 2){
this.subFun()
}
},
//返回
goBack(){
this.$router.back(-1)
},
showError(str){
//console.log(str)
this.$message({
message: str,
type: 'warning'
});
},
//保存修改讨论组件详细
subFun(){
let A = this.isEdit ? this.reType[0] : this.reType[1];
let _this = this;
if(this.objInfo.topic.subject.length == 0){
this.showError('请输入主题!');
return;
}
// 加入话题内容识别宫格
let placeContent = this.objInfo.topic.content.replace(/ /gi,'&nbsp;');
let parm = {
topic:{
subject:this.objInfo.topic.subject,
// content:this.objInfo.topic.content,
content:placeContent,
discussid:this.objInfo.topic.discussid || this.discussId,
id:this.objInfo.topic.id || null,
official:true
},
images:this.fileList
}
this.isRequestBack = true;
this[A]('/interaction/topic/',parm).then((res) => {
if( res.code == '000000' ) {
this.$message({
message: '操作成功!',
type: 'success'
});
setTimeout(()=>{
this.isRequestBack = false;
this.$emit('setFun',true)
},2000)
}else{
this.isRequestBack = false;
this.$message({
message: res.message,
type: 'error'
});
}
}).catch(function (error) {
///console.log()
//_this.$message.error('接口异常请联系管理员');
});
}
}
};
</script>
<style lang="scss">
.topicOpt{
.el-form-item__content{
width:80%;
}
.el-upload--picture-card{
height: 80px;
width: 80px;
line-height: 80px;
}
.el-upload-list--picture-card .el-upload-list__item{
width: 80px;
height: 80px;
}
.el-form-item__label{
// line-height: 26px;
}
}
</style>
\ No newline at end of file
<template>
<div class="item-component-wrap">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond">
</bread-crumb>
<div class="component-content screenSet" id="screenSet">
<div class="search-title">查询条件</div>
<el-row :gutter="30" class="row" type="flex" style="margin-top: 10px;">
<el-form ref="serchForm" :model="searchParam" label-width="75px" style="width:100%;">
<!-- <el-col :span="6">
<el-form-item label="话题名称:">
<el-input clearable v-model="searchParam.theme" size="mini" placeholder="请输入话题名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="创建日期:">
<el-date-picker v-model="searchParam.time" size="mini" type="date" placeholder="选择日期"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="创建人:">
<el-input clearable v-model="searchParam.name" size="mini" placeholder="请输入组件名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最后修改人:">
<el-input clearable v-model="searchParam.name" size="mini" placeholder="请输入组件名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="状态:">
<el-select clearable v-model="searchParam.status" size="mini" placeholder="请选择发布状态">
<el-option
v-for="(item,index) in statuSelect"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col> -->
<el-col style="text-align:right;padding:0 30px 15px 0;">
<!-- <el-button type="primary" size="small" @click="search">查询</el-button>
<el-button type="default" size="small" @click="reseat">重置</el-button> -->
<el-button type="primary" size="small" @click="createTopic">新建话题</el-button>
</el-col>
</el-form>
</el-row>
<el-table
:data="tableData"
style="width: 100%" v-loading="loading">
<el-table-column type="index" prop="topOrder" label="排序" min-width="50" align="center"></el-table-column>
<el-table-column prop="id" label="Id" min-width="50" align="center"></el-table-column>
<el-table-column prop="subject" label="话题名称" min-width="100" align="center"></el-table-column>
<el-table-column prop="createdName" label="创建人" min-width="50" align="center"></el-table-column>
<el-table-column prop="createdtime" label="创建日期" min-width="100" align="center"></el-table-column>
<el-table-column prop="modifiedName" label="最后修改人" min-width="100" align="center"></el-table-column>
<el-table-column prop="modifiedName" label="话题来源" min-width="100" align="center">
<template slot-scope="scope">
<span>{{ scope.row.official ? '官方' : '用户'}}</span>
</template>
</el-table-column>
<el-table-column prop="modifiedtime" label="修改日期" min-width="100" align="center"></el-table-column>
<el-table-column prop="status" label="状态" min-width="80" align="center">
<template slot-scope="scope">
<span v-if="!scope.row.official">已发布</span>
<span v-else>{{ scope.row.releaseStatus == 1 ? '已发布' : '未发布'}}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="center" min-width="200">
<template slot-scope="scope">
<el-button type="primary" size="small" @click="edit(scope.row)">编辑</el-button>
<el-button type="primary" v-if="!scope.row.official" size="small" @click="optFun(scope.row)" disabled>下线</el-button>
<el-button type="primary" v-if="scope.row.releaseStatus == 1 && scope.row.official" size="small" @click="optFun(scope.row)" >下线</el-button>
<el-button type="primary" v-if="scope.row.releaseStatus != 1 && scope.row.official" size="small" @click="optFun(scope.row)" >发布</el-button>
<el-button v-if="scope.row.toporder == 0" type="primary" size="small" @click="topicManage(scope.row,'置顶')">置顶</el-button>
<el-button v-else type="primary" size="small" @click="topicManage(scope.row,'取消置顶')">取消置顶</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png" />
<p>没有查询到相关结果</p>
</div>
</div>
</el-table>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[15, 30, 50, 100, 200, 500, 700, 1000, 1500, 2000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows">
</el-pagination>
</div>
</div>
<AddEdit :isShow="isShow" v-on:setFun="getFun" v-if="isShow" :editInfo="editInfo" :discussId="discussId"></AddEdit>
</div>
</template>
<script>
import BreadCrumb from '../../components/breadcrumb.vue'
import { doUpload, getFilePath } from "../../utils/qiniu-util"
import { validateWord } from "../../utils/validate.js"
import { mapGetters } from 'vuex'
import { openLoading, closeLoading } from '../../utils/utils'
import * as commonUtil from '../../utils/utils'
import AddEdit from './add-edit.vue'
let vm = null
export default {
components: {
BreadCrumb,AddEdit
},
data() {
return {
curmbFirst: '组件',
curmbSecond: '讨论组件',
searchParam: {
theme:'',
type:'',
name:'',
status: '',
pageNo: 1,
pageSize: 15
},
category:[
{
value:'积木',
label:'积木'
}
],
statuSelect: [
{
label: '未发布',
value: '1'
},{
label: '已发布',
value: '2'
},{
label: '已下架',
value: '3'
}
],
tableData: [],
totalRows: 0,
loading:false,
isShow:false,
discussId:null,
pageNo:1,
pageSize:15,
editInfo:{},
}
},
computed: {
...mapGetters([
'_token',
'idType'
])
},
created() {
this.discussId = Number(this.$route.query.id)
this.getData()
//this.sun()
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight()
},
methods: {
// 列表查询
search() {
this.getData()
},
getFun(obj){
console.log(obj)
this.isShow = false
if(obj){
this.getData()
}
},
//获取数据
getData(){
let _this = this;
this.loading = true;
let parm = {
discussId:this.discussId,
pageNo:this.pageNo,
pageSize:this.pageSize
}
this.GET('/interaction/topic/getTopicList',parm).then((res) => {
this.loading = false
if( res.code == '000000' ) {
this.tableData = res.data.topics || []
this.totalRows = res.data.count
}else{
this.$message({
message: res.message,
type: 'warning'
});
}
}).catch(function (error) {
console.log(error.message)
_this.$message.error(error.message);
_this.loading = false
});
},
// 重置
reseat() {
this.searchParam = Object.assign({},{
theme:'',
type:'',
name:'',
category:'',
status: '',
pageNo: 1,
pageSize: 15
})
this.getData()
},
// 新建组件
createTopic() {
this.editInfo = {}
this.isShow = true;
},
edit(item){
///topic/getTopicDetailsById
this.GET('/interaction/topic/getTopicDetailsById',{topicId: item.id}).then((res) => {
if(res.code == "000000") {
this.editInfo = res.data;
this.isShow = true;
}else{
this.$message({
message: res.message,
type: 'warning'
});
}
}).catch(function (error) {
// this.$message.error(error);
});
},
// 置顶
topicManage(item,str){
///topic/topicTop
let _this = this;
let status = 0;
if(str == '置顶'){
status = 1
}else if(str == '取消置顶'){
status = 2
}
this.$confirm('确定要'+str+'该讨论吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
_this.GET('/interaction/topic/topicTop',{topicId: item.id, topNum: status}).then((res) => {
if(res.code == "000000") {
_this.$message({
type: 'success',
message: '操作成功!'
});
_this.setTimeFun()
}
}).catch(function (error) {
// this.$message.error(error);
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消'
})
})
},
setTimeFun(){
setTimeout(()=>{
this.getData()
},2000)
},
// 发布、下线
optFun(row) {
let status = 0,str = '',_this = this,index = 0;
str = row.releaseStatus == 1 ? '下架' : '发布'
if(row.releaseStatus == 1){
index = 2
}else if(row.releaseStatus == 2){
index = 1
}
let parm = {
topic:{
id: row.id,
releaseStatus:index
}
}
this.$confirm('确定要'+str+'该话题吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
_this.PUT('/interaction/topic/updateRelease',parm).then((res) => {
if(res.code == "000000") {
_this.$message({
type: 'success',
message: '操作成功!'
});
_this.setTimeFun()
}
}).catch(function (error) {
// this.$message.error(error);
});
}).catch(() => {
_this.$message({
type: 'info',
message: '已取消'
})
})
},
handleSizeChange(value) {
this.pageSize = value
this.getData()
},
handleCurrentChange(value) {
this.pageNo = value
this.getData()
}
}
}
</script>
<style lang="scss">
.item-component-wrap {
.component-content {
padding: 10px;
background: #fff;
// margin: 84px 20px 20px;
.search-title {
padding: 10px 12px;
font-size: 12px;
color: #449284;
border-bottom: 1px solid #efefef;
}
.create-button {
padding: 0 0 15px;
margin-top: 0 !important;
text-align: right;
}
.table-empty {
img{
width: 100px;
}
p {
margin-top: -50px;
}
}
}
}
</style>
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册