标签 beego 下的文章

beego on range loop re-entry: {{range}} branches end in different contexts:


在html模板js中 ``字符串模板中渲染出现的这个错误

template Execute err: html/template:xxxx/xxxx.html:34:36: on range loop re-entry: {{range}} branches end in different contexts: {stateJSRegexp delimNone urlPartNone jsCtxRegexp attrNone elementScript <nil>}, {stateJS delimNone urlPartNone jsCtxRegexp attrNone elementScript <nil>}

最后改成这样写 就没问题了

QQ图片20200912145604.png


beego validation无效、失效 golang tag标签的一个坑


来看看结构体

这样 自己用table键吧tag标签搞得整整齐齐的

type People struct {
    Key     string `json:"key"         form:"key"         valid:"Required"`         //id值
    Name    string `json:"name"     form:"name"     valid:"Required"`         //名字
    Idcard  string `json:"idcard"     form:"idcard"     valid:"Length(18)"`   //身份证
    Iccard  string `json:"iccard"     form:"iccard"`                       //IC卡号
    Sex     int    `json:"sex"         form:"sex"         valid:"Required;Numeric"` //1男 2女
    Picture string `json:"picture"     form:"picture"     valid:"Base64"`     //照片 base64
}

然后我们反射一下看看结果

package main

import (
    "fmt"
    "reflect"
)

type People struct {
    Key     string `json:"key"         form:"key"         valid:"Required"`         //id值
    Name    string `json:"name"     form:"name"     valid:"Required"`         //名字
    Idcard  string `json:"idcard"     form:"idcard"     valid:"Length(18)"`   //身份证
    Iccard  string `json:"iccard"     form:"iccard"`                       //IC卡号
    Sex     int    `json:"sex"         form:"sex"         valid:"Required;Numeric"` //1男 2女
    Picture string `json:"picture"     form:"picture"     valid:"Base64"`     //照片 base64
}

func main() {

    people := People{
        Key: "ccc",
    }

    t := reflect.TypeOf(people)

    for i := 0; i < t.NumField(); i++ {
        key := t.Field(i)
        valid := key.Tag.Get("valid")
        fmt.Println(valid)
    }

}

果然输出结果是空的

2020-07-23T00:50:54.png

然后我们把结构体中的tag标签用空格分开

2020-07-23T00:52:37.png

再执行 反射成功!

2020-07-23T00:53:09.png


结论:

结构体tag标签中不能使用table键(可以用多个空格键,或者不用空格)

beego 怎么搭建websocket服务实时推送/接收数据



package controllers

import (
    "github.com/astaxie/beego"
    "github.com/gorilla/websocket"
    "log"
    "fmt"
    "net/http"
)
 

//连接的客户端,吧每个客户端都放进来
var clients = make(map[*websocket.Conn]bool) 
//广播频道(通道)
var broadcast = make(chan Message)           
// 配置升级程序(升级为websocket)
var upgrader = websocket.Upgrader{}

// 定义我们的消息对象
type Message struct {
    Data    interface{} `json:"data"`
}

func (c *SbController) WebSocketServi(){
    // 解决跨域问题(微信小程序)
    upgrader.CheckOrigin = func(r *http.Request) bool {
        return true
    }
    //升级将HTTP服务器连接升级到WebSocket协议。
    //responseHeader包含在对客户端升级的响应中
    //请求。使用responseHeader指定Cookie(设置Cookie)和
    //应用程序协商的子目录(Sec WebSocket协议)。
    //如果升级失败,则升级将向客户端答复一个HTTP错误
    ws, err := upgrader.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil)
    if err != nil {
        log.Fatal(err)
    }
     defer ws.Close()

    //将当前客户端放入map中
    clients[ws] = true
    
    
    m := Message{
        Data:0,
    }
    //把消息 写入通道
    broadcast <- m

    c.EnableRender = false //Beego不启用渲染

    var s Message
    for {
        //接收客户端的消息
        err := ws.ReadJSON(&s)
        if err != nil {
            log.Printf("页面可能断开啦 ws.ReadJSON error: %v", err.Error())
            delete(clients, ws) //删除map中的客户端
            break //结束循环
        } else {
            //接受消息 业务逻辑
            fmt.Println("接受到从页面上反馈回来的信息 ", s)
        }
    }    
}


func init() {
    go handleMessages()
}

//广播推送消息
func handleMessages() {
    for {
        //读取通道中的消息
        msg := <-broadcast
        fmt.Println("clients len ", len(clients))
        //循环map客户端
        for client := range clients {
            //把通道中的消息发送给客户端
            err := client.WriteJSON(msg)
            if err != nil {
                log.Printf("client.WriteJSON error: %v", err)
                client.Close()//关闭
                delete(clients, client)//删除map中的客户端
            }
        }
    }
}

