boot 客户后台管理系统 (项目实战)

1.技术栈

web服务器:tomcat 8.0
java开发包:JDK 8.0
数据库:5.7
开发工具:eclipse
后端框架:struts2,hibernate
前端技术:bootstrap,jquery

2.环境搭建

1.创建动态web工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.项目结构

在这里插入图片描述

3.导入jar包

jar包是框架开发者写好的java类供程序员使用所以要使用就需要添加jar包
在这里插入图片描述

4.测试环境

1.配置tomcat服务器

没有tomcat服务器请去下载 地址: https://tomcat.apache.org/download-80.cgi.

1.下载tomcat服务器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.启动tomcat服务器测试

在这里插入图片描述
在这里插入图片描述

3.解决乱码问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.eclipse配置tomcat服务器

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.启动服务器

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

开启服务器

在这里插入图片描述
在这里插入图片描述

5.配置文件

1.struts2配置文件(模板)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<constant name="struts.devMode" value="true"></constant>

	<package name="test" extends="struts-default" namespace="/test">
	
		<action name="test" class="com.boot.action.TestAction"
			method="test">
			<result>/jsps/main.jsp</result>
		</action>
		
	</package>

</struts>

2.hibernater主配置文件(模板)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- 链接数据库的配置 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/boot</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123456</property>
		<!-- 配置数据库的方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 配置是否输入sql命令 -->
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">false</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 配置C3p0连接池 -->
		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!-- 将Session绑定到当前线程 -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- 加载实体类与数据库的映射文件 -->
		<mapping resource="com/boot/domain/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

3.实体类和数据库映射文件(模板)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 实体类的映射文件 -->
<hibernate-mapping package="com.boot.domain">
	<class name="User" table="sys_user">
		<!-- id是主键字段,该标签用来指明主键的生成方式 -->
		<id name="user_id" column="user_id">
			<generator class="native"></generator>
		</id>
		<!-- property标签用来配置一般实体类属性与字段之间的映射关系 -->
		<property name="user_code" column="user_code"></property>
		<property name="user_name" column="user_name"></property>
		<property name="user_password" column="user_password"></property>
		<property name="user_state" column="user_state"></property>
	</class>
</hibernate-mapping>

3.数据库创建

1.创建数据库

1.打开数据库服务

在这里插入图片描述
在这里插入图片描述

2.使用数据库可视化连接工具连接数据库

本案例使用sqlyog作为数据库连接工具和native是相同的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.创建表

1.复制下面的sql语句

/*
SQLyog Ultimate v8.32 
MySQL - 5.5.40 : Database - boot_crm
*********************************************************************
*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`boot_crm` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `boot_crm`;

/*Table structure for table `base_dict` */

DROP TABLE IF EXISTS `base_dict`;

CREATE TABLE `base_dict` (
  `dict_id` varchar(32) NOT NULL COMMENT '数据字典id(主键)',
  `dict_type_code` varchar(10) NOT NULL COMMENT '数据字典类别代码',
  `dict_type_name` varchar(50) NOT NULL COMMENT '数据字典类别名称',
  `dict_item_name` varchar(50) NOT NULL COMMENT '数据字典项目名称',
  `dict_item_code` varchar(10) DEFAULT NULL COMMENT '数据字典项目代码(可为空)',
  `dict_sort` int(10) DEFAULT NULL COMMENT '排序字段',
  `dict_enable` char(1) NOT NULL COMMENT '1:使用 0:停用',
  `dict_memo` varchar(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`dict_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `base_dict` */

insert  into `base_dict`(`dict_id`,`dict_type_code`,`dict_type_name`,`dict_item_name`,`dict_item_code`,`dict_sort`,`dict_enable`,`dict_memo`) values ('1','001','客户行业','教育培训 ',NULL,1,'1',NULL),('10','003','公司性质','民企',NULL,3,'1',NULL),('12','004','年营业额','1-10万',NULL,1,'1',NULL),('13','004','年营业额','10-20万',NULL,2,'1',NULL),('14','004','年营业额','20-50万',NULL,3,'1',NULL),('15','004','年营业额','50-100万',NULL,4,'1',NULL),('16','004','年营业额','100-500万',NULL,5,'1',NULL),('17','004','年营业额','500-1000万',NULL,6,'1',NULL),('18','005','客户状态','基础客户',NULL,1,'1',NULL),('19','005','客户状态','潜在客户',NULL,2,'1',NULL),('2','001','客户行业','电子商务',NULL,2,'1',NULL),('20','005','客户状态','成功客户',NULL,3,'1',NULL),('21','005','客户状态','无效客户',NULL,4,'1',NULL),('22','006','客户级别','普通客户',NULL,1,'1',NULL),('23','006','客户级别','VIP客户',NULL,2,'1',NULL),('24','007','商机状态','意向客户',NULL,1,'1',NULL),('25','007','商机状态','初步沟通',NULL,2,'1',NULL),('26','007','商机状态','深度沟通',NULL,3,'1',NULL),('27','007','商机状态','签订合同',NULL,4,'1',NULL),('3','001','客户行业','对外贸易',NULL,3,'1',NULL),('30','008','商机类型','新业务',NULL,1,'1',NULL),('31','008','商机类型','现有业务',NULL,2,'1',NULL),('32','009','商机来源','电话营销',NULL,1,'1',NULL),('33','009','商机来源','网络营销',NULL,2,'1',NULL),('34','009','商机来源','推广活动',NULL,3,'1',NULL),('4','001','客户行业','酒店旅游',NULL,4,'1',NULL),('5','001','客户行业','房地产',NULL,5,'1',NULL),('6','002','客户信息来源','电话营销',NULL,1,'1',NULL),('7','002','客户信息来源','网络营销',NULL,2,'1',NULL),('8','003','公司性质','合资',NULL,1,'1',NULL),('9','003','公司性质','国企',NULL,2,'1',NULL);

/*Table structure for table `customer` */

DROP TABLE IF EXISTS `customer`;

CREATE TABLE `customer` (
  `cust_id` int(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(50) NOT NULL COMMENT '客户名称',
  `cust_user_id` int(32) DEFAULT NULL COMMENT '负责人id',
  `cust_create_id` int(32) DEFAULT NULL COMMENT '创建人id',
  `cust_source` varchar(50) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(50) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_linkman` varchar(50) DEFAULT NULL COMMENT '联系人',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  `cust_zipcode` varchar(10) DEFAULT NULL COMMENT '邮政编码',
  `cust_address` varchar(100) DEFAULT NULL COMMENT '联系地址',
  `cust_createtime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=178 DEFAULT CHARSET=utf8;

/*Data for the table `customer` */

insert  into `customer`(`cust_id`,`cust_name`,`cust_user_id`,`cust_create_id`,`cust_source`,`cust_industry`,`cust_level`,`cust_linkman`,`cust_phone`,`cust_mobile`,`cust_zipcode`,`cust_address`,`cust_createtime`) values (14,'小张',NULL,1,'7','3','23','小雪','010-88888887','13848399998','100096','北京昌平区西三旗','2016-04-08 16:32:01'),(15,'小韩',NULL,2,'7','3','23','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:01'),(16,'小李',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:01'),(17,'小赵',NULL,4,'6','4','23','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:02'),(22,'小明',NULL,3,'6','2','23','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:03'),(24,'小伟',NULL,2,'7','5','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:03'),(25,'Tom',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:03'),(26,'jack',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:03'),(28,'Rose',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:04'),(29,'小韩',NULL,1,'7','1','23','小雪','010-88888886','13888888886','100096','北京昌平区西三旗','2016-04-08 16:32:04'),(30,'小叶',NULL,2,'6','2','23','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:04'),(31,'小韩',NULL,4,'7','1','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:04'),(33,'小海',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:04'),(34,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:05'),(35,'小姜',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:05'),(36,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:05'),(37,'小梦',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:05'),(38,'小孙',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:05'),(39,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:06'),(40,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:06'),(41,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:06'),(42,'小韩',NULL,1,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:06'),(43,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:06'),(44,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:07'),(45,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:07'),(46,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:07'),(47,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:07'),(48,'小高',NULL,5,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:07'),(49,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:07'),(50,'小钱',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:08'),(51,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:08'),(52,'小周',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:08'),(53,'小韩',NULL,1,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:08'),(54,'小丽',NULL,1,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:08'),(55,'小韩',NULL,1,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:08'),(56,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:09'),(57,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:09'),(58,'张三',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:09'),(59,'李四',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:29'),(60,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:29'),(61,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:29'),(62,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:29'),(63,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:30'),(64,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:30'),(65,'王五',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:30'),(66,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:30'),(67,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:30'),(68,'赵六',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:30'),(69,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:31'),(70,'小韩',NULL,1,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:31'),(71,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:31'),(72,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:31'),(73,'小七',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:31'),(74,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:32'),(75,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:32'),(76,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:32'),(77,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:32'),(78,'小郑',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:32'),(79,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:32'),(80,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:33'),(81,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:33'),(82,'小吴',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:33'),(83,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:33'),(144,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:44'),(145,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:44'),(146,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:44'),(147,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:45'),(148,'小韩',NULL,1,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:45'),(149,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:45'),(150,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:45'),(151,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:45'),(152,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:46'),(153,'晶晶',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:46'),(154,'倩倩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:46'),(155,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:46'),(156,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:46'),(157,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:46'),(158,'小韩',NULL,1,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:47'),(159,'小韩',NULL,2,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:47'),(160,'小韩',NULL,3,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:47'),(161,'小韩',NULL,4,'6','2','22','小雪','010-88888887','13888888888','100096','北京昌平区西三旗','2016-04-08 16:32:47'),(171,'小韩',NULL,3,'7','1','23','小雪','010-8235438','13755555555','100000','北京昌平区西三旗','2017-05-05 10:23:07'),(172,'小韩',NULL,2,'6','2','22','小雪','010-0000000','13288546521','100859','北京昌平区西三旗','2017-05-05 10:51:08'),(173,'小洛',NULL,1,'6','1','22','小雪','01062872234','13521023333','100000','北京昌平区西三旗','2017-05-05 10:57:09'),(174,'小月',NULL,1,'6','1','22','小雪','0482-8235438','13848399998','137400','内蒙古兴安盟乌兰浩特市','2017-05-05 11:33:27'),(175,'小韩',NULL,1,'6','1','22','小石','0791-88130000','15179105961','330098','江西省南昌市瑶湖高校园区','2017-05-05 13:17:11'),(176,'小智',NULL,1,'7','1','23','小黑','400-618-4000','13520203625','100091','北京市海淀区','2017-05-16 15:49:07'),(177,'小程',NULL,1,'6','1','23','小韩','010-88886616','13718026541','100000','北京市昌平区','2017-05-16 16:25:59');

/*Table structure for table `sys_user` */

DROP TABLE IF EXISTS `sys_user`;

CREATE TABLE `sys_user` (
  `user_id` int(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `user_code` varchar(32) NOT NULL COMMENT '用户账号',
  `user_name` varchar(50) NOT NULL COMMENT '用户名称',
  `user_password` varchar(32) NOT NULL COMMENT '用户密码',
  `user_state` int(1) NOT NULL COMMENT '1:正常,0:暂停',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*Data for the table `sys_user` */

insert  into `sys_user`(`user_id`,`user_code`,`user_name`,`user_password`,`user_state`) values (1,'m0001','小韩','123',1),(2,'m0002','小雪','123',1),(3,'m0003','小石','123',1),(4,'m0004','小陈','123',1);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

2.创建表结构

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
建表完成

4.创建包,建立项目结构

1.建包

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5.项目结构示意图

在这里插入图片描述

6.项目开始

1.创建与数据库对应的实体类

1.与sys_user对应的实体类

package com.boot.domain;
import java.io.Serializable;
/**
 * 用户持久化类
 */
public class User implements Serializable{
    
    
	private static final long serialVersionUID = 1L;
	private Integer user_id;      //用户id 
	private String user_code;     //用户账号
	private String user_name;     //用户名称
	private String user_password; //用户密码
	private Integer user_state;   //用户状态
	
	
	public User() {
    
    
		super();
	}
	public User(String user_code, String user_name, String user_password, Integer user_state) {
    
    
		super();
		this.user_code = user_code;
		this.user_name = user_name;
		this.user_password = user_password;
		this.user_state = user_state;
	}
	public Integer getUser_id() {
    
    
		return user_id;
	}
	
	public void setUser_id(Integer user_id) {
    
    
		this.user_id = user_id;
	}
	public String getUser_code() {
    
    
		return user_code;
	}
	public void setUser_code(String user_code) {
    
    
		this.user_code = user_code;
	}
	public String getUser_name() {
    
    
		return user_name;
	}
	public void setUser_name(String user_name) {
    
    
		this.user_name = user_name;
	}
	public String getUser_password() {
    
    
		return user_password;
	}
	public void setUser_password(String user_password) {
    
    
		this.user_password = user_password;
	}
	public Integer getUser_state() {
    
    
		return user_state;
	}
	public void setUser_state(Integer user_state) {
    
    
		this.user_state = user_state;
	}
	
	@Override
	public String toString() {
    
    
		return "User [user_id=" + user_id + ", user_code=" + user_code + ", user_name=" + user_name + ", user_password="
				+ user_password + ", user_state=" + user_state + "]";
	}
}

2.与customer对应的实体类

package com.boot.domain;
import java.io.Serializable;
import java.util.Date;
/**
 * 客户持久化类
 */
public class Customer implements Serializable {
    
    
	private static final long serialVersionUID = 1L;
	private Integer cust_id;          // 客户编号
	private String cust_name;         // 客户名称
	private Integer cust_user_id;    // 负责人id
	private Integer cust_create_id;  // 创建人id
	private String cust_source;      // 客户信息来源
	private String cust_industry;    // 客户所属行业
	private String cust_level;       // 客户级别
	private String cust_linkman;     // 联系人
	private String cust_phone;       // 固定电话
	private String cust_mobile;      // 移动电话
	private String cust_zipcode;     // 邮政编码
	private String cust_address;     // 联系地址
	private Date cust_createtime;    // 创建时间	
	private Integer start;            // 起始行
	private Integer rows;             // 所取行数
	
	public String getCust_zipcode() {
    
    
		return cust_zipcode;
	}
	public void setCust_zipcode(String cust_zipcode) {
    
    
		this.cust_zipcode = cust_zipcode;
	}
	public String getCust_address() {
    
    
		return cust_address;
	}
	public void setCust_address(String cust_address) {
    
    
		this.cust_address = cust_address;
	}
	public Integer getStart() {
    
    
		return start;
	}
	public void setStart(Integer start) {
    
    
		this.start = start;
	}
	public Integer getRows() {
    
    
		return rows;
	}
	public void setRows(Integer rows) {
    
    
		this.rows = rows;
	}
	public Integer getCust_id() {
    
    
		return cust_id;
	}
	public void setCust_id(Integer cust_id) {
    
    
		this.cust_id = cust_id;
	}
	public String getCust_name() {
    
    
		return cust_name;
	}
	public void setCust_name(String cust_name) {
    
    
		this.cust_name = cust_name;
	}
	public Integer getCust_user_id() {
    
    
		return cust_user_id;
	}
	public void setCust_user_id(Integer cust_user_id) {
    
    
		this.cust_user_id = cust_user_id;
	}
	public Integer getCust_create_id() {
    
    
		return cust_create_id;
	}
	public void setCust_create_id(Integer cust_create_id) {
    
    
		this.cust_create_id = cust_create_id;
	}
	public String getCust_source() {
    
    
		return cust_source;
	}
	public void setCust_source(String cust_source) {
    
    
		this.cust_source = cust_source;
	}
	public String getCust_industry() {
    
    
		return cust_industry;
	}
	public void setCust_industry(String cust_industry) {
    
    
		this.cust_industry = cust_industry;
	}
	public String getCust_level() {
    
    
		return cust_level;
	}
	public void setCust_level(String cust_level) {
    
    
		this.cust_level = cust_level;
	}
	public String getCust_linkman() {
    
    
		return cust_linkman;
	}
	public void setCust_linkman(String cust_linkman) {
    
    
		this.cust_linkman = cust_linkman;
	}
	public String getCust_phone() {
    
    
		return cust_phone;
	}
	public void setCust_phone(String cust_phone) {
    
    
		this.cust_phone = cust_phone;
	}
	public String getCust_mobile() {
    
    
		return cust_mobile;
	}
	public void setCust_mobile(String cust_mobile) {
    
    
		this.cust_mobile = cust_mobile;
	}
	public Date getCust_createtime() {
    
    
		return cust_createtime;
	}
	public void setCust_createtime(Date cust_createtime) {
    
    
		this.cust_createtime = cust_createtime;
	}
}

3.与base_dict对应的实体类

package com.boot.domain;
import java.io.Serializable;
/**
 * 数据字典持久化类
 */
public class BaseDict implements Serializable {
    
    
	private static final long serialVersionUID = 1L;
	private String dict_id;          // 数据字典id
	private String dict_type_code;  // 数据字典类别代码
	private String dict_type_name;  // 数据字典类别名称
	private String dict_item_name;  // 数据字典项目名称
	private String dict_item_code;  // 数据字典项目代码
	private Integer dict_sort;      // 排序字段
	private String dict_enable;     // 是否可用
	private String dict_memo;       // 备注
	
	public String getDict_id() {
    
    
		return dict_id;
	}
	public void setDict_id(String dict_id) {
    
    
		this.dict_id = dict_id;
	}
	public String getDict_type_code() {
    
    
		return dict_type_code;
	}
	public void setDict_type_code(String dict_type_code) {
    
    
		this.dict_type_code = dict_type_code;
	}
	public String getDict_type_name() {
    
    
		return dict_type_name;
	}
	public void setDict_type_name(String dict_type_name) {
    
    
		this.dict_type_name = dict_type_name;
	}
	public String getDict_item_name() {
    
    
		return dict_item_name;
	}
	public void setDict_item_name(String dict_item_name) {
    
    
		this.dict_item_name = dict_item_name;
	}
	public String getDict_item_code() {
    
    
		return dict_item_code;
	}
	public void setDict_item_code(String dict_item_code) {
    
    
		this.dict_item_code = dict_item_code;
	}
	public Integer getDict_sort() {
    
    
		return dict_sort;
	}
	public void setDict_sort(Integer dict_sort) {
    
    
		this.dict_sort = dict_sort;
	}
	public String getDict_enable() {
    
    
		return dict_enable;
	}
	public void setDict_enable(String dict_enable) {
    
    
		this.dict_enable = dict_enable;
	}
	public String getDict_memo() {
    
    
		return dict_memo;
	}
	public void setDict_memo(String dict_memo) {
    
    
		this.dict_memo = dict_memo;
	}
}

2.建立实体类与数据库字段联系的配置文件

名称为user.hbm.xml在com.boot.domain包下

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 实体类的映射文件 -->
<hibernate-mapping package="com.boot.domain">
	<class name="User" table="sys_user">
		<!-- id是主键字段,该标签用来指明主键的生成方式 -->
		<id name="user_id" column="user_id">
			<generator class="native"></generator>
		</id>
		<!-- property标签用来配置一般实体类属性与字段之间的映射关系 -->
		<property name="user_code" column="user_code"></property>
		<property name="user_name" column="user_name"></property>
		<property name="user_password" column="user_password"></property>
		<property name="user_state" column="user_state"></property>
	</class>
</hibernate-mapping>

3.配置hibernate

名称为hibernate.cfg.xml在src/main/java目录下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- 链接数据库的配置 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/boot</property>
		<property name="hibernate.connection.username">root</property>
		<!--请自行修改自己数据库的密码-->
		<property name="hibernate.connection.password">123456</property>
		<!-- 配置数据库的方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 配置是否输入sql命令 -->
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">false</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 配置C3p0连接池 -->
		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!-- 将Session绑定到当前线程 -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- 加载实体类与数据库的映射文件 -->
		<mapping resource="com/boot/domain/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

4.编写hibernaete工具类

package com.boot.util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;



public class HibernateUtil {
    
    
	//定义工厂
	private static SessionFactory factory;

	static {
    
    
		try {
    
    
			//创建配置类
			Configuration cfg = new Configuration();
			cfg.configure();// 加载默认的主配置文件
			factory = cfg.buildSessionFactory();
		} catch (HibernateException e) {
    
    
			System.out.println(e.getMessage());
			throw new ExceptionInInitializerError("初始化配置文件出错,请检查配置文件!");
		}
	}
	
	//获取session对象
	public static Session getCurrentSession() {
    
    
		return factory.getCurrentSession();
	}

}

5.编写UserDao类

package com.boot.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.boot.domain.User;
import com.boot.util.HibernateUtil;

public class UserDao {
    
    

	//向用户返回全部的user数据
	public List<User> getAllUser() {
    
    
		//获取session对象
		Session session = HibernateUtil.getCurrentSession();
		//使用HQL语句查询,需要获取Query对象
		Query query = session.createQuery("from User");
		//返回查到的所有数据
		return (List<User>) query.list();
	}

}

6.编写service层

package com.boot.service;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.boot.dao.UserDao;
import com.boot.domain.User;
import com.boot.util.HibernateUtil;

public class UserService {
    
    
	
	//需要用到dao层
	private UserDao userDao = new UserDao();

	//获取所有的用户信息
	public List<User> getAllUser() {
    
    
		
		Session session = HibernateUtil.getCurrentSession();
		Transaction tx = null;
		List<User> users = null;
		try {
    
    
			//开启事务
			tx = session.beginTransaction();
			users = userDao.getAllUser();
			tx.commit();
			return users;
		}catch (HibernateException e){
    
    
			if (tx != null) {
    
    
				//回滚事务
				tx.rollback();
			}	
		}
		//返回数据
		return users;
		
	}
}

7.编写Action层

package com.boot.action;

import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.boot.domain.User;
import com.boot.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class UserAction extends ActionSupport implements ModelDriven<User>{
    
    
	
	//模型驱动类,用于接收前端传过来的的数据
	private User user = new User();
	
	//需要调用service层
	private UserService userServcie = new UserService();
	
	//获取所有的用户
	public String getAllUser() {
    
    
		//获取所有用户信息
		List<User> users = userServcie.getAllUser();
		//添加到request域中
		ServletActionContext.getRequest().setAttribute("list", users);
		//返回success
		return SUCCESS;
	}
	
	@Override
	public User getModel() {
    
    
		// TODO Auto-generated method stub
		return user;
	}
}

8.配置struts

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<constant name="struts.devMode" value="true"></constant>

	<package name="user" extends="struts-default" namespace="/user">
	
		<action name="getAllUser" class="com.boot.action.UserAction"
			method="getAllUser">
			<!-- 当action类返回success时跳转到该页面 -->
			<result name="success">/jsps/main.jsp</result>
		</action>
		
	</package>

</struts>

9.创建数据展示页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
	</head>
	<body>
		${list }
	</body>
</html>

10.测试

1.启动 tomcat服务器
在这里插入图片描述

2.访问地址
在这里插入图片描述
数据展示成功

用户登录功能

流程图

在这里插入图片描述

UserAction类添加登录方法

//登录
	public String login() {
    
    
		System.out.println("进入登录方法");
		try {
    
    
			User resultUser = userServcie.login(user);
			//保存到session域中
			ServletActionContext.getRequest().getSession().setAttribute("user", resultUser);
			return SUCCESS;
		} catch (UserException e) {
    
    
			//登陆失败
			ServletActionContext.getRequest().setAttribute("msg", e.getMessage());
			ServletActionContext.getRequest().setAttribute("user", user);
			return INPUT;
		}
	}

配置struts配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<constant name="struts.devMode" value="true"></constant>

	<package name="user" extends="struts-default" namespace="/user">
		
		<!--获取所有用户请求-->
		<action name="getAllUser" class="com.boot.action.UserAction" method="getAllUser">
			<!-- 当action类返回success时跳转到该页面 -->
			<result name="success">/jsps/main.jsp</result>
		</action>
		
		<!--用户登录请求-->
		<action name="login" class="com.boot.action.UserAction" method="login">
			<!-- 当action类返回success时跳转到该页面 -->
			<result name="success">/jsps/main.jsp</result>
			<!-- 当action类返回success时跳转到该页面 -->
			<result name="input">/jsps/login.jsp</result>
		</action>
		
		<!--用户退出请求-->
		<action name="logout" class="com.boot.action.UserAction" method="logout">
			<result name="login">/jsps/login.jsp</result>
		</action>
		
		<!--用户注册请求-->
		<action name="register" class="com.boot.action.UserAction" method="register">
			<result name="success">/jsps/login.jsp</result>
		</action>
		
	</package>

</struts>

UserService类

//登录
	public User login(User user) throws UserException{
    
    
		
		Session session = HibernateUtil.getCurrentSession();
		Transaction tx = null;
		User resultUser = null;
		try {
    
    
			//开启事务
			tx = session.beginTransaction();
			//通过用户账号获取用户
			resultUser = userDao.getUserByCode(user.getUser_code());
			tx.commit();
			//判断用户是否注册
			if(resultUser == null) {
    
     // 不存在
				throw new UserException("用户未注册");
			}else {
    
     // 用户存在
				if(MD5Util.md5(user.getUser_password()).equals(resultUser.getUser_password())) {
    
     //密码相同
					return resultUser;
				}else {
    
    
					throw new UserException("密码不正确,请重新输入!");
				}
			}
		}catch (HibernateException e){
    
    
			if (tx != null) {
    
    
				//回滚事务
				tx.rollback();
			}	
		}
		//返回数据
		return resultUser;
	}

UserDao类

//通过用户账号获取用户信息
public User getUserByCode(String user_code) {
    
    
		Session session = HibernateUtil.getCurrentSession();
		Query query = session.createQuery("from User where user_code = :user_code");
		query.setParameter("user_code", user_code);
		return (User) query.uniqueResult();
	}

用户安全问题

问题

当用户注册时注册的密码,采用明文直接存入数据库中,对用户的安全有问题
可以使用加密算法,对密码进行加密

MD5加密

引入jar包

引入common-codec包

编写工具类

package com.boot.util;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;

public class MD5Util {
    
    
	/**
     * 将数据进行 MD5 加密,并以16进制字符串格式输出
     * @param data
     * @return
     */
    public static String md5(String data) {
    
    
        try {
    
    
            MessageDigest md = MessageDigest.getInstance("MD5");
            return Hex.encodeHexString(md.digest(data.getBytes(StandardCharsets.UTF_8)));
        } catch (NoSuchAlgorithmException e) {
    
    
            e.printStackTrace();
            System.out.println("密码加密失败");
        }
        return "";
    }
 }

问题

前端异步请求获取后端返回的json数据

当前端发起请求,并且希望后端返回的json数据,当接收后把json数据转换为js对象封装到data对象里面,后执行success定义的方法,如果后端返回的不是json数据,就会调用error定义的方法

	 $.ajax({
    
      
            url:'${pageContext.request.contextPath }/user/checkUserCode.action',  
            type:'POST',  
            data: params,
            dataType:"json",
            success:function (data) {
    
    
            	alert(data.msg)
                console.log(data.msg)
            },
            error:function(result){
    
    
		    }
        });

后端怎么返回json数据

详细请看这篇文章: https://blog.csdn.net/feinifi/article/details/81114268.

在读取hibernate配置文件时

在这里插入图片描述
因为使用的JDK为14版本,该版本中移除了该类,所以需要手动添加jar包

猜你喜欢

转载自blog.csdn.net/zhw00508zz/article/details/120757176