当前位置: 首页 > news >正文

安卓开发之登录页面(跳转版)

目录

  • 前言:
  • 基础夯实:
  • 效果展示:
  • 核心代码:
  • 网盘源码:

前言:

熟悉安卓开发的基础知识,了解,弹窗,两个页面进行跳转,页面的布局,按钮,文本框的使用,初学安卓,不足之处见谅

基础夯实:

对于初学安卓开发的你来说,掌握以下基础知识是非常重要的,包括Activity的生命周期、页面布局、弹窗、页面跳转、按钮以及文本框的使用等。下面我将逐一介绍这些知识点:

一、Activity的生命周期
Activity是Android应用中的单个屏幕,它包含了用户可以与之交互的UI元素。了解Activity的生命周期对于开发高质量的Android应用至关重要。Activity的生命周期包括以下几个主要阶段:

onCreate():Activity被创建时调用,用于初始化Activity的基本状态,如加载布局、初始化变量等。
onStart():Activity对用户可见时调用。
onResume():Activity开始与用户交互时调用。
onPause():当Activity失去焦点但仍然可见时(如另一个非全屏或透明的Activity被放置在它上面时)调用。
onStop():当Activity完全不可见时调用。
onDestroy():Activity即将被销毁时调用,此时应释放Activity所占用的资源。
二、页面布局
Android提供了多种布局方式来组织UI元素,包括线性布局(LinearLayout)、约束布局(ConstraintLayout)、表格布局(TableLayout)、帧布局(FrameLayout)和相对布局(RelativeLayout)等。每种布局都有其特定的使用场景和优势:

线性布局:将子视图按照水平或垂直方向排列。
约束布局:通过约束来定义子视图之间的关系,允许创建大型且复杂的布局,同时保持层次结构的扁平化。
表格布局:用于以行和列的形式组织界面,类似于HTML中的表格。
帧布局:用于存放单个子视图,通常用于包裹一个单独的子视图,特别是当需要在运行时替换界面元素时。
相对布局:子视图的位置是相对于布局或其他子视图的位置来确定的,提供了更大的灵活性。
三、弹窗
在Android中,弹窗通常用于向用户显示信息或获取用户的输入。常用的弹窗类型包括AlertDialog、Custom Dialog和PopupWindow等:

AlertDialog:用于显示一个简单的对话框,可以包含标题、消息、图标和按钮等。
Custom Dialog:当你需要更复杂的布局或功能时,可以创建一个自定义的Dialog。这通常涉及继承Dialog类或DialogFragment,并在其中定义自己的布局和行为。
PopupWindow:一个可以在当前活动上浮动的小窗口,不会自动管理生命周期,因此需要自己处理显示和隐藏。
四、页面跳转
在Android应用中,页面跳转通常通过Intent来实现。Intent是一个消息传递对象,它可以用于请求另一个应用组件执行指定的操作。使用Intent进行页面跳转时,需要在AndroidManifest.xml文件中注册目标Activity。Intent可以显式地指定目标组件,也可以隐式地根据动作(Action)和数据(Data)来匹配目标组件。

五、按钮的使用
按钮是Android应用中最常用的用户界面元素之一。它允许用户通过点击或触摸来触发操作。在Android中,按钮是通过使用Button类创建的。你可以在XML布局文件中使用标签来定义按钮,也可以在Java代码中通过调用Button类的构造函数来创建按钮。为了处理按钮点击事件,你需要为按钮设置点击事件监听器,并在监听器中编写相应的处理逻辑。

六、文本框的使用
文本框在Android开发中通常使用EditText控件来实现。EditText控件允许用户输入和编辑文本。你可以在XML布局文件中添加EditText控件,并设置其属性如宽度、高度、提示文本等。在Java代码中,你可以通过findViewById方法获取布局中定义的EditText控件,并获取用户输入的文本内容。此外,你还可以为EditText控件设置输入类型(如密码、数字等)、最大输入长度等属性,并为其添加文本改变监听器以便在文本改变时执行特定的操作。

综上所述,掌握以上基础知识是初学安卓开发的重要一步。通过不断学习和实践,你将能够逐步提高自己的安卓开发能力并开发出高质量的Android应用。

