Browse Source

教师界面初步框架

bfzgs 2 years ago
parent
commit
ed020b0feb
23 changed files with 499 additions and 455 deletions
  1. BIN
      FinalProject04041935.zip
  2. BIN
      FinalProject04042024.zip
  3. 20 20
      app/src/main/AndroidManifest.xml
  4. 0 1
      app/src/main/java/org/brynhild/graduation/activity/common/BaseActivity.kt
  5. 12 176
      app/src/main/java/org/brynhild/graduation/activity/teacher/TeacherMainPageActivity.kt
  6. 36 0
      app/src/main/java/org/brynhild/graduation/activity/teacher/ui/clazz/ClazzFragment.kt
  7. 176 0
      app/src/main/java/org/brynhild/graduation/activity/teacher/ui/sign/SignInFragment.kt
  8. 36 0
      app/src/main/java/org/brynhild/graduation/activity/teacher/ui/timetable/TimetableFragment.kt
  9. 34 0
      app/src/main/java/org/brynhild/graduation/activity/teacher/ui/user/UserFragment.kt
  10. 0 8
      app/src/main/java/org/brynhild/graduation/activity/user/UserActivity.kt
  11. 0 194
      app/src/main/java/org/brynhild/graduation/activity/user/UserMainPageActivity.kt
  12. 0 3
      app/src/main/java/org/brynhild/graduation/activity/user/ui/sign/SignInFragment.kt
  13. 27 49
      app/src/main/res/layout/activity_teacher_main_page.xml
  14. 1 2
      app/src/main/res/layout/activity_user_main_page.xml
  15. 22 0
      app/src/main/res/layout/fragment_clazz.xml
  16. 1 1
      app/src/main/res/layout/fragment_sign_in.xml
  17. 29 0
      app/src/main/res/layout/fragment_sign_in_teacher.xml
  18. 22 0
      app/src/main/res/layout/fragment_timetable_teacher.xml
  19. 22 0
      app/src/main/res/layout/fragment_user_teacher.xml
  20. 24 0
      app/src/main/res/menu/teacher_bottom_nav_menu.xml
  21. 1 1
      app/src/main/res/navigation/mobile_navigation.xml
  22. 31 0
      app/src/main/res/navigation/mobile_navigation2.xml
  23. 5 0
      app/src/main/res/values/strings.xml

BIN
FinalProject04041935.zip


BIN
FinalProject04042024.zip


+ 20 - 20
app/src/main/AndroidManifest.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    xmlns:tools="http://schemas.android.com/tools" >
     <!-- 允许应用程序多播状态 -->
     <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <!-- 允许应用程序改变网络状态 -->
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 允许应用程序改变WIFI连接状态 -->
@@ -26,67 +26,75 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme.NoActionBar"
-        tools:targetApi="31">
+        tools:targetApi="31" >
+        <activity
+            android:name=".activity.teacher.TeacherMainPageActivity"
+            android:exported="false"
+            android:label="@string/title_activity_teacher_main_page" >
+            <meta-data
+                android:name="android.app.lib_name"
+                android:value="" />
+        </activity>
         <activity
             android:name=".activity.user.UserActivity"
             android:exported="false"
-            android:label="@string/title_activity_user">
+            android:label="@string/title_activity_user" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.common.StatisticActivity"
-            android:exported="true">
+            android:exported="true" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.common.TimetableActivity"
-            android:exported="true">
+            android:exported="true" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.admin.AcademyDetailInfoActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.admin.CourseDetailInfoActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.admin.AreaDetailInfoActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.admin.DeviceDetailInfoActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.admin.MajorDetailInfoActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
         </activity>
         <activity
             android:name=".activity.admin.ClassDetailInfoActivity"
-            android:exported="false">
+            android:exported="false" >
             <meta-data
                 android:name="android.app.lib_name"
                 android:value="" />
@@ -109,14 +117,6 @@
             android:name=".activity.admin.AdminMainPageActivity"
             android:exported="false"
             android:launchMode="singleTask" />
-        <activity
-            android:name=".activity.teacher.TeacherMainPageActivity"
-            android:exported="false"
-            android:launchMode="singleTask" />
-        <activity
-            android:name=".activity.user.UserMainPageActivity"
-            android:exported="false"
-            android:launchMode="singleTask" />
         <activity
             android:name=".activity.common.ForgetPasswordActivity"
             android:exported="false"
@@ -135,7 +135,7 @@
             android:launchMode="singleTask" />
         <activity
             android:name=".MainActivity"
-            android:exported="true">
+            android:exported="true" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 

+ 0 - 1
app/src/main/java/org/brynhild/graduation/activity/common/BaseActivity.kt

