Parcourir la source

chore: commit remaining prod xcx server files

abiao il y a 1 mois
Parent
commit
8c2a4d59da

+ 540 - 0
go/gopath/src/fohow.com/apps/init.go.bak_20260521_032747

@@ -0,0 +1,540 @@
+package apps
+
+import (
+	"fmt"
+	"fohow.com/apps/models/token_model"
+	"regexp"
+	"strings"
+	// "time"
+
+	"github.com/astaxie/beego"
+	"github.com/astaxie/beego/context"
+	"github.com/user_agent"
+	// "github.com/uuid"
+	// "fohow.com/apps/controllers/user_controller"
+	// "fohow.com/apps/models/balance_model"
+	"fohow.com/apps/models/channel_gzh_qrcode_model"
+	"fohow.com/apps/models/user_model"
+)
+
+const (
+	SessionUserKey   = "uid"
+	SessionWxUserKey = "wxuid" //用于小程序
+	// SessionWxXcxUserKey = "wxxcxuid"
+	XcxSessionKey = "XcxSessionKey" // 小程序用于加密解密数据的key
+)
+
+var (
+	// 共用
+	ComNotAllow = []string{"notAllow", "权限不够,请联系管理员"}
+
+	BindFail         = []string{"bindFail", "迁移失败,请联系管理员"}
+	HasBind          = []string{"hasBind", "该会员编号已绑定会员"}
+	DailySignRepeat  = []string{"dailySignRepeat", "已经领取过啦"}
+	RedisError       = []string{"redisError", "redis初始化错误"}
+	RedisGetError    = []string{"redisGetError", "redisGet错误"}
+	RedisJsonError   = []string{"redisJsonError", "json转换错误"}
+	OrderRefundError = []string{"orderRefundError", "退款失败"}
+	OtherSNotAllow   = []string{"othersNotAllow", "非店长无法在专区下单!"}
+	AlreadyShop      = []string{"alreadyShop", "您已经是店主,请勿重复申请"}
+	AlreadyAgent     = []string{"alreadyShop", "该会员已是代理,请勿重复申请"}
+
+	ShopNoRepit           = []string{"shopNoRepit", "请勿重复申请"}
+	NoCart                = []string{"noCart", "请选择您需要结算的产品"}
+	NoExist               = []string{"noExist", "该记录不存在"}
+	ProductNotAllow       = []string{"productNotAllow", "该商品无法购买"}
+	TokenError            = []string{"tokenError", "生成令牌出错"}
+	HasOver               = []string{"hasOver", "已结束"}
+	NoShopSale            = []string{"noShopSale", "该商品非专区商品"}
+	HasPaied              = []string{"hasPaied", "已支付"}
+	AccountError          = []string{"accountError", "账户异常"}
+	GongZhongHaoNoExist   = []string{"gongZhongHaoNoExist", "公众号不存在"}
+	Error                 = []string{"error", "未知错误"}
+	TypeError             = []string{"error", "类型错误"}
+	CountError            = []string{"countError", "数量错误"}
+	RegisterUserError     = []string{"registerUserError", "注册会员错误"}
+	BindingWxPhoneError   = []string{"bindingWxPhone", "绑定失败"}
+	XcxAuthorizeError     = []string{"XcxAuthorizeError", "授权失败"}
+	PicVerifyCodeError    = []string{"picVerifyCodeError", "图片验证码错误"}
+	WxUserInfoError       = []string{"wxUserInfoError", "微信会员信息错误!"}
+	ChannelNotMatch       = []string{"channelNotMatch", "渠道不匹配"}
+	ChanneloExist         = []string{"channelNoExist", "渠道不存在"}
+	UploadFileError       = []string{"uploadFileError", "上传文件失败!"}
+	UploadFileTypeInvalid = []string{"uploadFileTypeError", "上传文件类型错误!仅支持以下格式:doc|docx|pdf|ppt|pptx|zip"}
+	UploadImgTypeInvalid  = []string{"uploadImgTypeError", "上传文件类型错误!仅支持以下格式:png|jpg|jpeg"}
+
+	// 登录相关
+	HasLogin            = []string{"hasLogin", "已登录"}
+	HasLogout           = []string{"hasLogout", "已登出"}
+	UserNeedLogin       = []string{"userNeedLogin", "授权无效,需要用户登录"}
+	UserAuthorizeFailed = []string{"userAuthorizeFailed", "用户授权失败"}
+	UserNeedTel         = []string{"userNeedTel", "需要用户绑定手机"}
+	UserTelNotMatch     = []string{"userTelNotMatch", "手机号码不匹配,请使用当前登录用户的号码"}
+	WxUserNeedLogin     = []string{"wxUserNeedLogin", "需要微信用户登录"}
+	NotWeixinClient     = []string{"notWeixinClient", "不是微信客户端"}
+	SignupNotOpen       = []string{"signupNotOpen", "注册暂未开放,敬请期待"}
+	ProductErrorType    = []string{"productErrorType", "请您前往店铺专区下单"}
+
+	// 支付相关
+	PayWayNoMatch = []string{"payWayNoMatch", "请选择正确的支付方式"}
+	//请输入充值数额
+	RechargeCountWrong = []string{"rechargeCountWrong", "请输入充值数额"}
+	// 关注
+	WxUserNeedSubscribe = []string{"wxUserNeedSubscribe", "请先关注公众号"}
+	TGDKjNeedSub        = []string{"TGDKjNeedSub", "请先进入公众号领取大刀"}
+
+	BlackUser  = []string{"blackUser", "对不起,您已被拉黑"}
+	BlackUrl   = []string{"blackUrl", "对不起,网址不允许访问"}
+	BlackOrder = []string{"blackOrder", "该订单作弊,已被拉黑"}
+
+	CreateOrderFail = []string{"createOrderFail", "创建订单失败"}
+
+	OnlyPlayInWeixin = []string{"onlyPlayInWeixin", "只能在微信客户端进行"}
+	OrderNotExist    = []string{"orderNotExist", "订单不存在"}
+	OrderExist       = []string{"orderExist", "订单已存在"}
+	DetailNotAllow   = []string{"detailNotAllow", "评论内容不能为空"}
+	DetailHasCommend = []string{"detailHasCommend", "商品已评论"}
+
+	PayFail               = []string{"payFail", "支付失败"}
+	ParamsError           = []string{"paramsError", "参数错误"}
+	ValidParamsError      = []string{"validateParamsError", "验证参数错误"}
+	ParamsRequired        = []string{"paramsRequired", "缺少参数"}
+	ProductStockZero      = []string{"productStockZero", "商品库存为零"}
+	ProductStockNotEnough = []string{"productStockNotEnough", "商品库存不足"}
+	ProductNotExist       = []string{"productNotExist", "产品不存在"}
+	ProductNotApproved    = []string{"productNotApproved", "产品还未上架"}
+	ProductOffSale        = []string{"productOffSale", "产品已经下架"}
+	OverLimitCount        = []string{"overLimitCount", "超过限购数量"}
+	SingleOverLimitCount  = []string{"singleOverLimitCount", "超过限购数量"}
+	PurchasedReachLimit   = []string{"purchasedReachLimit", "已购买总数已达到限购数量"}
+	OnlyDeliveryArea      = []string{"onlyDeliveryArea", "产品不在限售区域内"}
+	RedirectTo            = []string{"redirectTo", "302跳转"}
+	ReduceFail            = []string{"reduceFail", "帮砍失败"}
+
+	UserNotExist = []string{"userNotExist", "用户不存在"}
+
+	AddressNotExist     = []string{"addressNotExist", "地址不存在"}
+	UserAddressFull     = []string{"userAddressFull", "最多添加5条地址"}
+	UploadUserHeadError = []string{"uploadUserHeadError", "上传头像错误"}
+	AddressNotMatch     = []string{"addressNotMatch", "地址不匹配"}
+	NotUnPay            = []string{"notUnPay", "无法支付,该订单已支付或者已过期"}
+	NotPayWayTime       = []string{"notPayWayTime", "无法支付,促销期间只允许提货券支付"}
+
+	NotEnoughPay      = []string{"notEnouphPay", "无法支付,提货券余额不足!"}
+	NotRightPayWay    = []string{"notRightPayWay", "无法支付,该订单只支持微信支付"}
+	HasAlreadyPay     = []string{"hasAlreadyPay", "该订单已支付过"}
+	NotPayInTime      = []string{"notPayInTime", "没在规定时间内完成支付"}
+	PayWayNotAllow    = []string{"payWayNotAllow", "暂不支持微信支付!"}
+	PayNoAuthed       = []string{"payNoAuthed", "支付未授权"}
+	PhoneInvalid      = []string{"phoneInvalid", "手机号码格式不正确"}
+	PhoneExist        = []string{"phoneExist", "手机号码已被注册,请更换其他号码"}
+	SMSInvalid        = []string{"smsInvalid", "短信验证码不正确"}
+	CodesSendTooOften = []string{"codesSendTooOften", "短信验证码发送过于频繁,请半小时后重试"}
+
+	WxMenusCreatedFailed = []string{"wxMenusCreatedFailed", "微信菜单创建失败"}
+	//小程序相关
+	XcxGetSessionKeyError = []string{"xcxGetSessionKeyError", "获取session key失败"}
+
+	RailAdminIPReduced            = []string{"railsAdminIPReduced", "拒绝此IP访问,权限不够"}
+	TelCodesError                 = []string{"telCodeError", "验证码错误"}
+	TelCodesTypeError             = []string{"telCodesTypeError", "验证码类型错误"}
+	PasswordError                 = []string{"passwordError", "密码错误"}
+	LoginPwdSameWithTradePwdError = []string{"loginPwdSameWithTradePwdError", "登录密码与交易密码不能相同,请重新设置"}
+	OrginalPasswordError          = []string{"orginalPasswordError", "原始密码错误"}
+	TelCodesExpired               = []string{"telCodeExpired", "验证码已过期"}
+	LoginPasswordError            = []string{"loginPasswordError", "登录密码错误"}
+	TradePasswordError            = []string{"tradePasswordError", "交易密码错误"}
+	TradePasswordEmptry           = []string{"tradePasswordEmpty", "未设置交易密码"}
+	UpdatePasswordError           = []string{"updatePasswordError", "更新密码出错"}
+	PasswordLengthError           = []string{"passwordLengthError", "密码长度错误,需要6-20位"}
+	GetCaptchaError               = []string{"getCaptchaError", "获取图片验证码错误"}
+
+	BindingBankCardEmpty     = []string{"bindingBankCardEmpty", "绑定银行卡错误,请完善银行卡信息"}
+	BindingWxUserError       = []string{"bindingWxUserError", "绑定微信错误,请重试"}
+	BindingUserTelError      = []string{"bindingUserTelError", "绑定电话错误,请重试"}
+	BindingIdCardEmpty       = []string{"bindingIdCardEmpty", "绑定身份证错误,请填写真实姓名及身份证号"}
+	UserHasBindIdCard        = []string{"userHasBindIdCard", "该用户已绑定了身份证,请联系客服更改"}
+	BindingIdCardExist       = []string{"bindingIdCardExist", "该身份证已被绑定,请更换其他身份证"}
+	BindingIdCardLengthError = []string{"bindingIdCardLengthError", "身份证位数不合法"}
+	BindingTelExisted        = []string{"bindingTelExisted", "该号码已绑定了微信用户,请尝试其他号码"}
+	WxUserHasBindingTel      = []string{"wxUserHasBindingTel", "该微信用户已经绑定了手机,请勿重复绑定"}
+	WxUserNotExist           = []string{"wxUserNotExist", "微信用户不存在"}
+	WxUserNotRegistD5c       = []string{"wxUserNotRegistD5c", "用户在第五创没有绑定手机号码"}
+	IdCardAgeNotBeAdult      = []string{"idCardAgeNotBeAdult", "未满18岁,身份认证失败"}
+
+	// 工具tool相关
+	DownloadError        = []string{"downloadError", "阿里云下载文件错误"}
+	ConvertToBase64Error = []string{"convertToBase64Error", "转base64错误"}
+	//资金账户相关
+	CentNotEnough                    = []string{"centNotEnough", "积分余额不足"}
+	BalanceNotExist                  = []string{"balanceNotExist", "资金明细不存在"}
+	BalanceNotEnough                 = []string{"balanceNotEnough", "余额不足"}
+	BalanceNotEnoughForCharge        = []string{"balanceNotEnoughForCharge", "可提现余额不足支付手续费,无法提现"}
+	TakeCashAmountLessThanCharge     = []string{"balanceAmountLessThanCharge", "提现金额需大于手续费金额"}
+	TakeCashAmountInvalid            = []string{"takeCashAmountInvalid", "提现金额不合法,仅支持小数点后两位。如:88.88"}
+	RechargeAmountInvalid            = []string{"RechargeAmountInvalid", "充值金额不合法,仅支持小数点后两位。如:88.88"}
+	BankCardNotFound                 = []string{"bankCardNotFound", "请先绑定银行卡"}
+	BankCardNoInvalid                = []string{"bankCardNoInvalid", "银行卡号不合法,请重新输入"}
+	BankCardNotMatch                 = []string{"bankCardNotMatch", "银行卡号不匹配,请使用实名认证的本人银行卡绑定,如认证信息有误,请联系客服更改"}
+	BankCardHasNoRecordOnLianLianPay = []string{"bankCardHasNoRecordOnLianLianPay", "该银行卡在连连支付无记录,请先充值"}
+	BankCardCountLimit               = []string{"bankCardCountLimit", "银行卡绑定数量限制"}
+	CanNotDeleteDefaultBankCard      = []string{"canNotDeleteDefaultBankCard", "不能删除默认银行卡"}
+	BankCardHasBound                 = []string{"bankCardHasBound", "该银行卡已有绑定记录"}
+	BalanceToCashErr                 = []string{"balanceToCashErr", "余额转提货券失败"}
+
+	//春节红包
+	ActivityNotStart = []string{"activityNotStart", "活动尚未开始"}
+	ActivityIsEnd    = []string{"activityIsEnd", "活动已经结束"}
+	HasGotLuckyMoney = []string{"hasGotLuckyMoney", "你已经拿过红包了"}
+
+	//商家
+	OrderNotBelongToCurrentUser       = []string{"orderNotBelongToCurrentUser", "订单不属于当前用户。"}
+	OrderStatusNotSuit                = []string{"orderStatusNotSuit", "只能处理待发货、待收货的订单"}
+	OrderAlreadyDispatch              = []string{"orderAlreadyDispatch", "该订单已经被处理发货"}
+	OrderAlreadyRefund                = []string{"orderAlreadyRefund", "该订单已经被处理退款"}
+	OrderRefundFaild                  = []string{"orderRefundFaild", "退款失败,请联系客服"}
+	CurrentMerIsNotSuperAdminMerchant = []string{"currentMerIsNotSuperAdminMerchant", "当前用户不是商家超级管理员"}
+	CurrentMerIsNotManageTheProduct   = []string{"currentMerIsNotManageTheProduct", "当前用户不负责管理该商品"}
+	//移动讯兑
+	DataUnMarsha1Error = []string{"dataUnMarsha1Error", "数据解析错误"}
+
+	//项目
+	ProjectNoExist          = []string{"projectNoExist", "项目不存在"}
+	ProjectInvestWayNoExist = []string{"projectInvestWayNoExist", "该资助方式不存在"}
+
+	//微信公众号登录
+	NetworkBusy = []string{"networkBusy", "对不起,网络繁忙,请稍后再试"}
+
+	//秒杀活动
+	SeckillNotStart = []string{"seckillNotStart", "秒杀活动尚未开始"}
+	SeckillIsEnd    = []string{"seckillIsEnd", "秒杀活动已经结束"}
+	SeckillNotAllow = []string{"seckillNotAllow", "秒杀商品不允许加入购物车"}
+
+	OnlyNew        = []string{"onlyNew", "仅限新人购买"}
+	OrderNotEnough = []string{"orderNotEnough", "订单金额不满足"}
+	HasPatched     = []string{"hasPached", "已发放"}
+	WrongUserRank  = []string{"wrongUserRank", "会员资格信息错误"}
+)
+
+type BaseController struct {
+	beego.Controller
+	OnlyCheckUserLoginAction     []string
+	ExceptCheckUserLoginAction   []string
+	OnlyCheckWxUserLoginAction   []string
+	ExceptCheckWxUserLoginAction []string
+	UserNeedLoginAction          []string
+}
+
+type Result struct {
+	Status int           `json:"status"`
+	Result []interface{} `json:"result"`
+}
+
+// 定义正确结果集
+func (self *BaseController) FormatResult(result []interface{}) *Result {
+	return &Result{
+		Status: 200,
+		Result: result,
+	}
+}
+
+func (self *BaseController) GetCurrentUserId() int64 {
+	uId, _ := self.GetSession(SessionUserKey).(int64)
+	return uId
+}
+
+func (self *BaseController) GetCurrentUser(useCache bool) *user_model.User {
+	wxUser := self.GetCurrentWxUser(useCache)
+	if wxUser == nil {
+		return nil
+	}
+	id := wxUser.UserId
+	if id <= 0 {
+		return nil
+	}
+	u := user_model.GetUserById(id, useCache)
+	if u == nil {
+		beego.BeeLogger.Error("User Not Found, wx_uid=%d, uid=%d", wxUser.Id, id)
+	}
+	return u
+}
+
+func (self *BaseController) GetCurrentWxUser(useCache bool) *user_model.WxUser {
+	id := self.GetCurrentWxUserIdByToken()
+	if id <= 0 {
+		return nil
+	}
+	u := user_model.GetWxUserById(id, useCache)
+	if u == nil {
+		beego.BeeLogger.Error("WxUser Not Found, id=%d", id)
+	}
+	return u
+}
+
+// 根据token解析userId
+func (self *BaseController) GetCurrentWxUserIdByToken() int64 {
+	return getCurrentUserIdByToken(self.Ctx)
+}
+
+// TODO校验是否微信客户端
+func getCurrentUserIdByToken(ctx *context.Context) int64 {
+	inputToken := ""
+	wxUserId := int64(0)
+	requestAuthordata := ctx.Request.Header.Get("Authorization")
+	if len(requestAuthordata) > 0 {
+		authorizationData := strings.SplitN(ctx.Request.Header.Get("Authorization"), " ", 2)
+		if len(authorizationData) > 1 {
+			inputToken = authorizationData[1]
+			token_user, err := token_model.ValidateToken(inputToken)
+			if err == nil {
+				wxUserId = token_user.Id
+			}
+		}
+	}
+
+	return wxUserId
+}
+
+// sceneId, 关注场景id
+func (self *BaseController) CheckWxUserSubscribe(sceneId int64) {
+	beego.BeeLogger.Info("check wx_user subscribe")
+	ctx := self.Ctx
+	if !isWxClient(ctx) {
+		return
+	}
+	wxUserId, ok := ctx.Input.Session(SessionWxUserKey).(int64)
+	if ok {
+		wxUser := user_model.GetWxUserById(wxUserId, false)
+		if wxUser == nil {
+			beego.BeeLogger.Error("WxUser Not Found, id=%d", wxUserId)
+		} else {
+			if wxUser.Subscribe == 0 {
+				qrcode := channel_gzh_qrcode_model.GetBySceneId(sceneId, true)
+				if qrcode == nil {
+					//默认二维码
+					qrcode = channel_gzh_qrcode_model.GetBySceneId(25, true)
+				}
+				qrcodeUrl := qrcode.QrcodeImg
+				errCode := &ErrCode{
+					Code:     WxUserNeedSubscribe[0],
+					Msg:      WxUserNeedSubscribe[1],
+					Redirect: qrcodeUrl,
+					Data:     nil,
+				}
+				ctx.Output.SetStatus(403)
+				ctx.Output.JSON(errCode, true, true)
+				self.StopRun()
+			}
+		}
+	} else {
+		beego.BeeLogger.Error("WxUser Not Login")
+	}
+}
+
+func checkWxUserLogin(ctx *context.Context) {
+	//beego.BeeLogger.Info("show the request : %s from UserAgent: %s", ctx.Input.URI(), ctx.Input.UserAgent())
+	//检测 token 是否合法
+	var inputToken string
+	//beego.BeeLogger.Warn("request authorizationData : %s", ctx.Request.Header.Get("Authorization"))
+	requestAuthordata := ctx.Request.Header.Get("Authorization")
+	if len(requestAuthordata) > 0 {
+		authorizationData := strings.SplitN(ctx.Request.Header.Get("Authorization"), " ", 2)
+		if len(authorizationData) != 2 {
+			errCode := &ErrCode{
+				Code:     UserNeedLogin[0],
+				Msg:      UserNeedLogin[1],
+				Redirect: "",
+				Data:     nil,
+			}
+			//换成userNeedLogin
+			ctx.Output.SetStatus(403)
+			ctx.Output.JSON(errCode, true, true)
+		} else {
+			inputToken = authorizationData[1]
+			var wxUser *user_model.WxUser
+			user_token, err := token_model.ValidateToken(inputToken)
+			wxUser = user_model.GetWxUserById(user_token.Id, true)
+			if err != nil || wxUser == nil {
+				beego.BeeLogger.Warn("token error : %v", err)
+				// 验证 Token 无效
+				errCode := &ErrCode{
+					Code:     UserNeedLogin[0],
+					Msg:      UserNeedLogin[1],
+					Redirect: "",
+					Data:     nil,
+				}
+				ctx.Output.SetStatus(403)
+				ctx.Output.JSON(errCode, true, true)
+			}
+		}
+	} else {
+		errCode := &ErrCode{
+			Code:     UserNeedLogin[0],
+			Msg:      UserNeedLogin[1],
+			Redirect: "",
+			Data:     nil,
+		}
+		ctx.Output.SetStatus(401)
+		ctx.Output.JSON(errCode, true, true)
+	}
+	return
+}
+
+// 检查来自大后台的请求是否为服务器IP
+func CheckIsInvokeFromRailsAdmin(ctx *context.Context) {
+	s := strings.Split(ctx.Request.RemoteAddr, ":")
+	ip := s[0]
+	beego.BeeLogger.Debug("railsadmin request ip is: %s", ip)
+	if ip != beego.AppConfig.String("RailsAdminAddr") {
+		errCode := &ErrCode{
+			Code:     RailAdminIPReduced[0],
+			Msg:      RailAdminIPReduced[1],
+			Redirect: "",
+			Data:     nil,
+		}
+		ctx.Output.SetStatus(403)
+		ctx.Output.JSON(errCode, true, true)
+	}
+}
+
+func (self *BaseController) Prepare() {
+	//beego.BeeLogger.Info("invote controller Prepare func")
+	needChkWxUserLogin := true
+	//needChkUserLogin := true
+	// needChkWxUserSubscribe := false
+	_, actionName := self.GetControllerAndAction()
+
+	if len(self.ExceptCheckWxUserLoginAction) > 0 {
+		for _, an := range self.ExceptCheckWxUserLoginAction {
+			if strings.ToLower(an) == "*" || strings.ToLower(an) == strings.ToLower(actionName) {
+				needChkWxUserLogin = false
+				break
+			}
+		}
+	}
+
+	if needChkWxUserLogin {
+		checkWxUserLogin(self.Ctx)
+	}
+
+}
+
+type ErrCode struct {
+	Status   int               `json:"status"`
+	Code     string            `json:"err_code"`
+	Msg      string            `json:"err_msg"`
+	Redirect string            `json:"redirect_to"`
+	Data     map[string]string `json:"data"`
+}
+
+// 定义返回错误信息
+func (self *BaseController) ReturnError(status int, code []string, redirect string, data map[string]string) {
+	errCode := &ErrCode{
+		Status:   status,
+		Code:     code[0],
+		Msg:      code[1],
+		Redirect: redirect,
+		Data:     data,
+	}
+	// jsonErrCode, err := json.Marshal(errCode)
+	// if err != nil {
+	// 	beego.BeeLogger.Error("json encode error=[%s]", err)
+	// }
+	self.Ctx.Output.SetStatus(status)
+	// self.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
+	self.Ctx.Output.JSON(errCode, true, true)
+	self.StopRun()
+	// self.ServeJson(status, string(jsonErrCode))
+}
+
+// TODO校验是否微信客户端
+func (self *BaseController) IsWxClient() bool {
+	return isWxClient(self.Ctx)
+}
+
+// TODO校验是否微信客户端
+func isWxClient(ctx *context.Context) bool {
+	agent := ctx.Input.UserAgent()
+	b := getRealBrowser(agent)
+	isWxClient := b == "wx"
+	return isWxClient
+}
+
+// 是否是手机端
+func (self *BaseController) IsMobile() bool {
+	ua := strings.ToLower(self.Ctx.Input.UserAgent())
+	if ua == "" {
+		return true
+	}
+	ok, _ := regexp.MatchString("iphone|nokia|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile", ua)
+	return ok
+}
+
+// 是否是开发模式
+func (self *BaseController) IsDev() bool {
+	//return beego.BConfig.RunMode == beego.DEV
+	return beego.AppConfig.String("Env") != "production"
+}
+
+func getRealBrowser(ua string) string {
+	userAgent := user_agent.New(ua)
+	browser, _ := userAgent.Browser()
+	browser = strings.ToLower(browser)
+	if browser == "internet explorer" {
+		browser = "ie"
+	}
+	lowerUa := strings.ToLower(ua)
+	// beego.BeeLogger.Warning("ua=%s", lowerUa)
+	if strings.Contains(lowerUa, "micromessenger") {
+		browser = "wx"
+	}
+	if strings.Contains(lowerUa, "wechatdevtools") {
+		browser = "wx"
+	}
+	return browser
+}
+
+func (self *BaseController) GetFullImgUrl(img string) string {
+	if img == "" {
+		return ""
+	}
+	if strings.HasPrefix(img, "http://") || strings.HasPrefix(img, "https://") {
+		return img
+	} else {
+		return fmt.Sprintf("%s/%s", beego.AppConfig.String("AliCDNImgHost"), img)
+	}
+}
+
+func (self *BaseController) GetCdnFullImgUrl(img string) string {
+	if img == "" {
+		return ""
+	}
+	if strings.HasPrefix(img, "http://") || strings.HasPrefix(img, "https://") {
+		return img
+	} else {
+		return fmt.Sprintf("%s/%s", beego.AppConfig.String("AliCDNImgHost"), img)
+	}
+}
+
+// ServeJSON sends a json response with encoding charset.
+func (c *BaseController) ServeResultJSON(encoding ...bool) {
+	from := c.GetString("source")
+	//beego.BeeLogger.Warn("from--%s", from)
+	type Result struct {
+		Result interface{} `json:"result"`
+	}
+	var (
+		hasIndent   = true
+		hasEncoding = false
+	)
+	if beego.AppConfig.String("RunMode") == "prod" {
+		hasIndent = false
+	}
+	if len(encoding) > 0 && encoding[0] == true {
+		hasEncoding = true
+	}
+	if from == beego.AppConfig.String("SourceList") {
+		c.Data["json"] = &Result{Result: c.Data["json"]}
+	}
+	c.Ctx.Output.JSON(c.Data["json"], hasIndent, hasEncoding)
+}

+ 1 - 0
go/gopath/src/github.com/araddon/dateparse

@@ -0,0 +1 @@
+Subproject commit 6b43995a97dee4b2c7fc0bdff8e124da9f31a57e

+ 1 - 0
go/gopath/src/github.com/chromedp/cdproto

@@ -0,0 +1 @@
+Subproject commit 8e31ff06e23b565feb2daa538f31a38eff334177

+ 1 - 0
go/gopath/src/github.com/chromedp/chromedp

@@ -0,0 +1 @@
+Subproject commit b193297e042c86b7fe3cdcde2d91f39bf9a5a0f2

+ 1 - 0
go/gopath/src/github.com/chromedp/sysutil

@@ -0,0 +1 @@
+Subproject commit dc95e7e83e8ace83d4f6dab60a16c539d2f25837

+ 1 - 0
go/gopath/src/github.com/gobwas/httphead

@@ -0,0 +1 @@
+Subproject commit 935b70b38dcb69f249f00f338774bf75822c090a

+ 1 - 0
go/gopath/src/github.com/gobwas/pool

@@ -0,0 +1 @@
+Subproject commit cd2fb0a117357da7830c32f332c8520db8e2827d

+ 1 - 0
go/gopath/src/github.com/gobwas/ws

@@ -0,0 +1 @@
+Subproject commit 516805a9f3b35d04657bb22ce7e667e08421d134

+ 1 - 0
go/gopath/src/github.com/josharian/intern

@@ -0,0 +1 @@
+Subproject commit 42b52b674af5a7cef9ce7e197bc21c78394ae65d

+ 1 - 0
go/gopath/src/github.com/mailru/easyjson

@@ -0,0 +1 @@
+Subproject commit a209843d8ea9db383ce1a1976e43c8e95f831c61