Vue项目之登录注册

2023-11-17

1. 注册

1.1 注册页面的布局

需要用到Vant的Field组件
1.views下新建一个注册页面 ,完成基本布局。引入Vue和Field并使用。
2.在官方文档中搜索,查看自己需要的内容,将其直接粘贴到页面中。
3.给注册页面添加一个单独的路由,注册页面不需要底部。(注意,相关样式需要引入不同的组件,请细心查看官方文档,按需拿取内容)
4. 利用计算属性给输入框做条件判断。本案例以手机号为例。

<template>
  <div class="container">
    <header class="header">注册</header>
    <div class="content">
      <van-field
        v-model="username"
        placeholder="请输入手机号"
        clearable
        :error-message="usernamemsg"
      />
      <van-field
        v-model="password"
        type="password"
        clearable
        placeholder="请输入密码"
        error-message="密码格式错误"
      />
      <van-field
        v-model="code"
        center
        clearable
        placeholder="请输入短信验证码"
        error-message="验证码格式错误"
      >
        <van-button slot="button" size="small" type="primary">发送验证码</van-button>
      </van-field>
    </div>
  </div>
</template>

<script>
import Vue from 'vue'
import { Field, Button } from 'vant'

Vue.use(Field)
Vue.use(Button)
export default {
  data () {
    return {
      username: '18813007814',
      password: '123456',
      code: ''
    }
  },
  computed: {
    usernamemsg () {
      if (this.username === '') {
        return ''
      } else if (!/^[1][3,4,5,7,8][0-9]{9}$/.test(this.username)) {
        return '手机号码格式错误'
      } else {
        return ''
      }
    }
  }
}
</script>

1.2 注册业务逻辑的实现

注:在此之前,记住要先去路由页面添加一个注册页面的路由。
1.补充了密码以及验证码的计算属性判断
密码:如果为空返回空,如果不符合正则,返回格式错误,否则表示可以直接返回空
验证码:如果为空返回空,否则不为五位,返回验证码格式错误,否则成功返回空

2.验证码

  • 绑定点击事件senCode
  • 将提示信息{{buttonmsg}}放在按钮内容中。
  • 定义函数:(定时器注意用箭头函数)每一秒钟定义一次,先提前声明时间,在计时器内让时间减减,当时间为零时,清除定时器,同时btn的内容改为发送验证码,最后return。未return时,让按钮内的内容为时间减减+后重新发送(注意:在开启定时器时,要让按钮禁止点击,在清除定时器后再让按钮可点。)

3.验证码跟接口做交互
在setCode最后定义一个getCode函数,在下方定义该函数(类似面向对象写法)。
定义getCode:

  • 需要引入Toast并使用,请提示
  • 在该函数中也可以去验证手机号是否正确,不正确显示相关提示信息
  • 否则正确,就去axios去post请求数据,然后打印数据,去判断返回信息,跟接口文档相对应,如果为1则是用户名已经注册,0为获取验证码失败,成功在data里再定义adminCode用来存放验证码,通过res.data.code可以获取,加入该值中。

4.引入一个按钮,作为注册按钮
定义register函数
1.判断:

  • 将手机号的验证再写一遍,如果不符合,则toast提示,直接return
  • 验证密码,不符合同样提示并return
  • 验证码验证,不符合toast提示,并return

2.当上面的判断都通过,再定义真正的注册函数

  • 调接口,修改注册按钮为不可点,并修改值为注册中,在注册按钮写上:loading=“loading” loading-text=“注册中” disabled=“flag”
  • this.flag=true,this.loading=true
  • axios的post请求数据,第二个参数为用户手机号和密码。请求成功后先去更改按钮的状态,this.flag,this.loading都改为false。 再去判断返回值(根据接口文档定义) 2->用户名已经注册,0->注册失败,否则注册成功
    5.在注册页面增加登录按钮,用来做跳转。
    记住不能用声明式跳转,用编程式跳转,用replace跳转到另一个页面(返回直接回到个人中心)
