edit.vue 13 KB

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