index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
  4. <el-form-item label="标题" prop="title">
  5. <el-input v-model="queryParams.title" placeholder="请输入标题" clearable size="small"
  6. @keyup.enter.native="handleQuery" />
  7. </el-form-item>
  8. <el-form-item label="语言" prop="classification">
  9. <el-select v-model="queryParams.language" placeholder="请选择语言" clearable size="small">
  10. <el-option label="中文" value="中文" />
  11. <el-option label="English" value="English" />
  12. </el-select>
  13. </el-form-item>
  14. <el-form-item>
  15. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  16. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  17. </el-form-item>
  18. </el-form>
  19. <el-row :gutter="10" class="mb8">
  20. <el-col :span="1.5">
  21. <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
  22. v-permission="['cloud:aboutUsInfo:add']">新增</el-button>
  23. </el-col>
  24. <el-col :span="1.5">
  25. <el-button type="success" icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
  26. v-permission="['cloud:aboutUsInfo:edit']">修改</el-button>
  27. </el-col>
  28. <el-col :span="1.5">
  29. <el-button type="danger" icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
  30. v-permission="['cloud:aboutUsInfo:remove']">删除</el-button>
  31. </el-col>
  32. <!-- <el-col :span="1.5">
  33. <el-button
  34. type="warning"
  35. icon="el-icon-download"
  36. size="mini"
  37. @click="handleExport"
  38. v-permission="['cloud:aboutUsInfo:export']"
  39. >导出</el-button>
  40. </el-col> -->
  41. </el-row>
  42. <el-table v-loading="loading" :data="aboutUsInfoList" @selection-change="handleSelectionChange">
  43. <!-- <el-table-column type="selection" width="55" align="center" />
  44. <el-table-column label="" align="center" prop="id" /> -->
  45. <el-table-column label="公司标题" align="center" prop="title" />
  46. <el-table-column label="公司简介" align="center" prop="details">
  47. <template slot-scope="scope">
  48. <el-popover trigger="hover" placement="top">
  49. <p v-html="scope.row.details"></p>
  50. <div slot="reference" class="name-wrapper">
  51. <el-tag size="medium">{{ scope.row.details }}</el-tag>
  52. </div>
  53. </el-popover>
  54. </template>
  55. </el-table-column>
  56. <!-- <el-table-column label="副标题" align="center" prop="deputyTitle" /> -->
  57. <el-table-column label="公司封面" align="center" width="180">
  58. <template slot-scope="scope">
  59. <img :src="scope.row.coverImage" alt="" style="width:100px;height:50px">
  60. </template>
  61. </el-table-column>
  62. <!-- <el-table-column label="时间轴" align="center" prop="coverImage" /> -->
  63. <!-- <el-table-column label="视频地址" align="center" prop="videoUrl" /> -->
  64. <!-- <el-table-column label="分类" align="center" prop="classify" /> -->
  65. <el-table-column label="文章标题" align="center" prop="deputyTitle" />
  66. <el-table-column label="文章内容" align="center">
  67. <template slot-scope="scope">
  68. <el-popover trigger="hover" placement="top">
  69. <p v-html="scope.row.content"></p>
  70. <div slot="reference" class="name-wrapper">
  71. <el-tag size="medium">{{scope.row.content}}</el-tag>
  72. </div>
  73. </el-popover>
  74. </template>
  75. </el-table-column>
  76. <el-table-column label="语言" align="center" prop="language" />
  77. <el-table-column label="创建时间" align="center" prop="gmtCreate" width="180">
  78. <template slot-scope="scope">
  79. <span>{{ parseTime(scope.row.gmtCreate) }}</span>
  80. </template>
  81. </el-table-column>
  82. <el-table-column label="" align="center" prop="gmtUpdate" width="180">
  83. <template slot-scope="scope">
  84. <span>{{ parseTime(scope.row.gmtUpdate) }}</span>
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  88. <template slot-scope="scope">
  89. <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  90. v-permission="['cloud:aboutUsInfo:edit']">修改</el-button>
  91. <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  92. v-permission="['cloud:aboutUsInfo:remove']">删除</el-button>
  93. </template>
  94. </el-table-column>
  95. </el-table>
  96. <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
  97. @pagination="getList" />
  98. <!-- 添加或修改记录关于我们信息对话框 -->
  99. <el-dialog :title="title" :visible.sync="open" width="1000px" @opened="openDialog">
  100. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  101. <el-form-item label="公司标题" prop="title">
  102. <el-input v-model="form.title" placeholder="请输入公司标题" />
  103. </el-form-item>
  104. <el-form-item label="公司封面" prop="coverImage">
  105. <el-upload ref="mYupload" class="avatar-uploader" :headers="headers" :action="uploadPath"
  106. :show-file-list="false" :on-success="uploadSuccessHandle" :before-upload="onBeforeUpload">
  107. <img v-if="form.coverImage" :src="form.coverImage" class="avatar">
  108. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  109. </el-upload>
  110. </el-form-item>
  111. <el-form-item label="公司简介" prop="details">
  112. <!-- <el-input v-model="form.details" type="textarea" placeholder="公司简介" /> -->
  113. <textarea id="ck-editor" name="editor" rows="10" cols="80"></textarea>
  114. </el-form-item>
  115. <!-- <el-form-item label="时间轴">
  116. </el-form-item>
  117. <el-form-item style="display: flex;">
  118. <div style="display: flex;" v-for="(item,index) in timeLine">
  119. <div style="display: flex;">
  120. <span style="width: 100px;">时间</span>
  121. <el-input v-model="item.time" placeholder="时间" />
  122. </div>
  123. <div style="display: flex;margin-left:20px">
  124. <span style="width: 40px;">内容</span>
  125. <el-input v-model="item.text" placeholder="内容" />
  126. </div>
  127. <div style="margin-left: 40px;">
  128. <span @click="addTimeLine(item,index)">增加</span>
  129. <span style="margin-left: 20px;" @click="jsTimeLine(item,index)">减少</span>
  130. </div>
  131. </div>
  132. </el-form-item> -->
  133. <el-form-item label="文章标题" prop="deputyTitle">
  134. <el-input v-model="form.deputyTitle" placeholder="请输入文章标题" />
  135. </el-form-item>
  136. <el-form-item label="文章内容" prop="content">
  137. <textarea id="ck-editor1" name="editor" rows="10" cols="80"></textarea>
  138. <!-- <el-input v-model="form.content" placeholder="请输入文章内容" type="textarea" /> -->
  139. </el-form-item>
  140. <el-radio-group v-model="form.language">
  141. <el-radio-button label="中文"></el-radio-button>
  142. <el-radio-button label="English"></el-radio-button>
  143. </el-radio-group>
  144. </el-form>
  145. <div slot="footer" class="dialog-footer">
  146. <el-button type="primary" @click="submitForm">确 定</el-button>
  147. <el-button @click="cancel">取 消</el-button>
  148. </div>
  149. </el-dialog>
  150. </div>
  151. </template>
  152. <script>
  153. import { listAboutUsInfo, getAboutUsInfo, delAboutUsInfo, addAboutUsInfo, updateAboutUsInfo, exportAboutUsInfo } from "@/api/cloud/aboutUsInfo";
  154. import { uploadPath } from '@/api/storage'
  155. import { getToken } from '@/utils/auth'
  156. export default {
  157. data() {
  158. return {
  159. editor: null,
  160. editor1: null,
  161. editorData: '<p>Content of the editor.</p>',
  162. editorConfig: {
  163. // The configuration of the editor.
  164. },
  165. timeLine: [{
  166. time: '',
  167. text: ''
  168. }],
  169. uploadPath,
  170. // 遮罩层
  171. loading: true,
  172. // 选中数组
  173. ids: [],
  174. // 非单个禁用
  175. single: true,
  176. // 非多个禁用
  177. multiple: true,
  178. // 总条数
  179. total: 0,
  180. // 记录关于我们信息表格数据
  181. aboutUsInfoList: [],
  182. // 弹出层标题
  183. title: "",
  184. // 是否显示弹出层
  185. open: false,
  186. // 查询参数
  187. queryParams: {
  188. pageNum: 1,
  189. pageSize: 10,
  190. title: undefined,
  191. deputyTitle: undefined,
  192. coverImage: undefined,
  193. videoUrl: undefined,
  194. classify: undefined,
  195. content: undefined,
  196. details: undefined,
  197. language: undefined,
  198. status: undefined,
  199. gmtCreate: undefined,
  200. gmtUpdate: undefined,
  201. deleteFlag: undefined
  202. },
  203. // 表单参数
  204. form: {},
  205. // 表单校验
  206. rules: {
  207. }
  208. };
  209. },
  210. computed: {
  211. headers() {
  212. return {
  213. accessToken: getToken()
  214. }
  215. }
  216. },
  217. created() {
  218. this.getList();
  219. },
  220. mounted() {
  221. },
  222. methods: {
  223. openDialog(){
  224. window.CKEDITOR.replace('ck-editor', { height: '400px', width: '100%', toolbar: 'toolbar_Full' });
  225. this.editor = window.CKEDITOR.instances['ck-editor']
  226. this.editor.on('fileUploadRequest', evt => {
  227. const requestData = evt.data.requestData
  228. const upload = requestData.upload
  229. delete requestData.upload
  230. requestData.file = upload
  231. })
  232. this.editor.on('fileUploadResponse', evt => {
  233. evt.stop();
  234. const data = evt.data
  235. const fileLoader = data.fileLoader
  236. const res = JSON.parse(fileLoader.xhr.responseText)
  237. console.log(res)
  238. if (res.errno !== 200) {
  239. data.message = '上传失败'
  240. evt.cancel();
  241. return
  242. }
  243. data.fileName = fileLoader.fileName
  244. data.url = res.url
  245. data.message = '上传成功'
  246. })
  247. window.CKEDITOR.replace('ck-editor1', { height: '400px', width: '100%', toolbar: 'toolbar_Full' });
  248. this.editor1 = window.CKEDITOR.instances['ck-editor1']
  249. this.editor1.on('fileUploadRequest', evt => {
  250. const requestData = evt.data.requestData
  251. const upload = requestData.upload
  252. delete requestData.upload
  253. requestData.file = upload
  254. })
  255. this.editor1.on('fileUploadResponse', evt => {
  256. evt.stop();
  257. const data = evt.data
  258. const fileLoader = data.fileLoader
  259. const res = JSON.parse(fileLoader.xhr.responseText)
  260. console.log(res)
  261. if (res.errno !== 200) {
  262. data.message = '上传失败'
  263. evt.cancel();
  264. return
  265. }
  266. data.fileName = fileLoader.fileName
  267. data.url = res.url
  268. data.message = '上传成功'
  269. })
  270. },
  271. InsertHTML(html) {
  272. // Get the editor instance that you want to interact with.
  273. // var value = document.getElementById('ck-editor').value;
  274. console.log(this.editor.getData())
  275. // Check the active editing mode.
  276. if (this.editor.mode == 'wysiwyg') {
  277. // Insert HTML code.
  278. // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertHtml
  279. this.editor.setData(html);
  280. } else
  281. alert('You must be in WYSIWYG mode!');
  282. },
  283. getContent() {
  284. console.log(this.editor.getData())
  285. },
  286. InsertHTML1(html) {
  287. // Get the editor instance that you want to interact with.
  288. // var value = document.getElementById('ck-editor').value;
  289. console.log(this.editor.getData())
  290. // Check the active editing mode.
  291. if (this.editor1.mode == 'wysiwyg') {
  292. // Insert HTML code.
  293. // https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertHtml
  294. this.editor1.setData(html);
  295. } else
  296. alert('You must be in WYSIWYG mode!');
  297. },
  298. getContent1() {
  299. console.log(this.editor1.getData())
  300. },
  301. addTimeLine(val, index) {
  302. this.timeLine.push({
  303. time: '',
  304. text: ''
  305. })
  306. },
  307. jsTimeLine(val, index) {
  308. debugger
  309. this.timeLine.splice(index, 1)
  310. },
  311. // 上传图片了处理图片
  312. uploadSuccessHandle(e, file) {
  313. const that = this
  314. this.form.coverImage = e.url
  315. this.$forceUpdate()
  316. },
  317. onBeforeUpload(file) {
  318. const isIMAGE = file.type === 'image/jpeg' || 'image/gif' || 'image/png' || 'image/jpg'
  319. const isLt1M = file.size / 1024 / 1024 < 1
  320. if (!isIMAGE) {
  321. this.$message.error('上传文件只能是图片格式!')
  322. }
  323. if (!isLt1M) {
  324. this.$message.error('上传文件大小不能超过 1MB!')
  325. }
  326. return isIMAGE && isLt1M
  327. },
  328. // 上传图片了处理图片
  329. uploadSuccessHandle1(e, file) {
  330. const that = this
  331. this.form.videoUrl = e.url
  332. this.$forceUpdate()
  333. },
  334. /** 查询记录关于我们信息列表 */
  335. getList() {
  336. this.loading = true;
  337. listAboutUsInfo(this.queryParams).then(response => {
  338. this.aboutUsInfoList = response.data.data.items
  339. this.total = response.data.data.count
  340. this.loading = false;
  341. });
  342. },
  343. // 取消按钮
  344. cancel() {
  345. this.open = false;
  346. this.reset();
  347. },
  348. // 表单重置
  349. reset() {
  350. this.form = {
  351. id: undefined,
  352. title: undefined,
  353. deputyTitle: undefined,
  354. coverImage: undefined,
  355. videoUrl: undefined,
  356. classify: undefined,
  357. content: undefined,
  358. details: undefined,
  359. language: undefined,
  360. status: "0",
  361. gmtCreate: undefined,
  362. gmtUpdate: undefined,
  363. deleteFlag: undefined
  364. };
  365. this.resetForm("form");
  366. },
  367. /** 搜索按钮操作 */
  368. handleQuery() {
  369. this.queryParams.pageNum = 1;
  370. this.getList();
  371. },
  372. /** 重置按钮操作 */
  373. resetQuery() {
  374. this.resetForm("queryForm");
  375. this.handleQuery();
  376. },
  377. // 多选框选中数据
  378. handleSelectionChange(selection) {
  379. this.ids = selection.map(item => item.id)
  380. this.single = selection.length != 1
  381. this.multiple = !selection.length
  382. },
  383. /** 新增按钮操作 */
  384. handleAdd() {
  385. this.reset();
  386. this.open = true;
  387. this.title = "添加记录关于我们信息";
  388. },
  389. /** 修改按钮操作 */
  390. handleUpdate(row) {
  391. this.reset();
  392. const id = row.id || this.ids.join(',')
  393. getAboutUsInfo(id).then(response => {
  394. let that = this
  395. this.form = response.data.data
  396. setTimeout(()=>{that.InsertHTML(that.form.details)},1000)
  397. setTimeout(()=>{that.InsertHTML1(that.form.content)},1000)
  398. this.open = true;
  399. this.title = "修改记录关于我们信息";
  400. });
  401. },
  402. /** 提交按钮 */
  403. submitForm: function () {
  404. this.$refs["form"].validate(valid => {
  405. if (valid) {
  406. this.form.details = this.editor.getData()
  407. this.form.content = this.editor1.getData()
  408. if (this.form.id != undefined) {
  409. updateAboutUsInfo(this.form).then(response => {
  410. if (response.data) {
  411. this.msgSuccess("修改成功");
  412. this.open = false;
  413. this.getList();
  414. } else {
  415. this.msgError(response.msg);
  416. }
  417. });
  418. } else {
  419. addAboutUsInfo(this.form).then(response => {
  420. if (response.data) {
  421. this.msgSuccess("新增成功");
  422. this.open = false;
  423. this.getList();
  424. } else {
  425. this.msgError(response.msg);
  426. }
  427. });
  428. }
  429. }
  430. });
  431. },
  432. /** 删除按钮操作 */
  433. handleDelete(row) {
  434. const ids = row.id || this.ids.join(',')
  435. this.$confirm('是否确认删除记录关于我们信息编号为"' + ids + '"的数据项?', "警告", {
  436. confirmButtonText: "确定",
  437. cancelButtonText: "取消",
  438. type: "warning"
  439. }).then(function () {
  440. return delAboutUsInfo(ids);
  441. }).then(() => {
  442. this.getList();
  443. this.msgSuccess("删除成功");
  444. }).catch(function () { });
  445. },
  446. /** 导出按钮操作 */
  447. handleExport() {
  448. const queryParams = this.queryParams;
  449. this.$confirm('是否确认导出所有记录关于我们信息数据项?', "警告", {
  450. confirmButtonText: "确定",
  451. cancelButtonText: "取消",
  452. type: "warning"
  453. }).then(function () {
  454. return exportAboutUsInfo(queryParams);
  455. }).then(response => {
  456. this.download(response.data.data);
  457. }).catch(function () { });
  458. }
  459. }
  460. };
  461. </script>
  462. <style lang="scss" scoped>
  463. .avatar-uploader {
  464. /deep/.el-upload {
  465. border: 1px dashed #ccc;
  466. border-radius: 6px;
  467. cursor: pointer;
  468. position: relative;
  469. overflow: hidden;
  470. }
  471. }
  472. .avatar-uploader .el-upload:hover {
  473. border-color: #409EFF;
  474. }
  475. .avatar-uploader-icon {
  476. font-size: 28px;
  477. color: #8c939d;
  478. width: 178px;
  479. height: 178px;
  480. line-height: 178px;
  481. text-align: center;
  482. }
  483. .avatar {
  484. width: 178px;
  485. height: 178px;
  486. display: block;
  487. }
  488. .ck-editor__editable {
  489. min-height: 400px;
  490. }
  491. </style>