手把手带你完成安卓登录修改的案例

news2024/11/24 7:18:24

新建一个空的项目

到这里我们的项目就搭建完成了,接下来就来编写app的页面

提前准备

        1.新建一个 登录 的java和xml文件

        2.同样的步骤新建一个忘记登录的页面

        3.创建一个工具类,这个工具来主要是用来隐藏软键盘的

import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

public class ViewTuil {
    public static void hidekey(Activity a, View v){

        InputMethodManager im =(InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        im.hideSoftInputFromWindow(v.getWindowToken(),0);
    }
}

        4.在drawable文件下导入背景图

        5.在values目录下定义我们需要的文字和颜色

        colors

<color name="grey">#cccccc</color>
<color name="red">#BF1206</color>

         strings

    <string name="login_by_password">密码登录</string>
    <string name="login_by_verifycode">验证码登录</string>
    <string name="phone_number">手机号码:</string>
    <string name="input_phone_number">请输入手机号码</string>
    <string name="login_password">登录密码:</string>
    <string name="input_password">请输入密码:</string>
    <string name="forget_password">忘记密码</string>
    <string name="remember_password">记住密码</string>
    <string name="login">登&#160; &#160; &#160; 录</string>
    <string name="input_new_password">输入新密码:</string>
    <string name="input_new_password_hint">请输入新密码</string>
    <string name="confirm_new_password">确认新密码:</string>
    <string name="input_new_password_again">请再次输入新密码</string>
    <string name="verifycode">&#160; &#160; 验证码:</string>
    <string name="verifycode2">&#160; &#160; &#160; &#160; 验证码:</string>
    <string name="input_verifycode">请输入验证码</string>
    <string name="get_verifycode">获取验证码</string>
    <string name="done">确&#160; &#160; &#160;定</string>
    <string name="main">欢迎来到主页面</string>
    <string name="ret">返回</string>
     <string name="get">获取验证码</string>

        新建一个负责文字大小的xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="csize">17sp</dimen>
    <dimen name="bsize">20sp</dimen>
    <dimen name="lsize">50sp</dimen>
</resources>

        6.修改activity_main的页面

<?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:padding="10dp"
    android:orientation="vertical"
    android:background="@drawable/bg"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="@dimen/lsize"
        android:layout_marginTop="360dp"
        android:gravity="center"
        android:text="@string/main"
        android:textColor="@color/red"
        android:textSize="@dimen/bsize" />
    <Button
        android:id="@+id/ret"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/ret"
        android:layout_marginTop="60dp"></Button>
</LinearLayout>

        修改后的样式如下图所示

         到这里我们的准备工作就算完成了

1.编写activity_login的页面(如果没有需求请不要修改id的名称)

<?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"
    tools:context=".LoginActivity">


    <RadioGroup
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="@dimen/lsize"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/word"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="@string/login_by_password"
            android:textSize="@dimen/csize"
            android:checked="true"/>

        <RadioButton
            android:id="@+id/veryword"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="@string/login_by_verifycode"
            android:textSize="@dimen/csize"/>
    </RadioGroup>




    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/lsize"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="@string/phone_number"
            android:textColor="@color/black"
            android:textSize="@dimen/csize" />

        <EditText
            android:id="@+id/etphone"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            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/csize">
        </EditText>
    </LinearLayout>






    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/lsize"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tvword"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="@string/login_password"
            android:textColor="@color/black"
            android:textSize="@dimen/csize" />

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent">

            <EditText
                android:id="@+id/etword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:layout_marginTop="5dp"
                android:layout_marginBottom="5dp"
                android:hint="@string/input_password"
                android:inputType="numberPassword"
                android:maxLength="11"
                android:textColor="@color/black"
                android:textColorHint="@color/grey"
                android:textSize="@dimen/csize">

            </EditText>


            <Button
                android:id="@+id/btnforget"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="@string/forget_password"
                android:layout_alignParentRight="true"
                android:textColor="@color/black"
                android:textSize="@dimen/csize">
            </Button>


