From 76ed492c0959c8194f9d180b8912dfb2b1b7206e Mon Sep 17 00:00:00 2001
From: Sliverber <2622874537@qq.com>
Date: Tue, 26 Mar 2024 17:12:46 +0800
Subject: [PATCH] 11
---
api/api.js | 15 +-
api/store.js | 1 +
api/user.js | 8 +
components/am-sign-input/README.md | 83 ++
components/am-sign-input/am-sign-input.vue | 862 +++++++++++++
.../am-sign-input/image-tools/README.md | 76 ++
components/am-sign-input/image-tools/index.js | 196 +++
.../am-sign-input/image-tools/package.json | 25 +
components/am-sign-input/pickerColor.vue | 143 +++
components/am-sign-input/u-mask/u-mask.vue | 124 ++
pages/activity/promotionList/index.vue | 12 +-
pages/goods_cate/components/contracted.vue | 13 +-
pages/goods_cate/components/fresh.vue | 8 +-
pages/goods_cate/components/optimization.vue | 10 +-
pages/goods_details/index.vue | 35 +-
pages/goods_list/index.vue | 8 +-
pages/goods_search/index.vue | 9 +
pages/index/index.vue | 12 +-
pages/users/aliLogin/index.vue | 159 ++-
pages/users/login/index.vue | 14 +-
pages/users/order_improve/index.vue | 487 +++++--
pages/users/order_improves/index.vue | 1121 +----------------
pages/users/repayment/index.vue | 330 +++--
static/other/color_black.png | Bin 0 -> 6036 bytes
static/other/color_black_selected.png | Bin 0 -> 2623 bytes
static/other/color_red.png | Bin 0 -> 5865 bytes
static/other/color_red_selected.png | Bin 0 -> 2263 bytes
static/other/signs.png | Bin 0 -> 4342 bytes
28 files changed, 2392 insertions(+), 1359 deletions(-)
create mode 100644 components/am-sign-input/README.md
create mode 100644 components/am-sign-input/am-sign-input.vue
create mode 100644 components/am-sign-input/image-tools/README.md
create mode 100644 components/am-sign-input/image-tools/index.js
create mode 100644 components/am-sign-input/image-tools/package.json
create mode 100644 components/am-sign-input/pickerColor.vue
create mode 100644 components/am-sign-input/u-mask/u-mask.vue
create mode 100644 static/other/color_black.png
create mode 100644 static/other/color_black_selected.png
create mode 100644 static/other/color_red.png
create mode 100644 static/other/color_red_selected.png
create mode 100644 static/other/signs.png
diff --git a/api/api.js b/api/api.js
index 793d0a8..a6e283d 100644
--- a/api/api.js
+++ b/api/api.js
@@ -332,11 +332,16 @@ export function loginConfigApi() {
// 保存用户身份信息
export function getInformation(data) {
- return request.post('identity/save', data, {
+ return request.post('identity/saveWithVerifyIdentity', data, {
+ noAuth: true
+ });
+}
+// 保存用户身份信息
+export function getInformationSave(data) {
+ return request.post('identity/save ', data, {
noAuth: true
});
}
-
// 分期套餐列表
export function getfenqilist(data) {
@@ -351,6 +356,12 @@ export function getreceivable(data) {
noAuth: true
});
}
+// 身份证检验
+export function idcardCheck(data) {
+ return request.get('user/idcardCheck', data, {
+ noAuth: true
+ });
+}
// 分期详情--查询用户分期账单(未签约)
export function getinstallment(data) {
diff --git a/api/store.js b/api/store.js
index 9895d79..0658ab2 100644
--- a/api/store.js
+++ b/api/store.js
@@ -83,6 +83,7 @@ export function getCategoryList() {
* @param object data
*/
export function getProductslist(data) {
+
return request.get('products', data, {
noAuth: true
});
diff --git a/api/user.js b/api/user.js
index ec3e789..8ae3fb6 100644
--- a/api/user.js
+++ b/api/user.js
@@ -98,6 +98,14 @@ export function getSignConfig(){
export function getSignList(data){
return request.get('user/sign/list',data);
}
+
+/**
+ * 获取是否存在分期订单
+ * @param object data
+*/
+export function getOrderstause(data){
+ return request.get('user/isExistOrder',data);
+}
/**
* 校验openid
* @param object data
diff --git a/components/am-sign-input/README.md b/components/am-sign-input/README.md
new file mode 100644
index 0000000..b2dfd2d
--- /dev/null
+++ b/components/am-sign-input/README.md
@@ -0,0 +1,83 @@
+### 使用方法
+* 注意
++ 同一个页面不同的输入框需要设置不同的canvasId和canvasIds,否则在同一个页面会出现冲突
+```
+
+
+
+
+
+
+```
+```
+
+```
+```
+
+```
+
+#### 实际效果演示H5
+- 打开演示后,按F12调整到手机调试模式查看效果
+[实际效果演示](https://static-mp-2766f90e-0e50-4c71-87fb-0ab51aedcf85.next.bspapp.com/signInput/#/)
+
+### 参数说明Props
+
+参数|类型|说明|必传
+---|---|---|---
+action|String|生成图片后上传的接口地址|true
+canvasId|String|canvasId|true
+canvasIds|String|canvasIds与上一个id不可重复|true
+header|Object|文件上传携带的头部属性|true
+outSignWidth|Number|输出图片文件大小-宽度|false
+outSignHeight|Number|输出图片文件大小-高度|false
+minSpeed|Number|画笔最小速度|false
+minWidth|Number|线条最小粗度|false
+maxWidth|Number|线条最大粗度|false
+openSmooth|Boolean|开启平滑线条(笔锋)|false
+maxHistoryLength|Number|历史最大长度(用于撤销的步数)|false
+maxWidthDiffRate|Number|最大差异率|false
+undoScan|Number|撤销重新渲染偏移缩放校准|false
+bgColor|String|背景色如#ffffff 不传则为透明|false
+
+### 相关同源插件
+- 以页面形式展现
+- [电子签名组件](https://ext.dcloud.net.cn/plugin?id=5768)
+
+### 相关致谢
+- 插件参考 [大佬的npm库](https://github.com/linjc/smooth-signature)
\ No newline at end of file
diff --git a/components/am-sign-input/am-sign-input.vue b/components/am-sign-input/am-sign-input.vue
new file mode 100644
index 0000000..9bd5238
--- /dev/null
+++ b/components/am-sign-input/am-sign-input.vue
@@ -0,0 +1,862 @@
+
+
+
+
+
+
+
+
+
+ x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 你还没有绘制任何东西哦
+
+
+
+
+
+
+
+
+
+ 请签名
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/am-sign-input/image-tools/README.md b/components/am-sign-input/image-tools/README.md
new file mode 100644
index 0000000..1f24012
--- /dev/null
+++ b/components/am-sign-input/image-tools/README.md
@@ -0,0 +1,76 @@
+# image-tools
+图像转换工具,可用于如下环境:uni-app、微信小程序、5+APP、浏览器(需允许跨域)
+
+## 使用方式
+
+### NPM
+
+```
+npm i image-tools --save
+```
+
+```js
+import { pathToBase64, base64ToPath } from 'image-tools'
+```
+
+### 直接下载
+
+```js
+// 以下路径需根据项目实际情况填写
+import { pathToBase64, base64ToPath } from '../../js/image-tools/index.js'
+```
+
+## API
+
+### pathToBase64
+
+从图像路径转换为base64,uni-app、微信小程序和5+APP使用的路径不支持网络路径,如果是网络路径需要先使用下载API下载下来。
+
+```js
+pathToBase64(path)
+ .then(base64 => {
+ console.log(base64)
+ })
+ .catch(error => {
+ console.error(error)
+ })
+```
+
+### base64ToPath
+
+将图像base64保存为文件,返回文件路径。
+
+```js
+base64ToPath(base64)
+ .then(path => {
+ console.log(path)
+ })
+ .catch(error => {
+ console.error(error)
+ })
+```
+
+## 提示
+
+可以利用promise来串行和并行的执行多个任务
+
+```js
+// 并行
+Promise.all(paths.map(path => pathToBase64(path)))
+ .then(res => {
+ console.log(res)
+ // [base64, base64...]
+ })
+ .catch(error => {
+ console.error(error)
+ })
+// 串行
+paths.reduce((promise, path) => promise.then(res => pathToBase64(path).then(base64 => (res.push(base64), res))), Promise.resolve([]))
+ .then(res => {
+ console.log(res)
+ // [base64, base64...]
+ })
+ .catch(error => {
+ console.error(error)
+ })
+```
\ No newline at end of file
diff --git a/components/am-sign-input/image-tools/index.js b/components/am-sign-input/image-tools/index.js
new file mode 100644
index 0000000..acf40bc
--- /dev/null
+++ b/components/am-sign-input/image-tools/index.js
@@ -0,0 +1,196 @@
+function getLocalFilePath(path) {
+ if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) {
+ return path
+ }
+ if (path.indexOf('file://') === 0) {
+ return path
+ }
+ if (path.indexOf('/storage/emulated/0/') === 0) {
+ return path
+ }
+ if (path.indexOf('/') === 0) {
+ var localFilePath = plus.io.convertAbsoluteFileSystem(path)
+ if (localFilePath !== path) {
+ return localFilePath
+ } else {
+ path = path.substr(1)
+ }
+ }
+ return '_www/' + path
+}
+
+function dataUrlToBase64(str) {
+ var array = str.split(',')
+ return array[array.length - 1]
+}
+
+var index = 0
+function getNewFileId() {
+ return Date.now() + String(index++)
+}
+
+function biggerThan(v1, v2) {
+ var v1Array = v1.split('.')
+ var v2Array = v2.split('.')
+ var update = false
+ for (var index = 0; index < v2Array.length; index++) {
+ var diff = v1Array[index] - v2Array[index]
+ if (diff !== 0) {
+ update = diff > 0
+ break
+ }
+ }
+ return update
+}
+
+export function pathToBase64(path) {
+ return new Promise(function(resolve, reject) {
+ if (typeof window === 'object' && 'document' in window) {
+ if (typeof FileReader === 'function') {
+ var xhr = new XMLHttpRequest()
+ xhr.open('GET', path, true)
+ xhr.responseType = 'blob'
+ xhr.onload = function() {
+ if (this.status === 200) {
+ let fileReader = new FileReader()
+ fileReader.onload = function(e) {
+ resolve(e.target.result)
+ }
+ fileReader.onerror = reject
+ fileReader.readAsDataURL(this.response)
+ }
+ }
+ xhr.onerror = reject
+ xhr.send()
+ return
+ }
+ var canvas = document.createElement('canvas')
+ var c2x = canvas.getContext('2d')
+ var img = new Image
+ img.onload = function() {
+ canvas.width = img.width
+ canvas.height = img.height
+ c2x.drawImage(img, 0, 0)
+ resolve(canvas.toDataURL())
+ canvas.height = canvas.width = 0
+ }
+ img.onerror = reject
+ img.src = path
+ return
+ }
+ if (typeof plus === 'object') {
+ plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) {
+ entry.file(function(file) {
+ var fileReader = new plus.io.FileReader()
+ fileReader.onload = function(data) {
+ resolve(data.target.result)
+ }
+ fileReader.onerror = function(error) {
+ reject(error)
+ }
+ fileReader.readAsDataURL(file)
+ }, function(error) {
+ reject(error)
+ })
+ }, function(error) {
+ reject(error)
+ })
+ return
+ }
+ if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
+ wx.getFileSystemManager().readFile({
+ filePath: path,
+ encoding: 'base64',
+ success: function(res) {
+ resolve('data:image/png;base64,' + res.data)
+ },
+ fail: function(error) {
+ reject(error)
+ }
+ })
+ return
+ }
+ reject(new Error('not support'))
+ })
+}
+
+export function base64ToPath(base64) {
+ return new Promise(function(resolve, reject) {
+ if (typeof window === 'object' && 'document' in window) {
+ base64 = base64.split(',')
+ var type = base64[0].match(/:(.*?);/)[1]
+ var str = atob(base64[1])
+ var n = str.length
+ var array = new Uint8Array(n)
+ while (n--) {
+ array[n] = str.charCodeAt(n)
+ }
+ return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], { type: type })))
+ }
+ var extName = base64.split(',')[0].match(/data\:\S+\/(\S+);/)
+ if (extName) {
+ extName = extName[1]
+ } else {
+ reject(new Error('base64 error'))
+ }
+ var fileName = getNewFileId() + '.' + extName
+ if (typeof plus === 'object') {
+ var basePath = '_doc'
+ var dirPath = 'uniapp_temp'
+ var filePath = basePath + '/' + dirPath + '/' + fileName
+ if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) {
+ plus.io.resolveLocalFileSystemURL(basePath, function(entry) {
+ entry.getDirectory(dirPath, {
+ create: true,
+ exclusive: false,
+ }, function(entry) {
+ entry.getFile(fileName, {
+ create: true,
+ exclusive: false,
+ }, function(entry) {
+ entry.createWriter(function(writer) {
+ writer.onwrite = function() {
+ resolve(filePath)
+ }
+ writer.onerror = reject
+ writer.seek(0)
+ writer.writeAsBinary(dataUrlToBase64(base64))
+ }, reject)
+ }, reject)
+ }, reject)
+ }, reject)
+ return
+ }
+ var bitmap = new plus.nativeObj.Bitmap(fileName)
+ bitmap.loadBase64Data(base64, function() {
+ bitmap.save(filePath, {}, function() {
+ bitmap.clear()
+ resolve(filePath)
+ }, function(error) {
+ bitmap.clear()
+ reject(error)
+ })
+ }, function(error) {
+ bitmap.clear()
+ reject(error)
+ })
+ return
+ }
+ if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
+ var filePath = wx.env.USER_DATA_PATH + '/' + fileName
+ wx.getFileSystemManager().writeFile({
+ filePath: filePath,
+ data: dataUrlToBase64(base64),
+ encoding: 'base64',
+ success: function() {
+ resolve(filePath)
+ },
+ fail: function(error) {
+ reject(error)
+ }
+ })
+ return
+ }
+ reject(new Error('not support'))
+ })
+}
\ No newline at end of file
diff --git a/components/am-sign-input/image-tools/package.json b/components/am-sign-input/image-tools/package.json
new file mode 100644
index 0000000..edbdc1d
--- /dev/null
+++ b/components/am-sign-input/image-tools/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "image-tools",
+ "version": "1.4.0",
+ "description": "图像转换工具,可用于如下环境:uni-app、微信小程序、5+APP、浏览器",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/zhetengbiji/image-tools.git"
+ },
+ "keywords": [
+ "base64"
+ ],
+ "author": "Shengqiang Guo",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/zhetengbiji/image-tools/issues"
+ },
+ "homepage": "https://github.com/zhetengbiji/image-tools#readme",
+ "devDependencies": {
+ "@types/html5plus": "^1.0.0"
+ }
+}
diff --git a/components/am-sign-input/pickerColor.vue b/components/am-sign-input/pickerColor.vue
new file mode 100644
index 0000000..37509d3
--- /dev/null
+++ b/components/am-sign-input/pickerColor.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/am-sign-input/u-mask/u-mask.vue b/components/am-sign-input/u-mask/u-mask.vue
new file mode 100644
index 0000000..34b1e1e
--- /dev/null
+++ b/components/am-sign-input/u-mask/u-mask.vue
@@ -0,0 +1,124 @@
+
+ {}" :class="{
+ 'u-mask-zoom': zoom,
+ 'u-mask-show': show
+ }">
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/activity/promotionList/index.vue b/pages/activity/promotionList/index.vue
index 44689b7..d4a7105 100644
--- a/pages/activity/promotionList/index.vue
+++ b/pages/activity/promotionList/index.vue
@@ -102,7 +102,17 @@
})
},
getProductRank(){
- productRank().then(res=>{
+ let abb=0
+ if(uni.getStorageSync('channelId')){
+ abb=uni.getStorageSync('channelId')
+ }else{
+
+ }
+
+ let data ={
+ channelId:abb
+ }
+ productRank(data).then(res=>{
this.tempArr = res.data;
})
},
diff --git a/pages/goods_cate/components/contracted.vue b/pages/goods_cate/components/contracted.vue
index 70da710..a5d86b0 100644
--- a/pages/goods_cate/components/contracted.vue
+++ b/pages/goods_cate/components/contracted.vue
@@ -65,7 +65,8 @@
page: 1,
limit: 10,
cid: 0,
- hostProduct: []
+ hostProduct: [],
+ channelId:0,
}
},
created(){
@@ -106,10 +107,18 @@
if (that.loading) return;
that.loading = true;
that.loadTitle = '';
+
+ if(uni.getStorageSync('channelId')){
+ that.channelId=uni.getStorageSync('channelId')
+ }else{
+
+ }
+
getProductslist({
page: that.page,
limit: that.limit,
- cid: that.cid
+ cid: that.cid,
+ channelId: that.channelId,
}).then(res => {
let list = res.data.list,
loadend = list.length < that.limit;
diff --git a/pages/goods_cate/components/fresh.vue b/pages/goods_cate/components/fresh.vue
index 68a8c33..6a6c5a3 100644
--- a/pages/goods_cate/components/fresh.vue
+++ b/pages/goods_cate/components/fresh.vue
@@ -198,7 +198,8 @@
cartCount: 0,
totalPrice: 0.00,
lengthCart: 0,
- theme:'theme1'
+ theme:'theme1',
+ channelId:0
}
},
created(){
@@ -397,11 +398,16 @@
if (that.loading) return;
that.loading = true;
that.loadTitle = '';
+ if(uni.getStorageSync('channelId')){
+ that.channelId=uni.getStorageSync('channelId')
+ }
+
getProductslist({
page: that.page,
limit: that.limit,
type: 1,
cid: that.sid,
+ channelId: that.channelId
}).then(res => {
let list = res.data.list,
loadend = list.length < that.limit;
diff --git a/pages/goods_cate/components/optimization.vue b/pages/goods_cate/components/optimization.vue
index 892959a..8801e96 100644
--- a/pages/goods_cate/components/optimization.vue
+++ b/pages/goods_cate/components/optimization.vue
@@ -393,11 +393,19 @@
if (that.loading) return;
that.loading = true;
that.loadTitle = '';
+ let abb =0
+ if(uni.getStorageSync('channelId')){
+ abb=uni.getStorageSync('channelId')
+ }else{
+
+ }
+ console.log('3调用的');
getProductslist({
page: that.page,
limit: that.limit,
type: 1,
- cid: that.sid
+ cid: that.sid,
+ channelId:abb,
}).then(res => {
let list = res.data.list,
loadend = list.length < that.limit; //返回列表长度小于请求分页长度为true,反之为false
diff --git a/pages/goods_details/index.vue b/pages/goods_details/index.vue
index 51a7d5d..c3e9b5d 100644
--- a/pages/goods_details/index.vue
+++ b/pages/goods_details/index.vue
@@ -376,7 +376,7 @@
} from "@/utils";
import parser from "@/components/jyf-parser/jyf-parser";
import {
- computeUser
+ computeUser,getOrderstause
} from "@/api/user.js";
// #ifdef MP
import {
@@ -538,7 +538,8 @@
},
couponType: 0,//优惠券类型 类型,1-通用,2-商品,3-品类
fenqlist:[],//分期
- isshim:false
+ isshim:false,
+ stause:false,
};
},
computed: mapGetters(['isLogin', 'uid', 'chatUrl', 'productType']),
@@ -554,6 +555,7 @@
//校验token是否有效,true为有效,false为无效
this.getTokenIsExist();
this.getshiminfo()
+ this.getstause()
},
onLoad(options) {
// console.log(JSON.stringify(options),"options.spread")
@@ -669,7 +671,25 @@
},
methods: {
//
-
+ getstause(){
+ let data ={
+ uid: this.$store.getters.uid,
+ }
+ getOrderstause(data).then(res => {
+
+ if (res.code== '200') {
+ this.stause=res.data
+ // this.isshim=res.data
+
+ }
+
+ }).catch(error => {
+
+ this.$util.Tips({
+ title: error
+ });
+ });
+ },
getshiminfo(){
let data={
uid: this.$store.getters.uid,
@@ -1366,7 +1386,14 @@
// })
} else {
if(this.isshim){
- this.goCat(0);
+ if(this.stause){
+ this.$util.Tips({
+ title: '您有正在进行的订单,请还款后再继续'
+ });
+ }else{
+ this.goCat(0);
+ }
+
}else{
this.$util.Tips({
title: '请在我的页面完成实名认证'
diff --git a/pages/goods_list/index.vue b/pages/goods_list/index.vue
index 91f1da7..0606de4 100644
--- a/pages/goods_list/index.vue
+++ b/pages/goods_list/index.vue
@@ -104,7 +104,8 @@
loading: false,
loadTitle: '加载更多',
title: '',
- theme:app.globalData.theme
+ theme:app.globalData.theme,
+ channelId:0
};
},
onLoad: function(options) {
@@ -189,6 +190,11 @@
if (isPage === true) that.$set(that, 'productList', []);
that.loading = true;
that.loadTitle = '';
+ if(uni.getStorageSync('channelId')){
+ that.channelId=uni.getStorageSync('channelId')
+ }
+
+ that.where.channelId=that.channelId
getProductslist(that.where).then(res => {
let list = res.data.list;
let productList = that.$util.SplitArray(list, that.productList);
diff --git a/pages/goods_search/index.vue b/pages/goods_search/index.vue
index 144e17b..6590191 100644
--- a/pages/goods_search/index.vue
+++ b/pages/goods_search/index.vue
@@ -59,6 +59,7 @@
loadTitle: '加载更多',
isbastList: false,
theme:app.globalData.theme,
+ channelId:0,
};
},
onShow: function() {
@@ -85,7 +86,15 @@
if (that.loading) return;
that.loading = true;
that.loadTitle = '';
+ let abb = 0
+ if(uni.getStorageSync('channelId')){
+ that.channelId=uni.getStorageSync('channelId')
+ }else{
+
+ }
+
getProductslist({
+ channelId: that.channelId,
keyword: that.searchValue,
page: that.page,
limit: that.limit
diff --git a/pages/index/index.vue b/pages/index/index.vue
index 06d1a75..76ece2f 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -655,7 +655,7 @@
that.latitude = lb.latitude;
that.longitude = lb.longitude;
- that.$jsonp( 'https://api.map.baidu.com/reverse_geocoding/v3/?ak=E8WVg8s0zMvu3Bb3A9SQTy7xPzTJrX4c&output=json&coordtype=wgs84&location='+lb.latitude+ ',' + lb.longitude,
+ that.$jsonp('https://api.map.baidu.com/reverse_geocoding/v3/?ak=E8WVg8s0zMvu3Bb3A9SQTy7xPzTJrX4c&output=json&coordtype=wgs84&location='+lb.latitude+ ',' + lb.longitude,
).then(res => {
console.log(res,'百度')
let add=res.result.addressComponent
@@ -666,7 +666,15 @@
console.log(data.address,111)
})
})
-
+ .catch(error => {
+ console.log(error,'errorerror');
+ data.longitude=lb.longitude
+ data.latitude=lb.latitude
+ // 处理接口请求错误的情况
+ getip(data).then(res => {
+ console.log(data.address,111)
+ })
+ });
},
fail:function(err){
console.log(err);
diff --git a/pages/users/aliLogin/index.vue b/pages/users/aliLogin/index.vue
index 2d4a3a5..6c1f910 100644
--- a/pages/users/aliLogin/index.vue
+++ b/pages/users/aliLogin/index.vue
@@ -18,9 +18,9 @@
-
@@ -104,7 +104,9 @@
appleUserInfo: null,
appleShow: false, // 苹果登录版本必须要求ios13以上的
theme: app.globalData.theme,
- text: '获取验证码'
+ text: '获取验证码',
+ countdown: 0,
+ isCountdownStarted: false,
}
},
@@ -114,7 +116,7 @@
this.getjmauthCode()
},
methods: {
- getjmauthCode(){
+ getjmauthCode() {
my.postMessage({
data: {
action: 'getjmCode'
@@ -144,7 +146,7 @@
console.log(that.authCode, 'that.authCodethat.authCode');
// uni.setStorageSync('aliOpenid',this.openId)
that.alicode()
- }else if(e.type=='jmcodeResult'){
+ } else if (e.type == 'jmcodeResult') {
that.authCode = e.data
that.jmalicode()
}
@@ -157,26 +159,26 @@
}
// console.log('调用了');
uni.request({
- url: 'https://yruibao.com/prod/api/front/login/aliOauthLogin',
+ url: 'https://yruibao.com/prod/api/front/login/aliOauthLogin',
// url: 'http://192.168.2.26:20411/api/front/login/aliOauthLogin', //仅为示例,并非真实接口地址。
data: data,
method: 'POST',
-
+
success: (res) => {
-
+
if (res.data.code == 200) {
- this.openId=res.data.data.alipaySystemOauthTokenResponse.openId
+ this.openId = res.data.data.alipaySystemOauthTokenResponse.openId
console.log(res, 'resres');
- uni.setStorageSync('openids',this.openId)
- if (res.data.data.isEXist==false) {
-
+ uni.setStorageSync('openids', this.openId)
+ if (res.data.data.isEXist == false) {
+
} else {
let data = res.data.data.loginResponse;
let newTime = Math.round(new Date() / 1000);
this.$store.commit("LOGIN", {
'token': res.data.data.loginResponse.token
});
-
+
this.getUserInfo(data);
}
} else {
@@ -184,7 +186,7 @@
title: res.data.message
});
}
-
+
},
fail: (err) => {
this.$util.Tips({
@@ -199,18 +201,18 @@
}
// console.log('调用了');
uni.request({
- url: 'https://yruibao.com/prod/api/front/login/aliOauthLogin',
+ url: 'https://yruibao.com/prod/api/front/login/aliOauthLogin',
// url: 'http://192.168.2.26:20411/api/front/login/aliOauthLogin', //仅为示例,并非真实接口地址。
data: data,
method: 'POST',
success: (res) => {
-
+
if (res.data.code == 200) {
- this.openId=res.data.data.alipaySystemOauthTokenResponse.openId
+ this.openId = res.data.data.alipaySystemOauthTokenResponse.openId
console.log(res, 'resres');
- uni.setStorageSync('openids',this.openId)
- if (res.data.data.isEXist==false) {
+ uni.setStorageSync('openids', this.openId)
+ if (res.data.data.isEXist == false) {
this.showphone = true
} else {
let data = res.data.data.loginResponse;
@@ -247,36 +249,7 @@
// });
},
- async code() {
- let that = this;
- if (!that.account) return that.$util.Tips({
- title: '请填写手机号码'
- });
- if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
- title: '请输入正确的手机号码'
- });
- if (that.formItem == 2) that.type = "register";
- uni.showLoading({
- title: '加载中...'
- })
- await registerVerify(that.account)
- .then(res => {
-
- that.$util.Tips({
- title: res.message
- });
- uni.hideLoading();
- that.sendCode();
- let login = true
- uni.setStorageSync('loginstause', login);
- })
- .catch(err => {
- uni.hideLoading();
- return that.$util.Tips({
- title: err
- });
- });
- },
+
again() {
this.codeUrl =
VUE_APP_API_URL +
@@ -324,11 +297,11 @@
captcha: that.captcha,
spread_spid: that.$Cache.get("spread"),
channel_id: channelId,
- aliOpenid:that.openId
+ aliOpenid: that.openId
})
.then(res => {
- if(res.code==200){
+ if (res.code == 200) {
let data = res.data;
let newTime = Math.round(new Date() / 1000);
this.$store.commit("LOGIN", {
@@ -336,12 +309,12 @@
});
uni.hideLoading();
that.getUserInfo(data);
- }else{
+ } else {
that.$util.Tips({
title: res.message
});
}
-
+
})
.catch(res => {
uni.hideLoading();
@@ -390,36 +363,52 @@
});
});
},
- async code() {
- let that = this;
- if (!that.account) return that.$util.Tips({
- title: '请填写手机号码'
- });
- if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
- title: '请输入正确的手机号码'
- });
- if (that.formItem == 2) that.type = "register";
- uni.showLoading({
- title: '加载中...'
- })
- await registerVerify(that.account)
- .then(res => {
-
- that.$util.Tips({
- title: res.message
- });
- uni.hideLoading();
- that.sendCode();
- let login = true
- uni.setStorageSync('loginstause', login);
- })
- .catch(err => {
- uni.hideLoading();
- return that.$util.Tips({
- title: err
- });
- });
- },
+ async code() {
+ if (!this.account) {
+ this.$util.Tips({
+ title: '请填写手机号码'
+ });
+ return;
+ }
+
+ if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(this.account)) {
+ this.$util.Tips({
+ title: '请输入正确的手机号码'
+ });
+ return;
+ }
+
+ if (this.isCountdownStarted) return; // Prevent multiple clicks during countdown
+
+ this.isCountdownStarted = true;
+ this.countdown = 60; // Set initial countdown value
+
+ // Start countdown
+ const countdownInterval = setInterval(() => {
+ if (this.countdown > 0) {
+ this.countdown--; // Decrease countdown value
+ } else {
+ clearInterval(countdownInterval); // Stop countdown when it reaches 0
+ this.isCountdownStarted = false; // Enable the button
+ }
+ }, 1000);
+
+ try {
+ uni.showLoading({
+ title: '加载中...'
+ });
+ await registerVerify(this.account);
+ this.$util.Tips({
+ title: '验证码已发送'
+ });
+ } catch (err) {
+ this.$util.Tips({
+ title: err.message || '发送验证码失败'
+ });
+ } finally {
+ uni.hideLoading();
+ }
+ },
navTap: function(index) {
this.current = index;
},
@@ -444,6 +433,8 @@
}
}
+
+
\ No newline at end of file
diff --git a/pages/users/repayment/index.vue b/pages/users/repayment/index.vue
index b448fd3..217b4ac 100644
--- a/pages/users/repayment/index.vue
+++ b/pages/users/repayment/index.vue
@@ -1,49 +1,87 @@
-
-
- 待还款
- 已结清
+
+
+
+ 待还账单:¥{{orderData.sumPrice ? Number(orderData.sumPrice).toFixed(2) : 0}}
+
-
-
-
- 订单编号:{{item.orderId}}
+
+
+
+
+
+ 全部
+
+
+
+
-
- 还款日期:{{item.repaymentDeadline}}
-
-
- 须还金额:¥{{item.repaymentAmount}}
-
+
+
待还款
-
- 部分还款
-
-
- 已还款
-
-
- 逾期
-
-
+
+
+
+
+
+
+
+ 已结清
+
+
+
+
+
-
-
- {{title}}
-
+
+
+
+ 订单编号:{{item.orderId}}
+
+
+ 还款日期:{{item.repaymentDeadline}}
+
+
+ 须还金额:¥{{item.repaymentAmount}}
+
+ 待还款
+
+
+ 部分还款
+
+
+ 已还款
+
+
+ 逾期
+
+
+
+
+
+
+ {{title}}
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/static/other/color_black.png b/static/other/color_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b19b549ee40844581d6d5ff4a797ffb4e4ac7ce
GIT binary patch
literal 6036
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
literal 0
HcmV?d00001
diff --git a/static/other/color_black_selected.png b/static/other/color_black_selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ff59841eb04c44b3fe32da0e3d0cadc1d23d9de
GIT binary patch
literal 2623
zcmd5;XH-*p7JtE^2v}z9=xU@Rke39~r6xfT0~j)fB9M?gAV3O9fT-gU1wl~(At>#*
z>fj7YQLrl#92FQ8Oj(iRkDB#=l)g?*qn`@u6G_S4>T-oM`8?e~A)VLzWOiwsQ+
z0RUL!aX5tZ5^^IUCdB3Miu)bf
z3;+ux0#<-LfU%9t6AMw?Sss)^D1p%cu-Qc+;qqc2IWioI6o{NmhidiEGJMb5Fv
zW1LJs8x_FtLsG?32#H6b?RjXl0}_M5qxgItA)M!Ehs2_>7!XYaF$8;z0~tdkI}ngx
z$Q0Hmt`o~5(eX|V3F)gsNkT13a$jipwOUDIP2LQ
zw@l82{xaj6+%ncK2?R1BnK)j`gEJCgHV=lQ_xFls8DVS4zET047H%v}%!?O7BDojM
z$rQdp@dbP`o#2SZ5wH$e8UcgB(1}DhJjM-2b#$j=iD*X>eO|`5v3Lv(gQa>92zVGv
zCE*ApH#(Z?j>fy;>2B`xSTB)G&K2>XdA));y>nRizr~WNQiv-TOIc!Z?0gOQMTzBN
zS(I3Uq*CFGV{k}owm`%eC(3MQQ}o$m8YC4YKzt9WScsg9FezqI}kPqoGp_7Dw_EtxDscVUz-5ld~G90
z1ow^5-x4DW8YN
z9bsm@els``ld0n5zKqI#w7Yard3(s!JLv7uM4@WP($2x-NPl!%d30*|W@c)QYKGy5QYmNp
z_`}=(Hv;IS?Fjgd|Kvq;V=3D17w9IwL@%xP%~oIW+TnTArs7?C@Xg?~gXQm@W#rFN
zLogzbzwD?78izw
zQ#@wAMrAG`M?Aj?xYz)uerm*{7^8F*_Q
zC@G@-VSr5~^*qhdz^&Pra%C`SNv(i#K=1CdOI;bo2^yeXIlA+$P;ks5^?MVa`$56G
zSMk*+T(`S2+e_oBHjtElGyI=#2yGe=0a2={>IVTJIy$s$)ba*+>8*BMh~~j@{Z7
z&K2Rnbi?)X7*x1(T7ZB3cmc4Hv*fwt!jpSHEp8?~h%eGzpX4HIDzK|RS!P-Bj?xX(
zUh}HU>h+I0w1-Sgy4%^kBF-wQ$CgjHrD0sdEW(cw_doS-THUI*JSpDqO0EfxvP
z>4yRC?9hvGI;9aglE)2uvvcJkfyv9<7eQyQM-ATNociaDWm~nywO&Uy6em|4B5hpp
zvs&(os5R!;7#g{HPj0lE7N6V74)%!(EVc1}vMVX@T%B8W&IP1ClEt-8*KxgCmRYsW
z_k0!3#~kNi+iM5-({FEg1Wce*;Aq+j%J)}`7PO!1R9SBVwqFhn(>vW6B565XhS-e&
zMm9&&^#iVCM!A}$FLo^yxL*H&eQoX6D6CxD)^Rd-6Oj8r+eJSoVU}jk-rm5bY;)!lMC<4f2d$R+dg*3y^vaDAr3VPSWd08jl8snYCsegvq?Y
zdRFri;j0Sj{>y2Z
zHinNFS*#9v`uc$Z_M5AYh4|)Hq*omaq35>+
zwOSS4!uP!LE$cB4abC3&z2zl|H;q73J<}GY7EdBxAtugdNFFcz2qGaY;yi<^!%WLd
zS{|47)Od6wE;;>0z6(oV*M)PH+myC#+^E$7UAW$GX&&S99R})sj5B*pkh85pMowTw
zV7{tbvF5pU;Yxbfv4w65RhMmb7iciFkMLlj;Zh6hh;%FK8pB&fSjc8&bpANIw;r-N
zai?dw(Q&K8_frOft*>S
zXB_Q=i)gs68KZnO_jb7dN6}!@t$xYs5BjzH8avFlBp0X<9+#*K^pjuA@V|3m$B}BA
zaF6_~sHjQGjmlGbXEIM^?G5d#H(uATF|K>H^G?k@hl6;4a&t}b$4XVNi%NGjusWec
UF@3ivZ1$JVi|#|KaOWKO4^L~dJOBUy
literal 0
HcmV?d00001
diff --git a/static/other/color_red.png b/static/other/color_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..8dcbfe0b6dfd78c75a5c557a05654934dd6be549
GIT binary patch
literal 5865
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
literal 0
HcmV?d00001
diff --git a/static/other/color_red_selected.png b/static/other/color_red_selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d40ed910d1eebdb23cf3fc055ebb2d94533335b
GIT binary patch
literal 2263
zcmcImc~nzZ8czhr*bxaW$^asdfEKG+9)xTdAt4EiL_$D7rKMS3BtRCE2Lu@ziAq@n
z0U<%96{$K?v9^?9ku_nk0)ygKD@Yw-1X?9BASzOkc_=vZho^tcIdji>@4NTD-|zdr
z`z`mp9Kp6goA;dFL!nSM!9g4$BE|C$#tM0tr$5__2uGM314pQ2aH>cHp;%It7y^P7
zqTP@X5=qncbU_HnN-d9!fn)fg42eoX5Y1xMfW
zaDZIO#6|n?Nqltx6fY0jtAQf+Zi|%cO_b23IKM5xW*q}jpnzZzpi?9%wG15-_gXIl
zna^(%almT`oXEtzaVmx{00LAR2%r#1cnOK*4S*npAeBm}VhMQ@;6?HRi6j~kq~bwu
z21sLgQ-OtnL+oj!GKP@DTd;<#n7DWtRx^mi)YMc$sy9KU*-ZrLbUKmbMfCE*BM7`U
zO$m#1c%{~TQ3D6kN;GmcELSOkd5t2mDj8tn8Qv@!hXj(TUL2|y2y$uk01BN;=5R?Y5|75Af{Qxd#pSU{-aHnY
z#-max2seOE;ZXx9WDulr*giavy2uSyYGIL50xjB=BX$?K)ZgSX0yK~aR%s$ts-(pl
z5X7rsl{Q|b1_A<*jDtRaXS7@?Ri$b-%%|whi8+u)o&rgE8kGWg9b<<49X@~(87QTQ
zD0q^OjEa}a$P&DWDh2T(i4RDT$;1?qw-~p;m;NuYBO(qF=ZoaOie_;Osl@r|+a^F3
zZ`%k`BE6$Qnk43K`5X#`UM~oZQ4g_h9#Ukok(GLf0JaDi{uSksQA6hr@xq7gHZ+Q#CWXzW}=
zZ_}-(P5fB#=a%lDo>ym-xB6{OH}>hP$B!4AP4s{)ayNb)%wa|9`g@M2#yNq1xO_6gpX;BM>!~!i
zq<-C0z-UT6nKwSikMyjQ#S$()xbf=MimoTK9`xef)@$t#l}85ZD_+=$!|B{C1rOCuhYuvXte-wV0fWscy$9GxA
z=NvX!`RP{*95e4c4iq-2aZ9Wp&lJ_>eS|5WvLWXTV#X%($$C-teMQ5uGN-L^N>ozp
z*~@3wEA=x^E7oKxhW0#dal(cO?pEdfT6b!N+xn@v^ux2O*G)_uT4KeHmS@Dqw{aa$
zI%G7nFy$lZwpT(>{LW`szXYdCm_J@lZgF0TCcFJDb-+ZocT<-=QL$UaEGmchOow%}<8;-8m~1
zRcIHzoNO0-ZuYi&(eO{gv&CVU)B9Sth%2`Ahjn~t{X;WqJtpRU)I&S7?)$qPK{bcN
zW}R6+t!QuSo|>EYvECg5?|LZNB60|HaM?6?Hi7dCzsM@_tsc0WesA
z)~#5%Z}yhumEvXLMZhx)K=HtQdjPdu3}kfFxpcHzPq@FbWVp@+CjRnG{Y#Z?VOfEB
z+E%+PS~%eFsL1)b>Cn-DiwP(8G$h=1x$1It5FVu5%w82S`X}x|PeFbSc#xE0RqYlI
zjNr{1}^1C3?y`LPu
zF=r;n@s;Ctp?Q}f!c2I--vtSeTX8uln<
z_g?+1g5B$2VTY+NK5T}+H&k5>84d5={$1s+)^NDW9-UjtyN-9Q{duGk{<#v>9VcLP
z56%e>EB!B2VlN2BMW$1P`-s?|H)?Yw=K)+tZ+EwG2;=W8VV}2^4Q&4P#R2+|E3u{a
isjlng^4mo8?@$iy#wV(LZPEO%Mlg39=K}jv{l5We7uk*g
literal 0
HcmV?d00001
diff --git a/static/other/signs.png b/static/other/signs.png
new file mode 100644
index 0000000000000000000000000000000000000000..62b4f5d3b69d9776259b82329e3d16a3904bd0d6
GIT binary patch
literal 4342
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
d|6aNo8Nx`Pj*ZOe({{g$cJb(ZI
literal 0
HcmV?d00001