Android开发学习-中级控件

Drawable

Android把所有能够显示的图形都抽象为Drawable类(可绘制的)。

这里的图形不止是图片,还包括色块、画板、背景等。
包含图片在内的图形文件放在res目录的各个drawable目录下,其中drawable目录一般保存描述性的XML文件,而图片文件一般放在具体分辨率的drawable目录下。例如:

同尺寸的手机有可能分辨率不同,手机分辨率就高不就低,因为分辨率低了屏幕会有模糊的感觉)。
drawable-ldpi里面存放低分辨率的图片 (如240x320),现在基本没有这样的智能手机了
drawable-mdpi里面存放中等分辨率的图片 (如320x480) ,这样的智能手机已经很少了
drawable-hdp里面存放高分辨率的图片(如480X800),一般对应4英寸~4.5英寸的手机(但不绝对,
drawable-xhdpi里面存放加高分辨率的图片 (如720x1280) ,一般对应5英寸~5.5英寸的手机。drawable-xxhdpi里面存放超高分辨率的图片 (如1080x1920),一般对应6英寸~6.5英寸的手机
drawable-xxxhdpi里面存放超超高分辨率的图片(如1440x2560) ,一般对应7英寸以上的平板电脑
基本上,分辨率每加大一级,宽度和高度就要增加二分之一或三分之一像素。

如果各目录存在同名图片,Android就会根据手机的分辨率分别适配对应文件夹里的图片。

在开发App时,为了兼容不同的手机屏幕,在各目录存放不同分辨率的图片,才能达到最合适的显示效果。例如,在drawable-hdpi放了一张背景图片bg,png (分辨率为480x800),其他目录没放,使用分辨率为480X800的手机查看该App界面没有问题,但是使用分辨率为720x1280的手机查看该App会发现背景图片有点模糊,原因是Android为了让bg,png适配高分辨率的屏幕,强行把bg.png拉伸到了720x1280,拉伸的后果是图片变模糊了。
在XML布局文件中引用图形文件可使用“@drawable/不含扩展名的文件名称”这种形式,如各视图的background属性、ImageView和lmageButton的src属性、TextView和Button四个方向的drawable***系列属性都可以引用图形文件。

形状shape图形

shape图形又称形状图形,它用来描述常见的几何形状,包括矩形、圆角矩形、圆形、椭圆等。用好形状图形可以让App页面不再呆板还可以节省美工不少工作量。
形状图形的定义文件放在drawable目录下,它是以shape标签为根节点的XML描述文件。根节点下定义了6个节点,分别是: size(尺寸)、stroke(描边)、corners (圆角)、solid (填充)、padding (间隔)、gradient(渐变),各节点的属性值主要是长宽、半径、角度以及颜色等。下面是形状图形各个节点及其属性的简要说明。
1. shape (形状)
shape是形状图形文件的根节点,它描述了当前是哪种几何图形。下面是shape节点的常用属性说明。

形状类型说明
rectangle矩形。默认值
oval椭圆。此时corners节点会失效
line直线。此时必须设置stroke节点,不然会报错
ring圆环

代码:

shape_rect_gold.xml
shape_rect_voal.xml 

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

<!--    指定形状内部填充颜色-->
    <solid android:color="#ffdd66"></solid>
<!--    指定形状轮廓与颜色-->
<stroke android:width="1dp" android:color="#aaaaaa"/>
<!--    指定四个圆角的半径-->

    <corners android:radius="10dp"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">


<!--    指定形状内部填充颜色-->
    <solid android:color="#ff66aa"></solid>
<!--    指定形状轮廓与颜色-->
<stroke android:width="1dp" android:color="#aaaaaa"/>
<!--    指定四个圆角的半径-->

</shape>
<?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="com.pshdhx.middleComponent.ShapeActivity">

    <View
        android:id="@+id/view_content"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_rect"
            android:layout_width="0dp"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:text="矩形"
            />
        <Button
            android:id="@+id/btn_oval"
            android:layout_width="0dp"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:text="椭圆"
            />
    </LinearLayout>

</LinearLayout>
public class ShapeActivity extends AppCompatActivity implements View.OnClickListener {

    View view;

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

        view = findViewById(R.id.view_content);
        view.setBackgroundResource(R.drawable.shape_rect_gold);
        findViewById(R.id.btn_rect).setOnClickListener(this);
        findViewById(R.id.btn_oval).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_rect:
                view.setBackgroundResource(R.drawable.shape_rect_gold);
                break;
            case R.id.btn_oval:
                view.setBackgroundResource(R.drawable.shape_rect_voal);
                break;
        }
    }
}

效果:

九宫格图片-.9图片

将某张图片设置成视图背景时,如果图片尺寸太小,则系统会自动拉伸图片将之填满背景。

可是一旦图片拉的过大,其画面容易变得模糊。

九宫格图片*.9.png可以控制边角处,不会进行拉伸。

上边缘线和左边缘线控制水平和竖直的拉伸效果,将其设置,可以不拉伸边角处。

下边缘线和右边缘线控制文字在显示区域内的效果。

图形状态列表

状态类型的属性名称说明适用的控件
state_pressed是否按下按钮Button
state_checked是否勾选复选框CheckBox、单选按钮RadioButton
state_focused是否获取焦点文本编辑框EditText
state_selected是否选中各控件通用

btn_selector.xml 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:drawable="@drawable/shape_rect_gold"/>
    <item  android:drawable="@drawable/shape_rect_voal"/>
</selector>
android:background="@drawable/btn_selector"

复选框-checkbox

CompoundButton再xml中,主要使用以下两个属性

        checked:指定勾选状态true/false

        button:指定左侧勾选图标的图形资源,如果不指定,则系统默认。

CompoundButton在Java中主要使用下列4种方法

        setChecked

        setButtonDrawable:设置左侧勾选图标的图形资源

        setOnCheckedChangeListener:监听器

        isChecked

开关按钮-switch

textOn:设置右侧开启时的文本

textOff:设置左侧关闭时的文本

track:设置开关轨道的背景

thumb:设置开关表示的图标

单选按钮组

RadioGroup

RadioButton

文本输入框-EditText

监听文本编辑器

addTextChangedListener

beforeTextChanged:在文本改变之前触发

onTextChanged:在文本改变过程中触发

afterTextChanged:在文本改变之后触发

edit_phone.addTextChangedListener(new HideTextWatcher(edit_phone,11));

private class HideTextWatcher implements TextWatcher{
    private EditText mView;
    private int maxLength;
    public HideTextWatcher(EditText v,int maxLength){
        this.mView = v;
        this.maxLength = maxLength;
    }
}

对话框

提醒对话框-AlertDialog

就是卸载时,带着确认或者是取消的对话框

<Button
        android:id="@+id/btn_alert_dialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="alertDialog"
        android:text="点击弹出对话框"/>
    <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
public void alertDialog(View view) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        TextView tv_result = findViewById(R.id.tv_result);
        builder.setTitle("尊敬的用户");
        builder.setMessage("你真的要卸载吗?");
        builder.setPositiveButton("残忍卸载",(dialog,witch)->{
            tv_result.setText("我已残忍卸载");
        });

        builder.setNegativeButton("我再想一下",(dialog,witch)->{
            tv_result.setText("我再想一下吧!");
        });
        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

setIcon:设置对话框的标题图标

setNeutralButton:设置中性按钮的信息,包括按钮文本和点击的监听器。

日期对话框-DatePickerDialog

<Button
        android:id="@+id/selectDateDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="selectDateDialog"
        android:text="请选择日期"/>


    <DatePicker
        android:id="@+id/date_picker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:datePickerMode="spinner"
        android:calendarViewShown="false"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="确定"
        android:onClick="selectDateClick"
        android:id="@+id/btn_ok"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_date"/>
public class DatePickerDialogActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {

    TextView tv_date;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_date_picker_dialog);
        tv_date = findViewById(R.id.tv_date);
    }


    public void selectDateClick(View view) {

        DatePicker date_picker = findViewById(R.id.date_picker);
        String desc = String.format("您选择的日期是%s",date_picker.getYear()+"-"+(date_picker.getMonth()+1)+"-"+date_picker.getDayOfMonth());
        tv_date.setText(desc);

    }

    public void selectDateDialog(View view) {
        DatePickerDialog dialog = new DatePickerDialog(this,this,2090,5,20);
        dialog.show();
    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        String desc = String.format("您选择的日期是%s",year+"-"+(month+1)+"-"+dayOfMonth);
        Toast.makeText(this,desc,Toast.LENGTH_LONG).show();
        tv_date.setText(desc);
    }
}

结果:

时间对话框-TimePickerDialog

<Button
        android:id="@+id/selectTimeDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="selectTimeDialog"
        android:text="请选择时间"/>


    <TimePicker
        android:id="@+id/time_picker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:timePickerMode="spinner"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="确定"
        android:onClick="selectTimeClick"
        android:id="@+id/btn_ok"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_time"/>
public class TimePickerActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {

    TextView tv_time;
    TimePicker time_picker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_picker);
        tv_time = findViewById(R.id.tv_time);
        time_picker = findViewById(R.id.time_picker);
    }

    public void selectTimeDialog(View view) {
        TimePickerDialog dialog = new TimePickerDialog(this,android.R.style.Theme_Holo_Light_Dialog_NoActionBar, this, Calendar.getInstance().get(Calendar.HOUR_OF_DAY),Calendar.getInstance().get(Calendar.MINUTE),true);
        dialog.show();

    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    public void selectTimeClick(View view) {
        String desc = String.format("您选择的时间是%s",time_picker.getHour()+":"+time_picker.getMinute());
        tv_time.setText(desc);
    }

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        String desc = String.format("您选择的时间是%s",hourOfDay+":"+minute);
        tv_time.setText(desc);
    }
}

效果 

 

登录Demo 

布局文件:

<?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="com.pshdhx.middleComponent.LoginMainActivity">


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

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

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

    </RadioGroup>

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

        <TextView
            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" />
        
        <EditText
            android:id="@+id/et_phone"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:hint="@string/input_phone_number"
            android:inputType="number"
            android:maxLength="11"
            android:textSize="@dimen/common_font_size"
            />
    </LinearLayout>

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

        <TextView
            android: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" />

        <EditText
            android:id="@+id/et_password"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:hint="@string/input_password"
            android:inputType="numberPassword"
            android:maxLength="6"
            android:textSize="@dimen/common_font_size"
            />
        <Button
            android:id="@+id/btn_forgetPassword"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:textSize="@dimen/common_font_size"
            android:text="@string/forget_password"
            android:textColor="@color/black"
            android:background="@color/design_default_color_primary_dark"/>

    </LinearLayout>

    <CheckBox
        android: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"/>

    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_layout_height"
        android:text="@string/login"
        android:textColor="@color/black"
        android:textSize="@dimen/common_font_size"/>

</LinearLayout>

 代码文件:

public class LoginMainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, View.OnClickListener {
    RadioGroup rg_login;
    TextView tv_password;
    EditText et_password;
    EditText et_phone;
    Button btn_forgetPassword;
    Button btn_login;
    CheckBox ck_remember;
    RadioButton rb_password;
    RadioButton rb_verifycode;
    private String mVerifyCode = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_main);
        rg_login = findViewById(R.id.rg_login);
        btn_login = findViewById(R.id.btn_login);
        rb_password = findViewById(R.id.rb_password);
        rb_verifycode = findViewById(R.id.rb_verifycode);
        tv_password = findViewById(R.id.tv_password);
        et_password = findViewById(R.id.et_password);
        et_phone = findViewById(R.id.et_phone);
        et_phone.addTextChangedListener(new HideTextWatcher(et_phone, 11));
        et_password.addTextChangedListener(new HideTextWatcher(et_password, 6));
        btn_forgetPassword = findViewById(R.id.btn_forgetPassword);
        ck_remember = findViewById(R.id.ck_remember);
        rg_login.setOnCheckedChangeListener(this);
        btn_login.setOnClickListener(this);

        btn_forgetPassword.setOnClickListener(this);
    }

    @Override
    public 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_forgetPassword.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_forgetPassword.setText(getString(R.string.get_verifycode));
                ck_remember.setVisibility(View.GONE);
                break;
        }
    }

    @Override
    public void onClick(View v) {
        String phone = et_phone.getText().toString();
        String password = et_password.getText().toString();
        switch (v.getId()) {
            case R.id.btn_forgetPassword:
                if (phone.length() < 11) {
                    Toast.makeText(this, "请输入正确的手机号码", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (rb_password.isChecked()) {
                    Intent intent = new Intent(this, LoginForgetActivity.class);
                    intent.putExtra("phone", phone);
                    startActivityForResult(intent, 8888);
                } else if (rb_verifycode.isChecked()) {
                    mVerifyCode = String.format("%6d", new Random().nextInt(999999));
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("请记住验证码");
                    builder.setMessage("手机号" + phone + "本次验证码是" + mVerifyCode + ",请输入验证码");
                    builder.setPositiveButton("好的", null);
                    AlertDialog alertDialog = builder.create();
                    alertDialog.show();
                }
                break;
            case R.id.btn_login:
                if(rb_password.isChecked()){
                    if(!password.equals("111111")){
                        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() {
        Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

    private class HideTextWatcher implements TextWatcher {

        private EditText mView;
        private int maxLength;

        public HideTextWatcher(EditText et_phone, int i) {
            this.mView = et_phone;
            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) {
                ViewUtils.hideOneInputMethod(LoginMainActivity.this, mView);
            }
        }
    }
}

public class ViewUtils {
    public static void hideOneInputMethod(Context context, EditText mView) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mView.getWindowToken(), 0);
    }
}

 效果图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qlik Sense : IntervalMatch(离散匹配)

什么是IntervalMatch IntervalMatch 前缀用于创建表格以便将离散数值与一个或多个数值间隔进行匹配&#xff0c;并且任选匹配一个或多个额外关键值。 语法&#xff1a; IntervalMatch (matchfield)(loadstatement | selectstatement ) IntervalMatch (matchfield,keyfield…

问卷与量表的区别,以及量表的信效度分析应该如何测量

最近在各个平台总能收到这样一个问题 “问卷如何进行信效度分析&#xff1f;”每次小编提到信效度分析时都会特意强调&#xff0c;只有量表才需要进行信度与效度分析&#xff0c;普通问卷&#xff08;单选、多选、填空等&#xff09;并不需要。那么今天就再深入探讨一下问卷与量…

如何选择便捷安全的黄金交易平台?

黄金交易平台的介绍 黄金交易平台是一个提供方便、安全的方式进行黄金交易的网上平台。 投资者可以通过这些平台进行黄金的买卖&#xff0c;参与黄金市场的投资活动。 这些平台提供了一个简单易用的界面&#xff0c;让投资者可以方便地进行交易操作。 选择合适的黄金交易平台…

数字图像处理(实践篇)三十四 OpenCV-Python绘制椭圆

目录 一 涉及的函数 二 实践 一 涉及的函数 cv2.ellipse(img,center,axes,angle,start_angle,end_angle,color,thickness) 参数: ①<

【计网·湖科大·思科】实验五 IPV4地址-分类地址和构建超网

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Markdown(2篇文章学会Markdown第二篇

目录 1. 图片1.1 行内形式图片&#xff1a;\!\[Alt text]\(/path/to/img.jpg "Optional title")1.2 参考形式图片&#xff1a;\!\[内容]\[1] \[1]: image_url "alt 提示" 2. 列表2.1 无序列表&#xff1a;*、或-2.2 有序列表&#xff1a;数字接着一个英文…

2024年【N1叉车司机】考试内容及N1叉车司机复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试内容是安全生产模拟考试一点通生成的&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材汇编出N1叉车司机仿真模拟考试。2024年【N1叉车司机】考试内容及N1叉车司机复审考试 1、【多选题…

JDK1.8新特性(Day24)

Lambda表达式 介绍 Lambda表达式是一种没有名字的函数,也可称为闭包&#xff0c;是Java 8 发布的最重要新特性。本质上是一段匿名内部类&#xff0c;也可以是一段可以传递的代码。还有叫箭头函数的... 闭包 闭包就是能够读取其他函数内部变量的函数,比如在java中,方法内部的局…

Pyecharts魔法笔:探索多彩K线图的绘制与定制

标题&#xff1a;Pyecharts绘制多种炫酷K线图参数说明代码实战 在数据可视化领域&#xff0c;K线图是股票市场中常用的一种图表类型&#xff0c;用于展示一段时间内的开盘价、收盘价、最高价和最低价。Pyecharts是一个强大的Python可视化库&#xff0c;支持绘制各种图表&#…

【开源】基于JAVA+Vue+SpringBoot的网上药店系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药品档案模块2.4 药品订单模块2.5 药品收藏模块2.6 药品资讯模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 药品表3.2.3 药品订单表3.2.4 药品收藏表3.2.5 药品留言表…

防御保护笔记02

防火墙 防火墙的主要职责在于&#xff1a;控制和防护 ---- 安全策略 --- 防火墙可以根据安全策略来抓取流量 防火墙分类 按物理特性划分 软件防火墙 硬件防火墙 按性能划分 百兆级防火墙 吞吐量&#xff1a;指对网络、设备、端口、虚电路或其他设施&#xff0c;单位时间内成…

【JAVA语言-第16话】集合框架(三)——Set、HashSet、LinkedHashSet、TreeSet集合的详细解析

目录 Set集合 1.1 概述 1.2 特点 1.3 HashSet集合 1.3.1 概述 1.3.2 哈希表 1.3.3 哈希值 1.3.4 练习 1.3.5 HashSet存储自定义类型元素 1.4 LinkedHashSet集合 1.4.1 概述 1.4.2 特点 1.4.3 练习 1.5 TreeSet集合 1.5.1 概述 1.5.2 练习 1.6 HashSet、Lin…

北京兼职挣外快,不知道怎么交税?

1.将甲方给的合同打印两份&#xff0c;都签字画押 2.微信搜索对应 区的税务进行预约 3.地址一般直接搜那个去的税务局&#xff0c;可以搜到我们预约对应的地方 4.预约完成&#xff0c;携带身份证原件&#xff0c;身份证复印件&#xff0c;打印出来的合同一份&#xff0c;去了大…

C/C++ - 内存管理(C++)

堆栈 C中的栈和堆是用于存储变量和对象​​的两个主要内存区域。栈是一种自动分配和释放内存的区域&#xff0c;用于存储局部变量和函数调用的上下文。栈上的内存分配和释放是自动进行的&#xff0c;无需手动管理。堆是动态分配内存的区域&#xff0c;用于存储动态创建的对象和…

【Linux】Linux下多线程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 前置&#xff1a;进程地址空间和页表1.1 如何看待进程地址空间和页表1.2 虚拟地址…

Python算法题集_和为K的子数组

本文为Python算法题集之一的代码示例 题目560&#xff1a;和为K的子数组 说明&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nu…

AS自治系统中的路由协议---RIP、OSPF、BGP

一、AS --- 自治系统 将网络分块管理 --- 由单一的机构或组织所管理 的一系列IP网络及其设备的集合 AS的管理&#xff1a;为了方便对AS进行管理&#xff0c;我们给AS设计了一个编号称为AS 号 --- 16位二进制构成 --- 0 - 65535 ---- 目前也存在拓展版的AS 号 --- 32位二进制构…

计网Lesson12 - UDP客户服务器模型和UDP协议

文章目录 丢个图在这&#xff0c;实在不是很明白在讲啥&#xff0c;等学完网编的我归来狠狠拿下它

GitHub 上传文件夹到远程仓库、再次上传修改文件、如何使用lfs上传大文件、github报错一些问题

按照大家的做法&#xff0c;把自己遇到的问题及解决方案写出来&#xff08;注意&#xff1a;Error里面有些方法有时候我用可以成功&#xff0c;有时候我用也不能成功&#xff0c;写出来仅供参考&#xff0c;实在不行重头再clone&#xff0c;add&#xff0c;commit&#xff0c;p…

Java强训day9(选择题编程题)

选择题 class Person {String name "No name";public Person(String nm) {name nm;} } class Employee extends Person {String empID "0000";public Employee(String id) {super(" ");//要调用父类的有参构造方法否则报错empID id;} } pu…