前端案例:简易登录表单的制作,包括用户名、密码、随机验证码(代码完整,复制即用)

举报
敬 之 发表于 2022/04/16 01:17:44 2022/04/16
【摘要】 案例效果         本案例基于 vue.js 和  Element UI 实现。随机验证码采用 DOM 操作和 canvas 绘制,可随机生成和刷新;后续程序逻辑直接填入方法即可。 Element UI 下载安装 //n...

案例效果

        本案例基于 vue.js 和  Element UI 实现。随机验证码采用 DOM 操作和 canvas 绘制,可随机生成和刷新;后续程序逻辑直接填入方法即可。


Element UI 下载安装


  
  1. //npm安装element
  2. npm i element-ui -S
  3. //vue项目中全局引入 src/main.js中
  4. import ElementUI from 'element-ui';
  5. Vue.use(ElementUI);

        element ui 的使用方式参见官网:Element - The world's most popular Vue UI frameworkElement,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.eleme.cn/#/zh-CN

完整代码+详细注释


  
  1. <template>
  2. <div>
  3. <div class="login">
  4. <p>登录表单</p>
  5. <div class="form">
  6. <!--用户名-->
  7. <div class="userAndPass">
  8. <el-input class="txt" v-model="user" placeholder="用户名"></el-input>
  9. </div>
  10. <!--密码-->
  11. <div class="userAndPass">
  12. <el-input class="txt" type="password" v-model="pwd" placeholder="密码"></el-input>
  13. </div>
  14. <!--验证码-->
  15. <div class="userAndPass">
  16. <el-input class="txt" type="text" v-model="code" placeholder="验证码"></el-input>
  17. </div>
  18. <!--验证码区域-->
  19. <div id="codeBox">
  20. <canvas width="112" height="38" id="verifyCanvas"></canvas>
  21. </div>
  22. <!--验证码生成的图片-->
  23. <img id="code_img" @click="refreshCode">
  24. <div style="display: flex;">
  25. <!--记住密码-->
  26. <div class="remember" @click="rem">
  27. <img v-show="isRem" src="/static/login_new1/Select%20Reveal.png" alt="">
  28. <div v-show="notRem"
  29. style="width: 0.2rem;height: 0.2rem;background-color: white;border-radius: 50%;margin-right: 0.05rem"></div>
  30. 记住密码
  31. </div>
  32. <!--登录按钮-->
  33. <div class="btn" @click="login">
  34. <p>登录</p>
  35. </div>
  36. </div>
  37. <p @click="forget" class="forget">忘记密码?</p>
  38. </div>
  39. </div>
  40. </div>
  41. </template>
  42. <script>
  43. export default {
  44. data() {
  45. return {
  46. user: '', //用户名
  47. pwd: '', //密码
  48. code: '', //用户输入的验证码
  49. rand: [], //随机生成的验证码
  50. isRem: false,//记住密码
  51. notRem: true, //不记住密码(默认此选项)
  52. codeList: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
  53. 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
  54. 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'], //随机验证码可选字母
  55. }
  56. },
  57. methods: {
  58. //点击登录
  59. login() {
  60. //验证码的验证
  61. var randStr = this.rand.toString().replace(/,/g, ""); //随机生成的验证码为数组形式,此处将其转为字符串并去掉中间相隔的逗号
  62. var codeStr = this.code; //用户输入的验证码
  63. if (randStr.toLowerCase() == codeStr.toLowerCase()) { //比较用户输入的与随机生成的验证码,不区分大小写
  64. this.$message.success('验证码正确,可正常登录')
  65. } else {
  66. this.$message.error('请输入正确的验证码');
  67. }
  68. //点击登录后的程序逻辑...
  69. },
  70. //是否记住密码
  71. rem() {
  72. //记住密码
  73. if (this.notRem == true) {
  74. this.notRem = false;
  75. this.isRem = true;
  76. //...
  77. } else {
  78. //不记住密码
  79. this.notRem = true;
  80. this.isRem = false;
  81. //...
  82. }
  83. },
  84. //忘记密码
  85. forget() {
  86. console.log("忘记密码");
  87. //忘记密码后的程序逻辑...
  88. },
  89. //绘制验证码
  90. drawCode() {
  91. //获取canvas画布
  92. var canvas = document.getElementById('verifyCanvas');
  93. var context = canvas.getContext('2d');
  94. //填充画布
  95. context.fillStyle = 'cornflowerblue';
  96. context.fillRect(0, 0, canvas.width, canvas.height);
  97. //创建渐变
  98. var gradient = context.createLinearGradient(0, 0, canvas.width, 0);
  99. gradient.addColorStop('0', 'yellow');
  100. gradient.addColorStop('0.5', 'black');
  101. gradient.addColorStop('1.0', 'red');
  102. //字体
  103. context.fillStyle = gradient;
  104. context.font = '30px Arial';
  105. //验证码的位置
  106. var x = [];
  107. var y = [];
  108. for (let i = 0; i < 4; i++) {
  109. this.rand[i] = this.codeList[Math.floor(Math.random() * this.codeList.length)];
  110. x[i] = i * 26 + 10;
  111. y[i] = 30;
  112. context.fillText(this.rand[i], x[i], y[i])
  113. }
  114. //绘制若干随机点
  115. for (let i = 0; i < 20; i++) {
  116. this.drawDot(canvas, context)
  117. }
  118. this.convertCanvasToImage(canvas);
  119. console.log(this.rand);
  120. },
  121. drawDot(canvas, context) {
  122. var px = Math.floor(Math.random() * canvas.width);
  123. var py = Math.floor(Math.random() * canvas.height);
  124. context.moveTo(px, py);
  125. context.lineTo(px + 1, py + 1);
  126. context.lineWidth = 0.2;
  127. context.stroke()
  128. },
  129. //绘制图片
  130. convertCanvasToImage(canvas) {
  131. document.getElementById('verifyCanvas').style.display = 'none';
  132. var image = document.getElementById('code_img');
  133. image.src = canvas.toDataURL('image/png');
  134. return image
  135. },
  136. //刷新验证码
  137. refreshCode() {
  138. var renew = document.getElementById('codeBox');
  139. var codeObj = document.getElementById('verifyCanvas');
  140. renew.removeChild(codeObj);
  141. var canvas = document.createElement('canvas');
  142. canvas.width = '112';
  143. canvas.height = '38';
  144. canvas.id = 'verifyCanvas';
  145. renew.appendChild(canvas);
  146. this.drawCode()
  147. }
  148. },
  149. mounted() {
  150. //调用绘制方法
  151. this.drawCode();
  152. this.refreshCode()
  153. }
  154. }
  155. </script>
  156. <style scoped>
  157. .login {
  158. background-color: #3a92a4;
  159. border: 2px solid black;
  160. border-radius: 10px;
  161. width: 5.5rem;
  162. height: 5.4rem;
  163. margin: auto;
  164. }
  165. .login > p {
  166. float: left;
  167. color: white;
  168. font-family: "Agency FB";
  169. font-size: 25px;
  170. font-weight: bolder;
  171. margin: 15px 15px;
  172. }
  173. /*表单区域*/
  174. .form {
  175. width: 80%;
  176. height: 90%;
  177. margin: 1.1rem auto;
  178. }
  179. .form .userAndPass {
  180. margin-bottom: 0.5rem;
  181. }
  182. /*验证码图片*/
  183. .form #code_img {
  184. position: absolute;
  185. top: 4.31rem;
  186. width: 1.1rem;
  187. height: 0.5rem;
  188. border: 1px solid #7EDDB4;
  189. left: 10.63rem;
  190. cursor: pointer;
  191. background-color: #E6F9F2;
  192. border-radius: 5px;
  193. }
  194. .userAndPass .txt /deep/ .el-input__inner {
  195. border-radius: 5px !important;
  196. height: 0.6rem;
  197. }
  198. /*记住密码*/
  199. .remember {
  200. cursor: pointer;
  201. width: 50%;
  202. display: flex;
  203. font-family: SourceHanSansCN-Regular;
  204. font-size: 14px;
  205. color: #FFFFFF;
  206. letter-spacing: 1.29px;
  207. font-weight: 400;
  208. margin: auto;
  209. line-height: 0.2rem;
  210. }
  211. .remember img {
  212. width: 0.2rem;
  213. height: 0.2rem;
  214. vertical-align: middle;
  215. margin-right: 0.05rem;
  216. }
  217. /*登录按钮*/
  218. .btn {
  219. cursor: pointer;
  220. width: 65%;
  221. height: 0.6rem;
  222. text-align: center;
  223. position: relative;
  224. display: flex;
  225. font-family: SourceHanSansCN-Bold;
  226. font-size: 20px;
  227. color: #FFFFFF;
  228. letter-spacing: 2.85px;
  229. background-color: #4ec5f0;
  230. border-radius: 5px;
  231. }
  232. .btn p {
  233. margin: auto;
  234. line-height: 0.6rem;
  235. }
  236. .btn img {
  237. width: 0.15rem;
  238. height: 0.15rem;
  239. vertical-align: middle;
  240. margin-left: 0.4rem;
  241. }
  242. .forget {
  243. cursor: pointer;
  244. font-family: SourceHanSansCN-Regular;
  245. font-size: 12px;
  246. color: #FFFFFF;
  247. letter-spacing: 1.12px;
  248. text-align: right;
  249. margin-top: 0.09rem;
  250. }
  251. </style>

文章来源: majinjian.blog.csdn.net,作者:Developer 小马,版权归原作者所有,如需转载,请联系作者。

原文链接:majinjian.blog.csdn.net/article/details/122349649

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。