【畅购商城】用户登录

news2024/11/18 14:27:07
    1. 用户登录
      1. 构建页面:Login.vue
  1. 步骤一:创建Login.vue

  1. 步骤二:绘制通用模块

<template>

  <div>

    <TopNav></TopNav>

    <div style="clear:both;"></div>

    <HeaderLogo></HeaderLogo>

    <div style="clear:both;"></div>

    <!-- 正文 -->

    

    <div style="clear:both;"></div>

    <Footer></Footer>

  </div>

</template>

<script>

import TopNav from '../components/TopNav'

import HeaderLogo from '../components/HeaderLogo'

import Footer from '../components/Footer'

export default {

  head: {

    title: '用户登录',

    link: [

      {rel:'stylesheet',href:'style/login.css'}

    ],

    script: [

    ]

  },

  components : {

    TopNav,

    HeaderLogo,

    Footer

  },

}

</script>

<style>

</style>

  1. 步骤三:绘制登录表单

<template>

  <div>

    <TopNav></TopNav>

    <div style="clear:both;"></div>

    <HeaderLogo></HeaderLogo>

    <div style="clear:both;"></div>

    <!-- 正文 -->

    <!-- 登录主体部分start -->

    <div class="login w990 bc mt10">

      <div class="login_hd">

        <h2>用户登录</h2>

        <b></b>

      </div>

      <div class="login_bd">

        <div class="login_form fl">

          <form action="" method="post">

            <ul>

              <li>

                <label for="">用户名:</label>

                <input type="text" class="txt" name="username" />

              </li>

              <li>

                <label for="">密码:</label>

                <input type="password" class="txt" name="password" />

                <a href="">忘记密码?</a>

              </li>

              <li class="checkcode">

                <label for="">验证码:</label>

                <input type="text"  name="checkcode" />

                <img src="images/checkcode1.jpg" alt="" />

                <span>看不清?<a href="">换一张</a></span>

              </li>

              <li>

                <label for=""> </label>

                <input type="checkbox" class="chb"  /> 保存登录信息

              </li>

              <li>

                <label for=""> </label>

                <input type="submit" value="" class="login_btn" />

              </li>

            </ul>

          </form>

          <div class="coagent mt15">

            <dl>

              <dt>使用合作网站登录商城:</dt>

              <dd class="qq"><a href=""><span></span>QQ</a></dd>

              <dd class="weibo"><a href=""><span></span>新浪微博</a></dd>

              <dd class="yi"><a href=""><span></span>网易</a></dd>

              <dd class="renren"><a href=""><span></span>人人</a></dd>

              <dd class="qihu"><a href=""><span></span>奇虎360</a></dd>

              <dd class=""><a href=""><span></span>百度</a></dd>

              <dd class="douban"><a href=""><span></span>豆瓣</a></dd>

            </dl>

          </div>

        </div>

        <div class="guide fl">

          <h3>还不是商城用户</h3>

          <p>现在免费注册成为商城用户,便能立刻享受便宜又放心的购物乐趣,心动不如行动,赶紧加入吧!</p>

          <a href="regist.html" class="reg_btn">免费注册 >></a>

        </div>

      </div>

    </div>

    <!-- 登录主体部分end -->

    <div style="clear:both;"></div>

    <Footer></Footer>

  </div>

</template>

<script>

import TopNav from '../components/TopNav'

import HeaderLogo from '../components/HeaderLogo'

import Footer from '../components/Footer'

export default {

  head: {

    title: '用户登录',

    link: [

      {rel:'stylesheet',href:'style/login.css'}

    ],

    script: [

    ]

  },

  components : {

    TopNav,

    HeaderLogo,

    Footer

  },

}

</script>

<style>

</style>

      1. 分析

      1. 验证码:接口

http://localhost:10010/web-service/verifycode?username=jack

      1. 验证码:生成与显示
  1. 步骤一:后端生产验证码,并将用户保存Redis
    1. 存放redis中验证码key格式:"login" + 用户名

package com.czxy.changgou4.controller;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;

import javax.imageio.ImageIO;

import javax.servlet.http.HttpServletResponse;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

import java.util.concurrent.TimeUnit;

/**

 * @author 桐叔

 * @email liangtong@itcast.cn

 */