        </RelativeLayout>



    </LinearLayout>
    <CheckBox
        android:id="@+id/ckremember"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/remember_password"
        android:textColor="@color/black"
        android:textSize="@dimen/csize" />

    <Button
        android:id="@+id/btnremember"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/login"
        android:textColor="@color/black"
        android:textSize="@dimen/bsize" />



</LinearLayout>

2.编写登录页面的逻辑

public class LoginActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, View.OnClickListener {
    private TextView tvword;
    private EditText etword ;
    private Button btnforget;
    private CheckBox ckremember;
    private EditText etphone;
    private RadioButton word;
    private RadioButton veryword;
    private Button btnremember;
    private String code;
    private String www = "123456";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);


        word = findViewById(R.id.word);//密码登录
        veryword = findViewById(R.id.veryword);//验证码登录

        RadioGroup login = findViewById(R.id.login);//按钮控件
         etphone = findViewById(R.id.etphone);//手机号
         etword = findViewById(R.id.etword);//输入的密码
         tvword = findViewById(R.id.tvword);//密码登录
         btnforget = findViewById(R.id.btnforget);//忘记密码
         ckremember = findViewById(R.id.ckremember);//记住密码
         btnremember = findViewById(R.id.btnremember);//登录

        etphone.addTextChangedListener(new HideTextWatcher(etphone,11));
        etword.addTextChangedListener(new HideTextWatcher(etword,6));

        btnforget.setOnClickListener(this);//忘记密码
        btnremember.setOnClickListener(this);//登录
        //给login设置单选监听器
        login.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        switch (checkedId){
            case R.id.word:
                tvword.setText(getString(R.string.login_password));
                etword.setHint(getString(R.string.input_new_password));
                btnforget.setText(getString(R.string.forget_password));
                ckremember.setVisibility(View.VISIBLE);
            break;


            case R.id.veryword:
                tvword.setText(getString(R.string.verifycode));
                etword.setHint(getString(R.string.input_verifycode));
                btnforget.setText(getString(R.string.get_verifycode));
                ckremember.setVisibility(View.GONE);
            break;

        }
    }


    @Override
    public void onClick(View v) {
        String phone = etphone.getText().toString();
        switch (v.getId()){
            case R.id.btnforget:
                if(phone.length()<11){
                    Toast.makeText(this, "请输入正确的手机号码", Toast.LENGTH_SHORT).show();
                    return;
                }
                if(word.isChecked()){
                    Intent intent = new Intent(this,ForgetWordActivity.class);
                    intent.putExtra("phone",phone);
                   startActivityForResult(intent,100);

                }else  if(veryword.isChecked()){
                    code  = String.format("%06d",new Random().nextInt(999999));
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("请记住验证码");
                    builder.setMessage("手机号:"+phone+"\t,本次的验证码"+code+"\t,请输入验证码");
                    builder.setPositiveButton("好的",null);
                    AlertDialog dialog = builder.create();
                    dialog.show();
                }
            break;

            case R.id.btnremember:
                if(word.isChecked()){
                    if(www.equals(etword.getText().toString())){
                       loginSuccess();
                    }else {
                        Toast.makeText(this, "请输入正确的密码", Toast.LENGTH_SHORT).show();
                        return;
                    }
                }else if(veryword.isChecked()) {
                    if(code.equals(etword.getText().toString())){
                        loginSuccess();
                    }else {
                        Toast.makeText(this, "请输入正确的验证码", Toast.LENGTH_SHORT).show();
                        return;
                    }
                }

            break;

        }
    }

    private void loginSuccess() {
        String desc =String.format("您的手机号码是%s ,恭喜您通过登录验证,点击'确定'按钮返回上个页面",etphone.getText().toString());
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("登录成功");
        builder.setMessage(desc);
        builder.setPositiveButton("确定返回", ( dialog, which)-> {
            finish();
        });
        AlertDialog.Builder builder1 = builder.setNegativeButton("继续看看", ( dialog, which)-> {
            startActivity(new Intent(this,MainActivity.class));
        });


        AlertDialog dialog = builder.create();
        dialog.show();
    }


    //会自动接收目标页面回传的值
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == 100 && resultCode == 200 ){
            String revalue = data.getStringExtra("msg");
            www=revalue;
        }
    }


    //隐藏输入法
    private class HideTextWatcher implements TextWatcher {
        private int maxLength;
        private EditText et;
        public HideTextWatcher(EditText etphone, int i) {
            this.et=etphone;
            this.maxLength=i;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            //隐藏输入法
           if(s.toString().length() ==maxLength){
               ViewTuil.hidekey(LoginActivity.this,et);
           }
        }
    }
}

