li.shaoyi 3 năm trước cách đây
mục cha
commit
5eb8ebe48e
60 tập tin đã thay đổi với 2080 bổ sung204 xóa
  1. 35 24
      public/manifest.json
  2. 472 0
      public/proto/thj.proto
  3. 36 0
      src/business/credit/index.ts
  4. 63 0
      src/business/user/account.ts
  5. 113 0
      src/business/user/address.ts
  6. 2 0
      src/business/user/index.ts
  7. 9 0
      src/constants/funcode.ts
  8. 66 10
      src/filters/index.ts
  9. BIN
      src/packages/mobile/assets/images/boot-1080p.png
  10. BIN
      src/packages/mobile/assets/images/boot-480p.png
  11. BIN
      src/packages/mobile/assets/images/boot-720p.png
  12. BIN
      src/packages/mobile/assets/logo.png
  13. 53 45
      src/packages/mobile/assets/themes/base/mixin.less
  14. 7 0
      src/packages/mobile/assets/themes/default/variable.less
  15. 11 0
      src/packages/mobile/assets/themes/style.less
  16. 2 2
      src/packages/mobile/components/base/pull-refresh/index.vue
  17. 91 25
      src/packages/mobile/router/index.ts
  18. 10 0
      src/packages/mobile/views/bank/statement/index.vue
  19. 4 3
      src/packages/mobile/views/boot/index.less
  20. 12 9
      src/packages/mobile/views/boot/index.vue
  21. 0 0
      src/packages/mobile/views/credit/signin/index.less
  22. 22 18
      src/packages/mobile/views/credit/signin/index.vue
  23. 52 0
      src/packages/mobile/views/credit/statement/index.vue
  24. 10 2
      src/packages/mobile/views/home/components/main/index.less
  25. 8 8
      src/packages/mobile/views/home/components/main/index.vue
  26. 0 12
      src/packages/mobile/views/home/components/mine/index.less
  27. 16 16
      src/packages/mobile/views/home/components/mine/index.vue
  28. 1 1
      src/packages/mobile/views/market/main/index.vue
  29. 96 0
      src/packages/mobile/views/mine/address/components/edit/index.vue
  30. 10 0
      src/packages/mobile/views/mine/address/index.vue
  31. 7 5
      src/packages/mobile/views/mine/service/index.vue
  32. 21 0
      src/packages/mobile/views/setting/main/index.vue
  33. 77 0
      src/packages/mobile/views/setting/password/index.vue
  34. 0 0
      src/packages/mobile/views/user/forget/index.less
  35. 0 0
      src/packages/mobile/views/user/forget/index.vue
  36. 2 2
      src/packages/mobile/views/user/login/index.less
  37. 8 8
      src/packages/mobile/views/user/login/index.vue
  38. 1 0
      src/packages/mobile/views/user/logoff/index.less
  39. 47 0
      src/packages/mobile/views/user/logoff/index.vue
  40. 9 0
      src/packages/mobile/views/user/register/index.less
  41. 11 2
      src/packages/mobile/views/user/register/index.vue
  42. 1 1
      src/packages/pc/router/index.ts
  43. 0 0
      src/packages/pc/views/user/components/layout/index.less
  44. 0 0
      src/packages/pc/views/user/components/layout/index.vue
  45. 0 0
      src/packages/pc/views/user/login/index.less
  46. 0 0
      src/packages/pc/views/user/login/index.vue
  47. 14 0
      src/services/api/account/index.ts
  48. 67 0
      src/services/api/bank/index.ts
  49. 9 0
      src/services/api/credit/index.ts
  50. 32 0
      src/services/api/user/index.ts
  51. 2 1
      src/services/http/index.ts
  52. 1 1
      src/services/socket/trade/protobuf/index.ts
  53. 194 0
      src/types/model/bank.d.ts
  54. 15 0
      src/types/model/credit.d.ts
  55. 0 1
      src/types/model/enum.d.ts
  56. 0 1
      src/types/model/news.d.ts
  57. 49 0
      src/types/model/user.d.ts
  58. 37 7
      src/types/proto/account.d.ts
  59. 179 0
      src/types/proto/bank.d.ts
  60. 96 0
      src/types/proto/user.d.ts

+ 35 - 24
public/manifest.json

@@ -2,7 +2,7 @@
     "@platforms" : [ "android", "iPhone", "iPad" ],
     "id" : "H5E4A9458",
     /*应用的标识*/
-    "name" : "铁合金",
+    "name" : "铁合金掌上行",
     /*应用名称,程序桌面图标名称*/
     "version" : {
         "name" : "1.0",
@@ -30,9 +30,6 @@
         "Audio" : {
             "description" : "访问麦克风"
         },
-        "Messaging" : {
-            "description" : "短彩邮件插件"
-        },
         "Cache" : {
             "description" : "管理应用缓存"
         },
@@ -57,9 +54,6 @@
         "Gallery" : {
             "description" : "访问系统相册"
         },
-        "Geolocation" : {
-            "description" : "访问位置信息"
-        },
         "Invocation" : {
             "description" : "使用Native.js能力"
         },
@@ -87,12 +81,6 @@
         "Barcode" : {
             "description" : "管理二维码扫描插件"
         },
-        "Maps" : {
-            "description" : "管理地图插件"
-        },
-        "Speech" : {
-            "description" : "管理语音识别插件"
-        },
         "Webview" : {
             "description" : "窗口管理"
         },
@@ -165,7 +153,8 @@
                     "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                     "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                     "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ]
+                ],
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ]
             },
             /*使用Native.js调用原生安卓API需要使用到的系统权限*/
             "orientation" : [ "portrait-primary" ],
@@ -195,7 +184,15 @@
                         /*iPhone4设置页面程序图标,分辨率:29x29*/
                         "settings-retina" : "",
                         /*iPhone4S/5/6设置页面程序图标,分辨率:58x58*/
