Commit 3552467e authored by yinjiacheng's avatar yinjiacheng

add 系统设置-用户反馈功能

parent ba02e456
......@@ -38,6 +38,14 @@ class AppConfig {
const val TowerApiKeyTag = "function-config"
const val TowerApiVersion = "1.0.0"
// 用户反馈配置
const val feedbackAssignee = "chengxiaofeng" // 经办人
const val feedbackProject = "10721" // 项目
const val feedbackIssueType = "10001" // 问题类型
const val feedbackPriority = "4" // 优先级
const val feedbackPlatform = "Android" // 平台
const val feedbackDefaultSummary = "something's wrong" // 默认问题概要
// 分享相关的三方平台配置
const val WeChatAppKey = "wxef4c37f254e29e84"
const val WeChatAppSecret = "fb596ed3641b481b6f973774987fd04f"
......
......@@ -54,6 +54,9 @@ class XRouterPathConstants {
// 系统设置 —— 设置
const val SYSTEM_SETTING = "/setting/SettingActivity"
// 系统设置-用户反馈
const val FEEDBACK = "/setting/feedback"
// 商户管理中心
const val MERCHANT_CENTER = "/merchantCenter"
// 商户基本信息
......
......@@ -4,9 +4,11 @@ import com.google.gson.reflect.TypeToken
import com.yidian.common.AppConfig
import com.yidian.common.BuildConfig
import com.yidian.common.YdBaseApplication
import com.yidian.common.http.bean.CommitFeedbackBean
import com.yidian.common.http.bean.GetCommonConfigBean
import com.yidian.common.http.bean.GetKSYunObjectIdBean
import com.yidian.common.http.bean.GetKSYunTokenBean
import com.yidian.common.http.callback.ICommitFeedbackCallback
import com.yidian.common.http.callback.IGetCommonConfigCallback
import com.yidian.common.http.callback.IGetKSYunObjectIdCallback
import com.yidian.http.ServiceFactory
......@@ -32,6 +34,10 @@ object CommonDataSource {
ServiceFactory.getInstance().createService(CommonService::class.java, domainTowerApi)
}
private val ydJiraApi by lazy {
ServiceFactory.getInstance().createService(CommonService::class.java, CommonService.DOMAIN_YD_JIRA)
}
// 301 获取金山云token接口
fun getKSYunToken(requestParams: HashMap<String, String?>): HttpResult<GetKSYunTokenBean.Response>? {
val timeStamp = System.currentTimeMillis()
......@@ -86,4 +92,21 @@ object CommonDataSource {
}
})
}
// 用户反馈提交
fun commitFeedback(apiCallback: ICommitFeedbackCallback, requestParams: CommitFeedbackBean.CommitFeedbackRequest) {
ydJiraApi
.commitFeedback(requestParams)
.compose(TransformUtil.defaultSchedulers())
.subscribe(object : HttpResultObserver<CommitFeedbackBean.CommitFeedbackResponse>() {
override fun onSuccess(result: HttpResult<CommitFeedbackBean.CommitFeedbackResponse>?) {
apiCallback.commitFeedbackSuccess(result?.result)
}
override fun onFailure(result: HttpResult<CommitFeedbackBean.CommitFeedbackResponse>?) {
apiCallback.commitFeedbackFailure(result?.reason)
}
})
}
}
package com.yidian.common.http
import com.yidian.common.http.bean.CommitFeedbackBean
import com.yidian.common.http.bean.GetCommonConfigBean
import io.reactivex.rxjava3.core.Observable
import retrofit2.Call
......@@ -17,8 +18,14 @@ interface CommonService {
const val DOMAIN_TOWER_API_TEST = "http://open-tower-api.test.int.yidian-inc.com:8222"
const val DOMAIN_TOWER_API_PRO = "https://open-tower-api.go2yd.com"
// 一点jira域名定义
const val DOMAIN_YD_JIRA = "http://ydjira.yidian-inc.com"
// tower-api 获取配置数据
private const val getCommonConfig = "/api/resource"
// 用户反馈提交
private const val commitFeedback = "/rest/api/2/issue"
}
@Headers("Content-Type: application/json")
......@@ -33,4 +40,8 @@ interface CommonService {
@GET(getCommonConfig)
fun getCommonConfig(@QueryMap requestParams: Map<String, String>): Observable<HttpResult<GetCommonConfigBean.GetCommonConfigResponse>>
@Headers("Content-Type: application/json", "Authorization: Basic Y2xpZW50LXVwbG9hZDpUZXN0MTIzNCU=")
@POST(commitFeedback)
fun commitFeedback(@Body requestParams: CommitFeedbackBean.CommitFeedbackRequest): Observable<HttpResult<CommitFeedbackBean.CommitFeedbackResponse>>
}
package com.yidian.common.http.bean
import com.google.gson.annotations.SerializedName
/**
* author: yinjiacheng
* date: 7/17/21 1:26 AM
* description: ydjira.yidian-inc.com/rest/api/2/issue
*/
class CommitFeedbackBean {
data class CommitFeedbackRequest(
@SerializedName("fields")
val fields: Fields,
)
data class Fields(
@SerializedName("assignee")
val assignee: Assignee,
@SerializedName("description")
val description: String,
@SerializedName("issuetype")
val issuetype: Issuetype,
@SerializedName("priority")
val priority: Priority,
@SerializedName("project")
val project: Project,
@SerializedName("summary")
val summary: String,
)
data class Assignee(
@SerializedName("name")
val name: String
)
data class Issuetype(
@SerializedName("id")
val id: String
)
data class Priority(
@SerializedName("id")
val id: String
)
data class Project(
@SerializedName("id")
val id: String
)
data class CommitFeedbackResponse(
@SerializedName("id")
val id: String,
@SerializedName("key")
val key: String,
@SerializedName("self")
val self: String
)
}
package com.yidian.common.http.callback
import com.yidian.common.http.bean.CommitFeedbackBean
/**
* author: yinjiacheng
* date: 7/17/21 1:24 AM
* description: ydjira.yidian-inc.com/rest/api/2/issue
*/
interface ICommitFeedbackCallback {
fun commitFeedbackSuccess(result: CommitFeedbackBean.CommitFeedbackResponse?)
fun commitFeedbackFailure(message: String?)
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="@dimen/dp1"
android:color="@color/color_F2F2F2" />
<corners android:radius="@dimen/dp8" />
</shape>
\ No newline at end of file
......@@ -155,6 +155,7 @@
<activity
android:name=".ui.center.MerchantAuthManagementActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<activity android:name=".ui.setting.FeedbackActivity" />
</application>
......
......@@ -40,6 +40,7 @@ import com.yidian.shenghuoquan.newscontent.ui.*
import com.yidian.shenghuoquan.newscontent.ui.auth.*
import com.yidian.shenghuoquan.newscontent.ui.center.*
import com.yidian.shenghuoquan.newscontent.ui.idcard.IDCardTestActivity
import com.yidian.shenghuoquan.newscontent.ui.setting.FeedbackActivity
import com.yidian.shenghuoquan.newscontent.ui.setting.SystemSettingActivity
import com.yidian.shenghuoquan.newscontent.ui.store.ChooseStoreActivity
import com.yidian.shenghuoquan.newscontent.ui.store.StoreManagementActivity
......@@ -480,6 +481,17 @@ class NewsContentApplication : YdBaseApplication() {
context.startActivity(intent)
}
}),
XPageNode(XRouterPathConstants.Companion.FEEDBACK, XPageNodePageType.NATIVE, object : XPageHandler {
override fun handler(params: Map<String, Any?>?) {
val intent = Intent()
if (params != null) {
intent.putExtra(XRouterPathConstants.ParamsKey, params as HashMap)
}
intent.setClass(context, FeedbackActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
}),
)
)
}
......
package com.yidian.shenghuoquan.newscontent.ui.setting
import android.text.Editable
import android.text.InputFilter
import android.text.TextWatcher
import androidx.activity.viewModels
import com.yidian.common.mvvm.BaseMvvmActivity
import com.yidian.common.utils.ToastUtils
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivityFeedbackBinding
import com.yidian.xpage.XPageManager
/**
* author: yinjiacheng
* date: 7/16/21 10:24 PM
* description: 用户反馈
*/
class FeedbackActivity : BaseMvvmActivity<ActivityFeedbackBinding, FeedbackViewModel>(), TextWatcher {
override val layoutId: Int = R.layout.activity_feedback
override val vm: FeedbackViewModel by viewModels()
override fun initView() {
// 限制最多输入100字
binding.etInput.filters = arrayOf(InputFilter.LengthFilter(100))
binding.etInput.addTextChangedListener(this)
subscribeData()
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
// 字数统计
s?.length?.let { vm.feedbackWordCount.value = it }
}
private fun subscribeData() {
vm.commitSuccessEvent.observe(this, {
ToastUtils.showShort("提交成功")
XPageManager.pop(null)
})
vm.commitFailureEvent.observe(this, {
ToastUtils.showShort("提交失败,请稍后重试")
})
}
}
package com.yidian.shenghuoquan.newscontent.ui.setting
import androidx.lifecycle.MutableLiveData
import com.orhanobut.hawk.Hawk
import com.yidian.common.AppConfig
import com.yidian.common.BuildConfig
import com.yidian.common.HawkConfig
import com.yidian.common.http.CommonDataSource
import com.yidian.common.http.bean.CommitFeedbackBean
import com.yidian.common.http.callback.ICommitFeedbackCallback
import com.yidian.common.mvvm.BaseViewModel
/**
* author: yinjiacheng
* date: 7/16/21 10:27 PM
* description: 用户反馈
*/
class FeedbackViewModel : BaseViewModel(), ICommitFeedbackCallback {
/**
* 用户输入的反馈字数
*/
val feedbackWordCount by lazy { MutableLiveData(0) }
/**
* 用户输入的反馈内容
*/
val feedbackContent by lazy { MutableLiveData<String>() }
/**
* 提交成功事件
*/
val commitSuccessEvent by lazy { MutableLiveData<Unit>() }
/**
* 提交失败事件
*/
val commitFailureEvent by lazy { MutableLiveData<Unit>() }
/**
* 请求提交反馈信息
*/
fun requestCommitFeedback() {
// 拼接获取到的用户信息
val description = "uid:${Hawk.get(HawkConfig.UserId, 0L)},appversion:${BuildConfig.VERSION_NAME},platform:${AppConfig.feedbackPlatform}"
CommonDataSource.commitFeedback(
this, CommitFeedbackBean.CommitFeedbackRequest(
CommitFeedbackBean.Fields(
CommitFeedbackBean.Assignee(AppConfig.feedbackAssignee),
description,
CommitFeedbackBean.Issuetype(AppConfig.feedbackIssueType),
CommitFeedbackBean.Priority(AppConfig.feedbackPriority),
CommitFeedbackBean.Project(AppConfig.feedbackProject),
feedbackContent.value ?: AppConfig.feedbackDefaultSummary
)
)
)
}
override fun commitFeedbackSuccess(result: CommitFeedbackBean.CommitFeedbackResponse?) {
// 提交成功
commitSuccessEvent.value = Unit
}
override fun commitFeedbackFailure(message: String?) {
// 提交失败
commitFailureEvent.value = Unit
}
}
......@@ -86,7 +86,7 @@ class SystemSettingActivity : BaseActivity<ActivitySystemSettingBinding>() {
}
// 用户反馈
viewBind.clFeedback.clickAntiShake {
// TODO: 7/16/21 跳转用户反馈
XPageManager.push(XRouterPathConstants.FEEDBACK, null)
}
// 注销账号
viewBind.clLogout.clickAntiShake {
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="vm"
type="com.yidian.shenghuoquan.newscontent.ui.setting.FeedbackViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.yidian.common.widget.CommonTopBarView
android:id="@+id/bv_top_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:CommonTopBarView_title_text="@string/user_feedback"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/et_input"
android:layout_width="match_parent"
android:layout_height="@dimen/dp200"
android:layout_marginStart="@dimen/dp20"
android:layout_marginTop="@dimen/dp20"
android:layout_marginEnd="@dimen/dp20"
android:background="@drawable/shape_bg_input_boarder"
android:gravity="top"
android:hint="@string/describe_your_feedback"
android:padding="@dimen/dp10"
android:text="@={vm.feedbackContent}"
android:textColor="@color/color_333333"
android:textCursorDrawable="@drawable/shape_bg_input_cursor"
android:textSize="@dimen/sp14"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/bv_top_bar" />
<TextView
android:id="@+id/tv_word_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp10"
android:text='@{String.valueOf(vm.feedbackWordCount) + "/100"}'
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintBottom_toBottomOf="@id/et_input"
app:layout_constraintEnd_toEndOf="@id/et_input" />
<TextView
android:id="@+id/tv_commit_feedback"
android:layout_width="@dimen/dp315"
android:layout_height="@dimen/dp44"
android:layout_marginTop="@dimen/dp20"
android:background="@drawable/shape_bg_common_btn"
android:gravity="center"
android:onClick="@{() -> vm.requestCommitFeedback()}"
android:text="@string/commit_feedback"
android:textColor="@color/white"
android:textSize="@dimen/sp18"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_input" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
......@@ -187,5 +187,8 @@
<![CDATA[<p><font color=\'#DE000000\'>如果您经过慎重考虑,确定放弃账户,您的账户需同时满足以下条件:</font></p><p><font color=\'#DE000000\'>1、账户无异常行为记录,且账户信息无相关注销记录;</font></p><p><font color=\'#DE000000\'>2、账户内无未完成状态或完成未满15天的订单;</font></p><p><font color=\'#DE000000\'>3、账户无纠纷;</font></p><p><font color=\'#DE000000\'>4、账户下无资金、无欠款、无未完结历史订单;</font></p><p><font color=\'#DE000000\'>5、账户注销同时原钱包将同时注销,确保钱包处于正常状态、无余额零钱、无未完成交易、无处理中提现请求,不存在其他因注销账户产生的纠纷情况等。</font></p><br></br><p><font color=\'#DE000000\'>您的账户满足注销条件,您可以通过发送邮件至<font color=\'#1852F1\'>support.tpo@linkingcities.com</font>进行注销申请,我们将在15个工作日内为您进行处理。</font></p><br></br><p><b><font color=\'#DE000000\'>提示:</font></b></p><p><font color=\'#DE000000\'>账户注销后,账户信息及账户在平台产生的资产、虚拟权益无法恢复,可能对您主张售后服务带来不便。商户端账户注销将影响您在生活圈App内相关权益及信息。</font></p>]]>
</Data>
</string>
<string name="commit_feedback">提交反馈</string>
<string name="describe_your_feedback">请简要明确的描述您的意见和建议</string>
<string name="user_feedback">用户反馈</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment