【Android学习】简单的登录页面和业务逻辑实现
实现功能
1 登录页:密码登录和验证码登录
2 忘记密码页:修改密码
3 页面基础逻辑 java代码
基础页面


XML
login_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">
<!-- 单选框--><RadioGroupandroid:id="@+id/rg_login"android:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"android:orientation="horizontal"><RadioButtonandroid:id="@+id/rg_password"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:text="@string/login_by_password"android:textSize="@dimen/common_font_size"android:checked="true"/><RadioButtonandroid:id="@+id/rg_vertifycode"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:text="@string/login_by_vertifycode"android:textSize="@dimen/common_font_size"/></RadioGroup><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_phone"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/phone_number"android:textColor="@color/black"android:textSize="@dimen/common_font_size"/><EditTextandroid:id="@+id/et_phone"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:hint="@string/inout_phone_number"android:background="@drawable/editor_selector"android:textColor="@color/black"android:maxLength="11"android:inputType="number"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_password"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/login_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size"/><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><EditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:inputType="numberPassword"android:hint="@string/input_password"android:background="@drawable/editor_selector"android:textColor="@color/black"android:maxLength="6"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size"/><Buttonandroid:id="@+id/btn_forget"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="@string/forget_password"android:layout_alignParentEnd="true"android:textColorHint="@color/black"android:textSize="@dimen/common_font_size"/></RelativeLayout></LinearLayout><CheckBoxandroid:id="@+id/ck_remember"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/remember_password"android:textColorHint="@color/black"android:textSize="@dimen/common_font_size"/><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/login"android:textColorHint="@color/black"android:textSize="@dimen/btn_font_size"/>
</LinearLayout>
login_forget_password.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/input_new_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size"/><EditTextandroid:id="@+id/et_password_first"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:inputType="numberPassword"android:hint="@string/input_new_password_hint"android:background="@drawable/editor_selector"android:textColor="@color/black"android:maxLength="11"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/confirm_new_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size"/><EditTextandroid:id="@+id/et_password_second"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:hint="@string/confirm_new_password_again"android:background="@drawable/editor_selector"android:textColor="@color/black"android:maxLength="11"android:inputType="number"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/verifycode"android:textColor="@color/black"android:textSize="@dimen/common_font_size"/><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><EditTextandroid:id="@+id/et_verifycode"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:inputType="numberPassword"android:hint="@string/input_verifycode"android:background="@drawable/editor_selector"android:textColor="@color/black"android:maxLength="6"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size"/><Buttonandroid:id="@+id/btn_verificode"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="@string/get_verifycode"android:layout_alignParentEnd="true"android:textColorHint="@color/black"android:textSize="@dimen/common_font_size"/></RelativeLayout></LinearLayout><Buttonandroid:id="@+id/btn_confirm"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/done"android:textColorHint="@color/black"android:textSize="@dimen/btn_font_size"/>
</LinearLayout>
Java
loginMain.java
package com.example.learn;import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.BlendMode;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;import com.example.learn.utils.ViewUtil;import java.util.Random;public class LoginMainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, View.OnClickListener {private EditText et_phone;private TextView tv_password;private EditText et_password;private Button btn_forget;private CheckBox ck_remember;private RadioButton rg_password;private RadioButton rg_vertifycode;private ActivityResultLauncher<Intent> register;private Button btn_login;//定义固定密码 调试使用private String mPassword = "111111";private String verifyCode;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login_main);RadioGroup rg_login = findViewById(R.id.rg_login);et_phone = findViewById(R.id.et_phone);tv_password = findViewById(R.id.tv_password);et_password = findViewById(R.id.et_password);btn_forget = findViewById(R.id.btn_forget);ck_remember = findViewById(R.id.ck_remember);rg_password = findViewById(R.id.rg_password);rg_vertifycode = findViewById(R.id.rg_vertifycode);btn_login = findViewById(R.id.btn_login);//设置监听器rg_login.setOnCheckedChangeListener(this);//为电话号码、密码增加文本长度变换监听器et_phone.addTextChangedListener(new HideKeyboardWatch(et_phone, 11));et_password.addTextChangedListener(new HideKeyboardWatch(et_password, 6));//为忘记密码/获取验证码增加点击事件btn_forget.setOnClickListener(this);//login按钮btn_login.setOnClickListener(this);//全局registerActivityForResultregister = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),new ActivityResultCallback<ActivityResult>() {//接收返回值@Overridepublic void onActivityResult(ActivityResult result) {Intent intent = result.getData();if(intent!=null && result.getResultCode()==Activity.RESULT_OK){mPassword = intent.getStringExtra("new_password");}}});}@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int checkedId) {switch (checkedId) {case R.id.rg_password://密码登录//验证码登录tv_password.setText(getString(R.string.login_password));et_password.setHint(getString(R.string.input_password));btn_forget.setText(getString(R.string.forget_password));ck_remember.setVisibility(View.VISIBLE);//显示break;case R.id.rg_vertifycode://验证码登录tv_password.setText(getString(R.string.verifycode));et_password.setHint(getString(R.string.input_verifycode));btn_forget.setText(getString(R.string.get_verifycode));ck_remember.setVisibility(View.GONE);//隐藏break;}}@Overridepublic void onClick(View view) {String phone = et_phone.getText().toString();if (phone.length() < 11) {Toast.makeText(this, "手机号码不足11位", Toast.LENGTH_SHORT).show();return;}switch (view.getId()) {case R.id.btn_forget://说明选择是密码登录// 此时按钮为忘记密码if (rg_password.isChecked()) {//此时可将手机号传递给下一个忘记密码页面Intent intent = new Intent(this, LoginForgetActivity.class);intent.putExtra("phone", phone);register.launch(intent);}else if(rg_vertifycode.isChecked()){//生成6位随机验证码verifyCode = String.format("%6d",new Random().nextInt(999999));//弹出对话框 便于用户记住验证码AlertDialog.Builder adb = new AlertDialog.Builder(this);adb.setTitle("请记住验证码");adb.setMessage("手机号"+phone+",验证码为"+verifyCode+",请输入验证码!");adb.setPositiveButton("好的",null);AlertDialog ad =adb.create();ad.show();}break;case R.id.btn_login://如果密码方式登录 判断密码是否正确if(rg_password.isChecked()){if(!mPassword.equals(et_password.getText().toString())){Toast.makeText(this,"请输入正确密码",Toast.LENGTH_SHORT).show();return;}loginSuccess();}else if(rg_vertifycode.isChecked()){if(!verifyCode.equals(et_password.getText().toString())){Toast.makeText(this,"请输入正确验证码",Toast.LENGTH_SHORT).show();return;}loginSuccess();}break;}}private void loginSuccess() {String desc=String.format("您的手机号码为%s,恭喜您登陆成功!",et_phone.getText().toString());AlertDialog.Builder adb = new AlertDialog.Builder(this);adb.setTitle("恭喜您登陆成功!");adb.setMessage("您的手机号为"+et_phone.getText().toString());adb.setNegativeButton("确定返回", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {//结束当前活动页面finish();}});adb.setPositiveButton("我再看看",null);AlertDialog ad = adb.create();ad.show();}//编辑框监听器,当输入文本长度达到最大长度,隐藏键盘。private class HideKeyboardWatch implements TextWatcher {private EditText mView;private int maxLen;public HideKeyboardWatch(EditText et, int len) {this.mView = et;this.maxLen = len;}@Overridepublic void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void afterTextChanged(Editable s) {if (s.toString().length() == maxLen) {//隐藏软键盘ViewUtil.hideKeyboard(LoginMainActivity.this, mView);}}}
}
login_forget_password.java
package com.example.learn;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;import java.util.Random;public class LoginForgetActivity extends AppCompatActivity implements View.OnClickListener {private String mPhone;private String verifyCode;private EditText et_password_first;private EditText et_password_second;private EditText et_verifycode;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login_forget);mPhone = getIntent().getStringExtra("phone");findViewById(R.id.btn_verificode).setOnClickListener(this);findViewById(R.id.btn_confirm).setOnClickListener(this); et_password_first = findViewById(R.id.et_password_first);et_password_second = findViewById(R.id.et_password_second);et_verifycode = findViewById(R.id.et_verifycode);}@Overridepublic void onClick(View view) {switch(view.getId()){case R.id.btn_verificode://生成6位随机验证码verifyCode = String.format("%6d",new Random().nextInt(999999));//弹出对话框 便于用户记住验证码AlertDialog.Builder adb = new AlertDialog.Builder(this);adb.setTitle("请记住验证码");adb.setMessage("手机号"+mPhone+",验证码为"+verifyCode+",请输入验证码!");adb.setPositiveButton("好的",null);AlertDialog ad =adb.create();ad.show();break;case R.id.btn_confirm:String pf = et_password_first.getText().toString();String ps = et_password_second.getText().toString();if(pf.length()<6){Toast.makeText(this,"请输入正确密码",Toast.LENGTH_SHORT).show();return;}if(!pf.equals(ps)){Toast.makeText(this,"两次密码不同",Toast.LENGTH_SHORT).show();return;}if(!verifyCode.equals(et_verifycode.getText().toString())){Toast.makeText(this,"验证码不正确",Toast.LENGTH_SHORT).show();return;}Toast.makeText(this,"密码修改成功",Toast.LENGTH_SHORT).show();Intent intent = new Intent();intent.putExtra("new_password",pf);setResult(Activity.RESULT_OK,intent);finish();//结束当前页面break;}}
}
相关文章:
【Android学习】简单的登录页面和业务逻辑实现
实现功能 1 登录页:密码登录和验证码登录 2 忘记密码页:修改密码 3 页面基础逻辑 java代码 基础页面 XML login_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.and…...
Mysql数据库的基础学习
为什么使用数据库? 1.持久化:将数据保存到可掉电式存储设备中以供使用。 数据库相关概念: DB:数据库(Databass)即存储数据的仓库,本质是一个文件系统,保存了一系列有组织的数据DBMS:数据库管…...
CentOS7 安装 Kamailio
https://www.kamailio.org/wiki/packages/rpms 官方文档说 yum -y install yum-utils yum-config-manager --add-repo https://rpm.kamailio.org/centos/kamailio.repo 但目前这样其实行不通 需要这样做: yum install --disablerepokamailio --enablerepokamai…...
Tomcat启动闪退问题解决办法
本文将通过一系列诊断步骤帮助您找出原因,并提供相应的解决办法。 诊断步骤 查看日志文件 Tomcat的日志文件是解决启动问题的第一线工具。查看logs目录下的catalina.out和其他日志文件,这些文件经常记录了错误信息和系统崩溃的线索。 cat /path/to/to…...
单元测试之JUnit5知识点总结及代码示例
单元测试是软件开发过程中的一种验证手段,它针对最小的可测试部分(通常是函数或方法)进行检查和验证。其实单元测试还是挺重要的,不过国内很多公司的项目其实并没有做好单元测试,或者根本就没做单元测试,原…...
什么是数据平台——企业构建Data+AI的基础数据底座需要的决策参考
什么是数据平台 标准的解释是这样的 Wikipedia A data platform usually refers to a software platform used for collecting and managing data, and acting as a data delivery point for application and reporting software. 数据平台是指将各类数据进行整合、存储、处…...
Oracle 流stream数据的复制
Oracle 流stream数据的复制 --实验的目的是捕获scott.emp1表的变化,将变化应用到远程数据库scott.emp1表中。 --设置初始化参数 AQ_TM_PROCESSES1 COMPATIBLE9.2.0 LOG_PARALLELISM1 GLOBAL_NAMEStrue JOB_QUEUE_PROCESSES2 --查看数据库的名称,我的为o…...
「 安全设计 」68家国内外科技巨头和安全巨头参与了CISA发起的安全设计承诺,包含MFA、默认密码、CVE、VDP等七大承诺目标
美国网络安全和基础设施安全局(CISA,CyberSecurity & Infrastructure Security Agency)于2024年5月开始呼吁企业是时候将网络安全融入到技术产品的设计和制造中了,并发起了安全设计承诺行动,该承诺旨在补充和建立现…...
【K8S】pod无限重启,报错Back-off restarting failed container
1. 问题 pod启动后一直重启,并报Back-off restarting failed container。 原理: Back-off restarting failed container的Warning事件,一般是由于通过指定的镜像启动容器后,容器内部没有常驻进程,导致容器启动成功后…...
摸鱼文章1
1111111...
【设计模式】之适配器模式
系列文章目录 (其他设计模式可以到 👉👉👉)设计模式_小杰不秃头的博客 😊😄😛 前言 今天继续给大家介绍23种设计模式中的适配器模式,这个模式相比于其他模式比较好理解…...
Python轻量级Web框架Flask(13)—— Flask个人博客项目
0、前言: ★这部分内容是基于之前Flask学习内容的一个实战项目梳理内容,没有可以直接抄下来跑的代码,是学习了之前Flask基础知识之后,再来看这部分内容,就会对Flask项目开发流程有更清楚的认知,对一些开发细节可以进一步的学习。项目功能,通过Flask制作个人博客。项目架…...
电商技术揭秘营销相关系列文章合集(4)
相关系列文章 电商技术揭秘相关系列文章合集(1) 电商技术揭秘相关系列文章合集(2) 电商技术揭秘相关系列文章合集(3) 文章目录 引言集合说明集合文章列表 引言 在数字化浪潮的推动下,电商行…...
LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】
LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】 题目描述:解题思路一:处理垃圾和路程单独计算。解题思路二:逆向思维,计算多走的路解题思路三:只记录,当前t需要计算几次 题目描述:…...
再有人说数字孪生大屏没有用,用这8条怼回去。
数字孪生大屏之所以受到欢迎,主要有以下几个原因: 实时数据可视化 数字孪生大屏可以将实时数据以直观的可视化形式展示出来,让用户能够一目了然地了解数据的状态和趋势。这样可以帮助用户更好地理解和分析数据,及时做出决策和调…...
蓝桥杯练习系统(算法训练)ALGO-946 Q神的足球赛
资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 足球赛上,只见Q神如闪电般的速度带球时而左,时而右,时而前,时而后ÿ…...
【Android】Kotlin学习之Kotlin方法的声明和传参
方法声明 普通类的方法 静态类的方法 不需要构建实例对象, 可以通过类名直接访问静态方法 : NumUtil.double(1) companion object 伴生类的方法 使用companion object 在普通类里定义静态方法 参数 括号内传入方法 : 当参数是方法时, 并且是最后一个参数 , 可以使用括号外…...
微信小程序 17:小程序使用 npm 包和组件应用
目前,小程序中已经支持实用 npm 安装第三方包,从而提高小程序的开发效率,但是在小程序中使用 npm 包有三个限制: 不支持 Node.js内置库的包不支持依赖于浏览器内置对象的包不支持依赖于 C插件的包 Vant Weapp Vant Weapp是有赞…...
【mysql篇】执行delete删除大量数据后,磁盘未清空,为什么?
目录 迁移脚本删除数据以及备份数据 解决方法OPTIMIZE TABLE二进制日志按月生成数据 最近某个项目虽说用户量不大,但是,单表的数据量越来越大,mysql一般单表超过千万级别后,性能直线下降,所以利用shardingphere按月做了…...
【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍 文章编号&#x…...
Codex+Coze自动化工作流实战
Codex(特指OpenAI的编程特化AI Agent)与Coze(扣子)平台的结合,能够实现从自然语言描述到可运行自动化流程的端到端生成。其核心在于利用Codex强大的代码理解和生成能力,来编写、调试并封装符合Coze平台规范…...
K210+STM32F103C8T6低成本送药小车全流程:从硬件选型到代码调试避坑
K210STM32F103C8T6低成本送药小车全流程:从硬件选型到代码调试避坑 当电子竞赛遇上嵌入式开发,一个融合视觉识别与运动控制的送药小车项目,往往成为检验技术实力的试金石。本文将带你从零开始,用K210视觉模块与STM32F103C8T6主控芯…...
给硬件工程师的芯片FT测试入门:从ATE、Handler到Socket,一次搞懂所有‘治具’
芯片FT测试全流程实战指南:从设备选型到治具配置 第一次走进芯片测试车间时,我被眼前那些闪烁着信号灯的庞大设备和精密治具震撼到了。作为硬件工程师,我们可能更熟悉PCB设计和电路仿真,但当芯片进入量产阶段,如何确保…...
别再死记硬背了!用一张图+三个故事彻底搞懂PCIe TLP帧结构
用快递、交通与银行故事轻松掌握PCIe TLP帧结构 每次打开PCIe协议文档,看到那些密密麻麻的字段定义,是不是感觉头大如斗?Fmt、Type、TC、Attr...这些抽象术语就像一堵高墙,把许多工程师挡在了深入理解PCIe的大门之外。但今天&…...
为什么93%的AI法律助手查不准《数据安全法》实施细则?Perplexity这项冷启动参数设置决定成败
更多请点击: https://codechina.net 第一章:Perplexity法规查询功能的底层架构原理 Perplexity法规查询功能并非基于传统关键词匹配的搜索引擎,而是构建在多层语义理解与结构化知识协同推理的基础之上。其核心由法规知识图谱、实时语义解析引…...
Kafka基础篇
Kafaka安装和使用以及整和一、 安装(docker)1)创建docker-compose.yml文件2)测试二、 kafaka基础知识1)kafaka核心架构2) 工作流程三、Spring Boot 整合Kafka1. 导入依赖 ,配置yml文件2. API讲解2.1&#x…...
不用真飞机!用BetaFlight遥控器玩转PX4无人机仿真:QGC配置与手动飞行入门
用BetaFlight遥控器解锁PX4仿真飞行:从硬件配置到手动操控全指南 当大多数PX4开发者还在用键盘和鼠标操作仿真无人机时,一群来自穿越机社区的玩家已经找到了更硬核的玩法——用真实的BetaFlight遥控器直接控制Gazebo里的虚拟飞行器。这种将硬件与仿真环境…...
Rust内存安全:所有权、借用与生命周期深度解析
Rust内存安全:所有权、借用与生命周期深度解析 引言 在Rust开发中,内存安全是其最核心的特性。作为一名从Python转向Rust的后端开发者,我深刻体会到Rust在内存安全方面的革命性设计。Rust通过所有权系统、借用机制和生命周期注解࿰…...
CVAT管理员必看:用户权限、任务分割与Datumaro数据导入导出全流程详解
CVAT管理员实战指南:权限配置、任务优化与数据流转全解析 1. 权限管理的艺术:从基础配置到高级控制 在CVAT平台中,权限管理是确保数据安全与协作效率的核心机制。不同于普通标注员视角,管理员需要掌握三个关键权限层级:…...
为新项目申请API Key并设置访问权限与用量提醒
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为新项目申请API Key并设置访问权限与用量提醒 当你开始一个新的AI应用项目,首要任务之一就是获取一个安全、可控的API…...
