写篇文章让自己清楚egg——(5)登录持久化实现

746 阅读3分钟

前面我们学习egg项目初始化+egg资源路由+egg请求参数处理+egg使用cookie,现在我们可以结合所学实现一个持久化的web小项目。这是一个阶段性实践。

从零开始搭建前后端

1.初始化egg项目

找到合适本地路径,使用终端依次执行下面代码完成初始化:

    cnpm init egg --type=simple
    //下面的指令要进入init文件夹后在执行,init才是项目代码所在。
    cnpm i
    //启动成功后点击终端提供的访问地址显示hi, egg,则初始化成功。
    npm run dev

2.设置主机名和端口

找到config.default.js文件(config文件夹中)配置端口号和主机名:(添加进config对象内)

    cluster: {
      listen: {
        port: 80,
        hostname: 'juejinlogin.com',
      },
    },

找到host文件添加ip映射信息:

你的ip地址 juejinlogin.com

这里配置好默认端口号80和主机名后我们重启egg服务器( Ctrl+C 终端egg服务器),向浏览器地址栏输入 juejinlogin.com/ ,得到 hi, egg 的默认页面信息。

3.创建静态登录网页

我们在app文件夹下的public文件夹内创建新的html静态网页,用于发起登录。

    <form action="" onsubmit="login(event)">
        <label for="">账号<input type="text" id="name"></label>
        <label for="">密码<input type="password" id="pwd"></label>
        <input type="submit" id="btn" value="登录">
    </form>
    <script>
        function login(event){
            event.preventDefault();//阻止表单默认submit事件
            let name = document.querySelector('#name').value;
            let pwd = document.querySelector('#pwd').value;
            let xhr = new XMLHttpRequest()
            xhr.open('post','http://juejinlogin.com/login')
            xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded')
            xhr.timeout = 5000;//超时时间
            xhr.onload=()=>{
                console.log('接收到服务器响应');
                console.log(JSON.parse(xhr.responseText));
            }
            xhr.onerror=()=>{
                console.log('请求失败')
            }
            xhr.send(`name=${name}&pwd=${pwd}`);
        }
    </script>

配置请求跨域

4.配置登录请求路由

router.js文件内添加新的路由配置,注意是post。

module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
  router.post('/login', controller.login.index);
};

5.配置cors和CSRF插件

因为egg-security是内置的所以不需要安装且自动启用,所以我们要需要先手动下载和启动egg-cors

安装和启用egg-cors插件(一个终端指令,一个是plugin.js内要添加的配置)

cnpm i egg-cors --save
  cors: {
    enable: true,
    package: 'egg-cors',
  },

config.default.js文件中添加关于egg-securityegg-cors插件的配置。

  config.security = {
    csrf: {
      enable: false,
      ignoreJSON: true,
    },
    domainWhiteList: [ '*' ],
  };
  config.cors = {
    origin: '*',
    allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH',
  };

验证登录并持久化

6.处理参数添加cookie

创建login.js(前面路由也暗示),写入包含对参数的处理,对cookie的处理:

...
class LoginController extends Controller {
  async index() {
    const { ctx } = this;
    console.log(ctx.request.body);
    console.log(ctx.cookies.get('name', {
      signed: false,
    }));
    ctx.cookies.set('name', ctx.request.body.name, {
      maxAge: 100000,
      httpOnly: false,
      signed: false,
      encrypt: false,
      domain: 'juejinlogin.com',
    });
    ctx.cookies.set('pwd', ctx.request.body.pwd, {
      maxAge: 100000,
      httpOnly: false,
      signed: false,
      encrypt: false,
      domain: 'juejinlogin.com',
    });
    ctx.body = {
      data: 'ok',
    };
  }
}

module.exports = LoginController;

此刻重启egg服务器,通过服务器静态资源路径打开public中的login网页。juejinlogin.com/public/logi… ,然后我们可以看到项目已经成型。

  • post请求和响应成功

image.png

  • cookie信息客户端展示成功

image.png

  • post参数和cookie信息服务端展示成功(cookie.get在第二次才会有值,因为第一次cookie还没创建,也说明了第二次的cookie值是http请求携带而来的

image.png

如果没有问题,请给自己一次掌声。

7.添加登录状态逻辑(客户端和服务端)

具体的需求就是模仿主流设计,添加一个用户信息展示在网页内,会根据cookie信息进行渲染,没有就是未登录,有就是登录。因为cookie是本地缓存,所以我们可以关闭页面再次打开静态路由下的该网页,此时按照设计就应该是显示登录状态

向浏览器添加结构和逻辑代码(整体更新代码如下)

    <form action="" onsubmit="login(event)">
        <label for="">账号<input type="text" id="name"></label>
        <label for="">密码<input type="password" id="pwd"></label>
        <input type="submit" id="btn" value="登录">
    </form>
    <div class="login">
    </div>
    <script>
        function login(event){
            event.preventDefault();
            let name = document.querySelector('#name').value;
            let pwd = document.querySelector('#pwd').value;
            let xhr = new XMLHttpRequest()
            xhr.open('post','http://juejinlogin.com/login')
            xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded')
            xhr.timeout = 5000;
            xhr.onload=()=>{
                console.log('接收到服务器响应');
                console.log(JSON.parse(xhr.responseText));
                show();
            }
            xhr.onerror=()=>{
                console.log('请求失败')
            }
            xhr.send(`name=${name}&pwd=${pwd}`);
        }
        setTimeout(show, 100);
        function show(){
            let name = document.cookie
            if(name.includes('name'))
                name = `用户${name.replace(/[^]*name=/,'').replace(/;[^]*/,'')}已登录`
            else
                name=`未登录`
            document.querySelector('.login').innerHTML=name
        }
    </script>

8.效果展示:

  • 初始状态

image.png

  • 登录状态

image.png

  • 登录持久化(刷新页面或关闭重新打开)

image.png

完成持久化的项目,接下来的学习中我们将实现关联数据库操作。