thinkphp6结合layui增删改查综合案列

文章目录

      • 技术栈
      • 实现
      • 代码实现
      • 数据库

本案例适合新手,特别是杠刚入门thinkphp和layui,但又不是特别熟悉这类

主要实现登录退出功能,用户模块的增删改查功能,分页功能是layui表单自带功能
效果图
左侧的菜单栏我没有写对应的页面,需要的自己添加上就行,把菜单弄出来主要是为了好看一点
在这里插入图片描述
目录结构
在这里插入图片描述

技术栈

thinkphp6+layui

实现

layui实现后台布局
中间件和session判断用户是否登录
用到think-template模板引擎,安装完tp框架后需要自己安装

composer create-project topthink/think=6.0.x-dev tp
composer require topthink/think-view

ajax请求数据
msyql数据库

代码实现

登录页面,相关的请求方法都写在了页面中

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录页面</title>
    <!-- 引入LayUI的CSS文件 -->
    <link rel="stylesheet" href="/layui/css/layui.css">
    <!-- 引入LayUI的JS文件 -->
    <script src="/layui/layui.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Arial', sans-serif;
            background-color: #f0f2f5;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .login-container {
            width: 450px;
            padding: 2rem;
            background-color: #ffffff;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        h1 {
            color: #333333;
            text-align: center;
            margin-bottom: 1.5rem;
        }

        label {
            color: #333333;
            margin-bottom: 0.5rem;
        }

        input.layui-input {
            height: 40px;
            padding: 0 1rem;
            margin-bottom: 1.5rem;
            border: 1px solid #d9d9d9;
            border-radius: 5px;
        }

        button.layui-btn {
            height: 40px;
            color: #ffffff;
            background-color: #3498db;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            transition: background-color 0.3s ease;
        }

        button.layui-btn:hover {
            background-color: #2980b9;
        }
    </style>
</head>

<body>
    <div class="login-container">
        <h1>登录</h1>
        <form class="layui-form" action="/admin/index" method="post">
            <div class="layui-form-item">
                <label for="username" class="layui-form-label">用户名:</label>
                <div class="layui-input-block">
                    <input type="text" id="username" name="username" placeholder="请输入用户名" required lay-verify="required" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label for="password" class="layui-form-label">密码:</label>
                <div class="layui-input-block">
                    <input type="password" id="password" name="password" placeholder="请输入密码" required lay-verify="required" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <div class="layui-input-block">
                    <button class="layui-btn" lay-submit lay-filter="login">登录</button>
                </div>
            </div>
        </form>
    </div>
    <!DOCTYPE html>
<!-- 省略其他代码 -->

    <script>
        layui.use(['form', 'layer'], function () {
            var form = layui.form;
            var layer = layui.layer;

            form.on('submit(login)', function(data){
                console.log(data);
              });


        });
    </script>
</body>

</html>

后台布局,layui.js和layui.css改成自己的

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>Layui</title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <link rel="stylesheet" href="/layui/css/layui.css" media="all">
  <!-- 注意:如果你直接复制所有代码到本地,上述css路径需要改成你本地的 -->
</head>

