javaScript蓝桥杯----商城管理系统

news2024/11/28 0:33:17

目录

  • 一、介绍
  • 二、准备
  • 三、目标
  • 四、代码
  • 五、完成


一、介绍

在商城管理系统中,超级管理员和普通管理员因为权限不同,登录进入后看到的菜单也会是不同的。

本题需要你完成商城管理系统中权限数据的处理。

二、准备

开始答题前,需要先打开本题的项目代码文件夹,目录结构如下:

├── css
├── images
├── js
│   ├── auth.js
│   └── menu.js
├── effect.gif
├── login.html
└── index.html

其中:

css 是样式文件夹。
images 是图片文件夹。
login.html 是登录页。
index.html 是商城首页。
js/menu.js 是渲染左侧菜单的 js 文件。
js/auth.js 是需要补充代码的 js 文件。
effect.gif 是最终完成的效果图。

在浏览器中预览 login.html 页面效果如下
在这里插入图片描述

三、目标

请在 js/auth.js 文件中补全 getMenuListAndAuth 函数代码。

在登录页 login.html 点击管理员登录和超级管理员登录时会根据管理员的权限不同,在商城首页 index.html 的左侧显示不同的菜单列表。但是后端同学给的数据是不符合前端展示要求的,所以我们需要做些处理,假如后端提供的数据是这样的:

[
  { parentId: -1, name: "商品管理", id: 1, auth: "cart" },
  { parentId: 1, name: "商品列表", id: 4, auth: "cart-list" },
  { parentId: -1, name: "添加管理员", id: 10, auth: "admin" },
];

其中数据中对象字段的含义说明:

  • id 表示当前节点
  • parentId 表示父级节点,如果为 -1 则表示顶级数据
  • auth 表示权限
    具体需求如下:
  1. 将待处理数据(一维数组)根据 parentId 字段值处理成树形结构存入 menus 变量中。

把数据处理成如下格式(每一项都必须有 children 字段,没有子级时,children 为空数组):

[
  {
    parentId: -1,
    name: "商品管理",
    id: 1,
    auth: "cart",
    children: [
      {
        parentId: 1,
        name: "商品列表",
        id: 4,
        auth: "cart-list",
        children: [],
      },
    ],
  },
  {
    parentId: -1,
    name: "添加管理员",
    id: 10,
    auth: "admin",
    children: [],
  },
];

注意:js/auth.js 中的 menuList 仅为后端返回的数据结构示例,非固定数据。实际使用中,后端返回的数据转化成树形结构时层级可能更多,封装方法时务必考虑通用性。

  1. 将待处理数据中的 auth 字段提取出来并存入 auths 变量中,左侧菜单会根据传入的权限列表数组和 auths 对比后进行菜单渲染。
    经过 getMenuListAndAuth 处理后 auths 的结果为:
["cart", "cart-list", "admin"];

完成后的效果见文件夹下面的 gif 图,图片名称为 effect.gif(提示:可以通过 VS Code 或者浏览器预览 gif 图片)。
在这里插入图片描述

四、代码

login.html

<!DOCTYPE html>
<html>
<head>
    <title>商城管理系统</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <link href="css/login.css" rel="stylesheet" type="text/css">
<body>
    <div class="main">
        <div class="container">
            <h2>立即登录</h2>
            <input type="text" value="admin" />
            <input value="PASSWORD" name="Password" type="password" />
            <span><input type="checkbox" checked />记住我</span>
            <h6><a href="#">忘记密码?</a></h6>
            <div class="clear">
                <input type="submit" onclick="adminLogin()" value="管理员登录">
                <input type="submit" onclick="superLogin()" value="超级管理员登录">
            </div>
            <p>还没有账号?<a href="#">立即注册</a></p>
        </div>
    </div>
    <footer>
        <p>&copy; 2022 蓝桥杯 | 商城管理系统 <a>bootstrap搭建</a></p>
    </footer>
    <script>
        let adminLogin = () => {
            window.location.href = "./index.html?name=admin";
        }
        let superLogin = () => {
            window.location.href = "./index.html?name=super";
        }
    </script>
