APP登录界面设计:注册框 or 登录框,哪个更合理?

本文探讨了登录和注册界面的设计策略,指出在产品不同阶段应突出注册或登录。以喜马拉雅APP为例,说明了用户登录即注册的设计方式,简化用户操作。第三方登录被广泛采用以降低注册门槛,但可能引发一人多号问题。产品需遵守个人信息保护规范,确保合法合规。此外,通过数据埋点分析用户行为,优化登录注册流程。

登录和注册过程往往是产品和用户的 First Sight,因此登录注册入口是给用户留下好的第一印象的关键。遵循“所有的设计都应有据可循”的原则,下面是我司设计团队对“登录界面该放注册框还是登录框这个问题”的探讨。

对于一般需要账号体系的产品,都是按照注册、登录、认证这样的顺序来设计的。根据具体的产品发展阶段,在起步探索期,用户量还没有达到一定量级,处在拉新阶段的产品会突出注册。而成熟发展期的产品已经有一定用户量级,为了照顾大多数用户的体验,尽量突出登录。不管突出哪个流程的操作,另一个都不能隐藏太深,依然需要放在显眼易操作的位置且简短用户操作路径。

以喜马拉雅APP为例,放了登录按钮,一系列操作都是在进行登录流程。而根据产品政策,首次登录的手机账号自然而然就注册成功了。这里涉及到一个比较省事的设计方案:用户登录即注册。

为了降低用户注册的成本,很多APP都会简化用户操作,用户在前台一键登录,后台只需要进行判断,新用户首次登录就走注册流程,而老用户的手机号、第三方账号,则直接走登录流程。用户只需要使用产品,顺着操作指引一直点击确定就可以顺利使用了。

如上图所示,两个例子其实都包含了第三方登录/注册。利用第三方登录能够免去注册的麻烦,让用户快速通过登录门槛,进而使用产品提供的主要服务,降低因为登录注册带来的用户损耗,同时使用第三方账号登录有利于产品初期的宣传推广。

国内常见的第三方登录有微信、QQ、微博、Apple ID登录等,这些用户基数大的或者用户匹配度高的三方登录平台都提供了开放平台用于接入。

其优点是用户操作路径短,操作简便省事。

缺点是容易造成一人多号的问题,且只能获取到有限的用户信息,无法提供更加精准的运营活动。

而喜马拉雅这里使用了“伪第三方登录”,用户首次使用第三方平台登录后,继续让用户绑定手机号或完善用户信息,以获取更加有效、真实的用户数据,也就是伪第三方注册。这么做同时也防止了一人多号的问题。

2016年《个人信息保护规范》发布后,现在一定要用户在使用产品勾选《用户使用协议》《用户服务协议》,不能默认给用户进行勾选。用户注册登录的前提条件是需要打勾,这类机制是在APP新下载或新版本更新下,会再次提醒。APP隐私协议/政策,其作用类似于我们购买食品的“产品说明书”,须将申请的个人信息原因、用途等等清晰表明,并与相应的进行权限管理等等。

这样有两个好处:产品去掉不合理的权限申请或个人信息收集;而监管机构有了“抓手”,有了监管的基础。我们在设计登录/注册页面时一定要合规合法,对用户负责也对产品负责。

如何判断用户到底是登录多还是注册多,或者哪些操作是否容易,除了根据产品阶段进行判断也可以在登录注册做页面数据埋点,检测查看用户的访问深度,用来判断产品设计的路径是否过长,用户操作行为如何。

参考资料:

《Why are the username and password on two different pages?》,KELLEY ROBINSON

《从0到1,以登录注册建立账户体系》,Kevin

《建议收藏|登录注册产品设计的关键节点都在这》,Kevin

