30 changed files with 739 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||||
|
{ |
||||
|
"projectname": "epdc-office-mp-yushan", |
||||
|
"setting": { |
||||
|
"compileHotReLoad": true |
||||
|
}, |
||||
|
"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html" |
||||
|
} |
After Width: | Height: | Size: 286 B |
After Width: | Height: | Size: 267 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 47 KiB |
@ -0,0 +1,66 @@ |
|||||
|
// subpages/family/pages/bindFamily/bindFamily.js
|
||||
|
Page({ |
||||
|
|
||||
|
/** |
||||
|
* 页面的初始数据 |
||||
|
*/ |
||||
|
data: { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面加载 |
||||
|
*/ |
||||
|
onLoad(options) { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面初次渲染完成 |
||||
|
*/ |
||||
|
onReady() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面显示 |
||||
|
*/ |
||||
|
onShow() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面隐藏 |
||||
|
*/ |
||||
|
onHide() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面卸载 |
||||
|
*/ |
||||
|
onUnload() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 页面相关事件处理函数--监听用户下拉动作 |
||||
|
*/ |
||||
|
onPullDownRefresh() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 页面上拉触底事件的处理函数 |
||||
|
*/ |
||||
|
onReachBottom() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 用户点击右上角分享 |
||||
|
*/ |
||||
|
onShareAppMessage() { |
||||
|
|
||||
|
} |
||||
|
}) |
@ -0,0 +1,3 @@ |
|||||
|
{ |
||||
|
"usingComponents": {} |
||||
|
} |
@ -0,0 +1,2 @@ |
|||||
|
<!--subpages/family/pages/bindFamily/bindFamily.wxml--> |
||||
|
<text>subpages/family/pages/bindFamily/bindFamily.wxml</text> |
@ -0,0 +1 @@ |
|||||
|
/* subpages/family/pages/bindFamily/bindFamily.wxss */ |
@ -0,0 +1,66 @@ |
|||||
|
// subpages/family/pages/familyInfo/familyInfo.js
|
||||
|
Page({ |
||||
|
|
||||
|
/** |
||||
|
* 页面的初始数据 |
||||
|
*/ |
||||
|
data: { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面加载 |
||||
|
*/ |
||||
|
onLoad(options) { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面初次渲染完成 |
||||
|
*/ |
||||
|
onReady() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面显示 |
||||
|
*/ |
||||
|
onShow() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面隐藏 |
||||
|
*/ |
||||
|
onHide() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面卸载 |
||||
|
*/ |
||||
|
onUnload() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 页面相关事件处理函数--监听用户下拉动作 |
||||
|
*/ |
||||
|
onPullDownRefresh() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 页面上拉触底事件的处理函数 |
||||
|
*/ |
||||
|
onReachBottom() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 用户点击右上角分享 |
||||
|
*/ |
||||
|
onShareAppMessage() { |
||||
|
|
||||
|
} |
||||
|
}) |
@ -0,0 +1,3 @@ |
|||||
|
{ |
||||
|
"usingComponents": {} |
||||
|
} |
@ -0,0 +1,2 @@ |
|||||
|
<!--subpages/family/pages/familyInfo/familyInfo.wxml--> |
||||
|
<text>subpages/family/pages/familyInfo/familyInfo.wxml</text> |
@ -0,0 +1 @@ |
|||||
|
/* subpages/family/pages/familyInfo/familyInfo.wxss */ |
@ -0,0 +1,164 @@ |
|||||
|
import { |
||||
|
getHouseInfo |
||||
|
} from '../../utils/api.js' |
||||
|
Page({ |
||||
|
|
||||
|
/** |
||||
|
* 页面的初始数据 |
||||
|
*/ |
||||
|
data: { |
||||
|
familyInfo:null, |
||||
|
showQr: true, |
||||
|
memberList:[], |
||||
|
roomCode:null, |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面加载 |
||||
|
*/ |
||||
|
async onLoad(options) { |
||||
|
wx.showLoading({ |
||||
|
title: "加载中", |
||||
|
mask: true, |
||||
|
}); |
||||
|
this.setData({ |
||||
|
roomCode : options.roomCode.toString() |
||||
|
}) |
||||
|
// this.setData({
|
||||
|
// roomCode:'3702110100420037200006'
|
||||
|
// })
|
||||
|
wx.setStorage({ |
||||
|
key: 'roomCode', |
||||
|
data: this.data.roomCode |
||||
|
}) |
||||
|
await this.getInfo(this.data.roomCode) |
||||
|
wx.hideLoading() |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面显示 |
||||
|
*/ |
||||
|
async onShow() { |
||||
|
wx.showLoading({ |
||||
|
title: "加载中", |
||||
|
mask: true, |
||||
|
}); |
||||
|
let roomCode = wx.getStorageSync('roomCode') |
||||
|
this.setData({ |
||||
|
roomCode : roomCode |
||||
|
}) |
||||
|
await this.getInfo(this.data.roomCode) |
||||
|
wx.hideLoading() |
||||
|
}, |
||||
|
|
||||
|
// 获取房屋信息
|
||||
|
async getInfo(code){ |
||||
|
const res = await getHouseInfo({roomCode:code}) |
||||
|
if(res.msg === 'success' && res.code === 0){ |
||||
|
this.setData({ |
||||
|
'familyInfo':res.data, |
||||
|
'roomCode':res.data.members |
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
// 跳转新增页面
|
||||
|
handleTo(){ |
||||
|
wx.navigateTo({ |
||||
|
url: '/subpages/family/pages/familyInfo/familyInfo?pageType=add&id='+ this.data.familyInfo.id |
||||
|
}) |
||||
|
}, |
||||
|
// 跳转查看页面
|
||||
|
toFamilyInfo(e){ |
||||
|
wx.navigateTo({ |
||||
|
url: '/subpages/family/pages/familyInfo/familyInfo?pageType=look&idCard='+ e.currentTarget.dataset.id |
||||
|
}) |
||||
|
}, |
||||
|
// 取消编辑
|
||||
|
cancel() { |
||||
|
this.setData({ |
||||
|
showQr: true, |
||||
|
}); |
||||
|
}, |
||||
|
// 点击保存二维码
|
||||
|
comfirmSave() { |
||||
|
wx.downloadFile({ |
||||
|
url: this.data.familyInfo.maUrl, |
||||
|
success: function (res) { |
||||
|
let imageFilePath = res.tempFilePath; |
||||
|
wx.saveImageToPhotosAlbum({ |
||||
|
filePath: imageFilePath, |
||||
|
success: function (data) { |
||||
|
wx.showToast({ |
||||
|
title: '保存成功', |
||||
|
icon: 'none', |
||||
|
duration: 1500 |
||||
|
}); |
||||
|
}, |
||||
|
fail: function (res) { |
||||
|
wx.showToast({ |
||||
|
title: '保存失败', |
||||
|
icon: 'none', |
||||
|
duration: 1500 |
||||
|
}) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
fail: (err) => { |
||||
|
wx.showToast({ |
||||
|
title: '下载失败', |
||||
|
icon: 'none', |
||||
|
duration: 1500 |
||||
|
}) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
handlePreview() { |
||||
|
if (!this.data.familyInfo.maUrl) return; |
||||
|
this.setData({ |
||||
|
showQr: false, |
||||
|
}); |
||||
|
}, |
||||
|
/** |
||||
|
* 生命周期函数--监听页面初次渲染完成 |
||||
|
*/ |
||||
|
onReady: function () { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面隐藏 |
||||
|
*/ |
||||
|
onHide: function () { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面卸载 |
||||
|
*/ |
||||
|
onUnload: function () { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 页面相关事件处理函数--监听用户下拉动作 |
||||
|
*/ |
||||
|
onPullDownRefresh: function () { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 页面上拉触底事件的处理函数 |
||||
|
*/ |
||||
|
onReachBottom: function () { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 用户点击右上角分享 |
||||
|
*/ |
||||
|
onShareAppMessage: function () { |
||||
|
|
||||
|
} |
||||
|
}) |
@ -0,0 +1,3 @@ |
|||||
|
{ |
||||
|
"usingComponents": {} |
||||
|
} |
@ -0,0 +1,82 @@ |
|||||
|
<view class="f-container"> |
||||
|
<block wx:if="{{familyInfo.roomCode}}"> |
||||
|
<view class="f-top"> |
||||
|
<view class="f-card"> |
||||
|
<view class="flex-view"> |
||||
|
<view class="card-left"> |
||||
|
<view class="card-title">{{ familyInfo.plotName + familyInfo.buildingName + familyInfo.unit + familyInfo.roomNo}}</view> |
||||
|
<view wx:if="{{familyInfo.roomCode.length <= 24}}" class="card-num"> |
||||
|
<text>No.{{ familyInfo.roomCode }}</text> |
||||
|
<!-- <text >No.6666666666666666666666</text> --> |
||||
|
<image /> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="card-right"> |
||||
|
<view class="card-qr {{ familyInfo.roomCode.length > 24 && 'card-qr-long'}}" bind:tap="handlePreview"> |
||||
|
<!-- <image src="{{ familyInfo.qrCodeUrl }}" /> --> |
||||
|
<image mode="widthFix" src="../../images/family-qr.png" /> |
||||
|
</view> |
||||
|
<view wx:if="{{familyInfo.roomCode.length <= 24}}" class="card-qr-name">我的"e家码"</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view wx:if="{{familyInfo.roomCode.length > 24}}" class="card-num mt16"> |
||||
|
<text>No.{{ familyInfo.roomCode }}</text> |
||||
|
<!-- <text >No.666666666666666666666666666666666666</text> --> |
||||
|
<image /> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="f-wr"> |
||||
|
<view class="title-wr"> |
||||
|
<view class="title-label">家庭成员</view> |
||||
|
<view class="title-right"> |
||||
|
<!-- <view class="title-right-label">明细</view> --> |
||||
|
<image class="right-icon" src="../../images/arrow-right.png" /> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="f-table mt40"> |
||||
|
<view class="table-cell table-header"> |
||||
|
<view class="table-col">姓名</view> |
||||
|
<view class="table-col">成员关系</view> |
||||
|
<view class="table-col">手机号</view> |
||||
|
<view class="table-col">明细</view> |
||||
|
</view> |
||||
|
<block wx:if="{{familyInfo.members.length > 0}}"> |
||||
|
<view class="table-cell" wx:for="{{familyInfo.members}}" wx:key="userId" class="table-cell"> |
||||
|
<view class="table-col">{{ item.userName }}</view> |
||||
|
<view class="table-col">{{ item.relation }}</view> |
||||
|
<view class="table-col">{{ item.mobile }}</view> |
||||
|
<view class="table-col table-col-4" data-type="edit" data-id="{{item.idCard}}" |
||||
|
bind:tap="toFamilyInfo">查看</view> |
||||
|
</view> |
||||
|
</block> |
||||
|
<view wx:else class="no-data">暂无成员</view> |
||||
|
</view> |
||||
|
<view class="f-btns" data-type="add" data-id="{{ info.icResiUserId }}" bind:tap="handleTo"> |
||||
|
<view class="f-btns-icon">+</view> |
||||
|
<view class="f-btns-label">添加家庭成员</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</block> |
||||
|
<view wx:else class="no-data">暂无家庭信息</view> |
||||
|
</view> |
||||
|
|
||||
|
|
||||
|
<view class="m-fm" hidden="{{ showQr }}"> |
||||
|
<view class="fm"> |
||||
|
<view class="btn-close" bind:tap="cancel"> |
||||
|
<image mode="aspectFill" src="../../images/close.png"></image> |
||||
|
<!-- <image mode="aspectFill" |
||||
|
src="/assets/images/common/close.png"></image> --> |
||||
|
</view> |
||||
|
<view class="fm-header">我的e家码</view> |
||||
|
<view class="fm-qr"> |
||||
|
<!-- <image src="../../images/qr1.png" mode="aspectFill" /> --> |
||||
|
<image src="{{ familyInfo.maUrl }}" mode="aspectFill" /> |
||||
|
</view> |
||||
|
<view class="fm-btn" bind:tap="comfirmSave">保存到相册</view> |
||||
|
<!-- <view class="operate"> |
||||
|
<view class="btn" bind:tap="confirm">保存到相册</view> |
||||
|
</view> --> |
||||
|
</view> |
||||
|
</view> |
@ -0,0 +1 @@ |
|||||
|
/* subpages/family/pages/index/index.wxss */ |
@ -0,0 +1,71 @@ |
|||||
|
// subpages/family/pages/noAccess/noAccess.js
|
||||
|
Page({ |
||||
|
|
||||
|
/** |
||||
|
* 页面的初始数据 |
||||
|
*/ |
||||
|
data: { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面加载 |
||||
|
*/ |
||||
|
onLoad(options) { |
||||
|
|
||||
|
}, |
||||
|
handleHome(){ |
||||
|
wx.navigateTo({ |
||||
|
url: '/pages/index/index', |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面初次渲染完成 |
||||
|
*/ |
||||
|
onReady() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面显示 |
||||
|
*/ |
||||
|
onShow() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面隐藏 |
||||
|
*/ |
||||
|
onHide() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面卸载 |
||||
|
*/ |
||||
|
onUnload() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 页面相关事件处理函数--监听用户下拉动作 |
||||
|
*/ |
||||
|
onPullDownRefresh() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 页面上拉触底事件的处理函数 |
||||
|
*/ |
||||
|
onReachBottom() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 用户点击右上角分享 |
||||
|
*/ |
||||
|
onShareAppMessage() { |
||||
|
|
||||
|
} |
||||
|
}) |
@ -0,0 +1,3 @@ |
|||||
|
{ |
||||
|
"usingComponents": {} |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
<view class="no-family"> |
||||
|
<image src="../../images/no-family.png" mode="widthFix" /> |
||||
|
<view class="no-btn" bind:tap="handleHome">返回首页</view> |
||||
|
</view> |
@ -0,0 +1 @@ |
|||||
|
/* subpages/family/pages/noAccess/noAccess.wxss */ |
@ -0,0 +1,71 @@ |
|||||
|
const request = require('../../../utils/request') |
||||
|
|
||||
|
/** |
||||
|
* 绑定我的家庭房屋 |
||||
|
*/ |
||||
|
export function bindingFamily (param) { |
||||
|
return request.post('custom/family/bindingFamily',param) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取小区下拉列表 |
||||
|
*/ |
||||
|
export function getPlotOption (param) { |
||||
|
return request.get('custom/personroom/getPlotOption',param) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取楼栋下拉列表 |
||||
|
*/ |
||||
|
export function getBuildingOption (param) { |
||||
|
return request.get('custom/personroom/getBuildingOption',param) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取单元下拉列表 |
||||
|
*/ |
||||
|
export function getUnitOption (param) { |
||||
|
return request.get('custom/personroom/getUnitOption',param) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取房屋下拉列表 |
||||
|
*/ |
||||
|
export function getHouseOption (param) { |
||||
|
return request.get('custom/personroom/getHouseOption', param) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 添加成员信息 |
||||
|
*/ |
||||
|
export function addFamilyMember (param) { |
||||
|
return request.post('custom/personroom/addFamilyMember', param) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 修改成员信息 |
||||
|
*/ |
||||
|
export function updateFamilyMember (param) { |
||||
|
return request.post('custom/personroom/updateFamilyMember',param) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取成员信息 |
||||
|
*/ |
||||
|
export function getFamilyMember (param) { |
||||
|
return request.get('custom/personroom/getFamilyMember',param) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取房屋信息 |
||||
|
*/ |
||||
|
export function getHouseInfo (param) { |
||||
|
return request.get('custom/personroom/getHouseInfo',param) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取与户主关系 |
||||
|
*/ |
||||
|
export function householderRelation () { |
||||
|
return request.get('imgconfig/heartImgType/householder_relation') |
||||
|
} |
@ -0,0 +1,51 @@ |
|||||
|
import rules from './rules'; |
||||
|
|
||||
|
/** |
||||
|
* 表单验证 |
||||
|
* |
||||
|
* @param {Object} fmData [表单数据] |
||||
|
* @param {Object} opts [参数] |
||||
|
* @return {Object} [descrsiption] |
||||
|
*/ |
||||
|
export default function(fmData, opts){ |
||||
|
let res = { |
||||
|
valid: true, |
||||
|
error: '', |
||||
|
errors: [], |
||||
|
fields: {} |
||||
|
}; |
||||
|
Object.keys(opts).forEach(key => { |
||||
|
|
||||
|
let value = fmData[key], |
||||
|
item = opts[key], |
||||
|
resItem = { |
||||
|
valid: true, |
||||
|
error: '', |
||||
|
errors: [] |
||||
|
}; |
||||
|
|
||||
|
item.forEach(ruleItem => { |
||||
|
let {rule, message, param} = ruleItem; |
||||
|
if (rules[rule]) { |
||||
|
if (!rules[rule].check(value, param)) { |
||||
|
message = message |
||||
|
? message |
||||
|
: rules[rule].message; |
||||
|
if (res.valid) { |
||||
|
res.valid = false; |
||||
|
res.error = message; |
||||
|
} |
||||
|
if (resItem.valid) { |
||||
|
resItem.valid = false; |
||||
|
resItem.error = message; |
||||
|
} |
||||
|
resItem.errors.push(message); |
||||
|
res.errors.push(message); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
res.fields[key] = resItem; |
||||
|
}); |
||||
|
|
||||
|
return res; |
||||
|
} |
@ -0,0 +1,123 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
/** |
||||
|
* 表单验证规则 |
||||
|
*/ |
||||
|
export default { |
||||
|
required: { |
||||
|
message: '该字段必填', |
||||
|
check(v) { |
||||
|
const type = typeof v; |
||||
|
if (type === 'string') { |
||||
|
return v !== ''; |
||||
|
} else if (type === 'array') { |
||||
|
return v.length > 0; |
||||
|
} else if (type === 'boolean') { |
||||
|
return v; |
||||
|
} else if (type === 'number') { |
||||
|
return true; |
||||
|
return v !== 0; |
||||
|
} else if (type === 'object') { |
||||
|
return v !== null && v !== undefined; |
||||
|
} else { |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
// 最小
|
||||
|
min: { |
||||
|
message: '超过最小限制', |
||||
|
check(v, param) { |
||||
|
return parseFloat(v) >= parseFloat(param) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
// 最大
|
||||
|
max: { |
||||
|
message: '超过最小限制', |
||||
|
check(v, param) { |
||||
|
return parseFloat(v) <= parseFloat(param) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
//只能数字、字母、下划线组合,下划线不能在开头或结尾
|
||||
|
user: { |
||||
|
message: '只能数字、字母、下划线组合,下划线不能在开头或结尾', |
||||
|
check(v) { |
||||
|
return /^(?!_)(?!.*?_$)(\w)*$/.test(v) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
//身份证号
|
||||
|
idCard: { |
||||
|
message: '', |
||||
|
check(v) { |
||||
|
return /^([1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3})$|^([1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx]))$/.test(v) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
// 手机号
|
||||
|
mobile: { |
||||
|
message: '手机号格式不正确', |
||||
|
check(v) { |
||||
|
return /^1[23456789]{1}[0-9]{9}$/.test(v) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
//url地址
|
||||
|
url: { |
||||
|
message: 'url地址格式不正确', |
||||
|
check(v) { |
||||
|
return /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(v) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
//汉字
|
||||
|
chinese: { |
||||
|
message: '仅限汉字', |
||||
|
check(v) { |
||||
|
return /^[\u4e00-\u9fa5]*$/.test(v) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
//数字
|
||||
|
number: { |
||||
|
message: '仅限数字', |
||||
|
check(v) { |
||||
|
return /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(v) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
//数字或字母
|
||||
|
alphaNum: { |
||||
|
message: '仅限字母或数字', |
||||
|
check(v) { |
||||
|
return /^[A-Za-z0-9]+$/.test(v) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
//整数
|
||||
|
digits: { |
||||
|
message: '仅限整数', |
||||
|
check(v) { |
||||
|
return /^\d+$/.test(v) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
//范围长度
|
||||
|
rangeLength: { |
||||
|
message: '请输入指定范围长度', |
||||
|
check(v, param) { |
||||
|
let length = v.length; |
||||
|
if (Array.isArray(param)) { |
||||
|
return (length >= param[0] && length <= param[1]) || v === ''; |
||||
|
} else { |
||||
|
return length == param || v === ''; |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
//范围
|
||||
|
range: { |
||||
|
message: '', |
||||
|
check(v, param) { |
||||
|
return (v >= param[0] && v <= param[1]) || v === ''; |
||||
|
} |
||||
|
}, |
||||
|
//等于
|
||||
|
equal: { |
||||
|
message: '两次输入不一致', |
||||
|
check(v, param) { |
||||
|
return v == param || v === ''; |
||||
|
} |
||||
|
} |
||||
|
}; |
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
page{background:#fff;box-sizing:border-box}.f-container{width:100%;box-sizing:border-box}.f-top{position:relative;width:100%;height:200rpx;background:#e3271c;border-radius:0 0 30rpx 30rpx;-webkit-border-radius:0 0 30rpx 30rpx;-moz-border-radius:0 0 30rpx 30rpx;-ms-border-radius:0 0 30rpx 30rpx;-o-border-radius:0 0 30rpx 30rpx}.f-top .flex-view{display:flex;justify-content:space-between;}.f-top .f-card{position:absolute;left:50%;bottom:-64rpx;width:690rpx;height:200rpx;margin-left:-345rpx;background-color:#fff;box-sizing:border-box;padding:28rpx 30rpx 18rpx;box-shadow: rgba(184,184,184,.25) 0px 0px 30px 5px;overflow:hidden;border-radius:14rpx;-moz-border-radius:14rpx;-ms-border-radius:14rpx;-o-border-radius:14rpx;-webkit-border-radius:14rpx}.f-top .f-card .card-right{flex-shrink:0;margin-left:30rpx}.f-top .f-card .card-title{height:96rpx;font-family:PingFang-SC-Bold;font-size:34rpx;letter-spacing:1rpx;color:#333;overflow:hidden}.f-top .f-card .card-num{display:flex;align-items:center;font-family:PingFang-SC-Medium;font-size:28rpx;letter-spacing:1rpx;color:#333;overflow:hidden}.f-top .f-card .card-num image{flex-shrink:0;width:32rpx;height:18rpx}.f-top .f-card .card-qr{width:140rpx;height:140rpx;margin: auto;position: relative;top: -5px;}.f-top .f-card .card-qr image{display:block;width:100%;height:100%;border-radius: 10px;}.f-top .f-card .card-qr-long{width:100rpx;height:100rpx}.f-top .f-card .card-qr-name{font-family:PingFang-SC-Regular;font-size:22rpx;font-weight:400;font-stretch:normal;letter-spacing:1rpx;color:#333}.f-wr{width:100%;box-sizing:border-box;padding:100rpx 20rpx 0}.title-right,.title-wr{display:flex;align-items:center}.title-wr{justify-content:space-between;padding:28rpx 0;border-bottom:1rpx solid #e7eeee}.title-wr .title-label{position:relative;padding-left:25rpx;font-family:PingFang-SC-Bold;font-size:34rpx;font-weight:400;font-stretch:normal;letter-spacing:0;color:#333}.title-wr .title-label::after{content:'';position:absolute;top:50%;left:0;width:6rpx;height:30rpx;margin-top:-15rpx;background-color:#e60000;border-radius:3rpx;-webkit-border-radius:3rpx;-moz-border-radius:3rpx;-ms-border-radius:3rpx;-o-border-radius:3rpx}.title-wr .title-right-label{font-family:PingFang-SC-Light;font-size:26rpx;font-weight:400;font-stretch:normal;color:#999}.title-wr .right-icon{width:30rpx;height:30rpx}.f-table{background-color:#fbfbfb}.f-table .table-cell{display:flex;align-items:center;padding:26rpx 0;border:solid 1rpx #e3e3e3;border-top:0;font-family:PingFang-SC-Regular;font-size:30rpx;color:#000003}.f-table .table-cell .table-col{flex:1;text-align:center;line-height:1}.f-table .table-cell .table-col-4{color:#dd2a2a}.f-table .table-header{background:#f1f1f1;border:0;font-family:PingFang-SC-Regular;font-size:28rpx;color:#666}.f-btns{display:flex;align-items:center;padding:30rpx 0}.f-btns .f-btns-icon{width:30rpx;height:30rpx;font-size:28rpx;color:#dd2a2a;text-align:center;line-height:30rpx;border:1rpx solid #dd2a2a;border-radius:50%;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%}.f-btns .f-btns-label{margin-left:10rpx;font-size:28rpx;color:#dd2a2a}.mt40{margin-top:40rpx}.mt16{margin-top:16rpx}.no-data{font-size:28rpx;color:#999;text-align:center;line-height:300rpx}.m-fm .fm{top:500rpx;width:600rpx;padding:0 0 40rpx 0;background:#fff;overflow:hidden}.m-fm .fm .btn-close{top:27rpx;padding:0 30rpx;font-size:36rpx;color:#fff;line-height:90rpx}.m-fm .fm .btn-close image{display:block;width:36rpx;height:36rpx}.m-fm .fm .fm-btn{width:240rpx;height:54rpx;margin:20rpx auto 0;font-family:PingFang-SC-Medium;font-size:28rpx;font-weight:400;font-stretch:normal;letter-spacing:0;color:#999;text-align:center;line-height:54rpx;border-radius:27rpx;border:solid 1rpx #eee;-webkit-border-radius:27rpx;-moz-border-radius:27rpx;-ms-border-radius:27rpx;-o-border-radius:27rpx}.m-fm .fm-header{width:100%;height:90rpx;margin-bottom:20rpx;text-align:center;line-height:90rpx;font-family:PingFang-SC-Bold;font-size:32rpx;color:#fff;background-image:linear-gradient(90deg,#ca151d 0,#e11c13 100%)}.m-fm .fm-qr{width:400rpx;height:400rpx;box-sizing:border-box;margin:0 auto}.m-fm .fm-qr image{display:block;width:100%;height:100%}.no-family{padding-top:200rpx}.no-family image{display:block;width:506rpx;margin:0 auto}.no-family .no-btn{width:220rpx;height:66rpx;margin:60rpx auto 0;font-size:32rpx;color:#fff;text-align:center;line-height:66rpx;background-image:linear-gradient(90deg,#ca151d 0,#e11c13 100%);border-radius:30rpx;-webkit-border-radius:30rpx;-moz-border-radius:30rpx;-ms-border-radius:30rpx;-o-border-radius:30rpx} |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue