# actionDoc **Repository Path**: adxb/action-doc ## Basic Information - **Project Name**: actionDoc - **Description**: 本项目为程序员集成各种在线开源工具如:文档工具:mardown、block-style Editor ;画图工具 drawio 、思维导图;以及webSsh,会一直持续集成各种三方在线工具,欢迎一起构建此项目 - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-10-13 - **Last Updated**: 2023-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 项目愿景 本项目为程序员集成各种在线开源工具如:文档工具:mardown、block-style Editor ;画图工具 drawio 、思维导图;以及webSsh windows 打包比较麻烦直接提供一个windows 编译后的包解压就可以使用 默认账号密码 admin 123456 链接: https://pan.baidu.com/s/1clB41Tc64AdXl80cLrwHxA?pwd=wix9 提取码: wix9 ![image.png](https://s2.loli.net/2022/10/13/XxhTawDsyR3lr2g.png) ## 文档工具说明 ### 百度网盘配置 #### 百度app扫码授权 ![image.png](https://s2.loli.net/2022/10/07/8KOFtlUf1hqQ4rC.png) 百度app 授权完成后即可关闭弹框后台会自动完成token获取 #### 百度网盘路径设置 ![image.png](https://s2.loli.net/2022/10/07/WpZvwugnjiIOo9d.png) > 网盘目录太多可以设置一个专门的目录存放文档 ### 目录操作 ![image.png](https://s2.loli.net/2022/10/07/et4hQxAjUMNiuLp.png) > 所有操作都是通过更多按钮进行 > > 刷新目录:手动更新当前目录的文件状态【没有通过数据库记录而是直接查询百度网盘】;当然在当前页面的操作会自动刷新 > > 新建文件夹:此功能只能用于目录操作 > > 新建文件 : 支持markdown drawio 脑图 后续会支持 表格 block-style editort > > 上传本地文件: 支持上传到百度网盘后再打开操作 ### 文件操作 ![image.png](https://s2.loli.net/2022/10/07/IzVvsto15fUQJhN.png) > 打开:支持打开markdown drawio 脑图 > > 刷新目录 :同上 > > 重命名:允许修改名称要求先关闭打开的文件 > > 删除: 允许删除操作要求先关闭打开的文件 ### 下载 ![image.png](https://s2.loli.net/2022/10/07/oyV9c2kCiuRbqx6.png) > 允许下载当前打开的文件到磁盘 ### 保存 ![image.png](https://s2.loli.net/2022/10/07/MkAz2UZyGTNSv9E.png) > 暂时不支持自动保存所以需要手动保存文件到百度网盘 ## ssh说明 ![image.png](https://s2.loli.net/2022/10/07/56flnspEY4AUH9L.png) ![image.png](https://s2.loli.net/2022/10/07/56flnspEY4AUH9L.png) > sz 或rz 也可以打开文件管理弹框 ## 未完成功能 文档的自动保存 基于表结构存储文件信息,不直接查询百度网盘,方便后续集成其他云盘 开发block-style editor 页面布局 颜色适配 焦点设置 快捷键 # 后端技术备忘 > java spring技术体系对业务开发非常友好,golang 语言具备简单高效等优势,但是在业务开发方法和java 开发不是一个层次, > > 个人分析只要有三个原因 > > 1 太关注简洁、透明 没有在语言层面提供threadLocal 概念 > > 2 反射功能较弱 没有提供动态代理机制 > > 3 基于以上两点原因,很难实现类似spring 的声明式事务控制【业务开发极为重要】 > > 经过调研go生态中的 goframe go-spring ioc-golang dig inject等众多优秀框架发现他们开发操作要么复杂 要么太重 要么设计不是很友好,严重依赖代码生成 > > 该项目中实现了一个ioc 容器 支持多种bean注册 与获取,也支持单例与多例,使用比较友好;同样基于泛型机制实现了基于责任链的方法增加功能 ## IOC ### 注册与获取 > 1 通过reflect.TypeOf方式注册【不推荐】 ``` global.Ioc.Register(reflect.TypeOf(service.StoreAppAuthService{}), nil) ``` ``` v := Ioc.GetByType(reflect.TypeOf(service.StoreAppAuthService{})) ``` > 2 通过空实例指针方式注册【推荐】 ``` global.Ioc.Register((*manager.PanManager)(nil), nil) // 传空实例指针注册 ``` ```go vv := Ioc.GetByType((*manager.PanManager)(nil))【推荐获取方式】 ``` > 3 通过无参函数注册【推荐】 ``` global.Ioc.RegisterFunc(func() *service.StoreAppService { // 通过无参函数注册,可以返回多个指针类型 return &service.StoreAppService{} }) ``` ```go vv := Ioc.GetByType((**service.StoreAppService)(nil)) ``` > 4 通过指针实例注册 ``` // service.NewUserService() 返回 *UserService Ioc.Register(service.NewUserService(), &RegisterConfig{ Name: "myuser", Scope: Prototype, }) ``` ``` 根据别名获取 v = Ioc.GetByName("myuser") // 通过RegisterConfig 设置别名获取 v = Ioc.GetByName("ioc/service.OrderService") // 未设置即默认为全包名 ``` ### 配置说明 ```json &RegisterConfig{ Name: "myuser", Scope: Prototype, } type PanManager struct { storeAppService *service.StoreAppService `inject:"-"` Order BaseService `inject:"ioc/service.OrderService"` } ``` > Name 表示注册到ioc容器的别名 不设置即默认为全包名路径 > > Scope : singleton 单例[默认] prototype 多例模式 > > 通过指针实例注册场景在单例模式下始终返回注册时的指针实例 多例模式下始终会克隆一份返回 ### tag **inject** > **-** 表示根据属性的类型从容器中获取【不能是属性的接口】 > > `inject:"ioc/service.OrderService"` 表示根据别名从容器获取【属性类型可以是具体的实现结构体指针类型 也可以是他的接口】 ### 泛型方式获取 ``` global.GetBeanByType[*manager.PanManager]((*manager.PanManager)(nil)) ``` ``` global.GetBeanByName[*manager.PanManager]("panManager") ``` ## 增强方法使用 ```go func (s *StoreAppService) GetStoreApp(app domain.StoreApp) *domain.StoreApp { return global.Call1[*domain.StoreApp]( global.Enhance{ MethodPath: "sever/service.StoreAppService.GetStoreApp",// 方法签名,主要用于通过表达式方式提供aop Interceptors: []string{"CalMethodRunTimes"},// 私有拦截器需要提前在ioc注册 Transaction: &global.Transaction{ // 提供申明式事务 Enable: true, }, }, func() *domain.StoreApp {// 具体的业务代码 storeApp := new(domain.StoreApp) utils.NewDbUtils().Get(func(session *xorm.Session) { session.Where("1==1 ") session.And(" app_type=? ", app.AppType) session.And(" user_id=? ", app.UserId) session.Limit(1).OrderBy("id desc") }, storeApp) return storeApp }) } ``` 默认提供了四个方法代码几个返回值 来做代码增强 > Call0 无返回值 > > Call1一个返回值 > > Call2 两个返回值 > > Call3 三个返回值 ``` 把拦截器注册到ioc中,方便使用时通过name获取【chain.AddFromIoc】 global.Ioc.Register(interceptor.NewCalMethodRunTimes(), &global.RegisterConfig{ Name: "CalMethodRunTimes", })