<body>

  <table class="layui-hide" id="test" lay-filter="test"></table>

  <!-- 定义编辑用户弹层 -->
  <div id="edit-form" style="display:none;">
    <form class="layui-form" action="" lay-filter="" id="${id}">
      <div class="layui-form-item">
        <label class="layui-form-label">Id</label>
        <div class="layui-input-block">
          <input type="text" name="id" required lay-verify="required" autocomplete="off" class="layui-input" value="..."
            disabled>
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">用户名</label>
        <div class="layui-input-block">
          <input type="text" name="username" required lay-verify="required" autocomplete="off" class="layui-input"
            value="...">
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">邮箱</label>
        <div class="layui-input-block">
          <input type="text" name="email" required lay-verify="required" autocomplete="off" class="layui-input"
            value="...">
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">地址</label>
        <div class="layui-input-block">
          <input type="text" name="address" required lay-verify="required" autocomplete="off" class="layui-input"
            value="...">
        </div>
      </div>
      <div class="layui-form-item">
        <div class="layui-input-block">
          <button class="layui-btn" lay-submit lay-filter="editSubmit">修改</button>
          <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
      </div>
    </form>
  </div>

  <!-- 新增用户模块弹层 -->
  <div id="add-form" style="display:none;">
    <form class="layui-form" action="">
      <div class="layui-form-item">
        <label class="layui-form-label">用户名</label>
        <div class="layui-input-block">
          <input type="text" name="username" lay-verify="required" placeholder="请输入用户名" autocomplete="off"
            class="layui-input">
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">邮箱</label>
        <div class="layui-input-block">
          <input type="text" name="email" lay-verify="required|email" placeholder="请输入邮箱" autocomplete="off"
            class="layui-input">
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">地址</label>
        <div class="layui-input-block">
          <input type="text" name="address" lay-verify="required" placeholder="请输入地址" autocomplete="off"
            class="layui-input">
        </div>
      </div>
      <div class="layui-form-item">

      </div>
    </form>
  </div>



  <script type="text/html" id="toolbarDemo">
  <div class="layui-btn-container">
    <button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据</button>
    <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="getCheckLength">获取选中数目</button>
    <button class="layui-btn layui-btn-sm layui-btn-warm" lay-event="isAll">验证是否全选</button>
    <button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="add">添加用户</button>
  </div>
</script>

  <script type="text/html" id="barDemo">
  <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>

  <script src="/layui/layui.js" charset="utf-8"></script>
  <!-- 注意:如果你直接复制所有代码到本地,上述 JS 路径需要改成你本地的 -->

  <script>
    var userListData = JSON.parse('{:json_encode($userList)}');
    layui.use('table', function () {
      var table = layui.table;
      var $ = layui.jquery;

      table.render({
        elem: '#test'
        , data: userListData
        , toolbar: '#toolbarDemo' //开启头部工具栏,并为其绑定左侧模板
        , defaultToolbar: ['filter', 'exports', 'print', { //自定义头部工具栏右侧图标。如无需自定义,去除该参数即可
          title: '提示'
          , layEvent: 'LAYTABLE_TIPS'
          , icon: 'layui-icon-tips'
        }]
        , title: '用户数据表'
        , cols: [[
          { type: 'checkbox', fixed: 'left' },
          { field: 'id', title: 'ID', width: 80, fixed: 'left', unresize: true, sort: true, align: 'center' },
          { field: 'username', title: '用户名', align: 'center', width: 120 },
          { field: 'email', title: '邮箱', align: 'center' },
          { field: 'address', title: '地址', align: 'center' },
          { fixed: 'right', title: '操作', toolbar: '#barDemo', align: 'center' }
        ]]
        , page: true
      });

      //头工具栏事件
      table.on('toolbar(test)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id);
        switch (obj.event) {
          case 'getCheckData':
            var data = checkStatus.data;
            layer.alert(JSON.stringify(data));
            break;
          case 'getCheckLength':
            var data = checkStatus.data;
            layer.msg('选中了:' + data.length + ' 个');
            break;
          case 'isAll':
            layer.msg(checkStatus.isAll ? '全选' : '未全选');
            break;
          case 'add':
            layer.open({
              type: 1,
              title: '新增用户',
              content: $('#add-form').html(), // 从页面中获取表单内容
              area: ['500px', '320px'],
              btn: ['提交', '取消'],
              yes: function (index, layero) {
                // 点击“提交”按钮时的回调函数
                var data = layero.find('form').serialize();
                // 发送表单数据到后端
                $.post('/admin/addUser', data, function (res) {
                  if (res.success) {
                    layer.msg(res.message);
                    // 关闭弹出层
                    layer.close(index);
                    // 重新加载数据表格
                    setTimeout(function () {
                      window.location.reload();
                    }, 2000);
                    table.reload('test', {});
                  } else {
                    layer.msg(res.message);
                  }
                }).fail(function () {
                  layer.msg('请求失败,请重试');
                });
              }
            });
        };
      });

      //监听行工具事件,删除事件
      table.on('tool(test)', function (obj) {
        var data = obj.data;
        if (obj.event === 'del') {
          var id = data.id;

          // 弹出确认框
          layer.confirm('确定要删除该用户吗?', function (index) {
            // 用户点击了确定按钮,关闭确认框
            layer.close(index);

            // 使用Layui的内置jQuery发送POST请求
            $.post('/admin/deleteUserById', { id: id }, function (res) {
              if (res.success) {
                obj.del(); // 如果删除成功,从表格中删除行
              } else {
                layer.msg('删除失败');
              }
            }).fail(function () {
              layer.msg('请求失败,请重试');
            });
          });
        } else {
          // 弹出编辑层
          layer.open({
            type: 1,
            title: '编辑用户信息',
            content: $('#edit-form').html(), // 从页面中获取表单内容
            area: ['500px', '320px'],
            success: function (layero, index) {
              // 将用户数据填充到表单元素中
              layero.find('input[name="id"]').val(data.id);
              layero.find('input[name="username"]').val(data.username);
              layero.find('input[name="email"]').val(data.email);
              layero.find('input[name="address"]').val(data.address);
            }
          });
        }
      });

      // 监听编辑表单提交事件
      layui.form.on('submit(editSubmit)', function (data) {
        // 发送表单数据到后端
        $.post('/admin/updateUserById', data.field, function (res) {
          console.log(res);
          if (res.success) {
            layer.msg(res.message);
            // 关闭弹出层
            layer.closeAll('page');
            // 刷新页面重新加载表格
            setTimeout(function () {
              window.location.reload();
            }, 2000);
          } else {
            layer.msg('更新失败');
          }
        }).fail(function () {
          layer.msg('请求失败,请重试');
        });
        return false; // 阻止表单提交
      });

    });
  </script>