</body>

</html>

index.html

<!DOCTYPE html>
<html>
  <head>
    <title>商城管理系统</title>
    <meta charset="UTF-8" />
    <link href="css/bootstrap.min.css" rel="stylesheet" type="text/css" />
    <link href="css/style.css" rel="stylesheet" type="text/css" />
  </head>
  <body class="skin-black">
    <header class="header">
      <a href="index.html" class="logo"> 商城管理系统 </a>
      <nav class="navbar navbar-static-top">
        <div class="navbar-right">
          <ul class="nav navbar-nav">
            <li class="dropdown">
              <a href="./login.html" class="dropdown-toggle">
                <span>退出</span>
              </a>
            </li>
          </ul>
        </div>
      </nav>
    </header>
    <div class="wrapper row-offcanvas row-offcanvas-left">
      <div class="left-side sidebar-offcanvas">
        <section class="sidebar">
          <div class="user-panel">
            <div class="pull-left image">
              <img src="images/admin.jpg" class="img-circle" alt="User Image" />
            </div>
            <div class="pull-left info">
              <p id="admin">你好,管理员</p>
              <a href="#">
                <i class="text-success">在线</i>
              </a>
            </div>
          </div>
          <!-- 左侧菜单栏 -->
          <ul id="sidebarmenu" class="text-success"></ul>
        </section>
      </div>
      <div class="right-side">
        <section class="content">
          <div class="row" style="margin-bottom: 5px">
            <div class="col-md-3">
              <div class="sm-st clearfix">
                <span class="sm-block-icon block-red">1</span>
                <div class="sm-block-info">
                  <span>3200</span>
                  商城访问量
                </div>
              </div>
            </div>
            <div class="col-md-3">
              <div class="sm-st clearfix">
                <span class="sm-block-icon block-violet">2</span>
                <div class="sm-block-info">
                  <span>2200</span>
                  售出商品数
                </div>
              </div>
            </div>
            <div class="col-md-3">
              <div class="sm-st clearfix">
                <span class="sm-block-icon block-blue">3</span>
                <div class="sm-block-info">
                  <span>100,320</span>
                  总销售额
                </div>
              </div>
            </div>
            <div class="col-md-3">
              <div class="sm-st clearfix">
                <span class="sm-block-icon block-green">4</span>
                <div class="sm-block-info">
                  <span>4567</span>
                  总利润
                </div>
              </div>
            </div>
          </div>
          <div class="row">
            <div class="col-md-12">
              <section class="panel">
                <header class="panel-heading">热销商品</header>
                <div class="panel-body table-responsive">
                  <table class="table table-hover">
                    <thead>
                      <tr>
                        <th>#</th>
                        <th>商品名称</th>
                        <th>库存</th>
                        <th>上架时间</th>
                        <th>状态</th>
                        <th>售出量</th>
                      </tr>
                    </thead>
                    <tbody>
                      <tr>
                        <td>1</td>
                        <td>macbook pro 2021</td>
                        <td>1000</td>
                        <td>1/5/2022</td>
                        <td><span class="label label-info">余量充足</span></td>
                        <td><span class="badge badge-info">50%</span></td>
                      </tr>
                      <tr>
                        <td>2</td>
                        <td>macbook pro 2019</td>
                        <td>3000</td>
                        <td>06/08/2021</td>
                        <td><span class="label label-success">已售罄</span></td>
                        <td><span class="badge badge-success">100%</span></td>
                      </tr>
                      <tr>
                        <td>3</td>
                        <td>iphone 12</td>
                        <td>520</td>
                        <td>10/12/2019</td>
                        <td><span class="label label-info">余量充足</span></td>
                        <td><span class="badge badge-info">75%</span></td>
                      </tr>
                      <tr>
                        <td>4</td>
                        <td>Xiaomi 12 Pro</td>
                        <td>400</td>
                        <td>03/22/2022</td>
                        <td><span class="label label-info">余量充足</span></td>
                        <td><span class="badge badge-info">65%</span></td>
                      </tr>
                      <tr>
                        <td>5</td>
                        <td>Hua Wei Meta 40</td>
                        <td>730</td>
                        <td>03/11/2022</td>
                        <td>
                          <span class="label label-warning">即将售罄</span>
                        </td>
                        <td><span class="badge badge-danger">95%</span></td>
                      </tr>
                      <tr>
                        <td>6</td>
                        <td>Hua Wei Meta V30</td>
                        <td>300</td>
                        <td>05/11/2019</td>
                        <td>
                          <span class="label label-warning">即将售罄</span>
                        </td>
                        <td><span class="badge badge-danger">95%</span></td>
                      </tr>
                    </tbody>
                  </table>
                </div>
              </section>
            </div>
          </div>
        </section>
      </div>
    </div>
    <script src="./js/auth.js "></script>
    <script src="./js/menu.js "></script>
  </body>
