index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <template>
  2. <el-container>
  3. <el-aside class="ApiLeft">
  4. <div class="ApiContent">
  5. <div class="Api_space_evenly">
  6. <div :class="{'Api_Interface_list' : Interface_list === '接口列表'}" class="Api_cursor" @click="InterfaceLeft('接口列表')">接口列表</div>
  7. <div :class="{'Api_Interface_list' : Interface_list === '接口分类'}" class="Api_cursor" @click="InterfaceLeft('接口分类')">接口分类</div>
  8. </div>
  9. <div class="Api_search">
  10. <el-input v-model="value" style="width: 55%;" size="mini" prefix-icon="el-icon-search" clearable filterable placeholder="请搜索接口" />
  11. <el-button v-if="Interface_list === '接口列表'" style="margin-left:4%" type="primary" size="mini" @click="addPort()">查询</el-button>
  12. <el-button v-if="Interface_list === '接口分类'" style="margin-left:4%" type="primary" size="mini" @click="addPort()">添加分类</el-button>
  13. </div>
  14. <div>
  15. <el-tree
  16. :data="data1"
  17. node-key="id"
  18. empty-text="无相关接口,请确定搜索内容"
  19. default-expand-all
  20. :default-expanded-keys="key_arr"
  21. :expand-on-click-node="false"
  22. >
  23. <span slot-scope="{ node, data }" class="custom-tree-node" @mouseenter="mouseenter(data)" @mouseleave="mouseleave(data)">
  24. <span>{{ node.label }}</span>
  25. <span v-show="data.row && data.del">
  26. <el-tooltip class="item" effect="dark" content="添加接口" placement="top">
  27. <span v-if="Interface_list === '接口分类'" class="el-icon-plus Api_btn" @click="() => append(data)" />
  28. </el-tooltip>
  29. <el-tooltip class="item" effect="dark" content="修改接口" placement="top">
  30. <span v-if="Interface_list === '接口分类'" class="el-icon-edit Api_btn" @click="() => dblclick(data)" />
  31. </el-tooltip>
  32. <el-tooltip class="item" effect="dark" content="删除接口" placement="top">
  33. <span v-if="Interface_list === '接口分类'" class="el-icon-delete Api_btn" @click="() => remove(data)" />
  34. </el-tooltip>
  35. </span>
  36. </span>
  37. </el-tree>
  38. </div>
  39. <div align="center" style="margin: 2% 0 10%;"><el-input v-if="ElMenu" v-model="value" style="width: 90%;" size="mini" prefix-icon="el-icon-search" clearable filterable placeholder="请搜索接口" /></div>
  40. <!--添加接口-->
  41. <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogAddPortVisible" width="40%">
  42. <div style="margin-left:60px">
  43. <el-form ref="addDeviceForms" :rules="addDeviceDataRules" :model="addDeviceData">
  44. <el-form-item label="模块" prop="lockModel" label-width="80px">
  45. <el-select v-model="addDeviceData.lockModel" size="small" class="filter-item" filterable clearable placeholder="请填写" style="width:75%;" @change="chooseVehicleType()">
  46. <el-option v-for="item in lockModelList" :key="item.model" :label="item.modelName" :value="item.model" />
  47. </el-select>
  48. </el-form-item>
  49. <el-form-item label="版本" prop="lockModel" label-width="80px">
  50. <el-select v-model="addDeviceData.lockModel" size="small" class="filter-item" filterable clearable placeholder="请填写" style="width:75%;" @change="chooseVehicleType()">
  51. <el-option v-for="item in lockModelList" :key="item.model" :label="item.modelName" :value="item.model" />
  52. </el-select>
  53. </el-form-item>
  54. <el-form-item label="接口类名" prop="bikeModel" label-width="80px">
  55. <el-select v-model="addDeviceData.bikeModel" size="small" class="filter-item" filterable clearable placeholder="请填写" style="width:75%;">
  56. <el-option v-for="item in bikeModelList" :key="item.model" :label="item.modelName" :value="item.model" />
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item label="方法名" prop="bikeModel" label-width="80px">
  60. <el-select v-model="addDeviceData.bikeModel" size="small" class="filter-item" filterable clearable placeholder="请填写" style="width:75%;">
  61. <el-option v-for="item in bikeModelList" :key="item.model" :label="item.modelName" :value="item.model" />
  62. </el-select>
  63. </el-form-item>
  64. <el-form-item label="api版本" label-width="80px">
  65. <el-input v-model="addDeviceData.deviceNum" size="small" style="width:75%;" clearable placeholder="请填写" />
  66. </el-form-item>
  67. </el-form>
  68. </div>
  69. <div slot="footer" class="dialog-footer">
  70. <el-button size="small" @click="dialogAddPortVisible = false">取消</el-button>
  71. <el-button size="small" type="primary">确定</el-button>
  72. </div>
  73. <div style="margin-top:5%" />
  74. </el-dialog>
  75. </div>
  76. </el-aside>
  77. <el-main class="ApiRight">
  78. <div v-show="home" class="ApiRightContent">
  79. <div class="Layout">
  80. <div class="titFont" style="padding: 15px 0; font-size: 22px; font-family:PingFangSC-Medium,PingFang SC;font-weight:500; color:rgba(51,59,74,1); line-height:35px;">API </div>
  81. <el-input v-model="value" style="width: 25%;" size="small" prefix-icon="el-icon-search" clearable filterable placeholder="请搜索接口" />
  82. </div>
  83. <el-divider style="color: #EEF0F5; margin: 0 !important" />
  84. <div style="font-size:18px; padding: 8% 0 1%; font-family:PingFangSC-Medium,PingFang SC; font-weight:500; color:rgba(51,59,74,1); line-height:35px;">API接口管理平台介绍及接入文档</div>
  85. <div style="font-size:14px; width: 80%; font-family:PingFangSC-Regular,PingFang SC; font-weight:400; color:rgba(102,102,102,1); line-height:20px;">计划与EMC合作建设公司级反馈平台,覆盖所有内外部反馈,内部大区、客服等渠道反馈,专项工作组case反馈跟踪等场景,项目较大,处于立项阶段,期望收集更多信息和建议。</div>
  86. </div>
  87. <div v-show="Details" class="ApiRight">
  88. <div class="ApiRightContent" style=" overflow:scroll; overflow-x: hidden">
  89. <apiDetails ref="Q_details" />
  90. </div>
  91. </div>
  92. </el-main>
  93. <!-- 新建节点 -->
  94. <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogAddTypeVisible" width="40%">
  95. <div style="margin-left:60px">
  96. <el-form ref="addDeviceForms" :rules="addDeviceDataRules" :model="addDeviceData">
  97. <el-form-item label="分类名" prop="lockModel" label-width="80px">
  98. <el-input v-model="addDeviceData.lockModel" size="small" clearable style="width:75%;" placeholder="请填写" />
  99. </el-form-item>
  100. <el-form-item label="备注" label-width="80px">
  101. <el-input v-model="addDeviceData.deviceNum" size="small" clearable style="width:75%;" placeholder="请填写" />
  102. </el-form-item>
  103. </el-form>
  104. </div>
  105. <div slot="footer" class="dialog-footer">
  106. <el-button size="small" @click="dialogAddTypeVisible = false">取消</el-button>
  107. <el-button size="small" type="primary">确定</el-button>
  108. </div>
  109. </el-dialog>
  110. </el-container>
  111. </template>
  112. <script>
  113. import '@/views/projectManage/publicCss/index.css'
  114. import '@/views/apiManagement/css/index.css'
  115. import apiDetails from '@/views/apiManagement/vue/index'
  116. export default {
  117. components: {
  118. apiDetails
  119. },
  120. data() {
  121. var data1 = [{
  122. id: 1,
  123. label: '质惠平台-迭代接口',
  124. row: 1,
  125. children: [{
  126. id: 4,
  127. label: '二级 1-1',
  128. children: [{
  129. id: 9,
  130. label: '三级 1-1-1'
  131. }, {
  132. id: 10,
  133. label: '三级 1-1-2'
  134. }]
  135. }]
  136. }, {
  137. id: 2,
  138. label: '一级 2',
  139. row: 1,
  140. children: [{
  141. id: 5,
  142. label: '二级 2-1'
  143. }, {
  144. id: 6,
  145. label: '二级 2-2'
  146. }]
  147. }, {
  148. id: 3,
  149. row: 1,
  150. label: '一级 3',
  151. children: [{
  152. id: 7,
  153. label: '二级 3-1'
  154. }, {
  155. id: 8,
  156. label: '二级 3-2'
  157. }]
  158. }]
  159. return {
  160. id: '',
  161. label: '',
  162. key_arr: [],
  163. node_Name: {},
  164. Interface_list: '接口列表',
  165. data1: JSON.parse(JSON.stringify(data1)),
  166. value: '',
  167. screenWidth: '',
  168. Details: false,
  169. home: true,
  170. activeName: 'first',
  171. dialogAddPortVisible: false,
  172. dialogAddTypeVisible: false,
  173. textMap: {
  174. addType: '添加分类',
  175. addPort: '添加接口'
  176. },
  177. dialogStatus: '',
  178. addDeviceData: {},
  179. addDeviceDataRules: {
  180. lockModel: [{ required: true, message: '锁类型不能为空', trigger: 'change' }],
  181. bikeModel: [{ required: true, message: '车辆类型不能为空', trigger: 'change' }],
  182. deviceNum: [{ required: true, message: '车辆个数不能为空', trigger: 'change' }],
  183. lockSupplier: [{ required: true, message: '锁供应商不能为空', trigger: 'change' }],
  184. bikeSupplier: [{ required: true, message: '车辆供应商不能为空', trigger: 'change' }]
  185. },
  186. defaultProps: {
  187. children: 'children',
  188. label: 'label'
  189. }
  190. }
  191. },
  192. methods: {
  193. InterfaceLeft(vel) {
  194. vel === '接口分类' ? this.Interface_list = '接口分类' : this.Interface_list = '接口列表'
  195. },
  196. append(data) { // 添加节点
  197. this.dialogAddTypeVisible = true
  198. this.dialogStatus = 'addType'
  199. },
  200. mouseenter(data) { // 导航栏显示新建/删除/编辑
  201. this.$set(data, 'del', true)
  202. },
  203. mouseleave(data) { // 导航栏隐藏新建/删除/编辑
  204. this.$set(data, 'del', false)
  205. },
  206. // 删除
  207. remove(node, data) {
  208. this.$confirm('是否确认删除', '确认信息', {
  209. distinguishCancelAndClose: true,
  210. confirmButtonText: '确定',
  211. cancelButtonText: '取消'
  212. })
  213. .then(() => {
  214. // 在这里掉删除接口
  215. })
  216. .catch(action => {
  217. this.$message({ type: 'success', message: '已取消' })
  218. })
  219. },
  220. cli_Choice() {
  221. this.Details = true
  222. this.home = false
  223. },
  224. addPort() {
  225. this.dialogAddPortVisible = true
  226. this.dialogStatus = 'addPort'
  227. },
  228. addType() {
  229. this.dialogAddTypeVisible = true
  230. this.dialogStatus = 'addType'
  231. },
  232. editTree(node, data) {
  233. data.editShow = true
  234. document.querySelector(`#tree-item${data.id}`).style.display = 'none'
  235. },
  236. editSuccess(node, data) {
  237. data.editShow = false
  238. document.querySelector(`#tree-item${data.id}`).style.display = 'inline-block'
  239. }
  240. }
  241. }
  242. </script>
  243. <style lang="scss" scoped>
  244. .ApiLeft {
  245. padding: 10px 0px 10px 10px;
  246. background: #F2F3F6;
  247. color: #333B4A;
  248. min-height: calc(100vh - 65px);
  249. .ApiContent {
  250. padding: 10px 0px 10px 10px;
  251. text-align: center;
  252. background: #FFF;
  253. border-radius: 4px;
  254. min-height: calc(100vh - 75px);
  255. }
  256. .Api_search {
  257. margin: 10px 0;
  258. }
  259. .Api_btn {
  260. margin: 0 5px;
  261. cursor: pointer;
  262. }
  263. .Api_btn:hover {
  264. color: #409EFF;
  265. }
  266. }
  267. .ApiRight {
  268. padding: 10px;
  269. background: #F2F3F6;
  270. color: #333B4A;
  271. min-height: calc(100vh - 65px);
  272. .ApiRightContent {
  273. background: #FFF;
  274. min-height: calc(100vh - 75px);
  275. padding: 0.5% 3%;
  276. border-radius: 4px;
  277. }
  278. }
  279. .custom-tree-node {
  280. flex: 1;
  281. display: flex;
  282. align-items: center;
  283. justify-content: space-between;
  284. font-size: 14px;
  285. padding-right: 8px;
  286. }
  287. .Api_space_evenly { // 布局
  288. display: flex;
  289. align-items: center;
  290. justify-content: space-evenly;
  291. }
  292. .Api_Interface_list { // 接口列表和接口分类按钮颜色
  293. color: #409EFF;
  294. border-bottom: 2px solid #409EFF;
  295. padding-bottom: 3px;
  296. }
  297. .Api_cursor { // 小手
  298. cursor: pointer;
  299. }
  300. </style>