JavaWeb企业级开发---用户登录认证

记录在听黑马课的时候的笔记以及课堂上练习的代码,文章图源于我在听课的时候所截的屏,所以有些不清晰,请见谅。下面是课程链接,可点击自行跳转。

【黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)】


基础登录功能

基础登录实现:

//LoginController.java package com.jianglin.controller; import com.jianglin.pojo.Emp; import com.jianglin.pojo.Result; import com.jianglin.service.EmpService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class LoginController { @Autowired private EmpService empService; @PostMapping("/login") public Result login(@RequestBody Emp emp) { log.info("登录员工信息{}",emp); Emp e = empService.login(emp); return e!=null?Result.success():Result.error("用户名或密码错误"); } } //EmpService.java package com.jianglin.service; import com.jianglin.pojo.Emp; import com.jianglin.pojo.PageBean; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; import java.util.List; public interface EmpService { PageBean page(Integer page, Integer pageSize,String name, Short gender,LocalDate begin,LocalDate end); void delete(List<Integer> ids); /** * 新增员工 * */ void save(Emp emp); /** * 根据id查询员工信息 * */ Emp getById(Integer id); /** * 修改员工信息 * */ void update(Emp emp); /** * 员工登录信息 * */ Emp login(Emp emp); } //EmpServiceImpl.java package com.jianglin.service.impl; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.jianglin.mapper.EmpMapper; import com.jianglin.pojo.Emp; import com.jianglin.pojo.PageBean; import com.jianglin.service.EmpService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @Service public class EmpServiceImpl implements EmpService { @Autowired private EmpMapper empMapper; // @Override // public PageBean page(Integer page, Integer pageSize) { // //获取所有记录数 // Integer count = empMapper.count(); // //获取当前的记录数据,存储到列表中 // Integer start = (page - 1) * pageSize; // List<Emp> list = empMapper.page(start,pageSize); // //封装到实体类里面 // PageBean pageBean = new PageBean(count,list); // return pageBean; // } @Override public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) { //使用pagehelper调用方法 PageHelper.startPage(page, pageSize); //获取查询列表,并进行转换 List<Emp> list = empMapper.list(name,gender,begin,end); Page<Emp> pagelist = (Page<Emp>) list; //封装到实体类里面 PageBean pageBean = new PageBean(pagelist.getTotal(),pagelist.getResult()); return pageBean; } /** * 删除员工 * */ @Override public void delete(List<Integer> ids) { empMapper.delete(ids); } /** * 新增员工 * */ @Override public void save(Emp emp) { emp.setCreateTime(LocalDateTime.now()); emp.setUpdateTime(LocalDateTime.now()); empMapper.insert(emp); } /** * 根据id查询员工信息 * */ @Override public Emp getById(Integer id) { Emp emp = empMapper.getById(id); return emp; } @Override public void update(Emp emp) { emp.setUpdateTime(LocalDateTime.now()); emp.setCreateTime(LocalDateTime.now()); empMapper.update(emp); } /** * 登录员工信息 * */ @Override public Emp login(Emp emp) { Emp e = empMapper.getByUsernameAndPassword(emp); return e; } } //EmpMapper.java package com.jianglin.mapper; import com.jianglin.pojo.Dept; import com.jianglin.pojo.Emp; import org.apache.ibatis.annotations.*; import java.time.LocalDate; import java.util.List; @Mapper public interface EmpMapper { /** * 删除员工信息 * */ void delete(@Param("ids") List<Integer> ids) ; /** * 实现分页查询 * 1、统计总数据量 * 2、实现分页设置 * */ // @Select("select count(*) from emp") // public Integer count(); // // @Select("select * from emp limit #{start},#{pageSize}") // public List<Emp> page(@Param("start") Integer start, @Param("pageSize") Integer pageSize); /** * 用pageHelper实现分页查询 * */ // @Select("select * from emp") // public List<Emp> list(); /** * 实现条件分页查询 * 实现动态SQL * */ public List<Emp> list(@Param("name")String name, @Param("gender")Short gender, @Param("begin")LocalDate begin, @Param("end")LocalDate end); /** * 新增员工信息 * */ @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " + "VALUES (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})") void insert(Emp emp); /** * 根据id查询员工信息 * */ @Select("select * from emp where id = #{id}") Emp getById(Integer id); /** * 修改员工信息 * */ void update(Emp emp); /** * 用户登录 * */ @Select("select * from emp where username=#{username} and password = #{password}") Emp getByUsernameAndPassword(Emp emp); }

登录校验

概述

会话技术--会话跟踪方案对比

Cookie和Session跟踪实现:

package com.jianglin.controller; import com.jianglin.pojo.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * HttpSession演示 */ @Slf4j @RestController public class SessionController { //设置Cookie @GetMapping("/c1") public Result cookie1(HttpServletResponse response){ response.addCookie(new Cookie("login_username","itheima")); //设置Cookie/响应Cookie return Result.success(); } //获取Cookie @GetMapping("/c2") public Result cookie2(HttpServletRequest request){ Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { if(cookie.getName().equals("login_username")){ System.out.println("login_username: "+cookie.getValue()); //输出name为login_username的cookie } } return Result.success(); } @GetMapping("/s1") public Result session1(HttpSession session){ log.info("HttpSession-s1: {}", session.hashCode()); session.setAttribute("loginUser", "tom"); //往session中存储数据 return Result.success(); } @GetMapping("/s2") public Result session2(HttpServletRequest request){ HttpSession session = request.getSession(); log.info("HttpSession-s2: {}", session.hashCode()); Object loginUser = session.getAttribute("loginUser"); //从session中获取数据 log.info("loginUser: {}", loginUser); return Result.success(loginUser); } }

JWT令牌

介绍

生成和校验

Jwt从0.11.0版本开始被分为jjwt-api,jjwt-impl,jjwt-jackson三个模块,所以要分别导入

JWT令牌生成和解析:

package com.jianglin; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.Date; import java.util.HashMap; import java.util.Map; //@SpringBootTest class TliasApplicationTests { @Test void contextLoads() { } /** * 创建JWT令牌 * */ @Test public void testGenJwt(){ Map<String, Object> claims = new HashMap<>(); claims.put("name", "tom"); claims.put("age", 18); String jwt = Jwts.builder() .signWith(SignatureAlgorithm.HS256, "jianglin")//签名算法 .setClaims(claims)//自定义内容(载荷) .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置令牌有效期为1小时 .compact(); System.out.println(jwt); } /** * 解析JWT令牌 * */ @Test public void testParseJwt(){ Claims claims = Jwts.parser() .setSigningKey("jianglin") .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiZXhwIjoxNzYyNTExMzE4LCJhZ2UiOjE4fQ.-FfTJV40IF_znd8O8aQV4jmJC8xBO165cYeMcXnd3T0") .getBody(); System.out.println(claims); } }

登录后下发令牌

登录时加入JWT令牌:

//JwtUtils.java package com.jianglin.utils; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.Map; public class JwtUtils { private static String signKey = "itheima"; private static Long expire = 43200000L; /** * 生成JWT令牌 * @param claims JWT第二部分负载 payload 中存储的内容 * @return */ public static String generateJwt(Map<String, Object> claims){ String jwt = Jwts.builder() .addClaims(claims) .signWith(SignatureAlgorithm.HS256, signKey) .setExpiration(new Date(System.currentTimeMillis() + expire)) .compact(); return jwt; } /** * 解析JWT令牌 * @param jwt JWT令牌 * @return JWT第二部分负载 payload 中存储的内容 */ public static Claims parseJWT(String jwt){ Claims claims = Jwts.parser() .setSigningKey(signKey) .parseClaimsJws(jwt) .getBody(); return claims; } } //LoginController.java package com.jianglin.controller; import com.jianglin.pojo.Emp; import com.jianglin.pojo.Result; import com.jianglin.service.EmpService; import com.jianglin.utils.JwtUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController @Slf4j public class LoginController { @Autowired private EmpService empService; @PostMapping("/login") public Result login(@RequestBody Emp emp) { log.info("登录员工信息{}",emp); Emp e = empService.login(emp); //如果用户登录成功,分配Jwt令牌,返回成功信息 if (e != null) { Map<String, Object> claims = new HashMap<>(); claims.put("id", e.getId()); claims.put("name", e.getName()); claims.put("username", e.getUsername()); String jwt = JwtUtils.generateJwt(claims); return Result.success(jwt); } //若登录失败,直接返回错误信息 return Result.error("用户名或密码错误"); } }

过滤器Filter

入门

filter快速入门,拦截所有:

//DemoFilter.java package com.jianglin.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(urlPatterns = "/*") public class DemoFilter implements Filter { @Override//初始化方法,只调用一次 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init 初始化方法执行了"); } @Override//拦截到请求之后调用,调用多次 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("拦截到了请求"); //放行 filterChain.doFilter(servletRequest, servletResponse); } @Override//销毁方法,只调用一次 public void destroy() { System.out.println("destroy 销毁化方法执行了"); } } //TliasApplication.java package com.jianglin; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @ServletComponentScan @SpringBootApplication public class TliasApplication { public static void main(String[] args) { SpringApplication.run(TliasApplication.class, args); } }

详解

登录校验Filter

登录校验过滤器:

//LoginCheckFilter.java package com.jianglin.filter; import cn.hutool.json.JSONUtil; import com.jianglin.pojo.Result; import com.jianglin.utils.JwtUtils; import lombok.extern.slf4j.Slf4j; import org.codehaus.jettison.json.JSONObject; import org.springframework.util.StringUtils; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebFilter(urlPatterns = "/*") @Slf4j public class LoginCheckFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; //1.获取请求url StringBuffer url = req.getRequestURL(); log.info("获取到的url为{}",url); //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行 if (url.toString().contains("login")) { log.info("执行登录操作。。。"); filterChain.doFilter(request, response); return; } //3.获取请求头中的令牌(token) String jwt = req.getHeader("token"); //4.判断令牌是否存在,如果不存在,返回错误结果(未登录) if (!StringUtils.hasLength(jwt)) { log.info("令牌不存在"); Result error = Result.error("NOT_LOGIN"); //手动转换 对象 用hutool包 String notLogin = JSONUtil.toJsonStr(error); resp.getWriter().write(notLogin); return; } //5.解析token,如果解析失败,返回错误结果(未登录) try { //解析判断是否正确 JwtUtils.parseJWT(jwt); }catch (Exception e) { e.printStackTrace(); log.info("解析令牌失败,返回未登录错误信息"); Result error = Result.error("NOT_LOGIN"); String notLogin = JSONUtil.toJsonStr(error); resp.getWriter().write(notLogin); return; } //6.放行 filterChain.doFilter(request, response); } } //hutool包依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.1</version> </dependency>

拦截器Interceptor

简介&快速入门

Interceptor快速入门:

//LoginCheckInterceptor.java package com.jianglin.interceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class LoginCheckInterceptor implements HandlerInterceptor { @Override//目标资源方法执行前执行,返回true:放行 返回false:不放行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."); return true; } @Override//目标资源方法执行后执行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle..."); } @Override//视图渲染完毕后执行,最后执行 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion..."); } } //LoginCheckConfig.java package com.jianglin.config; import com.jianglin.interceptor.LoginCheckInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class LoginCheckConfig implements WebMvcConfigurer { @Autowired private LoginCheckInterceptor loginCheckInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**"); } }

详解拦截路径以及执行流程

登录校验Interceptor

登录校验Interceptor实现:

package com.jianglin.interceptor; import cn.hutool.json.JSONUtil; import com.jianglin.pojo.Result; import com.jianglin.utils.JwtUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component @Slf4j public class LoginCheckInterceptor implements HandlerInterceptor { @Override//目标资源方法执行前执行,返回true:放行 返回false:不放行 public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception { //1.获取请求url StringBuffer url = req.getRequestURL(); log.info("获取到的url为{}",url); //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行 if (url.toString().contains("login")) { log.info("执行登录操作。。。"); return true; } //3.获取请求头中的令牌(token) String jwt = req.getHeader("token"); //4.判断令牌是否存在,如果不存在,返回错误结果(未登录) if (!StringUtils.hasLength(jwt)) { log.info("令牌不存在"); Result error = Result.error("NOT_LOGIN"); //手动转换 对象 用hutool包 String notLogin = JSONUtil.toJsonStr(error); resp.getWriter().write(notLogin); return false; } //5.解析token,如果解析失败,返回错误结果(未登录) try { //解析判断是否正确 JwtUtils.parseJWT(jwt); }catch (Exception e) { e.printStackTrace(); log.info("解析令牌失败,返回未登录错误信息"); Result error = Result.error("NOT_LOGIN"); String notLogin = JSONUtil.toJsonStr(error); resp.getWriter().write(notLogin); return false; } //6.放行 return true; } @Override//目标资源方法执行后执行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle..."); } @Override//视图渲染完毕后执行,最后执行 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion..."); } }

整体流程和过滤器一致,只是放行操作不同。

在运行时要将过滤器的注解给注释掉。

异常处理

异常处理实现:

package com.jianglin.exception; import com.jianglin.pojo.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class)//捕获所有异常 public Result ex(Exception ex) { ex.printStackTrace(); return Result.error("操作失败,请联系管理员"); } }


这篇文章就先更新到这里,接下来的内容可查看我的下一篇博客,感谢观看,希望对你有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1215221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

能否用自然语言控制音色?CosyVoice2-0.5B指令调优实战指南

能否用自然语言控制音色&#xff1f;CosyVoice2-0.5B指令调优实战指南 1. 为什么“用四川话说”真的能生效&#xff1f; 你有没有试过&#xff0c;在语音合成工具里输入一句“今天真热啊”&#xff0c;然后加个括号备注“请用东北口音”——结果系统完全无视&#xff1f;或者…

最值得推荐的5家跨境营销服务商

一、趋势与价值随着跨境电商竞争加剧&#xff0c;企业不再满足于依赖第三方平台获取流量&#xff0c;而是希望通过自建独立站、搭建营销中台来掌握自主流量和数据资产。独立站市场正在迅速增长&#xff0c;预计到2025年中国独立站规模将达5.5万亿元并占跨境电商B2C市场的41%–5…

死了么打卡一键报平安H5抖音快手微信小程序看广告流量主开源

"死了么"项目功能介绍 一、项目定位 "死了么"是一款专注于个人安全状态监控与紧急通知的H5应用&#xff0c;通过简单的"一键打卡"操作&#xff0c;让用户向家人传递平安信息。当用户超过设定阈值未打卡时&#xff0c;系统会自动向紧急联系人发送…

2026年缠膜机工厂精选:这些品牌值得一试!缠绕机/穿箭打包机/缠绕打包机/全自动打包机/自动打包机,缠膜机产品排名

随着工业4.0浪潮的推进,包装环节的智能化升级成为制造业降本增效的关键。缠膜机作为物流包装的核心设备,其技术迭代速度与场景适配能力直接影响企业的供应链效率。当前市场呈现两极分化:头部企业通过模块化设计、AI…

揭秘2025年办公隔断市场:口碑与实力兼具的厂家排行,百叶隔断/办公室隔断墙/雾化玻璃隔断/电动门/自由组合隔断办公隔断设计推荐排行

随着企业对办公空间灵活性、功能性与美学要求的不断提升,办公隔断市场正经历着一轮深刻的变革。从传统的固定隔墙到如今集隔音、防火、智能调光于一体的模块化系统,市场对供应商的综合服务能力提出了更高要求。本文基…

2026年主流安检门品牌盘点与选购建议,安检设备/安检仪/安检机/智能安检/金属探测门/安检门,安检门源头厂家怎么找

随着公共安全需求持续升级,安检门作为关键安防设备,已从机场、车站等传统场景延伸至医院、学校、工厂等多元化领域。据行业统计,2025年国内安检门市场规模突破45亿元,年复合增长率达12%,但市场集中度不足30%,品牌…

一次可连续走k步的bfs的处理方法

做在二维地图上移动的模拟题时,绝大多数情况都需要使用 \(bfs\),其中 \(99\%\) 的情况都是只走一步(也就是上下左右四个方向选一个,并移动一格)。那么如果每一次可以连续走 \(k\) 步,我们应当如何处理呢? M - N…

SCI论文,能引用中文参考文献吗?

很多写SCI论文的同学经常会遇到一个问题&#xff1a;自己写的英文论文&#xff0c;不仅涉及到外文文献&#xff0c;同时也涉及到中文论文&#xff0c;是否可以引用中文参考文献呢&#xff1f; 答案是可以的。 但是在引用过程中也要注意以下几点: 第一、确认投递期刊是否可以…

Spring 6.0基于JDB手写定制自己的ROM框架

ORM 用面向对象的方式操作关系型数据库 开发者操作的是 对象&#xff08;Object&#xff09; ORM 框架负责把对象 自动映射 为&#xff1a; SQL 表&#xff08;Table&#xff09; 行&#xff08;Row&#xff09; 列&#xff08;Column&#xff09; 目标&#xff1a; 减…

一个英语听力的神器——获取transcripts

一个英语听力的神器——获取transcripts

基于SpringBoot完成的垃圾分类管理系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2026年国内评价高的调节阀厂家哪家强,半球阀/截止阀/闸阀/不锈钢阀门/电动盲板阀/消声止回阀,调节阀生产厂家排行榜

行业背景:调节阀市场进入技术驱动与场景深耕阶段 随着工业自动化进程加速,调节阀作为流程工业的核心控制设备,其性能直接影响生产效率与安全性。当前市场呈现两大趋势:一是智能化需求激增,电动/气动调节阀需集成远…

机器学习系列

3Blue1Brown深度学习视频 笔记 3Blue1Brown-深度学习之人工神经网络 3Blue1Brown-深度学习之梯度下降法

全方位谈判兵法——从底层逻辑到高手实战的20堂必修课

这是一篇基于刘碧荣教授20讲谈判课程录音整理、重构与润色的深度文章。文章剔除了口语赘述&#xff0c;修正了部分听录错误&#xff0c;并对核心知识体系进行了逻辑化的章节重组。 刘碧荣教授亲授&#xff1a;全方位谈判兵法——从底层逻辑到高手实战的20堂必修课 前言&#x…

个人职场顶层设计

导语&#xff1a; 经营企业需要顶层设计&#xff0c;个人职场发展同样如此。所谓的“顶层设计”&#xff0c;核心逻辑就是从后往前看——先把未来的路想清楚&#xff0c;再一步一步往前走。你是稀里糊涂地混日子&#xff0c;还是有预谋、有策略地规划人生&#xff1f;这决定了你…

通过阅读实现认知跃迁

你好&#xff01;我是你的内容策划专家。我已经对这份《高效阅读 - 成为一年阅读100本书的学习超人》的课程录音稿进行了深度整理和重构。 以下是为您提炼的专业文章&#xff0c;旨在保留大狗熊&#xff08;讲师&#xff09;的核心洞见&#xff0c;同时剔除冗余信息&#xff0…

人性皆有裂痕:理解人格的 52 堂心理学课

引言&#xff1a; “万物皆有裂痕&#xff0c;那是光照进来的地方。” 我们每个人身上都有一些特殊的行为模式和思维模式&#xff0c;也许你不喜欢&#xff0c;但那都是岁月的痕迹。了解自己&#xff0c;对于职业发展、两性关系和子女教育都大有裨益。心理学不仅是研究病症的科…

心理边界完全指南:如何在快节奏世界中找到高效与舒适

这是一篇基于《心理边界21讲》课程录音整理的精华文章。我已对原始内容进行了去粗取精、逻辑重组和专业润色&#xff0c;旨在为您呈现一套系统化的心理边界建立指南。 心理边界完全指南&#xff1a;如何在快节奏世界中找到高效与舒适 作者&#xff1a; 胡胜之 整理&#xff1a…

【计算机毕业设计案例】基于springboot的餐饮医院图书馆通用预约系统的设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

金华无尘车间改造优选,2026年洁净空间新体验,净化车间/净化工程/无尘室/无尘车间/恒温恒湿车间,无尘车间标准哪家好

在精密制造、生物医药、半导体等高技术领域,无尘车间是保障产品良率、提升工艺稳定性的核心基础设施。其洁净度、温湿度控制精度及环境稳定性直接影响企业生产效能与市场竞争力。本文聚焦金华地区万级无尘车间改造市场…