</html>

js/auth.js

// menuList 仅为示例数据,非实际使用数据,实际使用数据层级不确定(可能是四级五级六级等),数据结构与 menuList 一致
// 1. `parentId` 如果为 `-1`,则表示此条数据为顶级数据。
// 2. `parentId` 为该条数据的父级数据的 `id`。

let menuList = [
  { parentId: -1, name: "添加管理员", id: 10, auth: "admin" },
  { parentId: 10, name: "管理员权限分配", id: 11, auth: "admin-auth" },
  { parentId: -1, name: "商品管理", id: 1, auth: "product" },
  { parentId: 1, name: "商品列表", id: 4, auth: "productList" },
  { parentId: 4, name: "商品分类", id: 5, auth: "category" },
  { parentId: 5, name: "添加分类", id: 8, auth: "addClassification" },
  { parentId: 4, name: "商品上架", id: 6, auth: "product" },
  { parentId: -1, name: "评论管理", id: 2, auth: "comments" },
  { parentId: -1, name: "个人中心", id: 3, auth: "profile" },
];

/**
 * @param {*} menuList 传入的数据
 * @return {*} menus 转化后的树形结构数据,auths 转化后的权限列表数组
 */

const getMenuListAndAuth = (menuList) => {
  // TODO:待补充代码
  return { menus, auths }; // menus 转化后的树形结构数据,auths 转化后的权限列表数组
};

// 请勿删除和修改以下代码
try {
  module.exports = { getMenuListAndAuth };
} catch (e) {}

js/menu.js

let admin = document.getElementById("admin");

let authList;
let url = location.href;

// 获取最终要渲染的菜单列表
let res = getMenuListAndAuth(menuList);

function getUrlParam(key) {
  let args = {};
  const arr = url.match(/\w+=\w+/gi).map((kv) => kv.split("="));
  for (let item of arr) {
    args[item[0]] = item[1];
  }
  return args[key];
}

let role = getUrlParam("name");

if (role == "admin") {
  // 管理员
  authList = ["profile", "comments", "product", "productList", "category"];
  admin.innerHTML = `你好,管理员`;
} else {
  // 超级管理员
  authList = [
    "profile",
    "comments",
    "product",
    "productList",
    "category",
    "addClassification",
    "admin",
    "product",
    "admin-auth",
  ];
  admin.innerHTML = `你好,超级管理员`;
}
// 全部的菜单列表
let sidelistall = res.menus;
let sidebarmenu = document.querySelector("#sidebarmenu");

/**
 * @param {*} auth 传入的权限列表
 * @return {*}  根据传入的权限列表返回需要显示的菜单列表
 */
const getNav = (auth) => {
  const filter = (sidelistall) => {
    return sidelistall.filter((item) => {
      if (auth.includes(item.auth)) {
        if (item.children) {
          item.children = filter(item.children);
        }
        return true;
      }
    });
  };
  return filter(sidelistall);
};
renderSide();

