2025年3月18日15:01:15

master
qmstyle 2025-03-18 15:01:25 +08:00
parent 8a42e4d667
commit 9097ae4925
8 changed files with 203 additions and 94 deletions

View File

@ -18,9 +18,6 @@ import javafx.stage.Window;
public class LoginPage extends AnchorPane {
/**
* <AnchorPane prefHeight="649.0" prefWidth="1200.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zhangmeng.online.exam.ui.admin.LoginController">
* <children>
* <GridPane layoutX="485.0" layoutY="193.0" prefHeight="183.0" prefWidth="286.0" AnchorPane.bottomAnchor="281.0" AnchorPane.leftAnchor="485.0" AnchorPane.rightAnchor="429.0" AnchorPane.topAnchor="185.0">
* <columnConstraints>
* <ColumnConstraints hgrow="SOMETIMES" maxWidth="229.0" minWidth="10.0" prefWidth="38.0" />
* <ColumnConstraints hgrow="SOMETIMES" maxWidth="423.0" minWidth="10.0" prefWidth="248.0" />
@ -37,83 +34,83 @@ public class LoginPage extends AnchorPane {
* <Button mnemonicParsing="false" prefHeight="23.0" prefWidth="178.0" text="登录" GridPane.columnIndex="1" GridPane.rowIndex="2" />
* <PasswordField GridPane.columnIndex="1" GridPane.rowIndex="1" />
* </children>
* </GridPane>
* </children>
* </AnchorPane>
*/
public LoginPage() {
setPrefHeight(649.0);
setPrefWidth(1200.0);
ColumnConstraints column1 = new ColumnConstraints();
column1.setHgrow(Priority.SOMETIMES);
column1.setMaxWidth(229.0);
column1.setMinWidth(10.0);
column1.setPrefWidth(38.0);
// GridPane
ColumnConstraints column2 = new ColumnConstraints();
column2.setHgrow(Priority.SOMETIMES);
column2.setMaxWidth(423.0);
column2.setMinWidth(10.0);
column2.setPrefWidth(248.0);
RowConstraints row1 = new RowConstraints();
row1.setMaxHeight(174.0);
row1.setMinHeight(10.0);
row1.setPrefHeight(60.0);
row1.setVgrow(Priority.SOMETIMES);
RowConstraints row2 = new RowConstraints();
row2.setMaxHeight(206.0);
row2.setMinHeight(10.0);
row2.setPrefHeight(47.0);
row2.setVgrow(Priority.SOMETIMES);
RowConstraints row3 = new RowConstraints();
row3.setMaxHeight(238.0);
row3.setMinHeight(10.0);
row3.setPrefHeight(52.0);
row3.setVgrow(Priority.SOMETIMES);
// <GridPane layoutX="485.0" layoutY="59.0" prefHeight="159.0" prefWidth="275.0" AnchorPane.bottomAnchor="97.0" AnchorPane.leftAnchor="125.0" AnchorPane.rightAnchor="127.0" AnchorPane.topAnchor="59.0">
GridPane gridPane = new GridPane();
gridPane.getColumnConstraints().addAll(column1, column2);
gridPane.getRowConstraints().addAll(row1, row2, row3);
gridPane.setLayoutX(485.0);
gridPane.setLayoutY(193.0);
gridPane.setPrefHeight(183.0);
gridPane.setPrefWidth(286.0);
AnchorPane.setBottomAnchor(gridPane, 281.0);
AnchorPane.setLeftAnchor(gridPane, 485.0);
AnchorPane.setRightAnchor(gridPane, 429.0);
AnchorPane.setTopAnchor(gridPane, 185.0);
gridPane.setLayoutY(59.0);
gridPane.setPrefHeight(159.0);
gridPane.setPrefWidth(275.0);
AnchorPane.setBottomAnchor(gridPane,97.0);
AnchorPane.setLeftAnchor(gridPane,125.0);
AnchorPane.setRightAnchor(gridPane,127.0);
AnchorPane.setTopAnchor(gridPane,59.0);
// columnConstraints
ColumnConstraints columnConstraints1 = new ColumnConstraints();
columnConstraints1.setHgrow(Priority.SOMETIMES);
columnConstraints1.setMaxWidth(229.0);
columnConstraints1.setMinWidth(10.0);
columnConstraints1.setPrefWidth(38.0);
ColumnConstraints columnConstraints2 = new ColumnConstraints();
columnConstraints2.setHgrow(Priority.SOMETIMES);
columnConstraints2.setMaxWidth(423.0);
columnConstraints2.setMinWidth(10.0);
columnConstraints2.setPrefWidth(248.0);
gridPane.getColumnConstraints().addAll(columnConstraints1, columnConstraints2);
// rowConstraints
RowConstraints rowConstraints1 = new RowConstraints();
rowConstraints1.setMaxHeight(174.0);
rowConstraints1.setMinHeight(10.0);
rowConstraints1.setPrefHeight(60.0);
rowConstraints1.setVgrow(Priority.SOMETIMES);
RowConstraints rowConstraints2 = new RowConstraints();
rowConstraints2.setMaxHeight(206.0);
rowConstraints2.setMinHeight(10.0);
rowConstraints2.setPrefHeight(47.0);
rowConstraints2.setVgrow(Priority.SOMETIMES);
RowConstraints rowConstraints3 = new RowConstraints();
rowConstraints3.setMaxHeight(238.0);
rowConstraints3.setMinHeight(10.0);
rowConstraints3.setPrefHeight(52.0);
rowConstraints3.setVgrow(Priority.SOMETIMES);
gridPane.getRowConstraints().addAll(rowConstraints1, rowConstraints2, rowConstraints3);
// children
Label label1 = new Label("账号");
Label label2 = new Label("密码");
TextField textField1 = new TextField();
PasswordField passwordField1 = new PasswordField();
Button button1 = new Button("登录");
button1.setMnemonicParsing(false);
button1.setPrefHeight(23.0);
button1.setPrefWidth(178.0);
gridPane.add(label1, 0, 0);
gridPane.add(label2, 0, 1);
gridPane.add(textField1, 1, 0);
Button button1 = new Button("登录");
PasswordField passwordField1 = new PasswordField();
gridPane.add(button1, 1, 2);
gridPane.add(passwordField1, 1, 1);
gridPane.add(button1, 1, 2);
getChildren().add(gridPane);
button1.setOnAction(event -> {
System.out.println("登录");
Scene scene = button1.getScene();
IndexPage shortAnswerComponent = new IndexPage();
scene.setRoot(shortAnswerComponent);
Stage window = (Stage) scene.getWindow();
window.setResizable(true);
// window.setFullScreen(true);
window.close();
Stage stage = new Stage();
IndexPage shortAnswerComponent = new IndexPage();
scene = new Scene(shortAnswerComponent, 1280, 720);
stage.setScene(scene);
stage.setTitle("在线考试系统");
stage.show();
});
}

View File

@ -27,7 +27,7 @@ public class ApiUtils {
public static final String API_URL = "http://localhost:8080";
public static final int PAGE_SIZE = 3;
public static final int PAGE_SIZE = 25;
public static final int PAGE_NUM = 1;
@ -86,6 +86,11 @@ public class ApiUtils {
return dataLoad.loadData(PAGE_NUM,PAGE_SIZE);
}
public static DataView getQuestionOptionList() {
DataLoad dataLoad = new QuestionOptionDataLoad();
return dataLoad.loadData(PAGE_NUM,PAGE_SIZE);
}
public static class DataView {
private List<String> keys;

View File

@ -0,0 +1,108 @@
package com.zhangmeng.online.exam.ui.api.model;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import com.zhangmeng.online.exam.ui.api.form.UserForm;
import com.zhangmeng.online.exam.ui.utils.AlertUtils;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Parent;
import javafx.stage.Stage;
import java.util.*;
/**
* @author zm
* @date 2025/3/18 11:37
* @version: 1.0
*/
public class OptionDataLoad implements DataLoad {
private Parent form;
@Override
public ApiUtils.DataView loadData(Integer pageNum, Integer pageSize) {
Map<String, Object> params = new HashMap<>();
params.put("pageNum", pageNum.toString());
params.put("pageSize", pageSize.toString());
String userListData = HttpUtils.GET(ApiUtils.API_URL + "/option/list", params);
JSONObject jsonObject = JSON.parseObject(userListData);
JSONArray data = jsonObject.getJSONArray("data");
int total = jsonObject.getIntValue("total");
List<Map<String, SimpleStringProperty>> userMapList = new ArrayList<>();
for (Object datum : data) {
JSONObject user = (JSONObject) datum;
Map<String, SimpleStringProperty> userMap = new HashMap<>();
userMap.put("序号", new SimpleStringProperty(user.getString("id")));
userMap.put("用户名", new SimpleStringProperty(user.getString("username")));
userMap.put("手机号码", new SimpleStringProperty(user.getString("phone")));
userMap.put("电子邮箱", new SimpleStringProperty(user.getString("email")));
userMap.put("id", new SimpleStringProperty(user.getString("id")));
userMapList.add(userMap);
}
ApiUtils.DataView dataView = new ApiUtils.DataView(Arrays.asList("序号", "用户名","手机号码", "电子邮箱" ), userMapList).setDataLoad(this).setPageNum(pageNum).setPageSize(pageSize).setTotal(total);
dataView.setDataLoad(this);
return dataView;
}
@Override
public void setForm(Parent view) {
this.form = view;
}
@Override
public Parent getForm() {
return this.form;
}
@Override
public Map<String, Object> saveForm(Map<String, Object> map) {
String result = HttpUtils.POST(ApiUtils.API_URL + "/user/save", map);
JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject.getIntValue("code") == 200){
AlertUtils.alert_msg("保存成功!");
}else {
AlertUtils.alert_warning("保存失败!");
}
return null;
}
@Override
public void deleteData(String id) {
Map<String, Object> map = new HashMap<>();
map.put("id", id);
String result = HttpUtils.POST(ApiUtils.API_URL + "/user/delete", map);
JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject.getIntValue("code") == 200){
AlertUtils.alert_msg("删除成功!");
}else {
AlertUtils.alert_warning("删除失败!");
}
}
@Override
public void editData(String id, Stage stage) {
UserForm userForm = new UserForm();
Map<String, Object> map = new HashMap<>();
map.put("id", id);
String result = HttpUtils.GET(ApiUtils.API_URL + "/user/getUser", map);
JSONObject jsonObject = JSON.parseObject(result);
JSONObject data = jsonObject.getJSONObject("data");
String username = data.getString("username");
userForm.getUsername_field().setText(username);
String email = data.getString("email");
userForm.getEmail_field().setText(email);
String phone = data.getString("phone");
userForm.getPhone_field().setText(phone);
String password = data.getString("password");
userForm.getPassword_field().setText(password);
AlertUtils.alert("编辑用户信息", (Parent) userForm, stage);
}
}

View File

@ -35,12 +35,12 @@ public class QuestionDataLoad implements DataLoad {
JSONObject permission = (JSONObject) datum;
Map<String, SimpleStringProperty> userMap = new HashMap<>();
userMap.put("序号", new SimpleStringProperty(permission.getString("id")));
userMap.put("权限名称", new SimpleStringProperty(permission.getString("name")));
userMap.put("描述", new SimpleStringProperty(permission.getString("desc")));
userMap.put("权限路径", new SimpleStringProperty(permission.getString("url")));
userMap.put("题目", new SimpleStringProperty(permission.getString("name")));
userMap.put("题目类型", new SimpleStringProperty(permission.getString("type")));
userMap.put("所属学科", new SimpleStringProperty(permission.getString("subject")));
questionMapList.add(userMap);
}
return new ApiUtils.DataView(Arrays.asList("序号", "权限名称", "描述", "权限路径"), questionMapList).setDataLoad(this).setPageNum(pageNum).setPageSize(pageSize).setTotal(total);
return new ApiUtils.DataView(Arrays.asList("序号", "题目", "题目类型", "所属学科"), questionMapList).setDataLoad(this).setPageNum(pageNum).setPageSize(pageSize).setTotal(total);
}