</body>

</html>

用户列表

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>Layui</title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <link rel="stylesheet" href="/layui/css/layui.css" media="all">
  <!-- 注意:如果你直接复制所有代码到本地,上述css路径需要改成你本地的 -->
</head>

<body>

  <table class="layui-hide" id="test" lay-filter="test"></table>

  <!-- 定义编辑用户弹层 -->
  <div id="edit-form" style="display:none;">
    <form class="layui-form" action="" lay-filter="" id="${id}">
      <div class="layui-form-item">
        <label class="layui-form-label">Id</label>
        <div class="layui-input-block">
          <input type="text" name="id" required lay-verify="required" autocomplete="off" class="layui-input" value="..."
            disabled>
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">用户名</label>
        <div class="layui-input-block">
          <input type="text" name="username" required lay-verify="required" autocomplete="off" class="layui-input"
            value="...">
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">邮箱</label>
        <div class="layui-input-block">
          <input type="text" name="email" required lay-verify="required" autocomplete="off" class="layui-input"
            value="...">
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">地址</label>
        <div class="layui-input-block">
          <input type="text" name="address" required lay-verify="required" autocomplete="off" class="layui-input"
            value="...">
        </div>
      </div>
      <div class="layui-form-item">
        <div class="layui-input-block">
          <button class="layui-btn" lay-submit lay-filter="editSubmit">修改</button>
          <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
      </div>
    </form>
  </div>

  <!-- 新增用户模块弹层 -->
  <div id="add-form" style="display:none;">
    <form class="layui-form" action="">
      <div class="layui-form-item">
        <label class="layui-form-label">用户名</label>
        <div class="layui-input-block">
          <input type="text" name="username" lay-verify="required" placeholder="请输入用户名" autocomplete="off"
            class="layui-input">
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">邮箱</label>
        <div class="layui-input-block">
          <input type="text" name="email" lay-verify="required|email" placeholder="请输入邮箱" autocomplete="off"
            class="layui-input">
        </div>
      </div>
      <div class="layui-form-item">
        <label class="layui-form-label">地址</label>
        <div class="layui-input-block">
          <input type="text" name="address" lay-verify="required" placeholder="请输入地址" autocomplete="off"
            class="layui-input">
        </div>
      </div>
      <div class="layui-form-item">

      </div>
    </form>
  </div>



  <script type="text/html" id="toolbarDemo">
  <div class="layui-btn-container">
    <button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据</button>
    <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="getCheckLength">获取选中数目</button>
    <button class="layui-btn layui-btn-sm layui-btn-warm" lay-event="isAll">验证是否全选</button>
    <button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="add">添加用户</button>
  </div>
