项目结构

image

前期的准备工作

common---parent---admin

1.删除parent项目中的src(含有启动类)的文件,删除common项目中的启动类;
2.将与新拓展子项目admin有关的资源进行加载,具体步骤如下:
在src--main---resource目录下分别创建static、templates/modules两个文件夹,并将需要的资源分别粘贴到对应的文件夹;
3.在admin项目的src目录下创建一个类PageController,用来处理客户端所有页面请求;
4.在common项目下的src目录下创建exception、pojo、web包,各种包的具体作用如下:
*1.exception包 用来填写一些自定义异常,具体代码如下:


public class ServiceException extends RuntimeException{
快捷键 Alt+Insert+constructor 添加所有异常属性
}


*2.pojo包下创建一个PageObject类,借助此对象在业务逻辑层封装分页信息(可以理解为业务层pojo对象),格式代码如下:


@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageObject<T> implements Serializable {//当泛型定义在类或接口名的右侧时这种泛型叫类泛型
private static final long serialVersionUID = -8770600233998974797L;
/*总记录数/
private Integer rowCount;
/*当前页记录/
private List<T> records;//new PageObject<SysUser>(),new PageObject<SysRole>()
/*总页数/
private Integer pageCount;
/每页最多显示多少条记录/
private Integer pageSize;
/*记录当前页的页码值/
private Integer pageCurrent;
public PageObject(Integer rowCount, List<T> records, Integer pageSize, Integer pageCurrent) {
this.rowCount = rowCount;
this.records = records;
this.pageSize = pageSize;
this.pageCurrent = pageCurrent;
this.pageCount=rowCount/pageSize;
if(rowCount%pageSize!=0)this.pageCount++;
}}
*
注意:
在java所有封装数据对象,尽量都是实现Serializable接口,目的是方便对对象进行序列化和反序列化

  • 1)序列化:将对象装换为字节
  • 2)反序列化:将字节转换为对象
  • 序列化的应用场景?
  • 1)将对象转换为字节以后缓存到内存
  • 2)将内存中的对象存储到文件
  • 3)将对象转换为字节在网络中进行加密传输
  • 序列化对象设计规范?
  • 1)实现序列化接口Serializable
  • 2)添加序列化ID
  • .(序列化的安全、序列化的力度,自行拓展了解)................................
  • */
  • 序列化相关设置及操作如图:
  • imageimage

*3.pojo包下创建一个JsonResult类,借助此对象封装控制层响应到客户端的数据(且希望将来返回的数据是一个Jason格式的字符串,做响应标准的设计),格式代码如下:
*package com.cy.pj.common.pojo;
import lombok.Setter;
import java.io.Serializable;
/*借助此对象封装控制层响应到客户端的数据/
@Data //@Setter
public class JsonResult implements Serializable {
private static final long serialVersionUID = -8722122492343039602L;
/*响应状态码/
private Integer state=1;//1 表示ok,0表示error
/*响应状态码对应的具体信息/
private String message="ok";
/*响应数据(一般是查询时获取到的正确数据)/
private Object data;
public JsonResult(){}
public JsonResult(String message){
this.message=message;
}
public JsonResult(Object data){
this.data=data;
}
public JsonResult(Throwable e){
this.state=0;
this.message=e.getMessage();
}
public Integer getState() {
return state;
}
public String getMessage() {
return message;
}
public Object getData() {
return data;
}}
*4.在web包下创建一个GlobalExceptionHandler类(全局异常处理类),模板代码如下:
package com.cy.pj.common.web;
import com.cy.pj.common.pojo.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j//此注解用于将异常信息记录到日志文件,slf4j只是一个日志标准,并不是日志系统的具体实现,作用:1.提供日志接口2.提供获取具体日志对象的方法
@RestControllerAdvice//==@ControllerAdvice+@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public JsonResult doHandleRuntimeException(RuntimeException e){
e.printStackTrace();//输出到控制台
log.error("e.message {}",e.getMessage());
return new JsonResult(e);
} //...............
}

image

代码编写的时序图(从右向左编程)

菜单模块“查询”的设计思路及步骤:

思路:1.先创建数据层接口-->2.创建对应方法的映射文件-->3.创建业务层接口及数据层接口的实现类-->4.控制层没有实现接口,直接创建一个类(has a Service属性),再提供对应的(增删改查)方法即可-->5.借助PageController类中的方法处理页面请求;-->6.点击“菜单管理”按钮之后需要呈现一些菜单信息,需要对“菜单管理”按钮进行事件注册,在html文件中编写注册事件的前端代码(了解);

1.定义一个接口方法,用于查询所有菜单以及菜单对应的上级菜单名称,代码如下:
package com.cy.pj.sys.dao;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**

  • 系统菜单数据层对象*/

@Mapper
public interface SysMenuDao {
/*查询所有菜单以及菜单对应的上级菜单名称/
List<Map<String,Object>> findObjects();
}

2.定义好查询方法之后再创建映射文件及编写查询的sql语句方法:
1)其中映射文件的头文件部分可以查阅mybatis官网的映射文件,复制粘贴过来;
2)定义mapper标签:
<mapper namespace="com.cy.pj.sys.dao.SysMenuDao">

</mapper>
3)在<mapper>...</mapper>内部编写查询的SQL语句如下:
<!--查询所有菜单以及上级菜单信息的-->
<select id="findObjects" resultType="map">//id 指的是上面接口中定义的方法,resultType是返回的结果集方法;

<!--方案1:通过左外连接实现

select c.*,p.name parentName from sys_menus c left join sys_menus p on c.parentId=p.id -->
<!--方案2:通过嵌套实现-->
select c.*,(select name

from sys_menus p
where c.parentId=p.id) parentName
from sys_menus c

</select>

3.创建业务层接口及数据层接口的实现类
1)创建业务层接口及提供方法:
package com.cy.pj.sys.service;
import java.util.List;
import java.util.Map;
public interface SysMenuService {
List<Map<String,Object>> findObjects();
}
2)创建数据层接口的实现类:
package com.cy.pj.sys.service.impl;
import com.cy.pj.sys.dao.SysMenuDao;
import com.cy.pj.sys.service.SysMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class SysMenuServiceImpl implements SysMenuService {
@Autowired
private SysMenuDao sysMenuDao;
@Override
public List<Map<String, Object>> findObjects() {
return sysMenuDao.findObjects();
}}

4.控制层引用业务层方法并基于此方法提供其对应方法(增删改查)的映射路径:
package com.cy.pj.sys.controller;
import com.cy.pj.common.pojo.JsonResult;
import com.cy.pj.sys.service.SysMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/menu/")
public class SysMenuController {
@Autowired
private SysMenuService sysMenuService;
@RequestMapping("doFindObjects")
public JsonResult doFindObjects(){
return new JsonResult(sysMenuService.findObjects());
}}

5.借助PageController类中的方法处理页面请求(所有页面请求都可以在此类对象中操作)
package com.cy.pj.sys.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/*借助PageController处理客户端所有页面请求/
@RequestMapping("/")
@Controller
public class PageController {
@RequestMapping("/{module}/${modulUI}")//传入括号内的内容要注意通用性
public String doModuleUI(@PathVariable String moduleUI){
return "sys/"+moduleUI;
}}

### 菜单模块“添加”的相关代码实现步骤:
思路:1.在html文件中找到“添加”按钮,进行注册click(点击)事件的代码编写(前端内容,了解),可参考src--main--resources--templates.modules--sys--menu_list文件进行编写;-->2.针对于“上级菜单”是树状结构,所以需要在数据层SysMenuDao接口中提供一个查询树状菜单的方法,查询所有菜单中的ID,name,parentId字段的值,然后每行记录封装为一个Node对象,这样的对象可以适配类似zTree结构的数据呈现,因为今后在项目中创建其他子系统(如商品goods子系统)只要涉及到树结构的查询需求都需要使用Node对象,所以可以在common项目中的src--main-java--pojo文件下创建Node类并提供get/set方法,所有pojo都允许被序列化,所以要implements Serializable ;-->3.点击“添加”--点击“上级菜单”后,按F12查看报错提示,并按照提示在控制层添加所需方法;

1.在html文件中找到“添加”按钮,进行注册click(点击)事件的代码编写(前端内容,了解),可参考src--main--resources--templates.modules--sys--menu_list文件进行编写;

2.针对于“上级菜单”是树状结构,所以需要在数据层SysMenuDao接口中提供一个查询树状菜单的方法及Node对象等代码如下:
1) package com.cy.pj.sys.dao;
import com.cy.pj.common.pojo.Node;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
/**

  • 系统菜单数据层对象*/

@Mapper
public interface SysMenuDao {
/**

  • 查询所有菜单中的ID,name,parentId字段的值,然后每行记录封装为一个Node对象,
  • 这样的对象可以适配类似zTree结构的数据呈现.
  • @return */ @Select("select id,name,parentId from sys_menus")

List<Node> findZtreeMenuNodes();
}

2) Node对象代码:
package com.cy.pj.common.pojo;
import lombok.Data;
import java.io.Serializable;
@Data
public class Node implements Serializable {
private static final long serialVersionUID = -7437395435719036861L;
private Integer id;
private String name;
private Integer parentId;
}
3)将封装的Node对象引入到第1)步中;
4)将数据层SysMenuDao接口中的“List<Node> findZtreeMenuNodes();”添加到业务层接口SysMenuService中,同时在SysMenuService实现类SysMenuServiceIml中补充此方法,代码如下:
业务层
package com.cy.pj.sys.service;
import com.cy.pj.common.pojo.Node;
import java.util.List;
import java.util.Map;
public interface SysMenuService {
List<Node> findZtreeMenuNodes();
List<Map<String,Object>> findObjects();
}

业务层实现类
package com.cy.pj.sys.service.impl;
import com.cy.pj.common.pojo.Node;
import com.cy.pj.sys.dao.SysMenuDao;
import com.cy.pj.sys.service.SysMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class SysMenuServiceImpl implements SysMenuService {
@Autowired
private SysMenuDao sysMenuDao;
@Override
public List<Node> findZtreeMenuNodes() {
return sysMenuDao.findZtreeMenuNodes();
}
}

3.在控制层代码实现:
image
package com.cy.pj.sys.controller;
import com.cy.pj.common.pojo.JsonResult;
import com.cy.pj.sys.service.SysMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/menu/")
public class SysMenuController {
@Autowired
private SysMenuService sysMenuService;
@RequestMapping("doFindZtreeMenuNodes")
public JsonResult doFindZtreeMenuNodes(){
return new JsonResult(sysMenuService.findZtreeMenuNodes());
}
}


qintian
4 声望0 粉丝

陌生人,当你看到这里说明你可能遇到难题了!或许有想要放弃、松懈的时候,但你要相信在某一领域潜心深耕,等熬过无人问津的日子,精彩终究会不期而至!最终再说一句:每一个奋斗路上的陌生人,不在于你做了多少“...