Explorar el Código

新增路演方式的报名和创建赛事

zs hace 6 meses
padre
commit
d5099ca2d4

+ 10 - 4
src/views/center/match.vue

@@ -31,9 +31,9 @@
             <el-table-column align="center" label="操作" width="250">
               <template #default="{ row }">
                 <el-link v-if="row.status == '-2'" :underline="false" type="warning" size="mini" @click="toExam(row)" style="margin-right: 10px">提交审核</el-link>
-                <el-link v-if="row.match_status == '2'" :underline="false" type="primary" size="mini" @click="toScore(row)" style="margin-right: 10px">分数</el-link>
+                <el-link v-if="row.match_status == '2' && row.form != '3'" :underline="false" type="primary" size="mini" @click="toScore(row)" style="margin-right: 10px">分数</el-link>
                 <el-link :underline="false" type="warning" size="mini" @click="toSign(row)" style="margin-right: 10px">报名</el-link>
-                <el-link v-if="row.status != '1'" :underline="false" type="primary" size="mini" @click="toEdit(row)" style="margin-right: 10px">修改</el-link>
+                <el-link :underline="false" type="primary" size="mini" @click="toEdit(row)" style="margin-right: 10px">修改</el-link>
                 <el-link v-if="row.status != '1'" :underline="false" type="danger" size="mini" style="margin-right: 10px" @click="toDelete(row)"> 删除 </el-link>
                 <el-link :underline="false" type="primary" size="mini" @click="toMatch(row)">赛事状态修改</el-link>
               </template>
@@ -60,6 +60,9 @@
                 <template #is_use>
                   <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
                 </template>
+                <template #is_show>
+                  <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
+                </template>
                 <template #industry>
                   <el-option v-for="i in industryList" :key="i.id" :label="i.label" :value="i.value"></el-option>
                 </template>
@@ -229,6 +232,7 @@ const tagsList = ref([])
 const industryList = ref([])
 const matchTypeList = ref([])
 const scaleList = ref([])
+
 // 流程列表
 const processList = ref([])
 
@@ -238,6 +242,7 @@ const activeName = ref('first')
 const oneformFields = ref([
   { label: '封面', model: 'file', custom: true },
   { label: '赛事名称', model: 'name' },
+  { label: '类别', model: 'form', type: 'select' },
   { label: '标签', model: 'tags', custom: true },
   { label: '类型', model: 'type', type: 'select' },
   { label: '赛事规模', model: 'scale', type: 'radio' },
@@ -245,12 +250,13 @@ const oneformFields = ref([
   { label: '路由', model: 'href', display: () => form.value.match_type == '1' },
   { label: '组织单位', model: 'work' },
   { label: '行业', model: 'industry', type: 'select' },
-  { label: '类别', model: 'form', type: 'select' },
   { label: '奖金(万元)', model: 'money' },
   { label: '有效期', model: 'time', type: 'datetimerange' },
   { label: '是否启用', model: 'is_use', type: 'radio' },
+  { label: '是否公开路演人信息', model: 'is_show', type: 'radio' },
   { label: '视频', model: 'video', custom: true },
-  { label: '地址', model: 'address', type: 'textarea' }
+  { label: '地址', model: 'address', type: 'textarea' },
+  { label: '备注', model: 'remark', type: 'textarea', display: () => form.value.form == '3' }
 ])
 const twoformFields = ref([
   { model: 'rules', custom: true },

+ 6 - 6
src/views/detail/parts/index.vue

@@ -7,12 +7,12 @@
             <el-row :gutter="20">
               <el-col :span="12">
                 <el-form-item label="姓名" prop="name">
-                  <el-input clearable v-model="form.name" placeholder="请输入姓名"> </el-input>
+                  <el-input size="large" clearable v-model="form.name" placeholder="请输入姓名"> </el-input>
                 </el-form-item>
               </el-col>
               <el-col :span="12">
                 <el-form-item label="电话号" prop="phone">
-                  <el-input clearable v-model="form.phone" placeholder="请输入电话号"> </el-input>
+                  <el-input size="large" clearable v-model="form.phone" placeholder="请输入电话号"> </el-input>
                 </el-form-item>
               </el-col>
             </el-row>
@@ -26,24 +26,24 @@
               </el-col>
               <el-col :span="12">
                 <el-form-item label="证件号码" prop="card">
-                  <el-input clearable v-model="form.card" placeholder="请输入证件号码"> </el-input>
+                  <el-input size="large" clearable v-model="form.card" placeholder="请输入证件号码"> </el-input>
                 </el-form-item>
               </el-col>
             </el-row>
             <el-row :gutter="20">
               <el-col :span="12">
                 <el-form-item label="微信/QQ" prop="communication">
-                  <el-input clearable v-model="form.communication" placeholder="请输入微信/QQ"> </el-input>
+                  <el-input size="large" clearable v-model="form.communication" placeholder="请输入微信/QQ"> </el-input>
                 </el-form-item>
               </el-col>
               <el-col :span="12">
                 <el-form-item label="电子邮箱" prop="email">
-                  <el-input clearable v-model="form.email" placeholder="请输入电子邮箱"> </el-input>
+                  <el-input size="large" clearable v-model="form.email" placeholder="请输入电子邮箱"> </el-input>
                 </el-form-item>
               </el-col>
             </el-row>
             <el-form-item label="备注" prop="brief">
-              <el-input v-model="form.remark" :autosize="{ minRows: 2, maxRows: 8 }" type="textarea" placeholder="请输入备注" />
+              <el-input size="large" v-model="form.remark" :autosize="{ minRows: 2, maxRows: 8 }" type="textarea" placeholder="请输入备注" />
             </el-form-item>
             <el-form-item>
               <el-col :span="24" class="button">

+ 117 - 0
src/views/center/parts/form-2.vue

@@ -0,0 +1,117 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-form label-position="top" ref="ruleFormRef" :model="form" :rules="rules" label-width="80px" class="form">
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="姓名" prop="name">
+                  <el-input size="large" clearable v-model="form.name" placeholder="请输入姓名"> </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="联系电话" prop="phone">
+                  <el-input size="large" clearable v-model="form.phone" placeholder="请输入联系电话"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="报名类型" prop="type">
+                  <el-select size="large" clearable v-model="form.type" placeholder="请选择报名类型" @change="toChang">
+                    <el-option v-for="(item, index) in signTypeList" :key="index" :label="item.label" :value="item.value" />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="公司" prop="company">
+                  <el-select size="large" clearable v-model="form.company" allow-create filterable remote reserve-keyword placeholder="请输入公司名称" :remote-method="remoteMethod" :loading="loading">
+                    <el-option v-for="item in companyList" :key="item.id" :label="item.name" :value="item.name" />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row :gutter="20" v-if="form.type == '1'">
+              <el-col :span="12">
+                <el-form-item label="路演名称" prop="project_name" :rules="form.type == 1 ? { required: true, message: '请输入路演名称', trigger: ['blur', 'change'] } : {}">
+                  <el-input size="large" clearable v-model="form.project_name" placeholder="请输入路演名称"> </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="路演介绍" prop="project_brief" :rules="form.type == 1 ? { required: true, message: '请输入路演介绍', trigger: ['blur', 'change'] } : {}">
+                  <el-input size="large" clearable v-model="form.project_brief" placeholder="请输入路演介绍" :autosize="{ minRows: 2, maxRows: 8 }" type="textarea"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-form-item label="路演附件" prop="project_file" v-if="form.type == '1'" :rules="form.type == 1 ? { required: true, message: '请上传路演附件', trigger: ['blur', 'change'] } : {}">
+              <custom-upload model="project_file" :list="form.project_file" :limit="4" url="/files/web/cxyy_sign/upload" @change="onUpload"></custom-upload>
+            </el-form-item>
+            <el-form-item>
+              <el-col :span="24" class="button">
+                <el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button>
+              </el-col>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+// 接口
+import { CompanyStore } from '@/store/api/user/company'
+const companyStore = CompanyStore()
+// 加载中
+const loading = ref(false)
+const ruleFormRef = inject('ruleFormRef')
+const form = inject('form')
+const validatePhoneNumber = (rule, value, callback) => {
+  const reg = /^1[3-9]\d{9}$/
+  if (!value) {
+    return callback(new Error('手机号不能为空'))
+  }
+  if (!reg.test(value)) {
+    return callback(new Error('请输入正确的手机号'))
+  }
+  callback()
+}
+const rules = reactive({
+  name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+  type: [{ required: true, message: '请选择报名类型', trigger: 'blur' }],
+  phone: [{ required: true, validator: validatePhoneNumber, trigger: 'blur' }],
+  company: [{ required: true, message: '请输入公司名称', trigger: 'blur' }]
+})
+const signTypeList = inject('signTypeList')
+const submitForm = inject('submitForm')
+
+const companyList = ref([])
+// 上传图片
+const onUpload = (e) => {
+  const { model, value } = e
+  form.value[model] = value
+}
+const remoteMethod = (query) => {
+  if (query) {
+    loading.value = true
+    setTimeout(async () => {
+      loading.value = false
+      const info = { status: '1', name: query }
+      const res = await companyStore.query(info)
+      if (res.errcode == '0') companyList.value = res.data
+    }, 200)
+  } else {
+    companyList.value = []
+  }
+}
+</script>
+<style scoped lang="scss">
+.main {
+  .one {
+    .button {
+      text-align: center;
+    }
+  }
+}
+</style>

+ 31 - 6
src/views/center/parts/sign.vue

@@ -36,11 +36,23 @@
     <el-dialog v-model="dialog.show" :title="dialog.title" :destroy-on-close="false" @close="toClose">
       <el-row>
         <el-col :span="24" v-if="dialog.type == '1'">
-          <custom-form v-model="form" :fields="formFields" :useSave="false">
-            <template #cardType>
-              <el-option v-for="i in cardTypeList" :key="i.id" :label="i.label" :value="i.value"></el-option>
-            </template>
-          </custom-form>
+          <div class="form" v-if="matchForm.form == '3'">
+            <custom-form v-model="form" :fields="twoformFields" :useSave="false">
+              <template #type>
+                <el-option v-for="i in signTypeList" :key="i.id" :label="i.label" :value="i.value"></el-option>
+              </template>
+              <template #project_file>
+                <custom-upload model="project_file" :list="form.project_file" :limit="4" url="/files/web/cxyy_sign/upload" @change="onUpload"></custom-upload>
+              </template>
+            </custom-form>
+          </div>
+          <div class="form" v-else>
+            <custom-form v-model="form" :fields="oneformFields" :useSave="false">
+              <template #cardType>
+                <el-option v-for="i in cardTypeList" :key="i.id" :label="i.label" :value="i.value"></el-option>
+              </template>
+            </custom-form>
+          </div>
         </el-col>
         <el-col :span="24" v-if="dialog.type == '2'">
           <custom-form v-model="examForm" :fields="examFormFields" :rules="examRules" @save="toExamSave" :DraftSave="false" submitText="保存">
@@ -83,10 +95,11 @@ const { matchForm } = toRefs(props)
 // 字典表
 const cardTypeList = ref([])
 const statusList = ref([])
+const signTypeList = ref([])
 
 const form = ref({})
 const dialog = ref({ type: '1', show: false, title: '报名管理' })
-const formFields = ref([
+const oneformFields = ref([
   { label: '姓名', model: 'name' },
   { label: '手机号', model: 'phone' },
   { label: '证件类型', model: 'cardType', type: 'select' },
@@ -96,6 +109,15 @@ const formFields = ref([
   { label: '电子邮箱', model: 'email' },
   { label: '备注', model: 'remark', type: 'textarea' }
 ])
+const twoformFields = ref([
+  { label: '姓名', model: 'name' },
+  { label: '手机号', model: 'phone' },
+  { label: '报名类型', model: 'type', type: 'select' },
+  { label: '公司', model: 'company' },
+  { label: '路演名称', model: 'project_name', display: () => form.value.type == '1' },
+  { label: '路演简介', model: 'project_brief', type: 'textarea', display: () => form.value.type == '1' },
+  { label: '路演附件', model: 'project_file', custom: true, display: () => form.value.type == '1' }
+])
 // 审核
 const examFormFields = [{ label: '状态', model: 'status', type: 'select' }]
 const examRules = reactive({
@@ -132,6 +154,9 @@ const searchOther = async () => {
   // 状态
   result = await dictDataStore.query({ code: 'examStatus', is_use: '0' })
   if ($checkRes(result)) statusList.value = result.data
+  // 报名类型
+  result = await dictDataStore.query({ code: 'signType', is_use: '0' })
+  if ($checkRes(result)) signTypeList.value = result.data
 }
 // 字典数据转换
 const getDict = (data, model) => {

+ 19 - 51
src/views/center/sign.vue

@@ -36,54 +36,8 @@
     <el-dialog v-model="dialog.show" :title="dialog.title" :destroy-on-close="false" @close="toClose">
       <el-row>
         <el-col :span="24" v-if="dialog.type == '1'">
-          <el-form label-position="top" ref="ruleFormRef" :model="form" :rules="rules" label-width="80px" class="form">
-            <el-row :gutter="20">
-              <el-col :span="12">
-                <el-form-item label="姓名" prop="name">
-                  <el-input clearable v-model="form.name" placeholder="请输入姓名"> </el-input>
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item label="电话号" prop="phone">
-                  <el-input clearable v-model="form.phone" placeholder="请输入电话号"> </el-input>
-                </el-form-item>
-              </el-col>
-            </el-row>
-            <el-row :gutter="20">
-              <el-col :span="12">
-                <el-form-item label="证件类型" prop="cardType">
-                  <el-select clearable v-model="form.cardType" placeholder="请选择证件类型">
-                    <el-option v-for="(item, index) in cardTypeList" :key="index" :label="item.label" :value="item.value" />
-                  </el-select>
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item label="证件号码" prop="card">
-                  <el-input clearable v-model="form.card" placeholder="请输入证件号码"> </el-input>
-                </el-form-item>
-              </el-col>
-            </el-row>
-            <el-row :gutter="20">
-              <el-col :span="12">
-                <el-form-item label="微信/QQ" prop="communication">
-                  <el-input clearable v-model="form.communication" placeholder="请输入微信/QQ"> </el-input>
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item label="电子邮箱" prop="email">
-                  <el-input clearable v-model="form.email" placeholder="请输入电子邮箱"> </el-input>
-                </el-form-item>
-              </el-col>
-            </el-row>
-            <el-form-item label="备注" prop="brief">
-              <el-input v-model="form.remark" :autosize="{ minRows: 2, maxRows: 8 }" type="textarea" placeholder="请输入备注" />
-            </el-form-item>
-            <el-form-item>
-              <el-col :span="24" class="button">
-                <el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button>
-              </el-col>
-            </el-form-item>
-          </el-form>
+          <form2 v-if="form.matchInfo && form.matchInfo.form == '3'"></form2>
+          <form1 v-else></form1>
         </el-col>
       </el-row>
     </el-dialog>
@@ -91,6 +45,10 @@
 </template>
 
 <script setup>
+// 组件
+import form1 from './parts/form-1.vue'
+import form2 from './parts/form-2.vue'
+
 import moment from 'moment'
 import { cloneDeep, get } from 'lodash-es'
 const $checkRes = inject('$checkRes')
@@ -113,10 +71,9 @@ let skip = 0
 let limit = inject('limit')
 const total = ref(0)
 const currentPage = ref(1)
-// const searchForm = ref({ type: '1' })
 const dialog = ref({ type: '1', show: false, title: '修改报名信息' })
 const ruleFormRef = ref()
-const form = ref({})
+const form = ref({ project_file: [] })
 const validatePhoneNumber = (rule, value, callback) => {
   const reg = /^1[3-9]\d{9}$/
   if (!value) {
@@ -147,6 +104,7 @@ const rules = reactive({
 // 字典表
 const statusList = ref([])
 const cardTypeList = ref([])
+const signTypeList = ref([])
 // 请求
 onMounted(async () => {
   loading.value = true
@@ -177,6 +135,9 @@ const searchOther = async () => {
   // 证件类型
   result = await dictDataStore.query({ code: 'cardType', is_use: '0' })
   if ($checkRes(result)) cardTypeList.value = result.data
+  // 报名类型
+  result = await dictDataStore.query({ code: 'signType', is_use: '0' })
+  if ($checkRes(result)) signTypeList.value = result.data
 }
 // 字典数据转换
 const getDict = (data, model) => {
@@ -219,7 +180,7 @@ const submitForm = async (formEl) => {
   })
 }
 const toClose = () => {
-  form.value = {}
+  form.value = { project_file: [] }
   dialog.value = { show: false }
 }
 // 分页
@@ -231,6 +192,13 @@ const sizeChange = (limits) => {
   currentPage.value = 1
   search({ skip: 0, limit: limit })
 }
+// provide
+provide('form', form)
+provide('rules', rules)
+provide('ruleFormRef', ruleFormRef)
+provide('cardTypeList', cardTypeList)
+provide('signTypeList', signTypeList)
+provide('submitForm', submitForm)
 </script>
 <style scoped lang="scss">
 .main {

+ 78 - 17
src/views/detail/matchDetail.vue

@@ -38,14 +38,6 @@
               <div v-if="info.brief" v-html="info.brief"></div>
               <div v-else>暂无简介</div>
             </div>
-            <!-- 封面 -->
-            <!-- <div class="image">
-              <el-image class="images" :src="getUrl(info.file, 'array')" fit="fill">
-                <template v-slot:error>
-                  <el-image class="image" :src="match_3" fit="fill" />
-                </template>
-              </el-image>
-            </div> -->
             <div class="image" v-if="info.video">
               <template v-for="i in info.video" :key="i.uri">
                 <video :src="i.uri" style="width: 331px; height: 182px" muted="muted" autoplay="autoplay" loop></video>
@@ -131,11 +123,30 @@
             <div class="button" v-if="info.match_status == '1'" @click="toSign">活动报名</div>
           </div>
         </div>
+        <div class="info_3" v-if="info.match_status == '3' && signList.length > 0">
+          <div class="title">参演方信息</div>
+          <div class="list" v-for="i in signList" :key="i.id">
+            <el-card class="box-card">
+              <template v-slot:header>
+                <div class="clearfix">
+                  <span>{{ i.company || '暂无' }}</span>
+                  <el-button v-if="info.is_show == '1'" style="float: right; padding: 3px 0" type="text" @click="toChat(i)">获取联系方式</el-button>
+                </div>
+              </template>
+              <div class="box-content">
+                <div class="content_1"><span>路演名称:</span>{{ i.project_name || '暂无' }}</div>
+                <div class="content_1"><span>路演介绍:</span>{{ i.project_brief || '暂无' }}</div>
+                <div class="content_1" v-if="info.is_show == '0'"><span>联系方式:</span>{{ i.phone || '暂无' }}</div>
+              </div>
+            </el-card>
+          </div>
+        </div>
       </div>
     </el-col>
   </custom-layout>
   <el-dialog v-model="dialog" title="活动报名" :destroy-on-close="true" @close="toClose">
-    <data-form></data-form>
+    <form1 v-if="info.form != '3'"></form1>
+    <form2 v-else></form2>
   </el-dialog>
 </template>
 
@@ -144,7 +155,8 @@ import moment from 'moment'
 import { get, cloneDeep } from 'lodash-es'
 const $checkRes = inject('$checkRes')
 // 组件
-import dataForm from './parts/index.vue'
+import form1 from './parts/form-1.vue'
+import form2 from './parts/form-2.vue'
 import time from '/images/time.png'
 import { UserStore } from '@/store/user'
 const userStore = UserStore()
@@ -152,10 +164,12 @@ const user = computed(() => userStore.user)
 // 接口
 import { DictDataStore } from '@/store/api/system/dictData'
 import { MatchStore } from '@/store/api/platform/match'
+import { ContactApplyStore } from '@/store/api/user/contactApply'
 import { SignStore } from '@/store/api/platform/sign'
 const dictDataStore = DictDataStore()
 const store = MatchStore()
 const signStore = SignStore()
+const contactApplyStore = ContactApplyStore()
 
 // 收藏
 import { CollectionStore } from '@/store/api/platform/collection'
@@ -166,13 +180,17 @@ const loading = ref(false)
 // 路由
 const route = useRoute()
 const info = ref({})
+// 报名
+const signList = ref([])
 // 弹框
 const cardTypeList = ref([])
 const typeList = ref([])
 const statusList = ref([])
 const industryList = ref([])
+const signTypeList = ref([])
 const ruleFormRef = ref()
 const form = ref({})
+
 const validatePhoneNumber = (rule, value, callback) => {
   const reg = /^1[3-9]\d{9}$/
   if (!value) {
@@ -222,12 +240,21 @@ const searchOther = async () => {
   // 行业
   result = await dictDataStore.query({ code: 'matchIndustry', is_use: '0' })
   if ($checkRes(result)) industryList.value = result.data
+  // 报名类型
+  result = await dictDataStore.query({ code: 'signType', is_use: '0' })
+  if ($checkRes(result)) signTypeList.value = result.data
 }
 const search = async () => {
   let id = route.query.id
   if (id) {
     let res = await store.detail(id)
-    if (res.errcode == '0') info.value = res.data
+    if (res.errcode == '0') {
+      info.value = res.data
+      if (res.data.form == '3') {
+        const arr = await signStore.query({ match: res.data.id, status: '1', type: '1' })
+        if (arr.errcode == '0') signList.value = arr.data
+      }
+    }
   }
 }
 // 字典数据转换
@@ -250,12 +277,6 @@ const toClose = () => {
   dialog.value = false
   form.value = {}
 }
-const getUrl = (item, type) => {
-  if (item) {
-    if (type == 'array') return `${import.meta.env.VITE_APP_HOST}${get(item, '0.uri')}`
-    else return `${import.meta.env.VITE_APP_HOST}${get(item, 'uri')}`
-  }
-}
 // 报名
 const submitForm = async (formEl) => {
   if (!formEl) return
@@ -298,11 +319,32 @@ const toCollect = async () => {
     }
   } else ElMessage({ message: '未登录!', type: 'error' })
 }
+const toChat = (item) => {
+  if (user.value.id) {
+    ElMessageBox.confirm(`您确认要获取联系方式?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' })
+      .then(async () => {
+        let source_id = item.id
+        let source = 'sign'
+        let apply_user = user.value.id
+        const obj = { source_id, source, apply_user }
+        const res = await contactApplyStore.create(obj)
+        if (res.errcode == 0) {
+          ElMessage({ message: '申请联系方式等待消息通知', type: 'success' })
+        } else {
+          ElMessageBox.confirm(res.errmsg, '提示', { confirmButtonText: '确定', type: 'warning', showCancelButton: false, center: true })
+            .then(() => {})
+            .catch(() => {})
+        }
+      })
+      .catch(() => {})
+  } else ElMessage({ message: '未登录!', type: 'error' })
+}
 // provide
 provide('form', form)
 provide('rules', rules)
 provide('ruleFormRef', ruleFormRef)
 provide('cardTypeList', cardTypeList)
+provide('signTypeList', signTypeList)
 provide('submitForm', submitForm)
 </script>
 <style scoped lang="scss">
@@ -488,6 +530,25 @@ provide('submitForm', submitForm)
           border-radius: 4px;
         }
       }
+      .list {
+        margin: 20px 0 30px 0;
+        font-size: $global-font-size-20;
+        .box-card {
+          .clearfix {
+            span {
+              font-weight: bold;
+            }
+          }
+          .box-content {
+            .content_1 {
+              margin: 5px 0 15px 0;
+              span {
+                color: #666;
+              }
+            }
+          }
+        }
+      }
     }
   }
   :deep(table) {

+ 75 - 0
src/views/detail/parts/form-1.vue

@@ -0,0 +1,75 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-form label-position="top" ref="ruleFormRef" :model="form" :rules="rules" label-width="80px" class="form">
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="姓名" prop="name">
+                  <el-input size="large" clearable v-model="form.name" placeholder="请输入姓名"> </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="电话号" prop="phone">
+                  <el-input size="large" clearable v-model="form.phone" placeholder="请输入电话号"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="证件类型" prop="cardType">
+                  <el-select clearable v-model="form.cardType" placeholder="请选择证件类型">
+                    <el-option v-for="(item, index) in cardTypeList" :key="index" :label="item.label" :value="item.value" />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="证件号码" prop="card">
+                  <el-input size="large" clearable v-model="form.card" placeholder="请输入证件号码"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="微信/QQ" prop="communication">
+                  <el-input size="large" clearable v-model="form.communication" placeholder="请输入微信/QQ"> </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="电子邮箱" prop="email">
+                  <el-input size="large" clearable v-model="form.email" placeholder="请输入电子邮箱"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-form-item label="备注" prop="brief">
+              <el-input size="large" v-model="form.remark" :autosize="{ minRows: 2, maxRows: 8 }" type="textarea" placeholder="请输入备注" />
+            </el-form-item>
+            <el-form-item>
+              <el-col :span="24" class="button">
+                <el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button>
+              </el-col>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+const ruleFormRef = inject('ruleFormRef')
+const form = inject('form')
+const rules = inject('rules')
+const cardTypeList = inject('cardTypeList')
+const submitForm = inject('submitForm')
+</script>
+<style scoped lang="scss">
+.main {
+  .one {
+    .button {
+      text-align: center;
+    }
+  }
+}
+</style>

+ 117 - 0
src/views/detail/parts/form-2.vue

@@ -0,0 +1,117 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-form label-position="top" ref="ruleFormRef" :model="form" :rules="rules" label-width="80px" class="form">
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="姓名" prop="name">
+                  <el-input size="large" clearable v-model="form.name" placeholder="请输入姓名"> </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="联系电话" prop="phone">
+                  <el-input size="large" clearable v-model="form.phone" placeholder="请输入联系电话"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="报名类型" prop="type">
+                  <el-select size="large" clearable v-model="form.type" placeholder="请选择报名类型" @change="toChang">
+                    <el-option v-for="(item, index) in signTypeList" :key="index" :label="item.label" :value="item.value" />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="公司" prop="company">
+                  <el-select size="large" clearable v-model="form.company" allow-create filterable remote reserve-keyword placeholder="请输入公司名称" :remote-method="remoteMethod" :loading="loading">
+                    <el-option v-for="item in companyList" :key="item.id" :label="item.name" :value="item.name" />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row :gutter="20" v-if="form.type == '1'">
+              <el-col :span="12">
+                <el-form-item label="路演名称" prop="project_name" :rules="form.type == 1 ? { required: true, message: '请输入路演名称', trigger: ['blur', 'change'] } : {}">
+                  <el-input size="large" clearable v-model="form.project_name" placeholder="请输入路演名称"> </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="路演介绍" prop="project_brief" :rules="form.type == 1 ? { required: true, message: '请输入路演介绍', trigger: ['blur', 'change'] } : {}">
+                  <el-input size="large" clearable v-model="form.project_brief" placeholder="请输入路演介绍" :autosize="{ minRows: 2, maxRows: 8 }" type="textarea"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-form-item label="路演附件" prop="project_file" v-if="form.type == '1'" :rules="form.type == 1 ? { required: true, message: '请上传路演附件', trigger: ['blur', 'change'] } : {}">
+              <custom-upload model="project_file" :list="form.project_file" :limit="4" url="/files/web/cxyy_sign/upload" @change="onUpload"></custom-upload>
+            </el-form-item>
+            <el-form-item>
+              <el-col :span="24" class="button">
+                <el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button>
+              </el-col>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+// 接口
+import { CompanyStore } from '@/store/api/user/company'
+const companyStore = CompanyStore()
+// 加载中
+const loading = ref(false)
+const ruleFormRef = inject('ruleFormRef')
+const form = inject('form')
+const validatePhoneNumber = (rule, value, callback) => {
+  const reg = /^1[3-9]\d{9}$/
+  if (!value) {
+    return callback(new Error('手机号不能为空'))
+  }
+  if (!reg.test(value)) {
+    return callback(new Error('请输入正确的手机号'))
+  }
+  callback()
+}
+const rules = reactive({
+  name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+  type: [{ required: true, message: '请选择报名类型', trigger: 'blur' }],
+  phone: [{ required: true, validator: validatePhoneNumber, trigger: 'blur' }],
+  company: [{ required: true, message: '请输入公司名称', trigger: 'blur' }]
+})
+const signTypeList = inject('signTypeList')
+const submitForm = inject('submitForm')
+
+const companyList = ref([])
+// 上传图片
+const onUpload = (e) => {
+  const { model, value } = e
+  form.value[model] = value
+}
+const remoteMethod = (query) => {
+  if (query) {
+    loading.value = true
+    setTimeout(async () => {
+      loading.value = false
+      const info = { status: '1', name: query }
+      const res = await companyStore.query(info)
+      if (res.errcode == '0') companyList.value = res.data
+    }, 200)
+  } else {
+    companyList.value = []
+  }
+}
+</script>
+<style scoped lang="scss">
+.main {
+  .one {
+    .button {
+      text-align: center;
+    }
+  }
+}
+</style>

+ 1 - 0
src/views/five/index.vue

@@ -10,6 +10,7 @@
                 <el-tab-pane label="大奖赛" name="0"></el-tab-pane>
                 <el-tab-pane label="经典赛" name="1"></el-tab-pane>
                 <el-tab-pane label="训练赛" name="2"></el-tab-pane>
+                <el-tab-pane label="活动路演" name="3"></el-tab-pane>
               </el-tabs>
             </el-col>
             <el-col :span="12" class="oneRight">

+ 7 - 2
src/views/two/add/match.vue

@@ -14,6 +14,9 @@
               <template #is_use>
                 <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
               </template>
+              <template #is_show>
+                <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
+              </template>
               <template #industry>
                 <el-option v-for="i in industryList" :key="i.id" :label="i.label" :value="i.value"></el-option>
               </template>
@@ -166,6 +169,7 @@ const form = ref({ time: [], rules: {} })
 const oneformFields = ref([
   { label: '封面', model: 'file', custom: true },
   { label: '赛事名称', model: 'name' },
+  { label: '类别', model: 'form', type: 'select' },
   { label: '标签', model: 'tags', custom: true },
   { label: '类型', model: 'type', type: 'select' },
   { label: '赛事规模', model: 'scale', type: 'radio' },
@@ -173,12 +177,13 @@ const oneformFields = ref([
   { label: '路由', model: 'href', display: () => form.value.match_type == '1' },
   { label: '组织单位', model: 'work' },
   { label: '行业', model: 'industry', type: 'select' },
-  { label: '类别', model: 'form', type: 'select' },
   { label: '奖金(万元)', model: 'money' },
   { label: '有效期', model: 'time', type: 'datetimerange' },
   { label: '是否启用', model: 'is_use', type: 'radio' },
+  { label: '是否公开路演人信息', model: 'is_show', type: 'radio' },
   { label: '视频', model: 'video', custom: true },
-  { label: '地址', model: 'address', type: 'textarea' }
+  { label: '地址', model: 'address', type: 'textarea' },
+  { label: '备注', model: 'remark', type: 'textarea', display: () => form.value.form == '3' }
 ])
 const twoformFields = ref([
   { model: 'rules', custom: true },