В данном разделе будет представлен порядок выполнения задач в соответствии с моими личными методами разработки: создание таблицы в базе данных -> написание модели -> создание контроллера -> написание валидатора для формы -> написание маршрута
-- Ниже приведён пример структуры таблицы
CREATE TABLE tb_auth_button_cn_en (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
en_name CHAR(60) CHARACTER SET utf8mb4 DEFAULT '' COMMENT 'Английское название',
cn_name CHAR(60) CHARACTER SET utf8mb4 DEFAULT '' COMMENT 'Китайское название',
color VARCHAR(100) DEFAULT 'default' COMMENT 'Цвет кнопки для отображения в меню',
allow_method VARCHAR(30) DEFAULT '*' COMMENT 'Разрешенные методы запроса',
status TINYINT(4) DEFAULT 1,
remark VARCHAR(300) CHARACTER SET utf8mb4 DEFAULT '',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP(),
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP(),
PRIMARY KEY (id)
) ENGINE = InnoDB AUTO_INCREMENT = 45 DEFAULT CHARSET = utf8 COMMENT = 'Управление кнопками'
Поскольку данная таблица уже интегрирована в систему, подробный код можно найти здесь
// Мы сейчас рассмотрим основные операции: создание, удаление, изменение и выборка
func CreateButtonCnEnFactory(sqlType string) *ButtonCnEnModel {
return &ButtonCnEnModel{
BaseModel: BaseModel{DB: UseDbConn(sqlType)},
}
}
type ButtonCnEnModel struct {
BaseModel
CnName string `json:"cn_name"`
EnName string `json:"en_name"`
AllowMethod string `json:"allow_method"`
Color string `json:"color"`
Status int `json:"status"`
Remark string `json:"remark"`
}
```// Установка имени таблицы
func (b *ButtonCnEnModel) TableName() string {
return "tb_auth_button_cn_en"
}
```<!-- Добавление -->
```go
func (b *ButtonCnEnModel) InsertData(c *gin.Context) bool {
// При использовании следующей функции привязки обязательно определите отдельную переменную
var tmp ButtonCnEnModel
// data_bind.ShouldBindFormDataToModel(c, &tmp) является сжатой версией функции gin.ShouldBind
// Основная задача - привязать проверенные через валидатор формы параметры непосредственно к модели
// Привязка основана на значении метки JSON, типе поля модели, а также на совпадении значений JSON и типа данных, установленных валидатором формы
// Кроме того, поля created_at и updated_at будут автоматически привязаны к tmp
// tmp представляет собой значение после привязки; при реальном использовании можно самостоятельно распечатать результат привязки
if err := data_bind.ShouldBindFormDataToModel(c, &tmp); err == nil {
if res := b.Create(&tmp); res.Error == nil {
return true
} else {
variable.ZapLog.Error("Ошибка добавления данных ButtonModel", zap.Error(res.Error))
}
} else {
variable.ZapLog.Error("Ошибка привязки данных ButtonModel", zap.Error(err))
}
return false
}
// Обновление данных func (b *ButtonCnEnModel) UpdateData(c *gin.Context) bool { var tmp ButtonCnEnModel if err := data_bind.ShouldBindFormDataToModel(c, &tmp); err == nil { // updates функция пропускает поля со значениями по умолчанию // save функция выполняет полное обновление всех полей tmp.CreatedAt = "" // Мы не хотим обновлять поле CreatedAt, поэтому его значение должно быть пустым if res := b.Updates(tmp); res.Error == nil { return true } else { variable.ZapLog.Error("Ошибка при изменении данных ButtonModel", zap.Error(res.Error)) } } else { variable.ZapLog.Error("Ошибка при привязке данных ButtonModel", zap.Error(err)) } return false }// Удаление данных func (b *ButtonCnEnModel) DeleteData(id int) bool { if b.Delete(b, id).Error == nil { return true } return false }
// Получение списка записей func (a *ButtonCnEnModel) List(cnName string, limitStart, limit float64) (counts int64, data []ButtonCnEnModel) {
counts = a.getCountsByButtonName(cnName) // Код этой функции можно игнорировать
if counts > 0 {
// При выполнении запроса с использованием GORM или SQL следует указывать конкретные поля для повышения производительности базы данных
// Все поля типа datetime в этом проекте обрабатываются как строки
if err := a.Model(a).
Select("id", "en_name", "cn_name", "allow_method", "color", "status", "cn_name", "remark", "DATE_FORMAT(created_at,'%Y-%m-%d %H:%i:%s') as created_at", "DATE_FORMAT(updated_at,'%Y-%m-%d %H:%i:%s') as updated_at").
Where("cn_name like ?", "%"+cnName+"%").Offset(int(limitStart)).Limit(int(limit)).Find(&data); err.Error == nil {
return
}
}
return 0, nil
}
#### 3 Создание контроллера
> Контроллер для этого таблицы очень простой и понятный, нет ничего незнакомого, [перейти к деталям](../app/http/controller/web/auth/button.go)
#### 4 Создание формы для проверки параметров (обязательно)
> Код формы для проверки параметров также очень прост, [перейти к деталям](../app/http/validator/web/auth/button)
```code
// Важно отметить особенности использования формы для проверки параметров
type ButtonCreate struct {
BaseField
}
```// Ограничение: Функция CheckParams не связана с указателем, неверная форма связи func (c ButtonCreate).CheckParams {}
// Поскольку формы для проверки параметров в нашей системе хранятся в контейнере, эта функция должна быть связана со значением, а не с указателем, чтобы избежать загрязнения кода после первого запроса
func (c ButtonCreate) CheckParams(context *gin.Context) {
// Промежуточный код опущен
}
```## Дополнительное описание проверки синтаксиса полей формы
## Для числовых полей обязательно установите тип данных как `float64`. Если требуется целочисленное значение (`int`), используйте функции преобразования, такие как `int()` или `int64()`.
## `*float64` указывает на возможность принятия значений равных нулю от пользователя;
## `float64`, в свою очередь, не принимает значения равные нулю.``````go
Status *float64 `form:"status" json:"status" binding:"required,min=0"`
// Кнопка создания
{
key = consts.ValidatorPrefix + "ButtonCreate"
containers.Set(key, button.ButtonCreate{})
}
// Кнопки
button := backend.Group("button/")
{
// Создание новой кнопки
button.POST("create", validatorFactory.Create(consts.ValidatorPrefix + "ButtonCreate"))
}
Каждый
model
может быть привязан к одному меню, которое затем можно назначить любому посту, отделу или компании, а конечный пользователь будет иметь доступ к этим правам через свои посты, наследуя права по цепочке.
Для получения кода откройте проект фронтенда, путь: src/view/system_setting/button/index.vue, используйте его как образец. Поскольку фронтенд и бэкенд являются единым целым, рекомендуется следовать руководству по разработке фронтенда при создании проекта.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )