diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/List.kt b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt new file mode 100644 index 0000000..855bea7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.xz.meterage.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/List.kt b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt new file mode 100644 index 0000000..855bea7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.xz.meterage.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 4174e94..7f43a7d 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -1,25 +1,44 @@ package com.casic.xz.meterage.fragment +import android.graphics.Color import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R -import com.casic.xz.meterage.extensions.combineFilePath +import com.casic.xz.meterage.callback.OnImageCompressListener +import com.casic.xz.meterage.extensions.combineImagePath +import com.casic.xz.meterage.extensions.compressImage +import com.casic.xz.meterage.extensions.reformat +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.FileType +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.FileUploadViewModel import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_mine.* +import java.io.File class MinePageFragment : KotlinBaseFragment() { + private lateinit var uploadViewModel: FileUploadViewModel private lateinit var noticeViewModel: NoticeViewModel + private lateinit var user: UserInfoModel.DataModel override fun initData() { val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -27,25 +46,51 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val user = it.data + this.user = it.data userNameView.text = user.name userUnitView.text = user.deptName if (user.avatar.isNullOrBlank()) { Glide.with(requireContext()) - .asBitmap() - .load(user.avatar.combineFilePath()) + .load(R.mipmap.default_avatar) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } else { Glide.with(requireContext()) - .asBitmap() - .load(R.mipmap.default_avatar) + .load(user.avatar.combineImagePath()) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + + uploadViewModel = ViewModelProvider(this)[FileUploadViewModel::class.java] + uploadViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data[0], + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data[0].combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.noticeList.observe(this) { @@ -79,15 +124,83 @@ } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadViewModel.uploadFile(file, FileType.IMAGE) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun initLayoutView(): Int = R.layout.fragment_mine override fun observeRequestState() { - + uploadViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/List.kt b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt new file mode 100644 index 0000000..855bea7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.xz.meterage.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 4174e94..7f43a7d 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -1,25 +1,44 @@ package com.casic.xz.meterage.fragment +import android.graphics.Color import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R -import com.casic.xz.meterage.extensions.combineFilePath +import com.casic.xz.meterage.callback.OnImageCompressListener +import com.casic.xz.meterage.extensions.combineImagePath +import com.casic.xz.meterage.extensions.compressImage +import com.casic.xz.meterage.extensions.reformat +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.FileType +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.FileUploadViewModel import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_mine.* +import java.io.File class MinePageFragment : KotlinBaseFragment() { + private lateinit var uploadViewModel: FileUploadViewModel private lateinit var noticeViewModel: NoticeViewModel + private lateinit var user: UserInfoModel.DataModel override fun initData() { val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -27,25 +46,51 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val user = it.data + this.user = it.data userNameView.text = user.name userUnitView.text = user.deptName if (user.avatar.isNullOrBlank()) { Glide.with(requireContext()) - .asBitmap() - .load(user.avatar.combineFilePath()) + .load(R.mipmap.default_avatar) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } else { Glide.with(requireContext()) - .asBitmap() - .load(R.mipmap.default_avatar) + .load(user.avatar.combineImagePath()) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + + uploadViewModel = ViewModelProvider(this)[FileUploadViewModel::class.java] + uploadViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data[0], + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data[0].combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.noticeList.observe(this) { @@ -79,15 +124,83 @@ } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadViewModel.uploadFile(file, FileType.IMAGE) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun initLayoutView(): Int = R.layout.fragment_mine override fun observeRequestState() { - + uploadViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 40cfb7e..f6e498f 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,15 @@ ): String /** + * 更新用户信息 + */ + @POST("/sys/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/List.kt b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt new file mode 100644 index 0000000..855bea7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.xz.meterage.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 4174e94..7f43a7d 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -1,25 +1,44 @@ package com.casic.xz.meterage.fragment +import android.graphics.Color import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R -import com.casic.xz.meterage.extensions.combineFilePath +import com.casic.xz.meterage.callback.OnImageCompressListener +import com.casic.xz.meterage.extensions.combineImagePath +import com.casic.xz.meterage.extensions.compressImage +import com.casic.xz.meterage.extensions.reformat +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.FileType +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.FileUploadViewModel import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_mine.* +import java.io.File class MinePageFragment : KotlinBaseFragment() { + private lateinit var uploadViewModel: FileUploadViewModel private lateinit var noticeViewModel: NoticeViewModel + private lateinit var user: UserInfoModel.DataModel override fun initData() { val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -27,25 +46,51 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val user = it.data + this.user = it.data userNameView.text = user.name userUnitView.text = user.deptName if (user.avatar.isNullOrBlank()) { Glide.with(requireContext()) - .asBitmap() - .load(user.avatar.combineFilePath()) + .load(R.mipmap.default_avatar) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } else { Glide.with(requireContext()) - .asBitmap() - .load(R.mipmap.default_avatar) + .load(user.avatar.combineImagePath()) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + + uploadViewModel = ViewModelProvider(this)[FileUploadViewModel::class.java] + uploadViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data[0], + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data[0].combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.noticeList.observe(this) { @@ -79,15 +124,83 @@ } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadViewModel.uploadFile(file, FileType.IMAGE) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun initLayoutView(): Int = R.layout.fragment_mine override fun observeRequestState() { - + uploadViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 40cfb7e..f6e498f 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,15 @@ ): String /** + * 更新用户信息 + */ + @POST("/sys/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 321e780..0f2a9fd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -58,6 +58,36 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("account", account) + param.addProperty("name", name) + param.addProperty("deptid", deptid) + param.addProperty("roleid", roleid) + param.addProperty("avatar", avatar) + param.addProperty("sex", sex) + param.addProperty("birthday", birthday) + param.addProperty("phone", phone) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/List.kt b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt new file mode 100644 index 0000000..855bea7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.xz.meterage.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 4174e94..7f43a7d 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -1,25 +1,44 @@ package com.casic.xz.meterage.fragment +import android.graphics.Color import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R -import com.casic.xz.meterage.extensions.combineFilePath +import com.casic.xz.meterage.callback.OnImageCompressListener +import com.casic.xz.meterage.extensions.combineImagePath +import com.casic.xz.meterage.extensions.compressImage +import com.casic.xz.meterage.extensions.reformat +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.FileType +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.FileUploadViewModel import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_mine.* +import java.io.File class MinePageFragment : KotlinBaseFragment() { + private lateinit var uploadViewModel: FileUploadViewModel private lateinit var noticeViewModel: NoticeViewModel + private lateinit var user: UserInfoModel.DataModel override fun initData() { val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -27,25 +46,51 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val user = it.data + this.user = it.data userNameView.text = user.name userUnitView.text = user.deptName if (user.avatar.isNullOrBlank()) { Glide.with(requireContext()) - .asBitmap() - .load(user.avatar.combineFilePath()) + .load(R.mipmap.default_avatar) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } else { Glide.with(requireContext()) - .asBitmap() - .load(R.mipmap.default_avatar) + .load(user.avatar.combineImagePath()) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + + uploadViewModel = ViewModelProvider(this)[FileUploadViewModel::class.java] + uploadViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data[0], + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data[0].combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.noticeList.observe(this) { @@ -79,15 +124,83 @@ } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadViewModel.uploadFile(file, FileType.IMAGE) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun initLayoutView(): Int = R.layout.fragment_mine override fun observeRequestState() { - + uploadViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 40cfb7e..f6e498f 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,15 @@ ): String /** + * 更新用户信息 + */ + @POST("/sys/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 321e780..0f2a9fd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -58,6 +58,36 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("account", account) + param.addProperty("name", name) + param.addProperty("deptid", deptid) + param.addProperty("roleid", roleid) + param.addProperty("avatar", avatar) + param.addProperty("sex", sex) + param.addProperty("birthday", birthday) + param.addProperty("phone", phone) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index f8245f8..a628117 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -4,6 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.LoginResultModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager @@ -23,6 +24,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() + val updateResult = MutableLiveData() // val outResultModel = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ @@ -57,22 +59,37 @@ it.printStackTrace() }) -// fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateUserInfo(userData) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show(BaseApplication.obtainInstance()) -// } -// }, { -// loadState.value = LoadState.Fail -// it.cause.toString().show(BaseApplication.get()) -// it.printStackTrace() -// }) -// + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, roleid, avatar, sex, birthday, phone + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + // fun out() = launch({ // val response = RetrofitServiceManager.loginOut() // val responseCode = response.separateResponseCode() diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/List.kt b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt new file mode 100644 index 0000000..855bea7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.xz.meterage.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 4174e94..7f43a7d 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -1,25 +1,44 @@ package com.casic.xz.meterage.fragment +import android.graphics.Color import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R -import com.casic.xz.meterage.extensions.combineFilePath +import com.casic.xz.meterage.callback.OnImageCompressListener +import com.casic.xz.meterage.extensions.combineImagePath +import com.casic.xz.meterage.extensions.compressImage +import com.casic.xz.meterage.extensions.reformat +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.FileType +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.FileUploadViewModel import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_mine.* +import java.io.File class MinePageFragment : KotlinBaseFragment() { + private lateinit var uploadViewModel: FileUploadViewModel private lateinit var noticeViewModel: NoticeViewModel + private lateinit var user: UserInfoModel.DataModel override fun initData() { val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -27,25 +46,51 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val user = it.data + this.user = it.data userNameView.text = user.name userUnitView.text = user.deptName if (user.avatar.isNullOrBlank()) { Glide.with(requireContext()) - .asBitmap() - .load(user.avatar.combineFilePath()) + .load(R.mipmap.default_avatar) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } else { Glide.with(requireContext()) - .asBitmap() - .load(R.mipmap.default_avatar) + .load(user.avatar.combineImagePath()) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + + uploadViewModel = ViewModelProvider(this)[FileUploadViewModel::class.java] + uploadViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data[0], + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data[0].combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.noticeList.observe(this) { @@ -79,15 +124,83 @@ } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadViewModel.uploadFile(file, FileType.IMAGE) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun initLayoutView(): Int = R.layout.fragment_mine override fun observeRequestState() { - + uploadViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 40cfb7e..f6e498f 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,15 @@ ): String /** + * 更新用户信息 + */ + @POST("/sys/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 321e780..0f2a9fd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -58,6 +58,36 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("account", account) + param.addProperty("name", name) + param.addProperty("deptid", deptid) + param.addProperty("roleid", roleid) + param.addProperty("avatar", avatar) + param.addProperty("sex", sex) + param.addProperty("birthday", birthday) + param.addProperty("phone", phone) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index f8245f8..a628117 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -4,6 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.LoginResultModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager @@ -23,6 +24,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() + val updateResult = MutableLiveData() // val outResultModel = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ @@ -57,22 +59,37 @@ it.printStackTrace() }) -// fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateUserInfo(userData) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show(BaseApplication.obtainInstance()) -// } -// }, { -// loadState.value = LoadState.Fail -// it.cause.toString().show(BaseApplication.get()) -// it.printStackTrace() -// }) -// + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, roleid, avatar, sex, birthday, phone + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + // fun out() = launch({ // val response = RetrofitServiceManager.loginOut() // val responseCode = response.separateResponseCode() diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml index 037e077..41a75be 100644 --- a/app/src/main/res/drawable/avatar_border_circle.xml +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -2,7 +2,5 @@ - + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/List.kt b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt new file mode 100644 index 0000000..855bea7 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.xz.meterage.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index 4174e94..7f43a7d 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -1,25 +1,44 @@ package com.casic.xz.meterage.fragment +import android.graphics.Color import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.xz.meterage.R -import com.casic.xz.meterage.extensions.combineFilePath +import com.casic.xz.meterage.callback.OnImageCompressListener +import com.casic.xz.meterage.extensions.combineImagePath +import com.casic.xz.meterage.extensions.compressImage +import com.casic.xz.meterage.extensions.reformat +import com.casic.xz.meterage.model.UserInfoModel +import com.casic.xz.meterage.utils.FileType +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.view.notice.NoticeListActivity +import com.casic.xz.meterage.vm.FileUploadViewModel import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_mine.* +import java.io.File class MinePageFragment : KotlinBaseFragment() { + private lateinit var uploadViewModel: FileUploadViewModel private lateinit var noticeViewModel: NoticeViewModel + private lateinit var user: UserInfoModel.DataModel override fun initData() { val userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -27,25 +46,51 @@ userViewModel.getUserInfo(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) userViewModel.userInfo.observe(this) { if (it.code == 200) { - val user = it.data + this.user = it.data userNameView.text = user.name userUnitView.text = user.deptName if (user.avatar.isNullOrBlank()) { Glide.with(requireContext()) - .asBitmap() - .load(user.avatar.combineFilePath()) + .load(R.mipmap.default_avatar) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } else { Glide.with(requireContext()) - .asBitmap() - .load(R.mipmap.default_avatar) + .load(user.avatar.combineImagePath()) .apply(RequestOptions.circleCropTransform()) .into(userAvatarView) } } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + + uploadViewModel = ViewModelProvider(this)[FileUploadViewModel::class.java] + uploadViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data[0], + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data[0].combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] noticeViewModel.noticeList.observe(this) { @@ -79,15 +124,83 @@ } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + noticeLayout.setOnClickListener { requireContext().navigatePageTo() } } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadViewModel.uploadFile(file, FileType.IMAGE) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun initLayoutView(): Int = R.layout.fragment_mine override fun observeRequestState() { - + uploadViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun setupTopBarLayout() { diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 40cfb7e..f6e498f 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -27,6 +27,15 @@ ): String /** + * 更新用户信息 + */ + @POST("/sys/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取字典 */ @GET("/sys/dict/code/{dictCode}") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 321e780..0f2a9fd 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -58,6 +58,36 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("account", account) + param.addProperty("name", name) + param.addProperty("deptid", deptid) + param.addProperty("roleid", roleid) + param.addProperty("avatar", avatar) + param.addProperty("sex", sex) + param.addProperty("birthday", birthday) + param.addProperty("phone", phone) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取字典 */ suspend fun getDictionaryByCode(dictCode: String): String { diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index f8245f8..a628117 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -4,6 +4,7 @@ import com.casic.xz.meterage.base.BaseApplication import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.LoginResultModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager @@ -23,6 +24,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() + val updateResult = MutableLiveData() // val outResultModel = MutableLiveData() fun enter(sid: String, account: String, secretKey: String) = launch({ @@ -57,22 +59,37 @@ it.printStackTrace() }) -// fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateUserInfo(userData) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show(BaseApplication.obtainInstance()) -// } -// }, { -// loadState.value = LoadState.Fail -// it.cause.toString().show(BaseApplication.get()) -// it.printStackTrace() -// }) -// + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, roleid, avatar, sex, birthday, phone + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + // fun out() = launch({ // val response = RetrofitServiceManager.loginOut() // val responseCode = response.separateResponseCode() diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml index 037e077..41a75be 100644 --- a/app/src/main/res/drawable/avatar_border_circle.xml +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -2,7 +2,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index 66c2e75..5296f1f 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -46,7 +46,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" - android:src="@mipmap/default_avatar" /> + android:layout_margin="@dimen/dp_2" />