提交 4770d5df 编写于 作者: H hjdhnx

升级至 v3.9.17

上级 cad9b936
无法预览此类型文件
......@@ -145,6 +145,28 @@ def admin_rule_state(state=0): # 管理员修改规则状态
return R.success(f'修改成功,服务器反馈信息为:{success_list}')
@admin.route('/rule_order/<int:order>',methods=['POST'])
def admin_rule_order(order=0): # 管理员修改规则顺序
if not verfy_token():
return R.error('请登录后再试')
names = getParmas('names')
if not names:
return R.success(f'修改失败,没有传递names参数')
rule_list = names.split(',')
rules = rules_service()
# print(rules.query_all())
# print(rules.getState(rule_list[0]))
# print(rule_list)
success_list = []
for rule in rule_list:
try:
res_id = rules.setOrder(rule,order)
success_list.append(f'{rule}:{res_id}')
except:
success_list.append(rule)
return R.success(f'修改成功,服务器反馈信息为:{success_list}')
@admin.route('/force_update')
def admin_force_update():
if not verfy_token():
......
......@@ -210,6 +210,7 @@ def merged_hide(merged_config):
@home.route('/config/<int:mode>')
def config_render(mode):
# print(dict(app.config))
tt = time()
UA = request.headers['User-Agent']
ISTVB = 'okhttp/3' in UA
logger.info(UA)
......@@ -244,15 +245,46 @@ def config_render(mode):
html = render_template('config.txt',UA=UA,xr_mode=xr_mode,ISTVB=ISTVB,pys=pys,rules=rules,host=host,mode=mode,js_mode=js_mode,jxs=jxs,alists=alists,alists_str=alists_str,live_url=live_url,config=new_conf)
merged_config = custom_merge(parseText(html),customConfig)
# print(merged_config['sites'])
merged_hide(merged_config)
# response = make_response(html)
# print(len(merged_config['sites']))
# print(merged_config['sites'])
merged_config['sites'] = sort_sites_by_order(merged_config['sites'],js_mode)
response = make_response(json.dumps(merged_config,ensure_ascii=False,indent=1))
# response = make_response(str(merged_config))
response.headers['Content-Type'] = 'application/json; charset=utf-8'
logger.info(f'自动生成动态配置共计耗时:{get_interval(tt)}毫秒')
return response
def sort_sites_by_order(sites,js_mode=0):
rules = rules_service()
rule_list = rules.query_all()
# print(rule_list)
rule_names = list(map(lambda x: x['name'], rule_list))
# print(rule_names)
# print(sites)
for i in range(len(sites)):
# sites[i]['id'] = i+1
site_name = sites[i]['api'].split('rule=')[1].split('&')[0] if 'rule=' in sites[i]['api'] else sites[i]['key']
if js_mode and str(site_name).startswith('dr'):
site_name = site_name.replace('dr_','')
# print(site_name)
if site_name in rule_names:
site_rule = rule_list[rule_names.index(site_name)]
sites[i]['state'] = 1 if site_rule['state'] is None else site_rule['state']
sites[i]['order'] = 0 if site_rule['order'] is None else site_rule['order']
else:
sites[i]['state'] = 1
sites[i]['order'] = 0
# sites[i]['site_name'] = site_name
# print(sites)
sites.sort(key=lambda x: x['order'], reverse=False)
# print(sites)
for site in sites:
del site['state']
del site['order']
return sites
@home.route('/configs')
def config_gen():
# 生成文件
......@@ -285,12 +317,14 @@ def config_gen():
customConfig = getCustonDict(host0,ali_token)
set_dict = custom_merge(parseText(set_local), customConfig)
merged_hide(set_dict)
set_dict['sites'] = sort_sites_by_order(set_dict['sites'], js_mode)
# set_dict = json.loads(set_local)
f.write(json.dumps(set_dict,ensure_ascii=False,indent=4))
with open('txt/pycms1.json','w+',encoding='utf-8') as f:
customConfig = getCustonDict(host1,ali_token)
set_dict = custom_merge(parseText(set_area), customConfig)
merged_hide(set_dict)
set_dict['sites'] = sort_sites_by_order(set_dict['sites'], js_mode)
# set_dict = json.loads(set_area)
f.write(json.dumps(set_dict,ensure_ascii=False,indent=4))
......@@ -298,6 +332,7 @@ def config_gen():
customConfig = getCustonDict(host2,ali_token)
set_dict = custom_merge(parseText(set_online), customConfig)
merged_hide(set_dict)
set_dict['sites'] = sort_sites_by_order(set_dict['sites'], js_mode)
# set_dict = json.loads(set_online)
f.write(json.dumps(set_dict,ensure_ascii=False,indent=4))
files = [os.path.abspath(rf'txt\pycms{i}.json') for i in range(3)]
......
......@@ -44,7 +44,9 @@ def layui_rule_list():
# print(pys)
alists = []
live_url = []
html = render_template('config.txt', pys=pys, rules=getRules('js'), host=host, mode=2, jxs=jxs, alists=alists,
local_rules = getRules('js')
# print(local_rules)
html = render_template('config.txt', pys=pys, rules=local_rules, host=host, mode=2, jxs=jxs, alists=alists,
alists_str='[]', live_url=live_url, config=new_conf)
merged_config = custom_merge(parseText(html), customConfig)
sites = merged_config['sites']
......@@ -52,7 +54,8 @@ def layui_rule_list():
rule_list = rules.query_all()
rule_names = list(map(lambda x:x['name'],rule_list))
# print(rule_list)
# print(rule_names)
print(rule_names)
# print(sites)
for i in range(len(sites)):
sites[i]['id'] = i+1
site_name = sites[i]['api'].split('rule=')[1].split('&')[0] if 'rule=' in sites[i]['api'] else sites[i]['key']
......@@ -66,6 +69,7 @@ def layui_rule_list():
sites[i]['order'] = 0
sites[i]['site_name'] = site_name
sites.sort(key=lambda x:x['order'],reverse=False)
new_sites = sites[(page-1)*limit:page*limit]
# print(new_sites)
return layuiBack('获取成功',new_sites,count=len(sites))
......@@ -109,6 +109,22 @@ class rules_service(object):
print(f'发生了错误:{e}')
return None
def setOrder(self,key,order=0):
res = RuleClass.query.filter(RuleClass.name == key).first()
if res:
res.order = order
db.session.add(res)
else:
res = RuleClass(name=key, order=order)
db.session.add(res)
db.session.flush() # 获取id
try:
db.session.commit()
return res.id
except Exception as e:
print(f'发生了错误:{e}')
return None
@staticmethod
def getHideRules():
res = RuleClass.query.filter(RuleClass.state == 0).all()
......
......@@ -18,7 +18,7 @@ from base.database import db
from models.ruleclass import RuleClass
from models.playparse import PlayParse
from js.rules import getRules
from controllers.service import storage_service
from controllers.service import storage_service,rules_service
from concurrent.futures import ThreadPoolExecutor,as_completed,thread # 引入线程池
from quickjs import Function,Context
import ujson
......@@ -116,6 +116,25 @@ def multi_search2(wd):
return jsonify(result)
def merged_hide(merged_rules):
t1 = time()
store_rule = rules_service()
hide_rules = store_rule.getHideRules()
hide_rule_names = list(map(lambda x: x['name'], hide_rules))
# print('隐藏:',hide_rule_names)
all_cnt = len(merged_rules)
def filter_show(x):
# name = x['api'].split('rule=')[1].split('&')[0] if 'rule=' in x['api'] else x['key'].replace('dr_','')
name = x
# print(name)
return name not in hide_rule_names
merged_rules = list(filter(filter_show, merged_rules))
# print('隐藏后:',merged_rules)
logger.info(f'数据库筛选隐藏规则耗时{get_interval(t1)}毫秒,共计{all_cnt}条规则,隐藏后可渲染{len(merged_rules)}条规则')
return merged_rules
def multi_search(wd):
lsg = storage_service()
t1 = time()
......@@ -128,31 +147,35 @@ def multi_search(wd):
rules_exclude = ['drpy']
new_rules = list(filter(lambda x: x.get('searchable', 0) and x.get('name', '') not in rules_exclude, rules))
search_sites = [new_rule['name'] for new_rule in new_rules]
# print(search_sites)
nosearch_sites = set(rule_names) ^ set(search_sites)
nosearch_sites.remove('drpy')
# print(nosearch_sites)
logger.info(f'开始聚搜{wd},共计{len(search_sites)}个规则,聚搜超时{timeout}秒')
logger.info(f'不支持聚搜的规则,共计{len(nosearch_sites)}个规则:{",".join(nosearch_sites)}')
search_sites = merged_hide(search_sites)
# print(search_sites)
# search_sites = []
res = []
with open('js/模板.js', encoding='utf-8') as f:
before = f.read().split('export')[0]
with ThreadPoolExecutor(max_workers=len(search_sites)) as executor:
to_do = []
for site in search_sites:
future = executor.submit(search_one, site, wd, before)
to_do.append(future)
try:
for future in as_completed(to_do, timeout=timeout): # 并发执行
ret = future.result()
# print(ret)
if ret and isinstance(ret,dict) and ret.get('list'):
res.extend(ret['list'])
except Exception as e:
print(f'发生错误:{e}')
import atexit
atexit.unregister(thread._python_exit)
executor.shutdown = lambda wait: None
if len(search_sites) > 0:
with open('js/模板.js', encoding='utf-8') as f:
before = f.read().split('export')[0]
with ThreadPoolExecutor(max_workers=len(search_sites)) as executor:
to_do = []
for site in search_sites:
future = executor.submit(search_one, site, wd, before)
to_do.append(future)
try:
for future in as_completed(to_do, timeout=timeout): # 并发执行
ret = future.result()
# print(ret)
if ret and isinstance(ret,dict) and ret.get('list'):
res.extend(ret['list'])
except Exception as e:
print(f'发生错误:{e}')
import atexit
atexit.unregister(thread._python_exit)
executor.shutdown = lambda wait: None
logger.info(f'drpy聚搜{len(search_sites)}个源共计耗时{get_interval(t1)}毫秒')
return jsonify({
"list": res
......
3.9.16beta1
\ No newline at end of file
3.9.17
\ No newline at end of file
......@@ -47,6 +47,10 @@
[dockerfile教程](https://blog.csdn.net/qq_46158060/article/details/125718218)
[获取本地设备信息](https://blog.csdn.net/cui_yonghua/article/details/125508991)
[获取本地设备信息](https://m.jb51.net/article/140716.htm)
###### 2022/10/24
- [X] v3.9.17
- [X] drpy(道长) 服务端聚搜支持自动排除未来功能里隐藏的源
- [X] 未来功能增加源置顶和置底功能 测试性增加排序功能(指定输入数字)
###### 2022/10/23
- [X] 新增几个源 包括虎牙直播
- [X] 设置中心增加仙人模式开关(自动识别不同设备返回不同的drpy接口,关闭的话只会走drpy.min.js)
......
......@@ -48,7 +48,8 @@
</script>
<script type="text/html" id="barDemo">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<!-- <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>-->
<a class="layui-btn layui-btn-xs" lay-event="set_top">置顶</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">隐藏</a>
</script>
......@@ -96,6 +97,34 @@ layui.use(['table', 'dropdown'], function(){
});
}
function setOrder(data,to_set_order){
if(data.length < 1){
return layer.msg('请至少选择一行');
}
to_set_order = to_set_order||0;
console.log(data);
let site_names = data.map(it=>it.site_name);
let site_names_str = site_names.join(',');
console.log('准备将'+site_names_str+'的显示状态设置为:'+to_set_order);
let params = {"names":site_names_str};
console.log(params);
$.post("/admin/rule_order/"+to_set_order,params,function(data,status){
console.log(data);
if(data.code === 200){
// alert(data.msg);
// location.reload();
table.reload('test', {
// page: {
// curr: 3 //重新从第 1 页开始
// }
});
}else{
console.log('修改失败了...');
return false
}
});
}
// 创建渲染实例
table.render({
elem: '#test'
......@@ -111,11 +140,11 @@ layui.use(['table', 'dropdown'], function(){
// ,totalRow: true // 开启合计行
,page: true
,limit:12
,limits:[10,12,15,20,40,60,80,100,150,200]
,limits:[10,12,15,20,40,60,80,100,150,200,300,500]
,cols: [[
{type: 'checkbox', fixed: 'left'}
// ,{field: 'id', fixed: 'left',title: 'ID', width: 20, sort: true,totalRowText: '合计:'}
,{field: 'id',title: 'ID', width: 20, sort: true}
,{field: 'id',title: 'ID', width: 60, sort: true}
,{field: 'site_name', title: '存储名称', width: 120}
, {
field: 'state', title: '显示状态', minWidth: 100, templet: function (res) {
......@@ -219,20 +248,34 @@ layui.use(['table', 'dropdown'], function(){
elem: '#moreTest' //可绑定在任意元素中,此处以上述按钮为例
,data: [{
id: 'show',
title: '显示'
title: '🟢显示'
},{
id: 'hide',
title: '隐藏'
},{
id: 'add',
title: '添加'
},{
id: 'update',
title: '编辑'
},{
id: 'delete',
title: '删除'
}]
title: '🔴隐藏'
},
{
id:'set_top',
title: '⬆️置顶',
},
{
id:'set_order_number',
title: '↕️指定序号',
},
{
id:'set_bottom',
title: '⬇️置底',
},
// {
// id: 'add',
// title: '添加'
// },{
// id: 'update',
// title: '编辑'
// },{
// id: 'delete',
// title: '删除'
// }
]
//菜单被点击的事件
,click: function(obj){
var checkStatus = table.checkStatus(id)
......@@ -244,7 +287,35 @@ layui.use(['table', 'dropdown'], function(){
break;
case 'hide':
// console.log(obj);
setState(data,0)
setState(data,0);
break;
case 'set_top':
// console.log(obj);
setOrder(data,0);
break;
case 'set_order_number':
layer.prompt({
formType: 0,
value: '',
title: '请输入指定的排序序号,数字越小排名越靠前',
btn: ['确定','取消'], //按钮,
btnAlign: 'c'
}, function(value,index){
console.log('value:'+value);
var reg = /^[\d]+$/;
if(!reg.test(value)){
layer.msg('请输入有效数字!',{time:500});
}else{
setOrder(data,Number(value));
layer.close(index);
layer.msg('请设置顺序为'+value,{time:1000});
}
});
// setOrder(data,0);
break;
case 'set_bottom':
// console.log(obj);
setOrder(data,9999)
break;
case 'add':
layer.open({
......@@ -360,6 +431,30 @@ layui.use(['table', 'dropdown'], function(){
area: ['80%','80%'],
content: '<div style="padding: 16px;">自定义表单元素</div>'
});
}else if(obj.event === 'set_top'){
let obj_name;
try{
obj_name = obj.data.api.match(/rule=(.*)/)[1].split('&')[0];
}catch (e){
obj_name = obj.data.key;
}
console.log(obj);
let params = {"names":[obj_name].join(',')};
console.log(params);
$.post("/admin/rule_order/0",params,function(res,status){
console.log(res);
if(res.code === 200){
data.order = 0;
obj.update({
order: data.order
});
layer.msg('已置顶');
}else{
console.log('修改失败了...');
layer.msg('置顶失败,具体错误看日志');
return false
}
});
}
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册