Browse Source

rount和url

master
= 4 years ago
parent
commit
0d17e46d7e
7 changed files with 375 additions and 84 deletions
  1. +73
    -15
      APP/static/js/wsy.js
  2. +2
    -2
      APP/templates/add.html
  3. +58
    -29
      APP/templates/login.html
  4. +65
    -24
      APP/templates/personal.html
  5. +5
    -14
      APP/templates/square.html
  6. +77
    -0
      APP/view/block.py
  7. +95
    -0
      APP/view/collection.py

+ 73
- 15
APP/static/js/wsy.js View File

@ -43,7 +43,14 @@ function add(type) {
if (content == null) {
return;
}
submit(content, 'text');
if (CHECK_URL(content)) {
console.log(content);
submit(content, 'url');
}
else {
submit(content, 'text');
}
page.content = null;
return;
}
@ -67,7 +74,6 @@ function submit(content, type,order) {
var data = new FormData();
data.append("content", content);
data.append('type', type);
data.append('order', order);
sendRequest(url,data,function () {
getContent('block');
})
@ -81,6 +87,9 @@ function getContent(type) {
if ("undefined" != typeof phonenum) {
data.append('phonenum',phonenum);
}
if (page.id != null) {
data.append('id', page.id);
}
var name = $("#search").val();
if(name != ""){
@ -89,9 +98,11 @@ function getContent(type) {
sendRequest(url, data, function (data) {
if (type == 'collection') {
page.textList = data.collections;
checkLike();
}
else {
page.textList = data.blocks;
getWebName();
}
for (i in page.textList) {
page.textList[i]['order'] = i;
@ -100,10 +111,29 @@ function getContent(type) {
}
}
checkLike();
});
}
async function getWebName() {
for (i in page.textList) {
(function (i) {
var dt = new FormData();
var obj = page.textList[i];
if (obj['type'] != 'url') {
continue;
}
dt.append('url', obj['content']);
sendRequest('block/get_web_name', dt, function (data) {
obj['content'] = data.name;
Vue.set(page.textList, obj['order'], obj);
});
})(i);
}
}
async function checkLike() {
for (i in page.textList) {
(function (i) {
@ -158,29 +188,28 @@ var page = new Vue({
var data = new FormData();
data.append("new_order", pos);
data.append("id", obj.id);
if (type == "block";) {
sendRequest(url, data, getBlock);
if (type == 'block';) {
data.append('collection_id', page.id);
}
else{
sendRequest(url, data, getCollection);
}
sendRequest(url, data, getContent(type));
},
delete_item: function(order,type) {
var url;
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']);
url = "block/delete";
}
else {
url = "collection/delete";
}
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;
@ -191,6 +220,8 @@ var page = new Vue({
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);
@ -201,6 +232,8 @@ var page = new Vue({
}
}
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);
@ -238,3 +271,28 @@ var page = new Vue({
}
}
)
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);
}
}

+ 2
- 2
APP/templates/add.html View File

@ -467,7 +467,7 @@
<div class="widget-chart-actions">
<div class="btn-group dropdown">
<button type="button" aria-haspopup="true" data-toggle="dropdown"
aria-expanded="false" class="text-white btn btn-link" v-if="id=='null'">
aria-expanded="false" class="text-white btn btn-link" v-if="id!='null'">
<i class="fa fa-ellipsis-h"></i>
</button>
<div v-if="id==null"tabindex="-1" role="menu" aria-hidden="true"
@ -504,7 +504,7 @@
</div>
</div>
</div>
<div class="col-md-4" v-show="id=='null'">
<div class="col-md-4" v-show="id!='null'">
<div class="card mb-3 bg-mixed-hopes widget-chart text-white card-border">
<div class="widget-chart-actions">
<div class="btn-group dropdown">

+ 58
- 29
APP/templates/login.html View File

@ -1,5 +1,6 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="../static/css/home.css">
@ -7,38 +8,62 @@
<script src="../static/js/jquery-3.5.1.min.js"></script>
<script src="http://api.html5media.info/1.1.8/html5media.min.js"></script>
<script type="text/javascript">
function login(obj){
var phonenum = $(obj).parent().prev().prev().children("#phonenum").val();
var password = $(obj).parent().prev().children("#password").val();
var url = "http://127.0.0.1:5000/login";
$.ajax({
type: "POST",
url: url,
data: {
phonenum: phonenum,
password: password
var cookie = {
setCookie: function (cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires;
},
success: function(data){
alert(data.msg);
if(data.code == 0){
var newurl = "http://127.0.0.1:5000/self%3Fphonenum%3D" + phonenum;
window.location = newurl;
getCookie: function (name) {
var arr = document.cookie.split('; ');
for (var i = 0; i < arr.length; i++) {
var arr2 = arr[i].split('=');
if (arr2[0] == name) {
return arr2[1];
}
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
window.location = url;
return '';
},
removeCookie: function (name) {
cookie.setCookie(name, '', -1)
}
});
}
};
function login(obj) {
var phonenum = $(obj).parent().prev().prev().children("#phonenum").val();
var password = $(obj).parent().prev().children("#password").val();
var url = "http://127.0.0.1:5000/login";
$.ajax({
type: "POST",
url: url,
data: {
phonenum: phonenum,
password: password
},
success: function (data) {
cookie.setCookie('phonenum', phonenum, 30);
var newurl = "personal.html";
window.location = newurl;
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
window.location = url;
}
});
}
</script>
</head>
<body>
<div class="background">
<video autoplay loop muted>
<source src="../static/video/video.mp4" type="video/mp4" />
<source src="../static/video/video.mp4" type="video/mp4" />
Your Browser is no longer supported.
</video>
</div>
@ -46,15 +71,19 @@
<div class="login">
<div class="logo_1"></div>
<div class="form-item">
<p style="padding-bottom:30px"><input id="phonenum" oninput="value=value.replace(/[^\d]/g,'')" autocomplete="off" placeholder="电话号码" name="phonenum"></p>
<p style="padding-bottom:30px"><input id="password" type="password" autocomplete="off" placeholder="登录密码" name="password"></p>
<p><input type="submit" value="登录" id="login" onclick="login(this)" style="padding-left:0;margin-left:0;width:350px;background-color:white;color:#1f6f4a;cursor:pointer"></p>
<p style="padding-bottom:30px"><input id="phonenum" oninput="value=value.replace(/[^\d]/g,'')"
autocomplete="off" placeholder="电话号码" name="phonenum"></p>
<p style="padding-bottom:30px"><input id="password" type="password" autocomplete="off" placeholder="登录密码"
name="password"></p>
<p><input type="submit" value="登录" id="login" onclick="login(this)"
style="padding-left:0;margin-left:0;width:350px;background-color:white;color:#1f6f4a;cursor:pointer">
</p>
</div>
<div class="reg-bar">
<a class="reg" href="http://127.0.0.1:5000/register">立即注册</a>
<a class="forget" href="http://127.0.0.1:5000/forget">忘记密码</a>
</div>
</div>
</body>
</html>
</html>

+ 65
- 24
APP/templates/personal.html View File

@ -16,12 +16,7 @@
<link href="../static/css/main.css" rel="stylesheet">
<link href="../static/css/charts.css" rel="stylesheet">
<script src="../static/js/jquery-3.5.1.min.js"></script>
<script>
// wsy:这个phonenum可能需要用什么传参的方式得到
var phonenum = "0";
$(document).ready(function () { getContent('collection'); });
</script>
<!-- wsy:临时用样式 -->
<style>
.standard-input {
@ -468,40 +463,52 @@
</div>
</div>
</div>
<div class="row" id ="textList">
<div class="row" id="textList">
<!-- 集锦块样例 -->
<div class="col-md-4" v-for="item in textList":key="item.id" v-bind:item='item'>
<div class="col-md-4" v-for="item in textList" :key="item.id" v-bind:item='item'>
<div class="card mb-3 bg-ripe-malin widget-chart text-white card-border">
<div class="widget-chart-actions">
<div class="btn-group dropdown">
<button type="button" aria-haspopup="true" data-toggle="dropdown" aria-expanded="false" class="text-white btn btn-link">
<button type="button" aria-haspopup="true" data-toggle="dropdown"
aria-expanded="false" class="text-white btn btn-link">
<i class="fa fa-ellipsis-h"></i>
</button>
<div tabindex="-1" role="menu" aria-hidden="true" class="dropdown-menu-lg dropdown-menu-right dropdown-menu">
<div tabindex="-1" role="menu" aria-hidden="true"
class="dropdown-menu-lg dropdown-menu-right dropdown-menu">
<ul class="nav flex-column">
<li class="nav-item-header nav-item">操作</li>
<li class="nav-item">
<div v-on:click="swap(item.order,'up','collection');" class="nav-link">上移</div>
<div v-on:click="swap(item.order,'down','collection');" class="nav-link">下移</div>
<div v-on:click="delete_item(item.order,'collection');" class="nav-link">删除</div>
<div v-on:click="swap(item.order,'up','collection');"
class="nav-link">上移</div>
<div v-on:click="swap(item.order,'down','collection');"
class="nav-link">下移</div>
<div v-on:click="delete_item(item.order,'collection');"
class="nav-link">删除</div>
</li>
<li class="nav-item-divider nav-item"></li>
<li class="nav-item-header nav-item">修改名称及标签</li>
<li class="nav-item">
<input type="text" autocomplete="off" v-model="name" v-bind:placeholder="item.name" class="form-control input-mask-trigger">
<input type="text" autocomplete="off" v-model="name"
v-bind:placeholder="item.name"
class="form-control input-mask-trigger">
</li>
<li class="nav-item">
<input type="text" autocomplete="off" v-model="tag" v-bind:placeholder="item.tag" class="form-control input-mask-trigger">
<input type="text" autocomplete="off" v-model="tag"
v-bind:placeholder="item.tag"
class="form-control input-mask-trigger">
</li>
<li class="nav-item-btn nav-item">
<button class="btn-wide btn-shadow btn btn-danger btn-sm" v-on:click="edit(item.order,'collection')">修改</button>
<button class="btn-wide btn-shadow btn btn-danger btn-sm"
v-on:click="edit(item.order,'collection')">修改</button>
</li>
</ul>
</div>
</div>
</div>
<div class="widget-numbers" v-on:click="jump_to('add.html',item.name,id);"><span>{{item.name}}</span></div><br>
<div class="widget-subheading"><i class="fa fa-tags"></i>&nbsp;&nbsp;<span>{{item.tag}}</span></div>
<div class="widget-numbers" v-on:click="jump_to('add.html',item.name,id);">
<span>{{item.name}}</span></div><br>
<div class="widget-subheading"><i
class="fa fa-tags"></i>&nbsp;&nbsp;<span>{{item.tag}}</span></div>
<div>点赞数:{{item.like}}</div>
</div>
</div>
@ -509,28 +516,33 @@
<div class="card mb-3 bg-ripe-malin widget-chart text-white card-border">
<div class="widget-chart-actions">
<div class="btn-group dropdown">
<button type="button" aria-haspopup="true" data-toggle="dropdown" aria-expanded="false" class="text-white btn btn-link">
<button type="button" aria-haspopup="true" data-toggle="dropdown"
aria-expanded="false" class="text-white btn btn-link">
<i class="pe-7s-plus"></i>
</button>
<div tabindex="-1" role="menu" aria-hidden="true" class="dropdown-menu-lg dropdown-menu-right dropdown-menu">
<div tabindex="-1" role="menu" aria-hidden="true"
class="dropdown-menu-lg dropdown-menu-right dropdown-menu">
<ul class="nav flex-column">
<li class="nav-item-header nav-item">添加名称及标签</li>
<li class="nav-item">
<input type="text" autocomplete="off" v-model="name" placeholder="名称" class="form-control input-mask-trigger">
<input type="text" autocomplete="off" v-model="name"
placeholder="名称" class="form-control input-mask-trigger">
</li>
<li class="nav-item">
<input type="text" autocomplete="off" v-model="tag" placeholder="标签" class="form-control input-mask-trigger">
<input type="text" autocomplete="off" v-model="tag" placeholder="标签"
class="form-control input-mask-trigger">
</li>
<li class="nav-item-btn nav-item">
<button class="btn-wide btn-shadow btn btn-danger btn-sm"
v-on:click="add_item('collection')">新建</button>
<button class="btn-wide btn-shadow btn btn-danger btn-sm"
v-on:click="add_item('collection')">新建</button>
</li>
</ul>
</div>
</div>
</div>
<div class="widget-numbers"><span>新建集锦</span></div><br>
<div class="widget-subheading"><i class="fa fa-tags"></i>&nbsp;&nbsp;<span>单击右上角添加集锦</span></div>
<div class="widget-subheading"><i
class="fa fa-tags"></i>&nbsp;&nbsp;<span>单击右上角添加集锦</span></div>
</div>
</div>
</div>
@ -539,6 +551,35 @@
</div>
<script src="../static/js/wsy.js"></script>
<script type="text/javascript" src="../static/assets/scripts/main.js"></script>
<script>
var cookie = {
setCookie: function (name, value) {
document.cookie = name + '=' + value + ';';
},
getCookie: function (name) {
var arr = document.cookie.split('; ');
for (var i = 0; i < arr.length; i++) {
var arr2 = arr[i].split('=');
if (arr2[0] == name) {
return arr2[1];
}
}
return '';
},
removeCookie: function (name) {
cookie.setCookie(name, '', -1)
}
};
// wsy:这个phonenum可能需要用什么传参的方式得到
var phonenum = cookie.getCookie("phonenum");
if(phonenum == ""){
window.location.href = "login.html";
//phonenum = "1";
}
$(document).ready(function () { getContent('collection'); });
</script>
</body>
</html>

+ 5
- 14
APP/templates/square.html View File

@ -383,26 +383,17 @@
</div>
<div class="row" id="textList">
<!-- 集锦样例 -->
<div class="col-md-4">
<div class="card mb-3 bg-arielle-smile widget-chart text-white card-border">
<div class="widget-numbers"><span>名称</span></div><br>
<div class="widget-subheading"><i class="fa fa-tags"></i>&nbsp;&nbsp;<span>标签</span></div>
<!-- 未点赞时的状态:点击超链接以增加赞 -->
<div class="widget-description text-danger"><a href = "square.html"><i class="pe-7s-like"></i>&nbsp;<span class="pr-1">11<!-- 点赞数 --></span></a></div>
<!-- 点赞后的状态:点击超链接以取消赞 -->
<div class="widget-description text-danger"><a href = "square.html"><i class="fa fa-heart"></i>&nbsp;<span class="pr-1">10<!-- 点赞数 --></span></a></div>
</div>
</div>
<div class="col-md-4" v-for="item in textList":key="item.id" v-bind:item='item'>
<div class="card mb-3 bg-arielle-smile widget-chart text-white card-border">
<div class="widget-numbers" v-on:click="jump_to('add.html',item.name,id);"><span>{{item.name}}</span></div><br>
<div class="widget-subheading"><i class="fa fa-tags"></i>&nbsp;&nbsp;<span>{{item.tag}}</span></div>
<div>点赞数:{{item.like}}</div>
<button v-if="item.isLike!=true" v-on:click="like(item.order)">点赞</button>
<button v-if="item.isLike==true" v-on:click="unlike(item.order)">取消点赞</button>
<!-- 未点赞时的状态:点击超链接以增加赞 -->
<div class="widget-description text-danger" v-if="item.isLike!=true"><i class="pe-7s-like" v-on:click="like(item.order)"></i>&nbsp;<span class="pr-1">{{item.like}}</span></div>
<!-- 点赞后的状态:点击超链接以取消赞 -->
<div class="widget-description text-danger" v-if="item.isLike==true"><i class="fa fa-heart" v-on:click="unlike(item.order)"></i>&nbsp;<span class="pr-1">{{item.like}}</span></div>
</div>
</div>
</div>
</div>
</div>

+ 77
- 0
APP/view/block.py View File

@ -0,0 +1,77 @@
from flask import Flask, render_template, request, jsonify, session, Blueprint
from bson import json_util
bp = Blueprint("block", __name__,url_prefix="/block")
@bp.route("/add", methods=["POST"])
def add_block():
type = request.form.get('type')
content = request.form.get("content")
ret = {'msg': 'succuss'}
"""
ret['id'] =
"""
return json_util.dumps()
@bp.route("/select", methods=["POST"])
def get_block():
# 查询这个id的collection的block
id = request.form.get('id')
blocks = []
"""
blocks.append({'id': '1', 'content': 'xuanz','type':'text'})
blocks.append({'id': '2', 'content': 'mingg','type':'url'})
blocks.append({'id': '3', 'content': 'wnqian','type':'picture'})
"""
ans = {'blocks':blocks,'msg':'succuss'}
return json_util.dumps(ans)
@bp.route("/delete", methods=["POST"])
def delete():
collection_id = request.form.get('collection_id')
block_id = request.form.get('block_id')
"""
id的collection的block
"""
ret = {'msg':'succuss'}
return json_util.dumps(ret)
@bp.route("/swap", methods=["POST"])
def swap():
id = request.form.get('id')
collection_id = request.form.get('collection_id')
order = request.form.get('new_order')
"""
collection_id的collection的这个id的块和顺序是order的块交换
"""
ret = {'msg':'succuss'}
return json_util.dumps(ret)
@bp.route("/edit", methods=["POST"])
def edit():
collection_id = request.form.get('collection_id')
block_id = request.form.get('block_id')
content = request.form.get('content',None)
"""
content = none的情况请直接返回
"""
ret = {'msg':'succuss'}
return json_util.dumps(ret)
@bp.route("/get_web_name", methods=["POST"])
def get_web_name():
url = request.form.get('url')
ret = {'msg':'succuss'}
"""
ret['name'] = url对应的网站的titleurl
"""
return json_util.dumps(ret)

+ 95
- 0
APP/view/collection.py View File

@ -0,0 +1,95 @@
from flask import Flask, render_template, request, jsonify, session, Blueprint
from bson import json_util
bp = Blueprint("collection", __name__,url_prefix="/collection")
@bp.route("/add", methods=["POST"])
def add_collection():
name = request.form.get('name')
tag = request.form.get('tag', None)
ret = {'msg':'succuss','name':name}
"""
ret['id'] =
"""
return json_util.dumps(ret)
@bp.route("/select", methods=["POST"])
def get_collection():
# 搜索的关键词
name = request.form.get('name', None)
# 搜索对象
phonenum = request.form.get('phonenum',None)
collections = []
"""
collections.append({'id': '1', 'name': 'xuanz','like':1})
collections.append({'id': '2', 'name': 'mingg','like':2})
collections.append({'id': '3', 'name': 'wnqian','like':3})
"""
ret = {'collections':collections,'msg':'succuss'}
return json_util.dumps(ret)
@bp.route("/isLike", methods=["POST"])
def islike():
ret = {'msg': 'succuss'}
id = request.form.get('collection_id')
"""
session确定id的collection是否有点赞
ans['isLike'] = True
"""
return json_util.dumps(ret)
@bp.route("/like", methods=["POST"])
def get_like():
id = request.form.get('colllection_id')
"""
"""
ret = {'msg':'succuss'}
return json_util.dumps(ret)
@bp.route("/unlike", methods=["POST"])
def get_unlike():
id = request.form.get('colllection_id')
"""
"""
ret = {'msg':'succuss'}
return json_util.dumps(ret)
@bp.route("/swap", methods=["POST"])
def swap():
id = request.form.get('id')
order = request.form.get('new_order')
"""
id的collection和顺序是order的collection交换
"""
ret = {'msg':'succuss'}
return json_util.dumps(ret)
@bp.route("/delete", methods=["POST"])
def delete():
id = request.form.get('collection_id')
"""
id的collection
"""
ret = {'msg':'succuss'}
return json_util.dumps(ret)
@bp.route("/edit", methods=["POST"])
def edit():
id = request.form.get('collection_id')
name = request.form.get('name', None)
tag = request.form.get('tag', None)
"""
none的情况请直接返回
"""
ret = {'msg':'succuss'}
return json_util.dumps(ret)

Loading…
Cancel
Save