3.返回登录页面(放在MainActivity的onCreate方法中)

        findViewById(R.id.ret).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

4.编写忘记密码的页面

<?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"
    tools:context=".ForgetWordActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="@dimen/lsize"
            android:text="@string/input_password"
            android:textSize="@dimen/csize"
            android:textColor="@color/black"
            android:padding="15dp" />
        <EditText
            android:id="@+id/one"
            android:layout_width="0dp"
            android:layout_height="@dimen/lsize"
            android:layout_weight="1"
            android:inputType="numberPassword"
            android:hint="@string/input_new_password_hint"/>
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="@dimen/lsize"
            android:text="@string/input_new_password"
            android:textSize="@dimen/csize"
            android:textColor="@color/black"

            android:padding="15dp" />
        <EditText
            android:id="@+id/two"
            android:layout_width="0dp"
            android:layout_height="@dimen/lsize"
            android:layout_weight="1"
            android:inputType="numberPassword"
            android:hint="@string/input_new_password_again"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="@dimen/lsize"
            android:text="@string/verifycode2"
            android:textSize="@dimen/csize"
            android:textColor="@color/black"
            android:padding="15dp" />

        <EditText
            android:id="@+id/code"
            android:layout_width="0dp"
            android:layout_height="@dimen/lsize"
            android:layout_weight="1"
            android:hint="@string/input_new_password_again"/>
        <Button
            android:id="@+id/btncode"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="@string/get"/>

    </LinearLayout>

    <Button
        android:id="@+id/modify"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/done"
        android:textColor="@color/black"
        android:textSize="@dimen/csize"></Button>

</LinearLayout>

5..编写忘记密码的逻辑(我的参数跳转使用的是老方法,老方法没有过期)

public class ForgetWordActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText one;
    private EditText two;
    private EditText code;
    private String phone;
    private String verycode="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_forget_word);


          one = findViewById(R.id.one);//密码
          two = findViewById(R.id.two);//确认密码
          code = findViewById(R.id.code);//验证码

        Button   btncode = findViewById(R.id.btncode);//获取验证码
        Button   modify = findViewById(R.id.modify);//修改


        btncode.setOnClickListener(this);
        modify.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        phone = getIntent().getStringExtra("phone");

          switch (v.getId()){
            case R.id.btncode:
                verycode  = String.format("%06d",new Random().nextInt(999999));//生成6位数的随机数
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("请记住验证码");//设置弹出的标题
                builder.setMessage("手机号:"+phone+"\n本次的验证码"+verycode+"\n请输入验证码");//设置弹出的内容
                builder.setPositiveButton("好的",null);//设置弹出的按钮
                AlertDialog dialog = builder.create();
                dialog.show();//弹出
                break;
            case R.id.modify:

                String one1 = one.getText().toString();
                String two1 = two.getText().toString(); 
                if(one1.length()<6){
                    Toast.makeText(this, "您的密码长度必须大于等于6位", Toast.LENGTH_SHORT).show();
                    return;
                }
                if(!one1.equals(two1)){
                    System.out.println("不一致");
                    Toast.makeText(this, "您两次输入的密码不一致", Toast.LENGTH_SHORT).show();
                    return;
                }
                if("".equals(verycode)){
                    Toast.makeText(this, "请您先获取验证码", Toast.LENGTH_SHORT).show();
                    return;
                }


                if(!verycode.equals(code.getText().toString())){
                    System.out.println("验证码错误");
                    Toast.makeText(this, "请输入正确的验证码", Toast.LENGTH_SHORT).show();
                    return;
                }

                Toast.makeText(this, "密码修改成功", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent();
                intent.putExtra("msg",one1);

                //携带数据回到源页面
                setResult(200,intent);
                //已经回去了
                finish();
                break;
        }
    }
}

