跑儿是一款跑腿APP,用户可以发布自己的跑腿需求然后跑手可以进行接单来完成相应的“任务”。



开发工具:Android Studio,SQLite Expert Professional,Photoshop
开发语言:Android,Java
1.初始界面
初始界面会有两个按钮,一个登录,一个注册,两个按钮分别加了监听,点击时会出现不同的响应。
2.注册
当点击注册界面时,会弹出一个AlertDialog的注册界面,头像选择采用的是一个网格布局来显示的,用户名跟密码采用了正则表达式来进行判断,当用户名或密码出现特殊字符时系统会弹出一个Toast提示用户名或密码格式错误,并清空你刚才输入的用户名跟密码让你重新输入,当你填写用户名时,会拿你这个用户名在数据库里进行查找比对,如果这个用户名在数据库中存在,则系统会提示用户名已被注册,你可以选择返回主页面直接进行登陆;当所有信息填写无误时点击注册,系统会弹出一个对话框提示你注册成功,点击返回主页登录,Dialog将关闭回到初始界面登录。
3.登陆
点击登录按钮,会弹出一个Dialog,输入注册时的账号跟密码,点击登录按钮,将你输入的账号跟密码去数据库进行进行查找,如果账号密码跟数据库的某条相同,则返回一个true并显示登录成功,否则显示登陆失败,登陆成功后系统会提示你打开地图定位权限,为了后面地图功能的正常运行。
4.管理员模式
管理员账号:liuaichao 密码:123456 进入管理员模式后,会将注册的数据库信息通过ListView呈现出来包括用户名,性别,手机号,头像,点击窗口右上角的按钮,会出现管理,点击管理后,每个用户的后面会出现删除按钮,点击删除可将此用户从数据库中删除,也可以点击对应的CheckBox来进行批量删除,给每个条目上面的CheckBox加监听,点击储存当前CheckBox的选中状态到对应条目的User对象里面去,避免适配器刷新后导致CheckBox恢复初始未选中状态。ListView的Adapter是继承了自己写的一个MyAdapter,为了方便数据的传入。

5.主页
主页是跑儿的订单编辑跟提交界面,左上角为你当前位置的定位,右上角为地图,这里使用了百度地图的API,给你在写起点终点时提供了一个位置参考和您当前位置的官方描述
物品类型采用了ArrayList跟下拉框的配合,使物品类型更加形象的展示出来,具体内容可以输入一些自己对跑手的要求;
点击提交按钮会弹出一个对话框提示订单提交成功,并清空刚才订单输入的信息,点击返回主页将返回到登陆成功界面(注:初始APP未加入金钱建议功能,因为接入第三方支付比如支付宝,微信等,需要企业的营业执照等相关信息的提交,所以未涉及金钱交易)
6.订单
订单界面是单独的一个数据库,为了实现单个用户拥有自己单独的订单,自己想了一个方法:单独建立一个数据库,根据getWritableDatabase()的用法打开或创建数据库,即当存在这个数据库是是打开,不存在时是创建,我想的是通过改变数据库的名字来实现订单的独立,当你登录成功时,获取你的用户名,因为用户名是不可重复的即唯一的,用这个用户名来创建或打开数据库,这样每个账户便有了一个自己唯一的订单管理库,可以查看历史订单跟新订单。每条订单信息包括起点,终点,备注,下单时间,订单状态,取消订单,地图,确认完成按钮,通过date中的toLocaleString()方法获取系统的下单时间来作为之后跑手版的订单唯一标识,状态会显示订单目前的状态,当跑手未接单时状态显示未接单,跑手接单后,会显示已接单,点击确认订单完成按钮后,会显示已完成,取消订单会将订单取消并且将订单从数据库中删除,地图按钮会显示你跟跑手之间的位置,跑手方会给你传一个经纬度坐标,然后跟你的经纬度进行骑行规划,来实时跟踪订单位置。
7.我的
“我的”界面,也就是简单个人信息界面,包括头像跟用户名,点击个人信息会跳转到详细的个人信息界面,点击切换到跑手版将会进入跑手界面,可进行接单操作。
8.个人信息
个人信息界面会从数据库中找到该条记录,然后详细的展示出来,默认用户名是不可修改的,点击密码栏的“点击修改”将进入修改密码的界面,输入旧密码,根据用户名去数据库中找出旧密码进行比对,成功返回true,新密码跟确认新密码进行一次比对,相同返回true,同样的,新密码也有正则表达式的验证,成功后,新密码将填入数据库,系统提示重新登录,确定后进入登陆界面;手机号可以直接修改,点击“保存”后会将修改的信息保存并返回“我的”界面;点击退出账号即退出当前账号,返回登陆界面。
9.跑手版
为了跟好的测试,我们加入了跑手版,也就是接单的模块,这个模块相当于一个大厅效果,所有的用户提交订单号一份数据传入自己私有的数据库,另一份传入“大厅”数据库,跑手版的数据也是有ListViev呈现出来的,点击电话按钮时,会根据你所点条目第position来确定某个用户的订单,然后根据用户注册时输入的手机号通过Uri.parse(“tel:”+tel)来调用系统拨号来给下单者拨号;点击“确认接单”按钮,该订单将从“大厅”数据库中删除,并修改私有数据库的状态为已接单,给下单者一个准确的提示。

