index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. <template>
  2. <div v-loading="loading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)" class="PublicPageForm">
  3. <el-form ref="ruleForm" :model="tableForm" :label-width="labelWidth">
  4. <el-row :gutter="20">
  5. <el-col v-for="(item, index) in formItemArr" :key=" index" :span="formType == 'horizontal' ? formSpan : 24" v-show="isShow(item.isdisplay)">
  6. <el-form-item :rules="fromDataReq(item)" :prop="item.pagecode" :label="item.pagename">
  7. <template v-if="fromDataType(item.datatype) == 'SELECT' || fromDataType(item.datatype) == 'SELECTS'">
  8. <el-select class="input-shadow" size="small" :multiple="fromDataType(item.datatype) == 'SELECTS'?true:false" filterable default-first-option style="width: 100%" v-model="tableForm[item.pagecode]" @change="changeSelect(item.pagecode, item)" placeholder="请选择" clearable @clear="tableForm[item.pagecode] = ''">
  9. <el-option v-for="itemParams in tableOptions[item.pagecode]" :key="itemParams[item['dropdownlistid']]" :label="itemParams[item['dropdownlistlabel']]" :value="itemParams[item['dropdownlistid']]">
  10. </el-option>
  11. </el-select>
  12. </template>
  13. <template v-else-if="fromDataType(item.datatype) == 'DROP'">
  14. <el-select class="input-shadow" size="small" multiple filterable default-first-option style="width: 100%" v-model="tableForm[item.pagecode]" @change="changeSelect(item.pagecode, item)" placeholder="请选择" clearable @clear="tableForm[item.pagecode] = ''">
  15. <el-option v-for="itemParams in tableOptions[item.pagecode]" :key="itemParams['dropdownlistid']" :label="itemParams['dropdownlistlabel']" :value="itemParams['dropdownlistid']">
  16. </el-option>
  17. </el-select>
  18. </template>
  19. <template v-else-if="fromDataType(item.datatype) == 'TEXT' || fromDataType(item.datatype) == 'VARCHAR'">
  20. <el-input size="small" @change="inputChangeHandler(item.pagecode)" v-model="tableForm[item.pagecode]"></el-input>
  21. </template>
  22. <template v-else-if="fromDataType(item.datatype) == 'TEXTAREA'">
  23. <el-input type="textarea" v-model="tableForm[item.pagecode]"></el-input>
  24. </template>
  25. <template v-else-if="fromDataType(item.datatype) == 'PASSWORD'">
  26. <el-input show-password v-model="tableForm[item.pagecode]"></el-input>
  27. </template>
  28. <template v-else-if="fromDataType(item.datatype) == 'UPLOAD'">
  29. <upload-item :id="index" :base-img="tableForm[item.pagecode]" ref="upload" />
  30. </template>
  31. <template v-else-if="fromDataType(item.datatype) == 'SWITCH'">
  32. <el-switch v-model="tableForm[item.pagecode]"></el-switch>
  33. </template>
  34. <template v-else-if="fromDataType(item.datatype) == 'CASCADER'">
  35. <el-cascader v-model="tableForm[item.pagecode]" :options="tableOptions[item.pagecode]"></el-cascader>
  36. </template>
  37. <template v-else-if="fromDataType(item.datatype) == 'CHECKBOX'">
  38. <el-checkbox-group v-model="tableForm[item.pagecode]">
  39. <el-checkbox v-for="itemParams in tableOptions[item.pagecode]" :key="itemParams[item['dropdownlistid']]" :label="itemParams[item['dropdownlistid']]" name="type">{{ [item['dropdownlistlabel']] }}</el-checkbox>
  40. </el-checkbox-group>
  41. </template>
  42. <template v-else-if="fromDataType(item.datatype) == 'RADIO'">
  43. <el-radio-group v-model="tableForm[item.pagecode]">
  44. <el-radio v-for="itemParams in tableOptions[item.pagecode]" :key="itemParams[item['dropdownlistid']]" :label="itemParams[item['dropdownlistid']]" name="type">{{ [item['dropdownlistlabel']] }}</el-radio>
  45. </el-radio-group>
  46. </template>
  47. <template v-else-if="fromDataType(item.datatype) == 'TIME'">
  48. <el-time-picker :picker-options="{selectableRange: '00:00:00 - 23:59:59'}" v-model="tableForm[item.pagecode]" placeholder="选择任意时间段" @change="inputChangeHandler(item.pagecode)">
  49. </el-time-picker>
  50. </template>
  51. <template v-else-if="fromDataType(item.datatype) == 'DATE'">
  52. <el-date-picker class="datetimes" value-format="yyyy-MM-dd" v-model="tableForm[item.pagecode]" type="date" placeholder="选择日期" @change="inputChangeHandler(item.pagecode)">
  53. </el-date-picker>
  54. </template>
  55. <template v-else-if="fromDataType(item.datatype) == 'DATETIME'">
  56. <el-date-picker class="datetimes" value-format="yyyy-MM-dd HH:mm:ss" v-model="tableForm[item.pagecode]" type="datetime" placeholder="选择日期时间" @change="inputChangeHandler(item.pagecode)">
  57. </el-date-picker>
  58. </template>
  59. <template v-else-if="fromDataType(item.datatype) == 'INT' || fromDataType(item.datatype) == 'tinyint' || fromDataType(item.datatype) == 'NUMBER'">
  60. <el-input size="small" v-model.number="tableForm[item.pagecode]" onkeyup="value=value.replace(/[^1-9]/g,'')" @change="inputChangeHandler(item.pagecode)"></el-input>
  61. </template>
  62. <template v-else>
  63. <el-input size="small" v-model="tableForm[item.pagecode]" @change="inputChangeHandler(item.pagecode)"></el-input>
  64. </template>
  65. </el-form-item>
  66. </el-col>
  67. </el-row>
  68. </el-form>
  69. </div>
  70. </template>
  71. <script>
  72. import { Query } from "@/api/webApi"
  73. import uploadItem from './upload.vue'
  74. import JSEncrypt from "jsencrypt"
  75. import { mapGetters } from 'vuex'
  76. export default {
  77. name: 'PublicPageForm',
  78. components: { uploadItem },
  79. props: {
  80. formType: {
  81. type: String,
  82. default: 'vertical' //horizontal--水平布局 默认一行3列
  83. },
  84. formItem: {
  85. type: Array,
  86. default: () => new Array()
  87. },
  88. formPass: {
  89. type: Array,
  90. default: () => new Array()
  91. },
  92. formData: {
  93. type: Object,
  94. default: () => new Object()
  95. },
  96. formSpan: {
  97. type: Number,
  98. default: 8
  99. },
  100. formType: {
  101. type: String,
  102. default: 'add'
  103. },
  104. labelWidth: {
  105. type: String,
  106. default: '80px'
  107. }
  108. },
  109. data () {
  110. return {
  111. tableForm: {},
  112. tableOptions: {},
  113. formItemArr: [],
  114. loading: false
  115. }
  116. },
  117. computed: {
  118. ...mapGetters(['authMsg']),
  119. },
  120. watch: {
  121. formItem: {
  122. handler (array) {
  123. this.getSelectData(array)
  124. },
  125. deep: true,
  126. immediate: true
  127. },
  128. formPass: {
  129. handler (array) {
  130. this.setPassters(array)
  131. },
  132. deep: true
  133. },
  134. formData: {
  135. handler (obj) {
  136. if (!Object.keys(obj).length) {
  137. const nload = this.formItemArr.filter(item => item.datatype == 'upload' || item.datatype == 'UPLOAD')
  138. if (nload?.length) this.clearTypeUpload(nload)
  139. }
  140. this.tableForm = obj
  141. },
  142. deep: true,
  143. immediate: true
  144. }
  145. },
  146. computed: {
  147. //设置新增修改表单类型
  148. fromDataType () {
  149. return function (type) {
  150. if (type) {
  151. return type.toLocaleUpperCase().replace(/\([^\)]*\)/g, "");
  152. }
  153. }
  154. },
  155. //设置新增修改表单必填类型
  156. fromDataReq () {
  157. return function (item) {
  158. const { dropdownlist, datatype, pagename, isrequired, formatrule } = item
  159. const itemType = datatype.replace(/\([^\)]*\)/g, "")
  160. const itemReq = isrequired ? true : false
  161. const itemRule = formatrule ? true : false
  162. if (dropdownlist || dropdownlist == 0) return [{ required: itemReq, message: `${pagename}不能为空`, trigger: 'change' }]
  163. else if (itemType == 'date' || itemType == 'datetime') return [{ required: itemReq, type: 'date', message: `${pagename}不能为空`, trigger: 'change' }]
  164. else
  165. if (itemReq && itemRule) return [{ required: itemReq, message: `${pagename}不能为空`, trigger: 'blur' }, { pattern: new RegExp(formatrule), message: `请输入合法的${pagename}规则`, trigger: 'blur' }]
  166. return [{ required: itemReq, message: `${pagename}不能为空`, trigger: 'blur' }]
  167. }
  168. },
  169. },
  170. methods: {
  171. //格式化传递参数数据
  172. formatDefault (item) {
  173. if (typeof item != 'string') return {}
  174. const filterItem = {}
  175. const parameters = item.replace('{', '').replace('}', '')
  176. const parametersSplit = parameters?.split(',')
  177. parametersSplit.map(item => {
  178. const [key, val] = item?.split(':')
  179. filterItem[key] = val
  180. })
  181. return filterItem
  182. },
  183. //获取表单下拉数据
  184. getSelectData (formItem = []) {
  185. if (!formItem.length || !Array.isArray(formItem)) return
  186. const formItemCopy = _.cloneDeep(formItem)
  187. const [allResult, allResultKey] = [[], []]
  188. formItemCopy.map(({ dropdownlist, pagecode, defaultparameters }) => {
  189. if (((dropdownlist || dropdownlist == 0) && dropdownlist != "")) {
  190. const datacontent = defaultparameters ? { filter: this.formatDefault(defaultparameters) } : { filter: { 1: 1 } }
  191. allResultKey.push(pagecode)
  192. allResult.push(Query({ serviceid: dropdownlist, datacontent, event: '0' }))
  193. }
  194. })
  195. this.getAnscyData(allResultKey, allResult, _.cloneDeep(formItem))
  196. },
  197. //获取异步数据
  198. async getAnscyData (allResultKey = [], allResult = [], formItem = []) {
  199. this.loading = true
  200. if (allResult.length && allResultKey.length) {
  201. const results = await Promise.allSettled(allResult)
  202. results.map((item, index) => {
  203. const { status, value } = item
  204. if (status == 'fulfilled') {
  205. const { code, returnData } = value
  206. this.tableOptions[allResultKey[index]] = code == 0 && returnData?.length ? this.formatData(returnData) : []
  207. }
  208. })
  209. this.formItemArr = formItem
  210. } else {
  211. this.formItemArr = formItem
  212. }
  213. this.setPassters(this.formPass)
  214. this.loading = false
  215. },
  216. //设置下拉数据
  217. setPassters (array = []) {
  218. const passitem = this.formItemArr.filter(item => item.pagecode == 'passparameters')
  219. if (passitem?.length) {
  220. const passitemkey = passitem[0]
  221. passitemkey.datatype = 'DROP'
  222. array.map(item => {
  223. item.dropdownlistid = item.pageconfigurationid
  224. item.dropdownlistlabel = item.pagename
  225. })
  226. this.tableOptions['passparameters'] = array
  227. }
  228. },
  229. formatData (returnData) {
  230. return typeof returnData == 'string' ? JSON.parse(returnData) : returnData
  231. },
  232. //获取表单下拉数据
  233. changeSelect (code) {
  234. const ndata = this.authMsg.filter(item => item.labelcode && item.pagecode == code)
  235. if (ndata?.length) {
  236. const nitem = ndata[0]
  237. const nval = this.tableForm[code]
  238. const { dropdownlistlabel, labelcode, dropdownlistid } = nitem
  239. const wdata = this.tableOptions[code].filter(item => item[dropdownlistid] == nval)
  240. if (!wdata.length) return
  241. const witem = wdata[0]
  242. this.tableForm[labelcode] = witem[dropdownlistlabel]
  243. }
  244. },
  245. inputChangeHandler (data) {
  246. if (!this.tableForm[data]) this.tableForm[data] = null
  247. },
  248. restForm () {
  249. this.$refs['ruleForm'].resetFields()
  250. },
  251. addTypePassWord (ndata = []) {
  252. if (ndata?.length) {
  253. const pubKeyStr = sessionStorage.getItem('pubKeyStr')
  254. if (!pubKeyStr) return
  255. ndata.map(({ pagecode }) => {
  256. const jse = new JSEncrypt()
  257. jse.setPublicKey(pubKeyStr)
  258. this.tableForm[pagecode] = jse.encrypt(this.tableForm[pagecode].replace(/\s+/g, ""))
  259. })
  260. }
  261. },
  262. addTypeUpload (nload = []) {
  263. if (nload?.length) {
  264. const files = this.$refs['upload']
  265. files.map((item, index) => {
  266. this.tableForm[nload[index]['pagecode']] = item.imageUrl
  267. })
  268. }
  269. },
  270. formatPass (npass = []) {
  271. const datas = []
  272. const maps = []
  273. if (Array.isArray(npass) && npass?.length) {
  274. this.formPass.filter(item => {
  275. npass.map(p => {
  276. if (item.dropdownlistid == p) {
  277. datas.push(item)
  278. }
  279. })
  280. })
  281. } else {
  282. this.tableForm.passparameters = null
  283. }
  284. if (datas?.length) {
  285. datas.map(item => {
  286. const nitem = {}
  287. nitem['pagecode'] = item.pagecode;
  288. nitem['alias'] = item.alias;
  289. nitem['pageconfigurationid'] = item.pageconfigurationid
  290. maps.push(nitem)
  291. })
  292. this.tableForm.passparameters = JSON.stringify(maps)
  293. } else {
  294. this.tableForm.passparameters = null
  295. }
  296. },
  297. clearTypeUpload (nload = []) {
  298. if (nload?.length) {
  299. const files = this.$refs['upload']
  300. files.map((item) => {
  301. item.imageUrl = ''
  302. item.$el.firstChild.value = ''
  303. })
  304. }
  305. },
  306. // 新增/编辑-确认
  307. submitClickHandler () {
  308. let flag = false
  309. const ndata = this.formItemArr.filter(item => item.datatype == 'password' || item.datatype == 'PASSWORD')
  310. const nload = this.formItemArr.filter(item => item.datatype == 'upload' || item.datatype == 'UPLOAD')
  311. const npass = this.tableForm.passparameters
  312. if (nload?.length) this.addTypeUpload(nload)
  313. if (ndata?.length) this.addTypePassWord(ndata)
  314. if (npass) { this.formatPass(npass) }
  315. this.$refs["ruleForm"].validate((valid) => {
  316. if (valid) {
  317. flag = true
  318. if (this.tableForm.hasOwnProperty('passparameters') && !this.tableForm.passparameters) {
  319. delete this.tableForm.passparameters
  320. }
  321. this.clearTypeUpload(nload)
  322. } else {
  323. flag = false;
  324. }
  325. });
  326. return flag
  327. },
  328. isShow (isdisplay) {
  329. let show = false
  330. if (eval(isdisplay)) {
  331. show = true
  332. }
  333. else {
  334. show = false
  335. }
  336. return show
  337. }
  338. }
  339. }
  340. </script>