ItemModal.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <template>
  2. <el-dialog
  3. :title="title"
  4. :visible.sync="modal"
  5. width="500px"
  6. :close-on-click-modal="false"
  7. @close="
  8. res => {
  9. $emit('cancel');
  10. }
  11. "
  12. >
  13. <el-form ref="form" :model="form" :rules="rules" label-width="100px">
  14. <el-form-item label="图片" prop="imgUrl">
  15. <!-- TODO 043 -->
  16. <upload v-model="form.imgUrl" params="prefix=/banner"/>
  17. <el-row>建议尺寸</el-row>
  18. <el-row>首页:700 * 300</el-row>
  19. <el-row>我的 - 开通会员专享权益:700 * 300</el-row>
  20. <el-row>我的 - 积分签到:750 * 500</el-row>
  21. <el-row>邀请拉新 - 主页:750 * 500</el-row>
  22. <el-row>邀请拉新 - 注册页:750 * 500</el-row>
  23. <el-row>会员中心 - 广告:700 * 300</el-row>
  24. <el-row>会员中心 - 会员权益:700 * 300</el-row>
  25. <el-row>会员中心 - 会员福利:700 * 300</el-row>
  26. <el-row>启动应用广告:1284 * 2778</el-row>
  27. <el-row>登录页背景图/视频:540 * 960</el-row>
  28. <el-row>邀请注册海报:500 * 500</el-row>
  29. <el-row>问题反馈联系客服二维码:500 * 500</el-row>
  30. </el-form-item>
  31. <el-form-item label="位置" prop="type">
  32. <DataSelect
  33. v-model="form.type"
  34. :params="$dict.BANNER_TYPE"
  35. ></DataSelect>
  36. </el-form-item>
  37. <el-form-item label="标题" prop="name">
  38. <el-input v-model="form.name"></el-input>
  39. </el-form-item>
  40. <el-form-item label="链接" prop="link">
  41. <el-input v-model="form.link"></el-input>
  42. </el-form-item>
  43. <el-form-item label="显示/隐藏">
  44. <el-radio-group v-model="form.isShow" prop="isShow">
  45. <el-radio :label="true">显示</el-radio>
  46. <el-radio :label="false">隐藏</el-radio>
  47. </el-radio-group>
  48. </el-form-item>
  49. <el-form-item label="排序" prop="sort">
  50. <el-input-number
  51. controls-position="right"
  52. v-model="form.sort"
  53. :precision="0"
  54. :min="1"
  55. :max="9999"
  56. label="序号"
  57. ></el-input-number>
  58. </el-form-item>
  59. </el-form>
  60. <span slot="footer" class="dialog-footer">
  61. <el-button @click="modal = false">取消</el-button>
  62. <el-button type="primary" @click="handleConfirm">确定</el-button>
  63. </span>
  64. </el-dialog>
  65. </template>
  66. <script>
  67. import { getItem, saveItem } from '@/api/base/banner';
  68. export default {
  69. name: 'BannerItemModal',
  70. props: {
  71. id: {
  72. type: String,
  73. default: ''
  74. }
  75. },
  76. data() {
  77. return {
  78. modal: true,
  79. form: {
  80. imgUrl: [],
  81. type: null,
  82. name: '',
  83. link: '',
  84. isShow: false,
  85. sort: 1
  86. },
  87. rules: {
  88. type: [
  89. { required: true, message: '请选择所属位置', trigger: 'change' }
  90. ],
  91. name: [{ required: true, message: '请输入标题', trigger: 'change' }],
  92. imgUrl: [
  93. {
  94. type: 'array',
  95. required: true,
  96. message: '请上传图片',
  97. trigger: 'change'
  98. }
  99. ]
  100. // link: [
  101. // { required: true, message: '请输入链接地址', trigger: 'change' },
  102. // { validator: checkUrl, trigger: 'blur' }
  103. // ]
  104. },
  105. typeOptions: []
  106. };
  107. },
  108. computed: {
  109. title() {
  110. if (this.id) {
  111. return '编辑Banner';
  112. } else {
  113. return '新增Banner';
  114. }
  115. }
  116. },
  117. watch: {
  118. id: {
  119. handler(id) {
  120. id && this.loadData();
  121. },
  122. immediate: true
  123. }
  124. },
  125. mounted() {},
  126. methods: {
  127. async loadData() {
  128. const { success, data, msg } = await getItem({
  129. id: this.id
  130. });
  131. if (success) {
  132. let result = data;
  133. result.imgUrl = [
  134. {
  135. url: data.imgUrl
  136. }
  137. ];
  138. this.form = result;
  139. }
  140. },
  141. handleConfirm() {
  142. this.$refs.form.validate(async valid => {
  143. if (valid) {
  144. if (this.checkUrl(this.form.link)) {
  145. let params = Object.assign({}, this.form);
  146. params.imgUrl = this.form.imgUrl[0].url;
  147. if (this.id) params.id = this.id;
  148. const { success, msg } = await saveItem(params);
  149. if (success) {
  150. this.$success('保存成功!');
  151. this.modal = false;
  152. this.$g_emit('banner_reload');
  153. }
  154. }
  155. }
  156. });
  157. },
  158. checkUrl(value) {
  159. /* 如果没有填,则不校验数据有效性 */
  160. if (!value) {
  161. return true;
  162. }
  163. const pattern = /http[s]{0,1}:\/\/([\w.]+\/?)\S*/;
  164. if (value && pattern.test(value)) {
  165. return true;
  166. }
  167. this.$error('请以http://或者https://');
  168. return false;
  169. }
  170. }
  171. };
  172. </script>
  173. <style lang="scss" scoped></style>