@Controller

@RequestMapping("/verifycode")

public class VerifyCodeController {

    @Resource

    private StringRedisTemplate stringRedisTemplate;

    @GetMapping

    public void verifyCode(String username , HttpServletResponse response ) throws IOException {

        //字体只显示大写,去掉了1,0,i,o几个容易混淆的字符

        String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";

        int IMG_WIDTH = 72;

        int IMG_HEIGTH = 27;

        Random random = new Random();

        //创建图片

        BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGTH, BufferedImage.TYPE_INT_RGB);

        //画板

        Graphics g = image.getGraphics();

        //填充背景

        g.setColor(Color.WHITE);

        g.fillRect(1,1,IMG_WIDTH-2,IMG_HEIGTH-2);

        g.setFont(new Font("楷体", Font.BOLD,25));

        StringBuilder sb = new StringBuilder();

        //写字

        for(int i = 1 ; i <= 4 ; i ++){

            //随机颜色

            g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));

            int len = random.nextInt(VERIFY_CODES.length());

            String str = VERIFY_CODES.substring(len,len+1);

            sb.append(str);

            g.drawString(str, IMG_WIDTH / 6 * i , 22 );

        }

        //将验证码存放到redis

        stringRedisTemplate.opsForValue().set( "login" + username , sb.toString() , 1 , TimeUnit.HOURS);

        // 生成随机干扰线

        for (int i = 0; i < 30; i++) {

            //随机颜色

            g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));

            int x = random.nextInt(IMG_WIDTH - 1);

            int y = random.nextInt(IMG_HEIGTH - 1);

            int x1 = random.nextInt(12) + 1;

            int y1 = random.nextInt(6) + 1;

            g.drawLine(x, y, x - x1, y - y1);

        }

        //响应到浏览器

        ImageIO.write(image,"jpeg", response.getOutputStream());

    }

}

  1. 步骤二:点击“换一张”显示验证码
    1. 默认不显示验证码
    2. 点击“换一张”获得验证码

<template>

  <div>

    <TopNav></TopNav>

    <div style="clear:both;"></div>

    <HeaderLogo></HeaderLogo>

    <div style="clear:both;"></div>

    <!-- 正文 -->

    <!-- 登录主体部分start -->

    <div class="login w990 bc mt10">

      <div class="login_hd">

        <h2>用户登录</h2>

        <b></b>

      </div>

      <div class="login_bd">

        <div class="login_form fl">

          <form action="" method="post">

            <ul>

              <li>

                <label for="">用户名:</label>

                <input type="text" class="txt" name="username" v-model="user.username" />

              </li>

              <li>

                <label for="">密码:</label>

                <input type="password" class="txt" name="password" v-model="user.password" />

                <a href="">忘记密码?</a>

              </li>

              <li class="checkcode">

                <label for="">验证码:</label>

                <input type="text"  name="checkcode" />

                <!-- <img src="images/checkcode1.jpg" alt="" /> -->

                <img :src="imgSrc" alt="" />

                <span>看不清?<a href="" @click.prevent="changeVerifyCode">换一张</a></span>

              </li>

              <li v-if="errorMsg != ''">

                <label for=""> </label>

                <span style="color: #ff5b5b">{{errorMsg}}</span>

              </li>

              <li>

                <label for=""> </label>

                <input type="checkbox" class="chb"  /> 保存登录信息

              </li>

              <li>

                <label for=""> </label>

                <input type="submit" value="" class="login_btn" />

              </li>

            </ul>

          </form>

          <div class="coagent mt15">

            <dl>

              <dt>使用合作网站登录商城:</dt>

              <dd class="qq"><a href=""><span></span>QQ</a></dd>

              <dd class="weibo"><a href=""><span></span>新浪微博</a></dd>

              <dd class="yi"><a href=""><span></span>网易</a></dd>

              <dd class="renren"><a href=""><span></span>人人</a></dd>

              <dd class="qihu"><a href=""><span></span>奇虎360</a></dd>

              <dd class=""><a href=""><span></span>百度</a></dd>

              <dd class="douban"><a href=""><span></span>豆瓣</a></dd>

            </dl>

          </div>

        </div>

        <div class="guide fl">

          <h3>还不是商城用户</h3>

          <p>现在免费注册成为商城用户,便能立刻享受便宜又放心的购物乐趣,心动不如行动,赶紧加入吧!</p>

          <a href="regist.html" class="reg_btn">免费注册 >></a>

        </div>

      </div>

    </div>

    <!-- 登录主体部分end -->

    <div style="clear:both;"></div>

    <Footer></Footer>

  </div>

