<template>
|
|
<el-dialog
|
|
:model-value="visible"
|
|
@update:model-value="$emit('update:visible', $event)"
|
|
:title="isEdit ? '编辑作家信息' : '申请成为创作者'"
|
|
width="500px"
|
|
:show-close="true"
|
|
:close-on-click-modal="false"
|
|
center
|
|
class="author-application-modal"
|
|
>
|
|
<div class="application-form">
|
|
<div class="form-item">
|
|
<div class="required-label">笔名</div>
|
|
<el-input v-model="penName" placeholder="请输入..." />
|
|
</div>
|
|
|
|
<div class="form-item">
|
|
<div class="required-label">简介</div>
|
|
<el-input
|
|
v-model="introduction"
|
|
type="textarea"
|
|
:rows="4"
|
|
placeholder="请输入..."
|
|
/>
|
|
</div>
|
|
|
|
<el-button
|
|
type="primary"
|
|
class="submit-button"
|
|
:loading="loading"
|
|
:disabled="!isValid"
|
|
@click="handleSubmit"
|
|
>
|
|
{{ isEdit ? '保存修改' : '成为创作者' }}
|
|
</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script>
|
|
import { ref, computed, watch } from 'vue';
|
|
import { ElMessage } from 'element-plus';
|
|
import { useMainStore } from '@/store';
|
|
import { writerApi } from '@/api/user';
|
|
|
|
export default {
|
|
name: 'AuthorApplicationModal',
|
|
props: {
|
|
visible: {
|
|
type: Boolean,
|
|
required: true
|
|
}
|
|
},
|
|
emits: ['update:visible', 'application-success'],
|
|
setup(props, { emit }) {
|
|
const store = useMainStore();
|
|
|
|
// 表单数据
|
|
const penName = ref('');
|
|
const introduction = ref('');
|
|
const loading = ref(false);
|
|
const writerId = ref(null); // 作家ID,用于判断是新增还是编辑
|
|
const isEdit = ref(false); // 是否为编辑模式
|
|
|
|
// 表单验证
|
|
const isValid = computed(() => {
|
|
return penName.value.trim() !== '' && introduction.value.trim() !== '';
|
|
});
|
|
|
|
// 获取作家信息
|
|
const getMyWriter = async () => {
|
|
try {
|
|
// 首先检查用户是否已经是作家
|
|
if (!store.isCurrentAuthor) {
|
|
// 不是作家,直接进入申请模式
|
|
resetForm();
|
|
isEdit.value = false;
|
|
return;
|
|
}
|
|
|
|
// 是作家,获取作家详细信息进行回显
|
|
const response = await writerApi.getMyWriter();
|
|
if (response.result) {
|
|
const writerInfo = response.result;
|
|
penName.value = writerInfo.name || '';
|
|
introduction.value = writerInfo.details || '';
|
|
writerId.value = writerInfo.id || null;
|
|
isEdit.value = true;
|
|
} else {
|
|
// 虽然是作家但获取不到详细信息,仍然进入申请模式
|
|
resetForm();
|
|
isEdit.value = false;
|
|
}
|
|
} catch (error) {
|
|
console.error('获取作家信息失败:', error);
|
|
// 获取失败时,根据store中的作家状态来决定模式
|
|
if (store.isCurrentAuthor) {
|
|
// 是作家但获取信息失败,进入编辑模式但不填充信息
|
|
resetForm();
|
|
isEdit.value = true;
|
|
} else {
|
|
// 不是作家,进入申请模式
|
|
resetForm();
|
|
isEdit.value = false;
|
|
}
|
|
}
|
|
};
|
|
|
|
// 提交申请
|
|
const handleSubmit = async () => {
|
|
if (!isValid.value) {
|
|
ElMessage.warning('请填写完整信息');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
loading.value = true;
|
|
|
|
// 准备提交数据
|
|
const data = {
|
|
penName: penName.value.trim(),
|
|
details: introduction.value.trim()
|
|
};
|
|
|
|
// 如果是编辑模式,添加ID
|
|
if (writerId.value) {
|
|
data.id = writerId.value;
|
|
}
|
|
|
|
// 调用API
|
|
const response = await writerApi.saveOrUpdateWriter(data);
|
|
|
|
if (response.code === 200) {
|
|
ElMessage.success(isEdit.value ? '修改成功' : '申请成功');
|
|
|
|
// 如果是新申请成功,需要更新用户的作家状态
|
|
if (!isEdit.value) {
|
|
// 重新获取最新的用户信息以更新作家状态
|
|
try {
|
|
await store.fetchLatestUserInfo();
|
|
} catch (error) {
|
|
console.error('更新用户信息失败:', error);
|
|
// 即使更新失败,也手动设置作家状态
|
|
store.setAsAuthor();
|
|
}
|
|
}
|
|
|
|
// 触发成功回调
|
|
emit('application-success', {
|
|
penName: penName.value,
|
|
introduction: introduction.value,
|
|
isEdit: isEdit.value
|
|
});
|
|
|
|
// 关闭弹窗
|
|
emit('update:visible', false);
|
|
} else {
|
|
ElMessage.error(response.message || '提交失败,请稍后重试');
|
|
}
|
|
} catch (error) {
|
|
console.error('提交失败:', error);
|
|
ElMessage.error('提交失败,请稍后重试');
|
|
} finally {
|
|
loading.value = false;
|
|
}
|
|
};
|
|
|
|
// 重置表单
|
|
const resetForm = () => {
|
|
penName.value = '';
|
|
introduction.value = '';
|
|
writerId.value = null;
|
|
isEdit.value = false;
|
|
};
|
|
|
|
// 监听弹窗显示状态,打开时获取作家信息
|
|
watch(
|
|
() => props.visible,
|
|
(newVisible) => {
|
|
if (newVisible) {
|
|
getMyWriter();
|
|
}
|
|
}
|
|
);
|
|
|
|
return {
|
|
penName,
|
|
introduction,
|
|
loading,
|
|
isValid,
|
|
isEdit,
|
|
handleSubmit
|
|
};
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
@use 'sass:color';
|
|
|
|
.author-application-modal {
|
|
// 全局共享样式
|
|
:deep(.el-input__wrapper),
|
|
:deep(.el-textarea__inner),
|
|
:deep(.el-button) {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
:deep(.el-input__wrapper) {
|
|
padding: 0 15px;
|
|
height: 44px !important;
|
|
line-height: 44px !important;
|
|
}
|
|
|
|
:deep(.el-input__inner),
|
|
:deep(.el-textarea__inner) {
|
|
font-size: 15px;
|
|
}
|
|
|
|
.application-form {
|
|
padding: 10px 0;
|
|
|
|
.form-item {
|
|
margin-bottom: 20px;
|
|
|
|
.required-label {
|
|
margin-bottom: 8px;
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
color: #333;
|
|
|
|
&::before {
|
|
content: '*';
|
|
color: #f56c6c;
|
|
margin-right: 4px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.submit-button {
|
|
width: 100%;
|
|
height: 44px;
|
|
margin-top: 10px;
|
|
background-color: #0A2463;
|
|
border-color: #0A2463;
|
|
|
|
&:hover {
|
|
background-color: color.adjust(#0A2463, $lightness: -10%);
|
|
border-color: color.adjust(#0A2463, $lightness: -10%);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|