// 根据权限渲染左侧菜单
function renderSide() {
  let menuListside = getNav(authList);
  const rendermenu = (children) => {
    let childrenhtml = "";
    childrenhtml += children
      .map((child) => {
        let childrenH2 = "";
        if (child.children && !!child.children.length) {
          childrenH2 = rendermenu(child.children);
        }
        return `<ul >
                <li style="line-height: 28px;">${child.name} 
                ${childrenH2 ? `<i> ${childrenH2}</i>` : ""}
			 </ul>`;
      })
      .join("");
    return childrenhtml;
  };

  // 渲染菜单
  menuListside.map((item, index) => {
    let childrenhtml = "";
    // 首先判断 item 有没有子级
    if (item.children && !!item.children.length) {
      childrenhtml = rendermenu(item.children);
    }
    sidebarmenu.innerHTML += `
               <li class="active">
                       <a>
                            ${item.name}
                        </a>
                       <i style="color:#27C24C">${
                         childrenhtml ? childrenhtml : ""
                       }</i> 
                 </li>`;
  });
}

css/login.css

body {
  font-family: Verdana;
  background: url("../images/bg.jpg") no-repeat 62% 34%;
  background-size: cover;
  text-align: center;
}

.container h2 {
  color: #fff;
  font-size: 29px;
  letter-spacing: 2px;
  text-transform: uppercase;
  padding-bottom: 15px;
}

.container {
  width: 25%;
  margin: 0 auto;
  background: rgba(0, 0, 0, 0.34);
  padding: 42px 35px;
}

.main {
  margin-top: 100px;
}

input[type="text"],
input[type="password"] {
  width: 88%;
  padding: 15px 0px 15px 42px;
  border: 1px solid #fff;
  outline: none;
  font-size: 14px;
  color: #fff;
  margin: 14px 0px;
}

input[type="text"] {
  background: url("../images/user.svg") no-repeat 10px 11px;
  background-size: 24px;
}

input[type="password"] {
  background: url("../images/key.svg") no-repeat 8px 9px;
  background-size: 28px;
}

.container span {
  font-size: 16px;
  color: #fff;
  float: left;
  width: 32%;
  margin-top: 8px;
}

.container h6 {
  font-size: 16px;
  float: right;
  width: 37%;
  color: #fff;
  letter-spacing: 1px;
  margin-top: 8px;
  text-decoration: underline;
}

.container a {
  color: #fff;
  transition: 0.5s all;
  -webkit-transition: 0.5s all;
  -o-transition: 0.5s all;
  -moz-transition: 0.5s all;
  -ms-transition: 0.5s all;
}

.container a:hover {
  color: rgba(208, 95, 216, 0.9);
  transition: 0.5s all;
  -webkit-transition: 0.5s all;
  -o-transition: 0.5s all;
  -moz-transition: 0.5s all;
  -ms-transition: 0.5s all;
}
.clear {
  clear: both;
}
input[type="submit"] {
  padding: 12px 38px;
  font-size: 1px;
  text-transform: uppercase;
  letter-spacing: 2px;
  background: #003b64;
  color: white;
  border: none;
  outline: none;
  cursor: pointer;

  margin: 45px auto 31px;
  transition: 0.5s all;
  -webkit-transition: 0.5s all;
  -o-transition: 0.5s all;
  -moz-transition: 0.5s all;
  -ms-transition: 0.5s all;
}

input[type="submit"]:hover {
  background: rgba(213, 38, 133, 0.64);
  transition: 0.5s all;
  -webkit-transition: 0.5s all;
  -o-transition: 0.5s all;
  -moz-transition: 0.5s all;
  -ms-transition: 0.5s all;
}

.container p a {
  text-transform: uppercase;
  font-size: 18px;
  text-decoration: underline;
  letter-spacing: 1px;
  color: #fff;
  padding: 10px;
}

.container p {
  font-size: 17px;
  color: #fff;
}

footer p {
  margin: 4em 0em;
  color: #fff;
  font-size: 15px;
  font-weight: 300;
  letter-spacing: 2px;
}

footer a {
  color: rgba(208, 95, 216, 0.9);
}

footer a:hover {
  color: rgba(19, 129, 206, 0.82);
  text-decoration: underline;
}

@media (max-width: 1440px) {
  .container {
    width: 28%;
  }
}

@media (max-width: 1366px) {
  .container {
    width: 30%;
  }
}

