上门洗车APP --- Android客户端开发 之 项目结构介绍

来源:互联网 发布:php检测w3c 编辑:程序博客网 时间:2024/04/29 00:42
上门洗车APP --- Android客户端开发 之 项目结构介绍


前言

虽然公司项目较紧,但还是抽出时间给大家继续更新。     o_O"~ 欢迎大家的关注,很高兴和大家共同学习。前面给大家分享了项目中的以下内容:

上门洗车APP --- Android客户端开发 前言及业务简介

上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)

上门洗车APP --- Android客户端开发 之 网络框架封装介绍(二)



之前有很多朋友私信过来说想打包一份源码学习,由于本项目也是还在开发中,进度不是很快,后台那边的一系列接口需要调试,自己也是时间精力有限,还请朋友见谅。本篇博文给大家介绍项目的  整体目录结构界面开发、项目中所使用的  自定义控件技术点 等,同时也会打包一份目前最新的源码供感兴趣的朋友学习。


关于项目目录结构

首先我们来看下项目的目录结构,给大家做一些简单的介绍:


                  


由于目录过多,我们分了两张图展示,先对源码包的管理进行介绍:

org.gaochun.activity   -------> 管理Activity

org.gaochun.adapter -------> 通用万能Adapter

org.gaochun.android.http   -------> Android-Async-Http框架

org.gaochun.android.http.manager  -------> 通用数据管理(常量、URL、网络请求 等)

org.gaochun.android.http.network -------> 自定义回调接口

org.gaochun.android.http.request -------> 请求参数管理

org.gaochun.model -------> 实体Bean管理

org.gaochun.parser -------> 解析接口及抽象解析器管理

org.gaochun.parser.impl -------> 解析器管理

org.gaochun.receiver -------> 监听推送消息的Receiver

org.gaochun.ui -------> 标题栏及Application管理

org.gaochun.utils   -------> 常用工具类

org.gaochun.widget -------> 自定义控件管理(AlertDialog、圆形ImageView、带声音的Toast等)


部分技术点

有木有感觉层次还是比较清晰的呢?好了,不扯淡!给出了这些包中各自的职责后,相信朋友可以很清晰的找到对应所需要了解的类。这里大致介绍两个包中的内容,org.gaochun.adapter 和 org.gaochun.widget 其他包在之前介绍网络框架中大致有提到,看如下两个包中的内容:

            

一个是通用的Adapter和通用的ViewHolder缓存类,一个是自定义的提示框、圆形ImageView、带声音的Toast 。


有时候项目里面有好多好多ListView,记得以前一种傻逼的做法是往 adapter 包中塞各种 OrderAdapter,HistoryAdapter,...... 然后每个 adapter 都是 extends BaseAdapter,如果有一百个Adapter,我去,这他妈是个什么概念。。。。嘿嘿,后来学乖了哟。

关于通用Adapter可参考:https://github.com/JoanZapata/base-adapter-helper


CommonAdapter:

