From 8622aa787ac883a4b335a6429bdcaace184fc9ec Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Thu, 6 Dec 2018 17:42:23 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=88=E4=B8=BB=E4=BF=AE=E6=94=B9=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=AF=B9=E6=8E=A5=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/util/EntranceUtils.java | 2 +- .../java/com/gh/gamecenter/entity/MeEntity.kt | 27 ++++++- .../detail/QuestionsDetailFragment.java | 31 ++++++- .../qa/questions/edit/QuestionEditActivity.kt | 39 ++++++--- .../questions/edit/QuestionEditViewModel.kt | 43 +++++++++- .../qa/questions/edit/TagsSelectFragment.kt | 81 +++++++++++++------ .../retrofit/service/ApiService.java | 9 +++ 7 files changed, 192 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java index f532c63be1..835734214a 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -109,7 +109,7 @@ public class EntranceUtils { public static final String KEY_DEVICE_NAME = "deviceName"; public static final String KEY_SHOW_ARTICLE_COMMENT = "showArticleComment"; public static final String KEY_RATING_STAR_COUNT = "ratingStarCount"; - public static final String KEY_QUESTION_MANAGER_PATCH = "questionManagerPatch"; + public static final String KEY_QUESTION_MODERATOR_PATCH = "questionModeratorPatch"; public static void jumpActivity(Context context, Bundle bundle) { diff --git a/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt index c7e083531e..e5e61b5293 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt @@ -75,5 +75,30 @@ class MeEntity(@SerializedName("is_community_voted") val isCommented: Boolean = false, @SerializedName("libao") - var userDataLibaoList: List? = null) : Parcelable { + var userDataLibaoList: List? = null, + + @SerializedName("is_moderator") + val isModerator: Boolean = false, + + @SerializedName("moderator_level") + val moderatorLevel: String = "", + + @SerializedName("permissions") + val moderatorPermissions: List = ArrayList()) : Parcelable { + companion object { + const val MODERATOR_LEVEL_PRIMARY = "primary" + const val MODERATOR_LEVEL_SUPPER = "supper" + + // moderator permissions + const val PATCH_QUESTION_TAG = "update-question-tag" // 修改问题标签:只修改标签 + const val PATCH_QUESTION = "update-question-tag" // 修改问题:除标签以外的字段 + const val HIDE_QUESTION = "hide-question" // 隐藏问题 + const val GET_MODIFIED_VERSIONS = "get-modified-versions" // 查看问题的修改历史 + + const val CHOICENESS_ANSWER = "choiceness-answer" // 将回答加入精选列表 + const val FOLD_ANSWER = "fold-answer" // 折叠回答 + const val HIDE_ANSWER = "hide-answer" // 隐藏回答 + const val TOP_ANSWER_COMMENT = "top-answer-comment" // 置顶回答的评论 + const val HIDE_ANSWER_COMMENT = "hide-answer-comment" // 隐藏回答的评论 + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailFragment.java b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailFragment.java index 7f4aeed601..20e94cd3e8 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailFragment.java @@ -44,6 +44,7 @@ import com.gh.gamecenter.baselist.ListFragment; import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; import com.gh.gamecenter.baselist.NormalListViewModel; +import com.gh.gamecenter.entity.MeEntity; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity; @@ -82,7 +83,9 @@ import static com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG; * Created by khy on 7/12/17. */ -public class QuestionsDetailFragment extends ListFragment { +public class QuestionsDetailFragment + extends ListFragment + implements TagsSelectFragment.onModeratorPatchTagsCallback { public static final String TAG = "ask.questionsdetail.QuestionsDetailFragment"; @@ -352,6 +355,7 @@ public class QuestionsDetailFragment extends ListFragment { dialog.dismiss(); // 跳转意见反馈 @@ -390,9 +394,23 @@ public class QuestionsDetailFragment extends ListFragment arrReportType = new ArrayList<>(); + List permissions = mQuestionsDetailEntity.getMe().getModeratorPermissions(); + if (permissions.contains(MeEntity.PATCH_QUESTION_TAG)) { + arrReportType.add(patchTag); + } + if (permissions.contains(MeEntity.PATCH_QUESTION)) { + arrReportType.add(patchQuestion); + } + if (permissions.contains(MeEntity.HIDE_QUESTION)) { + arrReportType.add(hideQuestion); + } + if (permissions.contains(MeEntity.GET_MODIFIED_VERSIONS)) { + arrReportType.add(historyVersion); + } + + int widthPixels = getResources().getDisplayMetrics().widthPixels; final Dialog dialog = new Dialog(getContext()); LinearLayout container = new LinearLayout(getContext()); container.setOrientation(LinearLayout.VERTICAL); @@ -420,7 +438,7 @@ public class QuestionsDetailFragment extends ListFragment?) - mViewModel.isManagerPatch = intent.getBooleanExtra(EntranceUtils.KEY_QUESTION_MANAGER_PATCH, false) + mViewModel.isModeratorPatch = intent.getBooleanExtra(EntranceUtils.KEY_QUESTION_MODERATOR_PATCH, false) if (mViewModel.title.isNullOrEmpty()) mViewModel.title = detailEntity.title } else { // 新增问题 var searchKey = intent.getStringExtra(EntranceUtils.KEY_QUESTIONS_SEARCH_KEY) @@ -107,7 +110,7 @@ class QuestionEditActivity : BaseActivity() { // Navigation when { - mViewModel.isManagerPatch -> setNavigationTitle("修改问题") + mViewModel.isModeratorPatch -> setNavigationTitle("修改问题") mViewModel.questionEntity != null -> setNavigationTitle("编辑问题") else -> setNavigationTitle(UserManager.getInstance().community.name) } @@ -135,6 +138,22 @@ class QuestionEditActivity : BaseActivity() { } mBinding.suggestPicRv.adapter = picAdapter + mViewModel.moderatorPostLiveData.observe(this, Observer { + if (it?.status == Status.SUCCESS) { + if (mViewModel.questionEntity?.me?.moderatorLevel == MeEntity.MODERATOR_LEVEL_PRIMARY) { + toast("提交成功") + } else { + toast("操作成功") + val data = Intent() + data.putExtra(QuestionsDetailEntity.TAG, mViewModel.questionEntity) + setResult(Activity.RESULT_OK, data) + } + finish() + } else if (it?.status == Status.ERROR) { + // todo error response + } + }) + // Process dialog mViewModel.processDialog.observe(this, Observer { it -> if (it?.isShow!!) { @@ -180,12 +199,14 @@ class QuestionEditActivity : BaseActivity() { } override fun onMenuItemClick(menuItem: MenuItem?): Boolean { - if (mViewModel.isManagerPatch) { + if (mViewModel.isModeratorPatch) { mViewModel.selectedTags.addAll(mViewModel.questionEntity?.tags!!) - // todo 判断版主等级 - DialogUtils.showAlertDialog(this, "修改标签" - , "你的操作将提交给小编审核,确定提交吗?", "确定" - , "取消", DialogUtils.ConfirmListener {}, null) + DialogUtils.showAlertDialog(this, "修改标签", + if (mViewModel.questionEntity?.me?.moderatorLevel == MeEntity.MODERATOR_LEVEL_PRIMARY) + "你的操作将提交给小编审核,确定提交吗?" else "你的操作将立即生效,确定提交吗?(你的管理权限为:高级)", + "确定", "取消", DialogUtils.ConfirmListener { + mViewModel.moderatorsPatchQuestion(false) + }, null) } else { mViewModel.checkTitleAndLoadTitleTag() } @@ -240,7 +261,7 @@ class QuestionEditActivity : BaseActivity() { val title = mBinding.questionseditTitle.text.toString().trim() val content = mBinding.questionseditContent.text.toString().trim() - if (mViewModel.isManagerPatch) { + if (mViewModel.isModeratorPatch) { DialogUtils.showCancelAlertDialog(this, "提示" , "确定退出修改?已编辑的内容将丢失" , "继续编辑", " 退出", null) { finish() } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt index 09b27ed223..58de25a33c 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt @@ -11,6 +11,7 @@ import com.gh.base.fragment.WaitingDialogFragment import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.mvvm.Resource import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager @@ -22,6 +23,8 @@ import io.reactivex.schedulers.Schedulers import okhttp3.MediaType import okhttp3.RequestBody import okhttp3.ResponseBody +import org.json.JSONArray +import org.json.JSONObject import retrofit2.HttpException import java.io.File @@ -41,11 +44,12 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica var communityId: String? = null var communityName: String? = null - var isManagerPatch: Boolean = false + var isModeratorPatch: Boolean = false val processDialog = MediatorLiveData() val titleTags = MediatorLiveData>() val postLiveData = MediatorLiveData() + val moderatorPostLiveData = MediatorLiveData>() var uploadImageSubscription: Disposable? = null @@ -241,7 +245,7 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica val body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.getInstance().toJson(entity)) val observable = if (questionEntity != null) { - if (!isManagerPatch) { + if (!isModeratorPatch) { questionEntity?.images = entity.images questionEntity?.title = entity.title questionEntity?.description = entity.description @@ -270,4 +274,39 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica } }) } + + fun moderatorsPatchQuestion(isPatchTags: Boolean) { + val content = if (isPatchTags) { + val tagsJson = JSONObject() + tagsJson.put("tags", JSONArray(selectedTags)) + tagsJson.toString() + } else { + val entity = QuestionsDetailEntity() + entity.title = title + entity.description = content + entity.images = if (picList.value != null) { + picList.value!! + } else { + ArrayList() + } + GsonUtils.getInstance().toJson(entity) + } + + processDialog.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", true)) + val body = RequestBody.create(MediaType.parse("application/json"), content) + mApiService.moderatorsPatchQuestion(body, UserManager.getInstance().userId, questionEntity?.id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + moderatorPostLiveData.postValue(Resource.success("")) + processDialog.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", false)) + } + + override fun onFailure(e: HttpException?) { + moderatorPostLiveData.postValue(Resource.error(e)) + processDialog.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", false)) + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt index 50428a8b85..55d32c2ae1 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.app.Dialog import android.arch.lifecycle.Observer import android.arch.lifecycle.ViewModelProviders +import android.content.Context import android.content.Intent import android.os.Bundle import android.support.v4.content.ContextCompat @@ -20,6 +21,8 @@ import com.gh.common.util.DialogUtils import com.gh.common.util.DisplayUtils import com.gh.common.util.EntranceUtils import com.gh.gamecenter.R +import com.gh.gamecenter.entity.MeEntity +import com.gh.gamecenter.mvvm.Status import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity import com.google.android.flexbox.FlexboxLayout @@ -43,13 +46,15 @@ class TagsSelectFragment : BaseFragment() { fun getInstance(detail: QuestionsDetailEntity): TagsSelectFragment { val bundle = Bundle() bundle.putParcelable(QuestionsDetailEntity::class.java.simpleName, detail) - bundle.putBoolean(EntranceUtils.KEY_QUESTION_MANAGER_PATCH, true) + bundle.putBoolean(EntranceUtils.KEY_QUESTION_MODERATOR_PATCH, true) val fragment = TagsSelectFragment() fragment.arguments = bundle return fragment } } + private var mModeratorPatchTagsCallback: onModeratorPatchTagsCallback? = null + private val mTagFl by bindView(R.id.questions_edit_tag) private val mAddTagBtn by bindView(R.id.questions_edit_tag_add) private val mPostBtn by bindView(R.id.questions_edit_tag_positive) @@ -64,41 +69,65 @@ class TagsSelectFragment : BaseFragment() { return R.layout.questions_edit_tag } + + override fun onAttach(context: Context?) { + super.onAttach(context) + if (context is onModeratorPatchTagsCallback) { + mModeratorPatchTagsCallback = context + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val isManagerPatch = arguments?.getBoolean(EntranceUtils.KEY_QUESTION_MANAGER_PATCH) - if (isManagerPatch != null && isManagerPatch) { + val isModeratorPatch = arguments?.getBoolean(EntranceUtils.KEY_QUESTION_MODERATOR_PATCH) + if (isModeratorPatch != null && isModeratorPatch) { mViewModel = ViewModelProviders.of(this).get(QuestionEditViewModel::class.java) - mViewModel?.isManagerPatch = isManagerPatch + mViewModel?.isModeratorPatch = isModeratorPatch mViewModel?.questionEntity = arguments?.getParcelable(QuestionsDetailEntity::class.java.simpleName) + + mViewModel?.moderatorPostLiveData?.observe(this, Observer { + if (it?.status == Status.SUCCESS) { + if (mViewModel?.questionEntity?.me?.moderatorLevel == MeEntity.MODERATOR_LEVEL_PRIMARY) { + toast("提交成功") + } else { + toast("操作成功") + mViewModel?.questionEntity?.tags = mViewModel?.selectedTags!! + } + mModeratorPatchTagsCallback?.onPatchTagsSuccess() + val fragment = parentFragment + (fragment as? BaseDialogWrapperFragment)?.dismiss() + } else { + // todo error response + } + }) } else { mViewModel = activity?.let { ViewModelProviders.of(it).get(QuestionEditViewModel::class.java) } + mViewModel?.postLiveData?.observe(this, Observer { + if (mViewModel?.questionEntity != null) { // 修改问题 + val data = Intent() + data.putExtra(QuestionsDetailEntity.TAG, mViewModel?.questionEntity) + activity?.setResult(Activity.RESULT_OK, data) + } else { + val data = JSONObject(it) + startActivity(QuestionsDetailActivity.getIntent(context, data.getString("_id"), + "", "问题编辑")) + activity?.setResult(Activity.RESULT_OK) + } + activity?.finish() + }) } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - if (mViewModel != null && mViewModel?.isManagerPatch!!) { + if (mViewModel != null && mViewModel?.isModeratorPatch!!) { mCancelBtn.text = "取消" mTitle.text = "修改标签" } initTags() - mViewModel?.postLiveData?.observe(this, Observer { - if (mViewModel?.questionEntity != null) { // 修改问题 - val data = Intent() - data.putExtra(QuestionsDetailEntity.TAG, mViewModel?.questionEntity) - activity?.setResult(Activity.RESULT_OK, data) - } else { - val data = JSONObject(it) - startActivity(QuestionsDetailActivity.getIntent(context, data.getString("_id"), "", "问题编辑")) - activity?.setResult(Activity.RESULT_OK) - } - activity?.finish() - }) - mAddTagBtn.setOnClickListener { if (mViewModel?.selectedTags?.size!! < QuestionEditViewModel.QUESTION_TAG_MAX_COUNT) { showAddTagDialog() @@ -113,14 +142,16 @@ class TagsSelectFragment : BaseFragment() { } mPostBtn.setOnClickListener { - if (mViewModel?.isManagerPatch!!) { + if (mViewModel?.isModeratorPatch!!) { if (checkTagsContent()) { toast("标签没有变化") } else { - // todo 判断版主等级 - DialogUtils.showAlertDialog(context, "修改标签" - , "你的操作将提交给小编审核,确定提交吗?", "确定" - , "取消", DialogUtils.ConfirmListener {}, null) + DialogUtils.showAlertDialog(context, "修改标签", + if (mViewModel?.questionEntity?.me?.moderatorLevel == MeEntity.MODERATOR_LEVEL_PRIMARY) + "你的操作将提交给小编审核,确定提交吗?" else "你的操作将立即生效,确定提交吗?(你的管理权限为:高级)", + "确定", "取消", DialogUtils.ConfirmListener { + mViewModel?.moderatorsPatchQuestion(true) + }, null) } } else { mViewModel?.postQuestion() @@ -259,4 +290,8 @@ class TagsSelectFragment : BaseFragment() { mAllTags.add(tag) } + + interface onModeratorPatchTagsCallback { + fun onPatchTagsSuccess(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index 0b3601944e..636924cac1 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -1409,4 +1409,13 @@ public interface ApiService { */ @GET("communities/{community_id}/users/{user_id}/followers/histories:unread") Observable getUnreadCommunityTimeline(@Path("community_id") String communityId, @Path("user_id") String userId); + + /** + * 版主修改问题 + */ + @POST("moderators/{moderator_id}/questions/{question_id}") + Observable moderatorsPatchQuestion(@Body RequestBody body, + @Path("moderator_id") String moderatorId, + @Path("question_id") String questionId); + } \ No newline at end of file