@@ -13,7 +13,6 @@ import org.brynhild.graduation.activity.ActivityCollector
 import org.brynhild.graduation.activity.admin.AdminMainPageActivity
 import org.brynhild.graduation.activity.teacher.TeacherMainPageActivity
 import org.brynhild.graduation.activity.user.UserActivity
-import org.brynhild.graduation.activity.user.UserMainPageActivity
 import org.brynhild.graduation.common.config.LoginConfiguration
 import org.brynhild.graduation.common.config.MyApplication
 import org.brynhild.graduation.common.constant.AccountConstant

+ 12 - 176
app/src/main/java/org/brynhild/graduation/activity/teacher/TeacherMainPageActivity.kt

@@ -1,193 +1,29 @@
 package org.brynhild.graduation.activity.teacher
 
-
-import android.Manifest
-import android.content.Context
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.os.Build
 import android.os.Bundle
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.Menu
-import android.view.MenuItem
-import android.widget.Toast
-import androidx.core.view.GravityCompat
-import androidx.recyclerview.widget.GridLayoutManager
-import com.bumptech.glide.Glide
-import com.google.gson.Gson
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.navigation.findNavController
+import androidx.navigation.ui.AppBarConfiguration
+import androidx.navigation.ui.setupActionBarWithNavController
+import androidx.navigation.ui.setupWithNavController
 import org.brynhild.graduation.R
-import org.brynhild.graduation.activity.common.AccountInfoActivity
 import org.brynhild.graduation.activity.common.BaseActivity
-import org.brynhild.graduation.activity.common.LoginActivity
-import org.brynhild.graduation.common.config.LoginConfiguration
-import org.brynhild.graduation.common.config.MyApplication
-import org.brynhild.graduation.common.constant.FileStorageConstant
-import org.brynhild.graduation.common.transfer.Result
-import org.brynhild.graduation.common.transfer.handler.ResponseHandler
-import org.brynhild.graduation.common.transfer.utils.ServiceCreator
-import org.brynhild.graduation.common.utils.JsonUtils
 import org.brynhild.graduation.databinding.ActivityTeacherMainPageBinding
-import org.brynhild.graduation.databinding.NavHeaderBinding
-import org.brynhild.graduation.network.entiity.User
-import org.brynhild.graduation.service.http.AccountService
-import org.brynhild.graduation.service.mqtt.MqttListenService
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
 
 class TeacherMainPageActivity : BaseActivity() {
 
-    //
-    private var currentPage = 0
-
-    private var lastBack = 0L
-    private lateinit var activityMainPageBinding: ActivityTeacherMainPageBinding
-    private lateinit var navHeaderBinding: NavHeaderBinding
-
-    private fun getPermission() {
-        if (Build.VERSION.SDK_INT >= 23) {
-            val REQUEST_CODE_CONTACT = 101
-            val permissions = arrayOf<String>(Manifest.permission.WRITE_EXTERNAL_STORAGE)
-            //验证是否许可权限
-            for (str in permissions) {
-                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
-                    //申请权限
-                    this.requestPermissions(permissions, REQUEST_CODE_CONTACT)
-                }
-            }
-            FileStorageConstant.initStorage()
-        }
-    }
-
+    private lateinit var binding: ActivityTeacherMainPageBinding
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        activityMainPageBinding = ActivityTeacherMainPageBinding.inflate(LayoutInflater.from(this))
-        setContentView(activityMainPageBinding.root)
-        setSupportActionBar(activityMainPageBinding.toolBar)
-        supportActionBar?.let {
-            it.setDisplayHomeAsUpEnabled(true)
-            it.setHomeAsUpIndicator(R.drawable.ic_menu)
-            it.title = "Favorite"
-        }
-
-        getPermission()
-
-        val layoutManager = GridLayoutManager(this, 2)
-        activityMainPageBinding.recyclerView.layoutManager = layoutManager
-        activityMainPageBinding.navView.setCheckedItem(R.id.navFavorite)
-        currentPage = R.id.navFavorite
-
-        activityMainPageBinding.navView.setNavigationItemSelectedListener { it ->
-            when (it.itemId) {
-                R.id.navExit -> {
-                    LoginConfiguration.login_password = ""
-                    saveLoginInfo()
-                    val i = Intent(MyApplication.context, LoginActivity::class.java)
-                    startActivity(i)
-                    finish()
-                }
-            }
-            activityMainPageBinding.drawerLayout.closeDrawers()
-            true
-        }
-        activityMainPageBinding.swipeRefresh.setOnRefreshListener {
-            Thread {
-                when (currentPage) {
-
-                    R.id.navExit -> {
-                        LoginConfiguration.login_password = ""
-                        saveLoginInfo()
-                        val serviceIntent =
-                            Intent(MyApplication.context, MqttListenService::class.java)
-                        stopService(serviceIntent)
-                        val i = Intent(MyApplication.context, LoginActivity::class.java)
-                        startActivity(i)
-                        finish()
-                    }
-                }
-
-            }.start()
-        }
-        val headerView = activityMainPageBinding.navView.inflateHeaderView(R.layout.nav_header)
-        navHeaderBinding = NavHeaderBinding.bind(headerView)
-        navHeaderBinding.navProfile.setOnClickListener {
-            val intent = Intent(this, AccountInfoActivity::class.java)
-            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
-            this.startActivity(intent)
-        }
-    }
-
-    private fun loadUserInfo() {
-        Thread {
-            val service = ServiceCreator.create(AccountService::class.java)
-            service.accountInfo(LoginConfiguration.userInfo!!.token)
-                .enqueue(object : Callback<Result> {
-                    override fun onResponse(call: Call<Result>, response: Response<Result>) {
-                        ResponseHandler.handle(response, {
-                            val json = Gson().toJson(it.data)
-                            val user = JsonUtils.fromJson<User>(json)
-                            if (user != null) {
-                                navHeaderBinding.userText.text = user.name
-                                navHeaderBinding.mailText.text = user.email
-                                Glide.with(this@TeacherMainPageActivity)
-                                    .load(user.avatar ?: R.drawable.nav_icon_default)
-                                    .into(navHeaderBinding.iconImage)
-                            }
-                        }, {
-                            Toast.makeText(MyApplication.context, "请求用户基本信息失败", Toast.LENGTH_SHORT)
-                                .show()
-                        })
-                    }
-
-                    override fun onFailure(call: Call<Result>, t: Throwable) {
-                        Toast.makeText(MyApplication.context, "请求用户基本信息失败", Toast.LENGTH_SHORT)
-                            .show()
-                    }
-                })
-        }.start()
-    }
-
-    override fun onResume() {
-        super.onResume()
-        loadUserInfo()
-    }
 
