AeService.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. <template>
  2. <el-row :gutter="10" class="ae-service">
  3. <el-col :span="24">
  4. <el-card class="header-card">
  5. <el-steps :active="step" finish-status="success">
  6. <el-step title="基本信息" @click="onStep(0)"></el-step>
  7. <el-step title="参数/返回值" @click="onStep(1)"></el-step>
  8. <el-step title="数据集" @click="onStep(2)"></el-step>
  9. </el-steps>
  10. </el-card>
  11. </el-col>
  12. <el-col :span="24" class="service-body">
  13. <el-card>
  14. <div class="box" v-show="step === 0">
  15. <el-form
  16. ref="formRef"
  17. :model="form"
  18. :rules="rules"
  19. label-width="120px"
  20. >
  21. <el-form-item label="服务分类" prop="cateCode">
  22. <el-cascader
  23. v-model="form.cateCode"
  24. :options="cascader.options"
  25. :props="cascader.props"
  26. :show-all-levels="false"
  27. filterable
  28. clearable
  29. />
  30. </el-form-item>
  31. <el-form-item label="服务名称" prop="name">
  32. <el-input v-model="form.name"></el-input>
  33. </el-form-item>
  34. <el-form-item label="接口地址" prop="url">
  35. <el-input v-model="form.url">
  36. <template #prepend>
  37. <el-select v-model="form.proxyPath" style="width:200px;" @change="handleGatewayChange">
  38. <el-option v-for="item in gatewayList" :key="item.id" :label="item.serviceName"
  39. :value="item.predicates" :data-service-name="item.serviceName"></el-option>
  40. </el-select>
  41. </template>
  42. </el-input>
  43. </el-form-item>
  44. <el-row>
  45. <el-col :span="11">
  46. <el-form-item label="开放等级">
  47. <el-select v-model="form.openCndtn">
  48. <el-option label="申请开放" value="0"></el-option>
  49. <el-option label="登录开放" value="1"></el-option>
  50. <el-option label="完全开放" value="2"></el-option>
  51. </el-select>
  52. </el-form-item>
  53. </el-col>
  54. </el-row>
  55. <el-row>
  56. <el-col :span="11">
  57. <el-form-item label="请求方式">
  58. <el-select v-model="form.rqtype">
  59. <el-option label="GET" value="get"></el-option>
  60. <el-option label="POST" value="post"></el-option>
  61. </el-select>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="11">
  65. <el-form-item label="接口格式">
  66. <el-select v-model="form.type">
  67. <el-option label="RESTful" value="RESTful"></el-option>
  68. <el-option label="WebService" value="WebService"></el-option>
  69. <el-option label="HTTP" value="HTTP"></el-option>
  70. <el-option label="WebSocket" value="WebSocket"></el-option>
  71. </el-select>
  72. </el-form-item>
  73. </el-col>
  74. </el-row>
  75. <el-row>
  76. <el-col :span="11">
  77. <el-form-item label="返回格式">
  78. <el-select v-model="form.rptype">
  79. <el-option label="json" value="json"></el-option>
  80. <el-option label="html" value="html"></el-option>
  81. <el-option label="xml" value="xml"></el-option>
  82. </el-select>
  83. </el-form-item>
  84. </el-col>
  85. </el-row>
  86. <!-- 隐藏所属业务系统选项 -->
  87. <el-row v-show="false">
  88. <el-col :span="24">
  89. <el-form-item label="所属业务系统">
  90. <el-input v-model="form.serviceSource"></el-input>
  91. </el-form-item>
  92. </el-col>
  93. </el-row>
  94. <el-row>
  95. <el-col :span="11">
  96. <el-form-item label="所属业务部门">
  97. <el-input v-model="form.serviceDept"></el-input>
  98. </el-form-item>
  99. </el-col>
  100. <el-col :span="11">
  101. <el-form-item label="业务部门管理人">
  102. <el-input v-model="form.manageName"></el-input>
  103. </el-form-item>
  104. </el-col>
  105. </el-row>
  106. <el-row>
  107. <el-col :span="11">
  108. <el-form-item label="开发单位">
  109. <el-input v-model="form.developUnit"></el-input>
  110. </el-form-item>
  111. </el-col>
  112. <el-col :span="11">
  113. <el-form-item label="开发单位联系人">
  114. <el-input v-model="form.developContacter"></el-input>
  115. </el-form-item>
  116. </el-col>
  117. </el-row>
  118. <el-row>
  119. <el-col :span="11">
  120. <el-form-item label="运维单位">
  121. <el-input v-model="form.maintainUnit"></el-input>
  122. </el-form-item>
  123. </el-col>
  124. <el-col :span="11">
  125. <el-form-item label="运维单位联系人">
  126. <el-input v-model="form.maintainContacer"></el-input>
  127. </el-form-item>
  128. </el-col>
  129. </el-row>
  130. <el-form-item label="服务说明">
  131. <el-input v-model="form.intro" type="textarea"></el-input>
  132. </el-form-item>
  133. <el-form-item label="返回说明">
  134. <el-input
  135. v-model="form.rpcontent"
  136. type="textarea"
  137. :autosize="{ minRows: 4, maxRows: 8 }"
  138. ></el-input>
  139. </el-form-item>
  140. <el-row type="flex" justify="center">
  141. <el-button
  142. icon="ArrowLeft"
  143. disabled
  144. @click="forwardStep"
  145. circle
  146. ></el-button>
  147. <el-button type="primary" @click="onSubmit"> 保存</el-button>
  148. <el-button @click="exit">退出</el-button>
  149. <el-button
  150. icon="ArrowRight"
  151. @click="nextStep"
  152. circle
  153. ></el-button>
  154. </el-row>
  155. </el-form>
  156. </div>
  157. <div class="box" v-show="step === 1">
  158. <param-and-file
  159. ref="paramAndFileRef"
  160. :srvId="form.srvId"
  161. :url="form.url"
  162. @forwardStep="forwardStep"
  163. @nextStep="nextStep"
  164. @close="exit"
  165. ></param-and-file>
  166. </div>
  167. <div class="box" v-show="step === 2">
  168. <service-file
  169. ref="serviceFileRef"
  170. :srvId="form.srvId"
  171. @forwardStep="forwardStep"
  172. @nextStep="nextStep"
  173. @close="exit"
  174. ></service-file>
  175. </div>
  176. </el-card>
  177. </el-col>
  178. </el-row>
  179. </template>
  180. <script setup>
  181. import {onMounted, reactive, ref, watch} from 'vue';
  182. import {saveServiceInfo} from "@/api/service/info";
  183. import {getCatalog} from "@/api/service/catalog";
  184. import {handleTree} from "@/utils/ruoyi"; // 使用 handleTree 替代 handleTree2
  185. import ParamAndFile from "./paramAndFile.vue";
  186. import ServiceFile from "./serviceFile.vue";
  187. import {useRoute} from 'vue-router';
  188. import {getGatewayRouters} from "@/api/gateway/gatewayRouters.js";
  189. import {ElMessage} from "element-plus";
  190. const {proxy} = getCurrentInstance();
  191. // 定义 props
  192. const props = defineProps(["service", "serviceVisible"]);
  193. // 定义 emits
  194. const emit = defineEmits(['close', 'refreshTable']);
  195. // 响应式数据
  196. const step = ref(0);
  197. const type = ref("添加");
  198. const route = useRoute();
  199. const formRef = ref();
  200. const paramAndFileRef = ref();
  201. const serviceFileRef = ref();
  202. const gatewayList = ref([]);
  203. const form = reactive({
  204. srvId: "",
  205. cateCode: "",
  206. name: "",
  207. url: "",
  208. urlSuffix: "",
  209. rqtype: "GET",
  210. rptype: "JSON",
  211. type: "RESTful",
  212. serviceSource: "",
  213. serviceDept: "",
  214. manageName: "",
  215. developUnit: "",
  216. developContacter: "",
  217. maintainUnit: "",
  218. maintainContacer: "",
  219. intro: "",
  220. openCndtn: "0",
  221. });
  222. const cascader = reactive({
  223. orgListUrl: "/pt/map/countNum",
  224. orgPidName: "catePcode",
  225. orgIdName: "cateCode",
  226. topValue: "0",
  227. props: {
  228. emitPath: false,
  229. checkStrictly: true,
  230. children: "children",
  231. label: "cateName",
  232. value: "cateCode",
  233. },
  234. options: [],
  235. });
  236. const rules = reactive({
  237. name: [
  238. {
  239. required: true,
  240. message: "请填写信息,该属性为必填项",
  241. trigger: "blur",
  242. },
  243. ],
  244. urlSuffix: [
  245. {
  246. required: true,
  247. message: "请填写信息,该属性为必填项",
  248. trigger: "blur",
  249. },
  250. ],
  251. cateCode: [
  252. {
  253. type: "string",
  254. required: true,
  255. message: "请选择",
  256. trigger: "change",
  257. },
  258. ],
  259. });
  260. // 方法定义
  261. const getGatewayList = () => {
  262. getGatewayRouters().then(res => {
  263. gatewayList.value = res.data
  264. })
  265. };
  266. getGatewayList();
  267. // 接口地址选择器变化事件
  268. const handleGatewayChange = (value) => {
  269. // 根据选中的 predicates 找到对应的 gateway 项目
  270. const selectedGateway = gatewayList.value.find(item => item.predicates === value);
  271. if (selectedGateway && selectedGateway.serviceName) {
  272. // 将选中项的 serviceName 赋值给所属业务系统
  273. form.serviceSource = selectedGateway.serviceName;
  274. }
  275. };
  276. const exit = () => {
  277. emit('close');
  278. };
  279. // 前进一步
  280. const forwardStep = () => {
  281. if (step.value === 0) {
  282. return;
  283. }
  284. step.value--;
  285. };
  286. // 切换步数
  287. const onStep = (stepVal) => {
  288. if (stepVal != 0 && !form.srvId) {
  289. proxy.$modal.msgWarning("请先添加服务")
  290. return;
  291. }
  292. step.value = stepVal;
  293. };
  294. const nextStep = () => {
  295. if (!form.srvId) {
  296. proxy.$modal.msgWarning("请先添加服务")
  297. return;
  298. }
  299. if (step.value === 2) {
  300. return;
  301. }
  302. step.value++;
  303. };
  304. // 服务提交
  305. const onSubmit = () => {
  306. formRef.value.validate((valid) => {
  307. if (valid) {
  308. saveServiceInfo(form).then((r) => {
  309. form.srvId = r.data.srvId;
  310. proxy.$modal.msgSuccess(type.value + "成功")
  311. nextStep();
  312. emit('refreshTable');
  313. });
  314. return true;
  315. }
  316. return false;
  317. });
  318. };
  319. const fetchData = () => {
  320. getCatalog().then((r) => {
  321. cascader.options = handleTree(
  322. r.data,
  323. "catePcode",
  324. "cateCode",
  325. "0"
  326. );
  327. });
  328. };
  329. const addParam = () => {
  330. paramAndFileRef.value.addParam();
  331. };
  332. const submitForm = (name) => {
  333. paramAndFileRef.value.submitForm(name);
  334. };
  335. // 监听器
  336. watch(() => route.query.isClose, (val) => {
  337. if (val === "true") {
  338. this.$router.replace({query: {isClose: "false"}});
  339. exit();
  340. }
  341. }, {immediate: true});
  342. watch(() => props.serviceVisible, (val) => {
  343. if (!val) {
  344. return;
  345. }
  346. type.value = "添加";
  347. step.value = 0;
  348. Object.assign(form, {
  349. srvId: "",
  350. cateCode: "",
  351. name: "",
  352. url: "",
  353. urlSuffix: "",
  354. rqtype: "GET",
  355. type: "REST",
  356. serviceSource: "",
  357. serviceDept: "",
  358. manageName: "",
  359. developUnit: "",
  360. developContacter: "",
  361. maintainUnit: "",
  362. maintainContacer: "",
  363. intro: "",
  364. openCndtn: "0",
  365. });
  366. if (props.service && props.service.srvId) {
  367. type.value = "修改";
  368. Object.assign(form, props.service);
  369. }
  370. }, {immediate: true, deep: true});
  371. // 生命周期钩子
  372. onMounted(() => {
  373. fetchData();
  374. });
  375. </script>
  376. <style scoped>
  377. .header-card ::v-deep(.el-card__body) {
  378. padding: 15px 20px;
  379. }
  380. .box {
  381. height: calc(100vh - 201px);
  382. display: inline;
  383. }
  384. /* 增加表单项之间的间距 */
  385. .ae-service ::v-deep(.el-form-item) {
  386. margin-bottom: 20px;
  387. }
  388. </style>