beego模板中range循环嵌套if


错误示例

template Execute err: template: xxxx executing "xxxx" at <.sortId>: can't evaluate field xxx in type xxx

这个错误是说 找不到range循环中的变量xxx


beego模板中range循环嵌套if,if中要加$符号,否则默认取循环中的变量。以下是正确用法!

              {{range $k,$v := .sort}}
              <li class="nav-item {{if eq $v.Id  $.sortId }} active {{end}}">
                <a class="nav-link" href="/?sort_id={{$v.Id}}"> {{.SortName}}</a>
              </li>
              {{end}}

IIS反向代理beego项目


今天在windows server 系统上部署beego项目 从来没用过iis我点蒙b了 ,疯狂百度+谷歌。这里记录下!!!

首先需要在IIS上安装ARR(Application Request Router)反向代理插件
官方下载地址:https://www.iis.net/downloads/microsoft/application-request-routing

如果提示以下错误
xxxx.png
解决办法:
安装系统更新补丁KB2533623即可。
官方下载地址:https://support.microsoft.com/en-us/help/2533623/microsoft-security-advisory-insecure-library-loading-could-allow-remot

安装后重启服务器,根据下图设置

421846-20170716211423894-5010394661111.jpg
421846-20170716211433535-1747813282.jpg

然后在项目根目录中新建web.config文件填写如下规则

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="反向代理规则">
                    <match url="^(.*)" />
                    <conditions>
                        #这里是访问过来的域名
                        <add input="{HTTP_HOST}" pattern="^www.test.com$" />
                    </conditions>
                   #这里是你项目的路径
                    <action type="Rewrite" url="http://127.0.0.1:8088/{R:1}" />
                </rule>
               #这里是301重定向 吧根域名定向www
               <rule name="WWW Redirect" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{HTTP_HOST}" pattern="^test.com$" />
            </conditions>
            <action type="Redirect" url="http://www.test.com/{R:0}" redirectType="Permanent" />
        </rule>

            </rules>
        </rewrite>
    </system.webServer>


</configuration>

BeeGo过滤器做用户权限控制


package routers

import (
    "项目/controllers"
    "项目/models"

    "github.com/astaxie/beego"
    "github.com/astaxie/beego/context"
)

func init() {
    var FilterUser = func(ctx *context.Context) {
        u, _ := ctx.Input.Session("user").(models.LpUser)
        if u.Id == 0 {
            ctx.Redirect(302, "/login")
        }
    }
        beego.InsertFilter("/user/*", beego.BeforeRouter, FilterUser)
}

BeeGo结构体嵌套结构体数组


结构体

//输入参数
type AjaxRequestData struct {
    Handsontabledata []*HandsontableDataArr
    SysCode         string
    TableCode          string
    Lsh              string
}

type  HandsontableDataArr struct {
    ReportCode        string
    ReportName        string
    AccCode            string
    AccName            string
    Jie                float64
    Dai                float64
}

控制器

//控制器
func (this *AdjustmentVouchersController) Addfl() {
    var ob models.AjaxRequestData
    var err error
    if err = json.Unmarshal(this.Ctx.Input.RequestBody, &ob); err == nil {
        this.Data["json"] = ob
    } else {
        this.Data["json"] = err.Error()
    }
    this.ServeJSON()
}

前端提交的json数据

{
    "Handsontabledata":[
        {
            "ReportCode":"77101",
            "ReportName":"流动资产:",
            "AccCode":"1001",
            "AccName":"现金",
            "Jie":1000,
            "Dai":0
        },
        {
            "ReportCode":"77101",
            "ReportName":"流动资产:",
            "AccCode":"1002",
            "AccName":"银行存款",
            "Jie":0,
            "Dai":1000
        }
    ],
    "SysCode":"3201711110000000010",
    "TableCode":"",
    "Lsh":""
}: 

后端返回的的json数据

{
  "Handsontabledata": [
    {
      "ReportCode": "77101",
      "ReportName": "流动资产:",
      "AccCode": "1001",
      "AccName": "现金",
      "Jie": 1000,
      "Dai": 0
    },
    {
      "ReportCode": "77101",
      "ReportName": "流动资产:",
      "AccCode": "1002",
      "AccName": "银行存款",
      "Jie": 0,
      "Dai": 1000
    }
  ],
  "SysCode": "3201711110000000010",
  "TableCode": "",
  "Lsh": ""
}