This commit is contained in:
Paidax
2025-03-27 15:38:56 +08:00
parent 7410b3a181
commit 50aa04192a
47 changed files with 4438 additions and 686 deletions
@@ -1,4 +1,45 @@
const commonUtil = {
//axios配置
axiosService() {
// 创建 axios 实例
const axiosService = axios.create({
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
"x-requested-with": "XMLHttpRequest"
}
})
//axios拦截器
axiosService.interceptors.response.use(
(response) => {
const userAgent = navigator.userAgent || navigator.vendor || window.opera
const isMobile = /iPad|iPhone|iPod|Android/.test(userAgent)
//判断是否为blob 不处理直接返回文件流
if (response.config.responseType === "blob") {
return response
}
if (response.data && response.data.code !== 0) {
if (isMobile) {
vant.Toast(response.data.msg)
} else {
ELEMENT.Message.error(response.data.msg)
}
return Promise.reject(response.data)
}
return response.data
},
(error) => {
const userAgent = navigator.userAgent || navigator.vendor || window.opera
const isMobile = /iPad|iPhone|iPod|Android/.test(userAgent)
if (isMobile) {
vant.Toast(error.message)
} else {
ELEMENT.Message.error(error.message)
}
return Promise.reject(error)
}
)
return axiosService
},
//权限认证
authService() {
function authPermission(permission) {
@@ -65,4 +106,55 @@ const commonUtil = {
}
}
},
//下载文件
downLoadService: function (url, data) {
const loading = ELEMENT.Loading.service({
lock: true,
text: "导出中,请耐心等待",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)"
})
Vue.prototype.$axios
.post(url, data, { responseType: "blob" })
.then((response) => {
if (response.data.type === "application/json") {
try {
const reader = new FileReader()
reader.onload = function () {
// reader.result 包含了 Blob 的内容,转换为字符串
const content = reader.result
// 将字符串解析为 JSON 对象
const jsonObject = JSON.parse(content)
this.$message.error(jsonObject.msg)
}
reader.readAsText(response.data)
} catch (err) {
this.$message.error("下载文件出错")
}
return
}
//获取服务器返回的文件描述信息
const contentDisposition = response.headers["content-disposition"]
const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
const matches = filenameRegex.exec(contentDisposition)
let filename = ""
if (matches != null && matches[1]) {
filename = matches[1].replace(/['"]/g, "")
filename = decodeURIComponent(filename)
}
//执行下载文件
const url = window.URL.createObjectURL(new Blob([response.data]))
const link = document.createElement("a")
link.href = url
link.setAttribute("download", filename) // 例如 'document.pdf'
document.body.appendChild(link)
link.click()
link.parentNode.removeChild(link)
loading.close()
})
.finally(() => {
loading.close()
})
},
}
@@ -5,7 +5,8 @@ const self_mixin = {
hasRegUserNum: 0,
unionId: null,
unionLimitNum: 0,
isRegisterFull: false
isRegisterFull: false,
user: JSON.parse(window.sessionStorage.getItem('user'))
}
},
methods: {
@@ -15,9 +16,9 @@ const self_mixin = {
resp.data.location = JSON.parse(resp.data.location)
resp.data.unionUserNumberLimit = JSON.parse(resp.data.unionUserNumberLimit)
this.o = resp.data
this.unionId = "${@shiro.getPrincipalProperty('unit').getUnionid()}"
this.unionId = this.user.union.id
if (!this.unionId) {
this.$toast.fail('您的所属工会信息缺失,请联系管理员')
this.$message.warning('您的所属工会信息缺失,请联系管理员')
return
}
if (this.o.userNumberLimit === 2) {
@@ -127,4 +128,4 @@ const self_mixin = {
return s.toFixed(2)
}
}
}
}
File diff suppressed because it is too large Load Diff
@@ -1,373 +1,312 @@
<template>
<el-tabs tab-position="top" v-model="activeName" v-loading="loading">
<el-tab-pane label="活动基础信息" name="1">
<el-form label-suffix=":" style="padding: 20px 0" label-width="120px">
<el-form-item class="item-center">{{ viewData.name }}</el-form-item>
<el-tabs tab-position="top" v-model="activeName" v-loading="loading">
<el-tab-pane label="活动基础信息" name="1">
<border-table>
<table>
<tr>
<th>联系人</th>
<td>{{ viewData.username }}( {{ viewData.loginname }})</td>
<th>联系方式</th>
<td>{{ viewData.mobile }}</td>
<th>活动编号</th>
<td>{{ viewData.activityCode }}</td>
</tr>
<tr>
<th>活动名称</th>
<td>{{ viewData.name }}</td>
<th>活动类型</th>
<td>{{ viewData.type === 1 ? "分工会活动" : viewData.type === 2 ? "协会协会活动" : "校工会活动" }}</td>
<th>活动项目类型</th>
<td>{{ viewData.projectTypeName }}( {{ viewData.projectTypeCode }})</td>
</tr>
<tr>
<th>活动地点</th>
<td>{{ viewData.address }}</td>
<th>报名时间</th>
<td>{{ viewData.applyStartTime }} - {{ viewData.applyEndTime }}</td>
<th>活动时间</th>
<td>{{ viewData.startTime }} - {{ viewData.endTime }}</td>
</tr>
<tr>
<th>创建组织</th>
<td>
<span v-if="viewData.type===40001">{{ "校工会" }}</span>
<span v-if="viewData.type===40002">{{ viewData.unionname ? viewData.unionname : "暂无" }}</span>
<span v-if="viewData.type===40003">{{ viewData.clubName ? viewData.clubName : "暂无" }}</span>
</td>
<th>报名方式</th>
<td>
<span v-if="viewData.signUpMethod===1">个人报名</span>
<span v-else-if="viewData.signUpMethod===2">分工会报名</span>
<span v-else-if="viewData.signUpMethod===3">组队报名</span>
<span v-else-if="!viewData.signUpMethod">无需报名</span>
</td>
<th>报名人数限制</th>
<td>
<span v-if="viewData.userNumberLimit===1">总人数限制({{viewData.totalUserNumberLimit }})</span>
<span v-else-if="viewData.userNumberLimit===2">分工会人数限制</span>
<span v-else-if="!viewData.userNumberLimit">不限制</span>
</td>
</tr>
<tr v-if="viewData.userNumberLimit===2">
<th>报名方式</th>
<td colspan="5">
<el-table border stripe :data="viewData.unionUserNumberLimit" size="small"
height="500">
<el-table-column type="index" label="序号" header-align="center" align="center"
width="100">
</el-table-column>
<el-table-column label="分工会名称" prop="unionname"></el-table-column>
<el-table-column label="分工会人数" prop="teacherCount"></el-table-column>
<el-table-column label="限制人数" prop="limitNum"></el-table-column>
</el-table>
</td>
</tr>
<tr v-if="viewData.needSign && viewData.needSign!=null">
<th>是否需要签到</th>
<td>{{ viewData.needSign ? "需要" : "不需要" }}</td>
<th>签到半径</th>
<td colspan="3">{{ viewData.rangeMeter + "米" }}</td>
</tr>
<tr v-if="viewData.needSign">
<th>活动签到点位</th>
<td colspan="5">
<el-card shadow="never">
<div style="width: 100%;height: 500px" id="signMap"></div>
</el-card>
</td>
</tr>
<tr>
<th>活动介绍</th>
<td colspan="5">
<div v-html="viewData.activityContent"></div>
</td>
</tr>
<tr>
<th>附件</th>
<td colspan="5">
<file-upload v-if="viewData.otherFiles&&viewData.otherFiles.length"
:files="viewData.otherFiles" :view="true">
</file-upload>
<span v-else>暂无</span>
</td>
</tr>
<tr>
<th>封面图</th>
<td colspan="5">
<img v-if="viewData.cover"
:src="FILE_DOMAIN + '/fileStreamPreview?id=' + viewData.cover"
class="avatar" style="height: 200px;width: auto">
<span v-else>暂无</span>
</td>
</tr>
<el-row gutter="60">
</table>
</border-table>
<el-col :span="12">
<el-form-item label="联系人">
<span v-if="viewData.username">
{{ viewData.username }}
({{ viewData.loginname }})</span>
</el-form-item>
</el-col>
</el-tab-pane>
<el-tab-pane label="活动费用" name="3" v-if="!viewData.isEnrollSystem">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0" label-width="80px">
<el-col :span="12">
<el-form-item label="联系方式">
{{ viewData.mobile }}
</el-form-item>
</el-col>
<el-table border stripe :data="viewData.goods">
<el-col :span="12">
<el-form-item label="活动编号">
{{ viewData.activityCode }}
</el-form-item>
</el-col>
<el-table-column
type="index" label="序号" header-align="center" align="center" width="100">
</el-table-column>
<el-col :span="12">
<el-form-item label="活动项目类型">
{{ viewData.projectTypeName }}({{ viewData.projectTypeCode }})
</el-form-item>
</el-col>
<el-table-column
label="物品名称" header-align="center" align="center" prop="name">
</el-table-column>
<el-col :span="12">
<el-form-item label="活动类型">
{{ viewData.type === 1 ? '分工会活动' : viewData.type === 2 ? '协会协会活动' : '校工会活动' }}
</el-form-item>
</el-col>
<el-table-column
label="物品价格" header-align="center" align="center" prop="actualPrice">
</el-table-column>
</el-table>
<el-col :span="12">
<el-form-item label="活动计划时间">
{{ viewData.startPlannedDate + ' - ' + viewData.endPlannedDate }}
</el-form-item>
</el-col>
<el-form-item label="发&emsp;&emsp;票">
<file-upload v-if="viewData.billFiles&&viewData.billFiles.length"
:files="viewData.billFiles" :view="true">
</file-upload>
<span v-else>暂无</span>
</el-form-item>
<el-col :span="12">
<el-form-item label="活动时间">{{ viewData.startTime }} - {{
viewData.endTime
}}
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.applyStartTime">
<el-form-item label="报名时间">{{ viewData.applyStartTime }} - {{
viewData.applyEndTime
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动人数">{{ viewData.peopleNum || '暂无' }}</el-form-item>
</el-col>
<el-form-item label="照&emsp;&emsp;片">
<file-upload v-if="viewData.photoFiles&&viewData.photoFiles.length"
:files="viewData.photoFiles" :view="true">
</file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-form>
<el-col :span="24">
<el-form-item label="活动内容">
<span style="white-space: pre-line">
{{ viewData.activityContent }}
</span>
</el-form-item>
</el-col>
<el-col :span="24" v-if="!viewData.isEnrollSystem">
<el-form-item label="活动考核内容">
<span style="white-space: pre-line">
{{ viewData.activityExamineContent }}
</span>
</el-form-item>
</el-col>
</el-tab-pane>
<el-tab-pane label="活动总结" name="4" v-if="!viewData.isEnrollSystem">
<el-form ref="form" label-width="120px">
<el-form-item prop="activitySummary" label="活动总结">
{{ viewData.activitySummary }}
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="审核信息" name="5" v-if="viewData.auditId">
<el-form ref="form" label-width="120px">
<el-col :span="24">
<el-form-item label="活动地点">{{ viewData.address }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报名方式">
<span v-if="viewData.signUpMethod===1">个人报名</span>
<span v-else-if="viewData.signUpMethod===2">分工会报名</span>
<span v-else-if="viewData.signUpMethod===3">组队报名</span>
<span v-else-if="!viewData.signUpMethod">无需报名</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动提醒">
{{ viewData.xlFlag ? '提醒' : '不提醒' }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否用于报名">
<span v-if="viewData.isEnrollSystem">活动报名</span>
<span v-else>活动管理</span>
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.signUpMethod!=null">
<el-form-item label="报名人数限制">
<span v-if="viewData.userNumberLimit===1">总人数限制({{
viewData.totalUserNumberLimit
}})</span>
<span v-else-if="viewData.userNumberLimit===2">分工会人数限制</span>
<span v-else-if="!viewData.userNumberLimit">不限制</span>
</el-form-item>
</el-col>
<el-col :span="24" v-if="viewData.userNumberLimit===2">
<el-form-item label="分工会限制名额">
<el-table border stripe :data="viewData.unionUserNumberLimit" size="small"
height="500">
<el-table-column type="index" label="序号" header-align="center" align="center"
width="100">
</el-table-column>
<el-table-column label="分工会名称" prop="unionname"></el-table-column>
<el-table-column label="分工会人数" prop="teacherCount"></el-table-column>
<el-table-column label="限制人数" prop="limitNum"></el-table-column>
</el-table>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item v-if="viewData.type===1" label="所属工会">
{{ !viewData.unionname ? '暂无' : viewData.unionname }}
</el-form-item>
<el-form-item v-if="viewData.type===2" label="所属协会">
{{ !viewData.clubName ? '暂无' : viewData.clubName }}
</el-form-item>
<el-form-item v-if="viewData.type===3" label="所属组织">
校工会
</el-form-item>
</el-col>
<el-col :span="12" v-if="[1,2].includes(viewData.signUpMethod)">
<el-form-item label="是否需要签到">
{{ viewData.needSign ? '需要' : '不需要' }}
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.signUpMethod!=null">
<el-form-item label="签到半径(m)" v-if="viewData.needSign">
{{ viewData.rangeMeter + '' }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="封面图" prop="cover">
<img v-if="viewData.cover"
:src="FILE_DOMAIN + '/fileStreamPreview?id=' + viewData.cover"
class="avatar" style="height: 200px;width: auto">
</el-form-item>
</el-col>
<el-col :span="24" v-if="viewData.needSign">
<el-form-item prop="" label="活动签到点位">
<el-card shadow="never">
<div style="width: 100%;height: 500px" id="signMap"></div>
</el-card>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="活动费用" name="3" v-if="!viewData.isEnrollSystem">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0" label-width="80px">
<el-table border stripe :data="viewData.goods">
<el-table-column
type="index" label="序号" header-align="center" align="center" width="100">
</el-table-column>
<el-table-column
label="物品名称" header-align="center" align="center" prop="name">
</el-table-column>
<el-table-column
label="物品价格" header-align="center" align="center" prop="actualPrice">
</el-table-column>
</el-table>
<el-form-item label="发&emsp;&emsp;票">
<file-upload v-if="viewData.billFiles&&viewData.billFiles.length"
:files="viewData.billFiles" :view="true">
</file-upload>
<span v-else>暂无</span>
</el-form-item>
<el-form-item label="照&emsp;&emsp;片">
<file-upload v-if="viewData.photoFiles&&viewData.photoFiles.length"
:files="viewData.photoFiles" :view="true">
</file-upload>
<span v-else>暂无</span>
</el-form-item>
<el-form-item label="其&emsp;&emsp;他">
<file-upload v-if="viewData.otherFiles&&viewData.otherFiles.length"
:files="viewData.otherFiles" :view="true">
</file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="活动总结" name="4" v-if="!viewData.isEnrollSystem">
<el-form ref="form" label-width="120px">
<el-form-item prop="activitySummary" label="活动总结">
{{ viewData.activitySummary }}
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="审核信息" name="5" v-if="viewData.auditId">
<el-form ref="form" label-width="120px">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.audit.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.audit.auditTime }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见:">
{{ viewData.audit.auditOpinion }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.audit.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.audit.auditTime }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见:">
{{ viewData.audit.auditOpinion }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
},
data() {
return {
userData: [],
viewData: {},
loading: true,
search: '',
tableKey: '',
activeName: '1',
userColumns: [],
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async doExport() {
window.open("/platform/activity/info/mange/doExportUser?id=" + this.viewData.id)
},
async userChange() {
if (this.search) {
const {data} = await $.get("/platform/activity/info/mange/searchTissueUser", {
id: this.viewData.id,
search: this.search
})
this.userData = data
}
},
async getInfo(id) {
this.userColumns = [{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '联系方式'},
{prop: 'unitName', label: '所属单位'},
{prop: 'unionName', label: '所属工会'}]
this.loading = true
const {data} = await $.get("/platform/activity/info/mange/findOne", {id})
this.loading = false
if (data) {
if (data.needSign) {
this.userColumns.push({prop: 'isSign', label: '是否签到'})
this.userColumns.push({prop: 'signTime', label: '签到时间'})
props: {
handle: {
type: Boolean,
default: false
},
label: {
type: String,
default: "审核"
}
data.billFiles = JSON.parse(data.billFiles)
data.photoFiles = JSON.parse(data.photoFiles)
data.otherFiles = JSON.parse(data.otherFiles)
this.userData = clone(data.tissuePersonList)
data.unionUserNumberLimit = JSON.parse(data.unionUserNumberLimit)
data.location = JSON.parse(data.location)
this.viewData = data
this.tableKey = new Date().getTime()
this.initMap()
this.activeName = this.handle ? "999" : "1"
} else {
this.viewData = {}
this.$notify.error({title: '错误', message: '获取信息失败'});
}
},
initMap() {
let marker = null
this.$nextTick(() => {
let map = new AMap.Map("signMap", {
resizeEnable: true,
center: [118.640081, 32.082496],
zoom: 16
});
data() {
return {
userData: [],
viewData: {},
loading: true,
search: "",
tableKey: "",
activeName: "1",
userColumns: []
}
},
components: {
"file-upload": httpVueLoader("/components/plugins/FileUpload.vue")
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async doExport() {
window.open("/platform/activity/info/mange/doExportUser?id=" + this.viewData.id)
},
async userChange() {
if (this.search) {
const { data } = await $.get("/platform/activity/info/mange/searchTissueUser", {
id: this.viewData.id,
search: this.search
})
this.userData = data
}
},
async getInfo(id) {
this.userColumns = [{ prop: "userName", label: "姓名" },
{ prop: "loginName", label: "工号" },
{ prop: "sex", label: "性别" },
{ prop: "mobile", label: "联系方式" },
{ prop: "unitName", label: "所属单位" },
{ prop: "unionName", label: "所属工会" }]
this.loading = true
const { data } = await $.get("/platform/activity/info/mange/findOne", { id })
this.loading = false
if (data) {
if (data.needSign) {
this.userColumns.push({ prop: "isSign", label: "是否签到" })
this.userColumns.push({ prop: "signTime", label: "签到时间" })
}
data.billFiles = JSON.parse(data.billFiles)
data.photoFiles = JSON.parse(data.photoFiles)
data.otherFiles = JSON.parse(data.otherFiles)
this.userData = clone(data.tissuePersonList)
data.unionUserNumberLimit = JSON.parse(data.unionUserNumberLimit)
data.location = JSON.parse(data.location)
this.viewData = data
this.tableKey = new Date().getTime()
this.initMap()
this.activeName = this.handle ? "999" : "1"
} else {
this.viewData = {}
this.$notify.error({ title: "错误", message: "获取信息失败" })
}
},
initMap() {
let marker = null
this.$nextTick(() => {
let map = new AMap.Map("signMap", {
resizeEnable: true,
center: [118.640081, 32.082496],
zoom: 16
})
if (this.viewData.location && Array.isArray(this.viewData.location)) {
const lng = parseFloat(this.viewData.location[0])
const lat = parseFloat(this.viewData.location[1])
marker = new AMap.Marker({
position: [lng, lat],
offset: new AMap.Pixel(-13, -30)
});
marker.setMap(map);
map.setZoomAndCenter(18, [lng, lat])
if (this.viewData.location && Array.isArray(this.viewData.location)) {
const lng = parseFloat(this.viewData.location[0])
const lat = parseFloat(this.viewData.location[1])
marker = new AMap.Marker({
position: [lng, lat],
offset: new AMap.Pixel(-13, -30)
})
marker.setMap(map)
map.setZoomAndCenter(18, [lng, lat])
}
map.on("click", (e) => {
console.log(e)
if (marker) {
marker.setMap(null)
marker = null
}
marker = new AMap.Marker({
position: [e.lnglat.getLng(), e.lnglat.getLat()],
offset: new AMap.Pixel(-13, -30)
})
marker.setMap(map)
this.formData.location = []
this.formData.location.push(e.lnglat.getLng())
this.formData.location.push(e.lnglat.getLat())
})
})
}
map.on('click', (e) => {
console.log(e)
if (marker) {
marker.setMap(null)
marker = null
}
marker = new AMap.Marker({
position: [e.lnglat.getLng(), e.lnglat.getLat()],
offset: new AMap.Pixel(-13, -30)
})
marker.setMap(map)
this.formData.location = []
this.formData.location.push(e.lnglat.getLng())
this.formData.location.push(e.lnglat.getLat())
});
})
}
},
}
</script>
<style>
.item-center {
text-align: center;
font-weight: 700;
margin-right: 110px;
text-align: center;
font-weight: 700;
margin-right: 110px;
}
.item-center .el-form-item__content {
font-size: 18px;
font-size: 18px;
}
</style>