-                        "settings-retina8" : "" /*iPhone6Plus设置页面程序图标,分辨率:87x87*/
+                        "settings-retina8" : "", /*iPhone6Plus设置页面程序图标,分辨率:87x87*/
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
                     },
                     "ipad" : {
                         "normal" : "",
@@ -216,19 +213,30 @@
                         /*iPad iOS7高分屏Spotlight搜索程序图标,分辨率:80x80*/
                         "settings-normal" : "",
                         /*iPad设置页面程序图标,分辨率:29x29*/
-                        "settings-retina" : "" /*iPad高分屏设置页面程序图标,分辨率:58x58*/
-                    }
+                        "settings-retina" : "", /*iPad高分屏设置页面程序图标,分辨率:58x58*/
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "appstore" : "unpackage/res/icons/1024x1024.png"
                 },
                 "android" : {
                     "mdpi" : "",
                     /*普通屏程序图标,分辨率:48x48*/
                     "ldpi" : "",
                     /*大屏程序图标,分辨率:48x48*/
-                    "hdpi" : "",
+                    "hdpi" : "unpackage/res/icons/72x72.png",
                     /*高分屏程序图标,分辨率:72x72*/
-                    "xhdpi" : "",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
                     /*720P高分屏程序图标,分辨率:96x96*/
-                    "xxhdpi" : "" /*1080P 高分屏程序图标,分辨率:144x144*/
+                    "xxhdpi" : "unpackage/res/icons/144x144.png", /*1080P 高分屏程序图标,分辨率:144x144*/
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
                 }
             },
             "splashscreen" : {
@@ -269,12 +277,15 @@
                     /*普通屏启动图片,分辨率:240x282*/
                     "ldpi" : "",
                     /*大屏启动图片,分辨率:320x442*/
-                    "hdpi" : "",
+                    "hdpi" : "D:/Repo/THJ/THJ_Mobile/src/packages/mobile/assets/images/boot-480p.png",
                     /*高分屏启动图片,分辨率:480x762*/
-                    "xhdpi" : "",
+                    "xhdpi" : "D:/Repo/THJ/THJ_Mobile/src/packages/mobile/assets/images/boot-720p.png",
                     /*720P高分屏启动图片,分辨率:720x1242*/
-                    "xxhdpi" : "" /*1080P高分屏启动图片,分辨率:1080x1882*/
-                }
+                    "xxhdpi" : "D:/Repo/THJ/THJ_Mobile/src/packages/mobile/assets/images/boot-1080p.png" /*1080P高分屏启动图片,分辨率:1080x1882*/
+                },
+                "androidStyle" : "default",
+                "iosStyle" : "common",
+                "useOriginalMsgbox" : true
             },
             "plugins" : {
                 "ad" : {}

+ 472 - 0
public/proto/thj.proto

@@ -0,0 +1,472 @@
+// 消息头
+message MessageHead {
+	optional uint32 FunCode = 1; // 功能号
+	optional uint32 RequestID = 2; // 客户端的流水ID
+	optional uint64 AccountID = 3; // 账号ID
+	optional uint32 AccessID = 4; //二级分配给客户端的接入ID
+	optional int64 ClientTime = 5; //消息发起时间
+	optional uint32 GoodsID = 6; //商品ID
+	optional string UUID = 7; // 消息唯一ID
+	optional uint32 MarketID = 8; // 所属市场ID
+	optional uint32 UserID = 9; // 用户ID
+	optional string ResponseTopic = 10; // 应答消息所属主题
+	optional uint64 AccountID2 = 11; // 账号ID-币币交易使用
+}
+
+// 用户登录请求
+message LoginReq {
+	optional MessageHead Header = 1;
+		optional uint64 LoginID = 2; // 登录ID
+		optional string LoginPWD = 3; // 登录密码
+		optional uint32 LoginType = 4; // 登陆类型
+		optional uint32 ClientType = 5; // 终端软件类型
+		optional string Version = 6; // 终端软件版本号
+		optional string MobilePhone = 7; // 移动电话
+		optional string GUID = 8; // 唯一标识码
+		optional string LoginIp = 9; // 登录IP地址
+		optional uint32 LoginPort = 10; // 登陆通信端口
+		optional string DeviceID = 11; // 设备标识
+		optional string EnvironmentInfo = 12; // 软件环境信息
+		optional string LoginCode = 13; // 登陆码
+		optional bytes ClientSystemInfo = 14; // 终端系统信息
+		optional string ClientAppID = 15; // 终端AppID
+}
+
+// 用户登录应答
+message LoginRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 LoginID = 4; // 登录ID
+		optional uint32 LoginUserType = 5; // 登陆用户类型
+		optional uint32 AccountStatus = 6; // 用户状态
+		optional uint32 UserID = 7; // 用户ID
+		optional uint32 MemberUserID = 8; // 用户所属会员用户ID
+		repeated uint64 AccountIDs = 9; // 账户ID列表(有权限的)
+		optional string Token = 10; // 用户令牌
+		optional uint64 SystemTime = 11; // 系统时间
+		optional uint32 HasUpdatedPwd = 12; // 是否已更改密码
+		optional uint32 PwdWrongCnt = 13; // 当前密码输入错误次数
+		optional uint32 PwdWrongLockCnt = 14; // 登陆账号锁定密码输入错误次数
+		optional uint32 LoginLockHourNum = 15; // 登陆账号锁定时长(小时)
+		optional string LoginCode = 16; // 登陆码
+		optional bytes ClientSystemInfo = 17; // 终端系统信息
+		optional uint64 ClientID = 18; // 终端ID(登陆服务分配,用于通道交易关联链路)
+}
+
+// 用户登出请求
+message LogoutReq {
+	optional MessageHead Header = 1;
+		optional uint64 LoginID = 2; // 登录ID
+		optional string Token = 3; // 登录时返回的用户令牌
+		optional string LoginIp = 4; // 登出IP地址
+		optional uint32 LoginPort = 5; // 登出通信端口
+}
+
+// 用户登出应答
+message LogoutRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+}
+
+// 用户令牌校验请求
+message TokenCheckReq {
+	optional MessageHead Header = 1;
+		optional uint64 LoginID = 2; // 登陆账户ID
+		optional string Token = 3; // 用户令牌
+		optional uint64 SystemTime = 4; // 校验时的系统时间
+		optional uint32 CheckType = 5; // 校验类型
+}
+
+// 用户令牌校验应答
+message TokenCheckRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 LoginID = 4; // 登陆账户ID
+		optional uint32 TokenStatus = 5; // 令牌状态
+		optional uint32 LoginUserType = 6; // 登陆用户类型
+		optional uint32 UserID = 7; // 用户ID
+		optional uint32 MemberUserID = 8; // 用户所属会员用户ID
+		repeated uint64 AccountIDs = 9; // 账户ID列表(有权限的)
+		optional uint64 SystemTime = 10; // 返回服务器最新时间
+}
+
+// 修改账户密码请求
+message ModifyPwdReq {
+	optional MessageHead Header = 1;
+		optional uint32 ModifyPwdType = 2; // 修改密码类型1:登陆密码2:资金账户密码
+		optional uint64 ModifyPwdID = 3; // 被修改的ID(ModifyType=1:LoginIDModifyType=2:AccountID)
+		optional string OldPwd = 4; // 旧资金密码
+		optional string NewPwd = 5; // 新资金密码
+}
+
+// 修改账户密码应答
+message ModifyPwdRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+}
+
+// 投资者销户申请请求
+message InvestorDelReq {
+	optional MessageHead Header = 1;
+		optional uint64 UserID = 2; // 用户ID
+		optional string ImageUrl = 3; // 图片地址
+}
+
+// 投资者销户申请请求响应
+message InvestorDelRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+}
+
+// 登录查询请求
+message LoginQueryReq {
+	optional MessageHead Header = 1;
+		optional uint64 LoginID = 2; // 登陆账号id
+		optional string QueryItem = 3; // 不填返回全部结果集,填写后表示按需查询,多个以“,”隔开1-账号信息2-资金账户列表3-
+}
+
+// 登录查询应答
+message LoginQueryRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional AccountInfo AccountInfo = 4; // 账号信息
+		repeated TAAccountAll TAAccountList = 5; // 资金账户列表
+		repeated GoodsRuleAndFee GoodsRuleAndFeeList = 6; // 商品交易规则和费用规则列表
+		repeated ParamValue ParamValues = 7; // 时间戳集合
+		optional uint32 ServerLastNoticeId = 8; // 最大通知id
+}
+
+// 账户信息
+message AccountInfo {
+		optional uint32 UserID = 1; // 用户ID
+		optional uint32 UserType = 2; // 账户类型
+		optional uint32 ParentUserID = 3; // 所属机构ID
+		optional string AccountName = 4; // 账户名称
+		optional string CustomerName = 5; // 用户名称(签约用)
+		optional uint32 UserInfoType = 6; // 1:个人2:企业(签约用)
+		optional uint32 CardTypeID = 7; // 证件类型(签约用)
+		optional string CardNum = 8; // 证件号码(签约用)
+		optional string Mobile = 9; // 手机号码(签约用)
+		optional uint32 HasAuth = 10; // 是否已实名认证-0:未认证
+		optional uint64 MemberUserid = 11; // 所属会员
+			optional uint32 IsAnonymous = 12; // 是否匿名0否
+			optional uint32 taaccountrighttype = 13; // 资金账号权限类型-1:不选默认为所有权限
+}
+
+// 账户相关信息
+message TAAccountAll {
+		optional TaAccountInfo TaAccountInfo = 1; // 资金账户信息
+		repeated TradePosition TradePositionList = 2; // 持仓头寸列表
+		repeated uint32 MarketsIdList = 3; // 市场id数组
+}
+
+// 资金账户信息
+message TaAccountInfo {
+		optional uint64 AccountId = 1; // 账户id
+		optional uint32 TradeStatus = 2; // 交易状态
+		optional string Currency = 3; // 币种
+		optional uint32 IsMain = 4; // 是否母账户
+		optional uint64 ParentAccountID = 5; // 所属母账户
+		optional uint32 TAAccountType = 6; // 内、外部
+		optional uint64 RelatedMainAccountID = 7; // 关联账户
+		optional double Balance = 8; // 期初余额
+		optional double CurrentBalance = 9; // 期末余额
+		optional double UsedMargin = 10; // 占用保证金
+		optional double FreezeMargin = 11; // 冻结保证金
+		optional double OtherFreezeMargin = 12; // 其他冻结保证金
+		optional double FreezeCharge = 13; // 手续费冻结
+		optional double MortgageCredit = 14; // 授信金额
+		optional double OtherCredit = 15; // 其它授信金额
+		optional double OutAmountFreeze = 16; // 出金冻结
+		optional double InAmount = 17; // 今日入金
+		optional double OutAmount = 18; // 今日出金
+		optional double PayCharge = 19; // 今日手续费支出
+		optional double ClosePL = 20; // 今日平仓盈亏
+		optional double CreditIncrease = 21; // 今日授信增加
+		optional double CreditDecrease = 22; // 今日授信减少
+		optional double OtherCreditIncrease = 23; // 今日其它授信增加
+		optional double OtherCreditDecrease = 24; // 今日其它授信减少
+		optional double TransferAmount = 25; // 今日划转金额
+		optional double OtherPay = 26; // 其他支出
+		optional double OtherIncome = 27; // 其他收入
+		optional double OutThreshold = 28; // 出金阀值
+		optional uint32 IsMarketAccount = 29; // 是否机构接单账号0:不是1:是
+		optional uint32 Currencyid = 30; // 报价货币ID
+}
+
+// 资金变化通知
+message MoneyChangedNtf {
+	optional MessageHead Header = 1; // 消息头
+		optional NotifyHead NtfHeader = 2; // NotifyHead 公共消息头
+		optional uint64 AccountID = 3; // uint64 交易账号
+}
+
+// 新增修改收货地址请求
+message UserReceiveInfoReq {
+	optional MessageHead Header = 1;
+		optional uint64 ClientSerialID = 2; // 客户端唯一ID
+		optional uint32 UserID = 3; // 用户ID
+		optional string ReceiverName = 4; // 提货人姓名
+		optional uint32 CardTypeID = 5; // 证件类型
+		optional string CardNum = 6; // 证件号码
+		optional string PhoneNum = 7; // 提货人联系方式
+		optional uint32 CountryID = 8; // 国家
+		optional uint32 ProvinceID = 9; // 省
+		optional uint32 CityID = 10; // 市
+		optional uint32 DistrictID = 11; // 地区
+		optional string Address = 12; // 提货人详细地址
+		optional string TakeRemark = 13; // 提货备注
+		optional uint64 ReceiveInfoId = 14; // 修改时填收货地址id
+}
+
+// 新增修改收货地址请求响应
+message UserReceiveInfoRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ReceiveInfoId = 4; // 响应返回autoid
+}
+
+// 删除收货地址请求
+message DelUserReceiveInfoReq {
+	optional MessageHead Header = 1;
+		optional uint64 ReceiveInfoId = 2; // 收货地址id
+}
+
+// 删除收货地址请求响应
+message DelUserReceiveInfoRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+}
+
+// 设置默认收货地址请求
+message UserReceiveIsDefaultReq {
+	optional MessageHead Header = 1;
+		optional uint64 AutoId = 2; // 提货地址ID
+		optional uint64 UserId = 3; // 用户ID
+}
+
+// 设置默认收货地址应答
+message UserReceiveIsDefaultRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 AutoId = 4; // 提货地址ID
+}
+
+// 新增修改用户发票信息请求
+message UserReceiptInfoReq {
+	optional MessageHead Header = 1;
+		optional uint64 ClientSerialID = 2; // 客户端唯一ID
+		optional uint32 UserID = 3; // 用户ID
+		optional string UserName = 4; // 发票抬头姓名
+		optional uint32 ReceiptType = 5; // 发票类型
+		optional string TaxpayerID = 6; // 纳税人识别号
+		optional string ContactInfo = 7; // 联系方式
+		optional uint64 ReceiptInfoId = 8; // 修改时填用户发票信息id
+		optional string ReceiptBank = 9; // 发票开户行[发票类型:企业]
+		optional string ReceiptAccount = 10; // 发票帐号[发票类型:企业]
+		optional string Address = 11; // 地址[发票类型:企业]
+		optional string IDNum = 12; // 身份证号码[发票类型:个人]
+}
+
+// 新增修改用户发票信息请求响应
+message UserReceiptInfoRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ReceiptInfoId = 4; // 响应返回发票信息id
+}
+
+// 删除用户发票信息请求
+message DelUserReceiptInfoReq {
+	optional MessageHead Header = 1;
+		optional uint64 ReceiptInfoId = 2; // 删除发票信息id
+}
+
+// 删除用户发票信息请求响应
+message DelUserReceiptInfoRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+}
+
+// 签约请求
+message t2bBankSignReq {
+	optional MessageHead Header = 1;
+		required uint64 ExtOperatorID = 2; // 外部操作流水号
+		optional string ExchId = 3; // 交易所编号
+		optional string TradeDate = 4; // 交易所业务日期
+		optional string ExchTicket = 5; // 交易所流水号
+		required string AccountCode = 6; // 账户
+		required string AccountName = 7; // 客户名称
+		required string CusBankID = 8; // 托管银行编号
+		required int32 OperateType = 9; // 变更类型[1-增加;2-修改;4-绑卡;
+		required int32 IsForce = 10; // 是否强制[0-否;1-是]强制,只更新中心签约信息,不发送银行。用于银行信息不一致的情况
+		optional string Currency = 11; // 币种
+		optional int32 AccountType = 12; // 账户类型[1-对私;2-对公]
+		required string OpenBankAccId = 13; // 银行卡行号
+		optional string ForceSignBankAccountNo = 14; // 银行账户[强制签约时填写]
+		optional string ForceSignBankAccountName = 15; // 银行账户名称[强制签约时填写]
+		required string BankAccountNo = 16; // 银行账户
+		optional string BankAccountName = 17; // 银行账户名称
+		required string ExBankName = 18; // 开户行名称
+		optional string OpenBankNo = 19; // 开户支行编号
+		optional string OpenBankName = 20; // 开户支行名称
+		required string CertType = 21; // 证件类型
+		required string CertID = 22; // 证件号码
+		optional string BankAccountPWD = 23; // 银行账户密码
+		optional string AgentName = 24; // 授权代理人姓名
+		optional int32 AgentCertType = 25; // 授权代理人证件类型
+		optional string AgentCertID = 26; // 授权代理人证件号
+		optional int32 BankAccountType = 27; // 银行账户类型
+		optional string BankProvince = 28; // 开户银行所在省份
+		optional string BankCity = 29; // 开户银行所在市
+		optional int32 BankCardType = 30; // 银行卡类型
+		optional string MobilePhone = 31; // 移动电话
+		optional string IdentifyCode = 32; // 验证码
+		optional string email = 33; // 电子邮箱
+		optional string extend_info = 34; // 扩展信息(JSON串,参考配置要求进行填充)
+}
+
+// 签约应答
+message t2bBankSignRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ExtOperatorID = 4; // 外部操作流水号
+		optional string AccountCode = 5; // 账户
+		optional string NetAddr = 6; // 网络地址(当这里有网址时,应自动跳转网页)
+		optional int32 Status = 7; // 状态(0成功,其他数值参考银行服务的错误码)
+		required string ExchTicket = 8; // 交易所流水号
+		optional string ExchId = 9; // 交易所编号
+		optional string TradeDate = 10; // 交易所业务日期
+		optional string CenterTicket = 11; // 中心流水号
+		optional string CenterErrCode = 12; // 返回码
+		optional string CenterErrMsg = 13; // 返回结果说明
+		optional string bankChildAcc = 14; // 银行账号
+		optional string bankChildAccName = 15; // 银行账户名
+		optional string BankId = 16; // 银行卡行号
+		optional string BankAccNum = 17; // 银行卡号
+		optional string BankAccName = 18; // 银行卡户名
+}
+
+// 解约请求
+message t2bBankCancelSignReq {
+	optional MessageHead Header = 1;
+		required uint64 ExtOperatorID = 2; // 外部操作流水号
+		optional string ExchId = 3; // 交易所编号
+		required string AccountCode = 4; // 账户
+		required string CusBankID = 5; // 托管银行编号
+		required int32 IsForce = 6; // 是否强制
+		optional string Currency = 7; // 币种
+		optional string TradeDate = 8; // 交易所业务日期
+		optional string ExchTicket = 9; // 交易所流水号
+		optional string BankChildAcc = 10; // 银行子账号
+		optional string BankChildAccName = 11; // 银行子账号名
+}
+
+// 解约应答
+message t2bBankCancelSignRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ExtOperatorID = 4; // 外部操作流水号
+		optional string AccountCode = 5; // 账户
+		optional string NetAddr = 6; // 网络地址(当这里有网址时,应自动跳转网页)
+		optional int32 Status = 7; // 状态(0成功,其他数值参考银行服务的错误码)
+		required string ExchTicket = 8; // 交易所流水号
+		optional string ExchId = 9; // 交易所编号
+		optional string TradeDate = 10; // 交易所业务日期
+		optional string CenterTicket = 11; // 中心流水号
+		optional string CenterErrCode = 12; // 返回码
+		optional string CenterErrMsg = 13; // 返回结果说明
+}
+
+// 出金请求
+message t2bBankWithdrawReq {
+	optional MessageHead Header = 1;
+		required uint64 ExtOperatorID = 2; // 外部操作流水号
+		optional string ExchId = 3; // 交易所编号
+		required string AccountCode = 4; // 资金账户
+		required string CusBankID = 5; // 托管银行编号
+		required string Currency = 6; // 币种
+		optional int32 AccountType = 7; // 账户类型
+		optional string BankChildAccount = 8; // 银行子账号
+		optional string BankChildAccountName = 9; // 银行子账号名
+		optional string OpenCardBankId = 10; // 银行卡行号
+		optional string BankAccoutNum = 11; // 银行卡号
+		optional string BankAccoutName = 12; // 银行卡户名
+		required double Amount = 13; // 出金金额
+		optional string AppDateTime = 14; // 申请日期和时间
+		optional string OldTaPWD = 15; // 资金密码
+		optional string Desc = 16; // 备注
+		optional string IdentifyCode = 17; // 验证码
+		optional string BranchBankName = 18; // 收款支行名称
+		optional string extend_info = 19; // 扩展信息(JSON串,参考配置要求进行填充)
+		optional string Remark = 20; // 备注
+		optional string ExchTicket = 21; // 交易所流水号
+}
+
+// 出金应答
+message t2bBankWithdrawRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ExtOperatorID = 4; // 外部操作流水号
+		optional int32 Status = 5; // 状态(0成功,其他数值参考银行服务的错误码)
+		required string ExchTicket = 6; // 交易所流水号
+		optional string ExchId = 7; // 交易所编号
+		optional string TradeDate = 8; // 交易日
+		optional string CenterTicket = 9; // 中心流水号
+		optional string CenterErrCode = 10; // 中心返回码
+		optional string CenterErrMsg = 11; // 中心返回结果说明
+		optional string CerterCheckDate = 12; // 中心对账日期
+		optional string NetAddr = 13; // 网络地址(当这里有网址时,应自动跳转网页)
+}
+
+// 入金请求
+message t2bBankDepositReq {
+	optional MessageHead Header = 1;
+		required uint64 ExtOperatorID = 2; // 外部操作流水号
+		required string CusBankID = 3; // 托管银行编号
+		optional string ExchId = 4; // 交易所编号
+		optional string TradeDate = 5; // 交易日
+		optional string ExchTicket = 6; // 交易所流水号
+		required string AccountCode = 7; // 资金账户
+		optional string BusinessNo = 8; // 银行业务编号
+		optional string BankChildAccount = 9; // 银行子账号
+		optional string BankChildAccountName = 10; // 银行子账号名
+		optional string OldTaPWD = 11; // 资金密码
+		required double Amount = 12; // 金额
+		required string Currency = 13; // 币种
+		optional string Remark = 14; // 备注
+		optional string OpenCardBankId = 15; // 银行卡行号
+		optional string BankAccoutNum = 16; // 银行卡号
+		optional string BankAccoutName = 17; // 银行卡户名
+		optional string extend_info = 18; // 扩展信息(JSON串,参考配置要求进行填充)
+}
+
+// 入金应答
+message t2bBankDepositRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ExtOperatorID = 4; // 外部操作流水号
+		optional int32 Status = 5; // 状态(0成功,其他数值参考银行服务的错误码)
+		required string ExchTicket = 6; // 交易所流水号
+		optional string ExchId = 7; // 交易所编号
+		optional string TradeDate = 8; // 交易日
+		optional string CenterTicket = 9; // 中心流水号
+		optional string CenterErrCode = 10; // 中心返回码
+		optional string CenterErrMsg = 11; // 中心返回结果说明
+		optional string CerterCheckDate = 12; // 中心对账日期
+		optional string NetAddr = 13; // 网络地址(当这里有网址时,应自动跳转网页)
+}

