合并冲突

This commit is contained in:
”Rain“ 2024-05-24 19:05:47 +08:00
commit 895bb4f73e
14 changed files with 237 additions and 76 deletions

30
main.js
View File

@ -306,6 +306,36 @@ Vue.prototype.sendRequest = function(param) {
});
}
// 按钮权限控制指令
Vue.directive('permission', {
inserted: (el, binding) => {
const {
value
} = binding;
// 判断当前用户是否拥有该按钮权限
if (!Vue.prototype.checkPermission(value)) {
el.parentNode.removeChild(el);
}
}
});
// 判断权限的函数
Vue.prototype.checkPermission = function(permission) {
var permissions = JSON.parse(uni.getStorageSync("userInfo")).menuAuthority.menuList;
console.log(permission,'我的测试指令1')
console.log(permissions,'我的测试指令2')
// var permissions = store.state.userInfo.menuAuthority.menuList;
permissions = permissions.filter(
(x) => x.path == permission.menuPath
)[0];
if (!permissions.actionList) {
return false;
}
let index = permissions.actionList.findIndex(
(x) => x.actionCode == permission.key
)
console.log(index,'我的测试指令3')
return index != -1 ? true : false;
}
const app = new Vue({
...App
})

View File

@ -2,8 +2,8 @@
"name" : "智慧安全", //
"appid" : "__UNI__4AA4101",
"description" : "",
"versionName" : "1.5.6",
"versionCode" : 156,
"versionName" : "1.5.7",
"versionCode" : 157,
"transformPx" : false,
/* 5+App */
"app-plus" : {

View File

@ -2464,7 +2464,6 @@
"path": "pages/personLocation/exam/rules/rules",
"style": {
"navigationBarTitleText": "规章",
"enablePullDownRefresh": true,
"onReachBottomDistance": 100
}
},
@ -2580,7 +2579,7 @@
// }]
// }],
"globalStyle": {
"navigationBarBackgroundColor": "#F0AD4E",
// "navigationBarBackgroundColor": "#F0AD4E",
"navigationStyle": "custom",
"app-plus": {
"bounce": "none"

View File

@ -5,37 +5,45 @@
开始考试
</view>
</headers>
<view class="beginexam" v-for="(item,index) in stList" :key="index" v-show="index == stIndex">
<view class="questionTitle">
<text class="text">{{index + 1}}{{item.questionName}}({{item.score||0}})</text>
<text class="rest-time">剩余时间{{ timeLeft }}</text>
<view class="content-part">
<text class="rest-time">剩余时间{{ timeLeft }}</text>
<view class="beginexam" v-for="(item,index) in stList" :key="index" v-show="index == stIndex">
<view class="questionTitle">
<text class="text">{{index + 1}}</text>
<text class="text">{{item.questionName}}({{item.score||0}})</text>
</view>
<view class="radio-content">
<radio-group @change="radioChange" class="radio-boxs" v-if="item.type == 1">
<label class="radio" v-for="(item2,index2) in item.optionList">
<radio :value="item2.optionCode" /><text>{{item2.optionCode}}</text><text
class="question-desc">{{item2.optionDesc}}</text>
</label>
</radio-group>
<checkbox-group @change="checkChange" class="check-boxs" v-if="item.type == 2">
<label class="check" v-for="(item2,index2) in item.optionList">
<checkbox :value="item2.optionCode" /><text>{{item2.optionCode}}</text><text
class="question-desc">{{item2.optionDesc}}</text>
</label>
</checkbox-group>
</view>
</view>
<view class="radio-content">
<radio-group @change="radioChange" class="radio-boxs" v-if="item.type == 1">
<label class="radio" v-for="(item2,index2) in item.optionList">
<radio :value="item2.optionCode" /><text>{{item2.optionCode}}</text>{{item2.optionDesc}}
</label>
</radio-group>
<checkbox-group @change="checkChange" class="check-boxs" v-if="item.type == 2">
<label class="radio" v-for="(item2,index2) in item.optionList">
<checkbox :value="item2.optionCode" /><text>{{item2.optionCode}}</text>{{item2.optionDesc}}
</label>
</checkbox-group>
<view class="progress-style" v-show="stList.length > 0">
<progress :percent="((stIndex + 1) * 100 / stList.length).toFixed(0)" :stroke-width="11"
backgroundColor="#F5F5F5" />
</view>
<view class="step-btn" v-show="stList.length > 0">
<button type="primary" class="btn-front" @click="goFront" v-show="stIndex > 0">上一题</button>
<button type="primary" class="btn-front" @click="goNext"
v-show="stIndex < stList.length - 1">下一题</button>
<button type="primary" class="btn" @click="goHiidden">交卷</button>
</view>
<view class="placeholderBox" v-if="stList.length == 0">
<image src="/static/exam/noCourseData.png" class="noDataImg" style="width: 180rpx; height: 160rpx;">
</image>
<!-- <view class="text">
暂无数据
</view> -->
</view>
</view>
<view class="progress-style" v-show="stList.length > 0">
<progress :percent="((stIndex + 1) * 100 / stList.length).toFixed(0)" :stroke-width="11" backgroundColor="#F5F5F5" />
</view>
<view class="step-btn" v-show="stList.length > 0">
<button type="primary" class="btn-front" @click="goFront" v-show="stIndex > 0">上一题</button>
<button type="primary" class="btn-front" @click="goNext" v-show="stIndex < stList.length - 1">下一题</button>
<button type="primary" class="btn" @click="goHiidden">交卷</button>
</view>
<view class="placeholderBox" v-if="stList.length == 0">
<image src="/static/exam/noCourseData.png" class="noDataImg" style="width: 180rpx; height: 160rpx;"></image>
<!-- <view class="text">
暂无数据
</view> -->
</view>
<levitatedsphere :x="100" :y="80"></levitatedsphere>
</view>
@ -58,16 +66,20 @@
this.getDataFn();
},
onLoad(options) {
console.log(options, 123456)
this.pageData = JSON.parse(options.transportData)
console.log(this.pageData.examDuration)
this.totalTime = +this.pageData.examDuration * 60;
},
onShow() {
this.totalTime = +this.pageData.examDuration * 60;
this.startTimer();
},
onHide() {
this.stopTimer();
},
onUnload() {
this.stopTimer();
},
computed: {
timeLeft() {
let hours = Math.floor(this.totalTime / 3600);
@ -132,6 +144,7 @@
}, 1000);
},
stopTimer() {
console.log('我计时器已卸载')
clearInterval(this.timer);
this.timer = null;
},
@ -207,15 +220,15 @@
goFront(index) {
let that = this;
that.stIndex--;
var progressTip = document.querySelector('.uni-progress-info');
progressTip.innerText = (((that.stIndex + 1) * 100) / that.stList.length).toFixed(0) + '%'
// var progressTip = document.querySelector('.uni-progress-info');
// progressTip.innerText = (((that.stIndex + 1) * 100) / that.stList.length).toFixed(0) + '%'
},
//
goNext(index) {
let that = this;
that.stIndex++;
var progressTip = document.querySelector('.uni-progress-info');
progressTip.innerText = (((that.stIndex + 1) * 100) / that.stList.length).toFixed(0) + '%'
// var progressTip = document.querySelector('.uni-progress-info');
// progressTip.innerText = (((that.stIndex + 1) * 100) / that.stList.length).toFixed(0) + '%'
// uni.hideLoading()
},
goHiidden() {
@ -260,32 +273,63 @@
<style scoped lang="scss">
.main-content {
height: 100vh;
display: flex;
flex-direction: column;
.content-part {
// height: 100%;
flex: 1;
position: relative;
.rest-time {
position: absolute;
top: 0rpx;
right: 5rpx;
}
}
.beginexam {
padding: 26.92rpx 32.69rpx;
height: 58%;
display: flex;
flex-direction: column;
// overflow-y: scroll;
.questionTitle {
width: 100%;
position: relative;
display: flex;
.text {
width: 61%;
display: inline-block;
font-size: 34.62rpx;
color: #272D45;
}
.rest-time {
position: absolute;
top: 7rpx;
right: 20rpx;
.text:nth-child(2) {
font-size: 34rpx;
width: 52%;
overflow-wrap: anywhere;
}
}
.radio-content {
flex: 1;
overflow-y: scroll;
.radio-boxs {
display: flex;
flex-direction: column;
.radio {
display: flex;
align-items: flex;
.question-desc {
display: inline-block;
width: 82%;
overflow-wrap: anywhere;
}
}
}
.radio-boxs>label {
@ -295,6 +339,17 @@
.check-boxs {
display: flex;
flex-direction: column;
.check {
display: flex;
align-items: flex;
.question-desc {
display: inline-block;
width: 82%;
overflow-wrap: anywhere;
}
}
}
.check-boxs>label {
@ -362,6 +417,7 @@
position: relative;
background: linear-gradient(111deg, #5383F6 0%, #7FF0FF 100%);
}
/deep/ .uni-progress-info {
position: absolute;
right: 20rpx;

View File

@ -51,6 +51,25 @@
this.pageData = JSON.parse(options.examData)
},
methods: {
examAgain(url){
var that = this
let requestData = {
id: this.pageData.trainRecordId
}
this.sendRequest({
url: "xmgl/workerExam/startExam",
data: requestData,
method: 'post',
success(res) {
if (res.code == 200) {
uni.redirectTo({
url: `/pages${url}?transportData=` + JSON.stringify(that
.pageData)
});
}
}
})
},
goHiidden(url) {
uni.navigateTo({
url: `/pages${url}`

View File

@ -13,6 +13,8 @@
<image src="/static/exam/courseImg.png"></image>
<view class="course-title">
<text>科目类型{{item.subjectName}}</text>
</view>
<view class="course-title">
<text>培训计划名称{{item.trainName}}</text>
</view>
<view class="text-boxs">

View File

@ -53,12 +53,12 @@
this.userInfo = JSON.parse(uni.getStorageSync("userInfo"))
this.getRulesDataFn();
},
onPullDownRefresh() {
setTimeout(function() {
uni.stopPullDownRefresh()
}, 1000)
console.log("下拉刷新");
},
// onPullDownRefresh() {
// setTimeout(function() {
// uni.stopPullDownRefresh()
// }, 1000)
// console.log("");
// },
onReachBottom() {
// console.log("============================")
uni.showLoading({
@ -201,8 +201,8 @@
.rules {
box-shadow: 4rpx 4rpx 8rpx 2rpx rgba(81, 129, 246, 0.12);
margin-top: 44rpx;
height: calc(100vh - 300rpx);
height: calc(100vh - 270rpx);
padding-bottom: 60rpx;
overflow-y: scroll;
}

View File

@ -7,7 +7,7 @@
</headers>
<view class="video" v-show="videoList.length">
<video v-for="(item,index) in videoList" :key="index" id="myVideo" class="disable-progress" style="width: 100%;height: 390rpx;"
:muted="true" :show-mute-btn="true" :src="item.url" :enable-progress-gesture="false"
:muted="false" :show-mute-btn="true" :src="item.url" :enable-progress-gesture="false"
:controls="item.controlsBool" @play="videoStart(index)" @ended="videoEnd(index)">
</video>
<!-- <swiper circular :indicator-dots="false" indicator-color="rgba(99, 99, 99, 1)"
@ -67,6 +67,11 @@
//
that.videoList[index].isVideoOver = true;
that.videoList[index].controlsBool = true;
//
that.$forceUpdate();
setTimeout(function(){
that.$forceUpdate();
},500)
let startExamBool = true;
that.videoList.map(item => {
if (!item.isVideoOver) {

View File

@ -2,18 +2,18 @@
<view class="index">
<image class="loginLogo" src="@/static/personLocation/bg.jpg"></image>
<view class="index-items">
<view class="index-item" @click="goNavigateTo('/pages/personLocation/home/home')">
<!-- <view class="index-item" @click="goNavigateTo('/pages/personLocation/home/home')">
<image src="@/static/personLocation/train.png" mode="heightFix"></image>
人员定位
</view>
</view> -->
<view class="index-item" @click="goNavigateTo('/pages/personLocation/exam/index/index')">
<image src="@/static/personLocation/book.png" mode="heightFix"></image>
培训考试
</view>
<view class="index-item">
<!-- <view class="index-item">
<image src="@/static/personLocation/qrcode.png" mode="heightFix"></image>
人员二维码
</view>
</view> -->
<view class="index-item" @click="goNavigateTo('/pages/personLocation/emergencyalarm/emergencyalarm',1)">
<image src="@/static/personLocation/alarm.png" mode="heightFix"></image>
一键报警

View File

@ -129,7 +129,7 @@
</view>
</view>
</view>
<image v-if="type !== 'supplier'" v-show="tabIndex==1" src="/static/addImg.png" class="addImg"
<image v-permission="{key: 'clgl_blackWhiteList', menuPath: '/project/carManage/carManage'}" v-if="type !== 'supplier'" v-show="tabIndex==1" src="/static/addImg.png" class="addImg"
@click="goAdd('')"></image>
<levitatedsphere :x="100" :y="80"></levitatedsphere>
</view>

View File

@ -164,8 +164,8 @@
if(res.code == 200){
that.listData = res.result;
that.listData.map(item => {
let str = "***************"
item.workerCard = item.workerCard.substring(0,3)+str+item.workerCard.substring(16)
let str = "*************"
item.workerCard = item.workerCard.substring(0,3)+str+item.workerCard.substring(14)
})
}
}

View File

@ -5,7 +5,7 @@
培训计划
</view>
</headers>
<view class="list-box">
<view class="list-box" v-if="dataList.length">
<view class="list-box-item" @click="toDetail(item)" v-for="(item,index) in dataList" :key="index">
<view class="item-flex">
<text>培训计划名称: </text>
@ -33,6 +33,12 @@
</view>
</view>
</view>
<view class="placeholderBox" v-else>
<image src="/static/exam/noCourseData.png" class="noDataImg" style="width: 180rpx; height: 160rpx;"></image>
<!-- <view class="text">
暂无数据
</view> -->
</view>
<view class="btn-operate" @click="toAdd">
<button type="primary"
>创建培训计划</button>

View File

@ -4,6 +4,13 @@
<view class="headerName">
人员列表
</view>
<!-- <template #right>
<checkbox-group @change="selectAll">
<label>
<checkbox :value="1" />全选
</label>
</checkbox-group>
</template> -->
</headers>
<!-- <scroll-view scroll-y="true" class="pageContent"> -->
<view class="personContent">
@ -23,7 +30,7 @@
{{item.sex==2?'女':'男'}} {{item.age}}
</view>
</view>
<checkbox :value="item.checkVal" />
<checkbox :value="item.checkVal" :disabled="item.isDisable" :checked="item.isChecked" />
</view>
</checkbox-group>
<view class="placeholderBox" v-show="personList.length==0">
@ -72,6 +79,10 @@
this.loadData()
},
methods: {
//
// selectAll(){
// },
addSaveBtn() {
let dealData = [];
this.personList.map(item => {
@ -84,7 +95,8 @@
workerType: item.typeName,
sex: item.sex,
age: item.age,
fieldAcquisitionUrl: item.fieldAcquisitionUrl
fieldAcquisitionUrl: item.fieldAcquisitionUrl,
enterpriseId: item.enterpriseId
})
}
})
@ -129,7 +141,20 @@
uni.hideLoading() //
that.personList.map((item, index) => {
item.checkVal = index + "";
item.isDisable = false;
item.isChecked = false;
})
if (uni.getStorageSync("personInfo")) {
let storeArr = JSON.parse(uni.getStorageSync("personInfo"))
that.personList.map((item, index) => {
let findIndex = storeArr.findIndex(item2 => item2.workerId == item
.id)
if (findIndex != -1) {
item.isDisable = true;
item.isChecked = true;
}
})
}
}
})
},
@ -145,6 +170,7 @@
<style lang="scss" scoped>
.personContent {
padding: 15px;
padding-bottom: 80rpx;
}
.personItem {
@ -181,16 +207,16 @@
}
.addSaveBtn {
width: 60%;
width: 100%;
padding: 10px 0;
text-align: center;
background-color: #4181FE;
color: #fff;
font-size: 34rpx;
border-radius: 30px;
letter-spacing: 2px;
position: fixed;
bottom: 3%;
left: 20%;
bottom: 0%;
left: 0%;
z-index: 10
}
</style>

View File

@ -13,6 +13,7 @@
<text>{{item.workerType}}</text>
<text>{{item.sex == 1?'男':'女'}}&nbsp;&nbsp;{{item.age}}</text>
</view>
<u-icon name="minus-circle" color="#FF1212" size="36" @click="deletePersonFn(index)"></u-icon>
</view>
</view>
<view class="placeholderBox" v-else>
@ -47,13 +48,25 @@
uni.removeStorageSync("personInfo")
},
onShow() {
if(uni.getStorageSync("personInfo")){
this.personList = JSON.parse(uni.getStorageSync("personInfo"))
if (uni.getStorageSync("personInfo")) {
let storeArr = JSON.parse(uni.getStorageSync("personInfo"));
let newArr = [];
storeArr.map(item => {
let findIndex = this.personList.findIndex(item2 => item2.workerId == item.workerId)
if(findIndex == -1){
newArr.push(item)
}
})
this.personList = this.personList.concat(newArr)
}
},
methods: {
addForm(){
if(!this.personList.length){
deletePersonFn(index) {
this.personList.splice(index, 1)
uni.setStorageSync("personInfo", JSON.stringify(this.personList))
},
addForm() {
if (!this.personList.length) {
uni.showToast({
title: '请选择人员',
icon: 'none'
@ -71,20 +84,20 @@
header: {},
method: 'post',
success(res) {
if(res.code == 200){
if (res.code == 200) {
uni.showToast({
title: "添加成功"
})
setTimeout(function(){
setTimeout(function() {
uni.redirectTo({
url: './list'
})
},500)
}, 500)
}
}
})
},
toSelectPerson(){
toSelectPerson() {
uni.navigateTo({
url: './searchTeam/teamList'
})
@ -118,11 +131,13 @@
.main-content {
display: flex;
flex-direction: column;
.index-boxs {
height: calc(100vh - 200rpx);
overflow-y: scroll;
padding: 58rpx 35rpx;
padding-bottom: 10rpx;
.index-box {
width: 100%;
background-color: white;
@ -144,6 +159,7 @@
flex-direction: column;
justify-content: space-around;
margin: 8rpx 20rpx 0rpx 20rpx;
margin-right: auto;
text:nth-child(1) {
color: #303030;
@ -173,6 +189,7 @@
align-items: center;
box-sizing: border-box;
z-index: 99;
.btn-select {
width: 50%;
line-height: 40px;
@ -181,7 +198,8 @@
text-align: center;
border-radius: 10rpx;
}
.btn-resubmit{
.btn-resubmit {
width: 50%;
line-height: 40px;
background-color: #5382F6;