talk_appAmin/pages/activity/info.vue

411 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template class="content">
<view class="fixed-header">
<!-- 顶部导航栏 -->
<up-navbar leftText="" title="" :placeholder="true" :safeAreaInsetTop="true" @leftClick="leftClick">
<template #center>
<div class="navbarcenter"><span>活动详情</span></div>
</template>
</up-navbar>
</view>
<view style="height: 100vh; overflow: auto;">
<view class="avtivityInfo">
<view>
<view class="cards">
<view class="title"> {{ actiInfoList.acTitle }}</view>
<view class="time">活动时间{{ actiInfoList.startTime }} - {{ actiInfoList.endTime }}</view>
<view class="addrs">活动地点{{ actiInfoList.addres }}</view>
</view>
<view class="cardz">
<up-text size="15" color="#000000" lineHeight="23" :text="actiInfoList.acContent"></up-text>
</view>
<view class="cardx" v-for="(item, index) in toimage(actiInfoList.file)" :key="index">
<image :src="item" class="image"></image>
</view>
</view>
</view>
<view class="dictAuto">
<view v-if="actiInfoList.state === '0'">
<view class="state3"
v-if="activityAttendInfo.attendState === '0' || activityAttendInfo.attendState === '1'">
<view class="btn btnText">
未参加
</view>
</view>
<view class="state3" v-else-if="activityAttendInfo.attendState === '2'">
<view class="btn btnText">
已参加
</view>
</view>
</view>
<view v-else-if="actiInfoList.state === '2'">
<view class="state1" v-if="activityAttendInfo.attendState === '0'">
<view class="btn btnText" @click="goSing(1)">
立即报名
</view>
</view>
<view class="state2" v-else-if="activityAttendInfo.attendState === '1'">
<view class="btn btnText" @click="goQrcode(1)">
扫码签到
</view>
</view>
<view class="state2" v-else-if="activityAttendInfo.attendState === '2'">
<view class="btn btnText">
已签到
</view>
</view>
</view>
<view v-else-if="actiInfoList.state === '1'">
<view class="state1" v-if="activityAttendInfo.attendState === '0'">
<view class="btn btnText" @click="goSing(1)">
立即报名
</view>
</view>
<view class="state1" v-else-if="activityAttendInfo.attendState === '1'">
<view class="btn btnText" @click="goSing(0)">
取消报名
</view>
</view>
</view>
</view>
</view>
<view class="infox">
<view class="infoavatar">
<up-avatar size="60rpx" :src="QNDomain + actiInfoList.avatarInfo" />
<view style="margin-left: 24rpx;">
<view class="launchName">{{ actiInfoList.nickName }}</view>
<view class="launchAddres">{{ actiInfoList.infoSchool }}</view>
</view>
</view>
<view class="elroll">已报名:{{ actiInfoList.elroll }}人</view>
</view>
<view class="infox2">
<up-modal :show="open" :title="title" width="600rpx" :content='content' confirmText="签到" cancelText="取消"
confirmColor="#3477FC" showCancelButton closeOnClickOverlay @confirm="confirm" @cancel="cancel"></up-modal>
</view>
</template>
<script setup>
import { getTakePartsInfoByacId, gotoQrcode, gotoSing1, gotoSing2 } from "@/api/activityInfo/activityTakeInfo";
import { listInfo, getInfo, delInfo, addInfo, updateInfo } from "@/api/activityInfo/info";
import { getDicts } from "@/api/system/dict/data";
import { onShow, onLoad } from '@dcloudio/uni-app';
import { ref, reactive, getCurrentInstance, toRefs, computed } from 'vue';
import { useStore } from 'vuex';
const { proxy } = getCurrentInstance();
const iconConfig = proxy.iconConfig;
const style = ref({
p: 'font-weight: 400;font-size: 24rpx;color: #000000 !important;',
});
const activityState = ref([]); // 字典 activity_state 活动状态
const takePartState = ref([]); // 字典 take_part_state 活动参与状态
const open = ref(false);
const title = ref('确认签到');
const content = ref('请您确认活动签到,祝您玩的愉快!');
const bgColor = ref('');
const store = useStore();
const QNDomain = store.state.user.QNDomain;
const actiInfoList = ref({});
const activityAttendInfo = ref({});
const qrcodeInfo = ref();
function getAvatar() {
return QNDomain + actiInfoList.value.avatarInfo;
}
function isHTML(str) {
const htmlRegex = /<[^>]*>/;
return htmlRegex.test(str);
}
const textopen = ref(false)
onLoad((options) => {
const _id = options.id;
getInfo(_id).then(response => {
actiInfoList.value = response.data;
textopen.value = isHTML(actiInfoList.value.acContent);
console.log("actiInfoList:", actiInfoList.value);
});
getDicts('activity_state').then(e => {
activityState.value = e.data;
});
getDicts('take_part_state').then(e => {
takePartState.value = e.data;
});
checkStatus(options.id);
});
const checkStatus = (id) => {
getTakePartsInfoByacId(id).then(e => {
activityAttendInfo.value = e.data;
console.log("个人信息:", activityAttendInfo.value)
});
};
const leftClick = () => {
proxy.$tab.navigateBack(1);
};
const toimage = (url) => {
if (typeof url === 'string') {
let info = url.split(",");
let processedInfo = info.map(item => QNDomain + item);
console.log("processedInfo", processedInfo);
return processedInfo;
}
return null;
};
function cancel() {
open.value = !open.value;
}
const getDictLabelByValue = (state) => {
const dict = activityState.value.find((dict) => dict.dictValue === state);
return dict ? dict : '未知状态';
};
const goSing = (e) => {
if (e === 0) {
//取消报名
gotoSing2(activityAttendInfo.value.id).then(e => {
proxy.$modal.msgSuccess("取消报名成功!");
actiInfoList.value.elroll -= 1
})
}
if (e === 1) {
//报名
gotoSing1(activityAttendInfo.value.id).then(e => {
proxy.$modal.msgSuccess("报名成功!");
actiInfoList.value.elroll += 1
})
}
//简单刷新一下数据
checkStatus(actiInfoList.value.id);
}
const goQrcode = (e) => {
console.log("saoma");
uni.scanCode({
onlyFromCamera: true,
success: (res) => {
console.log('扫描二维码成功,结果:', res.result);
toqrcode(res);
},
error: (res) => {
console.log('扫描二维码出现错误');
}
});
}
function confirm() {
open.value = !open.value;
activityAttendInfo.value.qrcodeInfo = JSON.stringify(qrcodeInfo.value)
gotoQrcode(activityAttendInfo.value).then(e => {
proxy.$modal.msgSuccess("签到成功!");
//简单刷新一下数据
checkStatus(actiInfoList.value.id);
})
}
const toqrcode = (e) => {
qrcodeInfo.value = JSON.parse(e.result);
console.log("数据结果:",qrcodeInfo.value);
if (actiInfoList.value.id !== qrcodeInfo.value.id) {
proxy.$modal.msgError('二维码不匹配!')
return;
} else {
open.value = !open.value;
console.log("信息:", qrcodeInfo.value);
}
};
</script>
<style lang="scss">
page {
background-color: #ffffff;
}
.navbarcenter {
font-weight: 400;
width: 148rpx;
height: 37rpx;
font-size: 36rpx;
text-align: left;
color: #000000;
}
.avtivityInfo {
width: 686rpx;
margin: 44rpx auto;
.cards {
.title {
font-weight: 600 !important;
font-size: 32rpx;
text-align: left;
color: #000000 !important;
}
.time {
margin-top: 28rpx;
font-weight: 400;
font-size: 24rpx;
text-align: left;
color: #999999 !important;
}
.addrs {
margin-top: 12rpx;
font-weight: 400;
font-size: 24rpx;
text-align: left;
color: #999999 !important;
}
}
.cardz {
margin-top: 48rpx;
font-weight: 400;
width: 674rpx;
font-size: 24rpx;
text-align: left;
color: #000000 !important;
}
.cardx {
margin-top: 48rpx;
.image {
width: 686rpx;
border-radius: 24rpx;
height: 720rpx;
}
}
}
.dictAuto {
margin: 4rpx auto;
margin-bottom: 400rpx;
.btn {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.state1 {
width: 686rpx;
height: 80rpx;
margin: 0 auto;
border-radius: 40rpx;
background-color: #C0F0EC;
.btnText {
font-weight: bold;
font-size: 30rpx;
color: #00CCBE !important;
}
}
.state2 {
width: 686rpx;
height: 80rpx;
margin: 0 auto;
border-radius: 40rpx;
background-color: #FDE2E2;
.btnText {
font-weight: bold;
font-size: 30rpx;
color: #FFABAB !important;
}
}
.state3 {
width: 686rpx;
height: 80rpx;
margin: 0 auto;
border-radius: 40rpx;
background-color: #F1F1F1;
.btnText {
font-weight: bold;
font-size: 30rpx;
color: #7E7E7E !important;
}
}
}
.infox {
display: flex;
justify-content: space-between;
align-items: center;
height: 88rpx;
padding-left: 32rpx;
padding-right: 32rpx;
position: fixed;
/* */
left: 0;
/* */
right: 0;
/* */
bottom: 68rpx;
/* */
border-top: 1px solid #ccc;
/* */
background-color: white;
/* */
z-index: 10;
.infoavatar {
display: flex;
height: 60rpx;
.launchName {
font-size: 26rpx;
color: #000000 !important;
}
.launchAddres {
font-size: 24rpx;
color: #999999 !important;
}
}
.elroll {
font-size: 24rpx;
color: #999999 !important;
}
}
.infox2 {
position: fixed;
/* */
left: 0;
/* */
right: 0;
/* */
bottom: 0;
/* */
height: 68rpx;
width: 100%;
background-color: #f6f6f6;
z-index: 10002;
/* */
}
.acContentstyle {
color: #000000 !important;
font-weight: 400;
font-size: 24rpx;
text-align: left;
line-height: 46rpx;
}
</style>