利用listview 进行图片三级缓存

需要导入一个implementation 'com.jakewharton:disklrucache:2.0.2' 


package jiyun.com.demodisklrucache2.adapter;



import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;


import com.jakewharton.disklrucache.DiskLruCache;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;


import jiyun.com.demodisklrucache2.R;
import jiyun.com.demodisklrucache2.beans.InteractiveBean;


public class MyAdapter extends BaseAdapter {
    private Context mContext;
    private List<InteractiveBean> mList;
    private LruCache lruCache;
    private DiskLruCache diskLruCache;
    private int sizeOf = 0;


    public MyAdapter(Context mContext, List<InteractiveBean> mList) {
        this.mContext = mContext;
        this.mList = mList;
        sizeOf = (int) ((Runtime.getRuntime().maxMemory() / 1024) / 8);
        lruCache = new LruCache<String, Bitmap>(sizeOf) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount() / 1024;
            }
        };
        File photo = getDiskCacheDir(mContext, "photo");
        if (!photo.exists()) {
            photo.mkdirs();
        }
        try {
            diskLruCache = DiskLruCache.open(photo, getAppVersion(mContext), 1, 10 * 1024 * 1024);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @Override
    public int getCount() {
        return mList.size();
    }


    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }


    @Override
    public long getItemId(int position) {
        return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.list_view, null);
            holder.mText = convertView.findViewById(R.id.tv_title);
            holder.mImageView = convertView.findViewById(R.id.image_first);
            convertView.setTag(holder);
