iView实现简单的登录注册+浏览器上传文件

登录注册

因为软工大作业的需要,实现了简单的登录注册功能。

下面是登录前端代码:

<Input type="text" placeholder="请输入用户名" v-model="username" style="width: 300px" />
<Input  password  type="password" placeholder="请输入密码"  v-model="password"
        style="width: 300px"    @on-enter="login"/>
<Button type="success" v-on:click="login">登录</Button>

login函数如下:

login() {
      if (this.username == "" || this.password == "") {
        this.$Message.warning("请输入用户名或密码");
      } else {
        this.$Spin.show();
        var _this = this;
        api.user_login(this.username, this.password, function(response) {
          _this.$Spin.hide();
          if (response.code == 0) {
            _this.$Message.success("登录成功");
            _this.$router.push("/home");
          } else if (response.code == -101) {
            _this.$Message.error("用户名或密码不正确");
          } else {
            _this.$Message.error("未知错误");
          }
        });
      }
    }

其中user_login是一个用来前后端通信的api,使用http通信,传递用户名、加密的密码及后端服务器的返回信息。

在beta阶段,注册添加了邮箱验证的功能:

 <Input  type="text" placeholder="请输入用户名" v-model="newUsername" style="width: 300px"
      @on-blur="check_username" />

      <br />
      <br />
      <Input type="text" placeholder="请输入邮箱" v-model="email" style="width:300px"
       @on-blur="check_email"/>
      <br />
      <br />
      <Tooltip content="至少6位,只能为字母数字.@#$-" placement="left" theme='light'>
        <Input
          type="password"
          placeholder="请输入密码"
          v-model="newPassword1"
          style="width: 300px"
          password
          @on-blur="check_password"
        />
      </Tooltip>
      <br />
      <br />
      <Input
          type="password"
          placeholder="确认密码"
          v-model="newPassword2"
          style="width: 300px"
          password
          @on-blur="check_password"

      />
      <br>
      <br>
      <Input type="text" placeholder="请输入收到的验证码" v-model="captcha" style="width:190px"
      @on-enter="register"/>
      <Button  v-if="butt1" type="info" style="width:110px" ghost @click="send_captcha" >发送验证码</Button>
      <Button  v-if="butt2" type="info" style="width:110px" ghost disabled>{{time_count}}秒后可重发</Button>
      <br>
      <br>
      <Button type="primary" v-on:click="register" >注册</Button>

效果如下:

浏览器上传本地文件

这里我使用了iView封装好的Upload组件,其底层是使用input实现的:

<Upload :before-upload="handleFiles" action="http" multiple ref="uploadFiles">
          <Button
            type="primary"
            style="border-radius: 0.4vh; margin: 0 auto; width:200px"
            :key="isWriteable"
            :disabled="!isWriteable"
          >上传文件到根目录...</Button>
</Upload>

其中,添加multiple属性可以支持一次性多文件上传,另外该组件可支持文件拖拽上传。

钩子函数handleFiles在点击上传后浏览器读取本地文件内容、获得上传文件名,并在后端创建同名文件,当冲突时报错。
效果如下:

为支持文件夹上传,我在网上查了很多资料,最后使用的vue-simple-uploader的uploader组件:

<uploader @file-success="handleFolder" duplicate="true" ref="uploadFolder">
          <uploader-drop>
            <uploader-btn :directory="true" >
              上传文件夹到根目录...
            </uploader-btn>
          </uploader-drop>
</uploader>

测试发现,该组件不可重复上传文件,必须刷新才可以,在组内lpx同学的帮助下,找到如下解决方法:

this.$refs.uploadFolder.uploader.cancel()

使用该语句来清除本页面的上传记录。

覆盖浏览器默认快捷键

开发过程中遇到这样一个问题,因为浏览器的tab快捷键行为,在input元素里输入tab会导致它失去焦点,且并没有在input里面输入tab,为了让input元素支持tab键输入不失去焦点,查阅很多资料,终于解决了这个需求:

<textarea ref="input" v-model="input"/>
<script>
this.$refs.input.onkeydown=(e)=>{     
      if(e.keyCode == 9){
        this.insertText(this.$refs.input,"\t")
         if(e.preventDefault) {
            e.preventDefault();
         }
      }
}

insertText(obj,str) {
    if (document.selection) {
        var sel = document.selection.createRange();
        sel.text = str;
    } else if (typeof obj.selectionStart === 'number' && typeof obj.selectionEnd === 'number') {
        var startPos = obj.selectionStart,
            endPos = obj.selectionEnd,
            cursorPos = startPos,
            tmpStr = obj.value;
        obj.value = tmpStr.substring(0, startPos) + str + tmpStr.substring(endPos, tmpStr.length);
        cursorPos += str.length;
        obj.selectionStart = obj.selectionEnd = cursorPos;
    } else {
        obj.value += str;
    }
}
</script>

this.$refs.input获取输入框元素,e表示键盘事件。

e.keyCode == 9当按下tab键时执行if语句,e.preventDefault()阻止tab键的默认行为,然后执行insertText函数获取光标位置并在光标后插入tab。

测试敲入tab,发现成功解决!

posted @ 2020-05-27 18:17  Zf_Wan  阅读(610)  评论(0编辑  收藏  举报