校园二手交易平台实训报告

news2024/12/25 9:21:29

 

一、设计背景

1. 需求分析

2. 课题研究的目的和意义

二、系统需求分析与开发环境

1. 系统功能需求

2. 系统界面需求

3. 开发环境

三、系统设计

四、系统测试

1. 脑模拟器测试

五、总结与展望

六、重要程序

1. LoginActivity

2. RegisterActivity

3. PersonalCenterActivity

4. AllCommodityAdapter

  • 设计背景
  1. 需求分析

如今的大学校园中随着大学生的购买能力的提高存在着两种局面。一是大学期间购买的收纳类、实用类物品,在毕业季大家面临带不走、不舍得扔的尴尬局面;二是购买的东西中越来越多的大家用不上的物品,这些物品成了大部分大学生的累赘。因此,低价卖掉这些仍可以继续利用的物品是一个两全其美的方法于是校园二手交易市场诞生了。目前,二手商品交易成为了当代大学生课余生活大热门。以我校为例,每年都要举办红红火火的跳蚤市场(如大四毕业时庞大的物品展卖),可见大学生对二手商品交易的需求,然而由于信息交流的落后,很多只限于校园公告栏或者请人代为宣传的方式进行交易。这种方式有很多局限性和偶然性,远远无法满足广大学子交易的需求。

建立一个校园二手交易平台可以大大方便在校的学生,方便了同学也营造了节约光荣,浪费可耻的校园文化氛围。最主要的是,它也可以通过网络将自己不用的东西放在网上,也可在网上找到自己需要的东西,物美价廉,达到双靡。

系统完成的主要功能有:用户设置功能、发布信息功能、信息管理功能、搜索信息功能,留言功能,及系统管理功能,具体业务功能包括如下:

用户注册:学生可利用自已学号进行注册,注册实现实名制。

用户登录:只有登录用户才能进行信息发布。管理员登录后可以进行系统管理。

发布信息:普通用户和管理员登录后都可以发布信息。

修改信息:普通用户可以修改自己发布的信息,管理员可以修改所有信息。

删除信息:普通用户可以删除自己发布的信息,管理员可以删除所有信息。

浏览信息:游客、普通用户和管理员可以浏览所有发布的信息。

搜索信息:游客、普通用户和管理员可以用关键字搜索所有发布的信息。普通用户可以搜索自己发布的所有信息。

发表留言:普通用户和管理员登录后都可以对发布信息进行留言。

查看留言:游客、普通用户和管理员都可以查看发布信息的留言。

删除留言:管理员可以删除留言。

添加二手指南:管理员可以添加二手指南。

查看二手指南:游客、普通用户和管理员都可以查看二手指南。

修改二手指南:管理员可以修改二手指南。

删除二手指南:管理员可以删除二手指南。

  1. 课题研究的目的和意义

校园二手交易网为用户提供了一个二手交易的平台。根据大中学校商品情况及学生的实际需求,系统的主要功能模块为信息分类、信息搜索、发布信息、用户注册登陆等。系统可提供用户对自己发表的供求信息的删除,以及对用户信息的修改功能,可以方便用户对自己基本信息的管理。

建设一个校园二手用品交易软件, 就是开发一个主要面向大学生的需求的二手用品交易平台,方便大学生足不出户就可以浏览想要的物品,方便大家信息交流,提高交易水平。为在校学生提供一个高效、便利、规范的二手交易市场。同时对二手商品循环使用可以倡导资源的合理使用,构建和谐校园、节约型校园, 减少浪费,给予货物第二次生命。

  • 系统需求分析与开发环境
  1. 系统功能需求

随着科技的迅速发展校园二手商品交易市场也不仅仅局限于校园内摆地摊的形式,大家更多的是使用手机线上购物,我们的项目就是基于这样的局面产生的,让同学们足不出户就可以淘到自己所需要的物美价廉的物品。

校园二手淘项目需要包含登入注册功能,用户名和密码储存在Sharedpreferences轻型数据类中,按钮实现页面跳转。包括数据库的增删查改功能,采用的是SQLite数据库。

发布及查看二手商品信息阶段: 包括商品信息发布、 信息查看和信息留言等。商品信息按类别分类。发布人可以管理自已发布的信息,发布人有权对自己已发布信息进行修改、删除等操作。

  1. 系统界面需求

