Anthony 1 settimana fa
parent
commit
b78ab3fe9a

File diff suppressed because it is too large
+ 114 - 114
package-lock.json


+ 9 - 9
package.json

@@ -54,6 +54,7 @@
     "js-cookie": "2.2.1",
     "js-cookie": "2.2.1",
     "jsencrypt": "3.0.0-rc.1",
     "jsencrypt": "3.0.0-rc.1",
     "mammoth": "^1.4.21",
     "mammoth": "^1.4.21",
+    "moment": "^2.30.1",
     "nprogress": "0.2.0",
     "nprogress": "0.2.0",
     "quill": "1.3.7",
     "quill": "1.3.7",
     "rich-text-tool-editor": "^1.0.8",
     "rich-text-tool-editor": "^1.0.8",
@@ -72,8 +73,7 @@
     "vuedraggable": "2.24.3",
     "vuedraggable": "2.24.3",
     "vuex": "3.6.0",
     "vuex": "3.6.0",
     "wangeditor": "^4.7.12",
     "wangeditor": "^4.7.12",
-    "xlsx": "^0.18.5",
-    "v-scale-screen": "^1.0.2"
+    "xlsx": "^0.18.5"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "@vue/cli-plugin-babel": "4.4.6",
     "@vue/cli-plugin-babel": "4.4.6",
@@ -83,24 +83,24 @@
     "babel-plugin-import": "^1.13.3",
     "babel-plugin-import": "^1.13.3",
     "chalk": "4.1.0",
     "chalk": "4.1.0",
     "connect": "3.6.6",
     "connect": "3.6.6",
-    "lint-staged": "10.5.3",
-    "runjs": "4.4.2",
-    "v-scale-screen": "^1.0.2",
-    "video.js": "^8.0.4",
-    "videojs-contrib-hls": "^5.15.0",
     "eslint": "^6.7.2",
     "eslint": "^6.7.2",
     "eslint-plugin-import": "^2.20.1",
     "eslint-plugin-import": "^2.20.1",
     "eslint-plugin-node": "^11.0.0",
     "eslint-plugin-node": "^11.0.0",
     "eslint-plugin-prettier": "^3.3.1",
     "eslint-plugin-prettier": "^3.3.1",
-    "eslint-plugin-promise": "^4.2.1",
+    "eslint-plugin-promise": "^4.3.1",
     "eslint-plugin-standard": "^4.0.0",
     "eslint-plugin-standard": "^4.0.0",
     "eslint-plugin-vue": "^6.1.2",
     "eslint-plugin-vue": "^6.1.2",
-    "less": "^4.1.3",
+    "less": "^4.4.1",
     "less-loader": "^7.3.0",
     "less-loader": "^7.3.0",
+    "lint-staged": "10.5.3",
+    "runjs": "4.4.2",
     "sass": "1.32.13",
     "sass": "1.32.13",
     "sass-loader": "^10",
     "sass-loader": "^10",
     "script-ext-html-webpack-plugin": "2.1.5",
     "script-ext-html-webpack-plugin": "2.1.5",
     "svg-sprite-loader": "5.1.1",
     "svg-sprite-loader": "5.1.1",
+    "v-scale-screen": "^1.0.3",
+    "video.js": "^8.23.4",
+    "videojs-contrib-hls": "^5.15.0",
     "vue-template-compiler": "2.6.12"
     "vue-template-compiler": "2.6.12"
   },
   },
   "engines": {
   "engines": {

+ 4 - 4
src/api/combatduty/militarydutyinfo.js

@@ -77,7 +77,7 @@ export function treeselect() {
   })
   })
 }
 }
 
 
