用户管理 2025年4月8日12:20:26

master
qmstyle 2025-04-08 12:20:33 +08:00
parent e61157b33c
commit be73b40372
7 changed files with 126 additions and 96 deletions

View File

@ -6,6 +6,9 @@ import com.alibaba.fastjson2.JSONObject;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import com.zhangmeng.online.exam.ui.api.form.UserForm;
import com.zhangmeng.online.exam.ui.controller.UserEditController;
import com.zhangmeng.online.exam.ui.module.Role;
import com.zhangmeng.online.exam.ui.module.User;
import com.zhangmeng.online.exam.ui.service.RoleService;
import com.zhangmeng.online.exam.ui.utils.AlertUtils;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleStringProperty;
@ -13,6 +16,8 @@ import javafx.beans.property.SimpleStringProperty;
import java.util.*;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Parent;
import javafx.scene.control.MenuItem;
import javafx.stage.Stage;
@ -110,7 +115,40 @@ public class UserDataLoad implements DataLoad {
String phone = data.getString("phone");
controller.phoneField.setText(phone);
String password = data.getString("password");
String role_ids = data.getString("role_ids");
List<Role> roles = new ArrayList<>();
List<Role> allRoles = RoleService.getAllRoles();
User user = new User();
user.setId(Integer.parseInt(id));
user.setUsername(username);
user.setEmail(email);
user.setPhone(phone);
user.setPassword(password);
if (role_ids != null && !role_ids.equals("null")) {
String[] role_id_arr = role_ids.split(",");
for (Role allRole : allRoles) {
Role role = new Role();
role.setId(allRole.getId());
role.setSelected(false);
for (String role_id : role_id_arr) {
if (allRole.getId() == Integer.parseInt(role_id)) {
role.setSelected(true);
user.getRoles().add(role);
break;
}
}
role.setName(allRole.getName());
role.setDescription(allRole.getDescription());
role.setStatus(allRole.getStatus());
role.setPermissions(allRole.getPermissions());
roles.add(role);
}
}
controller.passwordField.setText(password);
controller.roleListView.setItems(FXCollections.observableArrayList(roles));
controller.setUser(user);
AlertUtils.alert("编辑用户信息", (Parent) userForm, stage);
}
@ -138,7 +176,6 @@ public class UserDataLoad implements DataLoad {
public List<MenuItem> getContextMenu() {
return null;
}

View File

@ -3,6 +3,7 @@ package com.zhangmeng.online.exam.ui.controller;
import com.zhangmeng.online.exam.ui.module.Role;
import com.zhangmeng.online.exam.ui.module.User;
import com.zhangmeng.online.exam.ui.service.LogService;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
@ -42,7 +43,7 @@ public class UserEditController {
public TextField emailField;
@FXML
public ComboBox<String> statusComboBox;
public ComboBox<PaperEditController.Status> statusComboBox;
@FXML
public ListView<Role> roleListView;
@ -53,43 +54,50 @@ public class UserEditController {
@FXML
public void initialize() {
// 初始化状态下拉框
statusComboBox.getItems().addAll("启用", "禁用");
statusComboBox.setValue("启用");
/**
* DISABLED("已停用"),
* VALID("正常"),
* LOCKED("锁定");
*/
PaperEditController.Status status1 = new PaperEditController.Status("已停用", 0);
PaperEditController.Status status2 = new PaperEditController.Status("正常", 1);
PaperEditController.Status status3 = new PaperEditController.Status("已锁定", 2);
statusComboBox.getItems().addAll(status2, status1,status3);
statusComboBox.setValue(status2);
statusComboBox.setConverter(new StringConverter<PaperEditController.Status>() {
@Override
public String toString(PaperEditController.Status object) {
return object.getName();
}
@Override
public PaperEditController.Status fromString(String string) {
return null;
}
});
statusComboBox.setCellFactory(new Callback<ListView<PaperEditController.Status>, ListCell<PaperEditController.Status>>() {
@Override
public ListCell<PaperEditController.Status> call(ListView<PaperEditController.Status> statusListView) {
return new ListCell<>() {
@Override
protected void updateItem(PaperEditController.Status item, boolean empty) {
super.updateItem(item, empty);
if (item != null && !empty) {
HBox hBox = new HBox();
Label label = new Label(item.getName());
hBox.getChildren().add(label);
setGraphic(hBox);
}
}
};
}
});
// 初始化角色列表
roleListView.setItems(FXCollections.observableArrayList(RoleService.getAllRoles()));
Callback<ListView<Role>, ListCell<Role>> call = CheckBoxListCell.forListView(new Callback<Role, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(Role param) {
return param.selectedProperty();
}
}, new StringConverter<Role>() {
@Override
public String toString(Role object) {
if (object != null) {
System.out.println("姓名:" + object.getName() + " 是否选择:" + object.isSelected());
return object.getName();
}
return null;
}
@Override
public Role fromString(String string) {
return null;
}
});
roleListView.setCellFactory(call);
roleListView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Role>() {
@Override
public void changed(ObservableValue<? extends Role> observable, Role oldValue, Role newValue) {
System.out.println("姓名:" + newValue.getName() + " 是否选择:" + newValue.isSelected());
}
});
roleListView.setCellFactory(CheckBoxListCell.forListView(Role::selectedProperty));
}
public void setUser(User user) {
@ -98,7 +106,7 @@ public class UserEditController {
usernameField.setText(user.getUsername());
phoneField.setText(user.getPhone());
emailField.setText(user.getEmail());
statusComboBox.setValue(user.getStatus());
// 设置已有角色的选中状态
user.getRoles().forEach(role -> {
@ -131,7 +139,7 @@ public class UserEditController {
// 更新基本信息
user.setPhone(phoneField.getText());
user.setEmail(emailField.getText());
user.setStatus(statusComboBox.getValue());
user.setStatus(String.valueOf(statusComboBox.getValue().getValue()));
// 更新角色
user.getRoles().clear();
@ -141,13 +149,13 @@ public class UserEditController {
// 保存用户
if (user.getId() == 0) {
UserService.createUser(user);
LogService.log("用户管理", "创建", "创建用户:" + user.getUsername());
} else {
UserService.updateUser(user);
LogService.log("用户管理", "更新", "更新用户:" + user.getUsername());
}
UserService.saveUser(user);
saveClicked = true;
closeDialog();
} catch (Exception e) {
@ -180,12 +188,14 @@ public class UserEditController {
errorMessage.append("邮箱不能为空!\n");
}
Role role = roleListView.getSelectionModel().getSelectedItem();
if (role == null) {
if (roleListView.getItems().stream().noneMatch(Role::isSelected)) {
errorMessage.append("至少选择一个角色!\n");
}
// for (Role role : roleListView.getItems()) {
// System.out.println("角色名称:" + role.getName() + " 是否选择:" + role.isSelected());
// }
if (errorMessage.length() == 0) {
return true;
} else {

View File

@ -1,18 +0,0 @@
package com.zhangmeng.online.exam.ui.controller;
import javafx.event.ActionEvent;
/**
* @author zm
* @date 2025/3/31 16:34
* @version: 1.0
*/
public class UserListController {
public void handleSearch(ActionEvent actionEvent) {
}
public void handleAdd(ActionEvent actionEvent) {
}
}

View File

@ -98,6 +98,10 @@ public class Role {
this.selected.set(selected);
}
public SimpleBooleanProperty getSelected() {
return selected;
}
@Override
public String toString() {
return name;

View File

@ -6,6 +6,8 @@ import com.alibaba.fastjson2.JSONObject;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.module.MenuData;
import com.zhangmeng.online.exam.ui.module.User;
import com.zhangmeng.online.exam.ui.utils.AlertUtils;
import com.zhangmeng.online.exam.ui.utils.FxUtils;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
@ -13,12 +15,14 @@ import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TreeItem;
import javafx.stage.Stage;
import com.zhangmeng.online.exam.ui.module.Role;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.zhangmeng.online.exam.ui.utils.FxUtils.User_DynamicTableComponent;
/**
*
* @author zm
@ -88,11 +92,34 @@ public class UserService {
}
public static void createUser(User user) {
public static void saveUser(User user) {
Map<String, Object> map = new HashMap<>();
map.put("id", user.getId());
map.put("username", user.getUsername());
map.put("name", user.getName());
map.put("email", user.getEmail());
map.put("status", user.getStatus());
map.put("password", user.getPassword());
map.put("salt", user.getSalt());
map.put("phone", user.getPhone());
map.put("avatarUrl", user.getAvatarUrl());
map.put("token", user.getToken());
map.put("role_ids", user.getRoles().stream().map(Role::getId).toArray());
String result = HttpUtils.POST(ApiUtils.API_URL + "/user/save", map);
JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject.getIntValue("code") == 200){
if (user.getId() == 0){
AlertUtils.alert_msg("保存成功!");
}else {
AlertUtils.alert_msg("更新成功!");
}
public static void updateUser(User user) {
FxUtils.FX_BEANS.get(User_DynamicTableComponent).flushData();
}else {
AlertUtils.alert_warning("保存失败!");
}
}
}

View File

@ -22,11 +22,11 @@
<!-- 密码 -->
<Label text="密码:" GridPane.rowIndex="1" GridPane.columnIndex="0"/>
<PasswordField fx:id="passwordField" GridPane.rowIndex="2" GridPane.columnIndex="1"/>
<PasswordField fx:id="passwordField" GridPane.rowIndex="1" GridPane.columnIndex="1"/>
<!-- 手机号 -->
<Label text="姓名:" GridPane.rowIndex="2" GridPane.columnIndex="0"/>
<TextField fx:id="phoneField" GridPane.rowIndex="1" GridPane.columnIndex="1"/>
<Label text="手机号:" GridPane.rowIndex="2" GridPane.columnIndex="0"/>
<TextField fx:id="phoneField" GridPane.rowIndex="2" GridPane.columnIndex="1"/>
<!-- 邮箱 -->
<Label text="邮箱:" GridPane.rowIndex="3" GridPane.columnIndex="0"/>

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<VBox spacing="10" xmlns:fx="http://javafx.com/fxml"
fx:controller="com.zhangmeng.online.exam.ui.controller.UserListController">
<padding>
<Insets top="10" right="10" bottom="10" left="10"/>
</padding>
<children>
<HBox spacing="10" alignment="CENTER_LEFT">
<TextField fx:id="searchField" promptText="输入关键字搜索..." HBox.hgrow="ALWAYS"/>
<Button text="搜索" onAction="#handleSearch"/>
<Region HBox.hgrow="ALWAYS"/>
<Button fx:id="addButton" text="添加用户" onAction="#handleAdd"/>
</HBox>
<TableView fx:id="userTable" VBox.vgrow="ALWAYS">
<columns>
<TableColumn fx:id="idColumn" text="ID" prefWidth="50"/>
<TableColumn fx:id="usernameColumn" text="用户名" prefWidth="100"/>
<TableColumn fx:id="nameColumn" text="姓名" prefWidth="100"/>
<TableColumn fx:id="emailColumn" text="邮箱" prefWidth="150"/>
<TableColumn fx:id="statusColumn" text="状态" prefWidth="80"/>
<TableColumn fx:id="actionColumn" text="操作" prefWidth="150"/>
</columns>
</TableView>
</children>
</VBox>