系统界面美观简洁,注册和登入的页面参考了许多app,要让页面做到简介美观,所以登入页面主页面都用到了自定义按钮样式和自定义输入框样式,按钮设计出颜色渐变的样式并加入圆角看起来不生硬,输入框同样加入了圆角的设计。

  1. 开发环境

Android studio 4.0.2+JDK1.8+gradle-6.1.1-all.zip

4. MVC 简介

模型-视图-控告器(MVC)是20世纪80年代Smalltalk-80出的一种软件模式,现在已经被广泛使用。

  1.  模型(Model)

模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑。

  1.  视图(View)

视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。

  1.  控制器(Controller)

控制器的工作就是根据用户的输入,控制用户界面显示和更新模型对象的状态。典型的MVC模式所包含的模块、每个模块的功能以及模块之间的关系如图2-1所示[2]:

图2-1 MVC组件的关系和功能

MVC模式的出现不仅实现的功能模块和显示模块的分离,同是赛马场还提高了应用系统的可维护性、可扩展性、可移植性和组件的可利用性。

在早期的程序中,如果不注意对数功能和显示的解耦合,常常估导致程序的复杂及难以维护,像VB,Delphi等RAD程序都有这种问题。甚至现在有C#,Java有时候也会出现把业务逻辑写在显示模块中的现象。

尽管MVC设计模式很早的提出了,但在Web项目的开发中引入MVC却是步履艰难。主要原因是在早期的Web项目开发中,程序语言和Html的分离一直难以实现,CGI程序以字条串输出的形式动态的生成html内容。直到基于J2EE的JSP Model2问世时才得以改观。它用JSP技术实现视图的功能,用Servlet技术实现控制器的功能,用JavaBean实现模型的功能。JSP Model2 结构如图2-2所示:

在Model 2这种框架结构中,Servlet作为控制器负责处理用户的请求以及创建JSP页面中所有要使用的Bean对象,并且还要根据用户的请求来返回到不同的JSP页面。

在使用Model 2开发框架时,一定要保证在JSP页面中不能包含任何的业务处理逻辑。它只是简单地得到对象或者在Servlet中创建的Bean,然后通过这些动态的内容来生成动态显示的页面。

Struts 本质上就是在Model 2的基础上实现一个MVC架构,它只有一个中心控制器,采用定制转向的URL并采用Action来处理逻辑。

5.系统功能模块设计

系统主要设计了用户设置功能、发布信息功能、信息管理功能、搜索信息功能,留言功能,及系统管理功能模块。

用户设置功能主要是用户注册必须填写所要求的个人资料,完成个人资料登入。

发布信息功能主要是为已注册用户的服务,登陆的用户可以即时发布自己的二手书商品信息,立刻就能浏览到。这是本系统的主要功能。

信息管理功能是帮助已发表信息的的用户管理自身发布的二手书商品信息的同时也管理短消息信息。此项功能也主要是服务于注册用户。

搜索信息功能是面向所有登陆到本系统的人员的,采用模糊查询的方法,遍历所有二手商品信息,搜索出浏览者感兴趣的内容。

留言功能是对某一二手书商品信息进行留言,还可以查看该信息的其他留言。

系统管理功能是系统管理员对系统所有信息资源进行统一管理的一个模块。系统功能结构如图3-2所示:

图 3-2 系统功能结构图

  1. 数据库结构

 数据库需求分析

对于数据库的需求主要体现在对数据库的提交信息、更新信息、删除信息、保存信息等。这些信息的存在都取决于各个功能模块的对信息的需求。通过对功能模块的具体操作,实现对数据库中信息的输入和输出。所以,针对各个功能模块的需求,设计如下的数据表和数据结构:

  1. Maste 类表:用于实现平台用户我实名制及平台基本信息:

学院信息:包括学院编号,学院名,描述等。

班级信息:包括班级编号,班级名,学院编号,描述等。

学生信息:包括学号,姓名,班级编号,学院编号等。

类型信息:包括类型编号,类型名,类型描述等。

交易地区信息:包括地区编号,地区名,地区描述等。

  1. Temp 类表:用于实现平台各模块:

用户信息:包括用户编号、用户名、密码、学号,及用户的其它相关信息等。

商品信息:商品编号、信息标题、信息内容,发布信息的用户,信息相关内容等。

商品留言信息:包括留言编号、商品信息编号、留言内容等。

 数据库概念结构设计

概念模型是对于信息世界的建模,是现实世界到信息世界的抽象,是数据库设计人员和用户之间进行交流的语言。它具有简洁明晰、易于理解和修改、便于向各种数据模型转换,从而生成相应的逻辑模式。

概念设计的目的是要确定系统的概念模型,因为概念模型是数据库系统的核心和基础,所以概念设计是数据库设计的关键。

 数据库逻辑表设计

数据库逻辑模型

表3-7 用户表(t_user)

字段名

数据类型

约束条件

说明

ID

VARCHAR(50)

Primary Key

用户编号

USERNAME

VARCHAR(10)

UNIQUE

用户

PASSWORD

varchar(100)

NOT NULL

用户密码

STU_ID

VARCHAR(50)

Foreign Key

学号

BIRTHDAY

DATETIME

NOT NULL

生日

PHOTO

SMALLINT(5)

NOT NULL

照片

QUESTION

VARCHAR(100)

NOT NULL

注册问题

ANSWER

VARCHAR(100)

NOT NULL

注册答案

EMAIL

VARCHAR(50)

---

EMAIL

QQ

VARCHAR(20)

---

QQ

CREATE_TIME

DATETIME

NOT NULL

注册时间

STATUS

TINYINT(3)

NOT NULL

状态

ROLE

TINYINT(3)

NOT NULL

权限

 

表3-8 商品信息表(t_message)

字段名

数据类型

约束条件

说明

ID

VARCHAR(50)

Primary Key

信息编号

MESSAGE_TITLE

VARCHAR(50)

UNIQUE

信息标题

TYPE_ID

VARCHAR(50)

Foreign Key

信息类型

AREA_ID

VARCHAR(50)

Foreign Key

交易地区

OLD_VALUE

SMALLINT(5)

NOT NULL

新旧值

PRICE

DECIMAL(10,0)

NOT NULL

商品价格

R_USER

VARCHAR(10)

NOT NULL

联系人

R_PHONE

VARCHAR(50)

NOT NULL

联系电话

R_EMAIL

VARCHAR(50)

---

EMAIL

MESSAGE_DESC

VARCHAR(200)

NOT NULL

信息详情

MESSAGE_PHOTO

VARCHAR(50)

---

信息图片

CREATE_TIME

DATETIME

NOT NULL

新增日期

FLAG

TINYINT(3)

NOT NULL

信息标志

TOP_VALUE

INTEGER

NOT NULL

人气值

CREATE_USER_ID

VARCHAR(50)

Foreign Key

发布用户

 

 

  • 系统设计

 

登入注册页面制作完后,做了一个导航页面,页面可以选择进入相应的功能模块,进入基础信息模块可以进行发布闲置、查看不同分类下的产品、进入个人中心等。商品基础信息页面加入了增删查改的功能,采用的是SQlite数据库,方便用户对商品编辑修改。页面的设计同样采用了按钮的自定义样式和输入框的自定义样式。页面个人中心模块头像部分设计了一个图片样式的自定义,给图片添加了一个边框,使页面看起来和谐统一美观。

 

  • 系统测试
  1. 脑模拟器测试
  • 重要程序
  1. LoginActivity

public class LoginActivity extends AppCompatActivity {

    EditText EtStuNumber,EtStuPwd;

    private String username;

    LinkedList<User> users = new LinkedList<>();

    @Override

    protected void onCreate(final Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_login);

        TextView tvRegister = findViewById(R.id.tv_register);

        //跳转到注册界面

        tvRegister.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Intent intent = new Intent(LoginActivity.this,RegisterActivity.class);

                startActivity(intent);

            }

        });

        EtStuNumber = findViewById(R.id.et_username);

        EtStuPwd = findViewById(R.id.et_password);

        Button btnLogin = findViewById(R.id.btn_login);

        btnLogin.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                boolean flag = false;

                if(CheckInput()) {

                    UserDbHelper dbHelper = new UserDbHelper(getApplicationContext(),UserDbHelper.DB_NAME,null,1);

                    users = dbHelper.readUsers();

                    for(User user : users) {

                        //如果可以找到,则输出登录成功,并跳转到主界面

                        if(user.getUsername().equals(EtStuNumber.getText().toString()) && user.getPassword().equals(EtStuPwd.getText().toString()) ) {

                            flag = true;

                            Toast.makeText(LoginActivity.this,"恭喜你登录成功!",Toast.LENGTH_SHORT).show();

                            Intent intent = new Intent(LoginActivity.this,MainActivity.class);

                            Bundle bundle = new Bundle();

                            username = EtStuNumber.getText().toString();

                            bundle.putString("username",username);

                            intent.putExtras(bundle);

                            startActivity(intent);

                        }

                    }

                    //否则提示登录失败,需要重新输入

                    if (!flag) {

                        Toast.makeText(LoginActivity.this,"学号或密码输入错误!",Toast.LENGTH_SHORT).show();

                    }

                }

            }

        });

    }

    //检查输入是否符合要求

    public boolean CheckInput() {

        String StuNumber = EtStuNumber.getText().toString();

        String StuPwd = EtStuPwd.getText().toString();

        if(StuNumber.trim().equals("")) {

            Toast.makeText(LoginActivity.this,"学号不能为空!",Toast.LENGTH_SHORT).show();

            return false;

        }

        if(StuPwd.trim().equals("")) {

            Toast.makeText(LoginActivity.this,"密码不能为空!",Toast.LENGTH_SHORT).show();

            return false;

        }

        return true;

    }

}

  1. RegisterActivity

public class RegisterActivity extends AppCompatActivity {

    EditText tvStuNumber,tvStuPwd,tvStuConfirmPwd;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_register);

        Button btnCancel = findViewById(R.id.btn_cancel);

        //返回到登录界面

        btnCancel.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                finish();

            }

        });

        tvStuNumber = findViewById(R.id.et_username);

        tvStuPwd = findViewById(R.id.et_password);

        tvStuConfirmPwd = findViewById(R.id.et_confirm_password);

        //注册点击事件

        Button btnRegister = findViewById(R.id.btn_register);

        btnRegister.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                //首先确保不为空

                if(CheckInput()) {

                    User user = new User();

                    user.setUsername(tvStuNumber.getText().toString());

                    user.setPassword(tvStuPwd.getText().toString());

                    UserDbHelper dbHelper = new UserDbHelper(getApplicationContext(),UserDbHelper.DB_NAME,null,1);

                    dbHelper.addUser(user);

                    Toast.makeText(RegisterActivity.this,"恭喜你注册成功!",Toast.LENGTH_SHORT).show();

                    //销毁当前界面

                    finish();

                }

            }

        });

    }

    //判断输入是否符合规范

    public boolean CheckInput() {

        String username = tvStuNumber.getText().toString();

        String password = tvStuPwd.getText().toString();

        String confirm_password = tvStuConfirmPwd.getText().toString();

        if(username.trim().equals("")) {

            Toast.makeText(RegisterActivity.this,"用户名不能为空!",Toast.LENGTH_SHORT).show();

            return false;

        }

        if(password.trim().equals("")) {

            Toast.makeText(RegisterActivity.this,"密码不能为空!",Toast.LENGTH_SHORT).show();

            return false;

        }

        if(confirm_password.trim().equals("")) {

            Toast.makeText(RegisterActivity.this,"确认密码不能为空!",Toast.LENGTH_SHORT).show();

            return false;

        }

        if(!password.trim().equals(confirm_password.trim())) {

            Toast.makeText(RegisterActivity.this,"两次密码输入不一致!",Toast.LENGTH_SHORT).show();

            return false;

        }

        return true;

    }

}

  1. PersonalCenterActivity

public class PersonalCenterActivity extends AppCompatActivity {

    TextView TvStuNumber;

    @Override

    protected void onCreate(final Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_personal_center);

        //取出登录时的登录名

        TvStuNumber = findViewById(R.id.tv_student_number);

        String StuNumber = this.getIntent().getStringExtra("username1");

        TvStuNumber.setText(StuNumber);

        //返回主界面

        Button btnBack = findViewById(R.id.btn_back);

