基于mybatis、bootstarp、的maven新人练手学生管理studentManage项目
分析:如果能注册并且登录,那每个人都是管理员,任何人都可以对数据恶意操作,这样数据极其不安全。为了数据的安全考虑,
要么创建学生注册页面,但是主页面只能显示本人信息,不能对其他人进行操作,再创建管理员界面进行数据的crud操作。也不知道想法对不对,
本人将用户登录界面和学生信息活动界面单独抽出来,单独创建用户表和学生信息活动表。
在学生信息活动表中添加creatBy和editBy属性记录当前是哪个用户对数据进行了操作(比如增加、修改),如果有恶意操作,在业务层可对其加以权限控制,
比如ip限制
String allowIps = user.getAllowIps();
if(!allowIps.contains(ip)){
throw new LoginException(“ip地址失效”);
}
账号加锁
String lockState = user.getLockState();
if(“0”.equals(lockState)){
throw new LoginException(“账号已锁定”);
}
但业务要求必须有注册页面,当然只能注册学生信息,不能注册管理员。
但是在没有登录系统之前注册学生信息也只是一个添加操作,并不能进入管理系统。
登录注册界面
点击注册
经过10天的努力,studentManage项目雏形基本完成,本项使用的技术有Ajax、jackSon、模板模式、uuid、Git、后端框架:myBatis、前端框架有bootstrap 、jQuery、、、底层数据库使用MySql。。
项目结构
工具类
为什么使用动态代理类
如果不加动态代理,在业务层处理逻辑时与数据库交互的代码或者是业务执行的流程肯定是一起成功、要么一起失败,在传统业务层处理事务不是很方便,第一个不方便,就是mvc已经分工明确,n那么我们在后台写业务层时应该只关心业务逻辑本身,不应该关注与业务逻辑本身之外的内容,比如说事务操作。第二个不方便,事务本身属于一种与数据库相关的机制,业务层又掺杂了与数据库相关的机制。第三个不方便,开发原则中的单一原则,控制器就是用来接收并处理用户请求的,业务层就是用来处理业务逻辑的,dao层就是与数据库交互的。每一层都应该单一且分工明确,业务层要掺杂事务相关代码将变得不单一,不方便管理。所以我们应该吧事务相关的代码抽取出来,形成一个代理类,将来我们所用的业务层都需要代理。都需要事务,我们不可能针对于每一个业务层的实现类去专门创建一个代理类,代码量庞大,所以我们应该使用动态代理类,为我们动态的生成代理类对象帮我们处理事务
验证登录流程图
到这里登录验证操作完成,登录成功,跳转到系统欢迎页面
css有网上随便找的。显示用户名相当简单:在我们的用户登录的控制层加入
request.getSession().setAttribute(“user”,user);
将当前用户信息保存在session域中,存储于服务器端,相当于用户的私人保险柜,相对于
Cookie只能存储String类型数据更加实用。Session作用于服务器运行期间,不加设置的话关闭浏览器之后默认30分钟后被销毁。当然前端取数据时使用EL表达式
${user.name}同学欢迎你!
相当方便。 接下来就是数据的crud了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201103133700949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc3NTgwMQ==,size_16,color_FFFFFF,t_70#pic_center)所有样式来源于bootstart框架提供好的,包括分页插件、日历控件的使用
查询的话当然可以模糊查询,语句:
select
a.id,
a.name,
u.name as owner,
a.gender,
a.grade,
a.stunum,
a.startDate,
a.endDate
from tbl_activity a
join tbl_user u
on a.owner=u.id
<where>
<if test="name!=null and name!=''">
a.name like '%' #{name} '%'
</if>
<if test="owner!=null and owner!=''">
and u.name like '%' #{owner} '%'
</if>
<if test="gender!=null and gender!=''">
and a.gender = #{gender}
</if>
<if test="grade!=null and grade!=''">
and a.grade = #{grade}
</if>
<if test="stunum!=null and stunum!=''">
and a.stunum = #{stunum}
</if>
<if test="startDate!=null and startDate!=''">
and a.startDate > #{startDate}
</if>
<if test="endDate!=null and endDate!=''">
and a.endDate < #{endDate}
</if>
</where>
order by a.createTime desc
limit #{skipCount},#{pageSize}
效果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201103133714635.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc3NTgwMQ==,size_16,color_FFFFFF,t_70#pic_center)
添加、修改和删除一样使用模态窗口Ajax局部刷新完成
比如添加
复选框的全选和取消全选
//将全选的复选框的√干掉
$(“#qx”).prop(“checked”, false);
点击学生姓名可进入详细信息页
当然还有备注的crud…
总结和笔记(不会的学习,会的复习)
添加修改删除用post 其他用get 若果有密码用post
永远永远在业务层提交事务
为什么使用接口类型返回对象:多态(一个抽象类的事物有多种形态)
json格式最大的用途是 便于浏览器javascript的解析(给浏览器返回对象浏览器不认识需要json解析)
实际项目开发中,如果要为前端同时提供多组值,那么我们应该使用map还是vo呢?
如果前端的需求的重复率不高,那么我们选择临时使用map就可以了
如果前端对于该需求的重复率较高,那么我们可以创建一个vo类来使用, 非常方便
过滤器可以对servlet批量操作
/ /通知拦载的请求对象,使用UTF-8字符集对当前请求体信息进行一次重新编辑
servLetRequest. setCharacterEncoding(“utf-8”);//增强 (令牌机制判断session会话作用域对象也可以进行相关的基本拦截,但是需要在每个servlet里面进行判断,增加开发难度,且无法对静态资源文件进行拦截)
js的引入需要有顺序
当我们把html改为jsp后,就证明我们给他结合了base标签,当base标签加入之后,相对路径集体失效,那么对于前端资源的引用必须是绝对路,绝对路径必须从webapp开始往下顺
拦截之后为什么要是用重定(/项目名/…)向儿不用转发
拦截之后我们需要给用户一个全新的资源地址request.getContextPath() + 资源文件位置
对于创建模态窗口的操作不能写死在元素中应该用js写活,比如要在窗口弹出之前alert(123)将不能实现,需要将data-toggle和data-targe删掉改为id=“”;
(
.
c
l
a
s
s
)
;
(.class);
(.class);(“#id”) 一个class引入多想样式用空格分隔。
$(“#id”)[下标] 转为dom对象
/* 动态生成的元素,我们要以on方法的形式来触发事件
语法:
$(需要绑定元素的有效的外层元素).on(绑定事件的方式,需要绑定的元素的jquery对象,回调函数)
遇到的问题:查询结果的分页操作,当添加查询条件时,不点击查询按钮,然后点击下一页就会根据当前搜索框中的内容分页。我们要的是在不点击查询按钮的情况下,点击下一页,显示的是上一次点击查询按钮的结果。
就觉办法:
将我们查询后的数据保存在隐藏域中
在查询时将隐藏域中的结果取出来,重新赋予到搜索框中
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲search-name").v….trim($(“#hidden-name”).val()));
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲search-owner").….trim($(“#hidden-owner”).val()));
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲search-gender")….trim($(“#hidden-gender”).val()));
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲search-grade").….trim($(“#hidden-grade”).val()));
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲search-stunum")….trim($(“#hidden-stunum”).val()));
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲search-startDat….trim($(“#hidden-startDate”).val()));
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲search-endDate"….trim($(“#hidden-endDate”).val()));
项目已上传到git(仅供个人学习使用)
https://github.com/98feng/studentManage
到这里项目要求基本完成,不对的地方还望老师指正。后期不定期补充,比如数据字典、备注的crud。。。。。。。。。