【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(一)搭建项目

news2024/12/23 19:02:42

前言

最近两个月一直在忙公司的项目,上班时间经常高强度写代码,下班了只想躺着,没心思再学习、做自己的项目了。最近这几天轻松一点了,终于有时间 摸鱼了 做自己的事了,所以到现在我总算是搭起来一个比较完整的后台管理系统了。

框架

我的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.21

require (
	github.com/dlclark/regexp2 v1.10.0
	github.com/go-redis/redis v6.15.9+incompatible
	github.com/gofiber/fiber/v2 v2.49.0
	github.com/google/uuid v1.3.1
	github.com/mojocn/base64Captcha v1.3.5
	github.com/mozillazg/go-pinyin v0.20.0
	github.com/pkg/errors v0.9.1
	github.com/robfig/cron v1.2.0
	github.com/spf13/viper v1.16.0
	golang.org/x/crypto v0.14.0
	gorm.io/driver/mysql v1.5.1
	gorm.io/gorm v1.25.3
)

require (
	github.com/andybalholm/brotli v1.0.5 // indirect
	github.com/fsnotify/fsnotify v1.6.0 // indirect
	github.com/go-sql-driver/mysql v1.7.0 // indirect
	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
	github.com/hashicorp/hcl v1.0.0 // indirect
	github.com/jinzhu/inflection v1.0.0 // indirect
	github.com/jinzhu/now v1.1.5 // indirect
	github.com/klauspost/compress v1.16.7 // indirect
	github.com/magiconair/properties v1.8.7 // indirect
	github.com/mattn/go-colorable v0.1.13 // indirect
	github.com/mattn/go-isatty v0.0.19 // indirect
	github.com/mattn/go-runewidth v0.0.15 // indirect
	github.com/mitchellh/mapstructure v1.5.0 // indirect
	github.com/onsi/ginkgo v1.16.5 // indirect
	github.com/onsi/gomega v1.30.0 // indirect
	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
	github.com/rivo/uniseg v0.4.4 // indirect
	github.com/spf13/afero v1.9.5 // indirect
	github.com/spf13/cast v1.5.1 // indirect
	github.com/spf13/jwalterweatherman v1.1.0 // indirect
	github.com/spf13/pflag v1.0.5 // indirect
	github.com/subosito/gotenv v1.4.2 // indirect
	github.com/valyala/bytebufferpool v1.0.0 // indirect
	github.com/valyala/fasthttp v1.48.0 // indirect
	github.com/valyala/tcplisten v1.0.0 // indirect
	golang.org/x/image v0.11.0 // indirect
	golang.org/x/sys v0.13.0 // indirect
	golang.org/x/text v0.13.0 // indirect
	gopkg.in/ini.v1 v1.67.0 // indirect
	gopkg.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: 7070
  read_timeout: 10
  write_timeout: 10

# MySQL数据库连接配置
database:
  dbtype: mysql
  host: 127.0.0.1
  port: 3306
  username: root
  password: root
  database: gorm_db
  timeout: 10s

# redis连接配置
redis:
  host: 127.0.0.1
  port: 6379
  password: key#1234

ip:
  # 设置IP白名单,多个用;号隔开。也可以用通配符 * 号,如:192.*.*.*
  auth_host: "*.*.*.*"
  # 设置允许跨域调用接口的api(这是前端请求IP和端口,不是后端服务器接口)
  allow_cors_api: "http://127.0.0.1:7070"

# 文件上传路径
filePath: upload

解析yml

application.go

package config

import (
	"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.Viper
	HTTPPort     int
	ReadTimeout  time.Duration
	WriteTimeout time.Duration
	DB           *gorm.DB
	RedisConn    *redis.Client
	AuthHost     []string
	AllowCorsApi string
	FilePath     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.Second
	WriteTimeout = time.Duration(Config.GetInt("server.write_timeout")) * time.Second
	FilePath = 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.coloradmin.cn/o/1303826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

血的教训,BigDecimal踩过的坑

很多人都用过Java的BigDecimal类型,但是很多人都用错了。如果使用不当,可能会造成非常致命的线上问题,因为这涉及到金额等数据的计算精度。 首先说一下,一般对于不需要特别高精度的计算,我们使用double或float类型就可…

微服务黑马头条(简略笔记)

Linux中nacos的拉取安装 拉取naocs镜像:docker pull nacos/nacos-server:1.2.0创建容器:docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8848 nacos/nacos-server:1.2.0访问地址:http://192.168.200.130:8848/n…

Python常见面试知识总结(一):迭代器、拷贝、线程及底层结构

前言: Hello大家好,我是Dream。 今天来总结一下Python和C语言中常见的面试知识,欢迎大家一起前来探讨学习~ 【一】Python中迭代器的概念? 可迭代对象是迭代器、生成器和装饰器的基础。简单来说,可以使用for来循环遍历…

vue自定义指令及常用的自定义指令封装

vue2 自定义指令 官网链接https://v2.cn.vuejs.org/v2/guide/custom-directive.html 指令注册 这里是一个 Vue2 的指令合集,详细的指令移步下面具体的指令文章,现在我们在这里要介绍如何在项目中统一管理和使用这些指令。 注册指令 单文件引入注册 …

Linux上进行Nacos安装

Nacos安装指南 仅供参考,若有错误,欢迎批评指正! 后期会继续上传docker安装nacos的过程! 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面,提供有下载链接,可以下载编译好…

性能测试基础

性能测试分类 客户端性能:测试APP自身的性能,例如CPU、内存消耗;web页面元素渲染速度 服务端性能:测试服务端项目程序的支持的并发、处理能力、响应时间等,主要通过接口来做性能测试 性能测试指标 并发 同时向服务…

企业举办年会,可以邀请哪些媒体进行宣传?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 年关将至,筹办年会成为每个企业必做的事情,也是大家非常期待的年终大会,在我们策划年会时候,也要抓住最后宣传的机会。那么企业举办年会时…

【信息安全】-ISO/IEC 27001-2022(翻译)

文章目录 范围规范性引用文件3 术语和定义4 组织环境(P)4.1 理解组织及其环境4.2 理解相关方的需求和期望组织应确定:a) 信息安全管理体系相关方;b) 这些相关方的相关要求;c) 哪些要求可以通过信息安全管理体系得到解决。注:相关方的要求可包括法律、法规…

