Участник, который находился в глубоком дрейфе всего 10 лет, полон решимости поддерживать проект в течение следующих 10 лет. Функция этого проекта не определена. Есть две основные цели: одна — углубить свои технические знания, а другая — дать рекомендации другим учащимся.

    Если вам интересно, вы можете присоединиться ко мне, чтобы сделать этот проект.Никаких сборов, никакой рутины, и в мире есть настоящая любовь.

    1. Проект «Десятилетие открытого исходного кода» возник из моей идеи.

    2. Подготовка проекта

    3. Скелет проекта блога --- Иди языковой бой

    4. Подробное объяснение Gin и демо-практика на языке Go

   5. Управление конфигурацией проекта Go рекомендует подробное объяснение Viper от Viper.

    6. Подробное объяснение GORM самой дружественной ORM на языке Go

    7. Приложение jwt-go для регистрации блога, авторизации и проверки разрешений

    

Перейти на актуальный проект - функция добавления кода приглашения в проект

Как упоминалось в предыдущем резюме, я хочу добавить функцию кода приглашения в наш проект блога, потому что после того, как проект будет завершен, я разверну его.Хотя он не полагается на эту вещь, чтобы заработать деньги, он должен быть хотя бы один в реальном бою.Есть еще процесс перехода проекта с 0 на 1. Здесь возникает очень серьезная проблема: как контролировать контент? (Не контролировать контент в Китае невозможно)

  • Проверка вручную (у меня не так много времени)

  • Доступ к сторонней модерации контента (расходы)

  • Интеллектуальный аудит (без этой технологии ~ возможно, мы сможем реализовать ее через десять лет с открытым исходным кодом)

Так что нет никакого способа, поскольку я не могу контролировать контент, я контролирую его из источника: человека, который непосредственно контролирует выходной контент.

Поэтому решение, которое я придумал, состояло в том, чтобы сделать ограничение при регистрации, чтобы все не могли успешно зарегистрироваться, а могли зарегистрироваться и испытать только те, кому доверяют члены нашего круга. Тогда логику реализации следует продумать заранее:

  • Откуда взялся код приглашения?

Код приглашения генерируется системой и создается зарегистрированными участниками вручную. Участникам не разрешается генерировать 5 кодов приглашения, и каждый код приглашения можно использовать только один раз.

  • Где я могу использовать код приглашения?

Код приглашения используется при регистрации новых участников (обязательно)

  • Как отследить код приглашения?

Поскольку код приглашения генерируется зарегистрированными участниками вручную, я возьму таблицу в библиотеке, чтобы записать его отдельно. Если новый участник использует код приглашения, я также запишу его. Если вы хотите отследить его позже, он будет очень легко просто

В соответствии с вышеизложенными идеями будем поэтапно реализовывать его функцию:

1. Сначала напишите маршрут интерфейса:

r.GET("/v1/account/invite", common.AuthMiddleware(),controller.Invite)

Поскольку код приглашения может быть создан только зарегистрированными участниками, необходимо добавить ограничение разрешений common.AuthMiddleware().

2. Реализовать генерацию кода приглашения:

func RandomString(n int) string {  var letters = []byte("23456789qwertyupkjhgfdsazxcvbnmMNBVCXZASDFGHJKPOUYTREWQ")  result := make([]byte,n)  rand.Seed(time.Now().Unix())  for i := range result {    result[i] = letters[rand.Intn(len(letters))]  }  return string(result)}

На самом деле это функция, генерирующая случайные значения, в которой я удалил «0», «1», «i», «l», «I», «L» и другие неузнаваемые символы.

3. Реализовать функцию интерфейса кода приглашения:

