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等待更新