interface.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  1. /* eslint-disable vue/no-parsing-error */
  2. /* eslint-disable vue/no-parsing-error */
  3. /* eslint-disable no-unused-vars */
  4. <template style="height=0px;improtanent">
  5. <div class="app-container" style="background-color: rgb(242, 243, 246);min-height: calc(100vh - 80px);padding: 1% 0px;">
  6. <div class="filter-container stylus-head" style="padding-bottom: 20px;!improtant">
  7. <el-input v-model="listQuery.id" size="small" placeholder="接口ID" style="width: 80px;" class="filter-item" @keyup.enter.native="handleFilter" />
  8. <el-input v-model="listQuery.customName" size="small" placeholder="名称" style="width: 150px;" class="filter-item" @keyup.enter.native="handleFilter" />
  9. <el-input v-model="listQuery.interfaceName" size="small" placeholder="接口类名" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />
  10. <el-input v-model="listQuery.methodName" size="small" placeholder="方法名" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />
  11. <el-input v-model="listQuery.serviceVersion" size="small" placeholder="服务版本" style="width: 100px;" class="filter-item" @keyup.enter.native="handleFilter" />
  12. <el-select v-model="listQuery.value" size="small" placeholder="状态" style="width: 100px;" class="filter-item" filterable clearable>
  13. <el-option v-for="item in listQuery.options" :key="item.value" :label="item.label" :value="item.value" />
  14. </el-select>
  15. <el-button v-waves size="small" class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
  16. 搜索
  17. </el-button>
  18. <el-button size="small" class="filter-item" style="margin-left: 1px;" type="primary" icon="el-icon-edit" @click="handleCreate">
  19. 新增
  20. </el-button>
  21. <el-checkbox v-model="showReviewer" size="small" class="filter-item" style="margin-left:1px;" @change="tableKey=tableKey+1">
  22. 备注
  23. </el-checkbox>
  24. </div>
  25. <!-- <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" /> -->
  26. <div class="stylus-content">
  27. <el-table
  28. :key="tableKey"
  29. v-loading="listLoading"
  30. :data="list"
  31. fit
  32. highlight-current-row
  33. style="width: 100%;"
  34. :header-cell-style="styleObj"
  35. @sort-change="sortChange"
  36. >
  37. <el-table-column label="ID" prop="id" sortable align="center" min-width="60">
  38. <template slot-scope="scope">
  39. <span>{{ scope.row.id }}</span>
  40. </template>
  41. </el-table-column>
  42. <el-table-column label="名称" min-width="150px" align="center">
  43. <template slot-scope="scope">
  44. <span>{{ scope.row.customName }}</span>
  45. </template>
  46. </el-table-column>
  47. <el-table-column label="接口类名" min-width="220px" align="center">
  48. <template slot-scope="scope">
  49. <span>{{ scope.row.interfaceName }}</span>
  50. </template>
  51. </el-table-column>
  52. <el-table-column label="服务版本" min-min-width="60px">
  53. <template slot-scope="{row}">
  54. <span>{{ row.serviceVersion }}</span>
  55. <!-- <el-tag>{{ row.type | typeFilter }}</el-tag> -->
  56. </template>
  57. </el-table-column>
  58. <el-table-column label="方法名" min-width="110px" align="center">
  59. <template slot-scope="scope">
  60. <span>{{ scope.row.methodName }}</span>
  61. </template>
  62. </el-table-column>
  63. <!-- <el-table-column label="Imp" width="80px">
  64. <template slot-scope="scope">
  65. <svg-icon v-for="n in +scope.row.importance" :key="n" icon-class="star" class="meta-item__icon" />
  66. </template>
  67. </el-table-column>
  68. <el-table-column label="Readings" align="center" width="95">
  69. <template slot-scope="{row}">
  70. <span v-if="row.pageviews" class="link-type" @click="handleFetchPv(row.pageviews)">{{ row.pageviews }}</span>
  71. <span v-else>0</span>
  72. </template>
  73. </el-table-column> -->
  74. <el-table-column label="状态" class-name="status-col" min-width="100">
  75. <template slot-scope="{row}">
  76. <el-tag :type="row.methodStatus | statusFilter">
  77. {{ statusMappings.get(row.methodStatus) }}
  78. </el-tag>
  79. </template>
  80. </el-table-column>
  81. <el-table-column label="更新时间" min-width="150px" align="center">
  82. <template slot-scope="scope">
  83. <span>{{ scope.row.updateTimeStr }}</span>
  84. </template>
  85. </el-table-column>
  86. <el-table-column label="创建人" min-width="110px" align="center">
  87. <template slot-scope="scope">{{ scope.row.creator }}</template>
  88. </el-table-column>
  89. <el-table-column label="更新人" min-width="110px" align="center">
  90. <template slot-scope="scope">{{ scope.row.updator }}</template>
  91. </el-table-column>
  92. <el-table-column v-if="showReviewer" label="备注" min-width="110px" align="center">
  93. <template slot-scope="scope">
  94. <span style="color:red;">{{ scope.row.remark }}</span>
  95. </template>
  96. </el-table-column>
  97. <el-table-column label="操作" align="center" min-width="410px" class-name="small-padding fixed-width" fixed="right">
  98. <template slot-scope="{row}">
  99. <el-button type="primary" size="mini" @click="handleCheck(row)">
  100. 查看
  101. </el-button>
  102. <el-button type="primary" size="mini" @click="handleUpdate(row)">
  103. 编辑
  104. </el-button>
  105. <el-button type="primary" size="mini" @click="handleCopy(row)">
  106. 复制
  107. </el-button>
  108. <el-button v-if="row.methodStatus!=1" size="mini" type="success" @click="handleModifyStatus(row, 1)">
  109. 开启
  110. </el-button>
  111. <el-button v-if="row.methodStatus!=0" size="mini" type="danger" @click="handleModifyStatus(row, 0)">
  112. 关闭
  113. </el-button>
  114. <el-button type="primary" style="width:auto;" size="mini" @click="redirectTo(row.id, row.methodName)">
  115. mock结果 >>
  116. </el-button>
  117. </template>
  118. </el-table-column>
  119. </el-table>
  120. </div>
  121. <pagination v-show="total>0" :total="total" :page.sync="listQuery.curIndex" :limit.sync="listQuery.pageSize" @pagination="getList" />
  122. <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" width="65%" @open="dialogOpenInit()">
  123. <el-form ref="serviceDataForm" :rules="serviceDataRules" :model="serviceData" label-position="left" label-width="120px" style="width: 500px; margin-left:80px;">
  124. <el-form-item label="名称" prop="customName">
  125. <el-input v-model="serviceData.customName" placeholder="dj_order_圈司机" title="自定义,供配置人员查看,建议”业务线_模块_功能" />
  126. </el-form-item>
  127. <div style="display:flex; margin-left:0px;">
  128. <el-form-item label="注册中心" prop="envChannel" style="flex:1;">
  129. <el-select v-model="serviceData.envChannel" class="filter-item" style="width: 190px;" filterable placeholder="环境配置" @change="updateEnvChannel(serviceData.envChannel)">
  130. <el-option v-for="item in envTypeSelections" :key="item.key" :label="item.display_name" :value="item.key" />
  131. </el-select>
  132. </el-form-item>
  133. <el-form-item prop="envId" style="flex:1; margin-left:-120px;">
  134. <el-select v-model="serviceData.envId" class="filter-item" :title="Edition" style="width: 190px;" filterable placeholder="环境" @change="envUpdate(serviceData.envId)">
  135. <div v-for="item in envSelections" :key="item.key">
  136. <el-tooltip class="item" effect="light" :content="item.registryAddress" placement="right">
  137. <el-option :label="item.display_name" :value="item.key" />
  138. </el-tooltip>
  139. </div>
  140. </el-select>
  141. </el-form-item>
  142. </div>
  143. <el-form-item label="接口类名" prop="interfaceName">
  144. <el-input v-model="serviceData.interfaceName" placeholder="com.didi.prado.config.api.CampaignRemoteServce" title="包名.接口类名" />
  145. </el-form-item>
  146. <el-form-item label="方法名" prop="methodName">
  147. <el-input v-model="serviceData.methodName" placeholder="addCampaign" />
  148. </el-form-item>
  149. <el-form-item label="服务版本" prop="serviceVersion">
  150. <el-input v-model="serviceData.serviceVersion" placeholder="1.0.0_test" />
  151. </el-form-item>
  152. <!-- <el-form-item label="协议" prop="protocol">
  153. <el-select v-model="serviceData.protocol" class="filter-item" filterable clearable placeholder="协议">
  154. <el-option v-for="item in protocols" :key="item.key" :label="item.display_name" :value="item.key" />
  155. </el-select>
  156. </el-form-item> -->
  157. <el-form-item label="消费者" prop="consumerIds">
  158. <el-select v-model="serviceData.consumerIds" class="filter-item" multiple placeholder="消费者">
  159. <el-option v-for="item in consumerSelections" :key="item.key" :label="item.display_name" :value="item.key" />
  160. </el-select>
  161. </el-form-item>
  162. <!-- <el-form-item label="Date" prop="timestamp">
  163. <el-date-picker v-model="temp.timestamp" type="datetime" placeholder="Please pick a date" />
  164. </el-form-item>
  165. <el-form-item label="Status">
  166. <el-select v-model="temp.status" class="filter-item" placeholder="Please select">
  167. <el-option v-for="item in statusOptions" :key="item" :label="item" :value="item" />
  168. </el-select>
  169. </el-form-item>
  170. <el-form-item label="Imp">
  171. <el-rate v-model="temp.importance" :colors="['#99A9BF', '#F7BA2A', '#FF9900']" :max="3" style="margin-top:8px;" />
  172. </el-form-item> -->
  173. <!-- <div style="display:flex; margin-left:0px;">
  174. <el-form-item label="入参类型" prop="methodParamsTypes" style="flex:1;">
  175. <el-input v-model="serviceData.methodParamsTypes" class="filter-item" style="width: 180px;" title="列表形式,参数有序,多个参数类型以英文”,“分隔" placeholder="[java.lang.Integer, com.didi.prado.config.api.param.CampaignRequest]" />
  176. </el-form-item>
  177. <span style="font-size:30px; text-align:center;padding-top:10px; ">+</span>
  178. <el-form-item label="入参类型" prop="methodParamsTypes" style="flex:1; margin-left:-120px;">
  179. <el-select v-model="serviceData.methodParamsTypes" type="textarea" class="filter-item" title="列表形式,参数有序,多个参数类型以英文”,“分隔" style="width: 180px;" filterable placeholder="[java.lang.Integer, com.didi.prado.config.api.param.CampaignRequest]">
  180. <el-option v-for="item in envSelections1s" :key="item.key" :label="item.display_name" :value="item.key" :title="item.registryAddress" />
  181. </el-select>
  182. </el-form-item>
  183. </div> -->
  184. <el-form-item label="入参类型" prop="methodParamsTypes">
  185. <el-input v-model="serviceData.methodParamsTypes" :autosize="{ minRows: 2, maxRows: 8}" type="textarea" title="列表形式,参数有序,多个参数类型以英文”,“分隔" placeholder="[java.lang.Integer, com.didi.prado.config.api.param.CampaignRequest]" />
  186. </el-form-item>
  187. <el-form-item label="返回值类型" prop="returnDataStructure">
  188. <el-input v-model="serviceData.returnDataStructure" :autosize="{ minRows: 2, maxRows: 8}" type="textarea" title="key:每个自定义类型在返回结构中的节点树,以英文“.“分隔;value:自定义类型的全限定类名" :placeholder="returnDataStr" />
  189. </el-form-item>
  190. </el-form>
  191. <span class="showBtn" @mouseover="explain" @mouseout="explain">配置指南</span>
  192. <div v-if="showexplain" class="showInfo">
  193. <div class="showZm" />
  194. <div class="showInfo">配置指南</div>
  195. </div>
  196. <div slot="footer" class="dialog-footer">
  197. <el-button @click="dialogFormVisible = false">
  198. 取消
  199. </el-button>
  200. <el-button v-if="showSubmitBtn" type="primary" @click="dialogStatus==='create'?createData():updateData()">
  201. 确定
  202. </el-button>
  203. </div>
  204. </el-dialog>
  205. <el-dialog :visible.sync="dialogPvVisible" title="Reading statistics">
  206. <el-table :data="pvData" border fit highlight-current-row style="width: 100%">
  207. <el-table-column prop="key" label="Channel" />
  208. <el-table-column prop="pv" label="Pv" />
  209. </el-table>
  210. <span slot="footer" class="dialog-footer">
  211. <el-button type="primary" @click="dialogPvVisible = false">Confirm</el-button>
  212. </span>
  213. </el-dialog>
  214. </div>
  215. </template>
  216. <style scoped>
  217. .filter-item {
  218. margin-top: 10px;
  219. }
  220. </style>
  221. <script>
  222. import { fetchServiceById, fetchServiceList, fetchConsumerList, createService, updateService, changeStatus } from '@/api/interface'
  223. import { fetchEnvInfo } from '@/api/interface'
  224. import waves from '@/directive/waves' // waves directive
  225. import { parseTime } from '@/utils'
  226. import Pagination from '@/components/Pagination' // secondary package based on el-pagination
  227. const envTypeSelections = [
  228. { key: 1, display_name: '自定义环境配置' },
  229. { key: 2, display_name: '环境平台' }
  230. ]
  231. var envSelections = []
  232. var consumerSelections = []
  233. const protocols = [
  234. { key: 'dubbo', display_name: 'dubbo' }
  235. // { key: 'http', display_name: 'http' }
  236. ]
  237. // var envTypeID = 1;
  238. // arr to obj, such as { CN : "China", US : "USA" }
  239. // const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => {
  240. // acc[cur.key] = cur.display_name
  241. // return acc
  242. // }, {})
  243. export default {
  244. name: 'Interface',
  245. components: { Pagination },
  246. directives: { waves },
  247. filters: {
  248. statusFilter(status) {
  249. const statusMap = {
  250. 1: 'success',
  251. draft: 'info',
  252. 0: 'danger'
  253. }
  254. return statusMap[status]
  255. }
  256. },
  257. data() {
  258. return {
  259. styleObj: {
  260. 'color': 'rgba(0, 0, 0, 0.726)'
  261. },
  262. userNames: localStorage.getItem('realname'),
  263. username: localStorage.getItem('username'),
  264. tableKey: 0,
  265. list: null,
  266. total: 0,
  267. jsonTit: `{'data':'com.didi.order.api.response.BaserOrderInfoResult','data.feeInfo':'com.didi.order.api.response.FeeInfoResult'}`,
  268. num: '',
  269. Edition: '',
  270. showtit: '',
  271. showexplain: false,
  272. listLoading: true,
  273. statusMappings: new Map([[1, '已开启'], [0, '未开启']]),
  274. statusOperateMap: new Map([[1, '开启'], [0, '关闭']]),
  275. listQuery: {
  276. options: [{ value: '', label: '全部显示' }, { value: '1', label: '已开启' }, { value: '0', label: '未开启' }],
  277. value: '',
  278. curIndex: 1,
  279. pageSize: 20,
  280. customName: '',
  281. interfaceName: '',
  282. sort: '+id',
  283. id: null,
  284. methodName: '',
  285. serviceVersion: '',
  286. methodStatus: null
  287. },
  288. importanceOptions: [1, 2, 3],
  289. envTypeSelections,
  290. envSelections,
  291. consumerSelections,
  292. returnDataStr: '',
  293. protocols,
  294. sortOptions: [{ label: 'ID Ascending', key: '+id' }, { label: 'ID Descending', key: '-id' }],
  295. statusOptions: ['published', 'draft', 'deleted'],
  296. showReviewer: false,
  297. showSubmitBtn: true,
  298. temp: {
  299. id: undefined,
  300. importance: 1,
  301. remark: '',
  302. timestamp: new Date(),
  303. title: '',
  304. type: '',
  305. status: 'published'
  306. },
  307. serviceData: {
  308. // bizLine: 0,
  309. // bizModuleId: 0,
  310. customName: '',
  311. interfaceName: '',
  312. // protocol: '',
  313. serviceVersion: '',
  314. envChannel: 1,
  315. envId: 0,
  316. methodName: '',
  317. methodParamsTypes: '',
  318. returnDataStructure: '',
  319. methodStatus: 1,
  320. consumerIds: [],
  321. remark: '',
  322. updator: ''
  323. },
  324. // ConsumerIdsStr: this.serviceData.consumerIds.replace('[', '').replace(']', '').split(',').map(Number),
  325. serviceDataExt: {
  326. id: 0,
  327. bizLine: 0,
  328. bizModuleId: 0
  329. },
  330. dialogFormVisible: false,
  331. dialogStatus: '',
  332. textMap: {
  333. update: '编辑',
  334. create: '新增接口'
  335. },
  336. dialogPvVisible: false,
  337. pvData: [],
  338. serviceDataRules: {
  339. customName: [{ required: true, message: '名称不能为空', trigger: 'change' }],
  340. envChannel: [{ required: true, message: '请选择环境配置', trigger: 'change' }],
  341. envId: [{ required: true, message: '请选择环境', trigger: 'change' }],
  342. interfaceName: [{ required: true, message: '接口名称不能为空', trigger: 'change' }],
  343. serviceVersion: [{ required: true, message: '服务版本不能为空', trigger: 'change' }],
  344. // protocol: [{ required: true, message: '请选择协议类型', trigger: 'change' }],
  345. consumerIds: [{ required: false, message: '请选择消费者', trigger: 'change' }],
  346. methodName: [{ required: true, message: '方法名称不能为空', trigger: 'change' }]
  347. // methodParamsTypes: [{ required: true, message: '入参类型不能为空', trigger: 'change' }],
  348. // returnDataStructure: [{ required: true, message: '返回值类型不能为空', trigger: 'change' }]
  349. },
  350. downloadLoading: false
  351. }
  352. },
  353. created() {
  354. this.getList()
  355. },
  356. methods: {
  357. getList() {
  358. this.listLoading = true
  359. this.listQuery.methodId = parseInt(this.$route.path.split('/')[3])
  360. fetchServiceList(this.listQuery).then(response => {
  361. this.list = response.data.mockMethodList
  362. this.total = response.data.total
  363. this.listLoading = false
  364. })
  365. },
  366. explain() {
  367. if (this.showexplain === false) {
  368. this.showexplain = true
  369. } else {
  370. this.showexplain = false
  371. }
  372. },
  373. // json 显示格式化
  374. getFormatJsonStrFromString: function(jsonStr) {
  375. var res = ''
  376. for (var i = 0, j = 0, k = 0, ii, ele; i < jsonStr.length; i++) { // k:缩进,j:""个数
  377. ele = jsonStr.charAt(i)
  378. if (j % 2 === 0 && ele === '}') {
  379. k--
  380. for (ii = 0; ii < k; ii++) ele = ' ' + ele
  381. ele = '\n' + ele
  382. } else if (j % 2 === 0 && ele === '{') {
  383. ele += '\n'
  384. k++
  385. for (ii = 0; ii < k; ii++) ele += ' '
  386. } else if (j % 2 === 0 && ele === ',') {
  387. ele += '\n'
  388. for (ii = 0; ii < k; ii++) ele += ' '
  389. } else if (ele === '"') j++
  390. res += ele
  391. }
  392. // eslint-disable-next-line no-return-assign
  393. return (
  394. // this.serviceData.returnDataStructure = res,
  395. this.returnDataStr = res
  396. )
  397. },
  398. getFormatJsonStrFromString1: function(jsonStr) {
  399. var res = ''
  400. for (var i = 0, j = 0, k = 0, ii, ele; i < jsonStr.length; i++) { // k:缩进,j:""个数
  401. ele = jsonStr.charAt(i)
  402. if (j % 2 === 0 && ele === '}') {
  403. k--
  404. for (ii = 0; ii < k; ii++) ele = ' ' + ele
  405. ele = '\n' + ele
  406. } else if (j % 2 === 0 && ele === '{') {
  407. ele += '\n'
  408. k++
  409. for (ii = 0; ii < k; ii++) ele += ' '
  410. } else if (j % 2 === 0 && ele === ',') {
  411. ele += '\n'
  412. for (ii = 0; ii < k; ii++) ele += ' '
  413. } else if (ele === '"') j++
  414. res += ele
  415. }
  416. // eslint-disable-next-line no-return-assign
  417. return (
  418. this.serviceData.returnDataStructure = res
  419. )
  420. },
  421. // 在环境上显示title
  422. envUpdate(s) {
  423. if (this.serviceData.envChannel === 1) {
  424. var num = 1
  425. }
  426. if (this.serviceData.envChannel === 2) {
  427. // eslint-disable-next-line no-redeclare
  428. var num = 2
  429. }
  430. this.serviceData.envId = s
  431. fetchEnvInfo(num).then(response => {
  432. for (var sel of response.data) {
  433. if (sel.envId === s) {
  434. this.Edition = sel.registryAddress
  435. }
  436. }
  437. })
  438. },
  439. updateEnvChannel(v) {
  440. this.serviceData.envChannel = v
  441. this.envSelections = []
  442. fetchEnvInfo(v).then(response => {
  443. for (var sel of response.data) {
  444. var envSel = {}
  445. envSel.key = sel.envId
  446. envSel.display_name = sel.envName
  447. envSel.registryAddress = sel.registryAddress
  448. this.envSelections.push(envSel)
  449. }
  450. })
  451. },
  452. getConsumers() {
  453. this.consumerSelections = []
  454. fetchConsumerList().then(response => {
  455. for (var sel of response.data) {
  456. var consumerSel = {}
  457. consumerSel.key = sel.dubboConsumerId
  458. consumerSel.display_name = sel.customizeName
  459. this.consumerSelections.push(consumerSel)
  460. }
  461. })
  462. },
  463. dialogOpenInit() {
  464. this.getFormatJsonStrFromString1(this.serviceData.returnDataStructure)
  465. this.getFormatJsonStrFromString(this.jsonTit)
  466. this.updateEnvChannel(this.serviceData.envChannel)
  467. this.getConsumers()
  468. },
  469. handleFilter() {
  470. // this.listQuery.page = 1
  471. this.listQuery.methodStatus = this.listQuery.value
  472. this.getList()
  473. },
  474. handleModifyStatus(row, status) {
  475. var statusData = {
  476. id: row.id,
  477. methodStatus: status
  478. }
  479. changeStatus(statusData).then(response => {
  480. if (response.code === 200) {
  481. row.methodStatus = status
  482. this.$message({
  483. message: row.id.toString() + ' ' + this.statusOperateMap.get(status) + '成功!',
  484. type: 'success'
  485. })
  486. } else {
  487. this.$message({
  488. message: row.id.toString() + ' ' + this.statusOperateMap.get(status) + '失败!',
  489. type: 'danger'
  490. })
  491. }
  492. })
  493. },
  494. sortChange(data) {
  495. const { prop, order } = data
  496. if (prop === 'id') {
  497. this.sortByID(order)
  498. }
  499. },
  500. sortByID(order) {
  501. if (order === 'ascending') {
  502. this.listQuery.sort = '+id'
  503. } else {
  504. this.listQuery.sort = '-id'
  505. }
  506. this.handleFilter()
  507. },
  508. resetServiceData() {
  509. this.serviceData = {
  510. // bizLine: 0,
  511. // bizModuleId: 0,
  512. customName: '',
  513. interfaceName: '',
  514. // protocol: '',
  515. serviceVersion: '',
  516. envChannel: 1,
  517. envId: 0,
  518. methodName: '',
  519. methodParamsTypes: '[]',
  520. returnDataStructure: '',
  521. methodStatus: 1,
  522. consumerIds: [],
  523. remark: '',
  524. updator: ''
  525. }
  526. },
  527. handleCreate() {
  528. this.resetServiceData()
  529. this.dialogStatus = 'create'
  530. this.dialogFormVisible = true
  531. this.showSubmitBtn = true
  532. this.$nextTick(() => {
  533. this.$refs['serviceDataForm'].clearValidate()
  534. })
  535. },
  536. createData() {
  537. this.$refs['serviceDataForm'].validate((valid) => {
  538. if (valid) {
  539. // this.serviceData.id = parseInt(Math.random() * 100) + 1024 // mock a id
  540. // this.temp.author = 'vue-element-admin'
  541. delete this.serviceData.id
  542. delete this.serviceData.bizLine
  543. delete this.serviceData.bizModuleId
  544. delete this.serviceData.bizName
  545. delete this.serviceData.consumerCustomizeName
  546. delete this.serviceData.consumerNames
  547. delete this.serviceData.createTime
  548. delete this.serviceData.createTimeStr
  549. delete this.serviceData.envName
  550. delete this.serviceData.updateTime
  551. delete this.serviceData.updateTimeStr
  552. delete this.serviceData.zkAddress
  553. if (typeof this.serviceData.consumerIds === 'object') {
  554. this.serviceData.consumerIds = '[' + this.serviceData.consumerIds.toString() + ']'
  555. }
  556. this.serviceData.creator = this.userNames
  557. this.serviceData.creatorEn = this.username
  558. this.$set(this.serviceData, 'updator', '')
  559. createService(this.serviceData).then(response => {
  560. // this.list.unshift(this.serviceData)
  561. // console.log(response)
  562. if (response.code === 200) {
  563. this.dialogFormVisible = false
  564. this.getList()
  565. this.$notify({
  566. title: 'Success',
  567. message: response.msg,
  568. type: 'success',
  569. duration: 10000
  570. })
  571. } else {
  572. this.$notify({
  573. title: 'Failed',
  574. message: response.msg,
  575. type: 'error',
  576. duration: 10000
  577. })
  578. }
  579. })
  580. }
  581. })
  582. },
  583. handleUpdate(row) {
  584. var queryData = { id: row.id }
  585. fetchServiceById(queryData).then(response => {
  586. var rowData = response.data.mockMethodList
  587. this.serviceData = Object.assign({}, rowData[0])
  588. this.serviceDataExt.id = row.id
  589. this.serviceDataExt.bizLine = row.bizLine
  590. this.serviceDataExt.bizModuleId = row.bizModuleId
  591. if (this.serviceData.consumerIds === '[]') {
  592. this.serviceData.consumerIds = []
  593. } else {
  594. this.serviceData.consumerIds = this.serviceData.consumerIds.split('[')[1].split(']')[0].split(',').map(value => { return parseInt(value) })
  595. }
  596. this.dialogStatus = 'update'
  597. this.dialogFormVisible = true
  598. this.showSubmitBtn = true
  599. this.$nextTick(() => {
  600. this.$refs['serviceDataForm'].clearValidate()
  601. })
  602. })
  603. },
  604. handleCheck(row) {
  605. var queryData = { id: row.id }
  606. fetchServiceById(queryData).then(response => {
  607. var rowData = response.data.mockMethodList
  608. this.serviceData = Object.assign({}, rowData[0])
  609. this.serviceDataExt.id = row.id
  610. this.serviceDataExt.bizLine = row.bizLine
  611. this.serviceDataExt.bizModuleId = row.bizModuleId
  612. if (this.serviceData.consumerIds === '[]') {
  613. this.serviceData.consumerIds = []
  614. } else {
  615. this.serviceData.consumerIds = this.serviceData.consumerIds.split('[')[1].split(']')[0].split(',').map(value => { return parseInt(value) })
  616. }
  617. this.dialogStatus = 'update'
  618. this.dialogFormVisible = true
  619. this.showSubmitBtn = false
  620. this.$nextTick(() => {
  621. this.$refs['serviceDataForm'].clearValidate()
  622. })
  623. })
  624. },
  625. handleCopy(row) {
  626. var queryData = { id: row.id }
  627. fetchServiceById(queryData).then(response => {
  628. var rowData = response.data.mockMethodList
  629. this.serviceData = Object.assign({}, rowData[0])
  630. this.serviceDataExt.id = row.id
  631. this.serviceDataExt.bizLine = row.bizLine
  632. this.serviceDataExt.bizModuleId = row.bizModuleId
  633. if (this.serviceData.consumerIds === '[]') {
  634. this.serviceData.consumerIds = []
  635. } else {
  636. this.serviceData.consumerIds = this.serviceData.consumerIds.split('[')[1].split(']')[0].split(',').map(value => { return parseInt(value) })
  637. }
  638. this.dialogStatus = 'create'
  639. this.dialogFormVisible = true
  640. this.$nextTick(() => {
  641. this.$refs['serviceDataForm'].clearValidate()
  642. })
  643. })
  644. },
  645. updateData() {
  646. this.$refs['serviceDataForm'].validate((valid) => {
  647. if (valid) {
  648. const tempData = {
  649. id: this.serviceDataExt.id,
  650. bizLine: this.serviceDataExt.bizLine,
  651. bizModuleId: this.serviceDataExt.bizModuleId,
  652. customName: this.serviceData.customName,
  653. interfaceName: this.serviceData.interfaceName,
  654. serviceVersion: this.serviceData.serviceVersion,
  655. envChannel: this.serviceData.envChannel,
  656. envId: this.serviceData.envId,
  657. methodName: this.serviceData.methodName,
  658. methodParamsTypes: this.serviceData.methodParamsTypes,
  659. returnDataStructure: this.serviceData.returnDataStructure,
  660. methodStatus: this.serviceData.methodStatus,
  661. consumerIds: '[' + this.serviceData.consumerIds.toString() + ']',
  662. remark: this.serviceData.remark,
  663. updator: this.userNames
  664. }
  665. updateService(tempData).then(response => {
  666. if (response.code === 200) {
  667. this.dialogFormVisible = false
  668. this.getList()
  669. this.$notify({
  670. title: 'Success',
  671. message: response.msg,
  672. type: 'success',
  673. duration: 2000
  674. })
  675. } else {
  676. this.$notify({
  677. title: 'Failed',
  678. message: response.msg,
  679. type: 'error',
  680. duration: 2000
  681. })
  682. }
  683. })
  684. }
  685. })
  686. },
  687. formatJson(filterVal, jsonData) {
  688. return jsonData.map(v => filterVal.map(j => {
  689. if (j === 'timestamp') {
  690. return parseTime(v[j])
  691. } else {
  692. return v[j]
  693. }
  694. }))
  695. },
  696. redirectTo(id, methodName) {
  697. this.$router.push({
  698. path: `/views/mock/interface/${id}`,
  699. query: {
  700. methodName: methodName
  701. }
  702. })
  703. }
  704. }
  705. }
  706. </script>
  707. <style>
  708. .showInfo {
  709. width: 400px;
  710. height: 400px;
  711. text-align: center;
  712. position: fixed;
  713. top: 50%;
  714. left: 50%;
  715. transform: translate(-50%,-50%);
  716. }
  717. .showZm {
  718. position:absolute;
  719. background-color: #ccc;
  720. width: 100%;
  721. height: 100%;
  722. opacity: 0.5;
  723. }
  724. .showBtn {
  725. color: red;
  726. padding-left: 200px;
  727. }
  728. .stylus-head {
  729. width: 98%;
  730. padding: 1%;
  731. margin: 0 auto 1% auto;
  732. background-color: #fff;
  733. border-radius: 4px;
  734. }
  735. .stylus-content{
  736. width: 98%;
  737. padding: 0.3% 1% 1% 1%;
  738. margin: 0 auto;
  739. background-color: #fff;
  740. border-radius: 4px;
  741. }
  742. </style>