detail.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. <template>
  2. <div class="system-dic-container">
  3. <div class="content">
  4. <div class="cont_box">
  5. <div class="title">数据源名称:{{ detail.name }}</div>
  6. <div class="pro-status" ><span :class="developer_status==1?'on':'off'"></span>{{developer_status==1?'已发布':'未发布'}}</div>
  7. <div class="pro-option" @click="CkOption"> {{developer_status==1?'停用':'发布'}}</div>
  8. </div>
  9. </div>
  10. <div class="content-box">
  11. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  12. <el-tab-pane label="数据源信息" name="1">
  13. <el-form size="default" label-width="110px" :inline="true">
  14. <el-divider content-position="left">基本信息</el-divider>
  15. <el-form-item label="数据源标识:">
  16. {{detail.key}}
  17. </el-form-item>
  18. <el-form-item label="数据源名称:">
  19. {{detail.name}}
  20. </el-form-item>
  21. <el-form-item label="数据源描述:">
  22. {{detail.description}}
  23. </el-form-item>
  24. <el-form-item label="数据来源:">
  25. <span v-if="detail.from==1">api导入</span>
  26. <span v-if="detail.from==2">数据库</span>
  27. <span v-if="detail.from==3">文件</span>
  28. </el-form-item>
  29. <el-divider content-position="left">规则表达式</el-divider>
  30. <div v-for="(item, index) in rule" :key="index">
  31. <el-form-item label="表达式:">
  32. {{item.expression}}
  33. </el-form-item>
  34. <el-form-item label="参数:" >
  35. {{item.params.name}}~ {{item.params.value}}
  36. </el-form-item>
  37. <el-divider content-position="left">数据源配置</el-divider>
  38. <el-form-item label="请求方法:" prop="method">
  39. {{config.method}}
  40. </el-form-item>
  41. <el-form-item label="请求地址:" prop="method">
  42. {{config.url}}
  43. </el-form-item>
  44. <el-form-item label="更新时间:" prop="method">
  45. {{config.interval}}
  46. {{config.intervalUnit}}
  47. </el-form-item>
  48. <el-divider content-position="left">请求参数</el-divider>
  49. <div class="content-f" v-for="(item, index) in requestParams" :key="index">
  50. <el-form-item label="参数类型:">
  51. {{item.type}}
  52. </el-form-item>
  53. <el-form-item label="参数标题:">
  54. {{item.name}}
  55. </el-form-item>
  56. <el-form-item label="参数名:">
  57. {{item.key}}
  58. </el-form-item>
  59. <el-form-item label="参数值:">
  60. {{item.value}}
  61. </el-form-item>
  62. </div>
  63. </div>
  64. </el-form>
  65. </el-tab-pane>
  66. <el-tab-pane label="数据节点" name="2">
  67. <div class="wu-box">
  68. <div class="wu-title">
  69. <div class="title">数据节点</div>
  70. <div><el-button type="primary" @click="onOpenEdit()">添加</el-button></div>
  71. </div>
  72. <el-table :data="tableData.data" style="width: 100%" >
  73. <el-table-column label="ID" align="center" prop="nodeId" width="80" />
  74. <el-table-column label="数据标识" prop="key" :show-overflow-tooltip="true" />
  75. <el-table-column label="数据名称" prop="name" :show-overflow-tooltip="true" />
  76. <el-table-column label="数据类型" prop="dataType" :show-overflow-tooltip="true" />
  77. <el-table-column label="数据取值项" prop="value" :show-overflow-tooltip="true" />
  78. <el-table-column prop="createdAt" label="创建时间" align="center" width="180"></el-table-column>
  79. <el-table-column label="操作" width="200" align="center">
  80. <template #default="scope">
  81. <el-button size="small" text type="warning" @click="onOpenEdit1(scope.row)">修改</el-button>
  82. <el-button size="small" text type="danger" @click="onRowDel(scope.row)">删除</el-button>
  83. </template>
  84. </el-table-column>
  85. </el-table>
  86. <pagination v-show="tableData.total>0" :total="tableData.total" v-model:page="tableData.param.pageNum" v-model:limit="tableData.param.pageSize" @pagination="typeList" />
  87. </div>
  88. </el-tab-pane>
  89. </el-tabs>
  90. </div>
  91. <EditDic ref="editDicRef" @typeList="typeList" />
  92. </div>
  93. </template>
  94. <script lang="ts">
  95. import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
  96. import { Delete, Edit, Search, Share, Upload } from '@element-plus/icons-vue';
  97. import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
  98. import { useRoute } from 'vue-router';
  99. import EditDic from './component/editNode.vue';
  100. import api from '/@/api/datahub';
  101. interface TableDataState {
  102. ids: number[];
  103. tableData: {
  104. data: [];
  105. total: number;
  106. loading: boolean;
  107. param: {
  108. pageNum: number;
  109. pageSize: number;
  110. name: string;
  111. deviceType: string;
  112. status: string;
  113. dateRange: string[];
  114. };
  115. };
  116. }
  117. export default defineComponent({
  118. name: 'dataDetail',
  119. components: { EditDic },
  120. setup(prop, context) {
  121. const editDicRef = ref();
  122. const route = useRoute();
  123. const state = reactive<TableDataState>({
  124. config: {},
  125. ruledata: [
  126. {
  127. expression: '',
  128. params: {},
  129. },
  130. ],
  131. rule: [
  132. {
  133. expression: '',
  134. params: {
  135. name: '',
  136. value: '',
  137. },
  138. },
  139. ],
  140. requestParams: [
  141. {
  142. type: '',
  143. key: '',
  144. name: '',
  145. value: '',
  146. },
  147. ],
  148. isShowDialog: false,
  149. detail: [],
  150. activeName: '1',
  151. developer_status:0,
  152. tableData: {
  153. data: [],
  154. total: 0,
  155. loading: false,
  156. param: {
  157. pageNum: 1,
  158. pageSize: 10,
  159. sourceId: route.params && route.params.sourceId,
  160. status: '',
  161. dateRange: [],
  162. },
  163. },
  164. });
  165. onMounted(() => {
  166. const ids = route.params && route.params.sourceId;
  167. api.common.detail(ids).then((res: any) => {
  168. state.detail = res.data;
  169. state.developer_status=res.data.status
  170. state.config=res.data.apiConfig
  171. state.requestParams=res.data.apiConfig.requestParams
  172. res.data.sourceRule.forEach((item, index) => {
  173. state.rule[index].expression = item.expression;
  174. state.rule[index].params.name =Object.keys(item.params) ;
  175. state.rule[index].params.value = item.params[Object.keys(item.params)];
  176. });
  177. });
  178. typeList();
  179. });
  180. const typeList = () => {
  181. api.node.getList(state.tableData.param).then((res: any) => {
  182. state.tableData.data = res.list;
  183. state.tableData.total = res.Total;
  184. });
  185. };
  186. const CkOption=()=>{
  187. if(state.developer_status==1){
  188. api.common.undeploy({sourceId:route.params.sourceId}).then((res: any) => {
  189. ElMessage.success('操作成功');
  190. state.developer_status=0;
  191. });
  192. }else{
  193. api.common.deploy({sourceId:route.params.sourceId}).then((res: any) => {
  194. ElMessage.success('操作成功');
  195. state.developer_status=1;
  196. });
  197. }
  198. }
  199. const handleClick = (tab: TabsPaneContext, event: Event) => {
  200. console.log(tab, event);
  201. };
  202. const onRowDel = (row: TableDataRow) => {
  203. let msg = '你确定要删除所选数据?';
  204. let ids: number[] = [];
  205. if (row) {
  206. msg = `此操作将永久删除数据节点:“${row.name}”,是否继续?`;
  207. ids = row.nodeId;
  208. } else {
  209. ids = state.ids;
  210. }
  211. if (ids.length === 0) {
  212. ElMessage.error('请选择要删除的数据。');
  213. return;
  214. }
  215. ElMessageBox.confirm(msg, '提示', {
  216. confirmButtonText: '确认',
  217. cancelButtonText: '取消',
  218. type: 'warning',
  219. })
  220. .then(() => {
  221. api.node.delete(ids).then(() => {
  222. ElMessage.success('删除成功');
  223. typeList();
  224. });
  225. })
  226. .catch(() => {});
  227. };
  228. // 打开修改数据源弹窗
  229. const onOpenEdit = () => {
  230. editDicRef.value.openDialog({ sourceId: route.params.sourceId, nodeId: 0 });
  231. };
  232. const onOpenEdit1 = (row: TableDataRow) => {
  233. editDicRef.value.openDialog(row);
  234. };
  235. return {
  236. Edit,
  237. editDicRef,
  238. typeList,
  239. onRowDel,
  240. onOpenEdit,
  241. onOpenEdit1,
  242. handleClick,
  243. CkOption,
  244. ...toRefs(state),
  245. };
  246. },
  247. });
  248. </script>
  249. <style>
  250. .content {
  251. background: #fff;
  252. width: 100%;
  253. padding: 20px;
  254. }
  255. .content-box {
  256. background: #fff;
  257. width: 100%;
  258. padding: 20px;
  259. margin-top: 20px;
  260. }
  261. .cont_box {
  262. display: flex;
  263. }
  264. .cont_box .title {
  265. font-size: 24px;
  266. }
  267. .cont_box .pro-status {
  268. line-height: 40px;
  269. margin-left: 30px;
  270. }
  271. .cont_box .pro-status .on {
  272. background: #52c41a;
  273. }
  274. .cont_box .pro-status .off {
  275. background: #c41a1a;
  276. }
  277. .cont_box .pro-status span {
  278. position: relative;
  279. top: -1px;
  280. display: inline-block;
  281. width: 6px;
  282. height: 6px;
  283. vertical-align: middle;
  284. border-radius: 50%;
  285. margin-right: 5px;
  286. }
  287. .cont_box .pro-option {
  288. line-height: 40px;
  289. margin-left: 10px;
  290. color: #1890ff;
  291. cursor: pointer;
  292. }
  293. .content-box .pro-box {
  294. display: flex;
  295. padding: 10px;
  296. }
  297. .content-box .pro-box .protitle {
  298. font-size: 18px;
  299. font-weight: bold;
  300. line-height: 35px;
  301. }
  302. .content-box .pro-box .buttonedit {
  303. border: 0px;
  304. color: #1890ff;
  305. }
  306. table {
  307. border-collapse: collapse;
  308. text-indent: initial;
  309. border-spacing: 2px;
  310. }
  311. tbody {
  312. box-sizing: border-box;
  313. display: table-row-group;
  314. vertical-align: middle;
  315. border-color: inherit;
  316. }
  317. tr {
  318. display: table-row;
  319. vertical-align: inherit;
  320. border-color: inherit;
  321. }
  322. .ant-descriptions-view {
  323. width: 100%;
  324. overflow: hidden;
  325. border-radius: 4px;
  326. }
  327. .ant-descriptions-view {
  328. border: 1px solid #e8e8e8;
  329. }
  330. .ant-descriptions-view table {
  331. width: 100%;
  332. table-layout: fixed;
  333. }
  334. .ant-descriptions-view > table {
  335. table-layout: auto;
  336. }
  337. .ant-descriptions-row {
  338. border-bottom: 1px solid #e8e8e8;
  339. }
  340. .ant-descriptions-item-label {
  341. color: rgba(0, 0, 0, 0.85);
  342. font-weight: 400;
  343. font-size: 14px;
  344. line-height: 1.5;
  345. }
  346. .ant-descriptions-item-label {
  347. padding: 16px 24px;
  348. border-right: 1px solid #e8e8e8;
  349. }
  350. .ant-descriptions-item-label {
  351. background-color: #fafafa;
  352. }
  353. .ant-descriptions-item-content {
  354. padding: 16px 24px;
  355. border-right: 1px solid #e8e8e8;
  356. display: table-cell;
  357. color: rgba(0, 0, 0, 0.65);
  358. font-size: 14px;
  359. line-height: 1.5;
  360. }
  361. .wu-box {
  362. border: #e8e8e8 solid 1px;
  363. padding: 20px;
  364. width: 100%;
  365. }
  366. .wu-box .wu-title {
  367. display: flex;
  368. flex-direction: row;
  369. justify-content: space-between;
  370. padding: 20px;
  371. border-bottom: #e8e8e8 1px solid;
  372. }
  373. .wu-box .wu-title .title {
  374. font-size: 18px;
  375. }
  376. </style>