vue单页因微信分享和自动登陆须要,对于URL中存在’#’的地址,处理起来比较坑。
用history模式就不会存在这样的问题。可是换成history模式,就会有个新的问题,就是页面刷新后,页面就没法显示了(404)。
对于这个问题,只需要配置网站Nginx就可以了
server { listen 8888;#默认端口是80,若是端口没被占用能够不用修改 server_name localhost; root E:/vue/my_project/dist;#vue项目的打包后的dist ##############修改配置文件,以上部分应该默认存在,下面两个location是重点############# location / { try_files $uri $uri/ @router;#须要指向下面的@router不然会出现vue的路由在nginx中刷新出现404 index index.html index.htm; } #对应上面的@router,主要缘由是路由的路径资源并非一个真实的路径,因此没法找到具体的文件 #所以须要rewrite到index.html中,而后交给路由在处理请求资源 location @router { rewrite ^.*$ /index.html last; } #.......该文件其余部分于此功能无关,省略 }
这个错误一般是数据库断开后不再自动连接导致的。
需要将 config['break_reconnect'] 的值设置为 true, 才会开启断线重连。
一般在database.php 配置文件中:
//断线重连 'break_reconnect' => true,
但有些版本不在此文件中,可以从thinkphp/library/think/db/Connection.php找到,再找不到,请全局搜索!
最后,一般造成这样的原因可能是因为数据库连接次数过多,还是要优化代码,可以考虑添加缓存,减少数据库的连接。
作用:
函数用于将多个字符串连接成一个字符串。
返回值:
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' SELECT CONCAT('My', NULL, 'QL');//只要有一个为null,则输出null NULL SELECT CONCAT(14.3); '14.3'
作用:
函数用于将多个字符串连接成一个字符串。
返回值:
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
参数说明:
第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。
SELECT CONCAT_WS(',','First name','Second name','Last Name'); 'First name,Second name,Last Name' SELECT CONCAT_WS(',','First name',NULL,'Last Name');//null会直接忽略 'First name,Last Name' SELECT CONCAT_WS(',','First name','','Last Name');//空是可以正常连接的 'First name,,Last Name'
group_concat函数的作用是将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
(1) 基本语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] );
(2) 说明:可以使用distinct排除重复值;可以使用order by子句对结果中的值进行排序。
(3) 返回的字符串的默认分隔符从逗号(,),若要改为其他分隔符,则使用SEPARATOR子句修改分隔符。
select user_id,GROUP_CONCAT(`like_name` order by `create_time` desc SEPARATOR ',' ) FROM user_table WHERE user_id > 10 GROUP BY user_id
上方SQL对应的情况举例:
假设表结构为id(主键)、user_id(用户id)、like_name(爱好)、create_time(创建时间),想一次性查询出每个人的所有爱好(每条记录代表一个人),不用二次数据处理。
自己查找函数写的菜鸟代码,不喜勿喷~
//浏览器检测切换 var back_tab_settimeout; var leave_tab_setinterval; var leave_arr = { 0: '∑(っ°Д°;)っ卧槽,人不见了~', 1: 'Σσ(・Д・;)我可什么都没做!!!', 2: '(σ゚∀゚)σ..:*☆哎哟,干嘛去了', 3: '(*╹▽╹*) 回来看看我好不好', 4: '凸(`0´)凸 鄙视中途离站', 5: '(´థ౪థ)σ你竟然是这样的人', 6: '(╥╯﹏╰╥)ง 不理我我走了', 7: 'Σ(σ`•ω•´)σ 起飞,再见!', 8: '(((┏(; ̄▽ ̄)┛ 装完逼就跑!', }; var leave_arr_length = Object.keys(leave_arr).length; if (document.hidden !== undefined) { document.addEventListener('visibilitychange', () => { var is_tab_windows = document.hidden; if (is_tab_windows) { clearTimeout(back_tab_settimeout); $('link[rel=icon]').attr('href', '/favicon2.ico'); $('title').html("。。。。。。"); var setInterval_num = 0; leave_tab_setinterval = setInterval(function () { if (leave_arr_length <= setInterval_num) { setInterval_num = 0; } $('title').html(leave_arr[setInterval_num]); setInterval_num++; }, 5000); } else { clearInterval(leave_tab_setinterval); $('link[rel=icon]').attr('href', '/favicon3.ico'); $('title').html('(((o(*゚▽゚*)o)))♡ 欢迎回来~'); back_tab_settimeout = setTimeout(function () { $('link[rel=icon]').attr('href', '/favicon.ico'); $('title').html("{:get_web_config_info('name')}"); }, 5000) } }) }
需要引入js文件:mobile-detect.js
function get_mobile_data() { //设置默认值 var visit_mobile_details = {'system': '', 'system_type': ''}; var device_type = navigator.userAgent;//获取userAgent信息 var md = new MobileDetect(device_type);//初始化mobile-detect var os = md.os();//获取系统 var model = ""; if (os == "iOS") { //ios系统的处理 os = md.os() + md.version("iPhone"); model = md.mobile(); } else if (os == "AndroidOS") { //Android系统的处理 os = md.os() + md.version("Android"); var sss = device_type.split(";"); var i = sss.contains("Build/"); if (i > -1) { model = sss[i].substring(0, sss[i].indexOf("Build/")); } } visit_mobile_details.system = os;//系统类型 visit_mobile_details.system_type = model;//设备型号 return visit_mobile_details; }
document.oncontextmenu=new Function("event.returnValue=false"); document.onselectstart=new Function("event.returnValue=false");
返回的是:浏览器类型和版本号
function getExplorerInfo() { let explorer = window.navigator.userAgent; explorer = explorer.toLowerCase(); //遨游浏览器 if (explorer.indexOf('maxthon') >= 0) { let ver = explorer.match(/maxthon\/([\d.]+)/)[1] || ''; return '傲游浏览器' + ver; } //QQ浏览器 if (explorer.indexOf('qqbrowser') >= 0) { let ver = explorer.match(/qqbrowser\/([\d.]+)/)[1] || ''; return 'QQ浏览器' + ver; } //搜狗浏览器 if (explorer.indexOf('se 2.x') >= 0) { return '搜狗浏览器' + ver; } //搜狗浏览器 if (explorer.indexOf('slbrowser') >= 0) { let ver = explorer.match(/slbrowser\/([\d.]+)/)[1] || ''; return '联想浏览器' + ver; } //ie if (explorer.indexOf('msie') >= 0) { let ver = explorer.match(/msie ([\d.]+)/)[1] || ''; return 'IE' + ver; } //firefox else if (explorer.indexOf('firefox') >= 0) { let ver = explorer.match(/firefox\/([\d.]+)/)[1] || ''; return 'Firefox' + ver; } //Chrome else if (explorer.indexOf('chrome') >= 0) { let ver = explorer.match(/chrome\/([\d.]+)/)[1] || ''; return 'Chrome' + ver; } //Opera else if (explorer.indexOf('opera') >= 0) { let ver = explorer.match(/opera.([\d.]+)/)[1] || ''; return 'Opera' + ver; } //Safari else if (explorer.indexOf('safari') >= 0) { let ver = explorer.match(/version\/([\d.]+)/)[1] || ''; return 'Safari' + ver; } if (explorer.indexOf('edge') >= 0) { let ver = explorer.match(/edge\/([\d.]+)/)[1] || ''; return 'edge' + ver; } return '未知浏览器'; }
function isMobile() { if (navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Windows Phone/i) ) return true; return false; }
出现原因:页面上通过jQuery或其他方式添加某些新元素,而新元素无法和页面第一次加载的事件进行绑定。
例如:对button添加一个点击事件,当通过jQuery添加一个新的button元素时,就可能无法触发这个事件。
delegate() 方法的事件可以处理当前或者未来元素(比如有脚本创建建的新元素)
$(document).delegate("[id='support']","click",function(){ alert('点击成功~'); });
在一些类似于文章博客的内容中,会用到模糊搜索检索多个字段,对于检索后的结果排序可能并不满意。
例如:
在CSDN搜索一篇博文,在输入关键字后会检索文章的标题,内容,分类,标签等内容,但是检索的排序结果可能不太理想,比如想优先显示标题中带有此关键字的文章,不管是按主键或者时间排序都是不行的。
下面我就简单的说明一下遇到这种问题的几种解决办法:
利用LOCATE函数(MySQL数据库),按照匹配度进行排序。
locate(subStr,string) 函数返回subStr在string中出现的位置,返回结果大于0代表着subStr出现的位置(从开始就存在则为1,即如果string中存在subStr最小值为1),如果等于0则说明subStr不存在。
检索`name`和`memo`字段中存在'shx'的信息,并优先显示`name`字段中存在'shx'信息并且出现位置靠前的数据:
SELECT `name`,`memo`,locate('shx',`name`) as `order_name` FROM `cs_user` where `name` like "%shx%" or `memo` like "%shx%" order by `order_name` desc
检索`name`和`memo`字段中存在'shx'的信息,并优先显示`name`字段中存在'shx'信息并且出现位置靠前的数据,如果`name`字段中'shx'信息出现的位置相同或者都不存在,即`order_name`为0时,则优先显示`memo`字段中存在'shx'信息并且出现位置靠前的数据:
SELECT `name`,`memo`,locate('shx',`name`) as `order_name`,locate('shx',`memo`) as `order_memo` FROM `cs_user`where `name` like "%shx%" or `memo` like "%shx%" order by `order_name` desc,`order_memo` desc
等待更新