精华内容
下载资源
问答
  • 2020-02-12 15:25:42

    简介

    某某管理系统(员工信息,学生成绩,办事流程等等)应该是很多web开发者最先接触到的项目之一,也是许多非科技企业主要维护的项目,可以说是学习web项目最佳练手工具,虽然很老旧,但依旧充当着很重要的角色。

    本人也开发过某某管理系统(大作业项目),因此来分享类似的web项目的开发流程和知识点。

    关系模式设计(ER)

    根据要设计的管理系统,我们需要对其涉及的实体以及关系进行抽象。也就是要设计出经典的ER图。以影院管理系统为例,实体主要包括:电影院,电影,排片等等,关系主要包括:影院——电影,顾客——订单,电影——排片等等。其实也不困难,这些在设计表结构的时候需要多注意,我们要注意到哪些属性受到哪些属性制约的,分清楚强实体集和弱实体集。

    能画清楚ER图,就很好设计sql了,这些不搞清楚,后面增删改查的时候,问题就大了。打个比方,订单信息是弱实体集,同时也是复合实体,它与排片之间有联系,与顾客之间也有联系。所以这个表必须用REFERENCES(外键)设计好。不然你改了影片名,顾客名,这订单却一点没变化,数据就不一致了。而且你可以会加上修改订单的功能,如果没设计好依赖关系,表是错的,操作到后面数据全乱了也有可能发生。

    开发框架敲定

    总得拿个工具来开发是吧!所以要想好用什么来开发。

    如果是团队项目,最好是前后端分离,不然一人挑大梁,其他人就反馈bug,比较难合作,要合作也只能分配不同的板块进行设计,不高效。

    如果是个人项目,最好也是前后端分离,毕竟是主流,这样可以学很多东西。当然,要学php,学jsp,就没必要分了,页面效果和数据都在自己操作之下,说实话开发起来还更快。

    • 前端:三大框架最值得学习的(Vue/Angular/React),其中最推荐Vue,因为最简单,接着是React,大厂用得多,Angular语法想较前两者可能复杂点。

    • 前端UI:写界面还是很难的,当然,想认真学通css的自己写比较合适,不然就乖乖用UI,UI和前端框架一般是相契合的,根据你选的前端框架查一下。

    • 后端:1. 主要学前端的可以考虑 express,超级简单,而且可以熟悉nodejs,或者考虑flask,python好用且易学,我们就不用纠结各类配置。2. 主要学后端的,首先是推荐java,学习资料多,而且企业用的也多,难点在于环境配置,各种依赖烦得很。其次是推荐golang,这是一门有活力的语言,竞争压力比java小很多。

    下面我就以 vue + element-ui + express 为例子,谈谈接下来的开发。

    前端设计

    前端以vue为开发框架,采用element ui作为ui框架进行开发,核心是应用vue的组件化开发思想。也就是开发时,构思好你想看到的界面和想用到的功能,一个一个击破,最后再联系在一起。

    组件管理与设计

    前端三大框架都有组件的思想,由于采用了element-ui,很多组件不需要我们写(比如菜单栏目,布局,表格,页码等等)。但是一些大的组件(一般单独放在page/view文件夹里)还是要分出来的,比如:影院信息管理页面组件,顾客信息管理页面组件,订单管理页面组件等等。

    另外,组件自然是抽离得越细越规范,比如你可以把一个简单的信息展示(几个

    标签或者几个

    • 标签就能解决的)也抽出来。但是没必要,最后管理起来很麻烦。所有这种抽离的小组件应当放在common或者特定的文件夹下,与主视图组件区分开来。
    • 组件访问逻辑

      你可以用导航栏+a标签进行跳转,当然,还是前端路由更为推荐。

      前端路由用的是hash或history,可以做到页面不刷新。我们只要吧导航栏和前端路由表结合在一起,就可以轻松的做到点击导航栏跳转到对应的视图组件。

      https://blog.csdn.net/CSDN_Yong/article/details/104186851

      前端路由可以参考上面链接的文章

      组件代码的编写

      这个是基本功,像vue只要用好@和:这两个就能写出很多东西了,不知道怎么写可以考虑去github多搬运代码就会了。

      cookies的使用

      import cookies from 'vue-cookies'
      Vue.use(cookies);
      

      登陆控制一般是要用到的,而且你要阻止用户企图未登陆就通过修改url的方式访问到对应的组件。这时候只要比对cookies是否存在就可以判断先前有没有登陆。具体怎么用可以查阅其他文章。

      后端实现

      这一块不同的框架细节不太一样。但简单来说,就是根据前端的要求提供出一系列的api并对数据库进行各种操作。

      基本构造(express)

      //app.js
      var createError = require('http-errors');
      var express = require('express');
      var path = require('path');
      var cookieParser = require('cookie-parser');
      var logger = require('morgan');
      var session = require('express-session');
      var indexRouter = require('./routes/index');
      var app = express();
      // view engine setup
      app.set('views', path.join(__dirname, 'views'));
      app.set('view engine', 'ejs');
      //托管静态文件
      app.use(express.static('public'));
      app.use(logger('dev'));
      app.use(express.json());
      app.use(express.urlencoded({ extended: false }));
      app.use(cookieParser());
      app.use(express.static(path.join(__dirname, 'public')));
      app.use('/', indexRouter);
      app.listen(3000);
      module.exports = app;
      

      express脚手架基本就自带了上面的东西。use那里主要看开发要用到什么,要到的就用npm搞进去就行。

      跨域错误避免

      app.all("*", function(req, res, next) {
       if (!req.get("Origin")) return next();
       // use "*" here to accept any origin
       res.set("Access-Control-Allow-Origin","*");
       res.set("Access-Control-Allow-Methods", "GET");
       res.set("Access-Control-Allow-Headers", "X-Requested-With,Origin,Content-
      Type,Accept");
       // res.set('Access-Control-Allow-Max-Age', 3600);
       if ("OPTIONS" === req.method) return res.sendStatus(200);
       next();
      

      静态资源存储

      一般不同后端框架存储文件夹不太一样,不过可以肯定的一点,必须在代码中指定出来(也可能可以在IDEA中标出来,反正肯定不是直接放)。设置好之后,这个文件夹一般就放图片文件。

      API接口设计

      与前端协商好,需要请求或上传哪些数据,然后制定相应的url就可以了。

      API接口实现

      都是要导入依赖项的,也要提前配置好依赖(比如javaweb有单独的依赖配置文件),导入后,我们可以调用sql接口。以express为例子。

      const mysql = require('mysql');
      const conn = mysql.createConnection({
       host:'localhost',   //数据库地址
       user:'root', //用户名
       password:'123456', //密码
       database:'mysql' //数据库名
      });
      conn.connect();
      module.exports = conn;
      

      配置数据库,这个最好单独做成一个文件。

      conn.query(sqlStr,[name,password],(error,result,field)=>{
      	\\dosomething
      })
      

      然后我们就可以通过这个东西查询数据库了。

      学好ajax,又知道怎么查数据库了,其他不是很大的问题。当然,大的项目后台是要考虑并发,代理什么的,这里不考虑。

      前后端联合开发

      在不分前后端时,比如传统的jsp+java+servlet可能不太好区分。在分离的情况下,一般采用下面的套路(当然是限于小型项目,那些企业级的大有手段协调开发)

      开发时

      在前后端分离的情况下,后台维护API,数据库,前端维护界面就行。一般就是后台跑在某个服务器上,给出端口和基础的url,前端根据基础的url和端口拼接对应的请求url发给服务器以获取数据。最后前端要跑在另一个服务器上,用户访问的时候是访问前端这个服务器的。关系差不多如下:
      在这里插入图片描述
      这样做的好处就是两个服务器都可以启动热部署,开发效率比疯狂打包快得多得多,每一次更新都能立马进行调试。

      发布时

      当然是要打包了,首先打包前端,比如vue,就是 npm run build,获取dist文件夹,把这个dist文件夹塞到后端的静态文件那里去,然后制定index.html作为后端服务器启动入口,就大功告成啦!就想下图一样:
      在这里插入图片描述

      总结

      这类管理项目侧重点在于前端,作为练手项目,我们基本是不可能遇到后端开发真正的难点的(协调,并发,分布式等)。所以想好好练后台开发的,尽早实习,看看实际业务代码会有很大帮助。前端还是布局和组件化思想比较重要,我这篇文章可能有很多地方是不对的,很多话也是不对,但是应该能对想做一个练手项目的你有点帮助。

    更多相关内容
  • Java Web程序设计——图书管理系统

    千次阅读 2022-02-26 14:28:02
    这是一个图书管理系统,都是用原生的·Java Web写的,前后端代码都是自己写的。第一次写博客希望大家能够支持。 项目结构图览 采用的工具与技术 前端页面设计:html+css 后端技术:jsp+servlet+javaBean+jdbc+...

    这是一个图书管理系统,都是用原生的·Java Web写的,前后端代码都是自己写的。第一次写博客希望大家能够支持。

    项目结构图览

    采用的工具与技术

    前端页面设计:html+css

    后端技术:jsp+servlet+javaBean+jdbc+dao

    服务器版本:Tomcat8.5

    数据库:Mysql数据库

    开发工具:Eclipse、Chorme、Mysql、Navicat Premium 15

    图书管理系统数据库设计

    1、user(用户信息表)字段:username(用户名(主键))password(密码) sex(性别)

     2、administrator(管理员信息表)字段:username(用户名(主键)) password(密码)sex(性别)

     3、book(图书信息表)  字段:number(图书编号(主键)) bookname(书名) writer(作者) price(价格) typ(类型) floor(位置) condi(状态)

    4、borrowbook(借阅信息表) 字段:id (主键)  number(图书编号) bookname(书名) writer(作者) price(价格)  typ(类型) floor(位置) name(借书人用户名)  ftime(借书时间)  ltime(还书时间) condi(状态)

    5、amessage(管理员下达通知信息表) 字段:id(主键)  content(内容) time(时间)

     6、umessage(用户反馈信息表) 字段:id (主键)  name(用户名) content(内容) time(时间)

     7、message(管理员给用户留言信息表) 字段:id(主键)  content(内容) time(时间)  name(用户名)

     数据库逻辑结构

    (1) user(用户信息表)储存用户基本信息

    (2)administrator(管理员信息表)储存管理员基本信息

    (3)book(图书信息表)储存图书的基本信息,其中condi字段用来储存图书的状态即是否被借,默认为,如果被借走则为,被归还则为

    (4)borrowbook(借阅信息表)用来储存被借图书的信息,其中ftime (被借时间) ltime(如果未归还则是最晚还书时间(最晚还书时间为借书时间的后三个月),如果归还则是归还时间) condi(被借图书状态,即是否归还,默认为,如果归还则为)

    (5)amessage(管理员下达通知信息表)用来储存管理员下达的通知(所有用户都可以在收件箱里看到)

    (6)umessage(用户反馈信息表)用来储存用户反馈的信息

    (7)message(管理员给用户留言信息表)用来储存管理员给用户的留言

     系统实现

    (1)登入、注册、退出模块

    功能:实现用户和管理员的登录和退出以及用户的注册

    视图层:B_login.jsp(登入页面) B_regitesr.jsp(注册页面)

    1. com.book.bean: B_user.java(包装用户基本信息类)B_administrator.java(包装管理员基本信息类)
    2. com.book.dao:   B_adiministratordao.java    B_userdao.java()

    包含U_adduser(添加用户),U_finduser(查找用户),A_adduser(添加管理员),A_finduser(查找管理员)

    1. com.book.dao.impl: B_administratorimpl.java    B_userimpl.java(实现方法的接口)
    2. com.book.servlet   B_logionservlet.java  B_registerservlet.java  B_EncodingFilter.java(编码过滤器)   B_exitservlet.java(退出,销毁session)

     

    (2)用户查询图书模块

    功能:查询图书、借阅图书

    1、视图层:B_referbook.jsp(查找图书)  B_referbook1.jsp(借阅图书)

    2、com.book.bean:  B_borrowbook.java(包装借阅记录的类)

    3、com.book.dao:   B_borrowbookdao.java   borrow(借阅图书方法)

    4、com.book.dao.impl  B_borrowbookimpl.java (实现借阅功能的接口)

    5、com.book.servlet   B_borrowbookservlet.java

    (3)用户借阅记录模块

    功能:查看借阅记录、还书

    1. 视图层:B_u.record.jsp
    2. com.book.bean:  B_borrowbook.java包装借阅记录的类)
    3. com.book.dao:   B_returnbookdao.java   returnbook(还书方法)
    4. com.book.dao.impl:  B_returnbookimpl.java  (实现还书功能的接口)
    5. com.book.servlet:   B_returnbookservlet.java

     

    (4)用户收件箱模块

    功能:可以接收来自管理员的信息

    1. 视图层:B_u.inbox.jsp

    (5)系统反馈模块

    功能:可以向管理员反馈系统问题

    1. 视图层:  B_u.feedback.jsp
    2. com.book.bean:  B_umessage.java(包装用户反馈的信息的类)
    3. com.book.dao:   B_umessagedao.java  addcontent(提交留言的方法)
    4. com.book.dao.impl:   B_umessageimpl.java (实现提交留言功能的接口)
    5. com.book.servlet:  B_umessageservlet.java

     

    (6)设置模块

    功能:可以修改自己的密码

    1. 视图层:B_u.set.jsp(用户设置) B_a.set.jsp(管理员设置)
    2. com.book.bean:  B_user.java(包装用户信息的类)B_administrator.java(包装管理员信息类)
    3. com.book.dao:   B_usetdao.java B_asetdao.java  u_findpass、a_findpass(查找原密码) u_mod、a_mod(修改密码)
    4. com.book.dao.impl: B_usetimpl.java   (实现u_findpass和u_mod方法) B_asetimpl.java   (实现a_findpass和a_mod方法)
    5. com.book.servlet:   B_setservlet.java

      

    (7)管理员用户管理模块

    功能:实现查看用户借阅记录,删除用户,给用户留言功能

    1. 视图层:B_u.control.jsp(主页面)   B_a.check.jsp(查看借阅记录) B_a.mass.jsp(留言页面)
    2. com.book.bean: B_mass.java(包装管理员向用户留言的类)B_user.java(包装用户信息类)
    3. com.book.dao:  B_massdao.java  addmass(添加留言)  B_udeletedao.java  udelete(删除用户方法)
    4. com.book.dao.impl:  B_massimpl.java  (实现添加留言的方法)B_udeleteimpl.java(实现删除用户功能,只有当用户借阅的图书全部归还才能删除)
    5. com.book.servlet:  B_massservlet.java  B_udeleteservlet.java

    (8)管理员管理图书模块

    功能:添加图书、查看所有图书、查看图书详情

    1. 视图层: B_bookadmi.jsp(添加图书)  B_bookadmi1.jsp B_bookadmi2.jsp (查看图书)B_bookadmi2.jsp(查看图书详情)
    2. com.book.bean:  B_book.java(包装图书信息类)
    3. com.book.dao:   B_bookdao.java  addbook(添加图书)
    4. com.book.dao.impl:  B_bookimpl.java  (实现添加图书功能)
    5. com.book.servlet:    B_bookservlet.java

     

    (9)管理员下达通知模块

    功能:可以向所有用户下达通知

    1. 视图层:B_a.feedback.jsp
    2. com.book.bean: B_amessage.java(包装下达通知信息类)
    3. com.book.dao:  B_amessagedao.java  addcontent(添加信息)
    4. com.book.dao.impl:  B_amessageimpl.java  (实现addcontent功能)
    5. com.book.servlet:  B_amessageservlet.java

    (10)用户反馈模块

    功能:查看用户反馈的内容、删除反馈内容

    1. 视图层:  B_a.inbox.jsp
    2. com.book.bean:   B_ainbox.java(包装反馈信息的ID)
    3. com.book.dao:    B_deainboxdao.java  deleteinbox(删除用户反馈信息)
    4. com.book.dao.impl:B_deleteinbox.java(实现删除信息功能)
    5. com.book.servlet: B_deleteinboxservlet.java

    代码太长这里就不展示了,可以自己去百度网盘把项目下载下来然后导入

     链接:https://pan.baidu.com/s/1ihijAysY47jL5957a10Zbg 
    提取码:d47z

     

    展开全文
  • 本项目是个java开发的简单的用户管理系统,因为能力有限,我做的界面丑陋了些,大家见谅 实现的功能:登录、添加用户、修改用户(修改的时候用户原始数据显示到界面上、单个删除用户和多个删除用户、数据的分页和...

    1.简介

            本项目是个java开发的简单的用户管理系统,因为能力有限,我做的界面丑陋了些,大家见谅

            实现的功能:登录、添加用户、修改用户(修改的时候用户原始数据显示到界面上、单个删除用户和多个删除用户、数据的分页和跳转、url过滤器

            因为我写的时候是开了两个tomcat服务器 将图片存储到另一个服务器上进行访问 大家这里有疑问的也欢迎咨询哈 同时如果有小伙伴想要项目源文件的欢迎加qq群

    2.准备工作

            1.1开发工具

                    IDEA2019、SQLYog  、HBuilder

            1.2使用语言

                    SQL、Java、HTML、JSP

            1.3前端框架

                    BootStrap     

            1.4导入的jar包

    3.项目文件结构

     

     4.代码

    sql

    /*
    SQLyog Ultimate v13.1.1 (64 bit)
    MySQL - 5.7.29 : Database - contact_sys
    *********************************************************************
    */
    
    /*!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*/`contact_sys` /*!40100 DEFAULT CHARACTER SET utf8 */;
    
    USE `contact_sys`;
    
    /*Table structure for table `client` */
    
    DROP TABLE IF EXISTS `client`;
    
    CREATE TABLE `client` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(32) DEFAULT NULL,
      `password` varchar(32) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
    
    /*Data for the table `client` */
    
    insert  into `client`(`id`,`username`,`password`) values 
    (1,'张三','123456');
    
    /*Table structure for table `contact` */
    
    DROP TABLE IF EXISTS `contact`;
    
    CREATE TABLE `contact` (
      `cid` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `gender` varchar(4) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      `phone` varchar(11) DEFAULT NULL,
      `email` varchar(255) DEFAULT NULL,
      `qq` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`cid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
    
    /*Data for the table `contact` */
    
    insert  into `contact`(`cid`,`name`,`gender`,`age`,`phone`,`email`,`qq`) values 
    (28,'科比','男',34,'1231','1346888','ce88029a735b44d3b553a917911b13f30d6583f95051415da21b8fcdbcae8a8d4.png'),
    (29,'户','男',34,'1516152','14561113@qq.com','4083a5d95fdb4442ae937bc0da1904102bafe2f833de4744878e3142d2ce488e74eacec67ede492f88c9be61c2602adfea21bcc015944f3091c270736d52c3ec5.png'),
    (30,'张三','男',7848,'1551674585','1346888','9e1ae3313c5e4793ae94be0f4be69d96b59d1750411a46ff88ad3b716cf632c23.png'),
    (31,'打','男',24,'1551674585','sdada13@162','53b1005dbd6a4923b782a067cdf48e0150b979f34c214911b6bf6c07035c560659cd76a4281f46eda598540a91cd50272.png');
    
    /*!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 */;
    

     pojo

    package com.javacoffee.pojo;
    
    public class Client {
        //创建Client类 和数据库中的client表对应好
        private Integer id;
        private String username;
        private String password;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    

    package com.javacoffee.pojo;
    
    public class Contact {
        //创建Contact类 和数据库中的字段名对应好
        private Integer cid;
        private String name;
        private String gender;
        private Integer age;
        private String phone;
        private String email;
        private String qq;
    
        public Contact() {
        }
    
        public Integer getCid() {
            return cid;
        }
    
        public void setCid(Integer cid) {
            this.cid = cid;
        }
    
        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 Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getPhone() {
            return phone;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getQq() {
            return qq;
        }
    
        public void setQq(String qq) {
            this.qq = qq;
        }
    
        @Override
        public String toString() {
            return "Contact{" +
                    "cid=" + cid +
                    ", name='" + name + '\'' +
                    ", gender='" + gender + '\'' +
                    ", age=" + age +
                    ", phone='" + phone + '\'' +
                    ", email='" + email + '\'' +
                    ", qq='" + qq + '\'' +
                    '}';
        }
    }
    

     dao

    package com.javacoffee.dao;
    
    import com.javacoffee.pojo.Client;
    
    public interface ClientDao {
        Client login(String username, String password);
    }
    

    package com.javacoffee.dao;
    
    import com.javacoffee.pojo.Contact;
    import com.javacoffee.util.PageBean;
    
    import java.util.List;
    
    public interface ContactDao {
        //面向接口编程
        public void addContact(Contact contact);//添加联系人
        public void updateContact(Contact contact);//修改联系人
        public void deleteContact(Integer cid);//删除联系人
        public List<Contact> findAll();  //查询所有联系人
        public Contact findById(Integer cid);//根据编号查询联系人
        public PageBean findByPage(PageBean pageBean);//分页
        public void deleteAll(String[] cids);//删除全选
    
        Contact selectPhone(String phone);
    
    }
    

    dao实现类

    package com.javacoffee.dao.impl;
    
    import com.javacoffee.dao.ClientDao;
    import com.javacoffee.pojo.Client;
    import com.javacoffee.util.JdbcUtil;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    
    import java.sql.SQLException;
    
    public class ClientDaoImpl implements ClientDao {
        @Override
        public Client login(String username, String password) {
            //登陆的查询语句
            String sql = "select * from client where username = ? and password = ?";
            Object[] objects = {username,password};
            try {
                return  JdbcUtil.getQueryRunner().query(sql, new BeanHandler<Client>(Client.class), objects);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throw new RuntimeException("sql语句异常");
        }
    
    }
    
    package com.javacoffee.dao.impl;
    
    import com.javacoffee.dao.ContactDao;
    import com.javacoffee.pojo.Contact;
    import com.javacoffee.util.JdbcUtil;
    import com.javacoffee.util.PageBean;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    import java.sql.SQLException;
    import java.util.List;
    
    public class ContactDaoImpl implements ContactDao {
    
        //添加联系人的方法
        @Override
        public void addContact(Contact contact) {
            //sql语句 后面加上参数
            String sql = "insert into contact(name,gender,age,phone,email,qq) values(?,?,?,?,?,?)";
            //创建一个object数组,并把需要传的参数放入数组中
            Object[] objects = {contact.getName(),contact.getGender(),contact.getAge(),contact.getPhone(),contact.getEmail(),contact.getQq()};
            try {
                //执行sql语句 我导入了dbUtil包,所以直接得到queryRunner对象执行sql语句
                JdbcUtil.getQueryRunner().update(sql,objects);
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
        }
    
        @Override
        public void updateContact(Contact contact) {
            //修改的sql语句
            String sql = "update contact set name = ?,gender = ?,age=  ?,phone = ?,email = ?,qq = ? where cid = ?";
            //和增加很一样,先赋值到数组 再执行sql语句
            Object[] objects = {contact.getName(),contact.getGender(),contact.getAge(),contact.getPhone(),contact.getEmail(),contact.getQq(),contact.getCid()};
            try {
                JdbcUtil.getQueryRunner().update(sql,objects);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void deleteContact(Integer cid) {
            //删除sql语句
            String sql = "delete from contact where cid = ?";
            try {
                //传参可以直接传入sql语句和 cid形式参数
                JdbcUtil.getQueryRunner().update(sql,cid);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public List<Contact> findAll() {
            //返回值为List集合 sql语句如下
            String sql = "select * from contact";
            try {
                //也是通过dbUtil工具类来执行sql语句,因为输出的为List集合,所以第一个参数为sql语句 第二个如下
                return JdbcUtil.getQueryRunner().query(sql, new BeanListHandler<Contact>(Contact.class));
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throw new RuntimeException("列表无数据");
        }
    
        @Override
        public Contact findById(Integer cid) {
            //这个是通过id来进行查找
            String sql = "select * from contact where cid = ?";
            try {
                //返回值为一个对象 所以第二个参数也变成如下了,第三个参数放入cid
                return JdbcUtil.getQueryRunner().query(sql, new BeanHandler<Contact>(Contact.class), cid);
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            throw new RuntimeException("没有这个id");
        }
        @Override
        public PageBean findByPage(PageBean pageBean) {
            //分页 这里是通过sql语句分的 比较基础
            String sql = "select * from contact limit ?,?";
            //传入的是PageBean对象,来获取当前页号和每页的记录数
            //大家可一思考一下 select * from contact limit 0,3 是查找第一个到第三个的数据
            // select * from contact limit 3,3 是查找第四个到第六个的 以此类推
            Object[] objects = {(pageBean.getPageNum()-1)*pageBean.getPageSize(),pageBean.getPageSize()};
            try {
                //传入每页的数据
                List<Contact> query = JdbcUtil.getQueryRunner().query(sql, new BeanListHandler<Contact>(Contact.class), objects);
                pageBean.setPageData(query);
    
                //查找数据总数
                String sql1 = "select count(cid) from contact";
                //强转为Long类型数据
                Long query1 = (Long)JdbcUtil.getQueryRunner().query(sql1, new ScalarHandler<>());
                //将查找出来的数据再转化为int类型数据存入pageBean中
                pageBean.setTotalData(query1.intValue());
                //可以在控制台打印一下看看是不是存入
    //            System.out.println(pageBean.getTotalData());
    
                //计算总页数  用了三目运算符
                //当 总数据数除以每页的数据数结果余数为0时候,说明总页数是总数据数除以每页的数据数结果取整
                //反之则需要加一
                Integer totalCount = pageBean.getTotalData()%pageBean.getPageSize()==0 ?
                        pageBean.getTotalData()/pageBean.getPageSize() :
                        pageBean.getTotalData()/pageBean.getPageSize() + 1;
                //然后赋值
                pageBean.setTotalCount(totalCount);
                //返回这个对象
                return pageBean;
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throw new RuntimeException("无法获取对象");
        }
    
        @Override
        public void deleteAll(String[] cids) {
            //输入sql语句 通过cid来进行多个删除 可以看到传入的参数为cids是一个String类型的数组
            String sql = "delete from contact where cid = ?";
            //创建一个二维数组,这个数组的长度为cids中的数据数
            Object[][] objects = new Object[cids.length][];
            //通过循环来对二维数组进行赋值
            for (int i = 0; i < objects.length; i++) {
                objects[i] = new Object[]{cids[i]};
            }
            try {
                //执行sql语句
                JdbcUtil.getQueryRunner().batch(sql,objects);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public Contact selectPhone(String phone) {
            String sql = "select * from contact where phone = ?";
            try {
                Contact query = JdbcUtil.getQueryRunner().query(sql, new BeanHandler<Contact>(Contact.class), phone);
                return query;
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throw new RuntimeException("查找异常");
        }
    
    
    }
    

    exception

    package com.javacoffee.exception;
    
    public class MyException extends Exception {
        public MyException(String messege){
            super(messege);
        }
    }
    

    service

    package com.javacoffee.service;
    
    import com.javacoffee.exception.MyException;
    import com.javacoffee.pojo.Contact;
    import com.javacoffee.util.PageBean;
    
    import java.util.List;
    
    public interface ContactService {
        //service层我并没写什么逻辑行为,因为比较简单,就起到了个传值的作用
        public void addContact(Contact contact) throws MyException;//添加联系人
        public void updateContact(Contact contact);//修改联系人
        public void deleteContact(Integer cid);//删除联系人
        public List<Contact> findAll();  //查询所有联系人
        public Contact findById(Integer cid);//根据编号查询联系人
        public  PageBean findByPage(PageBean pageBean);//分页
        public void deleteAll(String[] cids);//删除所选人
    
        Boolean selectPhone(String phone);
    
    }
    
    package com.javacoffee.service;
    
    import com.javacoffee.pojo.Client;
    
    public interface ClientService {
        //获取对象
        Client login(String username, String password);
    }
    

    service实现类

    package com.javacoffee.service.impl;
    
    import com.javacoffee.dao.ClientDao;
    import com.javacoffee.dao.impl.ClientDaoImpl;
    import com.javacoffee.pojo.Client;
    import com.javacoffee.service.ClientService;
    
    public class ClientServiceImpl implements ClientService {
        @Override
        public Client login(String username, String password) {
            ClientDao clientDao = new ClientDaoImpl();
            return clientDao.login(username,password);
        }
    }
    
    package com.javacoffee.service.impl;
    
    import com.javacoffee.dao.ContactDao;
    import com.javacoffee.dao.impl.ContactDaoImpl;
    import com.javacoffee.exception.MyException;
    import com.javacoffee.pojo.Contact;
    import com.javacoffee.service.ContactService;
    import com.javacoffee.util.PageBean;
    
    import java.util.List;
    
    public class ContactServiceImpl implements ContactService {
        //首先创建 多态父类引用指向子类对象 new出来contactDao对象
        private ContactDao contactDao = new ContactDaoImpl();
        //增加联系人的方法
        @Override
        public void addContact(Contact contact) throws MyException {
            Boolean aBoolean = selectPhone(contact.getPhone());
            if (aBoolean){
                contactDao.addContact(contact);
            }else {
                throw new MyException("手机号重复,不能使用!");
            }
    
        }
        //修改联系人的方法
        @Override
        public void updateContact(Contact contact) {
            contactDao.updateContact(contact);
        }
        //删除联系人的方法
        @Override
        public void deleteContact(Integer cid) {
            contactDao.deleteContact(cid);
        }
        //查找全部的方法
        @Override
        public List<Contact> findAll() {
            return contactDao.findAll();
        }
        //通过id查找的方法
        @Override
        public Contact findById(Integer cid) {
            return contactDao.findById(cid);
        }
        //分页
        @Override
        public PageBean findByPage(PageBean pageBean) {
            return contactDao.findByPage(pageBean);
        }
    
        @Override
        //删除所选全部
        public void deleteAll(String[] cids) {
             contactDao.deleteAll(cids);
        }
    
        @Override
        public Boolean selectPhone(String phone) {
            Contact contact = contactDao.selectPhone(phone);
            if (contact == null){
                return true;
            }else {
                return false;
            }
        }
    
    
    }
    

    filter过滤器

    package com.javacoffee.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebFilter("/*")
    public class ContactFilter implements Filter {
        public void destroy() {
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            //字符集过滤器 过滤所有 将字符集设置成utf-8
           HttpServletRequest request = (HttpServletRequest)req;
           HttpServletResponse response = (HttpServletResponse)resp;
           request.setCharacterEncoding("utf-8");
           response.setContentType("text/html;charset=utf-8");
           chain.doFilter(request,response);
        }
    
        public void init(FilterConfig config) throws ServletException {
    
        }
    
    }
    
    package com.javacoffee.filter;
    
    import com.javacoffee.pojo.Client;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    @WebFilter("/*")
    public class LoginFilter implements Filter {
        public void destroy() {
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            //登陆的过滤器 因为要确保先登录 所以将网址不是登录的重定向到登录界面
            HttpServletRequest request = (HttpServletRequest)req;
            HttpServletResponse response = (HttpServletResponse)resp;
            //获取后缀
            String requestURI = request.getRequestURI();
            requestURI = requestURI.substring(requestURI.lastIndexOf("/"));
            //判断如果输入的网址后缀是这两个 则放行
             if ("/loginServlet".equals(requestURI)|| "/login.jsp".equals(requestURI)){
                 chain.doFilter(request,response);
             }else {
                 //如果不是的话 因为我们在登录的时候创建了session 如果session为空
                 //那么一定是没有登录的 所以不放行重定向到登陆界面
                 HttpSession session = request.getSession(false);
                 if (session == null){
                     response.sendRedirect(request.getContextPath()+"/loginServlet");
                 }else {
                     //如果存在session 对象 不过有可能session对象里是在别的地方创建好的
                     //所以我们要判断session里是否存储了我们登陆时存进去的client对象
                     //如果没有的话那还是没登陆 就重定向到登陆界面
                     Client client = (Client)session.getAttribute("client");
                     if (client == null){
                         response.sendRedirect(request.getContextPath()+"/loginServlet");
                     }else {
                         //反之 就是登录过的 就可以放行
                         chain.doFilter(request,response);
                     }
                 }
             }
    
        }
    
        public void init(FilterConfig config) throws ServletException {
    
        }
    
    }
    

    util工具类

    package com.javacoffee.util;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import org.apache.commons.dbutils.QueryRunner;
    
    import javax.sql.DataSource;
    import java.io.InputStream;
    import java.util.Properties;
    
    //使用DBUtils的工具类
    public class JdbcUtil {
    
        //声明DataSource对象
        private static DataSource dataSource;
    
        //静态代码块
        static {
    
            try {
                //读取db.properties文件
                InputStream resourceAsStream = JdbcUtil.class.getResourceAsStream("/druid.properties");
                //创建Properties对象
                Properties properties = new Properties();
                //加载流对象
                properties.load(resourceAsStream);
                //创建数据源对象
                dataSource = DruidDataSourceFactory.createDataSource(properties);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    
        //获取DButils中核心类对象QueryRunner对象
        public static QueryRunner getQueryRunner(){
            return new QueryRunner(dataSource);//此时已经连接上数据库了
        }
    
    }
    
    package com.javacoffee.util;
    
    public class PageBean {
        //这是分页的工具类,一共需要获得五个属性
        private Integer pageNum;//当前页码号 通过前端获取
        private Integer pageSize;//一页的记录数 自己设置的
        private Object pageData;//一页的数据 可以看到返回值是对象
        private Integer totalCount;//总页数 需要二次计算
        private Integer totalData;//数据的总记录数 用来计算总页数用的
    
    
        public Integer getPageNum() {
            return pageNum;
        }
    
        public void setPageNum(Integer pageNum) {
            this.pageNum = pageNum;
        }
    
        public Integer getPageSize() {
            return pageSize;
        }
    
        public void setPageSize(Integer pageSize) {
            this.pageSize = pageSize;
        }
    
        public Object getPageData() {
            return pageData;
        }
    
        public void setPageData(Object pageData) {
            this.pageData = pageData;
        }
    
        public Integer getTotalCount() {
            return totalCount;
        }
    
        public void setTotalCount(Integer totalCount) {
            this.totalCount = totalCount;
        }
    
        public Integer getTotalData() {
            return totalData;
        }
    
        public void setTotalData(Integer totalData) {
            this.totalData = totalData;
        }
    
        @Override
        public String toString() {
            return "PageBean{" +
                    "pageNum=" + pageNum +
                    ", pageSize=" + pageSize +
                    ", pageData=" + pageData +
                    ", totalCount=" + totalCount +
                    ", totalData=" + totalData +
                    '}';
        }
    }
    

    druid.properties数据库连接池配置文件

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/contact_sys?useSSL=false
    #我是使用的mysql 所以端口号为3306 数据库账户密码一定要改成自己的哈
    username=root
    password=1234
    
    initialSize=5
    maxActive=20
    maxWait=2000

    web层

    package com.javacoffee.web;
    
    import com.javacoffee.exception.MyException;
    import com.javacoffee.pojo.Contact;
    import com.javacoffee.service.ContactService;
    import com.javacoffee.service.impl.ContactServiceImpl;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Part;
    import java.io.File;
    import java.io.IOException;
    import java.util.UUID;
    //注意这两个注解千万不能省略
    @WebServlet("/addContactServlet")//这个是servlet的注解,可以访问的到
    @MultipartConfig//这个是代表上传文件的注解
    public class AddContactServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //这是增加联系人的servlet 首先设置字符集
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            //新建一个contact对象 用来存储数据库中获取的数据
            Contact contact = new Contact();
            //通过前端所对应的键名来获取相应的值
            String name = request.getParameter("name");
            String gender = request.getParameter("gender");
            String age = request.getParameter("age");
            String phone = request.getParameter("phone");
            String email = request.getParameter("email");
            //这里是上传文件 获取上传的对象
            Part qq = request.getPart("qq");
            //获取所上传文件的名字
            String qqName = qq.getSubmittedFileName();
            //为了避免上传的文件后,文件重复 每次上传文件都会通过UUID 工具类获取一个随机的字符串作为前缀名
            String replace = UUID.randomUUID().toString().replace("-", "");
           //我是把文件上传到另一个tomcat服务器里 所以这里把他的路径给出来了
            String uploadPath = "D:\\apache-tomcat-8.5.31\\webapps\\imgs";
           //通过路径创建一个新的文件对象
            File file = new File(uploadPath);
            //如果没有这个文件的话,就创建
            if (!file.exists()){
                file.mkdirs();
            }
            //最后组成文件的名字
            String uploadFileName = replace+qqName;
            //然后给他上传一下,参数为(路径+文件名) 注意这两个之间要加斜杠
            qq.write(uploadPath+"/"+uploadFileName);
            //接着赋值给对象
            contact.setName(name);
            contact.setAge(Integer.parseInt(age));
            contact.setEmail(email);
            contact.setGender(gender);
            contact.setPhone(phone);
            contact.setQq(uploadFileName);
            //接着调用addContact方法
            ContactService contactService = new ContactServiceImpl();
            try {
                contactService.addContact(contact);
            } catch (MyException e) {
                request.setAttribute("msg",e.getMessage());
                request.getRequestDispatcher("addContact.jsp").forward(request,response);
            }
    
            //因为不需要传值 重定向到首页面
            response.sendRedirect(request.getContextPath()+"/pageServlet");
        }
    }
    
    package com.javacoffee.web;
    
    import com.javacoffee.service.ContactService;
    import com.javacoffee.service.impl.ContactServiceImpl;
    
    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.io.IOException;
    import java.util.Arrays;
    
    @WebServlet("/contactDeleteAllServlet")
    public class ContactDeleteAllServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
    
            String[] cids = request.getParameterValues("cids");
            if (cids != null) {
                ContactService contactService = new ContactServiceImpl();
                contactService.deleteAll(cids);
                response.sendRedirect(request.getContextPath()+"/pageServlet");
            }else {
                response.sendRedirect(request.getContextPath() + "/pageServlet");
            }
        }
    }
    
    package com.javacoffee.web;
    
    import com.javacoffee.service.ContactService;
    import com.javacoffee.service.impl.ContactServiceImpl;
    import com.javacoffee.util.PageBean;
    
    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.http.HttpSession;
    import java.io.IOException;
    
    @WebServlet("/contactDeleteServlet")
    public class ContactDeleteServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
    
            ContactService contactService = new ContactServiceImpl();
            String cid = request.getParameter("cid");
            contactService.deleteContact(Integer.parseInt(cid));
    
            response.sendRedirect(request.getContextPath()+"/pageServlet");
        }
    }
    
    package com.javacoffee.web;
    
    import com.javacoffee.pojo.Contact;
    import com.javacoffee.service.ContactService;
    import com.javacoffee.service.impl.ContactServiceImpl;
    
    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.io.IOException;
    import java.util.List;
    
    @WebServlet("/contactFindAllServlet")
    public class ContactFindAllServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            ContactService contactService = new ContactServiceImpl();
            List<Contact> contactList = contactService.findAll();
            request.setAttribute("contactList",contactList);
            request.getRequestDispatcher("findAll.jsp").forward(request,response);
        }
    }
    
    package com.javacoffee.web;
    
    import com.javacoffee.pojo.Contact;
    import com.javacoffee.service.ContactService;
    import com.javacoffee.service.impl.ContactServiceImpl;
    
    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.io.IOException;
    
    @WebServlet("/findByIdServlet")
    public class FindByIdServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            ContactService contactService = new ContactServiceImpl();
            String cid = request.getParameter("cid");
            Contact contact = contactService.findById(Integer.parseInt(cid));
            request.setAttribute("contact",contact);
            request.getRequestDispatcher("update.jsp").forward(request,response);
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
    }
    
    package com.javacoffee.web;
    
    import com.javacoffee.pojo.Client;
    import com.javacoffee.pojo.Contact;
    import com.javacoffee.service.ClientService;
    import com.javacoffee.service.ContactService;
    import com.javacoffee.service.impl.ClientServiceImpl;
    import com.javacoffee.service.impl.ContactServiceImpl;
    
    import javax.servlet.RequestDispatcher;
    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.http.HttpSession;
    import java.io.IOException;
    
    @WebServlet("/loginServlet")
    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ClientService clientService = new ClientServiceImpl();
            //获取前端输入框的数据
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //调用login方法 并返回client对象
            Client client = clientService.login(username,password);
            //如果client不为空的话也就是有这个账号密码  就 将client存入session 转发到主界面 也就是登录成功跳转
            if (client != null){
                HttpSession session = request.getSession();
                session.setAttribute("client",client);
                request.getRequestDispatcher("pageServlet").forward(request,response);
            }else {
                //如果为空就代表没有这个代码 就重定向到登陆界面
                response.sendRedirect(request.getContextPath()+"/login.jsp");
            }
        }
    }
    
    package com.javacoffee.web;
    
    import com.javacoffee.pojo.Client;
    import com.javacoffee.service.ContactService;
    import com.javacoffee.service.impl.ContactServiceImpl;
    import com.javacoffee.util.PageBean;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
    
    @WebServlet("/pageServlet")
    public class PageServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
    
            String pageNum = request.getParameter("pageNum");
            if (pageNum==null){
                pageNum="1";
            }
            Integer pageSize = 4;
            PageBean pageBean1 = new PageBean();
            pageBean1.setPageNum(Integer.parseInt(pageNum));
            pageBean1.setPageSize(pageSize);
            ContactService contactService = new ContactServiceImpl();
            PageBean pageBean = contactService.findByPage(pageBean1);
            request.setAttribute("pageBean",pageBean);
            HttpSession session = request.getSession(false);
            Client client = (Client)session.getAttribute("client");
            request.setAttribute("client",client);
            request.getRequestDispatcher("findAll.jsp").forward(request,response);
        }
    }
    
    package com.javacoffee.web;
    
    
    import com.javacoffee.service.ContactService;
    import com.javacoffee.service.impl.ContactServiceImpl;
    
    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.io.IOException;
    
    @WebServlet("/selectPhoneServlet")
    public class SelectPhoneServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
    
            String phone = request.getParameter("phone");
            ContactService contactService = new ContactServiceImpl();
            Boolean statement = contactService.selectPhone(phone);
            if (statement){
                response.getWriter().write("noExist");
            }else {
                response.getWriter().write("exist");
            }
        }
    }
    
    package com.javacoffee.web;
    
    import com.javacoffee.pojo.Contact;
    import com.javacoffee.service.ContactService;
    import com.javacoffee.service.impl.ContactServiceImpl;
    import com.javacoffee.util.PageBean;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.File;
    import java.io.IOException;
    import java.util.UUID;
    
    @WebServlet("/updateServlet")
    @MultipartConfig
    public class UpdateServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            String cid = request.getParameter("cid");
            String name = request.getParameter("name");
            String gender = request.getParameter("gender");
            String age = request.getParameter("age");
            String phone = request.getParameter("phone");
            String email = request.getParameter("email");
            Part qq = request.getPart("qq");
    
            String updateFilePath = "D:\\apache-tomcat-8.5.31\\webapps\\imgs";
            File file = new File(updateFilePath);
            if (file.exists()) {
                file.mkdirs();
            }
            String submittedFileName = qq.getSubmittedFileName();
    
            String updateFileName = UUID.randomUUID().toString().replace("-", "") + submittedFileName;
            qq.write(updateFilePath + "\\" + updateFileName);
    
            ContactService contactService = new ContactServiceImpl();
            Contact contact = new Contact();
            contact.setCid(Integer.parseInt(cid));
            contact.setName(name);
            contact.setAge(Integer.parseInt(age));
            contact.setEmail(email);
            contact.setGender(gender);
            contact.setPhone(phone);
            contact.setQq(updateFileName);
            contactService.updateContact(contact);
            response.sendRedirect(request.getContextPath() + "/pageServlet");
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
    }
    
    

    前端代码

    <%--
      Created by IntelliJ IDEA.
      User: 86156
      Date: 2021/9/30
      Time: 15:10
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录界面</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    
    </head>
    <body style="background-color:burlywood">
    <center><h1>用户登陆页面</h1></center>
    <div style="background-color: beige;width: 500px;height: 300px;position: absolute;top: 100px;left:520px;border-radius: 10px">
    <form class="form-horizontal" action="loginServlet" method="post">
        <div style="position: absolute;top: 50px;left: 100px">
        <div class="form-group">
            <label for="inputEmail3" class="col-sm-2 control-label">UserName:</label>
            <div class="col-sm-10" style="position: absolute;left: 100px;width: 200px">
                <input type="text" name="username" class="form-control" id="inputEmail3" placeholder="Email" >
            </div>
        </div>
        <div class="form-group">
            <label for="inputPassword3" class="col-sm-2 control-label">PassWord:</label>
            <div class="col-sm-10" style="position: absolute;left: 100px;width: 200px">
                <input type="password" name="password" class="form-control" id="inputPassword3" placeholder="Password" >
            </div>
        </div>
            <br>
        <div class="form-group" style="position: absolute;left: 170px">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-default" style="width: 90px">登录</button>
            </div>
        </div>
        </div>
    </form>
    </div>
    </body>
    </html>
    
    <%--
      Created by IntelliJ IDEA.
      User: 86156
      Date: 2021/9/28
      Time: 11:14
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Title</title>
        <style>
           table{
               text-align: center;
               vertical-align: middle;
           }
    
        </style>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    </head>
    <body bgcolor="#6495ed">
    <font color="#deb887" size="6" style="background-color: beige">欢迎:${client.username}&nbsp;登录!</font>
    <form action="contactDeleteAllServlet" method="post" >
    <table class="table table-hover table-bordered" style="width: 80%" align="center">
        <tr class="success" style="font-weight: bold">
            <td><input type="checkbox"  id="cids" onclick="selectAll()">全选</td>
            <td>编号</td>
            <td>姓名</td>
            <td>性别</td>
            <td>年龄</td>
            <td>电话</td>
            <td>邮箱</td>
            <td>QQ</td>
            <td>操作</td>
        </tr>
    <%--    <c:forEach items="${contactList}" var="contactList" varStatus="c">--%>
        <c:forEach items="${pageBean.pageData}" var="contactList" varStatus="c">
        <tr class="active" style="vertical-align: center">
            <td align="center"><input type="checkbox" class="checkbox" name="cids" value="${contactList.cid}"></td>
            <td>${c.count}</td>
            <td>${contactList.name}</td>
            <td>${contactList.gender}</td>
            <td>${contactList.age}</td>
            <td>${contactList.phone}</td>
            <td>${contactList.email}</td>
    <%--        //图片显示的路径 我的是自己又开了一个tomcat端口号为9999--%>
            <td><img src="http://10.8.159.4:9999/imgs/${contactList.qq}" width="60" height="60"></td>
            <td><a href="${pageContext.request.contextPath}/findByIdServlet?cid=${contactList.cid}">修改</a>&nbsp;
    
                <a href="${pageContext.request.contextPath}/contactDeleteServlet?cid=${contactList.cid}">删除</a>
    
                <c:if test="${pageBean.pageData==null}">
                    ${pageBean.pageNum=pageBean.pageNum-1}
                </c:if>
            </td>
        </tr>
        </c:forEach>
        <tr class="warning" >
            <td colspan="9" align="center"><a href="addContact.jsp">[添加联系人]</a></td>
        </tr>
    
        <tr class="warning" >
            <td colspan="9" align="center"><input type="submit" value="全部删除"></td>
        </tr>
    
    
        <tr class="warning" >
            <td colspan="9" align="center">
                &nbsp;&nbsp;第${pageBean.pageNum}页&nbsp;&nbsp;${pageBean.pageNum}/${pageBean.totalCount}页&nbsp;&nbsp;
                <a href="${pageContext.request.contextPath}/pageServlet?pageNum=1">首页</a>
    
                <c:if test="${pageBean.pageNum == 1}">
                    <a>上一页</a>
                </c:if>
    
                <c:if test="${pageBean.pageNum > 1}">
                    <a href="${pageContext.request.contextPath}/pageServlet?pageNum=${pageBean.pageNum-1}">上一页</a>
                </c:if>
    
                <c:if test="${pageBean.pageNum == pageBean.totalCount}">
                    <a>下一页</a>
                </c:if>
    
                <c:if test="${pageBean.pageNum < pageBean.totalCount}">
                    <a href="${pageContext.request.contextPath}/pageServlet?pageNum=${pageBean.pageNum+1}">下一页</a>
                </c:if>
    
                <a href="${pageContext.request.contextPath}/pageServlet?pageNum=${pageBean.totalCount}">尾页</a>
            </td>
        </tr>
    </table>
    </form>
    </body>
    <script type="application/javascript">
        function selectAll() {
            var cids = document.getElementById("cids");
            var elementsByClassName = document.getElementsByClassName("checkbox");
            for (var i = 0; i < elementsByClassName.length; i++) {
                elementsByClassName[i].checked = cids.checked;
            }
        }
    </script>
    </html>
    <%--
      Created by IntelliJ IDEA.
      User: 86156
      Date: 2021/9/28
      Time: 15:08
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>添加联系人</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"></script>
    
    </head>
    
    <body>
    <center><h3>添加联系人</h3></center>
    
    <form action="addContactServlet" method="post" enctype="multipart/form-data">
        <table align="center" border="1" width="300px" class="table table-bordered table-hover">
            <tr class="warning"><td colspan="2"><font color="red" size="5">${msg}</font></td></tr>
            <tr class="success">
                <th>姓名</th>
                <td><input type="text" name="name"/></td>
            </tr>
            <tr class="warning">
                <th >性别</th>
                <td>
                    <input type="radio" name="gender" value="男" checked="checked" />男
                    <input type="radio" name="gender" value="女"/>女
                </td>
            </tr>
            <tr class="active">
                <th>年龄</th>
                <td><input type="text" name="age"/></td>
            </tr>
            <tr class="danger">
                <th>电话</th>
                <td><input type="text" name="phone" id="phone" onfocus="waring()" onblur="findPhone()"/>
                <span id="phoneSpan"></span></td>
            </tr>
            <tr class="info">
                <th>邮箱</th>
                <td><input type="text" name="email"/></td>
            </tr>
            <tr>
                <th>QQ</th>
                <td><input type="file" name="qq"/></td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" value="保存"/>&nbsp;
                    <input type="reset" value="重置"/></td>
            </tr>
        </table>
    </form>
    </body>
    <script type="application/javascript">
        function waring() {
            var elementById = document.getElementById("phoneSpan");
            elementById.innerHTML="手机号为11位".fontcolor("red");
        }
        function findPhone() {
            var elementById = document.getElementById("phoneSpan");
            var selectPhone = document.getElementById("phone").value;
    
            $.get("selectPhoneServlet",{phone:selectPhone},
            function (backdata) {
                if (backdata=="exist"){
                    elementById.innerHTML="手机号已存在".fontcolor("red");
                }else if (backdata=="noExist") {
                    elementById.innerHTML="手机号可以使用".fontcolor("green");
                }
            },"text")
        }
    </script>
    </html>
    
    <%--
      Created by IntelliJ IDEA.
      User: 86156
      Date: 2021/9/28
      Time: 19:12
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>修改联系人</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    </head>
    
    <body>
    <center><h3>修改联系人</h3></center>
    <form action="updateServlet" method="post" enctype="multipart/form-data">
        <input type="hidden" name="cid" value="${contact.cid}">
        <table align="center" border="1" width="300px" class="table table-hover table-bordered">
            <tr class="active">
                <th>姓名</th>
                <td><input type="text" name="name" value="${contact.name}"/></td>
            </tr>
            <tr class="success">
                <th>性别</th>
                <c:if test="${contact.gender=='男'}">
                <td>
                    <input type="radio" name="gender" value="男" checked="checked"/>男
                    <input type="radio" name="gender" value="女"/>女
                </td>
                </c:if>
                <c:if test="${contact.gender=='女'}">
                    <td>
                        <input type="radio" name="gender" value="男"/>男
                        <input type="radio" name="gender" value="女" checked="checked"/>女
                    </td>
                </c:if>
            </tr>
            <tr class="warning">
                <th>年龄</th>
                <td><input type="text" name="age" value="${contact.age}"/></td>
            </tr>
            <tr class="info">
                <th>电话</th>
                <td><input type="text" name="phone" value="${contact.phone}"/></td>
            </tr>
            <tr class="success">
                <th>邮箱</th>
                <td><input type="text" name="email" value="${contact.email}"/></td>
            </tr>
            <tr class="danger">
                <th>QQ</th>
                <td><img src="http://localhost:9999/imgs/${contact.qq}" width="60" height="60"><input type="file" name="qq"/></td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" value="保存"/>&nbsp;
                    <input type="reset" value="重置"/></td>
            </tr>
        </table>
    </form>
    </body>
    </html>
    
    

    5.显示效果

      5.1登录界面

    5.2主界面

     5.3添加界面

     5.4修改界面

    展开全文
  • 故开发一个家政服务管理系统,对促进家政服务行业发展颇具实用意义。 本文首先对目前家政管理系统开发所需技术进行调研,再结合当前家政行业发展的趋势,对该系统提出可行性分析,设计开发出了系统具体功能需求。...

    摘 要

    随着我国服务行业水平的不断提高,家政服务者和客户之间的信息互通和管理是既重要又复杂的系统工作。传统家政服务工作方式已无法满足现代信息化社会或全方位诸多个性化服务需求。故开发一个家政服务管理系统,对促进家政服务行业发展颇具实用意义。
    本文首先对目前家政管理系统开发所需技术进行调研,再结合当前家政行业发展的趋势,对该系统提出可行性分析,设计开发出了系统具体功能需求。系统设计采用 B/S 三层模式架构,以JAVA语言工具和MySQL数据库;以及HTML等技术来实现家政服务信息化管理的基本功能。系统主要功能实现了用户信息管理、订单的预约交易评价等服务。其中前台包括客户及家政人员,其中客户可以预约和管理家政服务、审核订单以及评价工作;家政人员可以查看、申请、管理订单及评价用户。后台管理员可以管理所有账户权限与信息认证。该家政服务网站的实现在一定程度上提高了市场竞争力。

    关键词:家政服务;JAVA语言;MySQL数据库;系统开发;B/S模式

    Abstract
    With the continuous improvement of the service industry level inChina, the information exchange and management between domestic service providers and customers is an important and complex system work, and the traditional domestic service work mode can not meet the needs of modern information society or all-round personalized service. Therefore, the development of a domestic service management system, to promote the development of domestic service industry has practical significance.
    This paper first investigates the technology needed for the development of domestic management system, then puts forward the feasibility analysis of the system, and designs and develops the specific functional requirements. The system design adopts B/S three-tier pattern architecture to JAVA language tools and MySQL databases, and HTML technology to realize the basic functions of domestic service information management. The main functions of the system are user information management, order booking transaction evaluation and other services. The front desk includes customers and domestic workers, who can book and manage domestic service, review orders and evaluate the work. Domestic workers can view, apply, manage orders and evaluate users. The background administrator can manage all account permissions and information authentication. The realization of the domestic service website has improved the market competitiveness to some extent.

    Key Words: Domestic service; Java language; MySQL Databases; system development;
    B/S mode;

    目 录
    1 概述 1
    1.1 实用背景意义 1
    1.2 家政现状分析 1
    1.3 论文主体结构 2
    2 系统开发环境与相关技术概述 3
    2.1 系统开发环境 3
    2.1.1 硬件要求 3
    2.1.2 软件要求 3
    2.1.3 系统运行环境需求 3
    2.2 相关技术概述 3
    2.2.1 Java技术 3
    2.2.2 Eclipse简介 4
    2.2.3 B/S架构设计 4
    2.2.4 MySQL数据库简介 5
    3 系统设计分析 6
    3.1 系统可行性分析 6
    3.1.1 经济可行性 6
    3.1.2 技术可行性 6
    3.1.3 实现可行性 6
    3.2 系统需求分析 6
    3.2.1 功能需求分析 6
    3.2.2 系统性能分析 7
    3.3 系统流程设计 7
    3.3.1 用户登入模块 7
    3.3.2 信息修改模块 8
    3.3.3 信息删除流程 …9
    4 系统设计与实现 10
    4.1 系统主要功能 10
    4.2 数据主库设计 12
    4.2.1 数据库概要设计 12
    4.2.2 数据库 E-R图 13
    4.2.3 数据主库表结构 14
    4.3 前台页面展示 17
    4.3.1 注册页面显示 17
    4.3.2 登录显示模块 18
    4.3.3 主要功能模块 20
    4.4 后台管理页面 25
    4.4.1账户管理功能模块…25
    4.4.2身份信息认证模块…25
    5 系统测试与探讨 26
    5.1 系统测试内容 26
    5.2 系统测试方法 26
    5.3 测试结果探讨 26
    5.3.1 用户注册登录模块测试 26
    5.3.2 用户信息管理模块测试 26
    5.3.3 订单管理模块测试 27
    5.3.4 后台管理员模块测试 27
    6 结论与展望 30
    谢辞 31
    参考文献 32
    附录…33

    家政服务管理系统的设计与实现
    1 概 述
    1.1实用背景意义
    家政服务总体是指以家庭和其居住社区为单位的服务对象。通过满足用户的家庭生活或社区事务的劳务需求和优化家庭的社区环境为目标,对整个家庭的运转和发展必不可少的服务性行业[1]。
    随着全球科学技术的快速发展,如今互联网在我国迅速普及,互联网在人们的日常生活和工作中重要部分。随着网络科技水平的不断提高,相关法律也逐渐完善,计算机涉及领域越来越广泛,在社会的不同领域,如家政服务,信息管理,人工智能等方面,已成为不可缺少的重要工具,尤其是在用户的服务体验方面[2]。软件的服务系统出现,使得大量复杂的问题变得简单和容易,同时也带动了消费增长[3]。
    为了适应新形势的发展,互联网家政服务已经日趋成为了新时代家政服务行业普遍形式,并在家政服务行业中发挥高效、便捷的作用,把人们从繁重的工作中解脱出来[4]。在家政服务管理系统中,客户可以在网上根据自己的实际需求进行预约自己的家政服务,并对于家政人员请求的家政订单进行审核。而家政工能够在系统上选择合适的订单以及发送审核、同时系统后台的管理员还能够管理所有的用户信息以及拥有身份认证权限。这样一来,大大减轻了不必要的人力物力浪费以及负担,使家政服务效率得到很大提高,在不受地域的局限同时也让家政服务更加方便[5]。如今,计算机技术的发展达到了相当高的水平。然而,家政服务管理行业软件的开发还处于基础阶段,随着这门技术的不断深化和逐渐提高,远程教育软件系统的功能应该更全面和完善,这对软件开发人员更高的设计要求更高[6]。

    1.2家政现状分析
    随着我国生活水平不断提升,对服务行业的要求也逐渐提高。如今,我国老龄化人口增加,家庭空巢化的现象越来越明显,国民在健康方面也有了较大的认识,因此,我国家政行业得到空前关注,发展迅速。在全球许多发达国家,家政产业已成为服务性行业的重要部门。德国、美国、日本等发达国家已经进入到家政产业繁荣发展阶段,发达国家的高级家政企业目前基础采用校企一体化的模式,即企业本身包含教育培训和经营双重功能。除了经营主业以外,企业还可向五星级以上的酒店培养高素质人才[7]。
    而国内家政市场的需求在近几年同样飞速增长,商务部和国家发改委社会发展司公布的数据显示,2017年中国家政服务行业营业收入达到4500亿元,同比2016年增长26.0%;2015-2017三年年均复合增长率为25.9%,到2020年我国将达到8689亿元。2016年从业家政服务人员2653万人[8],同比2015年增长9.3%。
    随着移动互联网和大数据等信息技术的发展和各路资本的涌入,一种以线上线下相结合的O2O家政模式打破了传统的商业模式,即在商业模式下,上游为家政供应商,中游为家政公司,下游为用户;在新开发的平台模式下,上游为家政供应商和服务提供机构或服务员个人,中游为O3O平台,负责吸引家政服务提供者进驻,下游为家庭客户[9]。结合“互联网+”思维,利用030家政服务模式,为创业者开启发展的道路。同时也产生了一些优秀的家政公司,如51家庭管家、好慷在家和e家洁等。
    利用计算机对日常家政服务数据事务的管理不仅可以节省工作人员大量的时间和精力,而且能保证服务信息记录准确、快速从而提高家政系统的信息管理效率,使得管理更加科学化、规范化;因此家政服务管理系统的开发具有重要意义的。

    1.3论文主体结构
    本文所设计的信息管理系统采用JAVA语言进行编程,并实现家政服务管理系统的设计。设计论文将用六大章对整体设计过程进行阐述,具体的安排如下:
    第1章 概述:主要描述了家政服务信息管理系统的实用背景意义、家政现状分析以及论文主体结构。
    第2章 系统开发环境与相关技术概述:介绍系统开发环境、设计模式、相关技术概述及数据库。
    第3章 设计分析:可行性方案分析,主要包括系统可行性分析和系统需求分析。
    第4章 系统设计与实现:主要包括系统功能主要功能、数据主库设计、及系统各模块功能实现,主要包括管理员方面、客户方面以及家政服务人员方面。
    第5章 系统测试与探讨:对家政服务管理系统进行功能测试,并对其发现的问题进行解决。
    第6章 结论与展望:对系统整体进行总结,以及对未来系统的潜在可能性的展望。

    第2章系统开发环境与相关技术概述
    2.1 系统开发环境
    2.1.1 硬件要求
    硬件要求即家政服务管理系统运行所必须的硬件环境,CPU为2GHz以上的64位处理器。硬件内存要求为4G以上,硬盘空间需要满足16GB或以上。
    2.1.2 软件要求
    软件要求即家政服务管理系统运行所必须的软件支持,主要有Eclipse、MYSQL数据库、操作系统Windows7及以上版本。
    2.1.3 系统运行环境需求
    本系统是基于B/模式的应用程序,后台采用MYSQL数据库进行数据处理,用户只需要通过浏览器界面对程序进行操作即可。计算机配置如图2-1所示。

    图2-1 计算机配置图
    2.2 相关技术概述
    2.2.1 Java技术

    Java是一门面向对象需求的一门语言,它主要是在C++遇到各种问题的时候产生的,它的出现满足了C++语言的不足。它的目的是为了让这门语言变得简单,健壮,更适合开发。这门语言为我们展现的是新开发思想的编程语言。它在开发软件应用程序最为适合,java在某些地方还留存了一些C++的特点,它没有了指针,但是它增加了很多的新特性,比如可以多个继承,目前,java作为目前流行开发语言之一。优点归纳如下:
    (一)面向对象,它把系统的数据和方法作为一个整体,建模层次更高,因所以更为侧重于对象之间的联系。它也适合用于分布式环境。
    (二)分布式,它是一种用于网络应用以实现与和其它计算节点的轻松协作的编程语言。还能够运用本身的类型库、URL地址来进行访问其它对象。
    (三)健壮性,程序在运行过程中出现简单错误,系统会自动处理错误,出现错误也能继续运行。
    (四)多线程,它不仅具有实时响应性,并且还在交互性方面有着卓越的优点,体现在这个方面——对多线程的支持[9]。
    2.2.2 Eclipse简介
    Eclipse 作为当下广泛流行的Java开发工具之一与它的开源以及良好的可扩展性是分不开的尽管就它而言是由框架和服务组成,但由于插件组件的存在使得其可以对开发环境进行构建。Eclipse主要由Eclipse项目、Eclipse技术项目和Eclipse工具项目组成,具体包括JDT、Eclipse Platform 、PDE和CDT四个部分[11]。而这里面的支持开发特性的PDE插件可以与Eclipse 环境生成用具,从而可以无需区分工具功能始终点进而无缝地集成到其他人的用具中,因为Eclipse中的所有内容都是插件,因此所有开发人员都可以在同一位置上部署Eclipse 插件,并给使用者带来具有统一性以及一致的集成开发环境。
    2.2.3 B/S架构设计
    B/S结构是从浏览器到服务器交互模式,这种模式对电脑的要求不高,一般计算机上用其自带浏览器即可[12]。正是由于它这种特性让它具有了跨平台特点,也是得对客户端计算机的配置要求不是那么严格。一般利用Java对于服务器端的开发,都优选使用B/S架构。B/S开发架构由表现层、业务层、持久层三层组成[13]。虽然它们之间相对独立但仍然彼此相关。它们会根据传递过来的参数,对数据库中的数据进行查询,保存等操作。
    B/S的最大优点是无需安装任何特殊软件即可在任何地方进行操作。由于它基于浏览器这种技术,并结合各种脚本语言来进行,所以它开发起来大大提高了开发速度和降低了开发成本[14]。只要有可以访问Internet的电脑,用户就可轻松进行操作,这也使得系统具有良好的扩展性。而对于数据库来说,只需服务器与系统进行连接。而在其他地点登录,只需要专网操作即可。由于现在操作系统基本上都自带浏览器,所以对于客户来说非常方便,服务器端只需要安装数据库即可。B/S结构在不仅让客户机的开支减少,而且也让维护人员的工作量大大减低。当用户在客户端发送请求到后台服务器时,绝大多数流程都会在服务器上开始执行,所以对于客户机和技术维修员来说都减轻了很多负担。

    2.2.4 MySQL 数据库简介
    MYSQL是一个小型的数据库管理系统也是一门成熟的数据源存储技术,它可以轻松的访问数据源,并能够告诉处理数据[15]。MYSQL能够支持多用户同时使用,对其自身而言是开源完全并且免费,同时在它使用相对简单,维护起来十分方便。它还可以快速的记录数条数据,并且能把它储存起来。所以对于开发家政服务管理系统来说是一个非常合适的选择。MYSQL还能够支持多种开发语言,工作在不同的操作系统上MySQL是一个轻量级数据库管理系统[16]。因此可以更快更高性能的对数据进行处理,为整个系统的开发,以及数据的保护提供了一种保障的,可靠的方法,这对于开发者来说无疑是大大减少了程序开发的时间。在本系统中使用了MYSQL数据库,经检验它是可以满足系统的设计使用的。
    3 系统设计分析
    3.1 系统设计分析
    3.1.1 经济可行性
    家政服务管理系统开发是由开发者自行研发并且该系统开发用自己学习的技术并且用到的软件基本上都是开源的,无需购买其余软件。同时系统之前的市场调研工作都是通过开发者自身的努力,遇到重点难点时还可以通过老师同学们的帮助进行解决,无需过多成本投资。

    3.1.2 技术可行性
    本系统基于B/S模式上进行开发,以JAVA语言同时使用eclipse作为系统的开发环境,Java语言可移植性强,上手简易,同时还具备异常处理机制这就为家政服务系统的开发打下了坚实的基础,同时也更加符合人们的需求,方便了新系统的扩展与修改。同时家政服务管理系统结合当前流行的一个数据库技术MYSQL用来作为数据的存储,建立了一个
    数据完整、安全、稳定性强的后台数据库系统。这些软件不仅功能便捷强大而且都可以免费下载,所以家政服务管理系统在技术上是可行的。

    3.1.3 实现可行性
    本系统为一个基于JAVA语言的家政服务管理系统,操作简单便捷,现在普通电脑的硬件、软件基本都能够满足使用条件,该系统主要是界面操作。点击对应的选项,即可进行相应的操作,操作过程与其他管理软件基本相同,用户只需要会网上的基本操作即可即可,适合绝大多数用户,十分方便快捷。综上可知,本课题在经济方面、技术方面、运行方面的条件都是满足的,所以本系统的设计和开发具备都具有可行性。

    3.2 系统需求分析

    3.2.1 功能需求分析
    在满足用户需求的基础上,家政服务管理系统网站通过对市场需求的分析,从而确定系统的功能目标。接着进行系统功能模型与数据库的设计与规划,最后根据各模块功能进行测试进而实现整体结构的设计,最终完成家政服务管理系统网站的最终毕业设计相关文件的编制。本系统分为消费者、家政人员和管理员三种权限的用户。具体功能描述如下。
    (1)用户注册与登录模块。该模块实现消费者及家政人员的注册和登录。
    (2)用户信息管理模块:该模块实现消费者与家政信息修改功能。
    (3)订单管理模块:消费者预约家政服务并发布订单后,家政人员可以申请该订单,当消费者同意家政人员请求后,家政人员完成此订单。
    (4)用户评价模块:当订单完成后消费者可以对订单进行评价
    (5)商家留言模块:用户对商家进行留言
    (6)管理员模块:管理员可以实现所有用户账号权限修改及对消费者、家政人员、商家信息进行认证管理
    3.2.2 系统性能分析
    (1)安全性:当用户进行登录时密码设置上限为20位,并且会有验证码校验登录信息,再加上后台数据库的备份功能,保障了系统的安全性。
    (2)可扩展性:家政管理系统的开发功能仍需不断改进才能带给用户更好的体验,这就要求程序具备相应的可扩展性。
    (3)敏捷性:本次家政系统采用Mysql数据库进行开发,提高了处理数据速度,可以让用户可以在极短的时间内得到操作反馈。
    (4)易用性:系统操作简单,适用于大多年龄段的人群,即使是没有什么上网经验的新手也能够快速上手,有良好的交互功能。消费者可通过浏览家政服务界面,对自己需要的服务进行预约交易。

    3.3 系统流程设计

    3.3.1 用户登录模块

    系统开发完成之后会给消费者及家政人员提供注册与登录入口,在这个界面用户输入的信息会得到验证,通过验证之后才能进去家政服务管理系统及后台管理人员的访问主界面,系统登录执行流程如图3-1所示。
    在这里插入图片描述
    3.3.2 信息修改模块
    系统用户添加信息时,系统会自动编号。如果添加信息为消费者信息则将其信息添加到后台数据库的customer表中,家政人员信息变更在housekeeper表中,后台管理员信息输入则信息存储在admin表。系统会对输入的数据进行判断是否合法,合法则可以写入。否则用户无法修改当前数据,流程图如图3-2所示。
    在这里插入图片描述
    图3-2 数据增加流程图

    3.3.3 信息删除流程
    当系统用户发起删除信息时,后台数据库根据所存储的数据相关信息进行校验规则对该数据进行删除,当用户发起删除信息的流程时,后台的数据库按照存储数据的相关信息,进行校验,该数据符合删除的原则后,再进行删除否则不删除数据。这样以来就无需后台数据库对其对应的数据相关信息进行维护,而且也无需应用系统访问进行数据删除校验从而提高对删除的数据的维护。当信息删除时只能通过管理员在后台数据库从新添加数据信息,否则无法恢复。数据删除流程图如下图3-3所示。
    在这里插入图片描述
    图3-3 数据删除流程图
    4 系统设计与实现
    4.1 系统主要功能
    本系统采用自上往下的开发方式。了解客户的基本需求后,主要功能可以定位如下:本课题要求设计出一套家政服务管理系统,系统可以分为两部分:前台界面和后台管理界面。前台界面由消费者以及家政人员使用,消费者功能包括登录、预约自己的家政服务订单、管理自己的家政服务订单、审核家政服务订单的申请以及确认订单等功能模块,家政人员包括登录、查看所有消费者发布的家政服务订单、申请服务订单、管理自己申请家政服务订单和用户评价等模块;后台管理界面由系统管理员操作,维护系统安全,管理员主要实现了家政管理系统中所有用户管理和认证管理等功能。系统功能模块结构图如图4-1所示。
    在这里插入图片描述
    图4-1 系统整体功能结构图

    。。。。。。。。。。。。
    。。。。。。。。。。。。。
    。。。。。。。。。。。。。
    全部论文内容点击:下载连接

    展开全文
  • 这个学生信息管理系统是基于mvc模式,使用Ajax和servlet等技术实现的Java web程序,数据库使用的MySQL。因为做的时间不长,必然存在一些bug,希望大家见谅!有兴趣的朋友可以下载下来看看!谢谢!
  • 本文章要实现的功能如下: ... ... 4.主页搜索栏输入要搜索...一、要实现这些功能所需要的接口及实现类 BookDao: boolean add(Book book); boolean delete(String name); boolean update(Book book); Book SearchByName
  • 本文主要讲述图书管理系统设计,附带完成源码,可以作为毕业设计,课程设计,使用:Java+Jsp+Servlet+mysql等技术 图书管理:根据图书编号、图书名称查询图书基本信息,添加、修改、删除图书。 图书分类管理:根据...
  • 学校宿舍作为高校管理的组成部分,现如今还有部分高校,通过纸质的方式登记学生进出宿舍的情况,这不仅工作效率低下,而且使得的管理上也极其反映当时的情况,尤其在查询数据时,相当的繁琐,偶尔可能存在表单...
  • IDEA+Java+JSP+Mysql+Tomcat实现Web图书管理系统

    万次阅读 多人点赞 2020-06-01 21:54:18
    实现图书管理系统 Operating System:Windows10 IDEA:2018.2 Java:1.8 Mysql:8.0.13 一、系统介绍 该图书管理系统实现了用户注册与登录功能,实现了实现了图书列表展示,购物车简单的功能。后台表只有三张,一张...
  • 2 相关技术介绍及系统环境开发条件 5 2.1相关技术介绍 5 2.2系统环境开发条件 6 3 系统的需求分析与设计 7 3.1可行性分析 7 3.2需求分析 7 3.2.1系统总体概述 8 3.2.2功能性需求 8 3.2.3非功能性需求 9 3.2.4流程图...
  • 目录 前言 Login页面 Index页面 个人中心部分 基本资料 ​ 重置密码 文章管理 文章类别 文章列表​ 发布文章 前言 花了几天事件依葫芦画瓢,写了一个后台管理系统,大概长下面这张图这样。用到的技术有html5,css3,...
  • 1.2 系统实现的内容和目标 4 1.3 开发工具的选择及相关技术介绍 4 1.3.1相关技术介绍 4 1.3.2系统环境开发工具 5 2 系统的需求总体分析 6 2.1可行性分析 9 2.2需求分析 10 2.2.1功能性需求 10 2.2.3流程图设计 11 ...
  • 学生成绩管理系统

    千次阅读 2021-06-23 00:53:32
    1.项目简介 学生成绩管理系统基于Javaweb来完成. ** ***2.编译工具及环境 ** 2.1Ecilpse ...本系统利用Java Web技术实现了学生信息管理系统,具有简单的学生信息管理功能。 实现了以下功能模块: 院系信息管理
  • 本教程从系统架构模式、技术选型、使用人群分析、功能分析、数据库设计、运行环境搭建、功能演示等几个方面详细说明了基于SSM框架的宿舍(寝室)管理系统的设计与实现。适合作为计算机类毕业设计、课程设计、Java...
  • 大二JavaWeb课程设计————图书管理系统(适合新手) 好兄弟们给个机会看一看吧,啊sir们 这是一个图书管理系统,由于老师不让用任何框架,所以用原生的JavaWeb写的,所有的前后端代码都是自己写的,很适合刚入门...
  • 本项目本着避免重复造轮子的原则,建立一套快速开发JavaWEB项目(springboot-mini),能满足大部分后台管理系统基础开发功能,使得开发人员直接可从业务模块开始,减少大量的重复开发工作。前端框架使用 layui-mini...
  • 功能测试: 1.链接测试: ...用户给信息系统管理员提交信息时,要测试提交操作的完整性,以校验提交给服务器的信息的正确性 3.Cookies测试: Cookies通常用来存储用户信息和用户在某应用系统
  • web管理系统则是对公司、会议室、员工、状态的CRUD操作,做到直观的表格展示。 技术框架 小程序后端接口:PHP+MySql+Linux+Nginx+CI框架,开发工具vs、phpstorm、postman、navicat web端管理系统:Java+Springboot+...
  • 基于WEB信息管理系统测试时应考虑的因素有哪些? 功能测试:链接测试(1.测试所有连接是否按指示的那样确实连接到了该连接的页面,2.测试所连接的也面是否存在,3.保证WEB应用系统上没有孤立的页面....
  • 学校教务管理系统的设计与实现 摘 要 学校教务管理信息化是提高办公效率的主要途径,随着我国高等教育的快速发展,学校办学规模的不断扩大,在校学生人数不断增多,办学层次出现多元化,由一地办学发展到多地多点...
  • Java Web项目常用的第三方接口

    千次阅读 2017-11-09 11:36:03
    感谢作者 ...1. Web Service接口 ...1.1 接口方式说明和优点 ...在笔者的开发生涯中,当作为接口提供商给第三方提供接口时,以及作为客户端去调用第三方提供的接口时,大部分时候都是使用Web Service接口,We
  • 欢迎添加微信互相交流学习哦! ... 摘 要 由于科技的发展,信息量的剧烈膨胀,企业要想适应信息社会...根据J2EE 架构的多层应用程序方案和超市管理信息系统的特点,系统采用以Web 为中心的应用程序方案。该系统可以提
  • 后台管理系统开发 功能模块:用户登录、权限管理(用户管理、菜单管理、角色管理) 技术应用:SSM框架+Mysql5.7+jsp+前端layui和EasyUI框架 项目工具:Maven+tomcat9.0+jdk1.8+GIT 开发工具:IDEA 测试环境:window7+...
  • Java Web系统常用的第三方接口

    千次阅读 2017-10-11 09:58:14
    Java Web系统常用的第三方接口 2016-05-16 22:09 9288人阅读 评论(1) 收藏 举报  分类: web安全(11)  目录(?)[+] 1. Web Service 接口 1.1 接口方式说明和优点 在...
  • BIM开发会用到哪些技术

    千次阅读 2019-08-29 13:33:15
    1. 编程语言 ...除了可以进行高效的桌面程序开发,C#还被多数应用软件和开发平台作为首选开发语言进行支持,如Autodesk公司的Autocad,Revit二次开发接口,open design Alliance的teigha.NET,t...
  • Vue+Element UI 商城后台管理系统

    千次阅读 热门讨论 2021-02-01 17:39:04
    Vue+Element UI商城后台管理系统 一、前言 1. 项目背景 此项目来自B站 Vue实战项目:电商管理系统(Element-UI)。 此项目的功能与后端提供的接口并不完全相同,根据后端接口进行开发并添加了部分功能从而进行修改。...
  • 提到Api接口,一般想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过WebAPI用起来更简单,更轻量级,更流行。构建一个优秀的API依赖于伟大的框架,今天我们的主角当然是微软的跨平台轻...
  • 【GO+Gin+Vue】实践-权限管理系统

    千次阅读 2021-11-12 17:31:21
    基于go-gin + vue开发的简单权限管理系统 1. 基本介绍 之前一直做Java开发,Go语言语法看过两三次,但是没动手写点东西总觉得不对劲,于是有了这个项目,当是练练手。 1.1 基本功能 这个系统主要实现的是一个简单...
  • 《数据库系统原理》课程设计:超市订单管理系统

    万次阅读 多人点赞 2020-06-11 17:02:27
    《数据库原理》课程设计:超市订单管理系统 《数据库原理》课程设计任务书 一、数据库原理课程设计的任务 1)通过本课程设计的训练,使学生掌握数据库技术的实际应用以及数据库信息管理系统的设计方法与开发过程;...
  • 随着互联网的快速发展,人们生活节奏日益加快,关于过度消费是大多数人头疼问题,导致出现不少的月光族,如我们定期花点时间去记录生活中的主要消费记录,掌握自己的收入和支出情况,这样你就发现一些规律,收入...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,235
精华内容 49,694
关键字:

web用户管理系统会用到哪些接口