起名小程序
github地址 https://github.com/calvin008/...
这是款uni-app + unicloud上线的起名小程序(诗歌起名)
1通过古诗词匹配生成姓名
1.1创立我的项目
1.2uni-app前端配置
组件抉择
单选框 radio
输入框 input
按钮 button
<view class="content"> <view class="radio-list"> <radio-group class="radio-group" @change="radioChange"> <label class="radio" v-for="(item, index) in array" :key="index"> <view style="display: flex; flex-wrap: nowrap;"> <radio :value="item" color="#000000" :checked="index === current" /> <view>{{ item }}</view> </view> </label> </radio-group> </view> <view class="form-item"> <image class="img" src="../../static/icon_search.png"></image> <input confirm-type="search" v-model="userName" focus placeholder="输出姓氏" /> <button class="button" type="primary" size="mini" @click="subName">起名</button> </view> <view class="name-list"> <view class="name-container" v-for="item in nameList" :key="item._id"> <view class="name-info"> {{userName}}{{item.name}} </view> <view class="sentence">[{{item.sentence}}]</view> <view class="name-other"> <view>{{item.book}} ● {{item.title}}</view> <view>[{{item.dynasty}}] {{item.author}}</view> </view> </view> </view>
插入数据
array: ['唐诗', '宋词', '诗经', '楚辞', '乐府', '古诗词'],
Vue event.target.value( ) 获取以后文本框的值(由事件触发时)
情景形容:假如以后有一个文本框,当我输出内容之后,回车或者点击一个按钮,
咱们在这个input 上或者这个按钮上绑定事件,触发事件之后执行相应的methods中 的处理函数,在methods中的函数中是如何获取文本框中的值的呢?
1.3 起名 form组件
前端逻辑
不能为空
不能超过两位数
不能为汉字以外的字母\数字
**Object.keys()**
办法会返回一个由一个给定对象的本身可枚举属性组成的数组,数组中属性名的排列程序和失常循环遍历该对象时返回的程序统一
es5 非对象 -> typeError
es6 转 对象- > 身可枚举属性组成的数组
判断汉字正则
/^([\u4E00-\u9FA5])*$/
1.4unicloud端getName云函数
1.5正则表达式教程
大家好,我是王大合
什么是正则表达式?
正则表达式是对字符串操作的一种逻辑公式,
就是用当时定义好的一些特定字符、及这些特定字符的组合,
组成一个“规定字符串”,这个“规定字符串”用来表白对字符串的一种过滤逻辑
为什么应用正则?
就是在表单验证时,精确的判断一个字符串是不是某种固定格局。比方邮箱的验证、手机号的验证等。目标是防止歹意用户的乱输出,使表单的收集是咱们想要的格局!
正则表达式语法反对状况
命令或环境 | . | [ ] | ^ | $ | ( ) | { } | ? | + | **\ | ** | ( ) |
---|---|---|---|---|---|---|---|---|---|---|---|
vi | √ | √ | √ | √ | √ | ||||||
Visual C++ | √ | √ | √ | √ | √ | ||||||
awk | √ | √ | √ | √ | awk是反对该语法的,只是要在命令行退出 --posix or --re-interval参数即可,可见man awk中的interval expression | √ | √ | √ | √ | ||
sed | √ | √ | √ | √ | √ | √ | |||||
delphi | √ | √ | √ | √ | √ | √ | √ | √ | √ | ||
python | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
java | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
javascript | √ | √ | √ | √ | √ | √ | √ | √ | √ | ||
php | √ | √ | √ | √ | √ | ||||||
perl | √ | √ | √ | √ | √ | √ | √ | √ | √ | ||
C# | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
正则表达式用在哪些地方?
一、开发罕用,非凡需要表达式
- Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
- 域名:a-zA-Z0-9{0,62}(/.a-zA-Z0-9{0,62})+/.?
- InternetURL:[a-zA-z]+://1 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=])?$
- 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
- 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-
XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$ - 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
- 身份证号(15位、18位数字):^\d{15}|\d{18}$
- 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
- 帐号是否非法(字母结尾,容许5-16字节,容许字母数字下划线):^a-zA-Z{4,15}$
- 明码(以字母结尾,长度在6~18之间,只能蕴含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
- 强明码(必须蕴含大小写字母和数字的组合,不能应用特殊字符,长度在8-10之间):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$
- 日期格局:^\d{4}-\d{1,2}-\d{1,2}
- 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
- 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
- xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.x|X[l|L]$
- 中文字符的正则表达式:[\u4e00-\u9fa5]
- 双字节字符:2 (包含汉字在内,能够用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
- 空白行的正则表达式:\n\s*\r (能够用来删除空白行)
- HTML标记的正则表达式:<(\S?)3>.?</\1>|<.? /> (网上流传的版本太蹩脚,下面这个也仅仅能局部,对于简单的嵌套标记仍旧无能为力)
- 首尾空白字符的正则表达式:^\s|\s$或(^\s*)|(\s*$) (能够用来删除行首行尾的空白字符(包含空格、制表符、换页符等等),十分有用的表达式)
- 腾讯QQ号:1-9{4,} (腾讯QQ号从10000开始)
- 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
- IP地址:\d+.\d+.\d+.\d+ (提取IP地址时有用)
- IP地址:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))
二、校验字符的表达式
- 汉字:^[\u4e00-\u9fa5]{0,}$
- 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
- 长度为3-20的所有字符:^.{3,20}$
- 由26个英文字母组成的字符串:^[A-Za-z]+$
- 由26个大写英文字母组成的字符串:^[A-Z]+$
- 由26个小写英文字母组成的字符串:^[a-z]+$
- 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
- 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
- 中文、英文、数字包含下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
- 中文、英文、数字但不包含下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
- 能够输出含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12 禁止输出含有~的字符:4+
三、校验数字的表达式
- 数字: ^[0-9]*$
- n位的数字:^\d{n}$
- 至多n位的数字:^\d{n,}$
- m-n位的数字:^\d{m,n}$
- 零和非零结尾的数字:^(0|1-9*)$
- 非零结尾的最多带两位小数的数字:^(1-9*)+(.[0-9]{1,2})?$
- 带1-2位小数的负数或正数:^(-)?\d+(.\d{1,2})?$
- 负数、正数、和小数:^(-|+)?\d+(.\d+)?$
- 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
- 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
- 非零的正整数:^[1-9]\d$ 或 ^([1-9][0-9]*){1,3}$ 或 ^+?1-9$
- 非零的负整数:^-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
- 非负整数:^\d+$ 或 ^[1-9]\d*|0$
- 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
- 非负浮点数:^\d+(.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
- 非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
- 正浮点数:^[1-9]\d.\d|0.\d[1-9]\d$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
- 负浮点数:^-([1-9]\d.\d|0.\d[1-9]\d)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
- 浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
1.6正则匹配诗词
1先荡涤数据
过程中...大量应用正则
const List = res.result.data const Result = [] List.forEach((item,index) => { var object = {} object = item.content object = object.replace(/\s|<br>|<p>|<\/p>| |”|“/g, '') object = object.replace(/\(.+\)/g, '') object = object.replace(/!|。|?|;/g, object => `${object}|`) object = object.replace(/\|$/g, '') let arr = object.split('|'); arr = arr.filter(item => item.length >= 2); const sentence = arr[this.randBetween(0, arr.length)]; const cleanSentence = this.cleanPunctuation(sentence) const name = this.randCharFromStr(cleanSentence, 2) var str = {} str.sentence = sentence str.name = name str.title = item.title str.author = item.author ? item.author : '佚名' str.book = item.book str.dynasty = item.dynasty Result.push(str) }) this.nameList = Result })
2提前诗文和姓名关键字
// 选取诗文 randBetween(min, max) { // [min,max) max is not included return min + Math.floor(Math.random() * (max - min)); }, // 清理标点符号 cleanPunctuation(str) { const puncReg = /[<>《》!*\(\^\)\$%~!@#…&%¥—\+=、。,?;‘’“”:·`]/g; return str.replace(puncReg, ''); }, // 取两个字 randCharFromStr(str, num, ordered) { if (typeof ordered === 'undefined') { ordered = true; } let randNumArr = this.genRandNumArr(str.length, num); if (ordered) { randNumArr = randNumArr.sort((a, b) => a - b); } let res = ''; for (let i = 0; i < randNumArr.length; i++) { res += str.charAt(randNumArr[i]); } return res; }, genRandNumArr(max, num) { if (num > max) { num = max; console.log(`max=${max} num = ${num}`); // throw new Error('too large num'); } const orderedNum = []; for (var i = 0; i < max; i++) { orderedNum.push(i); } const res = []; for (var i = 0; i < num; i++) { const randIndex = this.randBetween(0, orderedNum.length); const randNum = orderedNum[randIndex]; res.push(randNum); orderedNum.splice(randIndex, 1); // console.log('i=' + i + 'rand=' + rand, orderedNum); } return res; },
3后前端数据
<view class="name-list"> <view class="name-container" v-for="item in nameList" :key="item._id"> <view class="name-info"> {{userName}}{{item.name}} </view> <view class="sentence">[{{item.sentence}}]</view> <view class="name-other"> <view>{{item.book}} ● {{item.title}}</view> <view>[{{item.dynasty}}] {{item.author}}</view> </view> </view> </view>
4 丑化款式
.name-list { display: flex; flex-direction: column; .name-container { margin: 10px 20px; padding: 5px 5px; background-color: #f1f1f1; border: #333333 solid 1px; .name-info { font-size: 26px; font-weight:bold } .sentence { padding-top:5px; padding-bottom: 5px; padding-left: 30px; display: flex; flex-wrap: nowrap; } .name-other { pading:2px 2px } }
1.7uni-app应用wxs模板
指标是扭转 诗句参数中 name关键字的色彩
因为要应用indexOf匹配关键字,然而小程序是不反对indexOf函数
小程序原生的解决方案是创立一个wxs的模板文件,引入indexOf
这样就须要uni-app也要反对wxs,索性,目前uni-app曾经反对wxs
所以小程序这边就能够持续玩上来,然而这样就要思考uni-app在多端的兼容性
1我把获取到的数据,拆成单字的数组
str.sentence = sentence.split("") str.name = name.split("")
2因为无奈援用indexOf,所以创立 wxs模板解决这个问题
<script module="tools" lang="wxs">
function fn(arr, value) { if(arr.indexOf(value) < 0) { return false; } else { return true; }}module.exports = { fn:fn};
</script>
<script module="tools" lang="wxs"> function fn(arr, value) { if(arr.indexOf(value) < 0) { return false; } else { return true; } } module.exports = { fn:fn };</script>
3 应用v-for循环展现 诗句和姓名
<view class="name-info"> <view> {{userName}} </view> <view v-for="(name,index) in item.name" :key="index" >{{name}}</view> </view> <view class="sentence"> <view>[</view> <view v-for="(sentence,index) in item.sentence" :key="index" :class="tools.fn(item.name, sentence)?'active':'black'">{{sentence}}</view> <view>]</view> </view>
4最初扭转下款式即可
.name-list { display: flex; flex-direction: column; .name-container { margin: 10px 20px; padding: 5px 5px; background-color: #f1f1f1; border: #333333 solid 1px; .name-info { font-size: 26px; font-weight:bold; display: flex; flex-wrap: nowrap; } .sentence { padding-top:5px; padding-bottom: 5px; padding-left: 30px; display: flex; flex-wrap: nowrap; .active { color: #007AFF; } .black { color: #333333; } } .name-other { pading:2px 2px } } }
1.8unicloud白名单配置
各家小程序平台,均要求在小程序管理后盾配置小程序利用的联网服务器域名,否则无奈联网。
应用uniCloud后,开发者将不再须要本人购买、备案域名,间接将uniCloud的域名填写在小程序管理后盾即可。
依据下表,在小程序管理后盾设置request非法域名、uploadFile非法域名(如没有上传文件业务,可不设置)。下表的域名均为阿里云或腾讯云自有域名,并非DCloud所属域名。
服务提供商 | request非法域名 | uploadFile非法域名 | download非法域名| |
---|---|---|---|
阿里云 | api.bspapp.com | bsppub.oss-cn-shanghai.aliyuncs.com | 须要从云存储下载文件的时候才须要配置,不同服务空间域名不同,能够在web控制台查看文件详情外面看到 |
腾讯云 | tcb-api.tencentcloudapi.com | cos.ap-shanghai.myqcloud.com | 须要从云存储下载文件的时候才须要配置,不同服务空间域名不同,能够在web控制台查看文件详情外面看到 |
如果须要用uni.request申请云存储内的文件,须要将云存储域名(即上表中的download非法域名)配置到request非法域名内
小程序开发工具的真机预览性能,必须增加上述域名白名单,否则无奈调用云函数。模拟器的PC端预览、真机调试不受此影响。
如果遇到正确配置了非法域名然而仍然报url not in domain list
,请尝试删除手机上的小程序、清理小程序所在的客户端缓存、重启对应的小程序开发工具后重试
- \s ↩
- \x00-\xff ↩
- > ↩
- ~\x22 ↩