index.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. <div id="mediaServer" class="iot-sip-mediaServer">
  3. <el-card style="padding-bottom: 100px;border: 0;" v-loading="loading" shadow="never">
  4. <div class="mb-8">
  5. <el-button
  6. type="primary"
  7. :icon="Plus"
  8. size="small"
  9. @click="add"
  10. >{{ t('sip.mediaServer998535-0') }}</el-button
  11. >
  12. <el-button type="warning" plain :icon="Refresh" size="small" @click="getServerList">刷新</el-button>
  13. </div>
  14. <el-row :gutter="30">
  15. <el-col
  16. :xs="24"
  17. :sm="12"
  18. :md="12"
  19. :lg="8"
  20. :xl="6"
  21. v-for="(item, index) in mediaServerList"
  22. :key="index"
  23. style="margin-bottom: 30px; text-align: center"
  24. >
  25. <div class="card-box-outer">
  26. <el-card shadow="always" class="card-item">
  27. <el-row :gutter="10">
  28. <el-col :span="15">
  29. <el-descriptions :column="1" size="small" style="white-space: nowrap;">
  30. <el-descriptions-item :label="t('sip.mediaServer998535-1')">
  31. {{ item.serverId }}
  32. </el-descriptions-item>
  33. <el-descriptions-item :label="t('sip.mediaServer998535-2')">
  34. {{ item.ip }}
  35. </el-descriptions-item>
  36. <el-descriptions-item :label="t('sip.mediaServer998535-3')">
  37. {{ item.protocol }}
  38. </el-descriptions-item>
  39. <el-descriptions-item :label="t('sip.mediaServer998535-4')">
  40. {{ parseTime(item.createTime, '{y}-{m}-{d}') }}
  41. </el-descriptions-item>
  42. </el-descriptions>
  43. </el-col>
  44. <el-col :span="8">
  45. <div style="margin-top: 10px">
  46. <el-image :src="zlmLogo" fit="fit" />
  47. </div>
  48. </el-col>
  49. </el-row>
  50. <el-button-group style="margin-top: 10px">
  51. <el-button
  52. class="text-[#ff6363]!"
  53. style="padding: 5px 10px"
  54. :icon="Delete"
  55. @click="del(item)"
  56. >删除</el-button
  57. >
  58. <el-button
  59. class="text-[#0147eb]!"
  60. size="small"
  61. style="padding: 5px 15px; margin: 0 10px"
  62. :icon="View"
  63. @click="view(item)"
  64. >查看</el-button
  65. >
  66. <el-button
  67. v-if="!istrue"
  68. class="text-[#67c23b]!"
  69. size="small"
  70. style="padding: 5px 15px"
  71. :icon="Odometer"
  72. @click.prevent="edit(item)"
  73. >
  74. 编辑
  75. </el-button>
  76. <el-button
  77. v-else
  78. class="success-btn"
  79. size="small"
  80. style="padding: 5px 15px"
  81. :icon="Odometer"
  82. :loading="true"
  83. disabled
  84. >{{ t('sip.mediaServer998535-5') }}</el-button
  85. >
  86. </el-button-group>
  87. </el-card>
  88. </div>
  89. </el-col>
  90. </el-row>
  91. <div v-if="total === 0">
  92. <el-empty description="暂无数据" :image-size="80" />
  93. </div>
  94. <pagination
  95. v-show="total > 0"
  96. :total="total"
  97. v-model:page="queryParams.pageNum"
  98. v-model:limit="queryParams.pageSize"
  99. :page-sizes="[12, 24, 36, 60]"
  100. @pagination="getServerList"
  101. />
  102. </el-card>
  103. <mediaServerEdit
  104. ref="mediaServerEditRef"
  105. :edit-flag="editFlag"
  106. @getServerList="getServerList"
  107. @delay="delay"
  108. />
  109. </div>
  110. </template>
  111. <script setup>
  112. import { ref, reactive, onMounted, onUnmounted } from 'vue'
  113. import { Plus, Refresh, Delete, View, Odometer } from '@element-plus/icons-vue'
  114. import { ElMessageBox, ElMessage } from 'element-plus'
  115. import mediaServerEdit from './mediaServer-edit.vue'
  116. import { delmediaServer, listmediaServer } from '@/api/pms/video/mediaServer'
  117. import { parseTime } from '@/utils/dateUtil'
  118. import zlmLogo from '@/assets/imgs/zlm-logo.png'
  119. // 使用组合式API
  120. const { t } = useI18n()
  121. // refs
  122. const mediaServerEditRef = ref(null)
  123. // 数据状态
  124. const loading = ref(true)
  125. const editFlag = ref(false)
  126. const istrue = ref(false)
  127. const mediaServerList = ref([]) //设备列表
  128. const winHeight = ref(window.innerHeight - 200)
  129. const updateLooper = ref(false)
  130. const currentPage = ref(1)
  131. const count = ref(15)
  132. const num = ref(getNumberByWidth())
  133. const total = ref(0)
  134. defineOptions({
  135. name:'VideoCenterMediaServer'
  136. })
  137. // 查询参数
  138. const queryParams = reactive({
  139. pageNum: 1,
  140. pageSize: 10
  141. })
  142. // 生命周期钩子
  143. onMounted(() => {
  144. initData()
  145. // updateLooper.value = setInterval(initData, 2000)
  146. })
  147. onUnmounted(() => {
  148. clearTimeout(updateLooper.value)
  149. })
  150. // 初始化数据
  151. const initData = () => {
  152. getServerList()
  153. }
  154. // 页码变化
  155. const pageNumChange = (val) => {
  156. queryParams.pageNum = val
  157. getServerList()
  158. }
  159. // 页面大小变化
  160. const pageSizeChange = (val) => {
  161. queryParams.pageSize = val
  162. getServerList()
  163. }
  164. // 获取服务器列表
  165. const getServerList = () => {
  166. loading.value = true
  167. // 获取服务器列表: 实际要用的
  168. listmediaServer(queryParams).then((response) => {
  169. mediaServerList.value = response.list
  170. total.value = response.total
  171. loading.value = false
  172. })
  173. }
  174. // 添加
  175. const add = () => {
  176. mediaServerEditRef.value.openDialog(null, initData, editFlag.value)
  177. editFlag.value = true
  178. }
  179. // 查看
  180. const view = (row) => {
  181. mediaServerEditRef.value.openDialog(row, initData, editFlag.value)
  182. editFlag.value = false
  183. }
  184. // 编辑
  185. const edit = (row) => {
  186. mediaServerEditRef.value.openDialog(row, initData, editFlag.value)
  187. editFlag.value = true
  188. }
  189. // 延迟处理
  190. const delay = () => {
  191. let n = 5
  192. // 定义定时器time
  193. const time = setInterval(() => {
  194. istrue.value = true
  195. n--
  196. // 如果n<0,清除定时器,禁用状态取消,文字提示为空(不显示)
  197. if (n < 0) {
  198. istrue.value = false
  199. clearInterval(time)
  200. }
  201. }, 1000)
  202. }
  203. // 删除
  204. const del = (row) => {
  205. const ids = row.id // 这里原代码有问题,应该是row.id而不是this.ids
  206. ElMessageBox.confirm(t('sip.mediaServer998535-7', [ids]))
  207. .then(async function () {
  208. await delmediaServer(ids)
  209. await getServerList()
  210. })
  211. .then(() => {
  212. ElMessage.success('删除成功')
  213. })
  214. .catch(() => {})
  215. }
  216. // 根据宽度计算数量(使用函数声明以保证可在初始化时调用)
  217. function getNumberByWidth() {
  218. let candidateNums = [1, 2, 3, 4, 6, 8, 12, 24]
  219. let clientWidth = window.innerWidth - 30
  220. let interval = 20
  221. let itemWidth = 360
  222. let num = (clientWidth + interval) / (itemWidth + interval)
  223. let result = Math.ceil(24 / num)
  224. let resultVal = 24
  225. for (let i = 0; i < candidateNums.length; i++) {
  226. let value = candidateNums[i]
  227. if (i + 1 >= candidateNums.length) {
  228. return 24
  229. }
  230. if (value <= result && candidateNums[i + 1] > result) {
  231. return value
  232. }
  233. }
  234. return resultVal
  235. }
  236. </script>
  237. <style lang="scss" scoped>
  238. ::v-deep .el-descriptions__body {
  239. background-color: transparent;
  240. }
  241. .card-item {
  242. border-radius: 10px;
  243. padding: 15px 0px;
  244. background-image: linear-gradient(#e9f1fc, #fefefe);
  245. border: 0;
  246. }
  247. </style>