本文目录

  • 总体功能目标:
    • 前期功能:
    • 后期功能:
  • 大致思路:
  • 当前效果图:
  • 开始编码:
    • 词库:
    • 选择题:
    • 用到的基类、自定义Button、工具类

在使用背单词APP的过程中,我发现我就没专心背单词,而是想着:咦,这功能可以!唉?这个地方好像有点小BUG!这里为啥不加点这个功能?那里为啥不加点那个功能?然后我就点开了我的AndroidStudio,开始了接来下的编码之旅!(本文持续更新,感兴趣的小伙伴可收藏一波)

项目地址(GitHub):https://github.com/YJX666666/MyDictionary

总体功能目标:

前期功能:

添加单词:能够添加单词

词库管理:能显示词库所有单词、能删除以及修改单词

选择模式:两种模式(中 - 英 & 英 - 中),选项中有一个正确答案以及三个非正确答案,选择正确和不正确都有相应提示

填空模式:两种模式(中 - 英 & 英 - 中),填写正确和不正确都有相应提示

后期功能:

词库选择:软件内自带几种常用的词库,如四六级等等,选择后添加进当前词库

背诵记录:可以查看单词背诵情况,如:单词出现次数、正确次数、错误次数

智能化:通过背诵记录来智能筛选背诵的单词,如:更多地出现正确率低的单词以加深记忆

大致思路:

利用数据库来保存单词,每次添加单词就直接添加进数据库,选择题是获取四组数据,然后选一组作为当前的主角(当前考核的单词),其余三组作为非正确答案放在按钮上,填空题则比较简单,随机选取一组数据,然后给出单词(或翻译),让你在输入框中填写答案。后期功能思路暂时没有考虑,先把前期功能做完!

当前效果图:


开始编码:

词库:

先写一个SQWordsHelps继承自SQLiteOpenHelper,这里定义两个数据(WORD 和 CHINESE)

public class SQWordsHelper extends SQLiteOpenHelper {public static final String WORD = "word";public static final String DB_NAME = WORD + "s.db";public static final String TABLE_NAME = WORD + "s";public static final String CHINESE = "chinese";public SQWordsHelper(Context context) {super(context, DB_NAME, null, 1);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table " + TABLE_NAME + "(" + WORD + " text," + CHINESE + " text)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}

然后是添加数据的功能,也就是数据库中的 增

XML,Button我用的自己自定义的Button(文末符代码)

<?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:gravity="center"android:orientation="vertical"><EditTextandroid:id="@+id/edit_english"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:background="@drawable/edit_stroke"android:gravity="center"android:hint="@string/str_english"android:padding="10dp"android:singleLine="true"android:textSize="22sp" /><EditTextandroid:id="@+id/edit_chinese"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginTop="20sp"android:layout_marginRight="30dp"android:background="@drawable/edit_stroke"android:gravity="center"android:hint="@string/str_chinese"android:padding="10dp"android:singleLine="true"android:textSize="22sp" /><com.yjx.androidword.MyView.MyFirstButtonandroid:id="@+id/btn_add"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginTop="20sp"android:layout_marginRight="30dp"android:text="@string/str_addwords" /></LinearLayout>

Java,BaseActivity是我写的基类(文末符代码)

点击按钮后进行判断,如果两个输入框中有空的则无反应(可以写一个提示),都不为空则调用插入数据的方法(initSQLiteData())

补充一个小知识点:数据库的 .insert() 方法是有返回值的,当返回 -1 时则为插入数据失败,返回其他则为插入数据成功(返回值是新插入数据所在的行数),这样我们就可以通过返回值来判断并提示用户插入结果

public class AddWordsActivity extends BaseActivity {private android.widget.EditText mEditEnglish;private android.widget.EditText mEditChinese;private android.widget.Button mBtnAdd;SQWordsHelper mSQHelper;SQLiteDatabase mSQLiteDatabase;ContentValues mContentValues;@Overrideprotected void initData() {mSQHelper = new SQWordsHelper(mContext);mSQLiteDatabase = mSQHelper.getWritableDatabase();mBtnAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String english = mEditEnglish.getText().toString();String chinese = mEditChinese.getText().toString();if (!TextUtils.isEmpty(english) && !TextUtils.isEmpty(chinese)) {initSQLiteData(english, chinese);}}});}private void initSQLiteData(String english, String chinese) {mContentValues = new ContentValues();mContentValues.put(SQWordsHelper.WORD, english);mContentValues.put(SQWordsHelper.CHINESE, chinese);if (mSQLiteDatabase.insert(SQWordsHelper.TABLE_NAME, null, mContentValues) == -1) {Toast.makeText(mContext, "添加失败!", Toast.LENGTH_SHORT).show();} else {Toast.makeText(mContext, "添加成功!", Toast.LENGTH_SHORT).show();mEditEnglish.setText("");mEditChinese.setText("");}}@Overrideprotected int initLayout() {return R.layout.addwords;}@Overrideprotected void initView() {mEditEnglish = findViewById(R.id.edit_english);mEditChinese = findViewById(R.id.edit_chinese);mBtnAdd = findViewById(R.id.btn_add);}
}
选择题:

主体是很简单的一个TextView加上四个Button的布局,然后在按钮的右下角放了一个小一点的Buton,用来获取下一个单词(当然也可以做成选完直接换的那种,不过那种感觉不如这种好),最下面是一个 “掌握了单词” 的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:gravity="center"android:orientation="vertical"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="0dp"android:layout_weight="1" /><TextViewandroid:id="@+id/txv_word"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:textSize="26sp"android:textStyle="bold" /><com.yjx.androidword.MyView.MyFirstButtonandroid:id="@+id/btn_a"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="80dp"android:layout_marginTop="50dp"android:layout_marginRight="80dp" /><com.yjx.androidword.MyView.MyFirstButtonandroid:id="@+id/btn_b"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="80dp"android:layout_marginTop="10dp"android:layout_marginRight="80dp" /><com.yjx.androidword.MyView.MyFirstButtonandroid:id="@+id/btn_c"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="80dp"android:layout_marginTop="10dp"android:layout_marginRight="80dp" /><com.yjx.androidword.MyView.MyFirstButtonandroid:id="@+id/btn_d"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="80dp"android:layout_marginTop="10dp"android:layout_marginRight="80dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_marginTop="20sp"android:layout_weight="1"android:orientation="vertical"><com.yjx.androidword.MyView.MyFirstButtonandroid:id="@+id/btn_next"android:layout_width="100dp"android:layout_height="35dp"android:layout_gravity="right"android:layout_marginTop="10dp"android:layout_marginEnd="10dp"android:text="@string/str_next"android:textSize="12sp" /></LinearLayout><TextViewandroid:id="@+id/txv_grasp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="30dp"android:shadowColor="@color/colorShadowBlack"android:shadowDx="3"android:shadowDy="3"android:shadowRadius="6"android:text="@string/str_grasp" /></LinearLayout>

Java,后台代码就稍微多了起来,主要代码功能是:通过工具类获取四组数据然后传到TextView和Button上,然后就是判断当前选项是否正确,以及选择正确和不正确时,对按钮进行背景色的替换(选对变绿,选错变红),以及点击 “下一个” 按钮后,所有按钮重置为初始状态并重新获取数据。