[java] view plain copy
 print?
  1. package org.gaochun.adapter;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.util.Log;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11.   
  12. /** 
  13.  * 通用 Adapter 
  14.  * <span style="line-height: 20px;">https://github.com/JoanZapata/base-adapter-helper</span> 
  15.  * @param <T> 
  16.  */  
  17. public abstract class CommonAdapter<T> extends BaseAdapter{  
  18.   
  19.     protected LayoutInflater mInflater;  
  20.     protected Context mContext;  
  21.     protected List<T> mDatas;  
  22.     protected final int mItemLayoutId;  
  23.   
  24.     /** 
  25.      * 初始化通用Adapter 
  26.      * @param context   上下文 
  27.      * @param mDatas    需要显示的数据集合 
  28.      * @param itemLayoutId  子布局文件 
  29.      */  
  30.     public CommonAdapter(Context context, List<T> mDatas, int itemLayoutId)  
  31.     {  
  32.         this.mContext = context;  
  33.         this.mInflater = LayoutInflater.from(mContext);  
  34.         this.mDatas = mDatas;  
  35.         this.mItemLayoutId = itemLayoutId;  
  36.     }  
  37.   
  38.     @Override  
  39.     public int getCount()  
  40.     {  
  41.         return mDatas.size();  
  42.     }  
  43.   
  44.     @Override  
  45.     public T getItem(int position)  
  46.     {  
  47.         return mDatas.get(position);  
  48.     }  
  49.   
  50.     @Override  
  51.     public long getItemId(int position)  
  52.     {  
  53.         return position;  
  54.     }  
  55.   
  56.     @Override  
  57.     public View getView(int position, View convertView, ViewGroup parent)  
  58.     {  
  59.         //从ViewHolder中获取控件view,若为空则创建  
  60.         final ViewHolder viewHolder = getViewHolder(position, convertView,parent);  
  61.   
  62.         Log.i("gao_chun", position+"");  
  63.         convert(viewHolder, getItem(position));  
  64.   
  65.         return viewHolder.getConvertView();  
  66.   
  67.   
  68.     }  
  69.   
  70.     /** 
  71.      * 抽取出getView中间改变的部分 
  72.      * @param helper    holder缓存对象 
  73.      * @param item      Bean对象 
  74.      */  
  75.     public abstract void convert(ViewHolder helper, T item);  
  76.   
  77.   
  78.     /** 
  79.      * 获得ViewHolder中的view 
  80.      * @param position 
  81.      * @param convertView 
  82.      * @param parent 
  83.      * @return 
  84.      */  
  85.     private ViewHolder getViewHolder(int position, View convertView,ViewGroup parent)  
  86.     {  
  87.         return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,position);  
  88.     }  
  89.   
  90. }  

ViewHolder:

[java] view plain copy
 print?
  1. package org.gaochun.adapter;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.util.SparseArray;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.ImageView;  
  10. import android.widget.TextView;  
  11.   
  12. import com.nostra13.universalimageloader.core.ImageLoader;  
  13.   
  14.   
  15. /** 
  16.  * 通用 ViewHolder 缓存类 
  17.  * @author gao_chun 
  18.  * 
  19.  */  
  20. public class ViewHolder{  
  21.   
  22.     private ImageLoader imageLoader = ImageLoader.getInstance();  
  23.   
  24.     private final SparseArray<View> mViews;  
  25.     private int mPosition;  
  26.     private View mConvertView;  
  27.   
  28.     private ViewHolder(Context context, ViewGroup parent, int layoutId,int position)  
  29.     {  
  30.         this.mPosition = position;  
  31.         this.mViews = new SparseArray<View>();  
  32.         mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,false);  
  33.         mConvertView.setTag(this);   // setTag  
  34.     }  
  35.   
  36.     /** 
  37.      * 拿到一个ViewHolder对象 
  38.      * 
  39.      * @param context 
  40.      * @param convertView 
  41.      * @param parent 
  42.      * @param layoutId 
  43.      * @param position 
  44.      * @return 
  45.      */  
  46.     public static ViewHolder get(Context context, View convertView,ViewGroup parent, int layoutId, int position)  
  47.     {  
  48.         if (convertView == null){  
  49.             //创建ViewHolder对象 ,并做View缓存  
  50.             return new ViewHolder(context, parent, layoutId, position);  
  51.         }  
  52.         return (ViewHolder)convertView.getTag();  
  53.     }  
  54.   
  55.     public View getConvertView()  
  56.     {  
  57.         return mConvertView;  
  58.     }  
  59.   
  60.   
  61.     /** 
  62.      * 通过控件的Id获取对于的控件,如果没有则加入views 
  63.      * 
  64.      * @param viewId 
  65.      * @return 
  66.      */  
  67.     public <T extends View> T getView(int viewId){  
  68.   
  69.         View view = mViews.get(viewId);  
  70.         if (view == null){  
  71.             view = mConvertView.findViewById(viewId);  
  72.             mViews.put(viewId, view);  
  73.         }  
  74.         return (T)view;  
  75.     }  
  76.   
  77.   
  78.     /** 
  79.      * 为TextView设置字符串 
  80.      * 
  81.      * @param viewId 
  82.      * @param text 
  83.      * @return 
  84.      */  
  85.     public ViewHolder setText(int viewId, String text)  
  86.     {  
  87.         TextView view = getView(viewId);  
  88.         view.setText(text);  
  89.         return this;  
  90.     }  
  91.   
  92.   
  93.     /** 
  94.      * 为ImageView设置图片 
  95.      *  setImageResource 
  96.      * @param viewId 
  97.      * @param drawableId 
  98.      * @return 
  99.      */  
  100.     public ViewHolder setImageResource(int viewId, int drawableId)  
  101.     {  
  102.         ImageView view = getView(viewId);  
  103.         view.setImageResource(drawableId);  
  104.         return this;  
  105.     }  
  106.   
  107.     /** 
  108.      * 为ImageView设置图片 
  109.      *  setImageBitmap 
  110.      * @param viewId 
  111.      * @param drawableId 
  112.      * @return 
  113.      */  
  114.     public ViewHolder setImageBitmap(int viewId, Bitmap bm)  
  115.     {  
  116.         ImageView view = getView(viewId);  
  117.         view.setImageBitmap(bm);  
  118.         return this;  
  119.     }  
  120.   
  121.     /** 
  122.      * 为ImageView设置图片 
  123.      *  setImageByUrl 
  124.      * @param viewId 
  125.      * @param drawableId 
  126.      * @return 
  127.      */  
  128.    /* public ViewHolder setImageByUrl(int viewId, String url) 
  129.     { 
  130.         ImageLoader.getInstance(3, Type.LIFO).loadImage(url,(ImageView) getView(viewId)); 
  131.         return this; 
  132.     }*/  
  133.   
  134.     public ViewHolder setImageByUrl(int viewId, String url){  
  135.         imageLoader.displayImage(url,(ImageView)getView(viewId));  
  136.         return this;  
  137.     }  
  138.   
  139.     public int getPosition(){  
  140.   
  141.         return mPosition;  
  142.     }  
  143.   
  144. }  

