Commit 0206ff80 authored by BlueWhite's avatar BlueWhite

Merge remote-tracking branch 'origin/develop'

# Conflicts:
#	README.md
parents 946fe8d5 859271ce
Pipeline #7781 passed with stage
in 12 seconds
stages:
- build-develop
build:
stage: build-develop
only:
- develop
- master
allow_failure: true
script:
- chcp 65001
- cmd /c npm install
- cmd /c npm run build
- cmd /c npm run build
- cmd /c xcopy .\dist D:\BCDH-APP\nginx-1.18.0\html\dist /s /Y
tags:
- BCDH-APP
\ No newline at end of file
This diff is collapsed.
......@@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>新蜂商城</title>
<title>首开App</title>
<link rel="stylesheet" href="//at.alicdn.com/t/font_1623819_3g3arzgtlmk.css">
</head>
<body>
......
......@@ -7,48 +7,131 @@
* 版权所有,侵权必究!
*
-->
<template>
<div id="app">
<transition :name="transitionName">
<router-view class="router-view" />
</transition>
</div>
<div id="app">
<div :style="{ height: showTab ?appHeight:'100%' }" id="app-content">
<transition :name="transitionName">
<keep-alive :include="cachePage">
<router-view class="router-view" />
</keep-alive>
</transition>
</div>
<tab-bar v-if="showTab"></tab-bar>
</div>
</template>
<script>
export default {
data () {
return {
transitionName: 'slide-left'
}
import tabBar from "@/components/TabBar";
export default {
components: {
tabBar,
},
data() {
return {
appHeight: "",
tabH: "",
rempx: 0,
headH: "",
screenH: "",
transitionName: "slide-left",
cachePage: [
"add-danger",
"change-info",
"affirm-danger",
"risk-affirm",
"manager-survey",
"super-survey",
// "major-survey",
"risk-add",
"noticeList",
"confirmNote",
],
// cachePage预先定义的缓存页面
otherCache: [],
// 专门处理列表缓存的页面,这些页面缓存逻辑与其他缓存不一样去详情返回列表缓存,但是进入列表必须刷新,如何有需要缓存的列表请放到这里来。
listCache:['insert-danger','confirme-danger','report-return','change-danger','review-danger','stand-book','major-danger','delay-approval',
'my-delay','risk-return','risk-account','risk-confirme','my-delay'],
};
},
mounted() {
// 这个配合列表路由使用缓存初始缓存页面
this.otherCache=[...this.cachePage];
let tabH =
document
.getElementsByTagName("html")[0]
.style.fontSize.split("px")[0] * 1.33333;
let sH = document.documentElement.clientHeight;
this.headH =
document
.getElementsByTagName("html")[0]
.style.fontSize.split("px")[0] * 1.5;
+"px";
this.appHeight = sH - tabH + "px";
this.tabH = tabH + "px";
this.screenH = sH + "px";
},
computed: {
showTab() {
return !["login", "login2", "choose-people","scan",'success','fail','warn'].includes(
this.$route.name
);
},
},
watch: {
$route(to, from) {
// 有主级到次级
if (to.meta.index > from.meta.index) {
this.transitionName = 'slide-left' // 向左滑动
} else if (to.meta.index < from.meta.index) {
// 由次级到主级
this.transitionName = 'slide-right'
} else {
this.transitionName = '' //同级无过渡效果
}
}
}
}
$route(to, from) {
// 列表页面动态添加缓存
if(from.name=='save-workbench'){
// 如何使从工作台进入列表页面在cachePage里添加页面
if((!this.cachePage.includes(to.name))&&this.listCache.includes(to.name)){
this.cachePage.push(to.name)
}
}
if(to.name=='save-workbench'){
// 如何回到工作台默认恢复预定义缓存页面
this.cachePage=[...this.otherCache];
}
// 有主级到次级
if (to.meta.index > from.meta.index) {
this.transitionName = "slide-left"; // 向左滑动
} else if (to.meta.index < from.meta.index) {
// 由次级到主级
this.transitionName = "slide-right";
} else {
this.transitionName = ""; //同级无过渡效果
}
},
},
};
</script>
<style lang="less">
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
// text-align: center;
color: #2c3e50;
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
// text-align: center;
color: #2c3e50;
box-sizing: border-box;
overflow: hidden;
position: relative;
overflow: hidden;
height: 100vh;
// z-index:999999999999
}
#app-content {
box-sizing: border-box;
overflow: hidden;
position: absolute;
left: 0;
top: 0;
width: 100%;
overflow: hidden;
}
.router-view{
.router-view {
width: 100%;
height: auto;
position: absolute;
......@@ -57,31 +140,32 @@
margin: 0 auto;
-webkit-overflow-scrolling: touch;
background-color: #f0f1f5;
overflow: auto;
}
.slide-right-enter-active,
.slide-right-leave-active,
.slide-left-enter-active,
.slide-left-leave-active{
.slide-left-leave-active {
height: 100%;
will-change: transform;
transition: all 500ms;
position: absolute;
backface-visibility: hidden;
}
.slide-right-enter{
.slide-right-enter {
opacity: 0;
transform: translate3d(-100%, 0, 0);
}
.slide-right-leave-active{
.slide-right-leave-active {
opacity: 0;
transform: translate3d(100%, 0, 0);
}
.slide-left-enter{
.slide-left-enter {
opacity: 0;
transform: translate3d(100%, 0, 0);
}
.slide-left-leave-active{
.slide-left-leave-active {
opacity: 0;
transform: translate3d(-100%, 0, 0);
}
......
export default {
//转换日期格式
//time : 要转换的时间
//type : DT1 转换为 2019-01-01 8:12:42格式
//type : DT2 转换为 2019-01-01格式
//type : DT3 转换为 2019/01/01 8:12:42格式
//type : DT4 转换为 2019/01/01格式
//type : DT5 转换为 时间戳格式
//type : DT6 转换为 2019年01月01日 8时12分42秒
//type : DT7 转换为 2019年01月01日
//zero : 时分秒是否补零(2000-01-01 08:02:06)
//num : 要加的天数,正数为加,负数为减,不加不减就不用传
timestampToTime (time,type,zero,num) {
if(!time){return ''}
try{
var date = new Date(time)
if(num&&typeof parseInt(num)=="number"){
date = new Date(new Date(time).getTime()+num*60*60*24*1000)//时间戳以毫秒为单位,也可用其他日期格式
}
let yy = date.getFullYear();//年
let mm = date.getMonth()+1;//月
let dd = date.getDate();//日
let hh = date.getHours();//小时
let mf = date.getMinutes()<10 ? '0'+date.getMinutes() : date.getMinutes();//分钟
let ss = date.getSeconds()<10 ? '0'+date.getSeconds() : date.getSeconds();//秒
if(zero){
if(mm<10){mm='0'+mm}
if(dd<10){dd='0'+dd}
if(hh<10){hh='0'+hh}
}
if(type=="DT1"){
return yy+'-'+mm+'-'+dd+' '+hh+':'+mf+':'+ss;//yyyy-mm-dd hh:mf:ss
}else if(type=="DT2"){
return yy+'-'+mm+'-'+dd;//yyyy-mm-dd
}else if(type=="DT3"){
return yy+'/'+mm+'/'+dd+' '+hh+':'+mf+':'+ss;//yyyy/mm/dd hh:mf:ss
}else if(type=="DT4"){
return yy+'-'+mm+'-'+dd;//yyyy/mm/dd
}else if(type=="DT5"){
return date.getTime();//时间戳 秒数
}else if(type=="DT6"){
return yy+''+mm+''+dd+''+hh+''+mf+''+ss+'';//yyyy年mm月dd日 hh时mf分ss秒
}else if(type=="DT7"){
return yy+''+mm+''+dd+'';//yyyy年mm月dd日
}else if(type=="DT8"){
return yy+'-'+mm+'-'+dd+' '+'00'+':'+'00'+':'+'00';//yyyy-mm-dd hh:mf:ss
}
}catch(e){
console.log("timestampToTime Error");return ""
}
},
}
\ No newline at end of file
......@@ -49,3 +49,8 @@ body.dialog-open {
-moz-box-sizing: border-box;
box-sizing: border-box;
}
/deep/.con-list .van-cell-group--inset{
font-size: 0.4rem !important;
}
// qrcode.vue
<template>
<div>
<van-image
@click="$router.back()"
:src="require('../assets/back.png')"
/>
<p class="error">{{ error }}</p>
<!--错误信息-->
<!-- <p class="decode-result">
扫描结果:
<b>{{ result }}</b>
</p> -->
<!--扫描结果-->
<!-- <p @click="openCamera">打开相机</p>
<div v-show="show" class="cameraMessage">
<p @click="closeCamera">关闭相机</p>
<p @click="openFlash">打开手电筒</p>
<p @click="switchCamera">相机反转</p>
</div> -->
<qrcode-stream
v-show="qrcode"
@decode="onDecode"
@init="onInit"
>
<div>
<div class="qr-scanner">
<div class="box">
<div class="line"></div>
<div class="angle"></div>
</div>
<div class="txt">
将二维码/条码放入框内,即自动扫描
<div class="myQrcode">我的二维码</div>
</div>
</div>
</div>
</qrcode-stream>
</div>
</template>
<script>
// 下载插件
// cnpm install --save vue-qrcode-reader
// 引入
import { QrcodeStream } from "vue-qrcode-reader";
export default {
// 注册
components: { QrcodeStream },
data() {
return {
result: "", // 扫码结果信息
error: "", // 错误信息
// show: false,
// qrcode: false,
qrcode: true,
torchActive: false,
camera: "rear",
// camera: "front"
};
},
methods: {
onDecode(result) {
console.log(result);
this.result = result;
this.$emit('success',result)
},
async onInit(promise) {
// const { capabilities } = await promise;
// const TORCH_IS_SUPPORTED = !!capabilities.torch;
promise.catch(error=>{
// alert(1111)
if (error.name === "NotAllowedError") {
this.error = "ERROR: 您需要授予相机访问权限";
} else if (error.name === "NotFoundError") {
this.error = "ERROR: 这个设备上没有摄像头";
} else if (error.name === "NotSupportedError") {
this.error = "ERROR: 所需的安全上下文(HTTPS、本地主机)";
} else if (error.name === "NotReadableError") {
this.error = "ERROR: 相机被占用";
} else if (error.name === "OverconstrainedError") {
this.error = "ERROR: 安装摄像头不合适";
} else if (error.name === "StreamApiNotSupportedError") {
this.error = "ERROR: 此浏览器不支持流API";
}
// console.log(error.name)
})
},
// 打开相机
// openCamera() {
// this.camera = 'rear'
// this.qrcode = true
// this.show = true
// },
// 关闭相机
// closeCamera() {
// this.camera = 'off'
// this.qrcode = false
// this.show = false
// },
// 打开手电筒
// openFlash() {
// switch (this.torchActive) {
// case true:
// this.torchActive = false
// break
// case false:
// this.torchActive = true
// break
// }
// },
// 相机反转
// switchCamera() {
// // console.log(this.camera);
// switch (this.camera) {
// case 'front':
// this.camera = 'rear'
// console.log(this.camera)
// break
// case 'rear':
// this.camera = 'front'
// console.log(this.camera)
// break
// }
// }
},
};
</script>
<style scoped lang="less">
.error {
font-weight: bold;
color: red;
}
.cameraMessage {
width: 100%;
height: 60px;
}
.qr-scanner {
background-image: linear-gradient(
0deg,
transparent 24%,
rgba(32, 255, 77, 0.1) 25%,
rgba(32, 255, 77, 0.1) 26%,
transparent 27%,
transparent 74%,
rgba(32, 255, 77, 0.1) 75%,
rgba(32, 255, 77, 0.1) 76%,
transparent 77%,
transparent
),
linear-gradient(
90deg,
transparent 24%,
rgba(32, 255, 77, 0.1) 25%,
rgba(32, 255, 77, 0.1) 26%,
transparent 27%,
transparent 74%,
rgba(32, 255, 77, 0.1) 75%,
rgba(32, 255, 77, 0.1) 76%,
transparent 77%,
transparent
);
background-size: 3rem 3rem;
background-position: -1rem -1rem;
width: 100%;
/* height: 100%; */
height: 100vh;
/* height: 288px; */
position: relative;
background-color: #1110;
/* background-color: #111; */
}
/* .qrcode-stream-wrapper {
display: flex;
justify-content: center;
align-items: center;
margin-top: 82px;
clear: both;
} */
/* .qrcode-stream-wrapper >>> .qrcode-stream-camera {
width: 213px;
height: 210px;
clear: both;
margin-top: 39px;
} */
.qr-scanner .box {
width: 213px;
height: 213px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
overflow: hidden;
border: 0.1rem solid rgba(0, 255, 51, 0.2);
/* background: url('http://resource.beige.world/imgs/gongconghao.png') no-repeat center center; */
}
.qr-scanner .txt {
width: 100%;
height: 35px;
line-height: 35px;
font-size: 14px;
text-align: center;
/* color: #f9f9f9; */
margin: 0 auto;
position: absolute;
top: 70%;
left: 0;
}
.qr-scanner .myQrcode {
text-align: center;
color: #00ae10;
}
.qr-scanner .line {
height: calc(100% - 2px);
width: 100%;
background: linear-gradient(180deg, rgba(0, 255, 51, 0) 43%, #00ff33 211%);
border-bottom: 3px solid #00ff33;
transform: translateY(-100%);
animation: radar-beam 2s infinite alternate;
animation-timing-function: cubic-bezier(0.53, 0, 0.43, 0.99);
animation-delay: 1.4s;
}
.qr-scanner .box:after,
.qr-scanner .box:before,
.qr-scanner .angle:after,
.qr-scanner .angle:before {
content: "";
display: block;
position: absolute;
width: 3vw;
height: 3vw;
border: 0.2rem solid transparent;
}
.qr-scanner .box:after,
.qr-scanner .box:before {
top: 0;
border-top-color: #00ff33;
}
.qr-scanner .angle:after,
.qr-scanner .angle:before {
bottom: 0;
border-bottom-color: #00ff33;
}
.qr-scanner .box:before,
.qr-scanner .angle:before {
left: 0;
border-left-color: #00ff33;
}
.qr-scanner .box:after,
.qr-scanner .angle:after {
right: 0;
border-right-color: #00ff33;
}
@keyframes radar-beam {
0% {
transform: translateY(-100%);
}
100% {
transform: translateY(0);
}
}
/deep/.qrcode-stream-camera{
height:100vh !important;
}
/deep/.van-image{
position: fixed;
z-index: 333333333333333;
left: 0.3rem;
top: 0.3rem;
opacity: 0.6;
}
</style>
\ No newline at end of file
<template>
<div>
<van-tabbar v-model="active" @change="onChange">
<van-tabbar-item
v-for="(item,index) in tabBarList"
:key="item.key"
:icon="active == index?item.imgUrlActive: item.imgUrl"
:to="item.path"
>{{ item.text }}</van-tabbar-item
>
</van-tabbar>
</div>
<div>
<!-- 占位导航栏div,防止导航栏挡住内容 -->
<!-- <div></div> -->
<van-tabbar v-model="active" @change="onChange" route>
<van-tabbar-item
v-for="(item, index) in tabBarList"
:key="index"
:icon="active == item.name ? item.imgUrlActive : item.imgUrl"
>{{ item.text }}</van-tabbar-item
>
</van-tabbar>
</div>
</template>
<script>
export default {
props:{
index: {
type: Number,
default: 0
data() {
return {
active: 1,
tabBarList: [
{
key: "1",
name: "0",
imgUrl: require("@/assets/tabBar/new.png"),
imgUrlActive: require("@/assets/tabBar/new-active.png"),
path: "/message-center",
text: "消息中心",
},
{
key: "2",
name: "1",
imgUrl: require("@/assets/tabBar/workbench.png"),
imgUrlActive: require("@/assets/tabBar/workbench-active.png"),
path: "/save-workbench",
text: "安全工作台",
},
{
key: "3",
name: "2",
imgUrl: require("@/assets/tabBar/my.png"),
imgUrlActive: require("@/assets/tabBar/my-active.png"),
path: "/my",
text: "我的地盘",
},
],
};
},
},
data() {
return {
active: "0",
tabBarList: [
{
key: "1",
name:'0',
imgUrl: require("@/assets/tabBar/new.png"),
imgUrlActive: require("@/assets/tabBar/new-active.png"),
path: "/MessageCenter",
text: "消息中心"
methods: {
onChange(index) {
if (this.active == index) {
this.tabBarList.forEach((item) => {
if (item.name == this.active) {
this.$router.push(item.path);
}
});
}
},
{
key: "2",
name:'1',
imgUrl: require("@/assets/tabBar/workbench.png"),
imgUrlActive: require("@/assets/tabBar/workbench-active.png"),
path: "/SaveWorkbench",
text: "安全工作台"
},
{
key: "3",
name:'2',
imgUrl: require("@/assets/tabBar/my.png"),
imgUrlActive: require("@/assets/tabBar/my-active.png"),
path: "/My",
text: "我的地盘"
}
]
};
},
mounted() {
this.active = this.index
this.tabBarList.forEach((item)=>{
if(item.name==this.active){
this.$router.push(item.path)
}
})
},
methods: {
onChange(index) {
this.active = index;
}
}
},
};
</script>
<style scoped>
/* @import url(); 引入css类 */
</style>
</script>
\ No newline at end of file
......@@ -10,11 +10,15 @@
<template>
<div>
<header class="header">
<van-icon @click="to" name="arrow-left" class="iconColorLeft"/>
<span>{{text}}</span>
<van-icon name="bars" class="iconColorRight"/>
</header>
<!-- 加个吸顶 -->
<van-sticky>
<header class="header">
<van-icon @click="to" name="arrow-left" class="iconColorLeft"/>
<span>{{text}}</span>
<!-- 为止有什么用图标注释 -->
<!-- <van-icon name="bars" class="iconColorRight"/> -->
</header>
</van-sticky>
</div>
</template>
......@@ -24,11 +28,15 @@ export default {
text:{
default:"未知",
type:String
},
goback:{
default:"",
type:String
}
},
data() {
return {
// goValue:this.goback
}
},
mounted() {
......@@ -37,7 +45,12 @@ export default {
methods: {
/* 左侧图标跳转方法 */
to(){
history.go(-1)
//列表页的返回跳转工作台
if(this.goback){
this.$router.push('/'+this.goback)
}else{
history.go(-1)
}
}
}
}
......@@ -62,7 +75,7 @@ export default {
color: white;
font-size: 16px;
margin: auto;
font-weight: 600;
font-weight: none;
font-family: 'Microsoft YaHei';
}
.header .iconColorRight{
......
<template>
<div class="player">
<van-icon name="close" size="1rem" color="red" style="top:27%" @click="$emit('close')"/>
<video-player
style="position: absolute;
top: 50%;
width: 100%;
transform: translateY(-50%);"
class="video-player vjs-custom-skin"
ref="videoPlayer"
:options="playerOptions"
:playsinline="true" >
</video-player>
</div>
</template>
<script>
import Vue from "vue";
import VideoPlayer from "vue-video-player";
require("video.js/dist/video-js.css");
require("vue-video-player/src/custom-theme.css");
Vue.use(VideoPlayer);
export default {
name: "customPlayer",
data() {
return {
playerOptions: {
height: "360",
autoplay: true, // true:浏览器准备好时开始回放。
muted: false, // true:默认情况下将会消除任何音频。
language: "zh-CN",
// aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
preload: 'auto', // 建议浏览器在加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
playbackRates: [0.7, 1.0, 1.5, 2.0],
sources: [
{
type: "video/mp4",
src:this.videoUrl,
},
],
// poster: "https://surmon-china.github.io/vue-quill-editor/static/images/surmon-1.jpg", // 你的封面地址
poster:this.videoImg,
notSupportedMessage: "此视频暂无法播放,请稍后再试", // 允许覆盖Video.js无法播放媒体源时显示的默认信息。
controlBar: {
timeDivider: true, //当前时间和持续时间的分隔符
durationDisplay: true, //显示持续时间
remainingTimeDisplay: false, //是否显示剩余时间功能
fullscreenToggle: true, // 全屏按钮
},
},
};
},
props: {
"videoUrl": {
type: String,
required: true
},
"videoImg": {
type: String,
required: true,
default:"https://surmon-china.github.io/vue-quill-editor/static/images/surmon-1.jpg"
}
},
mounted() {},
methods: {},
};
</script>
<style lang="less">
.player{
height: 100vh;
position: fixed;
z-index: 1000000000;
width: 100vw;
background-color: rgba(0, 0, 0, 0.5);
text-align: center;
}
//播放按钮样式
.video-player.vjs-custom-skin > .video-js .vjs-big-play-button{
width: 60px !important;
height:35px !important;
line-height: 35px !important;
border-radius: 5px !important;
font-size: 2.5em !important;
}
.vjs-custom-skin > .video-js .vjs-big-play-button {
top: 53%;
}
.vjs-poster{
border-radius: 10px i !important;
}
</style>
\ No newline at end of file
......@@ -12,16 +12,26 @@ import md5 from 'js-md5';
import App from './App.vue'
import router from './router'
import store from './store'
import util from './api/util.js'
import './permission'
import Cookies from 'js-cookie'
import { prefix } from '@/common/js/utils'
import { Divider, Popup, Overlay, Loading, Dialog, ContactCard, Form, AddressEdit, AddressList, Field, CellGroup, Cell, SwipeCell, Icon, Stepper, Card, Checkbox, CheckboxGroup, Button, Swipe, SwipeItem, PullRefresh, List, Tab, Tabs, GoodsAction, GoodsActionIcon, GoodsActionButton, SubmitBar, Toast ,Search,Picker,Uploader,Notify ,ContactList,Calendar,Radio,RadioGroup,Tag,Tabbar,TabbarItem,Sticky, Grid, GridItem,Skeleton,Col,Row, Image as VanImage, Badge,} from 'vant'
import { Divider, Popup, Overlay, Loading, Dialog, ContactCard, Form, AddressEdit, AddressList, Field, CellGroup, Cell, SwipeCell, Icon, Stepper, Card, Checkbox, CheckboxGroup, Button, Swipe, SwipeItem, PullRefresh, List, Tab, Tabs, GoodsAction, GoodsActionIcon, GoodsActionButton, SubmitBar, Toast ,Search,Picker,Uploader,Notify ,ContactList,Calendar,Radio,RadioGroup,Tag,Tabbar,TabbarItem,Sticky, Grid, GridItem,Skeleton,Col,Row, Image as VanImage, Badge,NoticeBar,DatetimePicker,
Step, Steps, ImagePreview } from 'vant'
import 'lib-flexible/flexible'
import vueEsign from 'vue-esign'
import VideoPlayer from 'vue-video-player'
// 全局过滤器
import filters from "@/utils/filters.js"
Vue.prototype.util = util
Vue.use(vueEsign)
Vue.use(VideoPlayer)
Vue.use(Divider).use(Popup).use(Overlay).use(Loading).use(Dialog).use(Toast).use(ContactCard).use(Form).use(AddressEdit).use(AddressList).use(Field).use(CellGroup).use(Cell).use(SwipeCell).use(Icon).use(Stepper).use(Card).use(Button).use(Swipe).use(SwipeItem).use(PullRefresh).use(List).use(Tab).use(Tabs).use(GoodsAction).use(GoodsActionIcon).use(GoodsActionButton).use(SubmitBar).use(Checkbox).use(CheckboxGroup).use(Search).use(Picker).use(Uploader).use(Notify)
.use(ContactList).use(Calendar).use(Radio).use(RadioGroup).use(Tag).use(Tabbar).use(TabbarItem).use(Sticky)
.use(Grid).use(GridItem).use(Skeleton).use(Col).use(Row).use(VanImage)
.use(Grid).use(GridItem).use(Skeleton).use(Col).use(Row).use(VanImage).use(Badge).use(NoticeBar).use(DatetimePicker)
.use(Step).use(Steps).use(ImagePreview)
Vue.config.productionTip = false
new Vue({
router,
store,
......@@ -30,6 +40,7 @@ new Vue({
Vue.prototype.$md5 = md5;
Vue.prototype.prefix = prefix;
Vue.prototype.$bus = new Vue;
Array.prototype.remove = function(val) {
var index = this.indexOf(val);
......@@ -37,3 +48,8 @@ Array.prototype.remove = function(val) {
this.splice(index, 1);
}
}
// 注册全局过滤器
Object.keys(filters).forEach(key=>{
Vue.filter(key,filters[key])
})
import router from './router'
//设置白名单,指不需要登录就可以直接进入的页面
var whiteList = ["/login2"]
import { getToken } from '@/utils/auth' // get token from cookie
//这里使用cookie.js,登录成功后将后台返回的token保存在cookie中
// Cookies.set('admin_token','token_value');
var hasToken = localStorage.getItem('admin_token');
router.beforeEach(async(to, from, next) => {
//to: 即将要进入的目标 [路由对象]
//from:当前导航正要离开的路由
//next:一定要调用该方法来 resolve 这个钩子
console.log(hasToken)
const hasToken = getToken()//确定用户是否已登录
if (hasToken) {
if (to.path === '/login2') {
next({ path: '/MessageCenter' })
next({ path: '/save-workbench' })
} else {
next()
}
......
This diff is collapsed.
import request from '@/utils/axios'
// 隐患上报模块
// 请求新增表单数据信息的
export function getFormList(url, params) {
return request({
url: url,
method: 'get',
params
})
}
// 隐患类型
export function postHdTyp(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患项目名称
export function postHdName(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患单编号和隐患级别
export function postHdInventories(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险源带出来的字段
export function postHdRiskSource(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患整改人接口
export function postHdShowPeople(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患上报保存接口
export function postHdReportAdd(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患上报已退回列表
export function dangerReturn(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患上报已退回删除
export function dangerReturnDel(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患上报已退回 回显所有数据接口
export function dangerReturnEcho(url, data) {
return request({
url: url,
method: 'get',
data
})
}
// 隐患上报已退回 保存接口
export function dangerReturnAdd(url, data) {
return request({
url: url,
method: 'get',
data
})
}
// 隐患确认模块
// 隐患确认列表
export function dangerConfirm(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患确认form表单列表数据
export function getConfirmFormList(url, params) {
return request({
url: url,
method: 'get',
params
})
}
// 隐患确认提交
export function dangerConSub(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患整改模块
// 隐患整改列表
export function dangerRect(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患整改 有退回原因的
export function dangerRectReturn(url, params) {
return request({
url: url,
method: 'get',
params
})
}
// 隐患整改保存 没有退回原因
export function dangerRectAdd(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 整改复查模块
// 整改复查列表
export function dangerReview(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 整改复查保存
export function dangerReviewAdd(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患台账模块
export function dangerStandBook(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患各种台账详情模块
export function standBookDetail(url, data) {
return request({
url: url,
method: 'post',
data
})
}
//重大隐患台账
export function majorList(url, data) {
return request({
url: url,
method: 'post',
data
})
}
//重大隐患添加
export function majorAdd(url, data) {
return request({
url: url,
method: 'post',
data
})
}
//企业级督办
export function superviseList(url, data) {
return request({
url: url,
method: 'post',
data
})
}
//项目级督办
export function superviseSABlist(url, data) {
return request({
url: url,
method: 'post',
data
})
}
//项目级督办添加
export function superviseAdd(url, data) {
return request({
url: url,
method: 'post',
data
})
}
//延期审批
export function delayList(url, data) {
return request({
url: url,
method: 'post',
data
})
}
//延期审批退回回显
export function delayReturn(url, data) {
return request({
url: url,
method: 'get',
data
})
}
//延期审批添加
export function delayAdd(url, data) {
return request({
url: url,
method: 'post',
data
})
}
//延期审批添加
export function delayEdit(url, data) {
return request({
url: url,
method: 'post',
data
})
}
// 隐患整改
export function list1(data) {
return request({
url:"/rectification/list1",
method: 'post',
data
})
}
// 隐患整改已退回
export function list2(data) {
return request({
url:"/rectification/list2",
method: 'post',
data
})
}
// 我的上报接口
export function myHDList(data){
return request({
url:'/hdreport/myHDList',
method:'post',
data
})
}
export function deal(url,data){
return request({
url,
method:'post',
data
})
}
/*接口对接1 START*/
/*接口对接1 END*/
\ No newline at end of file
import request from '@/utils/axios'
/*get请求*/
// export function getFun(url,params) {
// return request({
// url: url,
// method: 'get',
// params
// })
// }
/* post请求 */
//消息信息列表
export function postMessgaelist(data) {
return request({
url: '/messageInfo/list',
method: 'post',
data
})
}
//未读消息变为已读
export function noticeRemove(data) {
return request({
url: '/messageInfo/changeRead',
method: 'post',
data
})
}
//清除未读消息列表
export function removeAllMessgae(data) {
return request({
url: "/messageInfo/changeStatus",
method: 'get',
data
})
}
//删除已读消息
export function removeMessgae(data) {
return request({
url: "/messageInfo/remove",
method: 'post',
data
})
}
//待办事项列表
export function waitList(data) {
return request({
url: "/backlogInfo/list",
method: 'post',
data
})
}
//未读消息数
export function badgeNumber(data) {
return request({
url: "/backlogInfo/unReadCount",
method: 'get',
data
})
}
//删除已办事项
export function removeWaitList(data) {
return request({
url: "/backlogInfo/remove",
method: 'post',
data
})
}
//通知公告列表
export function notificationList(data) {
return request({
url: "/noticeInfo/list",
method: 'post',
data
})
}
//清除通知公告未读
export function removeAllNotification(data) {
return request({
url: "/noticeInfo/changeStatus",
method: 'get',
data
})
}
//清除通知未读改为已读
export function readNotification(data) {
return request({
url: "/noticeInfo/changeRead",
method: 'post',
data
})
}
//删除已读通知列表
export function removeNotification(data) {
return request({
url: "/noticeInfo/remove",
method: 'post',
data
})
}
\ No newline at end of file
import request from '@/utils/axios'
/*get请求*/
export function getFun(url,params) {
return request({
url: url,
method: 'get',
params
})
}
/* post请求 */
export function postFun(url,data) {
return request({
url: url,
method: 'post',
data
})
}
\ No newline at end of file
import request from '@/utils/axios'
// 风险上报模块
// 请求新增表单数据信息的
export function getFormList(url,params) {
return request({
url: url,
method: 'get',
params
})
}
// 风险源
export function postHdSource(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 事故类型
export function postHdType(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 各种措施
export function postMeasures(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 主责人员
export function postHdPeople(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险上报提交
export function postReAdd(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险上报矩阵式定级
export function postMatrix(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 矩阵式定级判读风险等级的接口
export function postCalRiskLevel(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险确认列表
export function postriskConList(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险确认保存
export function postriskConAdd(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险退回列表
export function postriskConReturn(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险退回列表 删除
export function postriskConReDel(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险退回重新上报 退回原因接口
export function postriskConiCause(url,data) {
return request({
url: url,
method: 'get',
data
})
}
// 风险台账
export function postriskBook(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险详情
export function postriskDetail(url,data) {
return request({
url: url,
method: 'post',
data
})
}
// 风险详情
export function postRiskShowMeasures(url,data) {
return request({
url: url,
method: 'post',
data
})
}
/*接口对接1 START*/
/*接口对接1 END*/
import request from '@/utils/axios'
/*get请求*/
export function getFun(url,params) {
return request({
url: url,
method: 'get',
params
})
}
/* post请求 */
export function postFun(url,data) {
return request({
url: url,
method: 'post',
data
})
}
\ No newline at end of file
import request from '@/utils/axios'
/*get请求*/
export function getFun(url,params) {
return request({
url: url,
method: 'get',
params
})
}
/* post请求 */
export function postWork(url,data) {
return request({
url: url,
method: 'post',
data
})
}
\ No newline at end of file
import Cookies from 'js-cookie'
const TokenKey = 'Admin-Token'
export function getToken() {
return Cookies.get(TokenKey)
}
export function setToken(token) {
return Cookies.set(TokenKey, token)
}
export function removeToken() {
return Cookies.remove(TokenKey)
}
......@@ -7,29 +7,60 @@
* 版权所有,侵权必究!
*/
import axios from 'axios'
import { Toast } from 'vant'
import router from '../router'
axios.defaults.baseURL = process.env.NODE_ENV == 'development' ? 'http://backend-api-01.newbee.ltd/api/v1' : 'http://backend-api-01.newbee.ltd/api/v1'
axios.defaults.withCredentials = true
axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
axios.defaults.headers['token'] = localStorage.getItem('token') || ''
axios.defaults.headers.post['Content-Type'] = 'application/json'
axios.interceptors.response.use(res => {
if (typeof res.data !== 'object') {
Toast.fail('服务端异常!')
return Promise.reject(res)
}
if (res.data.resultCode != 200) {
if (res.data.message) Toast.fail(res.data.message)
if (res.data.resultCode == 416) {
router.push({ path: '/login' })
import { Toast ,Dialog} from 'vant';
import { getToken ,removeToken} from '@/utils/auth' // get token from cookie
const service = axios.create({
baseURL: '/hse/app-api', //前缀路径
headers: {//请求头部
// "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"content-type": "application/json",
"data-type": "json"
}
return Promise.reject(res.data)
}
return res.data
})
//拦截接口请求
service.interceptors.request.use(config => {
if (getToken()) {
config.headers['token'] = getToken()
}
return config
}, error => {
return Promise.reject(error)
})
service.interceptors.response.use(response => {
// console.log(response,'这是接口返回数据')
const res = response.data//获取请求返回数据
const code = response.status//获取请求响应码
if (code == 200) {//请求响应码200 代表已经请求到接口
if (res.code === 0) {//接口响应码0 代表接口代码运行正常
return res
} else if (res.code === 301) {
// Notify({ type: 'danger', message: res.msg});
return res
} else if (res.code === 403) {
Dialog.alert({
title: '提示',
message: res.msg,
theme: 'round-button',
}).then(() => {
removeToken()
location.reload()
// router.push({
// name:'login2'
// })
});
}else{
Toast.fail({
title: '提示',
message: res.msg||'数据异常请稍后再试',
})
}
} else {
Promise.reject(new Error('Error'))
}
}, err => {
Toast.fail('请求失败');
return Promise.reject(err)
})
export default axios
export default service
// 隐患级别
const dangerText = function(danger) {
// 严重隐患 = A
// 较大隐患 = B
// 危险隐患 = C
// 重大隐患 = S
switch(danger){
case 'A':
return '严重隐患'
case 'B':
return '较大隐患'
case 'C':
return '危险隐患'
case 'S':
return '重大隐患'
default:
return danger
}
}
const riskText = function(danger) {
// 严重隐患 = A
// 较大隐患 = B
// 危险隐患 = C
// 重大隐患 = S
switch(danger){
case 'A':
return '严重风险'
case 'B':
return '较大风险'
case 'C':
return '危险风险'
case 'S':
return '重大风险'
default:
return danger
}
}
export default{
dangerText,
riskText
}
\ No newline at end of file
export function timestampToTime (time,type,zero,num) {
if(!time){return ''}
try{
var date = new Date(time)
if(num&&typeof parseInt(num)=="number"){
date = new Date(new Date(time).getTime()+num*60*60*24*1000)//时间戳以毫秒为单位,也可用其他日期格式
}
let yy = date.getFullYear();//年
let mm = date.getMonth()+1;//月
let dd = date.getDate();//日
let hh = date.getHours();//小时
let mf = date.getMinutes()<10 ? '0'+date.getMinutes() : date.getMinutes();//分钟
let ss = date.getSeconds()<10 ? '0'+date.getSeconds() : date.getSeconds();//秒
if(zero){
if(mm<10){mm='0'+mm}
if(dd<10){dd='0'+dd}
if(hh<10){hh='0'+hh}
}
if(type=="DT1"){
return yy+'-'+mm+'-'+dd+' '+hh+':'+mf+':'+ss;//yyyy-mm-dd hh:mf:ss
}else if(type=="DT2"){
return yy+'-'+mm+'-'+dd;//yyyy-mm-dd
}else if(type=="DT3"){
return yy+'/'+mm+'/'+dd+' '+hh+':'+mf+':'+ss;//yyyy/mm/dd hh:mf:ss
}else if(type=="DT4"){
return yy+'-'+mm+'-'+dd;//yyyy/mm/dd
}else if(type=="DT5"){
return date.getTime();//时间戳 秒数
}else if(type=="DT6"){
return yy+''+mm+''+dd+''+hh+''+mf+''+ss+'';//yyyy年mm月dd日 hh时mf分ss秒
}else if(type=="DT7"){
return yy+''+mm+''+dd+'';//yyyy年mm月dd日
}
}catch(e){
console.log("timestampToTime Error");return ""
}
}
\ No newline at end of file
const UserInfo = 'userInfo'
export function getUserInfo() {
return JSON.parse(sessionStorage.getItem(UserInfo))
}
export function setUserInfo(userInfo) {
return sessionStorage.setItem(UserInfo,JSON.stringify(userInfo))
}
export function removeUserInfo() {
return sessionStorage.removeItem(UserInfo)
}
......@@ -116,7 +116,7 @@ export default {
}
.icon-left {
font-size: 25px;
font-weight: bold;
font-weight: none;
}
.header-search {
display: flex;
......@@ -190,7 +190,7 @@ export default {
.catogory-title {
width: 100%;
font-size: 17px;
font-weight: 500;
font-weight: none;
padding: 20px 0;
}
.product-item {
......
......@@ -223,7 +223,7 @@ export default {
padding: 0 10px;
color: @primary;
font-size: 20px;
font-weight: bold;
font-weight: none;
border-right: 1px solid #666;
}
.icon-search {
......@@ -274,7 +274,7 @@ export default {
text-align: center;
color: @primary;
font-size: 16px;
font-weight: 500;
font-weight: none;
}
.good-box {
display: flex;
......
......@@ -13,7 +13,7 @@
欢迎登录<span>首开集团安全隐患排查治理体系</span>!
</div>
<div class="login-form">
<van-form @submit="onSubmit">
<van-form @submit="onSubmit" :show-error-message="false" >
<div class="username-wrap">
<div class="username-icon">
<van-image :src="require('@/assets/login/login-username.png')" />
......@@ -23,7 +23,7 @@
name="username"
label=""
placeholder="账号"
:rules="[{ required: true, message: '请填写用户名' }]"
:rules="[{ required: true, message: '请填写账号' }]"
/>
</div>
<div class="passworld-wrap">
......@@ -32,6 +32,7 @@
</div>
<van-field
v-model="password"
type="password"
name="password"
placeholder="密码"
:rules="[{ required: true, message: '请填写密码' }]"
......@@ -50,6 +51,9 @@
</template>
<script>
import { getFun,postFun } from '@/service/table'
import { setToken } from '@/utils/auth'
import { setUserInfo ,getUserInfo} from '@/utils/userInfo'
export default {
data() {
return {
......@@ -61,23 +65,35 @@ export default {
},
mounted() {},
methods: {
onSubmit(values) {
if(values.username=='admin'&&values.password=='123456'){
this.$notify({
message:'成功',
background:'green',
duration: 1000
})
localStorage.setItem('admin_token','2dsfewr')
this.$router.push('/MessageCenter')
location.reload();
}else{
this.$notify({
message:'账号或密码不正确',
background:'red',
duration: 1000
})
}
onSubmit(values) {
this.$toast.loading({
message:'登录中...',
forbidClick: true,
loadingType: 'spinner',
duration: 0
})
getFun('check/token',values).then((Response)=>{
if(Response.code==0){
this.$toast.clear()
postFun('mobile/user').then((Response2)=>{
var userInfo={
avatar:Response2.data.avatar,
userName:Response2.data.userName,
deptName:Response2.data.dept.deptName
}
/* 存储用户信息 */
setUserInfo(userInfo)
})
setToken(Response.data)
this.$router.push('/save-workbench')
}else if(Response.code==301){
this.$toast.clear()
this.$toast.fail({
message:Response.msg,
duration: 2000
})
}
})
}
}
};
......@@ -87,7 +103,7 @@ export default {
.login {
background-size: cover;
background-repeat: no-repeat;
background-position: center;
// background-position: center;
background-attachment: fixed;
.login-logo {
width: 120px;
......@@ -99,7 +115,7 @@ export default {
margin-top: 20px;
color: #fafbfe;
font-size: 18px;
font-weight: bold;
font-weight: none;
}
.con {
width: 345px;
......@@ -112,7 +128,7 @@ export default {
.hello {
color: #004fb1;
font-size: 20px;
font-weight: bold;
font-weight: none;
}
.welcome {
margin: 15px 0;
......@@ -136,11 +152,11 @@ export default {
padding-left: 20px;
box-sizing: border-box;
}
/deep/ .van-field__error-message{
/deep/ .van-field__error-message {
padding-left: 20px;
}
}
.passworld-wrap {
.passworld-wrap {
position: relative;
border-bottom: 1px solid #d2dcf5;
.passworld-icon {
......@@ -154,13 +170,11 @@ export default {
padding-left: 20px;
box-sizing: border-box;
}
/deep/ .van-field__error-message{
/deep/ .van-field__error-message {
padding-left: 20px;
}
}
}
}
}
</style>
<template>
<div>
<!-- 头部标签 -->
<van-sticky>
<header class="header-wrap">
首开集团安全管理平台
</header>
</van-sticky>
<!-- 内容 -->
<div class="con">
<!-- 个人信息 -->
<van-cell-group inset>
<van-row gutter="20">
<van-col span="6">
<div>
<van-image
width="2rem"
height="2rem"
fit="fill"
:src="userInfo.portrait"
/>
</div>
</van-col>
<van-col span="18">
<div class="user-info-wrap">
<div class="user-name">{{ userInfo.name }}</div>
<p>{{ userInfo.position }}</p>
<div class="tag-wrap">
<van-tag color="#cbcdfb">隐患上报人</van-tag>
<van-tag color="#b5e2f1">隐患整改人</van-tag>
<van-tag color="#bed9fd">检查专员</van-tag>
</div>
</div>
</van-col>
</van-row>
</van-cell-group>
<!-- 设置 -->
<van-cell-group inset class="my-cell-group">
<div class="set-wrap">
<van-image
width="0.613rem"
height="0.613rem"
fit="fill"
:src="require('@/assets/myTerritory/set.png')"
/>
<span>设置</span>
</div>
</van-cell-group>
<!-- 退出系统 -->
<footer class="sign-out">
<van-button type="info" block @click="logout">退出系统</van-button>
</footer>
</div>
<!-- tanBar -->
<tab-bar :index="2"></tab-bar>
</div>
</template>
<script>
import tabBar from "@/components/TabBar";
export default {
components: {
tabBar
},
data() {
return {
userInfo: {
portrait: require("@/assets/myTerritory/touxiang.png"),
name: "刘华强",
position: "技术安全部"
// jurisdiction: [
// '隐患上报人',
// '隐患整改人',
// '检查专员'
// ]
}
};
},
mounted() {},
methods: {
logout() {
localStorage.removeItem('admin_token');
this.$router.push("/Login2");
location.reload();
}
}
};
</script>
<style lang="less" scoped>
/* @import url(); 引入css类 */
.header-wrap {
width: 100%;
height: 50px;
background-color: #2980f7;
font-size: 17px;
line-height: 50px;
color: white;
font-weight: 600;
text-align: center;
}
.con {
height: calc(100% - 110px);
padding: 10px 0 50px 0;
background-color: #f0f1f5;
position: relative;
.user-info-wrap {
display: flex;
flex-direction: column;
justify-content: space-between;
.user-name {
font-size: 17px;
font-weight: bold;
}
.tag-wrap {
.van-tag {
margin-right: 10px;
margin-top: 3px;
padding: 2px 4px;
}
}
}
.my-cell-group {
padding: 10px 10px !important;
.set-wrap {
height: 0.8rem;
display: flex;
align-items: center;
span {
margin-left: 0.2666rem;
font-size: 15px;
font-weight: bold;
}
}
}
}
.sign-out {
width: 96%;
position: absolute;
bottom: 1.86667rem;
left: 0px;
right: 0;
margin: auto;
overflow: hidden;
border-radius: 5px;
button {
font-size: 15px;
font-weight: bold;
}
}
.van-cell-group--inset {
margin: 0 10px 10px;
padding: 10px 10px 15px;
}
</style>
......@@ -162,7 +162,7 @@ export default {
}
.icon-left {
font-size: 25px;
font-weight: bold;
font-weight: none;
}
.header-search {
display: flex;
......
<template>
<div>
<!-- 头部标签 -->
<van-sticky>
<header class="header-wrap">
首开集团安全隐患排查治理体系
</header>
</van-sticky>
<!-- 内容 -->
<div class="con">
<!-- 消息中心 -->
<van-cell-group inset>
<van-cell value="消息中心" />
<van-grid :column-num="5">
<van-grid-item
v-for="item in newsCenterList"
:key="item.key"
:icon="item.imgUrl"
:text="item.text"
@click="myClick(item.text)"
/>
</van-grid>
</van-cell-group>
<!-- 风控分级管控 -->
<van-cell-group inset>
<van-cell value="风控分级管控" />
<van-grid :column-num="5">
<van-grid-item
v-for="item in riskList"
:key="item.key"
:icon="item.imgUrl"
:text="item.text"
/>
</van-grid>
</van-cell-group>
<!-- 隐患排查治理 -->
<van-cell-group inset>
<van-cell value="隐患排查治理" />
<van-grid :column-num="5">
<van-grid-item
v-for="item in dangerList"
:key="item.key"
:icon="item.imgUrl"
:text="item.text"
/>
</van-grid>
</van-cell-group>
<!-- 安全监督检查 -->
<van-cell-group inset>
<van-cell value="安全监督检查" />
<van-grid :column-num="5">
<van-grid-item @click="jump(item.path)"
v-for="item in safetyCheckList"
:key="item.key"
:icon="item.imgUrl"
:text="item.text"
/>
</van-grid>
</van-cell-group>
</div>
<!-- tanBar -->
<tab-bar :index="1"></tab-bar>
</div>
</template>
<script>
import tabBar from "@/components/TabBar";
export default {
components: {
tabBar
},
data() {
return {
newsCenterList: [
// 消息中心的图标
{
key: "1",
imgUrl: require("@/assets/workbench/notice.png"),
text: "通知公告"
},
{
key: "2",
imgUrl: require("@/assets/workbench/wait-do.png"),
text: "待办事项"
},
{
key: "3",
imgUrl: require("@/assets/workbench/news.png"),
text: "消息提醒"
},
{
key: "4",
imgUrl: require("@/assets/workbench/set-up.png"),
text: "我的设置"
}
],
riskList: [
// 风控分级管控
{
key: "1",
imgUrl: require("@/assets/workbench/risk-report.png"),
text: "风险填报"
},
{
key: "2",
imgUrl: require("@/assets/workbench/risk-confirm.png"),
text: "风险确认"
},
{
key: "3",
imgUrl: require("@/assets/workbench/risk-account.png"),
text: "风险台账"
}
],
dangerList: [
// 隐患排查治理
{
key: "1",
imgUrl: require("@/assets/workbench/danger-report.png"),
text: "隐患上报"
},
{
key: "2",
imgUrl: require("@/assets/workbench/danger-confirm.png"),
text: "隐患确认"
},
{
key: "3",
imgUrl: require("@/assets/workbench/danger-rectification.png"),
text: "隐患整改"
},
{
key: "4",
imgUrl: require("@/assets/workbench/danger-acceptance.png"),
text: "隐患验收"
},
{
key: "5",
imgUrl: require("@/assets/workbench/danger-account.png"),
text: "隐患台账"
}
],
safetyCheckList: [
// 安全监督检查
{
key: "1",
path:'',
imgUrl: require("@/assets/workbench/inspect-plane.png"),
text: "检查计划"
},
{
key: "2",
path:'',
imgUrl: require("@/assets/workbench/plane-approval.png"),
text: "计划审批"
},
{
key: "3",
path:'/checked',
imgUrl: require("@/assets/workbench/check-implement.png"),
text: "检查执行"
},
{
key: "4",
path:'/notice',
imgUrl: require("@/assets/workbench/rectification-notice.png"),
text: "整改通知"
},
{
key: "5",
path:'',
imgUrl: require("@/assets/workbench/issue-rectification.png"),
text: "问题整改"
},
{
key: "6",
path:'/correct',
imgUrl: require("@/assets/workbench/retification-acceptance.png"),
text: "整改验收"
},
{
key: "7",
path:'',
imgUrl: require("@/assets/workbench/ehcek-record.png"),
text: "检查记录"
}
]
};
},
mounted() {},
methods: {
myClick(data) {
console.log(data);
},
jump(path){
if(path){
this.$router.push(path)
}
}
}
};
</script>
<style lang="less" scoped>
/* @import url(); 引入css类 */
.header-wrap {
width: 100%;
height: 50px;
background-color: #2980f7;
font-size: 17px;
line-height: 50px;
color: white;
font-weight: 600;
text-align: center;
}
.con {
// height: calc(100% - 110px);
// height: 100%;
padding: 10px 0 50px 0;
background-color: #f0f1f5;
/deep/ .van-grid-item__content--center{
padding-left: 0px;
padding-right: 0px;
}
}
.van-cell-group--inset {
margin: 0 10px 10px;
}
/deep/ .van-cell::after {
border: none;
}
/deep/ [class*="van-hairline"]::after {
border: none;
}
</style>
......@@ -10,54 +10,99 @@
<template>
<div>
<LHeader v-bind:text="text"></LHeader>
<LHeader v-bind:text="text" v-bind:goback="goback"></LHeader>
<van-search
v-model="value"
show-action
placeholder="请输入关键字"
@search="onSearch"
placeholder="请输入搜索内容"
@search="onSearch"
>
<template #action>
<div @click="onSearch">搜索</div>
<div @click="onSearch" >搜索</div>
</template>
</van-search>
<div class="card" @click="cardLocation">
<div>检查名称:昌平区回迁房改造项目安全检查</div>
<div>检查名称:专项检查</div>
<div>检查名称:2021-12-15</div>
<div>检查名称:昌平区回迁房改造工程</div>
</div>
<div class="card">
<div>检查名称:昌平区回迁房改造项目安全检查</div>
<div>检查名称:专项检查</div>
<div>检查名称:2021-12-31</div>
<div>检查名称:昌平区回迁房改造工程</div>
<div class="card" v-for="(item,index) in checkedList" :key="index" @click="cardLocation(item)">
<div>检查编号:{{item.no}}</div>
<div>检查名称:{{item.name}}</div>
<div>检查类型:{{item.type}}</div>
<div v-show="item.isOpen">
<div>开始时间:{{item.planStartTime}}</div>
<div>结束时间:{{item.planEndTime}}</div>
<div>检查地点:{{item.address}}</div>
<div>是否提交:{{item.finish?'已提交':'未提交'}}</div>
</div>
<div class="more" @click.stop="toggle(item)">
{{ item.OpenText }}
</div>
</div>
<tab-bar :index="1"></tab-bar>
</div>
</template>
<script>
import tabBar from "@/components/TabBar";
import LHeader from '@/components/header.vue'
import { getFun,postFun } from '@/service/table'
export default {
name: 'checked',
components: {
"LHeader":LHeader
"LHeader":LHeader,
"tabBar":tabBar
},
data() {
return {
value:'',
text:'检查执行'
goback:'save-workbench',//返回工作台
value:'',//列表搜索关键字值
checkedList:[],//检查列表
text:'检查执行',//顶部文本
finish:'',//问题是否提交
}
},
mounted() {
this.list()
},
methods: {
/* 首次进入页面请求检查执行列表接口 */
list(){
this.checkedList=[]
this.$toast.loading({
message:'加载中...',
forbidClick: true,
loadingType: 'spinner',
duration: 0
})
getFun('check/carry/user/list',{name:this.value}).then((Response)=>{
this.$toast.clear()
this.checkedList=Response.data
this.checkedList.forEach((item)=>{
item.isOpen=false
item.OpenText="展开 ▼";
})
}).catch(()=>{
this.$toast.clear()
this.$toast.fail('加载失败,请稍后再试')
})
},
/* 搜索查询列表接口 */
onSearch(){
this.$toast('提示内容')
this.list()
},
cardLocation(){
this.$router.push('/problem')
cardLocation(item){
sessionStorage.setItem('id',item.id)
sessionStorage.setItem('finish',item.finish)
this.$router.push({name:'problem',params:{id:item.id}})//此id来判断是否加载问题上报新数据
},
//切换显示内容
toggle(item){
item.isOpen = !item.isOpen;
if (item.isOpen) {
// 显示所有数据
item.OpenText = "收起 ▲";
} else {
item.OpenText = "展开 ▼";
// 只显示第一个数据
}
this.$forceUpdate()
}
}
}
......@@ -68,9 +113,20 @@ export default {
box-shadow: 0px 0px 10px 2px #F3F3F3;
padding: 0.25rem;
margin:0.4rem auto;
position: relative;
background: white;
border-radius: 4%;
}
.card div{
font-size: 0.4rem;
line-height: 0.8rem;
}
.more{
position: absolute;
bottom: 0.25rem;
right: 15px;
color: #2a80f7;
font-weight: none;
z-index: 99;
}
</style>
......@@ -11,94 +11,118 @@
<template>
<div>
<LHeader v-bind:text="text"></LHeader>
<van-tabs v-model="active">
<van-tab title="有限空间类">
<van-tabs v-model="active" :swipe-threshold="3" >
<van-tab v-for="(item,index) in tableData" :key="index" :title="item.title">
<table border="1" cellspacing="0">
<thead>
<tr>
<th>序号</th>
<th>检查项目</th>
<th>隐患类型</th>
<th>检查内容</th>
<th>律依据/出处</th>
<th>结果</th>
<th>规依据</th>
<th>检查结果</th>
</tr>
</thead>
<tbody>
<tr v-for="(user,index) in user" :key="index">
<td align="center" v-text="index+1" style="width:10%" ></td>
<td align="center" v-text="user.subject" style="width:15%"></td>
<td align="center" v-text="user.content" style="width:20%"></td>
<td align="center" v-text="user.law" style="width:30%"></td>
<tr v-for="(item2,index2) in item.list" :key="index2">
<td align="center" v-text="index2+1" style="width:10%" ></td>
<td align="center" v-text="item2.checkItem" style="width:15%"></td>
<td align="center" v-text="item2.checkContent" style="width:20%"></td>
<td align="center" v-text="item2.checkBasis" style="width:30%"></td>
<td align="center">
<van-radio-group v-model="user.radio">
<van-radio name="1">合格</van-radio>
<van-radio name="2">不合格</van-radio>
<van-radio-group v-model="item2.checkStatus" :disabled="finish=='true'?true:item2.isDisabled">
<van-radio name="0" >合格</van-radio>
<van-radio name="1" @click="noGrage(item2)" >不合格</van-radio>
</van-radio-group>
</td>
</tr>
</tbody>
</table>
</van-tab>
<van-tab title="文明施工类">
<!-- <van-tab title="文明施工类">
</van-tab>
<van-tab title="消防安全类">
</van-tab>
</van-tab> -->
</van-tabs>
<tab-bar :index="1"></tab-bar>
</div>
</template>
<script>
import tabBar from "@/components/TabBar";
import LHeader from '@/components/header.vue'
import { getFun,postFun } from '@/service/table'
export default {
name: 'formwork',
components: {
"LHeader":LHeader
"LHeader":LHeader,
"tabBar":tabBar
},
data() {
return {
active:0,
text:'问题上报表',
user:[
{
subject:"制度,规程",
content:"应建立地下有限空间作业安全生产责任制、安全生产规章制度和操作规程。",
law:"DB11/852.1-2013 5.2.2作业单位应建立地下有限空间作业安全生产责任制、安全生产规章制度和操作规程。",
radio:'1',
},
{
subject:"制度,规程",
content:"应建立地下有限空间作业安全生产责任制、安全生产规章制度和操作规程。",
law:"DB11/852.1-2013 5.2.2作业单位应建立地下有限空间作业安全生产责任制、安全生产规章制度和操作规程。",
radio:'1',
},
{
subject:"人员方案",
content:"应建立地下有限空间作业安全生产责任制、安全生产规章制度和操作规程。",
law:"DB11/852.1-2013 5.2.2作业单位应建立地下有限空间作业安全生产责任制、安全生产规章制度和操作规程。",
radio:'1',
}
],
tableData:[],//导航和表格列表
id:'',//检查执行清单id
active:0,//tab默认选中状态
text:'问题上报表',//顶部文本
finish:'',//提交状态
}
},
mounted() {
if(this.$route.query.id){
this.id=this.$route.query.id
}
if(sessionStorage.getItem('finish')){
this.finish=sessionStorage.getItem('finish')
}
this.init()
},
methods: {
/* 请求问题上报表 */
init(){
this.tableData=[]
this.$toast.loading({
message:'加载中...',
forbidClick: true,
loadingType: 'spinner',
duration: 0
})
getFun('check/carry/list/problem',{planId:this.id}).then((Response)=>{
this.tableData=Response.data
this.$toast.clear()
//根据选择的合格状态来填入单选框禁用状态,'1'为禁用,'0'为启用
this.tableData.forEach((item)=>{
item.list.forEach((item2)=>{
if(item2.checkStatus=='1'){
item2.isDisabled=true
}else if(item2.checkStatus=='0'){
item2.isDisabled=false
}
})
})
})
},
/* 不合格跳转传参回显到检查问题清单 */
noGrage(item2){
//通过禁用状态来判断是否可以跳转
if(item2.isDisabled==false&&this.finish!='true'){
this.$router.push({
name: 'list',
query:{
name:'formwork',
planItemId:item2.id,
planId:this.id,
checkitem:item2.checkItem,//检查项目
checkContent:item2.checkContent,//检查内容
checkBasis:item2.checkBasis,//法律依据
}
})
}
}
}
}
</script>
<style lang="less" scoped>
.card{
width:90%;
box-shadow: 0px 0px 10px 2px #F3F3F3;
padding: 0.25rem;
margin:0.4rem auto;
background: white;
}
.card div{
font-size: 0.4rem;
}
table{
width: 100%;
}
......
......@@ -12,52 +12,134 @@
<div>
<LHeader v-bind:text="text"></LHeader>
<div class="card">
<div>检查名称:昌平区回迁房改造项目安全检查</div>
<div>检查名称:专项检查</div>
<div>检查名称:2021-12-15</div>
<div>检查名称:昌平区回迁房改造工程</div>
<div>检查编号:{{nums.no}}</div>
<div>检查名称:{{nums.name}}</div>
<div>检查类型:{{nums.type}}</div>
<div>检查开始时间:{{nums.planStartTime}}</div>
<div>检查结束时间:{{nums.planEndTime}}</div>
<div>检查地点:{{nums.address}}</div>
</div>
<div class="button-more">
<van-button type="primary" round size="large" @click="problem">检查问题上报(4)</van-button>
<van-button type="primary" round size="large" @click="formwork">检查清单模板(4)</van-button>
<van-button type="primary" round size="large" @click="note">检查问题记录(8)</van-button>
<van-button type="primary" round size="large" @click="end">结束上报</van-button>
<van-button type="primary" round size="large" @click="problem(nums)" :disabled="finish=='true'?true:false">临时问题上报{{'('+nums.addTroubleNumber+')'}}</van-button>
<van-button type="primary" round size="large" @click="formwork">检查清单模板{{'('+nums.listNumber+')'}}</van-button>
<van-button type="primary" round size="large" @click="note" :disabled="nums.troubleNumber<1?true:false">检查问题记录{{'('+nums.troubleNumber+')'}}</van-button>
<van-button type="info" round size="large" :disabled="finish=='true'?true:false" @click="end(nums)">结束上报</van-button>
</div>
<tab-bar :index="1"></tab-bar>
</div>
</template>
<script>
import tabBar from "@/components/TabBar";
import LHeader from '@/components/header.vue'
import { getFun,postFun } from '@/service/table'
export default {
name: 'problem',
components: {
"LHeader":LHeader
"LHeader":LHeader,
"tabBar":tabBar
},
data() {
return {
text:'问题上报'
id:'',//问题上报清单列表列表id
nums:{},//问题上报清单列表
text:'问题上报',//顶部文本
finish:'',//提交状态
submitTroubleNumber:0//问题记录问题提交数量
}
},
mounted() {
//请求新数据
if(this.$route.params.id){
this.id=sessionStorage.getItem('id')
this.finish=sessionStorage.getItem('finish')
this.init()
}
//缓存数据获取---不更新检查执行id时,获取缓存执行id
else if(sessionStorage.getItem('id')){
this.id=sessionStorage.getItem('id')
this.finish=sessionStorage.getItem('finish')
//问题记录提交时候刷新问题记录数量
if(this.$route.query.pageName){
this.init()
}else if(sessionStorage.getItem('noteDelete')){
this.init()
}else{
//当清单模板,问题列表,问题记录不进行提交操作返回该页面调用缓存数据
this.nums=JSON.parse(sessionStorage.getItem('nums'))
this.submitTroubleNumber=JSON.parse(sessionStorage.getItem('submitTroubleNumber'))
}
}
},
methods: {
end(){
/* 请求清单列表和模板数值接口 */
init(){
this.$toast.loading({
message:'加载中...',
forbidClick: true,
loadingType: 'spinner',
duration: 0
})
this.nums=[];
getFun('check/carry/count',{planId:this.id}).then((Response)=>{
this.$toast.clear()
this.submitTroubleNumber=Response.data.submitTroubleNumber
this.nums=Response.data
sessionStorage.setItem('deptNameList',JSON.stringify(Response.data.deptNameList))
sessionStorage.setItem('deptIdList',JSON.stringify(Response.data.deptIdList))
sessionStorage.setItem('projectFlag',Response.data.projectFlag)
sessionStorage.setItem('nums',JSON.stringify(this.nums))
sessionStorage.setItem('submitTroubleNumber',this.submitTroubleNumber)
}).catch(()=>{
this.$toast.clear()
this.$toast.fail('加载失败,请稍后再试')
})
},
/* 结束上报接口请求 */
end(nums){
if(nums.troubleNumber>0){
if(!this.submitTroubleNumber){
this.$toast.fail('您需要至少提交一个问题才能结束上报!')
return
}
}
this.$dialog.confirm({
title: '提示',
message: '确定结束检查上报?',
message: '您已提交'+this.submitTroubleNumber+'个问题'+'确定结束检查上报?',
}).then(()=>{
postFun('check/carry/trouble/finish',{planId:this.id}).then((Response)=>{
this.$toast.clear()
this.$router.push('/checked')
}).catch(()=>{
this.$toast.clear()
this.$toast.fail('加载失败,请稍后再试')
})
})
},
problem(){
this.$router.push('/list')
problem(nums){
var obj={
projectFlag:nums.projectFlag,
deptIdList:nums.deptIdList,
deptNameList:nums.deptNameList
}
this.$router.push({name:'list',query:{id:this.id,obj:JSON.stringify(obj)}})
},
note(){
this.$router.push('/note')
this.$router.push({
name:'note',
query:{
id:this.nums.id,
finish:this.finish
}
})
console.log(this.nums.id)
sessionStorage.setItem('noteId',this.nums.id)
sessionStorage.setItem('checkedFinish',this.finish)
},
formwork(){
this.$router.push('/formwork')
}
}
this.$router.push({name:'formwork',query:{id:this.id,finish:this.finish}})
},
},
}
</script>
<style lang="less" scoped>
......@@ -67,9 +149,11 @@ export default {
padding: 0.25rem;
margin:0.4rem auto;
background: white;
border-radius: 4%;
}
.card div{
font-size: 0.4rem;
line-height: 0.8rem;
}
.button-more{
text-align: center;
......
This diff is collapsed.
<!--
* 严肃声明:
* 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究!
* 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护!
* 可正常分享和学习源码,不得用于违法犯罪活动,违者必究!
* Copyright (c) 2020 陈尼克 all rights reserved.
* 版权所有,侵权必究!
*
-->
<template>
<div>
<LHeader v-bind:text="text"></LHeader>
<div class="card">
<div>问题位置:{{list.address}}</div>
<div>责任单位:{{list.deptNames}}</div>
<div>问题描述:{{list.context}}</div>
<div>法律依据:{{list.checkBasis}}</div>
<div>图片展示:<van-uploader multiple :deletable="false" :show-upload="false" v-model="list.pictures" /></div>
<div>视频展示:
<van-uploader multiple :deletable="false" :show-upload="false" v-model="list.videos" >
<template #preview-cover="{ url }">
<video muted autoplay :src="url" style="width:80px;height:80px;object-fit:cover;"></video>
</template>
</van-uploader>
</div>
</div>
<tab-bar :index="1"></tab-bar>
</div>
</template>
<script>
import tabBar from "@/components/TabBar";
import LHeader from '@/components/header.vue'
import { getFun,postFun } from '@/service/table'
export default {
name: 'detail',
components: {
"LHeader":LHeader,
"tabBar":tabBar
},
data() {
return {
text:'问题详情',//顶部文本
list:{},//详情列表
id:'',//详情列表id
}
},
mounted() {
this.id=this.$route.query.id
this.init()
},
methods: {
/* 获取详情列表 */
init(){
this.list={}
getFun('check/carry/trouble/'+this.id).then((Response)=>{
this.list=JSON.parse(JSON.stringify(Response.data))
//数据处理
this.list.deptNames=this.list.deptNames.join('/')
this.list.pictures=[]
this.list.videos=[]
Response.data.pictures.forEach((item) => {
this.list.pictures.push({
url:item
})
});
Response.data.videos.forEach((item) => {
this.list.videos.push({
url:item
})
});
})
}
}
}
</script>
<style lang="less" scoped>
.card{
width:90%;
box-shadow: 0px 0px 10px 2px #F3F3F3;
padding: 0.25rem;
margin:0.4rem auto;
background: white;
border-radius: 4%;
}
.card div{
font-size: 0.4rem;
line-height: 0.8rem;
}
</style>
<!--
* 严肃声明:
* 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究!
* 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护!
* 可正常分享和学习源码,不得用于违法犯罪活动,违者必究!
* Copyright (c) 2020 陈尼克 all rights reserved.
* 版权所有,侵权必究!
*
-->
<template>
<div>
<LHeader v-bind:text="text"></LHeader>
<van-form @submit="onSubmit" @failed="onFailed">
<van-field
v-model="editObj.context"
name="问题描述"
label="问题描述"
placeholder="问题描述"
:rules="[{ required: true, message: '请填写问题描述' }]"
/>
<van-field
v-model="editObj.checkBasis"
name="判定依据"
label="判定依据"
placeholder="判定依据"
:disabled="true"
/>
<van-field
v-model="editObj.address"
name="问题位置"
label="问题位置"
placeholder="问题位置"
:rules="[{ required: true, message: '请填写问题位置' }]"
/>
<van-field
readonly
clickable
name="picker"
:value="editObj.value"
label="责任单位"
placeholder="请选择部门"
@click="showPicker = true"
:rules="[{ required: true, message: '请填写问题位置' }]"
/>
<van-popup v-model="showPicker" position="bottom">
<van-picker ref="apicker"
show-toolbar
:columns="columns"
@confirm="onConfirm"
@cancel="showPicker = false"
@change="checkScroll"
/>
<!-- <van-area title="标题" :area-list="areaList" @confirm="onConfirm" /> -->
</van-popup>
<van-field name="uploader" label="图像上传" >
<template #input>
<van-uploader :before-read="beforeReadImage" multiple :max-count="5" upload-text="最多上传五个" v-model="editObj.pictures" />
</template>
</van-field>
<van-field name="uploader2" label="视频上传" >
<template #input>
<van-uploader :before-read="beforeReadVideo" accept="video/*" multiple :max-count="5" upload-text="最多上传五个" v-model="editObj.videos" >
<template #preview-cover="{ file,content ,url}">
<div v-if="file?file.type.indexOf('video') !== -1:''" >
<video muted autoplay :src="content" style="width:80px;height:80px;object-fit:cover;"></video>
</div>
<div v-else>
<video muted autoplay :src="url" style="width:80px;height:80px;object-fit:cover;"></video>
</div>
</template>
</van-uploader>
</template>
</van-field>
<div style="margin: 0.5rem">
<van-button round block type="info" native-type="submit">提交</van-button>
</div>
</van-form>
<tab-bar :index="1"></tab-bar>
</div>
</template>
<script>
import tabBar from "@/components/TabBar";
import LHeader from '@/components/header.vue'
import { getFun,postFun } from '@/service/table'
export default {
name: 'list',
components: {
"LHeader":LHeader,
"tabBar":tabBar
},
data() {
return {
/* form表单 */
editObj:{},
value:'',//责任单位
showPicker:false,//默认是否展示弹出层
columns: [],//下拉数组
text:'问题编辑',//顶部文本
ids:[],//下拉框选中值数组id
}
},
mounted() {
if(this.$route.query.name=='note'){
this.editObj=JSON.parse(this.$route.query.obj)
var pictures=[]
var videos=[]
this.editObj.pictures.forEach((item)=>{
pictures.push({url:item})
})
this.editObj.videos.forEach((item)=>{
videos.push({url:item})
})
this.editObj={
id:this.editObj.id,//问题ID
address:this.editObj.address,//问题位置
value:this.editObj.deptNames.join('/'),//责任单位
context:this.editObj.context,//问题描述
checkBasis:this.editObj.checkBasis,//法律依据
pictures:pictures,//图片
videos:videos,//视频
deptIds:this.editObj.deptIds//责任单位IDS
}
this.ids=this.editObj.deptIds
}
this.init()
},
methods: {
/* 获取下拉树级联列表 */
init(){
getFun('check/dept/tree').then((Response)=>{
this.columns=Response.data
})
},
/* 下拉框文本溢出动画效果 */
checkScroll () {
this.$nextTick(() => {
// 获取选中元素
let selectedItems = [...document.querySelectorAll('.van-picker-column__item--selected')]
selectedItems.forEach(item => {
let child = item.querySelector('.van-ellipsis')
if (child.offsetWidth > item.offsetWidth) { // 判断child文字宽度
item.classList.add('scroll')
} else {
item.classList.remove('scroll')
}
})
})
},
onFailed(errorInfo){
this.$toast.fail('提交失败,请完善信息')
},
/* 问题提交 */
onSubmit(value){
console.log(value)
var pictures=[];
value.uploader.forEach((item) => {
if(item.content){pictures.push(item.content)}
else if(item.url){pictures.push(item.url)}
});
var videos=[];
value.uploader2.forEach((item) => {
if(item.content){videos.push(item.content)}
else if(item.url){videos.push(item.url)}
});
var obj={
id:this.editObj.id,//列表ID
pictures:pictures,//图片
videos:videos,//视频
address:value['问题位置'],//问题位置
deptIds:this.ids,//责任单位
context:value['问题描述'],//问题描述
checkBasis:value['法律依据']//法律依据
}
console.log(obj)
this.$dialog.confirm({
title: '提示',
message: '确定提交检查问题?',
}).then(()=>{
this.$toast.loading({
message:'提交中...',
forbidClick: true,
loadingType: 'spinner',
duration: 0
})
postFun('check/carry/trouble/update',obj).then((Response)=>{
this.$toast.clear()
this.$toast.success({
message:'提交成功',
duration: 2000
})
this.$router.push({
name:'note',
query:{
pageName:'problemList',
}
})
}).catch(()=>{
this.$toast.clear()
this.$toast.fail('提交失败,请稍后再试')
})
}).catch(()=>{
})
},
/* 确认选择级联菜单的回显数据处理 */
onConfirm(){
//获取回显的部门值和部门id数组
this.value=""
this.ids=[]
var valueList=this.$refs.apicker.getValues()
valueList.forEach((item)=>{
this.ids.push(item.id)
this.editObj.value+=item.text+' / '
})
this.showPicker = false;
},
beforeReadVideo(file) {
if (file.type.indexOf('video')==-1) {
this.$toast.fail('请上传视频!');
return false;
}
return true;
},
beforeReadImage(file) {
if (file.type.indexOf('image')==-1) {
this.$toast.fail('请上传图片!');
return false;
}
return true;
},
}
}
</script>
<style lang="less" scoped>
.card{
width:90%;
box-shadow: 0px 0px 10px 2px #F3F3F3;
padding: 0.25rem;
margin:0.4rem auto;
background: white;
}
.card div{
font-size: 0.4rem;
}
/deep/ .van-picker-column__item--selected {
/* 重写选中后的效果 */
.van-ellipsis {
text-overflow: unset;
overflow: visible;
}
/* 增加scroll类 */
&.scroll > .van-ellipsis {
animation: move 4s linear infinite;
}
}
@keyframes move {
0% { transform: translateX(100%); }
100% { transform: translateX(-100%); }
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<div id="content">
<van-image
width="100"
height="100"
:src="require('../../assets/result/fail.png')"
/>
<div class="text">{{ text }}</div>
<div class="content" v-if="content">
{{ content }}
</div>
<div class="button">
<van-button block color="#52c41a" @click="$router.back()"
>返回</van-button
>
</div>
</div>
</template>
<script>
export default {
data() {
return {
text: "操作失败",
content: "",
};
},
mounted() {
let {text,content} = this.$route.query;
if(text){
this.text=text;
this.content=content;
}
},
};
</script>
<style scoped>
#content {
text-align: center;
padding-top: 2rem;
}
.text {
margin-top: 0.6rem;
font-size: 0.8rem;
color: #e84335;
}
.button {
padding: 1rem 0.5rem;
}
.content {
font-size: 0.5rem;
color: #aaa;
padding-top: 10px;
}
</style>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment