feat 搭建架构骨架

This commit is contained in:
Ironsp
2026-09-24 09:09:47 +08:00
parent dd9f6b77a4
commit 7a2efa3fea
180 changed files with 18967 additions and 9 deletions

View File

@@ -0,0 +1,126 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import type { Demand } from '@/types/business/demand'
import type { FileInfo } from '@/types/api'
import { formatDate } from '@/utils/format'
import { getDraftDemand, saveDraft as saveDraftApi, submitDemand } from '@/api/demand'
function createDefaultForm(): Demand {
return {
businessType: 'internet',
projectName: '',
attachments: [],
coreDescription: '',
expectedDuration: '',
budgetRange: '',
userName: '王永志',
userPhone: '1866****9618',
remark: '',
status: 'draft',
}
}
/** 需求提报数据(M3:表单 / 步骤 / 提交与草稿) */
export const useDemandStore = defineStore('demand', () => {
const form = ref<Demand>(createDefaultForm())
const step = ref(1)
const loading = ref(false)
function setStep(next: number): void {
step.value = next
}
function patchForm(partial: Partial<Demand>): void {
form.value = { ...form.value, ...partial }
}
/** File → FileInfo(mock:url 为空,uploadTime 取当前时间) */
function addAttachment(file: File): void {
const info: FileInfo = {
name: file.name,
size: file.size,
uploadTime: formatDate(new Date()),
url: '',
}
form.value.attachments = [...form.value.attachments, info]
}
function removeAttachment(target: FileInfo): void {
form.value.attachments = form.value.attachments.filter(
(item) => !(item.name === target.name && item.uploadTime === target.uploadTime),
)
}
/** 提交需求:必填校验通过后调 api,成功返回 true(页面可据此跳转) */
async function submit(): Promise<boolean> {
if (!form.value.businessType) {
ElMessage.warning('请选择业务类型')
return false
}
if (!form.value.projectName.trim()) {
ElMessage.warning('请填写项目名称')
return false
}
if (!form.value.coreDescription.trim()) {
ElMessage.warning('请填写核心需求描述')
return false
}
loading.value = true
try {
await submitDemand(form.value)
form.value.status = 'submitted'
ElMessage.success('提交后我们的专业顾问将在一个工作日内与您联系')
return true
}
catch (error) {
ElMessage.error(error instanceof Error ? error.message : '提交失败,请稍后重试')
return false
}
finally {
loading.value = false
}
}
/** 保存草稿到 sessionStorage */
async function saveDraft(): Promise<void> {
loading.value = true
try {
await saveDraftApi(form.value)
form.value.status = 'draft'
ElMessage.success('草稿已保存')
}
catch (error) {
ElMessage.error(error instanceof Error ? error.message : '草稿保存失败')
}
finally {
loading.value = false
}
}
/** 恢复本地草稿(无草稿则保持默认表单) */
async function loadDraft(): Promise<void> {
const draft = await getDraftDemand()
if (draft) form.value = { ...createDefaultForm(), ...draft }
}
/** 重置表单与步骤 */
function reset(): void {
form.value = createDefaultForm()
step.value = 1
}
return {
form,
step,
loading,
setStep,
patchForm,
addAttachment,
removeAttachment,
submit,
saveDraft,
loadDraft,
reset,
}
})