<template>
    <div class="container">
        <header class="header">注册头部</header>
         <div class="content">
             <van-field
                 v-model="tel"
                 placeholder="请输入手机号"
                 :error-message="usertel"
                 
                  clearable
             />
             <van-field
                 v-model="password"
                 type="password"
                 placeholder="请输入密码"
                 :error-message="pass"
                
                 clearable
             />
             <van-field
                 v-model="sms"
                 center
                 clearable                
                 placeholder="请输入短信验证码"
                 :error-message="test"
              >
             <van-button :disabled="flag" slot="button" size="small" type="primary" @click="sendCode">{{ buttonmsg }}</van-button>
            
             </van-field>
              <van-button type="primary" :loading="loading" loading-text="注册..." size="large" :disabled="zhud" @click="register">注册</van-button>
              <van-divider @click="toLogin">去登录</van-divider>
         </div>
    </div>
</template>
<script>
import Vue from 'vue'
import { Field,Button,Toast,Divider } from 'vant'
import axios from 'axios'
Vue.use(Field)
Vue.use(Button)
Vue.use(Toast)
Vue.use(Divider)

export default {
    data () {
        return {
            tel:'',
            password:'',
            sms:'',
            buttonmsg:'点击发送验证码',
            flag:false,
            adminCode:'',
            zhud:false,
            loading:false
        }
    },
    computed: {
        usertel () {
            if (this.tel === ""){
                return ''
            }else if(!/^[1][3,4,5,7,8][0-9]{9}$/.test(this.tel)){
                return '手机号格式错误'
            }else {
                return ''
            }
        },
        pass () {
            if (this.password === ""){
                return ''
            }else if(this.password.length<6){
                return '密码不可小于6位'
            }else {
                return ''
            }
        },
        test () {
            if (this.sms === ""){
                return ''
            }else if(this.sms.length !== 5){
                return '验证码格式错误'
            }else {
                return ''
            }
        }
    },
    methods: {
        toLogin () {
           this.$router.replace('/login') 
        },
        sendCode () {
            let time = 4
            let timer
            timer = setInterval(()=>{                           
                time --
                if(time === 0){
                    clearInterval(timer)
                    this.flag=false
                    this.buttonmsg = '点击发送验证码'
                    return
                }
                this.flag = true  
                this.buttonmsg = time + '秒后重新发送' 
                              
            },1000)
            this.getCode()
        },
        getCode () {
            if(!/^[1][3,4,5,7,8][0-9]{9}$/.test(this.tel) || this.tel===""){
                Toast('手机号码输入有误')
            }else{
                axios.get('https://www.daxunxun.com/users/sendCode?tel='+this.tel).then(res=>{
                    if(res.data === 1){
                        Toast('用户名已注册,请更改')
                    }else if(res.data === 0){
                        Toast('获取验证码失败')
                    }else{
                        this.adminCode = res.data.code
                        console.log(this.adminCode)
                    }
                })
            }
        },
        register () {
            if (this.tel === '' || this.usertel === '手机号码格式错误') {
                Toast('手机号码输入有误')
                return
            }
            if (this.password === '' || this.pass === '密码格式错误,最少为6位') {
                Toast('密码输入有误')
                return
            }
            if (this.sms === '' || this.sms !== this.adminCode) {
                Toast('验证码输入有误')
                return
            }
            this.reallR()
        },
        reallR () {
            this.zhud=true
            this.loading=true
            axios.post('https://www.daxunxun.com/users/register', {
            username: this.tel,
            password: this.password
        }).then(res=>{
            this.zhud=false
            this.loading=false
            if (res.data === 2) {
                Toast('用户名已注册,请直接登录')
            } else if (res.data === 0) {
                Toast('注册失败')
            } else {
            Toast('注册成功')
            }
        })
        }
    }
}
</script>

2. 登录

页面布局以及基本逻辑同注册基本相同,可直接复制注册,将相关注册字样更改为登录。删除相关的判断。更改相关函数。

<template>
    <div class="container">
        <header class="header">注册头部</header>
         <div class="content">
             <van-field
                 v-model="tel"
                 placeholder="请输入手机号"
                 :error-message="usertel"
                 
                  clearable
             />
             <van-field
                 v-model="password"
                 type="password"
                 placeholder="请输入密码"
                 :error-message="pass"
                
                 clearable
             />
              <van-button type="primary" :loading="loading" loading-text="登录..." size="large" :disabled="zhud" @click="login">登录</van-button>
              <van-divider @click="toRegister">去注册</van-divider>
         </div>
    </div>
