App Inventor 2 注册登录系统入门教程

基于网络微数据库,实现多用户注册、登录、记住密码、每日签到。

一、系统设计

1.1 数据结构

网络微数据库标签设计:
"userlist"          → ["张三","李四","王五"]     (所有用户名列表)
"user_张三"         → {"pwd":"加密密码","email":"...","created":"2026-03-26"}
"checkin_张三"      → ["2026-03-25","2026-03-26"]  (签到日期列表)

1.2 关键原则

⚠️ 网络微数据库是异步的! 存储/读取后不会立即生效,必须在事件回调中处理结果。

二、注册功能

2.1 注册流程

用户输入用户名+密码 → 检查用户名是否已存在 → 存储用户信息 → 跳转主界面

2.2 代码块

初始化全局变量 用户列表 = []
初始化全局变量 当前操作 = ""    // 标记当前是注册还是登录

// 屏幕初始化:加载用户列表
当 Screen1.初始化 时
  设置 全局变量 当前操作 = "加载用户列表"
  调用 网络微数据库1.获取值("userlist", "[]")

// 注册按钮
当 按钮_注册.被点击 时
  初始化局部变量 用户名 = 去除首尾空格(文本输入框_用户名.文本)
  初始化局部变量 密码 = 文本输入框_密码.文本
  初始化局部变量 确认密码 = 文本输入框_确认密码.文本
  
  // 输入验证
  如果 用户名 = "" 则
    调用 对话框1.显示消息对话框("用户名不能为空", "提示", "确定")
    返回
  如果 文本长度(密码) < 6 则
    调用 对话框1.显示消息对话框("密码至少6位", "提示", "确定")
    返回
  如果 密码 ≠ 确认密码 则
    调用 对话框1.显示消息对话框("两次密码不一致", "提示", "确定")
    返回
  
  // 检查用户名是否已存在
  如果 用户名 在列表中(全局变量 用户列表, 用户名) 则
    调用 对话框1.显示消息对话框("用户名已存在", "提示", "确定")
    返回
  
  // 执行注册
  设置 全局变量 当前操作 = "注册"
  
  // 密码加密(MD5加盐)
  初始化局部变量 加密密码 = 调用 MD5工具1.计算MD5(
    合并字符串(密码, "_salt_", 用户名)
  )
  
  // 构建用户信息
  初始化局部变量 用户信息 = 创建字典(
    键值对("pwd", 加密密码),
    键值对("created", 调用 计时器1.格式化日期时间(调用 计时器1.现在, "yyyy-MM-dd"))
  )
  
  // 更新用户列表
  调用 追加列表项(全局变量 用户列表, 用户名)
  
  // 批量存储(异步)
  调用 网络微数据库1.存储值("userlist", 全局变量 用户列表)
  调用 网络微数据库1.存储值(
    合并字符串("user_", 用户名),
    调用 字典.字典转JSON(用户信息)
  )

// 存储完成事件
当 网络微数据库1.值存储完毕时 时
  如果 全局变量 当前操作 = "注册" 则
    调用 对话框1.显示消息对话框("✅ 注册成功!", "提示", "确定")
    // 自动登录
    调用 进入主界面(文本输入框_用户名.文本)

三、登录功能

3.1 代码块

// 登录按钮
当 按钮_登录.被点击 时
  初始化局部变量 用户名 = 去除首尾空格(文本输入框_用户名.文本)
  初始化局部变量 密码 = 文本输入框_密码.文本
  
  如果 用户名 = "" 或 密码 = "" 则
    调用 对话框1.显示消息对话框("请输入用户名和密码", "提示", "确定")
    返回
  
  // 检查用户是否存在
  如果 用户名 不在列表中(全局变量 用户列表, 用户名) 则
    调用 对话框1.显示消息对话框("用户不存在,请先注册", "提示", "确定")
    返回
  
  // 获取用户信息验证密码
  设置 全局变量 当前操作 = 合并字符串("登录_", 用户名, "_", 密码)
  调用 网络微数据库1.获取值(合并字符串("user_", 用户名), "{}")