        btnBack.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                finish();

            }

        });

        //点击修改密码按钮

        final Button btnModifyPwd = findViewById(R.id.btn_modify_password);

        btnModifyPwd.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Intent intent = new Intent(getApplicationContext(),ModifyPwdActivity.class);

                Bundle bundle = new Bundle();

                bundle.putString("stu_number",TvStuNumber.getText().toString());

                intent.putExtras(bundle);

                startActivity(intent);

            }

        });

        //点击查看我的发布按钮

        Button btnMyGoods = findViewById(R.id.btn_my_goods);

        btnMyGoods.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Intent intent = new Intent(getApplicationContext(),MyCommodityActivity.class);

                Bundle bundle = new Bundle();

                bundle.putString("stu_id",TvStuNumber.getText().toString());

                intent.putExtras(bundle);

                startActivity(intent);

            }

        });

        //点击查看我的收藏按钮

        Button btnMyCollection = findViewById(R.id.btn_my_collection);

        btnMyCollection.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Intent intent = new Intent(getApplicationContext(),MyCollectionActivity.class);

                Bundle bundle = new Bundle();

                bundle.putString("stuId",TvStuNumber.getText().toString());

                intent.putExtras(bundle);

                startActivity(intent);

            }

        });

        //点击个人信息按钮

        Button btnUserInfo = findViewById(R.id.btn_user_info);

        btnUserInfo.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Intent intent = new Intent(getApplicationContext(),MyInfoActivity.class);

                Bundle bundle = new Bundle();

                bundle.putString("stu_number1",TvStuNumber.getText().toString());

                intent.putExtras(bundle);

                startActivity(intent);

            }

        });

        //退出登录按钮点击事件

        Button btnLogOut = findViewById(R.id.btn_logout);

        btnLogOut.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                AlertDialog.Builder builder = new AlertDialog.Builder(PersonalCenterActivity.this);

                builder.setTitle("提示:").setMessage("确认退出系统吗?").setIcon(R.drawable.icon_user).setPositiveButton("确定", new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        dialog.dismiss();

                        //跳转到登录界面

                        Intent intent = new Intent(getApplicationContext(),LoginActivity.class);

                        startActivity(intent);

                    }

                }).setNegativeButton("取消", new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        dialog.dismiss();

                    }

                }).show();

            }

        });

    }

}

  1. AllCommodityAdapter

public class AllCommodityAdapter extends BaseAdapter {

    private Context context;

    private LayoutInflater layoutInflater;

    private List<Commodity> commodities = new ArrayList<>();

    //对每一个item保存其位置

    HashMap<Integer,View> location = new HashMap<>();

    public AllCommodityAdapter(Context context) {

        this.context = context;

        layoutInflater = LayoutInflater.from(context);

    }

    public void setData(List<Commodity> commodities) {

        this.commodities = commodities;

        notifyDataSetChanged();

    }

    @Override

    public int getCount() {

        return commodities.size();

    }

    @Override

    public Object getItem(int position) {

        return commodities.get(position);

    }

    @Override

    public long getItemId(int position) {

        return position;

    }

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;

        if(location.get(position) == null){

            convertView = layoutInflater.inflate(R.layout.layout_all_commodity,null);

            Commodity commodity = (Commodity) getItem(position);

            holder = new ViewHolder(convertView,commodity);

            //保存view的位置position

            location.put(position,convertView);

            convertView.setTag(holder);

        }else{

            convertView = location.get(position);

            holder = (ViewHolder) convertView.getTag();

        }

        return convertView;

    }

    //定义静态类,包含每一个item的所有元素

    static class ViewHolder {

        ImageView ivCommodity;

        TextView tvTitle,tvType,tvDescription,tvPrice;

        public ViewHolder(View itemView,Commodity commodity) {

            tvTitle = itemView.findViewById(R.id.tv_name);

            tvType = itemView.findViewById(R.id.tv_type);

            tvPrice = itemView.findViewById(R.id.tv_price);

            tvDescription = itemView.findViewById(R.id.tv_description);

            ivCommodity = itemView.findViewById(R.id.iv_commodity);

            tvTitle.setText(commodity.getTitle());

            tvDescription.setText(commodity.getDescription());

            tvPrice.setText(String.valueOf(commodity.getPrice())+"元");

            tvType.setText(commodity.getCategory());

            byte[] picture = commodity.getPicture();

            //从字节数组中解码生成不可变的位图

            //public static Bitmap decodeByteArray(byte[] data, int offset, int length)

            Bitmap img = BitmapFactory.decodeByteArray(picture,0,picture.length);

            ivCommodity.setImageBitmap(img);

        }

    }

 

 

 

 

 

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

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