</template>
<script>
import Vue from 'vue'
import { Field,Button,Toast,Divider} from 'vant'
import axios from 'axios'
// import { setInterval, clearInterval } from 'timers';
// import func from '../../../vue-temp/vue-editor-bridge';
Vue.use(Field)
Vue.use(Button)
Vue.use(Toast)
Vue.use(Divider)

export default {
    data () {
        return {
            tel:'',
            password:'',
            zhud:false,
            loading:false
        }
    },
    computed: {
        usertel () {
            if (this.tel === ""){
                return ''
            }else if(!/^[1][3,4,5,7,8][0-9]{9}$/.test(this.tel)){
                return '手机号格式错误'
            }else {
                return ''
            }
        },
        pass () {
            if (this.password === ""){
                return ''
            }else if(this.password.length<6){
                return '密码不可小于6位'
            }else {
                return ''
            }
        }
    },
    methods: {
        toRegister () {
            this.$router.replace('/register')
        },
        login () {
            if (this.tel === '' || this.usertel === '手机号码格式错误') {
                Toast('手机号码输入有误')
                return
            }
            if (this.password === '' || this.pass === '密码格式错误,最少为6位') {
                Toast('密码输入有误')
                return
            }
            if (this.sms === '' || this.sms !== this.adminCode) {
                Toast('验证码输入有误')
                return
            }
            this.reallR()
        },
        reallR () {
            this.zhud=true
            this.loading=true
            axios.post('https://www.daxunxun.com/users/login', {
            username: this.tel,
            password: this.password
        }).then(res=>{
            this.zhud=false
            this.loading=false
            if (res.data === 2) {
                Toast('用户未注册')
            } else if(res.data === -1){
                Toast('密码错误')
            }else if (res.data === 0) {
                Toast('登录失败')
            } else {
            Toast('登录成功')
            localStorage.setItem('isLogin','ok') //登录标识
            this.$router.back()  //登陆成功返回上一页
            }
        })
        }
    }
}
</script>

3.导航守卫

3.1全局导航守卫,全部路由都会经过这里。一定要调用next方法向下执行

除了登陆路由,其他页面都需要登录验证。

