From 073605b6d62363dd7d48f5ca047a1d401418574a Mon Sep 17 00:00:00 2001
From: zzw <228544128@qq.com>
Date: 星期日, 04 十月 2026 17:34:06 +0800
Subject: [PATCH] docs: record 2026-10-04 integration commit

---
 emergency-repair-web/src/views/system/LoginLogManage.vue |   96 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 96 insertions(+), 0 deletions(-)

diff --git a/emergency-repair-web/src/views/system/LoginLogManage.vue b/emergency-repair-web/src/views/system/LoginLogManage.vue
new file mode 100644
index 0000000..cbbd963
--- /dev/null
+++ b/emergency-repair-web/src/views/system/LoginLogManage.vue
@@ -0,0 +1,96 @@
+<template>
+  <div class="page">
+    <div class="page-title">
+      <div><h2>鐧诲綍鏃ュ織</h2><p>璁板綍姣忔鐧诲綍灏濊瘯鐨勭敤鎴枫�佹潵婧愬湴鍧�銆佺粨鏋滃拰鏃堕棿</p></div>
+    </div>
+    <div class="table-panel">
+      <div class="toolbar">
+        <el-input v-model="filters.keyword" clearable placeholder="璐︽埛鍚� / 濮撳悕" style="width:200px" @keyup.enter.native="search"></el-input>
+        <el-select v-model="filters.status" clearable placeholder="鐧诲綍缁撴灉" style="width:140px">
+          <el-option label="鎴愬姛" value="SUCCESS"></el-option>
+          <el-option label="澶辫触" value="FAIL"></el-option>
+        </el-select>
+        <el-date-picker
+          v-model="filters.dates"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+          style="width:260px"
+        ></el-date-picker>
+        <el-button type="primary" icon="el-icon-search" v-permission="'system:login-logs:query'" @click="search">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh-left" @click="reset">閲嶇疆</el-button>
+      </div>
+      <el-table v-loading="loading" :data="rows" border stripe height="calc(100vh - 250px)">
+        <el-table-column prop="loginTime" label="鐧诲綍鏃堕棿" width="180"></el-table-column>
+        <el-table-column prop="userName" label="璐︽埛鍚�" min-width="140"></el-table-column>
+        <el-table-column prop="nickName" label="濮撳悕" min-width="140"></el-table-column>
+        <el-table-column prop="deptName" label="鎵�灞為儴闂�" min-width="180" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="loginIp" label="鐧诲綍IP" min-width="150"></el-table-column>
+        <el-table-column label="缁撴灉" width="90" align="center">
+          <template slot-scope="{ row }">
+            <el-tag size="mini" :type="row.status === 'SUCCESS' ? 'success' : 'danger'">{{ row.status === 'SUCCESS' ? '鎴愬姛' : '澶辫触' }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="message" label="璇存槑" min-width="180" show-overflow-tooltip></el-table-column>
+      </el-table>
+      <el-pagination
+        class="pager"
+        background
+        layout="total, sizes, prev, pager, next"
+        :total="total"
+        :current-page="current"
+        :page-size="size"
+        :page-sizes="[20, 50, 100]"
+        @current-change="handleCurrentChange"
+        @size-change="handleSizeChange"
+      ></el-pagination>
+    </div>
+  </div>
+</template>
+<script>
+import api from '@/api'
+export default {
+  name: 'LoginLogManage',
+  data() {
+    return {
+      rows: [],
+      total: 0,
+      current: 1,
+      size: 20,
+      loading: false,
+      filters: { keyword: '', status: '', dates: [] }
+    }
+  },
+  created() { this.load() },
+  methods: {
+    load() {
+      this.loading = true
+      const dates = this.filters.dates || []
+      api.get('/system/login-logs', {
+        params: {
+          keyword: this.filters.keyword || undefined,
+          status: this.filters.status || undefined,
+          startDate: dates[0] || undefined,
+          endDate: dates[1] || undefined,
+          current: this.current,
+          size: this.size
+        }
+      }).then(res => {
+        const data = res.data || {}
+        this.rows = data.records || []
+        this.total = data.total || 0
+      }).finally(() => { this.loading = false })
+    },
+    search() { this.current = 1; this.load() },
+    reset() { this.filters = { keyword: '', status: '', dates: [] }; this.search() },
+    handleCurrentChange(page) { this.current = page; this.load() },
+    handleSizeChange(size) { this.size = size; this.current = 1; this.load() }
+  }
+}
+</script>
+<style scoped>
+.toolbar { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
+.pager { margin-top: 12px; text-align: right; }
+</style>

--
Gitblit v1.9.1