From 15cbb4641352ae8ae9ce87fb99ead52886276b57 Mon Sep 17 00:00:00 2001 From: "admin-pc\\admin" Date: Sat, 21 Sep 2024 15:21:53 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 + .../main/java/com/rehome/dywoa/Contans.java | 34 +-- .../java/com/rehome/dywoa/bean/YzmBean.java | 85 +++++++ .../rehome/dywoa/ui/activity/LoginActivity.kt | 16 +- .../WjmmGetVerificationCodeActivity.kt | 211 ++++++++++++++++++ .../com/rehome/dywoa/utils/NohttpUtils.java | 22 ++ .../rehome/dywoa/weiget/CountdownView.java | 90 ++++++++ .../rehome/dywoa/weiget/RegexEditText.java | 192 ++++++++++++++++ .../countdown_color_next_selector.xml | 16 ++ .../res/drawable/countdown_color_selector.xml | 16 ++ .../res/drawable/countdown_next_selector.xml | 38 ++++ .../main/res/drawable/countdown_selector.xml | 38 ++++ app/src/main/res/layout/activity_login.xml | 14 +- .../activity_wjmm_get_verification_code.xml | 133 +++++++++++ app/src/main/res/values/attrs.xml | 24 +- app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 6 + app/src/main/res/values/styles.xml | 45 ++++ 18 files changed, 965 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/rehome/dywoa/bean/YzmBean.java create mode 100644 app/src/main/java/com/rehome/dywoa/ui/activity/WjmmGetVerificationCodeActivity.kt create mode 100644 app/src/main/java/com/rehome/dywoa/weiget/CountdownView.java create mode 100644 app/src/main/java/com/rehome/dywoa/weiget/RegexEditText.java create mode 100644 app/src/main/res/drawable/countdown_color_next_selector.xml create mode 100644 app/src/main/res/drawable/countdown_color_selector.xml create mode 100644 app/src/main/res/drawable/countdown_next_selector.xml create mode 100644 app/src/main/res/drawable/countdown_selector.xml create mode 100644 app/src/main/res/layout/activity_wjmm_get_verification_code.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0879cc2..661682c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -100,6 +100,10 @@ android:name=".ui.activity.vpn.AuthSuccessActivity" android:exported="false" android:screenOrientation="portrait" /> + Rows; + + public int getTotal() { + return Total; + } + + public void setTotal(int Total) { + this.Total = Total; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + /** + * result : 1 + * msg : 验证码发送成功! + * UserID : ZH_Admin + */ + + private String result; + private String msg; + private String UserID; + + private String token; + private String token_exp; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getUserID() { + return UserID; + } + + public void setUserID(String UserID) { + this.UserID = UserID; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getToken_exp() { + return token_exp; + } + + public void setToken_exp(String token_exp) { + this.token_exp = token_exp; + } + } +} diff --git a/app/src/main/java/com/rehome/dywoa/ui/activity/LoginActivity.kt b/app/src/main/java/com/rehome/dywoa/ui/activity/LoginActivity.kt index 23b812d..08ef7e4 100644 --- a/app/src/main/java/com/rehome/dywoa/ui/activity/LoginActivity.kt +++ b/app/src/main/java/com/rehome/dywoa/ui/activity/LoginActivity.kt @@ -157,6 +157,16 @@ class LoginActivity : BaseActivityOaToolbarViewBinding() { SFUemSDK.getInstance().logout() showToast(R.string.str_vpn_logout) } + binding.tvSbcChangePwd.setOnClickListener { + if (TextUtils.isEmpty(binding.etUsername.text.toString())) { + showToast("请先填写用户名/工号") + }else{ + val intent = Intent(context, WjmmGetVerificationCodeActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + intent.putExtra("account",binding.etUsername.text.toString()) + startActivity(intent) + } + } } @SuppressLint("SetTextI18n") @@ -188,12 +198,12 @@ class LoginActivity : BaseActivityOaToolbarViewBinding() { if (isApkInDebug(context)) { //测试 -// binding.etUsername.setText("371522") -// binding.etPassword.setText("A000000a") + binding.etUsername.setText("371522") + binding.etPassword.setText("A000000a.") //ceshi1 binding.etUsername.setText("ceshi1") - binding.etPassword.setText("A000000a") + binding.etPassword.setText("A000000a.") // binding.etUsername.setText("CY00011") // binding.etPassword.setText("A000000a") diff --git a/app/src/main/java/com/rehome/dywoa/ui/activity/WjmmGetVerificationCodeActivity.kt b/app/src/main/java/com/rehome/dywoa/ui/activity/WjmmGetVerificationCodeActivity.kt new file mode 100644 index 0000000..4572f9b --- /dev/null +++ b/app/src/main/java/com/rehome/dywoa/ui/activity/WjmmGetVerificationCodeActivity.kt @@ -0,0 +1,211 @@ +package com.rehome.dywoa.ui.activity + + +import android.text.Editable +import android.text.TextUtils +import android.util.Log +import android.view.View +import com.google.gson.Gson +import com.rehome.dywoa.Contans +import com.rehome.dywoa.R +import com.rehome.dywoa.base.BaseActivityOaToolbarViewBinding +import com.rehome.dywoa.bean.YzmBean +import com.rehome.dywoa.databinding.ActivityWjmmGetVerificationCodeBinding +import com.rehome.dywoa.utils.GsonUtils +import com.rehome.dywoa.utils.HttpListener +import com.rehome.dywoa.utils.NohttpUtils +import com.rehome.dywoa.utils.RSAUtils +import com.rehome.dywoa.utils.UiUtlis +import com.yolanda.nohttp.NoHttp +import com.yolanda.nohttp.RequestMethod +import java.util.* + +class WjmmGetVerificationCodeActivity : + BaseActivityOaToolbarViewBinding() { + + private var token: String = "" + private var token_exp: String = "" + + override fun getViewBinding() = ActivityWjmmGetVerificationCodeBinding.inflate(layoutInflater) + + override fun getToolbar() = binding.toolbarView.toolbar + + override fun initView() { + initToolbar("修改密码", "") {} + + } + + override fun initData() { + var account = intent.getStringExtra("account") + if(account!=null){ + binding.txGh.setText(account) + } + binding.buttonDjs.setOnClickListener(View.OnClickListener { + if (TextUtils.isEmpty(binding.txGh.text.toString().trim())) { + binding.txGh.error = "没有满足大写、小写、数字、符号" + showToast("请先输入工号!") + } else { + if (TextUtils.isEmpty( + binding.sjh.text.toString().trim() + ) || binding.sjh.text.toString().trim().length != 11 + ) { + binding.sjh.error = "没有满足大写、小写、数字、符号" + showToast("手机号输入不正确") + } else { + binding.buttonDjs.start() + getYzm() + } + } + }) + binding.buttonNext.setOnClickListener(View.OnClickListener { + if (TextUtils.isEmpty(binding.txGh.text.toString().trim())) { + binding.txGh.error = "没有满足大写、小写、数字、符号" + showToast("请先输入工号!") + } else if (TextUtils.isEmpty( + binding.sjh.text.toString().trim() + ) || binding.sjh.text.toString().trim().length != 11 + ) { + binding.sjh.error = "没有满足大写、小写、数字、符号" + showToast("手机号输入不正确") + } else if (TextUtils.isEmpty(binding.yzm.text.toString().trim())) { + binding.yzm.error = "没有满足大写、小写、数字、符号" + showToast("请输入验证码") + } else { + checkVerificationCode() + } + }) + +// binding.txGh.setText("ZHPS_Admin") +// binding.sjh.setText("15307858521") + } + + private fun getYzm() { + val json: String = getYzmParam() + + val url = Contans.IP + Contans.GETYZMANDCHECKYZMANDMODIFYMIMA + val request = NoHttp.createStringRequest(url, RequestMethod.POST) + request.setDefineRequestBodyForJson(json) + showLog(url) + + NohttpUtils.getInstance().add(this, 0, request, object : HttpListener { + override fun onSucceed(what: Int, response: com.yolanda.nohttp.rest.Response?) { + val jsonResult = response?.get() + + showLog("-----getYzm------") + showLog(jsonResult) + + val jsonDecode = RSAUtils.decryptBASE64StrClient(jsonResult) + if (TextUtils.isEmpty(jsonDecode)) { + showToast(UiUtlis.getString(context, R.string.data_error)) + } else { + val bean: YzmBean? = + GsonUtils.GsonToBean(jsonDecode, YzmBean::class.java) + showLog(jsonDecode); + if (bean != null && bean.rows != null && bean.rows.size > 0 && bean.rows[0].result == "1") { + showToast(bean.rows[0].msg) + binding.yzm.visibility = View.VISIBLE + binding.verificationCodeLine.visibility = View.VISIBLE + binding.buttonNext.visibility = View.VISIBLE + if(bean.rows[0].token!=null){ + token = bean.rows[0].token + } + if(bean.rows[0].token_exp!=null){ + token_exp = bean.rows[0].token_exp + } + } else { + if (bean != null) { + showToast(bean.rows[0].msg) + } + } + } + } + + override fun onFailed(what: Int, response: com.yolanda.nohttp.rest.Response?) { + Log.i("login", "onError") + } + }, true, true, "请稍候...") + + } + + //调用接口检查输入的验证码是否正确 + private fun checkVerificationCode() { + + val json: String = getCheckYzmParam() + val url = Contans.IP + Contans.GETYZMANDCHECKYZMANDMODIFYMIMA + val request = NoHttp.createStringRequest(url, RequestMethod.POST) + request.setDefineRequestBodyForJson(json) + showLog(url) + + + NohttpUtils.getInstance().add(this, 0,token, request, object : HttpListener { + override fun onSucceed(what: Int, response: com.yolanda.nohttp.rest.Response?) { + val jsonResult = response?.get() + + showLog("-----CheckYzm------") + showLog(jsonResult) + + val jsonDecode = RSAUtils.decryptBASE64StrClient(jsonResult) + if (TextUtils.isEmpty(jsonDecode)) { + showToast(UiUtlis.getString(context, R.string.data_error)) + } else { + val bean: YzmBean? = + GsonUtils.GsonToBean(jsonDecode, YzmBean::class.java) + showLog(jsonDecode); + if (bean != null && bean.rows != null && bean.rows.size > 0 && bean.rows[0].result == "2") { + //验证码正确 +// val intent = Intent( +// context, +// WjmmActivity::class.java +// ) +// intent.putExtra("gh", binding.txGh.text.toString().trim()) +// intent.putExtra("sjh", binding.sjh.text.toString().trim()) +// if(!TextUtils.isEmpty(token)){ +// intent.putExtra("token", token) +// intent.putExtra("token_exp", token_exp) +// startActivity(intent) +// }else{ +// showToast("验证码校验失败") +// } + } else { + if (bean != null) { + showToast(bean.rows[0].msg) + } + } + } + } + + override fun onFailed(what: Int, response: com.yolanda.nohttp.rest.Response?) { + Log.i("login", "onError") + } + }, true, true, "请稍候...") + } + + fun getYzmParam(): String { + + val param= mutableMapOf() + param["account"] = Objects.requireNonNull(binding.txGh.text).toString().trim() + + val json = Gson().toJson(param) + val jsonEncrypt = RSAUtils.encryptBASE64Str(json) + showLog(json); + showLog(jsonEncrypt) + return jsonEncrypt + } + + fun getCheckYzmParam(): String { + + val param= mutableMapOf() + param["userid"] = Objects.requireNonNull(binding.txGh.text).toString().trim() + param["type"] = "3" + param["telphone"] = Objects.requireNonNull(binding.sjh.text).toString().trim() + param["verificationcode"] = Objects.requireNonNull(binding.yzm.text).toString().trim() + param["token"] = token + param["token_exp"] = token_exp + + val json = Gson().toJson(param) + val jsonEncrypt = RSAUtils.encryptBASE64Str(json) + showLog(json); + return jsonEncrypt + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/dywoa/utils/NohttpUtils.java b/app/src/main/java/com/rehome/dywoa/utils/NohttpUtils.java index 1706237..a706bf4 100644 --- a/app/src/main/java/com/rehome/dywoa/utils/NohttpUtils.java +++ b/app/src/main/java/com/rehome/dywoa/utils/NohttpUtils.java @@ -118,6 +118,28 @@ public class NohttpUtils { mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, true, true, "加载中...")); } + /** + * 添加请求 + * + * @param mActivity activity + * @param what 请求码,用来区分队列中的请求 + * @param token token + * @param request 请求 + * @param callback 请求回调 + * @param canCanel 是否可以取消请求 + * @param isLoading 是否弹出对话框 + * @param + */ + public void add(Activity mActivity, int what,String token, Request request, HttpListener callback, boolean canCanel, boolean isLoading, String msg) { + if(token!=null){ + String credential = "Bearer " + token; + request.addHeader("Authorization", credential); + showLog(request.url(),mActivity); + } + mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, canCanel, isLoading, msg)); + } + + public void addNoProgress(Context context, int what, Request request, HttpListener callback) { if(App.getInstance().getUserInfo()!=null){ if(DataPassUtils.checkCanLoginTokenLong()){ diff --git a/app/src/main/java/com/rehome/dywoa/weiget/CountdownView.java b/app/src/main/java/com/rehome/dywoa/weiget/CountdownView.java new file mode 100644 index 0000000..1d91933 --- /dev/null +++ b/app/src/main/java/com/rehome/dywoa/weiget/CountdownView.java @@ -0,0 +1,90 @@ +package com.rehome.dywoa.weiget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatTextView; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2018/10/18 + * desc : 验证码倒计时 + */ +public final class CountdownView extends AppCompatTextView implements Runnable { + + /** 倒计时秒数 */ + private int mTotalSecond = 60; + /** 秒数单位文本 */ + private static final String TIME_UNIT = "S"; + + /** 当前秒数 */ + private int mCurrentSecond; + /** 记录原有的文本 */ + private CharSequence mRecordText; + + public CountdownView(Context context) { + super(context); + } + + public CountdownView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public CountdownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + /** + * 设置倒计时总秒数 + */ + public void setTotalTime(int totalTime) { + this.mTotalSecond = totalTime; + } + + /** + * 开始倒计时 + */ + public void start() { + mRecordText = getText(); + setEnabled(false); + mCurrentSecond = mTotalSecond; + post(this); + } + + /** + * 结束倒计时 + */ + public void stop() { + setText(mRecordText); + setEnabled(true); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + // 设置点击的属性 + setClickable(true); + } + + @Override + protected void onDetachedFromWindow() { + // 移除延迟任务,避免内存泄露 + removeCallbacks(this); + super.onDetachedFromWindow(); + } + + @SuppressLint("SetTextI18n") + @Override + public void run() { + if (mCurrentSecond == 0) { + stop(); + } else { + mCurrentSecond--; + setText(mCurrentSecond + " " + TIME_UNIT); + postDelayed(this, 1000); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/dywoa/weiget/RegexEditText.java b/app/src/main/java/com/rehome/dywoa/weiget/RegexEditText.java new file mode 100644 index 0000000..e8d18cb --- /dev/null +++ b/app/src/main/java/com/rehome/dywoa/weiget/RegexEditText.java @@ -0,0 +1,192 @@ +package com.rehome.dywoa.weiget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.text.InputFilter; +import android.text.Spanned; +import android.text.TextUtils; +import android.util.AttributeSet; + +import androidx.appcompat.widget.AppCompatEditText; + + +import com.rehome.dywoa.R; + +import java.util.regex.Pattern; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2019/06/29 + * desc : 正则输入限制编辑框 + */ +public class RegexEditText extends AppCompatEditText implements InputFilter { + + /** 手机号(只能以 1 开头) */ + public static final String REGEX_MOBILE = "[1]\\d{0,10}"; + /** 中文(普通的中文字符) */ + public static final String REGEX_CHINESE = "[\\u4e00-\\u9fa5]*"; + /** 英文(大写和小写的英文) */ + public static final String REGEX_ENGLISH = "[a-zA-Z]*"; + /** 计数(非 0 开头的数字) */ + public static final String REGEX_COUNT = "[1-9]\\d*"; + /** 用户名(中文、英文、数字) */ + public static final String REGEX_NAME = "[[\\u4e00-\\u9fa5]|[a-zA-Z]|\\d]*"; + /** 非空格的字符(不能输入空格) */ + public static final String REGEX_NONNULL = "\\S+"; + + /** 正则表达式规则 */ + private Pattern mPattern; + + public RegexEditText(Context context) { + this(context, null); + } + + public RegexEditText(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.editTextStyle); + } + + public RegexEditText(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + final TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RegexEditText); + + if (array.hasValue(R.styleable.RegexEditText_inputRegex)) { + setInputRegex(array.getString(R.styleable.RegexEditText_inputRegex)); + } else { + if (array.hasValue(R.styleable.RegexEditText_regexType)) { + int regexType = array.getInt(R.styleable.RegexEditText_regexType, 0); + switch (regexType) { + case 0x01: + setInputRegex(REGEX_MOBILE); + break; + case 0x02: + setInputRegex(REGEX_CHINESE); + break; + case 0x03: + setInputRegex(REGEX_ENGLISH); + break; + case 0x04: + setInputRegex(REGEX_COUNT); + break; + case 0x05: + setInputRegex(REGEX_NAME); + break; + case 0x06: + setInputRegex(REGEX_NONNULL); + break; + default: + break; + } + } + } + + array.recycle(); + } + + /** + * 是否有这个输入标记 + */ + public boolean hasInputType(int type) { + return (getInputType() & type) != 0; + } + + /** + * 添加一个输入标记 + */ + public void addInputType(int type) { + setInputType(getInputType() | type); + } + + /** + * 移除一个输入标记 + */ + public void removeInputType(int type) { + setInputType(getInputType() & ~type); + } + + /** + * 设置输入正则 + */ + public void setInputRegex(String regex) { + if (TextUtils.isEmpty(regex)) { + return; + } + + mPattern = Pattern.compile(regex); + addFilters(this); + } + + /** + * 获取输入正则 + */ + public String getInputRegex() { + if (mPattern == null) { + return null; + } + return mPattern.pattern(); + } + + /** + * 添加筛选规则 + */ + public void addFilters(InputFilter filter) { + if (filter == null) { + return; + } + + final InputFilter[] newFilters; + final InputFilter[] oldFilters = getFilters(); + if (oldFilters != null && oldFilters.length > 0) { + newFilters = new InputFilter[oldFilters.length + 1]; + // 复制旧数组的元素到新数组中 + System.arraycopy(oldFilters, 0, newFilters, 0, oldFilters.length); + newFilters[oldFilters.length] = filter; + } else { + newFilters = new InputFilter[1]; + newFilters[0] = filter; + } + super.setFilters(newFilters); + } + + /** + * {@link InputFilter} + * + * @param source 新输入的字符串 + * @param start 新输入的字符串起始下标,一般为0 + * @param end 新输入的字符串终点下标,一般为source长度-1 + * @param dest 输入之前文本框内容 + * @param destStart 原内容起始坐标,一般为0 + * @param destEnd 原内容终点坐标,一般为dest长度-1 + * @return 返回字符串将会加入到内容中 + */ + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int destStart, int destEnd) { + if (mPattern != null) { + // 拼接出最终的字符串 + String begin = dest.toString().substring(0, destStart); + String over = dest.toString().substring(destStart + (destEnd - destStart), destStart + (dest.toString().length() - begin.length())); + String result = begin + source + over; + + // 判断是插入还是删除 + if (destStart > destEnd - 1) { + // 如果是插入字符 + if (!mPattern.matcher(result).matches()) { + // 如果不匹配就不让这个字符输入 + return ""; + } + } else { + // 如果是删除字符 + if (!mPattern.matcher(result).matches()) { + // 如果不匹配则不让删除(删空操作除外) + if (!"".equals(result)) { + return dest.toString().substring(destStart, destEnd); + } + } + } + } + + // 不做任何修改 + return source; + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/countdown_color_next_selector.xml b/app/src/main/res/drawable/countdown_color_next_selector.xml new file mode 100644 index 0000000..daa3382 --- /dev/null +++ b/app/src/main/res/drawable/countdown_color_next_selector.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/countdown_color_selector.xml b/app/src/main/res/drawable/countdown_color_selector.xml new file mode 100644 index 0000000..f0f83cd --- /dev/null +++ b/app/src/main/res/drawable/countdown_color_selector.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/countdown_next_selector.xml b/app/src/main/res/drawable/countdown_next_selector.xml new file mode 100644 index 0000000..6631a8a --- /dev/null +++ b/app/src/main/res/drawable/countdown_next_selector.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/countdown_selector.xml b/app/src/main/res/drawable/countdown_selector.xml new file mode 100644 index 0000000..9a52ad4 --- /dev/null +++ b/app/src/main/res/drawable/countdown_selector.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 05f2c70..cd48f46 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -154,6 +154,18 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index ea30109..470245a 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -41,14 +41,30 @@ - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f62f98f..b294738 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -60,4 +60,6 @@ #f6f6f6 #EFF0F2 #5e86e9 + #BBBBBB + #ECECEC \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 623c553..7022beb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -96,4 +96,10 @@ 启动隧道 关闭隧道 主从测试 + 第一步:获取验证码 + 重置密码前需提供工号和手机号获取验证码 + 第二步:重置密码 + 密码长度不能小于8位,且必须为大小写字母、数字和特殊字符组成! + 输入验证码(必填) + 发送验证码 \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index deb69f3..02525e0 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -203,5 +203,50 @@ 12sp @color/black + + + + + + + +