cert_edit.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <template>
  2. <div id="vip-setting">
  3. <el-form
  4. v-if="ruleForm"
  5. label-position="right"
  6. label-width="80px"
  7. :model="ruleForm"
  8. :rules="rules"
  9. ref="ruleForm"
  10. >
  11. <h3>认证产品编辑</h3>
  12. <br>
  13. <el-form-item label="中文名称" prop="name">
  14. <el-input v-model="ruleForm.name"></el-input>
  15. </el-form-item>
  16. <el-form-item label="英文名称" prop="english_name">
  17. <el-input v-model="ruleForm.english_name"></el-input>
  18. </el-form-item>
  19. <el-form-item label="状态" prop="status">
  20. <el-select v-model="ruleForm.status_name" placeholder="请选择" @change="changeSelect">
  21. <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"></el-option>
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item label="排序" prop="order">
  25. <el-input v-model="ruleForm.order"></el-input>
  26. </el-form-item>
  27. <section class="prices">
  28. <el-form-item label="原价" prop="origin_price">
  29. <el-input v-model="ruleForm.origin_price"></el-input>
  30. </el-form-item>
  31. <el-form-item label="现价" prop="real_price">
  32. <el-input v-model="ruleForm.real_price"></el-input>
  33. </el-form-item>
  34. <el-form-item label="会员价" prop="vip_price">
  35. <el-input v-model="ruleForm.vip_price"></el-input>
  36. </el-form-item>
  37. </section>
  38. <el-form-item label="配图" prop="img">
  39. <el-upload
  40. class="img-uploader"
  41. action="/api/admin/cert/uploadImg"
  42. :show-file-list="false"
  43. :on-success="handleAvatarSuccess"
  44. :before-upload="beforeAvatarUpload"
  45. >
  46. <img v-if="ruleForm.img" :src="ruleForm.img" class="img">
  47. <i v-else class="el-icon-plus img-uploader-icon"></i>
  48. </el-upload>
  49. </el-form-item>
  50. <el-form-item label="简介" prop="introduction">
  51. <el-input type="textarea" v-model="ruleForm.introduction"></el-input>
  52. </el-form-item>
  53. <el-form-item label="证书" prop="content">
  54. <el-input type="textarea" v-model="ruleForm.content"></el-input>
  55. </el-form-item>
  56. <el-form-item label="说明" prop="description">
  57. <quill-editor
  58. v-model="ruleForm.description"
  59. ref="quillEditor"
  60. class="editer"
  61. :options="editorOption"
  62. @ready="onEditorReady($event)"
  63. ></quill-editor>
  64. </el-form-item>
  65. <el-form-item>
  66. <el-button type="primary" @click="submitForm">保存</el-button>
  67. <el-button type="primary" @click="clickCancel">取消</el-button>
  68. </el-form-item>
  69. </el-form>
  70. <el-upload
  71. style="display: none;"
  72. action="/api/admin/cert/uploadImg"
  73. :show-file-list="false"
  74. :on-success="handleEditorImgSuccess"
  75. :before-upload="beforeAvatarUpload"
  76. >
  77. <el-button ref="chooseEditorImg" slot="trigger" size="small" type="primary">选取文件</el-button>
  78. </el-upload>
  79. </div>
  80. </template>
  81. <script>
  82. const ruleForm = 'ruleForm'
  83. // 插入图片或其他元素到编辑器的位置
  84. let addRange = { index: 0 }
  85. export default {
  86. data() {
  87. return {
  88. options: [],
  89. imageUrl: '',
  90. editorOption: {
  91. modules: {
  92. toolbar: [
  93. ['bold', 'italic', 'underline', 'strike'], // toggled buttons
  94. ['blockquote', 'code-block'],
  95. [{ 'header': 1 }, { 'header': 2 }], // custom button values
  96. [{ 'list': 'ordered' }, { 'list': 'bullet' }],
  97. [{ 'script': 'sub' }, { 'script': 'super' }], // superscript/subscript
  98. [{ 'indent': '-1' }, { 'indent': '+1' }], // outdent/indent
  99. [{ 'direction': 'rtl' }], // text direction
  100. [{ 'size': ['small', false, 'large', 'huge'] }], // custom dropdown
  101. [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
  102. [{ 'font': [] }],
  103. ['clean'], // remove formatting button
  104. ['link', 'image'],
  105. ],
  106. ImageResize: {}
  107. }
  108. },
  109. ruleForm: null,
  110. rules: {
  111. name: [
  112. { required: true, message: '请输入中文', trigger: 'blur' },
  113. ],
  114. english_name: [
  115. { required: true, message: '请输入英文', trigger: 'blur' },
  116. ],
  117. status: [
  118. { required: true, message: '请选择状态', trigger: 'blur' },
  119. ],
  120. order: [
  121. { required: true, message: '请输入数字', trigger: 'blur' },
  122. ],
  123. id: [
  124. { required: true, message: '请输入数字', trigger: 'blur' },
  125. ],
  126. origin_price: [
  127. { required: true, message: '请输入数字', trigger: 'blur' },
  128. ],
  129. real_price: [
  130. { required: true, message: '请输入数字', trigger: 'blur' },
  131. ],
  132. vip_price: [
  133. { required: true, message: '请输入数字', trigger: 'blur' },
  134. ],
  135. img: [
  136. { required: true, message: '请上传图片', trigger: 'blur' },
  137. ],
  138. introduction: [
  139. { required: true, message: '请输入简介', trigger: 'blur' },
  140. ],
  141. content: [
  142. { required: true, message: '请输入内容', trigger: 'blur' },
  143. ],
  144. description: [
  145. { required: true, message: '请输入描述', trigger: 'blur' },
  146. ],
  147. },
  148. // vip 列表
  149. list: [],
  150. }
  151. },
  152. computed: {
  153. editor() {
  154. return this.$refs.quillEditor.quill
  155. }
  156. },
  157. mounted() {
  158. this.getDetail()
  159. this.getStatus()
  160. setTimeout(() => {
  161. this.editor.getModule('toolbar').addHandler('image', this.imageHandle)
  162. }, 1000)
  163. },
  164. methods: {
  165. /**
  166. * 编辑图图片上传成功
  167. */
  168. handleEditorImgSuccess(res, file) {
  169. let url = res.data.file_url_abs
  170. this.editor.insertEmbed(addRange.index, 'image', url)
  171. },
  172. /**
  173. * 点击编辑器图片按钮事件
  174. * @param {boolean} state 一个不知道什么的状态
  175. */
  176. imageHandle(state) {
  177. if(state) {
  178. addRange = this.editor.getSelection()
  179. console.log({ addRange })
  180. this.$refs.chooseEditorImg.$el.click()
  181. }
  182. },
  183. /**
  184. * 状态选择变化
  185. */
  186. changeSelect(val) {
  187. this.ruleForm.status = val
  188. this.ruleForm.status_name = this.options.find(i => i.id === val).name
  189. },
  190. handleAvatarSuccess(res, file) {
  191. this.ruleForm.img = res.data.file_url_abs
  192. },
  193. beforeAvatarUpload(file) {
  194. return true
  195. },
  196. onEditorReady(editor) {
  197. },
  198. clickCancel() {
  199. this.$confirm('确认不保存已修改内容吗?', '提示', {
  200. confirmButtonText: '确定',
  201. cancelButtonText: '取消',
  202. type: 'warning'
  203. }).then(() => {
  204. this.$router.go(-1)
  205. }).catch(() => { })
  206. },
  207. /**
  208. * 重置
  209. */
  210. resetForm() {
  211. this.$refs[ruleForm].resetFields()
  212. },
  213. /**
  214. * 提交
  215. */
  216. submitForm() {
  217. this.$refs[ruleForm].validate(async (valid) => {
  218. if(valid) {
  219. let res = await this.$post('/api/admin/cert/updateInfo', this.ruleForm)
  220. if(res.status < 0) {
  221. this.$message({
  222. message: res.info,
  223. type: 'error'
  224. })
  225. } else {
  226. this.$message({
  227. message: '修改成功',
  228. type: 'success'
  229. })
  230. setTimeout(() => {
  231. this.$router.go(-1)
  232. }, 1000)
  233. }
  234. } else {
  235. console.log('error submit!!');
  236. return false
  237. }
  238. })
  239. },
  240. async getStatus() {
  241. const id = this.$route.query.id
  242. , res = await this.$get("/api/admin/cert/getEnum", { id })
  243. , data = res.data
  244. this.options = data.status_name_list
  245. },
  246. /**
  247. * 获取详情数据
  248. */
  249. async getDetail() {
  250. const id = this.$route.query.id
  251. , res = await this.$post("/api/admin/cert/getDetail", { id })
  252. , data = res.data
  253. this.ruleForm = data
  254. },
  255. }
  256. }
  257. </script>
  258. <style>
  259. #vip-setting {
  260. padding: 20px;
  261. }
  262. .table {
  263. height: 100%;
  264. height: calc(100% - 80px);
  265. }
  266. .el-input {
  267. width: auto;
  268. }
  269. .prices {
  270. display: flex;
  271. }
  272. .editer {
  273. width: 940px;
  274. height: 600px;
  275. padding: 0 0 100px;
  276. }
  277. .img-uploader {
  278. /* width: 270px;
  279. height: 190px; */
  280. }
  281. .img-uploader .el-upload {
  282. border: 1px dashed #d9d9d9;
  283. border-radius: 6px;
  284. cursor: pointer;
  285. position: relative;
  286. overflow: hidden;
  287. }
  288. .img-uploader .el-upload:hover {
  289. border-color: #409eff;
  290. }
  291. .img-uploader-icon {
  292. font-size: 28px;
  293. color: #8c939d;
  294. width: 178px;
  295. height: 178px;
  296. line-height: 178px;
  297. text-align: center;
  298. }
  299. .img {
  300. width: 270px;
  301. height: 190px;
  302. display: block;
  303. }
  304. </style>