人力资源管理后台 === 上传+权限数据

目录

1.员工详情-封装员工头像组件

2.员工详情-上传图片-创建腾讯云存储桶

3.员工详情-使用cos-sdk完成上传

4. 权限管理-搭建权限页面

5.权限管理-获取数据转化树形

6.权限管理-作业

7.权限应用-权限概念

8.权限应用-员工分配角色-弹出层

9.权限应用-员工分配角色-回显数据并提交

9.权限应用-给角色分配权限-弹出层

10.权限应用-角色分配权限-显示已有权限数据

11.权限应用-角色分配权限-确定提交


1.员工详情-封装员工头像组件

image.png

image.png

  • 创建image-upload组件-代码位置(src/views/employee/components/image-upload.vue)
<template><el-uploadclass="avatar-uploader"action="":show-file-list="false":before-upload="beforeAvatarUpload"><!-- (自动上传)action是上传地址 人资项目不需要 人资项目(手动上传)  --><!-- show-file-list不展示列表 --><img v-if="value" :src="value" class="avatar"><i v-else class="el-icon-plus avatar-uploader-icon" /></el-upload>
</template><script>
export default {props: {value: {type: String,default: ''}},methods: {// 检查函数 判断文件的类型还有大小 return  true(继续上传)/false(停止上传)beforeAvatarUpload(file) {// jpeg png gif bmpconst isJPG = ['image/jpeg', 'image/png', 'image/gif', 'image/bmp'].includes(file.type)const isLt2M = file.size / 1024 / 1024 < 5 // 5Mif (!isJPG) {this.$message.error('上传头像图片只能是 JPG PNG GIF BMP 格式!')}if (!isLt2M) {this.$message.error('上传头像图片大小不能超过 5MB!')}return isJPG && isLt2M}}
}
</script><style>.avatar-uploader .el-upload {border: 1px dashed #d9d9d9;border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;}.avatar-uploader .el-upload:hover {border-color: #409EFF;}.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;line-height: 178px;text-align: center;}.avatar {width: 178px;height: 178px;display: block;}
</style>
  • 在父组件中应用-代码位置(src/views/employee/detail.vue)
  <image-upload v-model="userInfo.staffPhoto" />

2.员工详情-上传图片-创建腾讯云存储桶

image.png


 

image.png


1.注册腾讯云账号-课前完成登录 - 腾讯云
2.创建腾讯云存储桶
3.得到应用密钥和应用标识

  • 创建存储桶

image.png


 

image.png


 

image.png


 

image.png


 

image.png

image.png

获取存储桶相关信息

image.png

将存储桶和所属地域拷贝下来,备用

  • 获取应用标识登录 - 腾讯云

image.png

将SecretId和SecretKey拷贝下来,备用

3.员工详情-使用cos-sdk完成上传

image.png

  • 安装腾讯云js-sdk
$ npm i cos-js-sdk-v5 
$ yarn add  cos-js-sdk-v5
  • 使用el-upload自定义上传-代码位置(src/views/employee/components/image-upload.vue)
<template><el-uploadclass="avatar-uploader"action="":show-file-list="false":before-upload="beforeAvatarUpload":http-request="uploadImage"><!-- (自动上传)action是上传地址 人资项目不需要 人资项目(手动上传)  --><!-- show-file-list不展示列表 --><img v-if="value" :src="value" class="avatar"><i v-else class="el-icon-plus avatar-uploader-icon" /></el-upload>
</template>
  • 实现上传方法-代码位置
    // 选择图片上传uploadImage(params) {console.log(params.file)const cos = new COS({SecretId: 'AKIDDSdjgnjT1NZ3a7VjkfVIwOdfv9IH2b8e',SecretKey: 'WEwe9WJ9vLeq1BHNLLKF5Up10ndUDk24'}) // 完成cos对象的初始化cos.putObject({Bucket: 'heimachengxuyuan-1302806742', // 存储桶名称Region: 'ap-nanjing', // 地域名称Key: params.file.name, // 文件名称StorageClass: 'STANDARD', // 固定值Body: params.file // 文件对象}, (err, data) => {if (data.statusCode === 200 && data.Location) {// 拿到了腾讯云返回的地址// 通过input自定义事件将地址传出去this.$emit('input', 'http://' + data.Location) // 将地址返回了} else {this.$message.error(err.Message) // 上传失败提示消息}})}

这里需要使用 上个小节准备好的存储桶的名称-地域名称-应用标识-应用密钥

这里需要知道Cos的初始化和上传的方法
 

image.png

image.png

4. 权限管理-搭建权限页面

image.png

  • 实现权限管理的页面结构-代码位置(src/views/permission/index.vue)
<template><div class="container"><div class="app-container"><el-button class="btn-add" size="mini" type="primary">添加权限</el-button><el-table><el-table-column label="名称" /><el-table-column label="标识" /><el-table-column label="描述" /><el-table-column label="操作"><el-button size="mini" type="text">添加</el-button><el-button size="mini" type="text">编辑</el-button><el-button size="mini" type="text">删除</el-button></el-table-column></el-table></div></div>
</template>
<script>
export default {name: 'Permission'
}
</script>
<style>
.btn-add {margin: 10px;
}
</style>

5.权限管理-获取数据转化树形

image.png

  • 封装获取权限API-代码位置(src/api/permission.js)
import request from '@/utils/request'/** ** 获取权限列表* **/export function getPermissionList() {return request({url: '/sys/permission'})
}
  • 获取数据-转化树形-控制二级权限不显示添加按钮(src/views/permission/index.vue)
<template><div class="container"><div class="app-container"><el-button class="btn-add" size="mini" type="primary">添加权限</el-button><el-table default-expand-all :data="list" row-key="id"><el-table-column prop="name" label="名称" /><el-table-column prop="code" label="标识" /><el-table-column prop="description" label="描述" /><el-table-column label="操作"><template v-slot="{ row }"><el-button v-if="row.type === 1" size="mini" type="text">添加</el-button><el-button size="mini" type="text">编辑</el-button><el-button size="mini" type="text">删除</el-button></template></el-table-column></el-table></div></div>
</template>
<script>
import { getPermissionList } from '@/api/permission'
import { transListToTreeData } from '@/utils'
export default {name: 'Permission',data() {return {list: []}},created() {this.getPermissionList()},methods: {async getPermissionList() {this.list = transListToTreeData(await getPermissionList(), 0) // 将列表数据转化成树形结构}}
}
</script>
<style>
.btn-add {margin: 10px;
}
</style>

6.权限管理-作业

基于权限接口和线上效果完成 权限点的新增- 删除- 编辑

image.png

image.png

要求:

  1. 实现新增-删除-编辑功能
  2. 编辑模式不做限制-弹层-行内-跳转都可
  3. 注意:二级权限和一级权限的区别为type,当type为1时,为一级权限,当type为2时,为二级权限
  4. 二级权限应该添加在一级权限下,二者是通过id和pid进行关联的,其类似于组织架构中的添加子部门。

作业实现

  1. 封装权限管理的API接口-代码位置(src/api/permission.js)
// 新增权限
export function addPermission(data) {return request({url: '/sys/permission',method: 'post',data})
}// 更新权限
export function updatePermission(data) {return request({url: `/sys/permission/${data.id}`,method: 'put',data})
}// 删除权限
export function delPermission(id) {return request({url: `/sys/permission/${id}`,method: 'delete'})
}
// 获取权限详情
export function getPermissionDetail(id) {return request({url: `/sys/permission/${id}`})
}

2.新增编辑权限的弹层-代码位置(src/views/permission/index.vue)

<!-- 放置一个弹层 用来编辑新增节点 --><el-dialog :title="`${showText}权限点`" :visible="showDialog" @close="btnCancel"><!-- 表单 --><el-form ref="perForm" :model="formData" :rules="rules" label-width="120px"><el-form-item label="权限名称" prop="name"><el-input v-model="formData.name" style="width:90%" /></el-form-item><el-form-item label="权限标识" prop="code"><el-input v-model="formData.code" style="width:90%" /></el-form-item><el-form-item label="权限描述"><el-input v-model="formData.description" style="width:90%" /></el-form-item><el-form-item label="开启"><el-switchv-model="formData.enVisible"active-value="1"inactive-value="0"/></el-form-item></el-form><el-row slot="footer" type="flex" justify="center"><el-col :span="6"><el-button size="small" type="primary" @click="btnOK">确定</el-button><el-button size="small" @click="btnCancel">取消</el-button></el-col></el-row></el-dialog>

声明弹层需要的变量和表单数据和校验规则-代码位置(src/views/permission/index.vue)

import { getPermissionList, updatePermission, addPermission, getPermissionDetail, delPermission } from '@/api/permission'
import { transListToTreeData } from '@/utils'
export default {data() {return {list: [],formData: {name: '', // 名称code: '', // 标识description: '', // 描述type: '', // 类型 该类型 不需要显示 因为点击添加的时候已经知道类型了pid: '', // 因为做的是树 需要知道添加到哪个节点下了enVisible: "0" // 默认关闭},rules: {name: [{ required: true, message: '权限名称不能为空', trigger: 'blur' }],code: [{ required: true, message: '权限标识不能为空', trigger: 'blur' }]},showDialog: false}},computed: {showText() {return this.formData.id ? '编辑' : '新增'}},created() {this.getPermissionList()},methods: {async  getPermissionList() {this.list = transListToTreeData(await getPermissionList(), 0)}}}
  1. 实现一级权限新增-二级权限新增-代码位置(src/views/permission/index.vue)

添加一级权限-

image.png

<el-button class="btn-add" size="mini" type="primary" @click="addPermission(row.id, 1)">添加权限</el-button>

添加二级权限-

image.png

注意:一级添加的type为1, 二级添加的type为2

点击添加调用的方法

   addPermission(pid, type) {this.formData.pid = pidthis.formData.type = typethis.showDialog = true},

实现确定和取消方法

btnOK() {this.$refs.perForm.validate().then(() => {if (this.formData.id) {return updatePermission(this.formData)}return addPermission(this.formData)}).then(() => {//  提示消息this.$message.success('新增成功')this.getPermissionList()this.showDialog = false})},btnCancel() {this.formData = {name: '', // 名称code: '', // 标识description: '', // 描述type: '', // 类型 该类型 不需要显示 因为点击添加的时候已经知道类型了pid: '', // 因为做的是树 需要知道添加到哪个节点下了enVisible: "0" // 默认关闭}this.$refs.perForm.resetFields()this.showDialog = false},

实现编辑弹层

<el-button type="text" size="mini" @click="editPermission(row.id)">编辑</el-button>

点击编辑方法

 async editPermission(id) {// 根据获取id获取详情this.formData = await getPermissionDetail(id)this.showDialog = true
}

点击删除

<el-button type="text" size="mini" @click="delPermission(row.id)"> 删除</el-button>

删除方法

  // 删除操作async delPermission(id) {try {await this.$confirm('确定要删除该数据吗')await delPermission(id)this.getPermissionList()this.$message.success('删除成功')} catch (error) {console.log(error)}},

7.权限应用-权限概念

image.png

image.png

权限是通过角色这个中间人实现,首先员工拥有角色,角色拥有权限,那么员工自动拥有了角色所对应的权限。

所以接下来,我们需要实现 给员工分配角色,给角色分配权限。

  • 分配过程-给员工分角色

image.png

  • 分配过程-给角色分权限

image.png

8.权限应用-员工分配角色-弹出层

image.png

image.png

image.png

  • 封装获取可用角色的API-代码位置(src/api/employee.js)
/*** 获取可用的角色* **/export function getEnableRoleList() {return request({url: '/sys/role/list/enabled'})
}
  • 声明变量控制弹层显示-和角色列表-代码位置(src/views/employee/index.vue)
data () {return {showRoleDialog: false, // 用来控制角色弹层的显示roleList: [], // 接收角色列表roleIds: [] // 用来双向绑定数据的}
}
  • 点击角色按钮-获取角色列表-代码位置(src/views/employee/index.vue)
// 点击角色按钮弹出层async btnRole() {this.showRoleDialog = truethis.roleList = await getEnableRoleList()}
  • 放置弹层-绑定变量和渲染checkbox-代码位置(src/views/employee/index.vue)
<el-dialog :visible.sync="showRoleDialog" title="分配角色"><!-- 弹层内容 --><!-- checkbox --><el-checkbox-group v-model="roleIds"><!-- 放置n个的checkbox  要执行checkbox的存储值 item.id--><el-checkboxv-for="item in roleList":key="item.id":label="item.id">{{ item.name }}</el-checkbox></el-checkbox-group>
</el-dialog>

9.权限应用-员工分配角色-回显数据并提交

image.png

  • 封装给员工分配角色的接口-代码位置(src/api/employee.js)
/*** 分配员工角色* ***/export function assignRole(data) {return request({url: '/sys/user/assignRoles',method: 'put',data})
}
  • 点击角色按钮时,获取员工已经拥有的角色,并记录当前点击的用户id-代码位置(src/views/employee/index.vue)

    在data中声明一个id用来记录

data () {return  {currentUserId: null // 用来记录当前点击的用户id}
}
async btnRole(id) {this.roleList = await getEnableRoleList()// 记录当前点击的id 因为后边 确定取消要存取给对应的用户this.currentUserId = idconst { roleIds } = await getEmployeeDetail(id)this.roleIds = roleIdsthis.showRoleDialog = true // 调整顺序
},

注意,这里我们特地调整了弹层的顺序,因为获取已经拥有的角色是一个异步的过程,如果弹层显示在前,会出现卡顿的效果,表现出缓慢的效果,所以等到获取所有数据之后再弹层。

  • 点击确定实现给用户分配角色-代码位置(src/views/employee/index.vue)
 // 点击角色的确定async  btnRoleOK() {await assignRole({id: this.currentUserId,roleIds: this.roleIds})this.$message.success('分配用户角色成功')this.showRoleDialog = false}
  • 取消关闭弹层-代码位置(src/views/employee/index.vue)
<el-row slot="footer" type="flex" justify="center"><el-col :span="6"><el-button type="primary" size="mini" @click="btnRoleOK">确定</el-button><el-button size="mini" @click="showRoleDialog = false">取消</el-button></el-col>
</el-row>

9.权限应用-给角色分配权限-弹出层

image.png

image.png

  • 声明变量控制弹层显示和接收权限数据-代码位置(src/views/role/index.vue)
data () {return {showPermissionDialog: false,permissionData: []}
}
  • 点击分配权限-弹出层-获取数据并转化树形-代码位置(src/views/role/index.vue)
<el-button size="mini" type="text" @click="btnPermission">分配权限</el-button>
async  btnPermission() {this.showPermissionDialog = truethis.permissionData = transListToTreeData(await getPermissionList(), 0)
}
  • 放置弹层和树组件-代码位置(src/views/role/index.vue)
<!-- 放置权限弹层 --><el-dialog :visible.sync="showPermissionDialog" title="分配权限"><!-- 放置权限数据 --><el-tree:data="permissionData":props="{ label: 'name' }"show-checkboxdefault-expand-all/></el-dialog>

10.权限应用-角色分配权限-显示已有权限数据

image.png

image.png

  • 封装获取角色详情的API-代码位置(src/api/role.js)
/*** 获取角色详情* **/export function getRoleDetail(id) {return request({url: `/sys/role/${id}`})
}
  • 声明变量记录当前点击的角色id和角色所拥有的权限数据-代码位置(src/views/role/index.vue)
data () {return {currentRoleId: null,permIds: []}
}
  • 点击分配权限按钮时传递角色id,并根据id获取该角色所拥有的权限-代码位置(src/views/role/index.vue)
<el-button size="mini" type="text" @click="btnPermission(row.id)">分配权限</el-button>
async  btnPermission(id) {this.currentRoleId = idconst { permIds } = await getRoleDetail(id)this.permIds = permIdsthis.permissionData = transListToTreeData(await getPermissionList(), 0)this.showPermissionDialog = true
}
  • 设置el-tree组件的属性-node-key和当前选中数据-代码位置(src/views/role/index.vue)
<el-treenode-key="id":data="permissionData":props="{ label: 'name' }"show-checkboxdefault-expand-all:default-checked-keys="permIds"/>

default-checked-keys的属性是设置当前选中的节点,但是必须配合node-key属性,因为permIds变量中存储的都是id,必须el-tree组件知道key是哪个字段,所以设置node-key="id"

11.权限应用-角色分配权限-确定提交

image.png

  • 封装分配权限的接口API-代码位置(src/api/role.js)
/*** 给角色分配权限** ***/export function assignPerm(data) {return request({url: '/sys/role/assignPrem',method: 'put',data})
}
  • 确定和取消事件-代码位置(src/views/role/index.vue)
 <el-row slot="footer" type="flex" justify="center"><el-col :span="6"><el-button type="primary" size="mini" @click="btnPermissionOK">确定</el-button><el-button size="mini" @click="showPermissionDialog = false">取消</el-button></el-col></el-row>// 点击确定时触发async  btnPermissionOK() {await assignPerm({id: this.currentRoleId,permIds: this.$refs.permTree.getCheckedKeys()})this.$message.success('角色分配权限成功')this.showPermissionDialog = false}

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

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

相关文章

【EMFace】《EMface: Detecting Hard Faces by Exploring Receptive Field Pyramids》

arXiv-2021 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Ablation Study5.3 Comparison with State-of-the-Arts 6 Conclusion&#xff08;own&#xff09; 1 Background and Motivatio…

Spring 中存储 Bean 的相关注解

Bean的存 IoC控制反转&#xff0c;就是将对象的控制权交给Spring的IOC容器&#xff0c;由IOC容器创建及管理对象。 也就是bean的存储 类注解:五大注解 Controller&#xff08;控制器存储&#xff09; Service&#xff08;服务存储&#xff09; Component&#xff08;组件存储…

深思:C与C++相互调用问题

背景 上周&#xff0c;偶然看到同事愁眉苦脸的样子&#xff0c;便善意咨询了下发生了什么。简单沟通下&#xff0c;才知道他遇到了一个工程编译的问题&#xff0c;一直无法编译通过&#xff0c;困扰了他快一天时间。出于个人的求知欲和知识的渴望&#xff0c;我便主动与他一同分…

【数据结构】堆的实现

目录 1. 前言2. 堆的实现2.1 初始化2.2 插入2.2.1 分析2.2.1.1 情况一2.2.1.2 情况二2.2.1.3 情况三 2.2.2 插入代码实现2.2.2.1 向上调整代码 2.3 删除2.3.1 分析2.3.2 删除代码实现2.3.2.1 向下调整代码 2.4 找根节点数据2.5 元素个数2.6 判空2.7 销毁 3. 源代码3.1 Heap.h3.…

许战海战略文库|主品牌升级为产业技术品牌,引领企业全球化发展

在当今高速发展的全球经济中&#xff0c;企业品牌已经成为其核心资产之一。这不仅仅是因为品牌可以为消费者带来识别度&#xff0c;更重要的是&#xff0c;它们可以为企业带来深厚的竞争壁垒。但对于许多企业来说&#xff0c;特别是技术密集型企业&#xff0c;仅仅依靠主品牌的…

如何让消费者接受品牌,口碑营销怎么做?

当新品牌进入小红书时&#xff0c;如何进行口碑营销是一个重要的问题。很多新品牌在刚刚进入小红书时&#xff0c;对于一些敏感时机把握的不准其实本质上&#xff0c;就是不明白什么阶段该做什么事。今天分享的就是如何让消费者接受品牌&#xff0c;口碑营销怎么做&#xff1f;…

NX二次开发UF_CURVE_ask_spline_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_spline_data Defined in: uf_curve.h int UF_CURVE_ask_spline_data(tag_t spline_tag, UF_CURVE_spline_p_t spline_data ) overview 概述 Reads the spline data a…

Java核心知识点整理大全18-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

Linux驱动开发——网络设备驱动(理论篇)

目录 一、前言 二、网络层次结构 三、网络设备驱动核心数据结构和函数 一、前言 网络设备驱动是 Linux 的第三大类驱动&#xff0c;也是我们学习的最后一类 Linux 驱动。这里我们首先简单学习一下网络协议层次结构&#xff0c;然后简单讨论 Linux 内核中网络实现的层次结构。…

接口测试工具(Jmeter)必学技巧

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Cho…

【知网稳定检索】2024年应用经济学,管理科学与社会发展国际学术会议(AEMSS 2024)

2024年应用经济学&#xff0c;管理科学与社会发展国际学术会议&#xff08;AEMSS 2024&#xff09; 2024 International Conference on Applied Economics, Management Science and Social Development 2024年应用经济学&#xff0c;管理科学与社会发展国际学术会议&#xff…

uniapp在H5端实现PDF和视频的上传、预览、下载

上传 上传页面 <u-form-item :label"(form.ququ3 1 ? 参培 : form.ququ3 2 ? 授课 : ) 证明材料" prop"ququ6" required><u-button click"upload" slot"right" type"primary" icon"arrow-upward" t…

流媒体播放器EasyPlayer播放H.265与H.264时进度条样式异常该如何解决?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

网易云音乐7天黑胶VIP会员免费领取入口怎么领取网易云音乐黑胶VIP7天会员?

网易云音乐7天黑胶VIP会员免费领取入口怎么领取网易云音乐黑胶VIP7天会员&#xff1f; 1、百度搜索「词令」&#xff0c;在搜索框内输入词令「vip163」关键词直达口令&#xff0c;进入网易云音乐7天黑胶VIP会员免费领取入口&#xff1b; 2、输入网易云音乐黑胶VIP7天会员领取词…

AJAX技术-04-- 跨域说明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1 同源策略同源策略介绍规定要求 请求协议://域名:端口号 关于同源策略练习关于同源策略总结 2.JSONPJSONP原理说明关于JSONP优化 3.CORS介绍介绍不允许跨域说明跨域…

Cascader 级联选择器动态加载数据的回显

如果后端没有只返回第三级的id,而是同时把第三级的名字一起返回了&#xff0c;那么就可以通过下面的方法来实现 1.在级联选择器里面加上这句代码 placeholder"请选择" 2.注册一个字符串 pleasett:"" 3.赋值 如过后端返回的有第三级的选项名 直接进行赋…

【WP】Geek Challenge 2023 web 部分wp

官方出的题很好 学到很多东西 前面几道入门提就不写了 klf_ssti 目录扫描扫到一个robots.txt 打开存在hack路径&#xff0c;查看源码存在klf 传参,结合题目 就是ssti注入了&#xff0c;然后使用tplmap工具发现是盲注&#xff0c;我们这里直接用脚本找popen&#xff1a; im…

一键修复0xc000007b错误代码,科普关于0xc000007b错误的原因

最近很多用户都有遇到过0xc000007b错误的问题&#xff0c;出现这样的问题想必大家都会手足无措吧&#xff0c;其实解决这样的问题也有很简单的解决方法&#xff0c;这篇文章就来教大家如何一键修复0xc000007b&#xff0c;同时给大家科普一下关于0xc000007b错误的原因&#xff0…

Redis多机数据库

文章目录 Redis多机数据库一、主从复制1、旧版复制功能的实现a、同步b、命令传播 2、旧版复制功能的缺陷3、新版复制功能的实现a、部分同步功能b、复制实现步骤 4、心跳检测 二、哨兵1、Sentinel概念2、Sentinel初始化流程3、故障转移过程 三、集群1、几个概念2、集群创建流程a…

逆袭之战,线下门店如何在“?”萧条的情况下实现爆发增长?

未来几年&#xff0c;商业走势将受到全球经济形势、科技进步和消费者需求变化等多种因素的影响。随着经济复苏和消费者信心提高&#xff0c;消费市场将继续保持增长&#xff0c;品质化、个性化、智能化等将成为消费趋势。同时&#xff0c;线上购物将继续保持快速增长&#xff0…