【橙子日记21】从零开始的毕业设计

更新时间:2021年2月4日

设计登入页面
要求:

  1. 主题为黑蓝色
  2. 响应式布局
  3. 登入,注册,忘记密码3个页面
  4. 验证码功能
  5. 邮箱功能
  6. 方框采用尖脚,不需要圆弧
    成果:
    由于这种登入注册之类的界面网络上多如牛毛,我们只需面向复制粘贴的编程即可
    但前提是要完全理解,能随意修改
    登入界面:
    在这里插入图片描述

注册界面:
在这里插入图片描述
忘记密码界面:
在这里插入图片描述
目前这3个还是静态网页
整体为暗黑色的主题,鼠标悬浮有变蓝色的特效

另外声明:
本系统不用于任何商业行为(那不废话)
最终目的是写出一篇论文
论文第一版名字我都想好了:

《基于.Net5与Vue的深度分布式集群跨平台的作业管理系统》

感觉是要高大尚了一些,但是总感觉不是很满意
我网上找了很多,有一种格式很装逼:

《在XXXX概念下的XXXX的XXXX系统》

于是我的第二版论文名字:

《在深度分布式集群模式下实现基于.Net5与Vue的跨平台作业管理系统》

emmm怎么说了,感觉还是不要太满意哈哈哈
取名先不急,我们跨平台和分布式集群还没弄呢!

好像扯远了
继续页面

Vue前端
将静态页面改造加入前端
这里记得要改几个点
由于自带的css和bootstrap有一些冲突
我们需要对他进行改名

  • main改为main2
  • btn改为mbtn
  • app改为app2

后来我又看到页面字体有点不适应
加上

html {
    font-size: 80%
}

修改过后的登入页面代码

<template>
  <div id="app2" class="login">

      <div class="single-bg"></div>
      <div class="notify-container"></div>
      <div class="main2 padding-limiter">
        <div class="panel login-panel">
          <div class="double-column">
            <img
              class="panel-wide login-img"
              src="../../public/images/baner.jpg"
            />
            <div class="panel-narrow" id="p-login">
              <div class="title">超越 登录</div>
              <div class="control-group">
                <label>账 户</label>
                <div class="controls">
                  <input
                    v-model="ruleForm.username"
                    id="username"
                    type="text"
                    placeholder="用户名/邮箱/手机号"
                    title="账户"
                  />
                </div>
              </div>
              <div class="control-group">
                <label>密 码</label>
                <div class="controls">
                  <input
                    v-model="ruleForm.pwd"
                    id="password"
                    type="password"
                    title="密码"
                  />
                </div>
              </div>
              <div class="control-group">
                <label>验证码</label>
                <div class="controls">
                  <input
                    id="code"
                    type="text"
                    placeholder="邮件验证码"
                    maxlength="6"
                    title="验证码"
                  />
                  <button class="btn btn-code" id="send">获取</button>
                </div>
              </div>
              <div style="text-align: right">
                <label>
                  <a href="./register.html">注册</a>
                  <a
                    href="./reset_password.html"
                    style="margin: 0 60px 0 8px"
                    class="wtf-fix"
                    >忘记密码?</a
                  >
                </label>
              </div>
              <div class="actions">
                <button @click="submitForm" class="mbtn mbtn-my" id="login">
                  登录
                </button>
              </div>
            </div>
            <div class="panel-narrow" id="p-2fa" style="display: none">
              <div class="title">两步验证</div>
              <div class="control-group">
                <label>代码</label>
                <div class="controls">
                  <input id="2fa" type="text" title="两步验证代码" />
                </div>
              </div>
              <div class="actions">
                <button class="btn" id="login_2fa">提交</button>
              </div>
            </div>
            <div class="panel-narrow" id="p-u2f" style="display: none">
              <div class="title">:)</div>
              <div
                id="u2f_status"
                style="text-align: center; margin-right: 15px"
              ></div>
            </div>
          </div>
        </div>
      </div>

  </div>
</template>
<script>
import account from "@/api/account";
export default {
  data() {
    return {
      ruleForm: {
        username: "",
        pwd: "",
      },
      // rules: {
      //   username: [
      //     { required: true, message: "用户名不能为空", trigger: "blur" },
      //     {
      //       min: 2,
      //       max: 20,
      //       message: "长度在 2 到 20 个字符",
      //       trigger: "blur",
      //     },
      //   ],
      //   pwd: [
      //     { required: true, message: "密码不能为空", trigger: "blur" },
      //     {
      //       min: 6,
      //       max: 20,
      //       message: "长度在 6 到 20 个字符",
      //       trigger: "blur",
      //     },
      //   ],
      // },
    };
  },
  methods: {
    submitForm() {
      // this.$refs[formName].validate((valid) => {
      //   if (valid) {
          account.login(this.ruleForm).then((response) => {
            const resp = response.data;
            if (resp.flag) {
              localStorage.setItem("logged", resp.data);
              this.$notify({
                title: "成功",
                message: resp.message,
                type: "success",
              });
              this.$router.push("/");
            } else {
              this.$notify.error({
                title: "错误",
                message: resp.message,
              });
            }
          });
        // } else {
        //   this.$notify.error({
        //     title: "错误",
        //     message: "请合理输入",
        //   });
        // }
      // });
    },
    resetForm(formName) {
      this.$refs[formName].resetFields();
    },
  },
};
</script>
<style scoped>
@import "../../public/css/base.min.css";
</style>

