2024年Go:Beego零基础到项目实战(2),2024年最新一线互联网公司面经总结

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

{ {or .X .Y .Z} }

只要有一个不为空,则返回第一个不为空的,否则返回空

  1. index:读取指定类型对应下标的值

获取

后端:

this.Data[“data_map”] = map[string]string{“name”: “Beego”}

this.Data[“arrs”] = []int{1,2,3,4,5}

前端:

{{index .data_map “name”}}

{{index .arrs 1}}

  1. len:返回对应类型的长度

{ { .Content|len } }

  1. not:返回输入参数的否定值

{{not .is_ok }}

6.eq / ne / lt / le / gt / ge

  • eq:等于 equls

  • ne:不等于

  • lt:小于 less

  • le:小于等于 区别于lte

  • gt:大于 greater

  • ge:大于等于 区别于gte

  1. 内置模板函数

1.date 格式化时间

{{date .T “Y-m-d H:i:s”}}

  1. compare 比较

{{compare ‘a’ 97}}

  1. substr 截取字符串

{{substr “我是中国人” 0 4}}

  1. map_get 获取map的指定key值

{{ map_get .m “a” }}

  1. url_for

{{urlfor “TestController.List”}}

3.3 自定义模板函数


第一步:定义函数

func hello(in string)(out string){

out = in + “world”

return

}

第二步:AddFuncMap

// 在beego.Run()之前

beego.AddFuncMap(“hi”,helle)

第三步:前端使用

{{“hello world” | hi}}

四、controller模块

=========================================================================

4.1 配置文件的使用


4.1.1 读取配置

beego.AppConfig.String(“mysqluser”)

4.2.2 引入其他配置文件

app.conf是主配置文件。其他的配置文件需要再app.conf中引入

include “mysql_server.conf”

4.3.3 常用的配置

  1. ViewsPath:模板路径,默认值是 views。

  2. StaticDir:静态文件目录设置,默认是static

  3. sessionon:session 是否开启,默认是 false

  4. httpport:监听端口

  5. EnableXSRF:EnableXSRF

  6. XSRFExpire:XSRF 过期时间,默认值是 0,不过期。

  7. MaxMemory:文件上传默认内存缓存大小,默认值是1 << 26(64M)。

  8. RunMode:应用的运行模式,可选值为prod,dev或者test. 默认是dev, 为开发模式

4.2 路由详解


4.2.1 固定路由

一个固定的路由,一个控制器,然后根据用户请求方法不同请求控制器中对应的方法

beego.Router(“/hello”, &controllers_user.Hello{})

4.2.2 正则路由

beego.Router(“/api/?:id”, &controllers.RController{})

beego.Router(“/api/?🆔int”, &controllers.RController{})

:id([0-9]+) 或者 :id([\d]+) 或者 🆔int

:username([\w]+) 或者 :username:string

4.2.3 自动路由

注册路由的时候不需要指定url,只需要注册控制器即可

beego.AutoRouter(&controllers.UserController{})

规则:

/控制器名/方法名/后面的都是参数。。。

如:/user/get/123/456

4.2.4 自定义路由

注册路由的时候可以指定第三个参数,这个参数就是用来自定义路由的

用法: method :函数名

post:Login post请求的时候访问Login函数

get:User get请求的时候访问User函数

*:LoginOut 所有的请求方法都访问LoginOut函数

4.3 自定义过滤器


需要登录才能访问的

/cms/user/add

/cms/user/list

/cms/user/edit

/cms/book/add

不需要登录可以访问:

/

/login

/register

beego.InsertFilter(pattern string, position int, filter FilterFunc, params …bool)

  • 第一个参数表示过滤的路由规则,支持通配符

  • 第二个参数就是过滤器的位置,beego支持的有5种

  • BeforeStatic 静态地址之前

  • BeforeRouter 寻找路由之前

  • BeforeExec 找到路由之后,开始执行相应的 Controller 之前

  • AfterExec 执行完 Controller 逻辑之后执行的过滤器

  • FinishRouter 执行完逻辑之后执行的过滤器

  • 第三个参数为执行的函数

  • func(*context.Context) 参数必须是context.Context , context是beego包下的

  • 其他参数:使用默认得到true即可

