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,
"msg": "用户名已经存在",
"result": "",
})
return
}
session := sessions.Default(c)
if captchaId := session.Get("captcha"); captchaId != nil {
session.Delete("captcha")
_ = session.Save()
if !captcha.VerifyString(captchaId.(string), captchaCode) {
c.JSON(200, gin.H{
"code": 400, "code": 400,
"msg": "验证码验证失败", "msg": "All fields are required",
"result": "", "result": nil,
}) })
return return
} }
} else {
c.JSON(200, gin.H{ existingUser := models.FindUser(name)
"code": 400, if existingUser.Name != "" {
"msg": "验证码失效", c.JSON(http.StatusOK, gin.H{
"result": "", "code": 409,
"msg": "Username already exists",
"result": nil,
}) })
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,34 +1,32 @@
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")
role := models.FindRole(roleId)
var flag bool
rPaths := strings.Split(c.Request.RequestURI, "?")
uriParam := fmt.Sprintf("%s:%s", c.Request.Method, rPaths[0])
if role.Method != "*" || role.Path != "*" {
paths := strings.Split(role.Path, ",")
for _, p := range paths {
if uriParam == p {
flag = true
break
}
}
if !flag {
c.JSON(200, gin.H{
"code": 403,
"msg": "没有权限:" + uriParam,
})
c.Abort()
return return
} //roleId, _ := c.Get("role_id")
//role := models.FindRole(roleId)
//var flag bool
//rPaths := strings.Split(c.Request.RequestURI, "?")
//uriParam := fmt.Sprintf("%s:%s", c.Request.Method, rPaths[0])
//if role.Method != "*" || role.Path != "*" {
// paths := strings.Split(role.Path, ",")
// for _, p := range paths {
// if uriParam == p {
// flag = true
// break
// }
// }
// if !flag {
// c.JSON(200, gin.H{
// "code": 403,
// "msg": "没有权限:" + uriParam,
// })
// c.Abort()
// return
// }
//methods := strings.Split(role.Method, ",") //methods := strings.Split(role.Method, ",")
//for _, m := range methods { //for _, m := range methods {
// if c.Request.Method == m { // if c.Request.Method == m {
@ -44,7 +42,7 @@ func RbacAuth(c *gin.Context) {
// c.Abort() // c.Abort()
// return // 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>
<el-form-item prop="password"> <el-form-item prop="password">
<el-input show-password v-on:keyup.enter.native="kefuLogin('kefuForm')" v-model="kefuForm.password" placeholder="password"></el-input> <el-input show-password v-model="form.password" placeholder="Password"></el-input>
</el-form-item>
<el-form-item prop="rePassword">
<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-button style="width: 100%" type="primary" @click="handleRegister('registerForm')">Register</el-button>
</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%" @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, showRegHtml: false,
newName:"",
nickname:"",
newPass:"",
newRefPass:"",
captcha:"",
codeSrc:"/captcha",
}, },
methods: { methods: {
//提交表单 validatePasswordMatch(rule, value, callback) {
kefuLogin(formName){ if (value !== this.form.password) {
let _this=this; callback(new Error('Passwords do not match!'));
this.$refs[formName].validate((valid) => {
if (!valid) {
return false;
} else { } else {
let data = {}; callback();
data.type="kefu"; }
data.username = _this.kefuForm.username; },
data.password = _this.kefuForm.password;
_this.loading = true; handleLogin(formName) {
$.post("/check", data, function (data) { this.$refs[formName].validate((valid) => {
if (data.code == 200) { if (valid) {
_this.$message({ this.login();
message: data.msg, }
});
},
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' type: 'success'
}); });
localStorage.setItem("token",data.result.token); localStorage.setItem("token", response.result.token);
localStorage.setItem("ref_token",data.result.ref_token); localStorage.setItem("ref_token", response.result.ref_token);
localStorage.setItem("create_time",data.result.create_time); localStorage.setItem("create_time", response.result.create_time);
window.location.href="/main"; window.location.href = "/main";
} else { } else {
_this.$message({ this.$message({
message: data.msg, message: response.msg || 'Login failed',
type: 'error' type: 'error'
}); });
} }
_this.loading = false; }).fail(() => {
this.$message({
message: 'Network error',
type: 'error'
}); });
}
}); });
}, },
//重置表单
resetForm(formName) { register() {
this.loading=false; if (this.form.password !== this.form.rePassword) {
this.$refs[formName].resetFields(); 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 () { created: function() {
if (top.location != location){ if (top.location != location) {
top.location.href = location.href; top.location.href = location.href;
} }
} }
}) });
</script> </script>
</html> </html>
Loading…
Cancel
Save