From 24b12f97783b3838fb07740ea88206e268d93869 Mon Sep 17 00:00:00 2001
From: pan <1029559041@qq.com>
Date: Wed, 19 May 2021 21:18:42 +0800
Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=89=8D=E5=8F=B0=E9=83=A8?=
=?UTF-8?q?=E5=88=86=E8=BE=B9=E6=A1=86=E9=A2=9C=E8=89=B2=20=E5=89=8D?=
=?UTF-8?q?=E5=90=8E=E5=8F=B0=E7=9A=84=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83?=
=?UTF-8?q?=E7=9A=84=E4=B8=AA=E4=BA=BA=E5=90=8D=E7=89=87=E8=B0=83=E6=95=B4?=
=?UTF-8?q?=E3=80=82=20=E5=90=8E=E5=8F=B0=E5=A2=9E=E5=8A=A0=E9=83=A8?=
=?UTF-8?q?=E9=97=A8=E5=B9=B2=E4=BA=8B=E7=AE=A1=E7=90=86=E7=95=8C=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
background/src/main/AndroidManifest.xml | 3 +
.../main/model/ManagementOfficerModel.kt | 123 +++++++++++++
.../main/ui/ManagementOfficerActivity.kt | 172 ++++++++++++++++++
background/src/main/res/values-en/strings.xml | 6 +
background/src/main/res/values-zh/strings.xml | 6 +
background/src/main/res/values/strings.xml | 6 +
.../activity/ui/ActivityDetailActivity.kt | 6 +-
.../association/ui/RegAssociationActivity.kt | 3 +-
.../main/java/com/gyf/csams/uikit/BaseView.kt | 2 +-
.../main/java/com/gyf/lib/uikit/Profile.kt | 9 +-
10 files changed, 326 insertions(+), 10 deletions(-)
create mode 100644 background/src/main/java/com/gyf/csams/main/model/ManagementOfficerModel.kt
create mode 100644 background/src/main/java/com/gyf/csams/main/ui/ManagementOfficerActivity.kt
diff --git a/background/src/main/AndroidManifest.xml b/background/src/main/AndroidManifest.xml
index 9362ec8..8324f49 100644
--- a/background/src/main/AndroidManifest.xml
+++ b/background/src/main/AndroidManifest.xml
@@ -29,6 +29,9 @@
+
\ No newline at end of file
diff --git a/background/src/main/java/com/gyf/csams/main/model/ManagementOfficerModel.kt b/background/src/main/java/com/gyf/csams/main/model/ManagementOfficerModel.kt
new file mode 100644
index 0000000..ff2fcb5
--- /dev/null
+++ b/background/src/main/java/com/gyf/csams/main/model/ManagementOfficerModel.kt
@@ -0,0 +1,123 @@
+package com.gyf.csams.main.model
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.gyf.lib.util.randomChinese
+import com.gyf.lib.util.randomNum
+import com.orhanobut.logger.Logger
+import kotlinx.coroutines.launch
+
+enum class ColumnType {
+ Text,
+ DropMenu
+}
+
+/**
+ * 职务
+ *
+ * @property desc
+ */
+enum class Duty(val desc: String) {
+ Minister("部长"),
+ Manager("干事")
+}
+
+/**
+ * 人员信息
+ *
+ * @property name 名字
+ * @property studentId 学号
+ * @property mobile 手机号
+ * @property duty 职务
+ * @property counselor 导员
+ */
+data class OfficerVo(
+ val name: String,
+ val studentId: String,
+ val mobile: String,
+ val duty: Duty,
+ val counselor: String
+)
+
+data class AllOfficerVo(
+ val secretariat: MutableList,
+ val propaganda: MutableList,
+ val publicRelationsDepartment: MutableList
+)
+
+/**
+ * 部门干事数据状态管理
+ *
+ */
+class ManagementOfficerModel : ViewModel() {
+ private val _data = MutableLiveData()
+ val data: LiveData = _data
+
+ init {
+ load()
+ }
+
+ private fun replace(
+ list: MutableList,
+ index: Int,
+ callback: (s: MutableList) -> Unit
+ ) {
+ val s = mutableListOf()
+ list[index] = list[index].copy(duty = Duty.Minister)
+ s.add(list[index])
+ s.addAll(list.filter { officerVo -> officerVo != list[index] }
+ .map { officerVo -> officerVo.copy(duty = Duty.Manager) })
+ callback(s)
+ }
+
+ fun updateDuty(list: MutableList, index: Int) {
+ _data.value?.apply {
+ Logger.i("$secretariat")
+ when (list) {
+ secretariat -> replace(list = list, index = index) {
+ _data.postValue(copy(secretariat = it))
+ }
+ propaganda -> replace(list = list, index = index) {
+ _data.postValue(copy(propaganda = it))
+ }
+ publicRelationsDepartment -> replace(list = list, index = index) {
+ _data.postValue(copy(publicRelationsDepartment = it))
+ }
+ }
+
+
+ }
+
+ }
+
+ /**
+ * TODO 加载部门成员
+ *
+ */
+ private fun load() {
+ viewModelScope.launch {
+ val officerVoList = mutableListOf()
+ val baseSize = 3
+ val peopleSize = 5
+ repeat(peopleSize * baseSize) {
+ officerVoList.add(
+ OfficerVo(
+ name = randomChinese(3), studentId = randomNum(8), mobile = randomNum(11),
+ if (it % peopleSize == 0) Duty.Minister else Duty.Manager, counselor = ""
+ )
+ )
+ }
+ val all = officerVoList.chunked(peopleSize)
+ _data.postValue(
+ AllOfficerVo(
+ secretariat = all[0].toMutableList(),
+ propaganda = all[1].toMutableList(),
+ publicRelationsDepartment = all[2].toMutableList()
+ )
+ )
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/background/src/main/java/com/gyf/csams/main/ui/ManagementOfficerActivity.kt b/background/src/main/java/com/gyf/csams/main/ui/ManagementOfficerActivity.kt
new file mode 100644
index 0000000..3928eea
--- /dev/null
+++ b/background/src/main/java/com/gyf/csams/main/ui/ManagementOfficerActivity.kt
@@ -0,0 +1,172 @@
+package com.gyf.csams.main.ui
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.annotation.StringRes
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.material.DropdownMenu
+import androidx.compose.material.DropdownMenuItem
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.*
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.unit.dp
+import androidx.lifecycle.viewmodel.compose.viewModel
+import com.gyf.csams.R
+import com.gyf.csams.main.model.Duty
+import com.gyf.csams.main.model.ManagementOfficerModel
+import com.gyf.csams.main.model.MinisterVo
+import com.gyf.csams.main.model.OfficerVo
+import com.gyf.lib.uikit.*
+import com.orhanobut.logger.Logger
+
+/**
+ * 部门干事管理
+ *
+ */
+class ManagementOfficerActivity : ComponentActivity() {
+ @ExperimentalFoundationApi
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ Body { scaffoldState ->
+ MainColumnFrame(background = { /*TODO*/ }) {
+ val weight = 1 / 3F
+ val model: ManagementOfficerModel = viewModel()
+ val data by model.data.observeAsState()
+ Logger.i("$data")
+ data?.apply {
+ Table(
+ modifier = Modifier
+ .weight(weight = weight),
+ id = R.string.secretariat,
+ officerVoList = secretariat
+ )
+ Table(
+ modifier = Modifier
+ .weight(weight = weight),
+ id = R.string.propaganda_department,
+ officerVoList = propaganda
+ )
+ Table(
+ modifier = Modifier
+ .weight(weight = weight),
+ id = R.string.public_relations_department,
+ officerVoList = publicRelationsDepartment
+ )
+ }
+
+ ShowSnackbar(scaffoldState = scaffoldState)
+ }
+ }
+ }
+ }
+
+ @Composable
+ private fun BoxItem(content: @Composable () -> Unit) {
+ Box(
+ Modifier
+ .width(150.dp)
+ .height(40.dp)
+ .border(
+ width = 1.dp,
+ color = MaterialTheme.colors.onBackground
+ )
+ .padding(vertical = 10.dp),
+ contentAlignment = Alignment.Center
+ ) {
+ content()
+ }
+ }
+
+ /**
+ *
+ * 表格
+ */
+ @ExperimentalFoundationApi
+ @Composable
+ private fun Table(
+ modifier: Modifier = Modifier,
+ model: ManagementOfficerModel = viewModel(),
+ scaffoldModel: ScaffoldModel = viewModel(),
+ @StringRes id: Int,
+ officerVoList: MutableList,
+ ) {
+ Column(
+ modifier = modifier
+ .padding(horizontal = 10.dp)
+ .border(width = 1.dp, color = MaterialTheme.colors.onBackground),
+ verticalArrangement = Arrangement.SpaceEvenly
+ ) {
+ val context = LocalContext.current
+
+ Spacer(modifier = Modifier.weight(0.05F))
+ Text(text = context.getString(id), modifier = Modifier.weight(0.1F))
+ Spacer(modifier = Modifier.weight(0.05F))
+ val columnSize = 4
+
+ LazyRow(modifier = Modifier.weight(0.6F)) {
+ officerVoList.withIndex().forEach {
+ item {
+ var expanded by remember {
+ mutableStateOf(false)
+ }
+ Profile(
+ modifier = Modifier
+ .width(200.dp)
+ .fillMaxHeight()
+ .border(width = 1.dp, color = MaterialTheme.colors.onBackground),
+ personInfoVo =
+ MinisterVo(
+ name = it.value.name,
+ duty = it.value.duty.desc,
+ headImg = "",
+ desc = it.value.mobile
+ )
+ ) {
+
+ Text(
+ text = it.value.duty.desc,
+ modifier = Modifier.clickable(onClick = {
+ if (it.value.duty.desc != Duty.Minister.desc) expanded =
+ true else scaffoldModel
+ .update(message = context.getString(R.string.update_duty_error))
+ })
+ )
+// Text(
+// text = it.duty.desc,
+// modifier = Modifier.clickable(onClick = {
+// if (duty.desc != Duty.Minister.desc) expanded =
+// true else scaffoldModel
+// .update(message = context.getString(R.string.update_duty_error))
+// })
+// )
+ DropdownMenu(
+ expanded = expanded,
+ onDismissRequest = { /*TODO*/ }) {
+ DropdownMenuItem(onClick = {
+ model.updateDuty(list = officerVoList, index = it.index)
+ expanded = false
+ }) {
+ Text(text = Duty.Minister.desc)
+ }
+ }
+ }
+ }
+ }
+ }
+
+ Spacer(modifier = Modifier.weight(0.05F))
+
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/background/src/main/res/values-en/strings.xml b/background/src/main/res/values-en/strings.xml
index a647dc1..5e5c3e9 100644
--- a/background/src/main/res/values-en/strings.xml
+++ b/background/src/main/res/values-en/strings.xml
@@ -11,4 +11,10 @@
专门负责学校社团各种活动的宣传,出海报以及网络上的宣传工作。 负责学生思想政治教育和学生会各项宣传报道工作的组织和规划。 围绕学院各阶段的中心工作和学院组织和各项活动,做好宣传鼓动工作。 组织学生参加社团开设的学术讲座和学术活动,督促和指导各班学习委员开展工作。
部门介绍
+ 名字
+ 学号
+ 手机号
+ 职务
+ 导员
+ 只能调整干事职务!
\ No newline at end of file
diff --git a/background/src/main/res/values-zh/strings.xml b/background/src/main/res/values-zh/strings.xml
index a647dc1..5e5c3e9 100644
--- a/background/src/main/res/values-zh/strings.xml
+++ b/background/src/main/res/values-zh/strings.xml
@@ -11,4 +11,10 @@
专门负责学校社团各种活动的宣传,出海报以及网络上的宣传工作。 负责学生思想政治教育和学生会各项宣传报道工作的组织和规划。 围绕学院各阶段的中心工作和学院组织和各项活动,做好宣传鼓动工作。 组织学生参加社团开设的学术讲座和学术活动,督促和指导各班学习委员开展工作。
部门介绍
+ 名字
+ 学号
+ 手机号
+ 职务
+ 导员
+ 只能调整干事职务!
\ No newline at end of file
diff --git a/background/src/main/res/values/strings.xml b/background/src/main/res/values/strings.xml
index a647dc1..5e5c3e9 100644
--- a/background/src/main/res/values/strings.xml
+++ b/background/src/main/res/values/strings.xml
@@ -11,4 +11,10 @@
专门负责学校社团各种活动的宣传,出海报以及网络上的宣传工作。 负责学生思想政治教育和学生会各项宣传报道工作的组织和规划。 围绕学院各阶段的中心工作和学院组织和各项活动,做好宣传鼓动工作。 组织学生参加社团开设的学术讲座和学术活动,督促和指导各班学习委员开展工作。
部门介绍
+ 名字
+ 学号
+ 手机号
+ 职务
+ 导员
+ 只能调整干事职务!
\ No newline at end of file
diff --git a/foreground/src/main/java/com/gyf/csams/activity/ui/ActivityDetailActivity.kt b/foreground/src/main/java/com/gyf/csams/activity/ui/ActivityDetailActivity.kt
index 27ba081..8b44fd0 100644
--- a/foreground/src/main/java/com/gyf/csams/activity/ui/ActivityDetailActivity.kt
+++ b/foreground/src/main/java/com/gyf/csams/activity/ui/ActivityDetailActivity.kt
@@ -261,7 +261,7 @@ class ActivityDetailActivity : ComponentActivity() {
// TODO 解决Build Warnning
Logger.i("$vo")
Box(
- modifier = modifier.border(width = 1.dp, color = MaterialTheme.colors.background),
+ modifier = modifier.border(width = 1.dp, color = MaterialTheme.colors.onBackground),
contentAlignment = Alignment.Center
) {
Image(
@@ -312,7 +312,7 @@ class ActivityDetailActivity : ComponentActivity() {
.fillMaxWidth()
.weight(0.8F)
.padding(10.dp)
- .border(width = 1.dp, color = MaterialTheme.colors.background)
+ .border(width = 1.dp, color = MaterialTheme.colors.onBackground)
) {
val listState = rememberLazyListState()
participant?.let {
@@ -407,7 +407,7 @@ class ActivityDetailActivity : ComponentActivity() {
modifier = Modifier
.weight(0.9F)
.padding(10.dp)
- .border(width = 1.dp, color = MaterialTheme.colors.background)
+ .border(width = 1.dp, color = MaterialTheme.colors.onBackground)
) {
val listState = rememberLazyListState()
val data by model.data.observeAsState()
diff --git a/foreground/src/main/java/com/gyf/csams/association/ui/RegAssociationActivity.kt b/foreground/src/main/java/com/gyf/csams/association/ui/RegAssociationActivity.kt
index 8828280..bb86cb0 100644
--- a/foreground/src/main/java/com/gyf/csams/association/ui/RegAssociationActivity.kt
+++ b/foreground/src/main/java/com/gyf/csams/association/ui/RegAssociationActivity.kt
@@ -25,7 +25,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
@@ -131,7 +130,7 @@ class RegAssociationActivity : ComponentActivity() {
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center, modifier = Modifier
.fillMaxSize()
- .border(width = 1.dp, color = Color.Black)
+ .border(width = 1.dp, color = MaterialTheme.colors.onBackground)
) {
if (uri == null) {
diff --git a/foreground/src/main/java/com/gyf/csams/uikit/BaseView.kt b/foreground/src/main/java/com/gyf/csams/uikit/BaseView.kt
index 987739c..0c0dea1 100644
--- a/foreground/src/main/java/com/gyf/csams/uikit/BaseView.kt
+++ b/foreground/src/main/java/com/gyf/csams/uikit/BaseView.kt
@@ -557,7 +557,7 @@ fun MyBottomAppBarPreview() {
Column(
modifier = Modifier
.weight(1F / arr.size)
- .border(width = 1.dp, color = MaterialTheme.colors.background)
+ .border(width = 1.dp, color = MaterialTheme.colors.onBackground)
) {
Row(
modifier = Modifier.fillMaxWidth(),
diff --git a/lib/src/main/java/com/gyf/lib/uikit/Profile.kt b/lib/src/main/java/com/gyf/lib/uikit/Profile.kt
index 77c5103..faed256 100644
--- a/lib/src/main/java/com/gyf/lib/uikit/Profile.kt
+++ b/lib/src/main/java/com/gyf/lib/uikit/Profile.kt
@@ -25,7 +25,8 @@ abstract class PersonInfoVo {
@Composable
fun Profile(
modifier: Modifier,
- personInfoVo: PersonInfoVo
+ personInfoVo: PersonInfoVo,
+ duty: @Composable () -> Unit = { Text(text = personInfoVo.duty) }
) {
var headImg: ImageBitmap? by remember {
mutableStateOf(null)
@@ -41,7 +42,7 @@ fun Profile(
modifier = Modifier
.fillMaxWidth()
.weight(0.7F)
- .border(width = 1.dp, color = MaterialTheme.colors.background),
+ .border(width = 1.dp, color = MaterialTheme.colors.onBackground),
horizontalArrangement = Arrangement.SpaceBetween
) {
headImg.let {
@@ -68,12 +69,12 @@ fun Profile(
modifier = Modifier
.weight(0.4F)
.fillMaxHeight()
- .border(width = 1.dp, color = MaterialTheme.colors.background),
+ .border(width = 1.dp, color = MaterialTheme.colors.onBackground),
verticalArrangement = Arrangement.SpaceEvenly,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = personInfoVo.name)
- Text(text = personInfoVo.duty)
+ duty()
}
}