var url_prefix = "http://127.0.0.1:5000/"; function sendRequest(url_suffix, data, func) { var url = url_prefix + url_suffix; $.ajax({ type: "post", url: url, data: data, dataType: "json", processData: false, contentType: false, success: function (data) { func(data); }, error: function (XMLHttpRequest, textStatus, errorThrown) { console.log(this); } }); return; } function GetRequest() { var url = location.search; //获取url中"?"符后的字串 var theRequest = new Object(); if (url.indexOf("?") != -1) { var str = url.substr(1); strs = str.split("&"); for (var i = 0; i < strs.length; i++) { theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]); } } return theRequest; } function add(type) { var content = page.content; var name = page.name; var tag = page.tag; var order = page.textList.length; if (type == 'block') { if (content == null) { return; } if (CHECK_URL(content)) { console.log(content); submit(content, 'url'); } else { submit(content, 'text'); } page.content = null; return; } if (name == null) { return; } var data = new FormData(); data.append('phonenum', phonenum); data.append('name', name); data.append('tag', tag); sendRequest('collection/add', data, function () { getContent('collection'); }); page.content = null; page.name = null; page.tag = null; } function submit(content, type, order) { var url = "block/add"; var data = new FormData(); data.append("content", content); data.append('type', type); data.append('collection_id', page.id); sendRequest(url, data, function () { getContent('block'); }) } function getContent(type) { var url; url = type + "/select"; var data = new FormData(); if ("undefined" != typeof phonenum) { data.append('phonenum', phonenum); } if (page.id != null) { data.append('id', page.id); } var name = $("#search").val(); if (name != "") { data.append('name', name); } sendRequest(url, data, function (data) { if (type == 'collection') { page.textList = data.collections; checkLike(page); } else { page.textList = data.blocks; getWebName(); } for (i in page.textList) { page.textList[i]['order'] = i; if (type == 'block' && page.textList[i]['type'] == 'picture') { page.textList[i]['content'] = get_url(page.textList[i]['content']); } } }); } async function getWebName() { for (i in page.textList) { if (page.textList[i]['type'] != 'url') { continue; } (function (i) { var dt = new FormData(); var obj = page.textList[i]; dt.append('url', obj['content']); sendRequest('block/get_web_name', dt, function (data) { obj['title'] = data.name; Vue.set(page.textList, obj['order'], obj); }); })(i); } } async function checkLike(list) { for (i in page.textList) { (function (i) { var dt = new FormData(); var obj = list.textList[i]; dt.append('collection_id', obj['id']); dt.append('phonenum', phonenum); sendRequest('collection/isLike', dt, function (data) { obj['isLike'] = data.isLike; Vue.set(list.textList, obj['order'], obj); }); })(i); } } function get_url(f) { let reader = new FileReader(); reader.readAsDataURL(f); reader.onload = function (e) { return e.target.result; }; } var page = new Vue({ el: "#textList", data: { textList: [], id: null, name: null, tag: null, content: null, }, methods: { swap: function (obj_id, dir, type) { var url = type + '/swap'; var obj = this.textList[obj_id]; var pos = obj_id; var origin_pos = pos; if (dir == 'up' && pos > 0) { pos--; } if (dir == 'down' && pos < this.textList.length - 1) { pos++; } obj['order'] = pos; var swap_obj = this.textList[pos]; swap_obj['order'] = origin_pos; Vue.set(this.textList, origin_pos, swap_obj); Vue.set(this.textList, pos, obj); var data = new FormData(); data.append("new_order", pos); data.append("id", obj.id); if (type == 'block') { data.append('collection_id', page.id); } sendRequest(url, data, getContent(type)); }, delete_item: function (order, type) { var url = type + '/delete'; var data = new FormData(); data.append("collection_id", this.id); console.log(order); if (type == "block") { data.append("block_id", this.textList[order]['id']); } this.textList.splice(this.textList[order], 1); sendRequest(url, data, function () { ; }); for (i in page.textList) { page.textList[i]['order'] = i; if (type == 'block' && page.textList[i]['type'] == 'picture') { page.textList[i]['content'] = get_url(page.textList[i]['content']); } } }, jump_to: function (url, block_name, collection_id) { window.location.href = url + "?name=" + block_name + "&id=" + collection_id; }, edit: function (order, type) { var obj = this.textList[order] var pos = obj['order']; var url = type + '/update'; var data = new FormData(); if (type == 'collection') { data.append('collection_id', obj['id']); if (this.name != null) { obj['name'] = this.name; data.append('name', this.name); } if (this.tag != null) { obj['tag'] = this.tag; data.append('tag', this.tag); } } else { data.append('collection_id', this.id); data.append('block_id', obj['id']); if (this.content != null) { obj['content'] = this.content; data.append('content', this.content); } } Vue.set(this.textList, pos, obj); sendRequest(url, data, function () { ; }); this.name = null; this.tag = null; this.content = null; }, add_item: function (type) { add(type); }, like: function (order) { var obj = this.textList[order]; obj['like']++; obj['isLike'] = true; Vue.set(this.textList, order, obj); var data = new FormData(); data.append('collection_id', obj['id']); data.append('phonenum', phonenum); sendRequest('collection/like', data, function () { ; }); }, unlike: function (order) { var obj = this.textList[order]; obj['like']--; obj['isLike'] = false; Vue.set(this.textList, order, obj); var data = new FormData(); data.append('collection_id', obj['id']); data.append('phonenum', phonenum); sendRequest('collection/unlike', data, function () { ; }); } } } ) var recommend = new Vue({ el: "#recommend", data: { textList: [], id: null, name: null, tag: null, content: null, }, created: function () { var url; url = "collection/recommend"; var data = new FormData(); sendRequest(url, data, function (data) { recommend.textList = data.collections; checkLike(this); for (i in recommend.textList) { recommend.textList[i]['order'] = i; } }); }, methods: { jump_to: function (url, block_name) { window.location.href = url + "?name=" + block_name + "&id=null"; }, like: function (order) { var obj = this.textList[order]; obj['like']++; obj['isLike'] = true; Vue.set(this.textList, order, obj); var data = new FormData(); data.append('collection_id', obj['id']); data.append('phonenum', phonenum); sendRequest('collection/like', data, function () { ; }); }, unlike: function (order) { var obj = this.textList[order]; obj['like']--; obj['isLike'] = false; Vue.set(this.textList, order, obj); var data = new FormData(); data.append('collection_id', obj['id']); data.append('phonenum', phonenum); sendRequest('collection/unlike', data, function () { ; }); } } } ) function CHECK_URL(url) { //url= 协议://(ftp的登录信息)[IP|域名](:端口号)(/或?请求参数) var strRegex = '^((https|http|ftp)://)?'//(https或http或ftp):// 可有可无 + '(([\\w_!~*\'()\\.&=+$%-]+: )?[\\w_!~*\'()\\.&=+$%-]+@)?' //ftp的user@ 可有可无 + '(([0-9]{1,3}\\.){3}[0-9]{1,3}' // IP形式的URL- 3位数字.3位数字.3位数字.3位数字 + '|' // 允许IP和DOMAIN(域名) + '(localhost)|' //匹配localhost + '([\\w_!~*\'()-]+\\.)*' // 域名- 至少一个[英文或数字_!~*\'()-]加上. + '\\w+\\.' // 一级域名 -英文或数字 加上. + '[a-zA-Z]{1,6})' // 顶级域名- 1-6位英文 + '(:[0-9]{1,5})?' // 端口- :80 ,1-5位数字 + '((/?)|' // url无参数结尾 - 斜杆或这没有 + '(/[\\w_!~*\'()\\.;?:@&=+$,%#-]+)+/?)$';//请求参数结尾- 英文或数字和[]内的各种字符 var strRegex1 = '^(?=^.{3,255}$)((http|https|ftp)?:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/)?(?:\/(.+)\/?$)?(\/\w+\.\w+)*([\?&]\w+=\w*|[\u4e00-\u9fa5]+)*$'; var re = new RegExp(strRegex, 'i');//i不区分大小写 console.log(re); //将url做uri转码后再匹配,解除请求参数中的中文和空字符影响 if (re.test(encodeURI(url))) { return (true); } else { return (false); } }