package controller import ( "GoClouds/core/utils" "GoClouds/service/userService" "GoClouds/webs/sys/app" "fmt" "github.com/donnie4w/go-logger/logger" "github.com/go-macaron/cache" gocloud "github.com/mgr9525/go-cloud" ruisUtil "github.com/mgr9525/go-ruisutil" "gopkg.in/macaron.v1" "io/ioutil" "net/http" "net/url" "strings" "time" ) type CommController struct{} func (e *CommController) GetPath() string { return "/comm" } func (e *CommController) Routes() { gocloud.Web.Any("/clearCache", e.clearCache) gocloud.Web.Any("/clearUserCache", e.clearUserCache) gocloud.Web.Any("/getUserPerms", e.getUserPerms) gocloud.Web.Any("/checkPermission", e.checkPermission) gocloud.Web.Any("/sendSms", e.sendSms) gocloud.Web.Any("/vaildSms", e.vaildSms) } func (e *CommController) Mid() []macaron.Handler { return []macaron.Handler{gocloud.AccessAllowFun} } func (e *CommController) clearCache(c *macaron.Context, ch cache.Cache, ctj gocloud.ContJSON) { key := ctj.GetString("key") if len(key) > 0 { ch.Delete(key) } else { ch.Flush() } c.PlainText(200, []byte("ok")) } func (e *CommController) clearUserCache(c *macaron.Context, ch cache.Cache, ctj gocloud.ContJSON) { uid := ctj.GetString("uid") if len(uid) <= 0 { c.PlainText(500, []byte("param err:uid!")) return } key := fmt.Sprintf("user-permission:%s", uid) ch.Delete(key) c.PlainText(200, []byte("ok")) } func (e *CommController) checkPermission(c *macaron.Context, ch cache.Cache, ctj gocloud.ContJSON) { uid := ctj.GetString("uid") perm := ctj.GetString("perm") if len(uid) <= 0 { c.PlainText(500, []byte("param err:uid!")) return } if len(perm) <= 0 { c.PlainText(500, []byte("param err:perm!")) return } c.PlainText(200, []byte(fmt.Sprintf("%t", userService.CheckPermission(uid, perm, ch)))) } func (e *CommController) getUserPerms(c *macaron.Context, ch cache.Cache, ctj gocloud.ContJSON) { uid := ctj.GetString("uid") if len(uid) <= 0 { c.PlainText(500, []byte("param err:uid!")) return } c.JSON(200, userService.FindUserPermissionCache(uid, ch)) } func (e *CommController) sendSms(c *macaron.Context, ch cache.Cache, ctj gocloud.ContJSON) { phone := ctj.GetString("phone") ips := ctj.GetString("ips") if len(phone) <= 0 { c.PlainText(500, []byte("param err:phone!")) return } if len(ips) <= 0 { c.PlainText(500, []byte("param err:ips!")) return } key1 := fmt.Sprintf("smsSend:%s", phone) key2 := fmt.Sprintf("smsCode:%s", phone) //key3 := fmt.Sprintf("smsSendIP:%s", ips) if ch.Get(key1) != nil /*||ch.Get(key3) != nil*/ { c.PlainText(511, []byte("1分钟后重试!")) return } code := utils.GenValidateCode(6) parm := url.Values{} parm.Set("mobile", phone) parm.Set("param", "code:"+code) parm.Set("tpl_id", app.Conf.Codetmpid) req, err := http.NewRequest("POST", "http://dingxin.market.alicloudapi.com/dx/sendSms", strings.NewReader(parm.Encode())) if err != nil { c.PlainText(512, []byte("服务器错误!")) return } cli := http.Client{Timeout: time.Second * 3} req.Header.Set("Authorization", "APPCODE "+app.Conf.Smskey) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") ch.Put(key1, []byte(fmt.Sprintf("%d", time.Now().Unix())), 60) //ch.Put(key3, []byte(fmt.Sprintf("%d", time.Now().Unix())), 60) res, err := cli.Do(req) if err != nil { logger.Info("sendSms http err:" + err.Error()) c.PlainText(513, []byte("服务器错误!")) return } defer res.Body.Close() bts, err := ioutil.ReadAll(res.Body) if err != nil { c.PlainText(514, []byte("服务器错误!")) return } mp := ruisUtil.NewMapo(bts) if mp.GetString("return_code") != "00000" { logger.Info("return_code err(", res.StatusCode, ":'", parm.Encode(), "'):", string(bts)) c.PlainText(521, []byte("发送失败:"+mp.GetString("return_code"))) return } logger.Info("发送短信:", phone, ",IP:", ips, "!!:", string(bts)) ch.Put(key2, []byte(code), 60*5) c.PlainText(200, []byte("ok")) } func (e *CommController) vaildSms(c *macaron.Context, ch cache.Cache, ctj gocloud.ContJSON) { phone := ctj.GetString("phone") code := ctj.GetString("code") if len(phone) <= 0 { c.PlainText(500, []byte("param err:phone!")) return } if len(code) <= 0 { c.PlainText(500, []byte("param err:code!")) return } key := fmt.Sprintf("smsCode:%s", phone) btscode := ch.Get(key) if btscode == nil { c.PlainText(511, []byte("未找到验证码!")) return } if code != string(btscode.([]byte)) { c.PlainText(512, []byte("验证码错误!")) return } ch.Delete(key) c.PlainText(200, []byte("ok")) }