-    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
-        return true
-    }
+        binding = ActivityTeacherMainPageBinding.inflate(layoutInflater)
+        setContentView(binding.root)
 
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        when (item.itemId) {
-            android.R.id.home -> activityMainPageBinding.drawerLayout.openDrawer(GravityCompat.START)
-            R.id.add -> Toast.makeText(this, "You clicked Backup", Toast.LENGTH_SHORT).show()
-            R.id.delete -> Toast.makeText(this, "You clicked Delete", Toast.LENGTH_SHORT).show()
-            R.id.settings -> Toast.makeText(this, "You clicked Settings", Toast.LENGTH_SHORT).show()
-        }
-        return true
-    }
-
-    override fun onBackPressed() {
-        if (lastBack == 0L || System.currentTimeMillis() - lastBack > 2000) {
-            Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show()
-            lastBack = System.currentTimeMillis()
-        } else {
-            val serviceIntent = Intent(MyApplication.context, MqttListenService::class.java)
-            stopService(serviceIntent)
-            finish()
-        }
-    }
+        val navView: BottomNavigationView = binding.navView
 
-    private fun saveLoginInfo() {
-        val accountName = LoginConfiguration.login_username
-        val accountPassword = LoginConfiguration.login_password
-        val sp = getSharedPreferences("account", Context.MODE_PRIVATE)
-        with(sp.edit()) {
-            putString("accountName", accountName)
-            putString("accountPassword", accountPassword)
-            apply()
-        }
-        Log.d("LoginActivity", "save info:name:$accountName,password:$accountPassword")
+        val navController = findNavController(R.id.nav_host_fragment_activity_teacher_main_page)
+        navView.setupWithNavController(navController)
     }
 }

+ 36 - 0
app/src/main/java/org/brynhild/graduation/activity/teacher/ui/clazz/ClazzFragment.kt

@@ -0,0 +1,36 @@
+package org.brynhild.graduation.activity.teacher.ui.clazz
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import org.brynhild.graduation.databinding.FragmentClazzBinding
+
+class ClazzFragment : Fragment() {
+
+    private var _binding: FragmentClazzBinding? = null
+
+    // This property is only valid between onCreateView and
+    // onDestroyView.
+    private val binding get() = _binding!!
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View {
+
+        _binding = FragmentClazzBinding.inflate(inflater, container, false)
+        val root: View = binding.root
+
+        val textView: TextView = binding.textNotifications
+        return root
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
+    }
+}

+ 176 - 0
app/src/main/java/org/brynhild/graduation/activity/teacher/ui/sign/SignInFragment.kt

