|
@@ -15,21 +15,32 @@
|
|
|
<div class="font_size20 bold">基本信息</div>
|
|
<div class="font_size20 bold">基本信息</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="mt10">
|
|
<div class="mt10">
|
|
|
- <el-form-item label="" prop="name">
|
|
|
|
|
|
|
+ <el-form-item label="" prop="title">
|
|
|
<div>
|
|
<div>
|
|
|
<span class="color_required font_size16">*</span>
|
|
<span class="color_required font_size16">*</span>
|
|
|
<span class="font_size16 bold">需求标题</span>
|
|
<span class="font_size16 bold">需求标题</span>
|
|
|
<span class="font_size14 gray999 ml20">一个好的标题能吸引更多专业人士关注</span>
|
|
<span class="font_size14 gray999 ml20">一个好的标题能吸引更多专业人士关注</span>
|
|
|
</div>
|
|
</div>
|
|
|
- <el-input v-model="ruleForm.name" placeholder="请输入工作流标题" maxlength="50"/>
|
|
|
|
|
|
|
+ <el-input v-model="ruleForm.title" placeholder="请输入工作流标题" maxlength="50"/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="" prop="name">
|
|
|
|
|
|
|
+ <el-form-item label="" prop="categoryId3">
|
|
|
<div>
|
|
<div>
|
|
|
<span class="color_required font_size16">*</span>
|
|
<span class="color_required font_size16">*</span>
|
|
|
<span class="font_size16 bold">工作流类型</span>
|
|
<span class="font_size16 bold">工作流类型</span>
|
|
|
<span class="font_size14 gray999 ml20">选择最贴合的工作流分类</span>
|
|
<span class="font_size14 gray999 ml20">选择最贴合的工作流分类</span>
|
|
|
</div>
|
|
</div>
|
|
|
- <el-input v-model="ruleForm.name" placeholder="请输入工作流标题" maxlength="50"/>
|
|
|
|
|
|
|
+ <!-- 树形选择 -->
|
|
|
|
|
+ <el-tree-select
|
|
|
|
|
+ v-model="ruleForm.categoryId3"
|
|
|
|
|
+ :data="categoryListTree"
|
|
|
|
|
+ :render-after-expand="false"
|
|
|
|
|
+ placeholder="请选择工作流类型"
|
|
|
|
|
+ :props="{
|
|
|
|
|
+ label: 'categoryName',
|
|
|
|
|
+ value: 'categoryId',
|
|
|
|
|
+ children: 'children',
|
|
|
|
|
+ }"
|
|
|
|
|
+ />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -40,11 +51,11 @@
|
|
|
<div class="font_size20 bold">详细内容</div>
|
|
<div class="font_size20 bold">详细内容</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="mt10">
|
|
<div class="mt10">
|
|
|
- <el-form-item label="需求背景" prop="name">
|
|
|
|
|
- <el-input v-model="ruleForm.name" placeholder="说明您的需求来源和目的" maxlength="500" type="textarea" show-word-limit/>
|
|
|
|
|
|
|
+ <el-form-item label="需求背景" prop="background">
|
|
|
|
|
+ <el-input v-model="ruleForm.background" placeholder="说明您的需求来源和目的" maxlength="500" type="textarea" show-word-limit/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="具体要求" prop="name">
|
|
|
|
|
- <el-input v-model="ruleForm.name"
|
|
|
|
|
|
|
+ <el-form-item label="具体要求" prop="requirements">
|
|
|
|
|
+ <el-input v-model="ruleForm.requirements"
|
|
|
rows="7"
|
|
rows="7"
|
|
|
placeholder="详细描述功能要求、技术要求等(50-2000字)
|
|
placeholder="详细描述功能要求、技术要求等(50-2000字)
|
|
|
建议分点说明:
|
|
建议分点说明:
|
|
@@ -65,30 +76,28 @@
|
|
|
<div class="mt10">
|
|
<div class="mt10">
|
|
|
<el-row :gutter="20">
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="" prop="name">
|
|
|
|
|
|
|
+ <el-form-item label="">
|
|
|
<div>
|
|
<div>
|
|
|
- <span class="color_required font_size16">*</span>
|
|
|
|
|
<span class="font_size16 bold">预算下限(元)</span>
|
|
<span class="font_size16 bold">预算下限(元)</span>
|
|
|
<span class="font_size14 gray999 ml20">选填,有助于吸引合适的服务者</span>
|
|
<span class="font_size14 gray999 ml20">选填,有助于吸引合适的服务者</span>
|
|
|
</div>
|
|
</div>
|
|
|
- <el-input v-model="ruleForm.name" placeholder="最低预算" maxlength="11" type="number" />
|
|
|
|
|
|
|
+ <el-input v-model="ruleForm.budgetMin" placeholder="最低预算" maxlength="11" type="number" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="" prop="name">
|
|
|
|
|
|
|
+ <el-form-item label="">
|
|
|
<div>
|
|
<div>
|
|
|
- <span class="color_required font_size16">*</span>
|
|
|
|
|
<span class="font_size16 bold">预算上限(元)</span>
|
|
<span class="font_size16 bold">预算上限(元)</span>
|
|
|
<span class="font_size14 gray999 ml20">选填,有助于吸引合适的服务者</span>
|
|
<span class="font_size14 gray999 ml20">选填,有助于吸引合适的服务者</span>
|
|
|
</div>
|
|
</div>
|
|
|
- <el-input v-model="ruleForm.name" placeholder="最高预算" maxlength="11" type="number" />
|
|
|
|
|
|
|
+ <el-input v-model="ruleForm.budgetMax" placeholder="最高预算" maxlength="11" type="number" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
- <el-form-item label="报名截止时间" prop="name">
|
|
|
|
|
|
|
+ <el-form-item label="报名截止时间" prop="deadline">
|
|
|
<!-- 只能选择之后的时间 -->
|
|
<!-- 只能选择之后的时间 -->
|
|
|
<el-date-picker
|
|
<el-date-picker
|
|
|
- v-model="ruleForm.name"
|
|
|
|
|
|
|
+ v-model="ruleForm.deadline"
|
|
|
type="date"
|
|
type="date"
|
|
|
value-format="YYYY-MM-DD"
|
|
value-format="YYYY-MM-DD"
|
|
|
placeholder="选择报名截止时间"
|
|
placeholder="选择报名截止时间"
|
|
@@ -104,14 +113,14 @@
|
|
|
<div class="font_size20 bold">联系方式</div>
|
|
<div class="font_size20 bold">联系方式</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="mt10">
|
|
<div class="mt10">
|
|
|
- <el-form-item label="手机号" prop="name">
|
|
|
|
|
- <el-input v-model="ruleForm.name" placeholder="请输入手机号" maxlength="11" type="number" />
|
|
|
|
|
|
|
+ <el-form-item label="手机号" prop="phone">
|
|
|
|
|
+ <el-input v-model="ruleForm.phone" placeholder="请输入手机号" maxlength="11" type="number" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="微信">
|
|
<el-form-item label="微信">
|
|
|
- <el-input v-model="ruleForm.name" placeholder="请输入手机号" maxlength="50"/>
|
|
|
|
|
|
|
+ <el-input v-model="ruleForm.wechat" placeholder="请输入微信号" maxlength="50"/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="邮箱">
|
|
|
|
|
- <el-input v-model="ruleForm.name" placeholder="请输入手机号" maxlength="50"/>
|
|
|
|
|
|
|
+ <el-form-item label="邮箱" prop="email">
|
|
|
|
|
+ <el-input v-model="ruleForm.email" placeholder="请输入邮箱" maxlength="50"/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -164,51 +173,112 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
- import riliIcon from '@/assets/imgs/rili.png'
|
|
|
|
|
- import biaoqianIcon from '@/assets/imgs/biaoqian.png'
|
|
|
|
|
- import yuangong from '@/assets/imgs/yuangong.png'
|
|
|
|
|
- import zaixianbaomingIcon from '@/assets/imgs/zaixianbaoming.png'
|
|
|
|
|
- import dianhuaIcon from '@/assets/imgs/dianhua.png'
|
|
|
|
|
- import weixinIcon from '@/assets/imgs/weixin.png'
|
|
|
|
|
- import youxiangIcon from '@/assets/imgs/youxiang.png'
|
|
|
|
|
|
|
+import riliIcon from '@/assets/imgs/rili.png'
|
|
|
|
|
+import biaoqianIcon from '@/assets/imgs/biaoqian.png'
|
|
|
|
|
+import yuangong from '@/assets/imgs/yuangong.png'
|
|
|
|
|
+import zaixianbaomingIcon from '@/assets/imgs/zaixianbaoming.png'
|
|
|
|
|
+import dianhuaIcon from '@/assets/imgs/dianhua.png'
|
|
|
|
|
+import weixinIcon from '@/assets/imgs/weixin.png'
|
|
|
|
|
+import youxiangIcon from '@/assets/imgs/youxiang.png'
|
|
|
|
|
+import DGTMessage from '@/utils/message'
|
|
|
|
|
+
|
|
|
|
|
+import { questAdd } from '@/api/workflowTrade.js'
|
|
|
|
|
+import { getCategoryListTree } from '@/api/category.js'
|
|
|
|
|
|
|
|
|
|
|
|
|
- import { useRouter, useRoute } from 'vue-router'
|
|
|
|
|
- const router = useRouter()
|
|
|
|
|
- const route = useRoute()
|
|
|
|
|
- console.log(router,route)
|
|
|
|
|
- import { ref, computed, reactive } from 'vue'
|
|
|
|
|
- import { useAppStore } from '@/pinia/appStore'
|
|
|
|
|
- const appStore = useAppStore()
|
|
|
|
|
|
|
+import { useRouter, useRoute } from 'vue-router'
|
|
|
|
|
+const router = useRouter()
|
|
|
|
|
+const route = useRoute()
|
|
|
|
|
+console.log(router,route)
|
|
|
|
|
+import { ref, computed, reactive, onMounted } from 'vue'
|
|
|
|
|
+import { useAppStore } from '@/pinia/appStore'
|
|
|
|
|
+const appStore = useAppStore()
|
|
|
|
|
|
|
|
- //获取参数
|
|
|
|
|
- const query = route.query;
|
|
|
|
|
- // 表单实例
|
|
|
|
|
|
|
+//获取参数
|
|
|
|
|
+const query = route.query;
|
|
|
|
|
+// 分类列表树
|
|
|
|
|
+const categoryListTree = ref([]);
|
|
|
|
|
+// 表单实例
|
|
|
const ruleFormRef = ref(null)
|
|
const ruleFormRef = ref(null)
|
|
|
const ruleForm = reactive({
|
|
const ruleForm = reactive({
|
|
|
- name: '',
|
|
|
|
|
|
|
+ title: '',
|
|
|
|
|
+ categoryId3: '',
|
|
|
|
|
+ background: '',
|
|
|
|
|
+ requirements: '',
|
|
|
|
|
+ budgetMin: '',
|
|
|
|
|
+ budgetMax: '',
|
|
|
|
|
+ deadline: '',
|
|
|
|
|
+ phone: '',
|
|
|
|
|
+ wechat: '',
|
|
|
|
|
+ email: '',
|
|
|
})
|
|
})
|
|
|
// 校验规则
|
|
// 校验规则
|
|
|
const rules = reactive({
|
|
const rules = reactive({
|
|
|
- name: [
|
|
|
|
|
|
|
+ title: [
|
|
|
{ required: true, message: '请输入需求标题', trigger: 'blur' },
|
|
{ required: true, message: '请输入需求标题', trigger: 'blur' },
|
|
|
],
|
|
],
|
|
|
|
|
+ categoryId3: [
|
|
|
|
|
+ { required: true, message: '请选择工作流类型', trigger: 'change' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ background: [
|
|
|
|
|
+ { required: true, message: '请输入需求背景', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ requirements: [
|
|
|
|
|
+ { required: true, message: '请输入具体要求', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ budgetMin: [
|
|
|
|
|
+ { required: true, message: '请输入预算下限', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ budgetMax: [
|
|
|
|
|
+ { required: true, message: '请输入预算上限', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ deadline: [
|
|
|
|
|
+ { required: true, message: '请选择报名截止时间', trigger: 'change' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ phone: [
|
|
|
|
|
+ { required: true, message: '请输入手机号', trigger: 'blur' },
|
|
|
|
|
+ { validator: (rule, value, callback) => /^1[3456789]\d{9}$/.test(value), message: '请输入正确的手机号', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ email: [
|
|
|
|
|
+ { required: true, message: '请输入邮箱', trigger: 'blur' },
|
|
|
|
|
+ { validator: (rule, value, callback) => /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/.test(value), message: '请输入正确的邮箱', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+onMounted(() => {
|
|
|
|
|
+ // 查询分类信息(返回树状结构)
|
|
|
|
|
+ getCategoryListTreeFn()
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
// 提交表单
|
|
// 提交表单
|
|
|
const submitForm = async () => {
|
|
const submitForm = async () => {
|
|
|
- await ruleFormRef.value.validate((valid, fields) => {
|
|
|
|
|
- console.log(valid, fields)
|
|
|
|
|
|
|
+ await ruleFormRef.value.validate((valid, fields,name) => {
|
|
|
|
|
+ console.log(valid, fields,name)
|
|
|
if (!valid) {
|
|
if (!valid) {
|
|
|
- DGTMessage.warning(fields.name[0].message)
|
|
|
|
|
|
|
+ //报错第一个key
|
|
|
|
|
+ let firstKey = Object.keys(fields)[0]
|
|
|
|
|
+ DGTMessage.warning(fields[firstKey][0].message)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- DGTMessage.success('表单提交成功')
|
|
|
|
|
|
|
+ // 新增需求工作流
|
|
|
|
|
+ questAdd(ruleForm).then(res => {
|
|
|
|
|
+ console.log(res)
|
|
|
|
|
+ if(res.code === 200){
|
|
|
|
|
+ DGTMessage.success('发布成功')
|
|
|
|
|
+ goBack();
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
})
|
|
})
|
|
|
};
|
|
};
|
|
|
const goBack = () => {
|
|
const goBack = () => {
|
|
|
router.back()
|
|
router.back()
|
|
|
-}
|
|
|
|
|
|
|
+};
|
|
|
|
|
+const getCategoryListTreeFn = () => {
|
|
|
|
|
+ getCategoryListTree().then(res => {
|
|
|
|
|
+ console.log(res)
|
|
|
|
|
+ categoryListTree.value = res.rows || [];
|
|
|
|
|
+ })
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|