226 lines
6.3 KiB
JavaScript
226 lines
6.3 KiB
JavaScript
import {ref,computed} from 'vue'
|
|
import {createGlobalState,useStorage} from '@vueuse/core'
|
|
import {competitionApply, competitionWorks, loginRegister, sendCode, uploadFile, workInfo} from '@/api/auth/index.js'
|
|
import {message} from "@/utils/message.js"
|
|
import { useRouter } from 'vue-router';
|
|
import { showImagePreview } from 'vant';
|
|
import useImgModalPopup from "@/components/imgModal/imgModal.js";
|
|
export const useAuth=createGlobalState(()=>{
|
|
|
|
const router = useRouter()
|
|
const token = useStorage('token', '', localStorage)
|
|
const workUid = useStorage('workUid', '', localStorage)
|
|
const telNum =useStorage('telNum', '', localStorage)
|
|
const code=ref('')
|
|
const workData=useStorage('workData', {}, localStorage)
|
|
const countdown = ref(0)
|
|
const isCountingDown = ref(false)
|
|
const showTextCode=computed(()=>{
|
|
return isCountingDown.value ? `${countdown.value}s` : '获取验证码'
|
|
})
|
|
const getWorkInfo=async ()=>{
|
|
const res=await workInfo({workUid:workUid.value})
|
|
if (res.status===0){
|
|
workData.value=res.data
|
|
}
|
|
|
|
}
|
|
const genderOptions=ref([
|
|
{text:'男',value:'男'},
|
|
{text:'女',value:'女'}
|
|
])
|
|
// 验证 formData 中的字段
|
|
function validateFormData() {
|
|
// 验证基本信息
|
|
const baseFields = ['name', 'age', 'gender'];
|
|
if (baseFields.some(field => !Boolean(formData.value[field]))) {
|
|
return false;
|
|
}
|
|
// 验证 works 数组中的每一个作品
|
|
if (formData.value.works.some(work =>
|
|
!Boolean(work.picUrl) ||
|
|
!Boolean(work.workName) ||
|
|
!Boolean(work.length) ||
|
|
!Boolean(work.wide))) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
const openMask=(src)=>{
|
|
showImagePreview({
|
|
images:[src],
|
|
closeable: true,
|
|
})
|
|
}
|
|
const goBack=()=>{
|
|
router.back()
|
|
}
|
|
const detailData=useStorage('detailData', {}, localStorage)
|
|
const formData=useStorage('formData',{
|
|
name:'',
|
|
age:'',
|
|
gender:undefined,
|
|
works:[
|
|
{
|
|
imgList:[],
|
|
picUrl: "", //作品图片url
|
|
workName: "", //作品名称
|
|
length: undefined, //长度
|
|
wide:undefined//宽度
|
|
}
|
|
]
|
|
},localStorage)
|
|
const clickAddWorks=()=>{
|
|
formData.value.works.push({
|
|
picUrl: "", //作品图片url
|
|
workName: "", //作品名称
|
|
length: undefined, //长度
|
|
wide:undefined//宽度
|
|
})
|
|
}
|
|
const removeWorks=(index)=>{
|
|
formData.value.works.splice(index,1)
|
|
}
|
|
const afterRead=async (file,item,e)=>{
|
|
const formData1 = new FormData()
|
|
formData1.append("file", file.file)
|
|
formData1.append("type", 'image')
|
|
const res=await uploadFile(formData1)
|
|
if (res.status===0){
|
|
item.picUrl=res.data
|
|
if (e.onFinish){
|
|
e.onFinish()
|
|
item.imgList=[{
|
|
status: 'finished',
|
|
url: item.picUrl
|
|
},]
|
|
}
|
|
}
|
|
}
|
|
const deleteImg=(item)=>{
|
|
item.picUrl=''
|
|
item.imgList=[]
|
|
}
|
|
const viewDetails=async ()=>{
|
|
await getDetail()
|
|
router.push('/details')
|
|
}
|
|
const clickApply=async ()=>{
|
|
const isValid = validateFormData();
|
|
if (!isValid){
|
|
message.warning('作品信息不全,请补充')
|
|
return
|
|
}
|
|
const data={
|
|
...formData.value
|
|
}
|
|
const res=await competitionApply(data)
|
|
if(res.status===0){
|
|
message.success('报名成功')
|
|
|
|
router.push('/result')
|
|
}
|
|
}
|
|
let timer = null;
|
|
const getDetail=async ()=>{
|
|
if (!telNum.value){
|
|
message.error('获取手机号失败')
|
|
return
|
|
}
|
|
const res=await competitionWorks({telNum:telNum.value})
|
|
if (res.status===0){
|
|
detailData.value=res.data
|
|
}
|
|
}
|
|
const goConfirm=()=>{
|
|
const isValid = validateFormData();
|
|
if (!isValid){
|
|
message.warning('作品信息不全,请补充')
|
|
return
|
|
}
|
|
router.push('/confirm')
|
|
}
|
|
const clickLogin=async ()=>{
|
|
const data={
|
|
telNum:telNum.value,
|
|
code:code.value
|
|
}
|
|
const res=await loginRegister(data)
|
|
if(res.status===0){
|
|
token.value=res.data.token
|
|
if (res.data.status===1){
|
|
message.warning('您已经报名')
|
|
await getDetail()
|
|
router.push('/details')
|
|
}else {
|
|
message.success('登录成功')
|
|
|
|
router.push('/signup')
|
|
}
|
|
|
|
}
|
|
}
|
|
const clickSendCode=async ()=>{
|
|
if (isCountingDown.value) return;
|
|
if (!code.value){
|
|
message.warning('请输入验证码')
|
|
return
|
|
}
|
|
if (!telNum.value){
|
|
message.warning('请输入手机号')
|
|
return
|
|
}
|
|
const data={
|
|
telNum:telNum.value
|
|
}
|
|
const res=await sendCode(data)
|
|
if (res.status===0){
|
|
countdown.value = 60;
|
|
isCountingDown.value = true;
|
|
message.success('发送成功')
|
|
timer = setInterval(() => {
|
|
if (countdown.value > 0) {
|
|
countdown.value -= 1;
|
|
} else {
|
|
clearInterval(timer);
|
|
isCountingDown.value = false;
|
|
}
|
|
}, 1000);
|
|
}
|
|
}
|
|
const {showImgModal}= useImgModalPopup()
|
|
const openMask1=(src)=>{
|
|
showImgModal({url:src})
|
|
/* showImagePreview({
|
|
images:[src],
|
|
closeable: true,
|
|
})*/
|
|
}
|
|
return {
|
|
workData,
|
|
workUid,
|
|
getWorkInfo,
|
|
viewDetails,
|
|
goBack,
|
|
openMask1,
|
|
deleteImg,
|
|
afterRead,
|
|
openMask,
|
|
goConfirm,
|
|
detailData,
|
|
removeWorks,
|
|
clickAddWorks,
|
|
genderOptions,
|
|
formData,
|
|
clickApply,
|
|
clickLogin,
|
|
showTextCode,
|
|
code,
|
|
clickSendCode,
|
|
telNum,
|
|
token
|
|
}
|
|
|
|
})
|