### 使用Flask架创建登录注册页面 为了实现基于Flask的应用程序中的用户认证功能,可以利用`Flask-Login`库来简化这一过程。下面是一个完整的指南,涵盖了从设置到构建HTML模板的具体步骤。 #### 1. 安装必要的依赖项 确保已经安装了所需的Python包: ```bash pip install flask flask-login flask-wtf mysqlclient ``` 这些工具可以帮助处理表单验证(`flask-wtf`)以及数据库交互(`mysqlclient`)等问题[^2]。 #### 2. 初始化项目结构 建立合理的文件夹布局有助于好地管理代码。推荐的目录结构如下所示: ``` /flask_app/ /blog/ __init__.py models.py views.py templates/ base.html login.html register.html run.py config.py ``` 此结构使得各个组件之间的关系加清晰明了[^3]。 #### 3. 设置应用配置 编辑`config.py`以定义应用程序所需的各种参数,比如密钥、数据库连接字符串等: ```python import os class Config(object): SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess' SQLALCHEMY_DATABASE_URI = 'mysql://username:password@localhost/db_name' SQLALCHEMY_TRACK_MODIFICATIONS = False ``` 这里设置了用于保护会话数据的秘密键以及其他重要的全局变量[^5]。 #### 4. 构建基础路由与视图逻辑 打开`run.py`并编写启动脚本: ```python from blog import app if __name__ == "__main__": app.run(debug=True) ``` 接着,在`blog/__init__.py`中初始化核心对象,并导入其他模块: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager from config import Config app = Flask(__name__) db = SQLAlchemy(app) lm = LoginManager() lm.init_app(app) lm.login_view = "login" def create_app(): app.config.from_object(Config()) with app.app_context(): db.create_all() return app ``` 最后一步是在`views.py`里添加具体的业务逻辑,包括渲染网页和服务端校验等功能: ```python from flask import render_template, flash, redirect, url_for from .forms import LoginForm, RegistrationForm from ..models import User from werkzeug.urls import url_parse from flask_login import current_user, login_user, logout_user, login_required @app.route('/register', methods=['GET', 'POST']) def register(): if current_user.is_authenticated: return redirect(url_for('index')) form = RegistrationForm() if form.validate_on_submit(): user = User(username=form.username.data, email=form.email.data) user.set_password(form.password.data) db.session.add(user) db.session.commit() flash('Congratulations, you are now a registered user!') return redirect(url_for('login')) return render_template('register.html', title='Register', form=form) @app.route('/login', methods=['GET', 'POST']) def login(): if current_user.is_authenticated: return redirect(url_for('index')) form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(email=form.email.data).first() if user is None or not user.check_password(form.password.data): flash('Invalid username or password') return redirect(url_for('login')) login_user(user, remember=form.remember_me.data) next_page = request.args.get('next') if not next_page or url_parse(next_page).netloc != '': next_page = url_for('index') return redirect(next_page) return render_template('login.html', title='Sign In', form=form) ``` 上述代码片段展示了如何通过WTForms库创建表单类,并将其集成至相应的视图函数之中[^4]。 #### 5. 设计前端界面 现在转向客户端部分——即HTML模板的设计工作。对于登录页而言,可以在`templates/login.html`内写下这样的内容: ```html+jinja {% extends "base.html" %} {% block content %} <h1>Sign In</h1> <form action="" method="post"> {{ form.hidden_tag() }} <p> Please enter your credentials below to sign into the system. </p> <div class="form-group"> {{ form.email.label }}<br> {{ form.email(size=32) }}<br> {% for error in form.email.errors %} <span style="color:red;">{{ error }}</span><br> {% endfor %} </div> <div class="form-group"> {{ form.password.label }}<br> {{ form.password(size=32) }}<br> {% for error in form.password.errors %} <span style="color:red;">{{ error }}</span><br> {% endfor %} </div> <div class="form-check"> {{ form.remember_me(class_="form-check-input") }} {{ form.remember_me.label(class_="form-check-label") }} </div> <button type="submit">Log In</button> </form> <p>New User? <a href="{{ url_for('register') }}">Click here to Register!</a></p> {% endblock %} ``` 同样地,针对新用户的注册流程,则需准备另一份名为`register.html`的文档: ```html+jinja {% extends "base.html" %} {% block content %} <h1>Register</h1> <form action="" method="post"> {{ form.hidden_tag() }} <p> Fill out this form to become our member today! </p> <div class="form-group"> {{ form.username.label }}<br> {{ form.username(size=32) }}<br> {% for error in form.username.errors %} <span style="color:red;">{{ error }}</span><br> {% endfor %} </div> <div class="form-group"> {{ form.email.label }}<br> {{ form.email(size=64) }}<br> {% for error in form.email.errors %} <span style="color:red;">{{ error }}</span><br> {% endfor %} </div> <div class="form-group"> {{ form.password.label }}<br> {{ form.password(size=32) }}<br> {% for error in form.password.errors %} <span style="color:red;">{{ error }}</span><br> {% endfor %} </div> <div class="form-group"> {{ form.password2.label }}<br> {{ form.password2(size=32) }}<br> {% for error in form.password2.errors %} <span style="color:red;">{{ error }}</span><br> {% endfor %} </div> <button type="submit">Register</button> </form> <p>Already have an account? <a href="{{ url_for('login') }}">Log In Here.</a></p> {% endblock %} ``` 以上两段Jinja2语法编写的HTML
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值