cert_edit.vue 8.8 KB

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