</template>

<script>

import TopNav from '../components/TopNav'

import HeaderLogo from '../components/HeaderLogo'

import Footer from '../components/Footer'

export default {

  head: {

    title: '用户登录',

    link: [

      {rel:'stylesheet',href:'style/login.css'}

    ],

    script: [

    ]

  },

  components : {

    TopNav,

    HeaderLogo,

    Footer

  },

  data() {

    return {

      imgSrc:'',

      errorMsg: '',

      user: {

      }

    }

  },

  methods: {

    changeVerifyCode() {

      if( this.user.username ) {

//this.$axios.defaults.baseURL

        this.imgSrc = `http://localhost:10010/web-service/verifycode?t=${new Date().getTime()}&username=${this.user.username }`

      } else {

        this.errorMsg = '用户名不能为空'

      }

    }

  },

  watch: {

    'user' : {

      handler(v) {

        if(v) {

          //如果user数据发生改变,修改提示信息

          this.errorMsg = ''

        }

      },

      deep: true

    }

  },

}

</script>

<style>

</style>

      1. 通过用户名查询:接口

POST http://localhost:10010/web-service/user/findByUsername

{

"username":"jack"

}

      1. 通过用户名查询:实现
  1. 修改UserController,添加 findByUsername函数

/**

 * 通过用户名查询

 * @param user

 * @return 返回用户对象

 */

@PostMapping("/findByUsername")

public User findByUsername(@RequestBody User user){

    //查询用户

    User findUser = userService.findByUsername( user.getUsername() );

    return findUser;

}

      1. 认证服务:构建项目(changgou4-service-auth)
  1. 步骤一:构建项目

  1. 步骤二:创建pom.xml文件

<dependencies>

    <!--自定义项目-->

    <dependency>

        <groupId>com.czxy.changgou</groupId>

        <artifactId>changgou4_common_auth</artifactId>

    </dependency>

    <!--web起步依赖-->

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <!-- nacos 客户端 -->

    <dependency>

        <groupId>com.alibaba.nacos</groupId>

        <artifactId>nacos-client</artifactId>

    </dependency>

    <!-- nacos 服务发现 -->

    <dependency>

        <groupId>com.alibaba.cloud</groupId>

        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

    </dependency>

    <!--redis-->

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-data-redis</artifactId>

    </dependency>

    <dependency>

        <groupId>redis.clients</groupId>

        <artifactId>jedis</artifactId>

    </dependency>

    <!--swagger2-->

    <dependency>

        <groupId>io.springfox</groupId>

        <artifactId>springfox-swagger2</artifactId>

    </dependency>

    <dependency>

        <groupId>io.springfox</groupId>

        <artifactId>springfox-swagger-ui</artifactId>

    </dependency>

        <!--    feign    -->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-openfeign</artifactId>

        </dependency>

</dependencies>

  1. 步骤三:创建yml文件

server:

  port: 8085

spring:

  application:

    name: auth-service

  cloud:

    nacos:

      discovery:

        server-addr: 127.0.0.1:8848   #nacos服务地址

sc:

  jwt:

    secret: sc@Login(Auth}*^31)&czxy% # 登录校验的密钥

    pubKeyPath: D:/rsa/rsa.pub # 公钥地址

    priKeyPath: D:/rsa/rsa.pri # 私钥地址

    expire: 360 # 过期时间,单位分钟

  1. 步骤四:配置启动类

package com.czxy.changgou4;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import org.springframework.cloud.openfeign.EnableFeignClients;

/**

 * @author 桐叔

 * @email liangtong@itcast.cn

 */

@SpringBootApplication

@EnableDiscoveryClient

@EnableFeignClients

public class CGAuthServiceApplication {

    public static void main(String[] args) {

        SpringApplication.run(CGAuthServiceApplication.class, args);

    }

}

  1. 步骤五:配置类

      1. 认证服务:用户登录后端
  1. 步骤一:创建AuthUser 封装对象(与User比较,缺数据库相关注解)

