edit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. <template>
  2. <div class="system-edit-dic-container">
  3. <el-dialog :title="(ruleForm.sourceId !== 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.sourceId"/>
  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="description">
  12. <el-input v-model="ruleForm.description" type="textarea" placeholder="请输入内容"></el-input>
  13. </el-form-item>
  14. <el-form-item label="数据来源" prop="from">
  15. <el-radio-group v-model="ruleForm.from">
  16. <el-radio :label="1">api导入</el-radio>
  17. <el-radio :label="2">数据库</el-radio>
  18. <el-radio :label="3">文件</el-radio>
  19. <el-radio :label="4">设备</el-radio>
  20. </el-radio-group>
  21. </el-form-item>
  22. <el-divider content-position="left">规则表达式</el-divider>
  23. <div v-for="(item, index) in rule" :key="index">
  24. <el-form-item label="正则表达式">
  25. <el-input v-model="item.expression" placeholder="请输入正则表达式" />
  26. </el-form-item>
  27. <el-form-item label="替换内容">
  28. <el-input v-model="item.replace" placeholder="请输入替换内容" class="w-35" />
  29. <!-- <el-input v-model="item.params.name" placeholder="请输入键值" class="w-35" />
  30. <el-input v-model="item.params.value" placeholder="请输入值" class="w-35" /> -->
  31. <div class="conicon">
  32. <el-icon @click="delRule(index)" v-if="index > 0"><Delete /></el-icon>
  33. </div>
  34. </el-form-item>
  35. </div>
  36. <div style="padding: 10px">
  37. <el-button type="primary" class="addbutton" @click="addRule">增加</el-button>
  38. </div>
  39. <el-divider content-position="left">数据源配置</el-divider>
  40. <div v-if="ruleForm.from==1">
  41. <el-form-item label="请求方法">
  42. <el-select v-model="config.method" placeholder="请选择请求方法">
  43. <el-option v-for="item in methodData" :key="item.value" :label="item.label" :value="item.value" />
  44. </el-select>
  45. </el-form-item>
  46. <el-form-item label="请求地址">
  47. <el-input v-model="config.url" placeholder="请输入请求地址" />
  48. </el-form-item>
  49. <el-form-item label="更新时间">
  50. <el-input v-model="config.interval" placeholder="请输入更新时间" class="w-35" />
  51. <el-select v-model="config.intervalUnit" placeholder="请选择单位">
  52. <el-option v-for="item in unitData" :key="item.value" :label="item.label" :value="item.value" />
  53. </el-select>
  54. </el-form-item>
  55. <div class="box-content">
  56. <el-divider content-position="left">请求参数</el-divider>
  57. <div class="content-f" v-for="(item, index) in requestParams" :key="index">
  58. <el-select v-model="item.type" placeholder="参数类型" style="width: 320px">
  59. <el-option v-for="item in paramData" :key="item.value" :label="item.label" :value="item.value" />
  60. </el-select>
  61. <el-input v-model="item.name" placeholder="请输入参数标题" style="width: 320px" />
  62. <el-input v-model="item.key" placeholder="请输入参数名" style="width: 320px" />
  63. <el-input v-model="item.value" placeholder="请输入参数值" style="width: 320px" />
  64. <div class="conicon">
  65. <el-icon @click="delParams(index)" v-if="index > 0"><Delete /></el-icon>
  66. </div>
  67. </div>
  68. <el-button type="primary" class="addbutton" @click="addParams">增加</el-button>
  69. </div>
  70. </div>
  71. <div v-if="ruleForm.from==4">
  72. <el-form-item label="主机地址" >
  73. <el-input v-model="devconfig.host" placeholder="请输入主机地址" />
  74. </el-form-item>
  75. <el-form-item label="端口号">
  76. <el-input v-model="devconfig.port" placeholder="请输入端口号" />
  77. </el-form-item>
  78. <el-form-item label="用户名">
  79. <el-input v-model="devconfig.user" placeholder="请输入用户名" />
  80. </el-form-item>
  81. <el-form-item label="密码">
  82. <el-input v-model="devconfig.password" placeholder="请输入密码" />
  83. </el-form-item>
  84. <el-form-item label="数据库名称">
  85. <el-input v-model="devconfig.dbname" placeholder="请输入数据库名称" />
  86. </el-form-item>
  87. <el-form-item label="表名称">
  88. <el-input v-model="devconfig.table" placeholder="请输入表名称" />
  89. </el-form-item>
  90. <el-form-item label="更新时间">
  91. <el-input v-model="devconfig.interval" placeholder="请输入更新时间" class="w-35" />
  92. <el-select v-model="devconfig.intervalUnit" placeholder="请选择单位">
  93. <el-option v-for="item in unitData" :key="item.value" :label="item.label" :value="item.value" />
  94. </el-select>
  95. </el-form-item>
  96. </div>
  97. </el-form>
  98. <template #footer>
  99. <span class="dialog-footer">
  100. <el-button @click="onTest" type="warning" size="default" v-if="ruleForm.sourceId>0">测试</el-button>
  101. <el-button @click="onCancel" size="default">取 消</el-button>
  102. <el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.sourceId !== 0 ? '修 改' : '添 加' }}</el-button>
  103. </span>
  104. </template>
  105. </el-dialog>
  106. <el-dialog
  107. v-model="dialogVisible"
  108. title="返回Json数据"
  109. width="30%"
  110. :before-close="handleClose"
  111. >
  112. <json-viewer :value="jsonData" boxed sort :expand-depth=20 theme="my-awesome-json-theme" />
  113. <template #footer>
  114. <span class="dialog-footer">
  115. <el-button @click="dialogVisible = false">关闭</el-button>
  116. </span>
  117. </template>
  118. </el-dialog>
  119. </div>
  120. </template>
  121. <script lang="ts">
  122. import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
  123. import api from '/@/api/datahub';
  124. import { ElMessage } from 'element-plus';
  125. import { Delete, Minus, Right } from '@element-plus/icons-vue';
  126. interface RuleFormState {
  127. sourceId: number;
  128. name: string;
  129. from: number;
  130. key: string;
  131. userName: string;
  132. password: string;
  133. description: string;
  134. status: number;
  135. }
  136. interface DicState {
  137. isShowDialog: boolean;
  138. ruleForm: RuleFormState;
  139. rules: {};
  140. }
  141. export default defineComponent({
  142. name: 'Edit',
  143. components: { Delete, Minus, Right },
  144. setup(prop, { emit }) {
  145. const formRef = ref<HTMLElement | null>(null);
  146. const state = reactive<DicState>({
  147. isShowDialog: false,
  148. dialogVisible:false,
  149. config: {},
  150. devconfig: {},
  151. sourceId:0,
  152. jsonData:'',
  153. ruledata: [
  154. {
  155. expression: '',
  156. replace: '',
  157. //params: {},
  158. },
  159. ],
  160. rule: [
  161. {
  162. expression: '',
  163. replace: '',
  164. // params: {
  165. // name: '',
  166. // value: '',
  167. // },
  168. },
  169. ],
  170. requestParams: [
  171. {
  172. type: '',
  173. key: '',
  174. name: '',
  175. value: '',
  176. },
  177. ],
  178. methodData: [
  179. {
  180. label: 'GET',
  181. value: 'get',
  182. },
  183. {
  184. label: 'POST',
  185. value: 'post',
  186. },
  187. {
  188. label: 'PUT',
  189. value: 'put',
  190. },
  191. ],
  192. unitData: [
  193. {
  194. label: '秒',
  195. value: 'second',
  196. },
  197. {
  198. label: '分',
  199. value: 'minute',
  200. },
  201. {
  202. label: '时',
  203. value: 'hour',
  204. },
  205. {
  206. label: '天',
  207. value: 'day',
  208. },
  209. ],
  210. paramData: [
  211. {
  212. lable: 'header',
  213. value: 'header',
  214. },
  215. {
  216. lable: 'body',
  217. value: 'body',
  218. },
  219. {
  220. lable: 'param',
  221. value: 'param',
  222. },
  223. ],
  224. ruleForm: {
  225. sourceId: 0,
  226. name: '',
  227. from: 1,
  228. key: '',
  229. rule: [],
  230. config: {
  231. method: '',
  232. url: '',
  233. interval: '',
  234. intervalUnit: '',
  235. requestParams: [],
  236. },
  237. description: '',
  238. },
  239. rules: {
  240. key: [{ required: true, message: '数据源标识不能为空', trigger: 'blur' }],
  241. name: [{ required: true, message: '数据源名称不能为空', trigger: 'blur' }],
  242. from: [{ required: true, message: '数据源类型不能为空', trigger: 'blur' }],
  243. },
  244. });
  245. const delParams = (index) => {
  246. state.requestParams.splice(index, 1);
  247. };
  248. const addParams = () => {
  249. state.requestParams.push({
  250. type: '',
  251. key: '',
  252. name: '',
  253. value: '',
  254. });
  255. };
  256. const delRule = (index) => {
  257. state.rule.splice(index, 1);
  258. };
  259. const addRule = () => {
  260. state.rule.push({
  261. expression: '',
  262. replace: '',
  263. // params: {
  264. // name: '',
  265. // value: '',
  266. // },
  267. });
  268. };
  269. // 打开弹窗
  270. const openDialog = (row: RuleFormState | null) => {
  271. resetForm();
  272. if (row) {
  273. state.sourceId=row.sourceId
  274. api.common.detail(row.sourceId).then((res: any) => {
  275. state.ruleForm = res.data;
  276. if(res.data.from==1){
  277. state.config = res.data.apiConfig;
  278. state.requestParams = res.data.apiConfig.requestParams;
  279. }else if(res.data.from==4){
  280. state.devconfig = res.data.deviceConfig;
  281. }
  282. res.data.sourceRule.forEach((item, index) => {
  283. state.rule[index].expression = item.expression;
  284. state.rule[index].replace = item.replace;
  285. // state.rule[index].params.name = Object.keys(item.params);
  286. // state.rule[index].params.value = item.params[Object.keys(item.params)];
  287. });
  288. });
  289. }
  290. state.isShowDialog = true;
  291. };
  292. const resetForm = () => {
  293. state.ruleForm = {
  294. sourceId: 0,
  295. name: '',
  296. from: 1,
  297. key: '',
  298. rule: [],
  299. config: {
  300. method: '',
  301. url: '',
  302. interval: '',
  303. intervalUnit: '',
  304. requestParams: [],
  305. },
  306. description: '',
  307. };
  308. };
  309. // 关闭弹窗
  310. const closeDialog = () => {
  311. state.isShowDialog = false;
  312. };
  313. // 取消
  314. const onCancel = () => {
  315. closeDialog();
  316. };
  317. const onTest=()=>{
  318. if(state.ruleForm.from==1){
  319. api.common.api(state.sourceId).then((res: any) => {
  320. state.jsonData=JSON.parse(res.data);
  321. state.dialogVisible=true
  322. console.log(res);
  323. })
  324. }else if(state.ruleForm.from==4){
  325. api.common.devapi(state.sourceId).then((res: any) => {
  326. state.jsonData=JSON.parse(res.data);
  327. state.dialogVisible=true
  328. console.log(res);
  329. })
  330. }
  331. };
  332. // 新增
  333. const onSubmit = () => {
  334. const formWrap = unref(formRef) as any;
  335. if (!formWrap) return;
  336. formWrap.validate((valid: boolean) => {
  337. if (valid) {
  338. //修改rule数据
  339. // state.rule.forEach((item, index) => {
  340. // item.params[item.params.name] = item.params.value;
  341. // delete item.params.name;
  342. // delete item.params.value;
  343. // });
  344. state.ruleForm.rule = state.rule;
  345. if(state.ruleForm.from==1 ){
  346. state.config.requestParams = state.requestParams;
  347. state.ruleForm.config = state.config;
  348. }else if(state.ruleForm.from==4 ){
  349. state.ruleForm.config = state.devconfig;
  350. }
  351. if (state.ruleForm.sourceId !== 0) {
  352. //修改
  353. if(state.ruleForm.from==1 ){
  354. api.common.edit(state.ruleForm).then(() => {
  355. ElMessage.success('数据源类型修改成功');
  356. closeDialog(); // 关闭弹窗
  357. emit('typeList');
  358. });
  359. }else if(state.ruleForm.from==4 ){
  360. api.common.devedit(state.ruleForm).then(() => {
  361. ElMessage.success('数据源类型修改成功');
  362. closeDialog(); // 关闭弹窗
  363. emit('typeList');
  364. });
  365. }
  366. } else {
  367. //添加
  368. if(state.ruleForm.from==1 ){
  369. api.common.add(state.ruleForm).then(() => {
  370. ElMessage.success('数据源类型添加成功');
  371. closeDialog(); // 关闭弹窗
  372. emit('typeList');
  373. });
  374. }else if(state.ruleForm.from==4 ){
  375. api.common.devadd(state.ruleForm).then(() => {
  376. ElMessage.success('数据源类型添加成功');
  377. closeDialog(); // 关闭弹窗
  378. emit('typeList');
  379. });
  380. }
  381. }
  382. }
  383. });
  384. };
  385. return {
  386. onTest,
  387. addRule,
  388. delRule,
  389. addParams,
  390. delParams,
  391. openDialog,
  392. closeDialog,
  393. onCancel,
  394. onSubmit,
  395. formRef,
  396. ...toRefs(state),
  397. };
  398. },
  399. });
  400. </script>
  401. <style>
  402. .el-input__wrapper {
  403. width: 98%;
  404. }
  405. .box-content {
  406. border: 1px solid #e8e8e8;
  407. margin: 10px;
  408. padding: 10px;
  409. }
  410. .content-f {
  411. display: flex;
  412. margin-bottom: 10px;
  413. }
  414. .content-f .el-input__wrapper {
  415. margin-right: 5px;
  416. }
  417. .addbutton {
  418. width: 100%;
  419. margin-top: 10px;
  420. }
  421. .conicon {
  422. width: 55px;
  423. height: 25px;
  424. font-size: 28px;
  425. line-height: 28px;
  426. cursor: pointer;
  427. }
  428. .jv-node{
  429. margin-left: 25px;
  430. }
  431. .jv-my-awesome-json-theme {
  432. background: #d9f1e9;
  433. white-space: nowrap;
  434. color: #525252;
  435. font-size: 14px;
  436. font-family: Consolas, Menlo, Courier, monospace;
  437. }
  438. </style>