1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/daitougege-gin-skeleton-admin-backend

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
guide.md 10 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 12.03.2025 11:39 5df768d

1. Управление кнопками (tb_auth_button_cn_en): полная реализация CRUD-операций

В данном разделе будет представлен порядок выполнения задач в соответствии с моими личными методами разработки: создание таблицы в базе данных -> написание модели -> создание контроллера -> написание валидатора для формы -> написание маршрута

1.1 Структура таблицы управления кнопками и код создания таблицы в базе данных

-- Ниже приведён пример структуры таблицы
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 = 'Управление кнопками'

2 Написание кода модели для данной таблицы

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

// Мы сейчас рассмотрим основные операции: создание, удаление, изменение и выборка

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"`

5 Регистрация вышеуказанных валидаторов форм в контейнере подробнее здесь

    // Кнопка создания
    {
        key = consts.ValidatorPrefix + "ButtonCreate"
        containers.Set(key, button.ButtonCreate{})
    }

6 Настройка маршрутов подробнее здесь

    // Кнопки
    button := backend.Group("button/")
    {
        // Создание новой кнопки
        button.POST("create", validatorFactory.Create(consts.ValidatorPrefix + "ButtonCreate"))
    }

7 Привязка таблицы управления кнопками (tb_auth_button_cn_en) к меню

Каждый model может быть привязан к одному меню, которое затем можно назначить любому посту, отделу или компании, а конечный пользователь будет иметь доступ к этим правам через свои посты, наследуя права по цепочке.

8 Назначение привязанного меню таблицы управления кнопками (tb_auth_button_cn_en) организации (пост, отдел, компания и т.д.)

9 В конце, можно начать разработку соответствующих страниц на фронте

Для получения кода откройте проект фронтенда, путь: src/view/system_setting/button/index.vue, используйте его как образец. Поскольку фронтенд и бэкенд являются единым целым, рекомендуется следовать руководству по разработке фронтенда при создании проекта.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/daitougege-gin-skeleton-admin-backend.git
git@api.gitlife.ru:oschina-mirror/daitougege-gin-skeleton-admin-backend.git
oschina-mirror
daitougege-gin-skeleton-admin-backend
daitougege-gin-skeleton-admin-backend
master