feat:完善项目信息

This commit is contained in:
henry
2022-01-13 17:48:41 +08:00
parent 4637a5fb4b
commit 27cb063a6c
11 changed files with 85 additions and 79 deletions

View File

@ -45,6 +45,12 @@ type (
} }
) )
func (c *Instance) checkIsExist(iModel model2.IModel, where ...*model2.ModelWhere) (bool, error) {
var count int64
err := model2.Count(iModel, &count, where...)
return count > 0, err
}
// Index 首页列表信息 // Index 首页列表信息
func (c *Instance) Index(name string, page, pageSize int) (*controller.ReturnPages, error) { func (c *Instance) Index(name string, page, pageSize int) (*controller.ReturnPages, error) {
mSysTenant := model.NewSysTenant() mSysTenant := model.NewSysTenant()
@ -110,6 +116,8 @@ func (c *Instance) Select() (map[string]*InstanceSelectInfo, error) {
func (c *Instance) Form(params *InstanceParams) error { func (c *Instance) Form(params *InstanceParams) error {
mSysTenant := model.NewSysTenant() mSysTenant := model.NewSysTenant()
isExist := false
if params.ID > 0 { if params.ID > 0 {
mSysTenant.ID = params.ID mSysTenant.ID = params.ID
@ -122,7 +130,12 @@ func (c *Instance) Form(params *InstanceParams) error {
} }
if mSysTenant.Province != params.Area.Province || mSysTenant.City != params.Area.City { if mSysTenant.Province != params.Area.Province || mSysTenant.City != params.Area.City {
// TODO:查询区域是否存在租户平台 if isExist, err = c.checkIsExist(mSysTenant.SysTenant, model2.NewWhere("province", params.Area.Province),
model2.NewWhere("city", params.Area.City)); err != nil {
return err
} else if isExist {
return errors.New("操作错误,该区域下已存在平台信息")
}
} }
} }
mSysTenant.Name = params.Name mSysTenant.Name = params.Name
@ -137,10 +150,21 @@ func (c *Instance) Form(params *InstanceParams) error {
if mSysTenant.ID > 0 { if mSysTenant.ID > 0 {
return model2.Updates(mSysTenant.SysTenant, mSysTenant.SysTenant) return model2.Updates(mSysTenant.SysTenant, mSysTenant.SysTenant)
} }
if !utils.ValidateUrl(params.Domain) {
return errors.New("操作错误,域名地址信息错误")
}
mSysTenant.Key = utils.GetRandomString(12) mSysTenant.Key = utils.GetRandomString(12)
mSysTenant.Domain = params.Domain mSysTenant.Domain = params.Domain
if err := model2.Create(mSysTenant.SysTenant); err != nil { var err error
if isExist, err = c.checkIsExist(mSysTenant.SysTenant, model2.NewWhere("province", params.Area.Province),
model2.NewWhere("city", params.Area.City)); err != nil {
return err
} else if isExist {
return errors.New("操作错误,该区域下已存在平台信息")
}
if err = model2.Create(mSysTenant.SysTenant); err != nil {
return err return err
} }
_session := session.NewTenant() _session := session.NewTenant()

View File

@ -18,8 +18,7 @@ func (*Activity) Applys(c *gin.Context) {
api.APIFailure(err.(error))(c) api.APIFailure(err.(error))(c)
return return
} }
data, err := activity.NewApply()(api.GetSession()(c).(*session.Enterprise), api.GetTenantID()(c).(string)). data, err := activity.NewApply()(api.GetSession()(c).(*session.Enterprise)).Instance(form.Title, form.Page, form.PageSize)
List(form.Title, form.Page, form.PageSize)
api.APIResponse(err, data)(c) api.APIResponse(err, data)(c)
} }
@ -39,8 +38,7 @@ func (*Activity) ApplyLaunch(c *gin.Context) {
api.APIFailure(err.(error))(c) api.APIFailure(err.(error))(c)
return return
} }
err := activity.NewApply()(api.GetSession()(c).(*session.Enterprise), api.GetTenantID()(c).(string)). err := activity.NewApply()(api.GetSession()(c).(*session.Enterprise)).Launch(&activity.ApplyLaunchParams{
Launch(&activity.ApplyLaunchParams{
Mode: form.Mode, MaxNUmber: form.MaxNumber, Title: form.Title, Amount: form.Amount, Content: form.Content, Mode: form.Mode, MaxNUmber: form.MaxNumber, Title: form.Title, Amount: form.Amount, Content: form.Content,
BeginAt: form.BeginAt, FinishAt: form.FinishAt, JoinDeadline: form.JoinDeadline, BeginAt: form.BeginAt, FinishAt: form.FinishAt, JoinDeadline: form.JoinDeadline,
}) })
@ -54,8 +52,7 @@ func (*Activity) ApplyRevoke(c *gin.Context) {
api.APIFailure(err.(error))(c) api.APIFailure(err.(error))(c)
return return
} }
err := activity.NewApply()(api.GetSession()(c).(*session.Enterprise), api.GetTenantID()(c).(string)). err := activity.NewApply()(api.GetSession()(c).(*session.Enterprise)).Revoke(form.Convert())
Revoke(form.Convert())
api.APIResponse(err)(c) api.APIResponse(err)(c)
} }
@ -66,8 +63,7 @@ func (*Activity) ApplyDelete(c *gin.Context) {
api.APIFailure(err.(error))(c) api.APIFailure(err.(error))(c)
return return
} }
err := activity.NewApply()(api.GetSession()(c).(*session.Enterprise), api.GetTenantID()(c).(string)). err := activity.NewApply()(api.GetSession()(c).(*session.Enterprise)).Delete(form.Convert())
Delete(form.Convert())
api.APIResponse(err)(c) api.APIResponse(err)(c)
} }
@ -81,8 +77,7 @@ func (*Activity) Joins(c *gin.Context) {
api.APIFailure(err.(error))(c) api.APIFailure(err.(error))(c)
return return
} }
data, err := activity.NewInstance()(api.GetSession()(c).(*session.Enterprise), api.GetTenantID()(c).(string)). data, err := activity.NewInstance()(api.GetSession()(c).(*session.Enterprise)).Joins(form.Title, form.Status, form.Page, form.PageSize)
Joins(form.Title, form.Status, form.Page, form.PageSize)
api.APIResponse(err, data)(c) api.APIResponse(err, data)(c)
} }
@ -93,7 +88,6 @@ func (*Activity) JoinDelete(c *gin.Context) {
api.APIFailure(err.(error))(c) api.APIFailure(err.(error))(c)
return return
} }
err := activity.NewInstance()(api.GetSession()(c).(*session.Enterprise), api.GetTenantID()(c).(string)). err := activity.NewInstance()(api.GetSession()(c).(*session.Enterprise)).JoinDelete(form.Convert())
JoinDelete(form.Convert())
api.APIResponse(err)(c) api.APIResponse(err)(c)
} }

