浏览代码

pref: 优化cherry-markdown toc样式解决 convertImageToDataUri not func BUG (#966)

* feat: 首页项目拖拽排序功能

* feat: 增加首页项目拖拽排序增加只能管理员进行, 排序失败元素回到原本位置

* perf: 新建文章以后直接进入到编辑文章页面

* perf: 优化文档打开时或刷新时样式闪动问题

* perf: 优化表格样式

* feat: 支持上传视频功能

* feat: 视频样式调整

* feat: 直接粘贴视频上传功能

* perf: 优化markdown目录显示

* feat: 项目配置新增是否开启打印功能

* perf: 优化模型自动更新表字段

* perf: 创建项目时增加选择编辑器功能

* perf: 优化cherry-markdown 菜单栏

* perf: 优化项目阅读界面, 新增打开搜索面板快捷键(Ctrl + f), esc恢复到目录快捷键功能

* perf: 优化项目搜索

* perf: 文章TOC样式调整

* feat: 配置管理中增加本地化切换

* feat: 配置管理中增加本地化切换

* fix: 调整页面内copyright的链接为: https://mindoc.com.cn/域名下

* fix: 创建README.md资源

* fix: 创建README.md资源

* fix: README更新

* fix: README更新

* fix: README 地址修改

* fix: 调整cherryMarkdown toc样式 兼容打印样式

fix: 修复 convertImageToDataUri not func

* fix: cherry-markdown 上传附件和样式调整
zhanzhenping 1 年之前
父节点
当前提交
ab314fbf18

+ 22 - 11
README.md

@@ -61,6 +61,11 @@ go build -ldflags "-w" -o mindoc main.go
 bee run
 ```
 
+## 旧版本运行 可更新部分数据库配置
+```base
+./mindoc update
+```
+
 MinDoc 如果使用MySQL储存数据,则编码必须是`utf8mb4_general_ci`。请在安装前,把数据库配置填充到项目目录下的 `conf/app.conf` 中。
 
 如果使用 `SQLite` 数据库,则直接在配置文件中配置数据库路径即可.
@@ -189,39 +194,44 @@ docker run -p 8181:8181 --name mindoc -e DB_ADAPTER=mysql -e MYSQL_PORT_3306_TCP
 
 **创建项目**
 
-![创建项目](https://raw.githubusercontent.com/lifei6671/mindoc/master/uploads/20170501204438.png)
+![创建项目](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/create.png?raw=true)
 
 **项目列表**
 
-![项目列表](https://raw.githubusercontent.com/lifei6671/mindoc/master/uploads/20170501203542.png)
+![项目列表](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/project_list.png?raw=true)
 
 **项目概述**
 
-![项目概述](https://raw.githubusercontent.com/lifei6671/mindoc/master/uploads/20170501203619.png)
+![项目概述](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/intro.png?raw=true)
 
 **项目成员**
 
-![项目成员](https://raw.githubusercontent.com/lifei6671/mindoc/master/uploads/20170501203637.png)
+![项目成员](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/member.png?raw=true)
 
 **项目设置**
 
-![项目设置](https://raw.githubusercontent.com/lifei6671/mindoc/master/uploads/20170501203656.png)
+![项目设置](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/project_setting.png?raw=true)
 
 **基于Editor.md开发的Markdown编辑器**
 
-![基于Editor.md开发的Markdown编辑器](https://raw.githubusercontent.com/lifei6671/mindoc/master/uploads/20170501203854.png)
+![基于Editor.md开发的Markdown编辑器](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/editor_md.png?raw=true)
 
 **基于wangEditor开发的富文本编辑器**
 
-![基于wangEditor开发的富文本编辑器](https://raw.githubusercontent.com/lifei6671/mindoc/master/uploads/20170501204651.png)
+![基于wangEditor开发的富文本编辑器](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/wang_editor.png?raw=true)
+
+
+**基于cherryMarkdown开发的编辑器**
+
+![基于cherry-markdown开发的编辑器](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/cheery-markdown.png?raw=true)
 
 **项目预览**
 
-![项目预览](https://raw.githubusercontent.com/lifei6671/mindoc/master/uploads/20170501204609.png)
+![项目预览](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/preview.png?raw=true)
 
 **超级管理员后台**
 
-![超级管理员后台](https://raw.githubusercontent.com/lifei6671/mindoc/master/uploads/20170501204710.png)
+![超级管理员后台](https://github.com/mindoc-org/mindoc/blob/master/uploads/docs/admin.png?raw=true)
 
 
 # 使用的技术(TODO: 最新技术栈整理中,使用的第三方库升级中)
@@ -229,6 +239,7 @@ docker run -p 8181:8181 --name mindoc -e DB_ADAPTER=mysql -e MYSQL_PORT_3306_TCP
 - [Beego](https://github.com/beego/beego) ~~1.10.0~~
 - MySQL 5.6
 - [editor.md](https://github.com/pandao/editor.md) Markdown 编辑器
+- [cherry-markdown](https://github.com/Tencent/cherry-markdown) Cherry Markdown Writer
 - [Bootstrap](https://github.com/twbs/bootstrap) 3.2
 - [jQuery](https://github.com/jquery/jquery) 库
 - [WebUploader](https://github.com/fex-team/webuploader) 文件上传框架
@@ -250,13 +261,13 @@ docker run -p 8181:8181 --name mindoc -e DB_ADAPTER=mysql -e MYSQL_PORT_3306_TCP
 
 # 主要功能
 
-- 项目管理,可以对项目进行编辑更改,成员添加等。
+- 项目管理,可以对项目进行编辑更改,成员添加, 项目排序等。
 - 文档管理,添加和删除文档等。
 - 评论管理,可以管理文档评论和自己发布的评论。
 - 用户管理,添加和禁用用户,个人资料更改等。
 - 用户权限管理 , 实现用户角色的变更。
 - 项目加密,可以设置项目公开状态,私有项目需要通过Token访问。
-- 站点配置,可开启匿名访问、验证码等。
+- 站点配置,多语言切换, 可开启匿名访问、验证码等。
 
 # 参与开发
 

+ 3 - 0
commands/command.go

@@ -234,6 +234,9 @@ func RegisterCommand() {
 	} else if len(os.Args) >= 2 && os.Args[1] == "version" {
 		CheckUpdate()
 		os.Exit(0)
+	} else if len(os.Args) >= 2 && os.Args[1] == "update" {
+		Update()
+		os.Exit(0)
 	}
 
 }

+ 23 - 1
commands/update.go

@@ -3,15 +3,17 @@ package commands
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/mindoc-org/mindoc/models"
 	"io/ioutil"
 	"net/http"
 	"os"
 
+	"github.com/beego/beego/v2/client/orm"
 	"github.com/beego/beego/v2/core/logs"
 	"github.com/mindoc-org/mindoc/conf"
 )
 
-//检查最新版本.
+// 检查最新版本.
 func CheckUpdate() {
 
 	fmt.Println("MinDoc current version => ", conf.VERSION)
@@ -47,3 +49,23 @@ func CheckUpdate() {
 	os.Exit(0)
 
 }
+
+func Update() {
+	fmt.Println("Update...")
+	RegisterDataBase()
+	RegisterModel()
+	err := orm.RunSyncdb("default", false, true)
+	if err == nil {
+		UpdateInitialization()
+	} else {
+		panic(err.Error())
+	}
+	fmt.Println("Update Successfully!")
+	os.Exit(0)
+}
+func UpdateInitialization() {
+	err := models.NewOption().Update()
+	if err != nil {
+		panic(err.Error())
+	}
+}

+ 3 - 0
conf/lang/en-us.ini

@@ -502,6 +502,9 @@ edit_user = Edit User
 pwd_tips = Please leave it blank if you do not change the password, only local users can change the password
 
 [mgr]
+language = Default Language
+zh_cn = 简体中文
+en_us = English
 dashboard_menu = Dashboard
 user_menu = User
 team_menu = Team

+ 3 - 0
conf/lang/zh-cn.ini

@@ -502,6 +502,9 @@ edit_user = 编辑用户
 pwd_tips = 不修改密码请留空,只支持本地用户修改密码
 
 [mgr]
+language = 默认语言
+zh_cn = 简体中文
+en_us = English
 dashboard_menu = 仪表盘
 user_menu = 用户管理
 team_menu = 团队管理

+ 8 - 4
controllers/BaseController.go

@@ -83,7 +83,7 @@ func (c *BaseController) Prepare() {
 	c.SetLang()
 }
 
-//判断用户是否登录.
+// 判断用户是否登录.
 func (c *BaseController) isUserLoggedIn() bool {
 	return c.Member != nil && c.Member.MemberId > 0
 }
@@ -127,7 +127,7 @@ func (c *BaseController) JsonResult(errCode int, errMsg string, data ...interfac
 	c.StopRun()
 }
 
-//如果错误不为空,则响应错误信息到浏览器.
+// 如果错误不为空,则响应错误信息到浏览器.
 func (c *BaseController) CheckJsonError(code int, err error) {
 
 	if err == nil {
@@ -182,7 +182,7 @@ func (c *BaseController) BaseUrl() string {
 	return baseUrl
 }
 
-//显示错误信息页面.
+// 显示错误信息页面.
 func (c *BaseController) ShowErrorPage(errCode int, errMsg string) {
 	c.TplName = "errors/error.tpl"
 
@@ -217,7 +217,11 @@ func (c *BaseController) SetLang() {
 	}
 	if len(lang) == 0 ||
 		!i18n.IsExist(lang) {
-		lang, _ = web.AppConfig.String("default_lang")
+		if c.Data["language"] != nil {
+			lang = c.Data["language"].(string)
+		} else {
+			lang, _ = web.AppConfig.String("default_lang")
+		}
 	}
 	if !hasCookie {
 		c.Ctx.SetCookie("lang", lang, 1<<31-1, "/")

+ 23 - 23
controllers/ManagerController.go

@@ -133,7 +133,7 @@ func (c *ManagerController) CreateMember() {
 	c.JsonResult(0, "ok", member)
 }
 
-//更新用户状态.
+// 更新用户状态.
 func (c *ManagerController) UpdateMemberStatus() {
 	c.Prepare()
 
@@ -166,7 +166,7 @@ func (c *ManagerController) UpdateMemberStatus() {
 	c.JsonResult(0, "ok", member)
 }
 
-//变更用户权限.
+// 变更用户权限.
 func (c *ManagerController) ChangeMemberRole() {
 	c.Prepare()
 
@@ -199,7 +199,7 @@ func (c *ManagerController) ChangeMemberRole() {
 	c.JsonResult(0, "ok", member)
 }
 
-//编辑用户信息.
+// 编辑用户信息.
 func (c *ManagerController) EditMember() {
 	c.Prepare()
 	c.TplName = "manager/edit_users.tpl"
@@ -251,7 +251,7 @@ func (c *ManagerController) EditMember() {
 	c.Data["Model"] = member
 }
 
-//删除一个用户,并将该用户的所有信息转移到超级管理员上.
+// 删除一个用户,并将该用户的所有信息转移到超级管理员上.
 func (c *ManagerController) DeleteMember() {
 	c.Prepare()
 	member_id, _ := c.GetInt("id", 0)
@@ -283,7 +283,7 @@ func (c *ManagerController) DeleteMember() {
 	c.JsonResult(0, "ok")
 }
 
-//项目列表.
+// 项目列表.
 func (c *ManagerController) Books() {
 	c.Prepare()
 	c.TplName = "manager/books.tpl"
@@ -313,7 +313,7 @@ func (c *ManagerController) Books() {
 	c.Data["Lists"] = books
 }
 
-//编辑项目.
+// 编辑项目.
 func (c *ManagerController) EditBook() {
 	c.Prepare()
 
@@ -460,7 +460,7 @@ func (c *ManagerController) CreateToken() {
 	}
 }
 
-//项目设置.
+// 项目设置.
 func (c *ManagerController) Setting() {
 	c.Prepare()
 	c.TplName = "manager/setting.tpl"
@@ -541,7 +541,7 @@ func (c *ManagerController) Comments() {
 
 }
 
-//DeleteComment 标记评论为已删除
+// DeleteComment 标记评论为已删除
 func (c *ManagerController) DeleteComment() {
 	c.Prepare()
 
@@ -565,7 +565,7 @@ func (c *ManagerController) DeleteComment() {
 	c.JsonResult(0, "ok", comment)
 }
 
-//设置项目私有状态.
+// 设置项目私有状态.
 func (c *ManagerController) PrivatelyOwned() {
 	c.Prepare()
 	status := c.GetString("status")
@@ -603,7 +603,7 @@ func (c *ManagerController) PrivatelyOwned() {
 	c.JsonResult(0, "ok")
 }
 
-//附件列表.
+// 附件列表.
 func (c *ManagerController) AttachList() {
 	c.Prepare()
 	c.TplName = "manager/attach_list.tpl"
@@ -634,7 +634,7 @@ func (c *ManagerController) AttachList() {
 	c.Data["Lists"] = attachList
 }
 
-//附件清理.
+// 附件清理.
 func (c *ManagerController) AttachClean() {
 	c.Prepare()
 
@@ -669,7 +669,7 @@ func (c *ManagerController) AttachClean() {
 	c.JsonResult(0, "ok")
 }
 
-//附件详情.
+// 附件详情.
 func (c *ManagerController) AttachDetailed() {
 	c.Prepare()
 	c.TplName = "manager/attach_detailed.tpl"
@@ -698,7 +698,7 @@ func (c *ManagerController) AttachDetailed() {
 	c.Data["Model"] = attach
 }
 
-//删除附件.
+// 删除附件.
 func (c *ManagerController) AttachDelete() {
 	c.Prepare()
 	attachId, _ := c.GetInt("attach_id")
@@ -721,7 +721,7 @@ func (c *ManagerController) AttachDelete() {
 	c.JsonResult(0, "ok")
 }
 
-//标签列表
+// 标签列表
 func (c *ManagerController) LabelList() {
 	c.Prepare()
 	c.TplName = "manager/label_list.tpl"
@@ -743,7 +743,7 @@ func (c *ManagerController) LabelList() {
 	c.Data["Lists"] = labels
 }
 
-//删除标签
+// 删除标签
 func (c *ManagerController) LabelDelete() {
 	labelId, err := strconv.Atoi(c.Ctx.Input.Param(":id"))
 	if err != nil {
@@ -936,7 +936,7 @@ func (c *ManagerController) TeamMemberList() {
 	}
 }
 
-//搜索团队用户.
+// 搜索团队用户.
 func (c *ManagerController) TeamSearchMember() {
 	c.Prepare()
 
@@ -1015,7 +1015,7 @@ func (c *ManagerController) TeamChangeMemberRole() {
 
 }
 
-//团队项目列表.
+// 团队项目列表.
 func (c *ManagerController) TeamBookList() {
 	c.Prepare()
 	c.TplName = "manager/team_book_list.tpl"
@@ -1062,7 +1062,7 @@ func (c *ManagerController) TeamBookList() {
 	}
 }
 
-//给团队增加项目.
+// 给团队增加项目.
 func (c *ManagerController) TeamBookAdd() {
 	c.Prepare()
 
@@ -1086,7 +1086,7 @@ func (c *ManagerController) TeamBookAdd() {
 	}
 }
 
-//搜索未参与的项目.
+// 搜索未参与的项目.
 func (c *ManagerController) TeamSearchBook() {
 	c.Prepare()
 
@@ -1106,7 +1106,7 @@ func (c *ManagerController) TeamSearchBook() {
 
 }
 
-//删除团队项目.
+// 删除团队项目.
 func (c *ManagerController) TeamBookDelete() {
 	c.Prepare()
 	teamRelationshipId, _ := c.GetInt("teamRelId")
@@ -1123,7 +1123,7 @@ func (c *ManagerController) TeamBookDelete() {
 	c.JsonResult(0, "OK")
 }
 
-//项目空间列表.
+// 项目空间列表.
 func (c *ManagerController) Itemsets() {
 	c.Prepare()
 	c.TplName = "manager/itemsets.tpl"
@@ -1151,7 +1151,7 @@ func (c *ManagerController) Itemsets() {
 	c.Data["Lists"] = items
 }
 
-//编辑或添加项目空间.
+// 编辑或添加项目空间.
 func (c *ManagerController) ItemsetsEdit() {
 	c.Prepare()
 	itemId, _ := c.GetInt("itemId")
@@ -1186,7 +1186,7 @@ func (c *ManagerController) ItemsetsEdit() {
 	c.JsonResult(0, "OK")
 }
 
-//删除项目空间.
+// 删除项目空间.
 func (c *ManagerController) ItemsetsDelete() {
 	c.Prepare()
 	itemId, _ := c.GetInt("itemId")

+ 25 - 0
models/Options.go

@@ -164,5 +164,30 @@ func (m *Option) Init() error {
 		}
 	}
 
+	if !o.QueryTable(m.TableNameWithPrefix()).Filter("option_name", "language").Exist() {
+		option := NewOption()
+		option.OptionValue = "zh-cn"
+		option.OptionName = "language"
+		option.OptionTitle = "站点语言"
+		if _, err := o.Insert(option); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Option) Update() error {
+	o := orm.NewOrm()
+
+	if !o.QueryTable(m.TableNameWithPrefix()).Filter("option_name", "language").Exist() {
+		option := NewOption()
+		option.OptionValue = "zh-cn"
+		option.OptionName = "language"
+		option.OptionTitle = "站点语言"
+		if _, err := o.Insert(option); err != nil {
+			return err
+		}
+	}
 	return nil
 }

+ 11 - 1
static/cherry/cherry-markdown.css

@@ -1961,6 +1961,15 @@ div[data-type=codeBlock] .token.inserted {
   transform: rotate(-2deg);
 }
 
+.whole-article-wrap > div {
+  display: flex;
+  flex-direction: column;
+}
+
+.whole-article-wrap > div > .markdown-article {
+  width: calc(100% - 260px);
+}
+
 [data-code-block-theme=coy] div[data-type=codeBlock] pre[class*=language-]:after {
   right: 0.75em;
   left: auto;
@@ -3194,7 +3203,8 @@ div[data-type=codeBlock] .token.inserted {
 }
 
 .cherry-editor .cm-s-default .cm-url {
-  background: #4b4b4b;
+  background: #f8fafb;
+  color: #3582fb;
   font-family: "Menlo", "Liberation Mono", "Consolas", "DejaVu Sans Mono", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
   font-size: 0.9em;
 }

+ 1 - 1
static/cherry/cherry-markdown.js

@@ -54950,7 +54950,7 @@
 	      style: ['position: absolute', 'bottom: 30px', 'top: 30px', 'left: 0', 'right: 0', 'overflow: hidden'].join(';')
 	    });
 	    this.foot = createElement('div', 'cherry-dialog--foot', {
-	      style: ['height: 30px', 'line-height: 30px', 'padding-left: 10px', 'padding-right: 10px', 'position: absolute', 'bottom: 0', 'left: 0', 'right: 0'].join(';')
+	      style: ['height: 30px', 'line-height: 18px', 'padding-left: 10px', 'padding-right: 10px', 'position: absolute', 'bottom: 0', 'left: 0', 'right: 0'].join(';')
 	    });
 	    this.headTitle = createElement('span', 'cherry-dialog--title', {
 	      style: 'user-select:none;'

+ 16 - 1
static/cherry/drawio_demo/EditorUi.js

@@ -5745,7 +5745,7 @@ EditorUi.prototype.convertImages = function (svgRoot, callback, imageCache, conv
 		for (var i = 0; i < images.length; i++) {
 			(mxUtils.bind(this, function (img) {
 				var src = converter.convert(img.getAttribute(srcAttr));
-
+				console.log(src)
 				// Data URIs are pass-through
 				if (src != null && src.substring(0, 5) != 'data:') {
 					var tmp = cache[src];
@@ -6059,6 +6059,21 @@ EditorUi.prototype.getBaseFilename = function () {
 };
 
 
+EditorUi.prototype.convertImageToDataUri = function (src, call) {
+	let img = new Image();
+	img.src = src;
+	img.onload = function() {
+		let canvas = document.createElement('canvas');
+		canvas.width = img.width;
+		canvas.height = img.height;
+		let ctx = canvas.getContext('2d');
+		ctx.drawImage(img, 0, 0);
+		let base64 = canvas.toDataURL('image/png');
+		call(base64)
+	};
+}
+
+
 EditorUi.prototype.createImageDataUri = function (canvas, xml, format) {
 	var data = canvas.toDataURL('image/' + format);
 

+ 11 - 9
static/css/markdown.css

@@ -545,18 +545,20 @@ iframe.cherry-dialog-iframe {
 
 .manual-article.cherry-markdown .toc {
     position: fixed;
-    right: 0;
-    width: 200px;
-    margin-top: -70px;
+    right: 50px;
+    width: 260px;
+    font-size: 12px;
     overflow: auto;
-    margin-right: 50px;
+    border: 1px solid #e8e8e8;
+    padding: 10px;
+    border-radius: 6px;
 }
 
-@media screen and (min-width: 840px) {
-    .markdown-article {
-        margin-right: 200px !important;
-    }
-}
+/*@media screen and (min-width: 840px) {*/
+/*    .markdown-article {*/
+/*        margin-right: 200px !important;*/
+/*    }*/
+/*}*/
 
 .markdown-article-head {
     width: unset !important;

+ 15 - 1
static/css/markdown.preview.css

@@ -56,6 +56,20 @@
     flex-direction: column;
 }
 
+/*.content > .whole-article-wrap {*/
+/*    flex-direction: row-reverse;*/
+/*}*/
+
+.content > .whole-article-wrap > .markdown-toc {
+    right: 30px;
+    margin-left: 10px;
+    max-height: 550px;
+}
+
+.content > .whole-article-wrap > .markdown-article {
+    width: 100%;
+}
+
 .article-body .markdown-toc{
     position: fixed;
     right: 50px;
@@ -90,7 +104,7 @@
     /*margin-right: 250px;*/
 }
 .article-body.content .markdown-toc{
-    position: relative;
+    position: fixed;
     margin-top: 0;
 }
 .article-body.content .markdown-article{

+ 4 - 3
static/js/cherry_markdown.js

@@ -630,10 +630,11 @@ function myFileUpload(file, callback) {
         },
         success: function (data) {
             layer.close(layerIndex);
-            if (data[0].errcode !== 0) {
-                layer.msg(data[0].message);
+            // 验证data是否为数组
+            if (data.errcode !== 0) {
+                layer.msg(data.message);
             } else {
-                callback(data[0].url); // 假设返回的 JSON 中包含上传文件的 URL,调用回调函数并传入 URL
+                callback(data.url); // 假设返回的 JSON 中包含上传文件的 URL,调用回调函数并传入 URL
             }
         }
     });

+ 5 - 1
static/js/kancloud.js

@@ -141,6 +141,7 @@ function renderPage($data) {
     $("#article-info").text($data.doc_info);
     $("#view_count").text("阅读次数:" + $data.view_count);
     $("#doc_id").val($data.doc_id);
+    checkMarkdownTocElement();
     if ($data.page) {
         loadComment($data.page, $data.doc_id);
     } else {
@@ -154,7 +155,7 @@ function renderPage($data) {
         $("#view_container").removeClass("theme__dark theme__green theme__light theme__red theme__default")
         $("#view_container").addClass($data.markdown_theme)
     }
-    checkMarkdownTocElement();
+
 }
 
 /***
@@ -442,6 +443,9 @@ function loadCopySnippets() {
 
 function checkMarkdownTocElement() {
     let toc = $(".markdown-toc-list");
+    if ($(".toc").length) {
+        toc = $(".toc");
+    }
     let articleComment = $("#articleComment");
     if (toc.length) {
         $(".wiki-bottom-left").css("width", "calc(100% - 260px)");

二进制
uploads/docs/admin.png


二进制
uploads/docs/cheery-markdown.png


二进制
uploads/docs/create.png


二进制
uploads/docs/editor_md.png


二进制
uploads/docs/intro.png


二进制
uploads/docs/member.png


二进制
uploads/docs/preview.png


二进制
uploads/docs/project_list.png


二进制
uploads/docs/project_setting.png


二进制
uploads/docs/wang_editor.png


+ 8 - 0
views/manager/setting.tpl

@@ -44,6 +44,13 @@
                             <label>{{i18n .Lang "mgr.site_desc"}}</label>
                             <textarea rows="3" class="form-control" name="site_description" style="height: 90px" placeholder="{{i18n .Lang "mgr.site_desc"}}">{{.site_description}}</textarea>
                             <p class="text">{{i18n .Lang "mgr.site_desc_tips"}}</p>
+                        </div>
+                        <div class="form-group">
+                            <label>{{i18n .Lang "mgr.language"}}</label>
+                            <select name="language" class="form-control">
+                                <option value="zh-cn" {{if eq .language "zh-cn"}}selected{{end}}>{{i18n .Lang "mgr.zh_cn"}}</option>
+                                <option value="en-us" {{if eq .language "en-us"}}selected{{end}}>{{i18n .Lang "mgr.en_us"}}</option>
+                            </select>
                         </div>
                             <div class="form-group">
                                 <label>{{i18n .Lang "mgr.enable_anonymous_access"}}</label>
@@ -123,6 +130,7 @@
             },success : function (res) {
                 if(res.errcode === 0) {
                     showSuccess({{i18n .Lang "message.success"}})
+                    window.location.reload()
                 }else{
                     showError(res.message);
                 }

+ 2 - 2
views/widgets/footer.tpl

@@ -1,13 +1,13 @@
 <div class="footer">
     <div class="container">
         <div class="row text-center border-top">
-            <span><a href="https://www.iminho.me" target="_blank">{{i18n .Lang "common.official_website"}}</a></span>
+            <span><a href="https://mindoc.com.cn" target="_blank">{{i18n .Lang "common.official_website"}}</a></span>
             <span>&nbsp;·&nbsp;</span>
             <span><a href="https://github.com/mindoc-org/mindoc/issues" target="_blank">{{i18n .Lang "common.feedback"}}</a></span>
             <span>&nbsp;·&nbsp;</span>
             <span><a href="https://github.com/mindoc-org/mindoc" target="_blank">{{i18n .Lang "common.source_code"}}</a></span>
             <span>&nbsp;·&nbsp;</span>
-            <span><a href="https://www.iminho.me/wiki/docs/mindoc/" target="_blank">{{i18n .Lang "common.manual"}}</a></span>
+            <span><a href="https://mindoc.com.cn/docs/mindochelp" target="_blank">{{i18n .Lang "common.manual"}}</a></span>
         </div>
         {{if .site_beian}}
         <div class="row text-center">