静态文件应该放到assets里面
但是我个人习惯放public比较舒服

public中的文件,是不会经过编译的,打包后会生成dist文件夹,public中的文件只是复制一遍。因此,public建议放一些外部第三方,自己的文件放在assets,别人的放public中

这里规则我给它删除了,感觉风格和现在页面实在不搭
还有一点别忘了
在这里插入图片描述
注册和忘记密码跳转路由,由于样式原因,我把路由套在了外面

相应的,把注册和忘记密码页面改过去
还有一点要注意
在这里插入图片描述
使用原生的js进行跳转,会刷新页面,页面会有明显的闪烁的感觉
要使用我们的跳转路由方式
即:
在这里插入图片描述
3个页面都弄完了
内部页面也稍微优化了一下
由于我们是vue,路由跳转没有闪烁,非常的流畅,很是舒服
用户体验,很高

登入失败:
在这里插入图片描述
登录成功:
在这里插入图片描述
啊,整体丢舒服多了
关于验证码和邮箱,我们一步一步来搞
现在搞一下前端访问权限问题

默认,我们输入网址是不会加/login的
举个栗子:www.xxx.com如果为检测未登入的话,要自动跳转到www.xxx.com/login
另外,如果cookies存储了,或者session,那就直接进行主页面,不需要登入

这里我们使用前端管道来弄

前端访问权限
添加js文件
在这里插入图片描述
内容:

import router from './router/index'
router.beforeEach((to, from, next) => {
    const logged = localStorage.getItem("logged") //获取是否登入
    if (!logged) { //如果没有登入
        if (to.path !== '/login' || to.path !== '/register' || to.path !== 'reset_password') { //除去这个几个页面其他都返回到login
            next({ path: '/login' })
        } else { //添加一个结束条件,不然死循环
            next()
        }
    } else { //如果已经登入,那随便跳转
        next()
    }
})

另外在main中进行导入:
在这里插入图片描述
效果:
在这里插入图片描述
我就知道,蹦了,死循环了
又要开始修bug了

修bug:
用alert修bug最好不过了
在这里插入图片描述
看看会弹出什么
实验只弹出了1,2
这和我们想要的不一样,没有走到3去
那就会死循环
奇怪的出现了,我把这个删掉
在这里插入图片描述
于是成了

啊这???
是我自己把自己绕晕了
这个地方其实要用且运算。。。。
我们干脆改写一下,把非运算搞掉

import router from './router/index'
router.beforeEach((to, from, next) => {
    const logged = localStorage.getItem("logged") //获取是否登入
    if (!logged) { //如果没有登入
        if (to.path == '/login' || to.path == '/register' || to.path == '/reset_password') {
            next()
        } else {
            next({ path: '/login' })
        }
    } else { //如果已经登入,那随便跳转
        next()
    }
})

ok,这样就没有问题了

最后思考一点
这样弄,其实还是有问题,问题就出在保存时间问题
前端的本地存储是永久保存
后端的session默认是保存20分钟
如果当你session过期了,而本地存储没有过期
那就完蛋
会导致前端一样访问,而后端拒绝

针对这个情况,应该在每次进入内容页面的时候进行一次交互
看看后端还存不存在session
如果不存在,跳转到login页面

后端添加api
在这里插入图片描述
前端添加api:
在这里插入图片描述
前端
最后调试进行使用
很遗憾,还是出现了一点问题
如果后端的session过期了,确实有变化,但是也不会跳转到登入路由上
在这里插入图片描述
我们一样进行测试
发现alert(0)运行不到这里
这个意味着那个提示的问题
最后测试一下,果然是那个问题!
坑:这里不能放其他代码
最终成型代码

import router from './router/index'
import accountAPI from '@/api/account'
router.beforeEach((to, from, next) => {
    const logged = localStorage.getItem("logged") //获取是否登入
    if (!logged) { //如果没有登入
        if (to.path == '/login' || to.path == '/register' || to.path == '/reset_password') {
            next()
        } else {
            next({ path: '/login' })
        }
    } else { //如果已经登入,就要询问后端会话是否存在
        accountAPI.logged().then(response => {
            const resp = response.data;
            if (resp.flag) { //如果后端会话也存在,那就不管
                next()
            } else { //如果后端会话不存在,清除前端存储并且跳转到登入界面
                localStorage.clear()
                alert("登入已超时,请重新登入")
                next({ path: '/login' })
            }
        })
    }
})

ok,完美,关于前端权限问题的模块,已经全部解决了!

最后
到这里了
关于分数模块,我想了很久,有很多方法实现,我要选一个最好的才行,思路基本已经差不多,下几次把坑给它填了

登入这一块,还差验证码和邮箱
验证码还好说,邮箱就有点麻烦了,(之前频繁用邮箱做实验发,一次性发个几十条,就被和谐掉了,我得想想办法,不会被和谐掉)

关于分布式集群和跨平台:
分布式集群我接触过,如果具体放到本系统来,可能会有一点难度,不过慢慢来吧
跨平台不难,我已经对linux有一定的基础,之前也成功过跨平台很多项目,个人认为,难点不在linux,在于nginx和mysql

(最近不知道为什么突然看的人多了起来,希望能给你们学到点东西吧,把走过的坑,给你们填一下)
我们下期再见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值