wuiyeji> 个人简介: js同学你好
💖年龄: 20 大二在读
📃专业: 计算机科学技术
💪爱好: 单曲循环 写写文章
🎯相关内容: 课设级别商城项目续篇(收货地址添加和管理+登录页记住我功能
🎉完结撒花: 马上更新个人博客系统。。。。敬请期待
-----------------------------------------------------------------------------------------
最近也是因为疫情的原因在宿舍里上网课,本来堂客也不怎么听现在好了直接上网课那效率就更低了,闲来没事也不想把时间荒废掉就想着将之前做的商城管理系统的项目在总结梳理一下。愿疫情早日结束,恢复大地原有的气息。
好了废话不多说让我们开始项目的分析:
淘宝官方案例展示:
在确认订单界面可以进行地址选择,地址分为默认地址和普通地址,其中地址可以进行修改,删除,还可以使用新增地址.
在新增收获地址的界面需填写地址信息,详细地址 邮政编码 收货人姓名 手机号码,是否设为默认地址
大家想一下我们的填写的地址信息需要保存在数据表(这里我们暂且叫t_address)中,而t_addredd表中有数以万计的数据,所以我们因该怎么将这些地址信息定位到某个具体的用户,好办,我们只需要在在表的字段中加一个uid(用户的id)即可区分。另外我们还得添加上四个基础字段(修改者和修改时间)所以还得再添加上用户名字段。而地址信息我们可以通过省市区的编码来填写对应的字段,还有一个关键点,为了区分是否为默认地址我们还得需要添加一个是否为默认地址的字段,类似于性别中的我们可以用 0,1表示。
经过诸位的聪明才智和本王子的努力终于将数据库表建立了出来
有了数据库表那么实体类写起来也就轻松多了,我们先来做一个增加地址的功能,大家再来想一想这个增加数据怎么写,是不是我们得再mapper接口中写一个addAddress()接口这个接口对应着mapper.xml文件中得insert方法然后写sql语句然后再一层层的向上传递,service层,Controller层然后前端界面传递参数。。。真的就这么简易吗,我们再来想一下我们是不是应该控制一下他的地址数量不能一直增加啊对此我们考虑到这么做。
可是又会有聪明的朋友说了,为什么不直接再if语句中将maxCount值设置为固定的数量。这样想好像也对但是老板可能心情不好今天让你改为5明天让你改为10你还的打开源代码,一点一点的去找然后再去修改麻烦啊。。配置文件多好直接就可以改了。
控制数量ok了那我们是不是应该再想一下设置默认收货地址的逻辑应该怎么去写呐。。我们是不是可以这样做,如果之前用户没有填写过地址信息那我们是不是可以直接将这个地址设置为默认地址。然后之后加进来的数据将他们的默认地址设为0这样好像行的通。
然后重要的提醒别忘记添加几个异常处理,比如插入异常,数量超多限制异常,这些类应该继承的是运行时异常RuntimeException这些应该在异常基类中统一捕获。
Controller层就不介绍了一般就是设置一个请求地址,接收前端传入的参数然后返回json格式的响应参数。。
前端也比较简单因为可以表单提交可以异步Ajax操作。获取省市区的列表:
现在我们假设有一个功能需求
我们建立一张表这张表中有省市区的编码和名称及其父级区的编码我们通过父级编码即可找到父级区域名称
假设我们的建立的表是t_district所以聪明的我们很容易就将查询语句写出来
select * from t_dict_district where parent=? order by code ASC;
这里Mapper 接口和Service十分容易书写 有一个注意点是Controller层向前端传递的省市列表的方法的自身的参数和前端传递的参数
因为查出来的数据一个集合所以我们用list集合作为类型, 前端传过来的参数可以用省市区的code值来获取这样的话我们就得编写一个根据code的值来查询对应名称的sql。这个也比较简单就不介绍了。前端处理
我们先做一个选择区域然后选择内容通过后端获取在通过js将内容append进去
defaultOption变量定义提示信息。ready()方法会在页面内容加载完毕之后执行,showProVinceList()方法是从后端获取到省市区的数据。
为了可以使后端及时收到前端的数据我们可以添加一个方法当选择框的内容变化之后也就是选择了一个区域之后便立即执行下一个区域的获取。
这里我们用一个chang()方法触发change事件,或规定当发生change事件时运行的函数。
到此为止我们的获取省市区列表的功能算是全部写完了,但也只是一个将表单内容补充完整的功能。收货地址列表展示:
我们添加了很多地址我们得需要将我们的地址显示出来,这个功能我个人认为前端比前端的处理逻辑多一点,我们先来写后端接口:
//我们写一个sql查出该用户下的所有地址并且按照默认地址进行排序
select * from t_address where uid=? order by is_default desc, created_time desc;
接口我就不写了:给大家展示一下前端数据处理逻辑吧,因为我是用ajax做的所以数据渲染用的是循环遍历结构
eq(0)选择的是第一个元素,hide()一个隐藏函数也就是将提示设置为默认地址结构隐藏,
ok到目前为止我们的地址信息处理结束了。设为默认地址:
我们先来想一下业务的实现逻辑,首先我们点击设为默认地址的按钮之后会将参数传递到一个方法中,在这个方法中执行ajax异步操作前端就传递了一个参数逻辑较为简单就不写了,我们来说一下业务层的处理逻辑,首先我们得编写一个sql语句用来执行更新操作。
update t_address set is_default=1, modified_user=?, modified_time=? where aid=?
但是大家想一下我们只是把当前的这一记录的is_default设为了1但是别忘了数据库中还有一条is_default=1的记录但是我们不知道并不知道他的id是哪一个所以我们的需要进行整体查询或者整体设置,这里我们写一个整体设置的sql语句update t_address set is_default=0 where uid=?
然后再执行更新操作将其设置为默认地址。另外还有一个小细节就是假如说你的数据库中已经没有了这一条数据但是前端页面中还存着是不是我们就不应该将它进行修改而是爆出一条异常给前端提示。。update t_address set is_default=0 where uid=?
实现思想写完了我们再来写业务。
用户id和username已经存在了session中所以直接从session中获取即可。。
按照我们的处理逻辑很容易就将业务代码实现出来。。
信息展示或者是修改的业务逻辑和代码十分容易编写这里我就不给大家展示了。删除收获地址:
有人觉得删除业务十分好写但是虽然好写里面却有几个比较容易让人出粗的点,举个例子如果删除时你删除的内容恰好是默认地址,那我们是不是应该自动的将其中一个设置为默认地址。那这里的话为了简单我就直接将最新添加的地址设置为默认地址了。
这里我们需要写一个delete和select的sql语句
delete from t_address where aid=?
select * from t_address where uid=? order by modified_time desc limit 0,1
这里的业务层的实现思想简单的介绍一下:我们应该首先去搜索当前的aid返回这条记录的全部信息,之后我们应该判断这条记录的is_default=1是true或者false如果不是1那就不用任何操作了直接执行删除操作,但是如果删除的是一个默认地址记录我们应该搜索剩余的时间最短的一个将他的is_default值设置为1之后就OK。。别忘了可能当你删除完当前记录时数据库中可能没有记录了,这时我们直接返回就好了。。
ok那么到目前为止我们的地址业务也就全部结束了。。记住我功能及其注销
本来想用一些安全框架shiro做记住我的功能但是这个项目比较校我就不写的这么麻烦了
说一下实现逻辑:选中框的选中为true选不中为false但是当我们不选中时向后端传递时传递的是一个空值这一点我们应该注意一下,login()方法中增加两个参数
我们来看一下效果
再前端的cookie中可以查看到账号和密码。
而注销功能就更为简单了,我们只需要设计一个接口待用户点击之后将session域中当前的用户信息清空即可。
if (session.getAttribute("uid")!=null){
session.removeAttribute("uid");
session.removeAttribute("username");
}else {
throw new UserNotFoundException("您还没有登录");
}
码了一上午有点小累。。休息一下马上更新个人博客系统
🎉欢迎关注🔍点赞👍收藏🎇留言📙