@@ -0,0 +1,176 @@
+package org.brynhild.graduation.activity.teacher.ui.sign
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.webkit.WebSettings
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import android.widget.Toast
+import androidx.core.content.ContextCompat
+import androidx.fragment.app.Fragment
+import com.google.gson.Gson
+import org.brynhild.graduation.common.config.LoginConfiguration
+import org.brynhild.graduation.common.config.MyApplication
+import org.brynhild.graduation.common.transfer.Result
+import org.brynhild.graduation.common.transfer.bo.timetable.StatisticInfo
+import org.brynhild.graduation.common.transfer.dto.FileInfo
+import org.brynhild.graduation.common.transfer.handler.ResponseHandler
+import org.brynhild.graduation.common.transfer.utils.ServiceCreator
+import org.brynhild.graduation.common.transfer.vo.timetable.AdminQueryStudentStatistic
+import org.brynhild.graduation.common.utils.FileDownloadUtil
+import org.brynhild.graduation.common.utils.JsonUtils
+import org.brynhild.graduation.databinding.FragmentSignInTeacherBinding
+import org.brynhild.graduation.service.http.CommonService
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class SignInFragment : Fragment() {
+
+        private var _binding: FragmentSignInTeacherBinding? = null
+
+    // This property is only valid between onCreateView and
+    // onDestroyView.
+    private val binding get() = _binding!!
+
+    @SuppressLint("SetJavaScriptEnabled")
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View {
+
+        _binding = FragmentSignInTeacherBinding.inflate(inflater, container, false)
+        val root: View = binding.root
+
+        val webSettings: WebSettings = binding.backupChart.settings
+        webSettings.domStorageEnabled = true
+        webSettings.javaScriptEnabled = true
+        webSettings.javaScriptCanOpenWindowsAutomatically = true
+        webSettings.setSupportZoom(false)
+        webSettings.displayZoomControls = false
+        binding.backupChart.setBackgroundColor(ContextCompat.getColor(MyApplication.context, android.R.color.transparent))
+        binding.backupChart.loadUrl("file:///android_asset/echarts.html")
+        binding.backupChart.webViewClient = object : WebViewClient() {
+            override fun onPageFinished(view: WebView?, url: String?) {
+                super.onPageFinished(view, url)
+                loadStatisticInfo()
+            }
+        }
+
+        bindOnClick()
+
+        return root
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
+    }
+
+    private fun bindOnClick(){
+        binding.downloadStatistic.setOnClickListener {
+            val service= ServiceCreator.create(CommonService::class.java)
+            val handler=object: Callback<Result> {
+                override fun onResponse(call: Call<Result>, response: Response<Result>) {
+                    ResponseHandler.handle(response,{
+                        val gson= Gson()
+                        val list=ArrayList<FileInfo>()
+                        for(item in it.data as List<*>){
+                            val json=gson.toJson(item)
+                            val info= JsonUtils.fromJson<FileInfo>(json)
+                            if(info!=null){
+                                list.add(info)
+                            }
+                        }
+                        if(list.size==1){
+                            val info=list[0]
+                            val downLoadName="student-${LoginConfiguration.userInfo!!.user.id}.docx"
+                            println("download:${info.path}")
+                            FileDownloadUtil.downLoad(info.path,downLoadName){
+                                Toast.makeText(this@SignInFragment.context,"文件下载完成", Toast.LENGTH_SHORT).show()
+                            }
+                        }
+                    },{
+                        ResponseHandler.showMessage(it)
+                    })
+                }
+
+                override fun onFailure(call: Call<Result>, t: Throwable) {
+                    t.printStackTrace()
+                }
+            }
+
+            val data= AdminQueryStudentStatistic(LoginConfiguration.userInfo!!.user.id)
+            service.generateStudentStatistic(LoginConfiguration.userInfo!!.token,data).enqueue(handler)
+
+        }
+    }
+
+
+    private fun loadStatisticInfo() {
+        val service= ServiceCreator.create(CommonService::class.java)
+        val handler=object: Callback<Result> {
+            override fun onResponse(call: Call<Result>, response: Response<Result>) {
+                ResponseHandler.handle(response,{
+                    val gson= Gson()
+                    val list=ArrayList<StatisticInfo>()
+                    println(gson.toJson(it))
+                    for(item in it.data as List<*>){
+                        val json=gson.toJson(item)
+                        val info= JsonUtils.fromJson<StatisticInfo>(json)
+                        if(info!=null){
+                            list.add(info)
+                        }
+                    }
+                    renderStatisticInfoList(list)
+                },{
+                    ResponseHandler.showMessage(it)
+                })
+            }
+
+            override fun onFailure(call: Call<Result>, t: Throwable) {
+                t.printStackTrace()
+            }
+        }
+
+        val data= AdminQueryStudentStatistic(LoginConfiguration.userInfo!!.user.id)
+        service.queryStudentStatistic(LoginConfiguration.userInfo!!.token,data).enqueue(handler)
+
+    }
+
+    private fun renderStatisticInfoList(list:List<StatisticInfo>){
+        var first=true
+        val nameBuilder=StringBuilder()
+        val rateBuilder=StringBuilder()
+
+        for(item in list){
+            if(!first){
+                nameBuilder.append(",")
+                rateBuilder.append(",")
+            }
+            nameBuilder.append(item.course.name)
+            rateBuilder.append(item.rate*100)
+            first=false
+        }
+        val chartOptions = """
+            setChartOptions(
+                {
+                    xAxis: {type: 'value'}, 
+                    yAxis: {type: 'category', data: [${nameBuilder}]},
+                    series: [{
+                        type: 'bar',
+                        data: [${rateBuilder}],
+                        label: {show: true, position: 'inside'}
+                    }]
+                }
+                );
+                """
+        println(chartOptions)
+        binding.backupChart.evaluateJavascript(chartOptions, null)
+    }
+
+}