package com.czxy.changgou4.domain;

import lombok.Data;

import java.util.Date;

/**

 * @author 桐叔

 * @email liangtong@itcast.cn

 */

@Data

public class AuthUser {

    private Long id;

    private String username;

    private String password;

    private String face;

    private Integer expriece;

    private String email;

    private String mobile;

    private Date createdAt;

    private Date updatedAt;

    private String code;

    private String password_confirm;

}

  1. 步骤二:创建UserFeign,完成远程用户查询功能

package com.czxy.changgou4.feign;

import com.czxy.changgou4.domain.AuthUser;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

/**

 * @author 桐叔

 * @email liangtong@itcast.cn

 */

@FeignClient(value = "web-service",path="/user")

public interface UserFeign {

    @PostMapping("/findByUsername")

    public AuthUser findByUsername(@RequestBody AuthUser user);

}

  1. 步骤三:创建AuthService接口,编写登录方法 login()

package com.czxy.changgou4.service;

import com.czxy.changgou4.domain.AuthUser;

/**

 * @author 桐叔

 * @email liangtong@itcast.cn

 */

public interface AuthService {

    /**

     * 用户登录

     * @param user

     * @return

     */

    public AuthUser login(AuthUser user ) ;

}

  1. 步骤四:创建AuthService实现类,并通过BCrypt校验密码

package com.czxy.changgou4.service.impl;

import com.czxy.changgou4.domain.AuthUser;

import com.czxy.changgou4.feign.UserFeign;

import com.czxy.changgou4.service.AuthService;

import com.czxy.changgou4.utils.BCrypt;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**

 * @author 桐叔

 * @email liangtong@itcast.cn

 */

@Service

public class AuthServiceImpl implements AuthService {

    @Resource

    private UserFeign userFeign;

    /**

     * 用户登录

     * @param user

     * @return

     */

    public AuthUser login(AuthUser user ) {

        //远程查询用户

        AuthUser findUser = userFeign.findByUsername(user);

        if(findUser == null) {

            return null;

        }

        //校验密码是否正确

        boolean checkpw = BCrypt.checkpw( user.getPassword(), findUser.getPassword());

        if(checkpw){

            return findUser;

        }

        return null;

    }

}

  1. 步骤五:创建AuthController,添加login方法
    1. redis中登录验证码和用户输入的验证码进行匹配

package com.czxy.changgou4.controller;

/**

 * @author 桐叔

 * @email liangtong@itcast.cn

 */

import com.czxy.changgou4.domain.AuthUser;

import com.czxy.changgou4.service.AuthService;

import com.czxy.changgou4.vo.BaseResult;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**

 * Created by liangtong.

 */

@RestController

@RequestMapping("/auth")

public class AuthController {

    @Resource

    private AuthService authService;

    @Resource

    private StringRedisTemplate stringRedisTemplate;

    @PostMapping("/login")

    public BaseResult login(@RequestBody AuthUser user){

        //校验验证码--使用后删除

        String redisCode = stringRedisTemplate.opsForValue().get( "login" + user.getUsername() );

        stringRedisTemplate.delete( "login" + user.getUsername() );

        if(redisCode == null) {

            return BaseResult.error("验证码无效");

        }

        if(! redisCode.equalsIgnoreCase(user.getCode())) {

            return BaseResult.error("验证码错误");

        }

        //登录

        AuthUser loginUser = authService.login(user);

        if(loginUser != null ) {

            return BaseResult.ok("登录成功").append("loginUser",loginUser);

        } else {

            return BaseResult.error("用户名或密码不匹配");

        }

    }

}

      1. 认证服务:用户登录前端
  1. 步骤一:修改apiclient.js,添加login函数

  //登录

  login : ( user )=> {

    return axios.post('/auth-service/auth/login', user )

  }

  1. 步骤二:修改Login.vue,给验证码绑定变量

<li class="checkcode">

                <label for="">验证码:</label>

                <input type="text"  name="checkcode" v-model="user.code" />

                <!-- <img src="images/checkcode1.jpg" alt="" /> -->

  1. 步骤三:修改Login.vue,给提交按钮绑定事件