public class ChooseActivity extends BaseActivity implements View.OnClickListener {private android.widget.TextView mTxvWord;private android.widget.Button mBtnA;private android.widget.Button mBtnB;private android.widget.Button mBtnC;private android.widget.Button mBtnD;private String mString_English = "";private String mString_Chinese = "";private Random mRandom = new Random();private android.widget.TextView mTxvGrasp;private SQWordsHelper mSQWordsHelper;private SQLiteDatabase mSQLiteDatabase;private TextView mTxvEnglish;private TextView mTxvChinese;private TextView mTxvDel;private TextView mTxvModify;private List<WordsBean> mListWords = new ArrayList<>();private Button mBtnNext;@Overrideprotected void initData() {mBtnA.setOnClickListener(this);mBtnB.setOnClickListener(this);mBtnC.setOnClickListener(this);mBtnD.setOnClickListener(this);mBtnNext.setOnClickListener(this);mTxvGrasp.setOnClickListener(this);mSQWordsHelper = new SQWordsHelper(mContext);mSQLiteDatabase = mSQWordsHelper.getWritableDatabase();mBtnNext.setVisibility(View.GONE);//获取需要测试的单词和翻译setAnswer();}private void setAnswer() {//获取四组数据mListWords = WordsUtils.get(mContext);//需要测试的组赋值mString_English = mListWords.get(0).getEnglish();mString_Chinese = mListWords.get(0).getChinses();//单词发送到TextView上mTxvWord.setText(mString_English);//随机选取一个按钮放中文答案,其他按钮放上获取的随机非正确答案switch (mRandom.nextInt(4) % (4) + 1) {case 1:mBtnA.setText(mString_Chinese);mBtnB.setText(mListWords.get(1).getChinses());mBtnC.setText(mListWords.get(2).getChinses());mBtnD.setText(mListWords.get(3).getChinses());break;case 2:mBtnB.setText(mString_Chinese);mBtnA.setText(mListWords.get(1).getChinses());mBtnC.setText(mListWords.get(2).getChinses());mBtnD.setText(mListWords.get(3).getChinses());break;case 3:mBtnC.setText(mString_Chinese);mBtnA.setText(mListWords.get(1).getChinses());mBtnB.setText(mListWords.get(2).getChinses());mBtnD.setText(mListWords.get(3).getChinses());break;case 4:mBtnD.setText(mString_Chinese);mBtnA.setText(mListWords.get(1).getChinses());mBtnB.setText(mListWords.get(2).getChinses());mBtnC.setText(mListWords.get(3).getChinses());break;}}//重置按钮private void reSet() {mBtnA.setBackground(getResources().getDrawable(R.drawable.btn_background));mBtnB.setBackground(getResources().getDrawable(R.drawable.btn_background));mBtnC.setBackground(getResources().getDrawable(R.drawable.btn_background));mBtnD.setBackground(getResources().getDrawable(R.drawable.btn_background));mBtnA.setEnabled(true);mBtnB.setEnabled(true);mBtnC.setEnabled(true);mBtnD.setEnabled(true);}//选择判断@SuppressLint("SetTextI18n")private void getJudg(Button btn, String str_btn) {if (str_btn.equals(mString_Chinese)) {//选择正确btn.setBackground(getResources().getDrawable(R.drawable.btn_green));if (btn == mBtnA) {mBtnB.setText(mListWords.get(1).getEnglish() + " : " + mListWords.get(1).getChinses());mBtnC.setText(mListWords.get(2).getEnglish() + " : " + mListWords.get(2).getChinses());mBtnD.setText(mListWords.get(3).getEnglish() + " : " + mListWords.get(3).getChinses());} else if (btn == mBtnB) {mBtnA.setText(mListWords.get(1).getEnglish() + " : " + mListWords.get(1).getChinses());mBtnC.setText(mListWords.get(2).getEnglish() + " : " + mListWords.get(2).getChinses());mBtnD.setText(mListWords.get(3).getEnglish() + " : " + mListWords.get(3).getChinses());} else if (btn == mBtnC) {mBtnA.setText(mListWords.get(1).getEnglish() + " : " + mListWords.get(1).getChinses());mBtnB.setText(mListWords.get(2).getEnglish() + " : " + mListWords.get(2).getChinses());mBtnD.setText(mListWords.get(3).getEnglish() + " : " + mListWords.get(3).getChinses());} else if (btn == mBtnD) {mBtnA.setText(mListWords.get(1).getEnglish() + " : " + mListWords.get(1).getChinses());mBtnB.setText(mListWords.get(2).getEnglish() + " : " + mListWords.get(2).getChinses());mBtnC.setText(mListWords.get(3).getEnglish() + " : " + mListWords.get(3).getChinses());}} else {//选择错误btn.setBackground(getResources().getDrawable(R.drawable.btn_red));if (btn != mBtnA && mBtnA.getText().toString().equals(mString_Chinese)) {mBtnA.setBackground(getResources().getDrawable(R.drawable.btn_green2));mBtnB.setText(mListWords.get(1).getEnglish() + " : " + mListWords.get(1).getChinses());mBtnC.setText(mListWords.get(2).getEnglish() + " : " + mListWords.get(2).getChinses());mBtnD.setText(mListWords.get(3).getEnglish() + " : " + mListWords.get(3).getChinses());} else if (btn != mBtnB && mBtnB.getText().toString().equals(mString_Chinese)) {mBtnB.setBackground(getResources().getDrawable(R.drawable.btn_green2));mBtnA.setText(mListWords.get(1).getEnglish() + " : " + mListWords.get(1).getChinses());mBtnC.setText(mListWords.get(2).getEnglish() + " : " + mListWords.get(2).getChinses());mBtnD.setText(mListWords.get(3).getEnglish() + " : " + mListWords.get(3).getChinses());} else if (btn != mBtnC && mBtnC.getText().toString().equals(mString_Chinese)) {mBtnC.setBackground(getResources().getDrawable(R.drawable.btn_green2));mBtnA.setText(mListWords.get(1).getEnglish() + " : " + mListWords.get(1).getChinses());mBtnB.setText(mListWords.get(2).getEnglish() + " : " + mListWords.get(2).getChinses());mBtnD.setText(mListWords.get(3).getEnglish() + " : " + mListWords.get(3).getChinses());} else if (btn != mBtnD && mBtnD.getText().toString().equals(mString_Chinese)) {mBtnD.setBackground(getResources().getDrawable(R.drawable.btn_green2));mBtnA.setText(mListWords.get(1).getEnglish() + " : " + mListWords.get(1).getChinses());mBtnB.setText(mListWords.get(2).getEnglish() + " : " + mListWords.get(2).getChinses());mBtnC.setText(mListWords.get(3).getEnglish() + " : " + mListWords.get(3).getChinses());}}//选择完以后设置按钮不可点击mBtnA.setEnabled(false);mBtnB.setEnabled(false);mBtnC.setEnabled(false);mBtnD.setEnabled(false);//选择完以后把右下角 下一个 按钮显示出来mBtnNext.setVisibility(View.VISIBLE);}@Overrideprotected int initLayout() {return R.layout.layout_choose;}@Overrideprotected void initView() {mTxvWord = findViewById(R.id.txv_word);mBtnA = findViewById(R.id.btn_a);mBtnB = findViewById(R.id.btn_b);mBtnC = findViewById(R.id.btn_c);mBtnD = findViewById(R.id.btn_d);mTxvGrasp = findViewById(R.id.txv_grasp);mBtnNext = findViewById(R.id.btn_next);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_a:getJudg(mBtnA, mBtnA.getText().toString());break;case R.id.btn_b:getJudg(mBtnB, mBtnB.getText().toString());break;case R.id.btn_c:getJudg(mBtnC, mBtnC.getText().toString());break;case R.id.btn_d:getJudg(mBtnD, mBtnD.getText().toString());break;case R.id.btn_next://下一个reSet();setAnswer();mBtnNext.setVisibility(View.GONE);break;case R.id.txv_grasp:View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_words_menu, null);mTxvEnglish = view.findViewById(R.id.txv_english);mTxvChinese = view.findViewById(R.id.txv_chinese);mTxvDel = view.findViewById(R.id.txv_del);mTxvModify = view.findViewById(R.id.txv_modify);mTxvEnglish.setText("English:" + mString_English);mTxvChinese.setText("中文:" + mString_Chinese);mTxvDel.setText("掌握(删除)");mTxvModify.setText("取消");final Dialog dialog = DialogUtils.show(mContext, view);mTxvDel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {removeData(mString_English);reSet();dialog.dismiss();}});mTxvModify.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();}});break;}}private void removeData(String str_del) {//数据库同步删除String clause = SQWordsHelper.WORD + "=?";mSQLiteDatabase.delete(SQWordsHelper.TABLE_NAME, clause, new String[]{str_del});}}

到这就算完成了:添加单词、词库管理、选择模式了!逻辑比较简单,然后本人也是初学者,很多代码写得比较冗杂,有很多可以优化的地方,这些都等前期功能全都实现了再进行一波优化!

用到的基类、自定义Button、工具类

基类BaseActivity

public abstract class BaseActivity extends AppCompatActivity {protected Context mContext;@Overrideprotected void onCreate(Bundle savedInstanceState) {initWindow();super.onCreate(savedInstanceState);mContext = BaseActivity.this;setContentView(initLayout());//控件声明initView();//数据initData();}protected abstract void initData();protected void initWindow() {}protected abstract int initLayout();protected abstract void initView();}

自定义Button,MyFirstButton

@SuppressLint("AppCompatCustomView")
public class MyFirstButton extends Button {//字体阴影private int mShadowRadius =6;private int mShadowDx = 3;private int mShadowDy= 3;private int mShadowColor= getResources().getColor(R.color.colorShadowBlack);//字体样式private Typeface mTypeface= Typeface.DEFAULT;private int mStyle= Typeface.BOLD;//背景private Drawable mBackground= getResources().getDrawable(R.drawable.btn_background);//字体颜色private int mTextColor= getResources().getColor(R.color.colorWhite);private void set() {//阴影super.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, mShadowColor);//字体样式super.setTypeface(mTypeface, mStyle);//背景super.setBackground(mBackground);//字体颜色super.setTextColor(mTextColor);}public MyFirstButton(Context context) {super(context);set();}public MyFirstButton(Context context, AttributeSet attrs) {super(context, attrs);set();}public MyFirstButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);set();}
}

获取单词的工具类,这里的功能是随机获取词库中不相同的四组数据返回,实现原理是:首先获取词库所有的数据,然后通过获取四个不相同的随机数,最后用这四个随机数作为下标来获取数组中的四组数据,就相当于是随机获取了数组中的四组数据了!

public class WordsUtils {private static List<WordsBean> sList;private static List<WordsBean> sList_Return;private static SQWordsHelper sMSQHelper;private static Cursor sCursor;private static SQLiteDatabase sSQLiteDatabase;private static WordsBean sGetWordBean;private static Random sRandom = new Random();private static Set<Integer> sSetReturn;private static int sI;private static Object[] sArray;/*** 返回四组数据(单词 + 中文)*/public static List<WordsBean> get(Context context) {sList = new ArrayList<>();sSetReturn = new HashSet<>();sList_Return = new ArrayList<>();sMSQHelper = new SQWordsHelper(context);sSQLiteDatabase = sMSQHelper.getWritableDatabase();sCursor = sSQLiteDatabase.query(SQWordsHelper.TABLE_NAME, null, null, null, null, null, null);//获取总词库while (sCursor.moveToNext()) {sGetWordBean = new WordsBean();String english = sCursor.getString(0);String chinese = sCursor.getString(1);sGetWordBean.setEnglish(english);sGetWordBean.setChinses(chinese);sList.add(sGetWordBean);}sSetReturn.clear();//四个随机数while (sSetReturn.size() <= 4) {sI = sRandom.nextInt(sList.size()) % (sList.size());sSetReturn.add(sI);}//随机的四组数据传入返回的数组中sArray = sSetReturn.toArray();for (int i = 0; i < sArray.length; i++) {sGetWordBean = new WordsBean();sGetWordBean.setEnglish(sList.get((Integer) sArray[i]).getEnglish());sGetWordBean.setChinses(sList.get((Integer) sArray[i]).getChinses());sList_Return.add(sGetWordBean);}return sList_Return;}}

对话框工具类

public class DialogUtils {//自定义View对话框public static Dialog show(Context context, View view) {AlertDialog.Builder builder = new AlertDialog.Builder(context).setView(view).setCancelable(true);Dialog dialog = builder.show();dialog.getWindow().getDecorView().setBackground(null);return dialog;}}

BUG求助:随机获取的数据会莫名固定那么几个,暂未查明原因,希望有大佬评论区或者私聊帮助一下
同样欢迎小伙们一起研究探讨!
下一步将进阶填空题!

本文持续更新(感兴趣可以收藏一波)…

数据库实现一个轻量的背单词APP相关推荐

