Golang: Gin 渲染模板的方式

Gin 渲染模板的方式

方式1:Go 标准库 “html/template”, template.ParseFiles()
方式2:“github.com/gin-gonic/gin”,gin.HTML()

一、Go 标准库 “html/template”

直接加载 login/inex.html
Handler.go

// GetIndex
// @Tags 首页
// @contact.name Allan
// @Success 200 {string} 首页
// @Router /index [get]
func (app *Config) GetIndex(c *gin.Context) {
	idx, err := template.ParseFiles("login/index.html")
	if err != nil {
		panic(err)
	}
	idx.Execute(c.Writer, "首页")
}
 

login/index.html

<!DOCTYPE html>
<html class="ui-page-login">

	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<title></title>
		<link href="asset/login/css/mui.min.css" rel="stylesheet" />
		<link href="asset/login/css/style.css" rel="stylesheet" />
		<style>
			.area {
				margin: 20px auto 0px auto;
			}
			
			.mui-input-group {
				margin-top: 10px;
			}
			
			.mui-input-group:first-child {
				margin-top: 20px;
			}
			
			.mui-input-group label {
				width: 22%;
			}
			
			.mui-input-row label~input,
			.mui-input-row label~select,
			.mui-input-row label~textarea {
				width: 78%;
			}
			
			.mui-checkbox input[type=checkbox],
			.mui-radio input[type=radio] {
				top: 6px;
			}
			
			.mui-content-padded {
				margin-top: 25px;
			}
			
			.mui-btn {
				padding: 10px;
			}
			
			.link-area {
				display: block;
				margin-top: 25px;
				text-align: center;
			}
			
			.spliter {
				color: #bbb;
				padding: 0px 8px;
			}
			
			.oauth-area {
				position: absolute;
				bottom: 20px;
				left: 0px;
				text-align: center;
				width: 100%;
				padding: 0px;
				margin: 0px;
			}
			
			.oauth-area .oauth-btn {
				display: inline-block;
				width: 50px;
				height: 50px;
				background-size: 30px 30px;
				background-position: center center;
				background-repeat: no-repeat;
				margin: 0px 20px;
				/*-webkit-filter: grayscale(100%); */
				border: solid 1px #ddd;
				border-radius: 25px;
			}
			
			.oauth-area .oauth-btn:active {
				border: solid 1px #aaa;
			}
			
			.oauth-area .oauth-btn.disabled {
				background-color: #ddd;
			}
		</style>

	</head>

	<body>
		<header class="mui-bar mui-bar-nav">
			<h1 class="mui-title">登录</h1>
		</header>
		<div class="mui-content">
			<form id='login-form' class="mui-input-group">
				<div class="mui-input-row">
					<label>账号</label>
					<input id='account' type="text" class="mui-input-clear mui-input" placeholder="请输入账号">
				</div>
				<div class="mui-input-row">
					<label>密码</label>
					<input id='password' type="password" class="mui-input-clear mui-input" placeholder="请输入密码" autocomplete>
				</div>
			</form>
			<form class="mui-input-group">
				<ul class="mui-table-view mui-table-view-chevron">
					<li class="mui-table-view-cell">
						自动登录
						<div id="autoLogin" class="mui-switch">
							<div class="mui-switch-handle"></div>
						</div>
					</li>
				</ul>
			</form>
			<div class="mui-content-padded">
				<button id='login' type="button" class="mui-btn mui-btn-block mui-btn-primary">登录</button>
				<div class="link-area"><a id='reg'>注册账号</a> <span class="spliter">|</span> <a id='forgetPassword'>忘记密码</a>
				</div>
			</div>
			<div class="mui-content-padded oauth-area">

			</div>
		</div>
		<script src="asset/login/js/mui.min.js"></script>
		<script src="asset/login/js/mui.enterfocus.js"></script>
		<script src="asset/login/js/app.js"></script>
		<script>
			(function($, doc) {
				var url;
				app.loadJSON('asset/login/url.json', function(res){
					if (res){
						url = res
					}
				});
				var settings = app.getSettings();
				var state = app.getState();

				let loginButton = doc.getElementById('login');
				let accountBox = doc.getElementById('account');
				let passwordBox = doc.getElementById('password');
				let autoLoginButton = doc.getElementById("autoLogin");
				let regButton = doc.getElementById('reg');
				let forgetButton = doc.getElementById('forgetPassword');
				loginButton.addEventListener('tap', function(event) {
					var loginInfo = {
						account: accountBox.value,
						password: passwordBox.value
					};
					app.login(loginInfo, function(err) {
						if (err) {
							$.toast(err)
							return;
						}
						$.toast("登录成功,即将跳转")
						var state = app.getState();
						userInfo(state)
						userId(state.userId)
						var url = `/chatRoom?userId=${state.userId}&token=${state.token}`
						location.href = url
					});
				});
				$.enterfocus('#login-form input', function() {
					$.trigger(loginButton, 'tap');
				});
				autoLoginButton.classList[settings.autoLogin ? 'add' : 'remove']('mui-active')
				autoLoginButton.addEventListener('toggle', function(event) {
					setTimeout(function() {
						var isActive = event.detail.isActive;
						settings.autoLogin = isActive;
						app.setSettings(settings);
					}, 50);
				}, false);
				regButton.addEventListener('tap', function(event) {
					$.openWindow({
						url: '/register',
						id: 'reg',
						preload: true,
						show: {
							aniShow: 'pop-in'
						},
						styles: {
							popGesture: 'hide'
						},
						waiting: {
							autoShow: false
						}
					});
				}, false);
				forgetButton.addEventListener('tap', function(event) {
					$.openWindow({
						url: '/forgetPassword',
						id: 'forget_password',
						preload: true,
						show: {
							aniShow: 'pop-in'
						},
						styles: {
							popGesture: 'hide'
						},
						waiting: {
							autoShow: false
						}
					});
				}, false);
				//
				window.addEventListener('resize', function() {
					oauthArea.style.display = document.body.clientHeight > 400 ? 'block' : 'none';
				}, false);
				//
				var backButtonPress = 0;
				$.back = function(event) {
					backButtonPress++;
					if (backButtonPress > 1) {
						plus.runtime.quit();
					} else {
						plus.nativeUI.toast('再按一次退出应用');
					}
					setTimeout(function() {
						backButtonPress = 0;
					}, 1000);
					return false;
				};

				function userId(userid){
					if(typeof  userid =="undefined"){
						var r = sessionStorage.getItem("userid");
						if(!r){
							return 0;
						}else{
							return parseInt(r)
						}
					}else{
						sessionStorage.setItem("userid",userid);
					}
				}

				function userInfo(o){
					if(typeof  o =="undefined"){
						var r = sessionStorage.getItem("userinfo");
						if(!!r){
							return JSON.parse(r);
						}else{
							return null
						}
					}else{
						sessionStorage.setItem("userinfo",JSON.stringify(o));
					}
				}
			}(mui, document));
		</script>
	</body>