MyBatisPlus简介

1 简介 MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 2、特性 无侵入 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑…

《IT圈里的“鄙视链”:看不起谁又被谁看不起?》

文章目录 每日一句正能量前言一、编程语言篇二、工具篇三、操作系统篇四、硬件篇五、职场篇后记 每日一句正能量 人的结构就是相互支撑,众人的事业需要每个人的参与。 前言 每个领域都存在着错综复杂的鄙视链,这一点在IT 领域更为突出。从编程语言、工具&#xff0…

SD生成的图像不清晰,如何解决

文生图 选择高清修复: 几点注意 重绘幅度:这里不用太高,他会根据你生成的低分辨率图像,生成高分辨率的图像,可以选择0.3~05之间,给AI跟多想象力空间可以选择0.5 ~ 0.7。太低边缘模糊,太高了可能…

Layui深入

1、代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>注册页面</title> <style> .container { max-width: 600px; margin: 0 auto; padding: 20px; …

14-Kafka-Day02

第 4 章 Kafka Broker 4.1 Kafka Broker 工作流程 4.1.1 Zookeeper 存储的 Kafka 信息 &#xff08;1&#xff09;启动 Zookeeper 客户端。 bin/zkCli.sh 因为你在配置kafka的时候指定了它的名字。 &#xff08;2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: …

InsCode实践分享:如何实现自动化代码审查和质量控制?

文章目录 文章目录 概要 整体架构流程 InsCode的解释 技术展示 小结 概要 InsCode是一款面向中小型企业的代码审查和自动化质量控制工具。本文将分享如何使用InsCode来实现自动化代码审查和质量控制&#xff0c;帮助企业在代码开发和维护过程中降低风险&#xff0c;提高效率和…

Java最全面试题专题---2、Java集合容器(1)

集合容器概述 什么是集合 **集合框架&#xff1a;**用于存储数据的容器。 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。 任何集合框架都包含三大块内容&#xff1a;对外的接口、接口的实现和对集合运算的算法。 **接口&#xff1a;**表示集合的抽象数据类…

基于springboot实现的人力资源管理系统

一、系统架构 前端&#xff1a;html | js | css | jquery | bootstrap 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.7 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 员工管理 04. 奖惩管理 05. 合同管理 06. 薪酬管理 07.…

Python从入门到精通五:Python函数

函数介绍 学习目标&#xff1a; 快速体验函数的使用了解函数的作用 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段。 我们使用过的&#xff1a;input()、print()、str()、int()等都是Python的内置函数。 为什么要学习、使用函…

WPS没保存关闭了怎么恢复数据?3个方法,完成数据恢复!

“我今天在使用WPS时&#xff0c;突然有点急事出去了一趟&#xff0c;但是我忘记保存文档了&#xff0c;回来之后发现电脑自动关机了&#xff0c;我的文档也没了&#xff01;这可怎么办呢&#xff1f;有什么办法可以找回这些数据吗&#xff1f;” 在快节奏的工作中&#xff0c;…

软件科技成果鉴定测试有什么好处?注意事项有哪些?

软件科技成果鉴定测试是指对软件科技成果进行检测和评估的过程。通过这个测试&#xff0c;可以评估软件科技成果的技术水平、功能性能以及可靠性&#xff0c;并为相关单位和个人提供科学的评价依据。    一、进行软件科技成果鉴定测试有以下好处&#xff1a;   1、客观评价…

专业的内外网文件摆渡系统,如何帮助企业提升协作效率?

伴随着全球数字化转型的持续深入&#xff0c;数字经济的蓬勃发展&#xff0c;数据资产已成为非常重要的生产要素。近年来&#xff0c;全球数据泄密事件频发&#xff0c;数据泄密事件的平均成本逐年攀升。考虑到业务安全需要&#xff0c;绝大多数企业会考虑网络隔离&#xff0c;…