master
taoshihan 2 months ago
parent fa9ce00d29
commit 9407345d08

@ -1,12 +1,11 @@
package controller package controller
import ( import (
"github.com/dchest/captcha"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/taoshihan1991/imaptool/models" "github.com/taoshihan1991/imaptool/models"
"github.com/taoshihan1991/imaptool/tools" "github.com/taoshihan1991/imaptool/tools"
"github.com/taoshihan1991/imaptool/ws" "github.com/taoshihan1991/imaptool/ws"
"net/http"
) )
func PostKefuAvator(c *gin.Context) { func PostKefuAvator(c *gin.Context) {
@ -161,74 +160,45 @@ func GetKefuInfoSetting(c *gin.Context) {
}) })
} }
func PostKefuRegister(c *gin.Context) { func PostKefuRegister(c *gin.Context) {
name := c.PostForm("name") name := c.PostForm("username")
password := c.PostForm("password") password := c.PostForm("password")
rePassword := c.PostForm("rePassword") avatar := "/static/images/4.jpg"
avator := "/static/images/4.jpg"
nickname := c.PostForm("nickname") if name == "" || password == "" {
captchaCode := c.PostForm("captcha") c.JSON(http.StatusOK, gin.H{
roleId := 1
if name == "" || password == "" || rePassword == "" || nickname == "" || captchaCode == "" {
c.JSON(200, gin.H{
"code": 400,
"msg": "参数不能为空",
"result": "",
})
return
}
if password != rePassword {
c.JSON(200, gin.H{
"code": 400,
"msg": "密码不一致",
"result": "",
})
return
}
oldUser := models.FindUser(name)
if oldUser.Name != "" {
c.JSON(200, gin.H{
"code": 400, "code": 400,
"msg": "用户名已经存在", "msg": "All fields are required",
"result": "", "result": nil,
}) })
return return
} }
session := sessions.Default(c)
if captchaId := session.Get("captcha"); captchaId != nil { existingUser := models.FindUser(name)
session.Delete("captcha") if existingUser.Name != "" {
_ = session.Save() c.JSON(http.StatusOK, gin.H{
if !captcha.VerifyString(captchaId.(string), captchaCode) { "code": 409,
c.JSON(200, gin.H{ "msg": "Username already exists",
"code": 400, "result": nil,
"msg": "验证码验证失败",
"result": "",
})
return
}
} else {
c.JSON(200, gin.H{
"code": 400,
"msg": "验证码失效",
"result": "",
}) })
return return
} }
//插入新用户
uid := models.CreateUser(name, tools.Md5(password), avator, nickname) userID := models.CreateUser(name, tools.Md5(password), avatar, "")
if uid == 0 { if userID == 0 {
c.JSON(200, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{
"code": 400, "code": 500,
"msg": "增加用户失败", "msg": "Registration Failed",
"result": "", "result": nil,
}) })
return return
} }
models.CreateUserRole(uid, uint(roleId))
c.JSON(200, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": 200, "code": 200,
"msg": "注册完成", "msg": "Registration successful",
"result": "", "result": gin.H{
"user_id": userID,
},
}) })
} }
func PostKefuInfo(c *gin.Context) { func PostKefuInfo(c *gin.Context) {

@ -1,50 +1,48 @@
package middleware package middleware
import ( import (
"fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/taoshihan1991/imaptool/models"
"strings"
) )
func RbacAuth(c *gin.Context) { func RbacAuth(c *gin.Context) {
roleId, _ := c.Get("role_id") return
role := models.FindRole(roleId) //roleId, _ := c.Get("role_id")
var flag bool //role := models.FindRole(roleId)
rPaths := strings.Split(c.Request.RequestURI, "?") //var flag bool
uriParam := fmt.Sprintf("%s:%s", c.Request.Method, rPaths[0]) //rPaths := strings.Split(c.Request.RequestURI, "?")
if role.Method != "*" || role.Path != "*" { //uriParam := fmt.Sprintf("%s:%s", c.Request.Method, rPaths[0])
paths := strings.Split(role.Path, ",") //if role.Method != "*" || role.Path != "*" {
for _, p := range paths { // paths := strings.Split(role.Path, ",")
if uriParam == p { // for _, p := range paths {
flag = true // if uriParam == p {
break // flag = true
} // break
} // }
if !flag { // }
c.JSON(200, gin.H{ // if !flag {
"code": 403, // c.JSON(200, gin.H{
"msg": "没有权限:" + uriParam, // "code": 403,
}) // "msg": "没有权限:" + uriParam,
c.Abort() // })
return // c.Abort()
} // return
//methods := strings.Split(role.Method, ",") // }
//for _, m := range methods { //methods := strings.Split(role.Method, ",")
// if c.Request.Method == m { //for _, m := range methods {
// methodFlag = true // if c.Request.Method == m {
// break // methodFlag = true
// } // break
//} // }
//if !methodFlag { //}
// c.JSON(200, gin.H{ //if !methodFlag {
// "code": 403, // c.JSON(200, gin.H{
// "msg": "没有权限:" + c.Request.Method + "," + rPaths[0], // "code": 403,
// }) // "msg": "没有权限:" + c.Request.Method + "," + rPaths[0],
// c.Abort() // })
// return // c.Abort()
//} // return
} //}
//}
//var flag bool //var flag bool
//if role.Path != "*" { //if role.Path != "*" {
// paths := strings.Split(role.Path, ",") // paths := strings.Split(role.Path, ",")

@ -1,9 +1,9 @@
<html lang="cn"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>Golang Open Source LiveChat Software</title> <title>Go Open Source Live Chat Software</title>
<link rel="stylesheet" href="/static/cdn/element-ui/2.15.1/theme-chalk/index.min.css"> <link rel="stylesheet" href="/static/cdn/element-ui/2.15.1/theme-chalk/index.min.css">
<script src="/static/cdn/vue/2.6.11/vue.min.js"></script> <script src="/static/cdn/vue/2.6.11/vue.min.js"></script>
<script src="/static/cdn/element-ui/2.15.1/index.js"></script> <script src="/static/cdn/element-ui/2.15.1/index.js"></script>
@ -14,153 +14,204 @@
background-color: #f5f5f5; background-color: #f5f5f5;
margin: 0; margin: 0;
padding: 0; padding: 0;
} display: flex;
a { align-items: center;
text-decoration: none; justify-content: center;
color: #3973ac; min-height: 100vh;
} }
.signin { .signin {
width: 350px; width: 350px;
padding: 20px; padding: 20px;
margin:100px auto;
background: #fff; background: #fff;
-webkit-box-shadow: 0 1px 2px 0 rgba(101,129,156,.08); -webkit-box-shadow: 0 1px 2px 0 rgba(101,129,156,.08);
box-shadow: 0 1px 2px 0 rgba(101,129,156,.08); box-shadow: 0 1px 2px 0 rgba(101,129,156,.08);
border-radius: 4px;
} }
.signin h1,.signin h2,.signin .copyright{ .signin h1, .signin h2, .signin .copyright {
font-weight: normal; font-weight: normal;
color: #4d627b; color: #4d627b;
text-align: center; text-align: center;
} }
.signin .loginTitle{ .signin .loginTitle {
font-size: 24px; font-size: 22px;
} margin: 20px 0px;
.signin .loginDesc{
font-size: 14px;
margin-bottom: 15px;
color: #409EFF;
text-decoration: none;
cursor: pointer;
} }
.signin .copyright{ .signin .copyright {
font-size: 12px; font-size: 12px;
margin-top: 20px;
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.signin{ .signin {
width: 90%; width: 90%;
margin:40px auto; box-shadow: none;
background-color: #f5f5f5;
box-shadow:none;
} }
} }
</style> </style>
</head> </head>
<body> <body>
<div id="app" class="signin"> <div id="app" class="signin">
<template> <template>
<div class="loginHtml"> <div class="loginHtml">
<h1 class="loginTitle">Open Source LiveChat Software</h1> <h1 class="loginTitle">Open Source Live Chat</h1>
<el-form :model="kefuForm" :rules="rules" ref="kefuForm"> <el-form :model="form" :rules="rules" ref="loginForm" v-show="!showRegHtml">
<el-form-item prop="username"> <el-form-item prop="account">
<el-input v-model="kefuForm.username" placeholder="account"></el-input> <el-input v-model="form.account" placeholder="Username"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input show-password v-on:keyup.enter.native="handleLogin('loginForm')" v-model="form.password" placeholder="Password"></el-input>
</el-form-item>
<el-form-item>
<el-button style="width: 100%" type="primary" @click="handleLogin('loginForm')">Sign In</el-button>
</el-form-item>
<el-form-item>
<el-button style="width: 100%" @click="showRegHtml=true">Create Account</el-button>
</el-form-item>
</el-form>
<el-form :model="form" :rules="rules" ref="registerForm" v-show="showRegHtml">
<el-form-item prop="account">
<el-input v-model="form.account" placeholder="Username"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input show-password v-model="form.password" placeholder="Password"></el-input>
</el-form-item> </el-form-item>
<el-form-item prop="password"> <el-form-item prop="rePassword">
<el-input show-password v-on:keyup.enter.native="kefuLogin('kefuForm')" v-model="kefuForm.password" placeholder="password"></el-input> <el-input show-password v-on:keyup.enter.native="handleRegister('registerForm')" v-model="form.rePassword" placeholder="Confirm Password"></el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button style="width: 100%" :loading="loading" type="primary" @click="kefuLogin('kefuForm')">Log in</el-button> <el-button style="width: 100%" type="primary" @click="handleRegister('registerForm')">Register</el-button>
</el-form-item>
<el-form-item>
<el-button style="width: 100%" @click="showRegHtml=false">Back to Login</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<p class="copyright">Golang Open Source LiveChat Software</p> <p class="copyright">Go Open Source Live Chat Software</p>
</template> </template>
</div> </div>
</body> </body>
<script> <script>
new Vue({ new Vue({
el: '#app', el: '#app',
delimiters:["<{","}>"], delimiters: ["<{", "}>"],
data: { data: {
window:window, form: {
activeName:"second", account: "",
loading:false, password: "",
localAuth:{ rePassword: ""
username:'',
password:'',
},
ruleForm:{
server:'',
email:'',
password:'',
},
kefuForm:{
username:'',
password:'',
}, },
rules: { rules: {
username: [ account: [
{ required: true, message: 'account cannot be empty', trigger: 'blur' }, { required: true, message: 'Please input your username', trigger: 'blur' },
{ min: 2, max: 20, message: 'Length should be 2 to 20 characters', trigger: 'blur' }
], ],
password: [ password: [
{ required: true, message: 'password cannot be empty', trigger: 'blur' }, { required: true, message: 'Please input your password', trigger: 'blur' },
{ min: 2, message: 'Password must be at least 2 characters', trigger: 'blur' }
], ],
rePassword: [
{ required: true, message: 'Please confirm your password', trigger: 'blur' },
{ validator: this.validatePasswordMatch, trigger: 'blur' }
]
},
showRegHtml: false,
},
methods: {
validatePasswordMatch(rule, value, callback) {
if (value !== this.form.password) {
callback(new Error('Passwords do not match!'));
} else {
callback();
}
}, },
showRegHtml:false,
newName:"", handleLogin(formName) {
nickname:"",
newPass:"",
newRefPass:"",
captcha:"",
codeSrc:"/captcha",
},
methods: {
//提交表单
kefuLogin(formName){
let _this=this;
this.$refs[formName].validate((valid) => { this.$refs[formName].validate((valid) => {
if (!valid) { if (valid) {
return false; this.login();
}
});
},
handleRegister(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.register();
}
});
},
login() {
let data = {
"username": this.form.account,
"password": this.form.password,
};
$.post("/check", data, (response) => {
if (response.code === 200) {
this.$message({
message: 'Login successful',
type: 'success'
});
localStorage.setItem("token", response.result.token);
localStorage.setItem("ref_token", response.result.ref_token);
localStorage.setItem("create_time", response.result.create_time);
window.location.href = "/main";
} else { } else {
let data = {}; this.$message({
data.type="kefu"; message: response.msg || 'Login failed',
data.username = _this.kefuForm.username; type: 'error'
data.password = _this.kefuForm.password;
_this.loading = true;
$.post("/check", data, function (data) {
if (data.code == 200) {
_this.$message({
message: data.msg,
type: 'success'
});
localStorage.setItem("token",data.result.token);
localStorage.setItem("ref_token",data.result.ref_token);
localStorage.setItem("create_time",data.result.create_time);
window.location.href="/main";
} else {
_this.$message({
message: data.msg,
type: 'error'
});
}
_this.loading = false;
}); });
} }
}).fail(() => {
this.$message({
message: 'Network error',
type: 'error'
});
}); });
},
//重置表单
resetForm(formName) {
this.loading=false;
this.$refs[formName].resetFields();
}, },
},
created: function () { register() {
if (top.location != location){ if (this.form.password !== this.form.rePassword) {
this.$message({
message: 'Passwords do not match',
type: 'error'
});
return;
}
let data = {
"username": this.form.account,
"password": this.form.password,
};
$.post("/register", data, (response) => {
if (response.code === 200) {
this.$message({
message: 'Registration successful',
type: 'success'
});
this.showRegHtml = false;
} else {
this.$message({
message: response.msg || 'Registration failed',
type: 'error'
});
}
}).fail(() => {
this.$message({
message: 'Network error',
type: 'error'
});
});
}
},
created: function() {
if (top.location != location) {
top.location.href = location.href; top.location.href = location.href;
} }
} }
}) });
</script> </script>
</html> </html>
Loading…
Cancel
Save