将主页面改为LoginActivity

如果主页面不适配的话可以添加以下代码,可以自动适配屏幕大小

getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_FULLSCREEN|
                View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

效果展示图

1.密码登录(初始密码)

2.验证码的登录

3.忘记密码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1044823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【斯坦福cs324w】中译版 大模型学习笔记十 环境影响

环境影响 温室气体排放水足迹&#xff1a;数据中心使用水进行冷却&#xff1b;发电需要用水释放到环境中的化学物质很多是对人类有害的 如何计算数据中心能源消耗 简单表示形式 模型训练过程 参考资料 datawhale so-large-lm学习资料

AWS-Lambda之导入自定义包-pip包

参考文档&#xff1a; https://repost.aws/zh-Hans/knowledge-center/lambda-import-module-error-python https://blog.csdn.net/fxtxz2/article/details/112035627 单来说,以 " alibabacloud_dyvmsapi20170525 " 包为例 mkdir /tmp cd ./tmp mkdir python pip ins…

idea开发Springboot出租车管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 出租车管理系统是一套完善的完整信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c; 系统具有完整的源代码和数据…

Mysql基础【操作表中数据入门查询】

一、DML&#x1f353; DML主要是对数据进行增&#xff08;insert&#xff09;删&#xff08;delete&#xff09;改&#xff08;update&#xff09;操作。 (一)、添加数据&#x1f95d; 语法格式&#xff1a; insert into 表名 &#xff08;字段名1&#xff0c;字段名2...&a…

2024年【MCM/ICM】美国大学生数学建模竞赛优秀论文(免费下载)

一、前言 美国大学生数学建模竞赛&#xff08;MCM/ICM&#xff09;由美国数学及其应用联合会主办&#xff0c;是最高的国际性数学建模竞赛&#xff0c;也是世界范围内最具影响力的数学建模竞赛&#xff0c;一般也指数学建模竞赛。赛题内容涉及经济、管理、环境、资源、生态、医…

APP开发费用估算方法

估算APP开发费用是一个重要的项目管理步骤&#xff0c;它有助于确定项目的总成本&#xff0c;并帮助您在项目规划阶段做出决策。APP开发费用估算的方法可以根据项目的规模、复杂性、功能和技术选择而异&#xff0c;以下是一些常见的APP开发费用估算方法&#xff0c;希望对大家有…

Vue3最佳实践 第五章 Vue 组件应用 1( Props )

本章带领大家理解组件、props、emits、slots、providers/injects&#xff0c;Vue 插件 等Vue组件使用的基础知识。 5.1 组件注册5.2 Props5.2.1 组件之间如何传值5.2.2 参数绑定 v-bind5.2.3 参数类型5.2.4 props 默认与必填5.2.5 验证设置5.2.6 useAttrs 属性设置 第一章 Vue3…

regexp 应用

今天同事拿出个小栗子 1 如果用like的话 1,22 的情况会被字符串2匹配到这样会有问题 这里需要用concat将uids处理下 比如第一条处理成&#xff0c;1,2&#xff0c;3&#xff0c; 的形式 去模糊匹配 ‘%,1,%’ 当然like这种模糊匹配不太建议使用 2 regexp 用法 单个值 &#x…

SpringBoot的excel模板导出

