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

Vue3电商项目实战-登录模块2【05-登录-表单校验、06-登录-消息提示组件封装、07-登录-账户登录、08-登录-手机号登录、09-退出登录】

文章目录

    • 05-登录-表单校验
    • 06-登录-消息提示组件封装
    • 07-登录-账户登录
    • 08-登录-手机号登录
    • 09-退出登录


05-登录-表单校验

文档:https://vee-validate.logaretm.com/v4/ 支持vue3.0

第一步:安装

  • 执行命令 npm i vee-validate@4.0.3

第二步:导入

  • 修改文件 src/views/login/index.vue
import { Form, Field } from 'vee-validate'

第三步:定义校验规则

  • 新建文件 src/utils/vee-validate-schema.js
// 定义校验规则提供给vee-validate组件使用
export default {// 校验accountaccount (value) {// value是将来使用该规则的表单元素的值// 1. 必填// 2. 6-20个字符,需要以字母开头// 如何反馈校验成功还是失败,返回true才是成功,其他情况失败,返回失败原因。if (!value) return '请输入用户名'if (!/^[a-zA-Z]\w{5,19}$/.test(value)) return '字母开头且6-20个字符'return true},password (value) {if (!value) return '请输入密码'if (!/^\w{6,24}$/.test(value)) return '密码是6-24个字符'return true},mobile (value) {if (!value) return '请输入手机号'if (!/^1[3-9]\d{9}$/.test(value)) return '手机号格式错误'return true},code (value) {if (!value) return '请输入验证码'if (!/^\d{6}$/.test(value)) return '验证码是6个数字'return true},isAgree (value) {if (!value) return '请勾选同意用户协议'return true}
}
  • 提取目的 这些校验规则将来在其他表单验证时候可复用

第三步:使用 Form 组件,使用 vee-validate-schema 校验规则

  • 修改文件 src/views/login/index.vue
