Gorm初始
docker 生成**
1docker run --name today -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=pick -e MYSQL_USER=user -e MYSQL_PASSWORD=password -p 3307:3306 -d mysql:latest
然后返回一堆字符串就是成功
Gorm初始化
结构体中的字段必须都为大写,这样子在迁移的时候才会形成相应的字段
1234567891011121314151617181920func init() { // gorm的连接 // 以后具体数据用 config获取 dsn := "user:password@tcp(localhost:3307)/pick?charset=utf8mb4&parseTime=True&loc=Local" var err error bb, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ ...
casbin实现
学习了之前的Casbin-model,就可以开始书写casbin的具体实现代码了,非常惭愧,昨天没有搓出博客,太懒了
思路 在我认知范围内,casbin的具体实现思路是
casbin 和 gorm.adapter的依赖下载后
准备 model 和 adapter
通过上面两个东西创建一个enforce
提前加入 role+data1+action
其他需要做的就是 添加项目时 将 user与role绑定
requre user 访问是否有相应的role policy
添加一些其他的有关policy的函数,查看,删除啥的
实践 具体代码的呈现肯定不是直接按思路来的,不过我这里就按思路呈现一下代码。
准备 model 和 adapter
123456789101112131415161718192021222324// 准备modelconst ( casModel = `[request_definition]r = sub, obj, act[policy_definition]p = sub, obj, act[role_definition]g = _, _[p ...
方法的使用
方法的Local-type
今天学习casbin的时候,因为受老板的代码形式的影响,想把最基本的代码封装开来,无意间对方法的使用有了新的理解
本来我以为方法就是函数,随便一个函数,只要在函数名前加个方法类型即可,后来才发现我忽略了一个细节
GPT回答:
在Go语言中,方法的接收者类型必须是在同一个包内定义的命名类型(named type)。这意味着你无法在其他包中定义的类型上直接添加方法。如果你需要为非本地类型添加方法,你可以通过创建一个新的类型来包装它,然后为新类型添加方法。
版本一(最简单)
123456789101112131415161718192021222324func GenCasbin() { e, err := casbin.NewEnforcer("./casbin/model.conf", "./casbin/policy.csv") if err != nil { fmt.Println("NewEnforce err:", err) return } su ...
奖学金系统v4-3
今天做了文件接口迁移,说白了就是复制黏贴
很想记录一下项目的某个大功能的结构
123456789101112131415161718192021222324252627282930313233│ init.go│├─dao│ init.go│ project.go│├─dto│ project.go│├─handler│ project.go│ ├─model│ apply.go│ form.go│ project.go│ review.go│ rule.go│ workflow.go│├─router│ project.go│├─service│ ├─gw│ │ service.go│ ││ └─upload│ upload.go│└─utils utils.go
internal/appproject
dao
写一些数据库的操作和初始化
在这里写的是最底层的代码—基本CRUD的实现
下面有个很巧 ...
Casbin-model
在使用casbin之前,要理解他的model
PERM元模型
单商户模型
多商户模型
PERM元模型
1234567891011[request_definition]r = sub, obj, act[policy_definition]p = sub, obj, act, (eft)[policy_effect]e = some(where (p.eft == allow))[matchers]m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
P [policy_definition] 策略
E [policy_effect] 效果
R [request_definition] 请求
M [matchers] 匹配
sub(subject)=请求实体 obj(object)=访问资源
act(action)=访问方法 (write,r ...
提交规范
常规提交 (conventionalcommits.org)
在git中提交,需要规范操作
feat: 用于新功能或特性的提交
fix: 用于修复 bug 的提交
docs: 用于文档的修改
**chore:**用于对构建过程或者辅助工具的修改
style: 用于代码样式(不影响代码含义的更改,比如空格、格式化等)的提交
refactor: 用于重构代码的提交
test: 用于添加缺失的测试或修正现有的测试的提交
perf: 用于性能优化的提交
build: 用于构建系统或外部依赖的修改
ci: 用于持续集成配置的修改
revert: 用于撤销先前的提交
具体格式:
12345<type>[optional scope]: <description>[optional body][optional footer(s)]
一般来说:
123feat : msg........fix : msg........chore : Update........
奖学金系统v4-2
老板让我手搓游标………………
最后让老板帮我搓,反正我搓不出来……………
游标实现
主要用于分页查询
目前主流的分页模式有两种——基于偏移量的分页和基于游标的分页。
基于偏移量的分页:
1SELECT * FROM metric_type WHERE type_name LIKE %name% ORDERBY id LIMIT offset,limit
客户端需要提供本次请求每页所需的结果数(limit)和偏移量(offset),偏移量通常由服务端通过page和size计算得出。这种分页方式十分简单,只需跳过前面Offset指定的结果数,按需返回Limit个结果数就可以了,它很容易与数据库查询语句对应。
你有100本书,每一页展示10本,那么基于偏移量的分页方式如下。
第一页:Offset:0, Limit:10
第二页:Offset:10, Limit:10
第三页:Offset:20, Limit:10
…
第十页:Offset:90, Limit:10
我们可以写出查询第二页图书的SQL:
1SELECT id, title FROM books ORDER BY id A ...
奖学金系统v4-1
给老板打打小工…………
需求
批量导入项目学生污点
实现要求 :
可以通过excel导入学生的成绩
可以通过学生的Id
可以通过学年-学期-班级导入(未实现)
同时需要实现
导入成绩是批量导入的,且每批学生都要有个batch,可以直接删除某批学生
当学生的id重复时,需要提醒老师是合并还是连接污点
APIfox接口 /project/{id}/user/batch
form-data :
参数名
参数值
说明
file
upload(excel)
上传excel文件
uploadType
id/excel/class
分别对应三种上传形式
year
–
学年
class
–
班级
semester
–
学期
coverType
merge/cover
覆盖/添加
data
[{“staff_id”:”55600”,”taints”:[“a”,”b”]},{“staff_id”:”300”,”taints”:[“a”,”b”]}]
学号+污点切片
Par ...
git
Git 操作
Modified 已修改/未修改
staged 暂存
commited 提交
工作区
暂存区
本地仓库
远程仓库
git bash快捷键
复制–Shift+insert
粘贴–Ctrl+insert
创建仓库1git init
克隆仓库1git clone url
暂存区
添加
123git add . #添加全部git add fileName #添加特定的文件 git add *.type #添加特定的类型文件
删除(未修改)
123git rm --cache fileName #从暂存区中删除git rm --cache -f fileName #强制从暂存区中删除git reset #返回到上一次的暂存状态+也可以撤销提交
删除(已修改)
12git restore --staged fileName #将暂存区的修改重新放回工作区git restore fileName #丢弃工作区的修改
提交至本地仓库12git commit -m "comm ...
redis开篇
Redis是一个key-value的数据库,key一般是String类型,value的类型很多
用途
数据库
缓存系统
消息队列
不要把他看作简单的数据库,而是根据实际应用的需求去使用
对数据库操作redis 有16个数据库,默认使用0号数据库
12# 切换数据库 3 select 3
一些常见的数据库指令
12345# 获取当前数据库的大小DBSIZE # 0 # 若给他输入一个值set name qinDBSIZE # output : 1
123# 查看所有的 key keys * # output name -- 因为上面我set了一个name
1234567# 清空# 清空当前库flushdb#清空所有库flushall
redis 单线程Redis是基于内存操作的,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络的带宽
既然可以使用单线程来实现,就使用了单线程
为什么Redis单线程还这么快
误区1:
>高性能的服务器一定是多线程的
误区2:
> 多线程(CPU上下文会切换)一定比单线程效率高
一般来说速度: CP ...