<li>

                <label for=""> </label>

                <input type="submit" value="" @click.prevent="loginFn" class="login_btn" />

              </li>

  1. 步骤四:编写loginFn完成登录功能
    1. 登录成功,跳转到首页
    2. 登录失败,给出提示

    async loginFn() {

      let { data } = await this.$request.login( this.user )

      if( data.code == 20000) {

        //成功

        sessionStorage.setItem('user' , JSON.stringify(data.other.loginUser) )

        //跳转到首页

        this.$router.push('/')

      } else {

        this.errorMsg = data.message

      }

    }

  1. 步骤五:创建首页 ~/pages/index.vue, 

<template>

  <div>

    <TopNav></TopNav>

  </div>

</template>

<script>

import TopNav from '../components/TopNav'

export default {

  head: {

    title: '首页',

    link: [

      {rel:'stylesheet',href:'style/index.css'},

      {rel:'stylesheet',href:'style/bottomnav.css'}

    ],

    script: [

      { type: 'text/javascript', src: 'js/header.js' },

      { type: 'text/javascript', src: 'js/index.js' },

    ]

  },

  components : {

    TopNav,

  },

}

</script>

<style>

</style>

  1. 步骤六:重命名静态页面 ~/static/index.html 为 ~/static/home.html

      1. 修改 TopNav.vue 组件

  1. 完善导航条,根据vuex中的数据,显示不同内容

  1. 步骤一:创建 ~/store/index.js ,并编写vuex内容

export const state = () => ({

  user: null

})

//通用设置

export const mutations = {

  setData( state , obj) {

    state[obj.key] = obj.value

  }

}

  1. 步骤二:页面登录成功,将用户信息保存到vuex中

// 将用户信息保存到vuex中

this.$store.commit('setData', {key:'user',value: data.data })

  1. 步骤三:修改顶部导航TopNav.vue
    1. 从vuex中的数据

<template>

  <!-- 顶部导航 start -->

  <div class="topnav">

    <div class="topnav_bd w990 bc">

      <div class="topnav_left">

      </div>

      <div class="topnav_right fr">

        <ul>

          <li v-if="user != null">您好,{{user.username}} 欢迎来到畅购! <a href="" @click.prevent="logout">退出</a></li>

          <li v-if="user != null" class="line">|</li>

          <li v-if="user == null">[<a href="/login">登录</a>] [<a href="/register">免费注册</a>] </li>

          <li v-if="user == null" class="line">|</li>

          <li v-if="user != null">我的订单</li>

          <li v-if="user != null" class="line">|</li>

          <li>客户服务</li>

        </ul>

      </div>

    </div>

  </div>

  <!-- 顶部导航 end -->

</template>

<script>

import {mapState,mapMutations} from 'vuex'

export default {

  mounted() {

    let userStr = sessionStorage.getItem('user')

    if(userStr){

      // 将string数据转换object,并填充到vuex中

      this.setData({key:'user',value: JSON.parse(userStr)})

    }

  },

  methods: {

    logout() {

      sessionStorage.removeItem('user')

      sessionStorage.removeItem('token')

      //设置vuex中的数据为空

      this.setData({key:'user',value: null })

      this.$router.push('/login')

    },

    ...mapMutations(['setData'])

  },

  computed: {

    ...mapState(['user'])

  },

}

</script>

<style>

</style>

      1. vuex刷新数据丢失
  1. 刷新操作:
    1. 点击刷新按钮
    2. 点击回退按钮
    3. 地址栏直接输入地址
  2. 现象:
    1. vuex在刷新操作后,数据丢失了
  3. 解决方案
    1. 方案1:不是公共组件:页面在pages目录下,可以nuxt.js提供 fetch进行操作。
    2. 方案2:是公共组件:组件在components目录下,借助第三方进行存储(cookie、localStorage、sessionStorage)
      1. 选择1:sessionStorage存放数据,如果vuex中没有,将sessionStorage同步过去。
      2. 选择2:vuex中actions模块就可以发送ajax,从而同步数据。
  4. 具体操作:
    1. 如果vuex中没有数据,使用sessionStorage的数据填充vuex。
    2. 修改TopNav.vue页面

