【Go】基于GoFiber從零開始搭建一個GoWeb后臺管理系統(一)搭建項目

前言

最近兩個月一直在忙公司的項目,上班時間經常高強度寫代碼,下班了只想躺著,沒心思再學習、做自己的項目了。最近這幾天輕松一點了,終于有時間 摸魚了 做自己的事了,所以到現在我總算是搭起來一個比較完整的后臺管理系統了。

框架

我的go版本是1.21版本的。

web框架:GoFiber

用的web框架是GoFiber,我在網上找基于GoFiber的web項目,都很少,大部分用的都是Gin。

go get github.com/gofiber/fiber/v2

數據庫框架:Gorm

數據庫用的是gorm。

go get gorm.io/gorm

緩存框架:Go-Redis

緩存用redis,框架用的 go-redis。

go get github.com/go-redis/redis

go.mod

go 1.21require (github.com/dlclark/regexp2 v1.10.0github.com/go-redis/redis v6.15.9+incompatiblegithub.com/gofiber/fiber/v2 v2.49.0github.com/google/uuid v1.3.1github.com/mojocn/base64Captcha v1.3.5github.com/mozillazg/go-pinyin v0.20.0github.com/pkg/errors v0.9.1github.com/robfig/cron v1.2.0github.com/spf13/viper v1.16.0golang.org/x/crypto v0.14.0gorm.io/driver/mysql v1.5.1gorm.io/gorm v1.25.3
)require (github.com/andybalholm/brotli v1.0.5 // indirectgithub.com/fsnotify/fsnotify v1.6.0 // indirectgithub.com/go-sql-driver/mysql v1.7.0 // indirectgithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirectgithub.com/hashicorp/hcl v1.0.0 // indirectgithub.com/jinzhu/inflection v1.0.0 // indirectgithub.com/jinzhu/now v1.1.5 // indirectgithub.com/klauspost/compress v1.16.7 // indirectgithub.com/magiconair/properties v1.8.7 // indirectgithub.com/mattn/go-colorable v0.1.13 // indirectgithub.com/mattn/go-isatty v0.0.19 // indirectgithub.com/mattn/go-runewidth v0.0.15 // indirectgithub.com/mitchellh/mapstructure v1.5.0 // indirectgithub.com/onsi/ginkgo v1.16.5 // indirectgithub.com/onsi/gomega v1.30.0 // indirectgithub.com/pelletier/go-toml/v2 v2.0.8 // indirectgithub.com/rivo/uniseg v0.4.4 // indirectgithub.com/spf13/afero v1.9.5 // indirectgithub.com/spf13/cast v1.5.1 // indirectgithub.com/spf13/jwalterweatherman v1.1.0 // indirectgithub.com/spf13/pflag v1.0.5 // indirectgithub.com/subosito/gotenv v1.4.2 // indirectgithub.com/valyala/bytebufferpool v1.0.0 // indirectgithub.com/valyala/fasthttp v1.48.0 // indirectgithub.com/valyala/tcplisten v1.0.0 // indirectgolang.org/x/image v0.11.0 // indirectgolang.org/x/sys v0.13.0 // indirectgolang.org/x/text v0.13.0 // indirectgopkg.in/ini.v1 v1.67.0 // indirectgopkg.in/yaml.v3 v3.0.1 // indirect
)

項目結構

我們先來看看項目結構:

在這里插入圖片描述

還漏了個 router.go ,這個文件就是統一的GoFiber路由管理。

模塊

看上面的圖,就能知道這個后臺管理系統有哪些模塊了:

  • 登錄退出
  • 日志管理
  • 安全設置
  • 用戶管理
  • 部門管理
  • 角色管理
  • 菜單管理
  • 字典管理

其中日志管理包含了登錄日志、操作日志(增、刪、改);角色和菜單管理包含了按鈕權限;用戶、部門包含了數據權限(過濾)。

數據庫

mysql數據庫,主要有下面幾張表:

在這里插入圖片描述

SQL

