AdwebSiteForm.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <template>
  2. <a-spin :spinning="confirmLoading">
  3. <JFormContainer :disabled="disabled">
  4. <template #detail>
  5. <a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
  6. <a-row>
  7. <a-col :span="24">
  8. <a-form-item label="创建人" v-bind="validateInfos.uid">
  9. <j-select-user v-model:value="formData.uid" allow-clear disabled="true" />
  10. </a-form-item>
  11. </a-col>
  12. <a-col :span="24">
  13. <a-form-item label="站点名称" v-bind="validateInfos.name">
  14. <a-input v-model:value="formData.name" placeholder="请输入站点名称" allow-clear />
  15. </a-form-item>
  16. </a-col>
  17. <a-col :span="24">
  18. <a-form-item label="是否发布" v-bind="validateInfos.status">
  19. <a-radio-group v-model:value="formData.status" option-type="button" :options="statusList" />
  20. </a-form-item>
  21. </a-col>
  22. <a-col :span="24">
  23. <a-form-item label="是否有正式域名" v-bind="validateInfos.isDomain">
  24. <a-radio-group v-model:value="formData.isDomain" option-type="button" :options="isDomainList" />
  25. </a-form-item>
  26. </a-col>
  27. <a-col :span="24" v-if="formData.status == 1">
  28. <a-form-item label="正式服务名称" v-bind="validateInfos.prodServerName">
  29. <a-input v-model:value="formData.prodServerName" placeholder="请输入正式服务名称" allow-clear />
  30. </a-form-item>
  31. </a-col>
  32. <a-col :span="24" v-if="formData.status == 1">
  33. <a-form-item label="正式服务IP" v-bind="validateInfos.prodServerIp">
  34. <a-input v-model:value="formData.prodServerIp" placeholder="请输入正式服务IP" allow-clear />
  35. </a-form-item>
  36. </a-col>
  37. <a-col :span="24">
  38. <a-form-item label="站点域名" v-bind="validateInfos.domain">
  39. <a-input v-model:value="formData.domain" placeholder="请输入站点域名" allow-clear />
  40. </a-form-item>
  41. </a-col>
  42. <a-col :span="24">
  43. <a-form-item label="临时站点域名" v-bind="validateInfos.domainDev">
  44. <a-input v-model:value="formData.domainDev" placeholder="请输入临时站点域名" allow-clear disabled="true" />
  45. </a-form-item>
  46. </a-col>
  47. <a-col :span="24">
  48. <a-form-item label="到期时间" v-bind="validateInfos.etime">
  49. <a-date-picker
  50. placeholder="请选择到期时间,默认为ctime+1年"
  51. v-model:value="formData.etime"
  52. showTime
  53. value-format="YYYY-MM-DD HH:mm:ss"
  54. style="width: 100%"
  55. allow-clear
  56. />
  57. </a-form-item>
  58. </a-col>
  59. <a-col :span="24">
  60. <a-form-item label="发布正式时间" v-bind="validateInfos.issueTime">
  61. <a-date-picker
  62. placeholder="请选择发布正式环境时间(首次发布)"
  63. v-model:value="formData.issueTime"
  64. showTime
  65. value-format="YYYY-MM-DD HH:mm:ss"
  66. style="width: 100%"
  67. allow-clear
  68. />
  69. </a-form-item>
  70. </a-col>
  71. <a-col :span="24">
  72. <a-form-item label="是否是演示站" v-bind="validateInfos.isDemo">
  73. <a-radio-group v-model:value="formData.isDemo" option-type="button" :options="isDemoList" />
  74. </a-form-item>
  75. </a-col>
  76. </a-row>
  77. </a-form>
  78. </template>
  79. </JFormContainer>
  80. </a-spin>
  81. </template>
  82. <script lang="ts" setup>
  83. import { computed, defineExpose, defineProps, nextTick, reactive, ref } from 'vue';
  84. import { useMessage } from '/src/hooks/web/useMessage';
  85. import JSelectUser from '/src/components/Form/src/jeecg/components/JSelectUser.vue';
  86. import { getValueType } from '/src/utils';
  87. import { saveOrUpdate } from '../AdwebSite.api';
  88. import { Form } from 'ant-design-vue';
  89. import JFormContainer from '/src/components/Form/src/container/JFormContainer.vue';
  90. const props = defineProps({
  91. formDisabled: { type: Boolean, default: false },
  92. formData: { type: Object, default: () => ({}) },
  93. formBpm: { type: Boolean, default: true },
  94. });
  95. const formRef = ref();
  96. const useForm = Form.useForm;
  97. const emit = defineEmits(['register', 'ok']);
  98. const formData = reactive<Record<string, any>>({
  99. id: '',
  100. uid: '',
  101. name: '',
  102. domain: '',
  103. isDomain: 0,
  104. isDemo: 0,
  105. status: 0,
  106. domainDev: '',
  107. etime: '',
  108. issueTime: '',
  109. prodServerName: '',
  110. prodServerIp: '',
  111. });
  112. const { createMessage } = useMessage();
  113. const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
  114. const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
  115. const confirmLoading = ref<boolean>(false);
  116. //表单验证
  117. const validatorRules = reactive({
  118. uid: [{ required: true, message: '请输入用户ID,与用户表关联!' }],
  119. name: [{ required: true, message: '请输入站点名称!' }],
  120. domain: [{ required: true, message: '请输入站点域名!' }],
  121. etime: [{ required: true, message: '请输入到期时间,默认为ctime+1年!' }],
  122. });
  123. const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
  124. const isDomainList = ref([
  125. {
  126. value: 0,
  127. label: '否',
  128. },
  129. {
  130. value: 1,
  131. label: '是',
  132. },
  133. ]);
  134. const statusList = ref([
  135. {
  136. value: 0,
  137. label: '已删除',
  138. },
  139. {
  140. value: 1,
  141. label: '已发布',
  142. },
  143. {
  144. value: 2,
  145. label: '临时站点已创建',
  146. },
  147. {
  148. value: 3,
  149. label: '临时站点正在创建',
  150. },
  151. {
  152. value: 4,
  153. label: '临时站点创建失败',
  154. },
  155. {
  156. value: 5,
  157. label: '正式站点正在创建',
  158. },
  159. {
  160. value: 6,
  161. label: '正式站点创建失败',
  162. },
  163. ]);
  164. const isDemoList = ref([
  165. {
  166. value: 0,
  167. label: '否',
  168. },
  169. {
  170. value: 1,
  171. label: '是',
  172. },
  173. ]);
  174. // 表单禁用
  175. const disabled = computed(() => {
  176. if (props.formBpm === true) {
  177. if (props.formData.disabled === false) {
  178. return false;
  179. } else {
  180. return true;
  181. }
  182. }
  183. return props.formDisabled;
  184. });
  185. /**
  186. * 新增
  187. */
  188. function add() {
  189. edit({});
  190. }
  191. /**
  192. * 编辑
  193. */
  194. function edit(record) {
  195. nextTick(() => {
  196. resetFields();
  197. const tmpData = {};
  198. Object.keys(formData).forEach((key) => {
  199. if (record.hasOwnProperty(key)) {
  200. tmpData[key] = record[key];
  201. }
  202. });
  203. //赋值
  204. Object.assign(formData, tmpData);
  205. });
  206. }
  207. /**
  208. * 提交数据
  209. */
  210. async function submitForm() {
  211. // 触发表单验证
  212. await validate();
  213. confirmLoading.value = true;
  214. const isUpdate = ref<boolean>(false);
  215. //时间格式化
  216. let model = formData;
  217. if (model.id) {
  218. isUpdate.value = true;
  219. }
  220. //循环数据
  221. for (let data in model) {
  222. //如果该数据是数组并且是字符串类型
  223. if (model[data] instanceof Array) {
  224. let valueType = getValueType(formRef.value.getProps, data);
  225. //如果是字符串类型的需要变成以逗号分割的字符串
  226. if (valueType === 'string') {
  227. model[data] = model[data].join(',');
  228. }
  229. }
  230. }
  231. await saveOrUpdate(model, isUpdate.value)
  232. .then((res) => {
  233. if (res.success) {
  234. createMessage.success(res.message);
  235. emit('ok');
  236. } else {
  237. createMessage.warning(res.message);
  238. }
  239. })
  240. .finally(() => {
  241. confirmLoading.value = false;
  242. });
  243. }
  244. defineExpose({
  245. add,
  246. edit,
  247. submitForm,
  248. });
  249. </script>
  250. <style lang="less" scoped>
  251. .antd-modal-form {
  252. padding: 14px;
  253. }
  254. </style>