First_beego

使用beego创建api项目,实现增删改查,简单记录

1.mac安装beego和bee工具

1
2
go get -u github.com/beego/beego/v2
go get -u github.com/beego/bee/v2
  • 如果需要bee设置为全局变量,添加zshrc全局alias,在~/.zshrc中编辑添加alias bee=xxx/bee
  • beego官方文档

2.使用bee工具创建项目

1
bee api app_delivery -conn="root:root****@tcp(127.0.0.1:3306)/test-beego
  • 创建后orm.RegisterDataBase(“default”, “mysql”, beego.AppConfig.String(“sqlconn”))有报错,通过参数接收下beego.AppConfig.String(“sqlconn”),因为有两个返回值

3.models层user.go实现代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package models

import (
	"fmt"
	"github.com/beego/beego/v2/client/orm"
	beego "github.com/beego/beego/v2/server/web"
	_ "github.com/go-sql-driver/mysql"
)

func init() {
	orm.Debug = true
	orm.RegisterDriver("mysql", orm.DRMySQL)
	db,_ := beego.AppConfig.String("sqlconn")
	orm.RegisterDataBase("default", "mysql", db)
	orm.RegisterModel(new(User))
	orm.RunSyncdb("default", false, true)
}


type User struct {
	Id           int       `orm:"column(id);pk"`
	Name         string    `orm:"column(name)"`
	UserId        string    `orm:"column(User_id)"`
}

func AddUser(user *User) error{
	o:= orm.NewOrm()
	_, err := o.Insert(user)
	return err
}

func GetUser(user_id string) (*User, bool){
	o := orm.NewOrm()
	User := User{UserId: user_id}
	err := o.Read(&User,"User_id")
	if err == orm.ErrNoRows {
		fmt.Println("User not find")
		return &User, false
	} else if err == orm.ErrMissPK {
		fmt.Println("cant not find prikey")
		return &User, false
	} else {
		return &User, true
	}
}

func DeleteUser(user_id string) bool {
	o := orm.NewOrm()
	User := User{UserId: user_id}
	num, err := o.Delete(&User,"user_id")
	if err == nil {
		fmt.Println("delete num:", num)
		return true
	} else {
		return false
	}
}

func GetUserAll() []User{
	o := orm.NewOrm()
	qs:= o.QueryTable("user")
	var users []User
	count, err := qs.All(&users)
	if err != nil{
		fmt.Println("get all User failed")
	}
	fmt.Println("the count User is ",count)
	return users
}

4.controllers层user.go实现代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package controllers

import (
	"test-beego/models"
	"encoding/json"
	"fmt"
	beego "github.com/beego/beego/v2/server/web"

)

type UserController struct{
	beego.Controller
}

type Result struct {
	ErrNo    int           `json:"errno"`
	ErrMsg   string        `json:"errmsg"`
	Data     interface{}   `json:"data"`
}


func (d *UserController) CreateUser(){
	var user models.User
	var r Result
	defer func() {
		d.Data["json"] = r
		d.ServeJSON()
	}()
	err := json.Unmarshal(d.Ctx.Input.RequestBody, &user)
	if err !=nil{
		r.ErrMsg = fmt.Sprintf(" json unmarshal failed")
	}
	err :=models.AddUser(&User)
	if err != nil{
		r.ErrMsg=fmt.Sprintf("add user failed")
	}
	r.Data = user
}

func (d *UserController) GetUser(){
	var r Result
	defer func() {
		d.Data["json"] = r
		d.ServeJSON()
	}()
	r.Data,_ = models.GetUser(d.GetString(":user_id"))
	fmt.Println(d.GetString(":user_id"))
}

func (d *UserController) DeleteUser(){
	var r Result
	defer func() {
		d.Data["json"] = r
		d.ServeJSON()
	}()
	DelUserId := d.GetString(":user_id")
	IsTrue:=models.DeleteUser(DelUserId)
	if !IsTrue {
		r.ErrMsg =fmt.Sprintf("delete User failed")
	}
	var arry []string
	arry = append(arry, DelUserId)
	mp:= make(map[string][]string)
	mp["success_list"]= arry
	r.Data = mp
}

func (d *UserController) GetUserAll(){
	var r Result
	defer func() {
		d.Data["json"] = r
		d.ServeJSON()
	}()
	r.Data = models.GetUserAll()
}
//TODO 懒得写了
func (c *UserController) EditTask(){

}

5.路由router.go代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package routers

import (
	"app_delivery/controllers"
	beego "github.com/beego/beego/v2/server/web"
)

func init() {
	ns := beego.NewNamespace("/v1")
	beego.AddNamespace(ns)
	beego.Router("/api/users", &controllers.DeliveryController{}, "post:CreateUser")
	beego.Router("/api/users/?:user_id", &controllers.DeliveryController{}, "get:GetUser")
	beego.Router("/api/users/?:user_id", &controllers.DeliveryController{}, "delete:DeleteUser")
	beego.Router("/api/users/getall", &controllers.DeliveryController{}, "get:GetUserAll")
}

6. Main.go主要代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import (
	_ "app_delivery/routers"
	beego "github.com/beego/beego/v2/server/web"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	if beego.BConfig.RunMode == "dev" {
		beego.BConfig.WebConfig.DirectoryIndex = true
		beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
	}
	beego.Run()
}
……

阅读全文

关于择偶

找什么样的人?有个文案感觉说的很有道理

其实,给你倒水,半夜给你买烧烤,这些都不是稀有的物种。
而现实是,有些人却偏偏为这种低成本的付出感动的死去活来! 真正的稀缺资源,是对方的谈吐,对方的知识面,对方的视野,对方控制局面的能力,对方的情绪稳定! 不要小看上面的这些特点,要培养这些优点,所耗成本是极高的,可遇不可求!

