基于android的移动终端在线学习(Android studio毕业设计,Android课程设计)

 博主介绍:本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮助到您;

🍅文章末尾获取源码下载方式🍅

功能演示:

一、项目介绍

后台:

管理员:登陆注册,用户(教师和学生)管理,课程管理,班级管理,题库管理。管理员可以对课程,用户信息,题库 ,班级进行增删改查

教师:登陆注册,课程资源管理,班级学生管理,,发布测试,师生互动,老师可以对学生信息,课程,题库进行增删改查

客户端:

教师可以登陆注册查看自己上传的,课程,学生学习的数据,修改个人信息,修改密码,搜索。

学生:登陆注册,登记个人信息,自主学习课程资源,,在线测试,,师生在线交流,修改个人信息,修改个人信息,搜索修改密码

APP端,后台可以登陆注册修改密码”

二、运行环境

1:客户端使用Android stuido进行开发;
2:服务端后台使用Myeclipse2014进行开发;
3:mysql数据库进行数据存储;
4:需要jdk1.7以上
5:使用雷电模拟器或者Androidstuio自带的模拟器进行运行

三、使用技术

总体设计逻辑和思路:
1:先设计数据库表文件
2:写服务端jsp页面以及写api接口给客户端提供数据
3:完成后台服务端的数据交互,也就是jsp页面数据的存储和显示
4:进行客户端页面的开发;
5:进行客户端对api接口的调用,也就是获取数据库的数据以及在客户端进行显示

移动端:
1:使用android原生控件以及xml布局文件来完成界面的显示
2:使用java代码完成功能的数据和逻辑交互
3:使用http网络请求完成数据的请求;
4:使用json数据解析完成客户端数据的回调和显示

服务端后台:
1:使用mysql完成数据的存储
2:使用jdbc完成数据库和代码的逻辑交互
3:使用jsp完成网页数据的显示
4:使用java代码完成api接口的编写以及以及数据的回调

四、数据库设计

