4 Star 23 Fork 7

Iklm / SmartCity-智慧城市

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 9.59 KB
一键复制 编辑 原始数据 按行查看 历史
Iklm 提交于 2024-05-11 12:05 . update README.md.

题目改革了, 该项目比赛服务器已经关闭了 获取不了数据。 现在在开发车载中...

SmartCity

职业院校师生技能大赛暨全国职业院校技能大赛选拔赛 - 智慧城市(移动应用开发项目)

技术交流: QQ: 2506789532 WX: wjk655955

注: 该项目只能使用Android Studio version-4.0版本打开

输入图片说明 输入图片说明

简介

开源和写教程是因为大家可能都和我一样, 刚接触这个比赛, 啥都不知道,希望我这源码跟教程能给你帮助。 该项目是我比赛前一个月练习的, 由于赶时间, 画的UI布局不是那么的合格,现在你可以参考参考我的来修改优化, 所有题目都差不多写完了, 后续我也会慢慢更新修改, 我也当作是我学习项目的一部分了, 到时可能会添加一些第三方的库这些我会写注释, 但你看到这注释时可以放弃学习这部分代码。

比赛注意事项

说说比赛需要的注意事项, 比赛是一定要注意插件是否添加完(我当时就忘记了了一个插件 okio-jvm-2.8.0.jar这个插件浪费我半个小时的时间), 一定要根据题目的要求来写, 千万不要造轮子! 裁判是不会看你代码的, 不要想着我就一直造轮子给裁判看看, 我写的代码多牛, 这是徒劳的, 比赛提交成果物后, 你电脑上是需要运行你打包好的apk放在桌面上, 模拟器也要运行, 放在桌面上, 裁判会自己下来评分, 比赛那么多人, 是没时间慢慢看你写的代码的, 能使用插件就使用插件, 比赛前实训的时候, 自己把接口的题目全练习一遍, 把一些重复性很高的代码全封装了,

该项目需要会那些

Kotlin/Kotlin协程, Android这两个是必须要会的,还有一些第三方插件, 比如Banner, ViewPager2, Retrofit, OkHttp, glide, GsonFormat, MPAndroidChart。 建议还是先把Kotlin和Android学完, 然后跟着比赛试题一步一步写, 到时候会有一些效果实现需要使用到上面这些插件。 我也是一步一步的了解这些插件再到运用。 然后就要搞你自己了, 加油!

教程源码地址

我自己写了一个智慧城市教程PDF源代码地址: SmartCity_Course: 职业院校技能大赛(移动应用开发项目)智慧城市教程kotlin版 (gitee.com) 需要PDF教程请添加我的wx/QQ (gitee上传不了大文件)

Kotlin协程

比赛是支持Kotlin协程的, 还有Retrofit也是支持协程,Retrofit可以配合Kotlin协程来访问网络, 方便快捷。 然后比赛不用将数据返回ViewModel,我们直接拿数据填充UI展示出来

接下来看看Retrofit如何配合Kotlin协程来访问网络的

封装 协程

    /**
     * 定义一个名为 coroutine 的函数,接受两个参数:
     * 1. context: CoroutineContext,协程的上下文,默认为 Dispatchers.IO。
     * 2. block: 一个挂起函数,该函数在协程内执行。
     */
    fun coroutine(
        // 协程的上下文,默认为 Dispatchers.IO
        context: CoroutineContext = Dispatchers.IO,
        block: suspend CoroutineScope.() -> Unit
    ): Job {
        // 创建一个 CoroutineScope,并使用给定的上下文启动一个协程。
        // 返回一个 Job 对象,用于管理和监控协程的状态。
        return CoroutineScope(context).launch {
            try {
                // 在协程内部创建一个新的 coroutineScope。
                coroutineScope {
                    // 调用传入的挂起函数 block。
                    block()
                }
            } catch (e: Exception) {
                // 捕获并处理协程内部的异常,打印异常堆栈信息。
                e.printStackTrace()
            }
        }
    }

封装 Retrofit

class ServiceNET {
    companion object{
        // 服务器地址
        private const val BASE_URL = "http://124.93.196.45:10001/"

        private val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        // 通过.Class对象进行网络请求: create(API接口对象)
        fun <E> create(service: Class<E>) : E = retrofit.create(service)

        // 以泛型的方式进行网络请求: create<接口对象>()
        inline fun <reified E> create() : E = create(E::class.java)

    }
}

接口

interface api {
    // 比赛提供的Retrofit版本是支持kotlin协程的
   	// 不用Call<类名>了
    // 直接 : BannerModel
    
    // 获取轮播图
    @GET("/prod-api/api/rotation/list")
    suspend fun getBanner(@QueryMap mp: Map<String, Int>) : BannerModel
}

伴生对象,包含静态属性 api

