完成饭菜规划功能
This commit is contained in:
Binary file not shown.
111
logs/app.log
111
logs/app.log
@@ -227,3 +227,114 @@ werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'favori
|
||||
2025-09-07 22:48:23,084 ERROR: LLM API调用失败: [Errno 5] Input/output error [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/routes.py:76]
|
||||
2025-09-07 22:56:52,213 ERROR: LLM API调用失败: [Errno 5] Input/output error [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/routes.py:76]
|
||||
2025-09-07 22:59:46,172 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-07 23:14:14,284 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-07 23:48:01,891 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-07 23:56:48,923 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 00:07:28,253 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 00:09:04,523 ERROR: 生成饭菜规划时出错: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:87]
|
||||
2025-09-08 00:09:04,532 ERROR: API调用失败: 饭菜规划生成失败: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:145]
|
||||
2025-09-08 00:18:24,943 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 00:20:05,097 ERROR: 生成饭菜规划时出错: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:87]
|
||||
2025-09-08 00:20:05,108 ERROR: API调用失败: 饭菜规划生成失败: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:145]
|
||||
2025-09-08 00:24:50,917 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 07:18:02,328 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 07:19:52,507 ERROR: 生成饭菜规划时出错: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:87]
|
||||
2025-09-08 07:19:52,510 ERROR: API调用失败: 饭菜规划生成失败: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:145]
|
||||
2025-09-08 07:22:41,781 ERROR: 生成饭菜规划时出错: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:87]
|
||||
2025-09-08 07:22:41,781 ERROR: API调用失败: 饭菜规划生成失败: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:145]
|
||||
2025-09-08 07:28:46,017 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 07:30:57,894 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 07:35:59,589 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 07:37:07,801 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 07:50:44,232 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 07:51:26,972 ERROR: Exception on /meal-planning/history [GET] [in /home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py:875]
|
||||
Traceback (most recent call last):
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 1511, in wsgi_app
|
||||
response = self.full_dispatch_request()
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 919, in full_dispatch_request
|
||||
rv = self.handle_user_exception(e)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask_cors/extension.py", line 176, in wrapped_function
|
||||
return cors_after_request(app.make_response(f(*args, **kwargs)))
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
|
||||
rv = self.dispatch_request()
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
|
||||
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py", line 91, in meal_planning_history
|
||||
return render_template('meal_planning_history.html')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/templating.py", line 150, in render_template
|
||||
return _render(app, template, context)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/templating.py", line 131, in _render
|
||||
rv = template.render(context)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/jinja2/environment.py", line 1295, in render
|
||||
self.environment.handle_exception()
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/jinja2/environment.py", line 942, in handle_exception
|
||||
raise rewrite_traceback_stack(source=source)
|
||||
File "/home/renjianbo/aitsc/src/flask_prompt_master/templates/meal_planning_history.html", line 319, in top-level template code
|
||||
<a class="navbar-brand" href="{{ url_for('index') }}">
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for
|
||||
return self.handle_url_build_error(error, endpoint, values)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for
|
||||
rv = url_adapter.build( # type: ignore[union-attr]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build
|
||||
raise BuildError(endpoint, values, method, self)
|
||||
werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'index'. Did you mean 'main.index' instead?
|
||||
2025-09-08 07:52:06,776 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 07:52:12,623 ERROR: Exception on /meal-planning/history [GET] [in /home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py:875]
|
||||
Traceback (most recent call last):
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 1511, in wsgi_app
|
||||
response = self.full_dispatch_request()
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 919, in full_dispatch_request
|
||||
rv = self.handle_user_exception(e)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask_cors/extension.py", line 176, in wrapped_function
|
||||
return cors_after_request(app.make_response(f(*args, **kwargs)))
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
|
||||
rv = self.dispatch_request()
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
|
||||
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py", line 91, in meal_planning_history
|
||||
return render_template('meal_planning_history.html')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/templating.py", line 150, in render_template
|
||||
return _render(app, template, context)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/templating.py", line 131, in _render
|
||||
rv = template.render(context)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/jinja2/environment.py", line 1295, in render
|
||||
self.environment.handle_exception()
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/jinja2/environment.py", line 942, in handle_exception
|
||||
raise rewrite_traceback_stack(source=source)
|
||||
File "/home/renjianbo/aitsc/src/flask_prompt_master/templates/meal_planning_history.html", line 347, in top-level template code
|
||||
<a href="{{ url_for('favorites') }}" class="nav-link">
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 1121, in url_for
|
||||
return self.handle_url_build_error(error, endpoint, values)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/flask/app.py", line 1110, in url_for
|
||||
rv = url_adapter.build( # type: ignore[union-attr]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/renjianbo/miniconda3/envs/myenv/lib/python3.12/site-packages/werkzeug/routing/map.py", line 924, in build
|
||||
raise BuildError(endpoint, values, method, self)
|
||||
werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'favorites'. Did you mean 'favorites.add_favorite' instead?
|
||||
2025-09-08 07:53:06,694 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 07:59:21,158 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 08:01:01,400 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
2025-09-08 08:01:49,955 ERROR: 生成饭菜规划时出错: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:93]
|
||||
2025-09-08 08:01:49,968 ERROR: API调用失败: 饭菜规划生成失败: Request timed out. [in /home/renjianbo/aitsc/src/flask_prompt_master/routes/meal_planning.py:156]
|
||||
2025-09-08 08:03:01,032 INFO: 应用启动 [in /home/renjianbo/aitsc/config/base.py:82]
|
||||
|
||||
@@ -1 +1 @@
|
||||
28451
|
||||
24437
|
||||
|
||||
@@ -305,3 +305,231 @@
|
||||
123.139.41.108 - - [07/Sep/2025:23:02:59 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 4969
|
||||
123.139.41.108 - - [07/Sep/2025:23:04:45 +0800] "POST / HTTP/1.1" 200 54818 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 32104951
|
||||
123.139.41.108 - - [07/Sep/2025:23:04:45 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1057
|
||||
123.139.41.108 - - [07/Sep/2025:23:05:58 +0800] "GET /admin/ HTTP/1.1" 200 38183 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 145602
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:02 +0800] "GET /admin/admin_user/ HTTP/1.1" 200 36361 "http://101.43.95.130:5002/admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 305706
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:02 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1739
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:02 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1084
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:02 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1747
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:04 +0800] "GET /admin/admin_template/ HTTP/1.1" 200 33865 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 191515
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:04 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5749
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:04 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1040
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:04 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1673
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:06 +0800] "GET /admin/admin_prompt/ HTTP/1.1" 200 90763 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 522682
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:06 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1029
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:06 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1562
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:06 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 819
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:07 +0800] "GET /admin/admin_template/ HTTP/1.1" 200 33865 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 316517
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:07 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1084
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:07 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1126
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:07 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1115
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:19 +0800] "GET /admin/admin_template/new/?url=/admin/admin_template/ HTTP/1.1" 200 27203 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 501211
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:19 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/new/?url=/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1087
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:19 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/new/?url=/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1166
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:19 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/new/?url=/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1236
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:28 +0800] "GET /admin/admin_prompt/ HTTP/1.1" 200 90763 "http://101.43.95.130:5002/admin/admin_template/new/?url=/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 250603
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:28 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1050
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:28 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 987
|
||||
123.139.41.108 - - [07/Sep/2025:23:06:28 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 971
|
||||
123.139.41.108 - - [07/Sep/2025:23:07:44 +0800] "GET /admin/admin_template/ HTTP/1.1" 200 33865 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 253724
|
||||
123.139.41.108 - - [07/Sep/2025:23:07:45 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1801
|
||||
123.139.41.108 - - [07/Sep/2025:23:07:45 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 976
|
||||
123.139.41.108 - - [07/Sep/2025:23:07:45 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 816
|
||||
123.139.41.108 - - [07/Sep/2025:23:07:53 +0800] "GET /admin/admin_prompt/ HTTP/1.1" 200 90763 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 371771
|
||||
123.139.41.108 - - [07/Sep/2025:23:07:53 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1030
|
||||
123.139.41.108 - - [07/Sep/2025:23:07:53 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1037
|
||||
123.139.41.108 - - [07/Sep/2025:23:07:53 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1256
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:11 +0800] "GET /a HTTP/1.1" 404 207 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1034
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:14 +0800] "GET / HTTP/1.1" 200 49396 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 281719
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:14 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 809
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:18 +0800] "GET /profile HTTP/1.1" 200 27265 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 139720
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:18 +0800] "GET /static/images/default-avatar.png HTTP/1.1" 404 207 "http://101.43.95.130:5002/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1399
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:18 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 828
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:18 +0800] "GET /api/profile HTTP/1.1" 200 185 "http://101.43.95.130:5002/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 110992
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:18 +0800] "GET /api/profile/stats HTTP/1.1" 200 103 "http://101.43.95.130:5002/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 179120
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:33 +0800] "GET /favorites HTTP/1.1" 200 22739 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 100436
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:33 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 832
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:34 +0800] "GET /api/favorites/stats HTTP/1.1" 200 4283 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 164752
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:34 +0800] "GET /api/favorites?page=1&per_page=10&search=&category=all HTTP/1.1" 200 4269 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 248717
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:51 +0800] "GET / HTTP/1.1" 200 49396 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 162216
|
||||
123.139.41.108 - - [07/Sep/2025:23:08:52 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 810
|
||||
127.0.0.1 - - [07/Sep/2025:23:14:20 +0800] "GET /meal-planning HTTP/1.1" 200 24135 "-" "curl/7.29.0" 18139
|
||||
127.0.0.1 - - [07/Sep/2025:23:14:33 +0800] "GET /meal-planning HTTP/1.1" 200 24135 "-" "curl/7.29.0" 1170
|
||||
127.0.0.1 - - [07/Sep/2025:23:16:39 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 10481 "-" "curl/7.29.0" 100561370
|
||||
127.0.0.1 - - [07/Sep/2025:23:17:42 +0800] "GET /meal-planning HTTP/1.1" 200 24135 "-" "curl/7.29.0" 1016
|
||||
127.0.0.1 - - [07/Sep/2025:23:17:52 +0800] "GET / HTTP/1.1" 200 49561 "-" "curl/7.29.0" 435135
|
||||
123.139.41.108 - - [07/Sep/2025:23:18:38 +0800] "GET / HTTP/1.1" 200 49561 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 507553
|
||||
123.139.41.108 - - [07/Sep/2025:23:18:38 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1136
|
||||
123.139.41.108 - - [07/Sep/2025:23:18:40 +0800] "GET /meal-planning HTTP/1.1" 200 24135 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 107216
|
||||
123.139.41.108 - - [07/Sep/2025:23:18:40 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 6712
|
||||
123.139.41.108 - - [07/Sep/2025:23:20:20 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 7010 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 63594865
|
||||
123.139.41.108 - - [07/Sep/2025:23:22:12 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 10727 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 101483310
|
||||
123.139.41.108 - - [07/Sep/2025:23:24:23 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 8332 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 77885008
|
||||
127.0.0.1 - - [07/Sep/2025:23:26:31 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 9625 "-" "curl/7.29.0" 87269660
|
||||
127.0.0.1 - - [07/Sep/2025:23:34:58 +0800] "GET / HTTP/1.1" 200 49561 "-" "curl/7.29.0" 419196
|
||||
123.139.41.108 - - [07/Sep/2025:23:37:10 +0800] "GET / HTTP/1.1" 200 49561 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 316900
|
||||
123.139.41.108 - - [07/Sep/2025:23:37:10 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 837
|
||||
123.139.41.108 - - [07/Sep/2025:23:37:14 +0800] "GET /favorites HTTP/1.1" 200 22904 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 109027
|
||||
123.139.41.108 - - [07/Sep/2025:23:37:14 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 819
|
||||
123.139.41.108 - - [07/Sep/2025:23:37:14 +0800] "GET /api/favorites/stats HTTP/1.1" 200 4283 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 171684
|
||||
123.139.41.108 - - [07/Sep/2025:23:37:14 +0800] "GET /api/favorites?page=1&per_page=10&search=&category=all HTTP/1.1" 200 4269 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 474594
|
||||
123.139.41.108 - - [07/Sep/2025:23:37:51 +0800] "GET /meal-planning HTTP/1.1" 200 24135 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 108597
|
||||
123.139.41.108 - - [07/Sep/2025:23:37:51 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 993
|
||||
123.139.41.108 - - [07/Sep/2025:23:38:04 +0800] "GET /favorites HTTP/1.1" 200 22904 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 111552
|
||||
123.139.41.108 - - [07/Sep/2025:23:38:04 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 848
|
||||
123.139.41.108 - - [07/Sep/2025:23:38:05 +0800] "GET /api/favorites?page=1&per_page=10&search=&category=all HTTP/1.1" 200 4269 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 136568
|
||||
123.139.41.108 - - [07/Sep/2025:23:38:05 +0800] "GET /api/favorites/stats HTTP/1.1" 200 4283 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 156318
|
||||
123.139.41.108 - - [07/Sep/2025:23:48:08 +0800] "GET / HTTP/1.1" 200 49561 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 502524
|
||||
123.139.41.108 - - [07/Sep/2025:23:48:08 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5130
|
||||
123.139.41.108 - - [07/Sep/2025:23:48:52 +0800] "GET /meal-planning HTTP/1.1" 200 24135 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 107363
|
||||
123.139.41.108 - - [07/Sep/2025:23:48:52 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1015
|
||||
123.139.41.108 - - [07/Sep/2025:23:51:11 +0800] "POST /api/meal-planning/generate HTTP/1.1" 500 0 "-" "-" 32568
|
||||
123.139.41.108 - - [07/Sep/2025:23:53:46 +0800] "POST /api/meal-planning/generate HTTP/1.1" 500 0 "-" "-" 4697
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:29 +0800] "GET /admin/ HTTP/1.1" 200 38183 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 474651
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:46 +0800] "GET /admin/admin_template/ HTTP/1.1" 200 33865 "http://101.43.95.130:5002/admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 451715
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:46 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1896
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:46 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 2144
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:46 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5894
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:48 +0800] "GET /admin/admin_prompt/ HTTP/1.1" 200 90763 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 685979
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:48 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1092
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:48 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1139
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:48 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 810
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:50 +0800] "GET /admin/analytics_admin/ HTTP/1.1" 200 37310 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 709788
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:51 +0800] "GET /admin/backup_admin/ HTTP/1.1" 200 38122 "http://101.43.95.130:5002/admin/analytics_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 139662
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:52 +0800] "GET /admin/batch_admin/ HTTP/1.1" 200 34207 "http://101.43.95.130:5002/admin/backup_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 129716
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:53 +0800] "GET /admin/admin_template/ HTTP/1.1" 200 33865 "http://101.43.95.130:5002/admin/batch_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 185734
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:53 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1197
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:53 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1222
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:53 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 977
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:54 +0800] "GET /admin/admin_user/ HTTP/1.1" 200 36361 "http://101.43.95.130:5002/admin/admin_template/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 289710
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:54 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1035
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:54 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1343
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:54 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1892
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:55 +0800] "GET /admin/ HTTP/1.1" 200 38183 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 141713
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:58 +0800] "GET /admin/monitor_admin/ HTTP/1.1" 200 38878 "http://101.43.95.130:5002/admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1147700
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:59 +0800] "GET /admin/monitor_admin/api/system-status HTTP/1.1" 200 314 "http://101.43.95.130:5002/admin/monitor_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1106422
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:59 +0800] "GET /admin/monitor_admin/api/alerts HTTP/1.1" 200 27 "http://101.43.95.130:5002/admin/monitor_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 109470
|
||||
123.139.41.108 - - [07/Sep/2025:23:54:59 +0800] "GET /admin/backup_admin/ HTTP/1.1" 200 38122 "http://101.43.95.130:5002/admin/monitor_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 142163
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:03 +0800] "GET /admin/report_admin/ HTTP/1.1" 200 34773 "http://101.43.95.130:5002/admin/backup_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 139841
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:04 +0800] "GET /admin/batch_admin/ HTTP/1.1" 200 34207 "http://101.43.95.130:5002/admin/report_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 141444
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:06 +0800] "GET /admin/monitor_admin/ HTTP/1.1" 200 38879 "http://101.43.95.130:5002/admin/batch_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1147569
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:07 +0800] "GET /admin/monitor_admin/api/system-status HTTP/1.1" 200 315 "http://101.43.95.130:5002/admin/monitor_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1105576
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:08 +0800] "GET /admin/analytics_admin/ HTTP/1.1" 200 37310 "http://101.43.95.130:5002/admin/monitor_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 433007
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:08 +0800] "GET /admin/monitor_admin/api/alerts HTTP/1.1" 200 27 "http://101.43.95.130:5002/admin/monitor_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 109649
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:08 +0800] "GET /admin/admin_prompt/ HTTP/1.1" 200 90763 "http://101.43.95.130:5002/admin/analytics_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 246742
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:08 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 2369
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:08 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1490
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:08 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1331
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:12 +0800] "GET / HTTP/1.1" 200 49561 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 175232
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:12 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1099
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:17 +0800] "GET /meal-planning HTTP/1.1" 200 24135 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 112125
|
||||
123.139.41.108 - - [07/Sep/2025:23:55:17 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 847
|
||||
123.139.41.108 - - [07/Sep/2025:23:58:37 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 435860
|
||||
123.139.41.108 - - [07/Sep/2025:23:58:37 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 6744
|
||||
123.139.41.108 - - [08/Sep/2025:00:00:55 +0800] "POST /api/meal-planning/generate HTTP/1.1" 500 0 "-" "-" 6578
|
||||
127.0.0.1 - - [08/Sep/2025:00:02:46 +0800] "POST /api/meal-planning/generate HTTP/1.1" 500 0 "-" "-" 4538
|
||||
127.0.0.1 - - [08/Sep/2025:00:09:04 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 125 "-" "curl/7.29.0" 91953454
|
||||
123.139.41.108 - - [08/Sep/2025:00:20:05 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 125 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 92087138
|
||||
123.139.41.108 - - [08/Sep/2025:00:24:54 +0800] "GET /favorites HTTP/1.1" 200 22904 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 484672
|
||||
123.139.41.108 - - [08/Sep/2025:00:24:54 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5102
|
||||
123.139.41.108 - - [08/Sep/2025:00:24:55 +0800] "GET /api/favorites?page=1&per_page=10&search=&category=all HTTP/1.1" 200 4269 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 500599
|
||||
123.139.41.108 - - [08/Sep/2025:00:24:55 +0800] "GET /api/favorites/stats HTTP/1.1" 200 4283 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 531173
|
||||
123.139.41.108 - - [08/Sep/2025:00:24:57 +0800] "GET / HTTP/1.1" 200 49561 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 207702
|
||||
123.139.41.108 - - [08/Sep/2025:00:24:57 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1133
|
||||
123.139.41.108 - - [08/Sep/2025:00:24:57 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 128377
|
||||
123.139.41.108 - - [08/Sep/2025:00:24:57 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 900
|
||||
150.138.78.253 - - [08/Sep/2025:06:42:31 +0800] "GET / HTTP/1.1" 200 49561 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" 516976
|
||||
150.138.78.253 - - [08/Sep/2025:06:42:32 +0800] "GET /favicon.ico HTTP/1.1" 404 207 "-" "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11" 4475
|
||||
123.139.94.173 - - [08/Sep/2025:07:18:10 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 432528
|
||||
123.139.94.173 - - [08/Sep/2025:07:18:10 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 4931
|
||||
123.139.94.173 - - [08/Sep/2025:07:19:52 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 125 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 91949275
|
||||
127.0.0.1 - - [08/Sep/2025:07:20:54 +0800] "GET / HTTP/1.1" 200 49561 "-" "curl/7.29.0" 456681
|
||||
127.0.0.1 - - [08/Sep/2025:07:22:41 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 125 "-" "curl/7.29.0" 91881489
|
||||
127.0.0.1 - - [08/Sep/2025:07:29:08 +0800] "GET / HTTP/1.1" 200 49561 "-" "curl/7.29.0" 464663
|
||||
123.139.94.173 - - [08/Sep/2025:07:29:10 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 111019
|
||||
123.139.94.173 - - [08/Sep/2025:07:29:10 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 4849
|
||||
123.139.94.173 - - [08/Sep/2025:07:30:20 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 2544 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 61644385
|
||||
127.0.0.1 - - [08/Sep/2025:07:30:30 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 2437 "-" "curl/7.29.0" 61616274
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:20 +0800] "POST /api/meal-planning/save HTTP/1.1" 200 78 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5051
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:23 +0800] "POST /api/meal-planning/save HTTP/1.1" 200 78 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5779
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:27 +0800] "GET /favorites HTTP/1.1" 200 22904 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 413019
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:27 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 4966
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:27 +0800] "GET /api/favorites/stats HTTP/1.1" 200 4283 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 156998
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:28 +0800] "GET /api/favorites?page=1&per_page=10&search=&category=all HTTP/1.1" 200 4269 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 455743
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:31 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "http://101.43.95.130:5002/favorites" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 117180
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:31 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 771
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:35 +0800] "GET /profile HTTP/1.1" 200 27430 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 129668
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:35 +0800] "GET /static/images/default-avatar.png HTTP/1.1" 404 207 "http://101.43.95.130:5002/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1956
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:35 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 839
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:36 +0800] "GET /api/profile HTTP/1.1" 200 185 "http://101.43.95.130:5002/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 105061
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:36 +0800] "GET /api/profile/stats HTTP/1.1" 200 103 "http://101.43.95.130:5002/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 509681
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:37 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "http://101.43.95.130:5002/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 103193
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:37 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5029
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:38 +0800] "GET / HTTP/1.1" 200 49561 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 173696
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:39 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 836
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:39 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 121780
|
||||
123.139.94.173 - - [08/Sep/2025:07:31:39 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 834
|
||||
127.0.0.1 - - [08/Sep/2025:07:31:55 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 539 "-" "curl/7.29.0" 4961901
|
||||
127.0.0.1 - - [08/Sep/2025:07:32:18 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "-" "curl/7.29.0" 4379
|
||||
123.139.94.173 - - [08/Sep/2025:07:32:35 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 103044
|
||||
123.139.94.173 - - [08/Sep/2025:07:32:35 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 901
|
||||
123.139.94.173 - - [08/Sep/2025:07:32:37 +0800] "GET /meal-planning HTTP/1.1" 200 24820 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 103126
|
||||
123.139.94.173 - - [08/Sep/2025:07:32:37 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 763
|
||||
123.139.94.173 - - [08/Sep/2025:07:32:52 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 428 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 4158106
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:33 +0800] "GET /admin/ HTTP/1.1" 200 38183 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 156860
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:38 +0800] "GET /admin/admin_prompt/ HTTP/1.1" 200 90763 "http://101.43.95.130:5002/admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 355101
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:38 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1660
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:38 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1737
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:38 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 966
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:40 +0800] "GET /admin/admin_user/ HTTP/1.1" 200 36361 "http://101.43.95.130:5002/admin/admin_prompt/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 283576
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:40 +0800] "GET /admin/static/vendor/select2/select2.css?v=4.2.1 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1187
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:40 +0800] "GET /admin/static/vendor/select2/select2-bootstrap4.css?v=1.4.6 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1608
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:40 +0800] "GET /admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs4.css?v=1.3.22 HTTP/1.1" 304 0 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1017
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:42 +0800] "GET /admin/api_admin/ HTTP/1.1" 200 40361 "http://101.43.95.130:5002/admin/admin_user/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 433846
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:43 +0800] "GET /admin/api_admin/api/calls HTTP/1.1" 200 5226 "http://101.43.95.130:5002/admin/api_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 507633
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:44 +0800] "GET /admin/backup_admin/ HTTP/1.1" 200 38122 "http://101.43.95.130:5002/admin/api_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 131555
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:45 +0800] "GET /admin/report_admin/ HTTP/1.1" 200 34773 "http://101.43.95.130:5002/admin/backup_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 137728
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:47 +0800] "GET /admin/batch_admin/ HTTP/1.1" 200 34207 "http://101.43.95.130:5002/admin/report_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 131700
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:47 +0800] "GET /admin/monitor_admin/ HTTP/1.1" 200 38879 "http://101.43.95.130:5002/admin/report_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1484682
|
||||
123.139.94.173 - - [08/Sep/2025:07:33:48 +0800] "GET /admin/analytics_admin/ HTTP/1.1" 200 37309 "http://101.43.95.130:5002/admin/batch_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 464566
|
||||
127.0.0.1 - - [08/Sep/2025:07:36:04 +0800] "POST /api/meal-planning/save HTTP/1.1" 200 139 "-" "curl/7.29.0" 612937
|
||||
127.0.0.1 - - [08/Sep/2025:07:36:24 +0800] "GET /api/meal-planning/list HTTP/1.1" 200 676 "-" "curl/7.29.0" 178601
|
||||
127.0.0.1 - - [08/Sep/2025:07:36:31 +0800] "GET /api/meal-planning/1 HTTP/1.1" 200 607 "-" "curl/7.29.0" 144530
|
||||
127.0.0.1 - - [08/Sep/2025:07:37:13 +0800] "GET /meal-planning HTTP/1.1" 200 25423 "-" "curl/7.29.0" 16378
|
||||
127.0.0.1 - - [08/Sep/2025:07:37:37 +0800] "POST /api/meal-planning/save HTTP/1.1" 200 139 "-" "curl/7.29.0" 589911
|
||||
127.0.0.1 - - [08/Sep/2025:07:37:45 +0800] "GET /api/meal-planning/list HTTP/1.1" 200 1211 "-" "curl/7.29.0" 456758
|
||||
127.0.0.1 - - [08/Sep/2025:07:37:52 +0800] "DELETE /api/meal-planning/2 HTTP/1.1" 200 78 "-" "curl/7.29.0" 156340
|
||||
127.0.0.1 - - [08/Sep/2025:07:37:59 +0800] "GET /api/meal-planning/list HTTP/1.1" 200 676 "-" "curl/7.29.0" 147389
|
||||
123.139.94.173 - - [08/Sep/2025:07:38:32 +0800] "GET /meal-planning HTTP/1.1" 200 25423 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 440742
|
||||
123.139.94.173 - - [08/Sep/2025:07:38:32 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5024
|
||||
123.139.94.173 - - [08/Sep/2025:07:38:46 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 404 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 4802694
|
||||
123.139.94.173 - - [08/Sep/2025:07:39:00 +0800] "POST /api/meal-planning/save HTTP/1.1" 200 139 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 219789
|
||||
123.139.94.173 - - [08/Sep/2025:07:39:06 +0800] "GET /admin/analytics_admin/ HTTP/1.1" 200 37309 "http://101.43.95.130:5002/admin/batch_admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 452687
|
||||
127.0.0.1 - - [08/Sep/2025:07:51:26 +0800] "GET /meal-planning/history HTTP/1.1" 500 265 "-" "curl/7.29.0" 27508
|
||||
127.0.0.1 - - [08/Sep/2025:07:52:12 +0800] "GET /meal-planning/history HTTP/1.1" 500 265 "-" "curl/7.29.0" 36357
|
||||
127.0.0.1 - - [08/Sep/2025:07:53:18 +0800] "GET /meal-planning/history HTTP/1.1" 200 22501 "-" "curl/7.29.0" 13646
|
||||
127.0.0.1 - - [08/Sep/2025:07:53:26 +0800] "GET /api/meal-planning/list HTTP/1.1" 200 676 "-" "curl/7.29.0" 509213
|
||||
127.0.0.1 - - [08/Sep/2025:07:53:35 +0800] "DELETE /api/meal-planning/1 HTTP/1.1" 200 78 "-" "curl/7.29.0" 167931
|
||||
127.0.0.1 - - [08/Sep/2025:07:53:47 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 509 "-" "curl/7.29.0" 4478681
|
||||
127.0.0.1 - - [08/Sep/2025:07:54:10 +0800] "POST /api/meal-planning/save HTTP/1.1" 200 139 "-" "curl/7.29.0" 537899
|
||||
127.0.0.1 - - [08/Sep/2025:07:54:19 +0800] "POST /api/meal-planning/save HTTP/1.1" 200 139 "-" "curl/7.29.0" 221651
|
||||
127.0.0.1 - - [08/Sep/2025:07:54:26 +0800] "GET /api/meal-planning/list HTTP/1.1" 200 1115 "-" "curl/7.29.0" 154490
|
||||
123.139.94.173 - - [08/Sep/2025:07:54:41 +0800] "POST /api/meal-planning/save HTTP/1.1" 200 139 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 196350
|
||||
123.139.94.173 - - [08/Sep/2025:07:54:44 +0800] "GET /meal-planning HTTP/1.1" 200 25595 "http://101.43.95.130:5002/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 112367
|
||||
123.139.94.173 - - [08/Sep/2025:07:54:44 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 1103
|
||||
123.139.94.173 - - [08/Sep/2025:07:54:46 +0800] "GET /meal-planning/history HTTP/1.1" 200 22501 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 111146
|
||||
123.139.94.173 - - [08/Sep/2025:07:54:47 +0800] "GET /api/meal-planning/list?page=1&per_page=10 HTTP/1.1" 200 1006 "http://101.43.95.130:5002/meal-planning/history" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 123580
|
||||
123.139.94.173 - - [08/Sep/2025:07:55:16 +0800] "GET /meal-planning HTTP/1.1" 200 25595 "http://101.43.95.130:5002/meal-planning/history" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 466717
|
||||
123.139.94.173 - - [08/Sep/2025:07:55:17 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 950
|
||||
123.139.94.173 - - [08/Sep/2025:07:56:03 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 488 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5042608
|
||||
123.139.94.173 - - [08/Sep/2025:07:56:33 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 452 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 4733664
|
||||
127.0.0.1 - - [08/Sep/2025:07:59:23 +0800] "DELETE /api/meal-planning/2sleep HTTP/1.1" 404 207 "-" "curl/7.29.0" 5159
|
||||
127.0.0.1 - - [08/Sep/2025:08:00:09 +0800] "GET / HTTP/1.1" 200 49733 "-" "curl/7.29.0" 479791
|
||||
127.0.0.1 - - [08/Sep/2025:08:01:49 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 125 "-" "curl/7.29.0" 137090803
|
||||
123.139.94.173 - - [08/Sep/2025:08:03:04 +0800] "GET /meal-planning HTTP/1.1" 200 25595 "http://101.43.95.130:5002/meal-planning/history" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 463316
|
||||
123.139.94.173 - - [08/Sep/2025:08:03:04 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 5218
|
||||
123.139.94.173 - - [08/Sep/2025:08:03:41 +0800] "POST /api/meal-planning/generate HTTP/1.1" 200 2711 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 22104246
|
||||
123.139.94.173 - - [08/Sep/2025:08:05:33 +0800] "POST /api/meal-planning/save HTTP/1.1" 200 139 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 559856
|
||||
123.139.94.173 - - [08/Sep/2025:08:05:37 +0800] "GET /meal-planning/history HTTP/1.1" 200 22501 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 380516
|
||||
123.139.94.173 - - [08/Sep/2025:08:05:37 +0800] "GET /api/meal-planning/list?page=1&per_page=10 HTTP/1.1" 200 3594 "http://101.43.95.130:5002/meal-planning/history" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 143620
|
||||
123.139.94.173 - - [08/Sep/2025:08:06:00 +0800] "GET /meal-planning HTTP/1.1" 200 25595 "http://101.43.95.130:5002/meal-planning/history" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 123600
|
||||
123.139.94.173 - - [08/Sep/2025:08:06:00 +0800] "GET /api/check-login HTTP/1.1" 200 115 "http://101.43.95.130:5002/meal-planning" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" 4892
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -52,6 +52,10 @@ def create_app(config_class=None):
|
||||
from src.flask_prompt_master.routes.auth import auth_bp
|
||||
app.register_blueprint(auth_bp)
|
||||
|
||||
# 注册饭菜规划蓝图
|
||||
from src.flask_prompt_master.routes.meal_planning import meal_planning_bp
|
||||
app.register_blueprint(meal_planning_bp)
|
||||
|
||||
# 初始化后台管理
|
||||
from src.flask_prompt_master.admin import init_admin
|
||||
init_admin(app)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -81,4 +81,32 @@ class PromptTemplate(db.Model):
|
||||
sub_category = db.Column(db.String(50))
|
||||
system_prompt = db.Column(db.Text, nullable=False)
|
||||
is_default = db.Column(db.Boolean, default=False)
|
||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
|
||||
class MealPlan(db.Model):
|
||||
"""饭菜规划表"""
|
||||
__tablename__ = 'meal_plan'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('user.uid'), nullable=True)
|
||||
wx_user_id = db.Column(db.Integer, db.ForeignKey('wx_user.id'), nullable=True)
|
||||
|
||||
# 规划参数
|
||||
region_type = db.Column(db.String(50), nullable=False) # 地区类型
|
||||
diner_count = db.Column(db.String(20), nullable=False) # 就餐人数
|
||||
meal_type = db.Column(db.String(20), nullable=False) # 用餐类型
|
||||
hometown = db.Column(db.String(100), nullable=False) # 家乡
|
||||
preferences = db.Column(db.Text) # 个人喜好
|
||||
dietary_restrictions = db.Column(db.Text) # 饮食禁忌
|
||||
budget = db.Column(db.String(50), nullable=False) # 预算范围
|
||||
|
||||
# 生成结果
|
||||
meal_plan_content = db.Column(db.Text, nullable=False) # 饭菜规划内容
|
||||
|
||||
# 时间戳
|
||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
# 关联关系
|
||||
user = db.relationship('User', backref='meal_plans')
|
||||
wx_user = db.relationship('WxUser', backref='meal_plans')
|
||||
Binary file not shown.
Binary file not shown.
377
src/flask_prompt_master/routes/meal_planning.py
Normal file
377
src/flask_prompt_master/routes/meal_planning.py
Normal file
@@ -0,0 +1,377 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
智能饭菜规划功能路由
|
||||
"""
|
||||
from flask import Blueprint, render_template, request, jsonify, current_app, session
|
||||
from openai import OpenAI
|
||||
import logging
|
||||
from typing import Dict, Any, Optional
|
||||
from src.flask_prompt_master import db
|
||||
from src.flask_prompt_master.models.models import MealPlan, User
|
||||
|
||||
# 配置日志
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 创建蓝图
|
||||
meal_planning_bp = Blueprint('meal_planning', __name__)
|
||||
|
||||
# 初始化OpenAI客户端
|
||||
client = OpenAI(
|
||||
api_key='sk-fdf7cc1c73504e628ec0119b7e11b8cc',
|
||||
base_url='https://api.deepseek.com/v1'
|
||||
)
|
||||
|
||||
def generate_meal_plan(region_type, diner_count, meal_type, hometown, preferences, dietary_restrictions, budget):
|
||||
"""
|
||||
使用AI模型生成饭菜规划
|
||||
|
||||
Args:
|
||||
region_type: 地区类型
|
||||
diner_count: 就餐人数
|
||||
meal_type: 用餐类型
|
||||
hometown: 用餐者家乡
|
||||
preferences: 个人喜好
|
||||
dietary_restrictions: 饮食禁忌
|
||||
budget: 预算范围(元)
|
||||
|
||||
Returns:
|
||||
str: AI生成的饭菜规划
|
||||
"""
|
||||
try:
|
||||
logger.info("开始生成饭菜规划")
|
||||
|
||||
# 构建系统提示词(参考新代码结构)
|
||||
system_prompt = f"""你是一位专业的{region_type}智能饭菜清单规划师和营养搭配专家。
|
||||
|
||||
背景信息:需要制定科学的饭菜清单方案,包括根据家乡风俗习惯推荐、个人喜好匹配、就餐人数适配、前后三天不重样、详细做法说明等全方位用餐指导。
|
||||
|
||||
约束条件:
|
||||
- 确保营养均衡
|
||||
- 符合个人喜好
|
||||
- 控制预算成本
|
||||
- 考虑饮食禁忌
|
||||
- 体现家乡特色
|
||||
|
||||
输出格式:markdown格式,包含菜品名称、食材清单、制作步骤、营养信息、预算估算等详细信息。"""
|
||||
|
||||
# 构建用户提示词(简化版本,避免超时)
|
||||
user_prompt = f"""为{diner_count}人制定{meal_type}饭菜清单,家乡{hometown},喜好{preferences},禁忌{dietary_restrictions},预算{budget}元。
|
||||
|
||||
请提供:
|
||||
1. 2道推荐菜品
|
||||
2. 主要食材
|
||||
3. 简要步骤
|
||||
|
||||
要求:营养均衡,符合预算。"""
|
||||
|
||||
# 构建消息
|
||||
messages = [
|
||||
{"role": "system", "content": system_prompt},
|
||||
{"role": "user", "content": user_prompt}
|
||||
]
|
||||
|
||||
logger.info("发送请求到DeepSeek API")
|
||||
|
||||
# 发送请求(平衡版本)
|
||||
response = client.chat.completions.create(
|
||||
model="deepseek-chat",
|
||||
messages=messages,
|
||||
temperature=0.7,
|
||||
max_tokens=800, # 适中的token数量
|
||||
timeout=30 # 适中的超时时间
|
||||
)
|
||||
|
||||
result = response.choices[0].message.content
|
||||
logger.info("饭菜规划生成成功")
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"生成饭菜规划时出错: {e}")
|
||||
raise Exception(f"饭菜规划生成失败: {e}")
|
||||
|
||||
@meal_planning_bp.route('/meal-planning', methods=['GET'])
|
||||
def meal_planning_page():
|
||||
"""饭菜规划页面"""
|
||||
return render_template('meal_planning.html')
|
||||
|
||||
@meal_planning_bp.route('/meal-planning/history', methods=['GET'])
|
||||
def meal_planning_history():
|
||||
"""饭菜规划历史页面"""
|
||||
return render_template('meal_planning_history.html')
|
||||
|
||||
@meal_planning_bp.route('/api/meal-planning/generate', methods=['POST'])
|
||||
def generate_meal_plan_api():
|
||||
"""生成饭菜规划的API接口"""
|
||||
try:
|
||||
data = request.get_json()
|
||||
|
||||
# 获取参数
|
||||
region_type = data.get('region_type', '全国')
|
||||
diner_count = data.get('diner_count', '2')
|
||||
meal_type = data.get('meal_type', '午餐')
|
||||
hometown = data.get('hometown', '')
|
||||
preferences = data.get('preferences', '')
|
||||
dietary_restrictions = data.get('dietary_restrictions', '')
|
||||
budget = data.get('budget', '100')
|
||||
|
||||
# 验证必填参数
|
||||
if not hometown:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '请输入用餐者家乡'
|
||||
})
|
||||
|
||||
# 生成饭菜规划
|
||||
meal_plan = generate_meal_plan(
|
||||
region_type=region_type,
|
||||
diner_count=diner_count,
|
||||
meal_type=meal_type,
|
||||
hometown=hometown,
|
||||
preferences=preferences,
|
||||
dietary_restrictions=dietary_restrictions,
|
||||
budget=budget
|
||||
)
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': {
|
||||
'meal_plan': meal_plan,
|
||||
'parameters': {
|
||||
'region_type': region_type,
|
||||
'diner_count': diner_count,
|
||||
'meal_type': meal_type,
|
||||
'hometown': hometown,
|
||||
'preferences': preferences,
|
||||
'dietary_restrictions': dietary_restrictions,
|
||||
'budget': budget
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"API调用失败: {str(e)}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'生成失败: {str(e)}'
|
||||
})
|
||||
|
||||
@meal_planning_bp.route('/api/meal-planning/save', methods=['POST'])
|
||||
def save_meal_plan():
|
||||
"""保存饭菜规划"""
|
||||
try:
|
||||
data = request.get_json()
|
||||
|
||||
# 获取保存参数
|
||||
meal_plan_content = data.get('meal_plan_content', '')
|
||||
region_type = data.get('region_type', '')
|
||||
diner_count = data.get('diner_count', '')
|
||||
meal_type = data.get('meal_type', '')
|
||||
hometown = data.get('hometown', '')
|
||||
preferences = data.get('preferences', '')
|
||||
dietary_restrictions = data.get('dietary_restrictions', '')
|
||||
budget = data.get('budget', '')
|
||||
|
||||
# 验证必填字段
|
||||
if not meal_plan_content:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '饭菜规划内容不能为空'
|
||||
})
|
||||
|
||||
# 获取用户ID(从session或默认用户)
|
||||
user_id = session.get('user_id')
|
||||
if not user_id:
|
||||
# 如果没有登录用户,使用默认用户ID
|
||||
try:
|
||||
default_user = User.query.filter_by(login_name='admin').first()
|
||||
user_id = default_user.uid if default_user else 1
|
||||
except Exception as e:
|
||||
logger.warning(f"获取默认用户失败: {e}")
|
||||
user_id = 1
|
||||
|
||||
# 创建饭菜规划记录
|
||||
meal_plan = MealPlan(
|
||||
user_id=user_id,
|
||||
region_type=region_type,
|
||||
diner_count=diner_count,
|
||||
meal_type=meal_type,
|
||||
hometown=hometown,
|
||||
preferences=preferences,
|
||||
dietary_restrictions=dietary_restrictions,
|
||||
budget=budget,
|
||||
meal_plan_content=meal_plan_content
|
||||
)
|
||||
|
||||
# 保存到数据库
|
||||
db.session.add(meal_plan)
|
||||
db.session.commit()
|
||||
|
||||
logger.info(f"饭菜规划保存成功,ID: {meal_plan.id}, 用户ID: {user_id}")
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': '饭菜规划保存成功',
|
||||
'data': {
|
||||
'meal_plan_id': meal_plan.id,
|
||||
'created_at': meal_plan.created_at.isoformat()
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
logger.error(f"保存饭菜规划失败: {str(e)}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'保存失败: {str(e)}'
|
||||
})
|
||||
|
||||
@meal_planning_bp.route('/api/meal-planning/list', methods=['GET'])
|
||||
def get_meal_plans():
|
||||
"""获取用户的饭菜规划列表"""
|
||||
try:
|
||||
# 获取用户ID
|
||||
user_id = session.get('user_id')
|
||||
if not user_id:
|
||||
# 如果没有登录用户,使用默认用户ID
|
||||
try:
|
||||
default_user = User.query.filter_by(login_name='admin').first()
|
||||
user_id = default_user.uid if default_user else 1
|
||||
except Exception as e:
|
||||
logger.warning(f"获取默认用户失败: {e}")
|
||||
user_id = 1
|
||||
|
||||
# 获取分页参数
|
||||
page = request.args.get('page', 1, type=int)
|
||||
per_page = request.args.get('per_page', 10, type=int)
|
||||
|
||||
# 查询用户的饭菜规划
|
||||
meal_plans = MealPlan.query.filter_by(user_id=user_id)\
|
||||
.order_by(MealPlan.created_at.desc())\
|
||||
.paginate(page=page, per_page=per_page, error_out=False)
|
||||
|
||||
# 构建返回数据
|
||||
plans_data = []
|
||||
for plan in meal_plans.items:
|
||||
plans_data.append({
|
||||
'id': plan.id,
|
||||
'region_type': plan.region_type,
|
||||
'diner_count': plan.diner_count,
|
||||
'meal_type': plan.meal_type,
|
||||
'hometown': plan.hometown,
|
||||
'preferences': plan.preferences,
|
||||
'dietary_restrictions': plan.dietary_restrictions,
|
||||
'budget': plan.budget,
|
||||
'meal_plan_content': plan.meal_plan_content,
|
||||
'created_at': plan.created_at.isoformat()
|
||||
})
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': {
|
||||
'plans': plans_data,
|
||||
'pagination': {
|
||||
'page': meal_plans.page,
|
||||
'pages': meal_plans.pages,
|
||||
'per_page': meal_plans.per_page,
|
||||
'total': meal_plans.total,
|
||||
'has_next': meal_plans.has_next,
|
||||
'has_prev': meal_plans.has_prev
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"获取饭菜规划列表失败: {str(e)}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'获取失败: {str(e)}'
|
||||
})
|
||||
|
||||
@meal_planning_bp.route('/api/meal-planning/<int:plan_id>', methods=['GET'])
|
||||
def get_meal_plan_detail(plan_id):
|
||||
"""获取饭菜规划详情"""
|
||||
try:
|
||||
# 获取用户ID
|
||||
user_id = session.get('user_id')
|
||||
if not user_id:
|
||||
try:
|
||||
default_user = User.query.filter_by(login_name='admin').first()
|
||||
user_id = default_user.uid if default_user else 1
|
||||
except Exception as e:
|
||||
logger.warning(f"获取默认用户失败: {e}")
|
||||
user_id = 1
|
||||
|
||||
# 查询饭菜规划
|
||||
meal_plan = MealPlan.query.filter_by(id=plan_id, user_id=user_id).first()
|
||||
|
||||
if not meal_plan:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '饭菜规划不存在'
|
||||
})
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': {
|
||||
'id': meal_plan.id,
|
||||
'region_type': meal_plan.region_type,
|
||||
'diner_count': meal_plan.diner_count,
|
||||
'meal_type': meal_plan.meal_type,
|
||||
'hometown': meal_plan.hometown,
|
||||
'preferences': meal_plan.preferences,
|
||||
'dietary_restrictions': meal_plan.dietary_restrictions,
|
||||
'budget': meal_plan.budget,
|
||||
'meal_plan_content': meal_plan.meal_plan_content,
|
||||
'created_at': meal_plan.created_at.isoformat(),
|
||||
'updated_at': meal_plan.updated_at.isoformat()
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"获取饭菜规划详情失败: {str(e)}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'获取失败: {str(e)}'
|
||||
})
|
||||
|
||||
@meal_planning_bp.route('/api/meal-planning/<int:plan_id>', methods=['DELETE'])
|
||||
def delete_meal_plan(plan_id):
|
||||
"""删除饭菜规划"""
|
||||
try:
|
||||
# 获取用户ID
|
||||
user_id = session.get('user_id')
|
||||
if not user_id:
|
||||
try:
|
||||
default_user = User.query.filter_by(login_name='admin').first()
|
||||
user_id = default_user.uid if default_user else 1
|
||||
except Exception as e:
|
||||
logger.warning(f"获取默认用户失败: {e}")
|
||||
user_id = 1
|
||||
|
||||
# 查询饭菜规划
|
||||
meal_plan = MealPlan.query.filter_by(id=plan_id, user_id=user_id).first()
|
||||
|
||||
if not meal_plan:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '饭菜规划不存在'
|
||||
})
|
||||
|
||||
# 删除记录
|
||||
db.session.delete(meal_plan)
|
||||
db.session.commit()
|
||||
|
||||
logger.info(f"饭菜规划删除成功,ID: {plan_id}, 用户ID: {user_id}")
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': '饭菜规划删除成功'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
logger.error(f"删除饭菜规划失败: {str(e)}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'删除失败: {str(e)}'
|
||||
})
|
||||
@@ -254,6 +254,14 @@
|
||||
<i class="fas fa-plus"></i>
|
||||
生成提示词
|
||||
</a>
|
||||
<a href="{{ url_for('meal_planning.meal_planning_page') }}" class="nav-link">
|
||||
<i class="fas fa-utensils"></i>
|
||||
饭菜规划
|
||||
</a>
|
||||
<a href="{{ url_for('meal_planning.meal_planning_history') }}" class="nav-link">
|
||||
<i class="fas fa-history"></i>
|
||||
我的规划
|
||||
</a>
|
||||
<a href="{{ url_for('favorites.favorites_page') }}" class="nav-link">
|
||||
<i class="fas fa-heart"></i>
|
||||
我的收藏
|
||||
|
||||
452
src/flask_prompt_master/templates/meal_planning.html
Normal file
452
src/flask_prompt_master/templates/meal_planning.html
Normal file
@@ -0,0 +1,452 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}智能饭菜规划 - 提示词大师{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<!-- 页面标题 -->
|
||||
<div class="page-header">
|
||||
<h1 class="page-title">
|
||||
<i class="fas fa-utensils"></i>
|
||||
智能饭菜规划
|
||||
</h1>
|
||||
<p class="page-subtitle">AI驱动的个性化饭菜清单规划师</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- 左侧:参数配置 -->
|
||||
<div class="col-lg-4">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">
|
||||
<i class="fas fa-cog"></i>
|
||||
规划参数
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="mealPlanningForm">
|
||||
<!-- 地区类型 -->
|
||||
<div class="form-group mb-3">
|
||||
<label for="regionType" class="form-label">地区类型</label>
|
||||
<select class="form-select" id="regionType" name="region_type">
|
||||
<option value="全国">全国</option>
|
||||
<option value="北方">北方</option>
|
||||
<option value="南方">南方</option>
|
||||
<option value="川菜">川菜</option>
|
||||
<option value="粤菜">粤菜</option>
|
||||
<option value="鲁菜">鲁菜</option>
|
||||
<option value="苏菜">苏菜</option>
|
||||
<option value="浙菜">浙菜</option>
|
||||
<option value="闽菜">闽菜</option>
|
||||
<option value="湘菜">湘菜</option>
|
||||
<option value="徽菜">徽菜</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- 就餐人数 -->
|
||||
<div class="form-group mb-3">
|
||||
<label for="dinerCount" class="form-label">就餐人数</label>
|
||||
<select class="form-select" id="dinerCount" name="diner_count">
|
||||
<option value="1">1人</option>
|
||||
<option value="2" selected>2人</option>
|
||||
<option value="3">3人</option>
|
||||
<option value="4">4人</option>
|
||||
<option value="5">5人</option>
|
||||
<option value="6">6人</option>
|
||||
<option value="8">8人</option>
|
||||
<option value="10">10人</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- 用餐类型 -->
|
||||
<div class="form-group mb-3">
|
||||
<label for="mealType" class="form-label">用餐类型</label>
|
||||
<select class="form-select" id="mealType" name="meal_type">
|
||||
<option value="早餐">早餐</option>
|
||||
<option value="午餐" selected>午餐</option>
|
||||
<option value="晚餐">晚餐</option>
|
||||
<option value="全天">全天</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- 用餐者家乡 -->
|
||||
<div class="form-group mb-3">
|
||||
<label for="hometown" class="form-label">用餐者家乡 <span class="text-danger">*</span></label>
|
||||
<input type="text" class="form-control" id="hometown" name="hometown"
|
||||
placeholder="如:四川成都" required>
|
||||
</div>
|
||||
|
||||
<!-- 个人喜好 -->
|
||||
<div class="form-group mb-3">
|
||||
<label for="preferences" class="form-label">个人喜好</label>
|
||||
<textarea class="form-control" id="preferences" name="preferences" rows="3"
|
||||
placeholder="如:喜欢辣味、偏爱素食、喜欢海鲜等"></textarea>
|
||||
</div>
|
||||
|
||||
<!-- 饮食禁忌 -->
|
||||
<div class="form-group mb-3">
|
||||
<label for="dietaryRestrictions" class="form-label">饮食禁忌</label>
|
||||
<textarea class="form-control" id="dietaryRestrictions" name="dietary_restrictions" rows="3"
|
||||
placeholder="如:不吃猪肉、对花生过敏、素食主义等"></textarea>
|
||||
</div>
|
||||
|
||||
<!-- 预算范围 -->
|
||||
<div class="form-group mb-3">
|
||||
<label for="budget" class="form-label">预算范围(元)</label>
|
||||
<select class="form-select" id="budget" name="budget">
|
||||
<option value="50">50元以下</option>
|
||||
<option value="100" selected>50-100元</option>
|
||||
<option value="150">100-150元</option>
|
||||
<option value="200">150-200元</option>
|
||||
<option value="300">200-300元</option>
|
||||
<option value="500">300-500元</option>
|
||||
<option value="1000">500元以上</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- 生成按钮 -->
|
||||
<div class="d-grid">
|
||||
<button type="submit" class="btn btn-primary btn-lg" id="generateBtn">
|
||||
<i class="fas fa-magic"></i>
|
||||
生成饭菜规划
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧:结果展示 -->
|
||||
<div class="col-lg-8">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">
|
||||
<i class="fas fa-clipboard-list"></i>
|
||||
饭菜规划结果
|
||||
</h5>
|
||||
<div class="card-actions">
|
||||
<button class="btn btn-sm btn-outline-primary" id="copyBtn" style="display: none;">
|
||||
<i class="fas fa-copy"></i>
|
||||
复制规划
|
||||
</button>
|
||||
<button class="btn btn-sm btn-outline-success" id="saveBtn" style="display: none;">
|
||||
<i class="fas fa-save"></i>
|
||||
保存规划
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div id="resultContainer">
|
||||
<div class="text-center text-muted py-5">
|
||||
<i class="fas fa-utensils fa-3x mb-3"></i>
|
||||
<p>请填写左侧参数,点击"生成饭菜规划"开始</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 加载动画 -->
|
||||
<div class="modal fade" id="loadingModal" tabindex="-1" data-bs-backdrop="static" data-bs-keyboard="false">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body text-center py-4">
|
||||
<div class="spinner-border text-primary mb-3" role="status">
|
||||
<span class="visually-hidden">生成中...</span>
|
||||
</div>
|
||||
<h5>正在生成饭菜规划...</h5>
|
||||
<p class="text-muted">AI正在为您制定个性化的饭菜清单,请稍候</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.page-header {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
color: white;
|
||||
padding: 2rem 0;
|
||||
margin-bottom: 2rem;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.page-title {
|
||||
font-size: 2.5rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.page-subtitle {
|
||||
font-size: 1.1rem;
|
||||
opacity: 0.9;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.card {
|
||||
border: none;
|
||||
box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
background: #f8f9fa;
|
||||
border-bottom: 1px solid #dee2e6;
|
||||
border-radius: 10px 10px 0 0 !important;
|
||||
padding: 1rem 1.5rem;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
margin-bottom: 0;
|
||||
font-weight: 600;
|
||||
color: #495057;
|
||||
}
|
||||
|
||||
.card-actions {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
font-weight: 600;
|
||||
color: #495057;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.form-control, .form-select {
|
||||
border-radius: 8px;
|
||||
border: 1px solid #ced4da;
|
||||
padding: 0.75rem;
|
||||
}
|
||||
|
||||
.form-control:focus, .form-select:focus {
|
||||
border-color: #667eea;
|
||||
box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25);
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
padding: 0.75rem 1.5rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background: linear-gradient(135deg, #5a6fd8 0%, #6a4190 100%);
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 8px rgba(102, 126, 234, 0.3);
|
||||
}
|
||||
|
||||
#resultContainer {
|
||||
min-height: 400px;
|
||||
}
|
||||
|
||||
.meal-plan-content {
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
padding: 1.5rem;
|
||||
border-left: 4px solid #667eea;
|
||||
}
|
||||
|
||||
.meal-plan-content h1,
|
||||
.meal-plan-content h2,
|
||||
.meal-plan-content h3 {
|
||||
color: #495057;
|
||||
margin-top: 1.5rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.meal-plan-content h1:first-child,
|
||||
.meal-plan-content h2:first-child,
|
||||
.meal-plan-content h3:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.meal-plan-content ul,
|
||||
.meal-plan-content ol {
|
||||
padding-left: 1.5rem;
|
||||
}
|
||||
|
||||
.meal-plan-content li {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.meal-plan-content strong {
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.alert {
|
||||
border-radius: 8px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.alert-danger {
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
}
|
||||
|
||||
.alert-success {
|
||||
background: #d1edff;
|
||||
color: #0c5460;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const form = document.getElementById('mealPlanningForm');
|
||||
const generateBtn = document.getElementById('generateBtn');
|
||||
const resultContainer = document.getElementById('resultContainer');
|
||||
const copyBtn = document.getElementById('copyBtn');
|
||||
const saveBtn = document.getElementById('saveBtn');
|
||||
const loadingModal = new bootstrap.Modal(document.getElementById('loadingModal'));
|
||||
|
||||
// 表单提交处理
|
||||
form.addEventListener('submit', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
// 验证必填字段
|
||||
const hometown = document.getElementById('hometown').value.trim();
|
||||
if (!hometown) {
|
||||
showAlert('请输入用餐者家乡', 'danger');
|
||||
return;
|
||||
}
|
||||
|
||||
// 收集表单数据
|
||||
const formData = new FormData(form);
|
||||
const data = Object.fromEntries(formData.entries());
|
||||
|
||||
// 显示加载动画
|
||||
loadingModal.show();
|
||||
generateBtn.disabled = true;
|
||||
|
||||
// 发送请求
|
||||
fetch('/api/meal-planning/generate', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(data)
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(result => {
|
||||
loadingModal.hide();
|
||||
generateBtn.disabled = false;
|
||||
|
||||
if (result.success) {
|
||||
displayResult(result.data.meal_plan);
|
||||
copyBtn.style.display = 'inline-block';
|
||||
saveBtn.style.display = 'inline-block';
|
||||
showAlert('饭菜规划生成成功!', 'success');
|
||||
} else {
|
||||
showAlert(result.message || '生成失败,请重试', 'danger');
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
loadingModal.hide();
|
||||
generateBtn.disabled = false;
|
||||
console.error('Error:', error);
|
||||
showAlert('网络错误,请检查网络连接后重试', 'danger');
|
||||
});
|
||||
});
|
||||
|
||||
// 显示结果
|
||||
function displayResult(mealPlan) {
|
||||
// 简单的Markdown转HTML函数
|
||||
function simpleMarkdownToHtml(text) {
|
||||
return text
|
||||
.replace(/^### (.*$)/gim, '<h3>$1</h3>')
|
||||
.replace(/^## (.*$)/gim, '<h2>$1</h2>')
|
||||
.replace(/^# (.*$)/gim, '<h1>$1</h1>')
|
||||
.replace(/\*\*(.*)\*\*/gim, '<strong>$1</strong>')
|
||||
.replace(/\*(.*)\*/gim, '<em>$1</em>')
|
||||
.replace(/^\* (.*$)/gim, '<li>$1</li>')
|
||||
.replace(/^\d+\. (.*$)/gim, '<li>$1</li>')
|
||||
.replace(/\n\n/gim, '</p><p>')
|
||||
.replace(/\n/gim, '<br>')
|
||||
.replace(/^(.*)$/gim, '<p>$1</p>');
|
||||
}
|
||||
|
||||
resultContainer.innerHTML = `
|
||||
<div class="meal-plan-content">
|
||||
${simpleMarkdownToHtml(mealPlan)}
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
// 复制功能
|
||||
copyBtn.addEventListener('click', function() {
|
||||
const content = resultContainer.querySelector('.meal-plan-content').textContent;
|
||||
navigator.clipboard.writeText(content).then(() => {
|
||||
showAlert('饭菜规划已复制到剪贴板', 'success');
|
||||
}).catch(() => {
|
||||
showAlert('复制失败,请手动复制', 'danger');
|
||||
});
|
||||
});
|
||||
|
||||
// 保存功能
|
||||
saveBtn.addEventListener('click', function() {
|
||||
const content = resultContainer.querySelector('.meal-plan-content').textContent;
|
||||
|
||||
// 获取当前表单参数
|
||||
const formData = {
|
||||
meal_plan_content: content,
|
||||
region_type: document.getElementById('regionType').value,
|
||||
diner_count: document.getElementById('dinerCount').value,
|
||||
meal_type: document.getElementById('mealType').value,
|
||||
hometown: document.getElementById('hometown').value,
|
||||
preferences: document.getElementById('preferences').value,
|
||||
dietary_restrictions: document.getElementById('dietaryRestrictions').value,
|
||||
budget: document.getElementById('budget').value
|
||||
};
|
||||
|
||||
fetch('/api/meal-planning/save', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(formData)
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(result => {
|
||||
if (result.success) {
|
||||
showAlert('饭菜规划保存成功!', 'success');
|
||||
console.log('保存成功,规划ID:', result.data.meal_plan_id);
|
||||
} else {
|
||||
showAlert(result.message || '保存失败', 'danger');
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
showAlert('保存失败,请重试', 'danger');
|
||||
});
|
||||
});
|
||||
|
||||
// 显示提示信息
|
||||
function showAlert(message, type) {
|
||||
const alertDiv = document.createElement('div');
|
||||
alertDiv.className = `alert alert-${type} alert-dismissible fade show`;
|
||||
alertDiv.innerHTML = `
|
||||
${message}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||
`;
|
||||
|
||||
// 插入到页面顶部
|
||||
const container = document.querySelector('.container-fluid');
|
||||
container.insertBefore(alertDiv, container.firstChild);
|
||||
|
||||
// 自动消失
|
||||
setTimeout(() => {
|
||||
if (alertDiv.parentNode) {
|
||||
alertDiv.remove();
|
||||
}
|
||||
}, 5000);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
671
src/flask_prompt_master/templates/meal_planning_history.html
Normal file
671
src/flask_prompt_master/templates/meal_planning_history.html
Normal file
@@ -0,0 +1,671 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>我的饭菜规划 - 提示词大师</title>
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<!-- Font Awesome -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
||||
<!-- Google Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--primary-color: #667eea;
|
||||
--secondary-color: #764ba2;
|
||||
--success-color: #28a745;
|
||||
--danger-color: #dc3545;
|
||||
--warning-color: #ffc107;
|
||||
--info-color: #17a2b8;
|
||||
--light-color: #f8f9fa;
|
||||
--dark-color: #343a40;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Inter', sans-serif;
|
||||
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
font-weight: 600;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
color: rgba(255,255,255,0.9) !important;
|
||||
font-weight: 500;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.nav-link:hover {
|
||||
color: white !important;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.main-container {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem 1rem;
|
||||
}
|
||||
|
||||
.page-header {
|
||||
background: white;
|
||||
border-radius: 15px;
|
||||
padding: 2rem;
|
||||
margin-bottom: 2rem;
|
||||
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
|
||||
border-left: 5px solid var(--primary-color);
|
||||
}
|
||||
|
||||
.page-title {
|
||||
color: var(--dark-color);
|
||||
font-weight: 600;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.page-subtitle {
|
||||
color: #6c757d;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.plan-card {
|
||||
background: white;
|
||||
border-radius: 15px;
|
||||
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
|
||||
margin-bottom: 1.5rem;
|
||||
transition: all 0.3s ease;
|
||||
border: none;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.plan-card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 8px 30px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
.plan-header {
|
||||
background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
|
||||
color: white;
|
||||
padding: 1.5rem;
|
||||
border-radius: 15px 15px 0 0;
|
||||
}
|
||||
|
||||
.plan-title {
|
||||
font-weight: 600;
|
||||
margin-bottom: 0.5rem;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.plan-meta {
|
||||
font-size: 0.9rem;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.plan-body {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
.plan-params {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.param-item {
|
||||
background: var(--light-color);
|
||||
padding: 0.75rem;
|
||||
border-radius: 8px;
|
||||
border-left: 3px solid var(--primary-color);
|
||||
}
|
||||
|
||||
.param-label {
|
||||
font-weight: 600;
|
||||
color: var(--dark-color);
|
||||
font-size: 0.9rem;
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
.param-value {
|
||||
color: #6c757d;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.plan-content {
|
||||
background: #f8f9fa;
|
||||
border-radius: 10px;
|
||||
padding: 1.5rem;
|
||||
border-left: 4px solid var(--success-color);
|
||||
}
|
||||
|
||||
.plan-content h6 {
|
||||
color: var(--success-color);
|
||||
font-weight: 600;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.plan-content pre {
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
padding: 1rem;
|
||||
border: 1px solid #e9ecef;
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
font-family: 'Inter', sans-serif;
|
||||
font-size: 0.95rem;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.plan-actions {
|
||||
padding: 1rem 1.5rem;
|
||||
background: #f8f9fa;
|
||||
border-top: 1px solid #e9ecef;
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
padding: 0.5rem 1rem;
|
||||
font-size: 0.875rem;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.btn-outline-primary {
|
||||
border-color: var(--primary-color);
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
.btn-outline-primary:hover {
|
||||
background-color: var(--primary-color);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
|
||||
.btn-outline-danger {
|
||||
border-color: var(--danger-color);
|
||||
color: var(--danger-color);
|
||||
}
|
||||
|
||||
.btn-outline-danger:hover {
|
||||
background-color: var(--danger-color);
|
||||
border-color: var(--danger-color);
|
||||
}
|
||||
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 4rem 2rem;
|
||||
background: white;
|
||||
border-radius: 15px;
|
||||
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.empty-state i {
|
||||
font-size: 4rem;
|
||||
color: #dee2e6;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.empty-state h4 {
|
||||
color: #6c757d;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.empty-state p {
|
||||
color: #adb5bd;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.loading-spinner {
|
||||
text-align: center;
|
||||
padding: 3rem;
|
||||
}
|
||||
|
||||
.spinner-border {
|
||||
width: 3rem;
|
||||
height: 3rem;
|
||||
border-width: 0.3em;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
justify-content: center;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
.page-link {
|
||||
border-radius: 8px;
|
||||
margin: 0 0.25rem;
|
||||
border: 1px solid #dee2e6;
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
.page-link:hover {
|
||||
background-color: var(--primary-color);
|
||||
border-color: var(--primary-color);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.page-item.active .page-link {
|
||||
background-color: var(--primary-color);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
|
||||
.alert {
|
||||
border-radius: 10px;
|
||||
border: none;
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.badge {
|
||||
font-size: 0.75rem;
|
||||
padding: 0.5rem 0.75rem;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.badge-primary {
|
||||
background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
|
||||
}
|
||||
|
||||
.badge-success {
|
||||
background-color: var(--success-color);
|
||||
}
|
||||
|
||||
.badge-info {
|
||||
background-color: var(--info-color);
|
||||
}
|
||||
|
||||
.badge-warning {
|
||||
background-color: var(--warning-color);
|
||||
color: var(--dark-color);
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.main-container {
|
||||
padding: 1rem 0.5rem;
|
||||
}
|
||||
|
||||
.page-header {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
.plan-params {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.plan-actions {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.plan-actions .btn {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 导航栏 -->
|
||||
<nav class="navbar navbar-expand-lg navbar-dark">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="{{ url_for('main.index') }}">
|
||||
<i class="fas fa-magic me-2"></i>
|
||||
提示词大师
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav ms-auto">
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('main.index') }}" class="nav-link">
|
||||
<i class="fas fa-plus"></i>
|
||||
生成提示词
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('meal_planning.meal_planning_page') }}" class="nav-link">
|
||||
<i class="fas fa-utensils"></i>
|
||||
饭菜规划
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('meal_planning.meal_planning_history') }}" class="nav-link active">
|
||||
<i class="fas fa-history"></i>
|
||||
我的规划
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('favorites.favorites_page') }}" class="nav-link">
|
||||
<i class="fas fa-heart"></i>
|
||||
我的收藏
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('auth.profile_page') }}" class="nav-link">
|
||||
<i class="fas fa-user"></i>
|
||||
个人资料
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- 主要内容 -->
|
||||
<div class="main-container">
|
||||
<!-- 页面标题 -->
|
||||
<div class="page-header">
|
||||
<h1 class="page-title">
|
||||
<i class="fas fa-history me-3"></i>
|
||||
我的饭菜规划
|
||||
</h1>
|
||||
<p class="page-subtitle">查看和管理您的个性化饭菜规划历史</p>
|
||||
</div>
|
||||
|
||||
<!-- 加载状态 -->
|
||||
<div id="loadingState" class="loading-spinner">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="visually-hidden">加载中...</span>
|
||||
</div>
|
||||
<p class="mt-3 text-muted">正在加载您的饭菜规划...</p>
|
||||
</div>
|
||||
|
||||
<!-- 空状态 -->
|
||||
<div id="emptyState" class="empty-state" style="display: none;">
|
||||
<i class="fas fa-utensils"></i>
|
||||
<h4>还没有饭菜规划</h4>
|
||||
<p>您还没有生成过任何饭菜规划,快去创建一个吧!</p>
|
||||
<a href="{{ url_for('meal_planning.meal_planning_page') }}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i>
|
||||
创建饭菜规划
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- 规划列表 -->
|
||||
<div id="plansList" style="display: none;">
|
||||
<!-- 规划卡片将通过JavaScript动态生成 -->
|
||||
</div>
|
||||
|
||||
<!-- 分页 -->
|
||||
<nav id="pagination" style="display: none;">
|
||||
<ul class="pagination">
|
||||
<!-- 分页按钮将通过JavaScript动态生成 -->
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<!-- 确认删除模态框 -->
|
||||
<div class="modal fade" id="deleteModal" tabindex="-1">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">确认删除</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>您确定要删除这个饭菜规划吗?此操作无法撤销。</p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
|
||||
<button type="button" class="btn btn-danger" id="confirmDelete">删除</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bootstrap JS -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
<script>
|
||||
let currentPage = 1;
|
||||
let totalPages = 1;
|
||||
let deletePlanId = null;
|
||||
|
||||
// 页面加载完成后获取数据
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
loadMealPlans();
|
||||
});
|
||||
|
||||
// 加载饭菜规划列表
|
||||
function loadMealPlans(page = 1) {
|
||||
currentPage = page;
|
||||
|
||||
fetch(`/api/meal-planning/list?page=${page}&per_page=10`)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
hideAllStates();
|
||||
|
||||
if (data.success) {
|
||||
if (data.data.plans.length === 0) {
|
||||
showEmptyState();
|
||||
} else {
|
||||
showPlansList(data.data.plans);
|
||||
showPagination(data.data.pagination);
|
||||
}
|
||||
} else {
|
||||
showError('加载失败:' + data.message);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
showError('加载失败,请重试');
|
||||
});
|
||||
}
|
||||
|
||||
// 显示规划列表
|
||||
function showPlansList(plans) {
|
||||
const plansList = document.getElementById('plansList');
|
||||
plansList.innerHTML = '';
|
||||
|
||||
plans.forEach(plan => {
|
||||
const planCard = createPlanCard(plan);
|
||||
plansList.appendChild(planCard);
|
||||
});
|
||||
|
||||
plansList.style.display = 'block';
|
||||
}
|
||||
|
||||
// 创建规划卡片
|
||||
function createPlanCard(plan) {
|
||||
const card = document.createElement('div');
|
||||
card.className = 'plan-card';
|
||||
card.innerHTML = `
|
||||
<div class="plan-header">
|
||||
<div class="plan-title">
|
||||
<i class="fas fa-utensils me-2"></i>
|
||||
${plan.meal_type} - ${plan.hometown}
|
||||
</div>
|
||||
<div class="plan-meta">
|
||||
<span class="badge badge-primary me-2">${plan.region_type}</span>
|
||||
<span class="badge badge-info me-2">${plan.diner_count}</span>
|
||||
<span class="badge badge-warning me-2">${plan.budget}</span>
|
||||
<span class="badge badge-success">${formatDate(plan.created_at)}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="plan-body">
|
||||
<div class="plan-params">
|
||||
<div class="param-item">
|
||||
<div class="param-label">用餐类型</div>
|
||||
<div class="param-value">${plan.meal_type}</div>
|
||||
</div>
|
||||
<div class="param-item">
|
||||
<div class="param-label">就餐人数</div>
|
||||
<div class="param-value">${plan.diner_count}</div>
|
||||
</div>
|
||||
<div class="param-item">
|
||||
<div class="param-label">家乡</div>
|
||||
<div class="param-value">${plan.hometown}</div>
|
||||
</div>
|
||||
<div class="param-item">
|
||||
<div class="param-label">预算范围</div>
|
||||
<div class="param-value">${plan.budget}</div>
|
||||
</div>
|
||||
${plan.preferences ? `
|
||||
<div class="param-item">
|
||||
<div class="param-label">个人喜好</div>
|
||||
<div class="param-value">${plan.preferences}</div>
|
||||
</div>
|
||||
` : ''}
|
||||
${plan.dietary_restrictions ? `
|
||||
<div class="param-item">
|
||||
<div class="param-label">饮食禁忌</div>
|
||||
<div class="param-value">${plan.dietary_restrictions}</div>
|
||||
</div>
|
||||
` : ''}
|
||||
</div>
|
||||
<div class="plan-content">
|
||||
<h6><i class="fas fa-list-ul me-2"></i>饭菜规划内容</h6>
|
||||
<pre>${plan.meal_plan_content}</pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="plan-actions">
|
||||
<button class="btn btn-outline-primary btn-sm" onclick="copyPlan(${plan.id})">
|
||||
<i class="fas fa-copy me-1"></i>
|
||||
复制
|
||||
</button>
|
||||
<button class="btn btn-outline-danger btn-sm" onclick="deletePlan(${plan.id})">
|
||||
<i class="fas fa-trash me-1"></i>
|
||||
删除
|
||||
</button>
|
||||
</div>
|
||||
`;
|
||||
return card;
|
||||
}
|
||||
|
||||
// 显示分页
|
||||
function showPagination(pagination) {
|
||||
const paginationNav = document.getElementById('pagination');
|
||||
const ul = paginationNav.querySelector('ul');
|
||||
ul.innerHTML = '';
|
||||
|
||||
totalPages = pagination.pages;
|
||||
|
||||
// 上一页按钮
|
||||
if (pagination.has_prev) {
|
||||
const prevLi = document.createElement('li');
|
||||
prevLi.className = 'page-item';
|
||||
prevLi.innerHTML = `<a class="page-link" href="#" onclick="loadMealPlans(${pagination.page - 1})">上一页</a>`;
|
||||
ul.appendChild(prevLi);
|
||||
}
|
||||
|
||||
// 页码按钮
|
||||
const startPage = Math.max(1, pagination.page - 2);
|
||||
const endPage = Math.min(pagination.pages, pagination.page + 2);
|
||||
|
||||
for (let i = startPage; i <= endPage; i++) {
|
||||
const li = document.createElement('li');
|
||||
li.className = `page-item ${i === pagination.page ? 'active' : ''}`;
|
||||
li.innerHTML = `<a class="page-link" href="#" onclick="loadMealPlans(${i})">${i}</a>`;
|
||||
ul.appendChild(li);
|
||||
}
|
||||
|
||||
// 下一页按钮
|
||||
if (pagination.has_next) {
|
||||
const nextLi = document.createElement('li');
|
||||
nextLi.className = 'page-item';
|
||||
nextLi.innerHTML = `<a class="page-link" href="#" onclick="loadMealPlans(${pagination.page + 1})">下一页</a>`;
|
||||
ul.appendChild(nextLi);
|
||||
}
|
||||
|
||||
paginationNav.style.display = 'block';
|
||||
}
|
||||
|
||||
// 复制规划内容
|
||||
function copyPlan(planId) {
|
||||
// 这里可以实现复制功能,暂时显示提示
|
||||
showAlert('复制功能开发中...', 'info');
|
||||
}
|
||||
|
||||
// 删除规划
|
||||
function deletePlan(planId) {
|
||||
deletePlanId = planId;
|
||||
const deleteModal = new bootstrap.Modal(document.getElementById('deleteModal'));
|
||||
deleteModal.show();
|
||||
}
|
||||
|
||||
// 确认删除
|
||||
document.getElementById('confirmDelete').addEventListener('click', function() {
|
||||
if (deletePlanId) {
|
||||
fetch(`/api/meal-planning/${deletePlanId}`, {
|
||||
method: 'DELETE'
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.success) {
|
||||
showAlert('删除成功', 'success');
|
||||
loadMealPlans(currentPage);
|
||||
} else {
|
||||
showAlert('删除失败:' + data.message, 'danger');
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
showAlert('删除失败,请重试', 'danger');
|
||||
});
|
||||
|
||||
const deleteModal = bootstrap.Modal.getInstance(document.getElementById('deleteModal'));
|
||||
deleteModal.hide();
|
||||
deletePlanId = null;
|
||||
}
|
||||
});
|
||||
|
||||
// 显示各种状态
|
||||
function hideAllStates() {
|
||||
document.getElementById('loadingState').style.display = 'none';
|
||||
document.getElementById('emptyState').style.display = 'none';
|
||||
document.getElementById('plansList').style.display = 'none';
|
||||
document.getElementById('pagination').style.display = 'none';
|
||||
}
|
||||
|
||||
function showEmptyState() {
|
||||
document.getElementById('emptyState').style.display = 'block';
|
||||
}
|
||||
|
||||
function showError(message) {
|
||||
showAlert(message, 'danger');
|
||||
document.getElementById('loadingState').style.display = 'none';
|
||||
}
|
||||
|
||||
// 显示提示信息
|
||||
function showAlert(message, type) {
|
||||
const alertDiv = document.createElement('div');
|
||||
alertDiv.className = `alert alert-${type} alert-dismissible fade show`;
|
||||
alertDiv.innerHTML = `
|
||||
${message}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||
`;
|
||||
|
||||
const container = document.querySelector('.main-container');
|
||||
container.insertBefore(alertDiv, container.firstChild);
|
||||
|
||||
// 3秒后自动消失
|
||||
setTimeout(() => {
|
||||
if (alertDiv.parentNode) {
|
||||
alertDiv.remove();
|
||||
}
|
||||
}, 3000);
|
||||
}
|
||||
|
||||
// 格式化日期
|
||||
function formatDate(dateString) {
|
||||
const date = new Date(dateString);
|
||||
return date.toLocaleDateString('zh-CN', {
|
||||
year: 'numeric',
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
hour: '2-digit',
|
||||
minute: '2-digit'
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
50
系统维护常用语.txt
50
系统维护常用语.txt
@@ -157,4 +157,52 @@ PrivateCode(Yes/No):No
|
||||
|
||||
提交的是Python编译文件(.pyc文件)。通常这些文件不应该被提交到版本控制中。让我先取消暂存这些文件,然后添加一个.gitignore文件来忽略它们:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
启动命令
|
||||
|
||||
好的,我给您启动命令,您可以自己启动服务:
|
||||
|
||||
## <20><> **启动命令**
|
||||
|
||||
```bash
|
||||
# 进入项目目录
|
||||
cd /home/renjianbo/aitsc
|
||||
|
||||
# 激活conda环境并启动服务
|
||||
eval "$(/home/renjianbo/miniconda3/bin/conda shell.bash hook)" && conda activate myenv && gunicorn -c gunicorn.conf.py run_dev:app
|
||||
```
|
||||
|
||||
## <20><> **完整的启动步骤**
|
||||
|
||||
1. **打开终端**
|
||||
2. **进入项目目录**:`cd /home/renjianbo/aitsc`
|
||||
3. **执行启动命令**:
|
||||
```bash
|
||||
eval "$(/home/renjianbo/miniconda3/bin/conda shell.bash hook)" && conda activate myenv && gunicorn -c gunicorn.conf.py run_dev:app
|
||||
```
|
||||
|
||||
## ✅ **启动成功的标志**
|
||||
|
||||
看到以下信息表示启动成功:
|
||||
- `[INFO] 应用启动`
|
||||
- `[INFO] 工作进程 X 已启动`
|
||||
- `[INFO] 工作进程 X 初始化完成`
|
||||
|
||||
## 🌐 **访问地址**
|
||||
|
||||
启动成功后,您可以访问:
|
||||
- **主页**:`http://101.43.95.130:5002/`
|
||||
- **饭菜规划**:`http://101.43.95.130:5002/meal-planning`
|
||||
- **后台管理**:`http://101.43.95.130:5002/admin`
|
||||
|
||||
## <20><> **如果启动失败**
|
||||
|
||||
如果遇到问题,可以尝试:
|
||||
1. **清理进程**:`pkill -f gunicorn`
|
||||
2. **删除PID文件**:`rm -f logs/gunicorn.pid`
|
||||
3. **重新启动**
|
||||
|
||||
现在您可以自己启动服务了!
|
||||
Reference in New Issue
Block a user