工资管理系统功能模块结构图
- 实现职工基本信息的管理:主要包括职工信息的新增、修改、查询、删除等操作;
- 实现工资等级信息管理:具体包括等级的新增、修改、查询等操作;
- 职工变动工资管理:具体包括每月职工变动工资的新增、修改、删除、查询等操作;
- 、统计:分类汇总并输出所有员工的基本工资、补贴金额、奖励金额、扣除金额、实发工资的总金额和平均金额.
链接:https://pan.baidu.com/s/1tFZGNoatjvbPp0WyXj3XaA?pwd=1234
提取码:1234
该项目使用maven管理
pom.xml设置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>classwork</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
</dependencies>
</project>
Employee类
package gui_total.basic;
import java.time.LocalDate;
import java.util.Objects;
public class Employee {
public static int cnt = -1;
private int id;
private String name;
private String gender;
private LocalDate joiningDate;
private SalaryGrade salaryGrade;
public Employee(int id, String name, String gender, LocalDate joiningDate, SalaryGrade salaryGrade) {
this.id = id;
this.name = name;
this.gender = gender;
this.joiningDate = joiningDate;
this.salaryGrade = salaryGrade;
}
public Employee(int id, String name, String gender, LocalDate joiningDate) {
this.id = id;
this.name = name;
this.gender = gender;
this.joiningDate = joiningDate;
}
public Employee() {
}
public static int getCnt() {
return cnt;
}
public static void upCnt() {
Employee.cnt++;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public LocalDate getJoiningDate() {
return joiningDate;
}
public void setJoiningDate(LocalDate joiningDate) {
this.joiningDate = joiningDate;
}
public String getSalaryGrade() {
return salaryGrade.getGrade();
}
public SalaryGrade getSalaryGrade1() {
return salaryGrade;
}
public void setSalaryGrade(SalaryGrade salaryGrade) {
this.salaryGrade = salaryGrade;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return id == employee.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", joiningDate=" + joiningDate +
", salaryGrade=" + salaryGrade +
'}';
}
}
SalaryGrade类:
package gui_total.basic;
import java.util.Objects;
public class SalaryGrade {
public static int cntSalaryGrade = 0;
int id;
int basicmoney;
int Workmoney;
int transitmoney;
String grade;
public SalaryGrade(int id, int basicmoney, int workmoney, int transitmoney) {
this.id = id;
this.basicmoney = basicmoney;
this.Workmoney = workmoney;
this.transitmoney = transitmoney;
if(getBasicmoney()+getTransitmoney()+getWorkmoney()<5000)
{
grade="C";
} else if (getBasicmoney()+getTransitmoney()+getWorkmoney()>= 5000
&&getBasicmoney()+getTransitmoney()+getWorkmoney()<13000){
grade="B";
}
else {grade="A";}
}
public static int cntSalaryGrade() {
return cntSalaryGrade;
}
public static void upcntSalaryGrade() {
SalaryGrade.cntSalaryGrade++;
}
public String getGrade() {
return grade;
}
public void setId() {
this.id = Employee.getCnt();
}
public int getId() {
return id;
}
public int getBasicmoney() {
return basicmoney;
}
public void setBasicmoney(int basicmoney) {
this.basicmoney = basicmoney;
}
public int getWorkmoney() {
return Workmoney;
}
public void setWorkmoney(int workmoney) {
Workmoney = workmoney;
}
public int getTransitmoney() {
return transitmoney;
}
public void setTransitmoney(int transitmoney) {
this.transitmoney = transitmoney;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SalaryGrade that = (SalaryGrade) o;
return id == that.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return "SalaryGrade{" +
"id=" + id +
", basicmoney=" + basicmoney +
", Workmoney=" + Workmoney +
", transitmoney=" + transitmoney +
", grade='" + grade + '\'' +
'}';
}
}
SalaryChange类
package gui_total.basic;
import java.time.LocalDate;
import java.util.Objects;
public class SalaryChange {
public static int cntSalaryChange = 0;
private int employeeId;
private int month;
private double reward;
private double deduction;
public SalaryChange(int employeeId, int month, double reward, double deduction) {
this.employeeId = employeeId;
this.month = month;
this.reward = reward;
this.deduction = deduction;
}
public static int cntSalaryChange() {
return cntSalaryChange;
}
public static void upcntSalaryChange() {
SalaryChange.cntSalaryChange++;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId() {
this.employeeId = Employee.getCnt();
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public double getReward() {
return reward;
}
public void setReward(double reward) {
this.reward = reward;
}
public double getDeduction() {
return deduction;
}
public void setDeduction(double deduction) {
this.deduction = deduction;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SalaryChange that = (SalaryChange) o;
return employeeId == that.employeeId;
}
@Override
public int hashCode() {
return Objects.hash(employeeId);
}
}
MonthlySalary类
package gui_total.basic;
import java.time.LocalDate;
import java.util.Objects;
public class MonthlySalary implements Comparable<MonthlySalary>{
private int employeeId;
private int month;
private double baseSalary;//基础工资
private double reward;//奖金
private double deduction;//扣款
private double netSalary;//总工资
public MonthlySalary(int employeeId, int month, double baseSalary, double reward, double deduction) {
this.employeeId = employeeId;
this.month = month;
this.baseSalary = baseSalary;
this.reward = reward;
this.deduction = deduction;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public double getBaseSalary() {
return baseSalary;
}
public void setBaseSalary(double baseSalary) {
this.baseSalary = baseSalary;
}
public double getReward() {
return reward;
}
public void setReward(double reward) {
this.reward = reward;
}
public double getDeduction() {
return deduction;
}
public void setDeduction(double deduction) {
this.deduction = deduction;
}
public double getNetSalary() {
return netSalary;
}
public void setNetSalary(double netSalary) {
this.netSalary = netSalary;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MonthlySalary that = (MonthlySalary) o;
return employeeId == that.employeeId && month == that.month && Double.compare(that.baseSalary, baseSalary) == 0 && Double.compare(that.reward, reward) == 0 && Double.compare(that.deduction, deduction) == 0 && Double.compare(that.netSalary, netSalary) == 0;
}
@Override
public int hashCode() {
return Objects.hash(employeeId, month, baseSalary, reward, deduction, netSalary);
}
@Override
public int compareTo(MonthlySalary other) {
// 对净工资进行比较
if(this.netSalary > other.getNetSalary()) {
return 1;
} else if(this.netSalary < other.getNetSalary()) {
return -1;
} else {
return 0;
}
}
@Override
public String toString() {
return "MonthlySalary{" +
"employeeId=" + employeeId +
", month=" + month +
", baseSalary=" + baseSalary +
", reward=" + reward +
", deduction=" + deduction +
", netSalary=" + netSalary +
'}';
}
}
DateInit 类:进行数据的初始化
package gui_total.data;
import gui_total.Tool;
import gui_total.basic.Employee;
import gui_total.basic.MonthlySalary;
import gui_total.basic.SalaryChange;
import gui_total.basic.SalaryGrade;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import static gui_total.Tool.loadObjectToJsonFile;
@SuppressWarnings({"all"})
public class DateInit {
public static HashMap<Integer, Employee> employeeHashMap = new HashMap<Integer, Employee>();
public static HashMap<Integer, SalaryGrade> SalaryGradeHashMap = new HashMap<Integer, SalaryGrade>();
public static HashMap<Integer, SalaryChange> SalaryChangeHashMap = new HashMap<Integer, SalaryChange>();
public static HashMap<Integer, MonthlySalary> MonthlySalaryHashMap = new HashMap<Integer, MonthlySalary>();
public static HashMap<Integer, Employee> getEmployeeHashMap() {
return employeeHashMap;
}
public static HashMap<Integer, SalaryGrade> getSalaryGradeHashMap() {
return SalaryGradeHashMap;
}
public static HashMap<Integer, SalaryChange> getSalaryChangeHashMap() {
return SalaryChangeHashMap;
}
public static HashMap<Integer, MonthlySalary> getMonthlySalaryHashMap() {
return MonthlySalaryHashMap;
}
public static void main(String[] args) {
// initAll();
SalaryGradeInit();
EmployeeInit();
SalarychangeInit();
MonthlySalaryInit();
// }
}
public static void Init()
{
ArrayList<Employee> employees = (ArrayList<Employee>) Tool.loadObjectToJsonFile("Employee.json",
new TypeToken<ArrayList<Employee>>(){}.getType());
for (Employee o:employees) {
o.upCnt();
}
}
public static void InitSalaryChange()
{
ArrayList<SalaryChange> SalaryChanges = (ArrayList<SalaryChange>) Tool.loadObjectToJsonFile("SalaryChange.json",
new TypeToken<ArrayList<SalaryChange>>(){}.getType());
for (SalaryChange o:SalaryChanges) {
o.upcntSalaryChange();
}
}
public static void InitSalaryGrade()
{
ArrayList<SalaryGrade> SalaryGrades = (ArrayList<SalaryGrade>) Tool.loadObjectToJsonFile("SalaryGrade.json",
new TypeToken<ArrayList<SalaryGrade>>(){}.getType());
for (SalaryGrade o:SalaryGrades) {
o.upcntSalaryGrade();
}
}
public static void initAll() {
ArrayList<Employee> employees = new ArrayList<>();
ArrayList<SalaryGrade> grades = new ArrayList<>();
ArrayList<SalaryChange> salaryChanges = new ArrayList<>();
ArrayList<MonthlySalary> monthlysalaries = new ArrayList<>();
String jsonFilePath1="Employee.json";
String jsonFilePath2="SalaryGrade.json";
String jsonFilePath3="SalaryChange.json";
String jsonFilePath4="MonthlySalary.json";
employees=(ArrayList<Employee>)loadObjectToJsonFile(jsonFilePath1,new TypeToken<ArrayList<Employee>>(){}.getType());
grades=(ArrayList<SalaryGrade>)loadObjectToJsonFile(jsonFilePath2,new TypeToken<ArrayList<SalaryGrade>>(){}.getType());
salaryChanges=(ArrayList<SalaryChange>)loadObjectToJsonFile(jsonFilePath3,new TypeToken<ArrayList<SalaryChange>>(){}.getType());
monthlysalaries=(ArrayList<MonthlySalary>)loadObjectToJsonFile(jsonFilePath4,new TypeToken<ArrayList<MonthlySalary>>(){}.getType());
for(Employee employee:employees)
{
employeeHashMap.put(employee.getId(),employee);
}
for(SalaryGrade grade:grades)
{
SalaryGradeHashMap.put(grade.getId(),grade);
}
for(SalaryChange change:salaryChanges)
{
SalaryChangeHashMap.put(change.getEmployeeId(),change);
}
for(MonthlySalary salary:monthlysalaries)
{
MonthlySalaryHashMap.put(salary.getEmployeeId(),salary);
}
}
public static void EmployeeInit()
{
ArrayList<Employee> employees = new ArrayList<>();
ArrayList<SalaryGrade> grades = new ArrayList<>();
String jsonFilePath="SalaryGrade.json";
grades=(ArrayList<SalaryGrade>)loadObjectToJsonFile(jsonFilePath,new TypeToken<ArrayList<SalaryGrade>>(){}.getType());
for (int i = 0; i < grades.size(); i++) {
Employee employee = new Employee(i,"aa","男", LocalDate.of(2022, 1, 1),grades.get(i));
employee.upCnt();
// System.out.println(employee);
employeeHashMap.put(i,employee);
employees.add(employee);
// System.out.println(employeeHashMap.size());
}
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(employees);
try (FileWriter fileWriter = new FileWriter("Employee.json")) {
fileWriter.write(json);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Employee.json创建成功");
}
public static void SalaryGradeInit()
{
ArrayList<SalaryGrade> salaryGrades = new ArrayList<>();
for (int i = 0; i < 10; i++) {
new Employee().upCnt();
double randomDouble = Math.random();
int randomNum = (int) (randomDouble * 1000);
SalaryGrade grade = new SalaryGrade(i,1000+randomNum,200+randomNum,300+randomNum);
salaryGrades.add(grade);
SalaryGradeHashMap.put(i,grade);
}
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(salaryGrades);
try (FileWriter fileWriter = new FileWriter("SalaryGrade.json")) {
fileWriter.write(json);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("SalaryGrade.json创建成功");
}
public static void SalarychangeInit()
{
ArrayList<SalaryChange> salaryChanges = new ArrayList<>();
for (int i = 0; i < 10; i++) {
double randomDouble1 = Math.random();
double randomDouble2 = Math.random();
double randomDouble3 = Math.random();
int month = (int) (randomDouble1 * 10);
int reward = (int) (randomDouble2 * 1000);
int deduction = (int) (randomDouble3 * 1000);
SalaryChange change = new SalaryChange(i,month,reward,deduction);
salaryChanges.add(change);
SalaryChangeHashMap.put(i,change);
}
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(salaryChanges);
try (FileWriter fileWriter = new FileWriter("SalaryChange.json")) {
fileWriter.write(json);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("SalaryChange.json创建成功");
}
public static void MonthlySalaryInit()
{
ArrayList<SalaryGrade> grades = new ArrayList<>();
ArrayList<SalaryChange> changes = new ArrayList<>();
ArrayList<MonthlySalary> salaries = new ArrayList<>();
String jsonFilePath1="SalaryGrade.json";
String jsonFilePath2="SalaryChange.json";
grades=(ArrayList<SalaryGrade>)loadObjectToJsonFile(jsonFilePath1,new TypeToken<ArrayList<SalaryGrade>>(){}.getType());
changes=(ArrayList<SalaryChange>)loadObjectToJsonFile(jsonFilePath2,new TypeToken<ArrayList<SalaryChange>>(){}.getType());
if (grades.size()>0) {
for (int i = 0; i < grades.size(); i++) {
MonthlySalary salary = new MonthlySalary(i, changes.get(i).getMonth(),
grades.get(i).getBasicmoney()+grades.get(i).getWorkmoney()+grades.get(i).getTransitmoney(),
changes.get(i).getReward(), changes.get(i).getDeduction());
salary.setNetSalary(salary.getBaseSalary()+salary.getReward()-salary.getDeduction());
salaries.add(salary);
MonthlySalaryHashMap.put(i,salary);
}
}
else System.out.println("error");
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(salaries);
try (FileWriter fileWriter = new FileWriter("MonthlySalary.json")) {
fileWriter.write(json);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("MonthlySalary.json创建成功");
}
public static void UpdataMonthlySalary()
{
ArrayList<SalaryGrade> grades = new ArrayList<>();
ArrayList<SalaryChange> changes = new ArrayList<>();
ArrayList<MonthlySalary> salaries = new ArrayList<>();
String jsonFilePath1="SalaryGrade.json";
String jsonFilePath2="SalaryChange.json";
grades=(ArrayList<SalaryGrade>)loadObjectToJsonFile(jsonFilePath1,new TypeToken<ArrayList<SalaryGrade>>(){}.getType());
changes=(ArrayList<SalaryChange>)loadObjectToJsonFile(jsonFilePath2,new TypeToken<ArrayList<SalaryChange>>(){}.getType());
if (grades.size()>0) {
for (int i = 0; i < grades.size(); i++) {
MonthlySalary salary = new MonthlySalary(grades.get(i).getId(), changes.get(i).getMonth(),
grades.get(i).getBasicmoney()+grades.get(i).getWorkmoney()+grades.get(i).getTransitmoney(),
changes.get(i).getReward(), changes.get(i).getDeduction());
salary.setNetSalary(salary.getBaseSalary()+salary.getReward()-salary.getDeduction());
salaries.add(salary);
}
}
else System.out.println("error");
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(salaries);
try (FileWriter fileWriter = new FileWriter("MonthlySalary.json")) {
fileWriter.write(json);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("MonthlySalary.json更新成功");
}
public static void UpdataEmployee()
{
ArrayList<Employee> employees = (ArrayList<Employee>) Tool.loadObjectToJsonFile("Employee.json",
new TypeToken<ArrayList<Employee>>(){}.getType());
ArrayList<Employee> employeeArrayList = new ArrayList<>();
ArrayList<SalaryGrade> grades = new ArrayList<>();
String jsonFilePath="SalaryGrade.json";
grades=(ArrayList<SalaryGrade>)loadObjectToJsonFile(jsonFilePath,new TypeToken<ArrayList<SalaryGrade>>(){}.getType());
for (int i = 0; i < grades.size(); i++) {
Employee employee = new Employee(employees.get(i).getId(),employees.get(i).getName(),employees.get(i).getGender(),
employees.get(i).getJoiningDate()
,grades.get(i));
employeeArrayList.add(employee);
}
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(employeeArrayList);
try (FileWriter fileWriter = new FileWriter("Employee.json")) {
fileWriter.write(json);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Employee.json创建成功");
}
}
Login
package gui_total.general;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import gui_total.User;
import gui_total.manage.ShowAll;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
public class Login extends JFrame implements ActionListener {
private JTextField usernameText;
private JPasswordField passwordText;
private JButton loginBtn;
private JButton registerBtn;
public Login() {
setTitle("登录");
setAlwaysOnTop(true);
setLayout(null);//关闭默认布局类型 自己手动设置布局
setSize(400, 400);
setDefaultCloseOperation(3);//设置关闭模式
setLocationRelativeTo(null);//设置GUI显示居中
//创建界面组件
JLabel username = new JLabel("账号:");
JLabel password = new JLabel("密码:");
loginBtn = new JButton("登录");
loginBtn.addActionListener(this);//监听登录事件
registerBtn = new JButton("注册");
registerBtn.addActionListener(this);//监听注册事件
usernameText = new JTextField(15);
passwordText = new JPasswordField(15);
// 设置字体和背景颜色
usernameText.setForeground(Color.BLACK);
passwordText.setForeground(Color.BLACK);
usernameText.setBorder(BorderFactory.createLineBorder(Color.GRAY));
passwordText.setBorder(BorderFactory.createLineBorder(Color.GRAY));
//创建装组件的容器
JPanel usernameJp = new JPanel();
JPanel passwordJp = new JPanel();
JPanel loginJp = new JPanel();
//设置容器的位置
usernameJp.setBounds(30, 0, 300, 40);
passwordJp.setBounds(30, 40, 300, 40);
loginJp.setBounds(30, 90, 300, 40);
usernameJp.add(username);
usernameJp.add(usernameText);
passwordJp.add(password);
passwordJp.add(passwordText);
loginJp.add(loginBtn);
loginJp.add(registerBtn);
//将组件装入GUI
add(usernameJp);
add(passwordJp);
add(loginJp);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == loginBtn) {
String username = usernameText.getText();
String password = new String(passwordText.getPassword());
// 根据读取的用户账号信息进行校验
boolean temp = readUser(username, password);
System.out.println(temp);
if (temp) {
JOptionPane.showMessageDialog(this, "登录成功", "Success", JOptionPane.INFORMATION_MESSAGE);
this.dispose();//登录成功关闭此窗口 跳转页面
new ShowAll();
} else {
JOptionPane.showMessageDialog(this, "登陆失败", "Error", JOptionPane.ERROR_MESSAGE);
}
}//注册操作
else {
this.dispose();
new Register();
}
}
//读取用户数据
public boolean readUser(String username, String password) {
try (BufferedReader br = new BufferedReader(new FileReader("User.json"))) {
String json = "";
String line;
while ((line = br.readLine()) != null) {
json += line + "\n";
}
Gson gson = new Gson();
ArrayList<User> dataList = gson.fromJson(json, new TypeToken<ArrayList<User>>() {
}.getType());
for (User data : dataList) {
if (data.getUsername().equals(username) && data.getPassword().equals(password)) {
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
Register:
package gui_total.general;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import gui_total.User;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.io.FileReader;
import java.io.FileWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
public class Register extends JFrame implements ActionListener {
private JTextField usernameText;
private JPasswordField passwordText;
private JPasswordField passwordTextTrue;
private JButton registerBtn;
public Register() {
setLayout(null);
setTitle("注册");
setSize(400, 400);
setAlwaysOnTop(true);//设置界面一直处于最上层
setDefaultCloseOperation(3);
setLocationRelativeTo(null);
//组件
JLabel username = new JLabel("账号:");
JLabel password = new JLabel("密码:");
JLabel passwordTrue = new JLabel("确认密码:");
registerBtn = new JButton("注册");
registerBtn.addActionListener(this);
usernameText = new JTextField(15);
passwordText = new JPasswordField(15);
passwordTextTrue = new JPasswordField(15);
// 设置字体和背景颜色
usernameText.setForeground(Color.BLACK);
passwordText.setForeground(Color.BLACK);
passwordTextTrue.setForeground(Color.BLACK);
usernameText.setBorder(BorderFactory.createLineBorder(Color.GRAY));
passwordText.setBorder(BorderFactory.createLineBorder(Color.GRAY));
passwordTextTrue.setBorder(BorderFactory.createLineBorder(Color.GRAY));
//创建装组件的容器
JPanel usernameJp = new JPanel();
JPanel passwordJp = new JPanel();
JPanel passwordTrueJp = new JPanel();
JPanel registerJp = new JPanel();
//设置容器的位置
usernameJp.setBounds(30, 0, 300, 40);
passwordJp.setBounds(30, 50, 300, 40);
passwordTrueJp.setBounds(18, 100, 300, 40);
registerJp.setBounds(40, 150, 300, 40);
usernameJp.add(username);
usernameJp.add(usernameText);
passwordJp.add(password);
passwordJp.add(passwordText);
passwordTrueJp.add(passwordTrue);
passwordTrueJp.add(passwordTextTrue);
registerJp.add(registerBtn);
//将组件装入GUI
add(usernameJp);
add(passwordJp);
add(passwordTrueJp);
add(registerJp);
setVisible(true);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String username = usernameText.getText();
String password = new String(passwordText.getPassword());
String passwordTrue = new String(passwordTextTrue.getPassword());
ArrayList<User> user = getUserList();
for (User data : user) {
System.out.println(data.getUsername());
}
boolean found = false;
found = (!username.equals("") && !password.equals("") && !passwordTrue.equals("") && password.equals(passwordTrue));
System.out.println(found);
if (found) {
boolean temp = readUser(username, user);//检测用户名是否重复
if (temp) {
JOptionPane.showMessageDialog(this, "注册成功", "Success", JOptionPane.INFORMATION_MESSAGE);
String id = "00" + (user.toArray().length + 1);
user.add(new User(id, username, password));
String jsonFilePath = "User.json";
writeUser(jsonFilePath, username, password, user);//将新用户的数据写入json表中
this.dispose();
new Login();
} else {
JOptionPane.showMessageDialog(this, "用户名重复,注册失败", "Error", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(this, "注册失败,请正确填写用户名和密码", "Error", JOptionPane.ERROR_MESSAGE);
}
}
//获取用户的所有信息数据
public ArrayList<User> getUserList() {
try (BufferedReader br = new BufferedReader(new FileReader("User.json"))) {
String json = "";
String line;
while ((line = br.readLine()) != null) {
json += line + "\n";
}
Gson gson = new Gson();
ArrayList<User> dataList = gson.fromJson(json, new TypeToken<ArrayList<User>>() {
}.getType());
return dataList;
} catch (Exception e) {
e.printStackTrace();
}
return new ArrayList<User>();
}
//读取用户数据 检查有没有出现用户名重复的情况
public boolean readUser(String username, ArrayList<User> user) {
for (User data : user) {
if (data.getUsername().equals(username)) {
return false;
}
}
return true;
}
//将用户信息写入json文件中
public void writeUser(String jsonFilePath, String username, String password, ArrayList<User> user) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
// 1. 从 JSON 文件中读取并反序列化已有的对象列表
if (!(Files.exists(Paths.get(jsonFilePath)))) {
try {
Files.createFile(Paths.get(jsonFilePath));
try (FileWriter fileWriter = new FileWriter(jsonFilePath)) {
fileWriter.write("[]");
}
} catch (IOException e) {
e.printStackTrace();
}
}
try (Writer writer = new FileWriter(jsonFilePath)) {
Gson gsone = new GsonBuilder().setPrettyPrinting().create();
gsone.toJson(user, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Tool:静态方法实现数据增删读写。
package gui_total;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import gui_total.basic.Employee;
import gui_total.basic.MonthlySalary;
import gui_total.basic.SalaryChange;
import gui_total.basic.SalaryGrade;
import gui_total.data.DateInit;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import static gui_total.basic.Employee.cnt;
import static gui_total.data.DateInit.*;
//接收三个参数:
//newObj:表示要添加到 JSON 文件的新对象。
//jsonFilePath:表示要操作的 JSON 文件的路径。
//targetType:表示 JSON 文件的目标类型。在本例中,目标类型是 List<Item>,
// 因此需要使用 new TypeToken<ArrayList<Item>>(){}.getType() 来获取该类型。
public class Tool {
public static <T> void addObjectToJsonFile(T newObj, String jsonFilePath, Type targetType) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
// 1. 从 JSON 文件中读取并反序列化已有的对象列表
List<T> items = new ArrayList<>();
if (Files.exists(Paths.get(jsonFilePath))) {
try (FileReader fileReader = new FileReader(jsonFilePath)) {
items = gson.fromJson(fileReader, targetType);
} catch (IOException e) {
e.printStackTrace();
}
} else {
// 1.2 如果不存在,则创建新的 JSON 文件并存储一个空白数组
try {
Files.createFile(Paths.get(jsonFilePath));
try (FileWriter fileWriter = new FileWriter(jsonFilePath)) {
fileWriter.write("[]");
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 2. 向反序列化后的对象列表中添加新对象
if (items == null) items = new ArrayList<>();
else
{
items.add(newObj);
}
if(newObj instanceof Employee)
{
employeeHashMap.put(((Employee) newObj).getId(),(Employee) newObj);
} else if (newObj instanceof SalaryGrade) {
SalaryGradeHashMap.put(((SalaryGrade) newObj).getId(),(SalaryGrade) newObj);
}
else if (newObj instanceof SalaryChange) {
SalaryChangeHashMap.put(((SalaryChange) newObj).getEmployeeId(),(SalaryChange) newObj);
}
else if (newObj instanceof MonthlySalary) {
MonthlySalaryHashMap.put(((MonthlySalary) newObj).getEmployeeId(),(MonthlySalary) newObj);
}
// 3. 将更新后的对象列表序列化并写回 JSON 文件
String updatedJson = gson.toJson(items);
try (FileWriter fileWriter = new FileWriter(jsonFilePath)) {
fileWriter.write(updatedJson);
} catch (IOException e) {
e.printStackTrace();
}
DateInit.initAll();
}
public static <T> void removeObjectToJsonFile(T newObj, String jsonFilePath, Type targetType) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
// 1. 从 JSON 文件中读取并反序列化已有的对象列表
List<T> items = new ArrayList<>();
if (Files.exists(Paths.get(jsonFilePath))) {
try (FileReader fileReader = new FileReader(jsonFilePath)) {
items = gson.fromJson(fileReader, targetType);
} catch (IOException e) {
e.printStackTrace();
}
}
// 2. 向反序列化后的对象列表中删除新对象
Iterator<T> iterator = items.iterator();
while (iterator.hasNext()) {
T currentElement = iterator.next();
if (currentElement.equals(newObj)) {
iterator.remove();
System.out.println("删除成功");
if(newObj instanceof Employee)
{
employeeHashMap.remove(((Employee) newObj).getId());
} else if (newObj instanceof SalaryGrade) {
SalaryGradeHashMap.remove(((SalaryGrade) newObj).getId());
}
else if (newObj instanceof SalaryChange) {
SalaryChangeHashMap.remove(((SalaryChange) newObj).getEmployeeId());
}
else if (newObj instanceof MonthlySalary) {
MonthlySalaryHashMap.remove(((MonthlySalary) newObj).getEmployeeId());
}
break;
}
else
{
System.out.println("匹配失败");
}
}
// 3. 将更新后的对象列表序列化并写回 JSON 文件
String updatedJson = gson.toJson(items);
try (FileWriter fileWriter = new FileWriter(jsonFilePath)) {
fileWriter.write(updatedJson);
} catch (IOException e) {
e.printStackTrace();
}
DateInit.initAll();
}
public static List loadObjectToJsonFile(String jsonFilePath, Type targetType) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
// 1. 从 JSON 文件中读取并反序列化已有的对象列表
List items = new ArrayList<>();
if (Files.exists(Paths.get(jsonFilePath))) {
try (FileReader fileReader = new FileReader(jsonFilePath)) {
items = gson.fromJson(fileReader, targetType);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("读取成功");
} else {
// 1.2 如果不存在,则创建新的 JSON 文件并存储一个空白数组
try {
Files.createFile(Paths.get(jsonFilePath));
try (FileWriter fileWriter = new FileWriter(jsonFilePath)) {
fileWriter.write("[]");
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("读取失败,目标为空");
}
return items;
}
public static void writeObjectToJsonFile(List items, String jsonFilePath, Type targetType) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
// 1. 从 JSON 文件中读取并反序列化已有的对象列表
if (Files.exists(Paths.get(jsonFilePath))) {
String updatedJson = gson.toJson(items);
try (FileWriter fileWriter = new FileWriter(jsonFilePath)) {
fileWriter.write(updatedJson);
} catch (IOException e) {
e.printStackTrace();
}
}
DateInit.initAll();
}
}
ShowUser:通过refreshTable实现数据刷新。
package gui_total.manage;
import com.google.gson.reflect.TypeToken;
import gui_total.Tool;
import gui_total.User;
import gui_total.basic.Employee;
import gui_total.window.AddWindow1;
import gui_total.window.EditWindow1;
import gui_total.window.RemoveWindow1;
import gui_total.window.SearchWindow1;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class ShowUser extends JFrame implements ActionListener {
private DefaultTableModel model;//表格数据模型
private JScrollPane scrollPane;//滚动窗格
private JButton AddBtn;//增 删 改 查 按钮
private JButton RemoveBtn;
private JButton EditBtn;
private JButton SearchBtn;
public ShowUser() {
setTitle("显示所有职工基本信息");
setAlwaysOnTop(true);
//setBounds(100,100,500,400);
setDefaultCloseOperation(2);//设置关闭模式
// 设置窗口大小和位置
setSize(500, 300);
setLocationRelativeTo(null);
//创建表格数据模型
ArrayList<Employee> employees = (ArrayList<Employee>) Tool.loadObjectToJsonFile("Employee.json", new TypeToken<ArrayList<Employee>>(){}.getType());
int len = employees.toArray().length;//数据的行数
Object[][] data = new Object[len][4];
Object[] column = {"id", "username", "gender", "joiningDate"};//每一列的字段
//System.out.println(users);
int i = 0;
for (Employee x : employees){
data[i][0] = x.getId();
data[i][1] = x.getName();
data[i][2] = x.getGender();
data[i][3] = x.getJoiningDate();
i ++;
}
model = new DefaultTableModel(data, column);
JTable table = new JTable(model);//创建 JTable 组件
scrollPane = new JScrollPane(table);//使用 JScrollPane 将 JTable 放置在滚动窗格中,以便在表格中显示大量数据
// 创建一个 JPanel,使用 BoxLayout 布局
//BoxLayout 布局管理器默认情况下会将组件沿着 Y 轴方向排列(即垂直方向)
//如果需要水平排列,需要将 BoxLayout 构造函数的第二个参数设置为 BoxLayout.X_AXIS
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
// 将 JScrollPane 添加到面板中
panel.add(scrollPane);
AddBtn = new JButton("增添");
RemoveBtn = new JButton("删除");
EditBtn = new JButton("修改");
SearchBtn = new JButton("查看");
AddBtn.addActionListener(this);//监听增添事件
RemoveBtn.addActionListener(this);//监听删除事件
EditBtn.addActionListener(this);//监听修改事件
SearchBtn.addActionListener(this);//监听查看事件
// 创建一个 JPanel,使用 FlowLayout 布局将 4个按钮排列在同一行中。
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
buttonPanel.add(AddBtn);
buttonPanel.add(RemoveBtn);
buttonPanel.add(EditBtn);
buttonPanel.add(SearchBtn);
// 将面板添加到 JFrame中
getContentPane().add(panel);
// 将按钮面板添加到面板中
panel.add(buttonPanel);
setVisible(true);
}
public void dateupdate()
{
model.setRowCount(0);
ArrayList<Employee> employees = (ArrayList<Employee>) Tool.loadObjectToJsonFile("Employee.json", new TypeToken<ArrayList<Employee>>(){}.getType());
int len = employees.size();//数据的行数
System.out.println("ShowUser当前数据个数"+len);
Object[][] data = new Object[len][4];
Object[] column = {"id", "username", "gender", "joiningDate"};//每一列的字段
int i = 0;
for (Employee x : employees){
data[i][0] = x.getId();
data[i][1] = x.getName();
data[i][2] = x.getGender();
data[i][3] = x.getJoiningDate();
i ++;
}
model = new DefaultTableModel(data, column);
}
public void refreshTable() {
dateupdate();
scrollPane.setViewportView(new JTable(model));
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == AddBtn){
new AddWindow1(this,"id:", "name:", "gender:", "joiningDate:");
}
else if (e.getSource() == RemoveBtn){
new RemoveWindow1(this,"id:", "name:", "gender:", "joiningDate:");
}
else if (e.getSource() == EditBtn){
new EditWindow1(this,"id:", "name:", "gender:", "joiningDate:");
}
else {
new SearchWindow1("id:", "name:", "gender:", "joiningDate:");
}
}
}
运行截图:
课程设计小结:
其实还有很多可以改进的地方,有很多地方图省事直接copy过来,导致代码写的很长,而且这gui界面也不是很满意,另外就是数据处理的地方没有加入server层作为中间层,代码扩展性不好,除此以为我感觉这个数据刷新的方法不是很好,不能同时刷新多个界面,后续还可以继续优化。总的来说写出这个系统还是让我对以往学过的知识进行了巩固,后续的编写也会吸取这次教训,争取让代码更精简。