/*
Navicat MySQL Data Transfer

Source Server         : mydata
Source Server Version : 50528
Source Host           : localhost:3306
Source Database       : cstudyimdb

Target Server Type    : MYSQL
Target Server Version : 50528
File Encoding         : 65001

Date: 2022-04-29 16:31:48
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for coursetb
-- ----------------------------
DROP TABLE IF EXISTS `coursetb`;
CREATE TABLE `coursetb` (
  `courseId` int(11) NOT NULL AUTO_INCREMENT,
  `courseUserId` int(11) DEFAULT NULL,
  `courseUserName` varchar(255) DEFAULT NULL,
  `courseName` varchar(255) DEFAULT NULL,
  `courseType` varchar(255) DEFAULT NULL,
  `courseInfor` varchar(1000) DEFAULT NULL,
  `courseTime` varchar(100) DEFAULT NULL,
  `courseState` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`courseId`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of coursetb
-- ----------------------------
INSERT INTO `coursetb` VALUES ('10', '104', '王老师', '英语', '代码 编程', '如果你想简单的开发APP,快速的上手可以关注一下apicloud,一门APP,安卓益这些混合开发的APP制作平台。这些混合开发平台不需要你会太专业的工具,只需要会H5技术就可以开始开发APP了,一样的实现各种原生APP才会有的效果,大大提高APP开发成本和时间周期', '2022-04-29 10:43', '1');
INSERT INTO `coursetb` VALUES ('11', '104', '王老师', '计算机基础', '代码 编程', '如果你想简单的开发APP,快速的上手可以关注一下apicloud,一门APP,安卓益这些混合开发的APP制作平台。这些混合开发平台不需要你会太专业的工具,只需要会H5技术就可以开始开发APP了,一样的实现各种原生APP才会有的效果,大大提高APP开发成本和时间周期', '2022-04-29 10:43', '1');
INSERT INTO `coursetb` VALUES ('12', '104', '王老师', 'android', '代码 编程', '如果你想简单的开发APP,快速的上手可以关注一下apicloud,一门APP,安卓益这些混合开发的APP制作平台。这些混合开发平台不需要你会太专业的工具,只需要会H5技术就可以开始开发APP了,一样的实现各种原生APP才会有的效果,大大提高APP开发成本和时间周期', '2022-04-29 10:43', '1');
INSERT INTO `coursetb` VALUES ('13', '104', '王老师', 'mysql', '代码 编程', '如果你想简单的开发APP,快速的上手可以关注一下apicloud,一门APP,安卓益这些混合开发的APP制作平台。这些混合开发平台不需要你会太专业的工具,只需要会H5技术就可以开始开发APP了,一样的实现各种原生APP才会有的效果,大大提高APP开发成本和时间周期', '2022-04-29 10:43', '1');
INSERT INTO `coursetb` VALUES ('14', '104', '王老师', 'java基础', '编程 开发', 'java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础java基础', '2022-04-29 10:43', '1');
INSERT INTO `coursetb` VALUES ('15', '104', '王老师', '语文', '文字', '语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文语文', '2022-04-29 11:43', '1');

-- ----------------------------
-- Table structure for exametb
-- ----------------------------
DROP TABLE IF EXISTS `exametb`;
CREATE TABLE `exametb` (
  `exameId` int(11) NOT NULL AUTO_INCREMENT,
  `exameCourseId` int(11) DEFAULT NULL,
  `exameCourseName` varchar(255) DEFAULT NULL,
  `exameTitle` varchar(255) NOT NULL,
  `exameType` varchar(255) DEFAULT NULL,
  `exameA` varchar(255) DEFAULT NULL,
  `exameB` varchar(255) DEFAULT NULL,
  `exameC` varchar(255) DEFAULT NULL,
  `exameD` varchar(255) DEFAULT NULL,
  `exameOk` varchar(255) DEFAULT NULL,
  `exameInfor` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`exameId`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of exametb
-- ----------------------------
INSERT INTO `exametb` VALUES ('1', '10', '英语', '某市正在创建卫生城市,致力形成干净整洁的城市环境', '单选题', '但在此过程中', '依然存在一些问题', '如环城严重', '河道污水', 'A', '但在此过程中,依然存在一些问题,如环城严重,河道污水');
INSERT INTO `exametb` VALUES ('2', '10', '英语', '某市正在创建卫生城市', '单选题', 'book1', 'book2', 'book3', 'book4', 'C', 'book1,book2,book3,book4');
INSERT INTO `exametb` VALUES ('3', '10', '英语', '致力形成干净整洁的城市环境', '单选题', '但在此过程中', '某市', '正在', '创建', 'D', '但在此过程中,此过程中,但在中,但在此');
INSERT INTO `exametb` VALUES ('6', '10', null, '单词', '单选题', '单词1', '单词2', '单词3', '单词4', 'A', '单词1,单词2,单词3,单词4');
INSERT INTO `exametb` VALUES ('7', '10', null, '单词', '单选题', '但在此过程中', 'java基础', '在此过程中', '基础', 'C', '但在此过程中,java基础,在此过程中,基础');
INSERT INTO `exametb` VALUES ('8', '15', null, '1', '单选题', '1', '2', '555', '34', 'A', '1,2,555,34');

-- ----------------------------
-- Table structure for scoretb
-- ----------------------------
DROP TABLE IF EXISTS `scoretb`;
CREATE TABLE `scoretb` (
  `scoreId` int(50) NOT NULL AUTO_INCREMENT,
  `scoreCourseId` varchar(255) DEFAULT NULL,
  `scoreChoiceInfor` varchar(255) DEFAULT NULL,
  `scoreChoiceScore` varchar(255) DEFAULT NULL,
  `scoreUserId` varchar(11) DEFAULT NULL,
  `scoreUserName` varchar(255) DEFAULT NULL,
  `scoreCreatime` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`scoreId`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of scoretb
-- ----------------------------
INSERT INTO `scoretb` VALUES ('3', '10', '1-A,2-B,3-A,6-A,7-A', '20', '105', '悦悦', '2022-04-29 10:27');
INSERT INTO `scoretb` VALUES ('4', '10', '1-B,2-D,3-C,6-B,7-no', '0', '104', '王老师', '2022-04-29 10:43');
INSERT INTO `scoretb` VALUES ('5', '10', '1-B,2-A,3-C,6-B,7-A', '0', '105', '悦悦', '2022-04-29 11:44');

-- ----------------------------
-- Table structure for token
-- ----------------------------
DROP TABLE IF EXISTS `token`;
CREATE TABLE `token` (
  `tid` int(100) NOT NULL AUTO_INCREMENT,
  `uid` varchar(100) CHARACTER SET utf8 NOT NULL,
  `utoken` varchar(500) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=146 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of token
-- ----------------------------
INSERT INTO `token` VALUES ('140', '103', 'mRHEEi/RNNnCAUsC1qH4Rt7hLHOyXDZkRMJ0giwZZq0=@4ixh.cn.rongnav.com;4ixh.cn.rongcfg.com');
INSERT INTO `token` VALUES ('141', '104', 'wzr+nt9zT+nCAUsC1qH4RpaqfFk72MwERMJ0giwZZq0=@4ixh.cn.rongnav.com;4ixh.cn.rongcfg.com');
INSERT INTO `token` VALUES ('142', '105', 'rJRUNQLo5RfCAUsC1qH4RhEYmFA2SEoXRMJ0giwZZq0=@4ixh.cn.rongnav.com;4ixh.cn.rongcfg.com');
INSERT INTO `token` VALUES ('143', '107', 'l+t213zhSFDCAUsC1qH4RnvHYZQyEXyWRMJ0giwZZq0=@4ixh.cn.rongnav.com;4ixh.cn.rongcfg.com');
INSERT INTO `token` VALUES ('144', '108', '410+eC84tRfCAUsC1qH4Rnua6oerg5KeRMJ0giwZZq0=@4ixh.cn.rongnav.com;4ixh.cn.rongcfg.com');
INSERT INTO `token` VALUES ('145', '109', 'qUhVLBfskPfCAUsC1qH4RgLmzRhcZ79QRMJ0giwZZq0=@4ixh.cn.rongnav.com;4ixh.cn.rongcfg.com');

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `uid` int(255) NOT NULL AUTO_INCREMENT,
  `uname` varchar(200) CHARACTER SET utf8 NOT NULL,
  `uphone` varchar(100) CHARACTER SET utf8 NOT NULL,
  `upswd` varchar(200) CHARACTER SET utf8 NOT NULL,
  `uImg` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `utime` varchar(300) CHARACTER SET utf8 NOT NULL,
  `utype` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('98', '在线学习学生', '15249243006', '123456', 'stuimg.png', '2022-04-29 10:43', '1');
INSERT INTO `user` VALUES ('103', '鲜花', '15249241006', '13456', 'stuimg.png', '2022-04-29 10:43', '1');
INSERT INTO `user` VALUES ('104', '王老师', '15249248001', '123456', 'teaimg.png', '2022-04-29 10:43', '2');
INSERT INTO `user` VALUES ('105', '悦悦', '15249243002', '123456', 'stuimg.png', '2022-04-29 10:43', '1');
INSERT INTO `user` VALUES ('106', 'admin', 'admin', '123456', null, '', '3');
INSERT INTO `user` VALUES ('107', '张老师', '15249248006', '123456', 'stuimg.png', '2022-04-29 10:43', '2');
INSERT INTO `user` VALUES ('108', '溪水', '15249243001', '123456', 'stuimg.png', '2022-04-29 10:43', '1');
INSERT INTO `user` VALUES ('109', '李老师', '152492412343', '123456', 'stuimg.png', '2022-04-29 11:43', '2');

五、部分代码

1:测试数据代码

public class ExameActivity extends BaseActivity implements ExameCourseListner {

    // title
    private TextView mTvTitle;
    // 返回
    private ImageView mIvBack;
    private TextView mIvStu;
    private DialogMsg dialogMsg;

    private String courseModelString;
    private ListView mListMessage;
    private String state;
    private LinearLayout mllNomessage;
    private Button mivCreateMessage;
    private List<ExameModel> list_result = new ArrayList<ExameModel>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview_nobg);
        initWidget();
        initData();
    }

    /**
     * 控件初始化
     */
    @Override
    public void initWidget() {
        dialogMsg = new DialogMsg(this);
        dialogMsg.Set_Msg("你确定要退出此次测试吗?");
        dialogMsg.submit_no().setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                dialogMsg.Close();
            }
        });
        dialogMsg.submit_ok().setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
                dialogMsg.Close();
            }
        });


        mIvBack = (ImageView) findViewById(R.id.mIvBack);
        mTvTitle = (TextView) findViewById(R.id.mTvTitle);
        mTvTitle.setText("在线考试");
        mIvBack.setVisibility(View.VISIBLE);
        mIvBack.setOnClickListener(this);
        mIvStu = (TextView) findViewById(R.id.mIvStu);
        mIvStu.setVisibility(View.VISIBLE);
        mIvStu.setText("00:00");
        mIvStu.setOnClickListener(this);

        mivCreateMessage = (Button) findViewById(R.id.mivCreateMessage);
        mllNomessage = (LinearLayout) findViewById(R.id.mllNomessage);
        mListMessage = (ListView) findViewById(R.id.mListMessage);
        mivCreateMessage.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.mIvBack:
                dialogMsg.Show();
                break;
            case R.id.mIvStu:
                break;
            case R.id.mivCreateMessage:
                addScore(true);
                break;
        }

    }

    @Override
    public void setChoiceCourse(int pos, ExameModel exameModel) {
        checkExameInfor();
    }

    String exameChoiceInfor="";
    int exameChoiceScore=0;

    /**
     * 对做题的数据进行判断和提交
     */
    private void checkExameInfor(){

         exameChoiceInfor="";
         exameChoiceScore=0;

        for(int i=0;i<list_result.size();i++){

            if(list_result.get(i).getChoiceIndex().equals(list_result.get(i).getExameOk())){
                exameChoiceInfor =exameChoiceInfor+list_result.get(i).getExameId()+"-"+list_result.get(i).getChoiceIndex()+",";
                exameChoiceScore=exameChoiceScore+10;
            }else{
                exameChoiceInfor =exameChoiceInfor+list_result.get(i).getExameId()+"-"+list_result.get(i).getChoiceIndex()+",";
            }

        }


        Log.i("pony_log","exameChoiceInfor:"+exameChoiceInfor);
        Log.i("pony_log","exameChoiceScore:"+exameChoiceScore);
    }

    @Override
    public void initData() {
        courseModelString = this.getIntent().getStringExtra("msg");
        handler.postDelayed(update_thread, 1000);
        MessageAction(true);
    }

    private void MessageAction(boolean isShow) {
        AjaxParams params = new AjaxParams();
        params.put("action_flag", "listPhoneExame");
        params.put("courseId",courseModelString+"");
        httpPost(Consts.URL + Consts.APP.MessageAction, params, Consts.actionId.resultFlag, isShow, "正在加载...");
    }

    private void addScore(boolean isShow) {
        AjaxParams params = new AjaxParams();
        params.put("action_flag", "addScore");
        params.put("scoreCourseId", courseModelString+"");
        params.put("scoreChoiceInfor", exameChoiceInfor.substring(0,exameChoiceInfor.length()-1));
        params.put("scoreChoiceScore", exameChoiceScore+"");
        params.put("scoreUserId", MemberUserUtils.getUid(this));
        params.put("scoreUserName", MemberUserUtils.getName(this));
        httpPost(Consts.URL + Consts.APP.MessageAction, params, Consts.actionId.resultCode, isShow, "正在加载...");
    }


    @Override
    protected void callBackSuccess(ResponseEntry entry, int actionId) {
        super.callBackSuccess(entry, actionId);

        switch (actionId) {


            case Consts.actionId.resultFlag:
                if (null != entry.getData() && !TextUtils.isEmpty(entry.getData())) {
                    String jsonMsg = entry.getData().substring(1, entry.getData().length() - 1);

                    if (null != jsonMsg && !TextUtils.isEmpty(jsonMsg)) {

                        list_result.clear();
                        list_result = mGson.fromJson(entry.getData(), new TypeToken<List<ExameModel>>() {
                        }.getType());




                        ExameListAdapter intersetListAdapter = new ExameListAdapter(ExameActivity.this, list_result,this);
                        mListMessage.setAdapter(intersetListAdapter);


                    } else {
                        mllNomessage.setVisibility(View.VISIBLE);
                    }
                }
                break;
            case Consts.actionId.resultCode:
                CustomToast.showToast(this,"考试成绩为"+exameChoiceScore+"分");
                ToastUtil.show(ExameActivity.this, entry.getRepMsg());
                new Handler().postDelayed(new Runnable() {
                    //
                    @Override
                    public void run() {
                        ExameActivity.this.finish();
                    }
                }, 2000);
                break;

        }

    }

    @Override
    protected void callBackAllFailure(String strMsg, int actionId) {
        super.callBackAllFailure(strMsg, actionId);
        ToastUtil.show(ExameActivity.this, strMsg);

    }


    long leftTime = 600;
    Handler handler = new Handler();
    Runnable update_thread = new Runnable() {
        @Override
        public void run() {
            leftTime--;
            if (leftTime > 0) {
                // 倒计时效果展示
                String formatLongToTimeStr = formatLongToTimeStr(leftTime);
                mIvStu.setText(formatLongToTimeStr);
                // 每一秒执行一次
                handler.postDelayed(this, 1000);

                if (formatLongToTimeStr.equals("00:01")) {
//					Intent intent = new Intent(ExameActivity.this, ResultMessageActivity.class);
//					intent.putExtra("msg", (Serializable) listCheck);
//					startActivity(intent);
//					finish();
                }

            } else {// 倒计时结束
                // 处理业务流程

                // 发送消息,结束倒计时
                // Message message = new Message();
                // message.what = 1;
                // handlerStop.sendMessage(message);

            }
        }
    };

    final Handler handlerStop = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    leftTime = 0;
                    handler.removeCallbacks(update_thread);

                    // Intent intent = new Intent(ExameActivity.this,
                    // ResultMessageActivity.class);
                    // intent.putExtra("msg",(Serializable) listCheck);
                    // startActivity(intent);
                    // finish();

                    break;
            }
            super.handleMessage(msg);
        }

    };

    public String formatLongToTimeStr(Long l) {
        int hour = 0;
        int minute = 0;
        int second = 0;
        second = l.intValue();
        if (second > 60) {
            minute = second / 60; // 取整
            second = second % 60; // 取余
        }
        if (minute > 60) {
            hour = minute / 60;
            minute = minute % 60;
        }

        String minutemsg = "";
        String secondmsg = "";
        if (minute < 10) {
            minutemsg = "0" + minute;
        } else {
            minutemsg = minute + "";
        }

        if (second < 10) {
            secondmsg = "0" + second;
        } else {
            secondmsg = "" + second;
        }

        String strtime = minutemsg + ":" + secondmsg;
        return strtime;
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Message message = new Message();
        message.what = 1;
        handlerStop.sendMessage(message);
    }



}
2:得分信息代码