+ 36 - 0
src/business/credit/index.ts

@@ -0,0 +1,36 @@
+import { shallowRef } from 'vue'
+import { useDataTable } from '@/hooks/datatable'
+import { useLoginStore } from '@/stores'
+import { queryUserScoreLog } from '@/services/api/credit'
+
+// 积分列表
+export function useCreditList() {
+    const { getUserId } = useLoginStore()
+    const { dataList, total, pageIndex, pageSize } = useDataTable<Model.UserScoreLogRsp>()
+    const loading = shallowRef(false)
+
+    const getCreditList = () => {
+        loading.value = true
+        return queryUserScoreLog({
+            data: {
+                userid: getUserId(),
+            },
+            success: (res) => {
+                total.value = res.total
+                dataList.value = res.data
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        dataList,
+        total,
+        pageIndex,
+        pageSize,
+        getCreditList,
+    }
+}

+ 63 - 0
src/business/user/account.ts

@@ -0,0 +1,63 @@
+import { shallowRef, reactive } from 'vue'
+import { useLoginStore } from '@/stores'
+import { investorDel, modifyPassword } from '@/services/api/account'
+import cryptojs from 'crypto-js'
+
+// 修改密码
+export function useAccountPassword(ModifyPwdType: 0 | 1 | 2) {
+    const { getLoginId, getFirstAccountId } = useLoginStore()
+    const loading = shallowRef(false)
+
+    const formData = reactive<Proto.ModifyPwdReq>({
+        ModifyPwdType, // 修改密码类型1:登陆密码2:资金账户密码
+        ModifyPwdID: ModifyPwdType === 1 ? getLoginId() : getFirstAccountId(), // 被修改的ID(ModifyType=1:LoginIDModifyType=2:AccountID)
+        OldPwd: '', // 旧资金密码
+        NewPwd: '' // 新资金密码
+    })
+
+    const formSubmit = () => {
+        const { ModifyPwdType, ModifyPwdID, OldPwd, NewPwd } = formData
+        loading.value = true
+
+        return modifyPassword({
+            data: {
+                ModifyPwdType,
+                ModifyPwdID,
+                OldPwd: cryptojs.SHA256(ModifyPwdID + OldPwd).toString(),
+                NewPwd: cryptojs.SHA256(ModifyPwdID + NewPwd).toString(),
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        formData,
+        formSubmit
+    }
+}
+
+// 账户注销
+export function useAccountCancellation() {
+    const { getUserId } = useLoginStore()
+    const loading = shallowRef(false)
+
+    const formSubmit = () => {
+        loading.value = true
+        return investorDel({
+            data: {
+                UserID: getUserId()
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        formSubmit,
+    }
+}

+ 113 - 0
src/business/user/address.ts

@@ -0,0 +1,113 @@
+import { shallowRef, reactive } from 'vue'
+import { useDataTable } from '@/hooks/datatable'
+import { useLoginStore } from '@/stores'
+import { queryUserReceiveInfo, userReceiveInfo, delUserReceiveInfo, userReceiveIsDefault } from '@/services/api/user'
+
+export function useAddress() {
+    const { getUserId } = useLoginStore()
+    const { dataList, total, pageIndex, pageSize } = useDataTable<Model.UserReceiveInfoRsp>()
+    const loading = shallowRef(false)
+    const columns = shallowRef([])
+
+    const getUserAddressList = () => {
+        loading.value = true
+        return queryUserReceiveInfo({
+            data: {
+                userid: getUserId(),
+            },
+            success: (res) => {
+                total.value = res.total
+                dataList.value = res.data
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        dataList,
+        columns,
+        total,
+        pageIndex,
+        pageSize,
+        getUserAddressList,
+    }
+}
+
+export function useAddressForm(selectedRow?: Model.UserReceiveInfoRsp) {
+    const { getUserId } = useLoginStore()
+    const loading = shallowRef(false)
+
+    const formData = reactive<Proto.UserReceiveInfoReq>({
+        ReceiveInfoId: 0,
+        UserID: getUserId(),
+        CardTypeID: 0,
+        ReceiverName: '',
+        CardNum: '',
+        PhoneNum: '',
+        Address: '',
+        TakeRemark: '',
+    })
+
+    if (selectedRow?.autoid) {
+        ({
+            autoid: formData.ReceiveInfoId,
+            userid: formData.UserID,
+            receivername: formData.ReceiverName,
+            cardtypeid: formData.CardTypeID,
+            cardnum: formData.CardNum,
+            phonenum: formData.PhoneNum,
+            countryid: formData.CountryID,
+            provinceid: formData.ProvinceID,
+            cityid: formData.CityID,
+            districtid: formData.DistrictID,
+            address: formData.Address,
+            takeremark: formData.TakeRemark,
+        } = selectedRow)
+    }
+
+    const addOrUpdate = () => {
+        loading.value = true
+        return userReceiveInfo({
+            data: formData,
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    const deleteAddress = () => {
+        loading.value = true
+        return delUserReceiveInfo({
+            data: {
+                ReceiveInfoId: formData.ReceiveInfoId
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    const updateAddressIsDefault = () => {
+        loading.value = true
+        return userReceiveIsDefault({
+            data: {
+                UserId: getUserId(),
+                AutoId: formData.ReceiveInfoId
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        formData,
+        addOrUpdate,
+        deleteAddress,
+        updateAddressIsDefault,
+    }
+}

+ 2 - 0
src/business/user/index.ts

@@ -0,0 +1,2 @@
+export { useAccountCancellation, useAccountPassword } from './account'
+export { useAddress } from './address'

+ 9 - 0
src/constants/funcode.ts

@@ -15,6 +15,8 @@ export enum FunCode {
     TokenCheckRsp = 65542, // 用户令牌校验应答
     ModifyPwdReq = 65543, // 修改账户密码请求
     ModifyPwdRsp = 65544, // 修改账户密码应答
+    InvestorDelReq = 1900553, // 投资者销户申请请求
+    InvestorDelRsp = 1900554, // 投资者销户申请请求响应
 
     t2bBankSignReq = 589825, // 签约请求
     t2bBankSignRsp = 589826, // 签约应答
@@ -25,6 +27,13 @@ export enum FunCode {
     t2bBankDepositReq = 589843, // 入金请求
     t2bBankDepositRsp = 589844, //入金应答
 
+    UserReceiveInfoReq = 1900545, // 新增修改收货地址请求
+    UserReceiveInfoRsp = 1900546, // 新增修改收货地址请求响应
+    DelUserReceiveInfoReq = 1900547, // 删除收货地址请求
+    DelUserReceiveInfoRsp = 1900548, // 删除收货地址请求响应
+    UserReceiveIsDefaultReq = 1900570, // 设置默认收货地址请求
+    UserReceiveIsDefaultRsp = 1900571, // 设置默认收货地址应答
+
     // 交易通知
     MoneyChangedNotify = 131076, // 资金变化通知
 

+ 66 - 10
src/filters/index.ts

@@ -1,14 +1,28 @@
 import CryptoJS from 'crypto-js'
 import service from '@/services'
+import moment from 'moment'
+
+/**
+ * 获取图片地址
+ * @param fileUrl 
+ */
+export function getImageUrl(fileUrl: string) {
+    if (fileUrl) {
+        const { openApiUrl } = service.config
+        return openApiUrl + fileUrl.replace('./', '/')
+    }
+    // 返回默认图片
+    return ''
+}
 
 /**
  * 处理价格颜色的显示
  */
 export function handlePriceColor(curValue: number, preValue: number) {
     if (!curValue || curValue === preValue) {
-        return '';
+        return ''
     } else if (curValue > preValue) {
-        return 'g-color--up';
+        return 'g-color--up'
     } else {
         return 'g-color--down'
     }
@@ -41,18 +55,60 @@ export function handleNumberValue(value: number, suffix = '') {
 }
 
 /**
- * 获取图片地址
- * @param fileUrl 
+ * 强制保留小数位,不足位数自动补零
+ * @param value 
+ * @param decimal 保留小数位
+ * @param round 是否四舍五入
+ * @returns 
  */
-export function getImageUrl(fileUrl: string) {
-    if (fileUrl) {
-        const { openApiUrl } = service.config
-        return openApiUrl + fileUrl.replace('./', '/')
+export function formatDecimal(value: number | string, decimal = 2, round = true) {
+    const val = Number(value)
+    if (decimal <= 0) {
+        if (round) {
+            return Math.round(val).toString()
+        }
+        return Math.trunc(val).toString()
+    } else {
+        if (round) {
+            return val.toFixed(decimal)
+        }
+        let num = val.toString()
+        const index = num.indexOf('.')
+        if (index < 0) {
+            // 小数位自动补零
+            if (decimal > 0) {
+                const count = num.length
+                num += '.'
+                while (num.length <= count + decimal) {
+                    num += '0'
+                }
+            }
+        }
+        return num.substring(0, decimal + index + 1)
     }
-    // 返回默认图片
-    return ''
 }
 
+/**
+ * 数字转千位符金额
+ * @param value 金额数值
+ * @param decimal 保留小数位 默认2 
+ */
+export function formatAmount(value: number, decimal = 2) {
+    const reg = new RegExp('(\\d)(?=(\\d{3})+$)', 'ig')
+    const result = value.toFixed(decimal).toString().split('.')
+    result[0] = result[0].replace(reg, '$1,')
+    return result.join('.')
+}
+
+/**
+ * 日期格式化
+ * @param date 
+ * @param format 
+ * @returns 
+ */
+export function formatDate(date: string, format = 'YYYY-MM-DD HH:mm:ss') {
+    return moment(date).format(format)
+}
 
 /**
  * Des密钥

BIN
src/packages/mobile/assets/images/boot-1080p.png


BIN
src/packages/mobile/assets/images/boot-480p.png


BIN
src/packages/mobile/assets/images/boot-720p.png


BIN
src/packages/mobile/assets/logo.png


+ 53 - 45
src/packages/mobile/assets/themes/base/mixin.less

@@ -5,137 +5,145 @@
  */
 
 @border-color: #eee;
-@arrow-color:#aaa;
+@arrow-color : #aaa;
 
 /* 移动端1px边框修复 */
 .mixin-border() {
-    position: relative;
+    position   : relative;
     line-height: normal;
 
     &:before {
-        content: '';
-        position: absolute;
+        content         : '';
+        position        : absolute;
         transform-origin: 0 0;
-        box-sizing: border-box;
+        box-sizing      : border-box;
     }
 }
 
 /* 左边框 */
-.mixin-border-left(@width: 1px,@rgb: @border-color,@type: solid) {
+.mixin-border-left(@width: 1px, @rgb: @border-color, @type: solid) {
     .mixin-border();
 
     &:before {
-        top: 0;
-        bottom: 0;
-        left: 0;
-        width: @width;
+        top        : 0;
+        bottom     : 0;
+        left       : 0;
+        width      : @width;
         border-left: @width @type @rgb;
-        transform: scaleX(0.5);
+        transform  : scaleX(0.5);
     }
 }
 
 /* 右边框 */
-.mixin-border-right(@width: 1px,@rgb: @border-color,@type: solid) {
+.mixin-border-right(@width: 1px, @rgb: @border-color, @type: solid) {
     .mixin-border();
 
     &:before {
-        top: 0;
-        bottom: 0;
-        right: 0;
-        width: @width;
+        top         : 0;
+        bottom      : 0;
+        right       : 0;
+        width       : @width;
         border-right: @width @type @rgb;
-        transform: scaleX(0.5);
+        transform   : scaleX(0.5);
     }
 }
 
 /* 上边框 */
-.mixin-border-top(@width: 1px,@rgb: @border-color,@type: solid) {
+.mixin-border-top(@width: 1px, @rgb: @border-color, @type: solid) {
     .mixin-border();
 
     &:before {
-        top: 0;
-        left: 0;
-        right: 0;
-        height: @width;
+        top       : 0;
+        left      : 0;
+        right     : 0;
+        height    : @width;
         border-top: @width @type @rgb;
-        transform: scaleY(0.5);
+        transform : scaleY(0.5);
     }
 }
 
 /* 下边框 */
-.mixin-border-bottom(@width: 1px,@rgb: @border-color,@type: solid) {
+.mixin-border-bottom(@width: 1px, @rgb: @border-color, @type: solid) {
     .mixin-border();
 
     &:before {
-        bottom: 0;
-        left: 0;
-        right: 0;
-        height: @width;
+        bottom       : 0;
+        left         : 0;
+        right        : 0;
+        height       : @width;
         border-bottom: @width @type @rgb;
-        transform: scaleY(0.5);
+        transform    : scaleY(0.5);
     }
 }
 
 .mixin-arrow() {
-    position: relative;
-    font-size: 0;
+    position    : relative;
+    font-size   : 0;
     border-style: solid;
 
     &:after {
-        content: '';
-        position: absolute;
+        content     : '';
+        position    : absolute;
         border-style: solid;
     }
 }
 
-.mixin-arrow-left(@size: 9px,@color: @arrow-color,@maskcolor: #fff) {
+.mixin-arrow-left(@size: 9px, @color: @arrow-color, @maskcolor: #fff) {
     .mixin-arrow();
     border-width: @size @size @size 0;
     border-color: transparent @color transparent;
 
     &:after {
-        left: 2px;
-        top: -@size;
+        left        : 2px;
+        top         : -@size;
         border-width: @size @size @size 0;
         border-color: transparent @maskcolor transparent;
     }
 }
 
-.mixin-arrow-right(@size: 9px,@color: @arrow-color,@maskcolor: #fff) {
+.mixin-arrow-right(@size: 9px, @color: @arrow-color, @maskcolor: #fff) {
     .mixin-arrow();
     border-width: @size 0 @size @size;
     border-color: transparent transparent transparent @color;
 
     &:after {
-        right: 2px;
-        top: -@size;
+        right       : 2px;
+        top         : -@size;
         border-width: @size 0 @size @size;
         border-color: transparent transparent transparent @maskcolor;
     }
 }
 
-.mixin-arrow-up(@size: 9px,@color: @arrow-color,@maskcolor: #fff) {
+.mixin-arrow-up(@size: 9px, @color: @arrow-color, @maskcolor: #fff) {
     .mixin-arrow();
     border-width: 0 @size @size;
     border-color: transparent transparent @color;
 
     &:after {
-        left: -@size;
-        top: 2px;
+        left        : -@size;
+        top         : 2px;
         border-width: 0 @size @size;
         border-color: transparent transparent @maskcolor;
     }
 }
 
-.mixin-arrow-down(@size: 9px,@color: @arrow-color,@maskcolor: #fff) {
+.mixin-arrow-down(@size: 9px, @color: @arrow-color, @maskcolor: #fff) {
     .mixin-arrow();
     border-width: @size @size 0;
     border-color: @color transparent transparent;
 
     &:after {
-        left: -@size;
-        bottom: 2px;
+        left        : -@size;
+        bottom      : 2px;
         border-width: @size @size 0;
         border-color: @maskcolor transparent transparent;
     }
 }
+
+.mixin-text-overflow(@row: 1) {
+    overflow          : hidden;
+    text-overflow     : ellipsis;
+    display           : -webkit-box;
+    -webkit-line-clamp: @row;
+    -webkit-box-orient: vertical;
+}

+ 7 - 0
src/packages/mobile/assets/themes/default/variable.less

@@ -29,6 +29,13 @@
     /* 内容边距 */
     --content-inset: .24rem;
 
+    /* Vant-Button */
+    --van-button-border-width            : 0;
+    --van-button-primary-background-color: #00577C;
+
+    /* Vant-Checkbox */
+    --van-checkbox-checked-icon-color: var(--van-button-primary-background-color);
+
     .app-tabs {
         .tabs {
             flex-wrap: wrap;

+ 11 - 0
src/packages/mobile/assets/themes/style.less

@@ -48,4 +48,15 @@
     &--down {
         color: var(--color-down);
     }
+}
+
+.g-navmenu {
+    .app-iconfont {
+        height: 100%;
+
+        &__icon {
+            font-size   : .32rem;
+            margin-right: .24rem;
+        }
+    }
 }

+ 2 - 2
src/packages/mobile/components/base/pull-refresh/index.vue

@@ -1,12 +1,12 @@
 <template>
     <PullRefresh v-model="refreshing" @refresh="onRefresh">
-        <slot name="before"></slot>
+        <slot name="header"></slot>
         <List v-model:loading="showLoading" :finished="finished" :finished-text="finishedText" @load="onLoad">
             <template v-for="(item, index) in tableSource" :key="index">
                 <slot :item="item" :index="index"></slot>
             </template>
         </List>
-        <slot name="after"></slot>
+        <slot name="footer"></slot>
     </PullRefresh>
 </template>
 

+ 91 - 25
src/packages/mobile/router/index.ts

@@ -10,12 +10,18 @@ const routes: Array<RouteRecordRaw> = [
   {
     path: '/:pathMatch(.*)*',
     name: 'error',
-    component: () => import('../views/error/404.vue')
+    component: () => import('../views/error/404.vue'),
+    meta: {
+      ignoreAuth: true,
+    },
   },
   {
     path: '/boot',
     name: 'boot',
-    component: () => import('../views/boot/index.vue')
+    component: () => import('../views/boot/index.vue'),
+    meta: {
+      ignoreAuth: true,
+    },
   },
   {
     path: '/',
@@ -25,9 +31,6 @@ const routes: Array<RouteRecordRaw> = [
         path: '',
         name: 'home',
         component: () => import('../views/home/index.vue'),
-        meta: {
-          requireAuth: true,
-        },
       }
     ]
   },
@@ -38,7 +41,21 @@ const routes: Array<RouteRecordRaw> = [
       {
         path: '',
         name: 'login',
-        component: () => import('../views/auth/login/index.vue'),
+        component: () => import('../views/user/login/index.vue'),
+        meta: {
+          ignoreAuth: true,
+        },
+      }
+    ]
+  },
+  {
+    path: '/logoff',
+    component: Page,
+    children: [
+      {
+        path: '',
+        name: 'logoff',
+        component: () => import('../views/user/logoff/index.vue'),
       }
     ]
   },
@@ -49,7 +66,10 @@ const routes: Array<RouteRecordRaw> = [
       {
         path: '',
         name: 'register',
-        component: () => import('../views/auth/register/index.vue'),
+        component: () => import('../views/user/register/index.vue'),
+        meta: {
+          ignoreAuth: true,
+        },
       }
     ]
   },
@@ -60,7 +80,10 @@ const routes: Array<RouteRecordRaw> = [
       {
         path: '',
         name: 'forget',
-        component: () => import('../views/auth/forget/index.vue'),
+        component: () => import('../views/user/forget/index.vue'),
+        meta: {
+          ignoreAuth: true,
+        },
       }
     ]
   },
@@ -75,7 +98,7 @@ const routes: Array<RouteRecordRaw> = [
       },
       {
         path: 'detail',
-        name: 'marketDetail',
+        name: 'market-detail',
         component: () => import('../views/market/detail/index.vue'),
       }
     ]
@@ -86,14 +109,19 @@ const routes: Array<RouteRecordRaw> = [
     children: [
       {
         path: 'bank',
-        name: 'bankWallet',
+        name: 'bank-wallet',
         component: () => import('../views/bank/wallet/index.vue'),
       },
       {
         path: 'sign',
-        name: 'bankSign',
+        name: 'bank-sign',
         component: () => import('../views/bank/sign/index.vue'),
       },
+      {
+        path: 'statement',
+        name: 'bank-statement',
+        component: () => import('../views/bank/statement/index.vue'),
+      },
     ]
   },
   {
@@ -102,57 +130,95 @@ const routes: Array<RouteRecordRaw> = [
     children: [
       {
         path: 'ptgz',
-        name: 'rulesPTGZ',
+        name: 'rules-ptgz',
         component: () => import('../views/rules/ptgz/index.vue'),
       },
       {
         path: 'myrz',
-        name: 'rulesMYRZ',
+        name: 'rules-myrz',
         component: () => import('../views/rules/myrz/index.vue'),
       },
       {
         path: 'ccwl',
-        name: 'rulesCCWL',
+        name: 'rules-ccwl',
         component: () => import('../views/rules/ccwl/index.vue'),
       },
       {
         path: 'zcxy',
-        name: 'rulesZCXY',
+        name: 'rules-zcxy',
         component: () => import('../views/rules/zcxy/index.vue'),
+        meta: {
+          ignoreAuth: true,
+        },
       },
       {
         path: 'yszc',
-        name: 'rulesYSZC',
+        name: 'rules-yszc',
         component: () => import('../views/rules/yszc/index.vue'),
+        meta: {
+          ignoreAuth: true,
+        },
       },
       {
         path: 'gywm',
-        name: 'rulesGYWM',
+        name: 'rules-gywm',
         component: () => import('../views/rules/gywm/index.vue'),
       },
     ]
   },
   {
-    path: '/mine',
+    path: '/credit',
     component: Page,
     children: [
       {
         path: 'signin',
-        name: 'mineSignin',
-        component: () => import('../views/mine/signin/index.vue'),
+        name: 'credit-signin',
+        component: () => import('../views/credit/signin/index.vue'),
       },
       {
+        path: 'statement',
+        name: 'credit-statement',
+        component: () => import('../views/credit/statement/index.vue'),
+      },
+    ]
+  },
+  {
+    path: '/mine',
+    component: Page,
+    children: [
+      {
         path: 'generalize',
-        name: 'mineGeneralize',
+        name: 'mine-generalize',
         component: () => import('../views/mine/generalize/index.vue'),
       },
       {
         path: 'service',
-        name: 'mineService',
+        name: 'mine-service',
         component: () => import('../views/mine/service/index.vue'),
       },
+      {
+        path: 'address',
+        name: 'mine-address',
+        component: () => import('../views/mine/address/index.vue'),
+      },
     ]
   },
+  {
+    path: '/setting',
+    component: Page,
+    children: [
+      {
+        path: '',
+        name: 'setting',
+        component: () => import('../views/setting/main/index.vue'),
+      },
+      {
+        path: 'password',
+        name: 'setting-password',
+        component: () => import('../views/setting/password/index.vue'),
+      },
+    ]
+  }
 ]
 
 const router = animateRouter.create({
@@ -164,13 +230,13 @@ const router = animateRouter.create({
 router.beforeEach((to, from, next) => {
   // 判断服务是否加载完成
   if (service.isReady) {
-    if (to.meta.requireAuth && !getToken()) {
+    if (to.meta.ignoreAuth || getToken()) {
+      next();
+    } else {
       next({
         name: 'login',
         query: { redirect: to.fullPath },
       });
-    } else {
-      next();
     }
   } else {
     if (to.name === 'boot' || to.name === 'login') {

+ 10 - 0
src/packages/mobile/views/bank/statement/index.vue

@@ -0,0 +1,10 @@
+<template>
+    <app-view class="logoff">
+        <template #header>
+            <app-navbar title="资金流水" />
+        </template>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+</script>

+ 4 - 3
src/packages/mobile/views/boot/index.less

@@ -1,7 +1,8 @@
 .boot {
-    height          : 100vh;
-    background-color: #fff;
-    overflow        : hidden;
+    height         : 100vh;
+    background     : #fff url('@mobile/assets/images/boot-1080p.png') no-repeat center top;
+    background-size: 100% auto;
+    overflow       : hidden;
 
     &-skip {
         position       : fixed;

+ 12 - 9
src/packages/mobile/views/boot/index.vue

@@ -1,14 +1,17 @@
 <template>
   <div class="boot">
-    <div class="boot-skip" v-if="state.second > 0">
-      <Circle v-model:current-rate="state.currentRate" :rate="state.rate" :speed="100" :stroke-width="60" @click="skip">
-        <span>{{ state.second }}</span>
-      </Circle>
-    </div>
-    <div class="boot-wrapper">
-      <Loading v-if="state.loading">正在烧烤...</Loading>
-      <span v-else>烧烤完毕!</span>
-    </div>
+    <template v-if="false">
+      <div class="boot-skip" v-if="state.second > 0">
+        <Circle v-model:current-rate="state.currentRate" :rate="state.rate" :speed="100" :stroke-width="60"
+          @click="skip">
+          <span>{{ state.second }}</span>
+        </Circle>
+      </div>
+      <div class="boot-wrapper">
+        <Loading v-if="state.loading">正在加载...</Loading>
+        <span v-else>加载完毕!</span>
+      </div>
+    </template>
   </div>
 </template>
 

+ 0 - 0
src/packages/mobile/views/mine/signin/index.less → src/packages/mobile/views/credit/signin/index.less


+ 22 - 18
src/packages/mobile/views/mine/signin/index.vue → src/packages/mobile/views/credit/signin/index.vue

@@ -22,7 +22,8 @@
                             <app-iconfont icon="icon-jifenchoujiang" label-direction="bottom">积分抽奖</app-iconfont>
                         </li>
                         <li>
-                            <app-iconfont icon="icon-jifenliushui" label-direction="bottom">积分流水</app-iconfont>
+                            <app-iconfont icon="icon-jifenliushui" label-direction="bottom"
+                                @click="routerTo('credit-statement')">积分流水</app-iconfont>
                         </li>
                     </ul>
                 </div>
@@ -43,7 +44,7 @@
                         <app-iconfont class="icon-score" icon="icon-jifenyue">+50</app-iconfont>
                     </div>
                     <div class="list-item__button">
-                        <Button type="primary" @click="routerTo('mineGeneralize')" round>去完成</Button>
+                        <Button type="primary" @click="routerTo('mine-generalize')" round>去完成</Button>
                     </div>
                 </dd>
                 <dd class="list-item">
@@ -72,6 +73,7 @@
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
 import { Toast, Button } from 'vant'
+import { fullloading } from '@/utils/vant'
 import { useLoginStore } from '@/stores'
 import { queryUserAccount } from '@/services/api/account'
 import { signin } from '@/services/api/common'
@@ -89,22 +91,24 @@ const onReady = (el: HTMLDivElement) => {
 }
 
 const userSignin = () => {
-    signin({
-        data: {
-            userid: getUserId()
-        },
-        success: (res) => {
-            if (res.data.signinstatus === 1) {
-                getUserAccount()
-                Toast.success('签到成功')
-            } else {
-                Toast.fail('今日已签到')
-            }
-        },
-        fail: () => {
-            Toast.fail('签到失败')
-        }
-    })
+    fullloading(() => {
+        signin({
+            data: {
+                userid: getUserId()
+            },
+            success: (res) => {
+                if (res.data.signinstatus === 1) {
+                    getUserAccount()
+                    Toast.success('签到成功')
+                } else {
+                    Toast.fail('今日已签到')
+                }
+            },
+            fail: () => {
+                Toast.fail('签到失败')
+            },
+        })
+    }, '签到中...')
 }
 
 const getUserAccount = () => {

+ 52 - 0
src/packages/mobile/views/credit/statement/index.vue

@@ -0,0 +1,52 @@
+<template>
+    <app-view class="logoff">
+        <template #header>
+            <app-navbar ref="navbarRef" title="积分流水" />
+        </template>
+        <app-pull-refresh v-model:dataList="tableList" v-model:loading="loading" :total="total" @refresh="onRefresh">
+            <template #header>
+                <Sticky :offset-top="50">
+                    <ul class="tablelist">
+                        <li class="tablelist-cell">时间</li>
+                        <li class="tablelist-cell">操作类型</li>
+                        <li class="tablelist-cell">金额</li>
+                    </ul>
+                </Sticky>
+            </template>
+            <template #default="{ item }">
+                <ul class="tablelist">
+                    <li class="tablelist-cell">{{ item.createtime }}</li>
+                    <li class="tablelist-cell">{{ item.scoreconfigtype }}</li>
+                    <li class="tablelist-cell">{{ item.score }}</li>
+                </ul>
+            </template>
+        </app-pull-refresh>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { reactive } from 'vue'
+import { Sticky } from 'vant'
+import { useCreditList } from '@/business/credit'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+
+const { dataList, loading, total, getCreditList } = useCreditList()
+const tableList = reactive<Model.UserScoreLogRsp[]>([])
+
+const onRefresh = (resolve: (data: Model.UserScoreLogRsp[]) => void) => {
+    getCreditList().then(() => {
+        resolve(dataList.value)
+    })
+}
+</script>
+
+<style lang="less">
+.tablelist {
+    display: flex;
+
+    &-cell {
+        flex: 1;
+        background-color: #fff;
+    }
+}
+</style>

+ 10 - 2
src/packages/mobile/views/home/components/main/index.less

@@ -1,3 +1,5 @@
+@import '@mobile/assets/themes/base/mixin.less';
+
 .home-main {
     .app-view__wrapper {
         display       : flex;
@@ -129,10 +131,16 @@
 
         .article {
             &-item {
-                &__title {}
+                &__title {
+                    span {
+                        .mixin-text-overflow()
+                    }
+
+                }
 
                 &__time {
-                    flex: initial;
+                    flex       : initial;
+                    margin-left: .48rem;
                 }
             }
         }

+ 8 - 8
src/packages/mobile/views/home/components/main/index.vue

@@ -21,23 +21,23 @@
               <li>
                 <app-iconfont icon="icon-chanpinjiage" label-direction="bottom">产品价格</app-iconfont>
               </li> -->
-              <li @click="routerTo('rulesPTGZ')">
+              <li @click="routerTo('rules-ptgz')">
                 <app-iconfont icon="icon-pingtaiguize" label-direction="bottom">平台规则</app-iconfont>
               </li>
-              <li @click="routerTo('mineSignin')">
+              <li @click="routerTo('credit-signin')">
                 <app-iconfont icon="icon-woderenwu" label-direction="bottom">我的任务</app-iconfont>
               </li>
-              <li @click="routerTo('rulesMYRZ')">
+              <li @click="routerTo('rules-myrz')">
                 <app-iconfont icon="icon-maoyirongzi" label-direction="bottom">贸易融资</app-iconfont>
               </li>
-              <li @click="routerTo('rulesCCWL')">
+              <li @click="routerTo('rules-ccwl')">
                 <app-iconfont icon="icon-wuliucangchu" label-direction="bottom">仓储物流</app-iconfont>
               </li>
             </ul>
           </SwipeItem>
           <!-- <SwipeItem>
             <ul>
-              <li @click="routerTo('rulesCCWL')">
+              <li @click="routerTo('rules-ccwl')">
                 <app-iconfont icon="icon-wuliucangchu" label-direction="bottom">仓储物流</app-iconfont>
               </li>
               <li v-for="i in 4" :key="i"></li>
@@ -68,8 +68,8 @@
           is-link />
         <CellGroup class="article">
           <template v-for="(item, index) in newsList" :key="index">
-            <Cell class="article-item" label-class="article-item__title" value-class="article-item__time"
-              :title="item.title" :value="item.creaedate" />
+            <Cell class="article-item" title-class="article-item__title" value-class="article-item__time"
+              :title="item.title" :value="formatDate(item.creaedate, 'MM/DD')" />
           </template>
         </CellGroup>
       </div>
@@ -80,7 +80,7 @@
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
 import { Cell, CellGroup, Swipe, SwipeItem, PullRefresh } from 'vant'
-import { getImageUrl } from '@/filters'
+import { getImageUrl, formatDate } from '@/filters'
 import { useNavigation } from '@/hooks/navigation'
 import { queryImageConfigs } from '@/services/api/common'
 import { querySiteColumnDetail } from '@/services/api/news'

+ 0 - 12
src/packages/mobile/views/home/components/mine/index.less

@@ -157,18 +157,6 @@
         }
     }
 
-    &__menu {
-        .van-cell__title {
-            display    : flex;
-            align-items: center;
-
-            .app-iconfont__icon {
-                font-size   : .32rem;
-                margin-right: .24rem;
-            }
-        }
-    }
-
     &__footer {
         padding: .2rem 0;
 

+ 16 - 16
src/packages/mobile/views/home/components/mine/index.vue

@@ -35,20 +35,20 @@
           </div>
           <div class="bank-item">
             <span>
-              <a>资金流水</a>
+              <a @click="routerTo('bank-statement')">资金流水</a>
             </span>
             <span></span>
           </div>
         </div>
         <!-- <div class="button">
-          <Button size="small" @click="routerTo('bankWallet')" round>提现</Button>
-          <Button type="primary" size="small" color="#00577C" @click="routerTo('bankWallet')" round>充值</Button>
+          <Button size="small" @click="routerTo('bank-wallet')" round>提现</Button>
+          <Button type="primary" size="small" color="#00577C" @click="routerTo('bank-wallet')" round>充值</Button>
         </div> -->
       </div>
     </div>
     <div class="home-mine__iconbar">
       <ul>
-        <li @click="routerTo('mineGeneralize')" style="align-items:flex-start">
+        <li @click="routerTo('mine-generalize')">
           <app-iconfont icon="icon-wodetuiguang" label-direction="bottom">我的推广</app-iconfont>
         </li>
         <!-- <li>
@@ -56,16 +56,16 @@
         </li>
         <li>
           <app-iconfont icon="icon-wodecangdan" label-direction="bottom">我的仓单</app-iconfont>
-        </li>
+        </li> -->
         <li>
           <app-iconfont icon="icon-fapiaoxinxi" label-direction="bottom">发票信息</app-iconfont>
         </li>
-        <li>
+        <li @click="routerTo('mine-address')">
           <app-iconfont icon="icon-shouhuodizhi" label-direction="bottom">收货地址</app-iconfont>
-        </li> -->
+        </li>
       </ul>
     </div>
-    <div class="home-mine__menu">
+    <div class="g-navmenu">
       <CellGroup>
         <!-- <Cell is-link>
           <template #title>
@@ -77,36 +77,36 @@
             <app-iconfont icon="icon-qianyuezhanghu">签约账户</app-iconfont>
           </template>
         </Cell> -->
-        <Cell is-link :to="{ name: 'rulesZCXY' }">
+        <Cell is-link :to="{ name: 'rules-zcxy' }">
           <template #title>
             <app-iconfont icon="icon-yonghuzhucexieyi">用户注册协议</app-iconfont>
           </template>
         </Cell>
-        <Cell is-link :to="{ name: 'rulesYSZC' }">
+        <Cell is-link :to="{ name: 'rules-yszc' }">
           <template #title>
             <app-iconfont icon="icon-guanyuzhengce">关于隐私</app-iconfont>
           </template>
         </Cell>
-        <Cell is-link :to="{ name: 'mineService' }">
+        <Cell is-link :to="{ name: 'mine-service' }">
           <template #title>
             <app-iconfont icon="icon-kefurexian">客服热线</app-iconfont>
           </template>
         </Cell>
-        <!-- <Cell is-link>
+        <Cell is-link :to="{ name: 'setting' }">
           <template #title>
             <app-iconfont icon="icon-shezhi">设置</app-iconfont>
           </template>
-        </Cell> -->
-        <Cell is-link :to="{ name: 'rulesGYWM' }">
+        </Cell>
+        <Cell is-link :to="{ name: 'rules-gywm' }">
           <template #title>
             <app-iconfont icon="icon-guanyuwomen">关于我们</app-iconfont>
           </template>
         </Cell>
-        <!-- <Cell is-link>
+        <Cell is-link :to="{ name: 'logoff' }">
           <template #title>
             <app-iconfont icon="icon-zhuxiaofuwu">注销服务</app-iconfont>
           </template>
-        </Cell> -->
+        </Cell>
       </CellGroup>
     </div>
     <div class="home-mine__footer">

+ 1 - 1
src/packages/mobile/views/market/main/index.vue

@@ -10,7 +10,7 @@
     <app-pull-refresh v-model:loading="state.loading" v-model:dataList="state.list" :total="60" @refresh="onRefresh"
       v-if="animationend">
       <template #default="{ item }">
-        <Cell :title="item" :to="{ name: 'marketDetail', params: { id: 1 } }" />
+        <Cell :title="item" :to="{ name: 'market-detail', params: { id: 1 } }" />
       </template>
     </app-pull-refresh>
   </app-view>

+ 96 - 0
src/packages/mobile/views/mine/address/components/edit/index.vue

@@ -0,0 +1,96 @@
+<template>
+    <app-view class="main-address-edit">
+        <template #header>
+            <app-navbar title="新增收货地址" />
+        </template>
+        <Form ref="formRef" class="main-address-form" @submit="formSubmit">
+            <CellGroup inset>
+                <Field v-model="formData.mobilephone" name="mobilephone" label="收货人" placeholder="必填"
+                    :rules="formRules.mobilephone" />
+                <Field v-model="formData.mobilephone" type="tel" name="mobilephone" label="联系电话" placeholder="必填"
+                    :rules="formRules.mobilephone" />
+                <Field v-model="formData.loginpwd" name="loginpwd" type="password" label="收货地区" placeholder="必填"
+                    :rules="formRules.loginpwd" />
+                <Field v-model="formData.refernum" name="refernum" label="推荐码" placeholder="详细地址" />
+            </CellGroup>
+        </Form>
+        <template #footer>
+            <div class="main-address-footer">
+                <Button type="primary" @click="formRef?.submit" round block>确定</Button>
+            </div>
+        </template>
+    </app-view>
+</template>
+  
+<script lang="ts" setup>
+import { reactive, ref } from 'vue'
+import { CellGroup, Button, Field, Form, FormInstance, Toast, FieldRule } from 'vant'
+import { fullloading, dialog } from '@/utils/vant'
+import { validateRules } from '@/constants/regex'
+import { useNavigation } from '@/hooks/navigation'
+import { userRegister, sendRegisterVerifyCode } from '@/services/api/common'
+
+const { router } = useNavigation()
+const formRef = ref<FormInstance>()
+const checked = ref(false) // 是否同意注册条款
+const isCountdown = ref(false) // 是否正在倒计时
+
+// 表单数据
+const formData = reactive<Model.RegisterReq>({
+    mobilephone: '',
+    loginpwd: '',
+    vcode: '',
+    refernum: '',
+    isaudit: 1,
+    userinfotype: 1,
+    usertype: 5,
+    openmode: 5,
+    lsitAgreementID: []
+})
+
+// 表单验证规则
+const formRules: { [key in keyof Model.RegisterReq]?: FieldRule[] } = {
+    mobilephone: [{
+        required: true,
+        message: '请输入手机号码',
+        validator: (val) => {
+            if (validateRules.phone.validate(val)) {
+                return true
+            }
+            return validateRules.phone.message
+        }
+    }],
+    loginpwd: [{
+        required: true,
+        message: '请输入登录密码',
+        validator: (val) => {
+            if (validateRules.password.validate(val)) {
+                return true
+            }
+            return validateRules.password.message
+        }
+    }],
+    vcode: [{
+        required: true,
+        message: '请输入短信验证码',
+    }],
+}
+
+// 表单提交
+const formSubmit = () => {
+    fullloading((hideLoading) => {
+        userRegister({
+            success: (res) => {
+                if (res.code === 0) {
+                    hideLoading()
+                    dialog('您的账号已成功注册。').then(() => {
+                        router.back()
+                    })
+                } else {
+                    Toast.fail(res.message)
+                }
+            }
+        })
+    })
+}
+</script>

+ 10 - 0
src/packages/mobile/views/mine/address/index.vue

@@ -0,0 +1,10 @@
+<template>
+    <app-view class="mine-address">
+        <template #header>
+            <app-navbar title="收货地址管理" />
+        </template>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+</script>

+ 7 - 5
src/packages/mobile/views/mine/service/index.vue

@@ -3,12 +3,14 @@
         <template #header>
             <app-navbar title="客服热线" />
         </template>
-        <div class="mine-service__logo">
+        <!-- <div class="mine-service__logo">
             <img src="@mobile/assets/logo.png" />
-        </div>
-        <CellGroup>
-            <Cell title="客服热线" value="021-96169" />
-            <Cell title="服务时间">
+        </div> -->
+        <CellGroup title="客服热线">
+            <Cell value="021-96169" />
+        </CellGroup>
+        <CellGroup title="服务时间">
+            <Cell>
                 <template #value>
                     <span>周一至周五 8:30-20:30</span>
                     <span>周六至周日(含节假日) 8:30-17:00</span>

+ 21 - 0
src/packages/mobile/views/setting/main/index.vue

@@ -0,0 +1,21 @@
+<template>
+    <app-view class="setting">
+        <template #header>
+            <app-navbar title="设置" />
+        </template>
+        <div class="g-navmenu">
+            <CellGroup>
+                <Cell is-link :to="{ name: 'setting-password' }">
+                    <template #title>
+                        <app-iconfont icon="icon-yonghuzhucexieyi">修改密码</app-iconfont>
+                    </template>
+                </Cell>
+            </CellGroup>
+        </div>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { Cell, CellGroup } from 'vant'
+import AppIconfont from '@mobile/components/base/iconfont/index.vue'
+</script>

+ 77 - 0
src/packages/mobile/views/setting/password/index.vue

@@ -0,0 +1,77 @@
+<template>
+    <app-view class="setting-password">
+        <template #header>
+            <app-navbar title="修改密码" />
+        </template>
+        <Form ref="formRef" class="forget-form" @submit="onSubmit">
+            <CellGroup inset>
+                <Field v-model="formData.OldPwd" type="password" name="OldPwd" label="原密码" placeholder="必填"
+                    autocomplete="off" :rules="formRules.OldPwd" />
+                <Field v-model="formData.NewPwd" name="NewPwd" type="password" label="新密码" placeholder="必填"
+                    autocomplete="off" :rules="formRules.NewPwd" />
+                <Field v-model="confirmpassword" name="confirmpassword" type="password" label="确认密码" placeholder="必填"
+                    autocomplete="off" :rules="formRules.confirmpassword" />
+            </CellGroup>
+        </Form>
+        <template #footer>
+            <div class="forget-footer">
+                <Button type="primary" @click="formRef?.submit()" round block>提交</Button>
+            </div>
+        </template>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { CellGroup, Button, Field, Form, FormInstance, FieldRule, Toast } from 'vant'
+import { fullloading, dialog } from '@/utils/vant'
+import { validateRules } from '@/constants/regex'
+import { useAuth } from '@/business/auth'
+import { useAccountPassword } from '@/business/user'
+
+const { logout } = useAuth()
+const { formData, formSubmit } = useAccountPassword(1)
+const formRef = shallowRef<FormInstance>()
+const confirmpassword = shallowRef('')
+
+// 表单验证规则
+const formRules: { [key in keyof Proto.ModifyPwdReq | 'confirmpassword']?: FieldRule[] } = {
+    OldPwd: [{
+        required: true,
+        message: '请输入原密码',
+    }],
+    NewPwd: [{
+        required: true,
+        message: '请输入新密码',
+        validator: (val) => {
+            if (validateRules.password.validate(val)) {
+                return true
+            }
+            return validateRules.password.message
+        }
+    }],
+    confirmpassword: [{
+        required: true,
+        message: '请输入确认密码',
+        validator: (val) => {
+            if (formData.NewPwd === val) {
+                return true
+            }
+            return '新密码和确认密码不一致'
+        }
+    }],
+}
+
+const onSubmit = () => {
+    fullloading((hideLoading) => {
+        formSubmit().then(() => {
+            hideLoading()
+            dialog('密码修改成功,请重新登录。').then(() => {
+                logout()
+            })
+        }).catch((err) => {
+            Toast.fail(err)
+        })
+    })
+}
+</script>

+ 0 - 0
src/packages/mobile/views/auth/forget/index.less → src/packages/mobile/views/user/forget/index.less


+ 0 - 0
src/packages/mobile/views/auth/forget/index.vue → src/packages/mobile/views/user/forget/index.vue


+ 2 - 2
src/packages/mobile/views/auth/login/index.less → src/packages/mobile/views/user/login/index.less

@@ -13,7 +13,7 @@
     }
 
     &-form {
-        padding: .36rem;
+        padding: .36rem .48rem;
 
         .van-cell-group {
             border-radius: 8px;
@@ -24,7 +24,7 @@
             &-link {
                 display        : flex;
                 justify-content: space-between;
-                padding        : .32rem;
+                padding        : .32rem 0;
 
                 a {
                     color: #333;

+ 8 - 8
src/packages/mobile/views/auth/login/index.vue → src/packages/mobile/views/user/login/index.vue

@@ -3,25 +3,25 @@
     <div class="login-logo">铁合金掌上行</div>
     <Form class="login-form" @submit="formSubmit">
       <CellGroup>
-        <Field v-model="user.LoginID" name="account" label="用户名" placeholder="请输入用户名"
-          :rules="[{ required: true, message: '随便输入' }]" />
-        <Field v-model="user.LoginPWD" name="password" type="password" label="密码" placeholder="请输入密码"
-          :rules="[{ required: true, message: '随便输入' }]" autocomplete="off" />
+        <Field v-model="user.LoginID" name="account" label="用户名" size="large" placeholder="请输入用户名"
+          :rules="[{ required: true, message: '请输入用户名' }]" />
+        <Field v-model="user.LoginPWD" name="password" type="password" label="密码" size="large" placeholder="请输入密码"
+          :rules="[{ required: true, message: '请输入密码' }]" autocomplete="off" />
       </CellGroup>
       <div class="button-link">
         <router-link :to="{ name: 'register' }">用户注册</router-link>
         <router-link :to="{ name: 'forget' }">忘记密码</router-link>
       </div>
       <div class="button-submit">
-        <Button native-type="submit" color="#00577C" round block>登录</Button>
+        <Button type="primary" native-type="submit" round block>登录</Button>
       </div>
     </Form>
     <div class="login-footer">
-      <Checkbox v-model="checked" checked-color="#00577C" />
+      <Checkbox v-model="checked" />
       <span>我已阅读并同意</span>
-      <span @click="routerTo('rulesZCXY')" style="color:#E92020">《用户注册协议》</span>
+      <span @click="routerTo('rules-zcxy')" style="color:#E92020">《用户注册协议》</span>
       <span>和</span>
-      <span @click="routerTo('rulesYSZC')" style="color:#E92020">《隐私政策》</span>
+      <span @click="routerTo('rules-yszc')" style="color:#E92020">《隐私政策》</span>
     </div>
   </app-statusbar>
 </template>

+ 1 - 0
src/packages/mobile/views/user/logoff/index.less

@@ -0,0 +1 @@
+.logoff {}

+ 47 - 0
src/packages/mobile/views/user/logoff/index.vue

@@ -0,0 +1,47 @@
+<template>
+    <app-view class="logoff">
+        <template #header>
+            <app-navbar title="注销服务" />
+        </template>
+        <section class="logoff-details">
+            <h1>为保证您的账号安全,在提交注销申请时,需同时满足以下条件:</h1>
+            <dl>
+                <dt>1.账号财产已结清</dt>
+                <dd>没有资产、欠款、未结清的资金和现货。</dd>
+                <dt>2. 账号处于安全状态</dt>
+                <dd>账号处于正常使用状态,无被盗风险。</dd>
+                <dt>3. 账号无任何纠纷</dt>
+            </dl>
+        </section>
+        <template #footer>
+            <Button type="primary" @click="onSubmit">确认注销</Button>
+        </template>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { Toast, Button } from 'vant'
+import { fullloading, dialog } from '@/utils/vant'
+import { useAccountCancellation } from '@/business/user'
+
+const { formSubmit } = useAccountCancellation()
+
+const onSubmit = () => {
+    dialog('账户注销后不能再使用该系统,如果账户有余额需要人工审核才能注销,确定要注销账户吗?', {
+        showCancelButton: true
+    }).then(() => {
+        fullloading((hideLoading) => {
+            formSubmit().then(() => {
+                hideLoading()
+                dialog('提交成功,请等待审核。')
+            }).catch((err) => {
+                Toast.fail(err)
+            })
+        })
+    })
+}
+</script>
+
+<style lang="less" scoped>
+@import './index.less';
+</style>

+ 9 - 0
src/packages/mobile/views/auth/register/index.less → src/packages/mobile/views/user/register/index.less

@@ -5,6 +5,15 @@
         .van-cell-group:not(:first-child) {
             margin-top: .24rem;
         }
+
+        .agreement {
+            display    : flex;
+            align-items: center;
+
+            .van-checkbox {
+                margin-right: .24rem;
+            }
+        }
     }
 
     &-footer {

+ 11 - 2
src/packages/mobile/views/auth/register/index.vue → src/packages/mobile/views/user/register/index.vue

@@ -22,7 +22,13 @@
       </CellGroup>
       <CellGroup inset>
         <Cell>
-          <Checkbox v-model="checked">我已阅读并同意</Checkbox>
+          <template #title>
+            <div class="agreement">
+              <Checkbox v-model="checked" />
+              <span>我已阅读并同意</span>
+              <span @click="routerTo('rules-zcxy')" style="color:#E92020">《用户注册协议》</span>
+            </div>
+          </template>
         </Cell>
       </CellGroup>
     </Form>
@@ -44,7 +50,7 @@ import { useNavigation } from '@/hooks/navigation'
 import { userRegister, sendRegisterVerifyCode } from '@/services/api/common'
 import cryptojs from 'crypto-js'
 
-const { router } = useNavigation()
+const { router, routerTo } = useNavigation()
 const formRef = ref<FormInstance>()
 const checked = ref(false) // 是否同意注册条款
 const isCountdown = ref(false) // 是否正在倒计时
@@ -141,6 +147,9 @@ const formSubmit = () => {
           } else {
             Toast.fail(res.message)
           }
+        },
+        fail: (err) => {
+          Toast.fail(err)
         }
       })
     })

+ 1 - 1
src/packages/pc/router/index.ts

@@ -14,7 +14,7 @@ const routes: Array<RouteRecordRaw> = [
     {
         path: '/login',
         name: 'login',
-        component: () => import('../views/auth/login/index.vue'),
+        component: () => import('../views/user/login/index.vue'),
         meta: {
             title: "登陆",
         },

+ 0 - 0
src/packages/pc/views/auth/components/layout/index.less → src/packages/pc/views/user/components/layout/index.less


+ 0 - 0
src/packages/pc/views/auth/components/layout/index.vue → src/packages/pc/views/user/components/layout/index.vue


+ 0 - 0
src/packages/pc/views/auth/login/index.less → src/packages/pc/views/user/login/index.less


+ 0 - 0
src/packages/pc/views/auth/login/index.vue → src/packages/pc/views/user/login/index.vue


+ 14 - 0
src/services/api/account/index.ts

@@ -57,4 +57,18 @@ export function queryTaAccounts(params: HttpParams<{ req: Model.TaAccountsReq, r
  */
 export function queryAccountRole(params: HttpParams<{ rsp: Model.UserRole[] }>) {
     return httpRequest('/account/role', 'get', params);
+}
+
+/**
+ * 投资者销户申请
+ */
+export function investorDel(params: TradeParams<Proto.InvestorDelReq, Proto.InvestorDelRsp>) {
+    return tradeServerRequest('InvestorDelReq', 'InvestorDelRsp', params);
+}
+
+/**
+ * 修改密码
+ */
+export function modifyPassword(params: TradeParams<Proto.ModifyPwdReq, Proto.ModifyPwdRsp>) {
+    return tradeServerRequest('ModifyPwdReq', 'ModifyPwdRsp', params);
 }

+ 67 - 0
src/services/api/bank/index.ts

@@ -0,0 +1,67 @@
+import { httpRequest } from '@/services/http'
+import { HttpParams } from '@/services/http/interface'
+import { tradeServerRequest } from '@/services/socket/trade'
+import { TradeParams } from '@/services/socket/trade/interface'
+
+/**
+ * 银行签约
+ */
+export function t2bBankSign(params: TradeParams<Partial<Proto.t2bBankSignReq>, Proto.t2bBankSignRsp>) {
+    return tradeServerRequest('t2bBankSignReq', 't2bBankSignRsp', params);
+}
+
+/**
+ * 银行解约
+ */
+export function t2bBankCancelSign(params: TradeParams<Proto.t2bBankCancelSignReq, Proto.t2bBankCancelSignRsp>) {
+    return tradeServerRequest('t2bBankCancelSignReq', 't2bBankCancelSignRsp', params);
+}
+
+/**
+ * 出金申请
+ */
+export function t2bBankWithdraw(params: TradeParams<Partial<Proto.t2bBankWithdrawReq>, Proto.t2bBankWithdrawRsp>) {
+    return tradeServerRequest('t2bBankWithdrawReq', 't2bBankWithdrawRsp', params);
+}
+
+/**
+ * 入金申请
+ */
+export function t2bBankDeposit(params: TradeParams<Partial<Proto.t2bBankDepositReq>, Proto.t2bBankDepositRsp>) {
+    return tradeServerRequest('t2bBankDepositReq', 't2bBankDepositRsp', params);
+}
+
+/**
+ * 查询托管银行
+ */
+export function queryCusBankSignBank(params: HttpParams<{ rsp: Model.CusBankSignBankRsp[] }>) {
+    return httpRequest('/Qhj/QueryCusBankSignBank', 'get', params);
+}
+
+/**
+ * 查询开户行
+ */
+export function queryBankInfo(params: HttpParams<{ rsp: Model.BankInfoRsp[] }>) {
+    return httpRequest('/Qhj/QueryBankInfo', 'get', params);
+}
+
+/**
+ * 查询签约银行信息(提现账户管理)
+ */
+export function queryBankAccountSign(params: HttpParams<{ req: Model.BankAccountSignReq, rsp: Model.BankAccountSignRsp[] }>) {
+    return httpRequest('/Qhj/QueryBankAccountSign', 'get', params);
+}
+
+/**
+ * 查询充值提现
+ */
+export function queryAccountInOutApply(params: HttpParams<{ req: Model.AccountInOutApplyReq, rsp: Model.AccountOutInApplyRsp[] }>) {
+    return httpRequest('/Qhj/QueryAccountInOutApply', 'get', params);
+}
+
+/**
+ * 资金流水查询(历史)
+ */
+export function queryHisAmountLog(params: HttpParams<{ req: Model.HisAmountLogReq, rsp: Model.HisAmountLogRsp[] }>) {
+    return httpRequest('/TaAccount/QueryHisAmountLog', 'get', params);
+}

+ 9 - 0
src/services/api/credit/index.ts

@@ -0,0 +1,9 @@
+import { httpRequest } from '@/services/http'
+import { HttpParams } from '@/services/http/interface'
+
+/**
+ * 查询我的积分流水
+ */
+export function queryUserScoreLog(params: HttpParams<{ req: Model.UserScoreLogReq, rsp: Model.UserScoreLogRsp[] }>) {
+    return httpRequest('/Ferroalloy/QueryUserScoreLog', 'get', params);
+}

+ 32 - 0
src/services/api/user/index.ts

@@ -0,0 +1,32 @@
+import { httpRequest } from '@/services/http'
+import { HttpParams } from '@/services/http/interface'
+import { tradeServerRequest } from '@/services/socket/trade'
+import { TradeParams } from '@/services/socket/trade/interface'
+
+/**
+ * 查询收货地址信息
+ */
+export function queryUserReceiveInfo(params: HttpParams<{ req: Model.UserReceiveInfoReq, rsp: Model.UserReceiveInfoRsp[] }>) {
+    return httpRequest('/Qhj/QueryUserReceiveInfo', 'get', params);
+}
+
+/**
+ * 新增修改收货地址
+ */
+export function userReceiveInfo(params: TradeParams<Proto.UserReceiveInfoReq, Proto.UserReceiveInfoRsp>) {
+    return tradeServerRequest('UserReceiveInfoReq', 'UserReceiveInfoRsp', params);
+}
+
+/**
+ * 删除收货地址
+ */
+export function delUserReceiveInfo(params: TradeParams<Proto.DelUserReceiveInfoReq, Proto.DelUserReceiveInfoRsp>) {
+    return tradeServerRequest('DelUserReceiveInfoReq', 'DelUserReceiveInfoRsp', params);
+}
+
+/**
+ * 设置默认收货地址
+ */
+export function userReceiveIsDefault(params: TradeParams<Proto.UserReceiveIsDefaultReq, Proto.UserReceiveIsDefaultRsp>) {
+    return tradeServerRequest('UserReceiveIsDefaultReq', 'UserReceiveIsDefaultRsp', params);
+}

+ 2 - 1
src/services/http/index.ts

@@ -56,11 +56,12 @@ const httpService = new (class {
                     return res
                 },
                 (err) => {
+                    const { msg, message } = err.response.data
                     if (!axios.isCancel(err)) {
                         console.error(err)
                     }
                     // 异常提示待优化
-                    return Promise.reject(err.response?.data.msg || '服务器异常,请稍后再试')
+                    return Promise.reject(msg || message || '服务器异常,请稍后再试')
                 }
             )
         }

+ 1 - 1
src/services/socket/trade/protobuf/index.ts

@@ -8,7 +8,7 @@ export default new (class {
      */
     constructor() {
         this.protoRoot = new Promise((resolve, reject) => {
-            Protobuf.load('./proto/mtp.proto', (err: Error, root: unknown) => {
+            Protobuf.load('./proto/thj.proto', (err: Error, root: unknown) => {
                 if (err) {
                     reject(err)
                 } else {

+ 194 - 0
src/types/model/bank.d.ts

@@ -0,0 +1,194 @@
+declare namespace Model {
+    /** 查询托管银行 响应 */
+    interface CusBankSignBankRsp {
+        Banklst: BankInfoRsp[]; // 银行列表
+        canallot: number; // 是否支持跨行调拨 - 0:不支持 1:支持
+        canallotquery: number; // 是否支持跨行调拨查询 - 0:不支持 1:支持
+        canbindcard: number; // 是否可绑卡与解卡 - 0:不可 1:可以
+        caninamount: number; // 是否可入金 - 0:不可 1:可以
+        caninamount2: number; // 是否可入金(网银端) - 0:不可 1:可以
+        canmodifybankcard: number; // 是否可修改银行卡号 - 0:不可 1:可以
+        canmodifyphone: number; // 是否可修改手机号 - 0:不可 1:可以
+        canmodifysigninfo: number; // 是否可修改签约信息 - 0:不可 1:可以
+        canoutamount: number; // 是否可出金 - 0:不可 1:可以
+        canoutamount2: number; // 是否可出金(网银端) - 0:不可 1:可以
+        canrelease: number; // 是否可解约 - 0:不可 1:可以
+        canrelease2: number; // 是否可解约(网银端) - 0:不可 1:可以
+        cansign: number; // 是否可签约 - 0:不可 1:可以
+        cansign2: number; // 是否可签约(网银端) - 0:不可 1:可以
+        currency: string; // 币种
+        cusbankid: string; // 托管银行编号(对应清算中心TRAN_NO)
+        cusbankname: string; // 银行业务名称
+        cusbankshortname: string; // 银行业务简称
+        exchbankid: string; // 交易所开户银行ID
+        exchpaybankaccname: string; // 交易所支出结算账户户名
+        exchpaybankaccno: string; // 交易所支出结算账户
+        isneedcheck: number; // 是否需要对账 - 0:需要 1:不需要 [不需要界面配置]
+        isneedclear: number; // 是否需要清算 - 0:不需要 1:需要
+        lastcheckstatus: number; // 最后对账状态 - 对账状态 - 1:未对账 2:对账成功 3:对账失败
+        lastchecktime: string; // 最后对账时间
+        lastclearstatus: number; // 最后清算状态 - 1:未清算 2:清算成功 3:清算失败 4:清算部分成功
+        lastcleartime: string; // 最后清算时间
+        lastsignintime: string; // 最后签到时间
+        lastsignouttime: string; // 最后签退时间
+        riskinfo: string; // 签约风险提示书
+        signstatus: number; // 当前签到/签退状态 - 1:签到 2:签退
+        tradedate: string; // 交易日(yyyyMMdd)
+        updatetime: string; // 当前签到/签退更新时间
+    }
+
+    /** 查询开户行 响应 */
+    interface BankInfoRsp {
+        bankid: string; // 银行ID
+        bankname: string; // 银行名称
+        clearbankno: string; // 清算系统银行编号
+        orderindex: number; // 排序顺序
+        status: number; // 状态 - 0:正常 1:注销
+    }
+
+    /** 查询签约银行信息(提现账户管理) 请求 */
+    interface BankAccountSignReq {
+        userid: number;  // 用户ID
+    }
+
+    /** 查询签约银行信息(提现账户管理) 响应 */
+    interface BankAccountSignRsp {
+        accountcode: string;//资金账号
+        accountname: string;//资金账号对应的账号名(UserName)
+        accountname2: string;//资金账号对应的账号名(UserName) - 密文
+        accounttype: number;//账户类型(UserType)
+        applicationtime: string;//最后一次更新的时间
+        applyexchticket: string;//申请流水
+        auditid: number;//审核人
+        audittime: string;//审核时间
+        bankaccountname: string;//签约银行卡账号名
+        bankaccountname2: string;//签约银行卡账号名 - 密文
+        bankaccountno: string;//银行卡号
+        bankaccountno2: string;//银行卡号 - 密文
+        bankaccounttype: number;//银行账户类型 - 1-对私; 2-对公
+        bankcardtype: number;//银行卡类型
+        bankchildaccount: string;//银行子账号(签约成功后,很多银行会返回对应的这个虚拟账号)
+        bankcity: string;//开户行城市
+        bankid: string;//签约银行ID
+        bankname: string;//签约银行名称
+        bankprovince: string;//开户行省份
+        branchbankid: string;//签约银行支行号
+        branchbankname: string;//签约银行支行名称
+        cardno: string;//证件号码
+        cardno2: string;//证件号码 - 密文
+        cardtype: string;//证件类型
+        currency: string;//币种
+        cusbankid: string;//托管银行编号
+        direct: number;//方向(可以判断那方先发起的签约)
+        exchticket: string;//最后一次签约成功的流水号
+        extendinfo: string;//扩展信息(JSON字符串)
+        mobilephone: string;//手机号
+        mobilephone2: string;//手机号 - 密文
+        netaddr: string;//调转网址
+        relateduserid: number;//关联使用者userid
+        signstatus: number;//签约状态 - 1:未签约 2:签约待审核 3:签约中 4:已签约 5:解约待审核 6:解约中 7:已解约 8:已解绑 9:绑卡中 1number;
+        //:审核拒绝 11:换签待审核
+        updatetime: string;//更新时间(签解约更新时间)
+    }
+
+    /** 查询充值提现 请求 */
+    interface AccountInOutApplyReq {
+        userid: number;  // 用户ID
+        begindate?: string;  //   申请起始日期(格式yyyymmdd)
+        enddate?: string;    //   申请截止日期(格式yyyymmdd)
+        likename?: string;   //   模糊搜索名称
+        applystatus?: number; // 状态 1-待审核 2-审核通过 3-审核拒绝
+        querytype?: number; // 查询类型 1-提现(出金) 2-充值(入金)
+    }
+
+    /** 查询充值提现 响应 */
+    interface AccountOutInApplyRsp {
+        accountcode: string;//资金账号
+        accountname: string;//用户名称(名称)
+        accountpwd: string;//资金密码
+        accountticket: string;//最新账户服务流水号
+        amount: number;//金额
+        applyremark: string;//申请备注
+        applystatus: number;//申请状态 - 1:待审核 2:待复审 3:初审拒绝 4:交易冻结中 5:交易解冻中 6:交易解冻扣款中 7:交易入金中 8:交易冻结/解冻/扣款中(银行发起出金时用) 9:银行出金中 1number;
+        //:银行入金中 11:成功 12:失败 13:银行审核中 14:账户服务入金失败; 15:账户服务解冻失败; 16:账户服务解冻扣款失败; 17:账户服务出金失败 18:复审通过 19:复审拒绝 2number;
+        //:提交审核,账户冻结中 21:审核拒绝,账户解冻中;22: 待审核,账户服务解冻回滚中; 23:待复审,账户服务解冻回滚中; 24: 审核通过,账户冻结金额检查中;25: 复审通过,账户冻结金额检查中;
+        auditid: number;//审核人
+        audittime: string;//审核时间
+        bank_apply_ticket: string;//银行申请流水
+        bankaccountname: string;//银行账户名
+        bankaccountno: string;//银行卡号
+        bankid: string;//银行编号
+        bankticket: string;//银行流水
+        bankname: string; // 银行名称
+        branchbankid: string;//银行支行号
+        branchbankname: string;//银行支行名称
+        capamountout: number;//出金(劣后本金) - 外部子账户
+        certificatephotourl: string;//凭证地址
+        charge: number;//手续费
+        checkerrorflag: number;//对账差错标志 - 1:为单边账;其它为正常出入金
+        currency: string;//币种
+        cusbankid: string;//托管银行编号
+        cusbankname: string; // 托管银行名称
+        cusbankshortname: string; // 托管银行简称
+        exchticket: string;//银行服务流水号
+        executetype: number;//申请类型 - 1:出金 2:入金 3: 单边账调整:入金; 4:单边账调整:出金 5:外部母账户调整:入金 6:外部母账户调整:出金 7:外部子账户:入金 8:外部子账户:出金
+        extendinfo: string;//扩展信息
+        extoperateid: number;//交易服务流水号
+        infamount: number;//劣后金额(自有)
+        logincode: string;//登录账号(账号)
+        netaddr: string;//调转网址
+        priamount: number;//优先金额(授信)
+        reauditid: number;//复审人
+        reauditremark: string;//复审备注
+        reaudittime: string;//复审时间
+        relatedorderid: string;//三方关联ID
+        remark: string;//备注
+        remark2: string;//备注(失败原因)
+        soucreamount: number;//原始出入金金额
+        soucrecurrencyid: number;//原始出入金币种
+        tradedate: string;//交易日(yyyyMMdd)
+        updatetime: string;//更新时间(申请时间)
+        userid: number;//用户id
+        userinfotype: number;//账户类型 1-个人 2-企业
+    }
+
+    /** 资金流水查询(历史) 请求 */
+    interface HisAmountLogReq {
+        accountID: string; // 资金账户 - 格式:1,2,3
+        page?: number; // 页码
+        pagesize?: number; // 每页条数
+        OperateType: string; // 资金操作类型 - 格式:1,2,3
+        startDate: string; // 开始时间 - 闭区间,格式:yyyy-MM-dd
+        endDate: string; // 结束时间 - 闭区间,格式:yyyy-MM-dd
+    }
+
+    /** 资金流水查询(历史) 响应 */
+    interface HisAmountLogRsp {
+        OPERATETYPENAME: string; // 资金操作类型名称
+        accountid: number; // 资金账户ID
+        agoodscode: string; // 竞拍商品代码
+        agoodsname: string; // 竞拍商品名称
+        amount: number; // 资金金额
+        amountadjusttype: number; // 资金调整类型(默认值为0) - 0:系统 1:单边账调整 2:人工调整
+        autoid: number; // 流水ID(220+Unix秒时间戳(10位)+xxxxxx)
+        balance: number; // 期初余额
+        businesscode: number; // 业务编号
+        createtime: string; // 发生时间
+        currencyid: number; // 币种ID
+        currentbalance: number; // 期末余额(变动后金额)
+        dgoodscode: string; // 交割商品代码
+        dgoodsname: string; // 交割商品名称
+        goodscode: string; // 商品代码
+        goodsid: number; // 商品ID
+        goodsname: string; // 商品名称
+        histradedate: string; // 历史交易日
+        isvaliddata: number; // 是否有效 - 0:无效 1:有效
+        marketid: number; // 市场ID
+        marketname: string; // 市场名称
+        moneyticket: number; // 资金流水号:银行端流水号
+        operatetype: number; // 资金操作类型 (AccountFundCmdOp)- 101:入金 102:入金手续费 103:出金 104:出金冻结 105:出金解冻 106:出金手续费 107:出金手续费冻结 108:出金手续费解冻 201:交易冻结 202:交易解冻 203:交易占用 204:交易解占用 205:交易手续费冻结 206:交易手续费解冻 207:交易手续费 208:交易货款 209:交易盈亏 301:交割冻结 302:交割解冻 303:交割手续费 304:交割手续费冻结 305:交割手续费解冻 306:交割货款 307:交割税款 401:结算盈亏 402:结算递延费 403:分润收入 404:延期分润 501:授信增加 502:授信减少 503:转积分 504:转入 505:转出 506:转出冻结 507:转出解冻 601:履约金额冻结 602:履约最大冻结 603:履约金额解冻 604:履约扣款 605:履约收款 606:履约违约手续费 607:履约违约收入 608:履约最大扣款 701:供应链金融冻结 702:供应链金融解冻 703:供应链金融最大冻结 704:供应链金融利息 705:供应链金融货款 706:供应链金融押金 707:供应链金融最大扣款 801:仓单贸易冻结 802:仓单贸易解冻 803:仓单贸易首付款 804:仓单贸易最大扣款 901:商城扣款冻结 902:商城扣款解冻 903:商城扣款 904:商城收款 1001:期权冻结 1002:期权解冻 1003:期权权力金 1004:期权手续费冻结 1005:期权手续费解冻 1006:期权手续费 1007:期权盈亏 1101:营销扣款 1102:营销收款
+        relationorderid: string; // 关联单号
+        remark: string; // 备注
+        trademode: number; // 交易模式
+    }
+}

+ 15 - 0
src/types/model/credit.d.ts

@@ -0,0 +1,15 @@
+declare namespace Model {
+    /** 查询我的积分流水 请求 */
+    interface UserScoreLogReq {
+        userid: number; // 用户ID
+        page?: number; // 页码
+        pagesize?: number; // 每页条数
+    }
+
+    /** 查询我的积分流水 响应 */
+    interface UserScoreLogRsp {
+        createtime: string; // 记账时间
+        score: number; // 变动积分
+        scoreconfigtype: number; // 配置类型 - 1:注册红包 2:签到积分 3:推广积分 4:下级用户下单积分 5:自己采购下单积分 6:自己供求下单积分 7:抽奖配置
+    }
+}

+ 0 - 1
src/types/model/enum.d.ts

@@ -1,4 +1,3 @@
-/** 企业风管 */
 declare namespace Model {
     /** 枚举信息 请求 */
     interface EnumReq {

+ 0 - 1
src/types/model/news.d.ts

@@ -1,4 +1,3 @@
-/** 企业风管 */
 declare namespace Model {
     /** 查询资讯 请求 */
     interface SiteColumnDetailReq {

+ 49 - 0
src/types/model/user.d.ts

@@ -0,0 +1,49 @@
+declare namespace Model {
+    /** 查询收货地址信息 请求 */
+    interface UserReceiveInfoReq {
+        userid: number; // 用户ID
+    }
+
+    /** 查询收货地址信息 响应 */
+    interface UserReceiveInfoRsp {
+        address: string; // 提货人详细地址
+        autoid: number; // AutoID
+        cardnum: string; // 证件号码(加密存储)
+        cardtypeid: number; // 证件类型
+        cityid: number; // 市
+        cityname: string; // 城市名称
+        countryid: number; // 国家
+        countryname: string; // 国家名称
+        districtid: number; // 地区
+        districtname: string; // 地区名称
+        hasencrypt: number; // 数据是否已加密 - 0:未加密 1:已加密
+        isdefault: number; // 是否默认地址 - 0:否 1:是
+        phonenum: string; // 提货人联系方式(加密存储)
+        provinceid: number; // 省
+        provincename: string; // 省名称
+        receivername: string; // 提货人姓名
+        takeremark: string; // 提货备注
+        userid: number; // 用户ID
+    }
+
+    /** 查询发票信息 请求 */
+    interface WrUserReceiptInfoReq {
+        userid: number; // 用户ID
+        receipttype?: number; // 发票类型 - 1:个人 2:企业
+    }
+
+    /** 查询发票信息 响应 */
+    interface WrUserReceiptInfoRsp {
+        address: string; // 地址[发票类型:企业]
+        autoid: number; // AutoID
+        contactinfo: string; // 联系方式
+        idnum: string; // 身份证号码[发票类型:个人]
+        isdefault: number; // 是否默认地址 - 0:否 1:是
+        receiptaccount: string; // 发票帐号[发票类型:企业]
+        receiptbank: string; // 发票开户行[发票类型:企业]
+        receipttype: number; // 发票类型 - 1:个人 2:企业
+        taxpayerid: string; // 纳税人识别号
+        userid: number; // 用户ID
+        username: string; // 户名(个人姓名或企业名称)
+    }
+}

+ 37 - 7
src/types/proto/account.d.ts

@@ -43,13 +43,6 @@ declare global {
             ClientID: number; // 终端ID(登陆服务分配,用于通道交易关联链路)
         }
 
-        /** 用户登出应答 */
-        interface LogoutRsp {
-            Header?: IMessageHead; // 消息头
-            RetCode: number; // 返回码
-            RetDesc?: string; // 描述信息
-        }
-
         /** 用户令牌校验请求 */
         interface TokenCheckReq {
             Header?: IMessageHead; // 消息头
@@ -72,5 +65,42 @@ declare global {
             AccountIDs: number; // 账户ID列表(有权限的)
             SystemTime: number; // 返回服务器最新时间
         }
+
+        /** 用户登出应答 */
+        interface LogoutRsp {
+            Header?: IMessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc?: string; // 描述信息
+        }
+
+        // 修改账户密码请求
+        interface ModifyPwdReq {
+            Header?: IMessageHead; // 消息头
+            ModifyPwdType: number; // 修改密码类型1:登陆密码2:资金账户密码
+            ModifyPwdID: number; // 被修改的ID(ModifyType=1:LoginIDModifyType=2:AccountID)
+            OldPwd: string; // 旧资金密码
+            NewPwd: string; // 新资金密码
+        }
+
+        // 修改账户密码应答
+        interface ModifyPwdRsp {
+            Header?: IMessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+        }
+
+        // 投资者销户申请请求
+        interface InvestorDelReq {
+            Header?: IMessageHead;
+            UserID: number; // 用户ID
+            ImageUrl?: string; // 图片地址
+        }
+
+        // 投资者销户申请请求响应
+        interface InvestorDelRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+        }
     }
 }

+ 179 - 0
src/types/proto/bank.d.ts

@@ -0,0 +1,179 @@
+import { IMessageHead } from '@/services/socket/trade/protobuf/proto'
+import Long from 'long'
+
+declare global {
+    namespace Proto {
+        /** 签约请求 */
+        interface t2bBankSignReq {
+            Header?: IMessageHead;
+            ExtOperatorID: number; // 外部操作流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易所业务日期
+            ExchTicket: string; // 交易所流水号
+            AccountCode: string; // 账户
+            AccountName: string; // 客户名称
+            CusBankID: string; // 托管银行编号
+            OperateType: number; // 变更类型[1-增加;2-修改;4-绑卡;
+            IsForce: number; // 是否强制[0-否;1-是]强制,只更新中心签约信息,不发送银行。用于银行信息不一致的情况
+            Currency: string; // 币种
+            AccountType: number; // 账户类型[1-对私;2-对公]
+            OpenBankAccId: string; // 银行卡行号
+            ForceSignBankAccountNo: string; // 银行账户[强制签约时填写]
+            ForceSignBankAccountName: string; // 银行账户名称[强制签约时填写]
+            BankAccountNo: string; // 银行账户
+            BankAccountName: string; // 银行账户名称
+            ExBankName: string; // 开户行名称
+            OpenBankNo: string; // 开户支行编号
+            OpenBankName: string; // 开户支行名称
+            CertType: string; // 证件类型
+            CertID: string; // 证件号码
+            BankAccountPWD: string; // 银行账户密码
+            AgentName: string; // 授权代理人姓名
+            AgentCertType: number; // 授权代理人证件类型
+            AgentCertID: string; // 授权代理人证件号
+            BankAccountType: number; // 银行账户类型
+            BankProvince: string; // 开户银行所在省份
+            BankCity: string; // 开户银行所在市
+            BankCardType: number; // 银行卡类型
+            MobilePhone: string; // 移动电话
+            IdentifyCode: string; // 验证码
+            email: string; // 电子邮箱
+            extend_info: string; // 扩展信息(JSON串,参考配置要求进行填充)
+        }
+
+        /** 签约应答 */
+        interface t2bBankSignRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExtOperatorID: number; // 外部操作流水号
+            AccountCode: string; // 账户
+            NetAddr: string; // 网络地址(当这里有网址时,应自动跳转网页)
+            Status: number; // 状态(0成功,其他数值参考银行服务的错误码)
+            ExchTicket: string; // 交易所流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易所业务日期
+            CenterTicket: string; // 中心流水号
+            CenterErrCode: string; // 返回码
+            CenterErrMsg: string; // 返回结果说明
+            bankChildAcc: string; // 银行账号
+            bankChildAccName: string; // 银行账户名
+            BankId: string; // 银行卡行号
+            BankAccNum: string; // 银行卡号
+            BankAccName: string; // 银行卡户名
+        }
+
+        /** 解约请求 */
+        interface t2bBankCancelSignReq {
+            Header?: IMessageHead;
+            ExtOperatorID: number; // 外部操作流水号
+            ExchId?: string; // 交易所编号
+            AccountCode: string; // 账户
+            CusBankID: string; // 托管银行编号
+            IsForce: number; // 是否强制
+            Currency: string; // 币种
+            TradeDate?: string; // 交易所业务日期
+            ExchTicket?: string; // 交易所流水号
+            BankChildAcc?: string; // 银行子账号
+            BankChildAccName?: string; // 银行子账号名
+        }
+
+        /** 解约应答 */
+        interface t2bBankCancelSignRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExtOperatorID: number; // 外部操作流水号
+            AccountCode: string; // 账户
+            NetAddr: string; // 网络地址(当这里有网址时,应自动跳转网页)
+            Status: number; // 状态(0成功,其他数值参考银行服务的错误码)
+            ExchTicket: string; // 交易所流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易所业务日期
+            CenterTicket: string; // 中心流水号
+            CenterErrCode: string; // 返回码
+            CenterErrMsg: string; // 返回结果说明
+        }
+
+        /** 出金请求 */
+        interface t2bBankWithdrawReq {
+            Header?: IMessageHead;
+            ExtOperatorID: number; // 外部操作流水号
+            ExchId: string; // 交易所编号
+            AccountCode: string; // 资金账户
+            CusBankID: string; // 托管银行编号
+            Currency: string; // 币种
+            AccountType: number; // 账户类型
+            BankChildAccount: string; // 银行子账号
+            BankChildAccountName: string; // 银行子账号名
+            OpenCardBankId: string; // 银行卡行号
+            BankAccoutNum: string; // 银行卡号
+            BankAccoutName: string; // 银行卡户名
+            Amount: number; // 出金金额
+            AppDateTime: string; // 申请日期和时间
+            OldTaPWD: string; // 资金密码
+            Desc: string; // 备注
+            IdentifyCode: string; // 验证码
+            BranchBankName: string; // 收款支行名称
+            extend_info: string; // 扩展信息(JSON串,参考配置要求进行填充)
+            Remark: string; // 备注
+            ExchTicket: string; // 交易所流水号
+        }
+
+        /** 出金应答 */
+        interface t2bBankWithdrawRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExtOperatorID: number; // 外部操作流水号
+            Status: number; // 状态(0成功,其他数值参考银行服务的错误码)
+            ExchTicket: string; // 交易所流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易日
+            CenterTicket: string; // 中心流水号
+            CenterErrCode: string; // 中心返回码
+            CenterErrMsg: string; // 中心返回结果说明
+            CerterCheckDate: string; // 中心对账日期
+            NetAddr: string; // 网络地址(当这里有网址时,应自动跳转网页)
+        }
+
+        /** 入金请求 */
+        interface t2bBankDepositReq {
+            Header?: IMessageHead;
+            ExtOperatorID: number; // 外部操作流水号
+            CusBankID: string; // 托管银行编号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易日
+            ExchTicket: string; // 交易所流水号
+            AccountCode: string; // 资金账户
+            BusinessNo: string; // 银行业务编号
+            BankChildAccount: string; // 银行子账号
+            BankChildAccountName: string; // 银行子账号名
+            OldTaPWD: string; // 资金密码
+            Amount: number; // 金额
+            Currency: string; // 币种
+            Remark: string; // 备注
+            OpenCardBankId: string; // 银行卡行号
+            BankAccoutNum: string; // 银行卡号
+            BankAccoutName: string; // 银行卡户名
+            extend_info: string; // 扩展信息(JSON串,参考配置要求进行填充)
+        }
+
+        /** 入金应答 */
+        interface t2bBankDepositRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExtOperatorID: number; // 外部操作流水号
+            Status: number; // 状态(0成功,其他数值参考银行服务的错误码)
+            ExchTicket: string; // 交易所流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易日
+            CenterTicket: string; // 中心流水号
+            CenterErrCode: string; // 中心返回码
+            CenterErrMsg: string; // 中心返回结果说明
+            CerterCheckDate: string; // 中心对账日期
+            NetAddr: string; // 网络地址(当这里有网址时,应自动跳转网页)
+        }
+    }
+}

+ 96 - 0
src/types/proto/user.d.ts

@@ -0,0 +1,96 @@
+import { IMessageHead } from '@/services/socket/trade/protobuf/proto'
+
+declare global {
+    namespace Proto {
+        /** 新增修改收货地址请求 */
+        interface UserReceiveInfoReq {
+            Header?: IMessageHead;
+            ClientSerialID?: number; // 客户端唯一ID
+            UserID: number; // 用户ID
+            ReceiverName: string; // 提货人姓名
+            CardTypeID: number; // 证件类型
+            CardNum: string; // 证件号码
+            PhoneNum: string; // 提货人联系方式
+            CountryID?: number; // 国家
+            ProvinceID?: number; // 省
+            CityID?: number; // 市
+            DistrictID?: number; // 地区
+            Address: string; // 提货人详细地址
+            TakeRemark: string; // 提货备注
+            ReceiveInfoId: number; // 修改时填收货地址id
+        }
+
+        /** 新增修改收货地址请求响应 */
+        interface UserReceiveInfoRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ReceiveInfoId: number; // 响应返回autoid
+        }
+
+        /** 删除收货地址请求 */
+        interface DelUserReceiveInfoReq {
+            Header?: IMessageHead;
+            ReceiveInfoId: number; // 收货地址id
+        }
+
+        /** 删除收货地址请求响应 */
+        interface DelUserReceiveInfoRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+        }
+
+        /** 设置默认收货地址请求 */
+        interface UserReceiveIsDefaultReq {
+            Header?: IMessageHead;
+            AutoId: number; // 提货地址ID
+            UserId: number; // 用户ID
+        }
+
+        /** 设置默认收货地址应答 */
+        interface UserReceiveIsDefaultRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            AutoId: number; // 提货地址ID
+        }
+
+        /** 新增修改用户发票信息请求 */
+        interface UserReceiptInfoReq {
+            Header?: IMessageHead;
+            ClientSerialID?: number; // 客户端唯一ID
+            UserID: number; // 用户ID
+            UserName: string; // 发票抬头姓名
+            ReceiptType: number; // 发票类型
+            TaxpayerID: string; // 纳税人识别号
+            ContactInfo: string; // 联系方式
+            ReceiptInfoId: number; // 修改时填用户发票信息id
+            ReceiptBank: string; // 发票开户行[发票类型:企业]
+            ReceiptAccount: string; // 发票帐号[发票类型:企业]
+            Address: string; // 地址[发票类型:企业]
+            IDNum?: string; // 身份证号码[发票类型:个人]
+        }
+
+        /** 新增修改用户发票信息响应 */
+        interface UserReceiptInfoRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ReceiptInfoId: number; // 响应返回发票信息id
+        }
+
+        /** 删除用户发票信息请求 */
+        interface DelUserReceiptInfoReq {
+            Header?: IMessageHead;
+            ReceiptInfoId: number; // 删除发票信息id
+        }
+
+        /** 删除用户发票信息请求响应 */
+        interface DelUserReceiptInfoRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+        }
+    }
+}