</script>

  <script type="text/html" id="barDemo">
  <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>

  <script src="/layui/layui.js" charset="utf-8"></script>
  <!-- 注意:如果你直接复制所有代码到本地,上述 JS 路径需要改成你本地的 -->

  <script>
    var userListData = JSON.parse('{:json_encode($userList)}');
    layui.use('table', function () {
      var table = layui.table;
      var $ = layui.jquery;

      table.render({
        elem: '#test'
        , data: userListData
        , toolbar: '#toolbarDemo' //开启头部工具栏,并为其绑定左侧模板
        , defaultToolbar: ['filter', 'exports', 'print', { //自定义头部工具栏右侧图标。如无需自定义,去除该参数即可
          title: '提示'
          , layEvent: 'LAYTABLE_TIPS'
          , icon: 'layui-icon-tips'
        }]
        , title: '用户数据表'
        , cols: [[
          { type: 'checkbox', fixed: 'left' },
          { field: 'id', title: 'ID', width: 80, fixed: 'left', unresize: true, sort: true, align: 'center' },
          { field: 'username', title: '用户名', align: 'center', width: 120 },
          { field: 'email', title: '邮箱', align: 'center' },
          { field: 'address', title: '地址', align: 'center' },
          { fixed: 'right', title: '操作', toolbar: '#barDemo', align: 'center' }
        ]]
        , page: true
      });

      //头工具栏事件
      table.on('toolbar(test)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id);
        switch (obj.event) {
          case 'getCheckData':
            var data = checkStatus.data;
            layer.alert(JSON.stringify(data));
            break;
          case 'getCheckLength':
            var data = checkStatus.data;
            layer.msg('选中了:' + data.length + ' 个');
            break;
          case 'isAll':
            layer.msg(checkStatus.isAll ? '全选' : '未全选');
            break;
          case 'add':
            layer.open({
              type: 1,
              title: '新增用户',
              content: $('#add-form').html(), // 从页面中获取表单内容
              area: ['500px', '320px'],
              btn: ['提交', '取消'],
              yes: function (index, layero) {
                // 点击“提交”按钮时的回调函数
                var data = layero.find('form').serialize();
                // 发送表单数据到后端
                $.post('/admin/addUser', data, function (res) {
                  if (res.success) {
                    layer.msg(res.message);
                    // 关闭弹出层
                    layer.close(index);
                    // 重新加载数据表格
                    setTimeout(function () {
                      window.location.reload();
                    }, 2000);
                    table.reload('test', {});
                  } else {
                    layer.msg(res.message);
                  }
                }).fail(function () {
                  layer.msg('请求失败,请重试');
                });
              }
            });
        };
      });

      //监听行工具事件,删除事件
      table.on('tool(test)', function (obj) {
        var data = obj.data;
        if (obj.event === 'del') {
          var id = data.id;

          // 弹出确认框
          layer.confirm('确定要删除该用户吗?', function (index) {
            // 用户点击了确定按钮,关闭确认框
            layer.close(index);

            // 使用Layui的内置jQuery发送POST请求
            $.post('/admin/deleteUserById', { id: id }, function (res) {
              if (res.success) {
                obj.del(); // 如果删除成功,从表格中删除行
              } else {
                layer.msg('删除失败');
              }
            }).fail(function () {
              layer.msg('请求失败,请重试');
            });
          });
        } else {
          // 弹出编辑层
          layer.open({
            type: 1,
            title: '编辑用户信息',
            content: $('#edit-form').html(), // 从页面中获取表单内容
            area: ['500px', '320px'],
            success: function (layero, index) {
              // 将用户数据填充到表单元素中
              layero.find('input[name="id"]').val(data.id);
              layero.find('input[name="username"]').val(data.username);
              layero.find('input[name="email"]').val(data.email);
              layero.find('input[name="address"]').val(data.address);
            }
          });
        }
      });

      // 监听编辑表单提交事件
      layui.form.on('submit(editSubmit)', function (data) {
        // 发送表单数据到后端
        $.post('/admin/updateUserById', data.field, function (res) {
          console.log(res);
          if (res.success) {
            layer.msg(res.message);
            // 关闭弹出层
            layer.closeAll('page');
            // 刷新页面重新加载表格
            setTimeout(function () {
              window.location.reload();
            }, 2000);
          } else {
            layer.msg('更新失败');
          }
        }).fail(function () {
          layer.msg('请求失败,请重试');
        });
        return false; // 阻止表单提交
      });

    });
  </script>

