ElementUI+Vue实现管理中心布局+表格管理部分(前端实现、详细)

一、页面布局

确定自己的页面布局,我是分为上下两部分,为了更好的效果,我在块内加上卡片的效果,代码如下:

<template>
  <div>
    <el-row :gutter="20">
      <el-col :span="24">
        <div class="grid-content bg-purple">
          <el-card class="message-card">
          </el-card>
        </div>
      </el-col>
    </el-row>
    <el-row :gutter="20">
      <el-col :span="24">
        <div class="grid-content bg-purple">
           <el-card class="form-card">
           </el-card>
        </div>
      </el-col>
    </el-row>
  </div>
</template>
<style>
.message-card {
  margin: 20px;
  padding-left: 0px;
  height: 150px;
}
.form-card {
  margin: 20px;
  margin-top: 0px;
  padding: 0px;
  height: 580px;
}
</style>

二、表格管理部分

1、标签页

在el官网中找到标签页组件

在我们写的<el-card class="form-card"></el-card>标签内写如下代码:

<el-tabs v-model="activeName" @tab-click="handleClick">
    <el-tab-pane label="路损点信息管理" name="first">
       <point-message/>//2.2组件
    </el-tab-pane>
    <el-tab-pane label="用户反馈信息管理" name="second">
        用户反馈信息管理
    </el-tab-pane>
</el-tabs>

script部分代码

<script>
export default {
  data() {
    return {
      activeName: 'second',//默认第一个出现的标签页是什么
    }
  },
}
</script>

2、组件

可以发现在<el-tab-pane></el-tab-pane>标签内可以填入不同标签页的内容,因此可以用到组件

在components文件夹中(没有的自己新建一个)新建一个vue文件,后续可以在这个文件里编写第一个标签页的内容

回到原来的文件,在script部分引入这个组件

<script>
import PointMessage from '../components/PointMessage.vue'
export default {
  data() {
    return {
      activeName: 'point',
    }
  },
  components: {
    PointMessage,
  },
}
</script>

3、组件内容(表格)

