init.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. package apps
  2. import (
  3. "fmt"
  4. "fohow.com/apps/models/token_model"
  5. "regexp"
  6. "strings"
  7. // "time"
  8. "github.com/astaxie/beego"
  9. "github.com/astaxie/beego/context"
  10. "github.com/user_agent"
  11. // "github.com/uuid"
  12. // "fohow.com/apps/controllers/user_controller"
  13. // "fohow.com/apps/models/balance_model"
  14. "fohow.com/apps/models/channel_gzh_qrcode_model"
  15. "fohow.com/apps/models/user_model"
  16. )
  17. const (
  18. SessionUserKey = "uid"
  19. SessionWxUserKey = "wxuid" //用于小程序
  20. // SessionWxXcxUserKey = "wxxcxuid"
  21. XcxSessionKey = "XcxSessionKey" // 小程序用于加密解密数据的key
  22. )
  23. var (
  24. // 共用
  25. ComNotAllow = []string{"notAllow", "权限不够,请联系管理员"}
  26. BindFail = []string{"bindFail", "迁移失败,请联系管理员"}
  27. HasBind = []string{"hasBind", "该会员编号已绑定会员"}
  28. DailySignRepeat = []string{"dailySignRepeat", "已经领取过啦"}
  29. RedisError = []string{"redisError", "redis初始化错误"}
  30. RedisGetError = []string{"redisGetError", "redisGet错误"}
  31. RedisJsonError = []string{"redisJsonError", "json转换错误"}
  32. OrderRefundError = []string{"orderRefundError", "退款失败"}
  33. OtherSNotAllow = []string{"othersNotAllow", "非店长无法在专区下单!"}
  34. AlreadyShop = []string{"alreadyShop", "您已经是店主,请勿重复申请"}
  35. AlreadyAgent = []string{"alreadyShop", "该会员已是代理,请勿重复申请"}
  36. ShopNoRepit = []string{"shopNoRepit", "请勿重复申请"}
  37. NoCart = []string{"noCart", "请选择您需要结算的产品"}
  38. NoExist = []string{"noExist", "该记录不存在"}
  39. ProductNotAllow = []string{"productNotAllow", "该商品无法购买"}
  40. TokenError = []string{"tokenError", "生成令牌出错"}
  41. HasOver = []string{"hasOver", "已结束"}
  42. NoShopSale = []string{"noShopSale", "该商品非专区商品"}
  43. HasPaied = []string{"hasPaied", "已支付"}
  44. AccountError = []string{"accountError", "账户异常"}
  45. GongZhongHaoNoExist = []string{"gongZhongHaoNoExist", "公众号不存在"}
  46. Error = []string{"error", "未知错误"}
  47. TypeError = []string{"error", "类型错误"}
  48. CountError = []string{"countError", "数量错误"}
  49. RegisterUserError = []string{"registerUserError", "注册会员错误"}
  50. BindingWxPhoneError = []string{"bindingWxPhone", "绑定失败"}
  51. XcxAuthorizeError = []string{"XcxAuthorizeError", "授权失败"}
  52. PicVerifyCodeError = []string{"picVerifyCodeError", "图片验证码错误"}
  53. WxUserInfoError = []string{"wxUserInfoError", "微信会员信息错误!"}
  54. ChannelNotMatch = []string{"channelNotMatch", "渠道不匹配"}
  55. ChanneloExist = []string{"channelNoExist", "渠道不存在"}
  56. UploadFileError = []string{"uploadFileError", "上传文件失败!"}
  57. UploadFileTypeInvalid = []string{"uploadFileTypeError", "上传文件类型错误!仅支持以下格式:doc|docx|pdf|ppt|pptx|zip"}
  58. UploadImgTypeInvalid = []string{"uploadImgTypeError", "上传文件类型错误!仅支持以下格式:png|jpg|jpeg"}
  59. // 登录相关
  60. HasLogin = []string{"hasLogin", "已登录"}
  61. HasLogout = []string{"hasLogout", "已登出"}
  62. UserNeedLogin = []string{"userNeedLogin", "授权无效,需要用户登录"}
  63. UserAuthorizeFailed = []string{"userAuthorizeFailed", "用户授权失败"}
  64. UserNeedTel = []string{"userNeedTel", "需要用户绑定手机"}
  65. UserTelNotMatch = []string{"userTelNotMatch", "手机号码不匹配,请使用当前登录用户的号码"}
  66. WxUserNeedLogin = []string{"wxUserNeedLogin", "需要微信用户登录"}
  67. NotWeixinClient = []string{"notWeixinClient", "不是微信客户端"}
  68. SignupNotOpen = []string{"signupNotOpen", "注册暂未开放,敬请期待"}
  69. ProductErrorType = []string{"productErrorType", "请您前往店铺专区下单"}
  70. // 支付相关
  71. PayWayNoMatch = []string{"payWayNoMatch", "请选择正确的支付方式"}
  72. //请输入充值数额
  73. RechargeCountWrong = []string{"rechargeCountWrong", "请输入充值数额"}
  74. // 关注
  75. WxUserNeedSubscribe = []string{"wxUserNeedSubscribe", "请先关注公众号"}
  76. TGDKjNeedSub = []string{"TGDKjNeedSub", "请先进入公众号领取大刀"}
  77. BlackUser = []string{"blackUser", "对不起,您已被拉黑"}
  78. BlackUrl = []string{"blackUrl", "对不起,网址不允许访问"}
  79. BlackOrder = []string{"blackOrder", "该订单作弊,已被拉黑"}
  80. CreateOrderFail = []string{"createOrderFail", "创建订单失败"}
  81. OnlyPlayInWeixin = []string{"onlyPlayInWeixin", "只能在微信客户端进行"}
  82. OrderNotExist = []string{"orderNotExist", "订单不存在"}
  83. OrderExist = []string{"orderExist", "订单已存在"}
  84. DetailNotAllow = []string{"detailNotAllow", "评论内容不能为空"}
  85. DetailHasCommend = []string{"detailHasCommend", "商品已评论"}
  86. PayFail = []string{"payFail", "支付失败"}
  87. ParamsError = []string{"paramsError", "参数错误"}
  88. ValidParamsError = []string{"validateParamsError", "验证参数错误"}
  89. ParamsRequired = []string{"paramsRequired", "缺少参数"}
  90. ProductStockZero = []string{"productStockZero", "商品库存为零"}
  91. ProductStockNotEnough = []string{"productStockNotEnough", "商品库存不足"}
  92. ProductNotExist = []string{"productNotExist", "产品不存在"}
  93. ProductNotApproved = []string{"productNotApproved", "产品还未上架"}
  94. ProductOffSale = []string{"productOffSale", "产品已经下架"}
  95. OverLimitCount = []string{"overLimitCount", "超过限购数量"}
  96. SingleOverLimitCount = []string{"singleOverLimitCount", "超过限购数量"}
  97. PurchasedReachLimit = []string{"purchasedReachLimit", "已购买总数已达到限购数量"}
  98. OnlyDeliveryArea = []string{"onlyDeliveryArea", "产品不在限售区域内"}
  99. RedirectTo = []string{"redirectTo", "302跳转"}
  100. ReduceFail = []string{"reduceFail", "帮砍失败"}
  101. UserNotExist = []string{"userNotExist", "用户不存在"}
  102. AddressNotExist = []string{"addressNotExist", "地址不存在"}
  103. UserAddressFull = []string{"userAddressFull", "最多添加5条地址"}
  104. UploadUserHeadError = []string{"uploadUserHeadError", "上传头像错误"}
  105. AddressNotMatch = []string{"addressNotMatch", "地址不匹配"}
  106. NotUnPay = []string{"notUnPay", "无法支付,该订单已支付或者已过期"}
  107. NotPayWayTime = []string{"notPayWayTime", "无法支付,促销期间只允许提货券支付"}
  108. NotEnoughPay = []string{"notEnouphPay", "无法支付,提货券余额不足!"}
  109. NotRightPayWay = []string{"notRightPayWay", "无法支付,该订单只支持微信支付"}
  110. HasAlreadyPay = []string{"hasAlreadyPay", "该订单已支付过"}
  111. NotPayInTime = []string{"notPayInTime", "没在规定时间内完成支付"}
  112. PayWayNotAllow = []string{"payWayNotAllow", "暂不支持微信支付!"}
  113. PayNoAuthed = []string{"payNoAuthed", "支付未授权"}
  114. PhoneInvalid = []string{"phoneInvalid", "手机号码格式不正确"}
  115. PhoneExist = []string{"phoneExist", "手机号码已被注册,请更换其他号码"}
  116. SMSInvalid = []string{"smsInvalid", "短信验证码不正确"}
  117. CodesSendTooOften = []string{"codesSendTooOften", "短信验证码发送过于频繁,请半小时后重试"}
  118. WxMenusCreatedFailed = []string{"wxMenusCreatedFailed", "微信菜单创建失败"}
  119. //小程序相关
  120. XcxGetSessionKeyError = []string{"xcxGetSessionKeyError", "获取session key失败"}
  121. RailAdminIPReduced = []string{"railsAdminIPReduced", "拒绝此IP访问,权限不够"}
  122. TelCodesError = []string{"telCodeError", "验证码错误"}
  123. TelCodesTypeError = []string{"telCodesTypeError", "验证码类型错误"}
  124. PasswordError = []string{"passwordError", "密码错误"}
  125. LoginPwdSameWithTradePwdError = []string{"loginPwdSameWithTradePwdError", "登录密码与交易密码不能相同,请重新设置"}
  126. OrginalPasswordError = []string{"orginalPasswordError", "原始密码错误"}
  127. TelCodesExpired = []string{"telCodeExpired", "验证码已过期"}
  128. LoginPasswordError = []string{"loginPasswordError", "登录密码错误"}
  129. TradePasswordError = []string{"tradePasswordError", "交易密码错误"}
  130. TradePasswordEmptry = []string{"tradePasswordEmpty", "未设置交易密码"}
  131. UpdatePasswordError = []string{"updatePasswordError", "更新密码出错"}
  132. PasswordLengthError = []string{"passwordLengthError", "密码长度错误,需要6-20位"}
  133. GetCaptchaError = []string{"getCaptchaError", "获取图片验证码错误"}
  134. BindingBankCardEmpty = []string{"bindingBankCardEmpty", "绑定银行卡错误,请完善银行卡信息"}
  135. BindingWxUserError = []string{"bindingWxUserError", "绑定微信错误,请重试"}
  136. BindingUserTelError = []string{"bindingUserTelError", "绑定电话错误,请重试"}
  137. BindingIdCardEmpty = []string{"bindingIdCardEmpty", "绑定身份证错误,请填写真实姓名及身份证号"}
  138. UserHasBindIdCard = []string{"userHasBindIdCard", "该用户已绑定了身份证,请联系客服更改"}
  139. BindingIdCardExist = []string{"bindingIdCardExist", "该身份证已被绑定,请更换其他身份证"}
  140. BindingIdCardLengthError = []string{"bindingIdCardLengthError", "身份证位数不合法"}
  141. BindingTelExisted = []string{"bindingTelExisted", "该号码已绑定了微信用户,请尝试其他号码"}
  142. WxUserHasBindingTel = []string{"wxUserHasBindingTel", "该微信用户已经绑定了手机,请勿重复绑定"}
  143. WxUserNotExist = []string{"wxUserNotExist", "微信用户不存在"}
  144. WxUserNotRegistD5c = []string{"wxUserNotRegistD5c", "用户在第五创没有绑定手机号码"}
  145. IdCardAgeNotBeAdult = []string{"idCardAgeNotBeAdult", "未满18岁,身份认证失败"}
  146. // 工具tool相关
  147. DownloadError = []string{"downloadError", "阿里云下载文件错误"}
  148. ConvertToBase64Error = []string{"convertToBase64Error", "转base64错误"}
  149. //资金账户相关
  150. CentNotEnough = []string{"centNotEnough", "积分余额不足"}
  151. BalanceNotExist = []string{"balanceNotExist", "资金明细不存在"}
  152. BalanceNotEnough = []string{"balanceNotEnough", "余额不足"}
  153. BalanceNotEnoughForCharge = []string{"balanceNotEnoughForCharge", "可提现余额不足支付手续费,无法提现"}
  154. TakeCashAmountLessThanCharge = []string{"balanceAmountLessThanCharge", "提现金额需大于手续费金额"}
  155. TakeCashAmountInvalid = []string{"takeCashAmountInvalid", "提现金额不合法,仅支持小数点后两位。如:88.88"}
  156. RechargeAmountInvalid = []string{"RechargeAmountInvalid", "充值金额不合法,仅支持小数点后两位。如:88.88"}
  157. BankCardNotFound = []string{"bankCardNotFound", "请先绑定银行卡"}
  158. BankCardNoInvalid = []string{"bankCardNoInvalid", "银行卡号不合法,请重新输入"}
  159. BankCardNotMatch = []string{"bankCardNotMatch", "银行卡号不匹配,请使用实名认证的本人银行卡绑定,如认证信息有误,请联系客服更改"}
  160. BankCardHasNoRecordOnLianLianPay = []string{"bankCardHasNoRecordOnLianLianPay", "该银行卡在连连支付无记录,请先充值"}
  161. BankCardCountLimit = []string{"bankCardCountLimit", "银行卡绑定数量限制"}
  162. CanNotDeleteDefaultBankCard = []string{"canNotDeleteDefaultBankCard", "不能删除默认银行卡"}
  163. BankCardHasBound = []string{"bankCardHasBound", "该银行卡已有绑定记录"}
  164. BalanceToCashErr = []string{"balanceToCashErr", "余额转提货券失败"}
  165. //春节红包
  166. ActivityNotStart = []string{"activityNotStart", "活动尚未开始"}
  167. ActivityIsEnd = []string{"activityIsEnd", "活动已经结束"}
  168. HasGotLuckyMoney = []string{"hasGotLuckyMoney", "你已经拿过红包了"}
  169. //商家
  170. OrderNotBelongToCurrentUser = []string{"orderNotBelongToCurrentUser", "订单不属于当前用户。"}
  171. OrderStatusNotSuit = []string{"orderStatusNotSuit", "只能处理待发货、待收货的订单"}
  172. OrderAlreadyDispatch = []string{"orderAlreadyDispatch", "该订单已经被处理发货"}
  173. OrderAlreadyRefund = []string{"orderAlreadyRefund", "该订单已经被处理退款"}
  174. OrderRefundFaild = []string{"orderRefundFaild", "退款失败,请联系客服"}
  175. CurrentMerIsNotSuperAdminMerchant = []string{"currentMerIsNotSuperAdminMerchant", "当前用户不是商家超级管理员"}
  176. CurrentMerIsNotManageTheProduct = []string{"currentMerIsNotManageTheProduct", "当前用户不负责管理该商品"}
  177. //移动讯兑
  178. DataUnMarsha1Error = []string{"dataUnMarsha1Error", "数据解析错误"}
  179. //项目
  180. ProjectNoExist = []string{"projectNoExist", "项目不存在"}
  181. ProjectInvestWayNoExist = []string{"projectInvestWayNoExist", "该资助方式不存在"}
  182. //微信公众号登录
  183. NetworkBusy = []string{"networkBusy", "对不起,网络繁忙,请稍后再试"}
  184. //秒杀活动
  185. SeckillNotStart = []string{"seckillNotStart", "秒杀活动尚未开始"}
  186. SeckillIsEnd = []string{"seckillIsEnd", "秒杀活动已经结束"}
  187. SeckillNotAllow = []string{"seckillNotAllow", "秒杀商品不允许加入购物车"}
  188. OnlyNew = []string{"onlyNew", "仅限新人购买"}
  189. OrderNotEnough = []string{"orderNotEnough", "订单金额不满足"}
  190. HasPatched = []string{"hasPached", "已发放"}
  191. WrongUserRank = []string{"wrongUserRank", "会员资格信息错误"}
  192. )
  193. type BaseController struct {
  194. beego.Controller
  195. OnlyCheckUserLoginAction []string
  196. ExceptCheckUserLoginAction []string
  197. OnlyCheckWxUserLoginAction []string
  198. ExceptCheckWxUserLoginAction []string
  199. UserNeedLoginAction []string
  200. }
  201. type Result struct {
  202. Status int `json:"status"`
  203. Result []interface{} `json:"result"`
  204. }
  205. // 定义正确结果集
  206. func (self *BaseController) FormatResult(result []interface{}) *Result {
  207. return &Result{
  208. Status: 200,
  209. Result: result,
  210. }
  211. }
  212. func (self *BaseController) GetCurrentUserId() int64 {
  213. uId, _ := self.GetSession(SessionUserKey).(int64)
  214. return uId
  215. }
  216. func (self *BaseController) GetCurrentUser(useCache bool) *user_model.User {
  217. wxUser := self.GetCurrentWxUser(useCache)
  218. if wxUser == nil {
  219. return nil
  220. }
  221. id := wxUser.UserId
  222. if id <= 0 {
  223. return nil
  224. }
  225. u := user_model.GetUserById(id, useCache)
  226. if u == nil {
  227. beego.BeeLogger.Error("User Not Found, uid=%d", id)
  228. }
  229. return u
  230. }
  231. func (self *BaseController) GetCurrentWxUser(useCache bool) *user_model.WxUser {
  232. id := self.GetCurrentWxUserIdByToken()
  233. if id <= 0 {
  234. return nil
  235. }
  236. u := user_model.GetWxUserById(id, useCache)
  237. if u == nil {
  238. beego.BeeLogger.Error("WxUser Not Found, id=%d", id)
  239. }
  240. return u
  241. }
  242. // 根据token解析userId
  243. func (self *BaseController) GetCurrentWxUserIdByToken() int64 {
  244. return getCurrentUserIdByToken(self.Ctx)
  245. }
  246. // TODO校验是否微信客户端
  247. func getCurrentUserIdByToken(ctx *context.Context) int64 {
  248. inputToken := ""
  249. wxUserId := int64(0)
  250. requestAuthordata := ctx.Request.Header.Get("Authorization")
  251. if len(requestAuthordata) > 0 {
  252. authorizationData := strings.SplitN(ctx.Request.Header.Get("Authorization"), " ", 2)
  253. if len(authorizationData) > 1 {
  254. inputToken = authorizationData[1]
  255. token_user, err := token_model.ValidateToken(inputToken)
  256. if err == nil {
  257. wxUserId = token_user.Id
  258. }
  259. }
  260. }
  261. return wxUserId
  262. }
  263. // sceneId, 关注场景id
  264. func (self *BaseController) CheckWxUserSubscribe(sceneId int64) {
  265. beego.BeeLogger.Info("check wx_user subscribe")
  266. ctx := self.Ctx
  267. if !isWxClient(ctx) {
  268. return
  269. }
  270. wxUserId, ok := ctx.Input.Session(SessionWxUserKey).(int64)
  271. if ok {
  272. wxUser := user_model.GetWxUserById(wxUserId, false)
  273. if wxUser == nil {
  274. beego.BeeLogger.Error("WxUser Not Found, id=%d", wxUserId)
  275. } else {
  276. if wxUser.Subscribe == 0 {
  277. qrcode := channel_gzh_qrcode_model.GetBySceneId(sceneId, true)
  278. if qrcode == nil {
  279. //默认二维码
  280. qrcode = channel_gzh_qrcode_model.GetBySceneId(25, true)
  281. }
  282. qrcodeUrl := qrcode.QrcodeImg
  283. errCode := &ErrCode{
  284. Code: WxUserNeedSubscribe[0],
  285. Msg: WxUserNeedSubscribe[1],
  286. Redirect: qrcodeUrl,
  287. Data: nil,
  288. }
  289. ctx.Output.SetStatus(403)
  290. ctx.Output.JSON(errCode, true, true)
  291. self.StopRun()
  292. }
  293. }
  294. } else {
  295. beego.BeeLogger.Error("WxUser Not Login")
  296. }
  297. }
  298. func checkWxUserLogin(ctx *context.Context) {
  299. //beego.BeeLogger.Info("show the request : %s from UserAgent: %s", ctx.Input.URI(), ctx.Input.UserAgent())
  300. //检测 token 是否合法
  301. var inputToken string
  302. //beego.BeeLogger.Warn("request authorizationData : %s", ctx.Request.Header.Get("Authorization"))
  303. requestAuthordata := ctx.Request.Header.Get("Authorization")
  304. if len(requestAuthordata) > 0 {
  305. authorizationData := strings.SplitN(ctx.Request.Header.Get("Authorization"), " ", 2)
  306. if len(authorizationData) != 2 {
  307. errCode := &ErrCode{
  308. Code: UserNeedLogin[0],
  309. Msg: UserNeedLogin[1],
  310. Redirect: "",
  311. Data: nil,
  312. }
  313. //换成userNeedLogin
  314. ctx.Output.SetStatus(403)
  315. ctx.Output.JSON(errCode, true, true)
  316. } else {
  317. inputToken = authorizationData[1]
  318. var wxUser *user_model.WxUser
  319. user_token, err := token_model.ValidateToken(inputToken)
  320. wxUser = user_model.GetWxUserById(user_token.Id, true)
  321. if err != nil || wxUser == nil {
  322. beego.BeeLogger.Warn("token error : %v", err)
  323. // 验证 Token 无效
  324. errCode := &ErrCode{
  325. Code: UserNeedLogin[0],
  326. Msg: UserNeedLogin[1],
  327. Redirect: "",
  328. Data: nil,
  329. }
  330. ctx.Output.SetStatus(403)
  331. ctx.Output.JSON(errCode, true, true)
  332. }
  333. }
  334. } else {
  335. errCode := &ErrCode{
  336. Code: UserNeedLogin[0],
  337. Msg: UserNeedLogin[1],
  338. Redirect: "",
  339. Data: nil,
  340. }
  341. ctx.Output.SetStatus(401)
  342. ctx.Output.JSON(errCode, true, true)
  343. }
  344. return
  345. }
  346. // 检查来自大后台的请求是否为服务器IP
  347. func CheckIsInvokeFromRailsAdmin(ctx *context.Context) {
  348. s := strings.Split(ctx.Request.RemoteAddr, ":")
  349. ip := s[0]
  350. beego.BeeLogger.Debug("railsadmin request ip is: %s", ip)
  351. if ip != beego.AppConfig.String("RailsAdminAddr") {
  352. errCode := &ErrCode{
  353. Code: RailAdminIPReduced[0],
  354. Msg: RailAdminIPReduced[1],
  355. Redirect: "",
  356. Data: nil,
  357. }
  358. ctx.Output.SetStatus(403)
  359. ctx.Output.JSON(errCode, true, true)
  360. }
  361. }
  362. func (self *BaseController) Prepare() {
  363. //beego.BeeLogger.Info("invote controller Prepare func")
  364. needChkWxUserLogin := true
  365. //needChkUserLogin := true
  366. // needChkWxUserSubscribe := false
  367. _, actionName := self.GetControllerAndAction()
  368. if len(self.ExceptCheckWxUserLoginAction) > 0 {
  369. for _, an := range self.ExceptCheckWxUserLoginAction {
  370. if strings.ToLower(an) == "*" || strings.ToLower(an) == strings.ToLower(actionName) {
  371. needChkWxUserLogin = false
  372. break
  373. }
  374. }
  375. }
  376. if needChkWxUserLogin {
  377. checkWxUserLogin(self.Ctx)
  378. }
  379. }
  380. type ErrCode struct {
  381. Status int `json:"status"`
  382. Code string `json:"err_code"`
  383. Msg string `json:"err_msg"`
  384. Redirect string `json:"redirect_to"`
  385. Data map[string]string `json:"data"`
  386. }
  387. // 定义返回错误信息
  388. func (self *BaseController) ReturnError(status int, code []string, redirect string, data map[string]string) {
  389. errCode := &ErrCode{
  390. Status: status,
  391. Code: code[0],
  392. Msg: code[1],
  393. Redirect: redirect,
  394. Data: data,
  395. }
  396. // jsonErrCode, err := json.Marshal(errCode)
  397. // if err != nil {
  398. // beego.BeeLogger.Error("json encode error=[%s]", err)
  399. // }
  400. self.Ctx.Output.SetStatus(status)
  401. // self.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
  402. self.Ctx.Output.JSON(errCode, true, true)
  403. self.StopRun()
  404. // self.ServeJson(status, string(jsonErrCode))
  405. }
  406. // TODO校验是否微信客户端
  407. func (self *BaseController) IsWxClient() bool {
  408. return isWxClient(self.Ctx)
  409. }
  410. // TODO校验是否微信客户端
  411. func isWxClient(ctx *context.Context) bool {
  412. agent := ctx.Input.UserAgent()
  413. b := getRealBrowser(agent)
  414. isWxClient := b == "wx"
  415. return isWxClient
  416. }
  417. // 是否是手机端
  418. func (self *BaseController) IsMobile() bool {
  419. ua := strings.ToLower(self.Ctx.Input.UserAgent())
  420. if ua == "" {
  421. return true
  422. }
  423. ok, _ := regexp.MatchString("iphone|nokia|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile", ua)
  424. return ok
  425. }
  426. // 是否是开发模式
  427. func (self *BaseController) IsDev() bool {
  428. //return beego.BConfig.RunMode == beego.DEV
  429. return beego.AppConfig.String("Env") != "production"
  430. }
  431. func getRealBrowser(ua string) string {
  432. userAgent := user_agent.New(ua)
  433. browser, _ := userAgent.Browser()
  434. browser = strings.ToLower(browser)
  435. if browser == "internet explorer" {
  436. browser = "ie"
  437. }
  438. lowerUa := strings.ToLower(ua)
  439. // beego.BeeLogger.Warning("ua=%s", lowerUa)
  440. if strings.Contains(lowerUa, "micromessenger") {
  441. browser = "wx"
  442. }
  443. if strings.Contains(lowerUa, "wechatdevtools") {
  444. browser = "wx"
  445. }
  446. return browser
  447. }
  448. func (self *BaseController) GetFullImgUrl(img string) string {
  449. if img == "" {
  450. return ""
  451. }
  452. if strings.HasPrefix(img, "http://") || strings.HasPrefix(img, "https://") {
  453. return img
  454. } else {
  455. return fmt.Sprintf("%s/%s", beego.AppConfig.String("AliCDNImgHost"), img)
  456. }
  457. }
  458. func (self *BaseController) GetCdnFullImgUrl(img string) string {
  459. if img == "" {
  460. return ""
  461. }
  462. if strings.HasPrefix(img, "http://") || strings.HasPrefix(img, "https://") {
  463. return img
  464. } else {
  465. return fmt.Sprintf("%s/%s", beego.AppConfig.String("AliCDNImgHost"), img)
  466. }
  467. }
  468. // ServeJSON sends a json response with encoding charset.
  469. func (c *BaseController) ServeResultJSON(encoding ...bool) {
  470. from := c.GetString("source")
  471. //beego.BeeLogger.Warn("from--%s", from)
  472. type Result struct {
  473. Result interface{} `json:"result"`
  474. }
  475. var (
  476. hasIndent = true
  477. hasEncoding = false
  478. )
  479. if beego.AppConfig.String("RunMode") == "prod" {
  480. hasIndent = false
  481. }
  482. if len(encoding) > 0 && encoding[0] == true {
  483. hasEncoding = true
  484. }
  485. if from == beego.AppConfig.String("SourceList") {
  486. c.Data["json"] = &Result{Result: c.Data["json"]}
  487. }
  488. c.Ctx.Output.JSON(c.Data["json"], hasIndent, hasEncoding)
  489. }