typeEdit.vue 8.5 KB

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