+ 36 - 0
app/src/main/java/org/brynhild/graduation/activity/teacher/ui/timetable/TimetableFragment.kt

@@ -0,0 +1,36 @@
+package org.brynhild.graduation.activity.teacher.ui.timetable
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import org.brynhild.graduation.databinding.FragmentTimetableTeacherBinding
+
+class TimetableFragment : Fragment() {
+
+    private var _binding: FragmentTimetableTeacherBinding? = null
+
+    // This property is only valid between onCreateView and
+    // onDestroyView.
+    private val binding get() = _binding!!
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View {
+
+        _binding = FragmentTimetableTeacherBinding.inflate(inflater, container, false)
+        val root: View = binding.root
+
+        val textView: TextView = binding.textDashboard
+        return root
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
+    }
+}

+ 34 - 0
app/src/main/java/org/brynhild/graduation/activity/teacher/ui/user/UserFragment.kt

@@ -0,0 +1,34 @@
+package org.brynhild.graduation.activity.teacher.ui.user
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import org.brynhild.graduation.databinding.FragmentUserTeacherBinding
+
+class UserFragment : Fragment() {
+
+    private var _binding: FragmentUserTeacherBinding? = null
+
+    // This property is only valid between onCreateView and
+    // onDestroyView.
+    private val binding get() = _binding!!
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View {
+
+        _binding = FragmentUserTeacherBinding.inflate(inflater, container, false)
+        val root: View = binding.root
+
+        return root
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
+    }
+}

+ 0 - 8
app/src/main/java/org/brynhild/graduation/activity/user/UserActivity.kt

@@ -24,14 +24,6 @@ class UserActivity : BaseActivity() {
         val navView: BottomNavigationView = binding.navView
 
         val navController = findNavController(R.id.nav_host_fragment_activity_user)
-        // Passing each menu ID as a set of Ids because each
-        // menu should be considered as top level destinations.
-        val appBarConfiguration = AppBarConfiguration(
-            setOf(
-                R.id.navigation_timetable, R.id.navigation_sign_in, R.id.navigation_user
-            )
-        )
-//        setupActionBarWithNavController(navController, appBarConfiguration)
         navView.setupWithNavController(navController)
     }
 }

+ 0 - 194
app/src/main/java/org/brynhild/graduation/activity/user/UserMainPageActivity.kt

