norm.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <template>
  2. <div>
  3. <div class="search-term">
  4. <el-form :inline="true" :model="this.searchInfo" class="demo-form-inline">
  5. <el-form-item>
  6. <el-button size="mini" type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
  7. <el-button size="mini" type="primary" icon="el-icon-plus" @click="openDialog">新增</el-button>
  8. <el-popover v-model:visible="deleteVisible" placement="top" width="160">
  9. <p>确定要删除吗?</p>
  10. <div style="text-align: right; margin: 0">
  11. <el-button size="mini" type="text" @click="deleteVisible = false">取消</el-button>
  12. <el-button size="mini" type="primary" @click="onDelete">确定</el-button>
  13. </div>
  14. <template #reference>
  15. <el-button icon="el-icon-delete" size="mini" type="danger" style="margin-left: 10px;">批量删除</el-button>
  16. </template>
  17. </el-popover>
  18. </el-form-item>
  19. </el-form>
  20. </div>
  21. <el-table
  22. ref="multipleTable"
  23. border
  24. stripe
  25. style="width: 100%"
  26. tooltip-effect="dark"
  27. :data="tableData"
  28. @selection-change="handleSelectionChange"
  29. >
  30. <el-table-column type="selection" width="55" />
  31. <el-table-column label="日期" width="180">
  32. <template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
  33. </el-table-column>
  34. <el-table-column label="操作人" prop="oper" width="120" />
  35. <el-table-column label="标题" prop="title" width="120" />
  36. <el-table-column label="内容" prop="text" width="120" />
  37. <el-table-column label="图片" prop="imgs" width="165" >
  38. <template #default="scope">
  39. <img :src="scope.row.imgs.split('|')[0] " width="140"/>
  40. </template>
  41. </el-table-column>
  42. <el-table-column label="操作">
  43. <template #default="scope">
  44. <el-button size="small" type="primary" icon="el-icon-edit" class="table-button" @click="updateContent(scope.row)">变更</el-button>
  45. <el-button type="danger" icon="el-icon-delete" size="mini" @click="deleteRow(scope.row)">删除</el-button>
  46. </template>
  47. </el-table-column>
  48. </el-table>
  49. <el-pagination
  50. layout="total, sizes, prev, pager, next, jumper"
  51. :current-page="page"
  52. :page-size="pageSize"
  53. :page-sizes="[10, 30, 50, 100]"
  54. :style="{float:'right',padding:'20px'}"
  55. :total="total"
  56. @current-change="handleCurrentChange"
  57. @size-change="handleSizeChange"
  58. />
  59. <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" title="弹窗操作">
  60. <el-form :model="formData" label-position="right" label-width="80px">
  61. <el-form-item label="操作人:">
  62. <el-input v-model.number="formData.oper" clearable placeholder="请输入" />
  63. </el-form-item>
  64. <el-form-item label="标题:">
  65. <el-input v-model="formData.title" clearable placeholder="请输入" />
  66. </el-form-item>
  67. <el-form-item label="内容:">
  68. <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 10 }" v-model="formData.text" clearable placeholder="请输入" />
  69. </el-form-item>
  70. <el-form-item label="图片:">
  71. <el-upload
  72. class="upload-demo"
  73. :action="`${path}/fileUploadAndDownload/upload`"
  74. :before-upload="checkFile"
  75. :headers="{ 'x-token': token }"
  76. :on-error="uploadError"
  77. :on-success="uploadSuccess"
  78. :on-remove="delFile"
  79. :file-list="formData.imgsList"
  80. list-type="picture">
  81. <el-button size="small" type="primary">点击上传</el-button>
  82. <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
  83. </el-upload>
  84. </el-form-item>
  85. </el-form>
  86. <template #footer>
  87. <div class="dialog-footer">
  88. <el-button @click="closeDialog">取 消</el-button>
  89. <el-button type="primary" @click="enterDialog">确 定</el-button>
  90. </div>
  91. </template>
  92. </el-dialog>
  93. </div>
  94. </template>
  95. <script>
  96. import {
  97. createContent,
  98. deleteContent,
  99. deleteContentByIds,
  100. updateContent,
  101. findContent,
  102. getContentList
  103. } from '@/api/content' // 此处请自行替换地址
  104. import infoList from '@/mixins/infoList'
  105. import { mapGetters } from 'vuex'
  106. export default {
  107. name: 'Content',
  108. mixins: [infoList],
  109. data() {
  110. return {
  111. listApi: getContentList,
  112. dialogFormVisible: false,
  113. type: '',
  114. deleteVisible: false,
  115. multipleSelection: [],
  116. searchInfo: {
  117. type: 'norm',
  118. },
  119. formData: {
  120. oper: 0,
  121. title: '',
  122. text: '',
  123. imgs: '',
  124. imgsList: [],
  125. type: 'norm',
  126. }
  127. }
  128. },
  129. async created() {
  130. await this.getTableData()
  131. },
  132. computed: {
  133. ...mapGetters('user', ['userInfo', 'token'])
  134. },
  135. methods: {
  136. // 条件搜索前端看此方法
  137. onSubmit() {
  138. this.page = 1
  139. this.pageSize = 10
  140. this.getTableData()
  141. },
  142. handleSelectionChange(val) {
  143. this.multipleSelection = val
  144. },
  145. deleteRow(row) {
  146. this.$confirm('确定要删除吗?', '提示', {
  147. confirmButtonText: '确定',
  148. cancelButtonText: '取消',
  149. type: 'warning'
  150. }).then(() => {
  151. this.deleteContent(row)
  152. })
  153. },
  154. async onDelete() {
  155. const ids = []
  156. if (this.multipleSelection.length === 0) {
  157. this.$message({
  158. type: 'warning',
  159. message: '请选择要删除的数据'
  160. })
  161. return
  162. }
  163. this.multipleSelection &&
  164. this.multipleSelection.map(item => {
  165. ids.push(item.ID)
  166. })
  167. const res = await deleteContentByIds({ ids })
  168. if (res.code === 0) {
  169. this.$message({
  170. type: 'success',
  171. message: '删除成功'
  172. })
  173. if (this.tableData.length === ids.length && this.page > 1) {
  174. this.page--
  175. }
  176. this.deleteVisible = false
  177. this.getTableData()
  178. }
  179. },
  180. async updateContent(row) {
  181. const res = await findContent({ ID: row.ID })
  182. this.type = 'update'
  183. if (res.code === 0) {
  184. this.formData = res.data.recontent
  185. if (this.formData.imgs.length != 0) {
  186. var imgs = this.formData.imgs.split('|')
  187. var imgList = new Set();
  188. for (let img of imgs) {
  189. imgList.add({name: '图片', url: img})
  190. }
  191. this.formData.imgsList = Array.from(imgList)
  192. }
  193. this.dialogFormVisible = true
  194. }
  195. },
  196. closeDialog() {
  197. this.dialogFormVisible = false
  198. this.formData = {
  199. oper: 0,
  200. title: '',
  201. text: '',
  202. imgs: '',
  203. type: '',
  204. }
  205. },
  206. async deleteContent(row) {
  207. const res = await deleteContent({ ID: row.ID })
  208. if (res.code === 0) {
  209. this.$message({
  210. type: 'success',
  211. message: '删除成功'
  212. })
  213. if (this.tableData.length === 1 && this.page > 1) {
  214. this.page--
  215. }
  216. this.getTableData()
  217. }
  218. },
  219. async enterDialog() {
  220. let res
  221. switch (this.type) {
  222. case 'create':
  223. res = await createContent(this.formData)
  224. break
  225. case 'update':
  226. res = await updateContent(this.formData)
  227. break
  228. default:
  229. res = await createContent(this.formData)
  230. break
  231. }
  232. if (res.code === 0) {
  233. this.$message({
  234. type: 'success',
  235. message: '创建/更改成功'
  236. })
  237. this.closeDialog()
  238. this.getTableData()
  239. }
  240. },
  241. openDialog() {
  242. this.type = 'create'
  243. this.dialogFormVisible = true
  244. },
  245. checkFile(file) {
  246. this.fullscreenLoading = true
  247. const isJPG = file.type === 'image/jpeg'
  248. const isPng = file.type === 'image/png'
  249. const isLt2M = file.size / 1024 / 1024 < 2
  250. if (!isJPG && !isPng) {
  251. this.$message.error('上传头像图片只能是 JPG或png 格式!')
  252. this.fullscreenLoading = false
  253. }
  254. if (!isLt2M) {
  255. this.$message.error('上传头像图片大小不能超过 2MB!')
  256. this.fullscreenLoading = false
  257. }
  258. return (isPng || isJPG) && isLt2M
  259. },
  260. uploadSuccess(res) {
  261. this.fullscreenLoading = false
  262. if (res.code === 0) {
  263. this.$message({
  264. type: 'success',
  265. message: '上传成功'
  266. })
  267. if (this.formData.imgs.length > 0) {
  268. this.formData.imgs = this.formData.imgs + '|' + res.data.file.url
  269. } else {
  270. this.formData.imgs = res.data.file.url
  271. }
  272. } else {
  273. this.$message({
  274. type: 'warning',
  275. message: res.msg
  276. })
  277. }
  278. },
  279. uploadError() {
  280. this.$message({
  281. type: 'error',
  282. message: '上传失败'
  283. })
  284. this.fullscreenLoading = false
  285. },
  286. delFile(file, fileList) {
  287. if (fileList.length != 0) {
  288. var fileArr = new Set()
  289. for (let file of fileList) {
  290. fileArr.add(file.url)
  291. }
  292. this.formData.imgs = Array.from(fileArr).join('|')
  293. } else {
  294. this.formData.imgs = '';
  295. }
  296. }
  297. },
  298. }
  299. </script>
  300. <style>
  301. </style>