当前位置: 首页 > news >正文

Boss项目:部门新增+部门编辑+部门删除+登录拦截(鉴权)

Boss项目:部门新增+部门编辑+部门删除+登录拦截(鉴权)(2.4)

一、部门新增:

①DepartmentController:

	@PostMapping("/saveOrUpdate")@ResponseBody   public Result saveOrUpdate(@RequestBody Department department){try {if(StringUtils.isEmpty(department.getId())){departmentService.save(department);}else {//departmentService.update(department);}} catch (Exception e) {e.printStackTrace();return Result.fail(e.getMessage());}return Result.success();}

定义新增或编辑方法,传入department对象,如果对象id为空则为新增;否则就为编辑。

②DepartmentService:

​ ↓

DepartmentServiceImpl:

@Overridepublic void save(Department department) {int m = departmentMapper.insert(department);if(m<=0){throw new RuntimeException("保存部门失败");}}

departmentMapper对象调用新增方法,返回受影响行数m,若m<0,则抛出异常。

③DepartmentMapper:

@Insert("insert into department (name,sn) values (#{name},#{sn})")@Options(useGeneratedKeys = true,keyColumn = "id",keyProperty = "id")int insert(Department department);

useGeneratedKeys = true:开启使用数据库自动生成的主键功能

keyProperty = "id":Java 端的主键映射,将数据库生成的自增主键值,赋值给Java 实体类中的哪个属性

keyColumn = "id":数据库端的主键映射,数据库表中自增主键的列名

二、部门编辑:

 <!-- 使用data-*绑定自定义数据--><a href="#"class="btn btn-info btn-xs btn-input"data-json='${(department.json)!}' ><span class="glyphicon glyphicon-pencil"></span> 编辑</a>

data-json='${(department.json)!}' :department中应该有一个json的属性,而.指这个属性的get方法。我们应该把id,name,sn都传到json里。因为数据库中没有叫json的字段,json根本就不存在,json是一个动态字段,也叫逻辑字段。

①pom.xml:

加入依赖:

 <!-- fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency>

②Department:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Department {private Long id;private String name;private String sn;public String getJson() {//json 逻辑数据Map<String, Object> map = new HashMap<>();map.put("id", id);map.put("name", name);map.put("sn", sn);String jsonString = JSON.toJSONString(map);//Map转JSON类型,需引入依赖return jsonString;}
}

③DepartmentController:

	@PostMapping("/saveOrUpdate")@ResponseBodypublic Result saveOrUpdate(@RequestBody Department department){try {if(StringUtils.isEmpty(department.getId())){departmentService.save(department);}else {departmentService.update(department);}} catch (Exception e) {e.printStackTrace();return Result.fail(e.getMessage());}return Result.success();}

④DepartmentService:

​ ↓

DepartmentServiceImpl:

   @Overridepublic void update(Department department) {int m = departmentMapper.update(department);if(m<=0){throw new RuntimeException("部门修改失败");}}

⑤DepartmentMapper:

 @Update("update department set name=#{name},sn=#{sn} where id=#{id}")int update(Department department);

三、部门删除:

			//删除按钮$(".btn-delete").click(function () {//获取当前点击的部门idlet id = $(this).data('id');//提示确认框$.messager.confirm("警告","是否确认删除?",function () {//发送ajax请求//$.get('/department/delete.do',{id:id},handlerMessage)let data={id:id}axios.get("/department/delete",{  //指定url地址  传递承诺书params: data}) .then(handlerMessage)})})

①DepartmentController:

@GetMapping("/delete")@ResponseBodypublic Result delete(Long id){try {departmentService.delete(id);} catch (Exception e) {e.printStackTrace();return Result.fail(e.getMessage());}return Result.success();}

②DepartmentService:

DepartmentServiceImpl:

  @Overridepublic void delete(Long id) {int m = departmentMapper.delete(id);if(m<=0){throw new RuntimeException("部门删除失败");}}

③DepartmentMapper:

 @Delete("delete from department where id=#{id}")int delete(Long id);

四、登录拦截(鉴权):

image-20260204190022912

①application.yml(配置文件):

server:port: 8000spring:application:name: Boosdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/crm?serverTimezone=GMT%2B8&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: 1234freemarker:expose-session-attributes: truesuffix: .ftlmain:allow-circular-references: true //允许循环引用

②annotation.RequireLogin(注解):

@Target({ElementType.METHOD}) // 限定注解只能贴在方法上
@Retention(RetentionPolicy.RUNTIME) // 运行期保留,反射才能获取
@Documented // 生成文档时保留注解信息
public @interface RequireLogin {boolean required() default true;
}

标记型注解,本身不执行任何逻辑,仅用来告诉拦截器:这个方法需要做登录校验

③interceptor.WebHandlerInterceptor(拦截器):

public class WebHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1. 非Controller的动态方法(如静态资源、跨域预检请求)直接放行if(!(handler instanceof HandlerMethod)){return true;}// 2. 处理Controller中的动态方法,强转为处理器方法对象HandlerMethod handlerMethod = (HandlerMethod) handler;// 通过反射获取目标方法上的@RequireLogin注解:如果方法没贴注解,返回nullRequireLogin requireLogin = handlerMethod.getMethodAnnotation(RequireLogin.class);// 3. 方法无登录注解 或 注解指定无需登录,直接放行if(StringUtils.isEmpty(requireLogin) || !requireLogin.required()){return true;}// 4. 方法需要登录,从session中获取当前登录用户Employee user = (Employee) request.getSession().getAttribute("user");// 5. 未获取到用户(未登录),返回json格式的登录提示,拦截请求if(StringUtils.isEmpty(user)){// 设置响应内容类型和编码,防止中文乱码response.setContentType("text/html;charset=utf-8");// 构造失败响应结果Result result = Result.fail("请先登录");// 将结果转为json字符串写入响应流response.getWriter().write(JSON.toJSONString(result));response.getWriter().flush();response.getWriter().close();// 拦截请求,不继续执行后续业务return false;}// 6. 已登录,放行请求执行Controller方法return true;}
}

登录校验的执行者,实现了 SpringMVC 的HandlerInterceptor接口,重写preHandle方法,完成请求到达Controller层前的前置校验。

preHandle方法:true--->放行 false--->拦截

④config.WebConfiguration(配置类):

@Configuration
public class WebConfiguration implements WebMvcConfigurer {// 注入拦截器Bean:从Spring容器中获取WebHandlerInterceptor的实例@Autowiredprivate WebHandlerInterceptor webHandlerInterceptor;/*** 注册拦截器Bean到Spring容器*/@Beanpublic WebHandlerInterceptor webHandlerInterceptor(){return new WebHandlerInterceptor();}/*** 配置拦截器的拦截/放行规则*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(webHandlerInterceptor).addPathPatterns("/**") // 拦截所有请求//.excludePathPatterns("/loginUser","logout",...); // 放行无需登录的接口(如登录、退出);}
}

⑤贴注解:

DepartmentController下的:

listGet+listPost+saveOrUpdate+delete 方法上加@RequireLogin

http://www.jsqmd.com/news/342725/

相关文章:

  • 2026 主流 AI 论文生成工具排行榜(按综合推荐指数)
  • 2026年纯碱厂家最新推荐:阻垢剂纯碱厂家/食品级厂家/60-160目工业级纯碱/印染助剂纯碱厂家/工业级氨水厂家/选择指南 - 优质品牌商家
  • 物种分布曲线的五个矩
  • datagrip升级后破解密码--以后也用不到
  • 数据立方体在智慧城市建设中的关键作用
  • 【RAG技术】- RAG系统调优手段之知识库处理(纯干货,建议收藏!!!)
  • 【PMP】风险管理
  • 【PMP】项目生命周期与组织变革
  • PostgreSQL 16 容器主从流复制
  • 前缀和算法:从一道 LeetCode 题看区间求和优化思想
  • Elasticsearch:使用 Elastic Workflows 构建自动化
  • PPP与PPPoE协议介绍
  • Jina Rerankers 为 Elastic 推理服务(EIS)带来了快速、多语言的重排序能力
  • 低功耗蓝牙怎样音频协商音频能力?PACS(Published Audio Capabilities Service)来助力!!
  • 五种并行处理策略对比调研
  • ceph平台-未及时移除故障osd导致根目录100%问题的故障记录
  • 2026年白酒厂家权威推荐榜:白酒贴牌定制厂家、纯粮白酒厂家推荐、纯粮食白酒厂家、贴牌白酒生产厂家、酱香白酒厂家批发选择指南 - 优质品牌商家
  • 缓存特工队:深入浏览器内部的秘密仓库
  • JAVA安全基础-CC3链
  • 基于Spring Boot的企业网盘的设计与实现(开题报告)
  • AI漫剧怎么赚钱:教你用AI漫剧创作系统制作自己的动漫短剧使用云微AI短剧创作系统
  • 【Azure 环境】获取Azure上资源的创建时间createdTime信息(ARM REST API版本)
  • MySQL 导入资料详细说明
  • 米尔顿·弗里德曼《实证经济学方法论》解读
  • 汉字才是终极“外挂”!碾压英文的千年智慧,在AI时代彻底封神
  • Airlink 协议库:实现设备无缝互联的通信基石
  • 从单模态到多模态:AI原生审核技术的融合创新
  • 大规模语言模型在科学实验设计优化中的应用
  • 法尔斯新闻社1398年波斯语新闻数据集_29万条_多领域分类_完整文本内容_自然语言处理_文本挖掘_机器学习训练数据
  • 大语言模型部署难题破解:三大优化方向全解析,程序员必藏干货