利用ai写一个web系统
这里是先通过chatgpt对一段用户需求进行分析得到各个功能模块:
- 用户管理模块 用户注册与登录:允许新用户注册并使用账户登录。 角色管理:定义不同角色(如管理员、仓库管理员、普通用户)及其权限。 密码管理:支持密码修改和找回功能。
- 物资管理模块 物资台账:包含物资编码、物资名称、规格、材质、供应商、品牌、物资分类等信息。 物资分类自定义:允许用户自定义物资分类。 物资编码规则:确保不同的物资名称、规格、材质的物资不能拥有相同的物资编码。 物资信息维护:支持物资信息的添加、修改和删除操作。
- 库存管理模块 库存查询:支持按物资编码查询库存信息,以及按物资分类汇总的库存信息。 库存预警:设定库存上下限,当库存低于或高于预设值时发出警告。
- 入库管理模块 入库单生成:系统自动生成入库单据编码,采用年月日+流水号的方式。 入库作业:记录入库时间、数量、经办人等信息。
- 出库管理模块 出库单生成:系统自动生成出库单据编码,同样采用年月日+流水号的方式。 出库作业:记录出库时间、数量、经办人等信息。
- 单据管理模块 单据查询:支持查询入库单和出库单信息。 单据打印:支持打印入库单和出库单。 7. 系统设置模块 数据备份与恢复:定期备份数据库,以便在需要时恢复数据。 系统日志:记录用户的操作日志,便于审计和追踪。
然后针对功能模块生成所需的数据库表:
create database ai;
use ai;
CREATE TABLE Users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
role ENUM('admin', 'warehouse_manager', 'user') NOT NULL DEFAULT 'user',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE MaterialCategories (
category_id INT AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(100) NOT NULL UNIQUE
);
CREATE TABLE Materials (
material_id INT AUTO_INCREMENT PRIMARY KEY,
material_code VARCHAR(20) NOT NULL UNIQUE,
material_name VARCHAR(100) NOT NULL,
specification VARCHAR(100),
material_type VARCHAR(50),
supplier VARCHAR(100),
brand VARCHAR(50),
category_id INT,
FOREIGN KEY (category_id) REFERENCES MaterialCategories(category_id)
);
CREATE TABLE Stocks (
stock_id INT AUTO_INCREMENT PRIMARY KEY,
material_id INT,
warehouse_id INT,
quantity INT NOT NULL,
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (material_id) REFERENCES Materials(material_id)
);
CREATE TABLE InboundOrders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_code VARCHAR(20) NOT NULL UNIQUE,
material_id INT,
quantity INT NOT NULL,
warehouse_id INT,
entry_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
handler_id INT,
FOREIGN KEY (material_id) REFERENCES Materials(material_id),
FOREIGN KEY (handler_id) REFERENCES Users(user_id)
);
CREATE TABLE OutboundOrders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_code VARCHAR(20) NOT NULL UNIQUE,
material_id INT,
quantity INT NOT NULL,
warehouse_id INT,
exit_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
handler_id INT,
FOREIGN KEY (material_id) REFERENCES Materials(material_id),
FOREIGN KEY (handler_id) REFERENCES Users(user_id)
);
CREATE TABLE InboundOrderDetails (
detail_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
material_id INT,
quantity INT NOT NULL,
FOREIGN KEY (order_id) REFERENCES InboundOrders(order_id),
FOREIGN KEY (material_id) REFERENCES Materials(material_id)
);
CREATE TABLE OutboundOrderDetails (
detail_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
material_id INT,
quantity INT NOT NULL,
FOREIGN KEY (order_id) REFERENCES OutboundOrders(order_id),
FOREIGN KEY (material_id) REFERENCES Materials(material_id)
);
CREATE TABLE Backups (
backup_id INT AUTO_INCREMENT PRIMARY KEY,
backup_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
backup_file_path VARCHAR(255)
);
CREATE TABLE SystemLogs (
log_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
action VARCHAR(255),
log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
然后针对每个模块分析,生成其具体的功能:
- 用户管理模块
• 用户注册与登录:允许新用户通过输入用户名、密码等信息进行注册,并支持通过用户名/邮箱/手机号和密码进行登录。
• 角色管理:
o 角色定义:定义不同角色,如管理员、仓库管理员、普通用户等。
o 角色权限分配:为每个角色分配相应的操作权限,例如管理员可查看所有数据,仓库管理员只能查看和编辑仓库数据,普通用户只能查看自己的数据。
• 密码管理:
o 密码修改:允许用户在登录后修改自己的密码。
o 密码找回:允许用户通过绑定的邮箱或手机号找回密码。 - 物资管理模块
• 物资台账:包含物资的基本信息,如物资编码、物资名称、规格、材质、供应商、品牌、物资分类等。
• 物资分类自定义:允许用户根据需求自定义物资分类,方便管理和查找。
• 物资编码规则:制定物资编码规则,确保每种物资都有唯一的编码,即使它们的名称、规格或材质相同。
• 物资信息维护:
o 添加:允许用户添加新的物资信息。
o 修改:允许用户修改已存在的物资信息。
o 删除:允许用户删除不再需要的物资信息。 - 库存管理模块
• 库存查询:
o 按物资编码查询:允许用户通过输入物资编码来查询该物资的库存情况。
o 按物资分类汇总查询:允许用户查询某一类物资的总库存量。
• 库存预警:
o 设定库存上下限:允许用户为每种物资设定最低和最高库存阈值。
o 发出警告:当库存低于或高于预设值时,系统自动发送警告通知。 - 入库管理模块
• 入库单生成:系统自动生成唯一的入库单编码,采用年月日+流水号的方式。
• 入库作业:
o 记录入库时间:记录物资入库的具体日期和时间。
o 记录入库数量:记录本次入库的数量。
o 记录经办人:记录办理入库手续的人员信息。 - 出库管理模块
• 出库单生成:系统自动生成唯一的出库单编码,同样采用年月日+流水号的方式。
• 出库作业:
o 记录出库时间:记录物资出库的具体日期和时间。
o 记录出库数量:记录本次出库的数量。
o 记录经办人:记录办理出库手续的人员信息。 - 单据管理模块
• 单据查询:支持查询所有入库单和出库单的信息,包括单据编号、日期、经办人等。
• 单据打印:支持打印入库单和出库单,方便存档和查阅。 - 系统设置模块
• 数据备份与恢复:
o 数据备份:定期备份数据库,确保数据安全。
o 数据恢复:在需要时,能够从备份中恢复数据。
• 系统日志:
o 记录操作日志:记录用户的所有操作行为,便于审计和追踪。
o 查看日志:提供一个界面供管理员查看和搜索系统日志。
然后生成对应的java数据:
private int userId;
private String username;
private String passwordHash;
private String role;
private Timestamp createdAt;
public User() {}
public User(int userId, String username, String passwordHash, String role, Timestamp createdAt) {
this.userId = userId;
this.username = username;
this.passwordHash = passwordHash;
this.role = role;
this.createdAt = createdAt;
}
// Getters
public int getUserId() { return userId; }
public String getUsername() { return username; }
public String getPasswordHash() { return passwordHash; }
public String getRole() { return role; }
public Timestamp getCreatedAt() { return createdAt; }
}
public class MaterialCategory {
private int categoryId;
private String categoryName;
public MaterialCategory() {}
public MaterialCategory(int categoryId, String categoryName) {
this.categoryId = categoryId;
this.categoryName = categoryName;
}
// Getters
public int getCategoryId() { return categoryId; }
public String getCategoryName() { return categoryName; }
}
public class Material {
private int materialId;
private String materialCode;
private String materialName;
private String specification;
private String materialType;
private String supplier;
private String brand;
private int categoryId;
public Material() {}
public Material(int materialId, String materialCode, String materialName, String specification, String materialType, String supplier, String brand, int categoryId) {
this.materialId = materialId;
this.materialCode = materialCode;
this.materialName = materialName;
this.specification = specification;
this.materialType = materialType;
this.supplier = supplier;
this.brand = brand;
this.categoryId = categoryId;
}
// Getters
public int getMaterialId() { return materialId; }
public String getMaterialCode() { return materialCode; }
public String getMaterialName() { return materialName; }
public String getSpecification() { return specification; }
public String getMaterialType() { return materialType; }
public String getSupplier() { return supplier; }
public String getBrand() { return brand; }
public int getCategoryId() { return categoryId; }
}
public class Stock {
private int stockId;
private int materialId;
private int warehouseId;
private int quantity;
private Timestamp lastUpdated;
public Stock() {}
public Stock(int stockId, int materialId, int warehouseId, int quantity, Timestamp lastUpdated) {
this.stockId = stockId;
this.materialId = materialId;
this.warehouseId = warehouseId;
this.quantity = quantity;
this.lastUpdated = lastUpdated;
}
// Getters
public int getStockId() { return stockId; }
public int getMaterialId() { return materialId; }
public int getWarehouseId() { return warehouseId; }
public int getQuantity() { return quantity; }
public Timestamp getLastUpdated() { return lastUpdated; }
}
public class InboundOrder {
private int orderId;
private String orderCode;
private int materialId;
private int quantity;
private int warehouseId;
private Timestamp entryTime;
private int handlerId;
public InboundOrder() {}
public InboundOrder(int orderId, String orderCode, int materialId, int quantity, int warehouseId, Timestamp entryTime, int handlerId) {
this.orderId = orderId;
this.orderCode = orderCode;
this.materialId = materialId;
this.quantity = quantity;
this.warehouseId = warehouseId;
this.entryTime = entryTime;
this.handlerId = handlerId;
}
// Getters
public int getOrderId() { return orderId; }
public String getOrderCode() { return orderCode; }
public int getMaterialId() { return materialId; }
public int getQuantity() { return quantity; }
public int getWarehouseId() { return warehouseId; }
public Timestamp getEntryTime() { return entryTime; }
public int getHandlerId() { return handlerId; }
}
public class OutboundOrder {
private int orderId;
private String orderCode;
private int materialId;
private int quantity;
private int warehouseId;
private Timestamp exitTime;
private int handlerId;
public OutboundOrder() {}
public OutboundOrder(int orderId, String orderCode, int materialId, int quantity, int warehouseId, Timestamp exitTime, int handlerId) {
this.orderId = orderId;
this.orderCode = orderCode;
this.materialId = materialId;
this.quantity = quantity;
this.warehouseId = warehouseId;
this.exitTime = exitTime;
this.handlerId = handlerId;
}
// Getters
public int getOrderId() { return orderId; }
public String getOrderCode() { return orderCode; }
public int getMaterialId() { return materialId; }
public int getQuantity() { return quantity; }
public int getWarehouseId() { return warehouseId; }
public Timestamp getExitTime() { return exitTime; }
public int getHandlerId() { return handlerId; }
}
public class InboundOrderDetail {
private int detailId;
private int orderId;
private int materialId;
private int quantity;
public InboundOrderDetail() {}
public InboundOrderDetail(int detailId, int orderId, int materialId, int quantity) {
this.detailId = detailId;
this.orderId = orderId;
this.materialId = materialId;
this.quantity = quantity;
}
// Getters
public int getDetailId() { return detailId; }
public int getOrderId() { return orderId; }
public int getMaterialId() { return materialId; }
public int getQuantity() { return quantity; }
}
public class OutboundOrderDetail {
private int detailId;
private int orderId;
private int materialId;
private int quantity;
public OutboundOrderDetail() {}
public OutboundOrderDetail(int detailId, int orderId, int materialId, int quantity) {
this.detailId = detailId;
this.orderId = orderId;
this.materialId = materialId;
this.quantity = quantity;
}
// Getters
public int getDetailId() { return detailId; }
public int getOrderId() { return orderId; }
public int getMaterialId() { return materialId; }
public int getQuantity() { return quantity; }
}
public class Backup {
private int backupId;
private Timestamp backupTime;
private String backupFilePath;
public Backup() {}
public Backup(int backupId, Timestamp backupTime, String backupFilePath) {
this.backupId = backupId;
this.backupTime = backupTime;
this.backupFilePath = backupFilePath;
}
// Getters
public int getBackupId() { return backupId; }
public Timestamp getBackupTime() { return backupTime; }
public String getBackupFilePath() { return backupFilePath; }
}
public class SystemLog {
private int logId;
private int userId;
private String action;
private Timestamp logTime;
public SystemLog() {}
public SystemLog(int logId, int userId, String action, Timestamp logTime) {
this.logId = logId;
this.userId = userId;
this.action = action;
this.logTime = logTime;
}
// Getters
public int getLogId() { return logId; }
public int getUserId() { return userId; }
public String getAction() { return action; }
public Timestamp getLogTime() { return logTime; }
}
然后将这些内容打包进一个记事本或者word文档,交给deepseek,生成其所需的基本功能:
用户管理模块
JSP页面:register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="RegisterServlet" method="post">
用户名: <input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
角色:
<select name="role">
<option value="admin">管理员</option>
<option value="warehouse_manager">仓库管理员</option>
<option value="user">普通用户</option>
</select><br>
<input type="submit" value="注册">
</form>
</body>
</html>
Servlet:RegisterServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String role = request.getParameter("role");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
PreparedStatement ps = conn.prepareStatement("INSERT INTO Users(username, password_hash, role) VALUES (?, ?, ?)");
ps.setString(1, username);
ps.setString(2, password); // 在实际应用中,应使用哈希算法加密密码
ps.setString(3, role);
ps.executeUpdate();
response.sendRedirect("login.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}
}
物资管理模块
JSP页面:add_material.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>添加物资</title>
</head>
<body>
<form action="AddMaterialServlet" method="post">
物资编码: <input type="text" name="materialCode"><br>
物资名称: <input type="text" name="materialName"><br>
规格: <input type="text" name="specification"><br>
材质类型: <input type="text" name="materialType"><br>
供应商: <input type="text" name="supplier"><br>
品牌: <input type="text" name="brand"><br>
分类ID: <input type="number" name="categoryId"><br>
<input type="submit" value="添加">
</form>
</body>
</html>
Servlet:AddMaterialServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@WebServlet("/AddMaterialServlet")
public class AddMaterialServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String materialCode = request.getParameter("materialCode");
String materialName = request.getParameter("materialName");
String specification = request.getParameter("specification");
String materialType = request.getParameter("materialType");
String supplier = request.getParameter("supplier");
String brand = request.getParameter("brand");
int categoryId = Integer.parseInt(request.getParameter("categoryId"));
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
PreparedStatement ps = conn.prepareStatement("INSERT INTO Materials(material_code, material_name, specification, material_type, supplier, brand, category_id) VALUES (?, ?, ?, ?, ?, ?, ?)");
ps.setString(1, materialCode);
ps.setString(2, materialName);
ps.setString(3, specification);
ps.setString(4, materialType);
ps.setString(5, supplier);
ps.setString(6, brand);
ps.setInt(7, categoryId);
ps.executeUpdate();
response.sendRedirect("materials.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}
}
库存管理模块
JSP页面:stock_query.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>库存查询</title>
</head>
<body>
<h1>按物资编码查询</h1>
<form action="StockQueryByCodeServlet" method="post">
物资编码: <input type="text" name="materialCode"><br>
<input type="submit" value="查询">
</form>
<h1>按物资分类汇总查询</h1>
<form action="StockQueryByCategoryServlet" method="post">
分类ID: <input type="number" name="categoryId"><br>
<input type="submit" value="查询">
</form>
</body>
</html>
Servlet:StockQueryByCodeServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@WebServlet("/StockQueryByCodeServlet")
public class StockQueryByCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String materialCode = request.getParameter("materialCode");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
PreparedStatement ps = conn.prepareStatement("SELECT * FROM Stocks WHERE material_id = (SELECT material_id FROM Materials WHERE material_code = ?)");
ps.setString(1, materialCode);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
response.getWriter().println("库存量: " + rs.getInt("quantity"));
} else {
response.getWriter().println("未找到对应物资");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Servlet:StockQueryByCategoryServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@WebServlet("/StockQueryByCategoryServlet")
public class StockQueryByCategoryServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int categoryId = Integer.parseInt(request.getParameter("categoryId"));
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
PreparedStatement ps = conn.prepareStatement("SELECT SUM(quantity) AS total_quantity FROM Stocks WHERE material_id IN (SELECT material_id FROM Materials WHERE category_id = ?)");
ps.setInt(1, categoryId);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
response.getWriter().println("总库存量: " + rs.getInt("total_quantity"));
} else {
response.getWriter().println("未找到对应分类的物资");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
入库管理模块
JSP页面:inbound_order.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>入库单生成</title>
</head>
<body>
<form action="InboundOrderServlet" method="post">
物资编码: <input type="text" name="materialCode"><br>
数量: <input type="number" name="quantity"><br>
仓库ID: <input type="number" name="warehouseId"><br>
经办人ID: <input type="number" name="handlerId"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
Servlet:InboundOrderServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@WebServlet("/InboundOrderServlet")
public class InboundOrderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String materialCode = request.getParameter("materialCode");
int quantity = Integer.parseInt(request.getParameter("quantity"));
int warehouseId = Integer.parseInt(request.getParameter("warehouseId"));
int handlerId = Integer.parseInt(request.getParameter("handlerId"));
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
// 获取物资ID
PreparedStatement psGetMaterialId = conn.prepareStatement("SELECT material_id FROM Materials WHERE material_code = ?");
psGetMaterialId.setString(1, materialCode);
ResultSet rs = psGetMaterialId.executeQuery();
rs.next();
int materialId = rs.getInt("material_id");
// 插入入库单
PreparedStatement psInsertOrder = conn.prepareStatement("INSERT INTO InboundOrders(order_code, material_id, quantity, warehouse_id, handler_id) VALUES (?, ?, ?, ?, ?)", PreparedStatement.RETURN_GENERATED_KEYS);
psInsertOrder.setString(1, generateOrderCode());
psInsertOrder.setInt(2, materialId);
psInsertOrder.setInt(3, quantity);
psInsertOrder.setInt(4, warehouseId);
psInsertOrder.setInt(5, handlerId);
psInsertOrder.executeUpdate();
// 更新库存
PreparedStatement psUpdateStock = conn.prepareStatement("UPDATE Stocks SET quantity = quantity + ? WHERE material_id = ? AND warehouse_id = ?");
psUpdateStock.setInt(1, quantity);
psUpdateStock.setInt(2, materialId);
psUpdateStock.setInt(3, warehouseId);
psUpdateStock.executeUpdate();
response.sendRedirect("index.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}
private String generateOrderCode() {
// 实现订单编码生成逻辑
return "IN" + System.currentTimeMillis();
}
}
出库管理模块
JSP页面:outbound_order.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>出库单生成</title>
</head>
<body>
<form action="OutboundOrderServlet" method="post">
物资编码: <input type="text" name="materialCode"><br>
数量: <input type="number" name="quantity"><br>
仓库ID: <input type="number" name="warehouseId"><br>
经办人ID: <input type="number" name="handlerId"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
Servlet:OutboundOrderServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@WebServlet("/OutboundOrderServlet")
public class OutboundOrderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String materialCode = request.getParameter("materialCode");
int quantity = Integer.parseInt(request.getParameter("quantity"));
int warehouseId = Integer.parseInt(request.getParameter("warehouseId"));
int handlerId = Integer.parseInt(request.getParameter("handlerId"));
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
// 获取物资ID
PreparedStatement psGetMaterialId = conn.prepareStatement("SELECT material_id FROM Materials WHERE material_code = ?");
psGetMaterialId.setString(1, materialCode);
ResultSet rs = psGetMaterialId.executeQuery();
rs.next();
int materialId = rs.getInt("material_id");
// 插入出库单
PreparedStatement psInsertOrder = conn.prepareStatement("INSERT INTO OutboundOrders(order_code, material_id, quantity, warehouse_id, handler_id) VALUES (?, ?, ?, ?, ?)", PreparedStatement.RETURN_GENERATED_KEYS);
psInsertOrder.setString(1, generateOrderCode());
psInsertOrder.setInt(2, materialId);
psInsertOrder.setInt(3, quantity);
psInsertOrder.setInt(4, warehouseId);
psInsertOrder.setInt(5, handlerId);
psInsertOrder.executeUpdate();
// 更新库存
PreparedStatement psUpdateStock = conn.prepareStatement("UPDATE Stocks SET quantity = quantity - ? WHERE material_id = ? AND warehouse_id = ?");
psUpdateStock.setInt(1, quantity);
psUpdateStock.setInt(2, materialId);
psUpdateStock.setInt(3, warehouseId);
psUpdateStock.executeUpdate();
response.sendRedirect("index.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}
private String generateOrderCode() {
// 实现订单编码生成逻辑
return "OUT" + System.currentTimeMillis();
}
}
单据管理模块
JSP页面:bill_query.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>单据查询</title>
</head>
<body>
<form action="BillQueryServlet" method="post">
单据编号: <input type="text" name="billCode"><br>
<input type="submit" value="查询">
</form>
</body>
</html>
Servlet:BillQueryServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@WebServlet("/BillQueryServlet")
public class BillQueryServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String billCode = request.getParameter("billCode");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
PreparedStatement ps = conn.prepareStatement("SELECT * FROM InboundOrders WHERE order_code = ? UNION ALL SELECT * FROM OutboundOrders WHERE order_code = ?");
ps.setString(1, billCode);
ps.setString(2, billCode);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
response.getWriter().println("单据编号: " + rs.getString("order_code") + "<br>");
response.getWriter().println("物资ID: " + rs.getInt("material_id") + "<br>");
response.getWriter().println("数量: " + rs.getInt("quantity") + "<br>");
response.getWriter().println("仓库ID: " + rs.getInt("warehouse_id") + "<br>");
response.getWriter().println("经办人ID: " + rs.getInt("handler_id") + "<br>");
response.getWriter().println("操作时间: " + rs.getTimestamp("entry_time") + "<br>");
response.getWriter().println("-------------------------------<br>");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
系统设置模块
JSP页面:backup.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>数据备份</title>
</head>
<body>
<form action="BackupServlet" method="post">
<input type="submit" value="备份">
</form>
</body>
</html>
Servlet:BackupServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@WebServlet("/BackupServlet")
public class BackupServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
// 执行备份操作
// 这里仅做示例,实际应用中需要调用MySQL的备份命令
PreparedStatement ps = conn.prepareStatement("INSERT INTO Backups(backup_time, backup_file_path) VALUES (CURRENT_TIMESTAMP, '/path/to/backup.sql')");
ps.executeUpdate();
response.sendRedirect("index.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}
}
1. 密码修改功能
JSP页面:change_password.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>修改密码</title>
</head>
<body>
<form action="ChangePasswordServlet" method="post">
原密码: <input type="password" name="oldPassword"><br>
新密码: <input type="password" name="newPassword"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
Servlet:ChangePasswordServlet.java
Java
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.sql.*;
@WebServlet("/ChangePasswordServlet")
public class ChangePasswordServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
int userId = (int) session.getAttribute("userId");
String oldPassword = request.getParameter("oldPassword");
String newPassword = request.getParameter("newPassword");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
PreparedStatement ps = conn.prepareStatement(
"UPDATE Users SET password_hash = ? WHERE user_id = ? AND password_hash = ?");
ps.setString(1, newPassword); // 实际应使用哈希加密
ps.setInt(2, userId);
ps.setString(3, oldPassword);
int rows = ps.executeUpdate();
if (rows > 0) {
response.sendRedirect("dashboard.jsp?msg=密码修改成功");
} else {
response.sendRedirect("change_password.jsp?error=原密码错误");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2角色管理功能
JSP页面:role_management.jsp(仅管理员可见)
Jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>角色管理</title>
</head>
<body>
<h1>角色权限分配</h1>
<form action="RoleManagementServlet" method="post">
用户ID: <input type="number" name="userId"><br>
新角色:
<select name="role">
<option value="admin">管理员</option>
<option value="warehouse_manager">仓库管理员</option>
<option value="user">普通用户</option>
</select><br>
<input type="submit" value="更新角色">
</form>
</body>
</html>
Servlet:RoleManagementServlet.java
java
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.sql.*;
@WebServlet("/RoleManagementServlet")
public class RoleManagementServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int userId = Integer.parseInt(request.getParameter("userId"));
String role = request.getParameter("role");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
PreparedStatement ps = conn.prepareStatement(
"UPDATE Users SET role = ? WHERE user_id = ?");
ps.setString(1, role);
ps.setInt(2, userId);
ps.executeUpdate();
response.sendRedirect("dashboard.jsp?msg=角色更新成功");
} catch (Exception e) {
e.printStackTrace();
}
}
}
登录页面(login.jsp)
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
<%-- 显示错误信息 --%>
<% if (request.getParameter("error") != null) { %>
<p style="color:red;">用户名或密码错误!</p>
<% } %>
<form action="LoginServlet" method="post">
用户名: <input type="text" name="username" required><br>
密码: <input type="password" name="password" required><br>
<input type="submit" value="登录">
</form>
<p>没有账号?<a href="register.jsp">立即注册</a></p>
</body>
</html>
登录处理Servlet(LoginServlet.java)
java
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.sql.*;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ai", "root", "your_password");
PreparedStatement ps = conn.prepareStatement(
"SELECT user_id, username, role, password_hash FROM Users WHERE username = ?");
ps.setString(1, username);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
String storedHash = rs.getString("password_hash");
// 实际应使用BCrypt验证密码:BCrypt.checkpw(password, storedHash)
if (password.equals(storedHash)) { // 示例中明文对比,实际需替换为哈希验证
HttpSession session = request.getSession();
session.setAttribute("userId", rs.getInt("user_id"));
session.setAttribute("username", rs.getString("username"));
session.setAttribute("role", rs.getString("role"));
response.sendRedirect("dashboard.jsp");
} else {
response.sendRedirect("login.jsp?error=1");
}
} else {
response.sendRedirect("login.jsp?error=1");
}
} catch (Exception e) {
e.printStackTrace();
response.sendRedirect("login.jsp?error=1");
}
}
}
JSP页面:dashboard.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主操作页面</title>
</head>
<body>
<h1>欢迎, <%= session.getAttribute("username") %></h1>
<div>
<%
String role = (String) session.getAttribute("role");
if (role == null) {
response.sendRedirect("login.jsp"); // 未登录则跳转登录页
return;
}
%>
<% if (role.equals("admin")) { %>
<h2>管理员功能</h2>
<a href="role_management.jsp">角色管理</a><br>
<a href="backup.jsp">数据备份</a><br>
<a href="system_logs.jsp">系统日志</a><br>
<% } %>
<% if (role.equals("admin") || role.equals("warehouse_manager")) { %>
<h2>仓库管理功能</h2>
<a href="inbound_order.jsp">入库管理</a><br>
<a href="outbound_order.jsp">出库管理</a><br>
<a href="stock_query.jsp">库存查询</a><br>
<% } %>
<h2>通用功能</h2>
<a href="change_password.jsp">修改密码</a><br>
<a href="LogoutServlet">退出登录</a>
</div>
<%-- 显示操作结果消息 --%>
<% if (request.getParameter("msg") != null) { %>
<p style="color:green;"><%= request.getParameter("msg") %></p>
<% } %>
</body>
</html>
需要对其中的数据库的账户密码进行修改,在本次使用爱的过程中清楚地体会的逻辑的重要性,需要给予ai一个详细的要求和大致的框架,防止最后我们得不到想要的代码。

浙公网安备 33010602011771号