……

阅读全文

移除链表元素

题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点,具体见链接 LeetCode-203

相关代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package main

import "fmt"

type ListNode struct {
	Val  int
	Next *ListNode
}

//crete linklist
func CreateNode(node *ListNode, max int) {
	cur := node
	for i := 1; i < max; i++ {
		cur.Next = &ListNode{}
		cur.Next.Val = i
		cur = cur.Next
	}
}

//print linklist
func PrintNode(node *ListNode) {
	for cur := node; cur != nil; cur = cur.Next {
		fmt.Print(cur.Val, " ")
	}
	fmt.Println()
}

//leetcode 203. 移除链表元素
func removeElements(head *ListNode, val int) *ListNode {
	if head == nil {
		return head
	}
	head.Next = removeElements(head.Next, val)
	if head.Val == val {
		return head.Next
	}
	return head
}

func main() {
	var head = new(ListNode)
	CreateNode(head, 7)
	removeElements(head, 6)
	PrintNode(head)

}
……

阅读全文

Nginx日志统计

是一个比较简单的脚本用来nginx的access日志简单处理,主要实现以下三个功能:

  • 统计几分钟之内,请求最多的前几个ip(默认是3分钟,前10个ip)
  • 统计几分钟之内,请求最多的接口(默认是3分钟,前10个接口)
  • 统计前几ip,分别请求的前几个接口

具体脚本下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#输出日志访问量排名前top_num条数据,可自定义
top_num=10
time=$(date)
analyze_dir=/home/ap/nginx
access_log=/usr/local/openresty/nginx/logs/access.log
top_ip_file=$analyze_dir/ngx_log_top_ip.txt
top_dest_url_file=$analyze_dir/ngx_log_top_dest_url.txt
log_file=$analyze_dir/minago_ngx_log.txt

mkdir -p $analyze_dir
#截取最近3分钟的日志文件,时间可修改
tac $access_log| awk 'BEGIN{ "date -d \"-3 minute\" +\"%H:%M:%S\"" | getline min3ago } { if (substr($4, 14) > min3ago) print $0;else exit }' | tac >$log_file

#获取最活跃IP
cat $log_file | awk '{print $1}' | sort | uniq -c | sort -rn | head -${top_num} > $top_ip_file

#获取请求最多的url
cat $log_file | awk '{print $7}' | sort | uniq -c | sort -rn | head -${top_num} > $top_dest_url_file

simple(){

echo "+-+-+-+-+-+- 下面是${time}的日志分析内容 +-+-+-+-+-+-"

#获取最活跃IP
printf "最活跃的前${top_num}个访问IP: \n"

cat $top_ip_file

echo ""

#获取请求最多的url
printf "请求最多的前${top_num}个url: \n"

cat $top_dest_url_file

echo ""


echo '-----------------------------------------------'

cat /home/ap/nginx/ngx_log_top_ip.txt | while read line

do

ip=$(echo $line | cut -d ' ' -f2)
count=$(echo $line | cut -d ' ' -f1)
printf "${ip}请求最多的10个接口如下:\n"

grep $ip $log_file |awk '{print $7}'|grep -v 'images\|js\|css\|png\|fonts\|html\|jpg'|sort |uniq -c |sort -rn |head -n 10 

echo '-----------------------------------------------'

done
}
simple
exit 0
……

阅读全文

Fibonacci

  1. 斐波那契数
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import "fmt"

//动态规划
func fib(n int) int {
	if n < 2 {
		return n
	}
	nums := make([]int, n)
	nums[0], nums[1] = 1, 1
	for i := 2; i < n; i++ {
		// nums[i] = (nums[i-1] + nums[i-2]) % 1000000007
		nums[i] = nums[i-1] + nums[i-2]
	}
	return nums[n-1]
}
//递归
func fib01(n int) int {
	if n < 2 {
		return n
	}
	return fib01(n-1) + fib01(n-2)
}

func main() {
	var n int
	fmt.Scanln(&n)
	fmt.Println(fib(n))
	fmt.Println("the fib01 is ", fib01(n))

}
……

阅读全文

再来学习一下tcp

为什么要再次学习tcp

其实很多时候,说不知道好像也知道,说知道也说不出所以然,貌似都是死记硬背这些东西,然后有个印象,理解不够透彻,今天再来温习一下大学里面学过的tcp,顺便记录一下,其实了解了整个过程,可能问题也就比较清楚了

下面这些问题,是不是经常遇到?

  1. tcp三次握手,四次挥手

  2. time_wait,close_wait出现在哪个过程

    ……

阅读全文

linux系统进程状态有哪些?

进程状态有哪些?

在学校的操作系统原理中,我们系统中的进程有多种状态,那对应到常用的linux系统,有哪些进程状态呢?通过top可看到有以下的状态:

  • R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。

  • D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。

    ……

阅读全文

理解平均负载和CPU使用率

平均负载

平均负载是指单位时间内,系统处于可运行状态不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。

  1. 使用uptime命令,依次是过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average;
  2. 理解平均负载, 比如当平均负载为 2 时,意味着什么呢?
    • 在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。
    • 在 4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲。
    • 而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。
  3. 一般来说,当平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的问题;

    ……

阅读全文

理解Linux中的buffer和cache

磁盘和文件的区别:

关于磁盘和文件的区别,本来以为大家都懂了,所以没有细讲。磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件

其实 Linux 中“一切皆文件”,而文章中提到的“文件”是普通文件,磁盘是块设备文件,这些大家可以执行 “ls -l <路径>” 查看它们的区别(输出的含义如果不懂请 man ls 查询)。

……

阅读全文