//            convertView.setTag(position);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.mText.setText(mList.get(position).getTitle());
        //设置图片为不可见状态
        holder.mImageView.setImageResource(R.mipmap.ic_launcher);
        holder.mImageView.setVisibility(View.INVISIBLE);
        //防止错位
        holder.mImageView.setTag(mList.get(position));
        LoadImage loadImage = new LoadImage(holder);
        loadImage.execute(mList.get(position).getImage());
        holder.mImageView.setTag(mList.get(position).getImage());
        //holder.c.setTag(position);
        return convertView;
    }


    class LoadImage extends AsyncTask<String, Integer, Bitmap> {
        Bitmap bitmap = null;
        InputStream is = null;
        String url = null;
        ViewHolder holder = null;
        DiskLruCache.Snapshot snapshot = null;
        FileInputStream fileInputStream = null;
        FileDescriptor fileDescriptor = null;
        BufferedInputStream in = null;
        BufferedOutputStream out = null;
        public LoadImage(ViewHolder holder) {
            this.holder = holder;
        }
        @Override
        protected Bitmap doInBackground(String... strings) {
            try {
                url = strings[0];
                Bitmap cachebitmap = getBitmapFromCache(url);
                //先从缓存中取,如果缓存不为空,则返回图片
                if (cachebitmap != null) {
                    Log.e(url, "存在于内存中,直接返回");
                    return cachebitmap;
                } else {


                    //如果内存缓存中取不到,再尝试从硬盘中取
                    Log.e(url, "内存中不存在,从硬盘缓存中找");
                    snapshot = diskLruCache.get(hashKeyForDisk(url));
                    //如果snapshot为空,则从网络下载图片
                    if (snapshot == null) {
                        Log.e(url, "硬盘中没有,从网络下载");
                        URL url_image = new URL(url);
                        HttpURLConnection conn = (HttpURLConnection) url_image.openConnection();
                        conn.setDoInput(true);
                        conn.connect();
                        //利用editor将图片写入硬盘缓存
                        is = conn.getInputStream();
                        in = new BufferedInputStream(is, 8 * 1024);
                        DiskLruCache.Editor editor = diskLruCache.edit(hashKeyForDisk(url));
                        OutputStream outputStream = editor.newOutputStream(0);
                        out = new BufferedOutputStream(outputStream, 8 * 1024);
                        int b;
                        while ((b = in.read()) != -1) {
                            out.write(b);
                        }
                        editor.commit();
                        diskLruCache.flush();
                        conn.disconnect();
                        out.close();
                        in.close();
                    }
                    //再次查找对应缓存
                    snapshot = diskLruCache.get(hashKeyForDisk(url));
                    //将bitmap写入内存缓存
                    fileInputStream = (FileInputStream) snapshot.getInputStream(0);
                    fileDescriptor = fileInputStream.getFD();
                    //如果fileDescriptor不为空,开始解析bitmap,加入到内存缓存中,并返回图片
                    if (fileDescriptor != null) {
                        Bitmap diskcachebitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
                        if (diskcachebitmap == null) {
                            return null;
                        } else {
                            Log.e(url, "重新加入到内存缓存中");
                            addBitmapToCache(url, diskcachebitmap);
                            return diskcachebitmap;
                        }
                    }
                    return bitmap;


                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }


        @Override
        protected void onPostExecute(Bitmap bitmap) {
            ImageView mImageView = holder.mImageView;
            if (mImageView.getTag().equals(url)) {
                mImageView.setVisibility(View.VISIBLE);
                mImageView.setImageBitmap(bitmap);
            }
            super.onPostExecute(bitmap);
        }
    }


    public class ViewHolder {
        private TextView mText;
        private ImageView mImageView;
    }


    //这是获取文件写在哪里的方法
    public File getDiskCacheDir(Context context, String uniqueName) {
        String cachePath;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) {
            cachePath = context.getExternalCacheDir().getPath();
        } else {
            cachePath = context.getCacheDir().getPath();
        }
        return new File(cachePath + File.separator + uniqueName);
    }


    //这是获取应用版本号的方法
    public int getAppVersion(Context context) {
        try {
            PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return info.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return 1;
    }


    //将url进行MD5编写
    public String hashKeyForDisk(String key) {
        String cacheKey;
        try {
            //信息摘要算法提供类
            final MessageDigest mDigest = MessageDigest.getInstance("MD5");
            mDigest.update(key.getBytes());
            cacheKey = bytesToHexString(mDigest.digest());
        } catch (NoSuchAlgorithmException e) {
            cacheKey = String.valueOf(key.hashCode());
        }
        return cacheKey;
    }


    private String bytesToHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            //十六进制转换
            String hex = Integer.toHexString(0xFF & bytes[i]);
            if (hex.length() == 1) {
                sb.append('0');
            }
            sb.append(hex);
        }
        return sb.toString();
    }


    public void addBitmapToCache(String key, Bitmap bitmap) {
        if (getBitmapFromCache(key) == null) {
            if (bitmap == null) {
                return;
            } else {
                lruCache.put(key, bitmap);
            }
        }


    }


    public Bitmap getBitmapFromCache(String key) {


        return (Bitmap) lruCache.get(key);
    }
}
/*//上下文对象
    private Context mContext;
    //存放bean对象的列表
    private List<String> mList;
    //生成随机高度的Random
    private Random rand;
    //图片缓存容量的上限
    private int SizeofCache = 0;
    //LruCache实例
    private LruCache lruCache;
    //DiskLruCache的实例
    private DiskLruCache diskLruCache;
    public MyAdapter(Context mContext, List<String> mList) {
        this.mContext = mContext;
        this.mList = mList;
        rand = new Random();
        SizeofCache = (int) ((Runtime.getRuntime().maxMemory() / 1024) / 8);
        lruCache = new LruCache<String, Bitmap>(SizeofCache) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount() / 1024;
            }
        };
        File photo = getDiskCacheDir(mContext, "photo");
        if (!photo.exists()) {
            photo.mkdirs();
        }
        try {
            diskLruCache = DiskLruCache.open(photo, getAppVersion(mContext), 1, 10 * 1024 * 1024);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @NonNull
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.recyler_view, parent, false);
        ViewHolder holder = new ViewHolder(view);
        view.setOnClickListener(this);
        return holder;
    }


    @Override
    public void onBindViewHolder(@NonNull MyAdapter.ViewHolder holder, int position) {
        ViewGroup.LayoutParams layoutParams = holder.mIagme.getLayoutParams();
        layoutParams.height = rand.nextInt(100) + 200;
        holder.mIagme.setLayoutParams(layoutParams);
        //设置一个错误的图片
        //设置图片为不可见状态
        holder.mIagme.setImageResource(R.mipmap.ic_launcher);
        holder.mIagme.setVisibility(View.INVISIBLE);
        //防止错位
        holder.mIagme.setTag(mList.get(position));
        LoadImage loadImage = new LoadImage(holder);
        loadImage.execute(mList.get(position));
        holder.mIagme.setTag(mList.get(position));
        holder.itemView.setTag(position);
    }


    @Override
    public int getItemCount() {
        return mList.size();
    }






    public class ViewHolder extends RecyclerView.ViewHolder {
        private ImageView mIagme;


        public ViewHolder(View itemView) {
            super(itemView);
            mIagme = itemView.findViewById(R.id.image_view);
        }
    }


    *//**
 * 下载图片的异步任务类
 * <p>
 * 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 *
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return 根据传入的uniqueName获取硬盘缓存的路径地址。
 * <p>
 * 获取当前应用程序的版本号。
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 * <p>
 * 将URL进行MD5编码,防止特殊字符出现
 * @param key
 * @return
 *//*
    class LoadImage extends AsyncTask<String, Integer, Bitmap> {
        Bitmap bitmap = null;
        InputStream is = null;
        String url = null;
        ViewHolder holder = null;


        DiskLruCache.Snapshot snapshot = null;
        FileInputStream fileInputStream = null;
        FileDescriptor fileDescriptor = null;
        BufferedInputStream in = null;
        BufferedOutputStream out = null;


        public LoadImage(ViewHolder holder) {
            this.holder = holder;
        }


        @Override
        protected Bitmap doInBackground(String... strings) {
            try {
                url = strings[0];
                Bitmap cachebitmap = getBitmapFromCache(url);
                //先从缓存中取,如果缓存不为空,则返回图片
                if (cachebitmap != null) {
                    Log.e(url, "存在于内存中,直接返回");
                    return cachebitmap;
                } else {


                    //如果内存缓存中取不到,再尝试从硬盘中取
                    Log.e(url, "内存中不存在,从硬盘缓存中找");
                    snapshot = diskLruCache.get(hashKeyForDisk(url));
                    //如果snapshot为空,则从网络下载图片
                    if (snapshot == null) {
                        Log.e(url, "硬盘中没有,从网络下载");
                        URL url_image = new URL(url);
                        HttpURLConnection conn = (HttpURLConnection) url_image.openConnection();
                        conn.setDoInput(true);
                        conn.connect();
                        //利用editor将图片写入硬盘缓存
                        is = conn.getInputStream();
                        in = new BufferedInputStream(is, 8 * 1024);
                        DiskLruCache.Editor editor = diskLruCache.edit(hashKeyForDisk(url));
                        OutputStream outputStream = editor.newOutputStream(0);
                        out = new BufferedOutputStream(outputStream, 8 * 1024);
                        int b;
                        while ((b = in.read()) != -1) {
                            out.write(b);
                        }
                        editor.commit();
                        diskLruCache.flush();
                        conn.disconnect();
                        out.close();
                        in.close();
                    }
                    //再次查找对应缓存
                    snapshot = diskLruCache.get(hashKeyForDisk(url));
                    //将bitmap写入内存缓存
                    fileInputStream = (FileInputStream) snapshot.getInputStream(0);
                    fileDescriptor = fileInputStream.getFD();
                    //如果fileDescriptor不为空,开始解析bitmap,加入到内存缓存中,并返回图片
                    if (fileDescriptor != null) {
                        Bitmap diskcachebitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
                        if (diskcachebitmap == null) {
                            return null;
                        } else {
                            Log.e(url, "重新加入到内存缓存中");
                            addBitmapToCache(url, diskcachebitmap);
                            return diskcachebitmap;
                        }


                    }
                    return bitmap;


                }




            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }


        @Override
        protected void onPostExecute(Bitmap bitmap) {


            ImageView image = holder.mIagme;
            if (image.getTag().equals(url)) {
                image.setVisibility(View.VISIBLE);
                image.setImageBitmap(bitmap);
            }


            super.onPostExecute(bitmap);


        }
    }


    *//**
 * 根据传入的uniqueName获取硬盘缓存的路径地址。
 *//*
    public File getDiskCacheDir(Context context, String uniqueName) {
        String cachePath;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) {
            cachePath = context.getExternalCacheDir().getPath();
        } else {
            cachePath = context.getCacheDir().getPath();
        }
        return new File(cachePath + File.separator + uniqueName);
    }


    *//**
 * 获取当前应用程序的版本号。
 *//*
    public int getAppVersion(Context context) {
        try {
            PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return info.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return 1;
    }


    *//**
 * @param key    传入图片的key值,一般用图片url代替
 * @param bitmap 要缓存的图片对象
 *//*
    public void addBitmapToCache(String key, Bitmap bitmap) {
        if (getBitmapFromCache(key) == null) {
            if (bitmap == null) {
                return;
            } else {
                lruCache.put(key, bitmap);
            }
        }


    }


    *//**
 * @param key 要取出的bitmap的key值
 * @return 返回取出的bitmap
 *//*
    public Bitmap getBitmapFromCache(String key) {


        return (Bitmap) lruCache.get(key);
    }


    *//**
 * 将URL进行MD5编码,防止特殊字符出现
 *
 * @param key
 * @return
 *//*
    public String hashKeyForDisk(String key) {
        String cacheKey;
        try {
            //信息摘要算法提供类
            final MessageDigest mDigest = MessageDigest.getInstance("MD5");
            mDigest.update(key.getBytes());
            cacheKey = bytesToHexString(mDigest.digest());
        } catch (NoSuchAlgorithmException e) {
            cacheKey = String.valueOf(key.hashCode());
        }
        return cacheKey;
    }


    private String bytesToHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            //十六进制转换
            String hex = Integer.toHexString(0xFF & bytes[i]);
            if (hex.length() == 1) {
                sb.append('0');
            }
            sb.append(hex);
        }
        return sb.toString();
    }
    private onClickItem onClickItem;
    public interface onClickItem{
        void setOnClickItem(View view,int position);
    }
    @Override
    public void onClick(View v) {
        if (onClickItem != null){
            onClickItem.setOnClickItem(v,(int)v.getTag());
        }
    }
    public void setOnItemClickLister(onClickItem item){
        this.onClickItem = item;
    }*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信小程序的家政服务预约系统采用PHP语言和微信小程序技术,数据库采用Mysql,运行软件为微信开发者工具。本系统实现了管理员和客户、员工三个角色的功能。管理员的功能为客户管理、员工管理、家政服务管理、服务预约管理、员工风采管理、客户需求管理、接单管理等。客户的功能为查看家政服务进行预约和发布自己的需求以及管理预约信息和接单信息等。员工可以查看预约信息和进行接单。本系统实现了网上预约家政服务的流程化管理,可以帮助工作人员的管理工作和帮助客户查询家政服务的相关信息,改变了客户找家政服务的方式,提高了预约家政服务的效率。 本系统是针对网上预约家政服务开发的工作管理系统,包括到所有的工作内容。可以使网上预约家政服务的工作合理化和流程化。本系统包括手机端设计和电脑端设计,有界面和数据库。本系统的使用角色分为管理员和客户、员工三个身份。管理员可以管理系统里的所有信息。员工可以发布服务信息和查询客户的需求进行接单。客户可以发布需求和预约家政服务以及管理预约信息、接单信息。 本功能可以实现家政服务信息的查询和删除,管理员添加家政服务信息功能填写正确的信息就可以实现家政服务信息的添加,点击家政服务信息管理功能可以看到基于微信小程序的家政服务预约系统里所有家政服务的信息,在添加家政服务信息的界面里需要填写标题信息,当信息填写不正确就会造成家政服务信息添加失败。员工风采信息可以使客户更好的了解员工。员工风采信息管理的流程为,管理员点击员工风采信息管理功能,查看员工风采信息,点击员工风采信息添加功能,输入员工风采信息然后点击提交按钮就可以完成员工风采信息的添加。客户需求信息关系着客户的家政服务预约,管理员可以查询和修改客户需求信息,还可以查看客户需求的添加时间。接单信息属于本系统里的核心数据,管理员可以对接单的信息进行查询。本功能设计的目的可以使家政服务进行及时的安排。管理员可以查询员工信息,可以进行修改删除。 客户可以查看自己的预约和修改自己的资料并发布需求以及管理接单信息等。 在首页里可以看到管理员添加和管理的信息,客户可以在首页里进行家政服务的预约和公司介绍信息的了解。 员工可以查询客户需求进行接单以及管理家政服务信息和留言信息、收藏信息等。
数字社区解决方案是一套综合性的系统,旨在通过新基建实现社区的数字化转型,打通智慧城市建设的"最后一公里"。该方案以国家政策为背景,响应了国务院、公安部和中央政法会议的号召,强调了社会治安防控体系的建设以及社区治理创新的重要性。 该方案的建设标准由中央综治办牵头,采用"9+X"模式,通过信息采集、案(事)件流转等手段,实现五级信息中心的互联互通,提升综治工作的可预见性、精确性和高效性。然而,当前社区面临信息化管理手段不足、安全隐患、人员动向难以掌握和数据资源融合难等问题。 为了解决这些问题,数字社区建设目标提出了"通-治-服"的治理理念,通过街道社区、区政府、公安部门和居民的共同努力,实现社区的平安、幸福和便捷。建设思路围绕"3+N"模式,即人工智能、物联网和数据资源,结合态势感知、业务分析和指挥调度,构建起一个全面的数据支持系统。 数字社区的治理体系通过"一张图"实现社区内各维度的综合态势可视化,"一套表"进行业务分析,"一张网"完成指挥调度。这些工具共同提升了社区治理的智能化和效率。同时,数字社区还提供了包括智慧通行、智慧环保、居家养老和便民服务等在内的多样化数字服务,旨在提升居民的生活质量。 在硬件方面,数字社区拥有IOT物联网边缘网关盒子和AI边缘分析盒子,这些设备能够快速集成老旧小区的物联设备,实现传统摄像设备的智能化改造。平台优势体现在数字化能力中台和多样化的应用,支持云、边、端的协同工作,实现模块化集成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值