相关文章

51Proteus仿真数控0~20mA恒流源串口DAC0832数码管显示-0036

51Proteus仿真数控0~20mA恒流源串口DAC0832数码管显示-0036 Proteus仿真小实验&#xff1a; 51Proteus仿真数控0~20mA恒流源串口DAC0832数码管显示-0036 功能&#xff1a; 硬件组成&#xff1a;AT89C51单片机 6位数码管DAC0832电压输出多个按键&#xff08;设置、移动、加、…

INTERSPEECH 2023论文|基于多频带时频注意力的复调音乐旋律提取

论文题目&#xff1a; MTANet: Multi-band Time-frequency Attention Network for Singing Melody Extraction from Polyphonic Music 作者列表&#xff1a; 高虞安&#xff0c;胡英&#xff0c;王柳淞&#xff0c;黄浩&#xff0c;何亮 研究背景 复调音乐是一种具有多个声…

[PyTorch][chapter 41][卷积网络实战-LeNet5]

前言 这里结合前面学过的LeNet5 模型&#xff0c;总结一下卷积网络搭建&#xff0c;训练的整个流程 目录&#xff1a; 1&#xff1a; LeNet-5 2: 卷积网络总体流程 3&#xff1a; 代码 一 LeNet-5 LeNet-5是一个经典的深度卷积神经网络&#xff0c;由Yann LeCun在1998年提…

zabbix-agent安装

1.CentOS release 5 1-1.centos5 32位 [rootLV zabbix]# cat /etc/redhat-release CentOS release 5 (Final) [rootLV zabbix]# uname -a Linux LV 2.6.18-53.el5xen #1 SMP Mon Nov 12 03:26:12 EST 2007 i686 i686 i386 GNU/Linux确定了系统centos5 32位rpm方式安装&#…

Ubuntu18.04离线安装redis

因需要安装redis的服务器无法连接互联网&#xff0c;所以需要离线安装。首先需要下载redis的安装包&#xff0c;之后进行安装&#xff0c;在安装之前需要保证gcc&#xff0c;g&#xff0c;make等依赖包已经安装。 1. 安装gcc等依赖包 依赖包安装请参考&#xff1a; Ubuntu18…

CI570 3BSE001440R1需要电流显示和就地/远传控制

​ CI570 3BSE001440R1需要电流显示和就地/远传控制 CI570 3BSE001440R1需要电流显示和就地/远传控制 如果变频器与通讯方式与DCS系统连接&#xff0c;则只需要计算1个通讯点&#xff0c;不需要计算其他点数。 &#xff08;6&#xff09;如DCS系统外接电磁阀、指示灯、接触器等…

物联网云平台数据存储方案,这次我终于找对了

《高并发系统实战派》-- 你值得拥有 文章目录 物联网云平台存储概述为什么要做存储&#xff1f;存储的意义在哪里&#xff1f;数据存储方案设计存储数据库选型需要考虑的因素数据库选型结构化数据半结构化数据非结构化数据 案例分析第一颗栗子第二颗栗子第三颗栗子第四颗栗子 …

Web安全:vulhub 靶场搭建.(各种漏洞环境集合,一键搭建漏洞测试靶场)

Web安全&#xff1a;vulhub 靶场搭建. Vulhub是一个面向大众的开源漏洞靶场&#xff0c;无需docker知识&#xff0c;简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。让漏洞复现变得更加简单&#xff0c;让安全研究者更加专注于漏洞原理本身. 目录&#xff1a; Web安…

DLL修复工具下载,解决DLL文件问题的方法

在计算机应用程序中&#xff0c;我们经常会遇到一些错误提示&#xff0c;如“找不到.dll文件”或“无法加载.dll文件”。这些问题通常是由于缺少或损坏的DLL文件造成的。为了解决这些问题&#xff0c;我们可以借助DLL修复工具来修复和恢复DLL文件。本文将介绍什么是DLL文件&…