<template>

  <!-- 顶部导航 start -->

  <div class="topnav">

    <div class="topnav_bd w990 bc">

      <div class="topnav_left">

      </div>

      <div class="topnav_right fr">

        <ul>

          <li v-if="user!=null">您好,{{user.username}}欢迎来到畅购!

          </li>

          <li v-if="user==null">

            [<nuxt-link to="/Login">登录</nuxt-link>]

          </li>

          <li v-if="user==null">

            [<nuxt-link to="/Register">免费注册</nuxt-link>]

          </li>

          <li v-if="user!=null">

            [<nuxt-link to="/Login">退出</nuxt-link>]

          </li>

          <li v-if="user!=null" class="line">|</li>

          <li v-if="user!=null">我的订单</li>

          <li class="line">|</li>

          <li>客户服务</li>

        </ul>

      </div>

    </div>

  </div>

  <!-- 顶部导航 end -->

</template>

<script>

import {mapState, mapMutations} from 'vuex'

export default {

  computed: { //计算属性整合vuex

    // user() {

    //   return this.$store.state.user

    // }

    ...mapState(['user'])

  },

  mounted() {

    // 从sessionStorage获得信息,如果存在,直接添加vuex中

    let userStr = sessionStorage.getItem('user')

    if(userStr) {

      let user = JSON.parse(userStr)

      //将数据存放到vuex中

      this.setData({key:'user',value: user })

    }

  },

  methods: {

    ...mapMutations(['setData']),

  },

}

</script>

<style>

</style>

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

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

相关文章

嵌入式开发--CubeMX使用入门教程

嵌入式开发–CubeMX使用入门教程 CubeMX简介 传统的单片机开发时&#xff0c;需要针对片上外设做各种初始化的工作&#xff0c;相当麻烦。 CubeMX是ST公司出品的一款图形化代码生成工具&#xff0c;通过图形化界面&#xff0c;可以非常直观的配置好各种片上外设&#xff0c;时…

一个方便IO单元测试的C#扩展库

对于我们.Net程序员&#xff0c;System.Web.Abstractions我们都非常熟悉&#xff0c;主要作用于Web可以实现单元测试&#xff0c;他是在.Net framework 3.5 sp1开始引入的,很好的解决项目表示层不好做单元测试的问题&#xff0c;这个库所有类都是Wrapper/Decorator模式的。今天…

[SpringBoot] Spring Boot注册Web原生组件/拦截器HandlerInterceptor

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

风控建模坏样本太少,不要再用过采样和欠采样了,试下这种更有效的方法

样本数据不平衡是我们建模场景中经常遇到的问题&#xff0c;由于目标类别的分布占比差异较大&#xff0c;使得模型训练难以取得较好的拟合效果&#xff0c;甚至模型结果在实际应用中无效。举个最常见的例子&#xff0c;在信贷场景中构建反欺诈模型时&#xff0c;训练样本数据的…

(附源码)计算机毕业设计SSM垃圾分类综合服务系统

&#xff08;附源码&#xff09;计算机毕业设计SSM垃圾分类综合服务系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

(27)语义分割--cityscape数据集的读取和使用

1、主要参考 (1) 图像分割cityscape数据集使用介绍 - 知乎 (2)torchvision支持很多现成的数据集 Datasets — Torchvision 0.13 documentation 。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。 2、下载…

CTFHub | 整数型注入

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

【Vue 快速入门系列】列表的基本使用

文章目录前言列表的基本使用Key的原理列表过滤列表排序前言 本篇文章讲述Vue中最基本的列表使用&#xff0c;如何迭代列表取值&#xff0c;如何对列表进行过滤、排序等。 列表的基本使用 在Vue中使用列表的时候灰常简单&#xff0c;只需要将Vue属性内的列表数据与dom标签进行…

[架构之路-57]:目标系统 - 平台软件 - 用户空间驱动与硬件抽象层HAL

目录 前言&#xff1a; 第1章 驱动程序功能设计 1.1 关于用户空间驱动 1.2 硬件驱动程序的四大功能概述 1.3 OAM管理面功能&#xff1a;站在管理源的角度&#xff0c;看如何监控使能和监控硬件。 1.4 控制面功能&#xff1a;站在业务的角度看&#xff0c;如何使能和监控硬…

基于Android的五子棋游戏APP设计