@media (max-width: 1280px) {
  .container {
    width: 33%;
  }

  .agileheader h1 {
    font-size: 41px;
  }

  .container h2 {
    font-size: 27px;
  }
}

@media (max-width: 1080px) {
  .container {
    width: 49%;
  }
}

css/style.css

html,
body {
  overflow-x: hidden !important;
  -webkit-font-smoothing: antialiased;
  min-height: 100%;
  background: #f1f2f7;
}
a {
  color: #3c8dbc;
}
.right-side,
.left-side {
  min-height: 100%;
  display: block;
}

.right-side {
  background-color: #f1f2f7;
  margin-left: 220px;
}
.left-side {
  position: absolute;
  width: 220px;
  top: 0;
}

@media screen and (min-width: 992px) {
  .left-side {
    top: 50px;
  }

  .right-side.strech {
    margin-left: 0;
  }
  .right-side.strech > .content-header {
    margin-top: 0px;
  }
  .left-side.collapse-left {
    left: -220px;
  }
}

.content {
  padding: 20px 15px;
  background: #f0f3f4;
  overflow: auto;
}

img {
  max-width: 100% !important;
}

.badge-success {
  background-color: #27c24c;
  color: #dff5e4;
}

.badge-info {
  background-color: #23b7e5;
  color: #e3f6fc;
}
.badge-danger {
  background-color: #f05050;
  color: #fae6e6;
}

body > .header .navbar {
  height: 50px;
  margin-bottom: 0;
  margin-left: 220px;
}
body > .header .logo {
  float: left;
  font-size: 20px;
  line-height: 50px;
  text-align: center;
  padding: 0 10px;
  width: 220px;
  font-weight: 500;
  height: 50px;
  display: block;
}
.user-panel {
  padding: 10px;
}
.user-panel:before,
.user-panel:after {
  display: table;
  content: " ";
}
.user-panel:after {
  clear: both;
}
.user-panel > .image > img {
  width: 45px;
  height: 45px;
}

@media screen and (max-width: 992px) {
  .relative {
    position: relative;
  }
  body.fixed .sidebar-offcanvas {
    margin-top: 50px;
    left: -220px;
  }
  body.fixed .row-offcanvas-left.active .navbar {
    left: 220px !important;
    right: 0;
  }
  body.fixed .row-offcanvas-left.active .sidebar-offcanvas {
    left: 0px;
  }
}

.skin-black .navbar {
  background-color: #ffffff;
  border-bottom: 1px solid #eee;
}
.skin-black .navbar .nav a {
  color: #333333;
}

.skin-black .logo {
  background-color: #283744;
  color: #f9f9f9;
}
.skin-black .logo > a {
  color: #f9f9f9;
}
.skin-black .right-side > .content-header {
  background: #fff;
  box-shadow: none;
}
.skin-black .user-panel > .image > img {
  border: 1px solid #444;
}
.skin-black .user-panel > .info,
.skin-black .user-panel > .info > a {
  color: #eee;
}
.skin-black .sidebar {
  border-bottom: 1px solid #39435c;
}
.skin-black .sidebar > .sidebar-menu > li > .treeview-menu {
  margin: 0 1px;
  background: #35404d;
}
.skin-black .left-side {
  background: #39435c;
  padding-top: 20px;
}
.skin-black .sidebar a {
  color: #eee;
}
.sm-st {
  background: #fff;
  padding: 20px;
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  border-radius: 3px;
  margin-bottom: 20px;
  -webkit-box-shadow: 0 1px 0px rgba(0, 0, 0, 0.05);
  box-shadow: 0 1px 0px rgba(0, 0, 0, 0.05);
}
.sm-block-icon {
  width: 60px;
  height: 60px;
  line-height: 60px;
  text-align: center;
  font-size: 30px;
  background: #eee;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
  border-radius: 5px;
  float: left;
  margin-right: 10px;
  color: #fff;
}
.sm-block-info {
  font-size: 12px;
  padding-top: 2px;
}
.sm-block-info span {
  display: block;
  font-size: 24px;
  font-weight: 600;
}
.stat-elem {
  background-color: #fff;
  padding: 18px;
  border-radius: 40px;
}

