SysUpdate.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <template>
  2. <el-container>
  3. <el-header height="220">
  4. <h3>系统更新</h3>
  5. <el-row style="margin-top: 10px">
  6. <el-select
  7. v-model="queryInfo.nodeType"
  8. size="mini"
  9. placeholder="节点类型"
  10. style="margin-left: 5px"
  11. @change="onSelectChange"
  12. >
  13. <el-option label="mgr" value="mgr" />
  14. <el-option label="agent" value="agent" />
  15. </el-select>
  16. <el-button size="mini" type="warning" icon="el-icon-plus" style="margin-left: 5px" @click="handleAdd">添加</el-button>
  17. <el-button size="mini" type="warning" icon="el-icon-refresh" style="margin-left: 5px" @click="handleUpdate">更新</el-button>
  18. </el-row>
  19. </el-header>
  20. <el-main>
  21. <el-row>
  22. <el-col :md="16" style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
  23. <el-table
  24. :data="dataList"
  25. border
  26. height="480"
  27. style="width: 100%"
  28. >
  29. <el-table-column
  30. prop="nodeType"
  31. label="节点类型"
  32. />
  33. <el-table-column
  34. prop="host"
  35. label="机器地址"
  36. />
  37. <el-table-column
  38. prop="appDir"
  39. label="应用目录"
  40. />
  41. <el-table-column
  42. prop="appVersion"
  43. label="应用版本"
  44. />
  45. </el-table>
  46. </el-col>
  47. </el-row>
  48. </el-main>
  49. <el-dialog
  50. append-to-body
  51. :visible.sync="showAddDialog"
  52. width="50%"
  53. center
  54. >
  55. <div>
  56. <el-form :model="addForm" label-width="80px">
  57. <el-form-item label="节点类型" style="width: 70%; padding-right: 2px">
  58. <el-input v-model="queryInfo.nodeType" style="width: 70%; padding-right: 2px" readonly />
  59. </el-form-item>
  60. <el-form-item label="主机地址">
  61. <el-input v-model="addForm.host" style="width: 70%; padding-right: 2px" />
  62. </el-form-item>
  63. <el-form-item label="SSH 端口">
  64. <el-input v-model="addForm.port" style="width: 70%; padding-right: 2px" />
  65. </el-form-item>
  66. <el-form-item label="认证方式" style="width: 70%; padding-right: 2px">
  67. <el-select v-model="addForm.authType" placeholder="选择认证方式">
  68. <el-option label="密码认证" value="password" />
  69. <el-option label="私钥认证" value="privateKey" />
  70. </el-select>
  71. </el-form-item>
  72. <div v-if="addForm.authType === 'password'">
  73. <el-form-item label="用户名" style="width: 70%; padding-right: 2px">
  74. <el-input v-model="addForm.username" style="width: 70%; padding-right: 2px" />
  75. </el-form-item>
  76. <el-form-item label="密码" style="width: 70%; padding-right: 2px">
  77. <el-input v-model="addForm.password" style="width: 70%; padding-right: 2px" />
  78. </el-form-item>
  79. </div>
  80. <div v-else>
  81. <el-form-item label="私钥" style="width: 70%; padding-right: 2px">
  82. <el-input
  83. v-model="addForm.rsaPrikey"
  84. type="textarea"
  85. maxlength="10000"
  86. :rows="10"
  87. style="padding: 5px"
  88. />
  89. </el-form-item>
  90. </div>
  91. <el-form-item label="应用目录">
  92. <el-input v-model="addForm.appDir" style="width: 70%; padding-right: 2px" />
  93. </el-form-item>
  94. <el-form-item>
  95. <el-button type="primary" @click="onAdd">确定</el-button>
  96. </el-form-item>
  97. </el-form>
  98. </div>
  99. </el-dialog>
  100. <!-- 视频预览对话框 -->
  101. <el-dialog
  102. title="预览视频"
  103. append-to-body
  104. :visible.sync="showPreviewDialog"
  105. width="70%"
  106. center
  107. >
  108. <template />
  109. </el-dialog>
  110. </el-container>
  111. </template>
  112. <script>
  113. import { addRemoteHost, deleteRemoteHost, getRemoteHostList, updateRemoteApp } from '@/api/devops'
  114. export default {
  115. name: 'SysUpdate',
  116. data() {
  117. return {
  118. queryInfo: {
  119. nodeType: 'agent'
  120. },
  121. dataList: [],
  122. // **********************************************************************
  123. showAddDialog: false,
  124. addForm: {
  125. nodeType: 'agent',
  126. host: '',
  127. port: 22,
  128. authType: 'password',
  129. username: '',
  130. password: '',
  131. rsaPrikey: '',
  132. appDir: ''
  133. },
  134. // **********************************************************************
  135. showPreviewDialog: false
  136. }
  137. },
  138. created() {
  139. document.title = '系统更新'
  140. this.getData()
  141. },
  142. methods: {
  143. getData() {
  144. this.dataList = []
  145. getRemoteHostList(this.queryInfo).then(resp => {
  146. if (resp.code === 0) {
  147. this.dataList = resp.data
  148. } else {
  149. this.$message.warning(resp.msg)
  150. }
  151. }).catch(error => {
  152. this.$message.error(error.message)
  153. })
  154. },
  155. onSelectChange() {
  156. this.getData()
  157. },
  158. handleAdd() {
  159. this.showAddDialog = true
  160. },
  161. onAdd() {
  162. addRemoteHost(this.addForm).then(resp => {
  163. if (resp.code === 0) {
  164. this.getData()
  165. } else {
  166. this.$message.warning(resp.msg)
  167. }
  168. }).catch(error => {
  169. this.$message.error(error.message)
  170. }).finally(() => {
  171. this.showAddDialog = false
  172. })
  173. },
  174. handleDelete(index, row) {
  175. deleteRemoteHost(row.host).then(resp => {
  176. if (resp.code === 0) {
  177. this.getData()
  178. } else {
  179. this.$message.warning(resp.msg)
  180. }
  181. }).catch(error => {
  182. this.$message.error(error.message)
  183. })
  184. },
  185. handleUpdate() {
  186. const hostList = []
  187. for (const item of this.dataList) {
  188. hostList.push(item.host)
  189. }
  190. console.log(hostList)
  191. this.$confirm('确定要更新所有机器上的 ' + this.queryInfo.nodeType + '?', '提示', {
  192. confirmButtonText: '确定',
  193. cancelButtonText: '取消',
  194. type: 'warning'
  195. }).then(() => {
  196. const form = {}
  197. form.hostList = hostList
  198. updateRemoteApp(form).then(resp => {
  199. this.$message.warning(resp.msg)
  200. }).catch(error => {
  201. this.$message.error(error.message)
  202. })
  203. }).catch(() => {
  204. this.$message({
  205. type: 'info',
  206. message: '已取消'
  207. })
  208. })
  209. }
  210. }
  211. }
  212. </script>
  213. <style>
  214. </style>