@@ -1,194 +0,0 @@
-package org.brynhild.graduation.activity.user
-
-
-import android.Manifest
-import android.content.Context
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.os.Build
-import android.os.Bundle
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.Menu
-import android.view.MenuItem
-import android.widget.Toast
-import androidx.core.view.GravityCompat
-import androidx.recyclerview.widget.GridLayoutManager
-import com.bumptech.glide.Glide
-import com.google.gson.Gson
-import org.brynhild.graduation.R
-import org.brynhild.graduation.activity.common.AccountInfoActivity
-import org.brynhild.graduation.activity.common.BaseActivity
-import org.brynhild.graduation.activity.common.LoginActivity
-import org.brynhild.graduation.common.config.LoginConfiguration
-import org.brynhild.graduation.common.config.MyApplication
-import org.brynhild.graduation.common.constant.FileStorageConstant
-import org.brynhild.graduation.common.transfer.Result
-import org.brynhild.graduation.common.transfer.handler.ResponseHandler
-import org.brynhild.graduation.common.transfer.utils.ServiceCreator
-import org.brynhild.graduation.common.utils.JsonUtils
-import org.brynhild.graduation.databinding.ActivityMainPageBinding
-import org.brynhild.graduation.databinding.ActivityUserMainPageBinding
-import org.brynhild.graduation.databinding.NavHeaderBinding
-import org.brynhild.graduation.network.entiity.User
-import org.brynhild.graduation.service.http.AccountService
-import org.brynhild.graduation.service.mqtt.MqttListenService
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-
-class UserMainPageActivity : BaseActivity() {
-
-    //
-    private var currentPage = 0
-
-    private var lastBack = 0L
-    private lateinit var activityMainPageBinding: ActivityUserMainPageBinding
-    private lateinit var navHeaderBinding: NavHeaderBinding
-
-    private fun getPermission() {
-        if (Build.VERSION.SDK_INT >= 23) {
-            val REQUEST_CODE_CONTACT = 101
-            val permissions = arrayOf<String>(Manifest.permission.WRITE_EXTERNAL_STORAGE)
-            //验证是否许可权限
-            for (str in permissions) {
-                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
-                    //申请权限
-                    this.requestPermissions(permissions, REQUEST_CODE_CONTACT)
-                }
-            }
-            FileStorageConstant.initStorage()
-        }
-    }
-
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        activityMainPageBinding = ActivityUserMainPageBinding.inflate(LayoutInflater.from(this))
-        setContentView(activityMainPageBinding.root)
-        setSupportActionBar(activityMainPageBinding.toolBar)
-        supportActionBar?.let {
-            it.setDisplayHomeAsUpEnabled(true)
-            it.setHomeAsUpIndicator(R.drawable.ic_menu)
-            it.title = "Favorite"
-        }
-
-        getPermission()
-
-        val layoutManager = GridLayoutManager(this, 2)
-        activityMainPageBinding.recyclerView.layoutManager = layoutManager
-        activityMainPageBinding.navView.setCheckedItem(R.id.navFavorite)
-        currentPage = R.id.navFavorite
-
-        activityMainPageBinding.navView.setNavigationItemSelectedListener { it ->
-            when (it.itemId) {
-                R.id.navExit -> {
-                    LoginConfiguration.login_password = ""
-                    saveLoginInfo()
-                    val i = Intent(MyApplication.context, LoginActivity::class.java)
-                    startActivity(i)
-                    finish()
-                }
-            }
-            activityMainPageBinding.drawerLayout.closeDrawers()
-            true
-        }
-        activityMainPageBinding.swipeRefresh.setOnRefreshListener {
-            Thread {
-                when (currentPage) {
-
-                    R.id.navExit -> {
-                        LoginConfiguration.login_password = ""
-                        saveLoginInfo()
-                        val serviceIntent =
-                            Intent(MyApplication.context, MqttListenService::class.java)
-                        stopService(serviceIntent)
-                        val i = Intent(MyApplication.context, LoginActivity::class.java)
-                        startActivity(i)
-                        finish()
-                    }
-                }
-
-            }.start()
-        }
-        val headerView = activityMainPageBinding.navView.inflateHeaderView(R.layout.nav_header)
-        navHeaderBinding = NavHeaderBinding.bind(headerView)
-        navHeaderBinding.navProfile.setOnClickListener {
-            val intent = Intent(this, AccountInfoActivity::class.java)
-            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
-            this.startActivity(intent)
-        }
-    }
-
-    private fun loadUserInfo() {
-        Thread {
-            val service = ServiceCreator.create(AccountService::class.java)
-            service.accountInfo(LoginConfiguration.userInfo!!.token)
-                .enqueue(object : Callback<Result> {
-                    override fun onResponse(call: Call<Result>, response: Response<Result>) {
-                        ResponseHandler.handle(response, {
-                            val json = Gson().toJson(it.data)
-                            val user = JsonUtils.fromJson<User>(json)
-                            if (user != null) {
-                                navHeaderBinding.userText.text = user.name
-                                navHeaderBinding.mailText.text = user.email
-                                Glide.with(this@UserMainPageActivity)
-                                    .load(user.avatar ?: R.drawable.nav_icon_default)
-                                    .into(navHeaderBinding.iconImage)
-                            }
-                        }, {
-                            Toast.makeText(MyApplication.context, "请求用户基本信息失败", Toast.LENGTH_SHORT)
-                                .show()
-                        })
-                    }
-
-                    override fun onFailure(call: Call<Result>, t: Throwable) {
-                        Toast.makeText(MyApplication.context, "请求用户基本信息失败", Toast.LENGTH_SHORT)
-                            .show()
-                    }
-                })
-        }.start()
-    }
-
-    override fun onResume() {
-        super.onResume()
-        loadUserInfo()
-    }
-
-    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
-        return true
-    }
-
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        when (item.itemId) {
-            android.R.id.home -> activityMainPageBinding.drawerLayout.openDrawer(GravityCompat.START)
-            R.id.add -> Toast.makeText(this, "You clicked Backup", Toast.LENGTH_SHORT).show()
-            R.id.delete -> Toast.makeText(this, "You clicked Delete", Toast.LENGTH_SHORT).show()
-            R.id.settings -> Toast.makeText(this, "You clicked Settings", Toast.LENGTH_SHORT).show()
-        }
-        return true
-    }
-
-    override fun onBackPressed() {
-        if (lastBack == 0L || System.currentTimeMillis() - lastBack > 2000) {
-            Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show()
-            lastBack = System.currentTimeMillis()
-        } else {
-            val serviceIntent = Intent(MyApplication.context, MqttListenService::class.java)
-            stopService(serviceIntent)
-            finish()
-        }
-    }
-
-    private fun saveLoginInfo() {
-        val accountName = LoginConfiguration.login_username
-        val accountPassword = LoginConfiguration.login_password
-        val sp = getSharedPreferences("account", Context.MODE_PRIVATE)
-        with(sp.edit()) {
-            putString("accountName", accountName)
-            putString("accountPassword", accountPassword)
-            apply()
-        }
-        Log.d("LoginActivity", "save info:name:$accountName,password:$accountPassword")
-    }
-}

