VideoCoverFormModal.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. <el-dialog :title="(modelType == 'add' ? '添加' : '编辑') + '店铺信息'" width="800px" :visible.sync="dialogVisible">
  3. <el-form :model="form" :rules="rules" ref="VideoCoverFormForm" label-width="100px">
  4. <el-form-item prop="shopName" label="店铺名称:">
  5. <el-input placeholder="请输入店铺名称" v-model="form.shopName"></el-input>
  6. </el-form-item>
  7. <el-form-item prop="coverPicture" label="封面图:" required>
  8. <el-upload
  9. class="avatar-uploader"
  10. :action="action"
  11. accept="image/*"
  12. :show-file-list="false"
  13. :headers="{
  14. 'Authorization': 'Bearer ' + token
  15. }"
  16. :on-success="handleAvatarSuccess"
  17. :before-upload="beforeAvatarUpload">
  18. <div v-loading="uploading">
  19. <div v-if="form.coverPicture" class="avatar-black">
  20. <img :src="form.coverPicture" class="avatar">
  21. <el-tooltip
  22. class="item"
  23. effect="dark"
  24. content="删除"
  25. placement="bottom-end">
  26. <i class="close el-icon-circle-close"
  27. @click.stop="imgUploadDel()"></i>
  28. </el-tooltip>
  29. </div>
  30. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  31. </div>
  32. </el-upload>
  33. </el-form-item>
  34. <el-form-item prop="coverText" label="封面文字:">
  35. <el-input placeholder="请输入封面文字" v-model="form.coverText"></el-input>
  36. </el-form-item>
  37. <el-form-item label="平台类型:" required>
  38. <el-radio-group v-model="form.type">
  39. <el-radio :label="0">品牌(国内)</el-radio>
  40. <el-radio :label="1">海外</el-radio>
  41. </el-radio-group>
  42. </el-form-item>
  43. </el-form>
  44. <span slot="footer" class="dialog-footer">
  45. <el-button @click="dialogVisible = false">取消</el-button>
  46. <el-button type="primary" :loading="comfirmLoading" @click="handleConfirm">确定</el-button>
  47. </span>
  48. </el-dialog>
  49. </template>
  50. <script>
  51. import { addShopConfigInfo, editShopConfigInfo } from "@/api/videoCoverManager";
  52. import { api } from "@/api/api";
  53. import { getToken } from '@/utils/auth'
  54. export default {
  55. name: "VideoCoverFormModal",
  56. props: {
  57. },
  58. data() {
  59. var checkCoverPicture = (rule, value, callback) => {
  60. if (!value) {
  61. callback(new Error('请上传封面图'));
  62. } else {
  63. callback();
  64. }
  65. };
  66. return {
  67. action: api.fileUrl,
  68. uploading: false,
  69. form: {
  70. shopName: '',
  71. coverPicture: '',
  72. coverText: '',
  73. type: 0
  74. },
  75. modelType: 'add',
  76. dialogVisible: false,
  77. comfirmLoading: false,
  78. editId: '',
  79. shopName: '', // 店铺名称不能重复
  80. rules: {
  81. shopName: [
  82. { required: true, message: "请输入店铺名称", trigger: "blur" }
  83. ],
  84. coverText: [
  85. { required: true, message: "请输入封面文字", trigger: "blur" }
  86. ],
  87. coverPicture: [
  88. { validator: checkCoverPicture, trigger: "change" }
  89. ]
  90. }
  91. };
  92. },
  93. computed: {
  94. token() {
  95. return getToken();
  96. }
  97. },
  98. watch: {
  99. dialogVisible(val) {
  100. if (!val) {
  101. this.uploading = false;
  102. this.form = {
  103. shopName: '',
  104. coverPicture: '',
  105. coverText: '',
  106. type: 0
  107. }
  108. this.modelType = 'add';
  109. this.comfirmLoading = false;
  110. this.editId = '';
  111. }
  112. }
  113. },
  114. methods: {
  115. show(rows, type) {
  116. this.dialogVisible = true;
  117. this.comfirmLoading = false;
  118. this.modelType = type;
  119. if (type == 'edit') {
  120. this.editId = rows.id;
  121. this.shopName = rows.shopName;
  122. }
  123. this.$nextTick(() => {
  124. this.form = type == 'edit' ? {
  125. shopName: rows.shopName,
  126. coverPicture: rows.coverPicture,
  127. coverText: rows.coverText,
  128. type: rows.type
  129. } : {
  130. shopName: '',
  131. coverPicture: '',
  132. coverText: '',
  133. type: 0
  134. }
  135. this.$refs.VideoCoverFormForm.resetFields()
  136. })
  137. },
  138. handleAvatarSuccess(res) {
  139. this.uploading = false
  140. this.$refs.VideoCoverFormForm.clearValidate(['coverPicture']);
  141. if (res.code == 200) {
  142. this.form.coverPicture = res.data.url;
  143. } else {
  144. this.$message.error('上传出错,请重试!');
  145. }
  146. },
  147. beforeAvatarUpload(file) {
  148. this.uploading = true;
  149. const imagesTypes = ['image/png','image/gif','image/jpeg']
  150. const isImages = imagesTypes.includes(file.type)
  151. if (!isImages) {
  152. this.uploading = false;
  153. this.$message.error('图片只能是JPG、PNG、GIF格式!');
  154. }
  155. return isImages;
  156. },
  157. imgUploadDel() {
  158. //删除
  159. this.$confirm("确定要删除吗?", "提示", {
  160. confirmButtonText: "确定",
  161. cancelButtonText: "取消",
  162. type: "warning"
  163. }).then(() => {
  164. this.form.coverPicture = '';
  165. this.$notify({
  166. title: "成功",
  167. message: "删除成功",
  168. type: "success",
  169. duration: 3000
  170. });
  171. });
  172. },
  173. handleConfirm() {
  174. this.$refs.VideoCoverFormForm.validate(valid => {
  175. if (valid) {
  176. this.comfirmLoading = true;
  177. const params = this.form;
  178. if (this.modelType == 'add') {
  179. addShopConfigInfo(params).then(res =>{
  180. this.dialogVisible = false;
  181. if(res.code == 200){
  182. this.$message.success(res.msg || "操作成功");
  183. this.$emit("confirm");
  184. }
  185. }).finally(()=>{
  186. this.comfirmLoading = false;
  187. })
  188. } else {
  189. params.id = this.editId;
  190. if (this.shopName == this.form.shopName) {
  191. // 说明没有更新店铺名,店铺名必须唯一
  192. delete params.shopName;
  193. }
  194. editShopConfigInfo(params).then(res =>{
  195. this.dialogVisible = false;
  196. if(res.code == 200){
  197. this.$message.success(res.msg || "操作成功");
  198. this.$emit("confirm");
  199. }
  200. }).finally(()=>{
  201. this.comfirmLoading = false;
  202. })
  203. }
  204. } else {
  205. return false;
  206. }
  207. });
  208. }
  209. }
  210. };
  211. </script>
  212. <style lang="scss">
  213. .avatar-uploader .el-upload {
  214. border: 1px dashed #d9d9d9;
  215. border-radius: 6px;
  216. cursor: pointer;
  217. position: relative;
  218. }
  219. .avatar-uploader .el-upload:hover {
  220. border-color: #409EFF;
  221. }
  222. .avatar-uploader-icon {
  223. font-size: 28px;
  224. color: #8c939d;
  225. width: 178px;
  226. height: 178px;
  227. line-height: 178px;
  228. text-align: center;
  229. }
  230. .avatar {
  231. display: block;
  232. }
  233. .avatar-black {
  234. width: 180px;
  235. height: 180px;
  236. position: relative;
  237. display: flex;
  238. align-items: center;
  239. justify-content: center;
  240. i {
  241. position: absolute;
  242. top: -10px;
  243. right: -10px;
  244. cursor: pointer;
  245. z-index: 999999;
  246. color: red;
  247. background-color: #fff;
  248. font-size: 30px;
  249. border-radius: 50%;
  250. outline: none;
  251. width: 28px;
  252. height: 28px;
  253. line-height: 28px;
  254. font-size: 28px;
  255. color: #8c939d;
  256. display: block;
  257. text-align: center;
  258. }
  259. img {
  260. max-height: 100%;
  261. vertical-align: middle;
  262. }
  263. }
  264. </style>