companion object {
    /*
        静态属性 api,用于进行网络访问请求
        create<Class?> 是我们封装Retrofit是创建的一个内联函数 
        inline fun <reified E> create() : E = create(E::class.java)
        
        使用也很简单, 我们直接调用api后跟个.来获取我们在接口中定义的挂起函数来访问网络
        使用: api.getBanner(传入参数)
    */
    val api = create<api>()
}

定义一个挂起函数

// 定义一个挂起函数 setBanner,用于异步获取广告轮播图数据。
private suspend fun setBanner() {
    // 调用 api 的 getBanner 方法,传入参数 mapOf("pageNum" to 1, "pageSize" to 8, "type" to 2)
    api.getBanner(mapOf("pageNum" to 1, "pageSize" to 8, "type" to 2)).apply {
        // 使用 apply 函数,将代码块作用于 api.getBanner() 的返回结果,即网络请求的响应实体。

        // 在这里直接通过 this 来获取实体类的数据,比如判断是否网络请求成功
        // 例如,判断返回的状态码是否为 200
        if (this.code == 200) {
            // 请求成功,可以在这里处理获取到的数据
            // 比如,可以通过 this.data 获取具体的数据
        } else {
            // 请求失败,可以在这里处理失败的情况
        }
    }
}

使用挂起函数的方法

方法1

// 定义一个私有函数 runThread,它使用之前定义的 coroutine 函数启动一个协程。
private fun runThread() = coroutine {
    // 在这里可以调用挂起函数方法,这些方法将在协程中执行。

    // 例如:
    // 挂起函数方法 ...
    setBanner()
}

方法2

// 定义一个私有函数 runThread,它使用 coroutine 函数启动一个在主线程上执行的协程。
private fun runThread() = coroutine(Dispatchers.Main) {
    // 在这里可以调用挂起函数方法,这些方法将在主线程的协程中执行。

    // 例如:
    // 调用挂起函数
    setBanner()
}

ok, 到这里就完了, 我们前期只需要封装好协程, Retrofit, 接口这些, 以后我们需要访问那个接口, 我们只需要在api接口中定义方法就可以了,然后创建返回数据的对应模型就可以了,

目前完成的Api文档内容

  • 第一个: 停哪儿 (完成)
  • 第二个: 数字图书馆 (完成)
  • 第三个: 活动管理 (完成)
  • 第四个: 青年驿站(完成)
  • 第五个: 爱心捐赠(完成)
  • 第六个: 政府热线(完成)
  • 第七个: 数据分析(完成)
  • 第八个: 垃圾分类(完成)
  • 第九个: 律师咨询(完成)
  • 第十个: 智慧巴士(完成)
  • 第十一个: 门诊预约(完成)
  • 第十二个: 找房子(完成)
  • 第十三个: 智慧交管(查询没有违章列表数据,不做!)
  • 第十四个: 生活缴费(完成)
  • 第十五个: 看电影(完成)
  • 第十六个: 志愿服务(完成)
  • 第十七个: 找工作(完成)
  • 第十八个: 宠物医院(完成)
  • 第十九个: 教育(没有题目不做!)
  • 第二十个: 物流查询(完成)
  • 第二十一个: 城市地铁(明天就比赛了,这个模块我不做了,比完赛有时间再做了。)

PDF教程目录

项目目录介绍


/ui

全部服务里所有模块的实现

  • /ui/AllService 全部服务模块实现
    • /ActivityManAge 活动管理
    • /NumberBook 数字图书馆
    • /StopWhere 停哪儿
    • /YouthPost 青年驿站
    • /LoveDonate 爱心捐赠
    • /DataAnalysis 数据分析
    • /GovernmentHotLine 政府服务热线
    • /RubbishClassify 垃圾分类

全部服务

  • /ui/dashboard 底部导航栏 全部服务

引导页

  • /ui/guide 引导页

主页

  • /ui/home 底部导航栏 主页
    • /adapter RecyclerView列表适配器
    • /fragment 新闻模块展示
    • /Seek 搜索框实现查找新闻

新闻

  • /ui/news 底部导航栏 新闻

个人中心

  • /ui/notifications 底部导航栏 个人中心
    • /activity 个人信息/修改密码/意见反馈等模块
    • /adapter RecyclerView适配器

限选主题(智慧养老)

  • /ui/poverty 底部导航栏 限选主题(智慧养老)
    • /activity 扶贫案例/村情村貌/收到求助/案例发布 等模块
    • /adapter 列表适配器
    • /date 存储数据
    • /model 数据填充类

软件架构

使用Android studio 4.0开发

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Android
1
https://gitee.com/iklm/smart-city.git
git@gitee.com:iklm/smart-city.git
iklm
smart-city
SmartCity-智慧城市
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891