</body>

</html>

后端代码
Index.php
这个文件没有什么好说的,就是访问index/index的时候渲染登录页面

<?php
namespace app\controller;
use app\BaseController;
use think\facade\View;

class Index extends BaseController
{
    public function index()
    {
        return View::fetch();
    }

    public function hello($name = 'ThinkPHP6')
    {
        return 'hello,' . $name;
    }
}

Admin.php控制器
这个控制器中,首先index登录页面请求index方法判断用户名密码,用户名密码正确后渲染后台主页
用户名密码不正确重定向到登录页面
同时增删改查功能也是在这个控制器内完成的,但这些功能都需要经过中间件CheckLogin判断session是否存在,就是用户是否登录

<?php
namespace app\controller;

use app\BaseController;
use think\facade\View;
use think\facade\Request;
use app\model\User;
use think\facade\Session;
use app\middleware\CheckLogin;
use app\model\UserList;

class admin extends BaseController
{
    protected $middleware = [CheckLogin::class => ['except' => ['index']]]; //当执行admin控制器的时候就会调用CheckLogin中间件

    public function index()
    {
        $username = Request::post('username');
        $password = Request::post('password');
        $res = User::where('username', $username)->find();

        // 判断用户是否存在,以及密码是否正确
        if ($res && $res->password == md5($password)) {
            // 存储用户信息到session中
            Session::set('res', $res);
            View::assign('res', $res);
            return View::fetch();
        } else {
            // 密码不正确,重定向到登录页面
            return redirect('../Index/index')->with('error', '用户名或密码错误');
        }
    }

    public function logout()
    {
        session_destroy();
        return redirect('../Index/index')->with('error', '退出成功');
    }

    public function userList()
    {
        $list = UserList::select();
        // 分配数据给模板
        View::assign('userList', $list);
        // 渲染模板并返回
        return View::fetch();
    }

    public function deleteUserById()
    {
        $id = Request::post('id');
        $res = UserList::destroy($id);
        if ($res) {
            return json(['success' => true, 'message' => '删除成功']);
        } else {
            return json(['success' => false, 'message' => '删除失败']);
        }
    }

    public function updateUserById(){
        $id = Request::post('id');
        $username = Request::post('username');
        $email = Request::post('email');
        $address = Request::post('address');
        $res = UserList::update(['username'=>$username,'email'=>$email,'address'=>$address,'id' => $id]);
        try {
            $res = UserList::update(['username'=>$username,'email'=>$email,'address'=>$address,'id' => $id]);
            if ($res) {
                return json(['success' => true, 'message' => '更新成功']);
            } else {
                return json(['success' => false, 'message' => '更新失败']);
            }
        } catch (\Exception $e) {
            return json(['success' => false, 'message' => $e->getMessage()]);
        }
    }

    public function addUser(){
        $res = UserList::create([
            'username'=>Request::post('username'),
            'email'=>Request::post('email'),
            'address'=>Request::post('address')
        ]);
        if ($res) {
            return json(['success' => true, 'message' => '添加成功']);
        } else {
            return json(['success' => false, 'message' => '添加失败']);
        }
    }
}

中间件代码CheckLogin.php代码

<?php
//判断用户是否登录的中间件
namespace app\middleware;

use think\facade\Session;

class CheckLogin
{
    
    public function handle($request,$next)
    {
        // 判断session是否存在
        // if (Session::has('user')) {                  //设置的时候就设置了res,不要来读的时候就干个user在上面
        if (Session::has('res')) { 
            // 如果session存在,继续执行后续请求
            return $next($request);
        } else {
            // 如果session不存在,重定向到登录页
            return redirect('../Index/index');
        }
    }
}

