typeEdit.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. <script>
  2. import axios from "axios";
  3. import {rCode} from "../map/rcodeMap_esm";
  4. import {handle} from "../until/handle";
  5. import InputRow from "./public/form/inputRow.vue";
  6. import RoundedTitle from "./public/roundedTitle.vue";
  7. import dbField_esm, {db_base} from "../map/dbField_esm";
  8. import {FormVerify} from "kind-form-verify";
  9. import {fieldCheck} from "../until/form/fieldVerify";
  10. import Pop from "./public/pop.vue";
  11. import PopCard from "./public/popCard.vue";
  12. import ImageTable from "./public/imageTable.vue";
  13. import {urlAddParam} from "@/until/url";
  14. const emptyType = {
  15. type_name: '',
  16. type_logo: '',
  17. type_sort: 0,
  18. type_key: ''
  19. }
  20. let formVerify = null;
  21. export default {
  22. name: 'typeEdit',
  23. components: {ImageTable, PopCard, Pop, RoundedTitle, InputRow},
  24. props: {
  25. },
  26. data () {
  27. return {
  28. isInitialized: false,
  29. title: '编辑类型',
  30. typeId: '',
  31. formType: {
  32. type_name: {
  33. val: "",
  34. oldVal: "",
  35. init: "",
  36. msg: "",
  37. state: 0,
  38. },
  39. type_logo: {
  40. val: '',
  41. init: '',
  42. msg: '',
  43. reCheckField: 'fileData',
  44. state: 0
  45. },
  46. type_sort: {
  47. val: 0,
  48. oldVal: 0,
  49. init: 0,
  50. msg: "",
  51. state: 0,
  52. },
  53. type_key: {
  54. val: "",
  55. oldVal: "",
  56. init: "",
  57. msg: "",
  58. state: 0,
  59. reCheckField: 'type_name',
  60. },
  61. seo_key: {
  62. val: "",
  63. oldVal: "",
  64. init: "",
  65. msg: "",
  66. state: 0,
  67. }
  68. },
  69. api: '',
  70. queryParams : {},
  71. showLogoDialog: false,
  72. fileType: db_base.fileType.svg,
  73. loading: false,
  74. }
  75. },
  76. computed: {
  77. tags () {
  78. // 拆分tags
  79. let tags = this.formType.seo_key.val
  80. if (!tags) {
  81. return [];
  82. }
  83. // 去除空字符串
  84. tags = tags.replace(/\s/g,'')
  85. tags = tags.replace(/,|;/g,',')
  86. let tagArr = tags.split(',')
  87. // 标签去重
  88. tagArr = [...new Set(tagArr)]
  89. // 移除空标签
  90. tagArr = tagArr.filter(item => item)
  91. return tagArr
  92. }
  93. },
  94. mounted() {
  95. // fieldCheck.checkField('type',this.form.type.val)
  96. // formVerify.checkForm(this.form, true);
  97. console.log(formVerify);
  98. },
  99. methods: {
  100. /**
  101. * 初始化编辑器
  102. * @param id
  103. * @param title
  104. * @param api
  105. * @param object
  106. */
  107. init (title, api, object, queryParams) {
  108. this.api = api
  109. console.log('init')
  110. console.log(queryParams)
  111. this.queryParams = queryParams ? queryParams : {}
  112. if (!api){
  113. this.$message.error('请设置api地址')
  114. throw new Error('请设置api地址')
  115. }
  116. let type = {
  117. ...emptyType,
  118. ...object
  119. }
  120. if(object) {
  121. this.typeId = object.type_id
  122. this.title = `编辑${title}`
  123. }else{
  124. this.typeId = ''
  125. this.title = `新增${title}`
  126. }
  127. this.formType.type_name.init = type.type_name
  128. this.formType.type_logo.init = type.type_logo
  129. this.formType.type_sort.init = type.type_sort
  130. this.formType.type_key.init = type.type_key
  131. this.formType.seo_key.init = type.seo_key
  132. this.isInitialized = true
  133. formVerify = new FormVerify(
  134. this.formType,
  135. fieldCheck,
  136. )
  137. formVerify.init()
  138. formVerify.onLog = (msg) => {
  139. console.log(msg);
  140. };
  141. },
  142. updateQueryParams(params){
  143. this.queryParams = params
  144. },
  145. initForm() {
  146. },
  147. close () {
  148. this.isInitialized = false
  149. this.$emit('close')
  150. },
  151. handleSave () {
  152. this.executeSubmitData()
  153. },
  154. deleteTag(tag){
  155. let tagArr = this.tags
  156. let index = tagArr.indexOf(tag)
  157. tagArr.splice(index, 1)
  158. this.formType.seo_key.val = tagArr.join(',')
  159. this.formType.seo_key.msg = ''
  160. },
  161. handleCancel () {
  162. this.close()
  163. },
  164. handleReset() {
  165. this.initForm()
  166. },
  167. openLogoHandle() {
  168. this.showLogoDialog = true
  169. },
  170. closeLogoHandle() {
  171. this.showLogoDialog = false
  172. },
  173. selectImageHandle(fileData){
  174. console.log('okHandle');
  175. console.log(fileData);
  176. this.showLogoDialog = false;
  177. // 选择封面图片
  178. this.formType.type_logo.val = fileData.filePath;
  179. this.formType.type_logo.init = fileData.filePath;
  180. this.formType.type_logo.msg = '';
  181. this.formType.type_logo.state = 0;
  182. this.formType.type_logo.showText = fileData.filePath;
  183. },
  184. async executeSubmitData(){
  185. if(!this.isInitialized)
  186. {
  187. throw new Error('请先初始化类别编辑器')
  188. }
  189. let url = this.api;
  190. // 拼接param参数
  191. if(this.typeId){
  192. this.queryParams.id = this.typeId
  193. }
  194. url = urlAddParam(url, this.queryParams)
  195. console.log(url)
  196. // 检测参数
  197. if(!formVerify.check()) {
  198. return this.$message.error('参数错误')
  199. }
  200. let params = formVerify.getFormData()
  201. console.log(this.queryParams)
  202. params = {
  203. ...params,
  204. ...this.queryParams,
  205. }
  206. console.log(params)
  207. let [err, res] = await handle(axios.post(url, params))
  208. if(err){
  209. this.$message.error(`[${this.title}] 失败:${err.message}`)
  210. console.log(err)
  211. return err
  212. }
  213. let result = res.data
  214. if(result.code !== rCode.OK) {
  215. this.$message.error(`[${this.title}] 失败:${result.msg}`)
  216. return result
  217. }
  218. this.$message.success(`[${this.title}] 成功`)
  219. this.close()
  220. }
  221. }
  222. }
  223. </script>
  224. <template>
  225. <div class="w-full ">
  226. <rounded-title class="text-xl">
  227. <span>{{ title }}</span>
  228. </rounded-title>
  229. <input-row class="mt-2" :msg="formType.type_name.msg"
  230. label="类型名称">
  231. <a-input v-model="formType.type_name.val" placeholder="类型名称"></a-input>
  232. </input-row>
  233. <input-row class="mt-2" :msg="formType.type_logo.msg"
  234. label="类型logo">
  235. <div class="svg-upload">
  236. <svg-icon :svgHref="formType.type_logo.val"></svg-icon>
  237. <div v-if="!formType.type_logo.val" class="null-box">
  238. 选择图标
  239. </div>
  240. <div class="absolute w-full h-full left-0 top-0
  241. justify-center text-white bg-gray-400
  242. items-center text-2xl flex opacity-0 hover:opacity-70"
  243. @click="openLogoHandle"
  244. >
  245. 点击选择图标文件
  246. </div>
  247. </div>
  248. </input-row>
  249. <input-row class="mt-2" :msg="formType.type_sort.msg"
  250. label="排序">
  251. <a-input-number v-model="formType.type_sort.val"
  252. placeholder="排序"></a-input-number>
  253. </input-row>
  254. <input-row class="mt-2" :msg="formType.type_key.msg"
  255. label="类型关键字key">
  256. <a-tooltip>
  257. <template slot="title">
  258. 用于浏览器的搜索关键字, 优化用户访问体验, 禁止重复, 为英文字母
  259. </template>
  260. <a-input v-model="formType.type_key.val" placeholder="类型关键字key"></a-input>
  261. </a-tooltip>
  262. </input-row>
  263. <input-row class="mt-2" :msg="formType.seo_key.msg"
  264. label="seo关键字">
  265. <a-tooltip>
  266. <template slot="title">
  267. 搜索引擎关注的关键字,多个用英文逗号隔开
  268. </template>
  269. <a-input v-model="formType.seo_key.val" placeholder="seo关键字"></a-input>
  270. </a-tooltip>
  271. </input-row>
  272. <input-row class="mt-2"
  273. label="">
  274. <div class="tags">
  275. <a-tag
  276. v-for="tag in tags"
  277. :key="tag"
  278. color="#2db7f5"
  279. closable @close="deleteTag"
  280. >
  281. {{ tag }}
  282. </a-tag>
  283. </div>
  284. </input-row>
  285. <div class="mt-2">
  286. <a-button type="primary" @click="handleReset">重置</a-button>
  287. <a-button type="primary" @click="handleSave">确认</a-button>
  288. </div>
  289. <pop :show="showLogoDialog" :loading="loading">
  290. <pop-card>
  291. <template slot="close-group">
  292. <a-button type="danger" @click="closeLogoHandle">关闭</a-button>
  293. </template>
  294. <image-table
  295. class="w-full h-full"
  296. :fileType="fileType"
  297. @cancel="closeLogoHandle"
  298. @ok="selectImageHandle">
  299. </image-table>
  300. </pop-card>
  301. </pop>
  302. </div>
  303. </template>
  304. <style scoped>
  305. .svg-upload{
  306. width: 90px;
  307. height: 90px;
  308. display: flex;
  309. justify-content: center;
  310. align-items: center;
  311. position: relative;
  312. border: 1px solid #ccc;
  313. border-radius: 5px;
  314. font-size: 45px;
  315. }
  316. .svg-upload .null-box{
  317. width: 100%;
  318. height: 100%;
  319. display: flex;
  320. justify-content: center;
  321. align-items: center;
  322. font-size: 20px;
  323. }
  324. .tags{
  325. width: 100%;
  326. display: flex;
  327. flex-wrap: wrap;
  328. justify-content: flex-start;
  329. align-items: center;
  330. }
  331. </style>