This commit is contained in:
王创世 2025-03-21 16:02:19 +08:00
parent f5fbcae5c3
commit 824cca2457
10 changed files with 661 additions and 122 deletions

View File

@ -13,10 +13,10 @@
<t-input size="large" placeholder="请输入活动标题" v-model="addForm.activity_name" <t-input size="large" placeholder="请输入活动标题" v-model="addForm.activity_name"
:style="{ width: '480px' }"/> :style="{ width: '480px' }"/>
</t-form-item> </t-form-item>
<t-form-item label="活动简介" name="activity_desc"> <!-- <t-form-item label="活动简介" name="activity_desc">
<t-input size="large" placeholder="请输入活动简介" v-model="addForm.activity_desc" <t-input size="large" placeholder="请输入活动简介" v-model="addForm.activity_desc"
:style="{ width: '480px' }"/> :style="{ width: '480px' }"/>
</t-form-item> </t-form-item> -->
<t-form-item label="活动地址" name="activity_location"> <t-form-item label="活动地址" name="activity_location">
<t-input size="large" placeholder="请输入活动地址" v-model="addForm.activity_location" <t-input size="large" placeholder="请输入活动地址" v-model="addForm.activity_location"
:style="{ width: '480px' }"/> :style="{ width: '480px' }"/>
@ -29,12 +29,12 @@
<!-- <t-option key="4" label="学习培训" value="4"/>--> <!-- <t-option key="4" label="学习培训" value="4"/>-->
<!-- </t-select>--> <!-- </t-select>-->
<!-- </t-form-item>--> <!-- </t-form-item>-->
<t-form-item label="显示报名人" name="if_display_registrants"> <!-- <t-form-item label="显示报名人" name="if_display_registrants">
<t-select size="large" v-model="addForm.if_display_registrants" :style="{ width: '480px' }"> <t-select size="large" v-model="addForm.if_display_registrants" :style="{ width: '480px' }">
<t-option key="1" label="显示" value="1"/> <t-option key="1" label="显示" value="1"/>
<t-option key="2" label="不显示" value="2"/> <t-option key="2" label="不显示" value="2"/>
</t-select> </t-select>
</t-form-item> </t-form-item> -->
<t-form-item label="报名范围" name="range"> <t-form-item label="报名范围" name="range">
<t-select size="large" v-model="addForm.range" :style="{ width: '480px' }"> <t-select size="large" v-model="addForm.range" :style="{ width: '480px' }">
<t-option key="1" label="会员" value="1"/> <t-option key="1" label="会员" value="1"/>
@ -92,7 +92,7 @@
:sizeLimit="{ size: 50, unit: 'MB', message: '视频大小不超过50MB' }" :sizeLimit="{ size: 50, unit: 'MB', message: '视频大小不超过50MB' }"
></t-upload> ></t-upload>
</t-form-item> </t-form-item>
<t-form-item label="活动简介" name="activity_desc"> <t-form-item label="活动详情" name="activity_desc">
<div style="border: 1px solid #ccc;width: 100%;"> <div style="border: 1px solid #ccc;width: 100%;">
<!-- 工具栏 --> <!-- 工具栏 -->
<Toolbar <Toolbar
@ -180,7 +180,7 @@ export default {
activity_content: '', activity_content: '',
activity_location: '', activity_location: '',
activity_type: null, activity_type: null,
if_display_registrants: null, if_display_registrants: 2,
signup_start_time: '', signup_start_time: '',
signup_end_time: '', signup_end_time: '',
if_auditing: '1', if_auditing: '1',
@ -276,10 +276,10 @@ export default {
this.$message.error('活动标题不能为空'); this.$message.error('活动标题不能为空');
return; return;
} }
if (this.addForm.activity_desc == '') { // if (this.addForm.activity_desc == '') {
this.$message.error('活动简介不能为空'); // this.$message.error('');
return; // return;
} // }
if (this.addForm.activity_type == null) { if (this.addForm.activity_type == null) {
this.$message.error('活动类别不能为空'); this.$message.error('活动类别不能为空');
return; return;

View File

@ -7,10 +7,10 @@
<t-input size="large" placeholder="请输入活动标题" v-model="addForm.activity_name" <t-input size="large" placeholder="请输入活动标题" v-model="addForm.activity_name"
:style="{ width: '480px' }"/> :style="{ width: '480px' }"/>
</t-form-item> </t-form-item>
<t-form-item label="活动简介" name="activity_desc"> <!-- <t-form-item label="活动简介" name="activity_desc">
<t-input size="large" placeholder="请输入活动简介" v-model="addForm.activity_desc" <t-input size="large" placeholder="请输入活动简介" v-model="addForm.activity_desc"
:style="{ width: '480px' }"/> :style="{ width: '480px' }"/>
</t-form-item> </t-form-item> -->
<t-form-item label="活动地址" name="activity_location"> <t-form-item label="活动地址" name="activity_location">
<t-input size="large" placeholder="请输入活动地址" v-model="addForm.activity_location" <t-input size="large" placeholder="请输入活动地址" v-model="addForm.activity_location"
:style="{ width: '480px' }"/> :style="{ width: '480px' }"/>
@ -23,12 +23,12 @@
<!-- <t-option key="4" label="学习培训" value="4"/>--> <!-- <t-option key="4" label="学习培训" value="4"/>-->
<!-- </t-select>--> <!-- </t-select>-->
<!-- </t-form-item>--> <!-- </t-form-item>-->
<t-form-item label="显示报名人" name="if_display_registrants"> <!-- <t-form-item label="显示报名人" name="if_display_registrants">
<t-select size="large" v-model="addForm.if_display_registrants" :style="{ width: '480px' }"> <t-select size="large" v-model="addForm.if_display_registrants" :style="{ width: '480px' }">
<t-option key="1" label="显示" value="1"/> <t-option key="1" label="显示" value="1"/>
<t-option key="2" label="不显示" value="2"/> <t-option key="2" label="不显示" value="2"/>
</t-select> </t-select>
</t-form-item> </t-form-item> -->
<t-form-item label="报名范围" name="range"> <t-form-item label="报名范围" name="range">
<t-select size="large" v-model="addForm.range" :style="{ width: '480px' }"> <t-select size="large" v-model="addForm.range" :style="{ width: '480px' }">
<t-option key="1" label="会员" value="1"/> <t-option key="1" label="会员" value="1"/>
@ -87,7 +87,7 @@
:sizeLimit="{ size: 50, unit: 'MB', message: '视频大小不超过50MB' }" :sizeLimit="{ size: 50, unit: 'MB', message: '视频大小不超过50MB' }"
></t-upload> ></t-upload>
</t-form-item> </t-form-item>
<t-form-item label="活动简介" name="activity_desc"> <t-form-item label="活动详情" name="activity_desc">
<div style="border: 1px solid #ccc;width: 100%;"> <div style="border: 1px solid #ccc;width: 100%;">
<!-- 工具栏 --> <!-- 工具栏 -->
<Toolbar <Toolbar
@ -313,10 +313,10 @@ export default {
this.$message.error('活动标题不能为空'); this.$message.error('活动标题不能为空');
return; return;
} }
if (this.addForm.activity_desc == '') { // if (this.addForm.activity_desc == '') {
this.$message.error('活动简介不能为空'); // this.$message.error('');
return; // return;
} // }
if (this.addForm.activity_type == null) { if (this.addForm.activity_type == null) {
this.$message.error('活动类别不能为空'); this.$message.error('活动类别不能为空');
return; return;

View File

@ -117,6 +117,12 @@
<CloudDownloadIcon slot="icon"/> <CloudDownloadIcon slot="icon"/>
导出 导出
</t-button> </t-button>
<!-- <t-dropdown :options="options">
<t-button>
<CloudDownloadIcon slot="icon"/>
导出
</t-button>
</t-dropdown> -->
</div> </div>
<div v-if="infoIfAuditing==2"> <div v-if="infoIfAuditing==2">
<t-tabs v-model="InfotabIndex" @change="InfotabIndexChange"> <t-tabs v-model="InfotabIndex" @change="InfotabIndexChange">
@ -457,6 +463,32 @@ export default {
getType: 3, getType: 3,
infoIfAuditing: 1,// infoIfAuditing: 1,//
association: {}, association: {},
options: [
{
content: '全部名单',
value: 1,
onClick: () => {
const token = store.state.user.token;
window.open(store.state.user.apiUrl + '/api/excel_controller/applicationexport?id=' + this.infoId + "&token=" + token+"&type=4");
},
},
{
content: '已通过',
value: 2,
onClick: () => {
const token = store.state.user.token;
window.open(store.state.user.apiUrl + '/api/excel_controller/applicationexport?id=' + this.infoId + "&token=" + token+"&type=2");
},
},
{
content: '已拒绝',
value: 3,
onClick: () => {
const token = store.state.user.token;
window.open(store.state.user.apiUrl + '/api/excel_controller/applicationexport?id=' + this.infoId + "&token=" + token+"&type=3");
},
},
],
} }
}, },
beforeDestroy() { beforeDestroy() {

View File

@ -72,7 +72,10 @@
<div style="height: 2px; background-color: #999999; width: 100%; margin-top: 20px"></div> <div style="height: 2px; background-color: #999999; width: 100%; margin-top: 20px"></div>
<div style="display: flex; justify-items: center; padding: 30px 0px"> <div style="display: flex; justify-items: center; padding: 30px 0px">
<div style="width: 50%"> <div style="width: 50%">
<div>证件照</div> <div style="display: flex; align-items: center; margin-bottom: 10px">
<span style="color: red; margin-right: 5px">*</span>
<span style="color: #000;">证件照</span>
</div>
<div style="height: 1px; background-color: #999999; width: 100%; margin-top: 10px"></div> <div style="height: 1px; background-color: #999999; width: 100%; margin-top: 10px"></div>
<div class="t-upload" @click="openCai" style="margin-top: 20px"> <div class="t-upload" @click="openCai" style="margin-top: 20px">
<div <div
@ -142,7 +145,7 @@
<t-option value="九三学社社员" label="九三学社社员" key="九三学社社员"></t-option> <t-option value="九三学社社员" label="九三学社社员" key="九三学社社员"></t-option>
<t-option value="台盟盟员" label="台盟盟员" key="台盟盟员"></t-option> <t-option value="台盟盟员" label="台盟盟员" key="台盟盟员"></t-option>
<t-option value="无党派人士" label="无党派人士" key="无党派人士"></t-option> <t-option value="无党派人士" label="无党派人士" key="无党派人士"></t-option>
<t-option value="无党派人士" label="无党派人士" key="无党派人士"></t-option> <t-option value="群众" label="群众" key="群众"></t-option>
</t-select> </t-select>
</t-form-item> </t-form-item>
<t-form-item label="身份证号码" :requiredMark="true"> <t-form-item label="身份证号码" :requiredMark="true">
@ -570,7 +573,10 @@
style="width: 100%; max-height: 200px" style="width: 100%; max-height: 200px"
/> />
</div> </div>
<div style="margin: 10px 0px">请上传营业执照</div> <div style="margin: 10px 0px">
<span style="color: red; margin-right: 5px">*</span>
<span style="color: #000;">请上传营业执照</span>
</div>
<t-upload <t-upload
:action="$store.state.user.apiUrl + '/api/common/upload'" :action="$store.state.user.apiUrl + '/api/common/upload'"
v-model="formData.business_license_image_show" v-model="formData.business_license_image_show"
@ -602,7 +608,10 @@
style="width: 100%; max-height: 200px" style="width: 100%; max-height: 200px"
/> />
</div> </div>
<div style="margin: 10px 0px">请上传公司LOGO</div> <div style="margin: 10px 0px">
<span style="color: red; margin-right: 5px">*</span>
<span style="color: #000;">请上传公司LOGO</span>
</div>
<t-upload <t-upload
:action="$store.state.user.apiUrl + '/api/common/upload'" :action="$store.state.user.apiUrl + '/api/common/upload'"
v-model="formData.company_image_show" v-model="formData.company_image_show"

271
src/pages/tweets/detail.vue Normal file
View File

@ -0,0 +1,271 @@
<template>
<t-card title="青企圈详情" :bordered="false">
<template #actions>
<t-button theme="default" @click="goBack">返回列表</t-button>
</template>
<div v-if="loading" class="loading-container">
<t-loading />
</div>
<div v-else class="tweet-detail-container">
<div class="tweet-header">
<h2 class="tweet-title">{{ detail.title }}</h2>
<div class="tweet-meta">
<span class="author">发布者: {{ detail.member?.nikename || '未知' }}</span>
<span class="time">发布时间: {{ detail.createtime }}</span>
<t-tag v-if="detail.is_top > 0" theme="warning">置顶</t-tag>
<t-tag v-if="detail.status == 1" theme="warning">待审核</t-tag>
<t-tag v-if="detail.status == 2" theme="success">已通过</t-tag>
<t-tag v-if="detail.status == 3" theme="danger">已拒绝</t-tag>
</div>
</div>
<div class="tweet-content">
{{ detail.content }}
</div>
<div class="tweet-images" v-if="detail.files && detail.files.length > 0">
<h3>图片附件</h3>
<t-image-viewer v-model="visible" :images="detail.files">
<template #trigger="{ open }">
<div class="image-grid">
<div
v-for="(image, index) in detail.files"
:key="index"
class="image-item"
@click="open"
>
<img :src="image" :alt="`附件图片${index+1}`" />
</div>
</div>
</template>
</t-image-viewer>
</div>
<div class="tweet-actions" v-if="detail.status == 1">
<t-space>
<t-popconfirm content="确定要审核通过吗?" @confirm="review(1)">
<t-button theme="primary">通过</t-button>
</t-popconfirm>
<t-popconfirm theme="danger" @confirm="review(2)">
<template #content>
<p class="title">拒绝理由</p>
<p class="describe" style="margin-top: 10px">
<t-input v-model="reason" placeholder="请输入拒绝理由"/>
</p>
</template>
<t-button theme="warning">拒绝</t-button>
</t-popconfirm>
</t-space>
</div>
<div class="tweet-actions">
<t-space>
<t-button v-if="detail.is_top == 0" theme="success" @click="topNews">置顶</t-button>
<t-button v-else theme="warning" @click="topNews">取消置顶</t-button>
<t-popconfirm content="确认删除吗?" @confirm="del">
<t-button theme="danger">删除</t-button>
</t-popconfirm>
</t-space>
</div>
</div>
</t-card>
</template>
<script lang="ts">
import store from "@/store";
interface StoreState {
user: {
apiUrl: string;
};
}
export default {
name: 'TweetDetail',
data() {
return {
loading: true,
id: null,
detail: {},
visible: false,
reason: '',
};
},
mounted() {
this.id = this.$route.params.id || this.$route.query.id;
if (!this.id) {
this.$message.error('参数错误,未找到对应的青企圈信息');
this.goBack();
return;
}
this.getDetail();
},
methods: {
goBack() {
this.$router.push('/tweets/index');
},
getDetail() {
this.loading = true;
this.$request
.post('/tweets/detail', { id: this.id })
.then((res) => {
if (res.code == 1) {
let detail = res.data;
// URL
const apiUrl = (store.state as unknown as StoreState).user.apiUrl;
if (detail.files && detail.files.length > 0) {
detail.files = detail.files.map(file => apiUrl + file);
} else {
detail.files = [];
}
this.detail = detail;
} else {
this.$message.error(res.msg || '获取详情失败');
setTimeout(() => {
this.goBack();
}, 1500);
}
})
.catch((e) => {
console.error(e);
this.$message.error('获取详情失败');
})
.finally(() => {
this.loading = false;
});
},
topNews() {
this.$request
.post('/tweets/pin', { id: this.id })
.then((res) => {
if (res.code == 1) {
this.$message.success(this.detail.is_top > 0 ? '取消置顶成功' : '置顶成功');
this.getDetail();
} else {
this.$message.error(res.msg);
}
})
.catch((e) => {
console.error(e);
this.$message.error('操作失败');
});
},
review(type) {
this.$request
.post('/tweets/review', {
id: this.id,
status: type,
reason: this.reason,
member_id: this.detail.member_id
})
.then((res) => {
if (res.code == 1) {
this.$message.success(res.msg || '审核操作成功');
this.getDetail();
} else {
this.$message.error(res.msg);
}
})
.catch((e) => {
console.error(e);
this.$message.error('审核操作失败');
});
},
del() {
this.$request
.post('/tweets/destroy', { id: this.id })
.then((res) => {
if (res.code == 1) {
this.$message.success('删除成功!');
this.goBack();
} else {
this.$message.error(res.msg);
}
})
.catch((e) => {
console.error(e);
this.$message.error('删除失败');
});
},
}
}
</script>
<style scoped>
.loading-container {
display: flex;
justify-content: center;
padding: 50px 0;
}
.tweet-detail-container {
padding: 20px 0;
}
.tweet-header {
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid #eee;
}
.tweet-title {
margin: 0 0 10px 0;
font-size: 24px;
font-weight: 500;
}
.tweet-meta {
display: flex;
align-items: center;
gap: 15px;
color: #666;
font-size: 14px;
}
.tweet-content {
margin-bottom: 30px;
font-size: 16px;
line-height: 1.6;
white-space: pre-wrap;
}
.tweet-images {
margin-bottom: 30px;
}
.tweet-images h3 {
margin-bottom: 15px;
font-size: 18px;
font-weight: 500;
}
.image-grid {
display: flex;
flex-wrap: wrap;
gap: 10px;
cursor: pointer;
}
.image-item {
width: 150px;
height: 150px;
overflow: hidden;
border-radius: 4px;
border: 1px solid #eee;
}
.image-item img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s;
}
.image-item:hover img {
transform: scale(1.05);
}
.tweet-actions {
margin-top: 20px;
}
</style>

View File

@ -25,7 +25,7 @@
<!-- <a v-for="item in row.files" :href="$store.state.user.apiUrl+item" target="_blank">--> <!-- <a v-for="item in row.files" :href="$store.state.user.apiUrl+item" target="_blank">-->
<!-- <img :src="$store.state.user.apiUrl+item" style="width: 100px;margin-right: 10px"/>--> <!-- <img :src="$store.state.user.apiUrl+item" style="width: 100px;margin-right: 10px"/>-->
<!-- </a>--> <!-- </a>-->
<t-image-viewer v-model="visible[rowIndex]" :images="row.files" @close="delViewer(index)"> <t-image-viewer v-model="visible[rowIndex]" :images="row.files" @close="delViewer(rowIndex)">
<template #trigger="{ open }"> <template #trigger="{ open }">
<div @click="open" style="cursor: pointer" v-if="row.files.length>0"> <div @click="open" style="cursor: pointer" v-if="row.files.length>0">
<img alt="test" :src="row.files[0]" style="width: 200px"/> <img alt="test" :src="row.files[0]" style="width: 200px"/>
@ -40,8 +40,9 @@
</template> </template>
<template #select="{ row }"> <template #select="{ row }">
<t-space :size="0"> <t-space :size="0">
<t-button theme="primary" @click="viewDetail(row)" style="margin-right: 10px">详情</t-button>
<t-popconfirm v-if="row.status==1" content="确定要审核通过吗?" @confirm="review(row,1)"> <t-popconfirm v-if="row.status==1" content="确定要审核通过吗?" @confirm="review(row,1)">
<t-button theme="primary">通过</t-button> <t-button theme="success">通过</t-button>
</t-popconfirm> </t-popconfirm>
<t-popconfirm v-if="row.status==1" theme="danger" @confirm="review(row,2)"> <t-popconfirm v-if="row.status==1" theme="danger" @confirm="review(row,2)">
<template slot="content"> <template slot="content">
@ -67,6 +68,50 @@
></t-pagination> ></t-pagination>
</div> </div>
</div> </div>
<!-- 添加详情弹窗 -->
<t-dialog
:visible.sync="detailVisible"
header="青企圈详情"
:width="800"
:footer="false"
>
<div v-if="detailLoading" class="loading-container">
<t-loading />
</div>
<div v-else class="tweet-detail-container">
<div class="tweet-header">
<div class="tweet-meta">
<span class="author">发布者: {{ detailInfo.member?.nikename || '未知' }}</span>
<span class="time">发布时间: {{ detailInfo.createtime }}</span>
<t-tag v-if="detailInfo.is_top > 0" theme="warning">置顶</t-tag>
<t-tag v-if="detailInfo.status == 1" theme="warning">待审核</t-tag>
<t-tag v-if="detailInfo.status == 2" theme="success">已通过</t-tag>
<t-tag v-if="detailInfo.status == 3" theme="danger">已拒绝</t-tag>
</div>
</div>
<div class="tweet-content" v-html="detailInfo.content"></div>
<div class="tweet-images" v-if="detailInfo.files && detailInfo.files.length > 0">
<h3>图片附件</h3>
<t-image-viewer v-model="detailImageVisible" :images="detailInfo.files">
<template #trigger="{ open }">
<div class="image-grid">
<div
v-for="(image, index) in detailInfo.files"
:key="index"
class="image-item"
@click="open"
>
<img :src="image" :alt="`附件图片${index+1}`" />
</div>
</div>
</template>
</t-image-viewer>
</div>
</div>
</t-dialog>
</t-card> </t-card>
</template> </template>
@ -74,6 +119,14 @@
import store from "@/store"; import store from "@/store";
import {toInteger} from "lodash"; import {toInteger} from "lodash";
//
interface StoreState {
user: {
association: any;
apiUrl: string;
};
}
export default { export default {
data() { data() {
return { return {
@ -81,6 +134,13 @@ export default {
state: 2, state: 2,
list: [], list: [],
reason:'', reason:'',
association: null,
//
detailVisible: false,
detailLoading: false,
detailInfo: {},
detailImageVisible: false,
currentDetailId: null,
columns: [ columns: [
{colKey: 'title', title: '标题', align: 'center'}, {colKey: 'title', title: '标题', align: 'center'},
{colKey: 'content', title: '内容', align: 'center'}, {colKey: 'content', title: '内容', align: 'center'},
@ -109,13 +169,14 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
delViewer(d){ delViewer(rowIndex){
console.log(d); console.log(rowIndex);
}, },
tabIndexChange(index){ viewDetail(row) {
this.state=index; //
this.pagination.page=1; this.currentDetailId = row.id;
this.getList(); this.detailVisible = true;
this.detailInfo = row;
}, },
topNews(row){ topNews(row){
console.log(row); console.log(row);
@ -180,7 +241,7 @@ export default {
console.log(res); console.log(res);
if (res.code == 1) { if (res.code == 1) {
var list = res.data.paginator.data; var list = res.data.paginator.data;
const apiUrl = store.state.user.apiUrl; // API URL const apiUrl = (store.state as unknown as StoreState).user.apiUrl;
const transformedSelectList = list.map(item => ({ const transformedSelectList = list.map(item => ({
...item, // ...item, //
files: item.files.length > 0 ? item.files.map(file => apiUrl + file) : [] files: item.files.length > 0 ? item.files.map(file => apiUrl + file) : []
@ -196,6 +257,136 @@ export default {
console.log(e); console.log(e);
}); });
}, },
topNewsDetail() {
this.$request
.post('/tweets/pin', { id: this.currentDetailId })
.then((res) => {
if (res.code == 1) {
this.$message.success(this.detailInfo.is_top > 0 ? '取消置顶成功' : '置顶成功');
this.getDetailInfo(); //
this.getList(); //
} else {
this.$message.error(res.msg);
}
})
.catch((e) => {
console.error(e);
this.$message.error('操作失败');
});
},
reviewDetail(type) {
this.$request
.post('/tweets/review', {
id: this.currentDetailId,
status: type,
reason: this.reason,
member_id: this.detailInfo.member_id
})
.then((res) => {
if (res.code == 1) {
this.$message.success(res.msg || '审核操作成功');
this.detailVisible = false; //
this.getList(); //
} else {
this.$message.error(res.msg);
}
})
.catch((e) => {
console.error(e);
this.$message.error('审核操作失败');
});
},
delDetail() {
this.$request
.post('/tweets/destroy', { id: this.currentDetailId })
.then((res) => {
if (res.code == 1) {
this.$message.success('删除成功!');
this.detailVisible = false; //
this.getList(); //
} else {
this.$message.error(res.msg);
}
})
.catch((e) => {
console.error(e);
this.$message.error('删除失败');
});
},
} }
} }
</script> </script>
<style scoped>
/* 详情弹窗样式 */
.loading-container {
display: flex;
justify-content: center;
padding: 50px 0;
}
.tweet-detail-container {
padding: 0;
}
.tweet-header {
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid #eee;
}
.tweet-meta {
display: flex;
align-items: center;
gap: 15px;
color: #666;
font-size: 14px;
flex-wrap: wrap;
}
.tweet-content {
margin-bottom: 30px;
font-size: 16px;
line-height: 1.6;
white-space: pre-wrap;
}
.tweet-images {
margin-bottom: 30px;
}
.tweet-images h3 {
margin-bottom: 15px;
font-size: 18px;
font-weight: 500;
}
.image-grid {
display: flex;
flex-wrap: wrap;
gap: 10px;
cursor: pointer;
}
.image-item {
width: 120px;
overflow: hidden;
border-radius: 4px;
border: 1px solid #eee;
}
.image-item img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s;
}
.image-item:hover img {
transform: scale(1.05);
}
.tweet-actions {
margin-top: 20px;
}
</style>

View File

@ -153,7 +153,7 @@
<t-option value="九三学社社员" label="九三学社社员" key="九三学社社员"></t-option> <t-option value="九三学社社员" label="九三学社社员" key="九三学社社员"></t-option>
<t-option value="台盟盟员" label="台盟盟员" key="台盟盟员"></t-option> <t-option value="台盟盟员" label="台盟盟员" key="台盟盟员"></t-option>
<t-option value="无党派人士" label="无党派人士" key="无党派人士"></t-option> <t-option value="无党派人士" label="无党派人士" key="无党派人士"></t-option>
<t-option value="无党派人士" label="无党派人士" key="无党派人士"></t-option> <t-option value="群众" label="群众" key="群众"></t-option>
</t-select> </t-select>
</t-form-item> </t-form-item>
<t-form-item label="身份证号码"> <t-form-item label="身份证号码">

View File

@ -162,7 +162,7 @@
<t-option value="九三学社社员" label="九三学社社员" key="九三学社社员"></t-option> <t-option value="九三学社社员" label="九三学社社员" key="九三学社社员"></t-option>
<t-option value="台盟盟员" label="台盟盟员" key="台盟盟员"></t-option> <t-option value="台盟盟员" label="台盟盟员" key="台盟盟员"></t-option>
<t-option value="无党派人士" label="无党派人士" key="无党派人士"></t-option> <t-option value="无党派人士" label="无党派人士" key="无党派人士"></t-option>
<t-option value="无党派人士" label="无党派人士" key="无党派人士"></t-option> <t-option value="群众" label="群众" key="群众"></t-option>
</t-select> </t-select>
</t-form-item> </t-form-item>
<t-form-item label="身份证号码"> <t-form-item label="身份证号码">

View File

@ -1,14 +1,19 @@
<template> <template>
<div class="detail-base"> <div class="detail-base">
<t-card title="会员详情" :bordered="false" class="info-block" style="padding: 30px"> <t-card title="会员详情" :bordered="false" class="info-block" style="padding: 30px">
<t-steps :current="0" readonly v-if="info.if_xianshi!=1"> <template #actions>
<t-step-item title="信息审核" content="提交的信息审核"></t-step-item> <t-button theme="primary" @click="openPDF" size="large" style="margin-left: 20px">查看PDF文件</t-button>
<t-step-item v-if="info.if_xianshi!=2" title="会费缴纳" content="等待会费缴纳"></t-step-item> </template>
<t-step-item v-if="info.if_xianshi==2" status="error" title="已被拒绝"
:content="info.result.content"></t-step-item>
<t-step-item title="成功入会" content="已成功入会"></t-step-item>
</t-steps>
<div> <div>
<t-steps :current="0" readonly v-if="info.if_xianshi != 1">
<t-step-item title="信息审核" content="提交的信息审核"></t-step-item>
<t-step-item v-if="info.if_xianshi != 2" title="会费缴纳" content="等待会费缴纳"></t-step-item>
<t-step-item v-if="info.if_xianshi == 2" status="error" title="已被拒绝"
:content="info.result.content"></t-step-item>
<t-step-item title="成功入会" content="已成功入会"></t-step-item>
</t-steps>
</div>
<div style="margin-top: 20px;">
<div> <div>
<div style="color: #2E2E2E;font-size: 28px;font-weight: bold">1.入会资料</div> <div style="color: #2E2E2E;font-size: 28px;font-weight: bold">1.入会资料</div>
<div style="height: 2px;background-color: #999999;width: 100%;margin-top: 20px"></div> <div style="height: 2px;background-color: #999999;width: 100%;margin-top: 20px"></div>
@ -17,19 +22,19 @@
<tr> <tr>
<td>推荐方式</td> <td>推荐方式</td>
<td> <td>
<span v-if="info.reporting_method==1">组织推荐</span> <span v-if="info.reporting_method == 1">组织推荐</span>
<span v-if="info.reporting_method==2">会员推荐</span> <span v-if="info.reporting_method == 2">会员推荐</span>
<span v-if="info.reporting_method==3">个人自荐</span> <span v-if="info.reporting_method == 3">个人自荐</span>
</td> </td>
<template v-if="info.reporting_method==1"> <template v-if="info.reporting_method == 1">
<td>推荐地市</td> <td>推荐地市</td>
<td>{{ info.recommended_cities }}</td> <td>{{ info.recommended_cities }}</td>
</template> </template>
<template v-if="info.reporting_method==3"> <template v-if="info.reporting_method == 3">
<td>来源渠道</td> <td>来源渠道</td>
<td>{{ info.source_channel }}</td> <td>{{ info.source_channel }}</td>
</template> </template>
<template v-if="info.reporting_method==2"> <template v-if="info.reporting_method == 2">
<td>推荐人姓名</td> <td>推荐人姓名</td>
<td>{{ info.recommendation_name }}</td> <td>{{ info.recommendation_name }}</td>
<td>推荐人单位及职务</td> <td>推荐人单位及职务</td>
@ -48,12 +53,13 @@
<table class="my_table"> <table class="my_table">
<tr> <tr>
<td rowspan="5"> <td rowspan="5">
<t-image-viewer :images="[$store.state.user.apiUrl+info.photo_image]" mode="modeless" <t-image-viewer :images="[$store.state.user.apiUrl + info.photo_image]" mode="modeless"
:closeOnEscKeydown="false"> :closeOnEscKeydown="false">
<template #trigger="{ open }"> <template #trigger="{ open }">
<div style="cursor: pointer" @click="open"> <div style="cursor: pointer" @click="open">
<img v-if="info.photo_image!=''&&info.photo_image!=null" :src="$store.state.user.apiUrl+info.photo_image" style="width: 200px;height: 200px;"> <img v-if="info.photo_image != '' && info.photo_image != null"
<span v-if="info.photo_image==''||info.photo_image==null">未上传</span> :src="$store.state.user.apiUrl + info.photo_image" style="width: 150px;">
<span v-if="info.photo_image == '' || info.photo_image == null">未上传</span>
</div> </div>
</template> </template>
</t-image-viewer> </t-image-viewer>
@ -61,9 +67,9 @@
<td>姓名</td> <td>姓名</td>
<td>{{ info.nikename }}</td> <td>{{ info.nikename }}</td>
<td>性别</td> <td>性别</td>
<td>{{ info.gender == 0 ? '女' : '男' }}</td> <td>{{ info.gender === 0 ? '女' : info.gender === 1 ? '男' : '未填写' }}</td>
<td>协会职务</td> <td>协会职务</td>
<td>{{ info.position_name}}</td> <td>{{ info.position_name }}</td>
<td>出生年月日</td> <td>出生年月日</td>
<td>{{ info.birth_time }}</td> <td>{{ info.birth_time }}</td>
<td>民族</td> <td>民族</td>
@ -109,24 +115,26 @@
<tr align="center"> <tr align="center">
<td>身份证正面照</td> <td>身份证正面照</td>
<td colspan="4" style="padding-top: 30px"> <td colspan="4" style="padding-top: 30px">
<t-image-viewer :images="[$store.state.user.apiUrl+info.cardz_image]" mode="modeless" <t-image-viewer :images="[$store.state.user.apiUrl + info.cardz_image]" mode="modeless"
:closeOnEscKeydown="false"> :closeOnEscKeydown="false">
<template #trigger="{ open }"> <template #trigger="{ open }">
<div style="cursor: pointer" @click="open"> <div style="cursor: pointer" @click="open">
<img v-if="info.cardz_image!=''&&info.cardz_image!=null" :src="$store.state.user.apiUrl+info.cardz_image" style="height: 150px;"> <img v-if="info.cardz_image != '' && info.cardz_image != null"
<span v-if="info.cardz_image==''||info.cardz_image==null">未上传</span> :src="$store.state.user.apiUrl + info.cardz_image" style="height: 150px;">
<span v-if="info.cardz_image == '' || info.cardz_image == null">未上传</span>
</div> </div>
</template> </template>
</t-image-viewer> </t-image-viewer>
</td> </td>
<td>身份证背面照</td> <td>身份证背面照</td>
<td colspan="4" style="padding-top: 30px"> <td colspan="4" style="padding-top: 30px">
<t-image-viewer :images="[$store.state.user.apiUrl+info.cardf_image]" mode="modeless" <t-image-viewer :images="[$store.state.user.apiUrl + info.cardf_image]" mode="modeless"
:closeOnEscKeydown="false"> :closeOnEscKeydown="false">
<template #trigger="{ open }"> <template #trigger="{ open }">
<div style="cursor: pointer" @click="open"> <div style="cursor: pointer" @click="open">
<img v-if="info.cardf_image!=''&&info.cardf_image!=null" :src="$store.state.user.apiUrl+info.cardf_image" style="height: 150px;"> <img v-if="info.cardf_image != '' && info.cardf_image != null"
<span v-if="info.cardf_image==''||info.cardf_image==null">未上传</span> :src="$store.state.user.apiUrl + info.cardf_image" style="height: 150px;">
<span v-if="info.cardf_image == '' || info.cardf_image == null">未上传</span>
</div> </div>
</template> </template>
</t-image-viewer> </t-image-viewer>
@ -140,7 +148,7 @@
<div style="font-size: 18px;font-weight: 600">主要成就以及获奖情况</div> <div style="font-size: 18px;font-weight: 600">主要成就以及获奖情况</div>
</td> </td>
</tr> </tr>
<tr > <tr>
<td colspan="6"> <td colspan="6">
<div style="text-align: left" v-html="info.introduction"></div> <div style="text-align: left" v-html="info.introduction"></div>
</td> </td>
@ -160,18 +168,18 @@
<td colspan="6"> <td colspan="6">
<table style="width: 100%; text-align: center; border-collapse: collapse;"> <table style="width: 100%; text-align: center; border-collapse: collapse;">
<thead> <thead>
<tr> <tr>
<th>起止日期</th> <th>起止日期</th>
<th>地区单位</th> <th>地区单位</th>
<th>担任职务</th> <th>担任职务</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr v-for="(item, index) in info.work_experience"> <tr v-for="(item, index) in info.work_experience">
<td>{{ item.time }}</td> <td>{{ item.time }}</td>
<td>{{ item.address }}</td> <td>{{ item.address }}</td>
<td>{{ item.book }}</td> <td>{{ item.book }}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</td> </td>
@ -188,18 +196,18 @@
<td colspan="6"> <td colspan="6">
<table style="width: 100%; text-align: center; border-collapse: collapse;"> <table style="width: 100%; text-align: center; border-collapse: collapse;">
<thead> <thead>
<tr> <tr>
<th>姓名</th> <th>姓名</th>
<th>职务</th> <th>职务</th>
<th>电话</th> <th>电话</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr v-for="(item, index) in info.other_contacts"> <tr v-for="(item, index) in info.other_contacts">
<td>{{ item.name }}</td> <td>{{ item.name }}</td>
<td>{{ item.post }}</td> <td>{{ item.post }}</td>
<td>{{ item.phone }}</td> <td>{{ item.phone }}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</td> </td>
@ -221,7 +229,8 @@
<td colspan="1">{{ info.enterprise_location }}</td> <td colspan="1">{{ info.enterprise_location }}</td>
<td>企业地址</td> <td>企业地址</td>
<td colspan="1"> <td colspan="1">
<a href="https://lbs.qq.com/tool/getpoint/get-point.html" target="_blank">{{ info.longitude }},{{ info.dimension }}</a> <a href="https://lbs.qq.com/tool/getpoint/get-point.html" target="_blank">{{ info.longitude }},{{
info.dimension }}</a>
</td> </td>
<td>注册资金万元</td> <td>注册资金万元</td>
<td>{{ info.registered_capital }}</td> <td>{{ info.registered_capital }}</td>
@ -253,12 +262,13 @@
营业执照 营业执照
</td> </td>
<td colspan="5"> <td colspan="5">
<t-image-viewer :images="[$store.state.user.apiUrl+info.business_license_image]" mode="modeless" <t-image-viewer :images="[$store.state.user.apiUrl + info.business_license_image]" mode="modeless"
:closeOnEscKeydown="false"> :closeOnEscKeydown="false">
<template #trigger="{ open }"> <template #trigger="{ open }">
<div style="cursor: pointer" @click="open"> <div style="cursor: pointer" @click="open">
<img v-if="info.business_license_image!=''&&info.business_license_image!=null" :src="$store.state.user.apiUrl + info.business_license_image" style="height: 150px; "> <img v-if="info.business_license_image != '' && info.business_license_image != null"
<span v-if="info.business_license_image==''||info.business_license_image==null">未上传</span> :src="$store.state.user.apiUrl + info.business_license_image" style="height: 150px; ">
<span v-if="info.business_license_image == '' || info.business_license_image == null">未上传</span>
</div> </div>
</template> </template>
</t-image-viewer> </t-image-viewer>
@ -267,12 +277,13 @@
公司LOGO 公司LOGO
</td> </td>
<td colspan="4"> <td colspan="4">
<t-image-viewer :images="[$store.state.user.apiUrl+info.company_image]" mode="modeless" <t-image-viewer :images="[$store.state.user.apiUrl + info.company_image]" mode="modeless"
:closeOnEscKeydown="false"> :closeOnEscKeydown="false">
<template #trigger="{ open }"> <template #trigger="{ open }">
<div style="cursor: pointer" @click="open"> <div style="cursor: pointer" @click="open">
<img v-if="info.company_image!=''&&info.company_image!=null" :src="$store.state.user.apiUrl + info.company_image" style="height: 150px; "> <img v-if="info.company_image != '' && info.company_image != null"
<span v-if="info.company_image==''||info.company_image==null">未上传</span> :src="$store.state.user.apiUrl + info.company_image" style="height: 150px; ">
<span v-if="info.company_image == '' || info.company_image == null">未上传</span>
</div> </div>
</template> </template>
</t-image-viewer> </t-image-viewer>
@ -331,14 +342,14 @@
<tr> <tr>
<td>是否建立团组织</td> <td>是否建立团组织</td>
<td>{{ info.if_organization == 0 ? '是' : '否' }}</td> <td>{{ info.if_organization == 0 ? '是' : '否' }}</td>
<template v-if="info.if_organization==0"> <template v-if="info.if_organization == 0">
<td>团组织性质</td> <td>团组织性质</td>
<td>{{ info.nature }}</td> <td>{{ info.nature }}</td>
<td>建团时间</td> <td>建团时间</td>
<td>{{ info.jiantuan_time }}</td> <td>{{ info.jiantuan_time }}</td>
</template> </template>
</tr> </tr>
<template v-if="info.if_organization==0"> <template v-if="info.if_organization == 0">
<tr> <tr>
<td>建团人数</td> <td>建团人数</td>
<td>{{ info.jiantuan_number }}</td> <td>{{ info.jiantuan_number }}</td>
@ -350,12 +361,13 @@
<tr align="center"> <tr align="center">
<td rowspan="2">批复文件</td> <td rowspan="2">批复文件</td>
<td rowspan="2" style="padding-top: 30px"> <td rowspan="2" style="padding-top: 30px">
<t-image-viewer :images="[$store.state.user.apiUrl+info.documents_file]" mode="modeless" <t-image-viewer :images="[$store.state.user.apiUrl + info.documents_file]" mode="modeless"
:closeOnEscKeydown="false"> :closeOnEscKeydown="false">
<template #trigger="{ open }"> <template #trigger="{ open }">
<div style="cursor: pointer" @click="open"> <div style="cursor: pointer" @click="open">
<img v-if="info.documents_file!=''&&info.documents_file!=null" :src="$store.state.user.apiUrl + info.documents_file" style="height: 150px; "> <img v-if="info.documents_file != '' && info.documents_file != null"
<span v-if="info.documents_file==''||info.documents_file==null">未上传</span> :src="$store.state.user.apiUrl + info.documents_file" style="height: 150px; ">
<span v-if="info.documents_file == '' || info.documents_file == null">未上传</span>
</div> </div>
</template> </template>
</t-image-viewer> </t-image-viewer>
@ -368,22 +380,22 @@
<td colspan="5"> <td colspan="5">
<table style="width: 100%; text-align: center; border-collapse: collapse;"> <table style="width: 100%; text-align: center; border-collapse: collapse;">
<thead> <thead>
<tr> <tr>
<th>姓名</th> <th>姓名</th>
<th>性别</th> <th>性别</th>
<th>单位职务</th> <th>单位职务</th>
<th>团委职务</th> <th>团委职务</th>
<th>手机号</th> <th>手机号</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr v-for="(item, index) in info.tuanweifuzerenxinxi"> <tr v-for="(item, index) in info.tuanweifuzerenxinxi">
<td>{{ item.name }}</td> <td>{{ item.name }}</td>
<td>{{ item.sex }}</td> <td>{{ item.sex }}</td>
<td>{{ item.job }}</td> <td>{{ item.job }}</td>
<td>{{ item.tun_job }}</td> <td>{{ item.tun_job }}</td>
<td>{{ item.phone }}</td> <td>{{ item.phone }}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</td> </td>
@ -393,12 +405,12 @@
</div> </div>
</div> </div>
</div> </div>
<div v-if="info.if_xianshi==0" style="text-align: center;margin-top: 50px"> <div v-if="info.if_xianshi == 0" style="text-align: center;margin-top: 50px">
<t-popconfirm theme="danger" @confirm="tgSelect(2)"> <t-popconfirm theme="danger" @confirm="tgSelect(2)">
<template slot="content"> <template slot="content">
<p class="title">拒绝理由</p> <p class="title">拒绝理由</p>
<p class="describe" style="margin-top: 10px"> <p class="describe" style="margin-top: 10px">
<t-input v-model="reason" placeholder="请输入拒绝理由"/> <t-input v-model="reason" placeholder="请输入拒绝理由" />
</p> </p>
</template> </template>
<t-button theme="danger" size="large" style="margin: 0px 10px">审核拒绝</t-button> <t-button theme="danger" size="large" style="margin: 0px 10px">审核拒绝</t-button>
@ -407,11 +419,12 @@
<t-button theme="primary" size="large" style="margin-left: 20px">通过审核</t-button> <t-button theme="primary" size="large" style="margin-left: 20px">通过审核</t-button>
</t-popconfirm> </t-popconfirm>
</div> </div>
<div v-if="info.if_xianshi==3" style="text-align: center;margin-top: 50px"> <div v-if="info.if_xianshi == 3" style="text-align: center;margin-top: 50px">
<t-popconfirm content="确认已缴纳会费吗?" @confirm="tgSelect(1)"> <t-popconfirm content="确认已缴纳会费吗?" @confirm="tgSelect(1)">
<t-button theme="primary" size="large" style="margin-left: 20px">会费已缴纳</t-button> <t-button theme="primary" size="large" style="margin-left: 20px">会费已缴纳</t-button>
</t-popconfirm> </t-popconfirm>
</div> </div>
</t-card> </t-card>
</div> </div>
</template> </template>
@ -437,15 +450,36 @@ export default {
this.getInfo(); this.getInfo();
}, },
methods: { methods: {
openPDF() {
const link = document.createElement('a');
if (this.info.openid == '' || this.info.openid == null) {
//const token = this.$store.state.user.token;
//link.href = `https://hnyea.0rui.cn/api/member/getMemberPdf?member_id=${this.info.member_id}&token=${token}`;
this.$message.error('当前用户暂无法生成PDF');
return;
} else {
if (this.info.pdf_url == '' || this.info.pdf_url == null) {
link.href = `https://hnyea.0rui.cn/api/move/pdf_member/exportPdf?openid=${this.info.openid}`;
} else {
link.href = `https://hnyea.0rui.cn${this.info.pdf_url}`;
}
}
link.target = '_blank'; //
link.rel = 'noopener noreferrer'; //
link.style.display = 'none';
document.body.appendChild(link);
link.click();
document.body.removeChild(link); // DOM
},
getInfo() { getInfo() {
this.$request this.$request
.post("/member/find", {member_id: this.member_id}) .post("/member/find", { member_id: this.member_id })
.then((res) => { .then((res) => {
var key = res.data; var key = res.data;
console.log(key); console.log(key);
key.work_experience =key.work_experience!=''?JSON.parse(key.work_experience):''; key.work_experience = key.work_experience != '' ? JSON.parse(key.work_experience) : '';
key.other_contacts = key.other_contacts!=''?JSON.parse(key.other_contacts):''; key.other_contacts = key.other_contacts != '' ? JSON.parse(key.other_contacts) : '';
key.tuanweifuzerenxinxi = key.tuanweifuzerenxinxi!=''?JSON.parse(key.tuanweifuzerenxinxi):''; key.tuanweifuzerenxinxi = key.tuanweifuzerenxinxi != '' ? JSON.parse(key.tuanweifuzerenxinxi) : '';
this.info = key; this.info = key;
}) })
.catch((e) => { .catch((e) => {
@ -482,12 +516,14 @@ export default {
} }
.my_table { .my_table {
border-collapse: collapse; /* 合并边框 */ border-collapse: collapse;
/* 合并边框 */
width: 100%; width: 100%;
} }
.my_table td { .my_table td {
border: 1px solid black; /* 设置单元格边框 */ border: 1px solid black;
/* 设置单元格边框 */
text-align: center; text-align: center;
min-width: 100px; min-width: 100px;
padding: 13px; padding: 13px;

View File

@ -1,8 +1,8 @@
import axios from 'axios'; import axios from 'axios';
import store from '../store'; import store from '../store';
//const API_HOST = env === 'mock' ? '/' : proxy[env].API; // 如果是mock模式 就不配置host 会走本地Mock拦截 //const API_HOST = env === 'mock' ? '/' : proxy[env].API; // 如果是mock模式 就不配置host 会走本地Mock拦截
//const API_HOST = 'https://hnyea.0rui.cn/api/'; const API_HOST = 'https://hnyea.0rui.cn/api/';
const API_HOST = '/api/'; //const API_HOST = '/api/';
const CODE = { const CODE = {
LOGIN_TIMEOUT: 1000000, LOGIN_TIMEOUT: 1000000,
REQUEST_SUCCESS: 0, REQUEST_SUCCESS: 0,