功能需求

随手记的功能

1编辑增加笔记

2.自由查看修改保存的笔记

3.自由填写文字和图片

主界面编写

MainActivity.java

package com.cong.notepad;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {private TextView addtravels;private ListView travelslist;private DBManage dm=null;private HTMLManager HM=null;public Cursor cursor = null;public Cursor cursor2=null;private int i=0;private int start=0;private int end=0;private String str1=null;private String str2="[";private String str4="]";private String iconname=null;private File copyfromfile=null;private File copyintofile=null;private FileOutputStream copyinto=null;private FileInputStream copyfrom=null;private ListViewAdd adapter;// 数据源对象private static Boolean isExit = false;  private static Boolean hasTask = false;public static final String CHECK_STATE = "0";public static final String EDIT_STATE = "1";public static final String ALERT_STATE = "2";Timer tExit = new Timer();  TimerTask task = new TimerTask() {  @Override  public void run() {  isExit = true;  hasTask = true;  }  }; @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);addtravels=(TextView)findViewById(R.id.addtravels);addtravels.setOnClickListener(new addListener());travelslist=(ListView)findViewById(R.id.travelslist);dm=new DBManage(this);HM=new HTMLManager();initAdapter();       travelslist.setAdapter(adapter);travelslist.setOnItemClickListener(new myOnItemClickListener());travelslist.setOnCreateContextMenuListener(new myOnCreateContextMenuListener());//设置长按监听器}class addListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stubIntent intent=new Intent();intent.setClass(MainActivity.this, edittravels.class);intent.putExtra("state", EDIT_STATE);startActivity(intent);finish();}}public void initAdapter(){dm.open();//打开数据库操作对象cursor = dm.selectAll();//获取所有数据cursor.moveToFirst();//将游标移动到第一条数据,使用前必须调用int count = cursor.getCount();//个数ArrayList<String> items = new ArrayList<String>();ArrayList<String> times = new ArrayList<String>();for(int i= 0; i < count; i++){items.add(cursor.getString(cursor.getColumnIndex("title")));times.add(cursor.getString(cursor.getColumnIndex("time")));cursor.moveToNext();//将游标指向下一个}dm.close();//关闭数据操作对象adapter = new ListViewAdd(this,items,times);//创建数据源}public class myOnCreateContextMenuListener implements OnCreateContextMenuListener{public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {// TODO Auto-generated method stubfinal AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;menu.setHeaderTitle("");//设置选项Log.i("log", "chooseing menu");menu.add(0,0,0,"删除");menu.add(0,1,0,"修改");menu.add(0,2,0,"查看");menu.add(0,3,0,"导出到SD卡");}}public boolean onContextItemSelected(MenuItem item){AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();dm.open();switch(item.getItemId()){case 0://删除Log.i("log", "selectItem---->"+item.getItemId());try{Log.i("log", "cursor ready move ");Log.i("log", "menuInfo position "+menuInfo.position);cursor.moveToPosition(menuInfo.position);Log.i("log", "cursor move success");int i = dm.delete(Long.parseLong(cursor.getString(cursor.getColumnIndex("_id"))));//删除数据adapter.removeListItem(menuInfo.position);//删除数据adapter.notifyDataSetChanged();//通知数据源,数据已经改变,刷新界面dm.close();}catch(Exception ex){ex.printStackTrace();}break;case 1://修改//  Log.v("show", "chenggong2");try{cursor.moveToPosition(menuInfo.position);//用于Activity之间的通讯Intent intent = new Intent();//通讯时的数据传送intent.putExtra("id", cursor.getString(cursor.getColumnIndex("_id")));intent.putExtra("state", ALERT_STATE);intent.putExtra("title", cursor.getString(cursor.getColumnIndex("title")));intent.putExtra("time", cursor.getString(cursor.getColumnIndex("time")));intent.putExtra("content", cursor.getString(cursor.getColumnIndex("content")));//设置并启动另一个指定的Activityintent.setClass(MainActivity.this, edittravels.class);MainActivity.this.startActivity(intent);finish();}catch(Exception ex){ex.printStackTrace();}break;case 2://查看//   Log.v("show", "chenggong3");try{cursor.moveToPosition(menuInfo.position);Intent intent = new Intent();intent.putExtra("id", cursor.getString(cursor.getColumnIndex("_id")));intent.putExtra("title", cursor.getString(cursor.getColumnIndex("title")));intent.putExtra("time", cursor.getString(cursor.getColumnIndex("time")));intent.putExtra("content", cursor.getString(cursor.getColumnIndex("content")));intent.setClass(MainActivity.this, checktravels.class);MainActivity.this.startActivity(intent);}catch(Exception ex){ex.printStackTrace();}break;case 3:try{cursor.moveToPosition(menuInfo.position);String title=cursor.getString(cursor.getColumnIndex("title"));String content=cursor.getString(cursor.getColumnIndex("content"));HM.htmlmanager(title, content);copyicon(title,content);Toast.makeText(MainActivity.this, "导出成功,快去SD卡的\" 随手记 \"里找出来分享吧!!", Toast.LENGTH_LONG).show();}catch(Exception ex){Toast.makeText(MainActivity.this, "Sorry!!!导出失败!!", Toast.LENGTH_LONG).show();ex.printStackTrace();}break;default:;}dm.close();return super.onContextItemSelected(item);}public int copyicon(String title1,String content1){for(i=0;i<content1.length();i++){str1=content1.substring(i, i+1);if(str1.equals(str2)){start=i+1;}if(str1.equals(str4)){end=i;iconname=content1.substring(start, end);Log.i("log", iconname);cursor2=dm.selcetPathByName(iconname);cursor2.moveToFirst();String iconpath2=cursor2.getString(cursor2.getColumnIndex("path"));Log.i("log", iconpath2);cursor2.close();copyfromfile=new File(iconpath2);String copyintopath="/mnt/sdcard/随手记/"+title1+"/"+iconname;Log.i("log", copyintopath);copyfile(iconpath2,copyintopath);} }return 0;}public int copyfile(String from,String into){try{copyfrom=new FileInputStream(from);copyinto=new FileOutputStream(into);Log.i("log", "fuck you");byte[] bt = new byte[1024];  int c;  while((c=copyfrom.read(bt)) > 0){  copyinto.write(bt,0,c);}copyfrom.close();copyinto.close();Log.i("log", "copy success");return 1;}catch (FileNotFoundException e) {  // TODO Auto-generated catch blocke.printStackTrace();return -1;} catch (IOException e) {  // TODO Auto-generated catch blocke.printStackTrace();return -1;}  }//短按,即点击public class myOnItemClickListener implements OnItemClickListener{public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {// TODO Auto-generated method stub//super.onListItemClick(l, v, position, id);Log.i("log", "position--->"+position);cursor.moveToPosition(position);Intent intent = new Intent();intent.putExtra("state", CHECK_STATE);intent.putExtra("id", cursor.getString(cursor.getColumnIndex("_id")));intent.putExtra("title", cursor.getString(cursor.getColumnIndex("title")));intent.putExtra("content", cursor.getString(cursor.getColumnIndex("content")));intent.putExtra("time", cursor.getString(cursor.getColumnIndex("time")));intent.setClass(MainActivity.this, checktravels.class);MainActivity.this.startActivity(intent);}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubcursor.close();super.onDestroy();}public  boolean onKeyDown(int keyCode, KeyEvent event) {  //按两次返回退出// TODO Auto-generated method stub  if(keyCode == KeyEvent.KEYCODE_BACK){  System.out.println(isExit);  if(isExit == false ) {  isExit = true;  System.out.println("isexit1 "+isExit);  Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();  System.out.println("isexit2 "+isExit);  if(!hasTask) {System.out.println("hastask "+hasTask);  tExit.schedule(task, 2000);  }} else {finish();  System.exit(0);}  }return false;
}
}

