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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ \ 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 zcmb_g2{@GP*B>S|B_R}1jU_7E%ovP$?Sm-$zNN;@V8$?GW*9rKD0@XE*`kOniHM{` zQj}!PntdrtSu$C_N8A7XU*G$F*Z=#jZ?0?RdFFo3Irllg^E>ys?EjfFAgTTN-eLcvYbhNLU*mt{V;C^dZUJUwOgyF6xrnNO8)Yixp zilNX5P$fB-EDi=!fWqNQa(FyW*%^nFfg)fCxI7Fc4_B6jE1=;hw1P79=SK{fkA`-kd}u7#)ZT{@YKg8-+okyHWlDgx`;ULqSDjXap>SLbIe$$iMPz`pXIw zg8{M%SA-t5A$sB|O!~2{n11RIbg&G9ni!CEge*)+7NKGZhoKQb;uWM}C^QWAL)3_Z zC%X9kcTpr7i9jQf|0W8M4v%GE{}W*&Bea1hoq_el5e#(H!~mz{h(tUZrh;=p;9Ur^ zN=hiKEDDK)%c4*Sq%0Dzj8MTL6yYvd{CB?qeH{wUdkeu|`glNJR~ZRYR7NNubd=$6 zxGoB%r3BYf#2~eG5hxf^MfaDk35^I;8kYQjvw_EH2p7=cFgA>j3B z6c6Zk;-ZOv1J%z^VgDTJ4_*8}!vz0FUHRY6=o9GxyZnCEzXieT=N*{{_y*Jk8jIVi zWgs9d;Ir7z!M}6Z1%V{E5U>ieig3KMEQ)|c$~t3JaI$bb9sz@4u_$MP^Dlj-8v!u+ zS85{B3My#0@-M#qn43;{~A7uJh{=Pr^%km4v{(T5o)3(;3 z=JKJ($9KbC$IMQZhM*FywxzZyoP&MNLubS2hXO-_ny1u*n&(bH!_VI4DZ0HA1O;h^ zCz^CM77q|FukzHr0qwbrCA#FG=-nl+9)!iub3-7B`Vv@v-8}t-RO19ZQj5nt49X4! zp{)iHji2xXzg^fKKhi^1>h-WNG2y)BS~OdjTTw!p8!&b~SoaEQ(ho9zW-~F-R8mrM zCKc&NOE8oSNY2Xb1`Tq9Zja>aWQ2HWiZm!*e>2{+JUgJ~;8djY7`OU$wV6BPt`?6r zCcV~;gI7=bW#Jj}PG`Y!qx_B)F6~Km?MS8srOvLfGiG;P;M$VSnY*=a5vW+}$P4CR z*8{X6*Eg}ZNbV$;6vG@3h$vV)5`z(6(WFWyPWgHm8GS8C_6o*$#ES9-Yx%FB`U@SJ zY_ApSLGGt_v?vtItme;l7HY`pn{W#r$M~LRwU0{N2S!BVM;<^#t0o8wsv-^WM-C4+ zuHQ(NSSaUxe0<}r#+mCKy}bdvYW<>muABF`3IDnOJoD z*;=5{CvD~xn@(|w``QPZ1qH2ZSM?VyXF*Lks`@>1@7=Qrc%KeS}6?66iZehquDVcZf>;Qq-+1WKE6Seg9A;P@8?*xQ|h%wR8dyO*G)qG#X3I&Vt zcJ`z-LBkCd6}vh(Tic`~sy>F$|h$BvbAaPB*r?l&&PUAD*u5iPH*^qWadGLMN6Wa|YDoxFis zXsg@?SmXp{fkJBwAIK}EaP2vWX1KmhSKF|%vZ68l$IeFTi0K;{DdO??#pVo+O`#~A z;k+y}z?YsR3yboh18hy-P5FJaJjr0ZW&>Rh?`?b{7^ipi*fH#rZ{xx%8|$kk&4XH! z#;Fi#n<6}oPA676&PIvN#Km#tpD{YMx~~BuCk%Bo;JY!e_Vkpofr=JSxWjO%3}<$B z_Umi14wFSia?EI2%HZHx+fo;0JWX;hN7C2!@aOE6x`n{i4^LJ-XD@u} zB%OxW@^JyB8)Y-`M)+Y+Lo?X(#-8r)xtWtAc_k^Sfmmk0yu#w) z<>RZ{w|~FI<;$1D0`lIu6G+S;NNT$=^MuZbo#B>_?--HL=mi*tus0O0KxhYqXnN<(}1oC#NQ-rQKv!T&wJf2SRBL`Z?AFpYjI>p)hP-?LY9EmXcwyOP{LLzBb zR#vJ@sn?vl(9qY{w}tJrr;(YZVRFve`i6SI^DQ*^GcG}`S{BiLCuR0=j*g9aiF?(0 z3*34K@$>Ubt#^LboPTr5`^(Oq!9f?Yo~VT$J>HWbzc-4%LV(;?VWyGbsTh&fL8=#4 z_G}*+=Zn&b&dQRVTUuWi-wxTilQ-fx|GLlBXSqd1v)$DJ%H{9$j#n|~tSxP9mIuc< zt&VOeN=S@ePU3qi1dutAaAUrnUsrdKztKyCpPyepa45dPN`$GmH-4me-i%+sEa%vn z`OmOLDmT>f^5xC2-s`Qct!D7WMcw?4=u@Xo-M=7ag&&vpVP4rH?k}iF1vL9B@nl@Y7+kO`T@|{)31Q)F?4m6vIYl6 z0R^;Gj<8ZQimZL=$l9}R@XMWik}^ADtCy|w1)^hOh_4%i;u8|~_K?b)$C6>#TK0)e z15jwkw{Lt$_P%mQMOa!}4@^x?*4%x+AGm}zHl8ft_#;YZe)!|sS`-L`uSnSEN|=yg z5A{Mt0GwYP3H*@s&J9`NK-1|~nUmRN)9Snzbhh=j!7)^&(D^?U3yh8=1W@f&$WX=wiS2;X98W`Kyj6!tay2 z=R+jxYHM8wNADIEmO<>e7QF$Mw0Cwo@4RJtG+pW(JNV8p9(XqMoYZ}k-9~sbG?Z#S zJh49_F)uR{Oa6KgRA?QO9j7Cr0Oc>nptyzFcOnf(wb&GR6~$AFaL}xIFQUq`vEj@493sjG z4EYDYD8wU0Yd|uu76PS=b82d8oC@sqctu4;Z5`PC(&r@n(i?ifo71Il`3__`SFsGJ%Z7gyiSl87iW_zMcbDM&kc7KQ8aii4y})3akFKi)v5f3x5)Ac|4+`0wsf8^k27{Z+Ujk z8#FkNIIe4U>Cz=A>+_9!370ONy?M02>fmDkpJ1DpK>^D?G?5F6yQ}9LrEz>-hXM9e zr3TS)Ij=R@LBPJ{6e{^l$htR&R_vR4V@O!2@_;Yc{bE5kS)CK4x)Vg58>r5pBHEB# zU%q^Kzd90hmBnHmy78hn+YeX;OF^Ofr={zzxi{`%3q5!zbb5Lk4o1CfY^?35EjqTE zk@(2^ycCZ%u;SN0?IWY5FYCKh*@tzIB3LY6!I@PIMq7KZHT%@y#KcOke##qbMcLyB z-L6Jz^O#%vz(BCz9cK*<4cju3z-%Wu12@)qb$2`q1e%$d`EYKexs3?g7+emK27?N& zzGHp}O4_rlR$b|n!Zr>LEhnc#v-^UYGnY1nHM<%=M`Q$bl9WN%JNayx*M{TmrssG?lg&m^_R*6O7H(EnSK;E~b?(hy&kJwUs`(SVBQ`23 z$~H-(!An;D$!C-MHut*Tr#=lBO{1PTv4eT1&_mku++IGuF;ba-`)*xQnf*m+bx=)O zdHLq-&Q;3X`Y3#0d1ZA~exLc&^`?>?00V>WziTV;E;M|~U3qRMc7#d(u)#K4 zE+7TGM#|LH)!nQKG=LY}Ji1GXG7xwom!gwai`J_adR&KQk^0 z*h3yvq3IM@=l7mpNI`}{H4CjDZjDUGvqT!w9ID38Z3ZT=Kyrdx+>*V10;`b7g@(iptgtd2Y_`XeUyJK=H|L)xvBWTRWn2e0W5|WY!#+%dJ?JB6555riG zH72s#%^kn6^+jfl3dRp4E6Mr`Yw_4VIqw(&bQ7RsxRv!3J;4^l>WQOHOX_Ev1Dm{y z5%;5kZ7k406a7D7TXpx8Mk@!X2WlstX)-$FGR`pWXH@p+1Iv_x3uU(Oyw5Kj3hJdo`>(j}>^$ zrxMGfC!M>pvcd$+-ARfNqyg87;ytdP46zTwj`uvaBO(txUC4oAqTacw+CK1GxPm?0 z(wz*P^Mv%Ib-M1IPH8BaCWP}`&>L)dUP7*0a__o^F7n^yrzL$)ux3l{@{LrT{?4g^ zK~&LR(e`+rk^qd1Nv)R%-QkWy25=->y7sww)C#PcdQHYj;!$B+bxp~%WO&O#lbCTf z-)n@B>cTb;s$q$xU?KE!lD7~7jA{c8ggU^%FzXc_9eZfEk%@389x;<&n3t^V?$U>9 zcoW_g!ORg=25EDj&w<&CuB_zCV}#Csdr2xwKY?-I-ApR8hVNcDd?sXx5I#bZdc3r} z=UQKM?u^{f$)3vVCyJWia=&V9bV3s6N0aafJ271|i)WaaAW$eOezk+FWYb?2uuS%= z9RD0Y(;MOtEO3CUmrvCSyf`-Wa&LFH%19C({}||r>C4=Z>tdJnYmY|n@~-%{OBCWP z0vyRfpzuo^qU}u!fjjlA694f`)tRe%Ek 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#92FQ8&#;Oj(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~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 zcmb_g2UJtpx(*5mf>M+wDj^^pQm6^iLx~zeq)H7*fCwQW33UdkB2AhUMG#Sn4AKVa zf=Csx;Lt=6X;P$#6h+!S*zU}_GjHAZ*2`Ka`(*FGet+3}C(`7s;eq`}_Jcs60~jN; zDKI+iK5VSOcR>#8L118~8d=jpAdW-34-+UYT@VCfts$9NF|4p>P5BpckckW&*q7|?K}Y#&K)%XF0q?uhPzd-d3ByeTqO+?IY=t!e>rrS#u!;gq z9uI>lg5hu#1p)!D>V#L410!GvI25J^g{#WL6;W_Cl%gv5`v(H(qY<1@rf7rj+JIjg z5LX6+ih@FYe0&sq6cs2m7bqNwL_%Q*C;}l5P{`B$JQz4%c@MhS4+&@@9Zw@s86=7a zcvm9MiQ>i3fB?3BbAn9$Db|Dj9Vh@Ys4tERg)6{zo%%tD#s1HvWb#jHI>VIsZ+rh% zFx||LN`#sc=@c&-o(PbO{ZK_`=z9Yues}i2VAl60dN6*n6YxKIsa`bquP_ntP@+4L z43NdwF(@=M3dQ|LoK1d60qf}jQH3jmr7TGv z1d0z`de^7#JVZ2(LDYZ%QAfzbROAszGdK)|00OTl3sXbEVBbiw6avZF?>|YEP)dp@ znCf3hfutkg7`Xq27>h+=Jm?IZ2cC#QYd`>_6i6fj3XXS%6I5_2@-Ss*Re6H55?&ss zN`TAb@XBx%XJ;oBoTAfLy8wPP1@EMNo3 zVLC7aHMA=H2d^=W1XLQ%{r@I|fJZq~Xk;9a6eKdvg$Sj3xIn-^gM-qexKn5VZ~(fB zf1bza>6y?d&LnqWfo^K33&!Z{slbsc0Qd^<-2wq%*maCZBY6`E1~dv8{55e=q`!gc zyQ@n7?CLjO!au{L{ExiQpT-!G=sSwe z&R`XSiXvQv07MiAgUdT1l#uc`q?)okLKQ(!B_aqoxHIAhzmF>s5c%iSR6;2tQA)@k z`SwjWo#M>!!O@61EGPE6&4(2y|B{WY^8zCiK5|=D$nSZwmj; znZFdz|DQ9^U2nbx3HmLW{vE%sYkz9LfbUdY@_ohq=eEpxLgu*zxpQaWzo zLbP-v*AB;apLId?W>m<&;a_m7{iUTY%skJ+rgP!9?)OPw&Xw9Q>EGdH3#(#de&R!W z?zbpHb7f9=C@J|XbD-klnMC@nsel*Do%CV)aNLwAw=OIt>s$ew=!&2X7XL*zveY1~ zc(nh%op7~^s!!3We1C|kM0Zrn7&__>uTf%*Ca zUe9^g+RUlgT+4sPSo)Bq*K2rCq=H`4b_9O+EFe*pGQgXWn)(Q3pJgSUd}_+{a55_> z#FrTaPRkWOdeCq+V{J{5kFUn~Q)m z4s%ta-L_NcXSvqC;*VJ}JYTiOJnMf&_O8>Wp^HnrS9!VHocD%S*OMcGQeED)TOzwN zA{iMvv8>W!ry4#II~!x3JuCLF8@}22`kb0CFt$!kTBbs6_*D|aV%XRRI0Q^~XGm!( z>>kzN;9SzR((3izxyu~)62M~9_SEgo>b#T3jqPAD%Df+ZPg=gn)cRyrQYYprKKG_f zvZAum@(Q<8DE%wKz%ZXN|Jx1(#dN<(y8H<9V>i9TT=c3*UaLh5^lea`<7^p%M0-J7Q z3x@!|B4@YIN`VO8Q80IW?uO!W7+CDK=)tQO^wYQB7kEia=WnowaC3Zae9P4g8@XS+ z=+)C-S#yB(H4%ocxp~u^;Zqq_J{Vm3_LwHGzQGzS#jyk7@I+E8gT3a)mrgGQC z#6lmJ%+Jh8Mz6;QW0`%_Phqhe9Bd=(F}?feiA3f3z%4h4Hv>ZVP;w@op0}+kiwsI} zdbvgl0=g&e_N%&Is3ElL*dj_Iy6%~W6^&7r1vJ+uNFiWI$<3L)6RWx#k3*Fw6BEzm z=DGL=gG17k*pIKT7P}pu?RVkD;h1K0*{UBE{&pcT^HZbWQN*T%?p+I>#k!p<*;D=Z z*JH)o)rRF+K(m)QCMVz29vZ@8gYWSibt>e~t>3D!)}+|$g8i*h<~Qf2U;3%rzrNJz zfY^lWia4F=XJA{iGycA$q=YeifPu>LS{$xXN7)&adSzNI% zuDsMaDIlUA@IGl!1TbRk;?^py+V)mkB~BqUm@Fr^qPFVK?r=;jG9u})B@KhA5|@sg zC}_G^e*9D>QtX8YB)l-Ym~Jn^#$IP`o;!;~PWXy4fg1eA!zaG{W=^1(Cr1_^1O)!_ zrJ%TPqYN|_jCSpjacb*SAI~*5mL40t{v6-7qN++Zg9GQzai2cf9Vo zW!uV(w7$Ciu#oCeA+CqYq#l{E*Q?=p#0__rOasPI6r<4Z(}Fd=LhFM7Gt>FEmo{Ec z3=LWT+C1;QF{RjTYN%o*-_h#Dt+uy63Ad^a3+{-6KwxIz?K(04{=>(H zClLr*OJqmKJFbsW8@#&>tzT!i5IARe-ql1M3z&^689@lXvazX@02d2bGM?`BtE0Nj_A#eEZW!wT z+LlF8!7F&rlFlv;klCfSrX-o((^bi(XC;;R`Tbk*ZF5k;0=^?092)n#BjpRs^6fkP zH zHNGM>8Ta;1V&b(xz*iz+))1kMAq7pI``ydgj>;Z#oa z&cK0bJ5@uY^86>UJrfn34Wp$>ECmu)H+kEf?+ zr{{xG1%U@5YVnZ+5%GEeg~Tik*UtICON-}brF$fQbc?lGhg@=UKPj4}fGLaZwG-26 z;)%Y7+g5V7YW+G>To=^Ysg;3GI-yp3uhYAZ8OAn`q>FS+tNp6Re;%FW@F7~D>e8LJ zVq@dunT;>UNN#&=yjBlC?anUKm@FP> zViKL!^y8g9XCagP{GH}CkdF@q2zJ!n?5Ww}y%)5(qo$E`)>#YeIkWd^%ie*c`! z4dn-1eu<61s5L%l;r&=f{Z+@u3y0lDt&n5_v4u1o@qFh!bF$g7Ca759q#5^l^Yc;xXk=&7J!;QDI`X0F`ehjceeycnezyl~$F^3wF9JdmK%m|8O1IM0 za(QY0rLilBC_FMIfE%Z<|eM&Aik($E`XmDKQVl#g-`IN+EIW|8(Gd+E8Y&WmQoh+w2;y|E2 zr=51UekW|w6@)~wb$76I<8;T)B4sG$?RG%lk@Bc2&w{0NAnm7$CHmflyqg@q( z11kdcZx=UI^dPj3Rl7!b?4?!XN80n+PG2gW+F457k_%Ve72Ti6rnQ?32$vRrV8JE zRU#?|kta7k%QVQ&K^_)Xb)xi;9(uXOU){%|zaIB=fUx>$r{;2PS&#S3ACH7TE{F0T z_Iw%)24nL!D&=H3+}1g<-B`NF#tV{GPtR}}H#y#r;pLSz=)Al$QgJ#ZS^0#fR$$}M zow4QRSt5k5k+k{u2C7N0T-Zfs$&CNYF(#;)IJ8B>t zxGc;=*lM_5fDaZoj?ADmr_{yw&rj`*+rsn^vkNw+1260L$p1Qf$<{zh>vH+l2Lq+ zK@?jNRbXv;j`R1T3h%3LJa!~?Blvp~H?;@n*8=-``-%b>-mJ((W-1XK`9XfDCFO9S zQVRhw?_F&x(Dfuyx7M~OTH+eXXZNOO(Db?f1aQR>9TBbxTuzaH>F2jzFwPgHZ<@ct z9(5--R68^Z6y%y#KLd2?VG>2_{JE?RMj(k4_;VT+P?ToWPsy%QIZ9X`}nbc9_y@b21hxyD7VWMq~8PqKkALL;eLcbNTcD 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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

;2eQO3c-Y}CTz*@tgu7Q2R3dPE z*j#(Dnto{-_w4Wm)uVBq-?sbCv-Bc*5Sw~6sW9NPzOZ7w22=rif#YH)-U)#2zDChp6+kqx=@zW} d|6aNo8Nx`Pj*ZOe({{g$cJb(ZI literal 0 HcmV?d00001