+ 0 - 3
app/src/main/java/org/brynhild/graduation/activity/user/ui/sign/SignInFragment.kt

@@ -8,20 +8,17 @@ import android.view.ViewGroup
 import android.webkit.WebSettings
 import android.webkit.WebView
 import android.webkit.WebViewClient
-import android.widget.TextView
 import android.widget.Toast
 import androidx.core.content.ContextCompat
 import androidx.fragment.app.Fragment
 import com.google.gson.Gson
 import org.brynhild.graduation.common.config.LoginConfiguration
 import org.brynhild.graduation.common.config.MyApplication
-import org.brynhild.graduation.common.constant.StatisticConstant
 import org.brynhild.graduation.common.transfer.Result
 import org.brynhild.graduation.common.transfer.bo.timetable.StatisticInfo
 import org.brynhild.graduation.common.transfer.dto.FileInfo
 import org.brynhild.graduation.common.transfer.handler.ResponseHandler
 import org.brynhild.graduation.common.transfer.utils.ServiceCreator
-import org.brynhild.graduation.common.transfer.vo.timetable.AdminQueryClassStatistic
 import org.brynhild.graduation.common.transfer.vo.timetable.AdminQueryStudentStatistic
 import org.brynhild.graduation.common.utils.FileDownloadUtil
 import org.brynhild.graduation.common.utils.JsonUtils

+ 27 - 49
app/src/main/res/layout/activity_teacher_main_page.xml

@@ -1,54 +1,32 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/drawerLayout"
+    android:id="@+id/container"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".TimeTableActivity">
-
-    <androidx.coordinatorlayout.widget.CoordinatorLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-        <com.google.android.material.appbar.AppBarLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
-
-            <androidx.appcompat.widget.Toolbar
-                android:id="@+id/toolBar"
-                android:layout_width="match_parent"
-                android:layout_height="?attr/actionBarSize"
-                android:background="@color/majorBlue"
-                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
-                app:layout_scrollFlags="scroll|enterAlways|snap"
-                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
-        </com.google.android.material.appbar.AppBarLayout>
-
-        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-            android:id="@+id/swipeRefresh"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            app:layout_behavior="@string/appbar_scrolling_view_behavior">
-
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/recyclerView"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                app:layout_behavior="@string/appbar_scrolling_view_behavior" />
-
-
-        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
-    </androidx.coordinatorlayout.widget.CoordinatorLayout>
-
-    <com.google.android.material.navigation.NavigationView
-        android:id="@+id/navView"
+    android:layout_height="match_parent">
+
+    <com.google.android.material.bottomnavigation.BottomNavigationView
+        android:id="@+id/nav_view"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="0dp"
+        android:layout_marginEnd="0dp"
+        android:background="?android:attr/windowBackground"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:menu="@menu/teacher_bottom_nav_menu" />
+
+    <fragment
+        android:id="@+id/nav_host_fragment_activity_teacher_main_page"
+        android:name="androidx.navigation.fragment.NavHostFragment"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_gravity="start"
-        app:menu="@menu/teacher_nav_menu" />
-    <!--        app:headerLayout="@layout/nav_header"-->
-    <!--        />-->
-
-</androidx.drawerlayout.widget.DrawerLayout>
+        app:defaultNavHost="true"
+        app:layout_constraintBottom_toTopOf="@id/nav_view"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:navGraph="@navigation/mobile_navigation2" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 2
app/src/main/res/layout/activity_user_main_page.xml

@@ -5,8 +5,7 @@
     android:id="@+id/drawerLayout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:context=".activity.user.UserMainPageActivity">
+    android:orientation="vertical">
 
     <androidx.coordinatorlayout.widget.CoordinatorLayout
         android:layout_width="match_parent"