View File

@ -12,10 +12,9 @@ import (
type Apply struct { type Apply struct {
*session.Enterprise *session.Enterprise
local string
} }
type ApplyHandle func(session *session.Enterprise, local string) *Apply type ApplyHandle func(session *session.Enterprise) *Apply
type ( type (
// ApplyLaunchParams 参数信息 // ApplyLaunchParams 参数信息
@ -28,18 +27,18 @@ type (
) )
// List 列表信息 // List 列表信息
func (c *Apply) List(title string, page, pageSize int) (*controller.ReturnPages, error) { func (c *Apply) Instance(title string, page, pageSize int) (*controller.ReturnPages, error) {
mActivityApply := model.NewActivityApply() mActivityApply := model.NewActivityApply()
out := make([]*model2.ActivityApply, 0) out := make([]*model2.ActivityApply, 0)
where := []*model2.ModelWhereOrder{ where := []*model2.ModelWhereOrder{
&model2.ModelWhereOrder{ &model2.ModelWhereOrder{
Where: model2.NewWhere("local", c.local), Where: model2.NewWhere("uid", c.UID),
Order: model2.NewOrder("id", model2.OrderModeToDesc), Order: model2.NewOrder("id", model2.OrderModeToDesc),
}, },
&model2.ModelWhereOrder{ &model2.ModelWhereOrder{
Where: model2.NewWhere("identity_uid", c.IdentityUID), Where: model2.NewWhere("identity", c.SelectIdentity),
}, },
} }
if title != "" { if title != "" {
@ -79,7 +78,7 @@ func (c *Apply) Revoke(id uint64) error {
mActivityApply := model.NewActivityApply() mActivityApply := model.NewActivityApply()
mActivityApply.ID = id mActivityApply.ID = id
isExist, err := model2.FirstField(mActivityApply.ActivityApply, []string{"id", "identity_uid", "status"}) isExist, err := model2.FirstField(mActivityApply.ActivityApply, []string{"id", "uid", "status"})
if err != nil { if err != nil {
return err return err
@ -88,7 +87,7 @@ func (c *Apply) Revoke(id uint64) error {
} else if mActivityApply.Status != model2.ActivityApplyStatusForProcessing { } else if mActivityApply.Status != model2.ActivityApplyStatusForProcessing {
return errors.New("操作错误,当前活动状态易发生变化,不可撤销") return errors.New("操作错误,当前活动状态易发生变化,不可撤销")
} else if mActivityApply.UID != c.UID { } else if mActivityApply.UID != c.UID {
return errors.New("无权限操作") return errors.New("操作错误,无权限操作")
} }
return model2.Updates(mActivityApply.ActivityApply, map[string]interface{}{ return model2.Updates(mActivityApply.ActivityApply, map[string]interface{}{
"status": model2.ActivityApplyStatusForRevoke, "updated_at": time.Now(), "status": model2.ActivityApplyStatusForRevoke, "updated_at": time.Now(),
@ -100,23 +99,20 @@ func (c *Apply) Delete(id uint64) error {
mActivityApply := model.NewActivityApply() mActivityApply := model.NewActivityApply()
mActivityApply.ID = id mActivityApply.ID = id
isExist, err := model2.FirstField(mActivityApply.ActivityApply, []string{"id", "identity_uid"}) isExist, err := model2.FirstField(mActivityApply.ActivityApply, []string{"id", "uid"})
if err != nil { if err != nil {
return err return err
} else if !isExist { } else if !isExist {
return errors.New("操作错误,活动信息不存在或已被删除") return errors.New("操作错误,活动信息不存在或已被删除")
} else if mActivityApply.UID != c.IdentityUID { } else if mActivityApply.UID != c.IdentityUID {
return errors.New("无权限操作") return errors.New("操作错误,无权限操作")
} }
return model2.Delete(mActivityApply.ActivityApply) return model2.Delete(mActivityApply.ActivityApply)
} }
func NewApply() ApplyHandle { func NewApply() ApplyHandle {
return func(session *session.Enterprise, local string) *Apply { return func(session *session.Enterprise) *Apply {
return &Apply{ return &Apply{session}
Enterprise: session,
local: local,
}
} }
} }

View File

@ -10,10 +10,9 @@ import (
type Instance struct { type Instance struct {
*session.Enterprise *session.Enterprise
local string
} }
type InstanceHandle func(session *session.Enterprise, local string) *Instance type InstanceHandle func(session *session.Enterprise) *Instance
type InstanceForJoin struct { type InstanceForJoin struct {
*model.ActivityInstanceJoinInfo *model.ActivityInstanceJoinInfo
@ -25,9 +24,8 @@ func (c *Instance) Joins(title string, status, page, pageSize int) (*controller.
mActivityInstance := model.NewActivityInstance() mActivityInstance := model.NewActivityInstance()
where := []*model2.ModelWhere{ where := []*model2.ModelWhere{
model2.NewWhere("a.local", c.local), model2.NewWhere("j.identity", c.SelectIdentity),
model2.NewWhere("a.identity", c.Identity), model2.NewWhere("j.uid", c.UID),
model2.NewWhere("j.m_uid", c.UID),
} }
if title != "" { if title != "" {
@ -73,7 +71,7 @@ func (c *Instance) JoinDelete(id uint64) error {
} }
func NewInstance() InstanceHandle { func NewInstance() InstanceHandle {
return func(session *session.Enterprise, local string) *Instance { return func(session *session.Enterprise) *Instance {
return &Instance{Enterprise: session, local: local} return &Instance{Enterprise: session}
} }
} }

View File

@ -18,7 +18,7 @@ func (*Activity) Instance(c *gin.Context) {
api.APIFailure(err.(error))(c) api.APIFailure(err.(error))(c)
return return
} }
data, err := controller.NewActivity()(nil, "").Instance(form.Title, form.Mode, form.Page, form.PageSize) data, err := controller.NewActivity()(getSession(c)).Instance(form.Title, form.Mode, form.Page, form.PageSize)
api.APIResponse(err, data)(c) api.APIResponse(err, data)(c)
} }
@ -30,7 +30,7 @@ func (*Activity) Detail(c *gin.Context) {
api.APIFailure(err.(error))(c) api.APIFailure(err.(error))(c)
return return
} }
data, err := controller.NewActivity()(nil, "").Detail(form.Convert()) data, err := controller.NewActivity()(getSession(c)).Detail(form.Convert())
api.APIResponse(err, data)(c) api.APIResponse(err, data)(c)
} }
@ -42,6 +42,6 @@ func (*Activity) Join(c *gin.Context) {
api.APIFailure(err.(error))(c) api.APIFailure(err.(error))(c)
return return
} }
err := controller.NewActivity()(nil, "").Join(form.Convert()) err := controller.NewActivity()(getSession(c)).Join(form.Convert())
api.APIResponse(err)(c) api.APIResponse(err)(c)
} }

View File

@ -12,10 +12,9 @@ import (
type Activity struct { type Activity struct {
*session.Enterprise *session.Enterprise
local string
} }
type ActivityHandle func(session *session.Enterprise, local string) *Activity type ActivityHandle func(session *session.Enterprise) *Activity
type ( type (
// ActivityInfo 活动信息 // ActivityInfo 活动信息
@ -38,11 +37,6 @@ func (c *Activity) Instance(title string, mode, page, pageSize int) (*controller
var count int64 var count int64
var identityUID uint64
if c.Enterprise != nil {
identityUID = c.IdentityUID
}
where := make([]*model2.ModelWhere, 0) where := make([]*model2.ModelWhere, 0)
if title != "" { if title != "" {
@ -51,7 +45,7 @@ func (c *Activity) Instance(title string, mode, page, pageSize int) (*controller
if mode > 0 { if mode > 0 {
where = append(where, model2.NewWhere("a.mode", mode)) where = append(where, model2.NewWhere("a.mode", mode))
} }
out, err := mActivityInstance.Activity(identityUID, page, pageSize, &count) out, err := mActivityInstance.Activity(c.UID, c.SelectIdentity, page, pageSize, &count)
if err != nil { if err != nil {
return nil, err return nil, err
@ -61,9 +55,7 @@ func (c *Activity) Instance(title string, mode, page, pageSize int) (*controller
for _, v := range out { for _, v := range out {
list = append(list, &ActivityInfo{ list = append(list, &ActivityInfo{
ID: v.GetEncodeID(), ID: v.GetEncodeID(), ActivityInstanceInfo: v, JoinStatus: v.JoinID > 0,
ActivityInstanceInfo: v,
JoinStatus: v.JoinID > 0,
}) })
} }
return &controller.ReturnPages{Data: list, Count: count}, nil return &controller.ReturnPages{Data: list, Count: count}, nil
@ -73,12 +65,7 @@ func (c *Activity) Instance(title string, mode, page, pageSize int) (*controller
func (c *Activity) Detail(id uint64) (*ActivityDetail, error) { func (c *Activity) Detail(id uint64) (*ActivityDetail, error) {
mActivityInstance := model.NewActivityInstance() mActivityInstance := model.NewActivityInstance()
var identityUID uint64 out, err := mActivityInstance.Detail(id, c.UID, c.SelectIdentity)
if c.Enterprise != nil {
identityUID = c.IdentityUID
}
out, err := mActivityInstance.Detail(id, identityUID)
if err != nil { if err != nil {
return nil, err return nil, err
@ -107,10 +94,14 @@ func (c *Activity) Join(id uint64) error {
if !mActivityInstance.IsCanJoin() { if !mActivityInstance.IsCanJoin() {
return errors.New("操作错误,当前活动信息不可报名") return errors.New("操作错误,当前活动信息不可报名")
} }
if c.SelectIdentity <= 0 {
return errors.New("操作错误,当前未选择任何身份信息")
}
// 查看当前活动是否报名 // 查看当前活动是否报名
var count int64 var count int64
if err = model2.Count(model.NewActivityJoin().ActivityJoin, &count, model2.NewWhere("identity_id", c.IdentityUID), if err = model2.Count(model.NewActivityJoin().ActivityJoin, &count, model2.NewWhere("id", c.UID),
model2.NewWhere("identity", c.SelectIdentity),
model2.NewWhere("activity_id", id), model2.NewWhere("status", model2.ActivityJoinStatusForSuccess)); err != nil { model2.NewWhere("activity_id", id), model2.NewWhere("status", model2.ActivityJoinStatusForSuccess)); err != nil {
return err return err
} }
@ -118,16 +109,13 @@ func (c *Activity) Join(id uint64) error {
return errors.New("操作错误,不可重复报名") return errors.New("操作错误,不可重复报名")
} }
if mActivityInstance.Amount <= 0 { if mActivityInstance.Amount <= 0 {
service.Publish(config.EventForActivityJoinProduce, c.IdentityUID, c.UID) service.Publish(config.EventForActivityJoinProduce, id, c.UID, c.SelectIdentity)
} }
return nil return nil
} }
func NewActivity() ActivityHandle { func NewActivity() ActivityHandle {
return func(session *session.Enterprise, local string) *Activity { return func(session *session.Enterprise) *Activity {
return &Activity{ return &Activity{session}
Enterprise: session,
local: local,
}
} }
} }

View File

@ -29,14 +29,14 @@ type (
) )
// Activity 活动信息 // Activity 活动信息
func (m *ActivityInstance) Activity(uid uint64, page, pageSize int, count *int64, where ...*model.ModelWhere) ([]*ActivityInstanceInfo, error) { func (m *ActivityInstance) Activity(uid uint64, identity, page, pageSize int, count *int64, where ...*model.ModelWhere) ([]*ActivityInstanceInfo, error) {
mActivityJoin := model.NewActivityJoin() mActivityJoin := model.NewActivityJoin()
db := orm.GetDB().Table(m.TableName()+" AS a"). db := orm.GetDB().Table(m.TableName()+" AS a").
Select("a.id", "a.title", "a.image", "a.begin_at", "a.finish_at", "a.join_deadline", Select("a.id", "a.title", "a.image", "a.begin_at", "a.finish_at", "a.join_deadline",
"IFNULL(u.id, 0) AS join_id", "j.count AS join_count"). "IFNULL(u.id, 0) AS join_id", "j.count AS join_count").
Joins(fmt.Sprintf("LEFT JOIN %s u ON a.id = u.activity_id AND u.identity_uid = %d AND u.status = %d AND u.is_deleted = %d", Joins(fmt.Sprintf("LEFT JOIN %s u ON a.id = u.activity_id AND u.uid = %d AND u.identity = %d AND u.status = %d AND u.is_deleted = %d",
mActivityJoin.TableName(), uid, model.ActivityJoinStatusForSuccess, model.DeleteStatusForNot)). mActivityJoin.TableName(), uid, identity, model.ActivityJoinStatusForSuccess, model.DeleteStatusForNot)).
Joins(fmt.Sprintf("LEFT JOIN (SELECT activity_id, COUNT(id) AS count FROM %s WHERE status = %d AND is_deleted = %d GROUP BY activity_id) AS j ON a.id = j.activity_id", Joins(fmt.Sprintf("LEFT JOIN (SELECT activity_id, COUNT(id) AS count FROM %s WHERE status = %d AND is_deleted = %d GROUP BY activity_id) AS j ON a.id = j.activity_id",
mActivityJoin.TableName(), model.ActivityJoinStatusForSuccess, model.DeleteStatusForNot)). mActivityJoin.TableName(), model.ActivityJoinStatusForSuccess, model.DeleteStatusForNot)).
Where("a.status = ?", model.ActivityInstanceStatusForShow). Where("a.status = ?", model.ActivityInstanceStatusForShow).
@ -59,14 +59,14 @@ func (m *ActivityInstance) Activity(uid uint64, page, pageSize int, count *int64
} }
// Detail 详细信息 // Detail 详细信息
func (m *ActivityInstance) Detail(id, uid uint64) (*ActivityInstanceDetail, error) { func (m *ActivityInstance) Detail(id, uid uint64, identity int) (*ActivityInstanceDetail, error) {
mActivityJoin := model.NewActivityJoin() mActivityJoin := model.NewActivityJoin()
db := orm.GetDB().Table(m.TableName()+" AS a"). db := orm.GetDB().Table(m.TableName()+" AS a").
Select("a.id", "a.title", "a.image", "a.begin_at", "a.finish_at", "a.join_deadline", Select("a.id", "a.title", "a.image", "a.begin_at", "a.finish_at", "a.join_deadline",
"IFNULL(u.id, 0) AS join_id", "j.count AS join_count"). "IFNULL(u.id, 0) AS join_id", "j.count AS join_count").
Joins(fmt.Sprintf("LEFT JOIN %s u ON a.id = u.activity_id AND u.identity_uid = %d AND u.status = %d AND u.is_deleted = %d", Joins(fmt.Sprintf("LEFT JOIN %s u ON a.id = u.activity_id AND u.uid = %d AND u.identity = %d AND u.status = %d AND u.is_deleted = %d",
mActivityJoin.TableName(), uid, model.ActivityJoinStatusForSuccess, model.DeleteStatusForNot)). mActivityJoin.TableName(), uid, identity, model.ActivityJoinStatusForSuccess, model.DeleteStatusForNot)).
Joins(fmt.Sprintf("LEFT JOIN (SELECT activity_id, COUNT(id) AS count FROM %s WHERE status = %d AND is_deleted = %d GROUP BY activity_id) AS j ON a.id = j.activity_id", Joins(fmt.Sprintf("LEFT JOIN (SELECT activity_id, COUNT(id) AS count FROM %s WHERE status = %d AND is_deleted = %d GROUP BY activity_id) AS j ON a.id = j.activity_id",
mActivityJoin.TableName(), model.ActivityJoinStatusForSuccess, model.DeleteStatusForNot)). mActivityJoin.TableName(), model.ActivityJoinStatusForSuccess, model.DeleteStatusForNot)).
Where("a.id = ?", id) Where("a.id = ?", id)

View File

@ -6,8 +6,9 @@ type ActivityJoin struct{}
func (*ActivityJoin) Handle(arg ...interface{}) { func (*ActivityJoin) Handle(arg ...interface{}) {
_ = model.Create(&model.ActivityJoin{ _ = model.Create(&model.ActivityJoin{
//IdentityUID: arg[0].(uint64), ActivityID: arg[0].(uint64),
ActivityID: arg[1].(uint64), UID: arg[1].(uint64),
Identity: arg[2].(int),
Status: model.ActivityJoinStatusForSuccess, Status: model.ActivityJoinStatusForSuccess,
}) })
} }

View File

@ -18,7 +18,7 @@ type Enterprise struct {
VipStatus bool `json:"vip_status"` // VIP状态 VipStatus bool `json:"vip_status"` // VIP状态
VipDeadline time.Time `json:"vip_deadline"` // VIP过期时间 VipDeadline time.Time `json:"vip_deadline"` // VIP过期时间
Currency float64 `json:"currency"` // 货币-创新币 Currency float64 `json:"currency"` // 货币-创新币
Identity int `json:"identity"` // 身份信息 Identity int `json:"identity"` // 身份合集信息
SelectIdentity int `json:"select_identity"` // 选中身份信息 SelectIdentity int `json:"select_identity"` // 选中身份信息
} }

View File

@ -14,8 +14,9 @@ func ValidateEmail(email string) bool {
return reg.MatchString(email) return reg.MatchString(email)
} }
func ValidateUrl(url string) { func ValidateUrl(obj string) bool {
//reg := regexp.MustCompile("^([hH][tT]{2}[pP]:|||[hH][tT]{2}[pP][sS]:|www\.)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$") reg := regexp.MustCompile("^(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]")
return reg.MatchString(obj)
} }
func ValidateIDCard(obj string) bool { func ValidateIDCard(obj string) bool {

View File

@ -45,9 +45,13 @@ func TestValidateCompile(t *testing.T) {
//status := ValidateCompile(src, compile) //status := ValidateCompile(src, compile)
//t.Log(status) //t.Log(status)
src := "htt2ps:2134" //src := "htt2ps:2134"
//t.Log(src)
//compile := "^(http|https):"
//status := ValidateCompile(src, compile)
//t.Log(status)
src := "http://213213213213"
t.Log(src) t.Log(src)
compile := "^(http|https):" status := ValidateUrl(src)
status := ValidateCompile(src, compile)
t.Log(status) t.Log(status)
} }