kidArtExpo/src/store/auth/index.js

226 lines
6.3 KiB
JavaScript
Raw Normal View History

2024-08-08 09:07:42 +00:00
import {ref,computed} from 'vue'
2024-08-07 12:00:54 +00:00
import {createGlobalState,useStorage} from '@vueuse/core'
2024-08-13 10:39:23 +00:00
import {competitionApply, competitionWorks, loginRegister, sendCode, uploadFile, workInfo} from '@/api/auth/index.js'
2024-08-07 12:00:54 +00:00
import {message} from "@/utils/message.js"
2024-08-08 09:07:42 +00:00
import { useRouter } from 'vue-router';
import { showImagePreview } from 'vant';
import useImgModalPopup from "@/components/imgModal/imgModal.js";
2024-08-07 12:00:54 +00:00
export const useAuth=createGlobalState(()=>{
2024-08-08 09:07:42 +00:00
2024-08-13 11:38:26 +00:00
const router = useRouter()
2024-08-07 12:00:54 +00:00
const token = useStorage('token', '', localStorage)
2024-08-13 10:39:23 +00:00
const workUid = useStorage('workUid', '', localStorage)
2024-08-09 05:40:02 +00:00
const telNum =useStorage('telNum', '', localStorage)
2024-08-07 12:00:54 +00:00
const code=ref('')
2024-08-13 10:39:23 +00:00
const workData=useStorage('workData', {}, localStorage)
2024-08-09 05:40:02 +00:00
const countdown = ref(0)
const isCountingDown = ref(false)
2024-08-08 09:07:42 +00:00
const showTextCode=computed(()=>{
return isCountingDown.value ? `${countdown.value}s` : '获取验证码'
})
2024-08-13 10:39:23 +00:00
const getWorkInfo=async ()=>{
const res=await workInfo({workUid:workUid.value})
2024-08-13 11:38:26 +00:00
if (res.status===0){
2024-08-13 10:39:23 +00:00
workData.value=res.data
}
}
2024-08-08 09:07:42 +00:00
const genderOptions=ref([
{text:'男',value:'男'},
{text:'女',value:'女'}
])
2024-08-09 05:40:02 +00:00
// 验证 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()
}
2024-08-09 05:40:02 +00:00
const detailData=useStorage('detailData', {}, localStorage)
const formData=useStorage('formData',{
2024-08-08 09:07:42 +00:00
name:'',
age:'',
2024-08-13 08:46:03 +00:00
gender:undefined,
2024-08-08 09:07:42 +00:00
works:[
{
2024-08-09 05:40:02 +00:00
imgList:[],
2024-08-08 09:07:42 +00:00
picUrl: "", //作品图片url
workName: "", //作品名称
length: undefined, //长度
wide:undefined//宽度
}
]
2024-08-09 05:40:02 +00:00
},localStorage)
2024-08-08 09:07:42 +00:00
const clickAddWorks=()=>{
formData.value.works.push({
picUrl: "", //作品图片url
workName: "", //作品名称
length: undefined, //长度
wide:undefined//宽度
})
}
const removeWorks=(index)=>{
formData.value.works.splice(index,1)
}
2024-08-13 07:36:40 +00:00
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
2024-08-13 07:36:40 +00:00
if (e.onFinish){
e.onFinish()
2024-08-13 08:03:00 +00:00
item.imgList=[{
2024-08-13 07:36:40 +00:00
status: 'finished',
url: item.picUrl
},]
}
}
}
const deleteImg=(item)=>{
item.picUrl=''
item.imgList=[]
}
const viewDetails=async ()=>{
await getDetail()
router.push('/details')
}
2024-08-08 09:07:42 +00:00
const clickApply=async ()=>{
2024-08-09 05:40:02 +00:00
const isValid = validateFormData();
if (!isValid){
message.warning('作品信息不全,请补充')
return
}
2024-08-08 09:07:42 +00:00
const data={
...formData.value
}
const res=await competitionApply(data)
if(res.status===0){
message.success('报名成功')
router.push('/result')
2024-08-08 09:07:42 +00:00
}
}
let timer = null;
2024-08-09 05:40:02 +00:00
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')
2024-08-09 05:40:02 +00:00
}
2024-08-08 09:07:42 +00:00
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
2024-08-09 05:40:02 +00:00
if (res.data.status===1){
message.warning('您已经报名')
await getDetail()
router.push('/details')
}else {
message.success('登录成功')
2024-08-09 05:40:02 +00:00
router.push('/signup')
}
2024-08-08 09:07:42 +00:00
}
}
2024-08-07 12:00:54 +00:00
const clickSendCode=async ()=>{
2024-08-08 09:07:42 +00:00
if (isCountingDown.value) return;
if (!code.value){
message.warning('请输入验证码')
return
}
2024-08-07 12:00:54 +00:00
if (!telNum.value){
message.warning('请输入手机号')
return
}
const data={
telNum:telNum.value
}
const res=await sendCode(data)
if (res.status===0){
2024-08-08 09:07:42 +00:00
countdown.value = 60;
isCountingDown.value = true;
2024-08-07 12:00:54 +00:00
message.success('发送成功')
2024-08-08 09:07:42 +00:00
timer = setInterval(() => {
if (countdown.value > 0) {
countdown.value -= 1;
} else {
clearInterval(timer);
isCountingDown.value = false;
}
}, 1000);
2024-08-07 12:00:54 +00:00
}
}
const {showImgModal}= useImgModalPopup()
const openMask1=(src)=>{
showImgModal({url:src})
/* showImagePreview({
images:[src],
closeable: true,
})*/
}
2024-08-07 12:00:54 +00:00
return {
2024-08-13 11:38:26 +00:00
workData,
2024-08-13 10:39:23 +00:00
workUid,
getWorkInfo,
viewDetails,
goBack,
openMask1,
deleteImg,
afterRead,
openMask,
goConfirm,
2024-08-09 05:40:02 +00:00
detailData,
2024-08-08 09:07:42 +00:00
removeWorks,
clickAddWorks,
genderOptions,
formData,
clickApply,
clickLogin,
showTextCode,
2024-08-07 12:00:54 +00:00
code,
clickSendCode,
telNum,
token
}
})