-<div class="form">...</div>
+<Form class="form" :validation-schema="schema" autocomplete="off">...</Form>
import veeSchema from '@/utils/vee-validate-schema'
  setup () {// 控制短信登录切换的const isMsgLogin = ref(false)// 表单对象数据const form = reactive({isAgree: true,account: null,password: null,mobile: null,code: null})// 校验规则对象const mySchema = {account: schema.account,password: schema.password,mobile: schema.mobile,code: schema.code,isAgree: schema.isAgree}return { isMsgLogin, form, scheam:mySchema, submit }} 

第四步:使用 Field 组件,添加表单项目校验

  • 修改文件 src/views/login/index.vue
          <div class="form-item"><div class="input"><i class="iconfont icon-user"></i>
+              <Field :class="{error:errors.mobile}" v-model="form.mobile" name="mobile" type="text" placeholder="请输入手机号" /></div>
+            <div class="error" v-if="errors.mobile"><i class="iconfont icon-warning" />{{errors.mobile}}</div></div><div class="form-item" v-if="!isMsgLogin"><div class="input"><i class="iconfont icon-lock"></i>
+              <Field :class="{error:errors.password}" v-model="form.password" name="password" type="password" placeholder="请输入密码" /></div>
+            <div class="error" v-if="errors.password"><i class="iconfont icon-warning" />{{errors.password}}</div></div><div class="form-item" v-else><div class="input"><i class="iconfont icon-code"></i>
+              <Field :class="{error:errors.code}" v-model="form.code" name="code" type="password" placeholder="请输入验证码" /><span class="code">发送验证码</span></div>
+            <div class="error" v-if="errors.code"><i class="iconfont icon-warning" />{{errors.code}}</div></div>
<Form class="form" :validation-schema="schema" v-slot="{errors}" 
  • 其实就是把input改成 Field 组件,默认解析成input
  • Field 添加name属性,作用是指定使用schema中哪个校验规则
  • Form 添加 v-slot="{errors}" 使用作用域插槽暴露 errors 错误对象
    • 通过 errors['校验规则名称'] 取出错误信息,有则显示,无即隐藏

第五步:如何校验 自定义组件 XtxCheckbox

  • 修改文件 src/views/login/index.vue
-<XtxCheckbox v-model="form.isAgree" />
+<Field as="XtxCheckbox" name="isAgree" v-model="form.isAgree"/>
  • Fieldas 属性可以指定为其他标签,也可指定为组件。
    • 但是组件需要支持 v-model 否则校验不会触发。

第六步:如何在切换 短信 与 账户 登录时候清空表单和校验结果

  • 修改文件 src/views/login/index.vue
<Form ref="formCom" class="form" :validation-schema="schema" v-slot="{errors}" 
    // 切换表单元素,还原数据和清除校验效果const formCom = ref(null)watch(isMsgLogin, () => {// 还原数据form.isAgree = trueform.account = nullform.password = nullform.mobile = nullform.code = null// 补充校验效果清除,Form组件提供resetForm()formCom.value.resetForm()})
  • 首先需要自己手动清除数据,然后使用Form 组件提供 resetForm 方法对表单进行清除校验结果

第七步:如何整体表单校验

  • 修改文件 src/views/login/index.vue
<a @click="login()" href="javascript:;" class="btn">登 录</a>
    // 需要在点击登录的时候对整体表单进行校验const login = async () => {// Form组件提供了一个 validate 函数作为整体表单校验,当是返回的是一个promiseconst valid = await formCom.value.validate()console.log(valid)}return { isMsgLogin, form, schema: mySchema, formCom, login }
  • Form 组件提供 validate 方法对表单进行整体校验

06-登录-消息提示组件封装

目的:在接口请求报错的时候给用户进行提示

组件功能分析:

  • 固定顶部显示,有三种类型:成功,错误,警告。
  • 显示消息提示时需要动画从上滑入且淡出。
  • 组件使用的方式不够便利,封装成工具函数方式。

大致实现步骤:

  • 先把布局,和三种情况的显示,完成。

    • 定义组件:src/components/library/xtx-message.vue
<template><div class="xtx-message" :style="style[type]"><!-- 上面绑定的是样式 --><!-- 不同提示图标会变 --><i class="iconfont" :class="[style[type].icon]"></i><span class="text">{{text}}</span></div>
</template>
<script>
export default {name: 'XtxMessage',props: {text: {type: String,default: ''},type: {type: String,// warn 警告  error 错误  success 成功default: 'warn'}},setup () {// 定义一个对象,包含三种情况的样式,对象key就是类型字符串const style = {warn: {icon: 'icon-warning',color: '#E6A23C',backgroundColor: 'rgb(253, 246, 236)',borderColor: 'rgb(250, 236, 216)'},error: {icon: 'icon-shanchu',color: '#F56C6C',backgroundColor: 'rgb(254, 240, 240)',borderColor: 'rgb(253, 226, 226)'},success: {icon: 'icon-queren2',color: '#67C23A',backgroundColor: 'rgb(240, 249, 235)',borderColor: 'rgb(225, 243, 216)'}}return { style }}
}
</script>
<style scoped lang="less">
.xtx-message {width: 300px;height: 50px;position: fixed;z-index: 9999;left: 50%;margin-left: -150px;top: 25px;line-height: 50px;padding: 0 25px;border: 1px solid #e4e4e4;background: #f5f5f5;color: #999;border-radius: 4px;i {margin-right: 4px;vertical-align: middle;}.text {vertical-align: middle;}
}
</style>
  • 使用组件
<XtxMessage text="手机号或密码错误" type="error" />
  • 实现显示的时候动画效果
<template>
+  <Transition name="down">
+    <div class='xtx-message' :style="style" v-show="show"><!-- 上面绑定的是样式 --><!-- 不同提示图标会变 --><i class="iconfont" :class="[style[type].icon]"></i><span class="text">{{text}}</span></div>
+  </Transition>
</template><script>
+import { onMounted, ref } from 'vue'
export default {name: 'XtxMessage',props: {text: {type: String,default: ''},type: {type: String,// warn 警告  error 错误  success 成功default: 'warn'}},setup () {// 定义一个对象,包含三种情况的样式,对象key就是类型字符串const style = {warn: {icon: 'icon-warning',color: '#E6A23C',backgroundColor: 'rgb(253, 246, 236)',borderColor: 'rgb(250, 236, 216)'},error: {icon: 'icon-shanchu',color: '#F56C6C',backgroundColor: 'rgb(254, 240, 240)',borderColor: 'rgb(253, 226, 226)'},success: {icon: 'icon-queren2',color: '#67C23A',backgroundColor: 'rgb(240, 249, 235)',borderColor: 'rgb(225, 243, 216)'}}
+    // 定义一个数据控制显示隐藏,默认是隐藏,组件挂载完毕显示
+    const visible = ref(false)
+    onMounted(() => {
+      visible.value = true
+    })
+    return { style, visible }}
}
</script><style scoped lang='less'>
+.down {
+  &-enter {
+    &-from {
+      transform: translate3d(0,-75px,0);
+      opacity: 0;
+    }
+    &-active {
+      transition: all 0.5s;
+    }
+    &-to {
+      transform: none;
+      opacity: 1;
+    }
+  }
+}
// 。。。 省略
  • 封装成vue实例函数式调用
    • vue3.0使用app.config.globalProperties挂载原型方法
    • 也支持直接导入函数使用

src/components/library/Message.js

// 实现使用函数调用xtx-message组件的逻辑
import { createVNode, render } from 'vue'
import XtxMessage from './xtx-message.vue'// 准备dom容器
const div = document.createElement('div')
div.setAttribute('class', 'xtx-message-container')
document.body.appendChild(div)
// 定时器标识
let timer = nullexport default ({ type, text }) => {// 实现:根据xtx-message.vue渲染消息提示// 1. 导入组件// 2. 根据组件创建虚拟节点const vnode = createVNode(XtxMessage, { type, text })// 3. 准备一个DOM容器// 4. 把虚拟节点渲染DOM容器中render(vnode, div)// 5. 开启定时,移出DOM容器内容clearTimeout(timer)timer = setTimeout(() => {render(null, div)}, 3000)
}

src/components/library/index.js

import Message from './Message'
    // 定义指令defineDirective(app)+    // 如果你想挂载全局的属性,能够通过组件实例调用的属性   this.$message
+    app.config.globalProperties.$message = Message// 原型函数
}
  • 在登录逻辑中使用 src/views/login/index.vue
import Message from '@/components/library/Message'
          // 帐号密码登录userAccountLogin(form).then(data => {// 成功}).catch(e => {// 失败
+            Message({ type: 'error', text: '登录失败' })})

07-登录-账户登录

目的:完成以账户进行登录

定义API src/api/user.js

import request from '@/utils/request'/*** 帐号登录* @param {String} account - 用户名* @param {String} password - 密码* @returns Promise*/
export const userAccountLogin = ({ account, password }) => {return request('/login', 'post', { account, password })
}

定义修改用户信息的 mutations src/store/module/user.js

// 用户状态
export default {namespaced: true,state: () => ({id: '',
+    account:'',nickname: '',avatar: '',token: '',mobile: ''})
}

进行登录 src/views/login/index.vue

import { userAccountLogin } from '@/api/user'
import Message from '@/components/library/Message'
import { useStore } from 'vuex'
import { useRoute, useRouter } from 'vue-router'
    // 使用storeconst store = useStore()// 使用routerconst router = useRouter()// 使用routeconst route = useRoute()// 登录提交const submit = async () => {// 整体校验const valid = await target.value.validate()console.log(valid)if (valid) {// 发送请求if (!isMsgLogin.value) {// 帐号密码登录userAccountLogin(form).then(data => {// 成功// 1. 存储信息const { id, account, nickname, avatar, token, mobile } = data.resultstore.commit('user/setUser', { id, account, nickname, avatar, token, mobile })// 2. 提示Message({ type: 'success', text: '登录成功' })// 3. 跳转router.push(route.query.redirectUrl || '/')}).catch(e => {// 失败Message({ type: 'error', text: e.response.data.message || '登录失败' })})} else {// 短信登录}}}

08-登录-手机号登录

src/api/user.js实现代码

封装好发短信和进行短信登录的接口API

/*** 短信登录* @param {String} mobile - 手机号* @param {String} code - 验证码* @returns Promise*/
export const userMobileLogin = ({ mobile, code }) => {return request('/login/code', 'post', { mobile, code })
}/*** 获取短信登录验证码* @param {String} mobile - 手机号* @returns Promise*/
export const userMobileLoginMsg= (mobile) => {return request('/login/code', 'get', { mobile })
}

src/views/login/index.vue 实现代码发送短信

根据数据渲染按钮文字,绑定点击事件发送验证码:

            <span @click="send()" class="code">{{time===0?'发送验证码':`${time}秒后发送`}}</span>

使用 schma 函数来校验mobile,如果成功继续执行,不成功使用Form组件错误 setFieldError

发送验证码,需要校验手机号,和判断是否60秒内,方可发送。组件销毁时候清除定时器。

import { useIntervalFn } from '@vueuse/core'
    // pause 暂停 resume 开始// useIntervalFn(回调函数,执行间隔,是否立即开启)const time = ref(0)const { pause, resume } = useIntervalFn(() => {time.value--if (time.value <= 0) {pause()}}, 1000, false)onUnmounted(() => {pause()})// 发送短信const send = async () => {const valid = mySchema.mobile(form.mobile)if (valid === true) {// 通过if (time.value === 0) {// 没有倒计时才可以发送await userMobileLoginMsg(form.mobile)Message({ type: 'success', text: '发送成功' })time.value = 60resume()}} else {// 失败,使用vee的错误函数显示错误信息 setFieldError(字段,错误信息)formCom.value.setFieldError('mobile', valid)}}return { isMsgLogin, form, schema: mySchema, formCom, login, send, time }

src/views/login/index.vue 实现代码手机号登录

    // 使用storeconst store = useStore()// 使用routerconst router = useRouter()// 使用routeconst route = useRoute()// 登录提交const submit = async () => {// 整体校验const valid = await target.value.validate()if (valid) {// 发送请求let data = nulltry {if (!isMsgLogin.value) {// 帐号登录data = await userAccountLogin(form)} else {// 短信登录// 1. 定义两个API  短信登录,获取短信验证码// 2. 实现发送短信验证码发送功能// 3. 完成手机号短信验证码登录逻辑data = await userMobileLogin(form)}} catch (e) {Message({ type: 'error', text: e.response.data.message || '登录失败' })}// 成功// 1. 存储信息const { id, account, nickname, avatar, token, mobile } = data.resultstore.commit('user/setUser', { id, account, nickname, avatar, token, mobile })// 2. 提示Message({ type: 'success', text: '登录成功' })// 3. 跳转router.push(route.query.redirectUrl || '/')}}

09-退出登录

目的:完成退出

src/components/app-topnav.vue

        <template v-if="profile.token"><li><a href="javascript:;"><i class="iconfont icon-user"></i>{{profile.account}}</a></li><li><a @click="logout()" href="javascript:;">退出登录</a></li></template>
import { computed } from 'vue'
import { useStore } from 'vuex'
import { useRouter } from 'vue-router'
export default {name: 'AppTopnav',setup () {// 获取用户的登录信息才能控制切换导航菜单const store = useStore()// 使用vuex中的state需要设置计算属性,否则不是响应式const profile = computed(() => {return store.state.user.profile})
+    const router = userRouter()
+    const logout = () => {
+      store.commit('user/setUser',{})
+      router.push('/login')
+    }
+    return { profile, logout}}
}

相关文章:

Vue3电商项目实战-登录模块2【05-登录-表单校验、06-登录-消息提示组件封装、07-登录-账户登录、08-登录-手机号登录、09-退出登录】

文章目录05-登录-表单校验06-登录-消息提示组件封装07-登录-账户登录08-登录-手机号登录09-退出登录05-登录-表单校验 文档&#xff1a;https://vee-validate.logaretm.com/v4/ 支持vue3.0 第一步&#xff1a;安装 执行命令 npm i vee-validate4.0.3 第二步&#xff1a;导入 …...

Python 中都有哪些常见的错误和异常?

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注&#xff01; 作者| 慕课网精英讲师 朱广蔚 Python 程序的执行过程中&#xff0c;当发生错误时会引起一个事件&#xff0c;该事件被称为异常。例如&#xff1a; 如果程…...

51单片机-1

1&#xff0c;单片机内部集成了CPU&#xff0c;RAM&#xff0c;ROM&#xff0c;定时器&#xff0c;中断系统&#xff0c;通讯接口等一系列电脑的常用硬件功能。单片机和计算机相比&#xff0c;单片机是一个袖珍版计算机 2&#xff0c;单片机里有中央处理器&#xff08;CPU&…...

【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (3)-触发器详解-翻转窗口 前言 事件触发指的是存储事件&#xff0c;所以在新版的ADF 中&#xff0c;已经明确了是“存储事件”&#xff0c;…...

【项目设计】高并发内存池(三)[CentralCache的实现]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…...

2023年,35岁测试工程师只能被“优化裁员”吗?肯定不是····

国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过35岁的基层研发类员工&#xff0c;往往因为家庭原因、身体原因&#xff0c;比较难以跟得上工作…...

gitlab部署使用,jenkins部署使用

gitlab部署使用&#xff0c;jenkins部署使用在线安装gitlab下载gitlab安装gitlab使用gitlab设置中文修改管理员密码创建组,创建项目,创建用户jenkins下载jenkins安装jenkin使用jenkins更改管理员密码配置拉取代码配置登录gitlab拉取代码的账号密码配置项目配置gitlab仓库配置构…...

从零开始的机械臂yolov5抓取gazebo仿真(环境搭建篇下)

sunday功能包使用介绍以及开源 sunday我给自己机械臂的命名&#xff0c;原型是innfos的gluon机械臂。通过sw模型文件转urdf。Sunday项目主要由六个功能包sunday_description、sunday_gazebo、sunday_moveit_config、yolov5_ros、vacuum_plugin、realsense_ros_gazebo组成&…...

GCC编译器 MinGW的下载安装使用教程

哎 总所周知 gcc可以用来编译C 和C。在linux广泛应用&#xff0c;那么window怎么使用gcc呢。就要用到gcc的window工具----MInGW&#xff0c;安装好之后&#xff0c;直接可以在windows的dos界面编译。下面讲解安装使用过程。1.官网下载MinGW - Minimalist GNU for Windows downl…...

【项目实战】SpringMVC配置全局属性,是实现WebMvcConfigurer接口,还是直接继承WebMvcConfigurationSupport类?

一、说明 官方推荐以下两种方式来配置全局的SpringMVC的相关属性 方式一:实现WebMvcConfigurer接口(推荐)方式二:直接继承WebMvcConfigurationSupport类。介绍一下两者区别吧。 二、 WebMvcConfigurer介绍 WebMvcConfigurer是一个接口,用于配置全局的SpringMVC的相关属…...

房产营销、地产中介如何高效低成本获客?

数字化对企业而言&#xff0c;机遇和挑战并存。房产企业可借助数字化加强日益扩大的业务规模和业务领域管理&#xff0c;以提升管理效率&#xff0c;降低管理难度&#xff1b;基于数字化技术加强客户的服务体验&#xff0c;进而收集多业态客户和场景数据&#xff0c;拓展创新业…...

Kotlin-作用域函数

在对象的上下文中执行代码块。当您在提供lambda表达式的对象上调用这样的函数时&#xff0c;它会形成一个临时作用域。在此范围内&#xff0c;可以不带名称地访问对象。这样的函数称为作用域函数。 let run with apply also 作用域函数不会引入任何新的技术功能&#xff0c;但它…...

QNX7.1 交叉编译开源库

1.下载QNX7.1 SDK并解压 ITL:~/work/tiqnx710$ ls -l 总用量 16 drwxrwxr-x 4 xxx4096 1月 28 13:38 host -rwxrwxr-x 1 xxx 972 1月 28 13:38 qnxsdp-env.bat -rwxrwxr-x 1 xxx 1676 1月 28 13:38 qnxsdp-env.sh drwxrwxr-x 3 xxx 4096 1月 28 13:38 target xxxITL:~/work/ti…...

论文投稿指南——中文核心期刊推荐(外国语言)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…...

Fabric系列 - 链码-内部链码的特性

(1)Fabric repo下的案例 Chaincode(1.4的目录结构) fabric/examples/chaincode/go ├── example02 #一个简单的转账合约 ├── eventsender #发送事件通知 ├── passthru #调用其他链码(或者其他channel的链码)example02 (转账) 一个简单的转账合约。该链码简单实…...

NetApp SnapCenter 备份管理 ——借助应用程序一致的数据备份管理,简化混合云操作

NetApp SnapCenter 简单、可扩展、赋权&#xff1a;跨 Data Fabric 的企业级数据保护和克隆管理 主要优势 • 利用与应用程序集成的工作流和预定义策略简化备份、恢复和克隆管理。 • 借助基于存储的数据管理功能提高性能和可用性&#xff0c;并缩短测试和开发用时。 • 提供基…...

Java内置队列和高性能队列Disruptor

一、队列简介 队列是一种特殊的线性表&#xff0c;遵循先入先出、后入后出&#xff08;FIFO&#xff09;的基本原则&#xff0c;一般来说&#xff0c;它只允许在表的前端进行删除操作&#xff0c;而在表的后端进行插入操作&#xff0c;但是java的某些队列运行在任何地方插入删…...

比特数据结构与算法(第四章_下)二叉树的遍历

本章将会详细讲解二叉树遍历的四种方式&#xff0c;分别为前序遍历、中序遍历、后续遍历和层序遍历。在学习遍历之前&#xff0c;会先带大家回顾一下二叉树的基本概念。学习二叉树的基本操作前&#xff0c;需要先创建一颗二叉树&#xff0c;然后才能学习其相关的基本操作&#…...

chatGPT是什么

2022年11月&#xff0c;人工智能公司OpenAI推出了一款聊天机器人&#xff1a;ChatGPT。它能够通过学习和理解人类语言来进行对话&#xff0c;还能与聊天对象进行有逻辑的互动。除了聊天&#xff0c;ChatGPT还能够根据聊天对象提出的要求&#xff0c;进行文字翻译、文案撰写、代…...

jenkins漏洞集合

目录 CVE-2015-8103 反序列化远程代码执行 CVE-2016-0788 Jenkins CI和LTS 远程代码执行漏洞 CVE-2016-0792 低权限用户命令执行 CVE-2016-9299 代码执行 CVE-2017-1000353 Jenkins-CI 远程代码执行 CVE-2018-1000110 用户枚举 CVE-2018-1000861 远程命令执行 CVE-2018…...

用canvas画一个炫酷的粒子动画倒计时

前言 &#x1f606; 这是一篇踩在活动尾声的文章&#xff0c;主要是之前在摸鱼社群里有人发了个粒子动画的特效视频&#xff0c;想着研究研究写一篇文章出来看看&#xff0c;结果这一下子就研究了半个多月。 &#x1f602; 下面就把研究成果通过文字的形式展现出来吧&#xf…...

Java技术学习——Maven相关知识

一、什么是Maven&#xff1f; Maven是Apache软件基金会组织维护的一款专门为Java项目提供构建和依赖管理支持的工具。 1.1 构建 构建过程包含的主要环节如下&#xff1a; 清理&#xff1a;删除上一次构建的结果&#xff0c;为下一次构建做好准备编译&#xff1a;Java源程序…...

C++ 认识和了解C++

1.在使用C语言写代码的时候开头要用到的是&#xff1a; #include<iostream> using namespace std;不可以写成这样&#xff1a; #include iostream.h&#xff08;1&#xff09;iostream是输入输出流类&#xff0c; istream输入流类 cin >> ostream输出流类 cout &…...

u盘误删的文件怎么找回

u盘误删的文件怎么找回?u盘的特点之一就是极其便携&#xff0c;可以容纳各种格式的数据和文件&#xff0c;需要时可以直接使用。每次使用都会或多或少的存放一些文件&#xff0c;但有使用就会有删除&#xff0c;为了不影响使用性&#xff0c;清理存储空间是必要的。清理中如果…...

二分查找由浅入深--算法--java

二分查找写在开头算法前提&#xff1a;算法逻辑算法实现简单实现leftright可能超过int表示的最大限度代码分析和变换更多需求&#xff1a;求索引最小的值java二分API应用基础题思考难度方法写在开头 二分查找应该是算比较简单的这种算法了&#xff0c;我本以为还可以。但有时候…...

【学习】笔记本电脑重新安装系统win10

安装系统有很多方法: 软件安装制作启动u盘本文使用的方法就是启动盘安装: 1.首先下载iso镜像文件: msdn我告诉你:MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn) 2.下载启动盘制作工具: 制作启动盘rufus:Rufus - 轻松创建 USB 启动盘 3.官网下载: https://do…...

