收藏 分销(赏)

安卓天气预报优秀课程设计.docx

上传人:精**** 文档编号:2657232 上传时间:2024-06-03 格式:DOCX 页数:38 大小:483.83KB 下载积分:12 金币
下载 相关 举报
安卓天气预报优秀课程设计.docx_第1页
第1页 / 共38页
安卓天气预报优秀课程设计.docx_第2页
第2页 / 共38页


点击查看更多>>
资源描述
石家庄铁道大学 Android系统课程设计汇报 年 夏 季学期 题 目: 基于Android天气预报开发 学 院: 电气和电子工程学院 专 业: 电子信息工程 学 生 姓 名: 学 号: 指 导 教 师: 完 成 日 期: 7月15日 评分表 项目号 一 二 三 总分 满 分 25 50 25 100 得 分 评阅人 说明: 项目一,考察程序运行情况。 项目二,考察完成情况包含功效完整性,工作量,界面,用户体验等。 项目三,考察课程设计汇报格式和完整性。 摘 要 伴随移动通信技术发展和无线数据业务进步,手机已被给予了除通话以外其它很多功效。全新手机软件领域已逐步聚焦了众多软件开发商眼光,软件开发者和软件用户将共同面临这个振奋人心新境界。 本设计使用Android设计技术开发了一个利用在Android系统上手机天气预报软件系统,本系统经过选择城市来取得天气,风向,风向,温度等信息。基于手机天气预报系统软件能够使用户对于各地天气情况实时掌握,极大方便了用户出行和行程安排,避免了无须要麻烦,含有很强实用性。 关键词:Android;手机天气预报软件。 目 录 第1章 绪论 1 1.1 课题研究内容 1 1.2 课题研究目标和意义 1 1.3 课题研究前景 2 第2章 系统需求分析 3 2.1 系统功效需求 3 2.2 系统步骤图 3 2.3 系统界面需求 4 2.4 系统性能需求 4 第3章 具体设计和功效实现 5 3.1 界面设计 5 3.1.1 欢迎界面设计 5 3.1.2 菜单界面设计 6 3.2 各模块具体设计 6 3.2.1 欢迎模块设计 6 3.2.1 主工程设计 7 第4章 软件测试 15 4.1 电脑模拟器测试 15 4.2 手机端测试 17 第5章 总结和展望 18 5.1 总结 18 5.2 不足和展望 18 参考文件 19 附录 20 关键程序1 18 关键程序2 18 一、绪论 Android是一个基于Linux自由及开放源代码操作系统,关键使用于移动设备,如智能手机和平板电脑,由谷歌企业和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,关键支持手机。8月由谷歌收购注资。11月,谷歌和84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随即谷歌以Apache开源许可证授权方法,公布了Android源代码。第一部Android智能手机公布于10月。Android逐步扩展到平板电脑及其它领域上,如电视、数码相机、游戏机等。第一季度,Android在全球市场份额首次超出塞班系统,跃居全球第一。 11月数据显示,Android占据全球智能手机操作系统市场76%份额,中国市场拥有率为90%。09月24日谷歌开发操作系统Android在迎来了5岁生日,全世界采取这款系统设备数量已经达成10亿台。 1.1 课题研究内容 本课题研究是基于Android平台下天气软件,目标是使用户能随时随地查询天气信息及天气改变情况,让生活愈加舒适方便。本文讲述Android平台下天气软件界面设计和数据获取和解析,关键包含界面实现,控件使用,界面布局和数据处理等内容,结合中国气象网天气数据,将正确天气情况以友好方法展现给用户,使用户愈加赏心悦目标体验本软件服务。经过对界面布局及控件应用等相关内容学习,使我们对Android平台下界面开发工作有一个初步了解,而且经过这次开发过程,能够基础掌握这些内容。 1.2 研究目标和意义 天气软件是一个很实用信息服务,伴随智能手机不停普及,多种智能手机平台下全部有多种多样天气软件。Android作为现在主流智能手机之一,自然也需要这方面软件。天气关系到大家日常生活,如通知温暖,方便出行等。一款简单实用天气软件会很吸引用户。 基于Android平台天气软件已经有很多,经过分析,用户第一眼往往是一个软件外观,一个好看界面才能让用户以一个爱美之心去尝试,才能深入了解一个软件好坏,所以吸引眼球界面是争取用户第一步。所以,界面设计工作对应用程序来说很关键,在界面上吸引了用户,才能深入让用户体验应用程序中功效,使用这个软件。 1.3 研究前景 Android最吸引人特点是开源特征,因其开源,许可全部些人对其代码进行开发和修改,同时又因为其代码简单易学性,Android在全世界拥有众多粉丝。Android在中国前景十分宽广,首先是有成熟消费者,在中国,Android小区十分红火,这些小区为Android在中国普及做了很好推广作用。中国厂商和运行商也纷纷加入了Android阵营,包含中国移动,中国联通,中兴通讯,华为通讯,联想等大企业,同时不仅仅局限于手机,中国厂家也陆续推出了采取Android系统产品,我们能够预见Android将会被广泛应用在国产智能上网设备上,将深入扩大Android系统应用范围。 Android采取了软件层(Software stack)构架,关键分为三个部分。底层以Linux为内核作为基础,由C语言开发,只提供基础功效,中间层次包话函数库和虚拟机,由C++开发。最上层是多种应用软件,包话通话程序,短信程序。应用软件能够由各企业或个人自行开发,以JAVA编写。 二、系统需求分析 2.1 系统功效需求 1.能够罗列出全国全部省市县。 2.能够查看全国任意城市天气信息 3.能够自由切换程式去查看其它城市天气 4.提供手动更新和后台自动更新天气功效 2.2 系统步骤图 图2.1 系统步骤图 2.3 系统界面需求 依据应用程序功效需要,对用户界面做以下分析: 实时天气界面:显示城市目前实时天气情况,包含城市名称、城市名片、天气情况、温度高低、星期等信息。界面左边有一列城市列表,显示中国各个城市名称,当用户想知道哪个城市天气情况时,点击这个城市名就能够获取天气情况,考虑到使软件占用尽可能小内存,软件去掉了无须要花哨,显示城市名称,城市名片,温度和天气情况,同时对未来6天天气情况简明描述,简显著示星期、天气描述、温度高低等数据,使用户一目了然,使大家立即了解天气改变,对日常生活出行、穿衣做好准备。 2.4 系统性能需求 1.应用程序能依据中国天气网接口返回数据正确显示地域天气信息。 2.应用程序响应时间应在人感觉和视觉范围内,系统响应时间足够快速。 3.应用程序在android4.0及以上版本运行时,应含有适应能力,能稳定运行。 4.应用程序操作界面简单明了,易于操作。 三、具体设计和功效实现 3.1 界面设计 3.1.1 欢迎界面设计 欢迎界面,采取简练明了布局,添加了一个button点击事件,点击即可跳转到主界面即省份选择菜单。图3.1所表示 图3.1 欢迎界面 3.1.2 菜单界面设计 菜单界面菜单界面采取列向布局和子菜单。这么直观明了,简练清楚。(当为省份时标题栏显示中国),省份,城市。图3.2所表示 3.2 a b 注:a为省份菜单,b为市级菜单 3.2 各模块具体设计 3.2.1 欢迎模块设计 1.新建一个WelcomeActivity类,并让它继承Activity类。任何活动全部应该重写onCreate()方法。 public class WelcomeActivity extends Activity{ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } } 2.新建一个布局文件,命名为welcome_layout,根元素选择为LinearLayout。创建成功后,再LinearLayout下添加背景添加语句: android:background="@drawable/b" 添加一个按钮,用于点击事件触发: <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点击查询天气" /> 在WelcomeActivity里,关联布局文件和实例化button.然后添加onClick,结构出一个intent,传入WelcomeActivity上下文,传入ChooseAreaActivity.class为目标活动。即在WelcomeActivity这个活动基础上打开ChooseAreaActivity这个活动。然后经过startActivity()方法来实施这个intent。 setContentView(R.layout.welcome_layout); Button button1=(Button)findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener(){ public void onClick(View v){ Intent intent=new Intent(WelcomeActivity.this,ChooseAreaActivity.class); startActivity(intent); 3.2.2 主工程设计 3.2.2.1 第一阶段 1.新建工程命名为coolweather。为了让项目有愈加好结构。需要在com.coolweather.app包下再新建一个包,图3.3所表示。 图3.3 新建包构架 其中activity包用于存放全部活动代码,db包用于存放全部数据库相关代码,model包用于存放全部模型相关代码,receiver包用于存放全部广播相关代码,service包用于存放全部服务相关代码,util包用于存放全部工具相关代码。 2.创建数据库和表,这么从服务器获取数据才能够存放到当地。表设计这里建立三张表,Province,City,County,分别用于存放省,市,县多种数据信息,三张表建表语句以下(以county表为例) County: create table County( id integer primary key autoincrement, county_name text, county_code text, city_id integer) 其中id是自增加主键,county_name表示县名,county_code表示县级代号,city_id是county表关联city表外键。 接下来将建表语句写入到代码中。在db包下新建CoolWeatherOpenHelper类,用于province,city,county建表。关键代码以下所表示。 public void onCreate(SQLiteDatabase db) { //创建表 db.execSQL(CREATE_PROVINCE); db.execSQL(CREATE_CITY); db.execSQL(CREATE_COUNTY); } 3.为每张表创建一个对应实体类。在model下分别新建Province类,city类,county类。实体类很简单,基础就是对应字段get和set方法。类创建图3.4所表示。 图3.4 实体类 4.创建一个CoolWeatherDB类,这个类将会把部分常见数据库操作封装起来,以方便后面使用。代码以下所表示。定义数据库名,版本。将结构方法私有化,实例化数据库。保留加载省级、市级、县级数据信息 从提交程序中能够看到CoolWeatherDB是一个单例类,这里将它结构方法私有化,并提供了一个getInstance()方法来获取CoolWeatherDB实例,这么就能够确保全局范围内只会有一个CoolWeatherDB实例。在CoolWeatherDB中,提供了六组方法,saveProvince()、loadProvince()、saveCity()、loadCities()、saveCounty()、loadCounties(),分别用于存放省份数据、读取全部省份数据,存放城市数据、读取某省内全部城市数据,存放县数据、读取某市内全部县数据。 3.2.2.2 第二阶段 1.全国全部省市县数据全部是从服务器端获取到,所以为了使程序含有遍历全国省市县功效,这里和服务器交互式必不可少。所以先在util包下增加一个HttpUtil类。因为在HttpUtil中使用到了HttpCallbackListener接口往返调服务返回结果,所以还需要在util包下添加这个接口。另外因为服务器返回省市县数据全部是“代号|城市,代号|城市,……”这种格式,所以要再提供一个工具类来解析和处理这种数据,。在util包下再新建一个Utility类。在该类中,提供了handlepRrovince()、handleCitiesResponse()、handleCountiesResponse()这三个方法,分别用于解析和处理服务器返回省级、市级、县级数据。解析规则就是先按逗号分隔,再按单竖线分隔,接着将解析出来数据设置到实体类中,最终调用CoolWeatherDB中三个save()方法将数据存放到对应表中。两个类和一个接口创建图3.5所表示。 图3.5 解析数据工具类 2.工具类准备好,开始布局,在res/layout目录下新建choose_area.xml布局。布局文件中内容比较简单,先是定义一个50dp高头布局,并在里面放置了一个TextView用于显示标题内容。然后在头布局下面定义了一个ListView,用于显示省市县数据。 3.编写用于遍历省市县活动,在activity包下新建ChooseAreaActivity继承自Activity。 该类中代码很多,这里只把逻辑理理。在onCreate()方法中先是获取到了部分控件实例,然后去初始化了ArrayAdapter,将它设置为ListView适配器。以后又去获取到了CoolWeatherDB实例,并给ListView设置了点击事件,到这,初始化工作完成。 在onCreate()方法最终调用了queryProvince()方法,也就是从这里开始加载省级数据。queryProvinces()方法内部会首先调用CoolWeatherDB和loadProvinces()方法来从数据库读取省级数据。假如读取到了就直接将数据显示到界面上,假如没有读取到就调用queryFromServer()方法从服务器上查询数据。 queryFromServer()方法会先依据传入参数来拼装查询地址,现在网上有不少无偿天气预报接口能够实现上述功效,比如新浪天气,baidu天气,这里我准备使用中国天气网提供API,接口来实现上述功效。 比如要想,努力出中国全部省份,只需访问以下地址,这里需要注意,假如用浏览器直接访问话,可能会得到一个错误提醒。这是因为浏览器认为服务器应该返回一个xml格式数据。但实际上服务器返回数据,并不是xml格式所造成,右键查看网页源码代码就能够看到服务器返回真是数据了: 服务器会返回一段文本信息,其中包含了中国全部省份名称和省级代号,以下 01|北京,02|上海,03|天津,04|重庆,05|黑龙江,06|吉林,07|辽宁,08|内蒙古,09|河北,10|山西,11|陕西,12|山东,13|新疆,14|西藏,15|青海,16|甘肃,17|宁夏,18|河南,19|江苏,20|湖北,21|浙江,22|安徽,23|福建,24|江西,25|湖南,26|贵州,27|四川,28|广东,29|云南,30|广西,31|海南,32|香港,33|澳门,34|台湾 能够看到北京代号是01,上海代号是02,不一样省份之间以逗号隔开,省份名称和省级代号之间用单竖线分隔。要想知道某个省内有哪些城市,比如江苏代号是19,那么只要访问以下地址: 这次服务器返回数据以下: 190401|苏州,190402|常熟,190403|张家港,190404|昆山,190405|吴县东山,190406|吴县,190407|吴江,190408|太仓 经过这种方法,就能把全国全部省,市,县,全部罗列出来了。那么处理了全国省市县数据获取,然后就是处理查询天气信息问题。这里原理同上,比如,昆山县级代号是190404,那么访问以下地址: 这时服务器返回数据很简短: 190404| 其中后半部分就是昆山所对应天气代号了。这个时候再去访问查询天气接口,将对应天气代号填入即可,接口地址以下: 这么服务器就会把昆山目前天气信息以JSON格式返回给我们了,以下所表示: {“weatherinfo”: “city”:昆山,”cityid”:,”temp1”:”21℃”,”temp2”:”9℃”,”weather”:”多云转小雨”,”img1”:”d1.gif”,”img2”:”n7.gif”,”ptime”:”11:00”} 其中city表示城市名,cityid表示城市对应天气代号,temp1和temp2表示气温是几度到几度,weather表示今日天气信息描述,img1和img2表示今日天气对应图片,ptime表示天气公布时间。 确定了查询地址以后,接下来就调用HttpUtilsendHttpRequest()方法来向服务器发送请求,响应数据会回调到onFinish()方法中,然后去调用UtilityhandleProvincesResponse()方法牵扯到了UI操作,所以必需要在根本程中调用,这里借助了runOnUiThread()方法来实现从子线程切换到根本程,它实现原理其实也是基于异步消息处理机制。现在数据库中已经存在了数据,所以调用queryProvinces()就会直接将数据显示到界面上。 当你点击了某个省时候进入到ListViewonClick()方法中,这个时候会依据目前等级来判定是去调用queryCities()方法还是queryCounties()方法,queryCities()方法是去查询市级数据,而queryCounties()方法是去查询县级数据,这两个方法内部步骤和queryProvinces()方法基础相同,不反复说明了。 这里重写onBackPressed()方法来覆盖默认Back键行为,会依据目前等级来判定是返回市级列表、省级列表、还是直接退出。 配置androidMainifest.xml文件。为活动添加访问网络权限 <uses-permission android:name="android.permission.INTERNET"/> 现在已经程序已经能够运行。图3.6所表示。 图3.6 省份菜单 能够看到,全国全部省级单位全部出来了,继续查看市级单位,比如点击黑龙江图3.7所表示。 图3.7 市级菜单 然后再点击黑河,结果图3.8所表示。 图3.8 县级菜单 这么第二阶段开发工作完成。 3.2.2.3 第三阶段 1.查询天气,需要把天气信息显示出来。所以要穿件一个新界面用于显示。创建weather_layout.xml。在这个布局文件中,并没有特殊控件,基础就是使用TextView显示数据信息,然后嵌套多层LinearLayout和RelativeLayout来控制TextView显示位置。 在Utility类中添加多个方法,用于解析和处理服务返回JSON数据,以下所表示 其中handleWeatherResponse()方法用于将JSON格式天气信息全部解析出来,saveWeatherInfo()方法,用于将这些数据全部存放到SharedPreferences文件中。 在activity包下,新建WeatherActivity继承自Activity。该活动用于显示城市名,公布时间,气温,日期等。 最终将ChooseAreaActivity和WeatherActivity关联。在ChooseAreaActivity中添加代码: SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this); if(prefs.getBoolean("city_selected", false)&&!isFromWeatherActivity){ Intent intent=new Intent(this,WeatherActivity.class); startActivity(intent); finish(); ………… else if(currentLevel==LEVEL_COUNTY){ String countyCode=countyList.get(index).getCountyCode(); Intent intent=new Intent(ChooseAreaActivity.this,WeatherActivity.class); intent.putExtra("county_code", countyCode); startActivity(intent); finish(); 最终添加切换城市和更新天气按钮。 运行程序,图3.9所表示 图3.9 北安天气 四、软件测试 4.1 电脑模拟器测试 软件编写完成,对其进行测试,首先将手机天气预报系统在电脑模拟环境下测试方案,以下是对系统进行测试,在Eclipse Package Explorer 窗口中用鼠标右键选择weather工程名,在弹出窗口中选择"Run As"→"Android Application"安装该应用程序到Android 模拟器并开启它,图4.1所表示。 图4.1 开启模拟器 等候模拟器开启完成软件安装,然后单击所要查询城市名称列表项,稍等片刻便会显示出该城市天气实况信息。电脑模拟测试结果图4.2所表示。 图4.2 潞城天气 经查询当地天气发觉基础一致,所以能够知道软件取得数据是正确,说明软件可行性基础满足要求。 4.2手机端测试 图 4.3 临武天气 该测试说明开发天气预报软件能够独立在Android设备运行,满足设计要求独立性,经过和网络数据比较,能够发觉,天气预报软件获取数据和实际天气情况很靠近,说明数据正确性,实时性;从图9能够看出,当选择不一样城市时,软件能够经过网络获取不一样城市天气信息,说明该天气预报软件能够获取不一样城市气象信息,满足设计要求。 五、总结和展望 5.1总结 为期两周Android实训已经结束,在这两周中我学习了很多,也得到了很多。实训是把理论和实际结合,经过对理论知识了解,领悟从而利用到生活实际巩固所学知识,提升对实际生活认识,积累经验。在此期间能够首次体会到实际生产中种种技能和经验。完成一项项项目能表现出独立思索能力。在此次Android天气预报软件开发过程中,我经过学校图书馆资料和网上查询,了解了Android搭建、Intent、Activity、Service等知识。Android环境搭建基础工作完成后,本文对界面控件、布局和美观方面进行设计,对数据获取和解析做了分析,经过模拟器显示城市名片,实时天气情况 Android生产实习对现在应用现实状况进行了分析和比较,进而研究分析Android平台系统架构和组件模型。在此基础上,基于Android平台设计和开发,实现对android编程了解和应用,尤其是在对于控件应用和活动创建有了很深了解。 5.2不足和展望 这次实习我制作软件还是有很多不足之处,这个软件还能够深入发展,比如“短信预报”、“新闻模块”等功效,假如这些功效全部能实现将会对用户有更多帮助,使她们生活愈加愉悦和方便。我会继续为这个软件添加功效,直到它成长为一个强大app。Android 智能手机应用程序开发包含了它整个体系结构,是一项很复杂工程。我要以严谨态度对待它。不骄纵,不菲薄。 参考文件 [1] .Bill Phillips.Android编程权威指南.人民邮电出版社, [2].任玉刚.Android开发艺术探索.电子工业出版社, [3].何红辉 关爱民.Android 源码设计模式解析和实战.人民邮电出版社, [4].郝玉龙 .Android程序设计基础.北京交通大学出版社, [5].徐宜生.Android 群英传.电子工业出版社, 附录 关键程序1 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); isFromWeatherActivity=getIntent().getBooleanExtra("from_weather_activity", false); SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this); if(prefs.getBoolean("city_selected", false)&&!isFromWeatherActivity){ Intent intent=new Intent(this,WeatherActivity.class); startActivity(intent); finish(); return ; } requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.choose_area); listView=(ListView)findViewById(R.id.list_view); titleText=(TextView)findViewById(R.id.title_text); adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, dataList); listView.setAdapter(adapter); coolWeatherDB=CoolWeatherDB.getInstance(this); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int index,long arg3) { if(currentLevel==LEVEL_PROVINCE){ selectedProvince=provinceList.get(index); queryCitys(); }else if(currentLevel==LEVEL_CITY){ selectedCity=cityList.get(index); queryCounty(); }else if(currentLevel==LEVEL_COUNTY){ String countyCode=countyList.get(index).getCountyCode(); Intent intent=new Intent(ChooseAreaActivity.this,WeatherActivity.class); intent.putExtra("county_code", countyCode); startActivity(intent); finish(); } } }); queryProvince();//加载省级数据 } //查询全国省,优先从数据库查询,假如没有查询到再去服务器上查询 private void queryProvince() { provinceList=coolWeatherDB.loadProvince(); if(provinceList.size()>0){ dataList.clear(); for(Province province:provinceList){ dataList.add(province.getProvinceName()); } adapter.notifyDataSetChanged(); listView.setSelection(0); titleText.setText("中国"); currentLevel=LEVEL_PROVINCE; }else{ queryFromServer(null, "province"); } } 关键程序2 private void initViews() { weatherInfoLayout=(LinearLayout)findViewById(R.id.weather_info_layout); cityNameText=(TextView)findViewById(R.id.city_name); publishText=(TextView)findViewById(R.id.publish_text); weatherDespText=(TextView)findViewById(R.id.weather_desp); temp1Text=(TextView)findViewById(R.id.temp1); temp2Text=(TextView)findViewById(R.id.temp2); currentDateText=(TextView)findViewById(R.id.current_date); switchCity=(Button)findViewById(R.id.switch_city); refreshWeather=(Button)findViewById(R.id.refresh_weather); String countyCode=getIntent().getStringExtra("county_code"); if(!TextUtils.isEmpty(countyCode)){//由县级代号去查询天气 publishText.setText("同时中..."); weatherInfoLayout.setVisibility(View.INVISIBLE); cityNameText.setVisibility(View.INVISIBLE); queryWeatherCode(countyCode); }else{//没有县级代号就直接显示当地天气 showWeather(); } } private void initEvents() { switchCity.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(WeatherActivity.this, ChooseAreaActivity.class); intent.putExtra("from_weather_activity", true); startActivity(intent); finish(); } }); refreshWeather.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { publishText.setText("同时中..."); SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(WeatherActivity.this); String weatherCode=prefs.getString("weather_code", ""); if(!TextUtils.isEmpty(weatherCode)){ queryWeatherInfo(weatherCode); } } }); } private void showWeather() { SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this); cityNameText.setText(prefs.getString("city_name", "")); temp1Text.setText(prefs.getString("temp1", "")); temp2Text.setText(prefs.getString("temp2", "")); weatherDespText.setText(prefs.getString("weather_desp", "")); publishText.setText(prefs.getString("publish_time", "")+" 公布"); currentDateText.setText(prefs.getString("cuttent_date", "")); weat
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服