router.beforeEach((to,from,next)=>{
  // console.log(to)
  // console.log(from)
  // next()   //至此就可以显示页面了
  //做业务逻辑,如果是登录状态,就进行下一步(注意登录页面不可做这个判断)
  if(to.name = 'login'){  //如果要去的页面是登录页面,就进行下一步,不做判断
    next()
  }else{
    if(localStorage.getItem('isLogin')==='ok'){
      next()
    }else{
      next('/login')
    }
  }

3.2 路由独享的导航守卫

路由独享的导航守卫—一般不推荐直接使用
比如在购物车路由下方加入下面一段代码,可以实现购物车页面的相关判断。
没有登录状态就直接去到登录页面,有登录状态就继续下一步。

beforeEnter (to,from,next) {
          if(localStorage.getItem('isLogin')==="ok"){
            next()
          }else{
            next('/login')
          }
        }

3.3 组件内的导航守卫

先来简单看一下组件内的导航守卫相关介绍:

const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}

beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。

不过,你可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。

beforeRouteEnter (to, from, next) {
  next(vm => {
    // 通过 `vm` 访问组件实例
  })
}

本文以购物车页面为例,在路由进入之前,做一个判断,有登录状态进行下一步,没有登录状态就直接去到登录页面。组件内的导航守卫有两张写法,请看案例,且不同写法有不同的效果,按需而定。

<template>
    <div class="container">
        <header class="header">购物车头部</header>
         <div class="content">购物车内容</div>
    </div>
</template>
<script>
export default {
    beforeRouteEnter (to,from,next) {
        // if (localStorage.getItem('isLogin')==='ok'){
        //     next()
        // }else{
        //     next('/login')  //这种登陆成功返回点击购物车之前的页面
        // }
        next(vm => {
            if (localStorage.getItem('isLogin')==='ok'){
            next()
        }else{
           // next('./login')
           vm.$router.push('/login')  //这种登录成功直接返回到了购物车
        }
        })
    }
}
</script>

补充:个人中心的校验

  • 在个人中心写业务逻辑,如果本地读取登录状态则跳到相关页面,没有登录的话就跳转到未登录页面
  • 涉及到重定向,一开始就将路由盖过去了,因此未登录页面同样需要业务处理
  • 注意,要在未登录页面部署同样的业务逻辑,有登陆跳转登录,没有登录next
  • 想让业务更加严谨就去登录页面设置业务逻辑,(虽然效果已经实现了)

4.列表进入详情返回还在原位置

基本思路:在离开页面前将内容高度存储到本地,在返回页面后在去本地获取并设置内容高度。

  • 添加meta标签,keepAlive,表示当前路由涉及到缓存
  • 在app.vue修改路由的显示部分,将视图放进标签,并且做一个判断,注意需要缓存的才放在标签中(可以避免组件的重新渲染)
  • 找位置:离开时记录位置,返回时回到这个位置
    利用keepAlive,可以在activated中进行操作
  1. 在需要 缓存的列表中定义路由时添加如下代码 router.js中针对于 首页的路由

在这里插入图片描述
2.修改App.vue中路由的显示部分
在这里插入图片描述
3.在离开首页时,记录滚动条的位置,返回时滚动到该位置即可,下方案例有一句代码是为了实现其他业务需求,可以忽略不看。
在这里插入图片描述
4.利用keepAlive,可以在activated中进行返回后的操作,设置内容高度为本地存储的值。
在这里插入图片描述

5. 路由相关问题

对于导航守卫还需要补充一些相关知识,上面步骤执行完会发现个人中心存在一些问题。当在个人中心页面显示已经登录时,无法后退。
通过vue开发者工具,我们可以观察到,当我们未登录时,先去到首页,再去到个人中心,此时个人中心应该是未登录页面(/user/nologin),我们点击登录,会去到登录页面,点击登录后,在开发者工具中,我们会看到,我们先到了个人中心的未登录页面,再去到了个人中心的已登录页面,并且每次后退,都是先后退到个人中心未登录页面,又跳转到个人中心登录页面。(因为未登录页面有一个判断,所以我们每次点击后退,在视觉上感觉无法后退,实际上是退回到了未登录页面,这个页面又做了个判断,又回到已登录页面,如此循环往复。)
在这里插入图片描述
解决:

  • 在个人中心的未登录页面,将之前的next、vm删去。
  • 在个人中心的登录页面,将之前的判断删去,此页面不做判断也可以执行业务逻辑。

执行完以上解决方法,发现我们可以后退了,但是,需要后退两次才能返回主页。通过开发者工具我们可以看到页面路由跳转的流程,见下图:
在这里插入图片描述
相关原因以及解决方法:
1.在路由文件中将重定向删除。
2.个人中心未登录页面到登录页面的跳转是声明式挑战,需要更改为编程式跳转。在编程式跳转中,运用replace方法()
3.在个人中心页面,我们之前用的是beforeRouteEnter,如果是该页面下的其它页面做跳转,此方法无法触发。所以我们此处应该将该方法替换成侦听属性。(侦听属性可以侦听路由的变化,打印可以获取相关的路由,因此我们可以做判断。)
4.但是我们发现侦听属性在别的页面跳转到该页面时,第一次不会触发监听。因此第一次监听还是需要用到beforeRouteEnter,再此方法中也需要用到replace,至此可以解决问题了。

步骤详情
1.在路由文件中,将个人中心页面的重定向删除

在这里插入图片描述
2.在nologin页面将路由守卫删去,改变登录跳转方式。在个人中心的login页面,直接将业务逻辑删去。
在这里插入图片描述
3.个人中心页面,将beforeRouteEnter中的next改为replace方法。(因为没有重定向,默认跳转为/user替换为/user/login或者/user/nologin)在下面利用侦听属性侦听路由的变化,并做判断。 (replace和push页面显示不同)

<template>
  <div class="container">
    <header class="header">个人中心头部</header>
    <div class="content">
      <router-view></router-view>
      个人中心内容
    </div>
  </div>
</template>
<script>
export default {
  beforeRouteEnter (to, from, next) {
    next(vm => {
      if (localStorage.getItem('isLogin') === 'ok') {
        // 因为没有重定向,默认跳转为 /user 替换为/user/loging
        vm.$router.replace('/user/loging')
      } else {
        vm.$router.push('/user/nologin')
      }
    })
  },
  watch: {
    $route (val) {
      console.log(val)
      if (localStorage.getItem('isLogin') === 'ok') {
        this.$router.replace('/user/loging')
      } else {
        this.$router.replace('/user/nologin')
      }
    }
  }
}
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue项目之登录注册 的相关文章

  • 生产环境的域名地址与后端给的接口地址不一样时的配置(vue)

    1 找到 config dev env js 文件 module exports merge prodEnv NODE ENV development API ROOT http com 本地开发时用的域名 2 找到 config prod
  • vue:实现锚点双向滚动/文章章节联动滚动效果

    文章目录 需求描述 实现思路 示例代码 参考网址 需求描述 需要实现类似doc中文档大纲的效果 点击对应章节的名称时定位到相应的正文 而当正文滚动时 高亮显示对应的章节名称 实现思路 其实笔者一开始想到的是利用a标签页内跳转 也就是 锚点
  • Vue js引用警告 “export ‘default‘ (imported as ‘xxx‘) was not found

    问题原因 ES6 编译器识别问题 如果在public js这样写会有警告export default imported as xxx was not found export const myMixin 解决办法 修改组件中引用js的地方
  • Vue 组件化

    什么是组件化 任何一个人处理信息的逻辑能力都是有限的 所以 当面对一个非常复杂的问题时 我们不太可能一次性搞定一大堆的内容 但是 我们人有一种天生的能力 就是将问题进行拆解 如果将一个复杂的问题 拆分成很多个可以处理的小问题 再将其放在整体
  • 前端大屏常用的适配方案

    假设我们正在开发一个可视化拖拽的搭建平台 可以拖拽生成工作台或可视化大屏 或者直接就是开发一个大屏 首先必须要考虑的一个问题就是页面如何适应屏幕 因为我们在搭建或开发时一般都会基于一个固定的宽高 但是实际的屏幕可能大小不一 接下来我们就尝试
  • 8.全配置自动生成模块前后端

    文章目录 学习资料 配置式开发全新的模块 快速实现 字典管理 代码生成器详细属性设置 全智能模块开发 查询调整 多表连接 药品模块 生产厂家下拉框 学习资料 https www bilibili com video BV13g411Y7GS
  • vue实现拍照人脸识别功能带人脸选中框

    前言 实现打开摄像头 并识别人脸 实现效果 实现步骤 一 安装 1 官网下载 tracking js 的代码包官网入口 2 npm下载 执行命令 cnpm install tracking save 二 demo案例代码
  • Vue项目的部署(服务器)

    Vue项目的部署 服务器 前几天帮朋友写了一个可以动态查看地点温度的前端项目 目前已经部署上线了 访问链接点这里 服务器是朋友的 倒时候打不开会很正常 说不定又使用服务器玩大数据项目去了 效果图 图一 图二 当然 温度也都是实时跟新的 而且
  • Vue-cli3更改项目logo图标

    1 图标切成对应大小 2 图标名称后缀与vue原有图标logo名称 后缀一致 favicon ico 并替换 3 vue项目根目录下 新建 vue config js 添加下列代码 module exports pwa iconPaths
  • H5查看pdf文件(pdfh5)

    我用的是 pdfh5 来查看的H5中的pdf文件 使用 pdfh5 插件来打开 pdf文件 下面是两种使用方法 方法一 二都可以 但是我在使用方法二时有卡顿现象 可能是因为未开启懒加载 方法二中的 on 可以打印出来错误信息 使用方法 1
  • 前端将List列表转化为树型结构(reduce函数)

    主要用到了reduce 函数 for循环可以做到的事情reduce 都可以做到 甚至操作起来更加简单方便和高雅 reduce 为数组中的每一个元素依次执行回调函数 不包括数组中被删除或从未被赋值的元素 reduce语法 array redu
  • vue_域名部署无法访问后端

    前言 目前部署的比较另类 因为服务器为 windows 目前还不是很会 nginx 所以现在就只能在服务器上安装 nodejs 然后直接使用 npm run dev 命令行的方式运行项目 遇到的坑 使用ip访问前端的时候 就可以访问 但是通
  • 快速入手 vue3 defindeModel 双向绑定数据,赶快了解下

    彩蛋 在vue3 3x 版本中 官方 RFC 放出了 一个新特性 defineModel 它将让我们在自定义组件上双向绑定数据更加快捷 举个 以前我们父子组件双向数据绑定要在子组件里声明对应的props emts computed 子组件
  • 黑豹程序员-自定义表单实现门户自定制

    功能 用户可以实现欢迎页面自己定制 数据由数据库表进行维护 原理 页面利用div进行布局 拖动div记录其坐标 并写库 页面加载时从数据库表中读取div坐标和数据即可 效果图
  • 基于vue2+海康威视web开发包3.2 无插件版本开发的监控系统

    文章目录 前言 一 插件准备 二 使用步骤 前言 项目最终效果为 可以预览 并且可以使用云台控制 购买的海康威视摄像头必须可以开启websocket 一 插件准备 插件下载地址 下载WEB无插件开发包V3 2 并加入到vue项目中 下载后解
  • vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果

    一 实现效果 使用echarts实现省市地图绘制 根据数据在地图显示柱状图 根据数据显示数据 涟漪效果 二 实现方法 1 安装echarts插件 npm install echarts save 2 获取省市json数据 https dat
  • 【vue】$bus 跨组件调用方法

    1 新建bus js import Vue from vue 使用 Event Bus const bus new Vue export default bus 2 main js引用 import bus from libs bus Vu
  • 【vue】$bus 跨组件调用方法

    1 新建bus js import Vue from vue 使用 Event Bus const bus new Vue export default bus 2 main js引用 import bus from libs bus Vu
  • 拓展:vue 父组件调用子组件方法ref(且父组件可通过ref调用的方法传值给子组件)

    1 ref被用来给元素或子组件注册引用信息 引用信息将会注册在父组件的 refs对象上 一 ref被用来给元素或子组件注册引用信息 引用信息将会注册在父组件的 refs对象上 div class formBtn fl 111 div div
  • (vue)el-popover鼠标移入提示效果

    vue el popover鼠标移入提示效果 效果 代码

随机推荐

  • !!!RFID原理及应用期末复习总结!!!少走弯路,直接满绩!

    选用教材 RFID原理及应用 清华大学出版社 第一章 概述 学习目标 什么是RFID RFID的发展史 RFID的构成及各模块功能 RFID的几种分类 RFID的应用领域 射频识别 RFID RFID技术 又称射频识别 是一种通信技术 可通
  • 《深入理解Java虚拟机》学习笔记

    JDK 用于支持Java程序开发的最小环境 包括Java程序设计语言 Java虚拟机 JavaAPI三部分 JRE 支持Java程序运行的标准环境 包括Java SE API子集和Java虚拟机 第一章 Java虚拟机发展史 1 Sun C
  • 3.取石头 (15分)

    题目内容 有一堆石子 A B两人轮流从中取出石子 每次取出的石子数目只能为1 3 7或8 最后一枚石子谁取到就是输方 A B两人都足够聪明 不会做出错误的判断 现给出一定数目的石子 A先取石子 计算A最终是输是赢 赢用1表示 输用0表示 输
  • 灰狼(GWO)算法(附完整Matlab代码,可直接复制)

    尊重他人劳动成果 请勿转载 有问题可留言或私信 看到了都会回复解答 其他算法请参考 1 粒子群 PSO 优化算法 附完整Matlab代码 可直接复制 https blog csdn net xinzhi1992 article detail
  • Redisson分布式锁

    SpringBoot集成Redisson步骤
  • GeoServer基础教程(五):使用GeoServer和OpenLayers发布地图服务

    转载 https ethanblog com tech publish wms with geoserver and openlayers html 在前面几节的关于GeoServer的基础教程中 我们介绍了如何使用GeoServer发布地
  • Oracle中case when详解

    格式 格式一 case when conditionalExpression 01 then result 01 when conditionalExpression 02 then result 02 when conditionalEx
  • linux下opencv2.4 静态库编译与使用(针对内网主机无法安装opencv情况下使用)

    linux下opencv2 4 静态库编译与使用 针对内网主机无法安装opencv情况下使用 1 如果内网主机无法通过网络安装opencv环境 此时需要使用静态库编译方法生成opencv应用程序 此时需要opencv相关的libxx a 2
  • ElasticSearch IK分词器配置远程词典

    ElasticSearch IK分词器配置远程词典 1 在线安装IK分词器 2 IK分词器的弊端 3 解决措施 配置远程词典实时更新 补充 1 在线安装IK分词器 ElasticSearch中默认的分词器是standard 该分词器对中文按
  • 每日一题:序列操作

    序列操作 题目 Daimayuan Online Judge 没啥思路 如果暴力的话肯定会超时 太难了太难了 参考了题解想了好久才弄懂 该题是思维题 操作1是将第x个数变为y 输入的时候就可以修改值了 毕竟只要一个语句就行 每次操作都是将x
  • seata 1.4.2 执行seata-server.bat报错:Could not create connection to database server.

    seata 1 4 2 执行seata server bat报错 18 40 17 778 ERROR tionPool Create 343563528 com alibaba druid pool DruidDataSource cre
  • 网络整理续

    计算机网络简答题 1 TCP 协议和 UDP 协议的区别有哪些 1 TCP 属于面向连接的协议 UDP 属于面向无连接的协议 2 TCP 可以保证数据可靠 有序的传输 可以进行流量控制 UDP 无法实现 3 TCP 协议有效载荷小于 UDP
  • Linux下20个常用Linux性能监控工具/命令

    此文章不作为商业用途 纯粹的用来学习 20个常用Linux性能监控工具 命令 对于 Linux Unix 系统管理员非常有用的并且最常用的20个命令行系统监视工具 这些命令可以在所有版本的 Linux 下使用去监控和查找系统性能的实际原因
  • vscode实用快捷键查找和替换

    vscode是一款功能十分强大的编辑器 且带有许多插件 利用插件可以让开发速度提升几倍甚至几十倍 vscode快捷键 查找 单文件查找 ctrl F 替换 单文件内替换一处 crtl shift 1 单文件内替换全部 ctrl alt en
  • mybatis-plus中wrapper的用法(详细)

    用到了wrapper ge le ne eq等的用法 及多表查询自写sql整理资料记录一下 以备后续复习 目录 可点击相应目录直接跳转 一 条件构造器关系介绍 条件构造器关系介绍 wapper介绍 二 项目实例 1 根据主键或者简单的查询条
  • 优秀程序员和一般程序员有什么区别?

    优秀程序员和一般程序员有什么区别 为什么有的人一入职就能平步青云 而有的人入职很久却一直在原地打转 程序员的职场进阶之路到底有多少门道 今天 我们邀请到了前Google Top Performer 来Offer的闫老师 给大家分享一下他的职
  • gitlab CI/CD系列之使用 GitLab Runner注册和基本环境配置

    由于很多时候我们的环境搭建都是在已经在对应的设备上搭建完成 或者是我们直接使用一个配置好的docker容器 开机自动启动 作为ci cd的运行环境 所以为了便利性这里主要使用的是shell模式 简介 理解了上面的基本概念之后 有没有觉得少了
  • netty-all 简介、中文文档、中英对照文档 下载

    netty all 文档 下载链接 含jar包 源码 pom 组件名称 中文 文档 下载链接 中英对照 文档 下载链接 netty all 4 0 50 Final jar netty all 4 0 50 Final API文档 中文版
  • 头歌实践教学平台数据结构与算法:02线性表

    针对数据结构02线性表在头歌平台练习过程中的完成代码 关卡数目较多 每题思路单独在每一关中解释 如有其他需求请留言 第一关 可以把问题转换为 遍历B中的元素 如果该元素不在A中 则把该元素插入到A中 由于集合中的元素没有先后顺序 因此 插入
  • Vue项目之登录注册

    Vue项目之登录注册 1 注册 1 1 注册页面的布局 1 2 注册业务逻辑的实现 2 登录 3 导航守卫 3 1全局导航守卫 全部路由都会经过这里 一定要调用next方法向下执行 3 2 路由独享的导航守卫 3 3 组件内的导航守卫 补充