下面部分代码(代码太长,有需要的可以在底下评论):

package com.example.thinkpad.apps.ui;import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;import com.example.thinkpad.apps.R;
import com.example.thinkpad.apps.dao.IUserDao;
import com.example.thinkpad.apps.dao.impl.UserDaoDBImpl;
import com.example.thinkpad.apps.dao.utils.CheckString;
import com.example.thinkpad.apps.dao.utils.MyOpenHelper;public class ChangeActivity extends Activity implements View.OnClickListener {private ImageButton fanhui;private EditText oldpwd;private EditText newpwd;private EditText renewpwd;private Button enter;private IUserDao userDao;private MyOpenHelper mOpenHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_change);fanhui=findViewById(R.id.xg_fanhui);oldpwd=findViewById(R.id.xg_oldpwd);newpwd=findViewById(R.id.xg_newpwd);renewpwd=findViewById(R.id.xg_renewpwad);enter=findViewById(R.id.xg_enter);//监听fanhui.setOnClickListener(this);enter.setOnClickListener(this);userDao= UserDaoDBImpl.getDao(this);mOpenHelper=new MyOpenHelper(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.xg_fanhui:Intent intent=new Intent(this,PersonActivity.class);startActivity(intent);finish();break;case R.id.xg_enter:String old=oldpwd.getText().toString().trim();String news=newpwd.getText().toString().trim();String renew=renewpwd.getText().toString().trim();String name=WelcomeActivity.Noname;if(CheckString.check(news)){if(userDao.findUserPwd(old)&&news.equals(renew)){Toast.makeText(this, "密码修改成功,请重新登录", Toast.LENGTH_SHORT).show();//数据库进行修改SQLiteDatabase db=mOpenHelper.getWritableDatabase();ContentValues contentValues=new ContentValues();contentValues.put("pwd",news);db.update("user",contentValues,"name=?",new String[]{name});db.close();Intent intent1=new Intent(this,WelcomeActivity.class);startActivity(intent1);this.overridePendingTransition(R.anim.main_in1,R.anim.main_out1);finish();}else if(userDao.findUserPwd(old)==false){Toast.makeText(this, "旧密码输入不正确,请重新输入", Toast.LENGTH_SHORT).show();}else if((userDao.findUserPwd(old)==true)&&(news.equals(renew)==false)){Toast.makeText(this, "两次输入的密码不一致", Toast.LENGTH_SHORT).show();}}else{Toast.makeText(this, "密码中含有非法字符或密码长度短", Toast.LENGTH_SHORT).show();}break;}}
}package com.example.thinkpad.apps.ui;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.Date;import com.example.thinkpad.apps.IUserDao2;
import com.example.thinkpad.apps.R;
import com.example.thinkpad.apps.dao.IUserDao3;
import com.example.thinkpad.apps.dao.entity.User;
import com.example.thinkpad.apps.dao.entity.User2;
import com.example.thinkpad.apps.dao.entity.User3;
import com.example.thinkpad.apps.dao.impl.UserDaoDBImpl2;
import com.example.thinkpad.apps.dao.impl.UserDaoDBImpl3;
import com.example.thinkpad.apps.dao.utils.MyOpenHelper;
import com.example.thinkpad.apps.dao.utils.MyOpenHelperPao;
import com.example.thinkpad.apps.map.Ditu;import java.util.ArrayList;
import java.util.List;public class jinru extends Activity implements View.OnClickListener {private TextView dn_didian;private ImageButton dn_ditu;private EditText dn_qidian;private EditText dn_zhongdian;private EditText dn_jiner;private EditText dn_neirong;private Spinner dn_spinner;private Button dn_tijiao;private Button dn_zhuye;private Button dn_dingdan;private Button dn_wode;private List<String> list;private Date loca_time;private IUserDao2 userDao;private IUserDao3 userDao3;private AlertDialog.Builder mBuilder2;private AlertDialog.Builder mBuilder3;private  AlertDialog alertDialog2;private  AlertDialog alertDialog3;private static MyOpenHelper mOpenHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.zhuye);//实例化对象dn_didian=findViewById(R.id.didian);dn_ditu=findViewById(R.id.ditu);dn_qidian=findViewById(R.id.zy_qidian);dn_zhongdian=findViewById(R.id.zy_zhongdian);dn_jiner=findViewById(R.id.zy_jiner);dn_neirong=findViewById(R.id.zy_neirong);dn_spinner=findViewById(R.id.spinner);dn_tijiao=findViewById(R.id.zy_tijiao);dn_zhuye=findViewById(R.id.zy_zhuye);dn_dingdan=findViewById(R.id.zy_dingdan);dn_wode=findViewById(R.id.zy_wode);mOpenHelper=new MyOpenHelper(this);//设置按钮的监听dn_ditu.setOnClickListener(this);//地图dn_tijiao.setOnClickListener(this);//提交dn_zhuye.setOnClickListener(this);//主页dn_zhuye.setEnabled(false);//主页dn_dingdan.setOnClickListener(this);//订单dn_wode.setOnClickListener(this);//我的dn_didian.setText(Ditu.weizhi);list = new ArrayList<String>();list.add("---请选择物品类型---");list.add("快递");list.add("食品");list.add("电子产品");list.add("大型物品>50kg");list.add("代购");list.add("其他");final ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,list);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);dn_spinner.setAdapter(adapter);//时间loca_time=new Date();userDao= UserDaoDBImpl2.getDao(this,WelcomeActivity.Noname,null,1);userDao3= UserDaoDBImpl3.getDao(this);//提交成功弹出对话框mBuilder2=new AlertDialog.Builder(this);mBuilder2.setTitle("");mBuilder2.setMessage("订 单 提 交 成 功");mBuilder2.setPositiveButton("返回主页", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dn_qidian.setText("");dn_zhongdian.setText("");dn_jiner.setText("");dn_neirong.setText("");alertDialog2.dismiss();adapter.notifyDataSetChanged();}});alertDialog2=mBuilder2.create();//返回键监听提示框mBuilder3=new AlertDialog.Builder(this);mBuilder3.setTitle("");mBuilder3.setMessage("您 确 定 要 退 出 吗");mBuilder3.setPositiveButton("退出", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();alertDialog3.dismiss();adapter.notifyDataSetChanged();}});mBuilder3.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {alertDialog3.dismiss();adapter.notifyDataSetChanged();}});alertDialog3=mBuilder3.create();}
public void askGoOn2(){alertDialog2.show();
}
public void onBackPressed() {alertDialog3.show();
}//按钮监听
@Override
public void onClick(View v) {switch (v.getId()){case R.id.ditu:Intent intent=new Intent(this, Ditu.class);startActivity(intent);this.overridePendingTransition(R.anim.main_in4,R.anim.main_out4);finish();break;case R.id.zy_tijiao://提交订单按钮实现String name=WelcomeActivity.Noname;String qidian=dn_qidian.getText().toString();String zhongdian=dn_zhongdian.getText().toString();String jiner=dn_jiner.getText().toString();String neirong=dn_neirong.getText().toString();String time= loca_time.toLocaleString();//查找电话String tel;tel="";SQLiteDatabase db=mOpenHelper.getWritableDatabase();String sql="select * from user where name=?";Cursor cursor=db.rawQuery(sql,new String[]{name});while (cursor.moveToNext()){tel=cursor.getString(cursor.getColumnIndex("tel"));}String state="未接单";User2 u=new User2();u.setStart(qidian);u.setFina(zhongdian);u.setRemark(neirong);u.setTime(time);u.setState(state);u.setNamer(name);userDao.addUser(u);//写入add数据库User3 u1=new User3();u1.setStart(qidian);u1.setFina(zhongdian);u1.setRemark(neirong);u1.setTime(time);u1.setState(state);u1.setNamer(name);u1.setTel(tel);userDao3.addUser(u1);askGoOn2();break;case R.id.zy_zhuye:break;case R.id.zy_dingdan:Intent intent1=new Intent(this,ResultActivity2.class);startActivity(intent1);this.overridePendingTransition(R.anim.main_in1,R.anim.main_out1);finish();break;case R.id.zy_wode:Intent intent2=new Intent(this,WodeActivity.class);startActivity(intent2);this.overridePendingTransition(R.anim.main_in1,R.anim.main_out1);finish();break;}}
}package com.example.thinkpad.apps.ui;import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import com.example.thinkpad.apps.R;
import com.example.thinkpad.apps.dao.utils.MyOpenHelper;public class PersonActivity extends Activity implements View.OnClickListener {private Button fanhui;private Button baocun;private Button tuichu;private Button xiugai;private ImageView head;private TextView zhanghao;private EditText tel;private MyOpenHelper mOpenHelper;private String namer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_person);//实例化fanhui=findViewById(R.id.ps_fanhui);baocun=findViewById(R.id.ps_baocun);tuichu=findViewById(R.id.ps_tuichu);xiugai=findViewById(R.id.ps_xiugai);head=findViewById(R.id.ps_head);zhanghao=findViewById(R.id.ps_zhanghao);tel=findViewById(R.id.ps_tel);mOpenHelper=new MyOpenHelper(this);//按钮监听fanhui.setOnClickListener(this);baocun.setOnClickListener(this);tuichu.setOnClickListener(this);xiugai.setOnClickListener(this);//信息展示xinxishow();}private void xinxishow() {SQLiteDatabase db=mOpenHelper.getWritableDatabase();String sql="select * from user where name=?";Cursor cursor=db.rawQuery(sql,new String[]{WelcomeActivity.Noname});while(cursor.moveToNext()){namer=cursor.getString(cursor.getColumnIndex("name"));head.setImageResource(cursor.getInt(cursor.getColumnIndex("headImg")));//设置头像zhanghao.setText(namer);tel.setText(cursor.getString(cursor.getColumnIndex("tel")));}}
@Override
public void onClick(View v) {switch(v.getId()){case R.id.ps_fanhui://取消Intent intent3=new Intent(this,WodeActivity.class);startActivity(intent3);this.overridePendingTransition(R.anim.main_in2,R.anim.main_out2);finish();break;case R.id.ps_baocun://保存电话String ntel=tel.getText().toString().trim();String nname=zhanghao.getText().toString().trim();SQLiteDatabase db=mOpenHelper.getWritableDatabase();ContentValues contentValues=new ContentValues();contentValues.put("tel",ntel);db.update("user",contentValues,"name=?",new String[]{nname});db.close();Toast.makeText(this, "信息保存成功", Toast.LENGTH_SHORT).show();Intent intent=new Intent(this,WodeActivity.class);startActivity(intent);this.overridePendingTransition(R.anim.main_in1,R.anim.main_out1);finish();break;case R.id.ps_xiugai://修改密码Intent intent1=new Intent(this,ChangeActivity.class);startActivity(intent1);break;case R.id.ps_tuichu://退出Intent intent2=new Intent(this,WelcomeActivity.class);startActivity(intent2);this.overridePendingTransition(R.anim.main_in1,R.anim.main_out1);finish();break;}
}
}
package com.example.thinkpad.apps.ui;import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import com.example.thinkpad.apps.R;
import com.example.thinkpad.apps.dao.IUserDao;
import com.example.thinkpad.apps.dao.impl.UserDaoDBImpl;
import com.example.thinkpad.apps.dao.utils.CheckString;
import com.example.thinkpad.apps.dao.utils.MyOpenHelper;public class WelcomeActivity extends Activity implements View.OnClickListener{private Button item_login;
private Button item_reg;
private EditText mEdtLoginname;//用户名输入框
private EditText mEdtLoginpwd;//密码输入框
private Button mBtLogingo;
private Button mBtLogincancel;
private IUserDao userDao;
private Button denglu;
private Button zhuce;
private Dialog  dig_login;
private UserDaoDBImpl userDaoDB;
public static String Noname;@Override
protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_welcome);userDao=UserDaoDBImpl.getDao(this);dig_login=new Dialog(this);dig_login.setContentView(R.layout.login_dig);dig_login.setTitle("登录");denglu=(Button) findViewById(R.id.denglu);//登录按钮zhuce=(Button) findViewById(R.id.zhuce);//注册按钮//登录界面监控mEdtLoginname=(EditText)dig_login.findViewById(R.id.edt_loginname);mEdtLoginpwd=(EditText)dig_login.findViewById(R.id.edt_loginpwd);mBtLogingo=(Button)dig_login.findViewById(R.id.bt_logingo);mBtLogincancel=(Button)dig_login.findViewById(R.id.bt_logincancel);denglu.setOnClickListener(this);zhuce.setOnClickListener(this);mBtLogingo.setOnClickListener(this);mBtLogincancel.setOnClickListener(this);}@Override
public void onClick(View v) {switch (v.getId()){case R.id.denglu://登录进入监听dig_login.show();break;case R.id.bt_logingo://登录监听String name=mEdtLoginname.getText().toString();String pwd=mEdtLoginpwd.getText().toString();if(CheckString.check(name)&&CheckString.check(pwd)){//判断数据库中是否有数据,能否登录if(userDao.findUserByNameAndPwd(name,pwd)){Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();Toast.makeText(this, "请开启地图定位权限", Toast.LENGTH_SHORT).show();Noname=name;Intent intent=new Intent(this,jinru.class);startActivity(intent);this.overridePendingTransition(R.anim.main_in1,R.anim.main_out1);dig_login.cancel();finish();}else if(name.equals("liuaichao")&&pwd.equals("123456")){Toast.makeText(this, "进入管理员模式", Toast.LENGTH_SHORT).show();Intent intent=new Intent(this,ResultActivity.class);startActivity(intent);} else {Toast.makeText(this, "账号或密码错误,请重新输入", Toast.LENGTH_SHORT).show();}}else{Toast.makeText(this, "用户名或密码格式错误,请重新输入", Toast.LENGTH_SHORT).show();}break;case R.id.bt_logincancel://取消监听dig_login.cancel();break;case R.id.zhuce:Toast.makeText(this, "注册", Toast.LENGTH_SHORT).show();Intent intent=new Intent(this,RegActivity.class);startActivity(intent);break;}}
}

Android开发项目--跑腿APP-跑儿相关推荐

  1. 基于Android平台的记事本软件(Android Studio项目+报告+app文件)

    移动应用开发技术 期末考核报告 题   目:        基于Android平台的记事本软件             学生姓名     学生学号                           ...

  2. 【开源项目】Android开发内置App自动升级

    1.准备工作,首先需要在AndroidManifest.xml中的application中加入以下内容 <providerandroid:name="android.support.v ...

  3. Android开发规范:APP版本发布(全量发布、灰度发布)

    我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 全量发布 灰度发布 欢迎加入Android开发交流QQ群: app ...

  4. Android开发我音乐App

    上个学期有Android课,但当时忙别的事情没怎么听课,突然心血来潮就抱着可以稍微熟悉Android开发的目的,实现了慕课网:我的云音乐App,除了原项目的视图和功能之外还根据自己的掌握程度对界面进行 ...

  5. 基于Android开发的天气预报app(源码下载)

    基于AndroidStudio环境开发的天气app 由于需要源码的人特别多,我特地花时间新增了对最新IDE版本Android Studio Chipmunk | 2021.2.1 Patch 1的支持 ...

  6. Android开发项目实战:实现折叠式布局,android组件化开发与sdk

    android:layout_width="match_parent" android:layout_height="200dp"> <androi ...

  7. android开发分辨率,安卓APP设计规范之1080*1920设计稿对应开发尺寸

    目前市场上,只有Android系统的手机才有1080P全高清的产品.1080P是说手机屏幕的分辨率达到1920*1080像素.1080P的屏幕最直观的改变当然是屏幕精细度的巨大提升,就算是5寸的屏幕, ...

  8. 初学安卓之二维码的简单实现,android开发网上购物app

    打开闪光灯 ScanQRcode完整代码 实现结果 最后注解 参考链接 前言 ============================================================= ...

  9. Android开发项目——智能农业(知识点整理回顾)

    前言:智能农业这个项目可以说是大多都是我们自己完成的.是对于前一个多月Android学习的一个检验,同时也是对我们成绩的一个凭据.意义非常重大. 一.对于布局方面 下面我放两张例图,是我认为在布局上对 ...

最新文章

  1. 通用权限管理系统组件 (GPM - General Permissions Manager)
  2. 医学科研如何快速掌握R语言?
  3. R开发(part8)--应用R语言中的函数环境空间
  4. 跟我一起学Redis之Redis事务简单了解一下
  5. 滴水课后作业(1-5)
  6. Qt文档阅读笔记-ToolBar QML Type
  7. 继承单例模式 php_解决 PhpStorm 对 用单例模式实例化PHP类时,代码自
  8. python进阶10并发之六并行化改造
  9. ubuntu升级11.10登录桌面
  10. 【译】GMO Media 使用 HashiCorp Terraform Enterprise 自动配置基础设施
  11. iPad 2 移植 Siri 常见问题解答及注意事项
  12. Linux驱动系列目录
  13. java基于SSM的宠物医院信息管理系统
  14. 迅雷赚钱宝变砖TTL修复教程赚钱宝刷机
  15. linux wps 微软雅黑字体,微软雅黑字体下载,微软雅黑字体下载应用到wps
  16. 有些人无缘再见,却一生想念
  17. 玩家交互体验——梦幻飞仙
  18. HTML动画XYZ轴的用法详解
  19. 那些年,我们用过的地图下载器
  20. linux下rsync启动命令,linux下rsync命令详细整理

热门文章

  1. Origin画图技巧之回归(标准值与预测值)
  2. 通过取消反向DNS加速ssh登录速度
  3. OpenHarmony WLAN HDI 源码学习
  4. 麦克劳林公式怎么记忆_如何巧记麦克劳林级数?
  5. 数据科学之 如何找到指标的最 佳分裂点的几个想法
  6. STM32F103C8T6 I/O口驱动4位共阳数码管
  7. 18 | 需求管理:太多人给你安排任务,怎么办?
  8. 本地html图片载入很慢,打开网页时图片加载很慢怎么办?网页图片打开慢的解决方法...
  9. CAS的Session两秒挂掉?--解决退出后登录,页面刷新的问题
  10. iphone ipad 为孩子创建 apple id