<template>
  <div>
  <!-- 
    !search:如果search变量为空(即用户没有输入搜索内容),则返回所有数据。
    data.pointType.toLowerCase().includes(search.toLowerCase()):如果data.pointType字段包含搜索内容(不区分大小写),则返回该数据。
    data.pointRoad.toLowerCase().includes(search.toLowerCase()):如果data.pointRoad字段包含搜索内容(不区分大小写),则返回该数据。
   -->
    <el-table
      ref="multipleTable"
      height="500"
      :data="
        tableData.filter(
          (data) =>
            !search ||
            data.pointType.toLowerCase().includes(search.toLowerCase()) ||
            data.pointRoad.toLowerCase().includes(search.toLowerCase())
        )
      "
      style="width: 100%"
      @selection-change="handleSelectionChange"
    >
    <!-- 表头 -->
      <!-- selection:多选框 -->
      <el-table-column type="selection" width="55"> </el-table-column>
      <!-- sortable:升序、降序 -->
      <el-table-column label="审核ID" prop="checkID" width="100" sortable>
      </el-table-column>
      <el-table-column label="管理员ID" prop="managerID" width="120" sortable>
      </el-table-column>
      <el-table-column label="路损点ID" prop="pointID" width="120" sortable>
      </el-table-column>
      <el-table-column label="所属路段" prop="pointRoad" width="120">
        <!-- 设置需要edit的字段 -->
        <template slot-scope="scope">
          <el-input
            type="text"
            v-model="scope.row.pointRoad"
            v-show="scope.row.iseditor"
          />
          <span v-show="!scope.row.iseditor">{{ scope.row.pointRoad }}</span>
        </template>
      </el-table-column>
      <!-- 设置需要edit的字段 -->
      <el-table-column label="路损点类型" prop="pointType" width="120">
        <template slot-scope="scope">
          <el-input
            type="text"
            v-model="scope.row.pointType"
            v-show="scope.row.iseditor"
          />
          <span v-show="!scope.row.iseditor">{{ scope.row.pointType }}</span>
        </template>
      </el-table-column>
      <el-table-column label="路损点图片" prop="pointImage" width="100">
        <template slot-scope="scope">
          <!-- 利用popover实现图片悬浮效果 -->
          <el-popover placement="top-start" title="" trigger="hover">
            <img
              :src="scope.row.pointImage"
              alt=""
              style="width: 150px; height: 150px"
            />
            <img
              slot="reference"
              :src="scope.row.pointImage"
              style="width: 60px; height: 60px"
            />
          </el-popover>
        </template>
      </el-table-column>
      <el-table-column label="添加日期" prop="date" width="120">
      </el-table-column>
      <!-- 审核状态表头筛选功能 -->
      <el-table-column
        label="审核状态"
        prop="auditStatus"
        width="100"
        :filters="auditList"
        :filter-method="filterHandler"
      >
        <template slot-scope="scope">
          <el-input
            type="text"
            width="100"
            v-model="scope.row.auditStatus"
            v-show="scope.row.iseditor"
          />
          <span v-show="!scope.row.iseditor">{{ scope.row.auditStatus }}</span>
        </template>
      </el-table-column>
      <el-table-column align="right" width="270">
        <template slot="header" slot-scope="scope">
          <div class="tools">
            <div class="input">
              <!-- 输入绑定search值,与表过滤结合即可达到搜索效果 -->
              <el-input
                v-model="search"
                size="mini"
                width="150"
                placeholder="输入所属路段、路损类型"
              />
            </div>
            <div class="del">
              <el-button type="danger" icon="el-icon-delete" @click="deltable">
              </el-button>
            </div>
          </div>
        </template>
        <template slot-scope="scope">
          <el-button size="mini" @click="handleEdit(scope.row, scope)"
            >Edit</el-button
          >
          <el-button
            size="mini"
            type="primary"
            @click="handleSave(scope.row, scope)"
            >Save</el-button
          >
          <el-button
            size="mini"
            type="danger"
            @click="handleDelete(scope.$index, tableData)"
            >Delete</el-button
          >
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        {
          checkID: '01',
          managerID: '004',
          pointID: '051',
          pointRoad: '明德路段',
          pointType: '单向裂缝',
          pointImage: 'https://gitee.com/zbhgis/pic/raw/master/road/rd051.jpg',
          date: '2024-05-04',
          auditStatus: '否',
          iseditor: false,
        }
      ],
      auditList: [
        { text: '是', value: '是' },
        { text: '否', value: '否' },
      ],
      search: '',
      multipleSelection: [],
    }
  },
  methods: {
    handleSelectionChange(selection) {
      this.multipleSelection = selection.map((item) => item.checkID)
    },
    handleEdit(row, index) {
      row.iseditor = true
    },
    handleSave(row, index) {
      row.iseditor = false
    },
    handleDelete(index, row) {
      row.splice(index, 1)
    },
    // 批量删除
    deltable() {
      console.log(this.multipleSelection)
      if (this.multipleSelection.length == 0) {
        this.$alert('请先选择要删除的数据', '提示', {
          confirmButtonText: '确定',
        })
      } else {
        let checkArr = this.multipleSelection
        // 从后往前取索引值,这样删除所选字段后就不会影响后面元素的索引值
        for (let i = checkArr.length - 1; i >= 0; i--) {
          let index = this.tableData.findIndex(
            (item) => item.checkID === checkArr[i]
          )
          if (index !== -1) {
            this.tableData.splice(index, 1)
          }
        }
        this.$message({
          type: 'success',
          message: '删除成功!',
        })
        // )
      }
    },
    filterHandler(value, row, column) {
      const property = column['property']
      return row[property] === value
    },
  },
}
</script>
<style>
.tools {
  margin: 0;
  padding: 0;
}
.input {
  margin: 0;
  float: left;
}
.del {
  margin-left: 10px;
  margin-right: 0;
  float: left;
}
</style>

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,首先你需要安装 VueElementUI 和 websocket 库,可以使用 npm 进行安装。 ``` npm install vue npm install element-ui npm install websocket ``` 接着创建一个 Vue 组件,用于显示消息列表和发送消息。 ``` <template> <div> <el-input v-model="message" placeholder="请输入消息"></el-input> <el-button type="primary" @click="sendMessage">发送</el-button> <el-table :data="messages"> <el-table-column label="时间" prop="time"></el-table-column> <el-table-column label="内容" prop="content"></el-table-column> </el-table> </div> </template> <script> import WebSocket from 'websocket' export default { data() { return { message: '', messages: [] } }, methods: { sendMessage() { // 创建 websocket 连接 const ws = new WebSocket('ws://localhost:8080') // 监听连接成功事件 ws.onopen = () => { // 发送消息 ws.send(this.message) // 关闭连接 ws.close() } } } } </script> ``` 在这个组件中,我们使用 ElementUI 的 Input 和 Button 组件实现输入消息和发送消息的功能,使用 Table 组件显示消息列表。在发送消息时,创建一个 websocket 连接,发送消息后关闭连接。 接下来,你需要编写一个 websocket 服务端,用于接收和处理客户端的消息。 ``` const WebSocket = require('websocket').server const http = require('http') const server = http.createServer((request, response) => { console.log('Received request for ' + request.url) response.writeHead(404) response.end() }) server.listen(8080, () => { console.log('Server is listening on port 8080') }) const wsServer = new WebSocket({ httpServer: server, autoAcceptConnections: false }) function originIsAllowed(origin) { // put logic here to detect whether the specified origin is allowed. return true } wsServer.on('request', (request) => { if (!originIsAllowed(request.origin)) { // Make sure we only accept requests from an allowed origin request.reject() console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.') return } const connection = request.accept('echo-protocol', request.origin) console.log((new Date()) + ' Connection accepted.') connection.on('message', (message) => { if (message.type === 'utf8') { console.log('Received Message: ' + message.utf8Data) // 处理客户端发送的消息 } else if (message.type === 'binary') { console.log('Received Binary Message of ' + message.binaryData.length + ' bytes') connection.sendBytes(message.binaryData) } }) connection.on('close', (reasonCode, description) => { console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.') }) }) ``` 在服务端代码中,我们使用了 Node.js 提供的 WebSocket 模块创建一个 WebSocket 服务,监听客户端的连接请求。当客户端连接成功后,服务端会接收客户端发送的消息并进行处理。 以上是一个简单的消息管理功能的实现方法,你可以根据实际需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值