View File

@ -37,14 +37,15 @@ public class QuestionOptionDataLoad implements DataLoad {
JSONObject user = (JSONObject) datum;
Map<String, SimpleStringProperty> userMap = new HashMap<>();
userMap.put("序号", new SimpleStringProperty(user.getString("id")));
userMap.put("用户名", new SimpleStringProperty(user.getString("username")));
userMap.put("手机号码", new SimpleStringProperty(user.getString("phone")));
userMap.put("电子邮箱", new SimpleStringProperty(user.getString("email")));
userMap.put("选项名称", new SimpleStringProperty(user.getString("name")));
userMap.put("选项内容", new SimpleStringProperty(user.getString("optionContent")));
userMap.put("是否为正确答案", new SimpleStringProperty(user.getString("isAnswer")));
userMap.put("解析", new SimpleStringProperty(user.getString("explanation")));
userMap.put("id", new SimpleStringProperty(user.getString("id")));
userMapList.add(userMap);
}
ApiUtils.DataView dataView = new ApiUtils.DataView(Arrays.asList("序号", "用户名","手机号码", "电子邮箱" ), userMapList).setDataLoad(this).setPageNum(pageNum).setPageSize(pageSize).setTotal(total);
ApiUtils.DataView dataView = new ApiUtils.DataView(Arrays.asList("序号", "选项名称", "选项内容", "是否为正确答案", "解析", "id" ), userMapList).setDataLoad(this).setPageNum(pageNum).setPageSize(pageSize).setTotal(total);
dataView.setDataLoad(this);
return dataView;
}

