index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. <!-- -->
  2. <template>
  3. <div v-loading.fullscreen.lock="loading"
  4. element-loading-text="拼命加载中"
  5. element-loading-spinner="el-icon-loading"
  6. element-loading-background="rgba(0, 0, 0, 0.8)">
  7. <main-top :crumb="crumbData"></main-top>
  8. <div class="table-interface">
  9. <div class="top-body">
  10. <el-form ref="form" :model="form" label-width="100px">
  11. <el-form-item label="资讯名称:" style="width:318px;">
  12. <el-input v-model="form.name"></el-input>
  13. </el-form-item>
  14. <el-form-item label="资讯类型:">
  15. <el-select v-model="form.type" placeholder="请选择资讯类型">
  16. <el-option label="海报轮播" :value="0"></el-option>
  17. <el-option label="视频轮播" :value="1"></el-option>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="轮播时间:" style="width:518px;">
  21. <el-date-picker
  22. v-model="form.date"
  23. type="daterange"
  24. @change="handleChange"
  25. value-format="timestamp"
  26. range-separator="-"
  27. start-placeholder="开始日期"
  28. end-placeholder="结束日期"
  29. >
  30. </el-date-picker>
  31. </el-form-item>
  32. <el-form-item label="资讯说明:">
  33. <vue-editor v-model="form.description" />
  34. </el-form-item>
  35. <template v-if="form.type === 0">
  36. <el-form-item label="轮播板式:">
  37. <el-radio-group v-model="form.contentNum" @change="handleRadio">
  38. <el-radio v-for="(item,i) in banshi" :key="i" :label="item.size">{{item.size}}</el-radio>
  39. </el-radio-group>
  40. <div class="banshi">
  41. <draggable v-model="uploadList" group="people" @start="drag=true" @end="drag=false">
  42. <div v-for="(element,i) in radioActive.arr" :key="i">
  43. <img v-if="uploadList[i]" :src="$serverName.replace('/zhoushan','') + uploadList[i]" alt="">
  44. </div>
  45. </draggable>
  46. </div>
  47. <el-upload
  48. class="upload-demo"
  49. drag
  50. :on-success="upload_success"
  51. :action='uploadUrl'
  52. :headers="{
  53. token,
  54. }"
  55. :limit="form.contentNum"
  56. :on-exceed="handleExceed"
  57. :before-upload="beforeUpload"
  58. multiple
  59. :show-file-list="false"
  60. >
  61. <div>
  62. <i class="el-icon-upload"></i>
  63. <div class="el-upload__text">
  64. 将文件拖到此处,或<em>点击上传</em>
  65. </div>
  66. </div>
  67. <div class="el-upload__tip" slot="tip">
  68. 支持扩展名:.jpg, .jpgc, .png
  69. </div>
  70. </el-upload>
  71. <div class="el-upload__tip">*海报规定尺寸: {{radioActive.dec}}</div>
  72. </el-form-item>
  73. </template>
  74. <template v-if="form.type === 1">
  75. <el-form-item label="轮播内容:">
  76. <el-upload
  77. class="upload-demo"
  78. drag
  79. :on-success="upload_success"
  80. :action='uploadUrl'
  81. :before-upload="beforeUpload"
  82. :headers="{
  83. token,
  84. }"
  85. multiple
  86. >
  87. <img
  88. style="width:100%"
  89. v-if="form.contentUrl"
  90. :src="form.contentUrl"
  91. alt=""
  92. />
  93. <div v-else>
  94. <i class="el-icon-upload"></i>
  95. <div class="el-upload__text">
  96. 将文件拖到此处,或<em>点击上传</em>
  97. </div>
  98. </div>
  99. <div class="el-upload__tip" slot="tip">
  100. 支持扩展名:.wma, .rmvb, .rm, .flash, .mp4
  101. </div>
  102. </el-upload>
  103. </el-form-item>
  104. </template>
  105. <el-form-item label="展示顺序:">
  106. <el-input-number
  107. v-model="form.orderNum"
  108. :min="1"
  109. :max="1000"
  110. label="展示顺序"
  111. ></el-input-number>
  112. </el-form-item>
  113. <el-form-item label="是否启用:">
  114. <el-radio-group v-model="form.state">
  115. <el-radio :label="0">是</el-radio>
  116. <el-radio :label="1">否</el-radio>
  117. </el-radio-group>
  118. </el-form-item>
  119. <el-form-item label="预览效果:">
  120. <el-button @click="dialogTableVisible = true">点击查看</el-button>
  121. </el-form-item>
  122. <el-form-item>
  123. <el-button type="primary" @click="onSubmit">发布</el-button>
  124. <el-button @click="$router.back()">取消</el-button>
  125. </el-form-item>
  126. </el-form>
  127. </div>
  128. <el-dialog title="预览效果" :visible.sync="dialogTableVisible">
  129. <video
  130. controls="controls"
  131. v-if="form.type === 1"
  132. autoplay
  133. :src="$serverName.replace('/zhoushan','') + form.contentUrl"
  134. style="width:100%"
  135. ></video>
  136. <div class="showImg" v-else>
  137. <div v-for="(item,i) in uploadList" :key="i">
  138. <img :src="$serverName.replace('/zhoushan','') + item" alt="">
  139. </div>
  140. </div>
  141. </el-dialog>
  142. </div>
  143. </div>
  144. </template>
  145. <script>
  146. // 这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  147. // 例如:import 《组件名称》 from '《组件路径》';
  148. import MainTop from '@/components/main-top'
  149. import { VueEditor } from 'vue2-editor'
  150. import draggable from 'vuedraggable'
  151. let urlType = {
  152. 0: '/information/addInformation',
  153. 1: '/information/updateInformation'
  154. }
  155. let banshi = [{
  156. size: 1,
  157. dec: '8640*1920'
  158. }, {
  159. size: 2,
  160. dec: '4320*1920'
  161. }, {
  162. size: 4,
  163. dec: '2160*1920'
  164. }, {
  165. size: 6,
  166. dec: '1440*1920'
  167. }, {
  168. size: 8,
  169. dec: '1080*1920'
  170. }]
  171. export default {
  172. // import引入的组件需要注入到对象中才能使用
  173. components: {
  174. MainTop,
  175. VueEditor,
  176. draggable
  177. },
  178. data () {
  179. let crumbData = [
  180. {
  181. name: '资讯管理',
  182. id: 0
  183. },
  184. {
  185. name: this.$route.params.type ? '编辑资讯' : '发布资讯',
  186. id: 0
  187. }
  188. ]
  189. return {
  190. mediatype: '',
  191. crumbData,
  192. content: '<h1>Some initial content</h1>',
  193. banshi,
  194. loading: false,
  195. form: {
  196. name: '',
  197. type: 0,
  198. startTime: '',
  199. endTime: '',
  200. date: [],
  201. description: '',
  202. contentUrl: '',
  203. orderNum: 1,
  204. state: 0,
  205. id: '',
  206. contentNum: 4
  207. },
  208. dialogTableVisible: false,
  209. type: this.$route.params.type,
  210. radioActive: [],
  211. uploadUrl: `${this.$serverName}/exhibition/upload`,
  212. token: window.localStorage.getItem('token'),
  213. uploadList: []
  214. }
  215. },
  216. watch: {
  217. 'form.contentUrl': {
  218. immediate: true,
  219. handler: function () {
  220. this.mediatype = this.getType()
  221. }
  222. },
  223. 'form.contentNum': {
  224. immediate: true,
  225. handler: function (newVal) {
  226. let tmp = banshi.filter(item => item.size === newVal) || ''
  227. this.radioActive = {
  228. dec: tmp[0].dec,
  229. arr: new Array(tmp[0].size)
  230. }
  231. this.uploadList = []
  232. }
  233. }
  234. },
  235. methods: {
  236. handleRadio (type) {
  237. console.log(type)
  238. },
  239. getType () {
  240. if (!this.form.contentUrl) {
  241. return null
  242. }
  243. let type = this.form.contentUrl.split('.')
  244. type = type[type.length - 1]
  245. var a = [
  246. 'cd',
  247. 'ogg',
  248. 'mp3',
  249. 'asf',
  250. 'wma',
  251. 'wav',
  252. 'mp3pro',
  253. 'rm',
  254. 'real',
  255. 'ape',
  256. 'module',
  257. 'midi',
  258. 'vqf'
  259. ]
  260. var v = ['jpg', 'jpgc', 'png']
  261. var m = ['wma', 'rmvb', 'rm', 'flash', 'mp4']
  262. for (var i in a) {
  263. if (a[i] === type.toLowerCase()) return 'audio'
  264. } // 音频
  265. for (var j in v) {
  266. if (v[j] === type.toLowerCase()) return 'picture'
  267. } // 图片
  268. for (var k in m) {
  269. if (m[k] === type.toLowerCase()) return 'video'
  270. } // 图片
  271. return null
  272. },
  273. onSubmit () {
  274. let {
  275. type,
  276. id,
  277. name,
  278. contentUrl,
  279. orderNum,
  280. state,
  281. startTime,
  282. endTime,
  283. description,
  284. contentNum
  285. } = this.form
  286. if (type === 0) {
  287. contentUrl = this.uploadList
  288. }
  289. let data = {
  290. name,
  291. type: Number(type),
  292. contentUrl,
  293. orderNum,
  294. contentNum,
  295. state,
  296. startTime,
  297. endTime,
  298. description
  299. }
  300. if (this.type) {
  301. data['id'] = id
  302. }
  303. this.$http.post(urlType[this.type], data).then(res => {
  304. if (res.code === 0) {
  305. this.$alert('操作成功', '提示', {
  306. confirmButtonText: '确定',
  307. callback: action => {
  308. this.$router.back()
  309. }
  310. })
  311. } else {
  312. this.$notify.error({
  313. title: '错误',
  314. message: res.message
  315. })
  316. }
  317. })
  318. },
  319. handleChange (data) {
  320. this.form.startTime = data[0]
  321. this.form.endTime = data[1]
  322. },
  323. handleExceed (files, fileList) {
  324. this.$message.warning(`当前限制选择 ${this.radio} 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)
  325. },
  326. beforeUpload () {
  327. this.loading = true
  328. },
  329. upload_success (data) {
  330. this.loading = false
  331. if (this.form.type === 0) {
  332. this.uploadList.push(data.data)
  333. } else {
  334. this.form.contentUrl = data.data
  335. }
  336. }
  337. },
  338. mounted () {
  339. if (this.type) {
  340. let info = window.localStorage.getItem('editInfo')
  341. if (info) {
  342. this.form = JSON.parse(info)
  343. this.form.state = Number(this.form.state || 0)
  344. this.form.date = [
  345. Number(this.form.startTime),
  346. Number(this.form.endTime)
  347. ]
  348. setTimeout(() => {
  349. this.uploadList = this.form.contentUrl ? JSON.parse(this.form.contentUrl) : []
  350. })
  351. }
  352. }
  353. }
  354. }
  355. </script>
  356. <style lang='less' scoped>
  357. /* 引入公共css类 */
  358. @import './style.less';
  359. </style>
  360. <style>
  361. .ql-picker-label {
  362. line-height: 1;
  363. overflow: hidden;
  364. }
  365. </style>