index.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <template>
  2. <div class="app-container" ref="appContainer">
  3. <ServerPropTable :loading="loading" @selection-change="selectionChange" :columns="column" :data="list" @reset="reset"
  4. @onSubmit="onSubmit" @onUpdate="onUpdate">
  5. <template v-slot:btn>
  6. <div style="display: flex; justify-content: flex-end">
  7. <el-button type="danger" @click="batchDelete"><el-icon>
  8. <delete />
  9. </el-icon>删除</el-button>
  10. </div>
  11. </template>
  12. <template v-slot:state="scope">{{ scope.row.state ? '开启' : '关闭' }}</template>
  13. <template v-slot:operation="scope">
  14. <el-button type="primary" size="small" icon="Edit" @click="edit(scope.row)">
  15. 编辑
  16. </el-button>
  17. <el-button @click="del(scope.row)" type="danger" size="small" icon="Delete">
  18. 删除
  19. </el-button>
  20. </template>
  21. </ServerPropTable>
  22. <el-dialog v-model="dialogVisible" :title='title' width="50%">
  23. <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px" class="demo-ruleForm"
  24. :size="formSize">
  25. <el-form-item label="ID" prop="_id">
  26. <el-input readonly :value="ruleForm._id" />
  27. </el-form-item>
  28. <el-form-item label="状态" prop="state">
  29. <el-radio-group v-model="ruleForm.state">
  30. <el-radio :label="0">关闭</el-radio>
  31. <el-radio :label="1">开启</el-radio>
  32. </el-radio-group>
  33. </el-form-item>
  34. </el-form>
  35. <template #footer>
  36. <span class="dialog-footer">
  37. <el-button @click="dialogVisible = false">取消</el-button>
  38. <el-button type="primary" @click="handleClose(ruleFormRef)">确定</el-button>
  39. </span>
  40. </template>
  41. </el-dialog>
  42. </div>
  43. </template>
  44. <script lang="ts" setup name="comprehensive">
  45. import { ref, reactive, onMounted, nextTick, onBeforeMount } from 'vue'
  46. import * as dayjs from 'dayjs'
  47. import { ElMessage, ElMessageBox } from 'element-plus'
  48. import type { FormInstance } from 'element-plus'
  49. import serverApi from '@/api/server'
  50. const loading = ref(true)
  51. const appContainer = ref(null)
  52. import ServerPropTable from '@/components/Table/ServerPropTable/index.vue'
  53. // const data = []
  54. // for (let i = 0; i < 100; i++) {
  55. // data.push({
  56. // id: i + 1,
  57. // host: '0.0.0.0',
  58. // port: 3000 + i,
  59. // gatewayId: 1,
  60. // gameIds: '101,102',
  61. // state: i % 2 ? 1 : 0
  62. // })
  63. // }
  64. const data = ref([])
  65. const serverName = "chat"
  66. onBeforeMount(() => {
  67. loadServerInfo()
  68. })
  69. const loadServerInfo = () => {
  70. serverApi.getAll(serverName).then(res => {
  71. data.value = res.data.result;
  72. console.log(data)
  73. })
  74. }
  75. const column = [
  76. { type: 'selection', width: 60, fixed: 'left' },
  77. { name: '_id', label: 'ID', inSearch: true, valueType: 'inputNumber', width: 80 },
  78. { name: 'host', label: '主机'},
  79. { name: 'port', label: 'UDP端口'},
  80. { name: 'gatewayId', label: '连接网关服'},
  81. { name: 'gameIds', label: '包含游戏服'},
  82. {
  83. name: 'state',
  84. label: '状态',
  85. slot: true,
  86. inSearch: true,
  87. options: [
  88. {
  89. value: 0,
  90. label: '关闭',
  91. },
  92. {
  93. value: 1,
  94. label: '开启',
  95. }
  96. ],
  97. valueType: 'select',
  98. },
  99. { name: 'operation', slot: true, fixed: 'right', width: 200, label: '操作' },
  100. ]
  101. const list = ref(data)
  102. const formSize = ref('default')
  103. const ruleFormRef = ref<FormInstance>()
  104. const ruleForm = reactive({
  105. state: null,
  106. })
  107. const rules = reactive({
  108. state: [
  109. {
  110. required: true,
  111. message: '请选择状态',
  112. trigger: 'change',
  113. },
  114. ],
  115. })
  116. const dialogVisible = ref(false)
  117. const rowObj = ref({})
  118. const selectObj = ref([])
  119. const title = ref('编辑')
  120. const handleClose = async (done: () => void) => {
  121. await ruleFormRef.value.validate((valid, fields) => {
  122. if (valid) {
  123. list.value.forEach((item) => {
  124. if (item._id === rowObj.value._id) {
  125. let updateParams = reactive({
  126. serverName: serverName,
  127. _id: ruleForm._id,
  128. updateValue: ruleForm
  129. })
  130. serverApi.update(updateParams).then(res => {
  131. if (res.data.code = 200) {
  132. // item.state = ruleForm.state
  133. loadServerInfo()
  134. return ElMessage.success('修改成功')
  135. } else {
  136. return ElMessage.error('修改失败')
  137. }
  138. })
  139. }
  140. })
  141. dialogVisible.value = false
  142. console.log('submit!', ruleForm.state)
  143. } else {
  144. console.log('error submit!', fields)
  145. }
  146. })
  147. }
  148. const batchDelete = () => {
  149. if (!selectObj.value.length) {
  150. return ElMessage.error('未选中任何行')
  151. }
  152. ElMessageBox.confirm('你确定要删除选中项吗?', '温馨提示', {
  153. confirmButtonText: '确定',
  154. cancelButtonText: '取消',
  155. type: 'warning',
  156. draggable: true,
  157. })
  158. .then(() => {
  159. let selectServerIds = reactive([])
  160. for (let value of selectObj.value) {
  161. selectServerIds.push(value._id)
  162. }
  163. let deleteParams = reactive({
  164. serverName: serverName,
  165. serverIds: selectServerIds
  166. })
  167. serverApi.deleteBatch(deleteParams).then(res => {
  168. loadServerInfo()
  169. ElMessage.success('批量删除成功')
  170. })
  171. list.value = list.value.concat([])
  172. })
  173. .catch(() => { })
  174. }
  175. const selectionChange = (val) => {
  176. selectObj.value = val
  177. }
  178. const edit = (row) => {
  179. rowObj.value = row
  180. dialogVisible.value = true
  181. ruleForm._id = row._id
  182. ruleForm.state = row.state
  183. }
  184. const del = (row) => {
  185. console.log('row==', row)
  186. ElMessageBox.confirm('你确定要删除当前项吗?', '温馨提示', {
  187. confirmButtonText: '确定',
  188. cancelButtonText: '取消',
  189. type: 'warning',
  190. draggable: true,
  191. })
  192. .then(() => {
  193. // list.value = list.value.filter((item) => item._id !== row._id)
  194. let deleteParams = reactive({
  195. serverName: serverName,
  196. serverId: row._id
  197. })
  198. serverApi.delete(deleteParams).then(res => {
  199. loadServerInfo()
  200. ElMessage.success('删除成功')
  201. })
  202. loading.value = true
  203. setTimeout(() => {
  204. loading.value = false
  205. }, 500)
  206. })
  207. .catch(() => { })
  208. }
  209. const reset = () => {
  210. loadServerInfo()
  211. loading.value = true
  212. setTimeout(() => {
  213. loading.value = false
  214. }, 500)
  215. ElMessage.success('重置成功')
  216. }
  217. const onSubmit = (val) => {
  218. if (!val._id && val.state == null) {
  219. ElMessage.warning('请输入查询条件')
  220. return
  221. }
  222. let queryParams = reactive({
  223. serverName: serverName
  224. })
  225. if (val._id) {
  226. queryParams._id = parseInt(val._id)
  227. }
  228. if (val.state != null) {
  229. queryParams.state = val.state
  230. }
  231. serverApi.query(queryParams).then(res => {
  232. data.value = res.data.result;
  233. console.log(data.value)
  234. })
  235. loading.value = true
  236. setTimeout(() => {
  237. loading.value = false
  238. }, 500)
  239. }
  240. const onUpdate = (val) => {
  241. if (val.state == null) {
  242. ElMessage.warning('请输入编辑内容')
  243. return
  244. }
  245. let updateParams = reactive({
  246. serverName: serverName,
  247. updateValue: reactive({})
  248. })
  249. if (val._id) {
  250. updateParams._id = parseInt(val._id)
  251. }
  252. if (val.state != null) {
  253. updateParams.updateValue.state = val.state
  254. }
  255. serverApi.updateBatch(updateParams).then(res => {
  256. if (res.data.code = 200) {
  257. loadServerInfo()
  258. return ElMessage.success('修改成功')
  259. } else {
  260. return ElMessage.error('修改失败')
  261. }
  262. })
  263. loading.value = true
  264. setTimeout(() => {
  265. loading.value = false
  266. }, 500)
  267. }
  268. const getHeight = () => {
  269. }
  270. onMounted(() => {
  271. nextTick(() => {
  272. // let data = appContainer.value.
  273. })
  274. setTimeout(() => {
  275. loading.value = false
  276. }, 500)
  277. })
  278. </script>
  279. <style scoped>
  280. .edit-input {
  281. padding-right: 100px;
  282. }
  283. .app-container {
  284. flex: 1;
  285. display: flex;
  286. width: 100%;
  287. padding: 16px;
  288. box-sizing: border-box;
  289. }
  290. .cancel-btn {
  291. position: absolute;
  292. right: 15px;
  293. top: 10px;
  294. }
  295. </style>