项目学习《第二天》
今天上午决定先分析每个包下面的类的作用及类中的方法的作用。(主要是这个代码的注释太少了!!
controller
UserController
DashboardController
DeliveryController
ItemCategoryController
ItemController
OrderController
ReItemController
ShippingController
StockManage
controller层分析结束
欠缺的知识:分页显示、导出excel还有一些功能实现的细节
决定删除及修改的:上传图片的功能先删除吧,以及统一一下类名
aspect
WebLogAspect
只学了log4j记录日志,自己写的时候看看可不可以改成用log4j记录日志
通过使用AOP的方式计算并打印各种方法的耗时日志,有利于后续的代码优化
filter
SQLInjectionFilterSevlet
这里是作者提到的一个优化,没明白,到时候再进一步研究
通过拦截器实现反SQL注入,防止用户输入SQL敏感字符串
mapper
配置版mabatis我感觉很麻烦,我会换成注解版的。
缓存和工具等用到了再拿出来分析
接下来先把实体类写了以及配置文件。
配置文件application.yml
spring:
#database
datasource:
url: jdbc:mysql://127.0.0.1:3306/sjx?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
#thymeleaf
thymeleaf:
prefix: classpath:/templates/
mode: HTML5
encoding: UTF-8
content-type: text/html
cache: false #开发时关闭缓存,不然没法看到实时页面
suffix: .html
#http
http:
multipart:
max-file-size: 10Mb
max-request-size: 100Mb
#mail
mail:
host: smtp.exmail.qq.com
username: [email protected]
password: test
from: [email protected]
#druid
druid:
url: jdbc:mysql://127.0.0.1:3306/sjx?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
#redis
redis:
host: 127.0.0.1
port: 6379
timeout: 10
pollMaxTotal: 1000
pollMaxIdle: 500
poolMaxWait: 500
#mybatis 先配置出来 到时候看用不用
#mybatis:
# config-location: classpath:/mybatis-config.xml
# mapper-locations: classpath:/mapper/*Mapper.xml
model
public class BaseObject {
private int start;
private int end;
private int pageCurrent;
private int pageSize;
private int pageCount;
private String orderBy;
/*用户实例 tb_user 暂时不明白为什么要继承BaseObject*/
@Data
public class User extends BaseObject{
private int id;
private String userName;
private String password;
private String realName;
private String business;
private String email;
private String headPicture;
private Date addDate;
private Date updateDate;
private int state;
/*tb_delivery*/
@Data
public class Delivery {
private int id;
private String delivery_name;
private String delivery_code;
private String delivery_sort;
private String expressNo;//
/*tb_category*/
@Data
public class ItemCategory extends BaseObject{
private int id; //类目ID
private int parentId; //父类目ID=0时,代表的是一级的类目
private String name; //分类名称
private int status; //状态。可选值:1(正常),2(删除)
private int sortOrder; //排列序号
private int isParent; //该类目是否为父类目,1为true,0为false
private Date created;
private Date update;
private String createdStr; //
private String updatedStr; //
/*tb_item*/
@Data
public class Item extends BaseObject {
private int id;
private String title;
private String sellPoint; //商品卖点
private int price;
private int num; //库存数量
private String barcode; //商品条形码
private String image;
private int cid; //所属类目,叶子类目
private int status; //状态 1-正常,2-下架,3-删除
private Date created;
private Date updated;
private String createdStr; //
private String updatedStr; //
private String categoryName; //
private Integer minPrice; //
private Integer maxPrice; //
private Integer minNum; //
private Integer maxNum; //
/*tb_order*/
@Data
public class Order extends BaseObject{
private String orderId; //订单id
private String payment; //实付金额
private int paymentType; //支付类型,1、在线支付,2、货到付款
private String postFee; //邮费
private int status; //状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭
private Date createTime; //订单创建时间
private Date updateTime; //订单更新时间
private Date paymentTime; //付款时间
private Date consignTime; //发货时间
private Date endTime; //交易完成时间
private Date closeTime; //交易关闭时间
private String shippingName; //物流名称
private String shippingCode; //物流单号
private Long userId; //用户id
private String buyerMessage; //买家留言
private String buyerNick; //买家昵称
private Integer buyerRate; //买家是否已经评价
private Integer refundStatus; //退货状态
private String refundReason; //退货原因
private int isRefund; //是否退货
private String itemId; //商品id
private String itemTitle; //标题
private Long totalFee; //总价
private int num; //库存数量
private String refundStatusStr; //
private Date minOrderTime; //
private Date maxOrderTime; //
private String statusStr; //
private String minOrderTimeStr; //
private String maxOrderTimeStr; //
private String paymentTypeStr; //
private String buyerRateStr; //
private String dateStr1; //
private String dateStr2; //
private String dateStr3; //
private String dateStr4; //
private String dateStr5; //
/*tb_order_item*/
@Data
public class OrderItem extends BaseObject{
private String id;
private String itemId; //商品id
private String orderId; //订单id
private int num; //商品购买数量
private String title; //商品标题
private Long price; //商品单价
private Long totalFee; //商品总金额
private String picPath; //商品图片地址
}
/*tb_order_shipping*/
@Data
public class OrderShipping extends BaseObject{
private String orderId; //订单ID
private String receiverName; //收货人全名
private String receiverPhone; //固定电话
private String receiverMoblie; //移动电话
private String receiverState; //省份
private String receiverCity; //城市
private String receiverDistrict; //区/县
private String receiverAddress; //收货地址
private String receiverZip; //邮政编码
private Date created;
private Date updated;
}
/*tb_re_item*/
@Data
public class ReItem extends BaseObject {
private int id; //商品id,同时也是商品编号
private String title; //商品标题
private String sellPoint; //商品卖点
private int price; //商品价格
private int num; //库存数量
private String barcode; //商品条形码
private String image; //商品图片
private int cid; //所属类目,叶子类目
private int status; //商品状态,1-正常,2-下架,3-删除
private Date recovered; //回收时间
private String recoveredStr; //
}
@Data
public class Month {
private int Jan;
private int Feb;
private int Mar;
private int Apr;
private int May;
private int Jun;
private int Jul;
private int Aug;
private int Sep;
private int Oct;
private int Nov;
private int Dec;
@Data
public class Express {
private int id;
private String time;
private String context;
private String location;
/*统计类*/
@Data
public class Stats {
private long mIncome; //月收入
private String incomePer; //月收入环比
private int mOrderNum; //月订单数
private String orderNumper; //月订单数环比
private int mOrderRefund; //月退单
private String mOrderRefundper; //月退单环比
private int pv; //访问量
以上写完了配置文件以及实体类。
接下来把login页面功能看懂自己写一遍。
首先是登录功能:
mapper接口存放sql语句
/*user表SQL语句*/
@Mapper
@Repository
public interface UserMapper {
@Select("select * from tb_user where userName=#{userName} and password=#{password} and state=1")
User selectByNameAndPwd(User user);
@Insert("insert into tb_user(id,userName,password,realName,business,email,headPicture,addDate,updateDate,state) values (null,#{userName},#{password},null,null,#{email},null,#{addDate},#{updateDate},1)")
int insert(User user);
@Update("update tb_user set password=#{password},email=#{email},realName=#{realName},business=#{business},updateDate=#{updateDate} where userName=#{userName}")
int update(User user);
@Select("select 1 from tb_user where userName=#{userName}")
int selectIsName(User user);
@Select("select password from tb_user where userName=#{userName} and email=#{email}")
String selectPwdByName(User user);
}
UserService接口存放user业务操作
/*user业务操作*/
public interface UserService {
User selectByNameAndPwd(User user);
int insert(User user);
int update(User user);
int selectIsName(User user);
String selectPwdByName(User user);
}
UserServiceImpl类实现user表接口具体业务逻辑
/*user表接口具体业务逻辑*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
/*查询用户密码*/
@Override
public User selectByNameAndPwd(User user) {
return userMapper.selectByNameAndPwd(user);
}
/*添加用户*/
@Override
public int insert(User user) {
return userMapper.insert(user);
}
/*更新用户*/
@Override
public int update(User user) {
return userMapper.update(user);
}
/*通过用户名查询*/
@Override
public int selectIsName(User user) {
return userMapper.selectIsName(user);
}
/*通过用户名和邮箱查询密码*/
@Override
public String selectPwdByName(User user) {
return userMapper.selectPwdByName(user);
}
}
**UserController类
登录功能实现
/*用户管理*/
@Controller
public class UserController {
@Autowired
UserService userService;
@Autowired
HttpSession httpSession;
/*跳转登录界面*/
@GetMapping("user/login")
public String loginGet(Model model){
return "login";
}
/*验证登录*/
@PostMapping("user/login")
public String loginPost(User user, Model model){
User user1 = userService.selectByNameAndPwd(user);
if(user1 != null){
httpSession.setAttribute("user",user1);
User name = (User) httpSession.getAttribute("user");
return "redirect:dashboard";
}else {
model.addAttribute("error","账号或密码错误");
return "login";
}
}
}
看完源代码然后自己写的,写完之后当然有问题修改再写,最后再在空白文档手敲一遍主要功能
login.html
<body class="gray-bg">
<div class="middle-box text-center loginscreen animated fadeInDown">
<div>
<div>
<h2 class="logo-name">YX</h2>
</div>
<h3>欢迎进入后台管理系统</h3>
<!--<p>Login in. To see it in action.</p>-->
<form class="m-t" role="form" action="login" method="post">
<div class="form-group">
<input type="text" class="form-control" placeholder="输入账号" name="userName" required="" />
</div>
<div class="form-group">
<input type="password" class="form-control" placeholder="输入密码" name="password" required="" />
</div>
<button type="submit" class="btn btn-primary block full-width m-b">登 录</button>
<a th:href="@{forget}" href="#"><small>忘记密码 ?</small></a>
<!--<a th:href="@{register}" href="#"><small>没有账号 ?</small></a>-->
<p class="text-muted text-center">
<small>没有账号 ?</small>
</p>
<a class="btn btn-sm btn-white btn-block" th:href="@{register}" href="register.html">注 册</a>
</form>
</div>
</div>
<script th:inline="javascript">
var error = [[${error}]];
$(document).ready(function () {
if(error!=null){
swal({
title : "温馨提示",
text : error
});
}
});
</script>
</body>
页面展示
注册功能实现
/*跳转注册页面*/
@GetMapping("user/register")
public String registerGet(Model model){
return "register";
}
/*注册*/
@PostMapping("user/register")
public String registerPost(User user, Model model){
System.out.println("用户名:" + user.getUserName());
try{
userService.selectIsName(user);
model.addAttribute("error", "该用户已存在");
}catch (Exception e){
Date date = new Date();
user.setAddDate(date);
user.setUpdateDate(date);
userService.insert(user);
System.out.println("注册成功");
model.addAttribute("error", "注册成功");
return "login";
}
return "register";
}
完成解决一些问题然后再写的,一遍ok。
<body class="gray-bg">
<div class="middle-box text-center loginscreen animated fadeInDown">
<div>
<div>
<h2 class="logo-name">YX</h2>
</div>
<h3>欢迎注册</h3>
<!--<p>Create account to see it in action.</p>-->
<form class="m-t" role="form" action="register.html" th:action="@{register}" method="post">
<div class="form-group">
<input type="text" class="form-control" placeholder="userName" name="userName" required=""/>
</div>
<div class="form-group">
<input type="password" class="form-control" placeholder="password" name="password" required=""/>
</div>
<div class="form-group">
<input type="email" class="form-control" placeholder="email" name="email" required=""/>
</div>
<div class="form-group">
<div class="checkbox i-checks"><label> <input type="checkbox"/><i></i> 记住账号密码 </label></div>
</div>
<button type="submit" class="btn btn-primary block full-width m-b">注 册</button>
<p class="text-muted text-center"><small>已经注册 ?</small></p>
<a class="btn btn-sm btn-white btn-block" th:href="@{login}" href="login.html">登 录</a>
</form>
</div>
</div>
<script th:src="@{/js/jquery-2.1.1.js}"></script>
<script th:src="@{/js/bootstrap.min.js}"></script>
<script src="js/plugins/iCheck/icheck.min.js"></script>
<script th:src="@{/js/plugins/sweetalert/sweetalert.min.js}"></script>
<script th:inline="javascript">
var error = [[${error}]];
$(document).ready(function () {
if(error!=null){
swal({
title : "温馨提示",
text : error
});
}
$('.i-checks').iCheck({
checkboxClass: 'icheckbox_square-green',
radioClass: 'iradio_square-green',
});
});
</script>
</body>
页面展示
注册功能遇到两个问题注册功能遇到两个问题
1.跳转注册页面跳转不过来
一开始作者没写后面的th:action,login界面也没写,其实我比较好奇怎么跳转成功的。这个页面就跳转不成功,于是我加了后面的th:action,解决。
2.insert查询语句一直报错!!这个语句太长了!!写的时候一定要注意检查啊!!!我前后看的眼睛都要瞎了,陆续发现少了括号、单词拼错、少写列名等等问题……以至于花的时间有点久,以后一点多加注意!!
今天的学习就到这里啦!现在是十一点,第一天的是昨晚忘记发表了,所以今天早上发表的。今天依旧收获满满啦明天要再努力呀~