只要声明使用外部网络即可

第一个集群网络设为可以外部连接

networks:
  backend:
    # 网络可以被外部连接
    attachable: true
    driver: overlay

第二个网络设置外使用外部网络

networks:
  app_backend:
    # 使用外部网络
    external: true
注意:docker swarm会给网络加上集群名字前缀,使用外部网络时候需要全称

数据结构

  1. 数据结构 C语言版 严蔚敏
  2. 算法图解

计算机网络

计算机组成原理

重要内容

  1. 离散数学
  2. 数据结构与算法
  3. 编译原理

综合内容

电子技术、离散数学、程序设计、数据结构、操作系统、计算机组成原理、微机系统、计算机系统结构、编译原理、计算机网络、数据库系统、软件工程、人工智能、计算机图形学、数字图像处理、计算机通讯原理、多媒体信息处理技术、数字信号处理、计算机控制、网络计算、算法设计与分析、信息安全、应用密码学基础、信息对抗、移动计算、数论与有限域基础、人机界面设计、面向对象程序设计

guards修改

修改config/auth.php,在guards中增加所需内容,例如

'guards' => [
    'admin' => [
        'driver' => 'jwt',
        'provider' => 'admins',
    ],

    'user' => [
        'driver' => 'jwt',
        'provider' => 'users',
        'hash' => false,
    ],
],

增加auth中相应providers

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],

    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\Admin::class,
    ],
],

路由中指定走自己的中间件

// 这种写法含义是走名为admin的guard,并且使用auth.admin中间件
Route::group(['middleware' => 'auth.admin:admin'], function () {
    Route::get('admin/changePassword', [AdminIndexController::class, 'changePassword']);
    Route::get('admin/exams', [AdminExamController::class, 'index']);
});

实现自己的AuthAdmin中间件

class AuthAdmin
{
    public function handle(Request $request, Closure $next)
    {
        if (!auth('admin')->check()) {
            return response()->json([
                'code' => 401,
                'msg'  => '登录信息错误',
            ]);
        }

        if (auth('admin')->user()->token != JWTAuth::getToken()) {
            return response()->json([
                'code' => 401,
                'msg'  => '请重新登录',
            ]);
        }

        $request->user = auth('admin')->user();

        return $next($request);
    }
}

// 开启记录
\Illuminate\Support\Facades\DB::connection()->enableQueryLog();

// 打印记录
$bindings = \Illuminate\Support\Facades\DB::getQueryLog();
$data = [];
foreach ($bindings as $k => $b) {
    $bi = $b['bindings'];
    $bi = array_map(function ($a) {
        return '\'' . $a . '\'';
    }, $bi);
    $sql = str_replace('?', '%s', $b['query']);
    $sql2 = sprintf($sql, ...$bi);
    $data[$k] = $sql2;
}
dd($data);

package main

import "fmt"

func calc(index string, a, b int) int {
    ret := a + b
    fmt.Println(index, a, b, ret)
    return ret
}

func main() {
    a := 1
    b := 2
    defer calc("1", a, calc("10", a, b))

    a = 0
    defer calc("2", a, calc("20", a, b))

    b = 1
}

defer在定义的时候会计算好调用函数的参数,所以会优先输出10、20这两个参数,之后就是根据定义的顺序倒序执行。

package main

import (
    "fmt"
)

func main() {
    fmt.Println(a())    // 1 0 1
    fmt.Println(c())    // 2
    fmt.Println(f0())   // 6
    fmt.Println(f1())   // 1
    fmt.Println(*f1p()) // 6
    fmt.Println(f2())   // 1
    fmt.Println(f3())   // 6
    fmt.Println(f40())  // 1
    fmt.Println(f4())   // 0
}

/**
 * 当defer被声明时,其参数就会被实时解析
 * defer执行顺序为先进后出
 */
func a() int {
    i := 0
    defer fmt.Println(i) //输出0,因为i此时就是0
    i++
    defer fmt.Println(i) //输出1,因为i此时就是1
    return i
}

/**
 * 当执行return 1时,1先赋值给i.然后defer代码块开始执行,对i进行自增操作。 因此输出2
 */
func c() (i int) {
    defer func() {
        i++
    }()
    return 1
}

func f0() (t int) {
    t = 1
    defer func() {
        t = t + 5
    }()
    return t
}

/**
 * t先赋值给r,然后执行defer,虽然t被改了,由于值传递返回值仍然是1
 */
func f1() (r int) {
    t := 1
    defer func() {
        t = t + 5
    }()
    return t
}

/**
 * t先赋值给r,然后执行defer,t被改了,由于传的是地址,返回值是6
 */
func f1p() (r *int) {
    t := 1
    defer func() {
        t = t + 5
    }()
    return &t
}

/**
 * r默认值是0,作为参数传入了defer不会修改r的值,1会赋值给r,返回值为1
 */
func f2() (r int) {
    defer func(r int) {
        r = r + 5
    }(r)
    return 1
}

/**
 * 1赋值给r,然后执行defer,此时r被修改为6,返回的r值为6
 */
func f3() (r int) {
    defer func() {
        r = r + 5
    }()
    return 1
}

/**
 * 0赋值给result,然后defer执行,result值自增变为1,返回值为1
 */
func f40() (result int) {
    defer func() {
        result++
    }()
    return 0
}

/**
 * return不写返回变量,声明的变量名字也会被返回0
 */
func f4() (result int) {
    result = 0
    return
}

/**
 * 传入地址,i的值最终被改为了15,但是返回值是10
 */
func f5(i *int) int {
    *i = 10
    defer func() {
        *i = 15
    }()
    return *i
}