</html>

二、“github.com/gin-gonic/gin”

c.HTML中的name必须与引用的tmpl文件内define定义的一致,直接使用chat/index.html不会加载内容。
Handler.go

// Chat
// @Tags 聊天
// @Description 聊天室
// @param userId query string false "用户ID"
// @param token query string false "Token"
// @contact.name Allan
// @Success 200 {string} success
// @Router /Chat [get]
func (app *Config) ChatRoom(c *gin.Context) {
	session:= sessions.Default(c)

	userId, _ := strconv.Atoi(c.Query("userId"))
	token := c.Query("token")
	if token != session.Get("loginToken") {
		c.JSON(-1, gin.H{
			"code":    -1,
			"message": "鉴权失败!",
		})
		return
	}

	user := models.User{}
	user.ID = uint(userId)
	user.Identity = token
	c.HTML(http.StatusOK, "/chat/index.shtml", gin.H{
		"code":    0,
		"message": "success",
	})
}

chat/index.html

{{define "/chat/index.shtml"}}
<!DOCTYPE html>
<html>
<head>
<!--js include-->
{{template "/chat/head.shtml"}}
</head>
<body>
<header class="mui-bar mui-bar-nav">
</header>
<div class="mui-content" id="pageapp">
    <!--联系人-->
    {{template "/chat/concat.shtml"}}
    <!--群聊-->
    {{template "/chat/group.shtml"}}
    <!--个人中心-->
    {{template "/chat/profile.shtml"}}
    <!--聊天主界面-->
    {{template "/chat/main.shtml"}}
    <!--底部菜单-->
    {{template "/chat/tabmenu.shtml"}}
</div>
</body>
</html>
{{template "/chat/foot.shtml"}}
{{end}}