效果展示:

在这里插入图片描述

安卓例程3

核心代码:

主函数:

package com.example.test05;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;import android.content.DialogInterface;
import android.content.Intent;
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.test05.util.ViewUtil;import java.util.Random;public class LoginMainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, View.OnClickListener {private TextView tv_password;private EditText et_password;private Button btn_forget;private CheckBox ck_remember;private EditText et_phone;private RadioButton rb_password;private RadioButton rb_verifycode;private static final int REQUEST_CODE = 1; // 定义请求码private Button btn_login;private String mPassword = "123456";private String mverifyCode;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login_main);RadioGroup rb_login = findViewById(R.id.rg_login);tv_password = findViewById(R.id.tv_password);et_password = findViewById(R.id.et_password);et_phone = findViewById(R.id.et_phone);btn_forget = findViewById(R.id.btn_forget);ck_remember = findViewById(R.id.ck_remember);//给rg_login设置单选监听器rb_login.setOnCheckedChangeListener(this);//给et_phone添加文本变更监听器et_phone.addTextChangedListener(new HideTextWatcher(et_phone,11));et_password.addTextChangedListener(new HideTextWatcher(et_password,6));btn_forget.setOnClickListener(this);rb_password = findViewById(R.id.rb_password);rb_verifycode = findViewById(R.id.rb_verifycode);btn_login = findViewById(R.id.btn_login);btn_login.setOnClickListener(this);}@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch (checkedId){case R.id.rb_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.rb_verifycode: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 v) {String phone = et_phone.getText().toString();if(phone.length() < 11){Toast.makeText(this,"请输入正确的手机号码",Toast.LENGTH_SHORT).show();return;}switch (v.getId()){case R.id.btn_forget:if(rb_password.isChecked()){Intent intent = new Intent(this ,LoginForgetActivity.class);Bundle bundle = new Bundle();bundle.putString("phone",phone );intent.putExtras(bundle);startActivityForResult(intent, REQUEST_CODE); // 传递intent和请求码}else if (rb_verifycode.isChecked()){//生成六位随机的验证码mverifyCode = String.format("%06d",new Random().nextInt(99999));//弹出提醒对话框,提示用户记住六位验证码数字AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage("手机号" + phone +"本次验证码是"+ mverifyCode  +"请输入验证码");builder.setPositiveButton("haod",null);AlertDialog dialog = builder.create();dialog.show();}break;case R.id.btn_login:if(rb_password.isChecked()){if(!mPassword.equals(et_password.getText().toString())){Toast.makeText(this,"请输入你的密码",Toast.LENGTH_SHORT).show();return;}//提示用户登录成功loginSuccess();}else if(rb_verifycode.isChecked())if(!mverifyCode.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 builder = new  AlertDialog.Builder((this));builder.setTitle("登录成功");builder.setMessage(desc);builder.setPositiveButton("确定返回", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}});builder.setNegativeButton("我再看看",null);AlertDialog dialog = builder.create();dialog.show();}private class HideTextWatcher implements TextWatcher {private  EditText mView;private  int mMaxLength;public HideTextWatcher(EditText v, int maxLength) {this.mView = v;this.mMaxLength = maxLength;}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {String str = s.toString();if (str.length() ==  mMaxLength ){//隐藏输入法ViewUtil.hideOneIputMehod(LoginMainActivity.this,mView);}}}

布局文件

<?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/rb_password"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:text="@string/login_by_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size"/><RadioButtonandroid:id="@+id/rb_verifycode"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:text="@string/login_by_verifycode"android:textColor="@color/black"android:textSize="@dimen/common_font_size" /></RadioGroup><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"><TextViewandroid: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/input_phone_number"android:inputType="number"android:maxLength="11"android:textColor="@color/black"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"><TextViewandroid:id="@+id/tv_password"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/login_by_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_marginTop="5dp"android:layout_marginBottom="5dp"android:layout_weight="1"android:hint="@string/input_password"android:inputType="numberPassword"android:maxLength="11"android:textColor="@color/black"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:layout_alignParentEnd="true"android:text="@string/forget_password"android:layout_alignParentRight="true"android:textColor="@color/black"android:textColorHint="@color/grey"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:textColor="@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:textColor="@color/black"android:textSize="@dimen/button_font_size"/></LinearLayout>

网盘源码:

链接 https://pan.baidu.com/s/1N44A4YlV1SEVvacc8jTP3w?pwd=sawu提取码: sawu

相关文章:

安卓开发之登录页面(跳转版)

目录 前言&#xff1a;基础夯实&#xff1a;效果展示&#xff1a;核心代码&#xff1a;网盘源码&#xff1a; 前言&#xff1a; 熟悉安卓开发的基础知识&#xff0c;了解&#xff0c;弹窗&#xff0c;两个页面进行跳转&#xff0c;页面的布局&#xff0c;按钮&#xff0c;文本…...

solidworks学习6吊环-20241030

solidworks学习6吊环 图 1 使用到的命名&#xff1a;拉伸曲面&#xff0c;旋转曲面&#xff0c;镜像实体&#xff0c;剪裁曲面&#xff0c; 前视基准面绘制 图 2 绘制旋转轴 图 3 旋转曲面 图 4 上视基准面绘制&#xff0c;标准圆边尺寸的时候需要按住shift键标注&#x…...

数据结构和算法-动态规划(3)-经典问题

动态规划常见问题 打家劫舍 题目 [力扣198] 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&…...

Java算法-一维前缀和与差分

一、一维前缀和 ① 什么是一维前缀和&#xff1f; &#x1f4da; 其实通过名字就能知道" 一维前缀和 "的意思&#xff1a; 通过一个一维数组"arr1"而创建的另一个一维数组"arr2"&#xff0c;"arr2"的每一个元素都是"arr1"…...

Elasticsearch 安装教程:驾驭数据海洋的星际导航仪

目录 一、准备工作1. ES的下载 二、安装步骤三、注意事项四、启动报错1. org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root2. max virtual memory areas vm.max_map_count [65530] is too low, increase to at l…...

【解决方案】微信小程序如何使用 ProtoBuf 进行 WebSocket 通信

前言 故事背景 简单说下背景&#xff0c;项目中需要用 ProtoBuf 协议转换请求参数&#xff0c;并通过 WebSocket 进行双向通信。重点&#xff01;一个是 web端&#xff08;Vue3 TS&#xff09;&#xff0c;一个是微信小程序端&#xff08;原生 JS&#xff09;。 剧情发展 …...

独立游戏开发者面临的挑战与困境

在当今竞争激烈的游戏市场中&#xff0c;独立游戏开发者面临着诸多挑战与困境。从游戏版号申请到游戏被抄袭&#xff0c;再到产品同质化以及流量获取难题&#xff0c;乃至外包内卷现象&#xff0c;每一个环节都考验着开发者的智慧与毅力。以下是对这些挑战与闲境的详细分析。 …...

KVM 虚拟机Anolis OS 8.9 下利用宝塔面板中的 Docker 配置 Nextcloud + onlyoffice

第一部分&#xff1a;安装配置 nextcloud 准备 &#xff08;1&#xff09;启动一个 Anolis OS 8.9 虚拟机&#xff0c;见下图。该虚拟机为 anlisos8…0.2 虚拟机的 ssh、hostname 、IP地址都已配置好。 &#xff08;2&#xff09;宝塔面板也已安装好docker 一、环境 do…...

串口扫盲TTL,TX/TR/GND

1. 串口扫盲TTL,TX/TR/GND 1. 串口扫盲TTL,TX/TR/GND 1.1. TTL1.2. USB转TTL1.3. 串口通信1.4. 引脚缩写1.5. 参考资料 1.1. TTL TX(TXD) 来源于 Transmit 一词&#xff0c;意思为发送&#xff0c;发射RX(RXD) 来源于 Receive 一词 意思为接收&#xff0c;收到GND 地线&…...

Python酷库之旅-第三方库Pandas(181)

目录 一、用法精讲 836、pandas.api.types.is_file_like函数 836-1、语法 836-2、参数 836-3、功能 836-4、返回值 836-5、说明 836-6、用法 836-6-1、数据准备 836-6-2、代码示例 836-6-3、结果输出 837、pandas.api.types.is_list_like函数 837-1、语法 837-2、…...

Python数据分析NumPy和pandas(十七、pandas 二进制格式文件处理)

以二进制格式存储&#xff08;或序列化&#xff09;数据的一种简单方法是使用 Python 的内置 pickle 模块。同时&#xff0c;pandas 构造的对象都有一个 to_pickle 方法&#xff0c;该方法以 pickle 格式将数据写入磁盘。 我们先把之前示例用到的ex1.csv文件加载到pandas对象中…...

matlab计算相关物理参数

function Rx1Jetfire1_1(di,Ct,Tf,Tj,alpha,Ma,Mf,RH,P0,P,k,Cd,elta,deltaHc,tau,directory) % 一共15个独立变量&#xff0c;为了方便输入修改&#xff0c;所有变量存入Jetfire1_1excel表&#xff0c; % dj为孔口直径,m&#xff1b;Ct为燃料空气混合摩尔系数&#xff0c;可…...

nmcli、ip、ifcfg配置网络区分方法

文章目录 一、检查NetworkManager状态使用nmcli命令&#xff1a;检查NetworkManager服务状态&#xff1a; 二、检查ip命令的使用三、检查ifcfg文件查看/etc/sysconfig/network-scripts/目录&#xff1a;查看/etc/network/interfaces文件&#xff08;针对Debian系&#xff09;&a…...

第四届智能电力与系统国际学术会议(ICIPS 2024)

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus 三、大会介绍 四、出席嘉宾 五、征稿主题 如想"投稿…...

区块链样题第4套解析 后端应用开发部分

任务3-2:区块链应用后端开发 使用JAVA-SDK与区块链进行交互,通过solc2Java工具将Solidity智能合约转译为可供Java调用的文件,实现区块链编程。 前言:题目只是单纯考了对于fisco-java-sdk的简单使用 教程参考: 1.这边建议还是学习完JavaWeb课程。 黑马程序员JavaWeb...

C语言实现408考研真题2016年43题

#include <iostream> // 定义分区函数&#xff0c;返回两个子数组之和的差值 int setPartition(int a[], int n) { int pivotkey, low 0, low0 0, high n - 1, high0 n - 1, flag 1, k n / 2, i; int s1 0, s2 0; // 当low等于k-1&#xff0c;…...

2024年,Rust开发语言,现在怎么样了?

Rust开发语言有着一些其他语言明显的优势&#xff0c;但也充满着争议&#xff0c;难上手、学习陡峭等。 Rust 是由 Mozilla 主导开发的通用、编译型编程语言&#xff0c;2010年首次公开。 在 Stack Overflow 的年度开发者调查报告中&#xff0c;Rust 连续多年被评为“最受喜爱…...

三种网络配置方法nmcli、ip、ifcfg文件

文章目录 总结nmcli配置网络定义与功能&#xff1a;特点&#xff1a;示例&#xff1a; ip配置网络定义与功能&#xff1a;特点&#xff1a;示例&#xff1a; ifcfg配置网络定义与功能&#xff1a;特点&#xff1a;示例&#xff1a; 总结 nmcli&#xff1a;适合需要动态管理网络…...

AES_ECB算法C++与Java相互加解密Demo

一、AES算法 AES是一种对称加密算法&#xff0c;算法秘钥长度可为128位(16字节)、192位(24字节)、256位(32字节)。加密模式分为ECB、CBC、CTR等&#xff0c;其中ECB模式最简单够用。现给出ECB模式下C和Java的实现&#xff0c;并且可以相互加解密验证。 二、AES_ECB实现DEMO …...

H7-TOOL自制Flash读写保护算法系列,为兆易创新GD32E23X制作使能和解除算法,支持在线烧录和脱机烧录使用(2024-10-29)

说明&#xff1a; 很多IC厂家仅发布了内部Flash算法文件&#xff0c;并没有提供读写保护算法文件&#xff0c;也就是选项字节算法文件&#xff0c;需要我们制作。 实际上当前已经发布的TOOL版本&#xff0c;已经自制很多了。但是依然有些厂家还没自制&#xff0c;所以陆续开始…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...