代码编织梦想

一、项目简介

1.1 项目选题背景

选择这个选题,是我们小组一起商讨出来的结果,因为感觉现在的年轻团体可能会比较喜欢咖啡这一类的饮品,然后我们平常也会接触到这一类饮品的点餐页面,比较熟悉,我们就可以加点自己的想法进去。

1.2功能介绍

用户:新用户使用系统之前,需要注册账户,注册成功以后就可以登录系统,进入系统以后,可以进行点单,将商品加入购物车,下单,点单成功后用cookie存储点单记录可以查看最近3个月的订单,也可以在个人信息界面修改个人信息。

管理员:管理员使用admin账号登录系统,管理员可以控制咖啡的上架与下架,可以增加员工,删除员工以及管理所有用户,员工信息。

员工:员工使用worker账号登录系统,员工可以查看用户订单,用户座位号等等,也可以在个人信息界面修改个人信息。

二、数据库设计

2.1 确定实体

2.1.1 实体应用场景

登录功能包含:涉及顾客用户名,还有密码
注册功能包含:顾客姓名或邮箱,密码,电话及性别(一张表)
点单功能包含:涉及产品的名称,产品的简介还有产品的价格及产品的好评度
反馈功能包含:邮箱,姓名(一张表)
购物车功能包含:产品名称,产品简介,产品数量,产品价格

2.1.2 实体属性分析

用户(用户名,姓名,性别,密码,邮箱,手机号,出生年月)
咖啡产品(咖啡编号,咖啡名称,咖啡类别,咖啡价格)
餐桌(餐桌号,座位号,使用状态)
员工(工号,姓名,年龄,性别,工资)
订单(订单号,顾客编号,消费时间,餐桌编号,服务员编号,消费金额)
联系我们(反馈内容,姓名,联系电话)
折扣规则(折扣单号,折扣,未折扣金额)

三、前端设计

3.1 首页简介

3.1.1 首页设计的目的

系统使用这个首页是为了展示我们自己的咖啡品牌,和我们的咖啡样式。通过轮播的效果展示了我们的产品,让用户看到我们产品的多样性,用纯白色的背景加上有咖啡色元素的logo很好的显示了咖啡品牌名字,以及品牌logo。这样设计的原因是因为可以很好的展示我们的咖啡的外观和自己品牌的logo以及名称,让咖啡品牌居中可以让用户直接明了的看到我们的品牌和了解到我们是做什么的网站。中部品牌名,使用了hrel让鼠标放在品牌名上是可以实现自动翻转并改变颜色,在鼠标离开自动返回原样。用大屏图片定时轮播效果来对咖啡产品进行展示,可以一下子就吸引住用户的眼球,对我们精美的产品产生兴趣,让用户了解到我们产品的多样。在最上面的导航栏,起到引导用户进行下一步操作的作用,让用户可以快速的找到自己所需要的功能的页面。

3.1.2 首页布局

首页使用了131的布局结构,第一个部分是导航栏使用了灰色和黑色的冷色系搭配,在我们的按钮的位置设置了下拉组件,隐藏部分按钮。第二部分是展示logo,品牌名以及搭配图片,在第二部分的左侧logo部分使用展示div块和class去设置他的效果。第二部分的中部品牌名使用了hrel让品牌名上是可以实现自动翻转并改变颜色,在鼠标离开自动返回原样。在第二部分右侧,与左侧一样使用了div以及class去设置他的效果。第三部分是产品样式的展示,使用了轮播效果和class,用高清的图片很好的展示咖啡效果。

在这里插入图片描述

3.2 登录页面介绍

3.2.1 登录页面设计的目的

登录页面是给用户登录系统进行点单的页面,这个页面背景使用了全屏覆盖,使页面颜色不会过于单调,在页面右侧有一个登录框,用户登录时将已经注册过的账号和密码输入后,点击登录进入点单页面,如果没有注册,用户在左下角点击注册即可进入注册页面,如果忘记了密码,点击忘记密码,即可进入修改密码页面。在卡片组件的下端还有我们的品牌名称。

3.2.2登录页面布局

登录页面使用了卡片主键和按钮点击,当你输入完账号和密码时点击登录,页面进入点单页面,如果没有注册该账号,也会弹出提示。页面背景颜色以蓝绿色为主,所用在卡片组件的背景上有淡蓝色,文字采用了白色作为搭配,让页面风格简单大方。
在这里插入图片描述

3.3 注册页面介绍

3.3.1注册页面设计的目的

注册页面是给新用户需要登录系统时,没有已经注册账号,用来注册的页面,这个页面背景使用了全屏覆盖,使页面颜色不会过于单调,在页面中间有一个注册框,用户注册时将信息输入进去,点击注册按钮,完成注册。

3.3.2注册页面布局

注册页面使用了卡片组件和按钮点击,当你输入完所用时点击注册,页面跳转到登录页面,完成注册。背景颜色使用了黑色与金色相搭配,所以在文字也是使用金色和白色进行搭配,让页面看起来高端大气。
在这里插入图片描述

3.4 购物车页面介绍

3.4.1 购物车页面设计的目的

此页面主要用于用户查看点餐的咖啡,可以增加数量,减少数量。同时,此页面也可查看咖啡的简介与咖啡评价,方便用户做出二次选择,购买自己真正想购买的咖啡。页面设置了移除商品的功能,用户若对于某个咖啡不满意,可直接移除,将不出现在购买页面。用户可选中自己最后想买的咖啡,确定好数量,提交即可。

3.4.2页面布局

整体背景色为白色;字体为黑色;价格字体为红色;底边为浅灰色;提交建为深灰色,字体为白色。
在这里插入图片描述

3.5 反馈页面介绍

3.5.1 反馈页面设计的目的

反馈页面用于用户对于我们官网应用方面的一些反馈,除此以外,对于咖啡产品的品尝体验也可以通过这个进行反馈。只需要输入用户名字,电话号码和反馈内容就行,我们会定期观看用户的各种反馈,以求对我们的咖啡产品以及官网使用体验能够定期做出更新,使广大用户都能够满意。除了反馈之外,如果用户对于我们的期望或者是对我们的发展前景有可取的意见或建议,我们也会及时知晓并及时吸取,做出改进。

3.5.2页面布局

背景色整体为深蓝色;“你的名字”,“电话号码”,“内容”字体为蓝色;英文字体及“发送”为蓝色。
在这里插入图片描述

3.5 书页页面介绍

3.5.1 反馈页面设计的目的

书页页面用于向用户展示一些大众咖啡品牌的简介,同时我们自己品牌的简介也在其中。用户点击右面即可翻到下一页简介,点击左面就可以翻到上一个简介。这些简介中包含咖啡品牌的基本历史发展,即可让用户了解品牌也能知晓品牌的悠久发展。

3.5.2页面布局

用到了section用于书面翻页;图片统一规格500*500,居中显示。数字与“咖啡品牌介绍”和“感谢观看”用到了“h1”标签。
在这里插入图片描述

四、部分源代码

项目结构截图

在这里插入图片描述

登录部分源代码

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

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 javax.servlet.jsp.PageContext;
import javax.swing.JOptionPane;

import org.apache.catalina.connector.Request;
//
///**
// * Servlet implementation class Connect
// */
//@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private Connection cn=null;
	private Statement st=null;
	private ResultSet rs=null;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
    
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doPost(request, response);
    
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		String username=request.getParameter("LoginUsername");
		String psd=request.getParameter("LoginPassword");
		boolean flag=false;
		Connection cn=new ConnectionDB().getConnection();
        try {
		    st=cn.createStatement();
			String sql="select userName,password from user";
			rs=st.executeQuery(sql);
			while(rs.next()){
		    	String name=rs.getString("userName");
		        String password=rs.getString("password");
		    	if((name.trim().equals(username))&&(password.trim().equals(psd))){
			    flag=true;
				break;
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
      request.getSession().setAttribute("username", username);
        
		if(flag){
				JOptionPane.showMessageDialog(null, "登录成功!");
                request.getRequestDispatcher("Home.jsp").forward(request, response);
                }
         else{
        	 JOptionPane.showMessageDialog(null, "用户名与密码不匹配.", "登录错误",JOptionPane.ERROR_MESSAGE);  
                request.getRequestDispatcher("Login.jsp").forward(request, response);
	         }

}
}

注册部分源代码

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

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 javax.servlet.jsp.PageContext;
import javax.swing.JOptionPane;

import org.apache.catalina.connector.Request;

import com.mysql.jdbc.PreparedStatement;
//
///**
// * Servlet implementation class Connect
// */
//@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */

 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doPost(request, response);
    
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		String userName=request.getParameter("RegisterUsername");
		String password=request.getParameter("RegisterPassword");
		String Email=request.getParameter("Email");
		String name=request.getParameter("name");
		String phone=request.getParameter("phone");
		String sex=request.getParameter("sex");
		String born=request.getParameter("born");

    	PreparedStatement qstmt = null;

        Connection qconn = null;
        boolean flag=false;
		
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");

		try {
			//1.注册数据库的驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.通过DriveMannager获取数据库连接
            String url = "jdbc:mysql://localhost:3306/info";
            String username = "root";
            String psd = "";
            qconn = DriverManager.getConnection(url, username, psd);
			String sql="INSERT INTO user(userName,password,Email,name,phone,sex,born)"+
					"VALUES(?,?,?,?,?,?,?)";
			//1.创建执行SQL语句的PreparedStatement对象
			qstmt=(PreparedStatement) qconn.prepareStatement(sql);
			//2.为SQL语句中的参数赋值
			qstmt.setString(1,userName);
			qstmt.setString(2,password);
			qstmt.setString(3,Email);
			qstmt.setString(4,name);
			qstmt.setString(5,phone);
			qstmt.setString(6,sex);
			qstmt.setString(7,born);
			//3.执行SQL
			qstmt.executeUpdate();
			flag=true;
        }
		catch (Exception e) {
            e.printStackTrace();
        } 
      request.getSession().setAttribute("RegisterUsername", userName);
        
		if(flag){
			JOptionPane.showMessageDialog(null, "注册成功,确认后跳回登录界面");
                request.getRequestDispatcher("Login.jsp").forward(request, response);
                }
         else{
         JOptionPane.showMessageDialog(null, "注册失败!请重新输入!", "注册失败",JOptionPane.ERROR_MESSAGE);   
                request.getRequestDispatcher("Register.jsp").forward(request, response);
	         }

}
}

忘记密码源代码

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

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 javax.servlet.jsp.PageContext;
import javax.swing.JOptionPane;

import org.apache.catalina.connector.Request;

import com.mysql.jdbc.PreparedStatement;
//
///**
// * Servlet implementation class Connect
// */
//@WebServlet("/register")
public class ForgetPasswordServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final String username = null;
	private Connection cn=null;
	private Statement st=null;
	private ResultSet rs=null;
    /**
     * @see HttpServlet#HttpServlet()
     */

 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doPost(request, response);
    
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		String userName=request.getParameter("forgetUsername");
		String password=request.getParameter("forgetPassword");
		String Email=request.getParameter("Email");
		String name=request.getParameter("name");
		String phone=request.getParameter("phone");
		String sex=request.getParameter("sex");
		String born=request.getParameter("born");

    	PreparedStatement qstmt = null;
        ResultSet qrs = null;
        Connection qconn = null;
        boolean compareflag=false;
        boolean changeflag=false;
		
		
        try {
        	Connection cn=new ConnectionDB().getConnection();
		    st=cn.createStatement();
			String sql="select userName,Email,name,phone,sex,born from user";
			rs=st.executeQuery(sql);
			while(rs.next()){
				//获取数据库中的数据
		    	String MyUserName=rs.getString("userName");
		    	String MyEmail=rs.getString("Email");
		        String MyName=rs.getString("name");
		    	String MyPhone=rs.getString("phone");
		        String MySex=rs.getString("sex");
		        String MyBorn=rs.getString("born");
		        //将数据库中的内容与输入内容作比较
		    	if((userName.trim().equals(MyUserName))&&
		    	  (Email.trim().equals(MyEmail))&&
		    	  (name.trim().equals(MyName))&&
		    	  (phone.trim().equals(MyPhone))&&
		    	  (sex.trim().equals(MySex))&&
		    	  (born.trim().equals(MyBorn))
		    	  ){
			    compareflag=true;
				break;
				}
			}
			if(compareflag) {
				//1.注册数据库的驱动
	            Class.forName("com.mysql.jdbc.Driver");
	            //2.通过DriveMannager获取数据库连接
	            String url = "jdbc:mysql://localhost:3306/info";
	            String username = "root";
	            String psd = "";
	            qconn = DriverManager.getConnection(url, username, psd);
				//1.创建执行SQL语句的PreparedStatement对象
				qstmt=(PreparedStatement) qconn.prepareStatement(sql);
				
	            String sqlC = "update user set password = ? where userName = ?";
	            qstmt = (PreparedStatement) qconn.prepareStatement(sqlC);
	            qstmt.setString(1,password);
	            qstmt.setString(2,userName);
	            //4.执行
	            qstmt.execute();
				//4.修改旗帜
				changeflag=true;
			}
		}  catch (Exception e) {
            e.printStackTrace();
        } 
      request.getSession().setAttribute("RegisterUsername", userName);
        
		if(changeflag){
			JOptionPane.showMessageDialog(null, "修改密码成功,确认后跳回登录界面");
                request.getRequestDispatcher("Login.jsp").forward(request, response);
                }
         else{
         JOptionPane.showMessageDialog(null, "修改密码失败!请检查数据是否和注册时一样!", "注册失败",JOptionPane.ERROR_MESSAGE);   
                request.getRequestDispatcher("forgetPassword.jsp").forward(request, response);
	         }

}
}


六、数据库

部分sql文件

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 50528
 Source Host           : localhost:3306
 Source Schema         : info

 Target Server Type    : MySQL
 Target Server Version : 50528
 File Encoding         : 65001

 Date: 28/12/2021 21:09:25
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for contact
-- ----------------------------
DROP TABLE IF EXISTS `contact`;
CREATE TABLE `contact`  (
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`content`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of contact
-- ----------------------------


-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `Email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `born` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`userName`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of user
-- ----------------------------

SET FOREIGN_KEY_CHECKS = 1;

七、交流

有课设报告和sql文件、源代码
扣:969060742
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_58065010/article/details/126916613

奇舞周刊第 464 期:我被 pgx 及其背后的 rust 美学征服_奇舞周刊的博客-爱代码爱编程

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■  我被 pgx 及其背后的 Rust 美学征服 我无意发现了 pgx 这样一个使用 Rust 来撰写 postgres extension 的集成工具,在深入地了解其文档并写了几百行代码后,我立刻就被那种直击心灵的简约之美冲破了防