editNode.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <template>
  2. <div class="system-edit-dic-container">
  3. <el-dialog :title="(ruleForm.nodeId !== 0 ? '修改' : '添加') + '数据节点'" v-model="isShowDialog" width="769px">
  4. <el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
  5. <el-form-item label="数据节点标识" prop="key">
  6. <el-input v-model="ruleForm.key" placeholder="请输入数据节点名称" :disabled="ruleForm.nodeId"/>
  7. </el-form-item>
  8. <el-form-item label="数据节点名称" prop="name">
  9. <el-input v-model="ruleForm.name" placeholder="请输入数据节点名称" />
  10. </el-form-item>
  11. <el-form-item label="是否主键" prop="isPk">
  12. <el-radio-group v-model="ruleForm.isPk">
  13. <el-radio :label="0">否</el-radio>
  14. <el-radio :label="1">是</el-radio>
  15. </el-radio-group>
  16. </el-form-item>
  17. <el-form-item label="数据类型" prop="dataType">
  18. <el-select v-model="ruleForm.dataType" filterable placeholder="请选择数据类型">
  19. <el-option v-for="item in tabData" :key="item.value" :label="item.label" :value="item.value" />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="取值项" prop="value">
  23. <el-input v-model="ruleForm.value" placeholder="请输入取值项" />
  24. </el-form-item>
  25. <el-divider content-position="left">规则表达式</el-divider>
  26. <div v-for="(item, index) in rule" :key="index">
  27. <el-form-item label="正则表达式">
  28. <el-input v-model="item.expression" placeholder="请输入规则表达式" />
  29. </el-form-item>
  30. <el-form-item label="替换内容">
  31. <el-input v-model="item.replace" placeholder="请输入替换内容" class="w-35" />
  32. <!-- <el-input v-model="rule[index].params.name" placeholder="请输入键值" class="w-35" />
  33. <el-input v-model="rule[index].params.value" placeholder="请输入值" class="w-35" /> -->
  34. <div class="conicon">
  35. <el-icon @click="delRule(index)" v-if="index > 0"><Delete /></el-icon>
  36. </div>
  37. </el-form-item>
  38. </div>
  39. <div style="padding: 10px">
  40. <el-button type="primary" class="addbutton" @click="addRule">增加</el-button>
  41. </div>
  42. </el-form>
  43. <template #footer>
  44. <span class="dialog-footer">
  45. <el-button @click="onCancel" size="default">取 消</el-button>
  46. <el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.nodeId !== 0 ? '修 改' : '添 加' }}</el-button>
  47. </span>
  48. </template>
  49. </el-dialog>
  50. </div>
  51. </template>
  52. <script lang="ts">
  53. import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
  54. import api from '/@/api/datahub';
  55. import { ElMessage } from 'element-plus';
  56. import { Delete, Minus, Right } from '@element-plus/icons-vue';
  57. interface RuleFormState {
  58. nodeId: number;
  59. name: string;
  60. from: number;
  61. isPk: number;
  62. key: string;
  63. dataType: string;
  64. value: string;
  65. description: string;
  66. status: number;
  67. }
  68. interface DicState {
  69. isShowDialog: boolean;
  70. ruleForm: RuleFormState;
  71. rules: {};
  72. }
  73. export default defineComponent({
  74. name: 'Edit',
  75. components: { Delete, Minus, Right },
  76. setup(prop, { emit }) {
  77. const editDicRef = ref();
  78. const formRef = ref<HTMLElement | null>(null);
  79. const state = reactive<DicState>({
  80. isShowDialog: false,
  81. config: {},
  82. tabData: [
  83. {
  84. label: 'varchar',
  85. value: 'varchar',
  86. },
  87. {
  88. label: 'string',
  89. value: 'string',
  90. },
  91. {
  92. label: 'int',
  93. value: 'int',
  94. },
  95. {
  96. label: 'bigint',
  97. value: 'bigint',
  98. },
  99. {
  100. label: 'tinyint',
  101. value: 'tinyint',
  102. },
  103. {
  104. label: 'float',
  105. value: 'float',
  106. },
  107. {
  108. label: 'double',
  109. value: 'double',
  110. },
  111. {
  112. label: 'text',
  113. value: 'text',
  114. },
  115. {
  116. label: 'datetime',
  117. value: 'datetime',
  118. },
  119. {
  120. label: 'timestamp',
  121. value: 'timestamp',
  122. },
  123. ],
  124. ruledata: [
  125. {
  126. expression: '',
  127. replace: '',
  128. // params: {
  129. // name: '',
  130. // value: '',
  131. // },
  132. },
  133. ],
  134. rule: [
  135. {
  136. expression: '',
  137. replace: '',
  138. // params: {
  139. // name: '',
  140. // value: '',
  141. // },
  142. },
  143. ],
  144. ruleForm: {
  145. nodeId: 0,
  146. isPk: 0,
  147. name: '',
  148. key: '',
  149. dataType: '',
  150. value: '',
  151. rule: [],
  152. description: '',
  153. },
  154. rules: {
  155. key: [{ required: true, message: '数据节点标识不能为空', trigger: 'blur' }],
  156. name: [{ required: true, message: '数据节点名称不能为空', trigger: 'blur' }],
  157. isPk: [{ required: true, message: '请选择是否主键', trigger: 'blur' }],
  158. dataType: [{ required: true, message: '数据节点类型不能为空', trigger: 'blur' }],
  159. value: [{ required: true, message: '数据节点取值项不能为空', trigger: 'blur' }],
  160. },
  161. });
  162. const delRule = (index) => {
  163. state.rule.splice(index, 1);
  164. };
  165. const addRule = () => {
  166. state.rule.push({
  167. expression: '',
  168. replace: '',
  169. // params: {
  170. // name: '',
  171. // value: '',
  172. // },
  173. });
  174. };
  175. // 打开弹窗
  176. const openDialog = (row: RuleFormState | null) => {
  177. resetForm();
  178. if (row?.nodeId) {
  179. state.ruleForm = row;
  180. var data = JSON.parse(row.rule);
  181. console.log(data);
  182. data.forEach((item, index) => {
  183. state.rule[index].expression = item.expression;
  184. state.rule[index].replace = item.replace;
  185. // state.rule[index].params.name = Object.keys(item.params);
  186. // state.rule[index].params.value = item.params[Object.keys(item.params)];
  187. });
  188. }
  189. state.ruleForm = row;
  190. state.isShowDialog = true;
  191. };
  192. const resetForm = () => {
  193. state.ruleForm = {
  194. nodeId: 0,
  195. name: '',
  196. isPk: 0,
  197. from: 1,
  198. key: '',
  199. rule: [],
  200. description: '',
  201. };
  202. };
  203. // 关闭弹窗
  204. const closeDialog = () => {
  205. state.isShowDialog = false;
  206. };
  207. // 取消
  208. const onCancel = () => {
  209. closeDialog();
  210. };
  211. // 新增
  212. const onSubmit = () => {
  213. const formWrap = unref(formRef) as any;
  214. if (!formWrap) return;
  215. formWrap.validate((valid: boolean) => {
  216. if (valid) {
  217. //修改rule数据
  218. // state.rule.forEach((item, index) => {
  219. // item.params[item.params.name] = item.params.value;
  220. // delete item.params.name;
  221. // delete item.params.value;
  222. // });
  223. state.ruleForm.rule = state.rule;
  224. if (state.ruleForm.nodeId !== 0) {
  225. //修改
  226. api.node.edit(state.ruleForm).then(() => {
  227. ElMessage.success('数据节点类型修改成功');
  228. closeDialog(); // 关闭弹窗
  229. emit('typeList');
  230. });
  231. } else {
  232. //添加
  233. api.node.add(state.ruleForm).then(() => {
  234. ElMessage.success('数据节点类型添加成功');
  235. closeDialog(); // 关闭弹窗
  236. emit('typeList');
  237. });
  238. }
  239. }
  240. });
  241. };
  242. return {
  243. addRule,
  244. delRule,
  245. openDialog,
  246. closeDialog,
  247. onCancel,
  248. onSubmit,
  249. formRef,
  250. ...toRefs(state),
  251. };
  252. },
  253. });
  254. </script>
  255. <style>
  256. .el-input__wrapper {
  257. width: 98%;
  258. }
  259. .box-content {
  260. border: 1px solid #e8e8e8;
  261. margin: 10px;
  262. padding: 10px;
  263. }
  264. .content-f {
  265. display: flex;
  266. margin-bottom: 10px;
  267. }
  268. .content-f .el-input__wrapper {
  269. margin-right: 5px;
  270. }
  271. .addbutton {
  272. width: 100%;
  273. margin-top: 10px;
  274. }
  275. .conicon {
  276. width: 55px;
  277. height: 25px;
  278. font-size: 28px;
  279. line-height: 28px;
  280. cursor: pointer;
  281. }
  282. </style>