  1. 在 C++ 中实现一个轻量的标记清除 gc 系统

    在 C++ 中实现一个轻量的标记清除 gc 系统 最近想把 engine 做一个简单 C++ 封装,结合 QT 使用.engine 本身是用纯 C 实现的,大部分应用基于 lua 开发.对对象生命期管 ...

  2. 关于VSCode中工作区的讲解与使用工作区还你一个轻量 的VSCode

    VSCode的使用率在逐渐提高,但安装太多的插件会使得VSCode变得臃肿,甚至运行变慢,占用太多内存,此文章介绍了工作区,并如何来使用工作区更好地体验VSCode. 初次使用VSCode,肯定有很多 ...

  3. java背单词软件_一个JAVA写的背单词程序

    一个JAVA写的背单词程序 2007-6-9文字大小:大中小 俺看了一些Java, 写个程序出来玩玩.由于界面是用Jbuilder生成的,可能代码比较乱,而且还没合起来. 目前版本是0.00001 / ...

  4. Javalin:一个轻量的 Web Framework

    说起 Java 语言下的 Web 框架那就非 Spring Framework 不可了,但是今天在和别人在聊天的过程中发现了一个新奇的项目 Javalin.Javalin 是一个轻量的 Web 框架. ...

  5. 我们开源了一个轻量的 Web IDE UI 框架 - Molecule