RocketMQ的一些使用理解

1.RocketMQ的生产者生产负载策略&#xff08;3种&#xff09; (1)SelectMessageQueueByHash &#xff08;一致性hash&#xff09; (2)SelectMessageQueueByMachineRoom &#xff08;机器随机&#xff09; (3)SelectMessageQueueByRandom &#xff08;随机&#xff09; 第1种一…...

Java枚举详解

一.枚举 1.为什么有枚举&#xff1f; 如果我们的程序需要表示固定的几个值&#xff1a; 比如季节&#xff1a;spring (春)&#xff0c;summer(夏)&#xff0c;autumn(秋)&#xff0c;winter(冬) 用常量表示&#xff1a; public static final int SEASON_SPRING 1;public st…...

虚拟机上安装openKylin详细步骤总结

一、创建虚拟机 首先获取操作系统安装镜像文件&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tSuXmDk2ZILR4ieee6iImw?pwdcy47 提取码&#xff1a;cy47 &#xff08;1-1&#xff09;进入新虚拟机创建向导&#xff0c;选择“自定义”&#xff1a; &#xff08;1-…...

夜天之书 #74 企业开源的软件协议模型实践(Part 2)

在上一篇文章中&#xff0c;我介绍了企业开源的完全开放源码策略及其风险。完全开放源码&#xff0c;即以符合开源定义的软件协议发布企业自研软件的情形。本文介绍应对完全开放源码后的风险的第一种策略&#xff1a;提高市场占有率与开放标准。与其说是策略&#xff0c;不如说…...