模型类,在这个案例中我们定义了两个模型类
一个是User模型类,就是管理员数据,另一个是UserList类就是展示在页面上的数据,我们增删改查需要操作的数据
User模型

<?php
namespace app\model;

use think\Model;

class User extends Model{
    protected $name = 'user';
    protected $pk = 'id';
}

UserList模型

<?php
namespace app\model;
use think\Model;

class UserList extends Model{
    protected $name = 'user_list';
    protected $pk = 'id';
}

这个案例并没有用到路由模块,有需要用路由的自己去配置即可,router/app.php中

数据库

数据库就两个表
user和user_list
使用tp操作数据库前请先确保配置了数据库连接,开发环境跟目录下.env文件
生产环境config/database.php如果不知道是开发环境还是生产环境两个都改一下
表的结构
在这里插入图片描述

完结!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最好的物联网教程:软硬结合——从零打造物联网

在大学里不同专业有着不同的追求&#xff1a;机械类与强电类专业学生追求的是 “机电合一” &#xff0c;既懂机械又懂电气&#xff0c;整个电气机械自动化便能打通。弱电类专业学生追求的是 “软硬结合” &#xff0c;既懂硬件又懂软件&#xff0c;整个电子产品便能打通。我作…

微服务保护 笔记分享【黑马笔记】

微服务保护 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff…

文件的使用

文章目录 1.概念1.1定义&#xff1a;1.2分类1.2.1程序文件1.2.2数据文件1.概念2.存储方式 1.3文件名 2.文件的使用2.1文件指针2.2开闭函数2.3顺序读写2.3.1何为读写2.3.2读写函数1.字符输出fputc&#xff08;输出到文件 写到文件中&#xff09;2.字符输入fgetc&#xff08;输入…

Spring 的创建和使用

目录 一. 创建 Spring项目 二. 存储 Bean 对象到Spring中 1. 添加Spring配置文件 2. 创建一个 Bean 对象 3. 将 Bean 存储到 Spring 容器中 三. 从 Spring 中获取并使用 Bean 对象 1. 创建 Spring 上下文 1.1 使用 ApplicationContext 作为Spring上下文 1.2 使用 Bea…

线性回归模型(7大模型)

线性回归模型&#xff08;7大模型&#xff09; 线性回归是人工智能领域中最常用的统计学方法之一。在许多不同的应用领域中&#xff0c;线性回归都是非常有用的&#xff0c;例如金融、医疗、社交网络、推荐系统等等。 在机器学习中&#xff0c;线性回归是最基本的模型之一&am…

深入理解 Linux 内核

Linux 内核系列文章 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 文章目录 Linux 内核系列文章前言一、内存寻址1、内存地址2、硬件中的分段&#xff08;1&#xff09;段选择符 3、Linux 中的分段&#xff08;1&#xff09;Linux GDT&…

IPsec中IKE与ISAKMP过程分析(快速模式-消息1)

IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息1&#xff09;_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息2&#xff09;_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息3&#xff09;_搞搞搞高傲的博客…

九款顶级AI工具推荐

ChatGPT OpenAI开发的最强对话系统 地址&#xff1a;chat.openai.com ChatGPT能够在同一个会话期间内回答上下文相关的后续问题。其在短时间内引爆全球的原因在于&#xff0c;在网友们晒出的截图中&#xff0c;ChatGPT不仅能流畅地与用户对话&#xff0c;甚至能写诗、撰文、编…

【远程工具】- Tabby 下载、安装、使用、配置【ssh/Serial】-免安装、解压即用

目录 一、Tabby 概述 二、Tabby 下载、安装 三、Tabby 的使用  &#x1f449;3.1 使用SSH协议连接Linux开发主机  &#x1f449;3.2 使用Serial(串口)协议连接开发板 一、Tabby 概述 在远程终端工具中&#xff0c;secureCrt 和 XShell 是两款比较有名的远程工具&#xff0c;但…

尚融宝26-投标