View File

@ -59,13 +59,12 @@ public class DynamicTableComponent extends VBox {
tableView.prefHeightProperty().bind(this.heightProperty());
tableView.prefWidthProperty().bind(this.widthProperty());
// 动态生成列(示例字段)‌:ml-citation{ref="3,4" data="citationList"}
List<String> columns = keys ;
List<String> columns = keys.stream().filter(key -> !key.equals("id")).toList() ;
// if (!dataList.isEmpty()){
// columns= Arrays.asList(dataList.get(0).keySet().toArray(new String[0])).stream().filter(key -> !key.equals("id")).toList();
// }else {
// columns=keys;
// }
List<String> finalColumns = columns;
columns.forEach(col -> {
TableColumn<Map<String,SimpleStringProperty>, String> column = new TableColumn<>(col);
// 数据绑定‌:ml-citation{ref="1,3" data="citationList"}
@ -77,7 +76,7 @@ public class DynamicTableComponent extends VBox {
row.get(col).set(event.getNewValue());
});
column.prefWidthProperty().bind(tableView.widthProperty().divide(finalColumns.size()));
column.prefWidthProperty().bind(tableView.widthProperty().divide(columns.size()));
tableView.getColumns().add(column);
});

View File

@ -130,6 +130,7 @@ public class SideMenu extends VBox {
case "/permission/list" -> init_table(hbox, ApiUtils.getPermissionList());
case "/question/list" -> init_table(hbox, ApiUtils.getQuestionList());
case "/subject/list" -> init_table(hbox, ApiUtils.getSubjectList());
case "/option/list" -> init_table(hbox, ApiUtils.getQuestionOptionList());
}
});