C# 自动更新(基于FTP)

效果 启动软件后&#xff0c;会自动读取所有的 FTP 服务器文件&#xff0c;然后读取本地需要更新的目录&#xff0c;进行匹配&#xff0c;将 FTP 服务器的文件同步到本地 Winform 界面 一、前言 在去年&#xff0c;我写了一个 C# 版本的自动更新&#xff0c;这个是根据配置文…

黑盒、白盒、灰盒,如何选择合适的模糊测试工具?

在软件开发和安全领域&#xff0c;模糊测试是一种常用技术&#xff0c;用于发现应用程序或系统中的潜在漏洞和安全弱点。选择不同的模糊测试方法将极大地影响测试的有效性和效率。本文将比较对比黑盒、白盒和灰盒模糊测试的特点和优势并提供选型指导。 模糊测试的分类 黑盒模糊…

人工智能带来的利好将继续推动Palantir股价反弹

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 Palantir的人工智能产品已经获得行业认可 Palantir&#xff08;PLTR&#xff09;成立于2003年&#xff0c;是一家专注于数据分析和人工智能的知名软件公司。其尖端产品已应用到了政府机构、企业和非营利组织等各个行业&…

华为OD机试 Java 实现【输出单向链表中倒数第k个结点】【LeetCode练习题】,附详细解题思路

一、题目描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。 链表结点定义如下: class ListNode{int value;ListNode next;public ListNode(){}public ListNode(

解决H5在native中键盘弹起影响页面交互

您好&#xff0c;如果喜欢我的文章&#xff0c;可以关注我的公众号「量子前端」&#xff0c;将不定期关注推送前端好文~ 问题描述 在native中拉起键盘再收回&#xff0c;滚动列表实际距离发生变化&#xff0c;被键盘一起弹上去了&#xff08;我这里大约是400px的样子&#xf…

使用yolox训练自己的数据集并测试

1.首先给出yolox原模型的下载地址: ​​​​​​https://github.com/bubbliiiing/yolox-pytorch 百度网盘链接给出自己完整的模型&#xff08;包括数据集以及权重文件&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1JNjB42u9eGNhRjr1SfD_Tw 提取码&am…

Redis和Redis可视化管理工具的下载和安装

文章目录 Redis 简介一&#xff0c;Redis 下载二&#xff0c;Redis 安装三&#xff0c;Redis 配置四&#xff0c;Redis 启动 Redis-Desktop-Manager 简介一&#xff0c;Redis-Desktop-Manager 下载二&#xff0c;Redis-Desktop-Manager 安装三&#xff0c;Redis-Desktop-Manage…

深度学习笔记之Transformer(三)自注意力机制

深度学习笔记之Transformer——自注意力机制 引言回顾&#xff1a;缩放点积注意力机制自注意力机制自注意力机制与 RNN,CNN \text{RNN,CNN} RNN,CNN的对比简单介绍&#xff1a;卷积神经网络处理序列信息的原理从计算复杂度的角度观察 位置编码 引言 上一节对注意力分数 ( Atte…

关于前端Vue脚手架的完整搭建

创建脚手架 在VSC中打开命令行&#xff0c;输入如下命令可以用于创建脚手架 Vue create <项目名称>会出现如下选项&#xff1a; 前面是选项的名称&#xff0c;括号中的是选项包含有&#xff1a; 1、Vue的版本 2、babel是用于将高版本的js转化成为低版本的js&#xff0…

SSM 整合案例

Ssm整合 注意事项 Spring mvcSpringMybatisMySQL项目结构&#xff0c;以web项目结构整合&#xff08;还有maven、gradle&#xff09;整合日志、事务一个项目中Idea 2019、JDK12、Tomcat9、MySQL 5.5 项目结构 D:\java\Idea\Idea_spacework\SSMhzy&#xff1a;不会就去找项目…

chatgpt赋能python:Python怎么筛选奇数

Python怎么筛选奇数 Python是一种高级编程语言&#xff0c;既具有面向对象编程的特点&#xff0c;又可以进行函数式编程。Python的语法简洁、清晰&#xff0c;非常适合初学者学习。在Python中&#xff0c;筛选奇数的方法非常简单&#xff0c;本文将介绍Python中筛选奇数的方法…