enumerate.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. // package conf 为配置相关.
  2. package conf
  3. import (
  4. "strings"
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "strconv"
  9. "github.com/beego/beego/v2/server/web"
  10. )
  11. // 登录用户的Session名
  12. const LoginSessionName = "LoginSessionName"
  13. const CaptchaSessionName = "__captcha__"
  14. const RegexpEmail = "^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"
  15. // 允许用户名中出现点号
  16. const RegexpAccount = `^[a-zA-Z0-9][a-zA-Z0-9\.-]{2,50}$`
  17. // PageSize 默认分页条数.
  18. const PageSize = 10
  19. // 用户权限
  20. const (
  21. // 超级管理员.
  22. MemberSuperRole SystemRole = iota
  23. //普通管理员.
  24. MemberAdminRole
  25. //普通用户.
  26. MemberGeneralRole
  27. //只读用户.
  28. MemberReaderRole
  29. )
  30. // 系统角色
  31. type SystemRole int
  32. const (
  33. // 创始人.
  34. BookFounder BookRole = iota
  35. //管理者
  36. BookAdmin
  37. //编辑者.
  38. BookEditor
  39. //观察者
  40. BookObserver
  41. //未指定关系
  42. BookRoleNoSpecific
  43. )
  44. // 项目角色
  45. type BookRole int
  46. const (
  47. LoggerOperate = "operate"
  48. LoggerSystem = "system"
  49. LoggerException = "exception"
  50. LoggerDocument = "document"
  51. )
  52. const (
  53. //本地账户校验
  54. AuthMethodLocal = "local"
  55. //LDAP用户校验
  56. AuthMethodLDAP = "ldap"
  57. )
  58. var (
  59. VERSION string
  60. BUILD_TIME string
  61. GO_VERSION string
  62. )
  63. var (
  64. ConfigurationFile = "./conf/app.conf"
  65. WorkingDirectory = "./"
  66. LogFile = "./runtime/logs"
  67. BaseUrl = ""
  68. AutoLoadDelay = 0
  69. )
  70. // app_key
  71. func GetAppKey() string {
  72. return web.AppConfig.DefaultString("app_key", "mindoc")
  73. }
  74. func GetDatabasePrefix() string {
  75. return web.AppConfig.DefaultString("db_prefix", "md_")
  76. }
  77. // 获取默认头像
  78. func GetDefaultAvatar() string {
  79. return URLForWithCdnImage(web.AppConfig.DefaultString("avatar", "/static/images/headimgurl.jpg"))
  80. }
  81. // 获取阅读令牌长度.
  82. func GetTokenSize() int {
  83. return web.AppConfig.DefaultInt("token_size", 12)
  84. }
  85. // 获取默认文档封面.
  86. func GetDefaultCover() string {
  87. return URLForWithCdnImage(web.AppConfig.DefaultString("cover", "/static/images/book.jpg"))
  88. }
  89. // 获取允许的上传文件的类型.
  90. func GetUploadFileExt() []string {
  91. ext := web.AppConfig.DefaultString("upload_file_ext", "png|jpg|jpeg|gif|txt|doc|docx|pdf|mp4")
  92. temp := strings.Split(ext, "|")
  93. exts := make([]string, len(temp))
  94. i := 0
  95. for _, item := range temp {
  96. if item != "" {
  97. exts[i] = item
  98. i++
  99. }
  100. }
  101. return exts
  102. }
  103. // 获取上传文件允许的最大值
  104. func GetUploadFileSize() int64 {
  105. size := web.AppConfig.DefaultString("upload_file_size", "0")
  106. if strings.HasSuffix(size, "TB") {
  107. if s, e := strconv.ParseInt(size[0:len(size)-2], 10, 64); e == nil {
  108. return s * 1024 * 1024 * 1024 * 1024
  109. }
  110. }
  111. if strings.HasSuffix(size, "GB") {
  112. if s, e := strconv.ParseInt(size[0:len(size)-2], 10, 64); e == nil {
  113. return s * 1024 * 1024 * 1024
  114. }
  115. }
  116. if strings.HasSuffix(size, "MB") {
  117. if s, e := strconv.ParseInt(size[0:len(size)-2], 10, 64); e == nil {
  118. return s * 1024 * 1024
  119. }
  120. }
  121. if strings.HasSuffix(size, "KB") {
  122. if s, e := strconv.ParseInt(size[0:len(size)-2], 10, 64); e == nil {
  123. return s * 1024
  124. }
  125. }
  126. if s, e := strconv.ParseInt(size, 10, 64); e == nil {
  127. return s
  128. }
  129. return 0
  130. }
  131. // 是否启用导出
  132. func GetEnableExport() bool {
  133. return web.AppConfig.DefaultBool("enable_export", true)
  134. }
  135. // 是否启用iframe
  136. func GetEnableIframe() bool {
  137. return web.AppConfig.DefaultBool("enable_iframe", false)
  138. }
  139. // 同一项目导出线程的并发数
  140. func GetExportProcessNum() int {
  141. exportProcessNum := web.AppConfig.DefaultInt("export_process_num", 1)
  142. if exportProcessNum <= 0 || exportProcessNum > 4 {
  143. exportProcessNum = 1
  144. }
  145. return exportProcessNum
  146. }
  147. // 导出项目队列的并发数量
  148. func GetExportLimitNum() int {
  149. exportLimitNum := web.AppConfig.DefaultInt("export_limit_num", 1)
  150. if exportLimitNum < 0 {
  151. exportLimitNum = 1
  152. }
  153. return exportLimitNum
  154. }
  155. // 等待导出队列的长度
  156. func GetExportQueueLimitNum() int {
  157. exportQueueLimitNum := web.AppConfig.DefaultInt("export_queue_limit_num", 10)
  158. if exportQueueLimitNum <= 0 {
  159. exportQueueLimitNum = 100
  160. }
  161. return exportQueueLimitNum
  162. }
  163. // 默认导出项目的缓存目录
  164. func GetExportOutputPath() string {
  165. exportOutputPath := filepath.Join(web.AppConfig.DefaultString("export_output_path", filepath.Join(WorkingDirectory, "cache")), "books")
  166. return exportOutputPath
  167. }
  168. // 判断是否是允许上传的文件类型.
  169. func IsAllowUploadFileExt(ext string) bool {
  170. if strings.HasPrefix(ext, ".") {
  171. ext = string(ext[1:])
  172. }
  173. exts := GetUploadFileExt()
  174. for _, item := range exts {
  175. if item == "*" {
  176. return true
  177. }
  178. if strings.EqualFold(item, ext) {
  179. return true
  180. }
  181. }
  182. return false
  183. }
  184. // 读取配置文件值
  185. func CONF(key string, value ...string) string {
  186. defaultValue := ""
  187. if len(value) > 0 {
  188. defaultValue = value[0]
  189. }
  190. return web.AppConfig.DefaultString(key, defaultValue)
  191. }
  192. // 重写生成URL的方法,加上完整的域名
  193. func URLFor(endpoint string, values ...interface{}) string {
  194. baseUrl := web.AppConfig.DefaultString("baseurl", "")
  195. pathUrl := web.URLFor(endpoint, values...)
  196. if baseUrl == "" {
  197. baseUrl = BaseUrl
  198. }
  199. if strings.HasPrefix(pathUrl, "http://") {
  200. return pathUrl
  201. }
  202. if strings.HasPrefix(pathUrl, "/") && strings.HasSuffix(baseUrl, "/") {
  203. return baseUrl + pathUrl[1:]
  204. }
  205. if !strings.HasPrefix(pathUrl, "/") && !strings.HasSuffix(baseUrl, "/") {
  206. return baseUrl + "/" + pathUrl
  207. }
  208. return baseUrl + web.URLFor(endpoint, values...)
  209. }
  210. func URLForNotHost(endpoint string, values ...interface{}) string {
  211. baseUrl := web.AppConfig.DefaultString("baseurl", "")
  212. pathUrl := web.URLFor(endpoint, values...)
  213. if baseUrl == "" {
  214. baseUrl = "/"
  215. }
  216. if strings.HasPrefix(pathUrl, "http://") {
  217. return pathUrl
  218. }
  219. if strings.HasPrefix(pathUrl, "/") && strings.HasSuffix(baseUrl, "/") {
  220. return baseUrl + pathUrl[1:]
  221. }
  222. if !strings.HasPrefix(pathUrl, "/") && !strings.HasSuffix(baseUrl, "/") {
  223. return baseUrl + "/" + pathUrl
  224. }
  225. return baseUrl + web.URLFor(endpoint, values...)
  226. }
  227. func URLForWithCdnImage(p string) string {
  228. if strings.HasPrefix(p, "http://") || strings.HasPrefix(p, "https://") {
  229. return p
  230. }
  231. cdn := web.AppConfig.DefaultString("cdnimg", "")
  232. //如果没有设置cdn,则使用baseURL拼接
  233. if cdn == "" {
  234. baseUrl := web.AppConfig.DefaultString("baseurl", "/")
  235. if strings.HasPrefix(p, "/") && strings.HasSuffix(baseUrl, "/") {
  236. return baseUrl + p[1:]
  237. }
  238. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(baseUrl, "/") {
  239. return baseUrl + "/" + p
  240. }
  241. return baseUrl + p
  242. }
  243. if strings.HasPrefix(p, "/") && strings.HasSuffix(cdn, "/") {
  244. return cdn + string(p[1:])
  245. }
  246. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(cdn, "/") {
  247. return cdn + "/" + p
  248. }
  249. return cdn + p
  250. }
  251. func URLForWithCdnCss(p string, v ...string) string {
  252. cdn := web.AppConfig.DefaultString("cdncss", "")
  253. if strings.HasPrefix(p, "http://") || strings.HasPrefix(p, "https://") {
  254. return p
  255. }
  256. filePath := WorkingDir(p)
  257. if f, err := os.Stat(filePath); err == nil && !strings.Contains(p, "?") && len(v) > 0 && v[0] == "version" {
  258. p = p + fmt.Sprintf("?v=%s", f.ModTime().Format("20060102150405"))
  259. }
  260. //如果没有设置cdn,则使用baseURL拼接
  261. if cdn == "" {
  262. baseUrl := web.AppConfig.DefaultString("baseurl", "/")
  263. if strings.HasPrefix(p, "/") && strings.HasSuffix(baseUrl, "/") {
  264. return baseUrl + p[1:]
  265. }
  266. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(baseUrl, "/") {
  267. return baseUrl + "/" + p
  268. }
  269. return baseUrl + p
  270. }
  271. if strings.HasPrefix(p, "/") && strings.HasSuffix(cdn, "/") {
  272. return cdn + string(p[1:])
  273. }
  274. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(cdn, "/") {
  275. return cdn + "/" + p
  276. }
  277. return cdn + p
  278. }
  279. func URLForWithCdnJs(p string, v ...string) string {
  280. cdn := web.AppConfig.DefaultString("cdnjs", "")
  281. if strings.HasPrefix(p, "http://") || strings.HasPrefix(p, "https://") {
  282. return p
  283. }
  284. filePath := WorkingDir(p)
  285. if f, err := os.Stat(filePath); err == nil && !strings.Contains(p, "?") && len(v) > 0 && v[0] == "version" {
  286. p = p + fmt.Sprintf("?v=%s", f.ModTime().Format("20060102150405"))
  287. }
  288. //如果没有设置cdn,则使用baseURL拼接
  289. if cdn == "" {
  290. baseUrl := web.AppConfig.DefaultString("baseurl", "/")
  291. if strings.HasPrefix(p, "/") && strings.HasSuffix(baseUrl, "/") {
  292. return baseUrl + p[1:]
  293. }
  294. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(baseUrl, "/") {
  295. return baseUrl + "/" + p
  296. }
  297. return baseUrl + p
  298. }
  299. if strings.HasPrefix(p, "/") && strings.HasSuffix(cdn, "/") {
  300. return cdn + string(p[1:])
  301. }
  302. if !strings.HasPrefix(p, "/") && !strings.HasSuffix(cdn, "/") {
  303. return cdn + "/" + p
  304. }
  305. return cdn + p
  306. }
  307. func WorkingDir(elem ...string) string {
  308. elems := append([]string{WorkingDirectory}, elem...)
  309. return filepath.Join(elems...)
  310. }
  311. // resolveBaseDir 按优先级返回程序的工作根目录:
  312. // 1. 可执行文件所在目录(存在 conf/app.conf 则认为有效)
  313. // 2. 当前工作目录
  314. func resolveBaseDir() string {
  315. // 优先:可执行文件所在目录
  316. if exe, err := os.Executable(); err == nil {
  317. exeDir := filepath.Dir(exe)
  318. // 处理 go run 时的临时路径(路径含 go-build)
  319. if !strings.Contains(exeDir, "go-build") {
  320. if _, err := os.Stat(filepath.Join(exeDir, "conf", "app.conf")); err == nil {
  321. return exeDir
  322. }
  323. }
  324. }
  325. // 兜底:当前工作目录
  326. if cwd, err := filepath.Abs("."); err == nil {
  327. return cwd
  328. }
  329. return "."
  330. }
  331. func init() {
  332. base := resolveBaseDir()
  333. ConfigurationFile = filepath.Join(base, "conf", "app.conf")
  334. WorkingDirectory = base
  335. LogFile = filepath.Join(base, "runtime", "logs")
  336. }