私域营销 运营 程序规划
管理员注册
|11|22|
|ddd|ddd|
|ddd|ddd|
只要声明使用外部网络即可
networks:
backend:
# 网络可以被外部连接
attachable: true
driver: overlaynetworks:
app_backend:
# 使用外部网络
external: true注意:docker swarm会给网络加上集群名字前缀,使用外部网络时候需要全称
npm install npm --registry=https://registry.npmmirror.com/ bignumber.js计算
function plus(arr){
var res = BigNumber(0);
for(var i in arr){
var j = arr[i]
res = res.plus(j)
}
return res.toFixed()
} 电子技术、离散数学、程序设计、数据结构、操作系统、计算机组成原理、微机系统、计算机系统结构、编译原理、计算机网络、数据库系统、软件工程、人工智能、计算机图形学、数字图像处理、计算机通讯原理、多媒体信息处理技术、数字信号处理、计算机控制、网络计算、算法设计与分析、信息安全、应用密码学基础、信息对抗、移动计算、数论与有限域基础、人机界面设计、面向对象程序设计
修改config/auth.php,在guards中增加所需内容,例如
'guards' => [
'admin' => [
'driver' => 'jwt',
'provider' => 'admins',
],
'user' => [
'driver' => 'jwt',
'provider' => 'users',
'hash' => false,
],
],'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']);
});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);
}
} https://mirrors.cloud.tencent.com/help/ubuntu.html
16
wget -O /etc/apt/sources.list http://mirrors.cloud.tencent.com/repo/ubuntu16_sources.list
18
wget -O /etc/apt/sources.list http://mirrors.cloud.tencent.com/repo/ubuntu18_sources.list// 开启记录
\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
}