.stat-info {
  text-align: center;
  background-color: #fff;
  border-radius: 5px;
  margin-top: -5px;
  padding: 8px;
  -webkit-box-shadow: 0 1px 0px rgba(0, 0, 0, 0.05);
  box-shadow: 0 1px 0px rgba(0, 0, 0, 0.05);
  font-style: italic;
}

.stat-icon {
  text-align: center;
  margin-bottom: 5px;
}

.block-red {
  background-color: #f05050;
}
.block-green {
  background-color: #27c24c;
}
.block-violet {
  background-color: #7266ba;
}
.block-blue {
  background-color: #23b7e5;
}

#sidebarmenu {
  margin-top: 20px;
  line-height: 20px;
}

#sidebarmenu li {
  color: #fff;
  line-height: 40px;
}
#sidebarmenu ul {
  padding: 0 20px;
}
.pull-left.info {
  margin-left: 20px;
}

五、完成

js/auth.js

/**
 * @param {*} menuList 传入的数据
 * @return {*} menus 转化后的树形结构数据,auths 转化后的权限列表数组
 */

const getMenuListAndAuth = (menuList) => {
  // TODO:待补充代码
  const auths = dealUserAuths(menuList)
  const menus = dealUserMenu(menuList)
  
  return { menus, auths }; // menus 转化后的树形结构数据,auths 转化后的权限列表数组

};
function dealUserMenu(users,rootId=-1){
  let newArr=[]
  users.forEach(item=>{
    if(rootId==item.parentId){
      newArr.push(item)
      item.children=dealUserMenu(users,item.id)
    }
  })
  return newArr
}
function dealUserAuths(users){
  let newArr=[]
  users.forEach(item=>{
    newArr.push(item.auth)
  })
  return newArr
}

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

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

相关文章

2023年,千万不要裸辞....

作为IT行业的大热岗位——软件测试&#xff0c;只要你付出了&#xff0c;就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的&#xff0c;但放眼望去&#xff0c;哪个工作不是这样的呢&#xff1f;会有哪家公司愿意养一些闲人呢&#xff1f;…

硬件设计电源系列文章-LDO基础知识

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 本文主要开始讲述电源的发展 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 AC/DC转换基础。为什么需要AC需要DC 技术名词解释 提示&#x…

车载测试很难吗?我靠着这套面试资料拿下了16k车载测试offer!

目录 如何写简历 项目经验 如何准备面试 车载项目的实施 常见面试题 总结&#xff1a; 车载测试通常包含以下三个方面&#xff1a; 系统测试&#xff1a;对整车系统进行测试&#xff0c;如车载电子系统、底盘系统、动力系统等。系统测试主要是评估整车各项性能指标是否达到…

STM32单片机(四)第一节:OLED调试工具

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

深入聊一下机械硬盘的相关内容

本文是《数据存储通识课》合集的一部分,本合集希望通过一系列文章科普数据存储相关技术内容。同时,本系列文章不仅仅是科普,还会进行有深度解析,理论结合实现,从代码实现层面进行剖析​ 介绍存储技术当然要从存储技术最基本的组件磁盘开始介绍了。目前市面上我们见得最多的…

shell脚本基础4——function函数、expect

文章目录 一、function函数1.1 函数的定义使用1.2 函数参数1.2.1 脚本内传参1.2.2 脚本外传参 1.3 引用局部变量1.3.1 区分局部变量1.3.2 全局变量在函数外1.3.3 全局变量在函数体1.3.4 函数体直接输出具体值 二、expect命令2.1 常用命令2.2 安装使用2.3 例一2.4 例二2.5 例三 …

Cmake工具的简单使用

引言 本篇文章讲述如何简单的使用cmake工具构建一个项目&#xff0c;帮助入门的c新手学会如何使用cmake. 我们在Clion新创建一个项目时&#xff0c;会发现&#xff0c;除了main.cpp文件之外&#xff0c;还存在一个build-debug目录和一个CMakelists.txt文件&#xff0c;如图: …

