1.创建数据库结构
.新建一张e_user表,结构如下,当然前期我们只验证用户名和密码
列 类型 注释
id int(9) 自动增量
fid int(5) [0] 用户类型 0普通用户 1管理员 2普通管理员 3vip
off int(1) [1] 1正常 0未审核 -1封禁
username varchar(16) 登录账号
password varchar(32) 密码 md5加密
token varchar(32) 登录令牌 有效30天。重新登录会重置
regtiem char(13) 注册时间
logintime char(13) 最后登录时间
qq char(13) QQ号
mail char(100) 邮箱
balance float [0] 余额
integral int(11) [0] 积分点
time int(11) 租用到期时间
.然后新建一个用户,作为管理员账户
账号密码都是:admin admin
2.创建前端.html页面
.创建两个html页面,路径
项目/模板/admin/index.html #管理后台主页
项目/模板/admin/login.html #管理登录页
登录页登录表单html代码如下,这里我用的layui:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{网站名称}} - 后台登录</title>
{{>/admin/css.html}}
<style>
body {
background-image: url("/src/images/rlogin.jpg");
}
</style>
</head>
<body>
<div class="layadmin-user-login layadmin-user-display-show" id="LAY-user-login" style="display: none;">
<div class="layadmin-user-login-main layui-card">
<div class="layadmin-user-login-box layadmin-user-login-header">
<h2>{{网站名称}}</h2>
<p>{{站点描述}}</p>
</div>
<div class="layadmin-user-login-box layadmin-user-login-body layui-form">
<div class="layui-form-item">
<label class="layadmin-user-login-icon layui-icon layui-icon-username" for="LAY-user-login-username"></label>
<input type="text" name="username" id="LAY-user-login-username" lay-verify="required" placeholder="用户名" class="layui-input">
</div>
<div class="layui-form-item">
<label class="layadmin-user-login-icon layui-icon layui-icon-password" for="LAY-user-login-password"></label>
<input type="password" name="password" id="LAY-user-login-password" lay-verify="required" placeholder="密码" class="layui-input">
</div>
<div class="layui-form-item">
<div class="layui-row">
<div class="layui-col-xs7">
<label class="layadmin-user-login-icon layui-icon layui-icon-vercode" for="LAY-user-login-vercode"></label>
<input type="text" name="vercode" id="LAY-user-login-vercode" lay-verify="required" placeholder="图形验证码" class="layui-input">
</div>
<div class="layui-col-xs5">
<div style="margin-left: 10px;">
<img src="https://www.oschina.net/action/user/captcha" class="layadmin-user-login-codeimg" id="LAY-user-get-vercode">
</div>
</div>
</div>
</div>
<div class="layui-form-item" style="margin-bottom: 20px;">
<input type="checkbox" name="remember" lay-skin="primary" title="记住密码">
<a href="forget.html" class="layadmin-user-jump-change layadmin-link" style="margin-top: 7px;">忘记密码?</a>
</div>
<div class="layui-form-item">
<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="LAY-user-login-submit">登 入</button>
</div>
</div>
</div>
<div class="layui-trans layadmin-user-login-footer">
<p>C 2024 <a href="#">layui.com</a></p>
<p>
<span><a href="#admin/#get">获取授权</a></span>
<span><a href="#">在线演示</a></span>
<span><a href="/" target="_blank">官网首页</a></span>
</p>
</div>
</div>
{{>/admin/js.html}}
<script>
layui.config({
base: '/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'user'], function(){
var $ = layui.$
,setter = layui.setter
,admin = layui.admin
,form = layui.form
,router = layui.router()
,search = router.search;
form.render();
//提交
form.on('submit(LAY-user-login-submit)', function(obj){
admin.req({
url: '/api/get?functionid=login' //发送给请求
,data: obj.field
,done: function(res){
//请求成功后,写入 access_token
layui.data(setter.tableName, {
key: setter.request.tokenName
,value: res.data.access_token
});
//登入成功的提示与跳转
layer.msg('登入成功', {
offset: '15px'
,icon: 1
,time: 1000
}, function(){
location.href = '/admin/index'; //后台主页
});
}
});
});
//欢迎下
layer.msg('你好欢迎来到 - {{网站名称}}', {
offset: '15px'
,icon: 1
});
});
</script>
</body>
</html>
- 关于里面使用到的{{****}}变量 疑问解答
参考e2ee:输出变量
这里我输出的数据库建立号的完整信息表,结构和数据如下:
前期可以忽略
3.易语言注册接口
注册三个接口
全局_网站.注册接口 (&页面_通用后台回复, “/admin/login”, “/admin/login.html”, , “GET”)
全局_网站.注册接口 (&页面_通用后台回复, “/admin/index”, “/admin/index.html”, { “是否登录” }, “GET”)
全局_网站.注册接口 (&接口_回复get请求, “/api/get”, , { “是否登录” }, “GET”)
- 路由:/admin/login 管理员登录页,回复模板:/admin/login.html ‘就是刚刚我们新建的html’
- 路由:/admin/login 管理员登录页,回复模板:/admin/login.html ‘就是刚刚我们新建的html’
- 路由:/api/get 这个是通用处理get请求的接口,这里不需要写回复模板
子程序指针 &页面_通用后台回复
.版本 2
.支持库 spec
.子程序 页面_通用后台回复, 逻辑型, , 通用回复注册接口时填写的模板就有这个子程序就恶心
.参数 指针
.局部变量 接口, CC接口
.局部变量 json数组, json数组
.局部变量 json对象, json对象
.局部变量 json, 类_json
.局部变量 access_token, 文本型
.局部变量 i, 整数型
取回接口 (指针, 接口)
' 这里我们可以进行一些数据查询操作,比如返回网站信息,用户信息,等等,这里我就统一回复 写在数据库的站点信息 和当前登录的用户信息
接口.数据库_查询 (json数组, “SELECT * FROM `e_config` WHERE `fid` = '1'”, )
json.解析 (json数组.到JSON (), , )
.计次循环首 (json.成员数 (), i)
json对象.置文本 (json.取通用属性 (“[” + 到文本 (i - 1) + “].key”, ), json.取通用属性 (“[” + 到文本 (i - 1) + “].value”, ), )
.计次循环尾 ()
json数组.清空 ()
json.清除 ()
access_token = 接口.取Cookies (“access_token”)
.如果真 (access_token ≠ “”)
接口.数据库_查询 (json数组, “SELECT * FROM `e_user` WHERE `token` = '” + 接口.取Cookies (“access_token”) + “'”, )
json.解析 (json数组.到JSON (), , )
json对象.置JSON文本 (“user”, json.取通用属性 (“[0]”, 真), , )
json数组.清空 ()
json.清除 ()
.如果真结束
调试输出 (json对象.到JSON ())
接口.回复模板 (, json对象)
返回 (真)
子程序指针 &接口_回复get请求
.版本 2
.支持库 dp1
.支持库 spec
.子程序 接口_回复get请求, 逻辑型
.参数 指针
.局部变量 接口, CC接口
.局部变量 json对象, json对象
.局部变量 json数组, json数组
.局部变量 json, 类_json
.局部变量 functionid, 文本型
.局部变量 table, 文本型
.局部变量 username, 文本型
.局部变量 password, 文本型
.局部变量 vercode, 文本型
.局部变量 access_token, 文本型
.局部变量 logintime, 文本型
.局部变量 uid, 文本型
.局部变量 off, 整数型
.局部变量 fid, 文本型
.局部变量 array, 文本型, , "0"
.局部变量 i, 整数型
.局部变量 login_ture, 逻辑型
取回接口 (指针, 接口)
functionid = 接口.取参数 (“functionid”)
.如果真 (functionid = “”)
接口.回复JSON (“Function is empty”, 400, , 假, 真) ' functionid不能为空
.如果真结束
' 下面开始业务逻辑,根据functionid来回复用户
.判断开始 (functionid = “login”) ' ' 注册一个方法 登录,这时还需要提交username password
username = 接口.取参数 (“username”)
password = 接口.取参数 (“password”)
vercode = 接口.取参数 (“vercode”)
接口.数据库_查询 (json数组, “SELECT * FROM `” + #表_用户 + “` WHERE `username` = '” + username + “'”, )
json.解析 (json数组.到JSON (), , )
uid = 到小写 (文本_加密 (json.取通用属性 (“[0].id”, ), “lele2020o”))
fid = json.取通用属性 (“[0].fid”, )
off = 到整数 (json.取通用属性 (“[0].off”, ))
.如果真 (json.取通用属性 (“[0].username”, ) ≠ username 或 json.取通用属性 (“[0].password”, ) ≠ 取数据摘要 (到字节集 (password)))
接口.回复JSON (“账号或密码错误”, 400, , 假, 真)
.如果真结束
json.清除 ()
json数组.清空 ()
.如果真 (off = -1) ' 被禁止登录
接口.回复JSON (“您被禁止登录”, 400, , 假, 真)
.如果真结束
' ====判断有没有后台登录权限===表 e_config class=2
接口.数据库_查询 (json数组, “SELECT * FROM `” + #表_系统 + “` WHERE `key` = '后台登录权限'”, ) ' 如果数据库改了这个字段‘后台登录权限’ 这里也要跟着改变
json.解析 (json数组.到JSON (), , )
' 调试输出 (json数组.到JSON ())
array = 分割文本 (json.取通用属性 (“[0].value”, ), “,”, )
调试输出 (array)
login_ture = 假
json.清除 ()
json数组.清空 ()
.计次循环首 (取数组成员数 (array), i)
.如果真 (array [i] = fid) ' 运行登录后台
login_ture = 真
.如果真结束
.计次循环尾 ()
.如果真 (login_ture = 假) ' 被禁止登录
接口.回复JSON (“您没有后台登录权限”, 400, , 假, 真)
.如果真结束
' ====开始处理cookie
access_token = 取数据摘要 (到字节集 (username + “/*lUs-” + password + “/time=” + 时间_取现行时间戳 ()))
logintime = 时间_取现行时间戳 ()
.如果真 (接口.数据库_执行SQL (“UPDATE `e_user` SET `token` = '” + access_token + “',`logintime` = '” + logintime + “' WHERE `username` = '” + username + “';”, , , , , ) = 真) ' 修改token
接口.置Cookie (“user_name”, username, , , , )
接口.置Cookie (“user_id”, uid, , , , )
接口.置Cookie (“access_token”, access_token, , , , )
json对象.置文本 (“user_id”, uid, )
json对象.置文本 (“user_name”, username, )
json对象.置文本 (“access_token”, access_token, )
接口.回复JSON (“登入成功”, 0, json对象, 真, 真)
.如果真结束
接口.回复JSON (“登入失败”, 400, json对象, 假, 真)
.默认
.判断结束
接口.回复JSON (“成功”, 0, , 真, 真)
返回 (真)
在 子程序 ‘接口_前全局接口’ 处判断下是否取到access_token 如有验证通过跳转到管理员主页,认证不通过则回到登录页
.版本 2
.支持库 spec
.子程序 接口_前全局接口, 逻辑型
.参数 指针
.局部变量 接口, CC接口
.局部变量 路由, 文本型
.局部变量 access_token, 文本型
.局部变量 json数组, json数组
.局部变量 json对象, json对象
.局部变量 json, 类_json
取回接口 (指针, 接口)
路由 = 接口.取地址 ()
access_token = 接口.取Cookies (“access_token”)
调试输出 (“前全局接口”, 路由, access_token)
.如果 (access_token = “”)
json对象.置文本 (“titel”, “当前未登录”, )
json对象.置文本 (“center”, “倒计时结束后,将跳转到登录页面”, )
json对象.置文本 (“url”, “/admin/login”, ) ' 预跳转的地址
json对象.置文本 (“ms”, “3”, ) ' 倒计时
接口.回复模板 (“/page/redirect.html”, json对象)
.否则
接口.数据库_查询 (json数组, “SELECT * FROM `e_user` WHERE `token` = '” + access_token + “'”, )
json.解析 (json数组.到JSON (), , )
.如果真 (json.取通用属性 (“[0].token”, ) ≠ access_token) ' 这里是个很严重的问题
json对象.置文本 (“titel”, “当前登录失效”, )
json对象.置文本 (“center”, “倒计时结束后,将跳转到登录页面”, )
json对象.置文本 (“url”, “/index/login”, ) ' 预跳转的地址
json对象.置文本 (“ms”, “3”, ) ' 倒计时
接口.回复模板 (“/redirect”, json对象)
.如果真结束
.判断开始 (路由 = “/admin/login”)
.默认
.判断结束
' 鉴权通过,可以正常访问其他接口
.如果结束
返回 (真)
结束
至此一个简单的后台登录功能完成!参考附件消化,前端登录也是异曲同工
效果图
每个章节的学习资料我也会在交流群里发布
下章处理下,普通用户/管理员的权限控制