| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559 |
- <!-- 装备管理 -->
- <template>
- <Container :query-form="queryForm" class="three-model-container">
- <!-- 查询表单 -->
- <template #query-form>
- <el-form-item label="装备名称">
- <el-input
- v-model="queryForm.equipmentName"
- placeholder="输入装备名称"
- clearable
- @keyup.enter.native="handleQuery"
- />
- </el-form-item>
- <el-form-item label="装备类型">
- <el-select v-model="queryForm.equipmentType" placeholder="全部" clearable>
- <el-option v-for="(item, index) in zbTypeList" :key="index" :label="item.zbTypeName" :value="item.id"></el-option>
- </el-select>
- </el-form-item>
- </template>
- <!-- 顶部操作 -->
- <template #header-actions>
- <el-button type="primary" icon="el-icon-search" @click="handleQuery">查询</el-button>
- <el-button @click="resetQuery">重置</el-button>
- <el-button icon="el-icon-plus" @click="openAdd">新建</el-button>
- </template>
- <!-- 表格 -->
- <div class="table-container">
- <el-table
- ref="table"
- :data="tableData"
- border
- size="mini"
- highlight-current-row
- @selection-change="handleSelectionChange"
- >
- <el-table-column type="selection" width="55"/>
- <el-table-column type="index" label="序号" width="60"/>
- <el-table-column prop="zbTypeName" label="所属装备类型" align="center"/>
- <el-table-column prop="zbModelName" label="所属装备型号名称" align="center" show-overflow-tooltip/>
- <el-table-column prop="zbName" label="装备名称" show-overflow-tooltip/>
- <el-table-column prop="zbCode" label="装备编号" width="120" align="center"/>
- <el-table-column prop="ipAddress" label="IP地址" width="120" align="center"/>
- <el-table-column prop="port" label="端口" width="100" align="center"/>
- <el-table-column prop="communicationType" label="通讯方式" width="100" align="center">
- <template slot-scope="{ row }">
- <span v-if="row.communicationType === '0'">PDXP</span>
- <span v-else-if="row.communicationType === '1'">UDP</span>
- <span v-else>TCP</span>
- </template>
- </el-table-column>
- <el-table-column prop="connectionStatus" label="连通状态" width="100" align="center">
- <template slot-scope="{ row }">
- <span v-if="row.connectionStatus === 0">断开</span>
- <span v-else-if="row.connectionStatus === 1">连接</span>
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column prop="createTime" label="创建时间" align="center" sortable/>
- <el-table-column prop="createBy" label="创建人" align="center" sortable/>
- <el-table-column label="操作" fixed="right" align="center" width="220">
- <template slot-scope="{ row }">
- <div class="action-bar">
- <el-button size="small" plain icon="el-icon-edit" @click="handleEdit(row)">编辑</el-button>
- <el-button size="small" type="danger" icon="el-icon-delete" @click="handleDelete(row)">删除</el-button>
- </div>
- </template>
- </el-table-column>
- </el-table>
- <!-- 分页 -->
- <div class="pagination-container">
- <el-pagination
- background
- :current-page="pagination.currentPage"
- :page-sizes="[10, 20, 50]"
- :page-size="pagination.pageSize"
- layout="total, sizes, prev, pager, next, jumper"
- :total="pagination.total"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
- </div>
- <!-- 底部操作 -->
- <!--<template #footer-actions>-->
- <!-- <el-button icon="el-icon-download" @click="exportList">导出清单</el-button>-->
- <!-- <span class="footer-tips">选中 {{ selectedRows.length }} 项</span>-->
- <!--</template>-->
- <!-- 新增装备弹窗 -->
- <el-dialog
- :title="addOrUpdateTitle"
- :visible.sync="addVisible"
- width="720px"
- :class="['dark-dialog', null]"
- :close-on-click-modal="false"
- @closed="onAddClosed"
- >
- <el-form ref="addFormRef" :model="addForm" :rules="addRules" label-width="110px" size="small">
- <el-row :gutter="16">
- <el-col :span="12">
- <el-form-item label="所属装备类型" prop="zbTypeId">
- <el-select v-model="addForm.zbTypeId" placeholder="请选择所属装备类型">
- <el-option v-for="(item, index) in zbTypeList" :key="index" :label="item.zbTypeName" :value="item.id"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="所属装备型号" prop="zbModelId">
- <el-select v-model="addForm.zbModelId" placeholder="请输入所属装备型号名称">
- <el-option v-for="(item, index) in zbModelList" :key="index" :label="item.zbModelName" :value="item.id"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="装备名称" prop="zbName">
- <el-input v-model="addForm.zbName" placeholder="请输入装备名称" />
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="装备编号" prop="zbCode">
- <el-input v-model="addForm.zbCode" placeholder="请输入装备编号" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="IP地址" prop="ipAddress">
- <el-input
- v-model.trim="addForm.ipAddress"
- placeholder="请输入IP地址"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="端口号" prop="port">
- <el-input
- v-model.trim="addForm.port"
- placeholder="请输入端口号"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="通讯方式" prop="communicationType">
- <el-select v-model="addForm.communicationType">
- <el-option value="0" label="PDXP">PDXP</el-option>
- <el-option value="1" label="UDP">UDP</el-option>
- <el-option value="2" label="TCP">TCP</el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <!--<el-col :span="12">-->
- <!-- <el-form-item label="状态" prop="connectionStatus">-->
- <!-- <el-select v-model="addForm.connectionStatus">-->
- <!-- <el-option :value="0" label="断开"></el-option>-->
- <!-- <el-option :value="1" label="连接"></el-option>-->
- <!-- </el-select>-->
- <!-- </el-form-item>-->
- <!--</el-col>-->
- </el-row>
- </el-form>
- <div slot="footer" class="dialog-footer">
- <el-button @click="addVisible=false">取 消</el-button>
- <el-button type="primary" @click="handleAddSubmit">确 定</el-button>
- </div>
- </el-dialog>
- </Container>
- </template>
- <script>
- import {getDataList, addEqu, editEqu, delEqu, getEquDetails, getAllEquTypes, getAllEquModels} from '@/api/equipment'
- export default {
- name: 'equipment',
- data() {
- return {
- addOrUpdateTitle: '新建',
- // 查询
- queryForm: {equipmentName: '', equipmentType: ''},
- // 列表&分页
- tableData: [],
- allData: [],
- selectedRows: [],
- pagination: {currentPage: 1, pageSize: 10, total: 0},
- // 新增弹窗
- addVisible: false,
- addForm: {
- id: '', // 主键(编辑时必填)
- zbTypeId: '', // 所属装备类型
- zbModelId: '', // 所属装备型号名称
- zbName: '', // 装备名称
- zbCode: '', // 装备编号
- ipAddress: '', // IP地址
- port: '', // 端口号
- communicationType: '',// 通讯方式(默认PDXP)
- // status: ''
- },
- addRules: {
- zbTypeId: [{required: true, message: '所属装备类型不能为空', trigger: 'change'}],
- zbModelId: [{required: true, message: '所属装备型号名称不能为空', trigger: 'change'}],
- zbName: [{required: true, message: '装备名称不能为空', trigger: 'blur'}],
- zbCode: [{required: true, message: '装备编号不能为空', trigger: 'blur'}],
- ipAddress: [
- { required: true, message: 'IP地址不能为空', trigger: 'blur' },
- {
- pattern: /^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
- message: '请输入有效的IP地址(如:192.168.1.1)',
- trigger: 'blur'
- }
- ],
- port: [
- { required: true, message: '端口号不能为空', trigger: 'blur' },
- { pattern: /^\d+$/, message: '端口号只能输入数字', trigger: 'blur' },
- {
- validator: (rule, value, callback) => {
- const port = parseInt(value, 10)
- if (port < 1 || port > 65535) {
- callback(new Error('端口号必须在1-65535之间'))
- } else {
- callback()
- }
- },
- trigger: 'blur'
- }
- ],
- communicationType: [{required: true, message: '通讯方式不能为空', trigger: 'change'}]
- },
- zbTypeList: [],
- zbModelList: [],
- }
- },
- created() {
- this.handleQuery()
- this.getTypes()
- this.getModels()
- },
- methods: {
- // 获取所有装备类型
- getTypes() {
- getAllEquTypes().then(res => {
- if (res.code !==0) {
- return
- }
- this.zbTypeList = res.data
- })
- },
- // 获取所有装备型号
- getModels() {
- getAllEquModels().then(res => {
- if (res.code !==0) {
- return
- }
- this.zbModelList = res.data
- })
- },
- /* ====== 查询&分页 ====== */
- handleQuery() {
- let param = {
- pageNo: this.pagination.currentPage,
- pageSize: this.pagination.pageSize,
- ...this.queryForm
- }
- getDataList(param).then(res => {
- if (res.code !== 0) {
- return
- }
- this.tableData = res.data.records || []
- this.pagination.total = res.data.total
- console.log(res)
- }).catch(() => {
- })
- },
- resetQuery() {
- this.queryForm = {equipmentName: '', equipmentType: ''}
- this.pagination.currentPage = 1
- this.handleQuery()
- },
- handleSizeChange(size) {
- this.pagination.pageSize = size
- this.pagination.currentPage = 1
- this.handleQuery()
- },
- handleCurrentChange(p) {
- this.pagination.currentPage = p
- this.handleQuery()
- },
- /* ====== 表格操作 ====== */
- handleSelectionChange(val) {
- this.selectedRows = val
- },
- handleEdit(row) {
- this.addForm = {...row}
- // this.addForm.status = '0'
- // getEquDetails(row.id).then(res => {
- // console.log(res)
- // })
- this.addOrUpdateTitle = '编辑'
- this.addVisible = true
- },
- togglePublish(row) {
- row.modelCategory = row.modelCategory === 'published' ? 'draft' : 'published'
- this.$message.success('状态已更新')
- },
- handleDelete(row) {
- this.$confirm('确认删除?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(() => {
- delEqu(row.id).then(res => {
- if (res.code !== 0) {
- return
- }
- this.$message.success('删除成功')
- this.handleQuery()
- }).catch(() => {
- })
- }).catch(()=>{})
- },
- /* ====== 新增或修改弹窗 ====== */
- openAdd() {
- this.addForm = {
- zbTypeId: '', // 所属装备类型
- zbModelId: '', // 所属装备型号名称
- zbName: '', // 装备名称
- zbCode: '', // 装备编号
- ipAddress: '', // IP地址
- port: '', // 端口号
- communicationType: '',// 通讯方式
- // connectionStatus: '',
- // status: ''
- }
- this.addOrUpdateTitle = '新建'
- this.addVisible = true
- this.$nextTick(() => {
- this.$refs.addFormRef && this.$refs.addFormRef.clearValidate()
- this.$refs.uploader && this.$refs.uploader.clearFiles()
- })
- },
- onAddClosed() {
- this.$refs.addFormRef && this.$refs.addFormRef.resetFields()
- },
- handleAddSubmit() {
- this.$refs.addFormRef.validate(valid => {
- if (!valid) return
- (this.addOrUpdateTitle === '编辑' ? editEqu : addEqu)(this.addForm).then(res => {
- if (res.code !== 0) {
- return
- }
- this.$message({
- message: '操作成功',
- type: 'info',
- duration: 500,
- onClose: () => {
- this.pagination.currentPage = 1
- this.addVisible = false
- this.handleQuery()
- }
- })
- })
- })
- },
- },
- }
- </script>
- <style lang="scss">
- .el-form-item__label {
- color: #fff !important;
- }
- .el-dialog__title {
- color: #e0e6ed !important;
- font-size: 16px !important;
- font-weight: bold !important;
- }
- .dark-dialog {
- .el-dialog {
- background: var(--dark-dialog-bg, #2d3a4b);
- border: 1px solid #425163;
- border-radius: 4px;
- &__header {
- border-bottom: 1px solid #425163;
- padding: 15px 20px;
- .el-dialog__title,
- .dark-dialog-title {
- color: #e0e6ed !important;
- font-size: 16px !important;
- font-weight: bold !important;
- }
- .el-dialog__headerbtn {
- .el-dialog__close {
- color: #8796ad;
- &:hover {
- color: #e0e6ed;
- }
- }
- }
- }
- &__body {
- color: #e0e6ed;
- padding: 20px;
- .el-descriptions {
- &__header {
- .el-descriptions__title {
- color: #e0e6ed;
- }
- }
- &__body {
- background: transparent;
- .el-descriptions-item__label {
- color: #8796ad;
- background: #1e2733;
- }
- .el-descriptions-item__content {
- color: #e0e6ed;
- background: #1e2733;
- }
- }
- }
- }
- &__footer {
- border-top: 1px solid #425163;
- padding: 10px 20px;
- text-align: right;
- .el-button {
- &.dark-button {
- background-color: #425163;
- border-color: #5a6b7d;
- color: #e0e6ed;
- &:hover {
- background-color: #5a6b7d;
- border-color: #677a8c;
- color: #ffffff;
- }
- }
- }
- }
- }
- }
- </style>
- <style>
- /* 统一表格暗色风格,消除白色条纹和容器 */
- .three-model-container .el-table,
- .three-model-container .el-table__fixed,
- .three-model-container .el-table__fixed-right {
- background: rgba(15, 31, 56, 0.86) !important;
- }
- .three-model-container .el-table__body-wrapper,
- .three-model-container .el-table__fixed-body-wrapper {
- background: rgba(15, 31, 56, 0.86) !important;
- }
- .three-model-container .el-table td,
- .three-model-container .el-table th.is-leaf {
- background: rgba(15, 31, 56, 0.86) !important;
- border-color: rgba(255, 255, 255, 0.08) !important;
- color: #e6efff;
- }
- .three-model-container .el-table td {
- color: #ffffff !important;
- }
- .three-model-container .el-table th {
- background: rgba(30, 55, 95, 0.85) !important;
- color: #ffffff !important;
- }
- .three-model-container .el-table th .cell {
- font-size: 18px !important;
- font-weight: 700 !important;
- }
- .three-model-container .el-table--striped .el-table__body tr.el-table__row--striped td {
- background: rgba(15, 31, 56, 0.9) !important;
- }
- .three-model-container .el-table__body tr:hover > td {
- background: rgba(30, 64, 175, 0.25) !important;
- }
- .three-model-container .el-table__current-row > td {
- background: rgba(64, 150, 255, 0.2) !important;
- }
- .three-model-container .el-table__fixed::before,
- .three-model-container .el-table__fixed-right::before,
- .three-model-container .el-table::before {
- background-color: rgba(255, 255, 255, 0.08) !important;
- }
- .three-model-container .el-table__gutter,
- .three-model-container .el-table__fixed-right .el-table__fixed-header-wrapper,
- .three-model-container .el-table__fixed-right .el-table__fixed-body-wrapper,
- .three-model-container .el-table__fixed .el-table__fixed-header-wrapper,
- .three-model-container .el-table__fixed .el-table__fixed-body-wrapper {
- background: rgba(15, 31, 56, 0.86) !important;
- }
- .pagination-container {
- margin-top: 14px;
- display: flex;
- justify-content: flex-end;
- }
- .action-bar {
- display: flex;
- justify-content: space-around;
- width: 100%;
- }
- .model-dialog .el-dialog {
- background: #0b254a;
- border: 1px solid #364a64;
- }
- .model-dialog .el-dialog__title {
- color: #e6efff;
- }
- .model-dialog .el-dialog__header,
- .model-dialog .el-dialog__footer {
- border-color: #364a64;
- }
- .model-dialog .el-upload-list__item {
- background: rgba(255, 255, 255, 0.04);
- border-color: #364a64;
- color: #e6efff;
- }
- .footer-tips {
- color: #94a3b8;
- margin-left: 10px;
- }
- </style>
|