什么是培训网站建设/新手做外贸怎么入门

2019独角兽企业重金招聘Python工程师标准>>> RMI:远程方法调用(Remote Method Invocation)。能够让在某个java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。 RMI远程调用步骤&#xff1a; 1&#xff0c;客户对象调用客户端辅助对象上的…...

什么更新wordpress/十大计算机培训学校

grep&#xff1a;文本过滤器 能够根据指定的模式去查找匹配到模式的行&#xff0c;并将相应的行显示出来。 sed&#xff1a;流编辑器 默认的编辑结果不会保存到原文件当中而是输出到屏幕上。 一、awk&#xff1a;报告生成器 从文本文件当中抽取符合条件的信息&#xff0c;并以特…...

设计制作合同交印花税吗/十大seo免费软件

一份重要的word文挡因损坏而无法打开&#xff0c;将导致很严重的后果。遇到这样的情况&#xff0c;可以通过下面的方法来修复word文挡。 方法一&#xff1a;利用word2002/2003的“打开并修复”功能来修复文挡。(1)启动word2002/2003&#xff0c;单击“文件-----打开”&#…...

哪些网站做财金的好/最新seo黑帽技术工具软件

优先级队列(堆1.二叉树的顺序存储1.1存储方式1.2 二叉树的节点编号关系2.堆概念2.1 概念2.2 堆的一些基本操作2.2.1 简单操作2.2.2 向最大堆中添加一个新元素2.2.3 删除最大堆中的最大值元素1.二叉树的顺序存储 1.1存储方式 完全二叉树/满二叉树建议使用顺序表存储因为没有空…...

做系统去哪个网站好/qq群排名优化软件官网

文章目录文章参考file-loader应用场景安装案例 —— 引入字体库的配置url-loader(升级版)安装案例——图片打包file-loader 与 url-loader 的区别&#xff1f;webpack打包html里面img后src为“[object Module]”问题?文章参考 url-loader github file-loader 官方解释&…...

郑州市公司网站开发设计/正规排名网站推广公司

老李分享&#xff1a;robotium常用API robotium常用API Robotium中最重要的类Solo类&#xff1a;其中提供了模拟用户活动的点击、搜索、拖拽等方法。 英文api(经常断开连接打不开):http://www.jarvana.com/jarvana/view/com/jayway/android/robotium/robotium-solo/2.0.1/robot…...