//创建用户邀请码func Invite(ctx *gin.Context){  udata ,_:= ctx.Get("user")//首先通过token去获取用户信息  dto := dto.ToUserDto(udata.(model.User))  DB := common.GetDB()  var inviteCodes []model.InviteCode  DB.Where("userid = ?",dto.ID).Find(&inviteCodes)//根据用户信息去查询这个用户有多少个邀请码  fmt.Println(len(inviteCodes))  if len(inviteCodes) < 5{//如果不够5个则允许他继续生成邀请码    code := RandomString(5)    newCode := model.InviteCode{      Userid: dto.ID,      Code: code,      Status: 0,    }    //生成成功后把它记录进库表里面    if err := DB.Create(&newCode).Error;err != nil{      response.Response(ctx,http.StatusInternalServerError,500,nil,err.Error())      return    }    response.Response(ctx,http.StatusOK,6000,gin.H{"inviteCode":code},"邀请码生成成功")  }else{    response.Response(ctx,http.StatusOK,60001,nil,"每个人只可以拥有5个邀请码")    return  }
}

О создании инвайт-кода сказано выше, мы создали таблицу инвайткодов для хранения (код модели ниже)

4. Чтобы изменить функцию регистрации

Изначально для нашей регистрации требовался только номер мобильного телефона и пароль, но мы хотим контролировать регистрацию, поэтому нам нужно добавить несколько условий проверки:

1) Существует ли реферер?

2) Существует ли код приглашения?

3) Совпадает ли пригласительный код с рекомендательным?

4) Был ли использован код приглашения?

После того, как эти несколько условий будут оценены, если все они будут соблюдены, будет дано освобождение, и после освобождения должна быть выполнена операция:

1) Отметьте, что код приглашения был использован

2) Свяжите код приглашения с зарегистрированной учетной записью

Для приведенной выше логики сначала спроектируйте и преобразуйте библиотечную таблицу.

Новое поле "invitecode" добавляется непосредственно в таблицу пользователей, цель которого - связать код приглашения с регистрантом.

type User struct {  gorm.Model  Name      string `gorm:"type:varchar(20);not null"`  Mobile    string `gorm:"varchar(11);not null;unique"`  Password  string `gorm:"size:255;not null"`  InviteCode string      `json:"invitecode" gorm:"not null"`}

Затем была создана новая таблица для хранения сгенерированных нами кодов приглашения и для связывания записей кодов приглашения с пользователями, сгенерировавшими коды приглашения.

type InviteCode struct {  gorm.Model  Userid  uint      `json:"user_id" gorm:"not null"`  Code    string      `json:"code" gorm:"not null"`  Status  uint      `json:"status" gorm:"not null"`}

Таблица библиотеки построена, и ниже приведена реализация кода для вышеуказанной логики при регистрации: (пожалуйста, проверьте github для всего кода)

if isTelephoneExist(DB,recommender){//查询这个推荐者存不存在    id := getRecommenderId(DB,recommender)//先获取推荐者的ID    //判断其邀请码的准确性    var inviteCodes []model.InviteCode    DB.Where("userid = ?",id).Find(&inviteCodes)//根据id去查这个推荐者有多少邀请码    isValid := false    for _,inviteCode := range inviteCodes{//轮寻他所有邀请码      isValid = strings.EqualFold(code,inviteCode.Code)//一一对比,查看注册者输入的是否和库里的一致      if  isValid {        if inviteCode.Status == 0 {//如果一致,则再验证这个是否已经被用了          DB.Model(&inviteCode).Update("status",1)          break        }else{          response.Response(ctx,http.StatusOK,60002,nil,"邀请码已使用")          return        }      }    }    if !isValid {      response.Response(ctx,http.StatusOK,60002,nil,"邀请码不存在")      return    }  }else {    //最后这个提示,我是想避免被人拿这个接口测试用户存在与否    response.Response(ctx,http.StatusOK,60002,nil,"邀请码不存在")    return  }

Что ж, вот мы в основном завершили эту простую маленькую функцию, просто запустите main.go, чтобы испытать ее на себе.

хорошо, только это. увидимся в следующий раз ...


Обновление десятилетнего проекта с открытым исходным кодом было впервые опубликовано в общедоступной учетной записи: компьютерная самообучающаяся платформа, заинтересованные друзья могут продолжать обращать внимание и приветствовать всех, чтобы добавить мой WeChat, чтобы завершить и способствовать развитию проекта вместе со мной. .

картина