+ 22 - 0
app/src/main/res/layout/fragment_clazz.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".activity.teacher.ui.clazz.ClazzFragment">
+
+    <TextView
+        android:id="@+id/text_notifications"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="8dp"
+        android:layout_marginEnd="8dp"
+        android:textAlignment="center"
+        android:textSize="20sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
app/src/main/res/layout/fragment_sign_in.xml

@@ -5,7 +5,7 @@
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".activity.user.ui.sign.SignInFragment">
+    tools:context=".activity.teacher.ui.sign.SignInFragment">
 
     <WebView
         android:id="@+id/backupChart"

+ 29 - 0
app/src/main/res/layout/fragment_sign_in_teacher.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".activity.teacher.ui.sign.SignInFragment">
+
+    <WebView
+        android:id="@+id/backupChart"
+        android:layout_width="match_parent"
+        android:layout_height="600dp" />
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:orientation="horizontal">
+
+        <Button
+            android:id="@+id/download_statistic"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="10dp"
+            android:text="下载结果" />
+
+    </LinearLayout>
+
+</LinearLayout>

+ 22 - 0
app/src/main/res/layout/fragment_timetable_teacher.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".activity.teacher.ui.timetable.TimetableFragment">
+
+    <TextView
+        android:id="@+id/text_dashboard"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="8dp"
+        android:layout_marginEnd="8dp"
+        android:textAlignment="center"
+        android:textSize="20sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 22 - 0
app/src/main/res/layout/fragment_user_teacher.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".activity.teacher.ui.user.UserFragment">
+
+    <TextView
+        android:id="@+id/text_home"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="8dp"
+        android:layout_marginEnd="8dp"
+        android:textAlignment="center"
+        android:textSize="20sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 24 - 0
app/src/main/res/menu/teacher_bottom_nav_menu.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/navigation_timetable"
+        android:icon="@drawable/nav_timetable"
+        android:title="@string/title_timetable" />
+
+    <item
+        android:id="@+id/navigation_clazz"
+        android:icon="@drawable/nav_class"
+        android:title="@string/title_class" />
+
+    <item
+        android:id="@+id/navigation_sign_in"
+        android:icon="@drawable/nav_sign_in"
+        android:title="@string/title_sign_in" />
+
+    <item
+        android:id="@+id/navigation_user"
+        android:icon="@drawable/nav_user"
+        android:title="@string/title_user" />
+
+</menu>

+ 1 - 1
app/src/main/res/navigation/mobile_navigation.xml

@@ -13,7 +13,7 @@
 
     <fragment
         android:id="@+id/navigation_sign_in"
-        android:name="org.brynhild.graduation.activity.user.ui.sign.SignInFragment"
+        android:name="org.brynhild.graduation.activity.teacher.ui.sign.SignInFragment"
         android:label="@string/title_sign_in"
         tools:layout="@layout/fragment_sign_in" />
 

+ 31 - 0
app/src/main/res/navigation/mobile_navigation2.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/mobile_navigation2"
+    app:startDestination="@+id/navigation_timetable">
+
+    <fragment
+        android:id="@+id/navigation_timetable"
+        android:name="org.brynhild.graduation.activity.teacher.ui.timetable.TimetableFragment"
+        android:label="@string/title_timetable"
+        tools:layout="@layout/fragment_timetable_teacher" />
+
+    <fragment
+        android:id="@+id/navigation_clazz"
+        android:name="org.brynhild.graduation.activity.teacher.ui.clazz.ClazzFragment"
+        android:label="@string/title_class"
+        tools:layout="@layout/fragment_clazz" />
+
+    <fragment
+        android:id="@+id/navigation_sign_in"
+        android:name="org.brynhild.graduation.activity.teacher.ui.sign.SignInFragment"
+        android:label="@string/title_sign_in"
+        tools:layout="@layout/fragment_sign_in_teacher" />
+
+    <fragment
+        android:id="@+id/navigation_user"
+        android:name="org.brynhild.graduation.activity.teacher.ui.user.UserFragment"
+        android:label="@string/title_user"
+        tools:layout="@layout/fragment_user_teacher" />
+</navigation>

+ 5 - 0
app/src/main/res/values/strings.xml

@@ -14,6 +14,11 @@
     <string name="privacy_policy"><u>《隐私政策》</u></string>
     <string name="title_activity_user">UserActivity</string>
     <string name="title_timetable">课程表</string>
+    <string name="title_class">教学班</string>
     <string name="title_sign_in">出勤记录</string>
     <string name="title_user">个人信息</string>
+    <string name="title_activity_teacher_main_page">TeacherMainPageActivity</string>
+    <string name="title_home">Home</string>
+    <string name="title_dashboard">Dashboard</string>
+    <string name="title_notifications">Notifications</string>
 </resources>