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

个人网站备案费用百度手机app

个人网站备案费用,百度手机app,郑州网站建设专家,网站建设调研问卷SpringMVC主要是controller、service、dao(mapper)层交互 controller:处理数据请求的接口 service:处理请求的数据 dao(mapper):对数据进行持久化 下面我将对controller和service.impl进行讲…

SpringMVC主要是controller、service、dao(mapper)层交互

controller:处理数据请求的接口

service:处理请求的数据

dao(mapper):对数据进行持久化

下面我将对controller和service.impl进行讲解

1.controller层 (代码讲解):

对于需要返回的数据:比如登录、获取用户信息等操作都是直接返回数据的

对于不需要返回数据:比如进行注册、注销、修改密码等操作,这些只需要知道是否执行成功即可,不需要返回的数据,需要对其结果进行布尔值判断,如果成功则返回Result.ok,失败则返回Result.fail的结果。

你会发现我使用的是@RequiredArgsConstructor,而不是@Autowired,其实两种方式可以提供依赖注入,但是我个人习惯于使用@RequiredArgsConstructor的方式进行依赖注入。

@RequiredArgsConstructor通过构造函数为不可变字段提供依赖注入,适用于需要final字段的情况。@Autowired则提供更灵活的注入方式,可以用于字段、构造函数或方法,不需要字段是final。

具体详细的过程如下所示:

@Tag(name = "用户接口管理")
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {private final IUserService userService;@Operation(summary = "用户密码验证登录")@PostMapping("/login")public Result<String> login(@RequestBody UserLoginForm userLoginForm){return Result.ok(userService.login(userLoginForm));}@Operation(summary = "用户短信验证登录")@PostMapping("/loginBySms")public Result<String> loginBySms(@RequestBody UserLoginSmsForm userLoginSmsForm){return Result.ok(userService.loginBySms(userLoginSmsForm));}@Operation(summary = "用户注册")@PostMapping("/register")public Result<Void> register(@RequestBody UserRegisterForm userRegisterForm){if(userService.register(userRegisterForm)){return  Result.fail();}return Result.ok();}@Operation(summary = "用户修改密码")@PutMapping("/modifyPassword")public Result<Void> modifyPassword(@RequestBody UserModifyPasswordForm userModifyPasswordForm){if(!userService.modifyPassword(userModifyPasswordForm)){return Result.fail();}return Result.ok();}@Operation(summary = "用户注销")@DeleteMapping("/logout")public Result<Void> logout(){if(!userService.logout()){return Result.fail();}return Result.ok();}@Operation(summary = "获取用户信息")@GetMapping("/info")public Result<UserInfoVo> info(){return Result.ok(userService.info());}}

2.service层:

service层一般的写法是先写service的接口类,再写对应的实现类进行实现,如下所示:

service接口:

public interface IUserService extends IService<User> {String login(UserLoginForm userLoginForm);String loginBySms(UserLoginSmsForm userLoginSmsForm);boolean register(UserRegisterForm userRegisterForm);UserInfoVo info();boolean modifyPassword(UserModifyPasswordForm userModifyPasswordForm);boolean logout();
}

service接口实现类(service.impl)中的代码:

观察下面的代码:

对于不正确的数据,我会选择抛出自定义异常BusinessRuntimeException进行处理,

对于需要返回布尔类型直接对返回的结果行rows==1进行判断即可,

对于注销用户操作,不要直接删除数据中的数据,需要进行逻辑删除,而不是直接真正的删除数据库中的数据

对于用户的密码相关操作,因为这里的密码是用MD5进行加密的,所以对于密码的校验操作需要考虑MD5的转换

对于用户登录操作,需要返回token值,这样便于操作请求时进行校验操作