// 获取值事件(统一处理)
当 网络微数据库1.已获得值时(标签, 值)
  如果 全局变量 当前操作 = "加载用户列表" 则
    // 解析用户列表
    如果 值 ≠ "" 且 值 ≠ "[]" 则
      设置 全局变量 用户列表 = 调用 字典.JSON转字典(值)
    
    // 检查记住密码
    初始化局部变量 记住用户 = 调用 微数据库1.获取值("remember_user", "")
    如果 记住用户 ≠ "" 则
      设置 文本输入框_用户名.文本 = 记住用户
      设置 文本输入框_密码.文本 = 调用 微数据库1.获取值("remember_pwd", "")
  
  否则如果 以 "登录_" 开头(全局变量 当前操作) 则
    // 解析登录操作参数
    初始化局部变量 部分 = 按分隔符拆分文本(全局变量 当前操作, "_")
    初始化局部变量 用户名 = 选择列表项(部分, 2)
    初始化局部变量 密码 = 选择列表项(部分, 3)
    
    // 验证密码
    初始化局部变量 用户信息 = 调用 字典.JSON转字典(值)
    初始化局部变量 存储密码 = 获取键的值(用户信息, "pwd", "")
    初始化局部变量 输入加密 = 调用 MD5工具1.计算MD5(
      合并字符串(密码, "_salt_", 用户名)
    )
    
    如果 存储密码 = 输入加密 则
      // 记住密码
      如果 复选框_记住密码.选中 则
        调用 微数据库1.存储值("remember_user", 用户名)
        调用 微数据库1.存储值("remember_pwd", 密码)
      否则
        调用 微数据库1.删除值("remember_user")
        调用 微数据库1.删除值("remember_pwd")
      
      调用 进入主界面(用户名)
    否则
      调用 对话框1.显示消息对话框("❌ 密码错误", "错误", "确定")

四、每日签到

初始化全局变量 当前用户 = ""

// 进入主界面
定义 进入主界面(用户名)
  设置 全局变量 当前用户 = 用户名
  设置 标签_欢迎.文本 = 合并字符串("欢迎,", 用户名, "!")
  
  // 加载签到记录
  调用 网络微数据库1.获取值(
    合并字符串("checkin_", 用户名), "[]"
  )

// 签到按钮
当 按钮_签到.被点击 时
  初始化局部变量 今日 = 调用 计时器1.格式化日期时间(调用 计时器1.现在, "yyyy-MM-dd")
  
  // 检查今日是否已签到
  如果 今日 在列表中(全局变量 签到列表, 今日) 则
    调用 对话框1.显示消息对话框("今日已签到", "提示", "确定")
    返回
  
  // 添加签到记录
  调用 追加列表项(全局变量 签到列表, 今日)
  调用 网络微数据库1.存储值(
    合并字符串("checkin_", 全局变量 当前用户),
    全局变量 签到列表
  )
  
  // 计算连续签到天数
  初始化局部变量 连续天数 = 调用 计算连续签到(全局变量 签到列表)
  调用 对话框1.显示消息对话框(
    合并字符串("✅ 签到成功!\n连续签到:", 连续天数, "天"),
    "签到", "确定"
  )

// 计算连续签到天数
定义 计算连续签到(签到列表)
  初始化局部变量 连续 = 0
  初始化局部变量 今日 = 调用 计时器1.格式化日期时间(调用 计时器1.现在, "yyyy-MM-dd")
  初始化局部变量 检查日期 = 今日
  
  循环 当 检查日期 在列表中(签到列表, 检查日期) 时
    设置 连续 = 连续 + 1
    // 往前推一天
    设置 检查日期 = 调用 计时器1.格式化日期时间(
      调用 计时器1.毫秒转日期时间(
        调用 计时器1.获取毫秒数(调用 计时器1.将文本转换为日期时间(检查日期)) - 86400000
      ), "yyyy-MM-dd"
    )
  
  返回 连续

五、常见问题

Q1:网络微数据库存储中文乱码?

使用 fun123.cn 版本的网络微数据库(支持中文),不要用MIT默认服务器。

Q2:用户列表超过9000字节怎么办?

  • 只存用户名列表(不存完整信息)
  • 用户详细信息单独存储(user_用户名 标签)
  • 用户量大时改用MySQL

Q3:如何实现忘记密码?

  • 注册时收集邮箱/手机号
  • 忘记密码时发送验证码(调用短信API)
  • 验证通过后允许重置密码

参考资料


文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。