    Molecule , 一个轻量的 Web IDE UI 框架 https://github.com/DTStack/molecule​github.com/DTStack/molecule 简介 Mo ...

  6. windows中常用的一个轻量的扫描软件xray_windows_amd64

    1.xray_windows_amd64现在windows中常用的一个轻量的扫描软件,用法要求各位同学通过物联网查找使用方式 完成对文章管理系统cms页面进行漏洞扫描. ①安装证书,在命令框xray_ ...

  7. Multipass - 一个轻量虚拟机管理器

    Multipass 是一个轻量虚拟机管理器,是由 Ubuntu 运营公司 Canonical 所推出的开源项目.运行环境支持 Linux.Windows.macOS.在不同的操作系统上,使用的是不同的 ...

  8. 基于AndroidStudio+Java+SQLite开发的背单词APP系统

    目 录 第一章 绪论 1 1.1 选题设计开发的应用背景及价值 1 1.2 选题的研究现状 1 1.3 关于本课题 2 第二章 开发环境与主要技术 3 2.1 开发平台 3 2.2 主要技术 4 2. ...

  9. 考研词汇测试软件,考研有哪些好用的背单词APP神器

    原标题:考研有哪些好用的背单词APP神器 英语单词大家都很脑阔疼吧,但是不背又不行,目前市面上背单词的啊婆婆(APP)这么多,想挑一款适合考研用的应该很费时间吧,不用担心了,今天给大家推荐几个备受考研 ...