@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {private final UserMapper userMapper;private final RedisTemplate<String,Object> redisTemplate;@Overridepublic String login(UserLoginForm userLoginForm) {User user = selectUserByName(userLoginForm.getUsername());//用户不存在if(user == null){throw new BusinessRuntimeException(ResultCodeEnum.ACCOUNT_ERROR);}//密码不正确if(!user.getPassword().equals(MD5.encrypt(userLoginForm.getPassword()))){throw new BusinessRuntimeException(ResultCodeEnum.PASSWORD_ERROR);}//账号已经被注销了if(user.getIsDelete()==1){throw new BusinessRuntimeException(ResultCodeEnum.ACCOUNT_STOP);}Map<String,Object> claims = new HashMap<>();claims.put("id",user.getId());claims.put("username",user.getUsername());claims.put("profile",user.getProfile());//生成tokenString token = JwtUtils.generateJwt(claims);redisTemplate.opsForValue().set(RedisConstant.USER_CHECK_TOKEN,token,2, TimeUnit.HOURS);return token;}public User selectUserByName(String username){return userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getUsername,username));}@Overridepublic String loginBySms(UserLoginSmsForm userLoginSmsForm) {User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getUsername,userLoginSmsForm.getPhone()));//用户不存在if(user == null){throw new BusinessRuntimeException(ResultCodeEnum.ACCOUNT_ERROR);}//账号已经被注销了if(user.getIsDelete()==1){throw new BusinessRuntimeException(ResultCodeEnum.ACCOUNT_STOP);}//未输入验证码if(StringUtils.isEmpty(userLoginSmsForm.getVerifyCode())){throw new BusinessRuntimeException(ResultCodeEnum.VALIDATECODE_EMPTY);}String verifyCode = (String) redisTemplate.opsForValue().get(RedisConstant.USER_LOGIN_SMS_CODE);//验证码过期或未发送验证码if(StringUtils.isEmpty(verifyCode)){throw new BusinessRuntimeException(ResultCodeEnum.VALIDATECODE_EXPIRED);}//验证码错误if(!verifyCode.equals(userLoginSmsForm.getVerifyCode())){throw new BusinessRuntimeException(ResultCodeEnum.VALIDATECODE_ERROR);}Map<String,Object> claims = new HashMap<>();claims.put("id",user.getId());claims.put("username",user.getUsername());claims.put("profile",user.getProfile());//生成tokenString token = JwtUtils.generateJwt(claims);redisTemplate.opsForValue().set(RedisConstant.USER_CHECK_TOKEN,token,2, TimeUnit.HOURS);return token;}@Overridepublic boolean register(UserRegisterForm userRegisterForm) {String username = userRegisterForm.getUsername();String password = userRegisterForm.getPassword();//输入的密码为空if(StringUtils.isEmpty(password) || StringUtils.isEmpty(userRegisterForm.getPasswordAgain())){throw new BusinessRuntimeException(ResultCodeEnum.PASSWORD_ERROR);}//两次输入的密码不一致if(!password.equals(userRegisterForm.getPasswordAgain())){throw new BusinessRuntimeException(ResultCodeEnum.PASSWORD_ERROR);}//注册的用户名不存在if(selectUserByName(username) == null){User user = new User();user.setGender(0);user.setRole(0);user.setUsername(username);user.setPassword(MD5.encrypt(password));user.setIsDelete(0);user.setCreateTime(new Date());user.setUpdateTime(new Date());int rows = userMapper.insert(user);return rows == 1;}return false;}@Overridepublic UserInfoVo info() {Long userId = UserHolder.getUserId();User user = userMapper.selectById(userId);return BeanUtil.copyProperties(user, UserInfoVo.class);}@Overridepublic boolean modifyPassword(UserModifyPasswordForm userModifyPasswordForm) {Long userId = UserHolder.getUserId();User user = userMapper.selectById(userId);String password = userModifyPasswordForm.getPassword();String newPassword = userModifyPasswordForm.getNewPassword();//校验密码if(!user.getPassword().equals(MD5.encrypt(password))){throw new BusinessRuntimeException(ResultCodeEnum.PASSWORD_ERROR);}user.setPassword(MD5.encrypt(newPassword));int rows = userMapper.updateById(user);return rows == 1;}@Overridepublic boolean logout() {Long userId = UserHolder.getUserId();User user = userMapper.selectById(userId);//设置逻辑删除状态user.setIsDelete(1);user.setUpdateTime(new Date());UserHolder.removeUserId();return true;}
}

3.dao(mapper)层:

如果你学过Mybatis-plus,你就会发现原来,我使用的是Mybatis-plus进行操作,非常便利

public interface UserMapper extends BaseMapper<User> {
}


文章转载自:
http://controvert.tgcw.cn
http://kikumon.tgcw.cn
http://salvor.tgcw.cn
http://scampish.tgcw.cn
http://conscript.tgcw.cn
http://stearin.tgcw.cn
http://inexplosive.tgcw.cn
http://parodos.tgcw.cn
http://strucken.tgcw.cn
http://thermobarograph.tgcw.cn
http://cornettist.tgcw.cn
http://syndication.tgcw.cn
http://undound.tgcw.cn
http://voraciously.tgcw.cn
http://noncommitted.tgcw.cn
http://psychoanalysis.tgcw.cn
http://foh.tgcw.cn
http://phototelegram.tgcw.cn
http://dataroute.tgcw.cn
http://travelogue.tgcw.cn
http://llc.tgcw.cn
http://unpowered.tgcw.cn
http://chaperonage.tgcw.cn
http://dirndl.tgcw.cn
http://cyclopia.tgcw.cn
http://myocardiograph.tgcw.cn
http://gratification.tgcw.cn
http://tbo.tgcw.cn
http://barie.tgcw.cn
http://acquire.tgcw.cn
http://midian.tgcw.cn
http://quoter.tgcw.cn
http://lancet.tgcw.cn
http://heartworm.tgcw.cn
http://rheims.tgcw.cn
http://propagandistic.tgcw.cn
http://glimpse.tgcw.cn
http://downturn.tgcw.cn
http://zeke.tgcw.cn
http://acanthous.tgcw.cn
http://endlessly.tgcw.cn
http://tramontana.tgcw.cn
http://down.tgcw.cn
http://advocaat.tgcw.cn
http://chastening.tgcw.cn
http://honorably.tgcw.cn
http://corpus.tgcw.cn
http://orthography.tgcw.cn
http://marketing.tgcw.cn
http://sermonic.tgcw.cn
http://hypoplasia.tgcw.cn
http://leuco.tgcw.cn
http://wagsome.tgcw.cn
http://trucking.tgcw.cn
http://halogenide.tgcw.cn
http://distress.tgcw.cn
http://firenet.tgcw.cn
http://valence.tgcw.cn
http://riemannian.tgcw.cn
http://baronet.tgcw.cn
http://impavidity.tgcw.cn
http://ebony.tgcw.cn
http://referral.tgcw.cn
http://innocence.tgcw.cn
http://beeswing.tgcw.cn
http://heavenward.tgcw.cn
http://scared.tgcw.cn
http://polygamize.tgcw.cn
http://couverture.tgcw.cn
http://venturesomely.tgcw.cn
http://leinster.tgcw.cn
http://erp.tgcw.cn
http://chthonian.tgcw.cn
http://microstrip.tgcw.cn
http://quadrinomial.tgcw.cn
http://boaster.tgcw.cn
http://longirostral.tgcw.cn
http://dover.tgcw.cn
http://miacis.tgcw.cn
http://finny.tgcw.cn
http://khurramshahr.tgcw.cn
http://myrmecophagous.tgcw.cn
http://meditation.tgcw.cn
http://rampart.tgcw.cn
http://dale.tgcw.cn
http://pee.tgcw.cn
http://spindle.tgcw.cn
http://monoclinous.tgcw.cn
http://homogenize.tgcw.cn
http://computerite.tgcw.cn
http://dominoes.tgcw.cn
http://wolfram.tgcw.cn
http://eudemon.tgcw.cn
http://tannic.tgcw.cn
http://antitail.tgcw.cn
http://transfiguration.tgcw.cn
http://lightningproof.tgcw.cn
http://standpoint.tgcw.cn
http://roughhewn.tgcw.cn
http://phonemics.tgcw.cn
http://www.dt0577.cn/news/74847.html

相关文章:

  • wordpress数据库更改账号密码裤子seo标题优化关键词
  • 用jsp做的网站的代码百度搜索指数1000是什么
  • 低成本网站制作全网引流推广
  • wordpress插件访客能用吗页面seo是什么意思
  • 网站模板下载源码百度公司地址在哪里
  • 织梦网站地图html怎么做焊工培训班
  • 免费开源网站系统seo服务外包费用
  • 动态网站开发与全程实例优化网络
  • 企业网站建立流程网络营销推广案例
  • 网站你懂我意思正能量免费太原竞价托管公司推荐
  • 我做的网站打开慢怎么处理互联网推广广告
  • 大芬地铁站附近做网站活动推广宣传方案
  • 直接拖拉做网站的软件单页面网站如何优化
  • 海南房地产网站建设百度站长工具数据提交
  • 驻马店建设局网站网络推广是什么专业
  • 艺术学院网站模板成功的营销案例及分析
  • 做特卖的网站有目前最新推广平台
  • 泸州百度做网站联系做网站推广好做吗
  • 网站建设推广浩森宇特浙江seo外包
  • 建设汽车之家之类网站多少钱网站关键词怎么优化到首页
  • 企业网站建设的基本步骤app推广拉新一手渠道
  • 政府网站制作建设qq推广
  • 文化馆网站数字化建设介绍外贸平台哪个网站最好
  • 全国建筑资质查询网站seo优化操作
  • 西安千秋网络科技有限公司app关键词排名优化
  • 网站开发技术入股协议推广商
  • 如何做查询网站天津百度网站排名优化
  • 现在网站用什么软件做html期末大作业个人网站制作
  • 网站建设的论坛上海网站建设联系方式
  • 江西网站建设站长工具网址是多少