目录 一、需求 &#xff08;一&#xff09;投资人投标 &#xff08;二&#xff09;流程 二、标的详情 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;后端 &#xff08;三&#xff09;前端 三、计算收益 &#xff08;一&#xff09;四种还款方式 &#…

windows10系统如何实现telnet内网穿透

在windows10系统环境中&#xff0c;我们常用的内网穿透方案是远程桌面内网穿透技术方案&#xff0c;存在的弊端是它属于视窗类操作工具。网上很多教人开启windows10的telnet服务的帖子&#xff0c;凡是通过系统设置进入启用或关闭windows应用后勾选telnet客户端这种方式&#x…

Codeforces Round 865 (Div. 2)

6 problems. ABC过, DE没想出来, F没看. https://codeforces.com/contest/1816 A. Ian Visits Mary 分析 - AC 每次跳跃&#xff0c;横纵互质。 限于数据量&#xff0c;不能枚举。 1与任何数互质。考虑从(0,0)跳到(1,y)&#xff0c;这一步一定合法&#xff1b;再从(1,y)跳到…

《Netty》从零开始学netty源码(四十七)之PooledByteBuf的方法

setBytes() 从channel中读取数据并写到PooledByteBuf中&#xff0c;分配缓存的过程与getBytes一样&#xff0c;只是duplicate为false。 capacity() 动态更新容量&#xff0c;根据新传入的容量值更改length。 如果新容量值与旧值相同则无需扩容如果为非池化内存则根据新容量值…

制造策略 ETO、MTO、ATO、MTS

ETO 按交货周期跨度从长到短来讲&#xff0c;首先就是 ETO&#xff0c;Engineer To Order – 面向订单设计、定制生产或特殊生产。 就是客户给的订单&#xff0c;你要生产的话&#xff0c;你之前的原产品改动很大&#xff0c;或者基本上用不上&#xff0c;要完全按照客户的要求…

从0搭建Vue3组件库(十):如何搭建一个 Cli 脚手架

本篇文章将实现一个名为create-easyest脚手架的开发,只需一个命令npm init easyest就可以将整个组件库开发框架拉到本地。 创建 Cli 包 首先,我们在 packages 目录下新建 cli 目录,同执行pnpm init进行初始化,然后将包名改为create-easyest 这里需要知道的是当我们执行npm in…

细讲shell中的循环语句--for语句

目录 一:何为循环 1.循环概述 2.使用循环的好处 二&#xff1a;for循环语句 1.for语句的用法 ​2. 语法结构 &#xff08;1&#xff09;一般格式 &#xff08;2&#xff09;类C语言格式 &#xff08;3&#xff09;死循环 3.事例 ​4.常用转义符 5.制作九九乘法表 三&…

利用Ad Hoc传感器网络上的局部信息组织全球坐标系(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 知道通信网络中节点的地理位置通常是有用的&#xff0c;但在每个节点上添加GPS接收器或其他复杂的传感器可能会很昂贵。 本文…

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三 主题整体听一遍精听句子 1扩展 way of doing | way to do sth 句子 2扩展 Expression扩展 base 句子 3句子 4扩展 red-hot 句子 5句子 6扩展 fiery 句子 7句子 8句子 9句子 10句子 11扩展 born 句子 12句子 13句子…

平均10870元!2023一季度居民可支配收入公布(文末附最新招聘岗位)

今天是五一假期的第一天&#xff0c;暂别职场的打工人已经开始扎入人从众中放肆玩乐了&#xff0c;小编已经流下了羡慕的泪水。不过&#xff0c;今年的五一除了人流量上暴涨之外&#xff0c;出行成本也没被少吐槽&#xff0c;机票咱就不说了&#xff0c;酒店民宿的涨幅简直到了…

[AION]我眼中的《永恒之塔私服》

当我第一次看到《永恒之塔私服》我被它那华丽的画面吸引了。      三维做的很逼真&#xff0c;他的三维技术&#xff0c;华丽的三维景象&#xff0c;从maya设计者专业的角度上说&#xff0c;他是一部做工完美的游戏&#xff0c;不管是他的背景还是他的人物。都比以前很多游…