这里还要给大家推荐一个技巧:ListView中按钮监听器 设置 及 优化,有个需要注意的地方是 setTag 可以记录信息。


下面是实现带声音的Toast控件类源码,大家可以下载源码了解学习:

[java] view plain copy
 print?
  1. package org.gaochun.widget;  
  2.   
  3. import com.washcar.R;  
  4.   
  5. import android.content.Context;  
  6. import android.media.MediaPlayer;  
  7. import android.util.DisplayMetrics;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.widget.TextView;  
  11. import android.widget.Toast;  
  12.   
  13. /** 
  14.  * 自定义声音提示 Toast控件 
  15.  * @version 0.1 
  16.  * @created gao_chun 
  17.  */  
  18. public class SoundToast extends Toast{  
  19.   
  20.     private MediaPlayer mPlayer;  
  21.     private boolean isSound;  
  22.   
  23.     public SoundToast(Context context){  
  24.   
  25.         this(context, false);  
  26.     }  
  27.   
  28.     public SoundToast(Context context, boolean isSound){  
  29.         super(context);  
  30.   
  31.         this.isSound = isSound;  
  32.   
  33.         mPlayer = MediaPlayer.create(context, R.raw.newdatatoast);  
  34.         mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){  
  35.             @Override  
  36.             public void onCompletion(MediaPlayer mp){  
  37.                 mp.release();   //释放资源  
  38.             }  
  39.         });  
  40.     }  
  41.   
  42.     @Override  
  43.     public void show()  
  44.     {  
  45.         super.show();  
  46.         if (isSound){  
  47.             mPlayer.start();  
  48.         }  
  49.     }  
  50.   
  51.   
  52.     /** 
  53.      * 获取控件实例 
  54.      * 
  55.      * @param context 
  56.      * @param text  提示消息 
  57.      * @param isSound   是否播放声音 
  58.      * @param duration  时长 
  59.      * @return 
  60.      */  
  61.     public static SoundToast show(Context context, CharSequence text, boolean isSound, int duration){  
  62.   
  63.         SoundToast result = new SoundToast(context, isSound);  
  64.         LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  65.         DisplayMetrics dm = context.getResources().getDisplayMetrics();  
  66.         View v = inflate.inflate(R.layout.layout_toast, null);  //加载Toast布局  
  67.         v.setMinimumWidth(dm.widthPixels);  //设置控件最小宽度为手机屏幕宽度  
  68.         TextView tv = (TextView) v.findViewById(R.id.tv_lable);  
  69.         tv.setText(text);  
  70.         result.setView(v);  
  71.         result.setDuration(duration);// 设置 显示多长时间;  
  72.         //result.setGravity(Gravity.CENTER,0,0);  
  73.         return result;  
  74.     }  
  75.   
  76. }  