-// 查询部门 
+// 查询部门
 export function getDept(query) {
 export function getDept(query) {
   return request({
   return request({
     url: '/system/dept/list',
     url: '/system/dept/list',
@@ -87,7 +87,7 @@ export function getDept(query) {
 }
 }
 
 
 
 
-//车牌号 
+//车牌号
 export function getthebus(status) {
 export function getthebus(status) {
   return request({
   return request({
     url: '/militaryvehicleManagement/thebus/list',
     url: '/militaryvehicleManagement/thebus/list',
@@ -108,8 +108,8 @@ export function updatestatus() {
 
 
 // export function listPeople(query) {
 // export function listPeople(query) {
 //   return request({
 //   return request({
-//     url: '/peopleManage/people/lis2t',
+//     url: '/deviceManage/people/lis2t',
 //     method: 'get',
 //     method: 'get',
 //     params: query
 //     params: query
 //   })
 //   })
-// }
+// }

+ 21 - 1
src/api/doormanManage/bdglVisit.js

@@ -59,4 +59,24 @@ export function deptUser (deptId) {
     url: `/grassrootsregistration/common/getZhuChiRen?deptId=${deptId}`,
     url: `/grassrootsregistration/common/getZhuChiRen?deptId=${deptId}`,
     method: 'get'
     method: 'get'
   })
   })
-}
+}
+
+
+// 新增人员
+export function addPeople(data) {
+  return request({
+    url: '/person/add',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询人员来访登记列表
+export function listPeople(query) {
+  return request({
+    url: '/person/list',
+    method: 'get',
+    params: query
+  })
+}
+

+ 3 - 0
src/main.js

@@ -71,7 +71,10 @@ import '@/utils/lodJs.js'
 // 引入echarts
 // 引入echarts
 import echarts from 'echarts'
 import echarts from 'echarts'
 
 
+
+import axios from 'axios'
 // 全局方法挂载
 // 全局方法挂载
+Vue.prototype.$axios = axios
 Vue.prototype.getDicts = getDicts
 Vue.prototype.getDicts = getDicts
 Vue.prototype.getConfigKey = getConfigKey
 Vue.prototype.getConfigKey = getConfigKey
 Vue.prototype.parseTime = parseTime
 Vue.prototype.parseTime = parseTime

+ 18 - 9
src/router/index.js

@@ -185,7 +185,7 @@ export const constantRoutes = [
   // // 门岗管理
   // // 门岗管理
   // {
   // {
   //   path: '/doormanManage',
   //   path: '/doormanManage',
-  //   component: (resolve) => require(['@/views/doormanManage/bdglVisit/index'], resolve),
+  //   component: (resolve) => require(['@/views/doormanManage/peopleInfoManage/index'], resolve),
   //   hidden: true
   //   hidden: true
   // },
   // },
   //
   //
@@ -224,13 +224,13 @@ export const constantRoutes = [
   //
   //
   // // 人力资源
   // // 人力资源
   // {
   // {
-  //   path: '/peopleManage',
-  //   // component: (resolve) => require(['@/views/peopleManage/examination/index'], resolve),
-  //   // component: (resolve) => require(['@/views/peopleManage/people/index'], resolve), // 添加用户基本信息
-  //   // component: (resolve) => require(['@/views/peopleManage/PersonnelStatistics/index'], resolve),
-  //   // component: (resolve) => require(['@/views/peopleManage/seconded/index'], resolve),
-  //   // component: (resolve) => require(['@/views/peopleManage/transfer/index'], resolve),
-  //   component: (resolve) => require(['@/views/peopleManage/typestatistics/index'], resolve),
+  //   path: '/deviceManage',
+  //   // component: (resolve) => require(['@/views/deviceManage/examination/index'], resolve),
+  //   // component: (resolve) => require(['@/views/deviceManage/people/index'], resolve), // 添加用户基本信息
+  //   // component: (resolve) => require(['@/views/deviceManage/PersonnelStatistics/index'], resolve),
+  //   // component: (resolve) => require(['@/views/deviceManage/seconded/index'], resolve),
+  //   // component: (resolve) => require(['@/views/deviceManage/transfer/index'], resolve),
+  //   component: (resolve) => require(['@/views/deviceManage/typestatistics/index'], resolve),
   //   hidden: true
   //   hidden: true
   // },
   // },
   //
   //
@@ -340,6 +340,15 @@ export const constantRoutes = [
   //   hidden: true
   //   hidden: true
   // },
   // },
 
 
+  {
+    path: '/peopleInfoManage',
+    name: 'bdglVisit',
+    component: () => import('@/views/doormanManage/peopleInfoManage/index.vue'),
+    hidden: true,
+    meta: { title: '设备详情' }
+  },
+
+
   // 报错区域
   // 报错区域
   {
   {
     path: '/404',
     path: '/404',
@@ -444,7 +453,7 @@ export const constantRoutes = [
         meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
         meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
       }
       }
     ]
     ]
-  }
+  },
 ]
 ]
 
 
 export default new Router({
 export default new Router({

+ 104 - 0
src/views/bdglSecret/secret_shenpi/index.vue

@@ -0,0 +1,104 @@
+<template>
+  <div class="app-container">
+    <el-table
+      v-loading="loading"
+      :data="approvalList"
+      style="width: 100%"
+      :header-cell-style="{ background: '#003C69', color: 'white' }"
+    >
+      <el-table-column type="index" label="序号" width="50" align="center" />
+      <el-table-column prop="kind" label="分类" align="center">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.electronic" :value="scope.row.kind" />
+        </template>
+      </el-table-column>
+      <el-table-column prop="version" label="型号" align="center" />
+      <el-table-column prop="number" label="编号" align="center" />
+      <el-table-column prop="peopleName" label="责任人" align="center" />
+      <el-table-column prop="unitId" label="使用单位" align="center" :formatter="deptIdformatter" />
+      <el-table-column prop="people2Name" label="用途" align="center" />
+      <el-table-column prop="status" label="审批状态" align="center">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.status === 'pending'" type="warning">待审批</el-tag>
+          <el-tag v-else-if="scope.row.status === 'approved'" type="success">已通过</el-tag>
+          <el-tag v-else type="danger">已驳回</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" width="220" fixed="right">
+        <template slot-scope="scope">
+          <el-button
+            type="success"
+            size="mini"
+            @click="handleApprove(scope.row, 'approved')"
+          >同意</el-button>
+          <el-button
+            type="danger"
+            size="mini"
+            @click="handleApprove(scope.row, 'rejected')"
+          >驳回</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import { listSecret, updateSecret } from "@/api/bdglSecret/secret";
+import { getDept } from "@/api/grassrootsregistration/bdglmeeting";
+
+export default {
+  name: "Approval",
+  dicts: ["electronic"],
+  data() {
+    return {
+      loading: false,
+      approvalList: [],
+      unitId: []
+    };
+  },
+  created() {
+    this.getList();
+    this.getTreeselect();
+  },
+  methods: {
+    // 查询申请列表
+    getList() {
+      this.loading = true;
+      listSecret({ status: "pending" }).then(res => {
+        this.approvalList = res.rows;
+        this.loading = false;
+      });
+    },
+    // 单位翻译
+    deptIdformatter(row) {
+      let deptName = "";
+      this.unitId.map(item => {
+        if (item.deptId == row.unitId) {
+          deptName = item.deptName;
+        }
+      });
+      return deptName;
+    },
+    getTreeselect() {
+      getDept().then(res => {
+        this.unitId = res.data;
+      });
+    },
+    // 审批操作
+    handleApprove(row, result) {
+      const newData = { ...row, status: result };
+      updateSecret(newData).then(() => {
+        this.$modal.msgSuccess(result === "approved" ? "审批通过" : "已驳回");
+        this.getList();
+      });
+    }
+  }
+};
+</script>
+
+<style scoped>
+.app-container {
+  background: #fff;
+  padding: 20px;
+}
+</style>

+ 0 - 740
src/views/doormanManage/bdglVisit/index.vue

@@ -1,740 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form
-      :model="queryParams"
-      ref="queryForm"
-      :inline="true"
-      v-show="showSearch"
-      label-width="100px"
-    >
-      <el-form-item label="" prop="unitId">
-        <!-- <el-input
-          v-model="queryParams.unitId"
-          placeholder="请输入到访单位"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        /> -->
-        <treeselect
-          v-model="queryParams.unitId"
-          :options="users"
-          placeholder="请选择到访单位"
-          class="threeselects"
-          @select="selectPeo1"
-        />
-      </el-form-item>
-      <el-form-item label="" prop="name">
-        <el-input
-          placeholder="请选择到访人员姓名"
-          class="daofang"
-          v-model="queryParams.name"
-          clearable
-          size="small"
-          @input="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item class="search">
-        <!-- <el-button
-          type="btr1"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
-          >搜索</el-button
-        > -->
-        <el-button size="btr" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['doormanManage:bdglVisit:add']"
-          >新增</el-button
-        >
-      </el-col>
-      <!-- <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['doormanManage:bdglVisit:edit']"
-          >修改</el-button
-        >
-      </el-col> -->
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['doormanManage:bdglVisit:remove']"
-          >删除</el-button
-        >
-      </el-col>
-      <!-- <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          :loading="exportLoading"
-          @click="handleExport"
-          v-hasPermi="['doormanManage:bdglVisit:export']"
-        >导出</el-button>
-      </el-col> -->
-      <!-- <right-toolbar
-        :showSearch.sync="showSearch"
-        @queryTable="getList"
-      ></right-toolbar> -->
-    </el-row>
-
-    <el-table
-      v-loading="loading"
-      :data="bdglVisitList"
-      @selection-change="handleSelectionChange"
-    >
-      <el-table-column type="selection" width="55" align="center" />
-      <!-- <el-table-column label="接待人姓名" align="center" prop="id" /> -->
-      <el-table-column
-        label="到访单位"
-        align="center"
-        prop="unitId"
-        :formatter="unit2Format"
-      />
-      <el-table-column label="接待人" align="center" prop="peopleName" />
-      <el-table-column label="到访人员姓名" align="center" prop="name" />
-      <el-table-column
-        label="到访时间"
-        align="center"
-        prop="arriveTime"
-        width="180"
-      >
-        <template slot-scope="scope">
-          <!-- <span>{{ parseTime(scope.row.arriveTime, '{y}-{m}-{d} {h}:{m}:{s}') }}</span>     -->
-          <span>{{
-            dateFormat("YYYY-mm-dd HH:MM:SS", scope.row.arriveTime)
-          }}</span>
-          <!-- rTime -->
-        </template>
-      </el-table-column>
-      <el-table-column
-        label="离队时间"
-        align="center"
-        prop="endTime"
-        width="180"
-      >
-        <template slot-scope="scope">
-          <!-- <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{m}:{s}') }}</span> -->
-          <span>{{
-            dateFormat("YYYY-mm-dd HH:MM:SS", scope.row.endTime)
-          }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="到访车牌号" align="center" prop="numberPlate" />
-      <el-table-column
-        label="来访原因"
-        align="center"
-        prop="contents"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        label="操作"
-        align="center"
-        class-name="small-padding fixed-width"
-      >
-        <template slot-scope="scope">
-          <el-button
-            size="btu"
-            type="text"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['doormanManage:bdglVisit:edit']"
-            >修改</el-button
-          >
-          <el-button
-            size="btd"
-            type="text"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['doormanManage:bdglVisit:remove']"
-            >删除</el-button
-          >
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-      v-show="total > 0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 添加或修改人员来访登记对话框 -->
-    <el-dialog
-      :title="title"
-      :visible.sync="open"
-      width="1090px"
-      append-to-body
-      :close-on-click-modal="false"
-    >
-      <el-form
-        ref="form"
-        :model="form"
-        :rules="rules"
-        label-width="110px"
-        :inline="true"
-      >
-        <el-form-item label="到访单位" prop="unitId" style="margin-left: 20px">
-          <treeselect
-            v-model="form.unitId"
-            :options="users"
-            placeholder="请选择到访单位"
-            class="threeselects"
-            @select="selectPeo"
-          />
-          <!-- <el-input v-model="form.unitId" placeholder="请输入到访单位" /> -->
-        </el-form-item>
-        <el-form-item label="接待人" prop="peopleId" class="jiedai">
-          <!-- <el-input v-model="form.peopleId" placeholder="请输入接待人" /> -->
-          <el-select
-            v-model="form.peopleName"
-            placeholder="请选择接待人"
-            ref="peoplenames"
-          >
-            <el-option
-              v-for="item in executor"
-              :key="item.id"
-              :label="item.name"
-              :value="item.name"
-              @click.native="peopleIds(item.id)"
-              id="execute"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="到访人员姓名" prop="name">
-          <el-input v-model="form.name" />
-        </el-form-item>
-        <el-form-item
-          label="到访时间"
-          prop="arriveTime"
-          style="margin-left: 20px"
-        >
-          <el-date-picker
-            clearable
-            size="small"
-            v-model="form.arriveTime"
-            type="datetime"
-            placeholder="请选择到访时间"
-          >
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="离队时间" prop="endTime">
-          <el-date-picker
-            clearable
-            size="small"
-            v-model="form.endTime"
-            type="datetime"
-            placeholder="请选择离队时间"
-          >
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="到访车牌号" prop="numberPlate">
-          <el-input v-model="form.numberPlate" />
-        </el-form-item>
-        <div class="jiben" style="margin-left: 20px">来访原因</div>
-        <el-form-item prop="contents" class="daofang" style="margin-left: 20px">
-          <el-input v-model="form.contents" type="textarea" />
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel" size="btn">取 消</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import {
-  listBdglVisit,
-  getBdglVisit,
-  delBdglVisit,
-  addBdglVisit,
-  updateBdglVisit,
-  exportBdglVisit,
-  deptUser,
-} from "@/api/doormanManage/bdglVisit";
-import Treeselect from "@riophae/vue-treeselect";
-import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-import { getDept2 } from "@/api/grassrootsregistration/bdglmeeting";
-import { allUser } from "@/api/workingArrangements/workTask";
-import Cookies from "js-cookie";
-
-export default {
-  name: "BdglVisit",
-  components: { Treeselect },
-  computed: {},
-  data() {
-    return {
-      // 遮罩层
-      loading: true,
-      // 导出遮罩层
-      exportLoading: false,
-      // 选中数组
-      ids: [],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
-      // 显示搜索条件
-      showSearch: true,
-      // 总条数
-      total: 0,
-      // 人员来访登记表格数据
-      bdglVisitList: [],
-      // 弹出层标题
-      title: "",
-      // 是否显示弹出层
-      open: false,
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        unitId: null,
-        peopleId: null,
-        name: null,
-        arriveTime: null,
-        endTime: null,
-        adminId: null,
-        contents: null,
-        createtime: null,
-        updatetime: null,
-        numberPlate: null,
-        unitName: null,
-        peopleName: null,
-      },
-      // 表单参数
-      form: {},
-      // 表单校验
-      rules: {
-        unitId: [
-          { required: true, message: "到访单位不能为空", trigger: "blur" },
-        ],
-        // peopleId: [{ required: true, message: "接待人不能为空", trigger: "blur" }],
-        name: [
-          { required: true, message: "到访人员姓名不能为空", trigger: "blur" },
-        ],
-        arriveTime: [
-          { required: true, message: "到访时间不能为空", trigger: "blur" },
-        ],
-        endTime: [
-          { required: true, message: "离队时间不能为空", trigger: "blur" },
-        ],
-        numberPlate: [
-          { required: true, message: "到访车牌号不能为空", trigger: "blur" },
-        ],
-      },
-      // 执行单位列表
-      users: [],
-      // 接待人
-      executor: [],
-      // 人员列表
-      rylist: [],
-    };
-  },
-  created() {
-    // if (Cookies.get("shuaxin") != "true") {
-    //   window.location.reload();
-    // }
-    // Cookies.set("shuaxin", "true");
-    this.getList();
-    allUser().then((res) => {
-      this.rylist = res.rows;
-    });
-    // 获取执行单位列表
-    getDept2().then((res) => {
-      this.users = res.data;
-    });
-    // this.selectPeo1();
-  },
-  methods: {
-    dateFormat(fmt, date) {
-      let ret = "";
-      date = new Date(date);
-      const opt = {
-        "Y+": date.getFullYear().toString(), // 年
-        "m+": (date.getMonth() + 1).toString(), // 月
-        "d+": date.getDate().toString(), // 日
-        "H+": date.getHours().toString(), // 时
-        "M+": date.getMinutes().toString(), // 分
-        "S+": date.getSeconds().toString(), // 秒
-        // 有其他格式化字符需求可以继续添加,必须转化成字符串
-      };
-      for (let k in opt) {
-        ret = new RegExp("(" + k + ")").exec(fmt);
-        if (ret) {
-          fmt = fmt.replace(
-            ret[1],
-            ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0")
-          );
-        }
-      }
-      return fmt;
-    },
-    unit2Format(row, column) {
-      var deptName = "";
-      deptName = row.unitName;
-      // if(this.bdglVisitList[0].unitId==row.unitId){
-      //   deptName=row.unitName
-      // }
-      return deptName;
-    },
-    peopleIds(id) {
-      this.form.peopleId = id;
-    },
-    // 获取执行人
-    getZhuChi(id) {
-      deptUser(id).then((res) => {
-        this.executor = res.data;
-
-        // this.form.unitName=this.executor
-      });
-    },
-    // 到访单位选中触发
-    selectPeo(val) {
-      this.form.unitId = val.id;
-      this.form.peopleName = "";
-      this.form.unitName = val.label;
-
-      this.getZhuChi(this.form.unitId);
-    },
-    // 到访单位选中触发
-    selectPeo1(val) {
-      //  this.getDept2()
-      // this.handleAdd()
-      this.queryParams.unitId = val.id;
-      this.queryParams.peopleName = "";
-      this.queryParams.unitName = val.label;
-      this.getZhuChi(this.queryParams.unitId);
-      this.getList();
-    },
-    /** 查询人员来访登记列表 */
-    getList() {
-      this.loading = true;
-      listBdglVisit(this.queryParams).then((response) => {
-        this.bdglVisitList = response.rows;
-
-        this.total = response.total;
-        this.loading = false;
-      });
-    },
-    // 取消按钮
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.form = {
-        id: null,
-        unitId: null,
-        peopleId: null,
-        name: null,
-        arriveTime: null,
-        endTime: null,
-        adminId: null,
-        contents: null,
-        createtime: null,
-        updatetime: null,
-        numberPlate: null,
-        unitName: null,
-        peopleName: null,
-      };
-      this.resetForm("form");
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 重置按钮操作 */
-    resetQuery() {
-      this.queryParams = {};
-      this.resetForm("queryForm");
-      this.handleQuery();
-      this.getList();
-    },
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-      this.ids = selection.map((item) => item.id);
-      this.single = selection.length !== 1;
-      this.multiple = !selection.length;
-    },
-    /** 新增按钮操作 */
-    handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "添加人员来访登记";
-      // 获取执行单位列表
-      getDept2().then((res) => {
-        this.users = res.data;
-      });
-    },
-    /** 修改按钮操作 */
-    handleUpdate(row) {
-      this.reset();
-      getDept2().then((res) => {
-        this.users = res.data;
-      });
-      const id = row.id || this.ids;
-
-      getBdglVisit(id).then((response) => {
-        this.form = response.data;
-        this.open = true;
-        this.title = "修改人员来访登记";
-      });
-    },
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["form"].validate((valid) => {
-        if (valid) {
-          if (this.form.id != null) {
-            updateBdglVisit(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addBdglVisit(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    /** 删除按钮操作 */
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$modal
-        .confirm("是否确认删除人员来访登记的数据项?")
-        .then(function () {
-          return delBdglVisit(ids);
-        })
-        .then(() => {
-          this.getList();
-          this.$modal.msgSuccess("删除成功");
-        })
-        .catch(() => {});
-    },
-    /** 导出按钮操作 */
-    handleExport() {
-      const queryParams = this.queryParams;
-      this.$modal
-        .confirm("是否确认导出所有人员来访登记数据项?")
-        .then(() => {
-          this.exportLoading = true;
-          return exportBdglVisit(queryParams);
-        })
-        .then((response) => {
-          this.$download.name(response.msg);
-          this.exportLoading = false;
-        })
-        .catch(() => {});
-    },
-  },
-};
-</script>
-<style scoped>
-::v-deep .el-dialog {
-  background-color: #004d86 !important;
-}
-/* 输入框 */
-::v-deep .el-dialog .el-input__inner {
-  background-color: #004d86 !important;
-  width: 220px;
-  color: white;
-  border: 1px solid white !important;
-}
-/* 标题弹框 */
-::v-deep .el-dialog__title {
-  color: white;
-  /* border-bottom: 1px solid white; */
-}
-/* 标题下划线 */
-::v-deep .el-dialog__header {
-  border-bottom: 1px solid white;
-}
-::v-deep .el-form-item__content {
-  width: 220px;
-}
-::v-deep .el-form-item__label {
-  text-align: end;
-}
-::v-deep .jiedai .el-form-item__label {
-  padding-left: 10px;
-}
-/* ::v-deep .el-form-item{
-  width: 200px;
-} */
-/* ::v-deep .jiedainame .el-form-item__label{
-  width: 90px !important;
-}
-::v-deep .el-input--small .el-input__inner{
-  width: 230px;
-} */
-::v-deep .el-textarea .el-textarea__inner {
-  /* text-align: center; */
-  width: 1010px;
-  height: auto !important;
-  min-height: 130px !important;
-}
-/* 到访单位 */
-::v-deep .el-form-item__content .el-input--small .el-input__inner {
-  width: 220px;
-}
-/* 表格头部 */
-v-deep .el-table thead tr {
-  background-color: #004d86 !important;
-}
-/* 树形 */
-.threeselects {
-  width: 200px;
-}
-.threeselects .vue-treeselect__input {
-  background-color: #004d86;
-  /* color: white; */
-}
-::v-deep .search .el-form-item__content {
-  margin-top: 0px;
-}
-::v-deep .el-picker-panel__body {
-  background-color: #004d86 !important;
-}
-::v-deep .vue-treeselect__control {
-  background-color: transparent;
-  color: white;
-}
-::v-deep .vue-treeselect__single-value {
-  color: white;
-}
-::v-deep .threeselects {
-  width: 220px;
-}
-/* #execute{
-  background: white !important;
-  /* color: white !important; */
-/* } */
-.el-scrollbar__view {
-  background: white !important;
-}
-/* 修改按钮btu */
-.el-button--btus {
-  width: 60px !important;
-  border: 1px solid transparent;
-  padding: 3px 8px;
-  font-size: 14px;
-  line-height: 1.5;
-  border-radius: 3px;
-  color: #fff;
-  background-color: #13ce66;
-}
-/* 删除按钮btu */
-.el-button--btds {
-  width: 60px !important;
-  border: 1px solid transparent;
-  padding: 3px 8px;
-  font-size: 14px;
-  line-height: 1.5;
-  border-radius: 3px;
-  color: #fff;
-  background-color: #ff4949;
-}
-::v-deep .el-time-spinner__list .el-scrollbar li {
-  color: white !important;
-}
-::v-deep .el-select--medium {
-  background-color: white !important;
-}
-::v-deep .el-table .el-table__header-wrapper th,
-.el-table .el-table__fixed-header-wrapper th {
-  background-color: rgb(0, 60, 105);
-  color: white;
-}
-::v-deep .daofang .el-input__inner {
-  width: 230px;
-  height: 38px;
-  background: transparent;
-  line-height: 38px;
-  color: white;
-}
-/* 文字多余部分省略 */
-::v-deep .el-table__cell .cell {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.el-button--btr1 {
-  /* border-color: #20B2AA; */
-  color: #ffffff;
-  width: 76px;
-  height: 36px;
-  background-color: #1d96ff;
-  border-radius: 4px;
-  font-size: 14px;
-  text-align: center;
-  /* line-height: 36px; */
-  /* margin-top: 1px; */
-  padding-top: 11px !important;
-}
-.el-button--btr2 {
-  /* border-color: #20B2AA; */
-  color: #ffffff;
-  width: 76px;
-  height: 36px;
-  background-color: #1d96ff;
-  border-radius: 4px;
-  font-size: 14px;
-  text-align: center;
-  /* margin-top: 1px; */
-  /* padding-top: 12px; */
-
-  padding-top: 12px !important;
-}
-::v-deep .el-picker-panel__link-btn span {
-  display: none !important;
-}
-/* 调整输入框提示文字颜色 */
-::v-deep .vue-treeselect__placeholder {
-  color: #bdbdbd4f !important;
-}
-::v-deep input::-webkit-input-placeholder {
-  color: #bdbdbd4f !important;
-}
-::v-deep input:-moz-placeholder {
-  color: #bdbdbd4f !important;
-}
-::v-deep .el-select--medium {
-  border-radius: 5px;
-}
-::v-deep .el-date-editor .el-input__inner {
-  height: 36px;
-}
-::v-deep .el-date-picker__editor-wrap .el-input__inner {
-  width: 30px;
-}
-::v-deep .el-dialog__footer {
-  padding: 20px 40px !important;
-}
-</style>

+ 217 - 0
src/views/doormanManage/car_eventManage/index.vue

@@ -0,0 +1,217 @@
+<template>
+  <div class="event-page">
+    <!-- 左侧查询条件 -->
+    <div class="query-panel">
+      <el-form :model="queryForm" label-width="100px">
+        <el-form-item label="事件类型">
+          <el-select v-model="queryForm.eventType" placeholder="请选择事件类型">
+            <el-option label="全部" value="" />
+            <el-option label="门禁事件" value="access" />
+            <el-option label="报警事件" value="alarm" />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="主类型">
+          <el-select v-model="queryForm.mainType" placeholder="请选择主类型">
+            <el-option label="全部" value="" />
+            <el-option label="类型1" value="type1" />
+            <el-option label="类型2" value="type2" />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="次类型">
+          <el-select v-model="queryForm.subType" placeholder="请选择次类型">
+            <el-option label="全部" value="" />
+            <el-option label="子类型1" value="sub1" />
+            <el-option label="子类型2" value="sub2" />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="人员ID">
+          <el-input v-model="queryForm.personId" placeholder="请输入人员ID" />
+        </el-form-item>
+
+        <el-form-item label="工号">
+          <el-input v-model="queryForm.jobNumber" placeholder="请输入工号" />
+        </el-form-item>
+
+        <el-form-item label="姓名">
+          <el-input v-model="queryForm.name" placeholder="请输入姓名" />
+        </el-form-item>
+
+        <el-form-item label="开始时间">
+          <el-date-picker
+            v-model="queryForm.startTime"
+            type="datetime"
+            placeholder="选择开始时间"
+            style="width: 100%;"
+          />
+        </el-form-item>
+
+        <el-form-item label="结束时间">
+          <el-date-picker
+            v-model="queryForm.endTime"
+            type="datetime"
+            placeholder="选择结束时间"
+            style="width: 100%;"
+          />
+        </el-form-item>
+
+        <!-- 快捷按钮 -->
+        <div class="quick-btns">
+          <el-button @click="setQuickTime('yesterday')">昨天</el-button>
+          <el-button @click="setQuickTime('today')">今天</el-button>
+          <el-button @click="setQuickTime('month')">本月</el-button>
+        </div>
+
+        <!-- 搜索按钮 -->
+        <el-button type="primary" @click="fetchData" style="margin-top: 10px;">搜索</el-button>
+      </el-form>
+    </div>
+
+    <!-- 右侧表格 -->
+    <div class="table-panel">
+      <el-table
+        :data="tableData"
+        border
+        style="width: 100%;"
+      >
+        <el-table-column type="index" label="序号" width="60" />
+        <el-table-column prop="personId" label="人员id" width="120" />
+        <el-table-column prop="jobNumber" label="工号" width="120" />
+        <el-table-column prop="name" label="姓名" width="120" />
+        <el-table-column prop="cardNumber" label="卡号" width="120" />
+        <el-table-column prop="door" label="门" width="100" />
+        <el-table-column prop="eventType" label="事件类型" width="150" />
+        <el-table-column prop="eventTime" label="时间" width="180">
+          <template #default="scope">
+            {{ new Date(scope.row.eventTime).toLocaleString() }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="remoteHost" label="远程主机地址" width="160" />
+        <el-table-column prop="reader" label="读卡器" width="120" />
+        <el-table-column prop="detectorId" label="探测器ID" width="120" />
+        <el-table-column prop="operation" label="操作" min-width="120" />
+      </el-table>
+
+      <!-- 分页 -->
+      <div class="pagination">
+        <el-pagination
+          background
+          layout="total, prev, pager, next"
+          :total="total"
+          :page-size="queryForm.pageSize"
+          :current-page.sync="queryForm.pageNum"
+          @current-change="fetchData"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import request from "@/utils/request";
+
+export default {
+  name: "EventPage",
+  data() {
+    return {
+      queryForm: {
+        id: "",    //id
+        personId: "",   // 人员ID
+        jobNumber: "",  // 工号
+        name: "",
+        cardNumber: "",
+        door: "",
+        remoteHost: "",
+        reader: "",
+        detectorId: "",
+        operation: "",
+        eventType: "",
+        eventTime: "",
+        createTime: "",
+        startTime: "",
+        endTime: "",
+        pageNum: 1,
+        pageSize: 24
+      },
+      // private Long id;
+      // private String personId;     // 人员ID
+      // private String jobNumber;    // 工号
+      // private String name;         // 姓名
+      // private String cardNumber;   // 卡号
+      // private String door;         // 门
+      // private String remoteHost;   // 远程主机地址
+      // private String reader;       // 读卡器
+      // private String detectorId;   // 探测器ID
+      // private String operation;    // 操作
+      // private String eventType;    // 事件类型
+      // private LocalDateTime eventTime;  // 事件发生时间
+      // private LocalDateTime createTime; // 记录创建时间
+      tableData: [],
+      total: 0
+    }
+  },
+  created() {
+    // 页面加载时自动拉取第一页数据
+    this.fetchData()
+  },
+  methods: {
+    fetchData() {
+      request({
+        url: "/event/list",
+        method: "get",
+        params: this.queryForm
+      }).then(res => {
+        this.tableData = res.records || []
+        console.log("数据",res)
+        // console.log("总条数",res.total)
+        this.total = res.total || 0
+      })
+
+
+    },
+    setQuickTime(type) {
+      const now = new Date()
+      if (type === "today") {
+        this.queryForm.startTime = new Date(now.setHours(0,0,0,0))
+        this.queryForm.endTime = new Date()
+      } else if (type === "yesterday") {
+        const y = new Date()
+        y.setDate(y.getDate() - 1)
+        this.queryForm.startTime = new Date(y.setHours(0,0,0,0))
+        this.queryForm.endTime = new Date(y.setHours(23,59,59,999))
+      } else if (type === "month") {
+        const first = new Date(now.getFullYear(), now.getMonth(), 1)
+        this.queryForm.startTime = first
+        this.queryForm.endTime = new Date()
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.event-page {
+  display: flex;
+  padding: 10px;
+}
+.query-panel {
+  width: 280px;
+  padding: 10px;
+  border-right: 1px solid #ddd;
+}
+.table-panel {
+  flex: 1;
+  padding: 10px;
+}
+.quick-btns {
+  display: flex;
+  gap: 6px;
+  margin: 6px 0;
+}
+.pagination {
+  margin-top: 10px;
+  text-align: right;
+}
+</style>

+ 339 - 0
src/views/doormanManage/deviceManage/index.vue

@@ -0,0 +1,339 @@
+<template>
+  <div class="device-management">
+    <div class="header">
+      <h2>设备管理</h2>
+      <el-button type="primary" @click="openAddDialog">新增设备</el-button>
+    </div>
+
+    <el-table :data="devices" style="width: 100%" border v-loading="loading">
+      <el-table-column label="序号" width="70">
+        <template slot-scope="scope">{{ scope.$index + 1 }}</template>
+      </el-table-column>
+      <el-table-column prop="id" label="设备ID" min-width="180" />
+      <el-table-column prop="model" label="设备型号" min-width="120" />
+      <el-table-column prop="location" label="设备位置" min-width="140" />
+      <el-table-column prop="ip" label="设备IP" min-width="140" />
+      <el-table-column prop="port" label="设备Port" min-width="140" />
+      <el-table-column prop="account" label="账号" width="120" />
+      <el-table-column prop="password" label="密码" width="120" />
+      <el-table-column label="操作" fixed="right" width="160">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="viewDevice(scope.row)">查看</el-button>
+          <el-button type="text" size="small" @click="deleteDevice(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- Add Dialog -->
+    <el-dialog title="新增设备" :visible.sync="dialogVisible" width="600px">
+      <el-form :model="form" :rules="rules" ref="deviceForm" label-width="110px" style="background: #001b2f">
+        <el-form-item label="设备型号" prop="model">
+          <el-input v-model="form.model" placeholder="请输入设备型号" />
+        </el-form-item>
+        <el-form-item label="设备位置" prop="location">
+          <el-input v-model="form.location" placeholder="请输入设备位置" />
+        </el-form-item>
+        <el-form-item label="设备IP" prop="ip">
+          <el-input v-model="form.ip" placeholder="请输入设备IP" />
+        </el-form-item>
+        <el-form-item label="设备端口" prop="port">
+          <el-input v-model="form.port" placeholder="请输入设备Port" />
+        </el-form-item>
+        <el-form-item label="账号" prop="account">
+          <el-input v-model="form.account" placeholder="请输入账号" />
+        </el-form-item>
+        <el-form-item label="密码" prop="password">
+          <el-input type="password" v-model="form.password" placeholder="请输入密码" />
+        </el-form-item>
+
+        <!-- 新增:同步模式选择 -->
+        <el-form-item label="同步人员">
+          <el-radio-group v-model="form.syncMode">
+            <el-radio :label="0">不同步</el-radio>
+            <el-radio :label="1">同步所有人员</el-radio>
+            <el-radio :label="2">从指定设备同步</el-radio>
+          </el-radio-group>
+        </el-form-item>
+
+        <!-- 如果选择了 2,则输入来源设备ID -->
+        <el-form-item v-if="form.syncMode === 2" label="来源设备ID">
+          <el-input v-model="form.syncFromDeviceId" placeholder="请输入来源设备ID" />
+        </el-form-item>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitDevice">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import axios from 'axios'
+import request from "@/utils/request";
+
+export default {
+  name: 'DeviceManagement',
+  data() {
+    return {
+      loading: false,
+      devices: [],
+      dialogVisible: false,
+      form: {
+        model: '',
+        location: '',
+        ip: '',
+        port: '',
+        account: '',
+        password: '',
+        syncMode: 0,
+        syncFromDeviceId: null
+      },
+      rules: {
+        model: [{ required: true, message: '请输入设备型号', trigger: 'blur' }],
+        location: [{ required: true, message: '请输入设备位置', trigger: 'blur' }],
+        ip: [{ required: true, message: '请输入设备IP', trigger: 'blur' }],
+        port: [{ required: true, message: '请输入设备Port', trigger: 'blur' }],
+        account: [{ required: true, message: '请输入账号', trigger: 'blur' }],
+        password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
+      }
+    }
+  },
+  mounted() {
+    this.fetchDevices()
+  },
+  methods: {
+    // 获取设备列表
+    async fetchDevices() {
+      this.loading = true
+      try {
+        const res = await request({
+          url: '/device/list',
+          method: 'GET',
+        })
+        console.log("设备信息", res)
+        this.devices = res
+      } finally {
+        this.loading = false
+      }
+    },
+    openAddDialog() {
+      this.resetForm()
+      this.dialogVisible = true
+      this.$nextTick(() => {
+        this.$refs.deviceForm && this.$refs.deviceForm.clearValidate()
+      })
+    },
+    async submitDevice() {
+      this.$refs.deviceForm.validate(async (valid) => {
+        if (!valid) return
+        try {
+          await request({
+            url: '/device/add',
+            method: 'post',
+            data: this.form
+          })
+          this.$message.success('新增设备成功')
+          this.dialogVisible = false
+          this.fetchDevices()
+        } catch (e) {
+          this.$message.error('新增设备失败')
+        }
+      })
+    },
+    resetForm() {
+      this.form = {
+        model: '',
+        location: '',
+        ip: '',
+        port: '',
+        account: '',
+        password: '',
+        syncMode: 0,
+        syncFromDeviceId: null
+      }
+    },
+    viewDevice(row) {
+      this.$router.push({path: '/peopleInfoManage', query: {deviceId: row.id}})
+    },
+    async deleteDevice(row) {
+      try {
+        const res = await request({
+          url: `/device/delete/${row.id}` ,
+          method: 'DELETE',
+        })
+        this.$message.success('删除设备成功')
+        this.fetchDevices()
+
+      } catch (e) {
+        this.$message.error('删除失败')
+      }
+      // this.getDeviceList()
+
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+.device-management { padding: 18px; background: #fff; border-radius: 6px; }
+.header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; }
+.dialog-footer { text-align: right; }
+:deep(.el-input__inner::placeholder) {
+  color: #666;
+  opacity: 1;
+}
+
+:deep(.el-input__inner::placeholder) {
+  color: #666;
+}
+</style>
+
+
+
+
+<!--<template>-->
+<!--  <div class="device-management">-->
+<!--    <div class="header">-->
+<!--      <h2>设备管理</h2>-->
+<!--      <el-button type="primary" @click="openAddDialog">新增设备</el-button>-->
+<!--    </div>-->
+
+<!--    <el-table-->
+<!--      :data="devices"-->
+<!--      style="width: 100%"-->
+<!--      border-->
+<!--      v-loading="loading"-->
+<!--    >-->
+<!--      <el-table-column label="序号" width="70">-->
+<!--        <template slot-scope="scope">{{ scope.$index + 1 }}</template>-->
+<!--      </el-table-column>-->
+
+<!--      <el-table-column prop="deviceId" label="设备ID" min-width="180" />-->
+<!--      <el-table-column prop="model" label="设备型号" min-width="120" />-->
+<!--      <el-table-column prop="location" label="设备位置" min-width="140" />-->
+<!--      <el-table-column prop="ip" label="设备IP" min-width="140" />-->
+<!--      <el-table-column prop="account" label="账号" width="120" />-->
+<!--      <el-table-column prop="password" label="密码" width="120" />-->
+
+<!--      <el-table-column label="操作" fixed="right" width="120">-->
+<!--        <template slot-scope="scope">-->
+<!--          <el-button type="text" size="small" @click="viewDevice(scope.row)">查看</el-button>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--    </el-table>-->
+
+<!--    &lt;!&ndash; Add Dialog &ndash;&gt;-->
+<!--    <el-dialog title="新增设备" :visible.sync="dialogVisible" width="600px">-->
+<!--      <el-form :model="form" :rules="rules" ref="deviceForm" label-width="110px">-->
+<!--        <el-form-item label="设备型号" prop="model">-->
+<!--          <el-input v-model="form.model" placeholder="请输入设备型号" />-->
+<!--        </el-form-item>-->
+
+<!--        <el-form-item label="设备位置" prop="location">-->
+<!--          <el-input v-model="form.location" placeholder="请输入设备位置" />-->
+<!--        </el-form-item>-->
+
+<!--        <el-form-item label="设备IP" prop="ip">-->
+<!--          <el-input v-model="form.ip" placeholder="请输入设备IP" />-->
+<!--        </el-form-item>-->
+
+<!--        <el-form-item label="账号" prop="account">-->
+<!--          <el-input v-model="form.account" placeholder="请输入账号" />-->
+<!--        </el-form-item>-->
+
+<!--        <el-form-item label="密码" prop="password">-->
+<!--          <el-input type="password" v-model="form.password" placeholder="请输入密码" />-->
+<!--        </el-form-item>-->
+<!--      </el-form>-->
+
+<!--      <div slot="footer" class="dialog-footer">-->
+<!--        <el-button @click="dialogVisible = false">取 消</el-button>-->
+<!--        <el-button type="primary" @click="submitDevice">确 定</el-button>-->
+<!--      </div>-->
+<!--    </el-dialog>-->
+<!--  </div>-->
+<!--</template>-->
+
+<!--<script>-->
+<!--export default {-->
+<!--  name: 'DeviceManagement',-->
+<!--  data() {-->
+<!--    return {-->
+<!--      loading: false,-->
+<!--      devices: [-->
+<!--        // 示例数据-->
+<!--        {-->
+<!--          deviceId: this.generateDeviceId(),-->
+<!--          model: 'ZK-T100',-->
+<!--          location: '大门东侧',-->
+<!--          ip: '192.168.1.101',-->
+<!--          account: 'admin',-->
+<!--          password: '123456'-->
+<!--        },-->
+<!--        {-->
+<!--          deviceId: this.generateDeviceId(),-->
+<!--          model: 'HIK-9000',-->
+<!--          location: '大门西侧',-->
+<!--          ip: '192.168.1.102',-->
+<!--          account: 'root',-->
+<!--          password: '654321'-->
+<!--        }-->
+<!--      ],-->
+
+<!--      dialogVisible: false,-->
+<!--      form: {-->
+<!--        model: '',-->
+<!--        location: '',-->
+<!--        ip: '',-->
+<!--        account: '',-->
+<!--        password: ''-->
+<!--      },-->
+<!--      rules: {-->
+<!--        model: [{ required: true, message: '请输入设备型号', trigger: 'blur' }],-->
+<!--        location: [{ required: true, message: '请输入设备位置', trigger: 'blur' }],-->
+<!--        ip: [{ required: true, message: '请输入设备IP', trigger: 'blur' }],-->
+<!--        account: [{ required: true, message: '请输入账号', trigger: 'blur' }],-->
+<!--        password: [{ required: true, message: '请输入密码', trigger: 'blur' }]-->
+<!--      }-->
+<!--    }-->
+<!--  },-->
+<!--  methods: {-->
+<!--    generateDeviceId() {-->
+<!--      return 'DEV-' + Math.random().toString(36).substr(2, 9)-->
+<!--    },-->
+<!--    openAddDialog() {-->
+<!--      this.resetForm()-->
+<!--      this.dialogVisible = true-->
+<!--      this.$nextTick(() => { this.$refs.deviceForm && this.$refs.deviceForm.clearValidate() })-->
+<!--    },-->
+<!--    submitDevice() {-->
+<!--      this.$refs.deviceForm.validate((valid) => {-->
+<!--        if (!valid) return-->
+<!--        const newDevice = Object.assign({ deviceId: this.generateDeviceId() }, this.form)-->
+<!--        this.devices.push(newDevice)-->
+<!--        this.dialogVisible = false-->
+<!--        this.$message.success('新增设备成功')-->
+<!--      })-->
+<!--    },-->
+<!--    resetForm() {-->
+<!--      this.form = { model: '', location: '', ip: '', account: '', password: '' }-->
+<!--    },-->
+<!--    viewDevice(row) {-->
+<!--      this.$router.push({-->
+<!--        path: '/peopleInfoManage',-->
+<!--        query: { deviceId: row.deviceId }   // 推荐用 query 传参-->
+<!--      })-->
+<!--    }-->
+
+<!--  }-->
+<!--}-->
+<!--</script>-->
+
+<!--<style scoped>-->
+<!--.device-management { padding: 18px; background: #fff; border-radius: 6px; }-->
+<!--.header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; }-->
+<!--.dialog-footer { text-align: right; }-->
+<!--</style>-->

+ 392 - 64
src/views/doormanManage/faceManage/index.vue

@@ -1,95 +1,423 @@
 <template>
 <template>
-  <div class="app-container">
-    <div style="margin-bottom:15px;">
-      <el-input v-model="searchKey" placeholder="输入人脸ID或人员ID搜索" style="width:250px;margin-right:10px;" />
-      <el-button type="primary" @click="search">搜索</el-button>
-      <el-button type="success" @click="openAddDialog">新增人脸</el-button>
-      <el-button type="warning" @click="collect">采集人脸</el-button>
+  <div class="people-face-management">
+    <!-- 顶部操作 -->
+    <div class="header">
+      <h2>人员人脸管理</h2>
+      <el-input v-model="searchName" placeholder="按姓名搜索" style="width: 180px;" />
+      <el-button @click="fetchFaces">搜索</el-button>
+      <el-button type="primary" @click="openAddDialog">新增人脸</el-button>
     </div>
     </div>
 
 
-    <el-table :data="filteredList">
-      <el-table-column prop="faceId" label="人脸ID" min-width="120" />
-      <el-table-column prop="employeeNo" label="人员ID" min-width="120" />
-      <el-table-column label="照片" min-width="150">
-        <template #default="scope">
-          <el-image :src="scope.row.img" style="width:60px;height:60px" fit="cover"/>
-        </template>
+    <!-- 人脸列表 -->
+    <el-table
+      :data="faceList"
+      border
+      v-loading="loading"
+      style="width: 100%; margin-top: 10px;"
+    >
+      <el-table-column label="序号" width="60">
+        <template #default="scope">{{ scope.$index + 1 }}</template>
       </el-table-column>
       </el-table-column>
-      <el-table-column label="操作" width="200">
+      <el-table-column prop="personId" label="人员ID" min-width="120"/>
+      <el-table-column prop="jobNumber" label="工号" min-width="100"/>
+      <el-table-column prop="name" label="姓名" min-width="120"/>
+      <el-table-column prop="createTime" label="创建时间" min-width="160">
+        <template #default="scope">{{ scope.row.createTime ? new Date(scope.row.createTime).toLocaleString() : '-' }}</template>
+      </el-table-column>
+      <el-table-column label="操作" fixed="right" width="220">
         <template #default="scope">
         <template #default="scope">
-          <el-button size="mini" @click="openEditDialog(scope.row)">编辑</el-button>
-          <el-button size="mini" type="danger" @click="deleteFace(scope.row.faceId)">删除</el-button>
+          <el-button type="text" size="small" @click="viewFace(scope.row)">查看</el-button>
+          <el-button type="text" size="small" @click="editFace(scope.row)">修改</el-button>
+          <el-button type="text" size="small" @click="deleteFace(scope.row)">删除</el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
     </el-table>
     </el-table>
-    <div style="margin-top:10px;">人脸总数:{{ faceList.length }}</div>
-
-    <el-dialog :visible.sync="dialogVisible" :title="isEdit?'编辑人脸':'新增人脸'">
-      <el-form :model="form" label-width="80px">
-        <el-form-item label="人脸ID"><el-input v-model="form.faceId" /></el-form-item>
-        <el-form-item label="人员ID"><el-input v-model="form.employeeNo" /></el-form-item>
-        <el-form-item label="照片">
-          <el-upload action="#" :auto-upload="false" :on-change="handleUpload">
-            <el-button size="small" type="primary">上传图片</el-button>
-          </el-upload>
-          <el-image v-if="form.img" :src="form.img" style="width:80px;height:80px;margin-top:5px"/>
+
+    <!-- 新增/编辑/查看人脸弹窗 -->
+    <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="600px">
+      <el-form class="dark-form" :model="form" :rules="rules" ref="faceForm" label-width="120px">
+        <el-form-item label="请输入人名搜索" prop="personId">
+          <el-select
+            v-model="form.personId"
+            placeholder="按姓名搜索"
+            style="width: 220px;"
+            filterable
+            clearable
+            :disabled="isViewMode"
+            @change="handleSelect"
+          >
+            <el-option
+              v-for="person in peopleList"
+              :key="person.personId"
+              :label="person.name"
+              :value="person.personId"
+            />
+          </el-select>        </el-form-item>
+
+        <el-form-item label="人员ID" prop="personId">
+          <el-input v-model="form.personId" placeholder="请输入人员ID" :disabled="isViewMode"/>
+<!--          <el-input v-model="searchName" placeholder="请输入人员ID" :disabled="isViewMode"/>-->
+        </el-form-item>
+
+        <el-form-item label="工号" prop="jobNumber">
+          <el-input v-model="form.jobNumber" placeholder="请输入工号(可选)" :disabled="isViewMode"/>
+        </el-form-item>
+
+        <el-form-item label="姓名" prop="name">
+          <el-input v-model="form.name" placeholder="请输入姓名" :disabled="isViewMode"/>
+        </el-form-item>
+
+        <el-form-item label="人脸照片" prop="faceImgBase64">
+          <!-- 查看模式:用 img 展示 -->
+          <template v-if="isViewMode">
+            <img
+              v-if="faceImgBase64"
+              :src="faceImgBase64.startsWith('data:') ? faceImgBase64 : 'data:image/jpeg;base64,' + faceImgBase64"
+              alt="人脸照片"
+              style="width: 120px; height: 120px; object-fit: cover; border-radius: 8px;"
+            />
+            <span v-else>暂无照片</span>
+          </template>
+
+          <!-- 新增/编辑模式:用 el-upload -->
+          <template v-else>
+            <el-upload
+              list-type="picture-card"
+              :file-list="fileList"
+              :http-request="uploadRequest"
+              :on-remove="handleRemove"
+            >
+              <i class="el-icon-plus"></i>
+            </el-upload>
+          </template>
         </el-form-item>
         </el-form-item>
       </el-form>
       </el-form>
-      <span slot="footer">
-        <el-button @click="dialogVisible=false">取消</el-button>
-        <el-button type="primary" @click="saveFace">保存</el-button>
-      </span>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible=false">关闭</el-button>
+        <el-button v-if="!isViewMode" type="primary" @click="submitFace">确定</el-button>
+      </div>
     </el-dialog>
     </el-dialog>
+
+
+    <!--    &lt;!&ndash; 新增/编辑/查看人脸弹窗 &ndash;&gt;-->
+<!--    <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="600px">-->
+<!--      <el-form class="dark-form" :model="form" :rules="rules" ref="faceForm" label-width="120px">-->
+<!--        <el-form-item label="人员ID" prop="personId">-->
+<!--          <el-input v-model="form.personId" placeholder="请输入人员ID" :disabled="isViewMode"/>-->
+<!--        </el-form-item>-->
+
+<!--        <el-form-item label="工号" prop="jobNumber">-->
+<!--          <el-input v-model="form.jobNumber" placeholder="请输入工号(可选)" :disabled="isViewMode"/>-->
+<!--        </el-form-item>-->
+
+<!--        <el-form-item label="姓名" prop="name">-->
+<!--          <el-input v-model="form.name" placeholder="请输入姓名" :disabled="isViewMode"/>-->
+<!--        </el-form-item>-->
+
+<!--        <el-form-item label="人脸照片" prop="faceImgBase64">-->
+<!--          <el-upload-->
+<!--            list-type="picture-card"-->
+<!--            :file-list="fileList"-->
+<!--            :http-request="uploadRequest"-->
+<!--            :disabled="isViewMode"-->
+<!--            :on-remove="handleRemove"-->
+<!--          >-->
+<!--            <i class="el-icon-plus"></i>-->
+<!--          </el-upload>-->
+<!--        </el-form-item>-->
+<!--      </el-form>-->
+
+<!--      <div slot="footer" class="dialog-footer">-->
+<!--        <el-button @click="dialogVisible=false">关闭</el-button>-->
+<!--        <el-button v-if="!isViewMode" type="primary" @click="submitFace">确定</el-button>-->
+<!--      </div>-->
+<!--    </el-dialog>-->
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
+import request from "@/utils/request";
+import axios from "axios";
+
 export default {
 export default {
-  name: "Face",
+  name: 'PeopleFaceManage',
   data() {
   data() {
     return {
     return {
-      searchKey:"",
-      dialogVisible:false,
-      isEdit:false,
-      form:{},
-      faceList:[
-        { faceId:"IMG001", employeeNo:"1001", img:"https://via.placeholder.com/60" },
-        { faceId:"IMG002", employeeNo:"1002", img:"https://via.placeholder.com/60" }
-      ]
+      loading: false,
+      searchName: '',
+      peopleList: [],    // 下拉候选人员
+      filteredPeople: [],
+      faceList: [],
+      faceImgBase64: '',
+      dialogVisible: false,
+      mode: 'add', // 'add' | 'edit' | 'view'
+      form: {
+        id: null,         // 关键:记录数据库 id(编辑时需要)
+        personId: '',
+        jobNumber: '',
+        name: '',
+        faceImgUrl: ''
+      },
+      fileList: [],
+      rules: {
+        personId: [{ required: true, message: '请输入人员ID', trigger: 'blur' }],
+        name: [{ required: true, message: '请输入姓名', trigger: 'blur' }]
+      }
     }
     }
   },
   },
-  computed:{
-    filteredList(){
-      if(!this.searchKey) return this.faceList
-      return this.faceList.filter(f=>
-        f.faceId.includes(this.searchKey) || f.employeeNo.includes(this.searchKey)
-      )
+  computed: {
+    isViewMode() { return this.mode === 'view' },
+    dialogTitle() {
+      if (this.mode === 'add') return '新增人脸'
+      if (this.mode === 'edit') return '修改人脸'
+      if (this.mode === 'view') return '查看人脸'
+      return '人脸信息'
     }
     }
   },
   },
-  methods:{
-    search(){ this.$message.success("搜索完成(模拟)") },
-    openAddDialog(){ this.isEdit=false; this.form={}; this.dialogVisible=true },
-    openEditDialog(row){ this.isEdit=true; this.form={...row}; this.dialogVisible=true },
-    saveFace(){
-      if(this.isEdit){
-        let idx=this.faceList.findIndex(f=>f.faceId===this.form.faceId)
-        this.faceList.splice(idx,1,this.form)
+  mounted() {
+    this.fetchFaces()
+    this.fetchPeople()
+  },
+  methods: {
+    fetchPeople() {
+      this.loading = true
+      request({
+        url: `/person/info/list/`,
+        method: 'GET',
+      }).then(res => {
+        console.log("人员信息返回:", res)
+        // this.peopleList = res
+        let data = res
+        if (this.searchName) {
+          data = data.filter(p => p.name && p.name.includes(this.searchName))
+          console.log("过滤后的人员信息:", data)
+        }
+        // console.log("过滤后的人员信息:", this.data)
+        this.peopleList = data
+        console.log("人员信息:", this.peopleList)
+      }).finally(() => { this.loading = false })
+    },
+    handleSelect(personId) {
+      if (this.searchName) {
+        this.filteredPeople = this.peopleList.filter(
+          p => p.name && p.name.includes(this.searchName)
+        )
       } else {
       } else {
-        this.faceList.push({...this.form})
+        this.filteredPeople = this.peopleList   // 没有输入就显示全部
+      }
+
+      // 根据选中的 personId 找到人员对象
+      const person = this.peopleList.find(p => p.personId === personId)
+
+      if (person) {
+        this.form.personId = person.personId
+        this.form.jobNumber = person.jobNumber || '' // 可能为空
+        this.form.name = person.name
+      }
+    }
+,
+    // 自定义上传请求(Element 的 http-request 回调)
+    async uploadRequest(option) {
+      const { file, onSuccess, onError, onProgress } = option;
+      try {
+        const formData = new FormData();
+        formData.append('file', file);
+
+        const res = await request({
+          url: '/person/face/upload',
+          method: 'POST',
+          data: formData,
+          headers: { 'Content-Type': 'multipart/form-data' }
+        });
+
+        // 根据后端返回结构取 url(兼容 res.url / res.data.url / res.data.fileUrl 等)
+        const url = res && (res.url || (res.data && (res.data.url || res.data.fileUrl)) || res.fileUrl) || '';
+
+        // 更新表单和文件列表(展示用)
+        this.form.faceImgUrl = url;
+        console.log("url:", url)
+        console.log("faceImgUrl :", this.form.faceImgUrl)
+        this.fileList = [{ name: file.name, url }];
+
+        // 通知 el-upload 上传成功
+        onSuccess && onSuccess(res);
+      } catch (err) {
+        onError && onError(err);
       }
       }
-      this.dialogVisible=false
-      this.$message.success("保存成功(模拟)")
     },
     },
-    deleteFace(id){
-      this.faceList=this.faceList.filter(f=>f.faceId!==id)
-      this.$message.error("已删除 人脸ID="+id)
+
+    handleRemove(file) {
+      // 用户删除上传文件时,清空表单 url
+      this.form.faceImgUrl = '';
+      this.fileList = [];
+    },
+
+    fetchFaces() {
+      this.loading = true;
+      request({
+        url: '/person/face/list',
+        method: 'get',
+      }).then(res => {
+        // 兼容后端直接返回数组或 data 包裹
+        let data = Array.isArray(res) ? res : (res.data || res.rows || [])
+        // this.faceList = Array.isArray(res) ? res : (res.data || res.rows || [])
+        if (this.searchName) {
+          data = data.filter(p => p.name && p.name.includes(this.searchName))
+        }
+        this.faceList = data
+        console.log("人脸列表:", this.faceList)
+      }).catch(() => {
+        this.faceList = []
+      }).finally(() => { this.loading = false })
     },
     },
-    collect(){
-      this.$message.success("人脸采集成功(模拟)")
+
+    openAddDialog() {
+      this.resetForm()
+      this.mode = 'add'
+      this.dialogVisible = true
+      this.$nextTick(() => { this.$refs.faceForm && this.$refs.faceForm.clearValidate() })
     },
     },
-    handleUpload(file){
-      this.form.img=URL.createObjectURL(file.raw)
+
+    editFace(row) {
+      // 把后端 id 带上(编辑必须)
+      this.form = {
+        id: row.id != null ? row.id : row.faceId || null, // 兼容不同字段名
+        personId: row.personId || '',
+        jobNumber: row.jobNumber || '',
+        name: row.name || '',
+        faceImgUrl: row.faceImgUrl || ''
+      }
+      this.fileList = this.form.faceImgUrl ? [{ name: 'face', url: this.form.faceImgUrl }] : []
+      this.mode = 'edit'
+      this.dialogVisible = true
+      this.$nextTick(() => { this.$refs.faceForm && this.$refs.faceForm.clearValidate() })
+    },
+
+    viewFace(row) {
+      // 先初始化基本字段(不带图片)
+      this.form = {
+        id: row.id != null ? row.id : row.faceId || null,
+        personId: row.personId || '',
+        jobNumber: row.jobNumber || '',
+        name: row.name || '',
+        // faceImgUrl: ''   // 最终会放 data: URL
+      };
+
+      // 先把 dialog 打开或 mode 设置(按你的逻辑)
+      this.mode = 'view';
+      this.dialogVisible = true;
+
+      // 请求整条数据(后端返回 JSON 包含 faceImgBase64 和 faceImgMime)
+      request({
+        url: `/person/face/${row.id}`,
+        method: 'get',
+      }).then(res => {
+        // 根据你的 request.js 封装,可能需要 res.data 才是真正的返回数据
+        console.log("res:", res)
+
+        if (res.faceImgBase64) {
+          this.faceImgBase64 = `data:${res.faceImgMime};base64,${res.faceImgBase64}`;
+          this.fileList = [
+            {
+              name: res.name || 'face.png',
+              url: this.faceImgBase64,  // el-upload 需要 url 字段
+            }
+          ];
+        } else {
+          this.faceImgBase64 = '';
+          this.fileList = [];
+        }})
+        .catch(err => {
+          console.error('请求人员信息失败', err);
+          // 按需处理错误提示
+        });
+    }
+    ,
+
+    async submitFace() {
+      this.$refs.faceForm.validate(async (valid) => {
+        if (!valid) return;
+        try {
+          if (this.mode === 'add') {
+            await request({
+              url: '/person/face/add',
+              method: 'post',
+              data: this.form
+            });
+            this.$message.success('新增人脸成功');
+          } else if (this.mode === 'edit') {
+            // **关键**:编辑时调用更新接口,并带上 id(避免新增)
+            // 如果你的后端不是 PUT /person/face/update,请按项目实际接口调整
+            await request({
+              url: '/person/face/update',
+              method: 'put',
+              data: this.form
+            });
+            this.$message.success('修改人脸成功');
+          }
+          this.dialogVisible = false;
+          this.fetchFaces();
+        } catch (err) {
+          this.$message.error(this.mode === 'edit' ? '修改失败' : '新增失败');
+        }
+      })
+    },
+
+    resetForm() {
+      this.form = { id: null, personId: '', jobNumber: '', name: '', faceImgUrl: '' }
+      this.fileList = []
+    },
+
+    deleteFace(row) {
+      this.$confirm('确定删除该人脸吗?', '提示', { type: 'warning' }).then(async () => {
+        try {
+          await request({
+            url: `/person/face/delete/${row.id}`,
+            method: 'delete'
+          });
+          this.$message.success('删除成功');
+          this.fetchFaces();
+        } catch (e) {
+          this.$message.error('删除失败');
+        }
+      }).catch(() => {})
     }
     }
   }
   }
 }
 }
 </script>
 </script>
+
+<style scoped>
+.dark-form {
+  background-color: #0a2340;
+  color: #ffffff;
+}
+.dark-form .el-form-item__label {
+  color: #000000;
+}
+.dark-form .el-input__inner {
+  color: #ffffff;
+  background-color: #0a2340;
+  border-color: #1f3a5b;
+}
+.dark-form .el-input__inner::placeholder {
+  color: #cccccc;
+}
+.dark-form .el-upload__tip {
+  color: #000000;
+}
+.people-face-management {
+  padding: 18px;
+  background: #fff;
+  border-radius: 6px;
+}
+.header {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  margin-bottom: 12px;
+}
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 266 - 0
src/views/doormanManage/infoManage/index.vue

@@ -0,0 +1,266 @@
+<template>
+  <div class="dashboard">
+    <el-row :gutter="20">
+      <!-- 左上角:设备状态 -->
+      <el-col :span="12">
+        <el-card>
+          <el-tabs v-model=" chooseDevice" type="card" style="float:left;">
+            <el-tab-pane label="设备1" name="device1"></el-tab-pane>
+            <el-tab-pane label="设备2" name="device2"></el-tab-pane>
+          </el-tabs>
+          <el-button
+            v-if="!deviceStatus.ok"
+            type="danger"
+            size="mini"
+            style="float:right;"
+            @click="reconnectDevice">
+            重新连接
+          </el-button>
+          <div slot="header" class="clearfix">
+            <span>设备状态</span>
+          </div>
+          <div v-if="deviceStatus.ok" style="text-align:center; padding:20px;">
+            <el-result icon="success" title="运行正常"></el-result>
+          </div>
+          <div v-else style="text-align:center; padding:20px;">
+            <el-result icon="error" title="连接失败"></el-result>
+          </div>
+
+        </el-card>
+      </el-col>
+
+      <!-- 右上角:远程控制 -->
+      <el-col :span="12">
+        <el-card>
+          <div slot="header" class="clearfix">
+            <span>远程控制</span>
+            <el-button type="primary" size="mini" style="float:right;" @click="toggleDoor">
+              {{ doorOpen ? '关门' : '开门' }}
+            </el-button>
+          </div>
+          <el-tabs v-model="activeDevice">
+            <el-tab-pane
+              v-for="d in devices"
+              :key="d.id"
+              :label="d.name"
+              :name="d.id">
+              <div style="background:#000; height:200px; display:flex; align-items:center; justify-content:center; color:white;">
+                {{ d.name }} 视频流
+              </div>
+            </el-tab-pane>
+          </el-tabs>
+        </el-card>
+      </el-col>
+    </el-row>
+
+<!--    <el-row :gutter="20" style="margin-top:20px;">-->
+<!--      &lt;!&ndash; 左下角:人员信息 &ndash;&gt;-->
+<!--      <el-col :span="12">-->
+<!--        <el-card>-->
+<!--          <div slot="header">人员信息</div>-->
+<!--          <p>内部人员:{{ people.internal }}</p>-->
+<!--          <p>临时访问:{{ people.temporary }}</p>-->
+<!--          <p>内部人脸:{{ faces.internal }}</p>-->
+<!--          <p>外部人脸:{{ faces.external }}</p>-->
+<!--        </el-card>-->
+<!--      </el-col>-->
+<!--    </el-row>-->
+    <el-col :span="12">
+    <el-card shadow="hover" class="people-card">
+      <h2 class="section-title">人员信息总览</h2>
+      <div class="people-info">
+        <div class="info-block">
+          <img src="/resources/people1.jfif" class="info-icon" />
+          <p>人员总数</p>
+          <span>{{ peopleCount }}</span>
+        </div>
+        <div class="info-block">
+<!--          <img src="/resources/face1.png" class="info-icon" />-->
+          <p>内部人员总数</p>
+          <span>{{ registeredCount_people }}</span>
+        </div>
+        <div class="info-block">
+<!--          <img src="/resources/face1.png" class="info-icon" />-->
+          <p>临时访问人员总数</p>
+          <span>{{ unregisteredCount_people }}</span>
+        </div>
+      </div>
+<!--      <el-row :gutter="20">-->
+<!--        <el-col :span="6">-->
+<!--          <el-card shadow="hover" class="overview-card">-->
+<!--            <img src="/public/resources/people1.jfif" class="card-img" />-->
+<!--            <div class="card-text">人员信息</div>-->
+<!--          </el-card>-->
+<!--        </el-col>-->
+
+<!--        <el-col :span="6">-->
+<!--          <el-card shadow="hover" class="overview-card">-->
+<!--            <img src="/public/resources/face1.png" class="card-img" />-->
+<!--            <div class="card-text">人脸信息</div>-->
+<!--          </el-card>-->
+<!--        </el-col>-->
+
+<!--        <el-col :span="6">-->
+<!--          <el-card shadow="hover" class="overview-card">-->
+<!--            <img src="/public/resources/device.png" class="card-img" />-->
+<!--            <div class="card-text">设备信息</div>-->
+<!--          </el-card>-->
+<!--        </el-col>-->
+
+<!--        <el-col :span="6">-->
+<!--          <el-card shadow="hover" class="overview-card">-->
+<!--            <img src="/public/resources/other.png" class="card-img" />-->
+<!--            <div class="card-text">其他信息</div>-->
+<!--          </el-card>-->
+<!--        </el-col>-->
+<!--      </el-row>-->
+    </el-card>
+      <el-card shadow="hover" class="face-card">
+        <h2 class="section-title">人脸信息总览</h2>
+        <div class="face-info">
+          <div class="info-block">
+            <img src="/resources/face1.png" class="info-icon" />
+            <p>人员总数</p>
+            <span>{{ faceCount }}</span>
+          </div>
+          <div class="info-block">
+
+            <p>内部人脸总数</p>
+            <span>{{ registeredCount }}</span>
+          </div>
+          <div class="info-block">
+<!--            <img src="/resources/face1.png" class="info-icon" />-->
+            <p>临时访问人脸总数</p>
+            <span>{{ unregisteredCount }}</span>
+          </div>
+        </div>
+      </el-card>
+    </el-col>
+
+    <!--      &lt;!&ndash; 右下角:实时事件 &ndash;&gt;-->
+    <el-col :span="12">
+      <el-card>
+        <div slot="header">实时事件</div>
+        <el-table :data="events" size="mini" height="400" border>
+          <el-table-column prop="eventTime" label="时间" width="150"/>
+          <el-table-column prop="name" label="姓名" width="100"/>
+          <el-table-column prop="personId" label="人员id" width="120" />
+          <el-table-column prop="eventType" label="事件类型"/>
+        </el-table>
+      </el-card>
+    </el-col>
+
+  </div>
+</template>
+
+<script>
+import request from "@/utils/request";
+
+export default {
+  name: "Dashboard",
+  data() {
+    return {
+      deviceStatus: {
+        device1: { ok: true },
+        device2: { ok: false }
+      },
+      doorOpen: false,
+      chooseDevice: "device1",
+      activeDevice: '1',
+      devices: [
+        { id: '1', name: '设备1' },
+        { id: '2', name: '设备2' }
+      ],
+      people: { internal: 10, temporary: 2 },
+      faces: { internal: 8, external: 5 },
+
+      events: [
+      ],
+      // total: 0,
+      peopleCount: 0,
+      registeredCount_people: 0,
+      unregisteredCount_people: 0,
+    }
+  },
+  created() {
+    // 页面加载时自动拉取第一页数据
+    this.fetchData()
+    this.peopleData()
+    this.fetchPeople()
+  },
+  methods: {
+    fetchData() {
+      request({
+        url: "/event/list",
+        method: "get",
+      }).then(res => {
+
+        this.events = res.records || []
+        console.log("数据",res)
+        console.log("总条数",res.total)
+        this.total = res.total || 0
+      })
+    },
+    peopleData() {
+
+
+      request({
+        url: "/person/info/total",
+        method: "get",
+      }).then(res => {
+        console.log("接口返回:", res)
+        // this.peopleCount = res.total || []
+        this.peopleCount = res
+        console.log("人员总数...............",res)
+
+      })
+    },
+    reconnectDevice() {
+      // TODO: 调后端接口
+      this.deviceStatus.ok = true
+    },
+    toggleDoor() {
+      // TODO: 调后端接口
+      this.doorOpen = !this.doorOpen
+    },
+
+    fetchPeople() {
+      this.loading = true
+      request({
+        url: `/person/info/list/`,  // ✅ 模板字符串
+        method: 'GET',
+      }).then(res => {
+
+        // // 内部人员数量 (is_temporary == 0)
+        // this.internalCount = data.filter(p => p.is_temporary == 0).length
+        //
+        // // 临时访问人员数量 (is_temporary == 1)
+        // this.tempCount = data.filter(p => p.is_temporary == 1).length
+        console.log("人员信息返回:", res)
+        let data = res
+        this.peopleList = data
+        console.log("人员信息:", this.peopleList)
+        // 内部人员数量 (is_temporary == 0)
+        this.registeredCount_people = data.filter(p => p.is_temporary == false).length
+
+        // 临时访问人员数量 (is_temporary == 1)
+        this.unregisteredCount_people = data.filter(p => p.is_temporary === true).length
+        console.log("内部人员:", this.registeredCount_people)
+
+      }).finally(() => { this.loading = false })
+    },
+  }
+}
+</script>
+
+<style scoped>
+.dashboard {
+  padding: 20px;
+}
+.info-icon {
+  width: 60px;         /* 图片宽度 */
+  height: 60px;        /* 图片高度 */
+  object-fit: contain; /* 保持比例 */
+  margin-bottom: 8px;  /* 图片和文字之间的间距 */
+}
+</style>

+ 560 - 0
src/views/doormanManage/peopleInfoManage/index.vue

@@ -0,0 +1,560 @@
+<template>
+  <div class="people-info-management">
+    <!-- 顶部操作 -->
+    <div class="header">
+      <h2>人员信息管理</h2>
+      <el-select v-model="selectedDeviceId" placeholder="选择设备" @change="fetchPeople">
+        <el-option
+          v-for="device in devices"
+          :key="device.id"
+          :label="device.model + ' - ' + device.location"
+          :value="device.id"
+        />
+      </el-select>
+      <el-button type="primary" @click="openAddDialog">新增人员</el-button>
+      <el-input v-model="searchName" placeholder="按姓名搜索" style="width: 180px; margin-left: 10px;" />
+      <el-button @click="fetchPeople">搜索</el-button>
+    </div>
+
+    <!-- 人员列表 -->
+    <el-table
+      :data="peopleList"
+      border
+      v-loading="loading"
+      style="width: 100%; margin-top: 10px;"
+    >
+      <el-table-column label="序号" width="60">
+        <template #default="scope">{{ scope.$index + 1 }}</template>
+      </el-table-column>
+      <el-table-column prop="personId" label="人员ID" min-width="120"/>
+      <el-table-column prop="name" label="姓名" min-width="120"/>
+      <el-table-column prop="isTemporary" label="是否为临时访问人员" width="100">
+        <template #default="scope">
+          <el-tag type="success" v-if="scope.row.isTemporary">是</el-tag>
+          <el-tag type="info" v-else>否</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="longTerm" label="长期有效" width="100">
+        <template #default="scope">
+          <el-tag type="success" v-if="scope.row.longTerm">是</el-tag>
+          <el-tag type="info" v-else>否</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="validPeriod" label="有效期" min-width="160">
+        <template #default="scope">{{ scope.row.validPeriod ? new Date(scope.row.validPeriod).toLocaleString() : '-' }}</template>
+      </el-table-column>
+      <el-table-column prop="doorPermission" label="门权限" min-width="150"/>
+      <el-table-column prop="planTemplateId" label="计划模板" min-width="120"/>
+      <el-table-column prop="authMethod" label="认证方式" width="100"/>
+      <el-table-column label="操作" fixed="right" width="180">
+        <template #default="scope">
+          <el-button type="text" size="small" @click="viewPerson(scope.row)">查看</el-button>
+          <el-button type="text" size="small" @click="deletePerson(scope.row)">删除</el-button>
+          <el-button type="text" size="small" @click="editPerson(scope.row)">编辑</el-button>
+
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 新增人员弹窗 -->
+    <el-dialog title="新增人员" :visible.sync="dialogVisible" width="600px">
+      <el-form :model="form" :rules="rules" ref="peopleForm" label-width="120px" style="background: #001b2f">
+<!--        <el-form-item label="人员ID" prop="personId">-->
+<!--          <el-input v-model="form.personId" placeholder="请输入人员ID" :disabled="isViewMode"/>-->
+<!--        </el-form-item>-->
+
+        <el-form-item label="姓名" prop="name">
+          <el-input v-model="form.name" placeholder="请输入姓名" :disabled="isViewMode"/>
+        </el-form-item>
+
+        <el-form-item label="是否为临时访问人员" prop="isTemporary">
+          <el-switch v-model="form.isTemporary" active-text="是" inactive-text="否" :disabled="isViewMode"/>
+        </el-form-item>
+
+        <el-form-item label="长期有效" prop="longTerm">
+          <el-switch v-model="form.longTerm" active-text="是" inactive-text="否" :disabled="isViewMode"/>
+        </el-form-item>
+
+        <el-form-item label="有效期" v-if="!form.longTerm">
+          <el-date-picker
+            v-model="form.validPeriod"
+            type="datetime"
+            placeholder="请选择有效期"
+            style="width: 100%;"
+            :disabled="isViewMode"
+          />
+        </el-form-item>
+
+        <el-form-item label="门权限" prop="doorPermission">
+          <el-input v-model="form.doorPermission" placeholder="请输入门权限ID列表,用逗号分隔" :disabled="isViewMode"/>
+        </el-form-item>
+
+        <el-form-item label="计划模板" prop="planTemplateId">
+          <el-input v-model="form.planTemplateId" placeholder="请输入计划模板ID" :disabled="isViewMode"/>
+        </el-form-item>
+
+        <el-form-item label="认证方式" prop="authMethod">
+          <el-select v-model="form.authMethod" placeholder="请选择认证方式" :disabled="isViewMode">
+            <el-option label="人脸" value="face" />
+            <el-option label="指纹" value="fingerprint" />
+            <el-option label="密码" value="password" />
+            <el-option label="卡片" value="card" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible=false">取消</el-button>
+        <el-button type="primary" @click="submitPerson">确定</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import request from "@/utils/request";
+
+export default {
+  name: 'PeopleInfoManage',
+  data() {
+    return {
+      loading: false,
+      devices: [],           // 设备列表
+      selectedDeviceId: null, // 当前选择的设备
+      searchName: '',
+      peopleList: [],
+      dialogVisible: false,
+      form: {
+        personId: '',
+        name: '',
+        isTemporary: false,
+        longTerm: false,
+        validStart: null,  // 有效期开始
+        validEnd: null,  //有效期结束
+        validPeriod: null,
+        doorPermission: '',
+        planTemplateId: '',
+        authMethod: ''
+      },
+      rules: {
+        personId: [{ required: true, message: '请输入人员ID', trigger: 'blur' }],
+        name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+        doorPermission: [{ required: true, message: '请输入门权限', trigger: 'blur' }],
+        planTemplateId: [{ required: true, message: '请输入计划模板ID', trigger: 'blur' }],
+        authMethod: [{ required: true, message: '请选择认证方式', trigger: 'change' }]
+      }
+    }
+  },
+  computed: {
+    isViewMode() { return this.mode === 'view' },
+    dialogTitle() {
+      if (this.dialogMode === 'add') return '新增人员'
+      if (this.dialogMode === 'edit') return '修改人员'
+      if (this.dialogMode === 'view') return '查看人员'
+      return '人员信息'
+    }
+  },
+  mounted() {
+    this.fetchDevices()
+  },
+  methods: {
+
+    fetchDevices() {
+      this.loading = true;
+      request({
+        url: '/device/list',
+        method: 'GET'
+      }).then(res => {
+        console.log("设备接口原始返回:", res)
+
+        // 因为返回本身就是数组
+        this.devices = Array.isArray(res) ? res : (res.rows || res.data || [])
+
+        console.log("解析后的设备列表:", this.devices)
+
+        if (this.devices.length > 0) {
+          this.selectedDeviceId = this.devices[0].id
+          console.log("选中的设备ID:", this.selectedDeviceId)
+          this.fetchPeople()
+        } else {
+          console.warn("⚠️ 没有设备数据,无法调用 fetchPeople")
+        }
+      }).catch(err => {
+        console.error("获取设备列表失败:", err)
+        this.devices = []
+      })
+    },
+    fetchPeople() {
+      if (!this.selectedDeviceId) return
+      this.loading = true
+      request({
+        url: `/person/info/list/${this.selectedDeviceId}`,  // ✅ 模板字符串
+        method: 'GET',
+      }).then(res => {
+        console.log("人员信息返回:", res)
+        let data = res
+        if (this.searchName) {
+          data = data.filter(p => p.name && p.name.includes(this.searchName))
+        }
+        this.peopleList = data
+        console.log("人员信息:", this.peopleList)
+      }).finally(() => { this.loading = false })
+    },
+    editPerson(row) {
+      this.form = { ...row }
+      this.dialogVisible = true
+      this.dialogMode = 'edit'
+      this.$nextTick(() => {
+        this.$refs.peopleForm && this.$refs.peopleForm.clearValidate()
+      })
+    },
+    openAddDialog() {
+      this.resetForm()
+      this.dialogVisible = true
+      this.$nextTick(() => { this.$refs.peopleForm && this.$refs.peopleForm.clearValidate() })
+    },
+    async submitPerson() {
+      this.$refs.peopleForm.validate(async (valid) => {
+        if (!valid) return
+        try {
+          if (this.dialogMode === 'add') {
+            const payload = {...this.form, deviceId: this.selectedDeviceId}
+            const res = await request({
+              url: '/person/info/add',
+              method: 'POST',
+              data: payload
+            });
+            this.$message.success('新增人员成功');
+          }
+        else if (this.dialogMode === 'edit') {
+            // **关键**:编辑时调用更新接口,并带上 id(避免新增)
+            // 如果你的后端不是 PUT /person/info/update,请按项目实际接口调整
+            const payload = {...this.form, deviceId: this.selectedDeviceId}
+            const res  = await request({
+              url: '/person/info/update',
+              method: 'put',
+              data: payload
+            });
+            console.log("更新接口返回:", res)
+            this.$message.success('修改成功');
+          }
+          this.dialogVisible = false
+          this.fetchPeople()
+        } catch (err) {
+          this.$message.error(this.dialogMode === 'edit' ? '修改失败' : '新增失败');
+        }
+      })
+    },
+    resetForm() {
+      this.form = {
+        // personId: '',
+        name: '',
+        isTemporary: false,
+        longTerm: false,
+        validPeriod: null,
+        doorPermission: '',
+        planTemplateId: '',
+        authMethod: ''
+      }
+    },
+    viewPerson(row) {
+      this.$message.info(`人员详情: ${row.name} (${row.personId})`)
+      this.form = {
+        id: row.id || null,
+        personId: row.personId || '',
+        name: row.name || '',
+        longTermValid: row.longTermValid || false,
+        validUntil: row.validUntil || '',
+        doorPermission: row.doorPermission || '',
+        planTemplateId: row.planTemplateId || '',
+        authMethod: row.authMethod || ''
+      }
+      this.dialogMode = 'view'   // 查看模式
+      this.dialogVisible = true
+    }
+    ,
+    // viewPerson(row) {
+    //   this.$message.info(`人员详情: ${row.name} (${row.personId})`)
+    // },
+    async deletePerson(row) {
+      try {
+        const res = await request({
+          url: `/person/info/delete/${row.id}` ,
+          method: 'DELETE',
+        })
+        this.$message.success('删除人员成功')
+        this.fetchDevices()
+
+      } catch (e) {
+        this.$message.error('删除失败')
+      }
+      // this.getDeviceList()
+
+    }
+    // deletePerson(row) {
+    //   this.$confirm('确定删除该人员吗?', '提示', { type: 'warning' }).then(() => {
+    //     this.$axios.delete(`/person/info/delete/${row.id}`).then(res => {
+    //       this.$message.success('删除成功')
+    //       this.fetchPeople()
+    //     })
+    //   }).catch(() => {})
+    // }
+  }
+}
+</script>
+
+<style scoped>
+.people-info-management { padding: 18px; background: #fff; border-radius: 6px; }
+.header { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
+.dialog-footer { text-align: right; }
+</style>
+
+
+<!--<template>-->
+<!--  <div class="device-detail">-->
+<!--    <h2>设备详情 - {{ $route.query.deviceId }}</h2>-->
+<!--    <el-tabs v-model="activeTab" tab-position="left">-->
+<!--      &lt;!&ndash; 人员管理 &ndash;&gt;-->
+<!--      <el-tab-pane label="人员管理" name="staff">-->
+<!--        <div class="tab-header">-->
+<!--          <el-button type="primary" @click="openAddDialog('staff')">新增人员</el-button>-->
+<!--        </div>-->
+<!--        <el-table :data="peopleList" border style="width:100%">-->
+<!--          <el-table-column label="序号" width="70">-->
+<!--            <template slot-scope="scope">{{ scope.$index + 1 }}</template>-->
+<!--          </el-table-column>-->
+<!--          <el-table-column prop="personId" label="人员ID" min-width="120" />-->
+<!--          <el-table-column prop="jobNumber" label="工号" min-width="120" />-->
+<!--          <el-table-column prop="name" label="姓名" min-width="120" />-->
+<!--          <el-table-column prop="longTerm" label="是否长期有效" min-width="120" />-->
+<!--          <el-table-column prop="validPeriod" label="有效期" min-width="160" />-->
+<!--          <el-table-column prop="doorPermission" label="门权限" min-width="160" />-->
+<!--          <el-table-column prop="planTemplateId" label="计划模板编号" min-width="140" />-->
+<!--          <el-table-column prop="authMethod" label="认证方式" min-width="120" />-->
+<!--          <el-table-column label="操作" width="160">-->
+<!--            <template slot-scope="scope">-->
+<!--              <el-button type="text" size="small" @click="openEditDialog('staff', scope.$index, scope.row)">修改</el-button>-->
+<!--              <el-button type="text" size="small" style="color:#f56c6c" @click="removeRow('staff', scope.$index)">删除</el-button>-->
+<!--            </template>-->
+<!--          </el-table-column>-->
+<!--        </el-table>-->
+<!--      </el-tab-pane>-->
+
+<!--      &lt;!&ndash; 人脸管理 &ndash;&gt;-->
+<!--      <el-tab-pane label="人脸管理" name="face">-->
+<!--        <div class="tab-header">-->
+<!--          <el-button type="primary" @click="openAddDialog('face')">新增人脸信息</el-button>-->
+<!--        </div>-->
+<!--        <el-table :data="faceList" border style="width:100%">-->
+<!--          <el-table-column label="序号" width="70">-->
+<!--            <template slot-scope="scope">{{ scope.$index + 1 }}</template>-->
+<!--          </el-table-column>-->
+<!--          <el-table-column prop="personId" label="人员ID" min-width="120" />-->
+<!--          <el-table-column prop="jobNumber" label="工号" min-width="120" />-->
+<!--          <el-table-column prop="name" label="姓名" min-width="120" />-->
+<!--          <el-table-column prop="faceImg" label="人脸图片" min-width="200" />-->
+<!--          <el-table-column label="操作" width="160">-->
+<!--            <template slot-scope="scope">-->
+<!--              <el-button type="text" size="small" @click="openEditDialog('face', scope.$index, scope.row)">修改</el-button>-->
+<!--              <el-button type="text" size="small" style="color:#f56c6c" @click="removeRow('face', scope.$index)">删除</el-button>-->
+<!--            </template>-->
+<!--          </el-table-column>-->
+<!--        </el-table>-->
+<!--      </el-tab-pane>-->
+<!--    </el-tabs>-->
+
+<!--    &lt;!&ndash; 弹窗(新增/修改) &ndash;&gt;-->
+<!--    <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="600px">-->
+<!--      <el-form :model="form" ref="dataForm" :rules="rules" label-width="120px">-->
+<!--        &lt;!&ndash; 通用字段 &ndash;&gt;-->
+<!--        <el-form-item label="人员ID" prop="personId">-->
+<!--          <el-input v-model="form.personId" placeholder="自动生成或输入" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="工号" prop="jobNumber">-->
+<!--          <el-input v-model="form.jobNumber" placeholder="请输入工号(可为空)" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="姓名" prop="name">-->
+<!--          <el-input v-model="form.name" placeholder="请输入姓名" />-->
+<!--        </el-form-item>-->
+
+<!--        &lt;!&ndash; 仅人员管理用 &ndash;&gt;-->
+<!--        <template v-if="currentType === 'staff'">-->
+<!--          <el-form-item label="是否长期有效" prop="longTerm">-->
+<!--            <el-select v-model="form.longTerm" placeholder="请选择">-->
+<!--              <el-option label="是" value="是" />-->
+<!--              <el-option label="否" value="否" />-->
+<!--            </el-select>-->
+<!--          </el-form-item>-->
+<!--          <el-form-item label="有效期" prop="validPeriod" v-if="form.longTerm === '否'">-->
+<!--            <el-date-picker v-model="form.validPeriod" type="datetime" placeholder="选择有效期" style="width:100%" />-->
+<!--          </el-form-item>-->
+<!--          <el-form-item label="门权限" prop="doorPermission">-->
+<!--            <el-input v-model="form.doorPermission" placeholder="请输入门权限ID列表" />-->
+<!--          </el-form-item>-->
+<!--          <el-form-item label="计划模板编号" prop="planTemplateId">-->
+<!--            <el-input v-model="form.planTemplateId" placeholder="请输入计划模板编号" />-->
+<!--          </el-form-item>-->
+<!--          <el-form-item label="认证方式" prop="authMethod">-->
+<!--            <el-select v-model="form.authMethod" placeholder="请选择认证方式">-->
+<!--              <el-option label="人脸" value="人脸" />-->
+<!--              <el-option label="指纹" value="指纹" />-->
+<!--              <el-option label="密码" value="密码" />-->
+<!--              <el-option label="卡片" value="卡片" />-->
+<!--            </el-select>-->
+<!--          </el-form-item>-->
+<!--        </template>-->
+
+<!--        &lt;!&ndash; 仅人脸管理用 &ndash;&gt;-->
+<!--        <template v-if="currentType === 'face'">-->
+<!--          <el-form-item label="人脸图片" prop="faceImg">-->
+<!--            <el-input v-model="form.faceImg" placeholder="请输入人脸图片路径/URL" />-->
+<!--          </el-form-item>-->
+<!--        </template>-->
+<!--      </el-form>-->
+
+<!--      <div slot="footer" class="dialog-footer">-->
+<!--        <el-button @click="dialogVisible = false">取 消</el-button>-->
+<!--        <el-button type="primary" @click="submitForm">确 定</el-button>-->
+<!--      </div>-->
+<!--    </el-dialog>-->
+<!--  </div>-->
+<!--</template>-->
+
+
+
+<!--<script>-->
+
+<!--import {-->
+<!--  listBdglVisit,-->
+<!--  getBdglVisit,-->
+<!--  delBdglVisit,-->
+<!--  addBdglVisit,-->
+<!--  updateBdglVisit,-->
+<!--  exportBdglVisit,-->
+<!--  deptUser,-->
+<!--  addPeople,-->
+<!--  listPeople-->
+<!--} from "@/api/doormanManage/bdglVisit";-->
+
+<!--export default {-->
+<!--  name: 'DeviceDetail',-->
+<!--  data() {-->
+<!--    return {-->
+<!--      activeTab: 'staff',-->
+<!--      dialogVisible: false,-->
+<!--      dialogTitle: '',-->
+<!--      editIndex: -1,-->
+<!--      currentType: '', // staff 或 face-->
+<!--      peopleList: [],-->
+<!--      faceList: [],-->
+<!--      form: {-->
+<!--        personId: '',-->
+<!--        jobNumber: '',-->
+<!--        name: '',-->
+<!--        longTerm: '否',-->
+<!--        validPeriod: '',-->
+<!--        doorPermission: '',-->
+<!--        planTemplateId: '',-->
+<!--        authMethod: '',-->
+<!--        faceImg: ''-->
+<!--      },-->
+<!--      rules: {-->
+<!--        name: [{ required: true, message: '请输入姓名', trigger: 'blur' }]-->
+<!--      }-->
+<!--    }-->
+<!--  },-->
+<!--  methods: {-->
+
+<!--    openAddDialog(type) {-->
+<!--      this.currentType = type-->
+<!--      this.editIndex = -1-->
+<!--      this.dialogTitle = type === 'staff' ? '新增人员' : '新增人脸信息'-->
+<!--      this.resetForm()-->
+<!--      this.dialogVisible = true-->
+<!--    },-->
+<!--    openEditDialog(type, index, row) {-->
+<!--      this.currentType = type-->
+<!--      this.editIndex = index-->
+<!--      this.dialogTitle = type === 'staff' ? '修改人员' : '修改人脸信息'-->
+<!--      this.form = Object.assign({}, row)-->
+<!--      this.dialogVisible = true-->
+<!--    },-->
+<!--    removeRow(type, index) {-->
+<!--      this.$confirm('确定删除该记录吗?', '提示', {-->
+<!--        type: 'warning'-->
+<!--      }).then(() => {-->
+<!--        if (type === 'staff') this.peopleList.splice(index, 1)-->
+<!--        else this.faceList.splice(index, 1)-->
+<!--        this.$message.success('删除成功')-->
+<!--      }).catch(() => {})-->
+<!--    },-->
+<!--    submitForm() {-->
+<!--      this.$refs.dataForm.validate(valid => {-->
+<!--        if (!valid) return-->
+
+<!--        if (this.currentType === 'staff') {-->
+<!--          if (this.editIndex > -1) {-->
+<!--            this.$axios.put('/person/update', this.form).then(() => {-->
+<!--              this.$message.success('人员修改成功')-->
+<!--              this.getPersonList()-->
+<!--            })-->
+<!--          } else {-->
+<!--            addPeople(this.form).then(() => {-->
+<!--              this.$message.success('人员信息新增成功')-->
+<!--              this.getPersonList()-->
+<!--            })-->
+<!--          }-->
+<!--        } else {-->
+<!--          if (this.editIndex > -1) {-->
+<!--            this.$axios.put('/face/update', this.form).then(() => {-->
+<!--              this.$message.success('人脸信息修改成功')-->
+<!--              this.getFaceList()-->
+<!--            })-->
+<!--          } else {-->
+<!--            console.log(this.form)-->
+<!--            addPeople(this.form).then(() => {-->
+<!--              this.$message.success('人脸信息新增成功')-->
+<!--              this.getFaceList()-->
+<!--            })-->
+<!--          }-->
+<!--        }-->
+<!--        this.dialogVisible = false-->
+<!--      })-->
+<!--    },-->
+<!--    resetForm() {-->
+<!--      this.form = {-->
+<!--        personId: '',-->
+<!--        jobNumber: '',-->
+<!--        name: '',-->
+<!--        longTerm: '否',-->
+<!--        validPeriod: '',-->
+<!--        doorPermission: '',-->
+<!--        planTemplateId: '',-->
+<!--        authMethod: '',-->
+<!--        faceImg: ''-->
+<!--      }-->
+<!--    },-->
+<!--    getPersonList() {-->
+<!--      listPeople().then(res => {-->
+<!--        this.peopleList = res-->
+<!--        console.log(res.data)-->
+<!--        this.$message.success('信息查询成功')-->
+<!--      }).catch(() => {-->
+<!--        this.$message.error('获取人员列表失败')-->
+<!--      })-->
+<!--    }-->
+
+<!--  },-->
+<!--  mounted() {-->
+<!--    this.getPersonList()-->
+<!--  }-->
+
+<!--}-->
+<!--</script>-->
+
+<!--<style scoped>-->
+<!--.device-detail { padding: 18px; background: #fff; border-radius: 6px; }-->
+<!--.tab-header { margin-bottom: 10px; }-->
+<!--.dialog-footer { text-align: right; }-->
+<!--</style>-->

+ 0 - 83
src/views/doormanManage/peopleManage/index.vue

@@ -1,83 +0,0 @@
-<template>
-  <div class="app-container">
-    <div style="margin-bottom:15px;">
-      <el-input v-model="searchKey" placeholder="输入姓名或ID搜索" style="width:200px;margin-right:10px;" />
-      <el-button type="primary" @click="search">搜索</el-button>
-      <el-button type="success" @click="openAddDialog">新增人员</el-button>
-    </div>
-
-    <el-table :data="filteredList">
-      <el-table-column prop="employeeNo" label="人员ID" min-width="120" />
-      <el-table-column prop="name" label="姓名" min-width="120" />
-      <el-table-column prop="dept" label="部门" min-width="150" />
-      <el-table-column prop="phone" label="电话" min-width="150" />
-      <el-table-column label="操作" min-width="200">
-        <template #default="scope">
-          <el-button size="mini" @click="openEditDialog(scope.row)">编辑</el-button>
-          <el-button size="mini" type="danger" @click="deletePerson(scope.row.employeeNo)">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <div style="margin-top:10px;">人员总数:{{ personList.length }}</div>
-
-    <!-- 新增/编辑对话框 -->
-    <el-dialog :visible.sync="dialogVisible" :title="isEdit?'编辑人员':'新增人员'">
-      <el-form :model="form" label-width="80px">
-        <el-form-item label="ID"><el-input v-model="form.employeeNo" /></el-form-item>
-        <el-form-item label="姓名"><el-input v-model="form.name" /></el-form-item>
-        <el-form-item label="部门"><el-input v-model="form.dept" /></el-form-item>
-        <el-form-item label="电话"><el-input v-model="form.phone" /></el-form-item>
-      </el-form>
-      <span slot="footer">
-        <el-button @click="dialogVisible=false">取消</el-button>
-        <el-button type="primary" @click="savePerson">保存</el-button>
-      </span>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-export default {
-  name: "Person",
-  data() {
-    return {
-      searchKey: "",
-      dialogVisible: false,
-      isEdit: false,
-      form: {},
-      personList: [
-        { employeeNo: "1001", name: "张三", dept: "研发部", phone: "13800000001" },
-        { employeeNo: "1002", name: "李四", dept: "人事部", phone: "13800000002" }
-      ]
-    }
-  },
-  computed: {
-    filteredList() {
-      if (!this.searchKey) return this.personList
-      return this.personList.filter(p =>
-        p.name.includes(this.searchKey) || p.employeeNo.includes(this.searchKey)
-      )
-    }
-  },
-  methods: {
-    search() { this.$message.success("搜索完成(模拟)") },
-    openAddDialog() { this.isEdit=false; this.form={}; this.dialogVisible=true },
-    openEditDialog(row) { this.isEdit=true; this.form={...row}; this.dialogVisible=true },
-    savePerson() {
-      if(this.isEdit){
-        let idx=this.personList.findIndex(p=>p.employeeNo===this.form.employeeNo)
-        this.personList.splice(idx,1,this.form)
-      } else {
-        this.personList.push({...this.form})
-      }
-      this.dialogVisible=false
-      this.$message.success("保存成功(模拟)")
-    },
-    deletePerson(id) {
-      this.personList=this.personList.filter(p=>p.employeeNo!==id)
-      this.$message.error("已删除 ID="+id)
-    }
-  }
-}
-</script>

+ 261 - 0
src/views/doormanManage/people_eventManage/index.vue

@@ -0,0 +1,261 @@
+<template>
+  <div class="event-page">
+    <!-- 左侧查询条件 -->
+    <div class="query-panel">
+      <el-form :model="queryForm" label-width="100px">
+        <el-form-item label="事件类型">
+          <el-select v-model="queryForm.eventType" placeholder="请选择事件类型">
+            <el-option label="全部" value="" />
+            <el-option label="门禁事件" value="access" />
+            <el-option label="报警事件" value="alarm" />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="主类型">
+          <el-select v-model="queryForm.mainType" placeholder="请选择主类型">
+            <el-option label="全部" value="" />
+            <el-option label="类型1" value="type1" />
+            <el-option label="类型2" value="type2" />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="次类型">
+          <el-select v-model="queryForm.subType" placeholder="请选择次类型">
+            <el-option label="全部" value="" />
+            <el-option label="子类型1" value="sub1" />
+            <el-option label="子类型2" value="sub2" />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="人员ID">
+          <el-input v-model="queryForm.personId" placeholder="请输入人员ID" />
+        </el-form-item>
+
+        <el-form-item label="工号">
+          <el-input v-model="queryForm.jobNumber" placeholder="请输入工号" />
+        </el-form-item>
+
+        <el-form-item label="姓名">
+          <el-input v-model="queryForm.name" placeholder="请输入姓名" />
+        </el-form-item>
+
+        <el-form-item label="开始时间">
+          <el-date-picker
+            v-model="queryForm.startTime"
+            type="datetime"
+            placeholder="选择开始时间"
+            style="width: 100%;"
+          />
+        </el-form-item>
+
+        <el-form-item label="结束时间">
+          <el-date-picker
+            v-model="queryForm.endTime"
+            type="datetime"
+            placeholder="选择结束时间"
+            style="width: 100%;"
+          />
+        </el-form-item>
+
+        <!-- 快捷按钮 -->
+        <div class="quick-btns">
+          <el-button @click="setQuickTime('yesterday')">昨天</el-button>
+          <el-button @click="setQuickTime('today')">今天</el-button>
+          <el-button @click="setQuickTime('month')">本月</el-button>
+        </div>
+
+        <!-- 搜索按钮 -->
+        <el-button type="primary" @click="fetchData" style="margin-top: 10px;">搜索</el-button>
+      </el-form>
+    </div>
+
+    <!-- 右侧表格 -->
+    <div class="table-panel">
+      <el-table
+        :data="tableData"
+        border
+        style="width: 100%;"
+      >
+        <el-table-column type="index" label="序号" width="60" />
+        <el-table-column prop="personId" label="人员id" width="120" />
+        <el-table-column prop="jobNumber" label="工号" width="120" />
+        <el-table-column prop="name" label="姓名" width="120" />
+        <el-table-column prop="cardNumber" label="卡号" width="120" />
+        <el-table-column prop="door" label="门" width="100" />
+        <el-table-column prop="eventType" label="事件类型" width="150" />
+        <el-table-column prop="eventTime" label="时间" width="180">
+          <template #default="scope">
+            {{ new Date(scope.row.eventTime).toLocaleString() }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="remoteHost" label="远程主机地址" width="160" />
+        <el-table-column prop="reader" label="读卡器" width="120" />
+        <el-table-column prop="detectorId" label="探测器ID" width="120" />
+        <el-table-column prop="operation" label="操作" min-width="120" />
+      </el-table>
+
+      <!-- 分页 -->
+      <div class="pagination">
+        <el-pagination
+          background
+          layout="total, prev, pager, next"
+          :total="total"
+          :page-size="queryForm.pageSize"
+          :current-page.sync="queryForm.pageNum"
+          @current-change="fetchData"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import request from "@/utils/request";
+
+export default {
+  name: "EventPage",
+  data() {
+    return {
+      queryForm: {
+        id: "",    //id
+        personId: "",   // 人员ID
+        jobNumber: "",  // 工号
+        name: "",
+        cardNumber: "",
+        door: "",
+        remoteHost: "",
+        reader: "",
+        detectorId: "",
+        operation: "",
+        eventType: "",
+        eventTime: "",
+        createTime: "",
+        startTime: "",
+        endTime: "",
+        pageNum: 1,
+        pageSize: 24
+      },
+      // private Long id;
+      // private String personId;     // 人员ID
+      // private String jobNumber;    // 工号
+      // private String name;         // 姓名
+      // private String cardNumber;   // 卡号
+      // private String door;         // 门
+      // private String remoteHost;   // 远程主机地址
+      // private String reader;       // 读卡器
+      // private String detectorId;   // 探测器ID
+      // private String operation;    // 操作
+      // private String eventType;    // 事件类型
+      // private LocalDateTime eventTime;  // 事件发生时间
+      // private LocalDateTime createTime; // 记录创建时间
+      tableData: [],
+      total: 0
+    }
+  },
+  created() {
+    // 页面加载时自动拉取第一页数据
+    this.fetchData()
+  },
+  methods: {
+    formatDateTime(date) {
+      if (!date) return ""
+      const d = new Date(date)
+      const pad = n => (n < 10 ? "0" + n : n)
+      return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ` +
+        `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`
+    },
+    fetchData() {
+      const params = {
+        ...this.queryForm,
+        startTime: this.formatDateTime(this.queryForm.startTime),
+        endTime: this.formatDateTime(this.queryForm.endTime)
+      }
+        request({
+          url: "/event/list",
+          method: "get",
+          params: this.queryForm
+        }).then(res => {
+          this.tableData = res.records || []
+          console.log("数据",res)
+          // console.log("总条数",res.total)
+          this.total = res.total || 0
+        })
+
+
+    },
+    // setQuickTime(type) {
+    //   const now = new Date()
+    //   if (type === "today") {
+    //     this.queryForm.startTime = this.formatDateTime(now.setHours(0,0,0,0))
+    //     this.queryForm.endTime = new Date()
+    //   } else if (type === "yesterday") {
+    //     const y = new Date()
+    //     y.setDate(y.getDate() - 1)
+    //     this.queryForm.startTime = new Date(y.setHours(0,0,0,0))
+    //     this.queryForm.endTime = new Date(y.setHours(23,59,59,999))
+    //   } else if (type === "month") {
+    //     const first = new Date(now.getFullYear(), now.getMonth(), 1)
+    //     this.queryForm.startTime = first
+    //     this.queryForm.endTime = new Date()
+    //   }
+    // }
+    setQuickTime(option) {
+      const now = new Date()
+      let start, end
+
+      switch(option) {
+        case 'today':
+          start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0)
+          end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59)
+          break
+        case 'yesterday':
+          const yesterday = new Date(now)
+          yesterday.setDate(now.getDate() - 1)
+          start = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate(), 0, 0, 0)
+          end = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate(), 23, 59, 59)
+          break
+        case 'thisWeek':
+          const dayOfWeek = now.getDay() || 7 // 周日为7
+          start = new Date(now.getFullYear(), now.getMonth(), now.getDate() - dayOfWeek + 1, 0, 0, 0)
+          end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59)
+          break
+        case 'thisMonth':
+          start = new Date(now.getFullYear(), now.getMonth(), 1, 0, 0, 0)
+          end = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59)
+          break
+        default:
+          start = ''
+          end = ''
+      }
+
+      this.queryForm.startTime = this.formatDateTime(start)
+      this.queryForm.endTime = this.formatDateTime(end)
+    }
+  }
+}
+</script>
+
+<style scoped>
+.event-page {
+  display: flex;
+  padding: 10px;
+}
+.query-panel {
+  width: 280px;
+  padding: 10px;
+  border-right: 1px solid #ddd;
+}
+.table-panel {
+  flex: 1;
+  padding: 10px;
+}
+.quick-btns {
+  display: flex;
+  gap: 6px;
+  margin: 6px 0;
+}
+.pagination {
+  margin-top: 10px;
+  text-align: right;
+}
+</style>

+ 25 - 31
src/views/grassrootsregistration/bdglweekwork/index.vue

@@ -796,38 +796,32 @@ export default {
           }
           }
         });
         });
       }
       }
-      var date1 = Math.round(new Date(val) / 1000);
-      // 当月时间
-      this.current_month.forEach((element) => {
-        // 十号之前是1675987200
-        var date2 = Math.round(new Date(element) / 1000);
-        if (date1 > 1675987200 && this.dayTime == 1) {
-          this.$confirm("请在规定时间内填写", "提示", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
-            type: "warning",
-          })
-            .then(() => {
-              this.form.startTime = null;
-            })
-            .catch(() => {
-              this.form.startTime = null;
-            });
-        }
-        if (date1 < 1672501850 && this.dayTime == 1) {
-          this.$confirm("请在规定时间内填写", "提示", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
-            type: "warning",
+
+      // 选择的时间戳
+      var date1 = Math.round(new Date(val).getTime() / 1000);
+
+      // 获取当月的第一天和最后一天
+      let now = new Date(val); // 用传入的 val 来确定月份
+      let firstDay = new Date(now.getFullYear(), now.getMonth(), 1, 0, 0, 0);
+      let lastDay = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59);
+
+      let startTimestamp = Math.round(firstDay.getTime() / 1000);
+      let endTimestamp = Math.round(lastDay.getTime() / 1000);
+
+      // 限制范围
+      if ((date1 < startTimestamp || date1 > endTimestamp) && this.dayTime == 1) {
+        this.$confirm("请在当月规定时间内填写", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            this.form.startTime = null;
           })
           })
-            .then(() => {
-              this.form.startTime = null;
-            })
-            .catch(() => {
-              this.form.startTime = null;
-            });
-        }
-      });
+          .catch(() => {
+            this.form.startTime = null;
+          });
+      }
     },
     },
     // 结束时间触发
     // 结束时间触发
     endTimes() {
     endTimes() {

+ 142 - 0
src/views/materialManagement/chartdisplay/index.vue

@@ -0,0 +1,142 @@
+<template>
+  <div class="material-dashboard app-container">
+    <!-- 标题 -->
+    <h2 style="margin-bottom: 20px;">物资数量概览</h2>
+
+    <!-- 库存统计卡片 -->
+    <div class="stats">
+      <el-card v-for="item in materials" :key="item.name" class="stat-card" shadow="hover">
+        <div class="title">{{ item.name }}</div>
+        <div class="count" :class="{ low: item.count < 20 }">{{ item.count }}</div>
+        <div class="status" v-if="item.count < 20">⚠ 库存不足,请及时补充</div>
+      </el-card>
+    </div>
+
+    <!-- 柱状图展示 -->
+    <el-card style="margin-top: 30px;" shadow="always">
+      <div slot="header">物资数量分布</div>
+      <div id="materialChart" style="height: 400px;"></div>
+    </el-card>
+
+    <!-- 折线图展示 -->
+    <el-card style="margin-top: 30px;" shadow="always">
+      <div slot="header">近7天物资消耗趋势</div>
+      <div id="trendChart" style="height: 400px;"></div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import * as echarts from "echarts";
+
+export default {
+  name: "MaterialDashboard",
+  data() {
+    return {
+      // 库存死数据
+      materials: [
+        { name: "武器", count: 35 },
+        { name: "弹药", count: 12 }, // 库存不足
+        { name: "装备", count: 50 },
+        { name: "物资", count: 18 }, // 库存不足
+        { name: "其他", count: 42 },
+      ],
+      // 近7天消耗死数据
+      trendData: {
+        dates: ["8-28", "8-29", "8-30", "8-31", "9-1", "9-2", "9-3"],
+        武器: [5, 3, 6, 2, 4, 5, 3],
+        弹药: [10, 8, 12, 6, 7, 11, 9],
+        装备: [2, 1, 3, 2, 1, 2, 2],
+        物资: [7, 6, 8, 5, 9, 7, 8],
+        其他: [3, 4, 2, 5, 3, 4, 3],
+      },
+    };
+  },
+  mounted() {
+    this.initChart();
+    this.initTrendChart();
+  },
+  methods: {
+    // 柱状图
+    initChart() {
+      const chart = echarts.init(document.getElementById("materialChart"));
+      chart.setOption({
+        tooltip: { trigger: "axis" },
+        xAxis: {
+          type: "category",
+          data: this.materials.map((m) => m.name),
+        },
+        yAxis: { type: "value" },
+        series: [
+          {
+            name: "数量",
+            type: "bar",
+            data: this.materials.map((m) => m.count),
+            itemStyle: {
+              color: (params) => {
+                return params.data < 20 ? "#ff4d4f" : "#1890ff"; // 库存不足显示红色
+              },
+            },
+          },
+        ],
+      });
+    },
+    // 折线图
+    initTrendChart() {
+      const chart = echarts.init(document.getElementById("trendChart"));
+      chart.setOption({
+        tooltip: { trigger: "axis" },
+        legend: { data: Object.keys(this.trendData).filter((k) => k !== "dates") },
+        xAxis: {
+          type: "category",
+          data: this.trendData.dates,
+        },
+        yAxis: { type: "value" },
+        series: Object.keys(this.trendData)
+          .filter((k) => k !== "dates")
+          .map((key) => ({
+            name: key,
+            type: "line",
+            smooth: true,
+            data: this.trendData[key],
+          })),
+      });
+    },
+  },
+};
+</script>
+
+<style scoped>
+.stats {
+  display: flex;
+  gap: 20px;
+  flex-wrap: wrap;
+}
+
+.stat-card {
+  width: 200px;
+  text-align: center;
+  padding: 15px;
+}
+
+.stat-card .title {
+  font-size: 18px;
+  margin-bottom: 10px;
+}
+
+.stat-card .count {
+  font-size: 32px;
+  font-weight: bold;
+  color: #1890ff;
+}
+
+.stat-card .count.low {
+  color: #ff4d4f;
+}
+
+.stat-card .status {
+  margin-top: 5px;
+  color: #ff4d4f;
+  font-size: 14px;
+}
+</style>

+ 1 - 1
src/views/medicalhealth/examine2/index.vue

@@ -138,7 +138,7 @@
             size="btp"
             size="btp"
             type="text"
             type="text"
             @click="tijiann(scope.row)"
             @click="tijiann(scope.row)"
-            v-hasPermi="['peopleManage:people:Examinationedit']"
+            v-hasPermi="['deviceManage:people:Examinationedit']"
           >体检完成</el-button>
           >体检完成</el-button>
           <!-- <el-button
           <!-- <el-button
             size="btp"
             size="btp"

+ 6 - 6
src/views/peopleManage/examination/index.vue

@@ -32,7 +32,7 @@
           icon="el-icon-plus"
           icon="el-icon-plus"
           size="mini"
           size="mini"
           @click="handleAdd"
           @click="handleAdd"
-          v-hasPermi="['peopleManage:examination:add']"
+          v-hasPermi="['deviceManage:examination:add']"
           >新增</el-button
           >新增</el-button
         >
         >
       </el-col>
       </el-col>
@@ -44,7 +44,7 @@
           size="mini"
           size="mini"
           :disabled="single"
           :disabled="single"
           @click="handleUpdate"
           @click="handleUpdate"
-          v-hasPermi="['peopleManage:examination:edit']"
+          v-hasPermi="['deviceManage:examination:edit']"
           >修改</el-button
           >修改</el-button
         >
         >
       </el-col> -->
       </el-col> -->
@@ -56,7 +56,7 @@
           size="mini"
           size="mini"
           :disabled="multiple"
           :disabled="multiple"
           @click="handleDelete"
           @click="handleDelete"
-          v-hasPermi="['peopleManage:examination:remove']"
+          v-hasPermi="['deviceManage:examination:remove']"
           >删除</el-button
           >删除</el-button
         >
         >
       </el-col>
       </el-col>
@@ -68,7 +68,7 @@
           size="mini"
           size="mini"
           :loading="exportLoading"
           :loading="exportLoading"
           @click="handleExport"
           @click="handleExport"
-          v-hasPermi="['peopleManage:examination:export']"
+          v-hasPermi="['deviceManage:examination:export']"
         >导出</el-button>
         >导出</el-button>
       </el-col> -->
       </el-col> -->
       <!-- <right-toolbar
       <!-- <right-toolbar
@@ -133,14 +133,14 @@
             size="btu"
             size="btu"
             type="text"
             type="text"
             @click="handleUpdate(scope.row)"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['peopleManage:examination:edit']"
+            v-hasPermi="['deviceManage:examination:edit']"
             >修改</el-button
             >修改</el-button
           >
           >
           <el-button
           <el-button
             size="btd"
             size="btd"
             type="text"
             type="text"
             @click="handleDelete(scope.row)"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['peopleManage:examination:remove']"
+            v-hasPermi="['deviceManage:examination:remove']"
             >删除</el-button
             >删除</el-button
           >
           >
         </template>
         </template>

+ 7 - 7
src/views/peopleManage/people/index.vue

@@ -489,7 +489,7 @@
               icon="el-icon-plus"
               icon="el-icon-plus"
               size="mini"
               size="mini"
               @click="handleAdd"
               @click="handleAdd"
-              v-hasPermi="['peopleManage:people:add']"
+              v-hasPermi="['deviceManage:people:add']"
             >新增</el-button>
             >新增</el-button>
           </el-col>
           </el-col>
           <!-- <el-col :span="1.5">
           <!-- <el-col :span="1.5">
@@ -500,7 +500,7 @@
               size="mini"
               size="mini"
               :disabled="single"
               :disabled="single"
               @click="handleUpdate"
               @click="handleUpdate"
-              v-hasPermi="['peopleManage:people:edit']"
+              v-hasPermi="['deviceManage:people:edit']"
               >修改</el-button
               >修改</el-button
             >
             >
           </el-col>-->
           </el-col>-->
@@ -512,7 +512,7 @@
               size="mini"
               size="mini"
               :disabled="multiple"
               :disabled="multiple"
               @click="handleDelete"
               @click="handleDelete"
-              v-hasPermi="['peopleManage:people:remove']"
+              v-hasPermi="['deviceManage:people:remove']"
             >删除</el-button>
             >删除</el-button>
           </el-col>
           </el-col>
           <el-col :span="1.5">
           <el-col :span="1.5">
@@ -523,7 +523,7 @@
               size="mini"
               size="mini"
               :loading="exportLoading"
               :loading="exportLoading"
               @click="handleExport"
               @click="handleExport"
-              v-hasPermi="['peopleManage:people:export']"
+              v-hasPermi="['deviceManage:people:export']"
             >导出</el-button>
             >导出</el-button>
           </el-col>
           </el-col>
           <!-- <right-toolbar
           <!-- <right-toolbar
@@ -584,19 +584,19 @@
                 size="btu"
                 size="btu"
                 type="text"
                 type="text"
                 @click="handleUpdate(scope.row)"
                 @click="handleUpdate(scope.row)"
-                v-hasPermi="['peopleManage:people:edit']"
+                v-hasPermi="['deviceManage:people:edit']"
               >修改</el-button>
               >修改</el-button>
               <el-button
               <el-button
                 size="btk"
                 size="btk"
                 type="text"
                 type="text"
                 @click="handlesee(scope.row)"
                 @click="handlesee(scope.row)"
-                v-hasPermi="['peopleManage:people:query']"
+                v-hasPermi="['deviceManage:people:query']"
               >查看</el-button>
               >查看</el-button>
               <el-button
               <el-button
                 size="btd"
                 size="btd"
                 type="text"
                 type="text"
                 @click="handleDelete(scope.row)"
                 @click="handleDelete(scope.row)"
-                v-hasPermi="['peopleManage:people:remove']"
+                v-hasPermi="['deviceManage:people:remove']"
               >删除</el-button>
               >删除</el-button>
             </template>
             </template>
           </el-table-column>
           </el-table-column>

+ 3 - 4
src/views/peopleManage/seconded/index.vue

@@ -29,7 +29,7 @@
           icon="el-icon-plus"
           icon="el-icon-plus"
           size="mini"
           size="mini"
           @click="handleAdd"
           @click="handleAdd"
-          v-hasPermi="['peopleManage:transfer:add']"
+          v-hasPermi="['deviceManage:transfer:add']"
           >调出</el-button
           >调出</el-button
         >
         >
       </el-col>
       </el-col>
@@ -67,13 +67,13 @@
           <el-button
           <el-button
             size="btk"
             size="btk"
             @click="handleUpdate(scope.row)"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['peopleManage:recall:edit']"
+            v-hasPermi="['deviceManage:recall:edit']"
             >审核</el-button
             >审核</el-button
           >
           >
           <el-button
           <el-button
             size="btd"
             size="btd"
             @click="handleDelete(scope.row)"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['peopleManage:recall:remove']"
+            v-hasPermi="['deviceManage:recall:remove']"
             >删除</el-button
             >删除</el-button
           >
           >
         </template>
         </template>
@@ -702,4 +702,3 @@ export default {
   border-color: #13ce66;
   border-color: #13ce66;
 }
 }
 </style>
 </style>
-  

+ 12 - 6
src/views/peopleManage/transfer/index.vue

@@ -74,7 +74,7 @@
           icon="el-icon-plus"
           icon="el-icon-plus"
           size="mini"
           size="mini"
           @click="handleAdd"
           @click="handleAdd"
-          v-hasPermi="['peopleManage:transfer:add']"
+          v-hasPermi="['deviceManage:transfer:add']"
           >新增</el-button
           >新增</el-button
         >
         >
       </el-col>
       </el-col>
@@ -86,7 +86,7 @@
           size="mini"
           size="mini"
           :disabled="single"
           :disabled="single"
           @click="handleUpdate"
           @click="handleUpdate"
-          v-hasPermi="['peopleManage:transfer:edit']"
+          v-hasPermi="['deviceManage:transfer:edit']"
           >修改</el-button
           >修改</el-button
         >
         >
       </el-col> -->
       </el-col> -->
@@ -98,7 +98,7 @@
           size="mini"
           size="mini"
           :disabled="multiple"
           :disabled="multiple"
           @click="handleDelete"
           @click="handleDelete"
-          v-hasPermi="['peopleManage:transfer:remove']"
+          v-hasPermi="['deviceManage:transfer:remove']"
           >删除</el-button
           >删除</el-button
         >
         >
       </el-col>
       </el-col>
@@ -110,7 +110,7 @@
           size="mini"
           size="mini"
           :loading="exportLoading"
           :loading="exportLoading"
           @click="handleExport"
           @click="handleExport"
-          v-hasPermi="['peopleManage:transfer:export']"
+          v-hasPermi="['deviceManage:transfer:export']"
           >导出</el-button
           >导出</el-button
         >
         >
       </el-col> -->
       </el-col> -->
@@ -176,6 +176,12 @@
         prop="unit2"
         prop="unit2"
         :formatter="unit2Format"
         :formatter="unit2Format"
       />
       />
+      <el-table-column
+        label="调动后部职别"
+        align="center"
+        prop="unit2"
+        :formatter="unit2Format"
+      />
       <!-- <el-table-column label="调动后部职别" align="center" prop="aduty" /> -->
       <!-- <el-table-column label="调动后部职别" align="center" prop="aduty" /> -->
       <el-table-column
       <el-table-column
         label="操作"
         label="操作"
@@ -186,13 +192,13 @@
           <el-button
           <el-button
             size="btu"
             size="btu"
             @click="handleUpdate(scope.row)"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['peopleManage:transfer:edit']"
+            v-hasPermi="['deviceManage:transfer:edit']"
             >修改</el-button
             >修改</el-button
           >
           >
           <el-button
           <el-button
             size="btd"
             size="btd"
             @click="handleDelete(scope.row)"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['peopleManage:transfer:remove']"
+            v-hasPermi="['deviceManage:transfer:remove']"
             >删除</el-button
             >删除</el-button
           >
           >
         </template>
         </template>

+ 6 - 6
src/views/peopleManage/typestatistics/index.vue

@@ -9,7 +9,7 @@
           icon="el-icon-plus"
           icon="el-icon-plus"
           size="mini"
           size="mini"
           @click="handleAdd"
           @click="handleAdd"
-          v-hasPermi="['peopleManage:typestatistics:add']"
+          v-hasPermi="['deviceManage:typestatistics:add']"
           >新增</el-button
           >新增</el-button
         >
         >
       </el-col>
       </el-col>
@@ -21,7 +21,7 @@
           size="mini"
           size="mini"
           :disabled="single"
           :disabled="single"
           @click="handleUpdate"
           @click="handleUpdate"
-          v-hasPermi="['peopleManage:typestatistics:edit']"
+          v-hasPermi="['deviceManage:typestatistics:edit']"
           >修改</el-button
           >修改</el-button
         >
         >
       </el-col> -->
       </el-col> -->
@@ -33,7 +33,7 @@
           size="mini"
           size="mini"
           :disabled="multiple"
           :disabled="multiple"
           @click="handleDelete"
           @click="handleDelete"
-          v-hasPermi="['peopleManage:typestatistics:remove']"
+          v-hasPermi="['deviceManage:typestatistics:remove']"
           >删除</el-button
           >删除</el-button
         >
         >
       </el-col>
       </el-col>
@@ -44,7 +44,7 @@
           icon="el-icon-download"
           icon="el-icon-download"
           size="mini"
           size="mini"
           @click="handleExport"
           @click="handleExport"
-          v-hasPermi="['peopleManage:typestatistics:export']"
+          v-hasPermi="['deviceManage:typestatistics:export']"
           >导出</el-button
           >导出</el-button
         >
         >
       </el-col> -->
       </el-col> -->
@@ -112,14 +112,14 @@
           size="btu"
           size="btu"
             type="text"
             type="text"
             @click="handleUpdate(scope.row)"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['peopleManage:typestatistics:edit']"
+            v-hasPermi="['deviceManage:typestatistics:edit']"
             >修改</el-button
             >修改</el-button
           >
           >
           <el-button
           <el-button
           size="btd"
           size="btd"
           type="text"
           type="text"
             @click="handleDelete(scope.row)"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['peopleManage:typestatistics:remove']"
+            v-hasPermi="['deviceManage:typestatistics:remove']"
             >删除</el-button
             >删除</el-button
           >
           >
         </template>
         </template>

+ 37 - 1
src/views/pt.vue

@@ -243,10 +243,32 @@
             class="ul"
             class="ul"
             v-if="
             v-if="
               str.includes('admin') ||
               str.includes('admin') ||
+              str.includes('安全风险预警') ||
+              str.includes('门岗demo') ||
               str.includes('思想政治') ||
               str.includes('思想政治') ||
               str.includes('人力资源')
               str.includes('人力资源')
             "
             "
           >
           >
+            <li v-if="str.includes('安全风险预警') || str.includes('admin')">
+              <div class="demo-box">
+                <div class="demo active" v-on:click="safetyfun" data-url="/diary?ref=addtabs">
+                  <img src="../images/sx.png" alt />
+                </div>
+              </div>
+              <div class="demo-a">
+                <a href="#" class="a">安全风险预警</a>
+              </div>
+            </li>
+            <li v-if="str.includes('门岗demo') || str.includes('admin')">
+              <div class="demo-box">
+                <div class="demo active" v-on:click="mengangdemofun" data-url="/diary?ref=addtabs">
+                  <img src="../images/sx.png" alt />
+                </div>
+              </div>
+              <div class="demo-a">
+                <a href="#" class="a">门岗demo</a>
+              </div>
+            </li>
             <li v-if="str.includes('思想政治') || str.includes('admin')">
             <li v-if="str.includes('思想政治') || str.includes('admin')">
               <div class="demo-box">
               <div class="demo-box">
                 <div class="demo active" v-on:click="sixiangfun" data-url="/diary?ref=addtabs">
                 <div class="demo active" v-on:click="sixiangfun" data-url="/diary?ref=addtabs">
@@ -288,6 +310,8 @@
               alt
               alt
               v-if="
               v-if="
                 str.includes('admin') ||
                 str.includes('admin') ||
+                str.includes('安全风险预警') ||
+                str.includes('门岗demo') ||
                 str.includes('思想政治') ||
                 str.includes('思想政治') ||
                 str.includes('人力资源')
                 str.includes('人力资源')
               "
               "
@@ -879,9 +903,21 @@ export default {
         .catch(() => {});
         .catch(() => {});
       Cookies.set("shuaxin", "false");
       Cookies.set("shuaxin", "false");
     },
     },
+    safetyfun() {
+      this.$router
+        .push({ path: "/index", query: { name: "/safety" } })
+        .catch(() => {});
+      Cookies.set("shuaxin", "false");
+    },
+    mengangdemofun() {
+      this.$router
+        .push({ path: "/index", query: { name: "/demo" } })
+        .catch(() => {});
+      Cookies.set("shuaxin", "false");
+    },
     renlifun() {
     renlifun() {
       this.$router
       this.$router
-        .push({ path: "/index", query: { name: "/peopleManage" } })
+        .push({ path: "/index", query: { name: "/deviceManage" } })
         .catch(() => {});
         .catch(() => {});
       Cookies.set("shuaxin", "false");
       Cookies.set("shuaxin", "false");
     },
     },

+ 2 - 2
vue.config.js

@@ -6,7 +6,7 @@ function resolve(dir) {
 
 
 const name = process.env.VUE_APP_TITLE || '智能督察管理平台' // 网页标题
 const name = process.env.VUE_APP_TITLE || '智能督察管理平台' // 网页标题
 
 
-const port = process.env.port || process.env.npm_config_port || 8001 // 端口
+const port = process.env.port || process.env.npm_config_port || 8666 // 端口
 
 
 // vue.config.js 配置说明
 // vue.config.js 配置说明
 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
@@ -33,7 +33,7 @@ module.exports = {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
       [process.env.VUE_APP_BASE_API]: {
         // target: `http://172.4.5.235:8089`,
         // target: `http://172.4.5.235:8089`,
-        target: `http://localhost:8099`,
+        target: `http://localhost:8090`,
         // target: `http://192.168.5.17/prod-api`,
         // target: `http://192.168.5.17/prod-api`,
         changeOrigin: true,
         changeOrigin: true,
         pathRewrite: {
         pathRewrite: {

Some files were not shown because too many files changed in this diff