From 2bd663b4488808814ea07685f527fc2eb51e5bfe Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期五, 28 八月 2026 17:36:13 +0800
Subject: [PATCH] fix: 菜单/布局统一——企业解释重复 components 键导致 app-header 未注册;规则管理/用户管理改为统一上下布局(顶部系统栏+登出),移除菜单内失效的退出登录项

---
 traffic-audit-web/src/views/RuleManage.vue |  114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 112 insertions(+), 2 deletions(-)

diff --git a/traffic-audit-web/src/views/RuleManage.vue b/traffic-audit-web/src/views/RuleManage.vue
index 06ab9b4..ed091d7 100644
--- a/traffic-audit-web/src/views/RuleManage.vue
+++ b/traffic-audit-web/src/views/RuleManage.vue
@@ -1,2 +1,112 @@
-锘�<template><div>瑙勫垯绠$悊</div></template>
-<script>export default { name: 'RuleManage' }</script>
+<template>
+  <el-container direction="vertical">
+    <app-header title="浜ら�氱粺璁℃姤琛ㄥ鏍哥郴缁� - 瑙勫垯绠$悊"></app-header>
+    <el-container>
+      <el-aside width="200px">
+        <el-menu router default-active="/rules">
+          <el-menu-item index="/dashboard">宸ヤ綔鍙�</el-menu-item>
+          <el-menu-item index="/import">鏁版嵁瀵煎叆</el-menu-item>
+          <el-menu-item index="/data">鏁版嵁鏌ョ湅</el-menu-item>
+          <el-menu-item index="/explain">浼佷笟瑙i噴</el-menu-item>
+          <el-menu-item index="/audit">瀹℃牳缁撴灉</el-menu-item>
+          <el-menu-item index="/report">鎶ヨ〃鐢熸垚</el-menu-item>
+          <el-menu-item index="/rules">瑙勫垯绠$悊</el-menu-item>
+          <el-menu-item index="/users">鐢ㄦ埛绠$悊</el-menu-item>
+        </el-menu>
+      </el-aside>
+      <el-main>
+        <h3>瀹℃牳瑙勫垯绠$悊</h3>
+        <el-form :inline="true">
+          <el-form-item label="鎶ヨ〃绫诲瀷">
+            <el-radio-group v-model="reportType" @change="loadRules">
+              <el-radio label="H2032">璐ц繍鏈堟姤</el-radio>
+              <el-radio label="H2031">鏃呭鏈堟姤</el-radio>
+              <el-radio label="CITY_BUS">鍩庡競鍏氦鏈堟姤</el-radio>
+              <el-radio label="CITY_TAXI">宸℃父鍑虹鏈堟姤</el-radio>
+              <el-radio label="INVEST">鎶曡祫鏈堟姤</el-radio>
+              <el-radio label="H204">鑳借�楀鎶�</el-radio>
+            
+            
+            
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="loadRules" :loading="loading">鍒锋柊</el-button>
+          </el-form-item>
+        </el-form>
+        <div class="table-area">
+        <el-table :data="rules" border v-loading="loading" size="small" style="width:100%" height="100%">
+          <el-table-column prop="ruleCode" label="瑙勫垯缂栫爜" width="120"></el-table-column>
+          <el-table-column prop="ruleName" label="瑙勫垯鍚嶇О" min-width="180"></el-table-column>
+          <el-table-column prop="description" label="瑙勫垯璇存槑" min-width="260" show-overflow-tooltip></el-table-column>
+          <el-table-column label="姣旇緝鏂瑰紡" width="130">
+            <template slot-scope="scope">{{ typeLabel(scope.row.compareType) }}</template>
+          </el-table-column>
+          <el-table-column label="闃堝��" width="130">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.threshold" size="mini" placeholder="闃堝��" @change="saveThreshold(scope.row)"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="绛夌骇" width="110">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.alertLevel" size="mini" @change="saveThreshold(scope.row)">
+                <el-option label="绾� (RED)" value="RED"></el-option>
+                <el-option label="榛� (YELLOW)" value="YELLOW"></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍚敤" width="80">
+            <template slot-scope="scope">
+              <el-switch v-model="scope.row.isEnabled" :active-value="1" :inactive-value="0"
+                @change="toggleRule(scope.row)"></el-switch>
+            </template>
+          </el-table-column>
+        </el-table>
+        </div>
+      </el-main>
+    </el-container>
+  </el-container>
+</template>
+<script>
+import api from '@/api'
+import AppHeader from '@/components/AppHeader.vue'
+const TYPE_CN = {
+  DIFF: '宸�煎姣�', RATIO: '姣斾緥瀵规瘮', MOM: '鐜瘮鏂板', NULL_CHECK: '蹇呭~/涓�鑷存��',
+  OUT_RANGE: '鑼冨洿妫�鏌�', MOM_EQ_ZERO: '鐜瘮涓�0', MOM_PCT: '鐜瘮鐧惧垎姣�',
+  MOM_EQ: '绛変簬涓婃湀', EXISTENCE: '瀛樺湪鎬�', CROSS_DIFF: '璺ㄨ〃瀵规瘮',
+  EXISTENCE_AUTH: '杩愭斂缂哄け', EXISTENCE_SYS: '绯荤粺缂哄け', CROSS_DIFF_PCT: '璺ㄨ〃鐧惧垎姣�',
+  TREND_CONSISTENCY: '瓒嬪娍涓�鑷�', RATIO_CHANGE: '鍗犳瘮鍙樺寲', AVG_DIST_CHANGE: '骞冲潎杩愯窛鍙樺寲',
+  PAX_PER_TRIP_CHANGE: '鍗曡溅娆¤浇瀹汉鏁板彉鍖�', LOADED_RATIO_DIFF: '杞借揣閲岀▼鍗犳瘮瀵规瘮',
+  FUEL_RANGE: '鍗曡�楄秴鑼冨洿', FUEL_MOM: '鍗曡�楃幆姣�', FREIGHT_VS_H2032: '涓庤揣杩愭湀鎶ュ姣�',
+  AVG_DIST_VS_H2032: '骞冲潎杩愯窛瀵规瘮', LOADED_TON_RATIO: '杞借揣鍚ㄤ綅姣斿��'
+}
+export default {
+  components: { AppHeader },
+  name: 'RuleManage',
+  data() {
+    return { reportType: 'H2032', rules: [], loading: false }
+  },
+  methods: {
+    typeLabel(t) { return TYPE_CN[t] || t },
+    loadRules() {
+      this.loading = true
+      api.get('/rules/list', { params: { reportType: this.reportType } })
+        .then(res => { this.rules = res.data || [] })
+        .catch(e => { if (e && e._toast) return; this.$message.error('瑙勫垯鍔犺浇澶辫触') })
+        .finally(() => { this.loading = false })
+    },
+    toggleRule(row) {
+      api.post('/rules/toggle', null, { params: { id: row.id, enabled: row.isEnabled } })
+        .then(() => { this.$message.success((row.isEnabled ? '宸插惎鐢細' : '宸插仠鐢細') + row.ruleCode) })
+        .catch(e => { if (e && e._toast) return; row.isEnabled = row.isEnabled ? 0 : 1; this.$message.error('鎿嶄綔澶辫触') })
+    },
+    saveThreshold(row) {
+      api.post('/rules/update', {
+        id: row.id, threshold: row.threshold, alertLevel: row.alertLevel
+      }).then(() => { this.$message.success('宸蹭繚瀛橈細' + row.ruleCode) })
+        .catch(e => { if (e && e._toast) return; this.$message.error('淇濆瓨澶辫触') })
+    }
+  },
+  mounted() { this.loadRules() }
+}
+</script>

--
Gitblit v1.9.1