Word的模板导出(参考&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/quickstart/fill) 创建有两个sheet的excel文件模板 将模板文件放入resource\templates/doc下使用 public void exportUavInfoExcel(HttpServletResponse response, CaseExportRPO cas…

如何更改注册表使系统暂停更新时间延长

1、创建一个文本文件&#xff0c;命名为&#xff1a;“stopupdate.reg”&#xff0c;然后用记事本或者代码编辑器打开&#xff0c;复制以下代码&#xff1a; Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings] "F…

气传导耳机有哪些好处?热门气传导耳机推荐

​随着气传导耳机的快速发展&#xff0c;在运动、办公等场合能够经常看到&#xff0c;带来了前所未有的舒适体验。作为一种新型耳机类型&#xff0c;相较传统入耳式耳机来说&#xff0c;更有利于耳道卫生&#xff0c;在听歌时还能保持对环境声的感知。面对市面上这么多气传导耳…

Docker(二)、linux环境Docker的部署以及构建镜像

linux环境Docker的部署以及构建镜像 一、docker部署1、快速部署常用的命令&#xff1a;1.1、demo-部署tomcat1.2、tomcat容器内部结构1.2.1、每个tomcat容器&#xff0c;都包含三个组件1.2.2、在容器内部执行命令 1.3、容器生命周期 二、Dockerfile构建镜像1、demo-Dockerfile自…

[Linux入门]---进程优先级

文章目录 1.进程优先级基本概念 2.查看系统进程PRI and NI 3.查看进程优先级的命令引入其他概念 1.进程优先级 基本概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的…

golang工程——常用数据结构底层原理【mao、slice、func、string】

字符串 其实就是字符数组 注意 字节数组与字符串可以相互转换 a : "hello world" b : []byte(a) c : string(b)字节数组转换为字符串在运行时调用了slicebytetostring函数。需要注意的是&#xff0c;字节数组与字符串的相互转换并不是简单的指针引用&#xff0c;…

下划线在键盘上怎么打?这3个方法快收藏!

“我最近的工作中好像很多文件里都有下划线&#xff0c;但是我不知道在键盘上应该怎么把下划线打出来&#xff0c;有没有知道的朋友呀&#xff1f;” 在计算机文档和编程中&#xff0c;下划线是一个常见的特殊字符。很多用户在使用电脑时可能也经常需要用到下划线。但是下划线在…

除静电离子风机在无尘车间的应用

除静电离子风机在无尘车间中的应用非常广泛&#xff0c;主要是用来控制车间内的静电荷&#xff0c;防止静电对车间内的电子元器件、电路板等敏感部件产生损害。 具体来说&#xff0c;除静电离子风机通常采用电离器产生大量负离子&#xff0c;将车间内的静电荷中和成无害的水蒸气…

基于微信小程序的高校学生事务考试通知管理系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

基于Java SpringBoot 的书籍学习平台,附源码,数据库

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 功能总览4平台设计4.1 平台功能模块设计4.2数据库设计4.2.1概念模型设计4.2.2物理…

100GBASE-DR光模块:高速数据中心互连的全新选择

100GBASE-DR光模块相较于传统的100G QSFP28光模块采用的是PAM4调制&#xff0c;单波长传输数据率更高&#xff0c;具有低功耗、高密度、高可靠性等优点&#xff0c;更适用于高速数据中心互连方案部署。本文将从100G QSFP28 DR光模块的概念界定、日常运行流程及其场景方案等角度…

ubuntu中的系统消息中显卡显示llvmpipe (LLVM 10.0.0, 256 bits)

这是我在使用ubuntu系统时出现的问题&#xff0c;网上搜到很多解决的办法&#xff0c;我是一顿操作&#xff0c;后来看到这位老哥的帖子解决了。 集Linux / Ubuntuwin10双系统安装记录(2):AMD核显驱动引发的问题 - 知乎上一篇中我们提到了 astroR2&#xff1a;Linux / Ubuntuw…