index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <template>
  2. <div id="index">
  3. <el-row>
  4. <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
  5. <el-col :span="24" class="one">
  6. <custom-form v-model="form" :fields="fields" :rules="rules" @save="toSave">
  7. <template #agreement>
  8. <WangEditor v-model="form.agreement" />
  9. </template>
  10. <template #brief>
  11. <WangEditor v-model="form.brief" />
  12. </template>
  13. <template #logoUrl>
  14. <custom-upload model="logoUrl" :list="form.logoUrl" :limit="1" listType="picture-card" url="/files/web/cxyy_design/upload" @change="onUpload"></custom-upload>
  15. </template>
  16. <template #carouselUrl>
  17. <custom-upload model="carouselUrl" :list="form.carouselUrl" :limit="6" :showList="false" url="/files/web/cxyy_design/upload" @change="onUpload"></custom-upload>
  18. <el-table :data="form.carouselUrl">
  19. <el-table-column align="center" label="轮播图片">
  20. <template #default="{ row }">
  21. <template v-if="row.uri">
  22. <el-image :src="row.uri" fit="contain" width="200px" height="200px"></el-image>
  23. </template>
  24. </template>
  25. </el-table-column>
  26. <el-table-column align="center" label="跳转地址">
  27. <template #default="{ row }">
  28. <el-input v-model="row.to" placeholder="跳转地址"></el-input>
  29. </template>
  30. </el-table-column>
  31. <el-table-column align="center" label="操作">
  32. <template #default="{ row }">
  33. <el-button type="danger" text @click="toDeleteCarousel(row)">删除</el-button>
  34. </template>
  35. </el-table-column>
  36. </el-table>
  37. </template>
  38. <!-- <template #friend>
  39. <el-col :span="24" class="tables">
  40. <el-col :span="24" class="tables_1">
  41. <el-button type="primary" @click="addFriend()">添加</el-button>
  42. </el-col>
  43. <el-col :span="24">
  44. <el-table :data="form.friend" border>
  45. <el-table-column type="index" label="序号" width="80" align="center"> </el-table-column>
  46. <el-table-column prop="url" label="图片" align="center">
  47. <template #default="scope">
  48. <custom-upload
  49. model="url"
  50. :list="scope.row.url"
  51. :limit="1"
  52. listType="picture-card"
  53. url="/files/web/cxyy_design/upload"
  54. @change="onFriendUpload($event, scope.row)"
  55. ></custom-upload>
  56. </template>
  57. </el-table-column>
  58. <el-table-column prop="name" label="名称" align="center">
  59. <template #default="scope">
  60. <el-input v-model="scope.row.name" placeholder="请输入名称" />
  61. </template>
  62. </el-table-column>
  63. <el-table-column prop="href" label="跳转网址" align="center">
  64. <template #default="scope">
  65. <el-input v-model="scope.row.href" placeholder="请输入跳转网址" />
  66. </template>
  67. </el-table-column>
  68. <el-table-column label="操作" align="center" width="100">
  69. <template #default="scope">
  70. <el-button type="danger" @click="delFriend(scope.row)">删除</el-button>
  71. </template>
  72. </el-table-column>
  73. </el-table>
  74. </el-col>
  75. </el-col>
  76. </template> -->
  77. <template #friendship>
  78. <el-col :span="24" class="tables">
  79. <el-col :span="24" class="tables_1">
  80. <el-button type="primary" @click="addFriendship()">添加</el-button>
  81. </el-col>
  82. <el-col :span="24">
  83. <el-table :data="form.friendship" border>
  84. <el-table-column type="index" label="序号" width="80" align="center"> </el-table-column>
  85. <el-table-column prop="name" label="名称" align="center">
  86. <template #default="scope">
  87. <el-input v-model="scope.row.name" placeholder="请输入名称" />
  88. </template>
  89. </el-table-column>
  90. <el-table-column prop="type" label="类型" align="center">
  91. <template #default="scope">
  92. <el-select v-model="scope.row.type" placeholder="请选择类型">
  93. <el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value" />
  94. </el-select>
  95. </template>
  96. </el-table-column>
  97. <el-table-column prop="href" label="跳转网址" align="center">
  98. <template #default="scope">
  99. <el-input v-model="scope.row.href" placeholder="请输入跳转网址" />
  100. </template>
  101. </el-table-column>
  102. <el-table-column label="操作" align="center" width="100">
  103. <template #default="scope">
  104. <el-button type="danger" @click="delFriendship(scope.row)">删除</el-button>
  105. </template>
  106. </el-table-column>
  107. </el-table>
  108. </el-col>
  109. </el-col>
  110. </template>
  111. <template #footInfo>
  112. <div class="footInfo">
  113. <custom-form v-model="form.footInfo" :fields="footFields" :rules="footRules" :useSave="false">
  114. <template #Logo>
  115. <custom-upload model="Logo" :list="form.footInfo.Logo" listType="picture-card" :limit="1" url="/files/web/cxyy_design/upload" @change="onFUpload"></custom-upload>
  116. </template>
  117. <template #Code>
  118. <custom-upload model="Code" :list="form.footInfo.Code" listType="picture-card" :limit="1" url="/files/web/cxyy_design/upload" @change="onFUpload"></custom-upload>
  119. </template>
  120. </custom-form>
  121. </div>
  122. </template>
  123. </custom-form>
  124. </el-col>
  125. </el-col>
  126. </el-row>
  127. </div>
  128. </template>
  129. <script setup>
  130. import moment from 'moment'
  131. import { cloneDeep, get } from 'lodash-es'
  132. import { DesignStore } from '@/store/api/platform/design'
  133. const store = DesignStore()
  134. const $checkRes = inject('$checkRes')
  135. // 加载中
  136. const loading = ref(false)
  137. // 表单
  138. const form = ref({ footInfo: {} })
  139. const fields = ref([
  140. { label: '标题', model: 'zhTitle' },
  141. { label: 'logo', model: 'logoUrl', custom: true },
  142. { label: '轮播图', model: 'carouselUrl', custom: true },
  143. // { label: '合作伙伴', model: 'friend', custom: true },
  144. { label: '友情连接', model: 'friendship', custom: true },
  145. { label: '网站底部信息', model: 'footInfo', custom: true },
  146. { label: '使用协议', model: 'agreement', custom: true },
  147. { label: '关于我们', model: 'brief', custom: true }
  148. ])
  149. const rules = ref({
  150. zhTitle: [{ required: true, message: '请输入标题' }],
  151. agreement: [{ required: true, message: '请输入使用协议' }],
  152. logoUrl: [{ required: false, message: '请上传logo图片' }]
  153. })
  154. const footFields = ref([
  155. { label: 'LOGO图片', model: 'Logo', custom: true },
  156. { label: '联系电话', model: 'Phone' },
  157. { label: '电子邮箱', model: 'Email' },
  158. { label: '地址', model: 'Address' },
  159. { label: '底部导航', model: 'Copyright' },
  160. { label: '公司', model: 'Company' },
  161. { label: '二维码图片', model: 'Code', custom: true }
  162. ])
  163. const footRules = ref({
  164. Phone: [{ required: true, message: '请输入联系电话' }],
  165. Email: [{ required: true, message: '请输入电子邮箱' }],
  166. Address: [{ required: true, message: '请输入地址' }],
  167. Copyright: [{ required: true, message: '请输入底部导航' }],
  168. Company: [{ required: true, message: '请输入公司' }],
  169. Code: [{ required: true, message: '请上传二维码图片' }]
  170. })
  171. const typeList = ref([
  172. { value: '热门高校', label: '热门高校' },
  173. { value: '政府部门', label: '政府部门' },
  174. { value: '科研机构', label: '科研机构' }
  175. ])
  176. // 请求
  177. onMounted(async () => {
  178. loading.value = true
  179. await search()
  180. loading.value = false
  181. })
  182. const search = async () => {
  183. const res = await store.query()
  184. if (res.errcode == '0') {
  185. form.value = res.data[0] || { footInfo: {} }
  186. }
  187. }
  188. // 提交保存
  189. const toSave = async () => {
  190. const data = cloneDeep(form.value)
  191. let res
  192. if (get(data, 'id')) res = await store.update(data)
  193. else res = await store.create(data)
  194. if ($checkRes(res, true)) search()
  195. }
  196. // 上传图片
  197. const onUpload = (e) => {
  198. const { model, value } = e
  199. form.value[model] = value
  200. }
  201. // 上传图片
  202. const onFUpload = (e) => {
  203. const { model, value } = e
  204. form.value.footInfo[model] = value
  205. }
  206. // // 上传图片
  207. // const onFriendUpload = (e, data) => {
  208. // const { model, value } = e
  209. // data[model] = value
  210. // }
  211. // // 合作伙伴添加
  212. // const addFriend = () => {
  213. // let friend = form.value.friend || []
  214. // friend.push({ id: moment().valueOf(), url: [], name: '', href: '' })
  215. // form.value.friend = friend
  216. // }
  217. // // 合作伙伴删除
  218. // const delFriend = (e) => {
  219. // let friend = form.value.friend.filter((i) => i.id != e.id)
  220. // form.value.friend = friend
  221. // }
  222. // 友情连接添加
  223. const addFriendship = () => {
  224. let friendship = form.value.friendship || []
  225. friendship.push({ id: moment().valueOf(), name: '', type: '', href: '' })
  226. form.value.friendship = friendship
  227. }
  228. // 友情连接删除
  229. const delFriendship = (e) => {
  230. let friendship = form.value.friendship.filter((i) => i.id != e.id)
  231. form.value.friendship = friendship
  232. }
  233. const toDeleteCarousel = (data) => {
  234. const key = 'uri'
  235. const index = form.value.carouselUrl.findIndex((f) => f[key] === data[key])
  236. console.log(index)
  237. if (index >= 0) form.value.carouselUrl.splice(index, 1)
  238. }
  239. </script>
  240. <style scoped lang="scss">
  241. .tables {
  242. .tables_1 {
  243. margin: 0 0 10px 0;
  244. }
  245. }
  246. .footInfo {
  247. width: 100%;
  248. border: 1px solid #dcdfe6;
  249. padding: 10px;
  250. border-radius: 5px;
  251. :deep(.el-form-item) {
  252. margin-bottom: 18px !important;
  253. }
  254. :deep(.el-form-item__label-wrap) {
  255. margin-left: 0 !important;
  256. }
  257. }
  258. </style>