xyc
5 天以前 703469a2bf0b34fe2ee503e6e6bb76757d183d84
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<template>
  <el-container>
    <el-header>交通统计报表审核系统 - 用户管理</el-header>
    <el-container>
      <el-aside width="200px">
        <el-menu router :default-active="activeMenu">
          <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">企业解释</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-item index="/login" @click="logout">退出登录</el-menu-item>
        </el-menu>
      </el-aside>
      <el-main>
        <div class="page-scroll">
          <h3>用户管理(负责模块决定报表生成页默认显示哪些模块)</h3>
          <div class="toolbar">
            <el-input v-model="keyword" placeholder="用户名 / 姓名" clearable style="width:220px" @keyup.enter.native="loadList" @clear="loadList"></el-input>
            <el-button type="primary" icon="el-icon-search" @click="loadList">查询</el-button>
            <el-button type="success" icon="el-icon-plus" @click="openEdit()">新增用户</el-button>
          </div>
          <div class="table-area">
            <el-table :data="list" border stripe size="small" v-loading="loading">
              <el-table-column prop="id" label="ID" width="60" align="center"></el-table-column>
              <el-table-column prop="username" label="用户名" width="120"></el-table-column>
              <el-table-column prop="realName" label="姓名" width="100"></el-table-column>
              <el-table-column prop="phone" label="手机号" width="130"></el-table-column>
              <el-table-column label="负责模块" min-width="240">
                <template slot-scope="{ row }">
                  <el-tag v-for="mk in moduleKeys(row.modules)" :key="mk" size="mini" style="margin-right:4px">{{ moduleLabel(mk) }}</el-tag>
                  <span v-if="!row.modules" style="color:#999">未配置(默认全部可见)</span>
                </template>
              </el-table-column>
              <el-table-column label="状态" width="80" align="center">
                <template slot-scope="{ row }">
                  <el-tag :type="row.status === 1 ? 'success' : 'info'" size="mini">{{ row.status === 1 ? '启用' : '停用' }}</el-tag>
                </template>
              </el-table-column>
              <el-table-column prop="createdAt" label="创建时间" width="170"></el-table-column>
              <el-table-column label="操作" width="140" align="center">
                <template slot-scope="{ row }">
                  <el-button type="text" size="mini" @click="openEdit(row)">编辑</el-button>
                  <el-button type="text" size="mini" style="color:#f56c6c" @click="removeUser(row)">删除</el-button>
                </template>
              </el-table-column>
            </el-table>
          </div>
        </div>
      </el-main>
    </el-container>
 
    <el-dialog :title="form.id ? '编辑用户' : '新增用户'" :visible.sync="dialogVisible" width="520px" @closed="resetForm">
      <el-form ref="userForm" :model="form" :rules="formRules" label-width="90px">
        <el-form-item label="用户名" prop="username">
          <el-input v-model="form.username" :disabled="!!form.id" placeholder="登录账号"></el-input>
        </el-form-item>
        <el-form-item label="密码" :prop="form.id ? '' : 'password'">
          <el-input v-model="form.password" type="password" :placeholder="form.id ? '留空则不修改密码' : '请输入初始密码'"></el-input>
        </el-form-item>
        <el-form-item label="姓名" prop="realName">
          <el-input v-model="form.realName" placeholder="真实姓名"></el-input>
        </el-form-item>
        <el-form-item label="手机号">
          <el-input v-model="form.phone" placeholder="选填"></el-input>
        </el-form-item>
        <el-form-item label="负责模块">
          <el-checkbox-group v-model="form.modules">
            <el-checkbox v-for="mo in moduleOptions" :key="mo.key" :label="mo.key">{{ mo.label }}</el-checkbox>
          </el-checkbox-group>
          <div class="form-tip">报表生成页默认只显示勾选的模块;不勾则全部可见</div>
        </el-form-item>
        <el-form-item label="状态">
          <el-radio-group v-model="form.status">
            <el-radio :label="1">启用</el-radio>
            <el-radio :label="0">停用</el-radio>
          </el-radio-group>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" :loading="saving" @click="saveUser">保存</el-button>
      </div>
    </el-dialog>
  </el-container>
</template>
<script>
import api from '@/api'
const MODULE_OPTIONS = [
  { key: 'freight', label: '货运报表' },
  { key: 'passenger', label: '公路旅客报表' },
  { key: 'invest', label: '投资报表' },
  { key: 'energy', label: '能耗报表' },
  { key: 'cityPassenger', label: '城市客运报表' }
]
export default {
  name: 'UserManage',
  data() {
    return {
      activeMenu: '/users',
      keyword: '',
      list: [],
      loading: false,
      dialogVisible: false,
      saving: false,
      moduleOptions: MODULE_OPTIONS,
      form: { id: null, username: '', password: '', realName: '', phone: '', modules: [], status: 1 },
      formRules: {
        username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
        password: [{ required: true, message: '请输入初始密码', trigger: 'blur' }]
      }
    }
  },
  mounted() { this.loadList() },
  methods: {
    logout() {
      localStorage.removeItem('token'); localStorage.removeItem('username'); localStorage.removeItem('realName'); localStorage.removeItem('modules')
      this.$router.push('/login')
    },
    loadList() {
      this.loading = true
      api.get('/user/list', { params: { keyword: this.keyword } })
        .then(res => { this.list = res.data || [] })
        .catch(() => this.$message.error('用户列表加载失败'))
        .finally(() => { this.loading = false })
    },
    moduleKeys(modules) {
      if (!modules) return []
      return modules.split(',').filter(Boolean)
    },
    moduleLabel(key) {
      const mo = MODULE_OPTIONS.find(x => x.key === key)
      return mo ? mo.label : key
    },
    openEdit(row) {
      this.dialogVisible = true
      this.$nextTick(() => {
        if (row && row.id) {
          this.form = {
            id: row.id, username: row.username, password: '', realName: row.realName || '',
            phone: row.phone || '', modules: this.moduleKeys(row.modules), status: row.status === 0 ? 0 : 1
          }
        } else {
          this.form = { id: null, username: '', password: '', realName: '', phone: '', modules: [], status: 1 }
        }
        this.$refs.userForm && this.$refs.userForm.clearValidate()
      })
    },
    resetForm() {
      this.form = { id: null, username: '', password: '', realName: '', phone: '', modules: [], status: 1 }
      this.$refs.userForm && this.$refs.userForm.clearValidate()
    },
    saveUser() {
      this.$refs.userForm.validate(valid => {
        if (!valid) return
        this.saving = true
        api.post('/user/save', this.form)
          .then(() => {
            this.$message.success('保存成功')
            this.dialogVisible = false
            this.loadList()
          })
          .catch(err => {
            const d = err && err.response && err.response.data
            this.$message.error((d && d.message) || '保存失败')
          })
          .finally(() => { this.saving = false })
      })
    },
    removeUser(row) {
      this.$confirm('确定删除用户「' + (row.realName || row.username) + '」吗?', '删除确认', { type: 'warning' })
        .then(() => api.post('/user/delete', null, { params: { id: row.id } }))
        .then(() => { this.$message.success('已删除'); this.loadList() })
        .catch(() => {})
    }
  }
}
</script>
<style scoped>
.toolbar { margin-bottom: 12px; display: flex; gap: 8px; align-items: center; }
.form-tip { font-size: 12px; color: #909399; line-height: 1.6; margin-top: 4px; }
</style>