布局文件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/background"android:orientation="vertical" ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="40dip"android:background="@drawable/lable" ><TextViewandroid:id="@+id/textview"android:layout_width="150dip"android:layout_height="40dip"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:layout_marginTop="5dp"android:text="  随  手   记"android:textColor="#99CC00"android:textSize="24sp"android:textStyle="bold" ></TextView><TextViewandroid:id="@+id/addtravels"android:layout_width="35dip"android:layout_height="38dip"android:layout_alignParentRight="true"android:layout_marginTop="2dip"android:background="@drawable/writeicon" ></TextView></RelativeLayout><ListViewandroid:id="@+id/travelslist"android:layout_width="fill_parent"android:layout_height="fill_parent" ></ListView></LinearLayout>

编辑界面编写

edittravels.java

package com.cong.notepad;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.MediaColumns;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Html.ImageGetter;
import android.text.format.DateFormat;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;public class edittravels extends Activity{private static final int SELECT_IMAGE =123;int rotate = 0; private EditText titleedit;private EditText travelsedit;private ImageButton save;private ImageButton insertimage;private ImageButton takephoto;private String idString;private int id2;private String title="";private String travelsdata = "";private String timeText = "";public Cursor cursor=null;public String namestr="";private DBManage dm=null;private Bitmap bitmap = null;private String path = null;private int state =-1;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.edittravels);titleedit=(EditText)findViewById(R.id.titleedit);travelsedit=(EditText)findViewById(R.id.travelsedit);save=(ImageButton)findViewById(R.id.save);save.setOnClickListener(new saveListener());insertimage=(ImageButton)findViewById(R.id.insertimage);insertimage.setOnClickListener(new insertimageListener());dm=new DBManage(this);Intent intent = getIntent();state = Integer.parseInt(intent.getStringExtra("state"));Log.i("log", "state---->"+state);if (state==2){idString =intent.getStringExtra("id");Log.i("log", "id---->"+idString);id2 =  Integer.parseInt(idString);title = intent.getStringExtra("title");travelsdata = intent.getStringExtra("content");timeText = intent.getStringExtra("time");titleedit.setText(title);dm.open();int i=0;int start=0;int end=0;String str1=null;String str2="[";String str4="]";String iconname=null;SpannableString travelsSpan =new SpannableString(travelsdata);for(i=0;i<travelsdata.length();i++){str1=travelsdata.substring(i, i+1);//travelsString+=str1;Log.i("log", str1);if(str1.equals(str2)){start=i+1;}if(str1.equals(str4)){end=i;namestr=travelsdata.substring(start,end);Log.i("log", namestr);cursor=dm.selcetPathByName(namestr);cursor.moveToFirst();path=cursor.getString(cursor.getColumnIndex("path"));cursor.close();namestr=null;Log.i("log", path);if(!(cursor==null)){int count=cursor.getCount();Log.i("log", "count----->"+count);BitmapFactory.Options options =new BitmapFactory.Options();options.inJustDecodeBounds =true;bitmap =BitmapFactory.decodeFile(path, options); //此时返回bm为空options.inJustDecodeBounds =false;int be = (int)(options.outHeight/ (float)100);if (be <= 0)be = 1;options.inSampleSize = be;bitmap=BitmapFactory.decodeFile(path,options);Drawable drawable = new BitmapDrawable(bitmap);drawable.setBounds(0, 0, 360, 280);ImageSpan span = new ImageSpan(drawable,ImageSpan.ALIGN_BOTTOM);travelsSpan.setSpan(span, start-1,end+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}else{Log.i("log", "insert icon faile");}}}dm.close();    travelsedit.setText(travelsSpan);}}//保存按钮点击事件class saveListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stubtitle = titleedit.getText().toString();travelsdata= travelsedit.getText().toString();Log.i("log","title---->"+title);Log.i("log", "travels---->"+travelsdata);try{dm.open();if(state==1)                  dm.insert(title, travelsdata);if (state==2)Log.i("log", "ready to alter");dm.update(id2, title, travelsdata);dm.close();}catch(Exception ex){ex.printStackTrace();}Intent gobackIntent=new Intent(edittravels.this,MainActivity.class);edittravels.this.startActivity(gobackIntent);finish();}}//插入图片点击事件class insertimageListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stub//Intent getImage = new Intent(Intent.ACTION_PICK,//MediaStore.Images.Media.INTERNAL_CONTENT_URI);//startActivityForResult(getImage, SELECT_IMAGE);Intent intent=new Intent(Intent.ACTION_GET_CONTENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");intent.putExtra("return-data", true);startActivityForResult(intent, SELECT_IMAGE);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK){path=getpath(data.getData());BitmapFactory.Options options =new BitmapFactory.Options();options.inJustDecodeBounds =true;//获取这个图片的宽和高bitmap =BitmapFactory.decodeFile(path, options); //此时返回bm为空options.inJustDecodeBounds =false;                 //计算缩放比int be = (int)(options.outHeight/ (float)100);if (be <= 0)be = 1;options.inSampleSize = be;Log.i("log","be---->"+be);//重新读入图片bitmap=BitmapFactory.decodeFile(path,options);int bitmapwidth=options.outWidth;int bitmapheight=options.outHeight;//检查图片是否要翻转try {   ExifInterface exifInterface = new ExifInterface(path);   int result = exifInterface.getAttributeInt(   ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);   switch(result) {   case ExifInterface.ORIENTATION_ROTATE_90:   rotate = 90; Log.i("log", "rotate----->"+rotate);break;   case ExifInterface.ORIENTATION_ROTATE_180:   rotate = 180;   Log.i("log", "rotate----->"+rotate);break;   case ExifInterface.ORIENTATION_ROTATE_270:   rotate = 270;Log.i("log", "rotate----->"+rotate);break;   default:   break;   } }  catch (IOException e) {   e.printStackTrace();   }if (rotate!=0&&bitmap!=null){Matrix matrix=new Matrix();matrix.reset();matrix.setRotate(rotate);Bitmap bitmap1= Bitmap.createBitmap(bitmap, 0, 0, options.outWidth, options.outHeight, matrix, true);bitmap = bitmap1;rotate=0;bitmapwidth=options.outHeight;bitmapheight=options.outWidth;}Drawable drawable = new BitmapDrawable(bitmap);drawable.setBounds(0, 0,bitmapwidth*2,bitmapheight*2);String iconname = path.substring(path.lastIndexOf("/")+1);String iconimfo="["+iconname+"]";SpannableString spannable = new SpannableString(iconimfo);ImageSpan span = new ImageSpan(drawable,ImageSpan.ALIGN_BOTTOM);spannable.setSpan(span, 0,iconimfo.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);int select=travelsedit.getSelectionStart();Editable edit = travelsedit.getEditableText();edit.insert(select, spannable);try{dm.open();dm.inserticonpath(iconname, path);dm.close();}catch(Exception ex){ex.printStackTrace();}}}String getpath(Uri uri) {String[] projection = {MediaColumns.DATA};Cursor cursor = managedQuery(uri, projection, null, null, null);startManagingCursor(cursor);int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);// 记录图片的位置Log.i("log","column_index---->"+column_index);cursor.moveToFirst();return cursor.getString(column_index);}int poi = 0;@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();}public boolean onKeyDown(int KeyCode,KeyEvent event){if (KeyCode==KeyEvent.KEYCODE_BACK){Intent goBackToMainIntent=new Intent(edittravels.this,MainActivity.class);this.startActivity(goBackToMainIntent);finish();}return false;}}

布局界面

edittravels.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/background"android:orientation="vertical" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="40dip"android:orientation="horizontal" ><EditTextandroid:id="@+id/titleedit"android:layout_width="275dip"android:layout_height="47dip"android:layout_marginLeft="2dip"android:background="#00000000"android:hint="输入标题:" ></EditText><ImageButtonandroid:id="@+id/save"android:layout_width="45dip"android:layout_height="wrap_content"android:src="@drawable/saveicon" /></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"android:orientation="vertical" ><EditTextandroid:id="@+id/travelsedit"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginLeft="2dip"android:layout_weight="1"android:background="#00000000"android:gravity="top"android:hint="输入内容:" ></EditText><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="0"android:orientation="horizontal" ><ImageButtonandroid:id="@+id/insertimage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="0"android:src="@drawable/insericon" android:visibility="visible"></ImageButton></LinearLayout></LinearLayout></LinearLayout>

移动开发大作业————随手记(主界面和编辑界面)相关推荐

  1. iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面

    iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面 在1.2.2小节中提到过编辑界面(Interface builder),编辑界面是用来设计用户界面的,单击打开Main. ...

  2. web前端设计与开发大作业(三)----注册与登陆界面

    一.登陆界面 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF ...

  3. web前端设计与开发大作业(四)----主页导航界面

    导航界面 <!DOCTYPE html> <html > <head> <meta charset="utf-8" /> <t ...

  4. web前端设计与开发大作业(二)----酒店预约界面

    这是主体部分,写的比较简单 <body><div id="top"><div id="logo"><img src=& ...

  5. 移动应用技术开发大作业——Android平台个人简历

    这门水课一学期就三四节,两节Android一节ios,就要交大作业了. 出于兴趣自己开始自学,先是做了个简单的登录界面,再跟从CSDN上下载的仿知乎日报模板结合了一下. 由于要交作业,花一整天的时间完 ...

  6. 商城+前后端分离+课程设计+大作业 Springboot+vue+swagger+好看的安卓界面

    这里写目录标题 一.绪论 二.需求分析 2.2商户与顾客间通讯服务 2.3 完整的购物流程 2.4 后台管理 2.5 交流社区 2.6 附加功能 2.7 部署在云服务器上 三.总体设计 3.1系统结构 ...

  7. 安卓开发大作业_罗湖小程序开发制作价格低

    罗湖小程序开发制作价格低 深圳市驰骋网络技术有限公司 驰骋网络提供外观结构设计+软硬件+APP+云服务 一站式开发服务 小程序开始走入了人们的视线,由于其独特的便捷性,给我们的生活提供了非常大的帮助, ...

  8. php动态网站开发大作业,PHP动态网站开发项目实战

    任务1 分析网站需求1 1.1 知识准备1 1.1.1 功能结构图1 1.1.2 用例图2 1.2 任务实现5 1.2.1 花公子蜂蜜网站项目功能结构分析5 1.2.2 花公子蜂蜜网站项目用例分析6 ...

  9. 游戏开发大作业 01 游戏设计

    概念 介绍 源质迷宫的目标是运用Unity引擎制作一款解密游戏,以此来加深对Unity游戏开发的理解. 背景 游戏建立在一个由源质构成的迷宫中,迷宫中的人物可以通过法力控制源质胶囊中的源质改变迷宫结构 ...

最新文章

  1. oracle没什么没有备份,怎么恢复没有备份的Oracle数据库
  2. UPS远程监控系统的设计与实现
  3. c++ primer 5th第13章拷贝控制知识点和自编习题答案
  4. t系列服务器更换pip升级版本,Python更新pip出现错误解决方法
  5. 编译Ruby2.0 问题解决
  6. python遍历循环中的遍历结构可以是什么_(一)Python入门-4控制语句:06for循环结构-遍历各种可迭代对象-range对象...
  7. 打家劫舍(Leetcode)动态规划c语言
  8. Windows Server 2012正式版RDS系列⑻
  9. Vuex的API文档
  10. [乙女向]金色琴弦2f 安可[PSP汉化版][带完美存档+文档攻略+金手指]
  11. Q学习(Q-learning)入门小例子及python实现
  12. c语言自学 中文,C语言自学《一》 ---- 初探C语言
  13. 通过网线连接两台主机
  14. 常犇_专访丨《河神》制片人常犇:走夜路不怕黑,做好剧别怕累
  15. 西门子1513CPU冗余组态
  16. 企业微信客户端开启开发者模式
  17. arduino制作简单家庭仿真小台灯(自己设计好模型,就是一个很棒的台灯)
  18. 深度学习——注意力机制
  19. 通用模型、全新框架,WavLM语音预训练模型全解
  20. 关于WPA3-H2E的技术讲解

热门文章

  1. FCAA答题练习收集记录
  2. win10輸入法去掉语言栏?win10輸入法切换简体繁体?
  3. 店铺首页图片css,店铺装修-CSS中的背景样式
  4. 获取电脑软件的路径(C#)
  5. PKUSC 2022游记
  6. python操作实例_python_文件操作代码实例
  7. vue的methods里面的函数使用箭头函数
  8. 2022年全球与中国超级电容器市场现状及未来发展趋势
  9. 图片识别——均值哈希算法
  10. 静态网站以及动态网站