示例:

func main() {

// 过滤器

beego.InsertFilter(“/*”, beego.BeforeRouter, controllers.LoginSpider1Filter)

beego.Run()

}

func LoginSpider1Filter(ctx *context.Context) {

// 获取session

id := ctx.Input.Session(“spider1_uid”)

if id == nil { // 说明未登录

ctx.Redirect(302,“/main/spider1/to_login”)

// 路由反转:beego.URLFor(“TestController.Get”)

}

}

注意:使用 session 的 Filter 必须在 BeforeStatic 之后才能获取,因为 session 没有在这之前初始化。

4.4 表单数据验证


4.4.1 安装

go get github.com/astaxie/beego/validation

4.4.2 使用

结构体定义tag

  • 验证函数写在 “valid” tag 的标签里

  • 各个函数之间用分号 “;” 分隔,分号后面可以有空格

  • 参数用括号 “()” 括起来,多个参数之间用逗号 “,” 分开,逗号后面可以有空格

  • 正则函数(Match)的匹配模式用两斜杠 “/” 括起来

  • 各个函数的结果的 key 值为字段名.验证函数名

type LoginParams struct {

Name string valid:“Required”

Age int valid:“Required;MinSize(2)”

Addr string valid:“Required”

}

func (l *LoginController) Post() {

valid := validation.Validation{}

// 解析到结构体

params := LoginParams{}

if err := l.ParseForm(&params); err != nil {

//handle error

return

}

//重写错误信息:validation.SetDefaultMessage(map)

var messages = map[string]string{

“Required”: “不能为空”,

“MinSize”: “最短长度为 %d”,

“Length”: “长度必须为 %d”,

“Numeric”: “必须是有效的数字”,

“Email”: “必须是有效的电子邮件地址”,

“Mobile”: “必须是有效的手机号码”,

}

validation.SetDefaultMessage(messages)

// 校验

b, err := valid.Valid(&params)

// 验证StructTag 是否正确

if err != nil {

fmt.Println(err)

}

if !b {

// 验证没通过,则b为false

for _, err := range valid.Errors {

fmt.Println(err.Key, err.Message)

message := err.Key + err.Message

l.Ctx.WriteString(message)

}

}

}

4.5 session和cookie


4.5.1 什么是session?

  • Session是在_无状态_的HTTP协议下,服务端记录用户状态时用于标识具体用户的机制

  • 它是在服务端保存的用来跟踪用户的状态的数据结构,可以保存在文件、数据库或者集群中

  • 在浏览器关闭后这次的Session就消失了,下次打开就不再拥有这个Session。其实并不是Session消失了,而是Session ID变了,

4.5.2 什么是cookie?

  • Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息

  • 每次HTTP请求时,客户端都会发送相应的Cookie信息到服务端。它的过期时间可以任意设置,如果你不主动清除它,在很长一段时间里面都可以保留着,即便这之间你把电脑关机了。

  • 每次客户端发请求的时候会自动携带该域名下的Cookie,不用域名间的Cookie是不能共享的

4.5.3 session和cookie:

  • Cookie 在客户端(浏览器),Session 在服务器端。

  • Cookie的安全性一般,他人可通过分析存放在本地的Cookie并进行Cookie欺骗。在安全性第一的前提下,选择Session更优。重要交互信息比如权限等就要放在Session中,一般的信息记录放Cookie就好了。

  • 单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。

  • Session 可以放在 文件、数据库或内存中

  • 用户验证这种场合一般会用 Session。因此,维持一个会话的核心就是客户端的唯一标识,即Session ID。

  • Session 的运行依赖Session ID,而 Session ID 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)

4.5.4 beego中使用session:

  • 开启session

  • main.go中开启:

  • beego.BConfig.WebConfig.Session.SessionOn = true

  • 配置文件中开启:

  • sessionon = true

  • 使用sessio

  • 设置session

  • SetSession(name string, value interface{})

  • this.SetSession(“username”, “zhiliao”)

  • 获取session

  • GetSession(name string) interface{}

  • this.GetSession(“username”)

  • 删除session

  • this.DelSession(name string)

  • 在过滤器中获取session

  • ctx.Input.Session(“user_name”)

  • 关于session的一些其他配置

  • 设置是否开启 Session

  • beego.BConfig.WebConfig.Session.SessionOn

  • 默认为false

  • 设置 Session 过期的时间

  • beego.BConfig.WebConfig.Session.SessionGCMaxLifetime

  • 默认值是 3600 秒

  • 设置 cookie 的过期时间

  • beego.BConfig.WebConfig.Session.SessionCookieLifeTime

  • 设置sessionid加密算法

  • beego.BConfig.WebConfig.Session.SessionHashFunc

  • 默认值为 sha1

  • 修改sessionkey

  • beego.BConfig.WebConfig.Session.SessionHashKey

  • 默认的 key 是 beegoserversessionkey,建议在使用的时候修改该参数

  • 设置 cookies 的名字

  • beego.BConfig.WebConfig.Session.SessionName

  • Session 默认是保存在用户的浏览器 cookies 里面的,默认名是 beegosessionID,配置文件对应的参数名是:sessionname。

五、model模块

====================================================================

5.1 orm的使用


5.1.1 mysql安装

  • 用户名和密码的配置

5.1.2 navicat安装

5.1.3 beego中使用

  • 安装:

  • go get github.com/astaxie/beego/orm

  • go get github.com/go-sql-driver/mysql

  • 连接数据库:

  • orm.RegisterDriver(“mysql”, orm.DRMySQL)

  • orm.RegisterDataBase(“default”, “mysql”, “用户名:密码@tcp(IP:端口号)/数据库?charset=utf8”, 30)

  • 参数一:数据库的别名,用来在 ORM 中切换数据库使用

  • 参数二:驱动名称

  • 参数三:对应的链接字符串

  • 参数四(可选):设置最大空闲连接

  • 或根据数据库别名设置:orm.SetMaxIdleConns(“default”, 30)

  • 参数五(可选):设置最大数据库连接

  • 或根据数据库别名设置: orm.SetMaxOpenConns(“default”, 30)

  • 注册模型

  • 在init函数中:orm.RegisterModel(new(Article)),只有注册了模型才可以使用

  • 创建表

  • 在数据库中操作创建表即可,后面会讲自动迁移表

  • 时区设置:

  • orm.DefaultTimeLoc = time.UTC // 设置为 UTC 时间

  • ORM 在进行 RegisterDataBase 的同时,会获取数据库使用的时区,然后在 time.Time 类型存取时做相应转换,以匹配时间系统,从而保证时间不会出错

  • 示例代码

  • 首先创建好数据库和表,表对应结构体中的属性

  • app.conf链接信息配置:

dbhost = 127.0.0.1

dbuser = root

dbpassword = root

dbport = 3306

db = user

main.go中初始化链接:

  • orm.RegisterDriver(“mysql”, orm.DRMySQL)

  • orm.RegisterDataBase(“default”, “mysql”, “root:root@/orm_test?charset=utf8”)

“github.com/astaxie/beego/orm”

_ “github.com/go-sql-driver/mysql”

func init() {

// 读取配置信息

dbhost := beego.AppConfig.String(“dbhost”)

dbport := beego.AppConfig.String(“dbport”)

dbuser := beego.AppConfig.String(“dbuser”)

dbpassword := beego.AppConfig.String(“dbpassword”)

db := beego.AppConfig.String(“db”)

//注册mysql Driver

orm.RegisterDriver(“mysql”, orm.DRMySQL)

//构造conn连接

//用户名:密码@tcp(url地址)/数据库

conn := dbuser + “:” + dbpassword + “@tcp(” + dbhost + “:” + dbport + “)/” + db + “?charset=utf8”

//注册数据库连接

orm.RegisterDataBase(“default”, “mysql”, conn)

fmt.Printf(“数据库连接成功!%s\n”, conn)

}

模型结构体:

注意:结构体的字段名首字母必须大写

type Article struct {

Id int

Name string

Author string

}

func init(){

orm.RegisterModel(new(Article))

}

增加数据:

o := orm.NewOrm()

o.Using(“default”) // default可以不用using

newStudent := Student{Name:“zhiliao”,Age:18,Gender:“男”}

//新增数据

id, err :=o.Insert(&newStudent) // 返回添加的数据id以及错误信息

注意:

  • ORM 必须注册一个别名为 default 的数据库,作为默认使用

5.2 模型定义


用作数据库数据转换和自动建表

5.2.1 模型名和表名映射

  1. 模型名和表名的映射规则:除了开头的大写字母以外,遇到大写会增加 _,原名称中的下划线保留。

① Article -> article

② AuthUser -> auth_user

③ Auth_User -> auth__user 两个下划线

④DB_AuthUser -> d_b__auth_user

  1. 自定义表名

type User struct {

Id int

Name string

}

func (u *User) TableName() string {

return “auth_user”

}

5.2.2 设置参数:使用structtag

  1. 忽略字段structtag:`orm:“-”`

  2. pk设置为主键,适用于自定义其他类型为主键

  3. null:Name string `orm:“null”`

  4. auto:自增长

Id int orm:"pk;auto"

  1. index:索引

Name string orm:"index"

索引的作用:优化查询,相当于图书的目录

  1. unique

Name string orm:"unique"

  1. column

Name string orm:"column(user_name)"

  1. size:对string起作用

Title string orm:"size(60)"

  1. digits / decimals 4 2 12.21

Money float64 orm:"digits(12);decimals(4)" 总长度12,小数点后有4位小数

  1. auto_now / auto_now_add

Created time.Time orm:"auto_now_add;type(datetime)"

Updated time.Time orm:"auto_now;type(datetime)"

auto_now 每次 model 保存时都会对时间自动更新

auto_now_add 第一次保存时才设置时间

  1. type:日期还是时间

Created time.Time orm:"auto_now_add;type(date)"

Created time.Time orm:"auto_now_add;type(datetime)"

  1. default

Gender float64 orm:"default(0)"

  1. description

修改源码:cmd_utils.go的 getColumnAddQuery()最后加:fi.description,

Name string orm:"description(这是标签名称)"

5.2.3 表关系

  1. 一对一

① User模型中: Profile *Profile `orm:“rel(one)”` 正向关系,有外键字段

② Profile模型中: User *User `orm:“reverse(one)”` 反向关系,只是关系,没有外键

  1. 一对多

① article模型中:User *User `orm:“rel(fk)”` 正向关系,有外键,外键在多的一方

② user模型中:Articles []*Articles `orm:“reverse(many)” 反向关系,没有外键

一对多,外键在多的一方

  1. 多对多

① post模型中:Tags []*Tag `orm:“rel(m2m)”` 正向关系,没有外键

② tag模型中:Posts []*Post `orm:“reverse(many)”` 反向关系,没有外键

5.3 exper表达式


前提:注册模型:RegisterModel

5.3.1 使用QueryTable

o := orm.NewOrm()

qs := o.QueryTable(“user”) 表名作为参数

qs := o.QueryTable(new(User)) 也可以直接使用对象作为表名

返回的是QuerySeter

5.3.2 exper表达式的使用:两个下换线

  1. exact / iexact:等于,默认值,大小写敏感 / 不敏感

qs.Filter(“name__exact”,“Zhiliao”).One(&stu)

  1. contains / icontains:包含,大小写敏感 / 不敏感

qs.Filter(“name__contains”,“Zhil”).One(&stu)

  1. gt / gte:大于/大于等于

qs.Filter(“age__gt”,18).One(&stu)

  1. lt / lte:小于/小于等于

qs.Filter(“age__lt”,18).One(&stu)

  1. startswith / istartswith:以…起始,大小写敏感 / 不敏感

qs.Filter(“name__startswith”,“Zh”).One(&stu)

qs.Filter(“name__istartswith”,“Zh”).One(&stu)

  1. endswith / iendswith:以…结束,大小写敏感 / 不敏感

qs.Filter(“name__endswith”,“Liao”).One(&stu)

qs.Filter(“name__iendswith”,“Liao”).One(&stu)

  1. in:在某个范围中,值为不定长参数

qs.Filter(“age__in”,12,13,16,19).One(&stu)

  1. isnull:为空,值为 true / false

qs.Filter(“gender__isnull”,true).One(&stu)

查看orm执行的sql语句:

  • 只作用于当前的模型:当前模型的init中orm.Debug = true

  • 作用于所有模型:beego.Run()前面设置orm.Debug = true

5.4 QueryTable接口


One:一条数据

  • qs.Filter(“name__exact”,“Zhiliao”).One(&stu)

  • 指定显示的字段

  • qs.Filter(“name__exact”,“Zhiliao”).One(&stu,“name”,“age”)

Filter:包含条件

  • 多个 Filter 之间使用 AND 连接

  • qs.Filter(“profile__isnull”, true).Filter(“name”, “slene”)

  • 类sql: WHERE NOT profile_id IS NULL AND name = ‘slene’

All:所有数据

  • 返回对应的结果集对象

  • 默认最大行数为 1000

  • user_arr := []models.UserStruct{}

  • qs.Filter(“name__exact”,“Zhiliao”).All(&user_arr)

  • 指定显示的字段

  • qs.Filter(“name__exact”,“Zhiliao”).All(&user_arr,“name”,“age”)

Exclude:排除条件

  • Exclude 之间使用 AND 连接

  • 使用 NOT 排除条件

  • qs.Exclude(“profile__isnull”, true).Filter(“name”, “slene”)

Limit:限制最大返回数据行数

  • 第二个可选参数可以设置Offset,意思从什么位置开始查询

  • qs.Limit(10, 20)

  • LIMIT 10 OFFSET 20 注意跟 SQL 反过来的

  • beego中limit的使用:qs.Limit(2,1).All(&user_arr)

  • sql的limit:limit 0,2; 从第0个数据开始,查询两条数据

Offset:设置 偏移行数,意思从什么位置开始查询

  • qs.Offset(20)

  • beego中使用:qs.Filter(“name__isnull”,false).Offset(1).All(&user_arr)

  • 角标从0开始,代表第一条数据

GroupBy:分组

  • 根据“By”指定的规则对数据进行分组

  • beego中使用GroupBy:qs.GroupBy(“age”).All(&user_arr)

  • sql:SELECT SUM(age) FROM `user` GROUP BY addr

  • group by 必须放在 order by 和 limit之前

OrderBy:排序

  • 参数使用 expr

  • ASC升序,字段名前面没有- :qs.OrderBy(“age” ) 默认的

  • DESC降序,字段名前面有- :qs.OrderBy(“-age” )

  • 根据多个字段排序,用逗号隔开: qs.OrderBy(“-age” ,“name”)

  • qs.OrderBy(“-age”).All(&user_arr)

Distinct:去重,没有参数

  • 根据指定字段去重,需要在all方法中指定字段,否则根据所有字段去重

  • beego中的使用:qs.Distinct().All(&user_arr,“name”,“age”,“addr”)

  • sql:SELECT DISTINCT addr, age,name FROM `user`

Count:统计个数,没有参数,后面不能跟查询条数的方法

  • num, err := qs.Filter(“name__isnull”,false).Count()

  • 统计的个数

  • 错误信息

  • sql:SELECT COUNT(*) FROM `user`;

Exist:是否存在,没有参数,后面不能跟查询条数的方法

  • exict := qs.Filter(“name__isnull”,false).Exist()

  • 返回true或false

Update:更新

  • 依据当前查询条件,进行批量更新操作

  • num, err := o.QueryTable(“user”).Filter(“name”, “slene”).Update(orm.Params{“name”: “astaxie”,})

  • 返回更新的条数和错误信息

Delete:删除

  • 依据当前查询条件,进行批量删除操作

  • num, err := o.QueryTable(“user”).Filter(“name”, “slene”).Delete()

  • 返回删除的条数和错误信息

**补充:不是QueryTable接口

insert:插入**

5.5 自动建表


前提:

  • 数据库已注册:orm.RegisterDataBase

  • 模型已注册:orm.RegisterModel

5.5.1 在main.go中调用RunCommand命令

beego.Run()命令之前调用:

orm.RunCommand()

5.5.2 cmd中执行命令

go run main.go orm syncdb -h

syncdb参数:

  • db:指定数据库别名,默认使用别名为 default

  • force 删除表后再创建,默认为true

  • v 可以查看执行的 sql 语句

查看执行的sql语句

go run main.go orm sqlall

5.5.3 在程序中调用直接自动建表

name := “default”

// drop table 后再建表

force := false

// 打印执行过程

verbose := true

// 遇到错误立即返回

err := orm.RunSyncdb(name, force, verbose)

if err != nil {

fmt.Println(err)

}

六、日志模块

=================================================================

6.1 日志模块的使用


下载包:go get github.com/astaxie/beego/logs

6.1.1 使用

引入包:import “github.com/astaxie/beego/logs”

添加输出引擎:logs.SetLogger(“console”)

打日志:logs.Debug(“this is debug”)

SetLogger参数:

  • 第一个参数:引擎

  • 第二个参数:日志配置信息,字符串,不同的引擎参数不一样

{"filename":"project.log","level":7,"maxlines":0,"maxsize":0,"daily":true,"maxdays":10,"color":true}

6.1.2 日志級別

1:LevelEmergency

2:LevelAlert

3:LevelCritical

4:LevelError

5:LevelWarn = LevelWarning

6:LevelNotice

7:LevelInfo = LevelInformational

8:LevelTrace = LevelDebug

6.1.3引擎

  1. console

logs.SetLogger(logs.AdapterConsole, {"level":1,"color":true})

  1. file

输出到文件

logs.SetLogger(logs.AdapterFile, {"filename":"test.log"})

参数:

① filename 保存的文件名

② maxlines 每个文件保存的最大行数,默认值 1000000

③ maxsize 每个文件保存的最大尺寸,默认值是 1 << 28, //256 MB 2^28 1<< 3 2^3

④ daily 是否按照每天 logrotate,默认是 true

⑤ maxdays 文件最多保存多少天,默认保存 7 天

⑥ rotate 是否开启 logrotate,默认是 true

⑦ level 日志保存的时候的级别,默认是 Trace 级别

⑧ perm 日志文件权限 4(读权限)2(写权限)1(执行权限)

  1. multifile

多文件日志写入,对号入座写入,比如test.error.log,err.debug.log

logs.SetLogger(logs.AdapterMultiFile, {"filename":"test.log","separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]})

  1. smtp

邮件发送

logs.SetLogger(logs.AdapterMail,{"username":"xxx@qq.com","password":"认证密码","host":"smtp.qq.com:587","fromAddress":"xxx@qq.com","sendTos":["xxx@qq.com"]})

七、实战

===============================================================

7.1 实战介绍


7.1.1 后端:

登录,帖子管理

7.1.2 前端:

登录、注册、帖子评论(一级,二级评论)

八、补充

===============================================================

8.1 beego中使用富文本编辑器


引入css:前两个必须引入

引入js:第一个必须引入

使用:

var editor = new FroalaEditor(“#content”,{ // 注意设置的id

toolbarButton:[‘bold’,‘italic’],

language:‘zh_cn’,

width: 500,

height:100,

toolbarButtons: [‘fullscreen’, ‘bold’, ‘italic’, ‘underline’, ‘strikeThrough’, ‘subscript’, ‘superscript’, ‘fontFamily’, ‘fontSize’, ‘|’, ‘color’, ‘emoticons’, ‘inlineStyle’, ‘paragraphStyle’, ‘|’, ‘paragraphFormat’, ‘align’, ‘formatOL’, ‘formatUL’, ‘outdent’, ‘indent’, ‘-’, ‘insertLink’, ‘insertImage’, ‘insertTable’, ‘|’, ‘quote’, ‘insertHR’, ‘undo’, ‘redo’, ‘clearFormatting’, ‘selectAll’, ‘html’],

quickInsertButtons: [‘image’, ‘table’, ‘ol’, ‘ul’]

// imageUploadURL: “http://192.168.1.86:8080/exampage/ques/ziliaoceshi.do”,

});

参数设置:

placeholderText: ‘请输入内容’, //默认填充内容

charCounterCount: true,//默认 显示字数

saveInterval: 0,//不自动保存,默认10000,0为不自动保存

width: 450, 宽度

height:500, 高度

charCounterMax: 3000, //最大字数限制,-1为不限制

imageUploadMethod:图片上传请求方式

imageUploadURL:图片上传路径

imageDefaultWidth: 200, //上传图片后的默认大小

imageUploadParams: {aid: ‘1’}, //上传图片时带的参数

language: ‘zh_cn’,

videoUploadURL:视频上传路径

toolbarButtons: [‘bold’, ‘italic’, ‘underline’, ‘paragraphFormat’, ‘align’,‘color’,‘fontSize’,‘insertImage’,‘insertTable’,‘undo’, ‘redo’]

获取内容:

events: {

initialized: function () {

const editor = this;

this.el.closest(‘form’).addEventListener(‘submit’, function (e) {

console.log(editor.$oel.val());

e.preventDefault()

})

}

}

8.2 beego中使用消息通知


需不需要表?

  • xx用户,你借的车辆已经预期,请尽快归还

  • 公司重大通知。

消息通知模块只是用来展示车辆逾期的通知嘛?

  • 不只是用来接受逾期的消息

表设计

| 字段名称 | 类型 | 长度 | 说明 |

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

var editor = new FroalaEditor(“#content”,{ // 注意设置的id

toolbarButton:[‘bold’,‘italic’],

language:‘zh_cn’,

width: 500,

height:100,

toolbarButtons: [‘fullscreen’, ‘bold’, ‘italic’, ‘underline’, ‘strikeThrough’, ‘subscript’, ‘superscript’, ‘fontFamily’, ‘fontSize’, ‘|’, ‘color’, ‘emoticons’, ‘inlineStyle’, ‘paragraphStyle’, ‘|’, ‘paragraphFormat’, ‘align’, ‘formatOL’, ‘formatUL’, ‘outdent’, ‘indent’, ‘-’, ‘insertLink’, ‘insertImage’, ‘insertTable’, ‘|’, ‘quote’, ‘insertHR’, ‘undo’, ‘redo’, ‘clearFormatting’, ‘selectAll’, ‘html’],

quickInsertButtons: [‘image’, ‘table’, ‘ol’, ‘ul’]

// imageUploadURL: “http://192.168.1.86:8080/exampage/ques/ziliaoceshi.do”,

});

参数设置:

placeholderText: ‘请输入内容’, //默认填充内容

charCounterCount: true,//默认 显示字数

saveInterval: 0,//不自动保存,默认10000,0为不自动保存

width: 450, 宽度

height:500, 高度

charCounterMax: 3000, //最大字数限制,-1为不限制

imageUploadMethod:图片上传请求方式

imageUploadURL:图片上传路径

imageDefaultWidth: 200, //上传图片后的默认大小

imageUploadParams: {aid: ‘1’}, //上传图片时带的参数

language: ‘zh_cn’,

videoUploadURL:视频上传路径

toolbarButtons: [‘bold’, ‘italic’, ‘underline’, ‘paragraphFormat’, ‘align’,‘color’,‘fontSize’,‘insertImage’,‘insertTable’,‘undo’, ‘redo’]

获取内容:

events: {

initialized: function () {

const editor = this;

this.el.closest(‘form’).addEventListener(‘submit’, function (e) {

console.log(editor.$oel.val());

e.preventDefault()

})

}

}

8.2 beego中使用消息通知


需不需要表?

  • xx用户,你借的车辆已经预期,请尽快归还

  • 公司重大通知。

消息通知模块只是用来展示车辆逾期的通知嘛?

  • 不只是用来接受逾期的消息

表设计

| 字段名称 | 类型 | 长度 | 说明 |

[外链图片转存中…(img-SfBdizcD-1715654109421)]
[外链图片转存中…(img-DIZOkDoG-1715654109422)]
[外链图片转存中…(img-Lj7y5nTP-1715654109422)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值