public class ScoreInforActivity extends BaseActivity {

    // title
    private TextView mTvTitle;
    // 返回
    private ImageView mIvBack;
    private TextView mIvStu;
    private DialogMsg dialogMsg;

    private ScoreModel scoreModel;
    private ListView mListMessage;
    private String state;
    private LinearLayout mllNomessage;
    private Button mivCreateMessage;
    private List<ExameModel> list_result = new ArrayList<ExameModel>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview_nobg);
        initWidget();
        initData();
    }

    /**
     * 控件初始化
     */
    @Override
    public void initWidget() {


        mIvBack = (ImageView) findViewById(R.id.mIvBack);
        mTvTitle = (TextView) findViewById(R.id.mTvTitle);

        mIvBack.setVisibility(View.VISIBLE);
        mIvBack.setOnClickListener(this);
        mIvStu = (TextView) findViewById(R.id.mIvStu);
        mIvStu.setVisibility(View.GONE);
        mIvStu.setText("00:00");
        mIvStu.setOnClickListener(this);

        mivCreateMessage = (Button) findViewById(R.id.mivCreateMessage);
        mllNomessage = (LinearLayout) findViewById(R.id.mllNomessage);
        mListMessage = (ListView) findViewById(R.id.mListMessage);
        mivCreateMessage.setOnClickListener(this);
        mivCreateMessage.setVisibility(View.GONE);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.mIvBack:
                finish();
                break;

        }

    }

    @Override
    public void initData() {
        scoreModel = (ScoreModel) this.getIntent().getSerializableExtra("msg");
        mTvTitle.setText("成绩为"+scoreModel.getScoreChoiceScore()+"分");
        ScoreLookListAdapter intersetListAdapter = new ScoreLookListAdapter(ScoreInforActivity.this, scoreModel.getExameArray(), scoreModel.getScoreChoiceInfor().split(","));
        mListMessage.setAdapter(intersetListAdapter);
    }


}

六、浏览更多Android毕业设计

毕业设计-基于android的租房信息发布平台的APP_信息发布app源码_Android毕业设计源码的博客-CSDN博客

毕业设计-基于android选课系统的设计与实现_android学生选课系统_Android毕业设计源码的博客-CSDN博客

毕业设计之校园一卡通管理系统的设计与实现_一卡通管理系统实现_Android毕业设计源码的博客-CSDN博客

基于Android的校园二手闲置物品交易系统设计与实现_基于android的二手交易平台_Android毕业设计源码的博客-CSDN博客

基于androidstudio校园快递APP系统的设计与实现_android studio论文_Android毕业设计源码的博客-CSDN博客

基于android的商城购物定制APP_安卓开发购物app_Android毕业设计源码的博客-CSDN博客

更多毕业设计可以浏览我的个人主页哦!

七、源码下载

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取联系方式👇🏻👇🏻👇🏻

https://download.csdn.net/download/u014388322/88187990

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android毕业设计源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值