View File

@ -1,18 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.Button?>
<AnchorPane prefHeight="649.0" prefWidth="1200.0" xmlns="http://javafx.com/javafx/19"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zhangmeng.online.exam.ui.admin.LoginController">
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<AnchorPane prefHeight="315.0" prefWidth="527.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zhangmeng.online.exam.ui.admin.LoginController">
<children>
<GridPane layoutX="485.0" layoutY="193.0" prefHeight="183.0" prefWidth="286.0" AnchorPane.bottomAnchor="281.0"
AnchorPane.leftAnchor="485.0" AnchorPane.rightAnchor="429.0" AnchorPane.topAnchor="185.0">
<GridPane layoutX="485.0" layoutY="59.0" prefHeight="159.0" prefWidth="275.0" AnchorPane.bottomAnchor="97.0" AnchorPane.leftAnchor="125.0" AnchorPane.rightAnchor="127.0" AnchorPane.topAnchor="59.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="229.0" minWidth="10.0" prefWidth="38.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="423.0" minWidth="10.0" prefWidth="248.0" />
@ -26,8 +25,7 @@
<Label text="账号" />
<Label text="密码" GridPane.rowIndex="1" />
<TextField GridPane.columnIndex="1" />
<Button mnemonicParsing="false" prefHeight="23.0" prefWidth="178.0" text="登录" GridPane.columnIndex="1"
GridPane.rowIndex="2"/>
<Button mnemonicParsing="false" prefHeight="23.0" prefWidth="178.0" text="登录" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<PasswordField GridPane.columnIndex="1" GridPane.rowIndex="1" />
</children>
</GridPane>