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

升级至 v3.9.17

上级 cad9b936
无法预览此类型文件
...@@ -145,6 +145,28 @@ def admin_rule_state(state=0): # 管理员修改规则状态 ...@@ -145,6 +145,28 @@ def admin_rule_state(state=0): # 管理员修改规则状态
return R.success(f'修改成功,服务器反馈信息为:{success_list}') 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') @admin.route('/force_update')
def admin_force_update(): def admin_force_update():
if not verfy_token(): if not verfy_token():
......
...@@ -210,6 +210,7 @@ def merged_hide(merged_config): ...@@ -210,6 +210,7 @@ def merged_hide(merged_config):
@home.route('/config/<int:mode>') @home.route('/config/<int:mode>')
def config_render(mode): def config_render(mode):
# print(dict(app.config)) # print(dict(app.config))
tt = time()
UA = request.headers['User-Agent'] UA = request.headers['User-Agent']
ISTVB = 'okhttp/3' in UA ISTVB = 'okhttp/3' in UA
logger.info(UA) logger.info(UA)
...@@ -244,15 +245,46 @@ def config_render(mode): ...@@ -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) 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) merged_config = custom_merge(parseText(html),customConfig)
# print(merged_config['sites']) # print(merged_config['sites'])
merged_hide(merged_config) merged_hide(merged_config)
# response = make_response(html) # response = make_response(html)
# print(len(merged_config['sites'])) # 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(json.dumps(merged_config,ensure_ascii=False,indent=1))
# response = make_response(str(merged_config)) # response = make_response(str(merged_config))
response.headers['Content-Type'] = 'application/json; charset=utf-8' response.headers['Content-Type'] = 'application/json; charset=utf-8'
logger.info(f'自动生成动态配置共计耗时:{get_interval(tt)}毫秒')
return response 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') @home.route('/configs')
def config_gen(): def config_gen():
# 生成文件 # 生成文件
...@@ -285,12 +317,14 @@ def config_gen(): ...@@ -285,12 +317,14 @@ def config_gen():
customConfig = getCustonDict(host0,ali_token) customConfig = getCustonDict(host0,ali_token)
set_dict = custom_merge(parseText(set_local), customConfig) set_dict = custom_merge(parseText(set_local), customConfig)
merged_hide(set_dict) merged_hide(set_dict)
set_dict['sites'] = sort_sites_by_order(set_dict['sites'], js_mode)
# set_dict = json.loads(set_local) # set_dict = json.loads(set_local)
f.write(json.dumps(set_dict,ensure_ascii=False,indent=4)) f.write(json.dumps(set_dict,ensure_ascii=False,indent=4))
with open('txt/pycms1.json','w+',encoding='utf-8') as f: with open('txt/pycms1.json','w+',encoding='utf-8') as f:
customConfig = getCustonDict(host1,ali_token) customConfig = getCustonDict(host1,ali_token)
set_dict = custom_merge(parseText(set_area), customConfig) set_dict = custom_merge(parseText(set_area), customConfig)
merged_hide(set_dict) merged_hide(set_dict)
set_dict['sites'] = sort_sites_by_order(set_dict['sites'], js_mode)
# set_dict = json.loads(set_area) # set_dict = json.loads(set_area)
f.write(json.dumps(set_dict,ensure_ascii=False,indent=4)) f.write(json.dumps(set_dict,ensure_ascii=False,indent=4))
...@@ -298,6 +332,7 @@ def config_gen(): ...@@ -298,6 +332,7 @@ def config_gen():
customConfig = getCustonDict(host2,ali_token) customConfig = getCustonDict(host2,ali_token)
set_dict = custom_merge(parseText(set_online), customConfig) set_dict = custom_merge(parseText(set_online), customConfig)
merged_hide(set_dict) merged_hide(set_dict)
set_dict['sites'] = sort_sites_by_order(set_dict['sites'], js_mode)
# set_dict = json.loads(set_online) # set_dict = json.loads(set_online)
f.write(json.dumps(set_dict,ensure_ascii=False,indent=4)) 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)] files = [os.path.abspath(rf'txt\pycms{i}.json') for i in range(3)]
......
...@@ -44,7 +44,9 @@ def layui_rule_list(): ...@@ -44,7 +44,9 @@ def layui_rule_list():
# print(pys) # print(pys)
alists = [] alists = []
live_url = [] 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) alists_str='[]', live_url=live_url, config=new_conf)
merged_config = custom_merge(parseText(html), customConfig) merged_config = custom_merge(parseText(html), customConfig)
sites = merged_config['sites'] sites = merged_config['sites']
...@@ -52,7 +54,8 @@ def layui_rule_list(): ...@@ -52,7 +54,8 @@ def layui_rule_list():
rule_list = rules.query_all() rule_list = rules.query_all()
rule_names = list(map(lambda x:x['name'],rule_list)) rule_names = list(map(lambda x:x['name'],rule_list))
# print(rule_list) # print(rule_list)
# print(rule_names) print(rule_names)
# print(sites)
for i in range(len(sites)): for i in range(len(sites)):
sites[i]['id'] = i+1 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'] 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(): ...@@ -66,6 +69,7 @@ def layui_rule_list():
sites[i]['order'] = 0 sites[i]['order'] = 0
sites[i]['site_name'] = site_name sites[i]['site_name'] = site_name
sites.sort(key=lambda x:x['order'],reverse=False)
new_sites = sites[(page-1)*limit:page*limit] new_sites = sites[(page-1)*limit:page*limit]
# print(new_sites) # print(new_sites)
return layuiBack('获取成功',new_sites,count=len(sites)) return layuiBack('获取成功',new_sites,count=len(sites))
...@@ -109,6 +109,22 @@ class rules_service(object): ...@@ -109,6 +109,22 @@ class rules_service(object):
print(f'发生了错误:{e}') print(f'发生了错误:{e}')
return None 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 @staticmethod
def getHideRules(): def getHideRules():
res = RuleClass.query.filter(RuleClass.state == 0).all() res = RuleClass.query.filter(RuleClass.state == 0).all()
......
...@@ -18,7 +18,7 @@ from base.database import db ...@@ -18,7 +18,7 @@ from base.database import db
from models.ruleclass import RuleClass from models.ruleclass import RuleClass
from models.playparse import PlayParse from models.playparse import PlayParse
from js.rules import getRules 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 concurrent.futures import ThreadPoolExecutor,as_completed,thread # 引入线程池
from quickjs import Function,Context from quickjs import Function,Context
import ujson import ujson
...@@ -116,6 +116,25 @@ def multi_search2(wd): ...@@ -116,6 +116,25 @@ def multi_search2(wd):
return jsonify(result) 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): def multi_search(wd):
lsg = storage_service() lsg = storage_service()
t1 = time() t1 = time()
...@@ -128,31 +147,35 @@ def multi_search(wd): ...@@ -128,31 +147,35 @@ def multi_search(wd):
rules_exclude = ['drpy'] rules_exclude = ['drpy']
new_rules = list(filter(lambda x: x.get('searchable', 0) and x.get('name', '') not in rules_exclude, rules)) 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] search_sites = [new_rule['name'] for new_rule in new_rules]
# print(search_sites)
nosearch_sites = set(rule_names) ^ set(search_sites) nosearch_sites = set(rule_names) ^ set(search_sites)
nosearch_sites.remove('drpy') nosearch_sites.remove('drpy')
# print(nosearch_sites) # print(nosearch_sites)
logger.info(f'开始聚搜{wd},共计{len(search_sites)}个规则,聚搜超时{timeout}秒') logger.info(f'开始聚搜{wd},共计{len(search_sites)}个规则,聚搜超时{timeout}秒')
logger.info(f'不支持聚搜的规则,共计{len(nosearch_sites)}个规则:{",".join(nosearch_sites)}') logger.info(f'不支持聚搜的规则,共计{len(nosearch_sites)}个规则:{",".join(nosearch_sites)}')
search_sites = merged_hide(search_sites)
# print(search_sites) # print(search_sites)
# search_sites = []
res = [] res = []
with open('js/模板.js', encoding='utf-8') as f: if len(search_sites) > 0:
before = f.read().split('export')[0] with open('js/模板.js', encoding='utf-8') as f:
with ThreadPoolExecutor(max_workers=len(search_sites)) as executor: before = f.read().split('export')[0]
to_do = [] with ThreadPoolExecutor(max_workers=len(search_sites)) as executor:
for site in search_sites: to_do = []
future = executor.submit(search_one, site, wd, before) for site in search_sites:
to_do.append(future) future = executor.submit(search_one, site, wd, before)
try: to_do.append(future)
for future in as_completed(to_do, timeout=timeout): # 并发执行 try:
ret = future.result() for future in as_completed(to_do, timeout=timeout): # 并发执行
# print(ret) ret = future.result()
if ret and isinstance(ret,dict) and ret.get('list'): # print(ret)
res.extend(ret['list']) if ret and isinstance(ret,dict) and ret.get('list'):
except Exception as e: res.extend(ret['list'])
print(f'发生错误:{e}') except Exception as e:
import atexit print(f'发生错误:{e}')
atexit.unregister(thread._python_exit) import atexit
executor.shutdown = lambda wait: None atexit.unregister(thread._python_exit)
executor.shutdown = lambda wait: None
logger.info(f'drpy聚搜{len(search_sites)}个源共计耗时{get_interval(t1)}毫秒') logger.info(f'drpy聚搜{len(search_sites)}个源共计耗时{get_interval(t1)}毫秒')
return jsonify({ return jsonify({
"list": res "list": res
......
3.9.16beta1 3.9.17
\ No newline at end of file \ No newline at end of file
...@@ -47,6 +47,10 @@ ...@@ -47,6 +47,10 @@
[dockerfile教程](https://blog.csdn.net/qq_46158060/article/details/125718218) [dockerfile教程](https://blog.csdn.net/qq_46158060/article/details/125718218)
[获取本地设备信息](https://blog.csdn.net/cui_yonghua/article/details/125508991) [获取本地设备信息](https://blog.csdn.net/cui_yonghua/article/details/125508991)
[获取本地设备信息](https://m.jb51.net/article/140716.htm) [获取本地设备信息](https://m.jb51.net/article/140716.htm)
###### 2022/10/24
- [X] v3.9.17
- [X] drpy(道长) 服务端聚搜支持自动排除未来功能里隐藏的源
- [X] 未来功能增加源置顶和置底功能 测试性增加排序功能(指定输入数字)
###### 2022/10/23 ###### 2022/10/23
- [X] 新增几个源 包括虎牙直播 - [X] 新增几个源 包括虎牙直播
- [X] 设置中心增加仙人模式开关(自动识别不同设备返回不同的drpy接口,关闭的话只会走drpy.min.js) - [X] 设置中心增加仙人模式开关(自动识别不同设备返回不同的drpy接口,关闭的话只会走drpy.min.js)
......
...@@ -48,7 +48,8 @@ ...@@ -48,7 +48,8 @@
</script> </script>
<script type="text/html" id="barDemo"> <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> <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">隐藏</a>
</script> </script>
...@@ -96,6 +97,34 @@ layui.use(['table', 'dropdown'], function(){ ...@@ -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({ table.render({
elem: '#test' elem: '#test'
...@@ -111,11 +140,11 @@ layui.use(['table', 'dropdown'], function(){ ...@@ -111,11 +140,11 @@ layui.use(['table', 'dropdown'], function(){
// ,totalRow: true // 开启合计行 // ,totalRow: true // 开启合计行
,page: true ,page: true
,limit:12 ,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: [[ ,cols: [[
{type: 'checkbox', fixed: 'left'} {type: 'checkbox', fixed: 'left'}
// ,{field: 'id', fixed: 'left',title: 'ID', width: 20, sort: true,totalRowText: '合计:'} // ,{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: 'site_name', title: '存储名称', width: 120}
, { , {
field: 'state', title: '显示状态', minWidth: 100, templet: function (res) { field: 'state', title: '显示状态', minWidth: 100, templet: function (res) {
...@@ -219,20 +248,34 @@ layui.use(['table', 'dropdown'], function(){ ...@@ -219,20 +248,34 @@ layui.use(['table', 'dropdown'], function(){
elem: '#moreTest' //可绑定在任意元素中,此处以上述按钮为例 elem: '#moreTest' //可绑定在任意元素中,此处以上述按钮为例
,data: [{ ,data: [{
id: 'show', id: 'show',
title: '显示' title: '🟢显示'
},{ },{
id: 'hide', id: 'hide',
title: '隐藏' title: '🔴隐藏'
},{ },
id: 'add', {
title: '添加' id:'set_top',
},{ title: '⬆️置顶',
id: 'update', },
title: '编辑' {
},{ id:'set_order_number',
id: 'delete', title: '↕️指定序号',
title: '删除' },
}] {
id:'set_bottom',
title: '⬇️置底',
},
// {
// id: 'add',
// title: '添加'
// },{
// id: 'update',
// title: '编辑'
// },{
// id: 'delete',
// title: '删除'
// }
]
//菜单被点击的事件 //菜单被点击的事件
,click: function(obj){ ,click: function(obj){
var checkStatus = table.checkStatus(id) var checkStatus = table.checkStatus(id)
...@@ -244,7 +287,35 @@ layui.use(['table', 'dropdown'], function(){ ...@@ -244,7 +287,35 @@ layui.use(['table', 'dropdown'], function(){
break; break;
case 'hide': case 'hide':
// console.log(obj); // 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; break;
case 'add': case 'add':
layer.open({ layer.open({
...@@ -360,6 +431,30 @@ layui.use(['table', 'dropdown'], function(){ ...@@ -360,6 +431,30 @@ layui.use(['table', 'dropdown'], function(){
area: ['80%','80%'], area: ['80%','80%'],
content: '<div style="padding: 16px;">自定义表单元素</div>' 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.
先完成此消息的编辑!
想要评论请 注册