diff --git a/app/run.py b/app/run.py index 948ff61..da72cf6 100644 --- a/app/run.py +++ b/app/run.py @@ -15,8 +15,10 @@ from flask import ( from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.cron import CronTrigger import subprocess +import requests import hashlib import logging +import base64 import json import sys import os @@ -139,7 +141,9 @@ def logout(): def index(): if not is_login(): return redirect(url_for("login")) - return render_template("index.html", version=app.config["APP_VERSION"], plugin_flags=PLUGIN_FLAGS) + return render_template( + "index.html", version=app.config["APP_VERSION"], plugin_flags=PLUGIN_FLAGS + ) # 获取配置数据 @@ -212,6 +216,21 @@ def run_script_now(): ) +@app.route("/task_suggestions") +def get_task_suggestions(): + if not is_login(): + return jsonify({"error": "未登录"}) + base_url = base64.b64decode("aHR0cHM6Ly9zLjkxNzc4OC54eXo=").decode() + query = request.args.get("q", "").lower() + deep = request.args.get("d", "").lower() + url = f"{base_url}/task_suggestions?q={query}&d={deep}" + try: + response = requests.get(url) + return jsonify(response.json()) + except Exception as e: + return jsonify({"error": str(e)}) + + @app.route("/get_share_detail") def get_share_files(): if not is_login(): diff --git a/app/templates/index.html b/app/templates/index.html index 860e5ef..9334c16 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -176,10 +176,23 @@
- -
+ + +
+
- +
@@ -413,6 +426,10 @@ index: null, savepath: "", origin_savepath: "", + taskSuggestions: [], + showSuggestions: false, + lastSuggestionsTime: 0, + isSearching: false, }, }, filters: { @@ -436,6 +453,11 @@ this.checkNewVersion(); $('[data-toggle="tooltip"]').tooltip(); document.addEventListener('keydown', this.handleKeyDown); + document.addEventListener('click', (e) => { + if (!e.target.closest('.input-group')) { + this.smart_param.showSuggestions = false; + } + }); }, methods: { checkNewVersion() { @@ -537,7 +559,7 @@ focusTaskname(index, task) { this.smart_param.index = index this.smart_param.origin_savepath = task.savepath - regex = new RegExp(`/${task.taskname}(/|$)`) + regex = new RegExp(`/${task.taskname.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(/|$)`) if (task.savepath.includes('TASKNAME')) { this.smart_param.savepath = task.savepath; } else if (task.savepath.match(regex)) { @@ -546,7 +568,8 @@ this.smart_param.savepath = undefined; } }, - changeTaskname(task) { + changeTaskname(index, task) { + this.searchSuggestions(index, task.taskname, 500); if (this.smart_param.savepath) task.savepath = this.smart_param.savepath.replace('TASKNAME', task.taskname); }, @@ -690,7 +713,41 @@ } else { task.runweek = [1, 2, 3, 4, 5, 6, 7]; } - } + }, + searchSuggestions(index, taskname, limit_msec = 0) { + if (taskname.length == 0) + return + if (limit_msec > 0) { + const now = Date.now(); + if (now - this.smart_param.lastSuggestionsTime < limit_msec) + return; + this.smart_param.lastSuggestionsTime = now; + } + this.smart_param.isSearching = true + axios.get('/task_suggestions', { + params: { + q: taskname, + d: limit_msec == 0 ? 1 : 0 + } + }).then(response => { + this.smart_param.taskSuggestions = response.data; + this.smart_param.index = index; + this.showSuggestions = true; + }).catch(error => { + console.error('Error fetching suggestions:', error); + }).finally(() => { + this.smart_param.isSearching = false; + }); + }, + selectSuggestion(task, suggestion) { + task.taskname = suggestion.taskname; + task.shareurl = suggestion.shareurl; + if (this.smart_param.savepath) + task.savepath = this.smart_param.savepath.replace('TASKNAME', task.taskname); + this.changeShareurl(task); + this.smart_param.showSuggestions = false; + this.smart_param.index = null; + }, } });