精华内容
下载资源
问答
  • 开发一个简单APP的流程及记事本案例(Android Studio)

    千次阅读 多人点赞 2021-04-19 19:59:23
    (3)数据库类设计分析:数据库设计是项目开发中非常关键的一个环节。同样在记事本案例中也至关重要,我们通过数据库表(Note)进行增删改查操作,记事本的数据表如下所示 字段名 数据类型 字段名 数据类型 id ...

    1.需求分析


    (1)业务需求分析:分析潜在客户需要什么产品或服务
    (2)架构分析:分析所做的产品或服务需要什么功能及实现方式并画出功能结构图,记事本案例如下
    记事本功能结构图
    (3)数据库类设计分析:数据库设计是项目开发中非常关键的一个环节。同样在记事本案例中也至关重要,我们通过数据库表(Note)进行增删改查操作,记事本的数据表如下所示

    字段名数据类型字段名数据类型
    idinteger编号
    contenttext事件内容
    notetimetext保存事件的时间

    (4)界面需求分析:友好的界面在移动平台开发中非常重要,也是用户使用软件的先决条件。记事本案例分为3个界面,分别为记事本界面、添加界面和修改界面

    记事本界面包含添加按钮和记录列表,点击后会跳转到添加界面,界面标题为添加记录,也可在该界面清除和保存编辑的内容。当点击记事本界面中的Item时,会跳转到修改记录界面,界面标题为修改记录,在该界面中可以查看和修改已保存的记录内容,也可清除和保存编辑的内容

    2.记事本案例步骤

    (1)创建项目后将Activity名称设置为NotepadActivity,布局文件为activity_notepad并将所需素材add.png(添加按钮),save_note.png(保存按钮),delete.png(删除按钮),back.png(返回按钮)导入drawable文件夹中,如下
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    上面添加按钮右边还有个返回按钮图片是白色的

    (2)编写activity_notepad.xml布局文件,放置一个TextView控件用于显示界面标题,一个ListView控件用于显示记录列表,一个ImageView控件用于显示添加按钮的图片

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fefefe"
        tools:context=".NotepadActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:gravity="center"
            android:text="记事本"
            android:textSize="20sp"
            android:textColor="@android:color/white"
            android:textStyle="bold"
            android:background="#fb7a6a"
            android:id="@+id/note_name"
            />
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/listview"
            android:cacheColorHint="#00000000"
            android:divider="#B4B4B4"
            android:dividerHeight="1dp"
            android:fadingEdge="none"
            android:listSelector="#00000000"
            android:scrollbars="none"
            android:layout_below="@id/note_name"
            />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/add"
            android:id="@+id/add"
            android:layout_marginBottom="30dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            />
    
    </RelativeLayout>
    

    (3)修改清单文件
    项目创建后所有界面都有一个默认的标题栏,该标题栏不太美观,因此需要在清单文件(AndroidManifest.xml)中的<application>标签中修改android:theme属性

    android:theme="@style/Theme.AppCompat.NoActionBar"
    

    (4)搭建记事本界面Item布局
    在res/layout文件夹中,创建一个布局文件notepad_item_layout.xml,在其中放置两个TextView控件,分别用来显示记录的部分内容与保存记录的时间

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingLeft="12dp">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/item_content"
            android:maxLines="2"
            android:ellipsize="end"
            android:lineSpacingExtra="3dp"
            android:paddingTop="10dp"
            android:textColor="@android:color/black"
            />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/item_time"
            android:textColor="#fb7a6a"
            android:paddingTop="5dp"
            android:paddingBottom="7dp"
            />
    </LinearLayout>
    

    (5)封装记录信息实体类
    由于记事本中的每个记录都会有记录内容和保存记录的时间属性,因此需要创建一个NotepadBean用于存放这些属性。选中你所创建的项目的包,右击选择New>Package,创建一个bean包,在该包中创建一个NotepadBean类,该类中定义记录信息的所有属性

    package com.example.notepad.bean;
    
    public class NotepadBean {
        private String id;
        private String notepadContent;
        private String notepadTime;
        public String getId(){
            return id;
        }
        public void setId(String id){
            this.id=id;
        }
        public String getNotepadContent(){
            return notepadContent;
        }
        public void setNotepadContent(String notepadContent){
            this.notepadContent=notepadContent;
        }
        public String getNotepadTime(){
            return notepadTime;
        }
        public void setNotepadTime(String notepadTime){
            this.notepadTime=notepadTime;
        }
    }
    

    注意包名

    (6)编写记事本界面列表适配器
    由于记事本界面的记录列表是使用ListView控件来展示的,因此需要创建一个数据适配器NotepadAdapter对ListView控件进行数据适配。步骤如下
    选中你所创建的项目的包,右击选择New>Package,创建一个adapter包,在adapter包中创建一个NotepadAdapter类继承自BaseAdapter类,并重写getCount(),getItem(),getItemId(),getView()方法,这些方法用于获取Item总数、对应Item对象、Item对象的Id、对应的Item视图,在NotepadAdapter类中创建一个ViewHolder类,在该类中初始化Item界面中的控件,具体代码如下

    package com.example.notepad.adapter;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    import com.example.notepad.R;
    import com.example.notepad.bean.NotepadBean;
    
    import java.util.List;
    
    public class NotepadAdapter extends BaseAdapter {
        private LayoutInflater layoutInflater;
        private List<NotepadBean> list;
        public NotepadAdapter(Context context, List<NotepadBean>list){
            this.layoutInflater=LayoutInflater.from(context);
            this.list=list;
        }
        @Override
        public int getCount(){
            return list==null?0:list.size();
        }
        @Override
        public Object getItem(int position){
            return list.get(position);
        }
        @Override
        public long getItemId(int position){
            return position;
        }
        @Override
        public View getView(int position,View convertView, ViewGroup parent){
            ViewHolder viewHolder;
            if(convertView==null){
                convertView=layoutInflater.inflate(R.layout.notepad_item_layout,null);
                viewHolder=new ViewHolder(convertView);
                convertView.setTag(viewHolder);
            }else{
                viewHolder=(ViewHolder)convertView.getTag();
            }
            NotepadBean noteInfo=(NotepadBean)getItem(position);
            viewHolder.tvNoteoadContent.setText(noteInfo.getNotepadContent());
            viewHolder.tvNotepadTime.setText(noteInfo.getNotepadTime());
            return convertView;
        }
        class ViewHolder{
            TextView tvNoteoadContent;
            TextView tvNotepadTime;
            public ViewHolder(View view){
                tvNoteoadContent=(TextView)view.findViewById(R.id.item_content);
                tvNotepadTime=(TextView)view.findViewById(R.id.item_time);
            }
        }
    }
    

    注意包名

    (7)创建数据库
    在记事本案例中增删改查记录的数据都是通过操作数据库完成的。因此需要创建数据库类SQLiteHelper与数据库的工具类DBUtils,步骤如下


    选中你所创建的项目的包,右击选择New>Package,创建一个utils包,在utils包中创建一个DBUtils类,在该类中定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等信息

     package com.example.notepad.utils;
    import  java.text.SimpleDateFormat;
    import java.util.Date;
    public class DBUtils {
        public static final String DATABASE_NAME="Notepad";
        public static final String DATAVASE_TABLE="Note";
        public static final int DATEBASE_VERION=1;
        public static final String NOTEPAD_ID="id";
        public static final String NOTEPAD_CONTENT="content";
        public static final String NOTEPAD_TIME="notetime";
        public static final String getTime(){
            SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
            Date date=new Date(System.currentTimeMillis());
            return simpleDateFormat.format(date);
        }
    }
    

    注意包名


    选中你所创建的项目的包,右击选择New>Package,创建一个database包,在database包中创建一个SQLiteHelper类继承自SQLiteOpenHelper类

    package com.example.notepad.database;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import com.example.notepad.bean.NotepadBean;
    import com.example.notepad.utils.DBUtils;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class SQLiteHelper extends SQLiteOpenHelper {
        private SQLiteDatabase sqLiteDatabase;
        public SQLiteHelper(Context context){
            super(context,DBUtils.DATABASE_NAME,null,DBUtils.DATEBASE_VERION);
            sqLiteDatabase=this.getWritableDatabase();
        }
        @Override
        public void onCreate(SQLiteDatabase db){
            db.execSQL("create table "+DBUtils.DATAVASE_TABLE+"( "+DBUtils.NOTEPAD_ID+" integer primary key autoincrement ,"+DBUtils.NOTEPAD_CONTENT+" text , "+DBUtils.NOTEPAD_TIME+" text ) " );
        }
        @Override
        public  void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){}
        public boolean insertData(String userContent,String userTime){
            ContentValues contentValues=new ContentValues();
            contentValues.put(DBUtils.NOTEPAD_CONTENT,userContent);
            contentValues.put(DBUtils.NOTEPAD_TIME,userTime);
            return sqLiteDatabase.insert(DBUtils.DATAVASE_TABLE,null,contentValues)>0;
        }
        public boolean deteleData(String id){
            String sql=DBUtils.NOTEPAD_ID+"=?";
            String[] contentValuesArray=new String[]{String.valueOf(id)};
            return sqLiteDatabase.delete(DBUtils.DATAVASE_TABLE,sql,contentValuesArray)>0;
        }
        public boolean updateData(String id,String content,String userYear){
            ContentValues contentValues=new ContentValues();
            contentValues.put(DBUtils.NOTEPAD_CONTENT,content);
            contentValues.put(DBUtils.NOTEPAD_TIME,userYear);
            String sql=DBUtils.NOTEPAD_ID+"=?";
            String[] strings=new String[]{id};
            return sqLiteDatabase.update(DBUtils.DATAVASE_TABLE,contentValues,sql,strings)>0;
        }
        public List<NotepadBean>query(){
            List<NotepadBean> list=new ArrayList<NotepadBean>();
            Cursor cursor=sqLiteDatabase.query(DBUtils.DATAVASE_TABLE,null,null,null,null,null,DBUtils.NOTEPAD_ID+" desc");
            if(cursor!=null){
                while (cursor.moveToNext()){
                    NotepadBean noteInfo=new NotepadBean();
                    String id=String.valueOf(cursor.getInt(cursor.getColumnIndex(DBUtils.NOTEPAD_ID)));
                    String content=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_CONTENT));
                    String time=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_TIME));
                    noteInfo.setId(id);
                    noteInfo.setNotepadContent(content);
                    noteInfo.setNotepadTime(time);
                    list.add(noteInfo);
                }
                cursor.close();
            }
            return list;
        }
    }
    

    注意包名

    (7)实现记事本界面的显示功能
    在NotepadActivity中通过创建一个showQueryData()方法查询数据库中存放的记录信息,并将该信息显示到记录列表中,同时在NotepadActivity中还实现了添加按钮的点击事件

    package com.example.notepad;
    
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import com.example.notepad.adapter.NotepadAdapter;
    import com.example.notepad.bean.NotepadBean;
    import com.example.notepad.database.SQLiteHelper;
    
    import java.util.List;
    
    public class NotepadActivity extends AppCompatActivity {
        ListView listView;
        List<NotepadBean> list;
        SQLiteHelper mSQLiteHelper;
        NotepadAdapter adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_notepad);
            listView=(ListView)findViewById(R.id.listview);
            ImageView add=(ImageView)findViewById(R.id.add);
            add.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    Intent intent=new Intent(NotepadActivity.this,RecordActivity.class);
                    startActivityForResult(intent,1);
                }
            });
            initData();
        }
        protected void initData(){
            mSQLiteHelper=new SQLiteHelper(this);
            showQueryData();
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    NotepadBean notepadBean=list.get(position);
                    Intent intent=new Intent(NotepadActivity.this,RecordActivity.class);
                    intent.putExtra("id",notepadBean.getId());
                    intent.putExtra("time",notepadBean.getNotepadTime());
                    intent.putExtra("content",notepadBean.getNotepadContent());
                    NotepadActivity.this.startActivityForResult(intent,1);
                }
            });
            listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
                    AlertDialog dialog;
                    AlertDialog.Builder builder=new AlertDialog.Builder(NotepadActivity.this).setMessage("是否删除此记录").setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            NotepadBean notepadBean=list.get(position);
                            if(mSQLiteHelper.deteleData(notepadBean.getId())){
                                list.remove(position);
                                adapter.notifyDataSetChanged();
                                Toast.makeText(NotepadActivity.this,"删除成功",Toast.LENGTH_SHORT).show();
                            }
                        }
                    }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
                    dialog=builder.create();
                    dialog.show();
                    return  true;
                }
            });
        }
        private void showQueryData(){
            if(list!=null){
                list.clear();
            }
            list=mSQLiteHelper.query();
            adapter=new NotepadAdapter(this,list);
            listView.setAdapter(adapter);
        }
        @Override
        protected  void onActivityResult(int requestCode,int resultCode,Intent data){
            super.onActivityResult(requestCode,resultCode,data);
            if(requestCode==1&&resultCode==2){
                showQueryData();;
            }
        }
    }
    

    注意包名

    (8)搭建添加记录和修改记录界面的布局
    当点击记事本界面的添加按钮时,会跳转到添加记录界面,当点击记事本界面列表中的Item时,会跳转到修改记录界面。由于这两个界面上的控件与功能基本相同,因此可以使用同一个Activity和同一个布局文件显示这两个界面,步骤如下

    选中你所创建的项目的包,创建一个名为RecordActivity的Activity并将布局文件指名为activity_record,在activity_record.xml布局文件中,放置两个TextView控件,分别用于显示界面标题和记录时间,一个EditText控件用于显示输入框,三个ImageView控件分别用于显示后退键图标、删除图标以及保存按钮图标

    1.实现添加记录界面的功能
    由于添加记录界面的清除和保存按钮需要实现点击事件,因此将RecordActivity实现View.OnClickListener接口并重写onClick()方法,在该方法中实现将编写的记录添加到数据库中的功能

    package com.example.notepad;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.example.notepad.database.SQLiteHelper;
    import com.example.notepad.utils.DBUtils;
    
    public class RecordActivity extends AppCompatActivity implements View.OnClickListener {
        ImageView note_back;
        TextView note_time;
        EditText content;
        ImageView deldete;
        ImageView note_save;
        SQLiteHelper mSQLiteHelper;
        TextView noteName;
        String id;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_record);
            note_back = (ImageView) findViewById(R.id.note_back);
            note_time = (TextView) findViewById(R.id.tv_time);
            content = (EditText) findViewById(R.id.note_content);
            deldete = (ImageView) findViewById(R.id.delete);
            note_save = (ImageView) findViewById(R.id.note_save);
            noteName = (TextView) findViewById(R.id.note_name);
            note_back.setOnClickListener(this);
            deldete.setOnClickListener(this);
            note_save.setOnClickListener(this);
            initData();
        }
    
        protected void initData() {
            mSQLiteHelper = new SQLiteHelper(this);
            noteName.setText("添加记录");
            Intent intent = getIntent();
            if (intent != null) {
                id = intent.getStringExtra("id");
                if (id != null) {
                    noteName.setText("修改记录");
                    content.setText(intent.getStringExtra("content"));
                    note_time.setText(intent.getStringExtra("time"));
                    note_time.setVisibility(View.VISIBLE);
                }
            }
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.note_back:
                    finish();
                    break;
                case R.id.delete:
                    content.setText("");
                    break;
                case R.id.note_save:
                    String noteContent = content.getText().toString().trim();
                    if (id != null) {
                        if (noteContent.length() > 0) {
                            if (mSQLiteHelper.updateData(id, noteContent, DBUtils.getTime())) {
                                showToast("修改成功");
                                setResult(2);
                                finish();
                            } else {
                                showToast("修改失败");
                            }
                        } else {
                            showToast("修改内容不能为空");
                        }
                    }else{
                        if(noteContent.length()>0){
                            if(mSQLiteHelper.insertData(noteContent,DBUtils.getTime())){
                                showToast("保存成功");
                                setResult(2);
                                finish();
                            }else{
                                showToast("保存失败");
                            }
                        }else {
                            showToast("修改内容不能为空");
                        }
                    }
                    break;
            }
        }
    
        public void showToast(String message){
            Toast.makeText(RecordActivity.this,message,Toast.LENGTH_SHORT).show();
        }
    }
    

    注意包名

    2.实现修改记录界面的功能
    修改记录界面主要包含查看记录和修改记录的功能

    • 实现查看记录功能
      记事本界面列表的每个Item最多只显示2行记录信息,如果想要查看更多的记录内容,则需要点击Item,进入到修改记录界面进行查看,因此点击Item时,需要将Item对应的记录信息传递到修改记录界面进行显示,即为NotepadActivity的initData()方法,具体代码已在步骤(7)中写出
      在RecordActivity的initData()方法中需要接收记事本界面传递过来的记录数据并将数据显示到界面上,具体代码已在当前步骤中写出
    • 实现修改记录功能
      在RecordActivity中的onClick()方法中,找到保存按钮的点击事件,在该事件中根据判断传递过来的id是否为null来判断处理的是添加记录界面的保存功能还是修改记录界面的保存功能,如果id不为null,则处理修改记录界面的保存功能,具体代码已在当前步骤中写出

    (9)删除记事本中的记录
    当需要删除记事本列表中的记录时,需要长按列表中的Item,此时会弹出一个对话框提示是否删除Item的对应的记录,因此在NotepadActivity中的initData()方法中写出了删除记录的逻辑代码,具体代码已在步骤(7)中写出

    (10)记事本案例已完成

    展开全文
  • 软件开发的基本流程

    2021-01-21 13:36:51
    下面介绍软件开发的基本流程、需求分析 相关系统分析员向用户初步了解需求,然后用相关的工具软件列出要开发的系统的大功能模块,每大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面时,在这...

    在这里插入图片描述

    下面介绍软件开发的基本流程:

    一、需求分析

    1. 相关系统分析员向用户初步了解需求,然后用相关的工具软件列出要开发的系统的大功能模块,每个大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面时,在这一步里面可以初步定义好少量的界面。
    2. 系统分析员深入了解和分析需求,根据自己的经验和需求用WORD或相关的工具再做出一份文档系统的功能需求文档。这次的文档会清楚列出系统大致的大功能模块,大功能模块有哪些小功能模块,并且还列出相关的界面和界面功能。
    3. 系统分析员向用户再次确认需求。

    二、概要设计

    1. 开发者需要对软件系统进行概要设计,即系统设计。
    2. 概要设计需要对软件系统的设计进行考虑,包括系统的基本处理流程、系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等,为软件的详细设计提供基础。

    三、详细设计

    1. 在概要设计的基础上,开发者需要进行软件系统的详细设计。
    2. 在详细设计中,描述实现具体模块所涉及到的主要算法、数据结构、类的层次结构及调用关系,需要说明软件系统各个层次中的每一个程序(每个模块或子程序)的设计考虑,以便进行编码和测试。
    3. 应当保证软件的需求完全分配给整个软件。
    4. 详细设计应当足够详细,能够根据详细设计报告进行编码。

    四、编码

    1. 在软件编码阶段,开始具体的编写程序工作,分别实现各模块的功能,从而实现对目标系统的功能、性能、接口、界面等方面的要求。
    2. 在规范化的研发流程中,编码工作在整个项目流程里最多不会超过1/2,通常在1/3的时间,所谓磨刀不误砍柴功,设计过程完成的好,编码效率就会极大提高,编码时不同模块之间的进度协调和协作是最需要小心的,也许一个小模块的问题就可能影响了整体进度,让很多程序员因此被迫停下工作等待,这种问题在很多研发过程中都出现过。
    3. 编码时的相互沟通和应急的解决手段都是相当重要的,对于程序员而言,bug永远存在,你必须永远面对这个问题!

    五、测试

    1. 测试编写好的系统。交给用户使用,用户使用后一个一个的确认每个功能。
    2. 软件测试有很多种:按照测试执行方,可以分为内部测试和外部测试;按照测试范围,可以分为模块测试和整体联调;按照测试条件,可以分为正常操作情况测试和异常情况测试;按照测试的输入范围,可以分为全覆盖测试和抽样测试。
    3. 完成测试后,完成验收并完成最后的一些帮助文档,整体项目才算告一段落,当然日后少不了升级,修补等等工作。

    六、维护

    1. 根据用户需求的变化或环境的变化,对应用程序进行全部或部分的修改。

    此篇文章参考百度百科,然后稍加修改,这里总结的不是很全面,对于小白自己来说,能做完这几步就已经很有进步啦^__^

    接下来努力完成自己的第一个小项目~

    展开全文
  • 硬件开发的整个全部流程持续时间比较长,但实际项目中可能有一些可借鉴的硬件产品,对硬件需求进行相应升级。硬件开发的整个流程主要包括有硬件需求分析、硬件总体设计方案、硬件开发与质量控制、系统测试、文件归档...

    微信公众号内容更精彩

    硬件开发的整个全部流程持续时间比较长,但实际项目中可能有一些可借鉴的硬件产品,对硬件需求进行相应升级。硬件开发的整个流程主要包括有硬件需求分析、硬件总体设计方案、硬件开发与质量控制、系统测试、文件归档及验收。

           

            偶然在网上淘到本书的电子版《硬件系统工程师宝典》,特定分享给大家,非常不错的入门书籍。《硬件系统工程师宝典》是2015年电子工业出版社出版的图书,作者是张志伟、王新才。

        全书包括:硬件系统设计中的常见需求,设计中需要考虑的各类概要设计及开发平台的归纳,SI的理论分析及满足SI的常用设计方法,PI的理论分析及满足PI的常用设计方法,EMC/EMI的理论分析及满足EMC/EMI的常用设计方法,DFX的理论分析及满足DFX的常用设计方法,电路设计中常用各类器件的原理说明及常用电路的原理图设计,对PCB设计中的布局、布线及PCB的板级仿真分析进行了归纳分类,对PCB设计的后续工作及PCB加工的技术要求进行了归纳总结。

     

        关注本公众号“硬件开发不完全攻略”,后台回复“硬件宝典”,即可免费获取,仅可用于学习交流,为获取最佳的阅读体验,推荐大家购买正版纸质书

     本系列文章主要内容如下:

    Zynq7000硬件开发之总体硬件架构设计

    Zynq硬件开发之Xilinx官方技术手册解读(一)

    Zynq7000硬件开发之Xilinx官方技术手册解读(二)

    Zynq7000硬件开发之芯片供电电源功耗(电流)评估_硬件开发不完全攻略-CSDN博客

    Zynq7000硬件开发之电源供电系统(PDN)设计(一)

    关注公众号获取更多内容

      1、硬件需求分析

             需求分析是非常重要的一环,一般需求提出者是站在实际功能需要的基础上提出,如只是按照现有需求来进行设计,后续其他类似项目上可能会提出相似需求设计,比如增加通信接口、开入开出或者模拟量采集等接口等,硬件开发者可能会陷入一直开发新硬件、维护已有硬件等,不利于省下更多时间去提升硬件水平。目前应用最广泛的是CBB(Common Building Block)即共同性构建模块设计思想,后续会对其重点进行剖析,基础性说明可自行搜索查看。

             2、硬件总体设计方案

             从总体上对硬件功能分析,结构配合,对外接口设计、运行环境要求、EMC设计指标等内容进行阐述,总体设计方案主要包括以下内容:硬件功能单元设计、电源设计、接口设计、可测试性设计、可装配性设计、PCB布局布线指导、EMC设计以及结构设计等。

           3、硬件开发与质量控制

           开发过程中,原理图要进行分模块设计,确保每个模块设计的准确性,多人协同设计时需要进行评审,多模块连接需确保信号定义完整准确,最好有信号命名的规范;PCB设计时首先要确定尺寸以及安装结构要求,限高区以及禁止布线区要标示明确,布局完成后汇同结构以及系统工程师进行评审确认,布局布线要严格按照Layout指南进行设计,叠层以及阻抗控制要有明确文档说明;投板后要多跟踪采购生产进度,有问题及时解决。

            4、系统测试

           硬件与软件具备条件后,需要进行联合测试,测试前硬件需保证板上电源均正常,主要测试目的是发现设计缺陷与不足,通过相应的硬件各功能指标测试、硬件在环测试、环境测试、EMC测试以及可靠性测试等。

           硬件各功能指标测试包括有电源质量测试、各功能单元电路测试、信号完整性测试、DDR等存储器读写测试、以太网测试、PCIE测试、USB测试、光发送功率及接收灵敏度测试等。

           硬件在环测试,将目标硬件的外部所需的接口设备全部连接进行功能测试,外部设备可以是实物、模拟装置、数字仿真器等,模拟硬件实际运行工况,对软硬件进行验证。

           环境测试,工业级民品主要依据国标GB-T 2423系列标准进行环境测试验证,一般包括有高温存储、低温存储、高温运行、低温运行、温度变化试验、恒定湿热试验、交变湿热试验、盐雾霉菌试验以及机械振动试验等。

           EMC测试包括有EMS和EMI两类试验,工业级民品主要依据GB-T 17626系列标准(对应国际IEC 61000系列标准),主要包含有静电放电抗扰度、射频电磁场辐射抗扰度、电快速瞬变脉冲群抗扰度、浪涌抗扰度、阻尼振荡磁场抗扰度、工频磁场抗扰度、脉冲磁场抗扰度、传导发射试验、射频发射试验等。

           可靠性测试包括有HALT和HASS两类试验,HALT试验全称是高加速寿命试验,是一种试验方法(思想),采用的环境应力比加速试验更加严酷。主要应用于产品开发阶段,它能以较短的时间促使产品的设计和工艺缺陷暴露出来,从而为我们做设计改进,提升产品可靠性提供依据。HASS试验全称是高加速应力筛选试验。HASS是产品通过HALT得出工作极限或破坏极限值后在生产阶段所做的高加速应力筛选,一般要求100%的产品参加筛选。

           5、文件归档及验收

             测试通过后,需对中间各过程文件进行评审、验收并入至公司资料库,以备后续小批量及量产后可能出现的问题分析测试提供参考,验收后需不断跟踪批量生产及运行过程中的问题,对硬件隐患不断进行维护升级,采用模块化设计思想可以大量减少该部分工作量。

    文后语:对于职业选择,硬件设计工程师不是最能挣钱的,但绝对是性价比最高的,不需要每天电脑前撸代码、不需要天天拉线到要吐、同样不需要整天在焊台烟熏火燎。Zynq作为多核异构处理器,集成有ARM/FPGA/SERDES等,通过本系列文章进行学习、实际操作,本系列文章采用Altium Designer作为开发工具,操作简单,上手快的优势,如果想转行或者提高硬件设计水平,本系列文章不容错过。关注、点赞、评论是小编持续分享的东西,希望与大家多交流。

    本系列文章持续更新,欢迎关注微信公众号“硬件开发不完全攻略”~

    展开全文
  • 明明只是检索一个资料,为何非要关注他的博客呢? 况且如果你没有 CSDN 账号怎么办? 当访问一篇博客,出现下图时,你一定产生过被这个按钮支配的愤怒。 有吐槽的地方,就有需求,“就不关注” 这款插件应运而生,...

    为何有这款插件

    相信你在 CSDN 检索资料的时候,一定碰到过【关注博主阅读全文】。

    明明只是检索一个资料,为何非要关注他的博客呢?

    况且如果你没有 CSDN 账号怎么办?

    当访问一篇博客,出现下图时,你一定产生过被这个按钮支配的愤怒。
    保护! 一款插件,2行代码,去除CSDN的关注博主阅读全文

    有吐槽的地方,就有需求,“就不关注” 这款插件应运而生,而且本款插件发布在 CSDN 开发者助手商店哦~ 妥妥的带上 “官方出版” 的帽子。

    插件制作流程

    在使用本插件之前,需要提前安装 CSDN 开发者助手,具体安装方法,查看官方说明即可。

    插件官方下载地址

    通过 https://plugin.csdn.net/webstore?type=&sort=&name=&sType=name 创建插件,选择脚本插件进行后续开发。

    保护! 一款插件,2行代码,去除CSDN的关注博主阅读全文
    配置插件

    在插件配置页面,对插件进行基本设置,该内容主要展示在商店中,最后一项外部资源依据需要进行添加,实测后发现尽量不添加与 CSS 样式相关的外部资源,例如 less,bootstrap ,易造成原页面排版出现问题。

    配置规则表示在哪些页面插件起作用。由于目标删除数据在博客详情页,本插件该配置如下所示:

    https://*.blog.csdn.net/article/details/*
    https://blog.csdn.net/*/article/details/*
    

    脚本执行时机选择 document_end,即页面全部加载完毕执行。
    保护! 一款插件,2行代码,去除CSDN的关注博主阅读全文
    编写代码

    去除关注博客可预览全文功能比较简单,只需要在上图顶部的 JS 选项卡中,添加如下代码即可。

    (function () {
      // Your code here...
      // 使用 Jquery 选择器,也可以直接使用原生的 JS
      $("#article_content").removeAttr("style");
      $(".hide-article-box").remove();
    })();
    

    使用两行代码即可去除关注按钮,并查看全文。

    第一行代码为删除 DIV 高度,并取消 overflow 属性,第二行代码为去除关注博主按钮区域。

    插件后续

    插件下载地址:https://plugin.csdn.net/plugin?pluginId=CSDNPlugin-33818859-1626222802872-65436331

    欢迎大家体验橡皮擦研发的其它几款小工具, https://plugin.csdn.net/webstore?type=&sort=&name=hihell&sType=author
    保护! 一款插件,2行代码,去除CSDN的关注博主阅读全文

    今天是持续写作的第 183 / 200 天。
    可以关注我,点赞我、评论我、收藏我啦。

    更多精彩

    请把保护打在评论区

    展开全文
  • 摘要:针对于具备瞬时流量、业务场景比较简单的小程序,开发者借助FunctionGraph,可以方便快捷的搭建一个健壮的小程序后台。
  • 低代码平台至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端UI等组件,我们没必要重新造轮子,市场上已经有大量的成熟组件,选择合适的组件进行集成和二次开发,即可自主开发一个低代码平台。...
  • 软件开发的8过程

    千次阅读 2021-02-23 16:19:41
    软件开发的8过程: 1、问题定义 2、可行性研究 3、需求分析 4、总体设计(概要设计) 5、详细设计 6、编码与单元测试 7、综合测试 8、软件维护
  • 新产品开发通常遵循一个分阶段的流程,在流程中,公司构思新产品创意、然后研究、计划、设计、原型开发和测试,最后将其推向市场。 当 NPD 流程包含对现有产品的管理时,它也被称为产品生命周期流程。 使用...
  • 分析每部门总额的数据处理流程开发程序1 分析每部门工资总额的数据处理流程2 每部门工资总额程序开发2.1 创建框架2.2 开发Mapper程序2.3 开发Reduce程序2.4 执行主程序 手动反爬虫,禁止转载:原博地址 ...
  • 、Qsys的开发流程 二、搭建qsys工程的详细流程 2.1 新建quartus II工程 2.2 使用Qsys软件创建带Nios II处理器的Qsys系统 2.2.1 新建QSYS platform 2.2.2 添加ROM和RAM 2.2.3 添加nios II CPU模块 2.2.4 ...
  • 关注并将「趣谈前端」设为星标每天早 08 : 30 按时推送技术干货/优秀开源/技术思维❝前沿:一个流程图设计器需要什么?一个是图的绘制能力、基于svg或者canvas来绘制各种形状的节点...
  • Vue前端开发流程

    千次阅读 2021-02-22 20:20:57
    Vue前端开发流程1.安装环境1.1 安装node1.2 安装Cnpm(中国 npm 镜像的客户端)2. 初始化项目--2.1准备工作2.1.1 安装Vue-cli2.1.2 安装webpack2.2 创建项目3. 多组件和标准Vue页面4. Vue组件之间的数据传递4.1父...
  • 流程设计器集成了自由表单设计器和流程引擎,并支持线性流程、父子流程、同步分合流、异步分合流程,全部实现可视化设计,十分方便快捷。
  • 本文目的是为在PYNQ调用HLS所生成的bit文件所写,旨在明晰整个流程和细节,属于个人学习笔记,将随着工作的开展而逐步更新完善,该文章可能不会对您的工作有所帮助,但也希望您能指出文中的错误,谢谢。 当前将从AXI...
  • 一个码砖的码农,在CSDN写一年博客,出书了?

    千次阅读 多人点赞 2021-04-23 09:39:14
    可能你的生活里很多时候很多人都在教你怎么快,“一年面上P6”、“周学会Java”、“一文看懂C++”,似乎这些看上去的快,就是达到终点的最佳路径。而实际上快,却让你在本该沉淀的路上,漂浮了起来,一切感觉都...
  • 【max32660】简单智能手表开发流程

    千次阅读 2021-02-28 15:41:40
    MAX32660开发流程 程序的流程没有问题了,我已经在stm32上实现了基本的功能。问题就是,意法半导体已经有cube可以直接初始化资源,而美信半导体,目前我没有发现方便的cube,所以我需要扣例程。所以这次的项目相对...
  • Vivado基本设计流程,包括创建新设计工程、创建并添加一个新的设计文件、RTL详细描述和分析(RTL Analysis)、设计综合分析(Synthesis)、设计行为级仿真(Run Behavioral Simulation)、创建实现约束文件XDC、设计实现...
  • 1.泛微的PC端和手机端使用的jQuery代码通用吗?...2.泛微的流程表单里有给开发人员二次开发的提交校验方法,checkCustomize()方法,同一个流程表单里只能写一个提交校验方法,注意:一个流程里如果有多个地方需...
  • 、概述 1、SpringBoot四大核心 (1)自动配置:使用注解开发,基本不使用xml配置文件 (2)起步依赖:不用自己需要生么依赖加什么依赖(单点) 而是选择一套,如想用ssm---即ssm所需要的依赖都包含(套餐) ...
  • 本文是参考ThoughtWork冰玉老师(https://blog.csdn.net/bingyulin)讲的敏捷课程加上自己的理解写的,想听原版可以关注ThonghtWork公众号,里面有课程回顾 指导性原则:团队为质量负责 质量不是测试出来的 什么是...
  • 压力测试流程及测试步骤

    千次阅读 2021-02-25 19:14:17
    对于一个系统而言,包含并发用户数、响应时间、吞吐量、以及资源利用率等方面的信息。 2、名词解释 并发用户数:并发用户数是针对服务端而言,是指在同一时刻与服务端进行交互的在线用户数量。在压力测试期间是...
  • 5+APP原生第三方插件开发流程:1、离线打包https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android...其实还有一个原因,涉及到的第三方插件用到了系统级权限,要用platform.pk8来签名打包,才能运行。所以用离线
  • 对于大多数 Android 开发工程师来说,掌握Android Framework 一定是一个不光要熟练而且还要精通的技能。 在刚刚过去的金九银十,我受邀帮一家独角兽公司面试,他们希望我帮忙给目前正在招聘的高级 Android 工程师...
  • 目录PC SDK通信队列何为通信队列创建一个通信队列下位机队列实现使用通信队列进行实时控制上位机发送端:队列定义下位机接收端:队列信息读取使用队列信息完成点动控制使用队列信息,进行程序调用 PC SDK通信队列 ...
  • 2、开启后,自建应用每一个审批申请的审批状态变化,都会通知给开发者。查看事件回调详细说明 4.2代码实战 1、找到"自建审批应用"中的"接收消息",并作如下图所示的配置: 2、校验代码如下: #region 5、自建审批...
  • SpringBoot开发流程

    2021-01-13 19:13:07
    第一步,先用idea创建一个SpringBoot项目: https://blog.csdn.net/weixin_43923436/article/details/112371755 然后,需要什么开发场景就可以引入相关开发场景: 引入场景依赖:官网查看所有的SpringBoot的开发场景...
  • 本章主要内容:什么是小程序,云开发的作用,如何建立自己的小程序
  • 、前言 这知识学的,根本没有忘的快呀?! 是不是感觉很多资料,点收藏起来爽、看视频时候嗨、读文章当时会,只要过了那个劲,就完了,根本不记得这里面都讲了啥。时间浪费了,东西还没学到手,这是为啥? 其实...
  • Pycharm下Django项目开发流程 1.settings DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'HOST':'localhost', 'PORT':'3306', 'NAME':'csdn_blog', 'USER':'root', 'PASSWORD':'hfj...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 151,827
精华内容 60,730
关键字:

开发一个网站的流程csdn