注:语音提示播报功能已经实现,在接收到服务器推送的订单后自动播报。由于目前方便测试,在首页点击 订单中 按钮便可看到效果。部分自定义控件这里也不过多的介绍了,感兴趣的童鞋可以下载了研究研究,没准以后在自己项目中就用到了。关于语音播报,在讯飞平台注册了ID,之前简单介绍过一些用法:Android语音播报、后台播报、语音识别 ,大家可以参考下。


关于界面

关于res目录下的界面,想了想,貌似也没有什么好说的了,只需要掌握一些常用的布局技巧,熟练使用Android中的布局属性,基本上简单的界面没有什么太大的问题。由于使用了 dimens 做适配,只需要将使用dp的地方,换成如:android:padding="@dimen/dimen_20_dip" 就可以了,如登录界面:



[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="@color/background" >  
  6.   
  7.     <LinearLayout  
  8.         android:id="@+id/layout_table"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_marginTop="@dimen/dimen_30_dip"  
  12.         android:orientation="vertical" >  
  13.   
  14.         <include layout="@layout/layout_line_horizonal" />  
  15.   
  16.         <EditText  
  17.             android:id="@+id/edit_username"  
  18.             style="@style/text_16"  
  19.             android:layout_width="match_parent"  
  20.             android:layout_height="@dimen/dimen_75_dip"  
  21.             android:background="@color/white"  
  22.             android:hint="@string/text_hint_username"  
  23.             android:inputType="phone"  
  24.             android:maxLength="11"  
  25.             android:padding="@dimen/dimen_20_dip"  
  26.             android:textColorHint="@color/text_hint_color" />  
  27.   
  28.         <EditText  
  29.             android:id="@+id/edit_password"  
  30.             style="@style/text_16"  
  31.             android:layout_width="match_parent"  
  32.             android:layout_height="@dimen/dimen_75_dip"  
  33.             android:layout_marginTop="@dimen/row_margin"  
  34.             android:background="@color/white"  
  35.             android:hint="@string/text_hint_password"  
  36.             android:inputType="textPassword"  
  37.             android:padding="@dimen/dimen_20_dip"  
  38.             android:textColorHint="@color/text_hint_color" />  
  39.   
  40.         <include layout="@layout/layout_line_horizonal" />  
  41.     </LinearLayout>  
  42.   
  43.     <Button  
  44.         android:id="@+id/button_login"  
  45.         style="@style/text_white_18"  
  46.         android:layout_width="match_parent"  
  47.         android:layout_height="@dimen/dimen_60_dip"  
  48.         android:layout_below="@+id/layout_table"  
  49.         android:layout_marginTop="@dimen/dimen_65_dip"  
  50.         android:background="@drawable/button_selector"  
  51.         android:gravity="center"  
  52.         android:onClick="onClick"  
  53.         android:text="@string/text_login" />  
  54.   
  55. </RelativeLayout>  


个人中心界面:



[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="@color/background" >  
  6.   
  7.     <RelativeLayout  
  8.         android:id="@+id/layout_top"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:background="@color/white" >  
  12.   
  13.         <RelativeLayout  
  14.             android:id="@+id/layout_table"  
  15.             android:layout_width="match_parent"  
  16.             android:layout_height="wrap_content"  
  17.             android:background="@drawable/person_bg"  
  18.             android:padding="@dimen/dimen_20_dip" >  
  19.   
  20.             <org.gaochun.widget.RoundImageView  
  21.                 android:id="@+id/iv_avatar"  
  22.                 android:layout_width="@dimen/dimen_135_dip"  
  23.                 android:layout_height="@dimen/dimen_135_dip"  
  24.                 android:layout_marginLeft="@dimen/dimen_20_dip"  
  25.                 android:layout_marginRight="@dimen/dimen_10_dip"  
  26.                 android:scaleType="centerCrop"  
  27.                 android:src="@drawable/gao_chun" />  
  28.   
  29.             <TextView  
  30.                 android:id="@+id/tv_user_name"  
  31.                 style="@style/text_white_16"  
  32.                 android:layout_width="wrap_content"  
  33.                 android:layout_height="wrap_content"  
  34.                 android:layout_marginLeft="@dimen/dimen_60_dip"  
  35.                 android:layout_marginTop="@dimen/dimen_30_dip"  
  36.                 android:layout_toRightOf="@+id/iv_avatar"  
  37.                 android:text="gao_chun"  
  38.                 android:textStyle="bold" />  
  39.   
  40.             <TextView  
  41.                 android:id="@+id/tv_user_money"  
  42.                 style="@style/text_white_16"  
  43.                 android:layout_width="wrap_content"  
  44.                 android:layout_height="wrap_content"  
  45.                 android:layout_below="@+id/tv_user_name"  
  46.                 android:layout_marginLeft="@dimen/dimen_45_dip"  
  47.                 android:layout_marginTop="@dimen/dimen_20_dip"  
  48.                 android:layout_toRightOf="@+id/iv_avatar"  
  49.                 android:text="余额:12345"  
  50.                 android:textStyle="bold" />  
  51.         </RelativeLayout>  
  52.   
  53.         <LinearLayout  
  54.             android:layout_width="match_parent"  
  55.             android:layout_height="wrap_content"  
  56.             android:layout_below="@+id/layout_table"  
  57.             android:orientation="horizontal"  
  58.             android:padding="@dimen/dimen_20_dip" >  
  59.   
  60.             <TextView  
  61.                 style="@style/text_16"  
  62.                 android:layout_width="wrap_content"  
  63.                 android:layout_height="wrap_content"  
  64.                 android:layout_marginLeft="@dimen/dimen_25_dip"  
  65.                 android:layout_weight="1"  
  66.                 android:text="优评:2" />  
  67.   
  68.             <View  
  69.                 android:layout_width="1px"  
  70.                 android:layout_height="match_parent"  
  71.                 android:layout_marginRight="@dimen/dimen_40_dip"  
  72.                 android:background="@color/line_gray" />  
  73.   
  74.             <TextView  
  75.                 style="@style/text_16"  
  76.                 android:layout_width="wrap_content"  
  77.                 android:layout_height="wrap_content"  
  78.                 android:layout_weight="1"  
  79.                 android:text="中评:4" />  
  80.   
  81.             <View  
  82.                 android:layout_width="1px"  
  83.                 android:layout_height="match_parent"  
  84.                 android:layout_marginRight="@dimen/dimen_40_dip"  
  85.                 android:background="@color/line_gray" />  
  86.   
  87.             <TextView  
  88.                 style="@style/text_16"  
  89.                 android:layout_width="wrap_content"  
  90.                 android:layout_height="wrap_content"  
  91.                 android:layout_weight="1"  
  92.                 android:text="差评:0" />  
  93.         </LinearLayout>  
  94.     </RelativeLayout>  
  95.   
  96.     <LinearLayout  
  97.         android:layout_width="match_parent"  
  98.         android:layout_height="wrap_content"  
  99.         android:layout_below="@+id/layout_top"  
  100.         android:layout_marginTop="@dimen/dimen_30_dip"  
  101.         android:orientation="vertical" >  
  102.   
  103.         <View  
  104.             android:layout_width="match_parent"  
  105.             android:layout_height="1px"  
  106.             android:background="@color/line_gray" />  
  107.   
  108.         <TextView  
  109.             android:id="@+id/tv_my_order"  
  110.             style="@style/text_black_16"  
  111.             android:layout_width="match_parent"  
  112.             android:layout_height="@dimen/dimen_75_dip"  
  113.             android:background="@drawable/row_selector"  
  114.             android:clickable="true"  
  115.             android:drawableLeft="@drawable/person_order"  
  116.             android:drawablePadding="@dimen/dimen_40_dip"  
  117.             android:gravity="center_vertical"  
  118.             android:onClick="onClick"  
  119.             android:padding="@dimen/dimen_25_dip"  
  120.             android:text="@string/text_my_order" />  
  121.   
  122.         <TextView  
  123.             android:id="@+id/tv_my_vip"  
  124.             style="@style/text_black_16"  
  125.             android:layout_width="match_parent"  
  126.             android:layout_height="@dimen/dimen_75_dip"  
  127.             android:layout_marginTop="@dimen/row_margin"  
  128.             android:background="@drawable/row_selector"  
  129.             android:clickable="true"  
  130.             android:drawableLeft="@drawable/person_vip"  
  131.             android:drawablePadding="@dimen/dimen_40_dip"  
  132.             android:gravity="center_vertical"  
  133.             android:onClick="onClick"  
  134.             android:padding="@dimen/dimen_25_dip"  
  135.             android:text="@string/text_my_vip" />  
  136.   
  137.         <TextView  
  138.             android:id="@+id/tv_my_notify"  
  139.             style="@style/text_black_16"  
  140.             android:layout_width="match_parent"  
  141.             android:layout_height="@dimen/dimen_75_dip"  
  142.             android:layout_marginTop="@dimen/row_margin"  
  143.             android:background="@drawable/row_selector"  
  144.             android:clickable="true"  
  145.             android:drawableLeft="@drawable/person_inform"  
  146.             android:drawablePadding="@dimen/dimen_40_dip"  
  147.             android:gravity="center_vertical"  
  148.             android:onClick="onClick"  
  149.             android:padding="@dimen/dimen_25_dip"  
  150.             android:text="@string/text_my_information" />  
  151.   
  152.         <TextView  
  153.             android:id="@+id/tv_my_more"  
  154.             style="@style/text_black_16"  
  155.             android:layout_width="match_parent"  
  156.             android:layout_height="@dimen/dimen_75_dip"  
  157.             android:layout_marginTop="@dimen/row_margin"  
  158.             android:background="@drawable/row_selector"  
  159.             android:clickable="true"  
  160.             android:drawableLeft="@drawable/person_more"  
  161.             android:drawablePadding="@dimen/dimen_40_dip"  
  162.             android:gravity="center_vertical"  
  163.             android:onClick="onClick"  
  164.             android:padding="@dimen/dimen_25_dip"  
  165.             android:text="@string/text_more" />  
  166.   
  167.         <include layout="@layout/layout_line_horizonal" />  
  168.     </LinearLayout>  
  169.   
  170.     <Button  
  171.         android:id="@+id/button_submit"  
  172.         style="@style/text_white_18"  
  173.         android:layout_width="match_parent"  
  174.         android:layout_height="@dimen/dimen_65_dip"  
  175.         android:layout_alignParentBottom="true"  
  176.         android:layout_marginBottom="@dimen/dimen_40_dip"  
  177.         android:background="@drawable/button_selector"  
  178.         android:gravity="center"  
  179.         android:onClick="onClick"  
  180.         android:text="@string/text_exit" />  
  181.   
  182. </RelativeLayout>  

关于其他技术点,日后总结了看有没有必要给大家再介绍下,先就到这里吧!


源码下载:http://download.csdn.net/download/gao_chun/8861137


【注:转载注明gao_chun的BLOG http://blog.csdn.net/gao_chun/article/details/46711649


0 0
原创粉丝点击