  10. 背单词App开发日记5(上)

    2015.07.28 今天是我阳历生日,先自己庆祝一下!哈哈. 为什么总是写博客的时间和发博客的时间不一样那?这我也没办法啊.....因为每天花在这上面的时间比较少,所以做完一项的时间很长(回家全是事 ...

最新文章

  1. Qt数据库操作(三) -- 使用SQL模型类
  2. 详解mybatis的配置setMapperLocations多个路径两种方法
  3. drools6.5_Drools 6.5.0.Final可用
  4. windows qt 不能debug_linux配置vlc-qt
  5. python第三方模块安装路径_Python第三方Window模块文件的几种安装方法
  6. 狼奔代码生成器使用说明
  7. java int范围_Java之int及它的取值范围
  8. 2020年十大开源漏洞回顾
  9. 不同特征值对应的特征向量
  10. python中type(12.34)_下面代码的输出结果是
  11. android开发第一个程序,Android开发入门之第一个android程序
  12. 利用鱼群算法求解最值问题(一元或多元)MATLAB编程实现
  13. TM1640调试时的异常问题
  14. 基于SSM企业人事管理系统.doc
  15. Spring实战(开发Web应用)
  16. No content to map to Object due to end of input
  17. 【机器学习】在生产环境使用Kafka构建和部署大规模机器学习
  18. python动物农场小说网站爬虫_中文编程,用python编写小说网站爬虫
  19. 开发Android系统应用
  20. 经验:如何快速地写出格雷码

热门文章

  1. 听说现在消防控制室都要求中级消防设施操作员了?这个工作前景怎么样?
  2. html语言什么时候加引号,什么时候冒号后面不用引号
  3. 计算机开机黑屏风扇转,电脑风扇转但是开不了机怎么办_电脑风扇转但是黑屏...
  4. 优秀java程序员必须具备的技术技能
  5. 全国计算机高新技术作用,全国计算机高新技术考试证书作用是什么?
  6. 你会为了钱出售自己的个人资料吗?
  7. [转载vchome] 2005年经典事件
  8. 机器人断指_揭秘我国机器人发展历程:从机械手到服务机器人
  9. 使用canvas在原有图片上进行画框并保存
  10. 天南星科系统发育及全基因组复制事件的研究取得新进展