华西海圻ELN前端工程
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

518 lines
26 KiB

3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
  1. <template>
  2. <div>
  3. <LineLabel v-if="label" :label="label" />
  4. <div v-for="(item, index) in formConfig" :key="index">
  5. <template v-if="item.type === 'cardItem'">
  6. <div class="grid-container">
  7. <div v-for="(sItem, key) in item.config" class="form-item"
  8. :class="sItem.span == 1 ? 'full-row' : ''" :key="key">
  9. <template v-if="sItem.type === 'input'">
  10. <div class="form-title">{{ $t(sItem.label) }}</div>
  11. <HandleFormItem :field-item-label="fieldItemLabel" @blur="onBlur(key, $event)" :item="sItem"
  12. v-model="formFields[key]" :field-key="prefixKey + '_' + key" @copy="onCopy(sItem, key)"
  13. :error="errors[key]" @update:error="errors[key] = false"
  14. :orange-bg="orangeBgFields[key]" />
  15. </template>
  16. <template v-else-if="sItem.type === 'inputNumber'">
  17. <div class="form-title">{{ $t(sItem.label) }}</div>
  18. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  19. type="inputNumber" @blur="onBlur(key, $event)" :item="sItem"
  20. @input="onInputNumberChange(key, $event)" v-model="formFields[key]"
  21. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  22. :orange-bg="orangeBgFields[key]" />
  23. </template>
  24. </div>
  25. </div>
  26. </template>
  27. <template v-else-if="item.type === 'conditionItem'">
  28. <div class="form-item ">
  29. <div class="form-title fs-16" v-if="item.label">{{ $t(item.label) }}</div>
  30. <div v-for="(sItem, key) in item.config" class="c-Item grid-container">
  31. <div class="p-r-20">
  32. <div class="form-title">{{ $t(sItem.label) }}</div>
  33. <div class="flex flex1">
  34. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  35. type="select" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  36. @change="(e, type) => onSelectChange(key, e, type)" :error="errors[key]"
  37. @update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
  38. </div>
  39. </div>
  40. <div class="p-l-20">
  41. <div v-show="isShowOther(formFields[key])">
  42. <div class="form-title">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
  43. $t("template.common.other") }}</div>
  44. <div class="flex flex1">
  45. <HandleFormItem :field-item-label="fieldItemLabel"
  46. :field-key="prefixKey + '_' + sItem.otherCode" @blur="onBlur(key, $event)"
  47. :item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]"
  48. @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]"
  49. @update:error="errors[sItem.otherCode] = false" />
  50. </div>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. </template>
  56. <template v-else-if="item.type === 'attachment'">
  57. <div class="form-item ">
  58. <div class="form-title fs-16" v-if="item.label">{{ $t(item.label) }}</div>
  59. <div v-for="(sItem, key) in item.config" class="c-Item grid-container">
  60. <div class="p-r-20">
  61. <div class="form-title">{{ $t(sItem.label) }}</div>
  62. <div class="flex flex1">
  63. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  64. type="attachment" :item="sItem" :value="formFields[key]" @copy="onCopy(sItem, key)"
  65. @change="(e) => onAttachmentChange(key, e)" :error="errors[key]"
  66. @update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
  67. </div>
  68. </div>
  69. </div>
  70. </div>
  71. </template>
  72. <template v-else-if="item.type === 'cellItem'">
  73. <div class="form-item ">
  74. <div class="form-title fs-16" v-if="item.label">{{ $t(item.label) }}</div>
  75. <div class="grid-container gap2">
  76. <div v-for="(sItem, key) in item.config" class="c-Item" :class="getSpanClass(sItem)" :key="key">
  77. <div class="form-title" v-if="sItem.label">{{ $t(sItem.label) }}</div>
  78. <div v-if="sItem.type === 'dateTime'" class="flex1">
  79. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  80. type="dateTime" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  81. :error="errors[key]" @update:error="errors[key] = false"
  82. :orange-bg="orangeBgFields[key]" />
  83. </div>
  84. <div v-else-if="sItem.type === 'select'">
  85. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  86. type="select" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  87. @change="(e, type) => onSelectChange(key, e, type)" :error="errors[key]"
  88. @update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
  89. </div>
  90. <div v-else-if="sItem.type === 'input'" class="item-center">
  91. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  92. @blur="onBlur(key, $event)" :item="sItem" v-model="formFields[key]"
  93. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  94. :orange-bg="orangeBgFields[key]" />
  95. <span v-if="sItem.subType === 'text'" class="sub-text">{{ $t(sItem.subText) }}</span>
  96. <HandleFormItem class="ml-10" v-else-if="sItem.subType === 'button'" type="button" :item="getButtonItem(sItem)"
  97. @clickButton="(e) => handleClickButton(e, item)" />
  98. </div>
  99. <div v-else-if="sItem.type === 'textarea'">
  100. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  101. @blur="onBlur(key, $event)" type="textarea" :item="sItem" v-model="formFields[key]"
  102. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  103. :orange-bg="orangeBgFields[key]" />
  104. </div>
  105. <div v-else-if="sItem.type === 'clickable'" class="flex1">
  106. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  107. type="clickable" @clickable="handleClickable(sItem, key)" :error="errors[key]"
  108. @update:error="errors[key] = false" @resetRecord="resetRecord(key)" :item="sItem"
  109. :value="formFields[key]" />
  110. </div>
  111. <div v-else-if="sItem.type === 'checkboxList'" class="flex1">
  112. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  113. type="checkboxList" :item="sItem" :value="formFields[key]"
  114. @copy="onCopy(sItem, key)" @change="(e) => onAttachmentChange(key, e)"
  115. :error="errors[key]" @update:error="errors[key] = false"
  116. :orange-bg="orangeBgFields[key]" />
  117. </div>
  118. <div v-else-if="isRegent(sItem)" class="flex1">
  119. <HandleFormItem
  120. @beforeReagentSubmit="(data, callback) => onBeforeReagentSubmit(data, callback, key)"
  121. :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key" :type="sItem.type"
  122. sourceFrom="baseInfoFormPackage" :error="errors[key]"
  123. @update:error="errors[key] = false"
  124. @onRegentSubmit="(data, inputValue) => onRegentSubmit(data, inputValue, key, sItem)"
  125. :item="sItem" :value="formFields[key]" />
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. </template>
  131. <template v-else-if="item.type === 'step'">
  132. <div class="grid-container gap2">
  133. <div v-for="(sItem, key) in item.config" class="c-Item flex item-center"
  134. :class="getSpanClass(sItem)" :key="key">
  135. <div class="step-form-title"
  136. :style="{ 'width': sItem.labelWidth ? sItem.labelWidth + 'px' : '150px' }" v-if="sItem.label">
  137. {{ $t(sItem.label) }}</div>
  138. <div v-if="sItem.type === 'dateTime'" class="flex1">
  139. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  140. type="dateTime" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  141. :error="errors[key]" @update:error="errors[key] = false"
  142. :orange-bg="orangeBgFields[key]" />
  143. </div>
  144. <div v-else-if="sItem.type === 'select'" class="flex flex1">
  145. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  146. type="select" :item="sItem" style="width: auto;flex:1" v-model="formFields[key]"
  147. @copy="onCopy(sItem, key)" @change="(e, type) => onSelectChange(key, e, type)"
  148. :error="errors[key]" @update:error="errors[key] = false"
  149. :orange-bg="orangeBgFields[key]" />
  150. <div v-show="isShowOther(formFields[key])" class="flex flex1">
  151. <div class="other-title">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
  152. $t("template.common.other") }}</div>
  153. <div class="flex">
  154. <HandleFormItem :field-item-label="fieldItemLabel"
  155. :field-key="prefixKey + '_' + sItem.otherCode" @blur="onBlur(key, $event)"
  156. :item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]"
  157. @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]"
  158. @update:error="errors[sItem.otherCode] = false"
  159. :orange-bg="orangeBgFields[sItem.otherCode]" />
  160. </div>
  161. </div>
  162. </div>
  163. <div v-else-if="sItem.type === 'input'" class="flex flex1">
  164. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  165. @blur="onBlur(key, $event)" class="flex1" :item="sItem" v-model="formFields[key]"
  166. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  167. :orange-bg="orangeBgFields[key]" />
  168. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + sItem.subKey"
  169. class="ml-10" v-if="sItem.subType === 'select'" type="select" :item="getSubItem(sItem)"
  170. v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
  171. @change="(e, type) => onSelectChange(sItem.subKey, e, type)" :error="errors[sItem.subKey]"
  172. @update:error="errors[sItem.subKey] = false"
  173. :orange-bg="orangeBgFields[sItem.subKey]" />
  174. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + sItem.subKey"
  175. class="ml-10" v-if="sItem.subType === 'input'" type="input" :item="getSubItem(sItem)"
  176. v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
  177. :error="errors[sItem.subKey]" @blur="onBlur(sItem.subKey, $event)"
  178. @update:error="errors[sItem.subKey] = false"
  179. :orange-bg="orangeBgFields[sItem.subKey]" />
  180. <div class="ml-10 item-span" v-else-if="sItem.subType === 'span'">{{
  181. formFields[sItem.subKey] }}</div>
  182. <span v-else-if="sItem.subType === 'text'" class="sub-text">{{ $t(sItem.subText) }}</span>
  183. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + sItem.subKey"
  184. class="ml-10" v-else-if="sItem.subType === 'clickable'" type="clickable"
  185. @clickable="handleClickable(sItem, sItem.subKey)" :item="getClickableItem(sItem)"
  186. :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false"
  187. @resetRecord="resetRecord(sItem.subKey)" :value="formFields[sItem.subKey]" />
  188. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + sItem.subKey"
  189. class="ml-10" v-else-if="isRegent(sItem, 'subType')" :type="sItem.subType"
  190. :item="getRegentItem(sItem, 'subType')" sourceFrom="baseInfoFormPackage"
  191. @beforeReagentSubmit="(data, callback) => onBeforeReagentSubmit(data, callback, sItem.subKey)"
  192. @onRegentSubmit="(data, inputValue) => onRegentSubmit(data, inputValue, sItem.subKey, sItem)"
  193. :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false"
  194. :value="formFields[sItem.subKey]" />
  195. <div v-show="isShowOther(formFields[sItem.subKey])" class="flex flex1">
  196. <div class="other-title">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
  197. $t("template.common.other") }}</div>
  198. <div class="flex flex1">
  199. <HandleFormItem :field-item-label="fieldItemLabel"
  200. :field-key="prefixKey + '_' + sItem.otherCode" @blur="onBlur(key, $event)"
  201. :item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]"
  202. @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]"
  203. @update:error="errors[sItem.otherCode] = false"
  204. :orange-bg="orangeBgFields[sItem.otherCode]" />
  205. </div>
  206. </div>
  207. <!-- <div class="clickable" :class="getFillType(sItem.subFillType)" v-else-if = "sItem.subType ==='clickable'" @click="handleClickable(sItem,$event)">
  208. <span v-if="formFields[sItem.subKey]">{{ formFields[sItem.subKey] }}</span>
  209. <span v-else class="default-placeholder-text">请选择</span>
  210. </div> -->
  211. </div>
  212. <div v-else-if="sItem.type === 'inputNumber'" class="flex flex1">
  213. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  214. type="inputNumber" @blur="onBlur(key, $event)" class="flex1" :item="sItem"
  215. @input="onInputNumberChange(key, $event)" :value="formFields[key]"
  216. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  217. :orange-bg="orangeBgFields[key]" />
  218. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + sItem.subKey"
  219. class="ml-10" v-if="sItem.subType === 'select'" type="select" :item="getSubItem(sItem)"
  220. v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
  221. @change="(e, type) => onSelectChange(sItem.subKey, e, type)" :error="errors[sItem.subKey]"
  222. @update:error="errors[sItem.subKey] = false"
  223. :orange-bg="orangeBgFields[sItem.subKey]" />
  224. <div class="ml-10 item-span" v-else-if="sItem.subType === 'span'">{{
  225. formFields[sItem.subKey] }}</div>
  226. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + sItem.subKey"
  227. class="ml-10" v-else-if="sItem.subType === 'clickable'"
  228. @clickable="handleClickable(sItem, sItem.subKey)" :error="errors[sItem.subKey]"
  229. type="clickable" @update:error="errors[sItem.subKey] = false"
  230. @resetRecord="resetRecord(sItem.subKey)" :item="getClickableItem(sItem)"
  231. :value="formFields[sItem.subKey]" />
  232. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + sItem.subKey"
  233. class="ml-10" v-else-if="isRegent(sItem, 'subType')" sourceFrom="baseInfoFormPackage"
  234. :error="errors[sItem.subKey]" :type="sItem.subType"
  235. @beforeReagentSubmit="(data, callback) => onBeforeReagentSubmit(data, callback, sItem.subKey)"
  236. @onRegentSubmit="(data, inputValue) => onRegentSubmit(data, inputValue, sItem.subKey, sItem)"
  237. :item="getRegentItem(sItem, 'subType')" :value="formFields[sItem.subKey]" />
  238. </div>
  239. <div v-else-if="sItem.type === 'clickable'" class="flex flex1">
  240. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  241. type="clickable" @clickable="handleClickable(sItem, key)" :error="errors[key]"
  242. @update:error="errors[key] = false" @resetRecord="resetRecord(key)" :item="sItem"
  243. :value="formFields[key]" />
  244. </div>
  245. <div v-else-if="sItem.type === 'checkboxList'" class="flex flex1">
  246. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  247. type="checkboxList" :item="sItem" :value="formFields[key]" @copy="onCopy(sItem, key)"
  248. @change="(e) => onAttachmentChange(key, e)" :error="errors[key]"
  249. @update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
  250. </div>
  251. <div v-else-if="isRegent(sItem)" class="flex item-center flex1">
  252. <HandleFormItem :field-item-label="fieldItemLabel" sourceFrom="baseInfoFormPackage"
  253. @beforeReagentSubmit="(data, callback) => onBeforeReagentSubmit(data, callback, key)"
  254. @onRegentSubmit="(data, inputValue) => onRegentSubmit(data, inputValue, key, sItem)"
  255. :field-key="prefixKey + '_' + key" :type="sItem.type" :error="errors[key]"
  256. @update:error="errors[key] = false" :item="getRegentItem(sItem)"
  257. :value="formFields[key]" />
  258. <span v-if="sItem.subType === 'text'" class="sub-text">{{ $t(sItem.subText) }}</span>
  259. </div>
  260. </div>
  261. </div>
  262. </template>
  263. <template v-else-if="item.type === 'checkboxList'">
  264. <div class="form-item ">
  265. <div class="form-title fs-16" v-if="item.label">{{ $t(item.label) }}</div>
  266. <div v-for="(sItem, key) in item.config" class="c-Item grid-container">
  267. <div class="p-r-20 item-center">
  268. <div class="form-title mr-20">{{ $t(sItem.label) }}</div>
  269. <div class="flex flex1">
  270. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  271. type="checkboxList" :item="sItem" :value="formFields[key]"
  272. @copy="onCopy(sItem, key)" @change="(e) => onAttachmentChange(key, e)"
  273. :error="errors[key]" @update:error="errors[key] = false"
  274. :orange-bg="orangeBgFields[key]" />
  275. </div>
  276. </div>
  277. </div>
  278. </div>
  279. </template>
  280. </div>
  281. </div>
  282. </template>
  283. <script>
  284. import HandleFormItem from "./HandleFormItem.vue";
  285. import LineLabel from "./LineLabel.vue";
  286. import { isShowOther } from "@/utils/formPackageCommon.js";
  287. import { isRegent } from "@/utils/index.js";
  288. import formPackageMixins from '@/components/Template/mixins/formPackageMixins.js'
  289. export default {
  290. inject: ['templateFillType'],
  291. components: {
  292. HandleFormItem,
  293. LineLabel
  294. },
  295. mixins: [formPackageMixins],
  296. props: {
  297. label: {//当前表单的标题
  298. type: String,
  299. default: "",
  300. },
  301. formConfig: {
  302. type: Array,
  303. value: () => [],
  304. },
  305. formData: {
  306. type: Object,
  307. value: () => ({})
  308. },
  309. //主要标识当前表单属于哪个模块,用于传给后端
  310. fieldItemLabel: {
  311. type: String,
  312. default: "",
  313. },
  314. //循环组件的情况下需要用这个来区分字段
  315. prefixKey: {
  316. type: String,
  317. default: "",
  318. }
  319. },
  320. data() {
  321. return {
  322. formFields: {},//表单绑定字段
  323. allFieldsConfig: {},//包含config的所有字段,主要用于校验表单是否填写
  324. errors: {},//存储表单错误信息,用于标红提示
  325. orangeBgFields: {},// 存储需要橙色背景的字段
  326. oldFormFields: {},// 存储旧的表单数据,用于比较变化
  327. isShowOther,
  328. isRegent
  329. };
  330. },
  331. methods: {
  332. onBeforeReagentSubmit(data, callback, key) {
  333. this.$emit('beforeReagentSubmit', { selectData: data, callback, key, formFields: this.formFields })
  334. },
  335. // 点击按钮
  336. handleClickButton(e, item) {
  337. this.$emit("clickButton", e, item)
  338. },
  339. // 获取按钮项
  340. getButtonItem(sItem) {
  341. return {
  342. ...sItem,
  343. fillType: sItem.subFillType || sItem.fillType
  344. }
  345. },
  346. }
  347. }
  348. </script>
  349. <style lang="scss">
  350. .grid-container {
  351. display: grid;
  352. grid-template-columns: repeat(2, 1fr);
  353. /* 默认2列 */
  354. gap: 0 20px;
  355. /* 防止网格容器被分割到不同页面 */
  356. page-break-inside: avoid;
  357. break-inside: avoid;
  358. }
  359. .gap2 {
  360. gap: 0 48px;
  361. }
  362. .w-100 {
  363. width: 100%;
  364. }
  365. .form-item {
  366. background: #fff;
  367. padding: 20px;
  368. border-radius: 8px;
  369. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
  370. margin-top: 20px;
  371. padding: 20px;
  372. border-radius: 5px 5px;
  373. page-break-inside: avoid;
  374. }
  375. /* 或者使用 span 语法 */
  376. .full-row {
  377. grid-column: span 2;
  378. }
  379. .three-row {
  380. grid-column: span 3;
  381. }
  382. .c-Item {
  383. // &:not(:last-child) {
  384. // margin-bottom: 16px;
  385. // }
  386. page-break-inside: avoid;
  387. padding: 8px 0px;
  388. }
  389. .eo {
  390. &:nth-child(even) {
  391. padding-left: 20px;
  392. }
  393. &:nth-child(odd) {
  394. padding-right: 20px;
  395. }
  396. }
  397. .default-placeholder-text {
  398. color: #C0C4CC;
  399. }
  400. .form-title {
  401. margin-bottom: 12px;
  402. font-size: 14px;
  403. font-weight: normal;
  404. color: #606266;
  405. }
  406. .step-form-title {
  407. font-size: 14px;
  408. font-weight: normal;
  409. color: #606266;
  410. width: 150px;
  411. text-align: right;
  412. padding-right: 10px;
  413. }
  414. .p-r-20 {
  415. padding-right: 20px;
  416. }
  417. .p-l-20 {
  418. padding-left: 20px;
  419. }
  420. .fs-16 {
  421. font-size: 0.96rem;
  422. font-weight: bold;
  423. color: #464647
  424. }
  425. .flex1 {
  426. flex: 1;
  427. }
  428. .flex {
  429. display: flex;
  430. }
  431. .other-title {
  432. width: 50px;
  433. text-align: right;
  434. margin: 0 10px;
  435. font-size: 14px;
  436. font-weight: normal;
  437. color: #606266;
  438. }
  439. .mr-24 {
  440. margin-right: 24px;
  441. }
  442. .sub-select {
  443. width: 100px;
  444. margin-left: 10px;
  445. }
  446. .orange-border {
  447. border-color: #f9c588;
  448. }
  449. .green-border {
  450. border-color: green;
  451. }
  452. .blue-border {
  453. border-color: #4ea2ff;
  454. }
  455. .ml-10 {
  456. margin-left: 10px;
  457. }
  458. .item-span {
  459. color: #606266;
  460. font-size: 14px;
  461. }
  462. .item-center {
  463. display: flex;
  464. align-items: center;
  465. }
  466. .ml-5 {
  467. margin-left: 5px;
  468. }
  469. .sub-text {
  470. color: #606266;
  471. font-size: 14px;
  472. margin-left: 5px;
  473. }
  474. .mr-20 {
  475. margin-right: 20px;
  476. }
  477. </style>