从 PHP 到 AI + Golang,程序员自救转型手记(十四):眨眼小人登录页制作
这是一个系列教程作者将以一个 PHP 全栈工程师的身份利用 AI 工具claude code、codex、deepseek、豆包等从零开始学习 golang 语言并最终完成 ai-go-mall 项目的制作。在上一期我们已经完成 “前端路由初始化”本期将完成眨眼小人登录页制作静态登录页制作我们之前已经建立了空白的//views/admin/login.vue登录页 vue 组件并将其注册为了静态路由import{adminBaseRoutePath}from//router/static/adminBaseconststaticRoutes:ArrayRouteRecordRaw[// ...{// 管理员登录页 - 路由不放在 adminBaseRoute.children 因为登录页不需要使用后台的布局path:adminBaseRoutePath/login,name:adminLogin,component:()import(//views/admin/login.vue),meta:{title:pageTitles.Login,},},// ...]接下来先让 cc 实现登录页面的制作之前在网上关注到一款左边三个小人右边表单带交互的开源登录页还不错将https://gitee.com/niumg9527/login-animation的开源登录页移植至 src\views\admin\login.vue✅ 移植完成 已将开源登录动画页的核心功能移植至 src/views/admin/login.vue编译通过。以下是实现概览 实现的交互特性 ┌───────────────────┬───────────────────────────────────────────────────────────────────┐ │ 特性 │ 实现方式 │ ├───────────────────┼───────────────────────────────────────────────────────────────────┤ │ 眼睛跟随鼠标 │ mousemove → 视口坐标转 SVG viewBox 坐标 → Math.atan2 计算瞳孔偏移 │ ├───────────────────┼───────────────────────────────────────────────────────────────────┤ │ 随机眨眼 │ setTimeout 随机间隔2~6s25% 概率双眨CSS scaleY 动画 │ ├───────────────────┼───────────────────────────────────────────────────────────────────┤ │ 密码聚焦遮眼 │ 手臂 SVG path 双套切换opacity 过渡角色遮住眼睛 │ ├───────────────────┼───────────────────────────────────────────────────────────────────┤ │ 密码可见时偷看 │ 粉色角色倾斜 右臂半透明 │ ├───────────────────┼───────────────────────────────────────────────────────────────────┤ │ 输入时表情变化 │ 嘴巴 d 属性根据 focusedField 动态计算 │ ├───────────────────┼───────────────────────────────────────────────────────────────────┤ │ 校验失败摇头 │ translateX 关键帧动画500ms │ ├───────────────────┼───────────────────────────────────────────────────────────────────┤ │ 响应式 │ ≤768px 隐藏左侧动画面板表单全宽 │ └───────────────────┴───────────────────────────────────────────────────────────────────┘ 文件清单 src/views/admin/login.vue# 登录页组件模板 脚本 样式src/lang/zh-cn/login.ts# 中文翻译src/views/admin/login.vue# 登录页组件模板 脚本 样式src/lang/zh-cn/login.ts# 中文翻译src/lang/en/login.ts# 英文翻译架构说明 - SVG 角色两个卡通角色蓝色左和粉色右包含身体、呆毛、腮红、脚、手臂、眼睛巩膜 瞳孔 高光 - 状态驱动focusedField / showPassword / isBlinking / isShaking 驱动所有动画 - Element Plus 表单用户名 密码带前缀图标和校验规则 - 待接入onLogin 中的 TODO 标记处替换为实际 API 调用 ✻ Cogitatedfor5m 24scc 刚开始无法访问 gitee然后自动尝试了 github、csdn 等都失败了自己用了网页搜索搓出来的版本如下说实话挺 low 的实际体验中也发现了动画效果一般缺乏细节等问题这里再次让它直接使用 git clone 把示例项目拉下来参考已按原始项目精确重写 成功gitclone 了 niumg9527/login-animation 仓库获取到全部4个源文件并据此完全重写了 login.vue。 原始项目 vs 当前实现对照 ┌────────────────────────┬────────────────────────────────────────────┐ │ 原始文件 │ 当前实现 │ ├────────────────────────┼────────────────────────────────────────────┤ │ LoginPage.vue │ 主模板左右两栏布局 Element Plus 表单 │ ├────────────────────────┼────────────────────────────────────────────┤ │ AnimatedCharacters.vue │ 角色容器 全部动画逻辑在同一组件内 │ ├────────────────────────┼────────────────────────────────────────────┤ │ EyeBall.vue │ .eyeball .pupil-inner CSS 类内联实现 │ ├────────────────────────┼────────────────────────────────────────────┤ │ Pupil.vue │ .pupil-dot CSS 类内联实现 │ └────────────────────────┴────────────────────────────────────────────┘4个角色CSS div非 SVG ┌────────┬─────────┬──────────────────────────────────────────────────┐ │ 角色 │ 颜色 │ 实现 │ ├────────┼─────────┼──────────────────────────────────────────────────┤ │ Purple │#6C3FF5 │ 180×400px2 个 EyeBall白眼球 瞳孔可眨眼 │├────────┼─────────┼──────────────────────────────────────────────────┤ │ Black │#2D2D2D │ 120×310px2 个 EyeBall可眨眼 │├────────┼─────────┼──────────────────────────────────────────────────┤ │ Orange │#FF9B6B │ 240×200px 半圆2 个 Pupil纯瞳孔 │├────────┼─────────┼──────────────────────────────────────────────────┤ │ Yellow │#E8D754 │ 140×230px 半圆2 个 Pupil 嘴巴 │└────────┴─────────┴──────────────────────────────────────────────────┘ 交互状态机与原始一致 正常 → 输入用户名(isTyping)→ leaning 对视 800ms → 输入密码(hasSecret,!visible)→ leaning → 密码可见(hiding)→ 角色归正无倾斜 遮眼 → Purple 随机偷看 - 瞳孔追踪rAF 循环内直接操作 DOM style.transform不触发 Vue 响应式与原始一致性能最优 - 身体倾斜skewX translateX 跟随鼠标通过 Vue computed styles 响应式更新 - 随机眨眼Purple/Black 各自独立定时器2~6s 随机间隔 - 偷看密码可见时 Purple 角色2~5s 后偷看 800ms瞳孔偏移 4px ✻ Cogitatedfor3m 50s这一次效果非常棒如下而且左边的 4 个角色全部都是用 div css 画的并未使用图片接下来是人工 review先找找明显的问题让 ai 继续改第一轮body 元素自带 8px于 src\styles 建立 app.scss 文件去除所有标签的默认 margin、padding于 src\styles 建立 index.scss 文件其中引用 app.scss随后在 main.ts 导入 index.scss后续增加全局样式只需要在 index.scss 中引用即可密码输入框的 visible-change“onPasswordVisibleChange” 是无效的需改用其他写法输入框下面提交按钮上面增加 “记住 30 天” 选项第二轮调淡 “记住 30 天” 的文字和多选框颜色同账号输入框边框颜色一致去除 errorMsg后续该报错由接口返回无需前端管理为账号密码输入框绑定 ref如果初始化后账号无值则自动聚焦账号输入框密码无值则自动聚焦密码输入框密码输入框的显示状态不再使用自定义插槽 suffix 实现而是直接判断 inputRef.value?.passwordVisible 是值即可可以使用 computed 包装它手动优化了一些细节比如 css 代码中.submit-btn { width: 100%; } :deep(.el-button--large) { border-radius: 6px; font-size: 16px; height: 48px; } // 可优化为 .submit-btn { width: 100%; --el-font-size-base: var(--el-font-size-medium); --el-button-size: 48px; }最终效果如下页面刷新后鼠标未动时角色看向页面正中间4个角色眼睛跟随鼠标转动输入框聚焦时紫色和黑色角色对视切换密码隐藏显示时所有角色眼神转向紫色角色偶尔偷看偶尔眨眼…最终核心代码如下template div classlogin-page !-- 左侧角色动画面板 -- div classleft-panel :style{ background: linear-gradient(135deg, ${primaryColor}e6, ${primaryColor}, ${primaryColor}cc) } !-- 站点名称 -- div classsite-name spanAI GO MALL/span /div !-- 角色区域 -- div classcharacters-area div classcharacters-container !-- Purple 角色 -- div refpurpleRef classchar purple :stylepurpleBodyStyle div classeyes :stylepurpleEyesStyle div v-fori in 2 :keype i :ref(el) setEyeRef(el as HTMLElement, purple, i - 1) classeyeball :class{ blinking: isPurpleBlinking } >

相关新闻