Участник, который находился в глубоком дрейфе всего 10 лет, полон решимости поддерживать проект в течение следующих 10 лет. Функция этого проекта не определена. Есть две основные цели: одна — углубить свои технические знания, а другая — дать рекомендации другим учащимся.
Если вам интересно, вы можете присоединиться ко мне, чтобы сделать этот проект.Никаких сборов, никакой рутины, и в мире есть настоящая любовь.
1. Проект «Десятилетие открытого исходного кода» возник из моей идеи.
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, чтобы завершить и способствовать развитию проекта вместе со мной. .