Spring Boot 集成 Redisson 实现分布式锁

Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库&#xff0c;可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面&#xff0c;例如分布式锁、分布式集合、分布式事件发布和订…

Java学习记录

引入包 把jar包复制到lib下面&#xff0c;然后右键add as library 常用方法 读取文件&#xff1a;FileInputStream获得当前路径&#xff1a;System.getProperty(“user.dir”) 快捷键 https://blog.csdn.net/W_317/article/details/114300373 常用的 生成循环&#xff1…

VMware Workstation 16 安装教程

哈喽&#xff0c;大家好。今天一起学习的是VMware Workstation 16的安装&#xff0c;vm虚拟机是小编非常喜欢的生产力软件&#xff0c;小编之前发布的测试教程钧在vm上进行的实验。 VMware Workstation是一款功能强大的桌面虚拟计算机软件&#xff0c;它能够让用户在宿主机操作…

Coggle 30 Days of ML 打卡任务一:两个赛题数据可视化

Coggle 30 Days of ML 打卡任务一&#xff1a;两个赛题数据可视化 任务一&#xff1a;两个赛题数据可视化 难度/分值&#xff1a;低/1 打卡内容&#xff1a; 参赛选手名称&#xff1a;AppleDoctor完成日期&#xff1a;2023.6.6任务完成情况&#xff1a; 使用的编程语言&…

【你真的会斗图嘛?】Python爬虫实战项目——你想要的图都可以爬到(附安装地址)

目录 一、安装知识&#xff08;1&#xff09;Python环境变量&#xff08;2&#xff09;Pycharm开发工具&#xff08;3&#xff09;requests模块1、安装下载好Pycharm之后&#xff0c;找到终端进行下载requests模块2、输入下载语法&#xff1a;3、此次项目还需用到正则&#xff…

【STM32】制作一个bootloader

工作环境&#xff1a;STM32CubeMXKeil 相关环境准备这里就不介绍了。 bootloader是什么 bootloader就是单片机启动时候运行的一段小程序&#xff0c;这段程序负责单片机固件的更新&#xff0c;也就是单片机选择性的自己给自己下载程序。可以更新&#xff0c;可以不更新&…

C++课程设计:电梯控制系统程序设计

目录 电梯控制系统程序设计背景 类结构图 程序设计 程序释义 运行展示 总结与体会 电梯控制系统程序设计背景 电梯控制系统程序设计旨在通过C编程实现电梯的模拟功能&#xff0c;使用户能够选择上行或下行&#xff0c;并输入要进入的楼层&#xff0c;程序将模拟电梯运行过…

死锁细究!

一、死锁的定义&危害 1、死锁是什么 发生在并发中互不想让&#xff1a;当两个&#xff08;或更多&#xff09;线程&#xff08;或进程&#xff09;相互持有对方所需要的资源&#xff0c;又不主动释放&#xff0c;导致所有人都无法继续前进&#xff0c;导致程序陷入无尽的…

学生成绩管理系统(C语言)

学生成绩管理系统 一、实现思路二、代码的实现&#xff08;1&#xff09;构造功能框架&#xff08;2&#xff09;实现各项功能 三、完整的代码四、总结 本篇博客介绍一个关于学生成绩管理系统的C语言代码&#xff0c;包含读取成绩、计算各门课程的总分和平均分、按分数排序、按…

快速实现一个分布式定时器

定时器&#xff08;Timer&#xff09;是一种在业务开发中常用的组件&#xff0c;主要用在执行延时通知任务上。本文以笔者在工作中的实践作为基础&#xff0c;介绍如何使用平时部门最常用的组件快速实现一个业务常用的分布式定时器服务。同时介绍了过程中遇到问题的一些解决方案…

手机越狱:探索自由与风险的边界

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

htmlCSS-----盒模型

目录 前言&#xff1a; 盒子 1.内容区域 2. 边框 3. 内边距区域 4. 外边距区域&#xff08;margin&#xff09; 怪异盒模型 前言&#xff1a; 前面我们学习了CSS中的选择器的使用方法&#xff0c;那这一节我们就学习CSS中的盒模型&#xff0c;通过盒模型我们可以去更好的…