目 录 第一章&#xff1a;绪论 1 1.1智能手机与Android系统的发展历程 1 1.1.1 智能手机 1 1.1.2 Android系统基本情况介绍 2 1.2课题现状及应用前景 3 1.2.1 五子棋简介 3 1.2.2 课题现状及应用前景 3 第二章&#xff1a;开发环境的搭建 5 2.1 系统开发环境 5 2.2 系统开发环境…

SpringCould(一)

视频链接&#xff1a;https://www.bilibili.com/video/BV1f94y1U7AB/?vd_source9545770e4a2968c05878ffac8589ec6c 视频选集&#xff1a;P1— P15 文章目录1.微服务简介1.1 单体架构不足1.2 微服务1.3 微服务的特点1.4 微服务的自动部署&#xff08;CI/CD&#xff09;(持续集成…

一文了解数据结构

目录 数据结构 什么是数据结构 链表 数组 栈 队列 哈希表 堆 数据结构 什么是数据结构 「数据结构」决定了数据的顺序和位置关系.数据存储于内存时&#xff0c;决定了数据顺序和位置关系的便是「数据结构」 链表 「链表」中的数据呈线性排列。链表中添加删除数据比较…

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---水平位置控制

多旋翼无人机仿真 rotors_simulator&#xff1a;基于PID控制器的位置控制---水平位置控制前言水平位置控制串级P控制收敛结果收敛过程串级PID控制收敛结果收敛过程结果总结前言 无人机&#xff08;Unmanned Aerial Vehicle&#xff09;&#xff0c;指的是一种由动力驱动的、无…

机器学习从零到入门 GBDT 梯度提升决策树

GBDT 梯度提升决策树详解一、 梯度的概念1、日常生活中的梯度2、函数中的梯度2.1、走进数学2.2、从数学到机器学习(1)、损失函数的理解 loss function(2)、梯度的理解 gradient(3)、损失函数的梯度下降二、GBDT1、回归树 - Regression Decision Tree&#xff0c;DT2、梯度提升 …

利用Python实现mysql数据库的基础操作

一&#xff1a;环境准备&#xff1a; 1.安装第三方库&#xff1a;pymsql 在pycharm的terminal中执行命令&#xff1a;pip3 install pymsql 2.导入第三方库到py文件中 import pymsql 二&#xff1a;创建mysql数据库的链接对象&#xff1a; 1.封装一个Python类&#xff0c;在该…

Python爬虫入狱小技巧

呀&#xff0c;来坐牢的是吧&#xff0c;坐牢是不可能坐牢的&#xff0c;骚年&#xff0c;下面就是方法&#xff0c;早上学&#xff0c;晚上进去 一、整体思路 爬虫一开始要把思路理清楚&#xff0c;即从网页源代码或者网页数据接口&#xff0c;获取需要的数据.大致思路如下 …

【Java进阶】JUC并发基础

文章目录1.概念1.1 什么是JUC1.2 线程与进程1.3 线程的几种状态1.4 守护线程1.5 死锁与活锁1.6 乐观锁与悲观锁1.7 自旋锁2.Lock2.1 使用Lock2.2 Lock与Synchronized2.3 虚假唤醒3.八锁问题3.1 创建一个Phone实例多线程调用两个方法3.2 创建一个Phone实例多线程调用两个方法&am…

基于热传导矩阵(HCM)边缘检测方法在红外图像中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

3道真题训练|学会链表的前世今生

&#x1f64b;很多朋友都问我学完基础知识以后怎样提高编程水平&#xff1f;当然是刷题啦&#xff01;很多小伙伴都在纠结从哪里开始&#xff0c;今天给大家推荐一个身边朋友都在使用的刷题网站&#xff1a;点击进入牛客网刷题吧&#xff01; &#x1f64b;‍♂️今天是Java …

中文文本分类,基本模型的pytoch实现

学习说明&#xff1a;最近发现了一个宝藏仓库&#xff0c;将常见的文本分类方法做了一个介绍、及封装。现在将学习这仓库的一些笔记记录如下 参照资料 649453932/Chinese-Text-Classification-Pytorch: 中文文本分类&#xff0c;TextCNN&#xff0c;TextRNN&#xff0c;FastT…