可復制下面的代碼直接執行,執行完成后,用戶表的兩個用戶的密碼是:123456

DROP TABLE IF EXISTS `sys_dept`;
CREATE TABLE `sys_dept`  (`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'id',`creator_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '創建者',`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`update_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者',`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',`parent_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '父部門id',`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '部門名稱',`level` tinyint(1) NULL DEFAULT NULL COMMENT '層級(1 根目錄 2 單位 3 部門 4 小組)',`sort` int NULL DEFAULT NULL COMMENT '序號',PRIMARY KEY (`id`) USING BTREE,INDEX `name`(`name` ASC) USING BTREE,INDEX `parent_id`(`parent_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '部門管理' ROW_FORMAT = DYNAMIC;INSERT INTO `sys_dept` VALUES ('2', NULL, '2023-11-01 09:28:59', NULL, '2023-11-01 09:28:59', 'ROOT', 'A公司', 1, 2);
INSERT INTO `sys_dept` VALUES ('3', NULL, '2023-11-01 09:30:28', NULL, '2023-11-01 09:30:28', '2', '辦公室', 2, 1);
INSERT INTO `sys_dept` VALUES ('4', NULL, '2023-11-01 09:30:37', NULL, '2023-11-01 09:30:37', '3', '開發部', 3, 1);
INSERT INTO `sys_dept` VALUES ('6ad201240ab74b02b57b7eb3caadcd49', NULL, '2023-05-10 15:24:53', NULL, '2023-05-10 15:24:53', '3', '財務部', 4, 2);DROP TABLE IF EXISTS `sys_dict`;
CREATE TABLE `sys_dict`  (`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'id',`parent_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '父級id',`dict_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '字典名稱',`dict_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '字典代碼',`dict_value` int NULL DEFAULT NULL COMMENT '字典值',`is_type` tinyint(1) NULL DEFAULT NULL COMMENT '是否是字典類型(1 字典類型 2 字典項)',`sort` int NULL DEFAULT NULL COMMENT '排序',`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '備注',`creator_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '創建者',`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`update_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者',`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',PRIMARY KEY (`id`) USING BTREE,INDEX `dict_code`(`dict_code` ASC) USING BTREE,INDEX `dict_name`(`dict_name` ASC) USING BTREE,INDEX `parent_id`(`parent_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典管理' ROW_FORMAT = DYNAMIC;INSERT INTO `sys_dict` VALUES ('12baffa6f2c84d1db39d55d7a0926d27', 'aae7ec823bbc42198480a01f2c60463e', '測試_2', 'CS_2', 2, 2, 2, '666', NULL, '2023-12-05 16:36:47', NULL, NULL);
INSERT INTO `sys_dict` VALUES ('aae7ec823bbc42198480a01f2c60463e', 'ROOT', '測試', 'CS', NULL, 1, NULL, NULL, 'e8b56a16283240478afe42c38065a4da', '2023-10-13 12:02:27', NULL, '2023-10-13 12:02:27');
INSERT INTO `sys_dict` VALUES ('f4e3fb5e1e554cd6b0cd8a292ea94fa8', 'aae7ec823bbc42198480a01f2c60463e', '測試_1', 'CS_1', 1, 2, 1, '666', NULL, '2023-12-05 16:36:38', NULL, NULL);DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log`  (`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`creator_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '創建者',`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`update_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者',`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',`ip` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用戶ip',`title` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '標題,操作方法描述',`type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作類型(其他 登錄 退出 新增 修改 刪除 導入 導出 設置狀態 設置密碼)',`method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作方法',`url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '請求url',`info` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '詳情',`state` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '狀態(操作成功 操作失敗)',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '日志管理' ROW_FORMAT = DYNAMIC;DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu`  (`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜單ID',`parent_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '父菜單ID',`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜單名稱',`sort` int NULL DEFAULT 0 COMMENT '顯示順序',`url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '訪問路徑',`path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '組件名稱',`type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜單類型(M目錄 C菜單 F按鈕)',`state` tinyint(1) NULL DEFAULT 1 COMMENT '菜單狀態(1正常 2停用 3刪除)',`perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '權限標識',`visible` tinyint(1) NULL DEFAULT 0 COMMENT '顯示狀態(0隱藏  1顯示)',`icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '#' COMMENT '菜單圖標',`active_menu` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜單高亮',`is_frame` tinyint(1) NULL DEFAULT NULL COMMENT '是否外鏈(0 否 1 是)',`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '備注',`creator_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '創建者',`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`update_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者',`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '菜單權限表' ROW_FORMAT = DYNAMIC;INSERT INTO `sys_menu_copy1` VALUES ('1', 'ROOT', '系統設置', 12, 'ParentView', 'system', 'M', 1, 'system', 0, 'system', NULL, NULL, NULL, NULL, '2022-09-14 13:54:24', NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('10', '2', '修改', 2, NULL, NULL, 'F', 1, 'system:user:update', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('11', '2', '刪除', 3, NULL, NULL, 'F', 1, 'system:user:delete', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('12', '2', '修改密碼', 4, NULL, NULL, 'F', 1, 'system:user:updatePassword', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('16', '4', '新增', 1, NULL, NULL, 'F', 1, 'system:role:add', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('17', '4', '修改', 2, NULL, NULL, 'F', 1, 'system:role:update', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('18', '4', '刪除', 3, NULL, NULL, 'F', 1, 'system:role:delete', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('19', '5', '新增', 1, NULL, NULL, 'F', 1, 'system:menu:add', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('2', '1', '用戶管理', 1, '/system/user', 'user', 'C', 1, 'system:user:view', 0, 'user', NULL, NULL, NULL, NULL, '2022-09-14 13:54:24', NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('20', '5', '修改', 2, NULL, NULL, 'F', 1, 'system:menu:update', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('21', '5', '刪除', 3, NULL, NULL, 'F', 1, 'system:menu:delete', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('22', '6', '新增', 1, NULL, NULL, 'F', 1, 'system:dict:add', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('23', '6', '修改', 2, NULL, NULL, 'F', 1, 'system:dict:update', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('24', '6', '刪除', 3, NULL, NULL, 'F', 1, 'system:dict:delete', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('25', '7', '修改', 1, NULL, NULL, 'F', 1, 'system:safe:update', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('4', '1', '角色管理', 2, '/system/role', 'role', 'C', 1, 'system:role:view', 0, 'role', NULL, NULL, NULL, NULL, '2022-09-14 13:54:24', NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('5', '1', '菜單管理', 3, '/system/menu', 'menu', 'C', 1, 'system:menu:view', 0, 'menu', NULL, NULL, NULL, NULL, '2022-09-14 13:54:24', NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('6', '1', '字典管理', 4, '/system/dict', 'dict', 'C', 1, 'system:dict:view', 0, 'dict', NULL, NULL, NULL, NULL, '2022-09-14 13:54:24', NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('7', '1', '安全設置', 5, '/system/safe', 'safe', 'C', 1, 'system:safe:view', 0, 'safe', NULL, NULL, '', NULL, '2022-09-14 13:54:24', NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('8', '1', '系統日志', 6, '/system/userLog', 'userLog', 'C', 1, 'system:userLog:view', 0, 'log', NULL, NULL, '', NULL, '2022-09-14 13:54:24', NULL, NULL);
INSERT INTO `sys_menu_copy1` VALUES ('9', '2', '新增', 1, NULL, NULL, 'F', 1, 'system:user:add', 0, '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL);DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role`  (`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色ID',`role_key` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色權限字符',`role_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色名稱',`is_open` tinyint(1) NULL DEFAULT 1 COMMENT '菜單樹是否展開(0折疊 1展開 )',`state` tinyint(1) NULL DEFAULT 0 COMMENT '角色狀態(1正常 2停用 3刪除)',`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '備注',`creator_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '創建者',`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`update_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者',`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色管理' ROW_FORMAT = DYNAMIC;INSERT INTO `sys_role` VALUES ('1', 'CJGLY', '超級管理員', 1, 1, NULL, NULL, '2022-09-14 14:25:07', NULL, '2022-09-14 14:25:07');
INSERT INTO `sys_role` VALUES ('2', 'PTYH', '普通用戶', 1, 1, NULL, NULL, '2022-09-14 14:38:35', NULL, '2022-09-14 14:38:35');DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE `sys_role_menu`  (`role_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色ID',`menu_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜單ID',PRIMARY KEY (`role_id`, `menu_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色菜單關聯' ROW_FORMAT = DYNAMIC;INSERT INTO `sys_role_menu` VALUES ('1', '1');
INSERT INTO `sys_role_menu` VALUES ('1', '10');
INSERT INTO `sys_role_menu` VALUES ('1', '11');
INSERT INTO `sys_role_menu` VALUES ('1', '12');
INSERT INTO `sys_role_menu` VALUES ('1', '16');
INSERT INTO `sys_role_menu` VALUES ('1', '17');
INSERT INTO `sys_role_menu` VALUES ('1', '18');
INSERT INTO `sys_role_menu` VALUES ('1', '19');
INSERT INTO `sys_role_menu` VALUES ('1', '2');
INSERT INTO `sys_role_menu` VALUES ('1', '20');
INSERT INTO `sys_role_menu` VALUES ('1', '21');
INSERT INTO `sys_role_menu` VALUES ('1', '22');
INSERT INTO `sys_role_menu` VALUES ('1', '23');
INSERT INTO `sys_role_menu` VALUES ('1', '24');
INSERT INTO `sys_role_menu` VALUES ('1', '25');
INSERT INTO `sys_role_menu` VALUES ('1', '4');
INSERT INTO `sys_role_menu` VALUES ('1', '5');
INSERT INTO `sys_role_menu` VALUES ('1', '6');
INSERT INTO `sys_role_menu` VALUES ('1', '7');
INSERT INTO `sys_role_menu` VALUES ('1', '8');
INSERT INTO `sys_role_menu` VALUES ('1', '9');DROP TABLE IF EXISTS `sys_safe`;
CREATE TABLE `sys_safe`  (`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`creator_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '創建者',`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`update_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者',`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',`pwd_cycle` int NULL DEFAULT NULL COMMENT '密碼更改周期(90天,60天,30天,0無)',`pwd_login_limit` tinyint(1) NULL DEFAULT NULL COMMENT '密碼登錄限制(0:連續錯3次,鎖定賬號15分鐘。1:連續錯5次,鎖定賬號30分鐘)',`idle_time_setting` tinyint(1) NULL DEFAULT NULL COMMENT '閑置時間設置(0:無。1:空閑30分鐘,系統默認用戶退出)',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '安全設置' ROW_FORMAT = DYNAMIC;INSERT INTO `sys_safe` VALUES ('1', NULL, '2023-04-13 14:23:33', NULL, '2023-04-13 14:23:33', 30, 0, 0);DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用戶編號',`creator_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '創建者',`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`update_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者',`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',`user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用戶名稱',`real_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用戶姓名',`dept_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所屬部門',`role_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所屬角色',`phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手機號碼',`password` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '密碼',`state` tinyint(1) NULL DEFAULT 1 COMMENT '狀態(1 啟用 2 停用)',`picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '頭像',PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `user_name`(`user_name` ASC) USING BTREE,INDEX `dept_id`(`dept_id` ASC) USING BTREE,INDEX `role_id`(`role_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用戶管理' ROW_FORMAT = DYNAMIC;INSERT INTO `sys_user` VALUES ('d2c41c44f5f841c4a6b7902d223f5a6c', NULL, '2023-02-09 17:47:58', NULL, '2023-02-09 17:47:58', 'fuhua', '符華', '4', '1', NULL, '$2a$10$mDOA3K8OivAqs4i2iQJjoOVisn05FZJzSK96xGvWV4Db9FJC5zPSO', 1, NULL);
INSERT INTO `sys_user` VALUES ('e8b56a16283240478afe42c38065a4da', NULL, '2023-02-09 17:47:48', NULL, '2023-02-09 17:47:48', 'admin', '超管', '4', '1', NULL, '$2a$10$mDOA3K8OivAqs4i2iQJjoOVisn05FZJzSK96xGvWV4Db9FJC5zPSO', 1, NULL);

配置文件

項目配置、數據庫連接、redis連接等信息,用yml文件配置,然后再用代碼解析這個配置文件。

yml配置

# 項目配置
server:port: 7070read_timeout: 10write_timeout: 10# MySQL數據庫連接配置
database:dbtype: mysqlhost: 127.0.0.1port: 3306username: rootpassword: rootdatabase: gorm_dbtimeout: 10s# redis連接配置
redis:host: 127.0.0.1port: 6379password: key#1234ip:# 設置IP白名單,多個用;號隔開。也可以用通配符 * 號,如:192.*.*.*auth_host: "*.*.*.*"# 設置允許跨域調用接口的api(這是前端請求IP和端口,不是后端服務器接口)allow_cors_api: "http://127.0.0.1:7070"# 文件上傳路徑
filePath: upload

解析yml

application.go

package configimport ("fmt""github.com/go-redis/redis""github.com/spf13/viper""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger""gorm.io/gorm/schema""strings""time"
)var (Config       *viper.ViperHTTPPort     intReadTimeout  time.DurationWriteTimeout time.DurationDB           *gorm.DBRedisConn    *redis.ClientAuthHost     []stringAllowCorsApi stringFilePath     string
)func InitConfig() (*viper.Viper, error) {viper.SetConfigName("application") // 配置文件的文件名(不帶擴展名)viper.SetConfigType("yaml")        // 配置文件的類型//viper.AddConfigPath("./app.common.config")    // 配置文件所在的路徑,這里假設配置文件在項目根目錄下的 app.common.config 文件夾中viper.AddConfigPath("./")   // 配置文件所在的路徑,項目根目錄下err := viper.ReadInConfig() // 讀取配置文件if err != nil {return nil, err}Config = viper.GetViper()LoadServer()LoadMysql()LoadRedis()LoadIP()return Config, nil
}func LoadServer() {HTTPPort = Config.GetInt("server.port")ReadTimeout = time.Duration(Config.GetInt("server.read_timeout")) * time.SecondWriteTimeout = time.Duration(Config.GetInt("server.write_timeout")) * time.SecondFilePath = Config.GetString("filePath")
}func LoadMysql() {dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s",Config.Get("database.username"),Config.Get("database.password"),Config.Get("database.host"),Config.GetInt("database.port"),Config.Get("database.database"),Config.Get("database.timeout"))db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{// 跳過默認事務:為了確保數據一致性,GORM 會在事務里執行寫入操作(創建、更新、刪除)。如果沒有這方面的要求,您可以在初始化時禁用它,這樣可以獲得60%的性能提升//SkipDefaultTransaction: true,Logger: logger.Default.LogMode(logger.Info), // sql全局日志NamingStrategy: schema.NamingStrategy{//TablePrefix:   "sys_",  // 表名前綴SingularTable: true, // 單數表名//NoLowerCase:   false, // 關閉小寫轉換},})if err != nil {fmt.Println("無法連接到MySQL :", err)}DB = db
}func LoadRedis() {RedisConn = redis.NewClient(&redis.Options{Addr:     fmt.Sprintf("%s:%d", Config.Get("redis.host"), Config.GetInt("redis.port")),Password: Config.GetString("redis.password"),})if err := RedisConn.Ping().Err(); err != nil {fmt.Println("無法連接到redis")}
}func LoadIP() {ips := Config.GetString("ip.auth_host")AuthHost = strings.Split(ips, ";")AllowCorsApi = Config.GetString("ip.allow_cors_api")
}

啟動項目

有了數據庫、解析好了配置文件,我們來試試啟動項目

func main() {app := fiber.New()// 初始化yml配置_, err := config.InitConfig()if err != nil {panic(fmt.Errorf("加載yml配置文件錯誤: %s \n", err))}app.Listen(fmt.Sprintf(":%d", config.HTTPPort))
}

ok,以上就是本篇文章的全部內容了,等我更完這個項目的全部文章,我會放出完整代碼的地址,歡迎大家多多點贊支持下,最后可以關注我不迷路~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215480.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215480.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215480.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nrfutil工具安裝

準備工作,下載相關安裝包 鏈接:https://pan.baidu.com/s/1LWxhibf8LiP_Cq3sw0kALQ 提取碼:2dlc 解壓后,分別安裝以下安裝包 在C盤下創建目錄nordic_tools,并將nrfutil復制到剛創建的目錄下 環境變量path下添加C:\nor…

圖像采集卡 Xtium?2-XGV PX8支持高速 GigE Vision 工業相機

圖像采集卡(Image Capture Card),又稱圖像捕捉卡,是一種可以獲取數字化視頻圖像信息,并將其存儲和播放出來的硬件設備。很多圖像采集卡能在捕捉視頻信息的同時獲得伴音,使音頻部分和視頻部分在數字化時同步…

python elasticsearch 日期聚合

索引以及數據如下 PUT dateagg {"mappings": {"properties": {"charge":{"type": "double"},"types":{"type": "keyword"},"create_date":{"type": "date",&…

裸機單片機適用的軟件架構

單片機通常分為三種工作模式,分別是 1、前后臺順序執行法 2、操作系統 3、時間片輪詢法 1、前后臺順序執行法 利用單片機的中斷進行前后臺切換,然后進行任務順序執行,但其實在…

Spring Boot Web

目錄 一. 概述 二. Spring Boot Web 1.2.1 創建SpringBoot工程(需要聯網) 1.2.2 定義請求處理類 1.2.3 運行測試 1.3 Web分析 三. Http協議 3.1 HTTP-概述 剛才提到HTTP協議是規定了請求和響應數據的格式,那具體的格式是什么呢? 3…

spring結合設計模式之策略模式

策略模式基本概念: 一個接口或者抽象類,里面兩個方法(一個方法匹配類型,一個可替換的邏輯實現方法)不同策略的差異化實現(就是說,不同策略的實現類) 使用策略模式替換判斷,使代碼更加優雅。 …

Swagger快速上手

快速開始&#xff1a; 導入maven包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version> </dependency><dependency><groupId>io.springfox<…

MongoDB在Windows系統和Linux系統中實現自動定時備份

本文主要介紹MongoDB在Windows系統和Linux系統中如何實現自動定時備份。 目錄 MongoDB在Windows系統中實現自動定時備份MongoDB在Linux系統中實現自動定時備份備份步驟備份恢復 MongoDB在Windows系統中實現自動定時備份 要在Windows系統中實現自動定時備份MongoDB數據庫&#…

區塊鏈實驗室(32) - 下載arm64的Prysm

Prysm是Ethereum的共識層。 1. 下載prysm.sh curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod x prysm.sh2. 下載x86版prysm共識客戶端 ./prysm.sh beacon-chain --download-only3.下載arm64版prysm共識客…

刪除當前目錄及其子目錄下的重復文件

言歸正傳&#xff0c;直接看代碼 public class RemoveDuplicateFiles {public static void main(String[] args) throws IOException {String directoryPath "D:\\dir";List<File> allFiles getAllFiles(directoryPath);removeDuplicateFile(allFiles);}pri…

HP108w打印機出現Direct.....無線網,連接不上

本人用手機打印的&#xff0c;安卓 這種情況我也不知道為啥出現&#xff0c;如果出現上面的情況&#xff0c;可以 一直按住&#xff0c;會發藍光的&#xff0c;無線信號樣子的按鈕&#xff0c;持續按20s&#xff0c;松手后觀察自己的wifi列表&#xff0c;本人出現了&#xff…

Linux——web網站服務(一)

一、安裝httpd服務器Apache網站服務 1、準備工作 為了避免發送端口沖突&#xff0c;程序沖突等現象&#xff0c;卸載使用rpm方式安裝的httpd #使用命令檢查是否下載了httpd [rootserver ~]# rpm -qa httpd #如果有則使用 [rootserver ~]# rpm -e httpd --nodeps Apache的配置…

抖音小店經營規則解析:避免被扣分的關鍵因素

抖音小店是一個受歡迎的電商平臺&#xff0c;為創業者提供了良好的銷售和推廣機會。為了確保在抖音小店的運營中不會被扣分或出現其他問題&#xff0c;不若與眾整理了幾個關鍵的規則需要注意和遵守。 1. 產品合規性&#xff1a; 抖音小店要求所有銷售的產品必須合法合規&#x…

欣賞動態之美,不如欣賞C語言實現動態內存管理之美 ! ! !

本篇會加入個人的所謂‘魚式瘋言’ ??????魚式瘋言:??????此瘋言非彼瘋言 而是理解過并總結出來通俗易懂的大白話, 我會盡可能的在每個概念后插入魚式瘋言,幫助大家理解的. 可能說的不是那么嚴謹.但小編初心是能讓更多人能接受我們這個概念 &#xff01;&#xff0…

ubuntu解決問題:E: Unable to locate package manpages-posix-dev

sudo apt-get install manpages-posix-dev 想要在ubuntu里面安裝manpages-posix-dev這個包&#xff0c;發現彈出錯誤 E: Unable to locate package manpages-posix-dev 解決方法如下&#xff1a; 1 查看當前ubuntu的版本 abhishekitsfoss:~$ lsb_release -a No LSB module…

python自動化測試實戰 —— WebDriver API的使用

軟件測試專欄 感興趣可看&#xff1a;軟件測試專欄 自動化測試學習部分源碼 python自動化測試相關知識&#xff1a; 【如何學習Python自動化測試】—— 自動化測試環境搭建 【如何學習python自動化測試】—— 瀏覽器驅動的安裝 以及 如何更…

河南省專業技術人員職稱評審之繼續教育

&#xff08;一&#xff09;職稱評審時會遇到一個關于繼續教育學時是否足夠的問題&#xff0c;作為新人很容易一頭霧水&#xff0c;這里以河南省為例&#xff0c;先在管理系統 http://manage.hnzjgl.gov.cn 注冊&#xff0c;根據自己單位選擇&#xff0c;有些高校雖然在地方而不…

力扣題:數字與字符串間轉換-12.12

力扣題-12.12 [力扣刷題攻略] Re&#xff1a;從零開始的力扣刷題生活 力扣題1&#xff1a;539. 最小時間差 解題思想&#xff1a;將字符串的時間形式換成數字形式的時間&#xff0c;然后計算差值即可&#xff0c;最重要的是最小的值加上一天的時間加入到數組最后&#xff08…

圖文教程:stable-diffusion的基本使用教程 txt2img(多圖)

之前我介紹了SD的安裝過程&#xff0c;那么這篇將介紹怎么使用SD 使用模型 SD安裝好之后&#xff0c;我們只有一個默認的模型。這個模型很難滿足我們的繪圖需求&#xff0c;那么有2種方法。 1是自己訓練一個模型&#xff08;有門檻&#xff09;2是去網站上找一個別人練好的模…

Python3 數據類型轉換 ----20231211

# 有時候,我們需要對數據內置的類型進行轉換,數據類型的轉換,一般情況下你只需要將數據類型作為函數名即可。Python 數據類型轉換可以分為兩種:隱式類型轉換 - 自動完成 顯式類型轉換 - 需要使用類型函數來轉換 隱式類型轉換 在隱式類型轉換中,Python 會自動將一種數據類型…