index.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <template>
  2. <div id="index">
  3. <el-row>
  4. <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
  5. <div class="w_1200 one">
  6. <demand v-show="routeType == 'demand'"></demand>
  7. <project v-show="routeType == 'project'"></project>
  8. <match v-show="routeType == 'match'"></match>
  9. <achievement v-show="routeType == 'achievement'"></achievement>
  10. </div>
  11. </el-col>
  12. </el-row>
  13. </div>
  14. </template>
  15. <script setup>
  16. const $checkRes = inject('$checkRes')
  17. import { cloneDeep, get } from 'lodash-es'
  18. const route = useRoute()
  19. import { UserStore } from '@/store/user'
  20. const userStore = UserStore()
  21. const user = computed(() => userStore.user)
  22. // 接口
  23. import { AchievementStore } from '@/store/api/platform/achievement'
  24. import { DemandStore } from '@/store/api/platform/demand'
  25. import { ProjectStore } from '@/store/api/platform/project'
  26. import { MatchStore } from '@/store/api/platform/match'
  27. import { DictDataStore } from '@/store/api/system/dictData'
  28. const achieveStore = AchievementStore()
  29. const demandStore = DemandStore()
  30. const projectStore = ProjectStore()
  31. const matchStore = MatchStore()
  32. const dictDataStore = DictDataStore()
  33. // 组件
  34. import demand from './parts/demand.vue'
  35. import project from './parts/project.vue'
  36. import match from './parts/match.vue'
  37. import achievement from './parts/achievement.vue'
  38. // 加载中
  39. const loading = ref(false)
  40. // 路由
  41. const router = useRouter()
  42. // 显示类型
  43. const type = ref('0')
  44. const routeType = ref('0')
  45. const form = ref({})
  46. // 字典表
  47. const fieldList = ref([])
  48. const statusList = ref([])
  49. const matchList = ref([])
  50. const typeList = ref([
  51. { value: '0', label: '供给' },
  52. { value: '1', label: '需求' }
  53. ])
  54. //
  55. const fields = ref([])
  56. // 列表
  57. const list = ref([])
  58. let skip = 0
  59. let limit = inject('limit')
  60. const total = ref(0)
  61. const currentPage = ref(1)
  62. // 请求
  63. onMounted(async () => {
  64. loading.value = true
  65. await searchOther()
  66. await searchField()
  67. loading.value = false
  68. })
  69. const searchField = async () => {
  70. routeType.value = route.query.type
  71. if (routeType.value == 'achievement') {
  72. fields.value = [
  73. { label: '成果名称', model: 'name', type: 'name' },
  74. { label: '技术领域:', model: 'field', type: 'dict' },
  75. { label: '成果地区:', model: 'area', type: 'area' },
  76. { label: '审核状态:', model: 'status', type: 'dict' }
  77. ]
  78. } else if (routeType.value == 'demand') {
  79. fields.value = [
  80. { label: '需求名称', model: 'name', type: 'name' },
  81. { label: '技术领域:', model: 'field', type: 'dict' },
  82. { label: '类型:', model: 'type', type: 'dict' },
  83. { label: '需求地区:', model: 'area', type: 'area' },
  84. { label: '审核状态:', model: 'status', type: 'dict' }
  85. ]
  86. } else if (routeType.value == 'project') {
  87. fields.value = [
  88. { label: '项目名称', model: 'name', type: 'name' },
  89. { label: '技术领域:', model: 'field', type: 'dict' },
  90. { label: '发布时间:', model: 'time' },
  91. { label: '审核状态:', model: 'status', type: 'dict' }
  92. ]
  93. } else if (routeType.value == 'match') {
  94. fields.value = [
  95. { label: '比赛名称', model: 'name', type: 'name' },
  96. { label: '比赛金额:', model: 'money' },
  97. { label: '比赛日期:', model: 'time', type: 'time' },
  98. { label: '赛事状态:', model: 'match_status', type: 'dict' },
  99. { label: '审核状态:', model: 'status', type: 'dict' }
  100. ]
  101. }
  102. await search({ skip, limit })
  103. }
  104. const search = async (query = { skip: 0, limit }) => {
  105. const info = {
  106. skip: query.skip,
  107. limit: query.limit,
  108. user: user.value._id
  109. }
  110. let res
  111. if (routeType.value == 'achievement') res = await achieveStore.query(info)
  112. else if (routeType.value == 'demand') res = await demandStore.query(info)
  113. else if (routeType.value == 'project') res = await projectStore.query(info)
  114. else if (routeType.value == 'match') res = await matchStore.query(info)
  115. if (res.errcode == '0') {
  116. list.value = res.data
  117. total.value = res.total
  118. }
  119. }
  120. const searchOther = async () => {
  121. let result
  122. // 技术领域
  123. result = await dictDataStore.query({ code: 'field', is_use: '0' })
  124. if ($checkRes(result)) fieldList.value = result.data
  125. // 状态
  126. result = await dictDataStore.query({ code: 'examStatus', is_use: '0' })
  127. if ($checkRes(result)) statusList.value = result.data
  128. // 赛事状态
  129. result = await dictDataStore.query({ code: 'matchStatus', is_use: '0' })
  130. if ($checkRes(result)) matchList.value = result.data
  131. }
  132. // 字典数据转换
  133. const getDict = (data, model) => {
  134. let res
  135. if (model == 'field') res = fieldList.value.find((f) => f.value == data)
  136. if (model == 'status') res = statusList.value.find((f) => f.value == data)
  137. if (model == 'type') res = typeList.value.find((f) => f.value == data)
  138. if (model == 'match_status') res = matchList.value.find((f) => f.value == data)
  139. return get(res, 'label')
  140. }
  141. // 地区显示
  142. const getArea = (data) => {
  143. if (data) return data.join(',')
  144. else return '暂无'
  145. }
  146. // 时间
  147. const getTime = (data) => {
  148. if (data) return `${data[0]} - ${data[1]}`
  149. else return '暂无'
  150. }
  151. const toCommon = (data) => {
  152. if (routeType.value == 'match') form.value = { file: [], rules: {} }
  153. else form.value = {}
  154. type.value = data
  155. }
  156. // 查看
  157. const toView = (item) => {
  158. let path
  159. if (routeType.value == 'achievement') path = '/achievement/detail'
  160. else if (routeType.value == 'demand') path = '/demand/detail'
  161. else if (routeType.value == 'project') path = '/project/detail'
  162. else if (routeType.value == 'match') path = '/innovation/detail'
  163. router.push({ path, query: { id: item.id || item._id } })
  164. }
  165. // 修改
  166. const toEdit = (item) => {
  167. form.value = item
  168. type.value = '1'
  169. }
  170. // 保存
  171. const submitForm = async (formEl) => {
  172. if (!formEl) return
  173. await formEl.validate(async (valid, fields) => {
  174. if (valid) {
  175. const data = cloneDeep(form.value)
  176. const other = { status: '0', user: user.value._id }
  177. let res
  178. if (get(data, '_id')) {
  179. if (routeType.value == 'achievement') res = await achieveStore.update({ ...data, ...other })
  180. else if (routeType.value == 'demand') res = await demandStore.update({ ...data, ...other })
  181. else if (routeType.value == 'project')
  182. res = await projectStore.update({ ...data, ...other })
  183. else if (routeType.value == 'match') res = await matchStore.update({ ...data, ...other })
  184. } else {
  185. if (routeType.value == 'achievement') res = await achieveStore.create({ ...data, ...other })
  186. else if (routeType.value == 'demand') res = await demandStore.create({ ...data, ...other })
  187. else if (routeType.value == 'project')
  188. res = await projectStore.create({ ...data, ...other })
  189. else if (routeType.value == 'match') res = await matchStore.create({ ...data, ...other })
  190. }
  191. if ($checkRes(res, true)) {
  192. type.value = '0'
  193. list.value = []
  194. searchField()
  195. search({ skip: 0, limit })
  196. }
  197. } else {
  198. console.log('error submit!', fields)
  199. }
  200. })
  201. }
  202. // 分页
  203. const changePage = (page = currentPage.value) => {
  204. search({ skip: (page - 1) * limit, limit: limit })
  205. }
  206. const sizeChange = (limits) => {
  207. limit = limits
  208. currentPage.value = 1
  209. search({ skip: 0, limit: limit })
  210. }
  211. watch(
  212. route,
  213. (newVal) => {
  214. if (newVal) {
  215. type.value = '0'
  216. list.value = []
  217. searchField()
  218. }
  219. },
  220. {
  221. immediate: true //初始化立即执行
  222. }
  223. )
  224. // provide
  225. provide('form', form)
  226. provide('type', type)
  227. provide('toCommon', toCommon)
  228. provide('submitForm', submitForm)
  229. provide('fields', fields)
  230. provide('list', list)
  231. provide('toView', toView)
  232. provide('toEdit', toEdit)
  233. provide('getArea', getArea)
  234. provide('getTime', getTime)
  235. provide('getDict', getDict)
  236. provide('limit', limit)
  237. provide('total', total)
  238. provide('currentPage', currentPage)
  239. provide('sizeChange', sizeChange)
  240. provide('changePage', changePage)
  241. </script>
  242. <style scoped lang="scss">
  243. .main {
  244. background-color: #f1f2f5;
  245. padding: 10px;
  246. min-height: 77vh;
  247. }
  248. </style>