安全例会模块开发->参会人员上传证明

dev
WenShiJun 2024-03-06 16:11:38 +08:00
parent 44dd6ba00b
commit 869c0a6cda
3 changed files with 193 additions and 174 deletions

121
package-lock.json generated
View File

@ -1,162 +1,117 @@
{
"name": "UniApp_integrated_whb",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"lockfileVersion": 1,
"dependencies": {
"@dcloudio/uni-ui": "^1.5.0",
"moment": "^2.29.4",
"vue-aliplayer": "^1.0.0"
"@babel/parser": {
"version": "7.24.0",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.0.tgz",
"integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==",
"dev": true
},
"devDependencies": {
"@types/html5plus": "^1.0.2",
"@types/uni-app": "^1.4.4"
}
"@dcloudio/uni-ui": {
"version": "1.5.2",
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-ui/-/uni-ui-1.5.2.tgz",
"integrity": "sha512-/MO31TELyHcKt3nS5bo1t8lQmLSnP9EKlHcShjqM27gL0QeYtoc9UekOITRbA9zi8rnlII3Aw91DHtny3IodFg=="
},
"node_modules/@babel/parser": {
"version": "7.23.6",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.6.tgz",
"integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@dcloudio/uni-ui": {
"version": "1.5.0",
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-ui/-/uni-ui-1.5.0.tgz",
"integrity": "sha512-E7D37VbRZeh1E2yzrIie8psBckIrErdkUbUA751rlG8zdioGovW3zOuUsKgY+Gh7csMvi6XMEoSacvboe8o4Gw=="
},
"node_modules/@types/html5plus": {
"@types/html5plus": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/@types/html5plus/-/html5plus-1.0.5.tgz",
"integrity": "sha512-qt5z+3WYkARL/rWnJRcB2fCDOZLKa/hEOkse9sjA6FFkXZtKb+OPxKqo8bDgix4+ufahOff0adarVfaUaK1mfw==",
"dev": true
},
"node_modules/@types/uni-app": {
"@types/uni-app": {
"version": "1.4.8",
"resolved": "https://registry.npmmirror.com/@types/uni-app/-/uni-app-1.4.8.tgz",
"integrity": "sha512-plxwi9MvGDrekCsDKuNlCN3ZXIv9zkqHsKZJOsc8FQqLSHveDBOm11qOaswe4QyNWVHpvwZMViii/Ni1/d40LA==",
"dev": true,
"dependencies": {
"requires": {
"vue": "^2.6.8"
}
},
"node_modules/@vue/compiler-sfc": {
"@vue/compiler-sfc": {
"version": "2.7.16",
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
"integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
"dev": true,
"dependencies": {
"requires": {
"@babel/parser": "^7.23.5",
"postcss": "^8.4.14",
"prettier": "^1.18.2 || ^2.0.0",
"source-map": "^0.6.1"
},
"optionalDependencies": {
"prettier": "^1.18.2 || ^2.0.0"
}
},
"node_modules/csstype": {
"csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"dev": true
},
"node_modules/moment": {
"moment": {
"version": "2.30.1",
"resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
"engines": {
"node": "*"
}
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
},
"node_modules/nanoid": {
"nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
"dev": true
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/picocolors": {
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"node_modules/postcss": {
"version": "8.4.33",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.33.tgz",
"integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==",
"postcss": {
"version": "8.4.35",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.35.tgz",
"integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
"dev": true,
"dependencies": {
"requires": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/prettier": {
"prettier": {
"version": "2.8.8",
"resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz",
"integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
"dev": true,
"optional": true,
"bin": {
"prettier": "bin-prettier.js"
"optional": true
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/source-map": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
"dev": true
},
"node_modules/source-map-js": {
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
"dev": true
},
"node_modules/vue": {
"vue": {
"version": "2.7.16",
"resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz",
"integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
"deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.",
"dev": true,
"dependencies": {
"requires": {
"@vue/compiler-sfc": "2.7.16",
"csstype": "^3.1.0"
}
},
"node_modules/vue-aliplayer": {
"vue-aliplayer": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/vue-aliplayer/-/vue-aliplayer-1.0.0.tgz",
"integrity": "sha512-z29s38hlNJDckGSPtuTsYwMdjj70SsvJ5VzbEoBoV2BTrg3ucvodM2CW7BWstrG9WaQqz4F8nVGLSON05RrmJw==",
"dependencies": {
"requires": {
"vue-github-badge": "^1.0.0"
}
},
"node_modules/vue-github-badge": {
"vue-github-badge": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/vue-github-badge/-/vue-github-badge-1.0.1.tgz",
"integrity": "sha512-8X+FUWapnnDfs6cRUg3mCfHUf2r5arUfCSRdvbIn860oj9us3Rz3VOtioUgmfzh6EhaaYTs0Oh78EzJ+Z6uqAA=="

View File

@ -35,9 +35,9 @@
<view class="dy-subtitle">
<text>会议时间{{i.MEETING_DATE_START}}</text>
</view>
<view class="dy-subtitle">
<text>会议状态{{i.MEETING_STATUS}}</text>
</view>
<!-- <view class="dy-subtitle">-->
<!-- <text>会议状态{{i.MEETING_STATUS}}</text>-->
<!-- </view>-->
<!-- <view class="dy-subtitle">-->
<!-- <text>会议内容</text>-->
<!-- <rich-text :nodes="i.MEETING_CONTENT"></rich-text>-->

View File

@ -40,48 +40,60 @@
</scroll-view>
<uni-drawer ref="showHiddenWindow" mode="right" :mask-click="true">
<scroll-view scroll-y="true" style="height: 100vh;">
<!-- 实时照片部分 -->
<view class="cu-form-group image-upload-container">
<view class="title">实时照片</view>
<view class="icon-upload" v-if="!livePhotos.length" @click="chooseImage('LIVEPHOTOS')">
<view class="de-drawer">
<view class="cu-bar bg-white">
<view class="action">实时照片</view>
</view>
<view class="cu-form-group">
<view class="grid col-4 grid-square flex-sub">
<!-- 循环展示隐患图片因为只允许一张故使用v-if控制 -->
<view class="bg-img" v-if="liveImgs.length > 0" @tap="ViewImage"
:data-url="liveImgs[0].FILEPATH">
<image :src="liveImgs[0].IMGFILES_ID ? (baseImgPath + liveImgs[0].FILEPATH) : liveImgs[0].FILEPATH" mode="aspectFill"></image>
<!-- 删除图片按钮 -->
<view class="cu-tag bg-red" @tap.stop="DelImg" data-type="0">
<text class='cuIcon-close'></text>
</view>
</view>
<!-- 上传图片按钮仅当没有图片时显示 -->
<view class="solids" @tap="ChooseImage"
v-if="liveImgs.length === 0">
<text class='cuIcon-cameraadd'></text>
</view>
<!-- 图片预览区 -->
<view class="image-preview" v-for="(photo, index) in livePhotos" :key="index">
<image :src="photo" mode="aspectFill" class="upload-image"></image>
<!-- 删除按钮 -->
<view class="delete-icon" @tap.stop="removeImage(index, 'LIVEPHOTOS')">
</view>
</view>
</view>
<view class="cu-form-group" style="border: none;" v-if="!forbidEdit">
<view class="title">签字</view>
<button class="cu-btn bg-green shadow" @tap="modalShow = true" data-target="Modal">手写签字</button>
</view>
<view class="cu-bar bg-white" v-show="signImgList && signImgList.length > 0">
<view class="action">
签字照片
</view>
</view>
<view class="cu-form-group" v-show="signImgList && signImgList.length > 0">
<view class="grid col-4 grid-square flex-sub">
<view style="width: 60%;" class="bg-img" v-for="(item,index) in signImgList" :key="index" @tap="ViewImage" data-type="0" :data-url="signImgList[index].filePath">
<image :src="signImgList[index].filePath" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg" data-type="0" :data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
</view>
<!-- 签字照片部分 -->
<view class="cu-form-group image-upload-container">
<view class="title">签字照片</view>
<view class="icon-upload" v-if="!signaturePicture" @click="chooseImage('SIGNATUREPICTURE')">
<text class='cuIcon-edit'></text>
</view>
<!-- 图片预览区 -->
<view class="image-preview" v-if="signaturePicture">
<image :src="signaturePicture" mode="aspectFill" class="upload-image"></image>
</view>
<!-- 删除按钮 -->
<view>
<view class="delete-icon" @tap.stop="removeImage('SIGNATUREPICTURE')">
<text class='cuIcon-close'></text>
</view>
<view class="cu-modal" :class="{'show':modalShow}">
<sign @confirm="subCanvas" @cancel="modalShow = false"></sign>
</view>
<view class="cu-form-group" style="margin-top: 20px;">
<button class="cu-btn block bg-blue margin-tb-sm" @click="submitMeetingAttendance"></button>
</view>
</scroll-view>
<button @click="saveAndCloseDrawer"></button>
</uni-drawer>
<view class="cu-form-group">
<view class="title">是否参会</view>
<button class="cu-btn round bg-blue" @click="addHidden"></button>
<button class="cu-btn round bg-blue" @click="addMeeting"></button>
</view>
<yk-authpup ref="authpup" type="top" @changeAuth="$noMultipleClicks(editLocation)" :permissionID="permissionID"></yk-authpup>
</view>
</template>
@ -89,13 +101,18 @@
import {
basePath,loginUser
} from '@/common/tool.js';
import sign from '@/components/sign/sign.vue';
import ykAuthpup from "@/components/yk-authpup/yk-authpup"
import {baseImgPath} from "../../../common/tool";
export default {
components: {
sign,
ykAuthpup
},
data() {
return {
baseImgPath: baseImgPath,
modalShow: false,
permissionID:'',
SAFETY_MEETING_ID : '',
varList:[],
@ -110,8 +127,10 @@
RECORDER:"",
MEETING_DATE_START:"",
MEETING_DATE_END:"",
livePhotos: [],
signaturePicture: [],
liveImgs: [],
signImgList: [],
LIVEPHOTOS: '',
SIGNATUREPICTURE: '',
}
},
onLoad(e){
@ -141,7 +160,6 @@
},
data: {
SAFETY_MEETING_ID: _this.SAFETY_MEETING_ID,
CORPINFO_ID:loginUser.CORPINFO_ID,
USER_ID:loginUser.USER_ID,
},
success: (res) => {
@ -157,38 +175,116 @@
}
});
},
ChooseImage() {
var _this = this;
uni.chooseImage({
count: 1,
sizeType: ['original', 'compressed'],
sourceType: ['camera'],
success: (res) => {
let img = {
IMGFILES_ID: '',
FILEPATH: res.tempFilePaths[0]
};
_this.liveImgs = [img];
}
});
},
DelImg() {
var _this = this;
uni.showModal({
content: '确定要删除这张图片吗?',
cancelColor: "#000000",
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
_this.liveImgs = [];
}
}
})
},
subCanvas (e) {
this.signImgList.splice(0, this.signImgList.length);
this.signImgList.push(e);
this.SIGNATUREPICTURE = e.filePath;
this.modalShow = false;
},
delImg (e) {
var _this = this;
let i = e.currentTarget.dataset.index
uni.showModal({
content: '确定要删除这张图片吗?',
cancelColor: "#000000",
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
_this.signImgList.splice(i, 1)
}
}
})
},
submitMeetingAttendance() {
if (this.liveImgs.length === 0 || this.signImgList.length === 0) {
uni.showToast({
title: '请上传实时照片和签字图片',
icon: 'none'
});
return;
}
addHidden() {
const livePhotoPath = this.liveImgs[0].FILEPATH;
const signPhotoPath = this.signImgList[0].filePath;
const params = {
SAFETY_MEETING_ID: this.SAFETY_MEETING_ID,
LIVEPHOTOS: livePhotoPath,
SIGNATUREPICTURE: signPhotoPath,
ATTENDANCE_STATUS: '1'
};
uni.showLoading({
title: '提交中...'
});
uni.request({
url: basePath + '/app/safetymeeting/edit',
method: 'POST',
header: {
'Content-type':'application/x-www-form-urlencoded'
},
data: params,
success: (res) => {
uni.hideLoading();
if (res.data.result === 'success') {
uni.showToast({
title: '提交成功',
icon: 'success'
});
this.$refs.showHiddenWindow.close();
} else {
uni.showToast({
title: '提交失败',
icon: 'none'
});
}
}
});
},
addMeeting() {
if (this.$refs.showHiddenWindow) {
//
this.liveImgs = [];
this.signImgList = [];
this.$refs.showHiddenWindow.open();
}
this.creatorList = [{
NAME: loginUser.NAME,
USER_ID: loginUser.USER_ID
}]
// (drawer)
this.$refs['showHiddenWindow'].open()
this.showHiddenWindow = true
this.hiddenIsEdit = true
},
chooseImage(type) {
uni.chooseImage({
count: 1, //
success: (res) => {
if (type === 'LIVEPHOTOS' && res.tempFilePaths.length) {
this.livePhotos = res.tempFilePaths[0]; //
} else if (type === 'SIGNATUREPICTURE' && res.tempFilePaths.length) {
this.signaturePicture = res.tempFilePaths[0]; //
}
},
});
},
removeImage(type) {
if (type === 'LIVEPHOTOS') {
this.livePhotos = []; //
} else {
this.signaturePicture = null; // null
}
},
openAuth(permissionID){
this.permissionID = permissionID;
@ -247,38 +343,6 @@
display: inline-block; /* 如果需要显示为inline-block */
}
.image-upload-container {
position: relative;
padding: 10px;
}
.upload-image {
width: 100%; /* 宽度占满容器,根据需要调整 */
height: auto; /* 高度自适应 */
border-radius: 4px; /* 轻微圆角 */
}
.image-preview {
position: relative;
width: 90px; /* 根据需要调整 */
height: 90px; /* 根据需要调整 */
margin-right: 10px; /* 与下一张图片的间距 */
display: inline-block; /* 使图片并排显示 */
}
.delete-icon {
position: absolute;
top: -10px; /* 超出图片范围的一部分,根据需要调整 */
right: -10px; /* 超出图片范围的一部分,根据需要调整 */
background-color: #ff4949; /* 您的红色背景 */
width: 20px; /* 删除图标的大小,根据实际情况调整 */
height: 20px;
border-radius: 10px; /* 圆形 */
display: flex;
align-items: center;
justify-content: center;
}
.delete-icon text {
color: white; /* 图标颜色为白色 */
font-size: 14px; /* 图标大小,根据需要调整 */