协会整改
This commit is contained in:
@@ -110,7 +110,7 @@ layout("/mobile/platform.html"){
|
||||
left-arrow
|
||||
placeholder
|
||||
fixed
|
||||
@click-left="pjaxReplace('/mobile/index')"
|
||||
@click-left="leavePage"
|
||||
safe-area-inset-top
|
||||
></van-nav-bar>
|
||||
|
||||
@@ -207,13 +207,13 @@ layout("/mobile/platform.html"){
|
||||
></van-empty>
|
||||
</div>
|
||||
|
||||
<van-popup v-model="infoShow" get-container="#app" position="right" :style="{ height: '100%', width: '100%' }">
|
||||
<van-popup v-model="infoShow" :close-on-click-overlay="false" get-container="#app" position="right" :style="{ height: '100%', width: '100%' }">
|
||||
<van-nav-bar
|
||||
title="社团详细信息"
|
||||
left-arrow
|
||||
placeholder
|
||||
fixed
|
||||
@click-left="infoShow = false"
|
||||
@click-left="closePopup"
|
||||
safe-area-inset-top></van-nav-bar>
|
||||
<van-tabs v-model="infoActive">
|
||||
<van-tab title="社团信息">
|
||||
@@ -233,94 +233,29 @@ layout("/mobile/platform.html"){
|
||||
<span style="cursor: pointer; color: #236eb4">点击查看</span>
|
||||
</van-cell>
|
||||
</van-cell-group>
|
||||
<div class="footer" v-if="canJoin">
|
||||
<van-button class="join" @click="startJoin">我要加入</van-button>
|
||||
</div>
|
||||
<van-cell v-else title="申请状态" :value="joinStatus"></van-cell>
|
||||
</van-tab>
|
||||
<van-tab v-if="viewType === 'join'" title="个人信息">
|
||||
<van-form @submit="needJoin" ref="form" :show-error-message="false">
|
||||
<van-cell-group inset class="mt10">
|
||||
<van-field readonly v-model="formData.username" name="username"
|
||||
label="姓名" :rules="[{ required: true }]"></van-field>
|
||||
<van-field readonly v-model="formData.sex" name="sex"
|
||||
label="性别" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.birthday" name="birthday" required
|
||||
@click="showPicker = true"
|
||||
placeholder="请填写出生年月" label="出生年月" :rules="[{ required: true }]">
|
||||
</van-field>
|
||||
<van-popup v-model="showPicker" position="bottom">
|
||||
<van-datetime-picker
|
||||
type="date"
|
||||
title="选择年月日"
|
||||
@confirm="(val) => {formData.birthday = moment(val).format('YYYY-MM-DD'); showPicker = false}"
|
||||
@cancel="showPicker = false"
|
||||
></van-datetime-picker>
|
||||
<van-field v-model="formData.username" name="username" label="姓名" placeholder="请填写姓名" readonly required :rules="[{ required: true, message: '请填写姓名' }]"></van-field>
|
||||
<van-field v-model="formData.sex" name="sex" label="性别" placeholder="请填写性别" readonly required :rules="[{ required: true, message: '请填写性别' }]"></van-field>
|
||||
<van-field v-model="formData.loginname" name="loginname" label="工号" placeholder="请填写工号" readonly required :rules="[{ required: true, message: '请填写工号' }]"></van-field>
|
||||
<van-field v-model="formData.birthday" name="birthday" label="出生年月" placeholder="请填写出生年月" readonly @click="openBirthday" required :rules="[{ required: true, message: '请填写出生年月' }]"></van-field>
|
||||
<van-popup v-model="showPicker" position="bottom" :close-on-click-overlay="false">
|
||||
<van-datetime-picker v-model="birthdayPickerValue" type="date" :min-date="birthdayMinDate" :max-date="birthdayMaxDate" title="选择出生日期" @confirm="confirmBirthday" @cancel="closePopup"></van-datetime-picker>
|
||||
</van-popup>
|
||||
<van-field v-model="formData.birthPlace" name="birthPlace" required
|
||||
placeholder="请填写出生地" label="出生地" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.education" name="education" required
|
||||
placeholder="请填写文化程度" label="文化程度" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.hobby" name="hobby" required
|
||||
placeholder="请填写爱好" label="爱好" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.unitName" name="unitName" required
|
||||
readonly label="工作部门" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.position" name="position" required
|
||||
placeholder="请填写职务" label="职务" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.mobile" name="mobile" required
|
||||
placeholder="请填写电话" label="电话" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.email" name="email" required
|
||||
placeholder="请填写电子邮箱" label="电子邮箱" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.homeAddress" name="homeAddress" required
|
||||
placeholder="请填写家庭住址" label="家庭住址" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.QQNumber" name="QQNumber" required
|
||||
placeholder="请填写QQ" label="QQ" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.bodyHeight" name="bodyHeight" required
|
||||
placeholder="请填写身高" label="身高" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.bodyWeight" name="bodyWeight" required
|
||||
placeholder="请填写体重" label="体重" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.health" name="health" required
|
||||
placeholder="请填写身体状况" label="身体状况" :rules="[{ required: true }]"></van-field>
|
||||
<van-field v-model="formData.sport" name="sport" required
|
||||
placeholder="请填写经常从事的运动" label="经常从事的运动" :rules="[{ required: true }]"></van-field>
|
||||
<van-field name="medicalHistory" required
|
||||
placeholder="是否有过特殊病史" label="是否有过特殊病史">
|
||||
<template #input>
|
||||
<van-radio-group v-model="formData.medicalHistory" direction="horizontal">
|
||||
<van-radio :name="true">是</van-radio>
|
||||
<van-radio :name="false">否</van-radio>
|
||||
</van-radio-group>
|
||||
</template>
|
||||
</van-field>
|
||||
<van-field name="joinActivity" required
|
||||
placeholder="是否愿意参加本协会的活动" label="是否愿意参加本协会的活动">
|
||||
<template #input>
|
||||
<van-radio-group v-model="formData.joinActivity" direction="horizontal">
|
||||
<van-radio :name="true">是</van-radio>
|
||||
<van-radio :name="false">否</van-radio>
|
||||
</van-radio-group>
|
||||
</template>
|
||||
</van-field>
|
||||
<van-field v-model="formData.otherThing" name="otherThing"
|
||||
rows="1"
|
||||
autosize
|
||||
type="textarea"
|
||||
placeholder="是否有特别需要说明的问题(身体或心理)" label="是否有特别需要说明的问题"></van-field>
|
||||
<van-field v-model="formData.remark" name="remark"
|
||||
rows="1"
|
||||
autosize
|
||||
type="textarea"
|
||||
placeholder="备注" label="备注"></van-field>
|
||||
<van-field name="photo" label="两寸登记照" required
|
||||
style="flex-flow: column" input-align="left">
|
||||
<template #label>
|
||||
<div class="mb10">两寸登记照</div>
|
||||
</template>
|
||||
<template #input>
|
||||
<vant-file-upload
|
||||
:max="1"
|
||||
:files.sync="formData.photo"></vant-file-upload>
|
||||
</template>
|
||||
</van-field>
|
||||
<van-field v-model="formData.mobile" name="mobile" label="联系电话" placeholder="请填写联系电话" maxlength="20" required :rules="[{ required: true, message: '请填写联系电话' }]"></van-field>
|
||||
<van-field name="medicalHistory" label="是否有特殊病史" required><template #input><van-radio-group v-model="formData.medicalHistory" direction="horizontal"><van-radio :name="true">是</van-radio><van-radio :name="false">否</van-radio></van-radio-group></template></van-field>
|
||||
<van-field v-model="formData.otherThing" name="otherThing" label="是否有特别需要说明的问题" placeholder="如有,请填写特别需要说明的问题" maxlength="100" type="textarea" autosize></van-field>
|
||||
<van-field v-model="formData.emergencyContact" name="emergencyContact" label="紧急联系人" placeholder="请填写紧急联系人" maxlength="50" required :rules="[{ required: true, message: '请填写紧急联系人' }]"></van-field>
|
||||
<van-field v-model="formData.emergencyMobile" name="emergencyMobile" label="紧急联系电话" placeholder="请填写紧急联系电话" maxlength="20" required :rules="[{ required: true, message: '请填写紧急联系电话' }]"></van-field>
|
||||
</van-cell-group>
|
||||
<div class="footer">
|
||||
<van-button class="join join_submit" native-type="submit">申请加入</van-button>
|
||||
<van-button class="join join_submit" :loading="formLoading" native-type="submit">申请加入</van-button>
|
||||
</div>
|
||||
</van-form>
|
||||
</van-tab>
|
||||
@@ -336,6 +271,9 @@ layout("/mobile/platform.html"){
|
||||
data() {
|
||||
return {
|
||||
showPicker: false,
|
||||
birthdayPickerValue: new Date(),
|
||||
birthdayMinDate: new Date(1900, 0, 1),
|
||||
birthdayMaxDate: new Date(),
|
||||
infoActive: 0,
|
||||
clickRow: {},
|
||||
typeOptions: [],
|
||||
@@ -343,17 +281,77 @@ layout("/mobile/platform.html"){
|
||||
infoShow: false,
|
||||
detailData: {},
|
||||
viewType: '',
|
||||
formLoading: false,
|
||||
// 服务端保留本次页面请求的社团 ID,避免依赖页面切换时的地址栏状态。
|
||||
scanClubId: decodeURIComponent('${scanClubId!}'.replace(/\+/g, '%20')),
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
canJoin() {
|
||||
return !!this.detailData.id && ![1, 3, 5].includes(Number(this.detailData.status))
|
||||
},
|
||||
joinStatus() {
|
||||
return {1: '待社团审核', 3: '待校工会审核', 5: '已加入'}[this.detailData.status] || ''
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
showCode(type) {
|
||||
if(type === 'QQ' && this.clickRow.qqgroupcode) {
|
||||
const ids = JSON.parse(this.clickRow.qqgroupcode).map(o => FILE_DOMAIN + '/fileStreamPreview?id=' + o.id)
|
||||
vant.ImagePreview({images: ids})
|
||||
} else if(type === 'weChat' && this.clickRow.wechatgroupcode) {
|
||||
const ids = JSON.parse(this.clickRow.wechatgroupcode).map(o => FILE_DOMAIN + '/fileStreamPreview?id=' + o.id)
|
||||
vant.ImagePreview({images: ids})
|
||||
// 所有弹层由统一历史栈同步;页面不单独监听 popstate。
|
||||
syncPopup(key, visible) {
|
||||
if (key === 'info') this.$set(this, 'infoShow', visible)
|
||||
if (key === 'birthday') this.$set(this, 'showPicker', visible)
|
||||
if (key === 'confirm' && !visible) vant.Dialog.close()
|
||||
if (key === 'preview' && !visible && this.clubPreview) this.clubPreview.close()
|
||||
},
|
||||
closePopup() {
|
||||
return mobilePopupHistory.close()
|
||||
},
|
||||
leavePage() {
|
||||
if (mobilePopupHistory.stack.length) {
|
||||
this.closePopup()
|
||||
return
|
||||
}
|
||||
this.disposePopup()
|
||||
pjaxReplace('/mobile/index')
|
||||
},
|
||||
disposePopup() {
|
||||
mobilePopupHistory.unregister(this.syncPopup)
|
||||
$(document).off('pjax:beforeSend.clubScan')
|
||||
},
|
||||
openBirthday() {
|
||||
// 选择器定位到系统出生日期;档案为空时允许用户补填。
|
||||
const date = moment(this.formData.birthday, 'YYYY-MM-DD', true)
|
||||
this.$set(this, 'birthdayPickerValue', date.isValid() ? date.toDate() : new Date())
|
||||
mobilePopupHistory.open('birthday')
|
||||
},
|
||||
confirmBirthday(value) {
|
||||
this.$set(this.formData, 'birthday', moment(value).format('YYYY-MM-DD'))
|
||||
this.closePopup()
|
||||
},
|
||||
// 确认/取消先回退本层历史,系统返回由同步回调关闭确认框。
|
||||
confirmAction(message) {
|
||||
mobilePopupHistory.open('confirm')
|
||||
return vant.Dialog.confirm({title: '提示', message, closeOnPopstate: false})
|
||||
.then(() => this.closePopup())
|
||||
.catch(() => {
|
||||
if (mobilePopupHistory.stack.includes('confirm')) {
|
||||
return this.closePopup().then(() => Promise.reject())
|
||||
}
|
||||
return Promise.reject()
|
||||
})
|
||||
},
|
||||
showCode(type) {
|
||||
const files = type === 'QQ' ? this.detailData.qqgroupcode : this.detailData.wechatgroupcode
|
||||
if (!files) return
|
||||
const images = (typeof files === 'string' ? JSON.parse(files) : files)
|
||||
.map(o => FILE_DOMAIN + '/fileStreamPreview?id=' + o.id)
|
||||
if (!images.length) return
|
||||
mobilePopupHistory.open('preview')
|
||||
this.clubPreview = vant.ImagePreview({
|
||||
images, closeOnPopstate: false,
|
||||
onClose: () => {
|
||||
if (mobilePopupHistory.stack.includes('preview')) this.closePopup()
|
||||
}
|
||||
})
|
||||
},
|
||||
doSearch() {
|
||||
this.pageForm.pageNumber = 1
|
||||
@@ -361,7 +359,7 @@ layout("/mobile/platform.html"){
|
||||
this.finished = false
|
||||
this.onLoad()
|
||||
},
|
||||
async onLoad() {
|
||||
onLoad() {
|
||||
this.loading = true
|
||||
$.post('/platform/sys/club/sq/pageData', this.pageForm).then(res => {
|
||||
if (res.code === 0) {
|
||||
@@ -372,99 +370,139 @@ layout("/mobile/platform.html"){
|
||||
this.pageForm.pageNumber++
|
||||
}
|
||||
}
|
||||
this.loading = false
|
||||
})
|
||||
}).always(() => { this.loading = false })
|
||||
},
|
||||
openInfo(row, type) {
|
||||
this.viewType = type
|
||||
this.infoActive = type === 'view' ? 0 : 1
|
||||
if(type === 'join') {
|
||||
this.formData = {
|
||||
if (this.mLoading) return
|
||||
this.mLoading = true
|
||||
// clubId 是社团主键;data 返回详情及登录用户状态,不受列表页码、筛选影响。
|
||||
$.post('/platform/sys/club/sq/scanDetail', {clubId: row.id}).then(res => {
|
||||
if (res.code !== 0) {
|
||||
vant.Toast(res.msg || '社团信息加载失败')
|
||||
return
|
||||
}
|
||||
this.detailData = res.data
|
||||
this.clickRow = res.data
|
||||
this.viewType = 'view'
|
||||
this.infoActive = 0
|
||||
if (this.canJoin && (type === 'join' || type === 'scan')) {
|
||||
this.prepareJoin()
|
||||
}
|
||||
// 等待条件页签及弹框渲染后再打开;扫码先展示社团信息,列表申请展示个人信息。
|
||||
this.$nextTick(() => {
|
||||
this.infoActive = type === 'join' && this.canJoin ? 1 : 0
|
||||
mobilePopupHistory.open('info')
|
||||
})
|
||||
}).fail(() => vant.Toast('社团信息加载失败,请重试'))
|
||||
.always(() => { this.mLoading = false })
|
||||
},
|
||||
startJoin() {
|
||||
if (!this.canJoin) return
|
||||
// 已进入加入模式时保留用户填写的数据,不因切换页签再次清空。
|
||||
if (this.viewType !== 'join') this.prepareJoin()
|
||||
this.$nextTick(() => { this.infoActive = 1 })
|
||||
},
|
||||
// 初始化当前社团的加入表单;扫码展示两个页签时也复用此方法。
|
||||
prepareJoin() {
|
||||
this.viewType = 'join'
|
||||
this.$set(this, 'formData', {
|
||||
username: "${@shiro.getPrincipalProperty('username')}",
|
||||
sex: "${@shiro.getPrincipalProperty('sex')}",
|
||||
loginname: "${@shiro.getPrincipalProperty('loginname')}",
|
||||
birthday: "${@shiro.getPrincipalProperty('birthday')}",
|
||||
birthPlace: "${@shiro.getPrincipalProperty('birthPlace')}",
|
||||
education: "${@shiro.getPrincipalProperty('education')}",
|
||||
hobby: "${@shiro.getPrincipalProperty('hobby')}",
|
||||
unitName: "${@shiro.getPrincipalProperty('unit').getName()}",
|
||||
position: "${@shiro.getPrincipalProperty('position')}",
|
||||
mobile: "${@shiro.getPrincipalProperty('mobile')}",
|
||||
email: "${@shiro.getPrincipalProperty('email')}",
|
||||
homeAddress: "${@shiro.getPrincipalProperty('homeAddress')}",
|
||||
}
|
||||
}
|
||||
this.clickRow = row
|
||||
$.get("/platform/sys/club/mange/findOne", {id: row.id}, (data) => {
|
||||
if (data.code === 0) {
|
||||
this.detailData = data.data
|
||||
this.infoShow = true
|
||||
}
|
||||
}, "json");
|
||||
medicalHistory: null, otherThing: '', emergencyContact: '', emergencyMobile: ''
|
||||
})
|
||||
},
|
||||
async needJoin() {
|
||||
needJoin() {
|
||||
if (this.formLoading || !this.canJoin) return
|
||||
const row = this.clickRow
|
||||
if(this.formData.medicalHistory === '' || this.formData.medicalHistory === undefined || this.formData.medicalHistory === null) {
|
||||
vant.Toast('请选择是否有过特殊病史')
|
||||
vant.Toast('请选择是否有特殊病史')
|
||||
return
|
||||
}
|
||||
if(this.formData.joinActivity === '' || this.formData.joinActivity === undefined || this.formData.joinActivity === null) {
|
||||
vant.Toast('请选择是否愿意参加本协会的活动')
|
||||
return
|
||||
}
|
||||
if(this.formData.photo === '' || this.formData.photo === undefined || this.formData.photo === null) {
|
||||
vant.Toast('请上传两寸登记照')
|
||||
return
|
||||
}
|
||||
const {code, data} = await $.post('/platform/sys/club/sq/getInClubByCurUser')
|
||||
let str = ''
|
||||
if (data && data.length > 0) {
|
||||
str = '您已经加入了'
|
||||
data.forEach((item) => {
|
||||
str += '【' + item.name + '】'
|
||||
})
|
||||
str += ','
|
||||
}
|
||||
str += '请确认是否申请加入【' + row.name + '】?'
|
||||
vant.Dialog.confirm({title: '提示', message: str,}).then(() => {
|
||||
this.formData.clubid = row.id
|
||||
this.formData.photo = this.formData.photo[0].filepath
|
||||
$.post("/platform/sys/club/sq/submit", this.formData, (data) => {
|
||||
if (data.code === 0) {
|
||||
vant.Toast(data.msg)
|
||||
this.doSearch()
|
||||
this.infoShow = false
|
||||
} else {
|
||||
vant.Toast(data.msg)
|
||||
}
|
||||
}, "json");
|
||||
}).catch(() => {
|
||||
});
|
||||
this.$set(this, 'formLoading', true)
|
||||
$.post('/platform/sys/club/sq/getInClubByCurUser').then(res => {
|
||||
if (res.code !== 0) {
|
||||
vant.Toast(res.msg)
|
||||
return
|
||||
}
|
||||
const data = res.data
|
||||
let str = ''
|
||||
if (data && data.length > 0) {
|
||||
str = '您已经加入了'
|
||||
data.forEach((item) => {
|
||||
str += '【' + item.name + '】'
|
||||
})
|
||||
str += ','
|
||||
}
|
||||
str += '请确认是否申请加入【' + row.name + '】?'
|
||||
this.confirmAction(str).then(() => {
|
||||
this.$set(this, 'formLoading', true)
|
||||
// 仅提交精简后的入会资料,出生年月和电话不回写用户档案。
|
||||
const params = Object.assign({}, this.formData, {
|
||||
clubid: row.id
|
||||
})
|
||||
$.post("/platform/sys/club/sq/submit", params).then(data => {
|
||||
if (data.code === 0) {
|
||||
vant.Toast(data.msg)
|
||||
mobilePopupHistory.clear().then(() => this.doSearch())
|
||||
} else {
|
||||
vant.Toast(data.msg)
|
||||
}
|
||||
}).always(() => { this.$set(this, 'formLoading', false) })
|
||||
}).catch(() => {
|
||||
});
|
||||
}).always(() => { this.$set(this, 'formLoading', false) })
|
||||
},
|
||||
rollback(o) {
|
||||
vant.Dialog.confirm({title: '提示', message: '请确定是否撤销申请?',}).then(() => {
|
||||
this.confirmAction('请确定是否撤销申请?').then(() => {
|
||||
const id = o.id
|
||||
$.post("/platform/sys/club/sq/revocation", {id}, (data) => {
|
||||
this.$set(this, 'formLoading', true)
|
||||
$.post("/platform/sys/club/sq/revocation", {id}).then(data => {
|
||||
if (data.code === 0) {
|
||||
vant.Toast('撤销申请成功');
|
||||
this.doSearch();
|
||||
} else {
|
||||
vant.Toast(data.msg);
|
||||
}
|
||||
}, "json");
|
||||
}).always(() => { this.$set(this, 'formLoading', false) })
|
||||
}).catch(() => {
|
||||
});
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
const data = await getClubType()
|
||||
data.forEach(item => {
|
||||
this.typeOptions.push({text: item.name, value: item.code})
|
||||
created() {
|
||||
mobilePopupHistory.register(this.syncPopup)
|
||||
// PJAX 离开前先清理弹框历史,重新发起原页面跳转,并注销本页回调。
|
||||
$(document).on('pjax:beforeSend.clubScan', (event, xhr, options) => {
|
||||
if (mobilePopupHistory.stack.length) {
|
||||
event.preventDefault()
|
||||
mobilePopupHistory.clear().then(() => {
|
||||
this.disposePopup()
|
||||
pjaxReplace(options.url)
|
||||
})
|
||||
return false
|
||||
}
|
||||
this.disposePopup()
|
||||
})
|
||||
this.typeOptions.unshift({text: '全部类型'})
|
||||
this.$set(this.pageForm, "clubType", this.typeOptions[0].value)
|
||||
this.$set(this.pageForm, "isjr", this.clubType[0].value)
|
||||
this.pageForm.searchName = 'club.name'
|
||||
this.$set(this.pageForm, 'isjr', false)
|
||||
this.$set(this.pageForm, 'searchName', 'club.name')
|
||||
this.onLoad()
|
||||
getClubType().then(data => {
|
||||
data.forEach(item => {
|
||||
this.typeOptions.push({text: item.name, value: item.code})
|
||||
})
|
||||
this.typeOptions.unshift({text: '全部类型'})
|
||||
this.$set(this.pageForm, "clubType", this.typeOptions[0].value)
|
||||
})
|
||||
},
|
||||
mounted() {
|
||||
// 兼容已有二维码;无 clubId 的普通入口仍显示列表,不猜测目标社团。
|
||||
const clubId = this.scanClubId || new URLSearchParams(window.location.search).get('clubId')
|
||||
if (clubId) this.openInfo({id: clubId}, 'scan')
|
||||
},
|
||||
beforeDestroy() {
|
||||
mobilePopupHistory.clear().then(() => this.disposePopup())
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user