基础库
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

697 行
32 KiB

  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'package:flutter/cupertino.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:secverify/secverify.dart';
  6. import 'package:zhiying_comm/models/user/user_info_model.dart';
  7. import 'package:zhiying_comm/models/user/user_info_model_notifier.dart';
  8. import 'package:zhiying_comm/pages/login_page/account/login_account_page.dart';
  9. import 'package:zhiying_comm/pages/login_page/invite/login_invite_page.dart';
  10. import 'package:zhiying_comm/pages/login_page/model/login_style_model.dart';
  11. import 'package:zhiying_comm/util/dialog/loading/loading.dart';
  12. import 'package:zhiying_comm/util/empty_util.dart';
  13. import 'package:zhiying_comm/util/global_config.dart';
  14. import 'package:zhiying_comm/util/log/let_log.dart';
  15. import 'package:zhiying_comm/util/net_util.dart';
  16. import 'package:provider/provider.dart';
  17. import 'package:fluttertoast/fluttertoast.dart';
  18. import 'package:zhiying_comm/util/router_util.dart';
  19. import '../../page_factory.dart';
  20. class QuickLoginUtil {
  21. // sdk 版本
  22. String _version = "unkown";
  23. // 是否支持
  24. bool _isVerifySupport = true;
  25. /// 单例对象
  26. static QuickLoginUtil _instance;
  27. /// 内部构造方法,可避免外部暴露构造函数,进行实例化
  28. QuickLoginUtil._internal();
  29. /// 工厂构造方法,这里使用命名构造函数方式进行声明
  30. factory QuickLoginUtil.getInstance() => _getInstance();
  31. static bool sevIngSuccess = false;
  32. /// 获取单例内部方法
  33. static _getInstance() {
  34. // 只能有一个实例
  35. if (_instance == null) {
  36. _instance = QuickLoginUtil._internal();
  37. }
  38. return _instance;
  39. }
  40. /// 初始化方法
  41. void init() {
  42. //可选预先设置
  43. _preSettings();
  44. //判断手机本地环境是否支持
  45. isVerifySupport();
  46. if (_isVerifySupport) {
  47. //预取号
  48. _preVerify();
  49. }
  50. }
  51. /// 打开秒验登录页面的方法
  52. void openQuickLogin(BuildContext context, Quick model) async {
  53. sevIngSuccess = false;
  54. Timer(Duration(milliseconds: 3000), () {
  55. if (!sevIngSuccess) {
  56. Loading.dismiss();
  57. _openSMSLoginPage(context);
  58. }
  59. });
  60. Loading.show(context);
  61. // 取号前设置
  62. Secverify.autoFinishOauthPage(false);
  63. //设置UI属性
  64. _setPortraitLayout(model);
  65. await Secverify.isVerifySupport.then((bool value) {
  66. if (value) {
  67. _verify(context);
  68. } else {
  69. sevIngSuccess = true;
  70. // showAlert("当前环境不支持", context);
  71. Logger.warn("当前环境不支持");
  72. Loading.dismiss();
  73. _openSMSLoginPage(context);
  74. }
  75. });
  76. }
  77. /// 打开验证码登录的方法
  78. void _openSMSLoginPage(BuildContext context) {
  79. /// 需要填写注册码再跳首页
  80. Navigator.push(context, CupertinoPageRoute(builder: (_) => LoginAccountPage(null)));
  81. }
  82. /// 打开邀请码页面
  83. void _openInvitePage(BuildContext context, String mobile) {
  84. print('跳转到邀请码页面');
  85. Navigator.push(context, CupertinoPageRoute(builder: (_) => LoginInvitePage({'mobile': mobile})));
  86. }
  87. /// 打开首页的方法
  88. void _openHomePage(BuildContext context) {
  89. RouterUtil.goBackHomePage(context);
  90. // Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => PageFactory.create('homePage', null)), (Route<dynamic> route) => false);
  91. }
  92. // 需要自己实现这部分
  93. Future _doLogin(Map ret, BuildContext context) async {
  94. var opToken = ret.containsKey("opToken") ? ret["opToken"] : "";
  95. var token = ret.containsKey("token") ? ret["token"] : "";
  96. var operator = ret.containsKey("operator") ? ret["operator"] : "";
  97. var phoneOperator = ret.containsKey("phoneOperator") ? ret["phoneOperator"] : "";
  98. var md5 = ret.containsKey("md5") ? ret["md5"] : "";
  99. // var appKey = ret.containsKey("appkey") ? ret["appkey"] : "";
  100. var params = Map<String, String>();
  101. params["optoken"] = opToken;
  102. params["operator"] = operator;
  103. params["operator"] = phoneOperator;
  104. params["token"] = token;
  105. if (!EmptyUtil.isEmpty(md5)) params["md5"] = md5;
  106. // params["appkey"] = appKey;
  107. try {
  108. BuildContext context1 = navigatorKey.currentState.overlay.context;
  109. Loading.show(context1, msg: "加载中...");
  110. print("加载中...");
  111. var result = await NetUtil.post('/api/v1/sign/mob/in', params: params, method: NetMethod.POST);
  112. if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) {
  113. Loading.dismiss();
  114. UserInfoModel model = UserInfoModel.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
  115. if (!EmptyUtil.isEmpty(model)) {
  116. if (model.registerInviteCodeEnable == '1') {
  117. /// 需要填写注册码再跳首页
  118. _openInvitePage(context, model?.username);
  119. return;
  120. } else {
  121. /// 不需要填写注册码,直接登录
  122. Provider.of<UserInfoNotifier>(context, listen: false).setUserInfo(model);
  123. _openHomePage(context);
  124. return;
  125. }
  126. }
  127. } else {
  128. Loading.dismiss();
  129. }
  130. } catch (e, s) {
  131. Loading.dismiss();
  132. Logger.error(e, s);
  133. }
  134. Fluttertoast.showToast(msg: '登录失败');
  135. }
  136. // 预取号
  137. void _preVerify() {
  138. Secverify.preVerify((Map ret, Map err) {
  139. if (err != null) {
  140. //失败情况下会返回错误信息,可以打印查看
  141. // showAlert(err.toString(),context);
  142. Logger.log('mob 秒验登录失败: ${err?.toString()}, sdk 版本 = ${_version}');
  143. } else {
  144. String rst = ret.toString();
  145. if (ret == null || ret.isEmpty) {
  146. rst = 'mob 秒验 预登录成功!, sdk 版本 = ${_version}, ret = ${rst?.toString()}';
  147. Logger.log(rst);
  148. }
  149. // showAlert(rst,context);
  150. }
  151. });
  152. }
  153. // 预登录
  154. void _preSettings() {
  155. //提交隐私协议结果
  156. Secverify.submitPrivacyGrantResult(true);
  157. //是否自动关闭授权页面,如果不自动关闭,必须在取号回调中调用方法关闭授权页面
  158. Secverify.autoFinishOauthPage(false);
  159. //是否输出运营商控制台日志
  160. Secverify.setDebugMode(false);
  161. //设置超时时间
  162. Secverify.setTimeOut(2000);
  163. //获取当前SDK版本号
  164. getVersion();
  165. }
  166. // 获取SDK版本
  167. Future<String> getVersion() async {
  168. String version;
  169. version = await Secverify.getVersion;
  170. _version = version;
  171. return _version;
  172. }
  173. // 是否支持登录
  174. Future<bool> isVerifySupport() async {
  175. bool isVerifySupport = await Secverify.isVerifySupport;
  176. this._isVerifySupport = isVerifySupport;
  177. return this._isVerifySupport;
  178. }
  179. // 取号接口
  180. void _verify(BuildContext context) {
  181. Secverify.preVerify((ret, err) async {
  182. sevIngSuccess = true;
  183. if (err != null) {
  184. // showAlert(err.toString(),context);
  185. Logger.log(err.toString());
  186. _openSMSLoginPage(context);
  187. Loading.dismiss();
  188. } else {
  189. Secverify.verify((Map ret, Map err) async {
  190. if (err != null) {
  191. //打印错误信息
  192. // showAlert(err.toString(), context);
  193. Logger.log(err.toString());
  194. _openSMSLoginPage(context);
  195. Loading.dismiss();
  196. Secverify.finshOauthPage();
  197. // Fluttertoast.showToast(msg: '未知错误 err = ${err?.toString()}');
  198. } else {
  199. String rst = ret.toString();
  200. if (ret == null || ret.isEmpty) {
  201. rst = '登录失败';
  202. // showAlert(rst, context);
  203. Logger.log(rst);
  204. Loading.dismiss();
  205. Fluttertoast.showToast(msg: '登录失败');
  206. } else if (ret.containsKey("otherLogin")) {
  207. ///其他登录方式
  208. _openSMSLoginPage(context);
  209. //调用此方法手动关闭授权页面
  210. Loading.dismiss();
  211. Secverify.finshOauthPage();
  212. } else if (ret.containsKey("opToken")) {
  213. //如果登录成功,将返回的信息提交给自己的服务器
  214. await _doLogin(ret, context);
  215. //调用此方法手动关闭授权页面
  216. Loading.dismiss();
  217. Secverify.finshOauthPage();
  218. } else {
  219. //调用此方法手动关闭授权页面
  220. Loading.dismiss();
  221. Secverify.finshOauthPage();
  222. }
  223. }
  224. }).then((value) {
  225. print(value);
  226. });
  227. }
  228. });
  229. }
  230. // 设置授权页面属性
  231. void _setPortraitLayout(Quick model) {
  232. if (Platform.isAndroid) {
  233. // 以下是 Android 自定义设置
  234. // 导航栏设置
  235. var customNav = {
  236. "navColor": "#FFFFFF", //导航栏背景颜色
  237. // "navText": "一键登录", //导航栏文本内容
  238. "navTextColor": "#ffffff", //导航栏文本颜色
  239. "navHidden": false, //导航栏是否隐藏
  240. "navTransparent": false, //导航栏是否透明
  241. "navCloseImgHidden": false, //导航栏返回图片是否隐藏
  242. "navTextSize": 16, //导航栏文本大小
  243. "navTextBold": false, //导航栏文本是否加粗
  244. "navCloseImgPath": "close.png", //导航栏返回图片地址
  245. "portraitLayout": {
  246. "layoutWidth": 50, //导航栏图片宽度
  247. "layoutHeight": 50, //导航栏图片高度
  248. "layoutLeft": 10, //导航栏图片左间距
  249. // "layoutRight": 30,//导航栏图片右间距
  250. // "layoutTop": 10,//导航栏图片顶部间距
  251. }
  252. };
  253. // 授权页
  254. var customAuthPage = {
  255. // "backgroundImg":"bg.png",//授权页面背景图片地址
  256. "backgroundClickClose": false, //授权页面点击关闭
  257. "fullScreen": false, //是否全屏
  258. "immersiveTheme": true, // 是否沉浸式透明状态栏
  259. "immersiveStatusTextColorBlack": true // 是否修改状态栏意思
  260. };
  261. // 授权页Logo
  262. var customAuthPageLogo = {
  263. "logoImg": "app_icon.png", //logo地址
  264. "logoAlignParentRight": false, //logo是否靠页面右侧
  265. "logoHidden": false, // logo是否隐藏
  266. "portraitLayout": {
  267. "layoutWidth": 80, //logo宽度
  268. "layoutHeight": 80, //logo高度
  269. // "layoutLeft": 30,//logo左间距
  270. // "layoutRight": 30,//logo右间距
  271. "layoutTop": 30, //logo顶部间距
  272. // "layoutBottom": 30,//logo底部间距
  273. }
  274. };
  275. // 手机号码
  276. var customPhoneNumber = {
  277. "numberColor": model?.accountColor ?? "#333333", // 脱敏手机号颜色
  278. "numberSize": 22, //脱敏手机号大小
  279. "numberAlignParentRight": false, //脱敏手机号是否靠页面右侧
  280. "numberHidden": false, //脱敏手机号是否隐藏
  281. "numberBold": true, //脱敏手机号字体是否加粗
  282. "portraitLayout": {
  283. // "layoutLeft": 30,//脱敏手机号左间距
  284. // "layoutRight": 30,//脱敏手机号右间距
  285. // "layoutTop": 130,//脱敏手机号顶部间距
  286. // "layoutBottom": 30,//脱敏手机号底部间距
  287. }
  288. };
  289. // 切换帐号按钮
  290. var customSwitchNumber = {
  291. "switchAccColor": model?.textTipColor ?? '#FF3939', //切换登录文本颜色
  292. "switchAccTextSize": 13, //切换登录文字大小
  293. "switchAccHidden": false, //切换登录是否隐藏
  294. "switchAccAlignParentRight": false, //切换登录是否靠屏幕右侧
  295. // "switchAccText": model?.textTip ?? '切换账号', //切换登录文本内容
  296. "switchAccText": ' ',
  297. "switchAccTextBold": false, //切换登录文本是否加粗
  298. "portraitLayout": {
  299. // "layoutLeft": 30,//切换登录左间距
  300. // "layoutRight": 30,//切换登录右间距
  301. // "layoutTop": 170,//切换登录顶部间距
  302. // "layoutBottom": 30,//切换登录底部间距
  303. }
  304. };
  305. // 登陆按钮设置
  306. var customLoginBtn = {
  307. "loginBtnImgArr": [model?.btnSubmitBgColor ?? "#FF0000", model?.btnSubmitBgColor ?? "#FF0000", model?.btnSubmitBgColor ?? "#FF0000"], //登录按钮背景图片或者颜色
  308. "loginBtnText": model?.btnSubmitText ?? "立即登录", //登录按钮文本
  309. "loginBtnTextColor": model?.btnSubmitTextColor ?? "#FFFFFF", //登录按钮文字颜色
  310. "loginBtnTextSize": 15, //登录按钮文本大小
  311. "loginBtnAlignParentRight": false, //登录按钮是否靠屏幕右侧
  312. "loginBtnHidden": false, //登录按钮是否隐藏
  313. "loginBtnTextBold": false, //登录按钮文本是否加粗
  314. "portraitLayout": {
  315. // "layoutWidth": 200,//登录按钮宽度
  316. // "layoutHeight": 30,//登录按钮高度
  317. // "layoutLeft": 30,//登录按钮左间距
  318. // "layoutRight": 30,//登录按钮右间距
  319. // "layoutTop": 200,//登录按钮顶部间距
  320. // "layoutBottom": 30,//登录按钮底部间距
  321. }
  322. };
  323. // 隐私条款设置(切记,不可隐藏)
  324. var customPrivacy = {
  325. "agreementColor": "${model?.protocol[1]?.textColor ?? '#FF3939'}", //运营商隐私条款颜色和自定义隐私条款文本颜色
  326. "agreementBaseTextColor": "${model?.protocol[0]?.textColor ?? '#C0C0C0'}", //隐私条款其他文字颜色
  327. "agreementTextSize": 11, //隐私条款文字大小
  328. "agreementTextStart": "${model?.protocol[0]?.text ?? '同意'} ", //隐私条款开头文本
  329. "agreementTextEnd": " ", //隐私条款结束文本
  330. "agreementAlignParentRight": false, //隐私条款是否靠屏幕右侧
  331. "agreementHidden": false, //隐私条款是否隐藏
  332. 'secPrivacyProtocolMarkArr': ['《', '》'], // 协议文本前后符号(例['<','>'])
  333. "agreementCmccText": "《中国移动服务协议》", //隐私条款 移动运营商显示文本
  334. "agreementCuccText": "《中国联通服务协议》", //隐私条款 联通运营商显示文本
  335. "agreementCtccText": "《中国电信服务协议》", //隐私条款 电信运营商显示文本
  336. "agreementTextBold": false, //隐私条款文本是否加粗
  337. "agreementTextWithUnderLine": false, //隐私条款是否带下划线
  338. "cusAgreementFirstArray": ['${model?.protocol[1]?.text ?? '《用户协议》'}', '${model?.protocol[1]?.url}', ''], //隐私条款 自定义一
  339. "cusAgreementSecondArray": ['${model?.protocol[3]?.text ?? '《隐私政策》'}', '${model?.protocol[3]?.url}', '${model?.protocol[2]?.text ?? '及'}'], //隐私条款 自定义二
  340. "agreementUncheckHintText": "请阅读并勾选隐私协议", //隐私条款 未勾选时提示的文本
  341. "portraitLayout": {
  342. "layoutLeft": 20, //隐私条款左间距
  343. "layoutRight": 20, //隐私条款右间距
  344. // "layoutTop": 250,//隐私条款顶部间距
  345. // "layoutBottom": 20,//隐私条款底部间距
  346. }
  347. };
  348. // 隐私条款复选框
  349. var customCheckBox = {
  350. // "checkboxImg": ["checked.png", "uncheck.png"], // 隐私协议checkbox背景图片
  351. "checkboxDefaultState": true, // 隐私协议checkbox默认状态
  352. "checkboxHidden": false, //隐私协议checkbox是否隐藏
  353. "scale": 1.2,
  354. "portraitLayout": {
  355. // "layoutWidth": 50,//隐私协议checkbox 返回图标宽度
  356. // "layoutHeight": 50,//隐私协议checkbox 返回图标高度
  357. // "layoutLeft": 20,//隐私协议checkbox左间距
  358. // "layoutRight": 20,//隐私协议checkbox右间距
  359. // "layoutTop": 10,//隐私协议checkbox顶部间距
  360. // "layoutBottom": 20,//隐私协议checkbox底部间距
  361. }
  362. };
  363. // 隐私条款具体协议内容页面设置
  364. var customPrivacyContentPage = {
  365. "agreementPageTitle": "隐私协议页", //隐私协议页面 标题
  366. "cusAgreementPageOneTitle": "自定义隐私协议页一", //隐私协议页面 自定义隐私协议一标题
  367. "cusAgreementPageTwoTitle": "自定义隐私协议页二", //隐私协议页面 自定义隐私协议二标题
  368. "cusAgreementPageThreeTitle": "自定义隐私协议页三", //隐私协议页面 自定义隐私协议三标题
  369. "agreementPageCloseImg": "close.png", //隐私协议页面 返回图标名称
  370. "agreementPageTitleTextSize": 16, //隐私协议页面 标题文本大小
  371. "agreementPageTitleTextColor": "#330F33", //隐私协议页面 标题文本颜色
  372. "agreementPageTitleTextBold": true, //隐私协议页面 标题文本是否加粗
  373. "agreementPageTitleHidden": false, //隐私协议页面 标题文本是否隐藏
  374. "agreementPageCloseImgHidden": false, //隐私协议页面 返回图标是否隐藏
  375. "portraitLayout": {
  376. "layoutWidth": 50, //隐私协议页面 返回图标宽度
  377. "layoutHeight": 50, //隐私协议页面 返回图标高度
  378. }
  379. };
  380. // 运营商品牌标签
  381. var customOperatorSlogan = {
  382. "sloganTextSize": 20, // Slogan文本大小
  383. "sloganTextColor": "#330F33", // Slogan文本颜色
  384. "sloganHidden": false, // Slogan是否隐藏
  385. "sloganAlignParentRight": false, // Slogan是否靠屏幕右侧
  386. "sloganTextBold": true, // Slogan文本是否加粗
  387. "portraitLayout": {
  388. // "layoutLeft": 30,//Slogan左间距
  389. // "layoutRight": 30,//Slogan右间距
  390. // "layoutTop": 30,//Slogan顶部间距
  391. "layoutBottom": 30, //Slogan底部间距
  392. }
  393. };
  394. // 弹窗设置
  395. var customDialog = {
  396. "dialogTheme": false, //弹框
  397. "dialogAlignBottom": false, //弹框是否靠底部
  398. // "dialogBackground": "bg.png",//弹框蒙版背景图片名称
  399. "dialogBackgroundClickClose": false, //弹框蒙版背景是否点击关闭
  400. "portraitLayout": {
  401. "layoutWidth": 250, //弹框宽度
  402. "layoutHeight": 400, //弹框高度
  403. "layoutLeft": 30, //弹框左间距
  404. "layoutTop": 30, //弹框顶部间距
  405. }
  406. };
  407. // 自定义控件设置,目前安卓只支持文本TextView和图片ImageView
  408. var customView = {
  409. "customView": [
  410. {
  411. "viewClass": "TextView", //添加的控件类型
  412. "viewText": "测试文本1", // 控件文本
  413. "viewTextColor": "#330F33", // 控件文本颜色
  414. "viewTextFont": 20, // 控件文本大小
  415. "viewTextBold": true, // 控件文本是否加粗
  416. "viewAlignParentRight": false, // 控件是否靠屏幕右侧
  417. "viewHorizontalCenter": true, //控件是否靠屏幕中间
  418. "portraitLayout": {
  419. // "layoutLeft": 30,//控件左间距
  420. // "layoutRight": 30,//控件右间距
  421. // "layoutTop": 30,//控件顶部间距
  422. "layoutBottom": 135, //控件底部间距
  423. }
  424. },
  425. {
  426. "viewClass": "TextView", //添加的控件类型
  427. "viewText": "测试文本2", // 控件文本
  428. "viewTextColor": "#330F33", // 控件文本颜色
  429. "viewTextFont": 16, // 控件文本大小
  430. "viewTextBold": false, // 控件文本是否加粗
  431. "viewAlignParentRight": false, //控件是否靠屏幕右侧
  432. "viewHorizontalCenter": true, //控件是否靠屏幕中间
  433. "portraitLayout": {
  434. // "layoutLeft": 30,//控件左间距
  435. // "layoutRight": 30,//控件右间距
  436. // "layoutTop": 50,//控件顶部间距
  437. "layoutBottom": 115, //控件底部间距
  438. },
  439. },
  440. {
  441. "viewClass": "ImageView", //添加的控件类型
  442. "viewImg": "logo.png", //图片的地址
  443. "viewAlignParentRight": false, //控件是否靠屏幕右侧
  444. "viewHorizontalCenter": true, //控件是否靠屏幕中间
  445. "portraitLayout": {
  446. "layoutWidth": 30, //隐私协议页面 返回图标宽度
  447. "layoutHeight": 30, //隐私协议页面 返回图标高度
  448. // "layoutLeft": 30,//控件左间距
  449. // "layoutRight": 30,//控件右间距
  450. // "layoutTop": 50,//控件顶部间距
  451. "layoutBottom": 75, //控件底部间距
  452. },
  453. }
  454. ]
  455. };
  456. var customParams = {
  457. // 'customNav': customNav,//导航栏设置
  458. 'customAuthPage': customAuthPage, //授权页面设置
  459. // 'customAuthPageLogo': customAuthPageLogo,//logo设置
  460. 'customPhoneNumber': customPhoneNumber, //脱敏手机号设置
  461. 'customSwitchNumber': customSwitchNumber, //切换登录设置
  462. 'customCheckBox': customCheckBox, //复选框设置
  463. 'customPrivacy': customPrivacy, //隐私条款设置
  464. // 'customPrivacyContentPage': customPrivacyContentPage,//隐私协议页面设置
  465. 'customLoginBtn': customLoginBtn, //登录按钮设置
  466. // 'customOperatorSlogan': customOperatorSlogan,//slogan设置
  467. // 'customDialog': customDialog,//弹框设置
  468. // 'customView': customView,//自定义控件设置
  469. };
  470. Secverify.setPortraitLayout(customParams);
  471. // Secverify.setLandscapeLayout(customParams);
  472. } else if (Platform.isIOS) {
  473. // 以下是 iOS 自定义设置
  474. // 自定义动画设置
  475. var customAnimation = {
  476. 'secAnimateType': 1, //动画类型 0:默认 1:水平翻转 2:淡入淡出 3: Alert 4: Push 5:sheet
  477. // 'secShowType': 0, //展示类型 0:默认 1:Alert 2:Push 3: Sheet
  478. // 以下自定义动画设置只针对于Alert/Sheet展示类型
  479. 'secAnimateBgColor': '#F7B376', //弹窗控制器的背景色
  480. 'secLeftControlImage': 'leftImg.png', //左边按钮背景图片名称
  481. 'secLeftControlHidden': true, //左边按钮是否显示
  482. 'secRightControlImage': 'rightImg.png', //右边按钮背景图片名称
  483. 'secRightControlHidden': true, //右边按钮是否显示
  484. 'secBgViewHidden': false, //背景视图是否展示
  485. 'secBgViewCorner': 15, //背景视图的圆角
  486. 'secBgViewColor': '#000000', //背景视图颜色
  487. 'secBgViewImage': 'bgImg.png', //背景视图的背景图片名称
  488. 'secCloseType': true, //关闭按钮显示在左边还是右边 true:左边 false:右边
  489. };
  490. // 导航栏设置
  491. var customNav = {
  492. 'secNavBarTintColor': '#FFFFFF', // 导航栏背景色(default is white)
  493. // 'secNavText': '一键验证', // 导航栏标题
  494. // 'secNavReturnImg': 'close.png', // 导航栏返回按钮图标
  495. // 'secNavBottomLineHidden': true, // 是否隐藏导航栏尾部线条(默认显示,例: true)
  496. // 'secNavBarHidden': false, // 导航栏隐藏(例: false)
  497. // 'secNavStatusBarHidden': false, // 导航栏状态栏隐藏(例: false)
  498. // 'secNavTranslucent': false, // 导航栏透明(例: false)
  499. // 'secNavBackBtnHidden': false, // 导航栏返回按钮隐藏(例: false)
  500. // 'secNavLeftControlHidden': false, // 隐藏导航栏左边按钮
  501. // 'secNavTintColor': '#FF0000', // 导航栏文字颜色
  502. // 'secNavBackgroundClear': false, // 导航栏背景透明(例: false)
  503. };
  504. // 授权页
  505. var customAuthPage = {
  506. // 'secBackgroundColor': '#E5E589', // 授权页背景颜色
  507. 'secBgImg': 'bg.png', // 授权背景图片
  508. 'secCancelBySingleClick': false, //单击页面实现取消操作(例: false)
  509. };
  510. // 授权页Logo
  511. var customAuthPageLogo = {
  512. 'secLogoImg': 'app_icon.png', // Logo图片名称
  513. 'secLogoHidden': false, // Logo是否隐藏(例: false)
  514. // 'secLogoCornerRadius': 10, // Logos圆角(例: 10)
  515. // 'secPortraitLayout': {
  516. // // 针对该控件的竖屏布局(注意: 每个控件的布局字段所表示的含义都相同,下面将不再解释)
  517. // 'secLayoutTop': 100, // 顶部间距
  518. // // 'secLayoutBottom': -40, // 底部间距
  519. // 'secLayoutLeft': 20, // 左边间距
  520. // // 'secLayoutRight': -20, // 右边间距
  521. // 'secLayoutWidth': 80, // 控件宽度
  522. // 'secLayoutHeight': 80, // 控件高度
  523. // 'secLayoutCenterX': 0, // 相对于父视图的CenterX的偏移量,0表示不偏移,即水平居中
  524. // 'secLayoutCenterY': 0, // 相对于父视图的CenterY的偏移量,0表示不偏移,即垂直居中
  525. // },
  526. };
  527. // 手机号码
  528. var customPhoneNumber = {
  529. 'secNumberColor': model?.accountColor ?? '#333333', // 手机号码字体颜色
  530. 'secNumberFont': 25, // 字体大小(例: 18)
  531. 'secNumberTextAlignment': 1, // 手机号对其方式(例: 0-Left, 1-Center, 2-Right)
  532. // 'secNumberBgColor': '#C2F6A3', // 手机号码背景颜色
  533. 'secPhoneHidden': false, //手机号码是否隐藏
  534. // 'secPhoneBorderColor': '#FF0000', //手机号码边框颜色
  535. // 'secPhoneBorderWidth': 2, //手机号码边框宽度
  536. // 'secPhoneCorner': 5, //手机号码圆角
  537. 'secPortraitLayout': {
  538. // 'secLayoutTop': 100 + 10,
  539. // 'secLayoutLeft': 20 + 80 + 15,
  540. // 'secLayoutRight': -20,
  541. // 'secLayoutHeight': 22, // 控件高度
  542. }
  543. };
  544. // 切换帐号按钮
  545. var customSwitchNumber = {
  546. 'secSwitchBgColor': '#FFFFFF', // 切换账号背景颜色
  547. 'secSwitchColor': model?.textTipColor ?? '#FF3939', // 切换账号字体颜色
  548. 'secSwitchFont': 14, // 切换账号字体大小
  549. 'secSwitchTextHorizontalAlignment': 0, // 切换账号对其方式(例: 0-Center, 1-Left, 2-Right)
  550. 'secSwitchHidden': false, // 隐藏切换账号按钮, 默认为false(例: true)
  551. 'secSwitchText': model?.textTip ?? '切换账号', // 切换账号标题
  552. 'secPortraitLayout': {
  553. // 'secLayoutTop': 100 + 80 - 30,
  554. // 'secLayoutLeft': 20 + 80 + 15,
  555. // 'secLayoutRight': -20,
  556. // 'secLayoutHeight': 18, // 控件高度
  557. }
  558. };
  559. // 登陆按钮设置
  560. var customLoginBtn = {
  561. 'secLoginBtnText': model?.btnSubmitText ?? '立即登录', // 登录按钮文本
  562. 'secLoginBtnTextColor': model?.btnSubmitTextColor ?? '#FFFFFF', // 登录按钮文本颜色
  563. 'secLoginBtnBgColor': model?.btnSubmitBgColor ?? '#FF3939', // 登录按钮背景颜色
  564. 'secLoginBtnBorderWidth': 2.0, // 登录按钮边框宽度 (例: 2.0)
  565. 'secLoginBtnBorderColor': '#FF0000', // 登录按钮边框颜色
  566. 'secLoginBtnCornerRadius': 5.5, // 登录按钮圆角(例: 5.0)
  567. 'secLoginBtnTextFont': 15, // 登录按钮文字字体大小
  568. 'secLoginBtnBgImgArr': [
  569. model?.btnSubmitBgColor ?? '#FF3939',
  570. model?.btnSubmitBgColor ?? '#FF3939',
  571. model?.btnSubmitBgColor ?? '#FF3939'
  572. ], //['enabled.png', 'disabled.png', 'highlighted.png'], // 登录按钮背景图片数组(例:['激活状态图片','失效状态图片','高亮状态图片'], 支持颜色数组: ['#FF0000', '#00FF00', '0000FF'])
  573. 'secLoginBtnHidden': false, // 登陆按钮是否隐藏, 不建议隐藏!!!
  574. 'secPortraitLayout': {
  575. // 'secLayoutCenterY': 0,
  576. // 'secLayoutLeft': 20,
  577. // 'secLayoutRight': -20,
  578. // 'secLayoutHeight': 30, // 控件高度
  579. }
  580. };
  581. // 隐私条款设置(切记,不可隐藏)
  582. var customPrivacy = {
  583. 'secPrivacyTextColor': model?.protocol[0]?.textColor ?? '#C0C0C0', // 隐私条款基本文字颜色
  584. 'secPrivacyTextFont': 11, // 隐私条款协议文字字体大小
  585. 'secPrivacyTextAlignment': 0, // 隐私条款对其方式(例: 0-Left, 1-Center, 2-Right)
  586. 'secPrivacyAgreementColor': model?.protocol[1]?.textColor ?? '#FF3939', // 隐私条款协议文字颜色
  587. // 'secPrivacyAgreementBgColor': '#000000', // 隐私条款协议背景颜色
  588. // 'secPrivacyAppName': '秒验Flutter', // 隐私条款应用名称
  589. 'secPrivacyProtocolMarkArr': ['', ''], // 协议文本前后符号(例['<','>'])
  590. 'secPrivacyFirstTextArr': [model?.protocol[1]?.text ?? '用户协议', model?.protocol[1]?.url ?? '', model?.protocol[2]?.text ?? ' '], // 开发者隐私条款第一组协议(例:['名字','url','分割符'])
  591. 'secPrivacySecondTextArr': [model?.protocol[3]?.text ?? '隐私政策', model?.protocol[3]?.url ?? '', '及'], // 开发者隐私条款第二组协议(例:['名字','url','分割符'])
  592. 'secPrivacyLineSpacing': 5.0, // 隐私条款多行时行距(例: 5.0)
  593. // 'secPrivacyDefaultText': '开发者隐私条款', //开发者隐私条款协议默认名称(不建议修改)
  594. 'secPrivacyUnderlineStyle': 0, //隐私协议下划线样式(例: 0-None, 1-Single, 2-Thick, 9-Double)
  595. 'secPrivacyNormalTextFirst': model?.protocol[0]?.text ?? '同意', // 隐私条款开头(例: '登录即同意')
  596. 'secPrivacyNormalTextEnd': ' ', // 隐私条款中间连接文字(例: '并授权')
  597. 'secPrivacyHidden': false, // 隐私条款是否隐藏, 强烈建议不要隐藏!!!
  598. 'isPrivacyOperatorsLast': false, // 运营商协议是否排在最后 默认为false(例: true)
  599. 'secPortraitLayout': {
  600. // 'secLayoutLeft': 50,
  601. // 'secLayoutCenterY': 80,
  602. // 'secLayoutRight': -20,
  603. // 'secLayoutHeight': 70, // 控件高度
  604. }
  605. };
  606. // 隐私条款复选框
  607. var customCheckBox = {
  608. 'secCheckedImg': 'checked.png', // 复选框选中时的图片
  609. 'secUncheckedImg': 'uncheck.png', // 复选框未选中时的图片
  610. 'secCheckDefaultState': false, // 隐私条款check框默认状态,默认为false(例: true)
  611. // secCheckSize: 30, // 复选框尺寸(宽高相同,例: 30)
  612. 'secCheckHidden': false, // 隐私条款check框是否隐藏,默认为false(例: true)
  613. 'secPortraitLayout': {
  614. // !!!! 注意: 这个复选框的布局是相对于隐私条款的,所以建议先把隐私条款布局好再布局这个框
  615. 'secLayoutRight': -10,
  616. 'secLayoutCenterY': -20,
  617. 'secLayoutWidth': 20,
  618. 'secLayoutHeight': 20,
  619. }
  620. };
  621. // 隐私条款具体协议内容页面设置
  622. var customPrivacyContentPage = {
  623. 'secPrivacyWebBackBtnImage': 'close.png', // 隐私条款WEB页面返回按钮图片
  624. 'secPrivacyWebTitle': '隐私条款内容', // 隐私条款WEB页面标题
  625. 'secPrivacyWebNavBarStyle': 0, // 隐私条款导航style (例: 0-Default, 1-Black)
  626. };
  627. // 运营商品牌标签
  628. var customOperatorSlogan = {
  629. 'secSloganTextFont': 13, //运营商品牌文字字体大小
  630. 'secSloganTextColor': '#0099FF', //运营商品牌文字颜色
  631. 'secSloganTextAlignment': 1, //运营商品牌文字对齐方式(例: 0-Left, 1-Center, 2-Right)
  632. 'secSloganBgColor': '#666666', //运营商品牌背景颜色
  633. // 'secSloganText': '运营商品牌文字', //运营商品牌文字(不建议修改)
  634. 'secSloganHidden': false, //运营商品牌是否隐藏
  635. 'secSloganBorderColor': '#FFEEDD', //运营商品牌边框颜色
  636. 'secSloganBorderWidth': 2.0, //运营商品牌边框宽度
  637. 'secSloganCorner': 5.0, //运营商品牌边框圆角
  638. 'secPortraitLayout': {
  639. 'secLayoutLeft': 20,
  640. 'secLayoutRight': -20,
  641. 'secLayoutBottom': -64,
  642. 'secLayoutHeight': 18, // 控件高度
  643. },
  644. };
  645. var customParams = {
  646. // 'customAnimation': customAnimation, // 自定义动画设置
  647. 'customNav': customNav, // 导航栏设置
  648. // 'customAuthPage': customAuthPage, // 授权页
  649. 'customAuthPageLogo': customAuthPageLogo, // 授权页Logo
  650. 'customPhoneNumber': customPhoneNumber, // 手机号码
  651. 'customSwitchNumber': customSwitchNumber, // 切换帐号按钮
  652. // 'customCheckBox': customCheckBox, // 隐私条款复选框
  653. 'customPrivacy': customPrivacy, // 隐私条款设置(切记,不可隐藏)
  654. // 'customPrivacyContentPage': customPrivacyContentPage, // 隐私条款具体协议内容页面设置
  655. 'customLoginBtn': customLoginBtn, // 登陆按钮设置
  656. // 'customOperatorSlogan': customOperatorSlogan, // 运营商品牌标签
  657. };
  658. Secverify.setPortraitLayout(customParams);
  659. // Secverify.setLandscapeLayout(customParams);
  660. }
  661. }
  662. }