├── .gitignore ├── Readme.md ├── python_yaodian.sql ├── server ├── manage.py ├── myapp │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── auth │ │ ├── __init__.py │ │ └── authentication.py │ ├── handler.py │ ├── middlewares │ │ ├── LogMiddleware.py │ │ └── __init__.py │ ├── models.py │ ├── permission │ │ ├── __init__.py │ │ └── permission.py │ ├── serializers.py │ ├── tests.py │ ├── urls.py │ ├── utils.py │ └── views │ │ ├── __init__.py │ │ └── admin │ │ ├── __init__.py │ │ ├── ad.py │ │ ├── banner.py │ │ ├── classification.py │ │ ├── comment.py │ │ ├── customer.py │ │ ├── errorLog.py │ │ ├── loginLog.py │ │ ├── notice.py │ │ ├── opLog.py │ │ ├── overview.py │ │ ├── record.py │ │ ├── tag.py │ │ └── user.py ├── readme.md ├── requirements.txt ├── server │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── upload │ ├── ad │ ├── 1674045266113.jpeg │ ├── 1674045282581.jpeg │ ├── 1674045308177.png │ ├── 1674045324510.jpeg │ ├── 1684565423182.jpeg │ ├── 1684565863904.jpeg │ └── 1684565876995.png │ ├── avatar │ ├── 1676553050529.png │ ├── 1676553366217.png │ ├── 1676553498600.jpeg │ ├── 1676553815688.jpeg │ ├── 1677240189427.png │ ├── 1677982820781.jpeg │ ├── 1679146350134.jpeg │ ├── 1684593239449.png │ └── 1684593453676.jpeg │ ├── banner │ ├── 1673963977440.jpeg │ ├── 1673964384835.png │ ├── 1673964652167.jpeg │ ├── 1673965110189.jpeg │ ├── 1673965198155.jpeg │ ├── 1673965389141.jpeg │ ├── 1673965574311.png │ ├── 1673965709533.jpeg │ ├── 1673965718720.png │ └── 1673965728690.jpeg │ └── cover │ ├── 1.jpeg │ ├── 1.jpg │ ├── 10.jpg │ ├── 11.jpg │ ├── 12.jpg │ ├── 13.jpg │ ├── 14.jpg │ ├── 15.jpg │ ├── 16.jpg │ ├── 1672749055571.jpeg │ ├── 1674044230851.jpeg │ ├── 1676186518276.jpeg │ ├── 1676186872895.png │ ├── 1676186935002.png │ ├── 1676188277099.png │ ├── 1676188355688.png │ ├── 1676381084256.png │ ├── 1676381091144.png │ ├── 1676381097051.png │ ├── 1676381103032.png │ ├── 1676381110015.png │ ├── 1677500674281.jpeg │ ├── 1677501266461.jpeg │ ├── 1677501470234.jpeg │ ├── 1677501544737.jpeg │ ├── 1677505180730.jpeg │ ├── 1677505298772.jpeg │ ├── 1677505357042.jpeg │ ├── 1677505364969.jpeg │ ├── 1677505380921.jpeg │ ├── 1677505393025.jpeg │ ├── 1677505410960.jpeg │ ├── 1677505421920.jpeg │ ├── 1677505436478.jpeg │ ├── 1677505452753.jpeg │ ├── 1677505579480.jpeg │ ├── 1677505616285.jpeg │ ├── 1677505626565.jpeg │ ├── 1677505637425.jpeg │ ├── 1677505648826.jpeg │ ├── 1677505659291.jpeg │ ├── 1677505667178.jpeg │ ├── 1677505685641.jpeg │ ├── 1677505695894.jpeg │ ├── 1677505706333.jpeg │ ├── 1677505876732.jpeg │ ├── 1677505884200.jpeg │ ├── 1677505890616.jpeg │ ├── 1677505897079.jpeg │ ├── 1677505910282.jpeg │ ├── 1677505919134.jpeg │ ├── 1677505928898.jpeg │ ├── 1677505937048.jpeg │ ├── 1677505945207.jpeg │ ├── 1677505953782.jpeg │ ├── 1677588447622.jpeg │ ├── 1677677497401.jpeg │ ├── 1678529114670.jpeg │ ├── 1679056479437.jpeg │ ├── 1679056528013.png │ ├── 1679056561868.jpeg │ ├── 1679056587496.jpeg │ ├── 1679058036014.jpeg │ ├── 1679058043365.jpeg │ ├── 1679229610791.jpeg │ ├── 1679229780971.jpeg │ ├── 1679229853940.jpeg │ ├── 1679229963230.jpeg │ ├── 1679230045590.jpeg │ ├── 1679230092657.jpeg │ ├── 1679230147996.jpeg │ ├── 1679230364390.jpeg │ ├── 1679230543572.jpeg │ ├── 1679230586243.jpeg │ ├── 1679230641879.jpeg │ ├── 1679230894621.jpeg │ ├── 1679230935716.jpeg │ ├── 1679230989243.jpeg │ ├── 1679231022326.jpeg │ ├── 1679231052822.jpeg │ ├── 1679231084420.jpeg │ ├── 1679231113572.jpeg │ ├── 1679231151929.jpeg │ ├── 1679231184020.jpeg │ ├── 1679231221940.jpeg │ ├── 1679231465845.jpeg │ ├── 1679232418133.jpeg │ ├── 1679232448857.jpeg │ ├── 1679232480948.jpeg │ ├── 1679232514230.jpeg │ ├── 1679232543082.jpeg │ ├── 1679232587234.jpeg │ ├── 1679232615578.jpeg │ ├── 1679232650073.jpeg │ ├── 1679232676818.jpeg │ ├── 1679232717023.jpeg │ ├── 1679232756075.jpeg │ ├── 1679315151478.jpeg │ ├── 1679315191893.jpeg │ ├── 1679315240787.jpeg │ ├── 1679315276060.jpeg │ ├── 1679315310720.jpeg │ ├── 1679315343720.jpeg │ ├── 1679315365210.jpeg │ ├── 1679315396953.jpeg │ ├── 1679315437571.jpeg │ ├── 1679315478327.jpeg │ ├── 1679315749022.jpeg │ ├── 1679315761797.jpeg │ ├── 1679315803245.jpeg │ ├── 1679315842977.jpeg │ ├── 1679315883620.jpeg │ ├── 1679315915467.jpeg │ ├── 1679315954931.jpeg │ ├── 1679315985852.jpeg │ ├── 1679316037517.jpeg │ ├── 1679316072493.jpeg │ ├── 1679316422812.jpeg │ ├── 1679316453474.jpeg │ ├── 1679316484842.jpeg │ ├── 1679316513693.jpeg │ ├── 1679316533369.jpeg │ ├── 1679316566135.jpeg │ ├── 1679316605104.jpeg │ ├── 1679316637185.jpeg │ ├── 1679316666891.jpeg │ ├── 1679316698087.jpeg │ ├── 1679403034316.jpeg │ ├── 1679403102225.jpeg │ ├── 1679403138846.jpeg │ ├── 1679403158073.jpeg │ ├── 1679403193320.jpeg │ ├── 1679403239138.jpeg │ ├── 1679403285129.jpeg │ ├── 1679403331202.jpeg │ ├── 1679403370669.jpeg │ ├── 1679403403756.jpeg │ ├── 1679403503106.jpeg │ ├── 1679403631942.jpeg │ ├── 1679403697740.jpeg │ ├── 1679403736341.jpeg │ ├── 1679488092121.jpeg │ ├── 1684567758685.jpeg │ ├── 1684567804066.jpeg │ ├── 1684567891591.png │ ├── 1685170107820.jpeg │ ├── 1685170987684.jpeg │ ├── 1685171442599.jpeg │ ├── 1685193225537.jpeg │ ├── 1685240184357.jpeg │ ├── 1685240191000.jpeg │ ├── 1685263611250.jpeg │ ├── 1685263639285.jpeg │ ├── 1685263674742.jpeg │ ├── 1685263699773.jpeg │ ├── 1685263937295.jpeg │ ├── 1685263997721.jpeg │ ├── 1685264026586.jpeg │ ├── 1685264114074.jpeg │ ├── 1685264135851.jpeg │ ├── 1685264163148.jpeg │ ├── 1685264250423.jpeg │ ├── 1685264270509.jpeg │ ├── 1685264295265.jpeg │ ├── 1685264355503.jpeg │ ├── 1685264420316.jpeg │ ├── 1685264443807.jpeg │ ├── 1685264535734.jpeg │ ├── 1685264562903.jpeg │ ├── 1685264586283.jpeg │ ├── 1685264771439.jpeg │ ├── 1685264800237.jpeg │ ├── 1685264830789.jpeg │ ├── 1685264878356.jpeg │ ├── 1685265162834.jpeg │ ├── 1691491016343.jpeg │ ├── 17.jpg │ ├── 18.jpg │ ├── 19.jpg │ ├── 2.jpg │ ├── 20.jpg │ ├── 21.jpg │ ├── 22.jpg │ ├── 23.jpg │ ├── 24.jpg │ ├── 25.jpg │ ├── 26.jpg │ ├── 27.jpg │ ├── 28.jpg │ ├── 29.jpg │ ├── 3.jpg │ ├── 30.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ └── 9.jpg └── web ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .stylelintignore ├── README.md ├── build ├── constant.ts └── vite │ └── plugins │ ├── autoImport.ts │ ├── component.ts │ ├── compress.ts │ ├── imagemin.ts │ ├── index.ts │ ├── progress.ts │ ├── restart.ts │ ├── unocss.ts │ └── visualizer.ts ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── prettier.config.js ├── public ├── favicon.ico └── images │ ├── admin-login-bg.jpg │ ├── bg2.jpg │ └── demo.jpg ├── src ├── App.vue ├── api │ ├── ad.ts │ ├── classification.ts │ ├── comment.ts │ ├── customer.ts │ ├── log.ts │ ├── notice.ts │ ├── order.ts │ ├── overview.ts │ ├── tag.ts │ ├── thing.ts │ └── user.ts ├── assets │ ├── fonts │ │ ├── Blimone-ExtraBold.woff │ │ ├── Blimone-ExtraLight.woff │ │ ├── Blimone-Light.woff │ │ └── Blimone-Regular.woff │ ├── icons │ │ ├── logo.png │ │ └── svg │ │ │ ├── github.svg │ │ │ ├── logo.svg │ │ │ ├── marks.svg │ │ │ ├── test.svg │ │ │ ├── ts.svg │ │ │ └── twitter.svg │ ├── images │ │ ├── Play.png │ │ ├── add.svg │ │ ├── address-right-icon.svg │ │ ├── ali-pay-icon.svg │ │ ├── avatar.jpg │ │ ├── banner-02.webp │ │ ├── banner2.svg │ │ ├── cart-icon.svg │ │ ├── clear-search.svg │ │ ├── code-icon.svg │ │ ├── delete-icon.svg │ │ ├── ebook-download-icon.svg │ │ ├── k-logo.png │ │ ├── login-banner.png │ │ ├── login.png │ │ ├── logo.png │ │ ├── mail-icon.svg │ │ ├── message-icon.svg │ │ ├── order-address-icon.svg │ │ ├── order-icon.svg │ │ ├── order-point-icon.svg │ │ ├── order-thing-icon.svg │ │ ├── pwd-hidden.svg │ │ ├── pwd-icon.svg │ │ ├── qunerweima.jpg │ │ ├── read-online-icon.svg │ │ ├── recommend-hover.svg │ │ ├── register-name.svg │ │ ├── search-icon.svg │ │ ├── searchIcon.svg │ │ ├── setting-card-icon.svg │ │ ├── setting-icon.svg │ │ ├── setting-msg-icon.svg │ │ ├── setting-push-icon.svg │ │ ├── setting-safe-icon.svg │ │ ├── share-icon.svg │ │ ├── tel-icon.svg │ │ ├── want-read-hover.svg │ │ ├── wb-share.svg │ │ └── wx-pay-icon.svg │ └── styles │ │ └── base.less ├── core │ └── bootstrap.js ├── main.js ├── router │ ├── index.js │ └── root.js ├── store │ ├── index.js │ └── modules │ │ ├── app │ │ ├── index.ts │ │ └── types.ts │ │ └── user │ │ ├── index.ts │ │ └── types.ts ├── styles │ ├── index.less │ └── reset.less ├── utils │ ├── auth.ts │ ├── http │ │ └── axios │ │ │ ├── index.ts │ │ │ ├── status.ts │ │ │ └── type.ts │ ├── index.ts │ └── result.ts └── views │ ├── ad.vue │ ├── admin-login.vue │ ├── classification.vue │ ├── comment.vue │ ├── customer.vue │ ├── error-log.vue │ ├── login-log.vue │ ├── main.vue │ ├── notice.vue │ ├── op-log.vue │ ├── overview.vue │ ├── sys-info.vue │ ├── tag.vue │ ├── thing.vue │ └── user.vue ├── stylelint.config.js ├── tsconfig.json ├── types ├── auto-imports.d.ts ├── components.d.ts └── env.d.ts ├── vite.config.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /server/myapp/migrations 2 | /server/myapp/views/__pycache__/ 3 | /server/.idea 4 | /web/.idea 5 | /web/dist 6 | /web/node_modules 7 | /server/.idea/ 8 | /.idea/ 9 | __pycache__ 10 | .idea 11 | server/.idea 12 | .DS_Store 13 | server/.DS_Store 14 | web/.DS_Store -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | > 基于python+django+vue.js开发的药店信息管理系统,学习过程中,遇到问题可以付费咨询:lengqin1024(微信) 2 | 3 | ### 功能介绍 4 | 5 | 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。 6 | 7 | 功能包括:药品管理、分类管理、顾客管理、用户管理、日志管理、系统信息模块。 8 | 9 | 10 | ### 演示地址 11 | 12 | http://yaodian.gitapp.cn 13 | 14 | 演示帐号: 15 | 16 | 用户名:admin123 17 | 密码:admin123 18 | 19 | ### 代码结构 20 | 21 | - server目录是后端代码 22 | - web目录是前端代码 23 | 24 | ### 部署运行 25 | 26 | #### 后端运行步骤 27 | 28 | (1) 安装python 3.8 29 | 30 | (2) 安装依赖。进入server目录下,执行 pip install -r requirements.txt 31 | 32 | (3) 安装mysql 5.7数据库,并创建数据库,命名为xxx,创建SQL如下: 33 | ``` 34 | CREATE DATABASE IF NOT EXISTS xxx DEFAULT CHARSET utf8 COLLATE utf8_general_ci 35 | ``` 36 | (4) 恢复xxx.sql数据。在mysql下依次执行如下命令: 37 | 38 | ``` 39 | mysql> use xxx; 40 | mysql> source D:/xxx/xxx/xxx.sql; 41 | ``` 42 | 43 | (5) 启动django服务。在server目录下执行: 44 | ``` 45 | python manage.py runserver 46 | ``` 47 | 48 | #### 前端运行步骤 49 | 50 | (1) 安装node 16.14 51 | 52 | (2) 进入web目录下,安装依赖,执行: 53 | ``` 54 | npm install 55 | ``` 56 | (3) 运行项目 57 | ``` 58 | npm run dev 59 | ``` 60 | 61 | #### 常见问题 62 | 63 | - 连接后端失败怎么办? 64 | 65 | 编辑前端的constants.js文件,将base_url设置为你自己电脑的ip和端口 66 | 67 | - 需要什么数据库版本? 68 | 69 | 本系统采用的是mysql5.7开发的,理论上5.7以上都支持 70 | 71 | - pip安装依赖失败怎么样? 72 | 73 | 建议使用国内镜像源安装 74 | 75 | 76 | ### 技术咨询 77 | 78 | 微信:lengqin1024 79 | 80 | -------------------------------------------------------------------------------- /server/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /server/myapp/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/myapp/__init__.py -------------------------------------------------------------------------------- /server/myapp/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | from myapp.models import Classification, Thing, Tag, User, Comment 5 | 6 | admin.site.register(Classification) 7 | admin.site.register(Tag) 8 | admin.site.register(Thing) 9 | admin.site.register(User) 10 | admin.site.register(Comment) 11 | -------------------------------------------------------------------------------- /server/myapp/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MyappConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'myapp' 7 | -------------------------------------------------------------------------------- /server/myapp/auth/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/myapp/auth/__init__.py -------------------------------------------------------------------------------- /server/myapp/auth/authentication.py: -------------------------------------------------------------------------------- 1 | from rest_framework import exceptions 2 | from rest_framework.authentication import BaseAuthentication 3 | 4 | from myapp.models import User 5 | 6 | 7 | # 接口认证 8 | class AdminTokenAuthtication(BaseAuthentication): 9 | def authenticate(self, request): 10 | adminToken = request.META.get("HTTP_ADMINTOKEN") 11 | # print("检查adminToken==>" + adminToken) 12 | 13 | users = User.objects.filter(admin_token=adminToken) 14 | """ 15 | 判定条件: 16 | 1. 传了adminToken 17 | 2. 查到了该帐号 18 | 3. 该帐号是管理员或演示帐号 19 | """ 20 | if not adminToken or len(users) == 0 or users[0].role == '2': 21 | raise exceptions.AuthenticationFailed("AUTH_FAIL_END") 22 | else: 23 | print('adminToken验证通过') 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /server/myapp/handler.py: -------------------------------------------------------------------------------- 1 | from rest_framework.response import Response 2 | 3 | 4 | class APIResponse(Response): 5 | def __init__(self, code=0, msg='', data=None, status=200, headers=None, content_type=None, **kwargs): 6 | dic = {'code': code, 'msg': msg} 7 | if data is not None: 8 | dic['data'] = data 9 | 10 | dic.update(kwargs) # 这里使用update 11 | super().__init__(data=dic, status=status, 12 | template_name=None, headers=headers, 13 | exception=False, content_type=content_type) 14 | -------------------------------------------------------------------------------- /server/myapp/middlewares/LogMiddleware.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import time 3 | import json 4 | 5 | from django.utils.deprecation import MiddlewareMixin 6 | 7 | from myapp import utils 8 | from myapp.serializers import OpLogSerializer 9 | 10 | 11 | class OpLogs(MiddlewareMixin): 12 | 13 | def __init__(self, *args): 14 | super(OpLogs, self).__init__(*args) 15 | 16 | self.start_time = None # 开始时间 17 | self.end_time = None # 响应时间 18 | self.data = {} # dict数据 19 | 20 | def process_request(self, request): 21 | 22 | self.start_time = time.time() # 开始时间 23 | 24 | re_ip = utils.get_ip(request) 25 | re_method = request.method 26 | re_content = request.GET if re_method == 'GET' else request.POST 27 | if re_content: 28 | re_content = json.dumps(re_content) 29 | else: 30 | re_content = None 31 | 32 | self.data.update( 33 | { 34 | 're_url': request.path, 35 | 're_method': re_method, 36 | 're_ip': re_ip, 37 | # 're_content': re_content, 38 | } 39 | ) 40 | # print(self.data) 41 | 42 | def process_response(self, request, response): 43 | 44 | # 耗时毫秒/ms 45 | self.end_time = time.time() # 响应时间 46 | access_time = self.end_time - self.start_time 47 | self.data['access_time'] = round(access_time * 1000) 48 | 49 | # 入库 50 | serializer = OpLogSerializer(data=self.data) 51 | if serializer.is_valid(): 52 | serializer.save() 53 | 54 | return response 55 | -------------------------------------------------------------------------------- /server/myapp/middlewares/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/myapp/middlewares/__init__.py -------------------------------------------------------------------------------- /server/myapp/permission/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/myapp/permission/__init__.py -------------------------------------------------------------------------------- /server/myapp/permission/permission.py: -------------------------------------------------------------------------------- 1 | from myapp.models import User 2 | 3 | 4 | def isDemoAdminUser(request): 5 | adminToken = request.META.get("HTTP_ADMINTOKEN") 6 | users = User.objects.filter(admin_token=adminToken) 7 | if len(users) > 0: 8 | user = users[0] 9 | if user.role == '3': # (角色3)表示演示帐号 10 | print('演示帐号===>') 11 | return True 12 | return False 13 | -------------------------------------------------------------------------------- /server/myapp/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /server/myapp/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from myapp import views 4 | 5 | app_name = 'myapp' 6 | urlpatterns = [ 7 | # api 8 | path('admin/overview/count', views.admin.overview.count), 9 | path('admin/overview/sysInfo', views.admin.overview.sysInfo), 10 | path('admin/thing/list', views.admin.thing.list_api), 11 | path('admin/thing/detail', views.admin.thing.detail), 12 | path('admin/thing/create', views.admin.thing.create), 13 | path('admin/thing/update', views.admin.thing.update), 14 | path('admin/thing/delete', views.admin.thing.delete), 15 | path('admin/customer/list', views.admin.customer.list_api), 16 | path('admin/customer/create', views.admin.customer.create), 17 | path('admin/customer/update', views.admin.customer.update), 18 | path('admin/customer/delete', views.admin.customer.delete), 19 | path('admin/comment/list', views.admin.comment.list_api), 20 | path('admin/comment/create', views.admin.comment.create), 21 | path('admin/comment/update', views.admin.comment.update), 22 | path('admin/comment/delete', views.admin.comment.delete), 23 | path('admin/classification/list', views.admin.classification.list_api), 24 | path('admin/classification/create', views.admin.classification.create), 25 | path('admin/classification/update', views.admin.classification.update), 26 | path('admin/classification/delete', views.admin.classification.delete), 27 | path('admin/tag/list', views.admin.tag.list_api), 28 | path('admin/tag/create', views.admin.tag.create), 29 | path('admin/tag/update', views.admin.tag.update), 30 | path('admin/tag/delete', views.admin.tag.delete), 31 | path('admin/record/list', views.admin.record.list_api), 32 | path('admin/record/create', views.admin.record.create), 33 | path('admin/record/update', views.admin.record.update), 34 | path('admin/record/delete', views.admin.record.delete), 35 | path('admin/banner/list', views.admin.banner.list_api), 36 | path('admin/banner/create', views.admin.banner.create), 37 | path('admin/banner/update', views.admin.banner.update), 38 | path('admin/banner/delete', views.admin.banner.delete), 39 | path('admin/ad/list', views.admin.ad.list_api), 40 | path('admin/ad/create', views.admin.ad.create), 41 | path('admin/ad/update', views.admin.ad.update), 42 | path('admin/ad/delete', views.admin.ad.delete), 43 | path('admin/notice/list', views.admin.notice.list_api), 44 | path('admin/notice/create', views.admin.notice.create), 45 | path('admin/notice/update', views.admin.notice.update), 46 | path('admin/notice/delete', views.admin.notice.delete), 47 | path('admin/loginLog/list', views.admin.loginLog.list_api), 48 | path('admin/loginLog/create', views.admin.loginLog.create), 49 | path('admin/loginLog/update', views.admin.loginLog.update), 50 | path('admin/loginLog/delete', views.admin.loginLog.delete), 51 | path('admin/opLog/list', views.admin.opLog.list_api), 52 | path('admin/errorLog/list', views.admin.errorLog.list_api), 53 | path('admin/user/list', views.admin.user.list_api), 54 | path('admin/user/create', views.admin.user.create), 55 | path('admin/user/update', views.admin.user.update), 56 | path('admin/user/updatePwd', views.admin.user.updatePwd), 57 | path('admin/user/delete', views.admin.user.delete), 58 | path('admin/user/info', views.admin.user.info), 59 | path('admin/adminLogin', views.admin.user.admin_login), 60 | 61 | 62 | ] 63 | -------------------------------------------------------------------------------- /server/myapp/utils.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import hashlib 3 | import time 4 | 5 | from rest_framework.views import exception_handler 6 | 7 | from myapp.serializers import ErrorLogSerializer 8 | 9 | def get_timestamp(): 10 | return int(round(time.time() * 1000)) 11 | 12 | def md5value(key): 13 | input_name = hashlib.md5() 14 | input_name.update(key.encode("utf-8")) 15 | md5str = (input_name.hexdigest()).lower() 16 | print('计算md5:', md5str) 17 | return md5str 18 | 19 | 20 | def dict_fetchall(cursor): # cursor是执行sql_str后的记录,作入参 21 | columns = [col[0] for col in cursor.description] # 得到域的名字col[0],组成List 22 | return [ 23 | dict(zip(columns, row)) for row in cursor.fetchall() 24 | ] 25 | 26 | 27 | def get_ip(request): 28 | """ 29 | 获取请求者的IP信息 30 | """ 31 | x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') 32 | if x_forwarded_for: 33 | ip = x_forwarded_for.split(',')[0] 34 | else: 35 | ip = request.META.get('REMOTE_ADDR') 36 | return ip 37 | 38 | 39 | def get_ua(request): 40 | """ 41 | 获取请求者的IP信息 42 | """ 43 | ua = request.META.get('HTTP_USER_AGENT') 44 | return ua[0:200] 45 | 46 | 47 | def getWeekDays(): 48 | """ 49 | 获取近一周的日期 50 | """ 51 | week_days = [] 52 | now = datetime.datetime.now() 53 | for i in range(7): 54 | day = now - datetime.timedelta(days=i) 55 | week_days.append(day.strftime('%Y-%m-%d %H:%M:%S.%f')[:10]) 56 | week_days.reverse() # 逆序 57 | return week_days 58 | 59 | 60 | def get_monday(): 61 | """ 62 | 获取本周周一日期 63 | """ 64 | now = datetime.datetime.now() 65 | monday = now - datetime.timedelta(now.weekday()) 66 | return monday.strftime('%Y-%m-%d %H:%M:%S.%f')[:10] 67 | 68 | 69 | def log_error(request, content): 70 | """ 71 | 记录错误日志 72 | """ 73 | ip = get_ip(request) 74 | method = request.method 75 | url = request.path 76 | 77 | data = { 78 | 'ip': ip, 79 | 'method': method, 80 | 'url': url, 81 | 'content': content 82 | } 83 | 84 | # 入库 85 | serializer = ErrorLogSerializer(data=data) 86 | if serializer.is_valid(): 87 | serializer.save() 88 | -------------------------------------------------------------------------------- /server/myapp/views/__init__.py: -------------------------------------------------------------------------------- 1 | from myapp.views.admin import * 2 | -------------------------------------------------------------------------------- /server/myapp/views/admin/__init__.py: -------------------------------------------------------------------------------- 1 | from myapp.views.admin.thing import * 2 | from myapp.views.admin.classification import * 3 | from myapp.views.admin.tag import * 4 | from myapp.views.admin.user import * 5 | from myapp.views.admin.comment import * 6 | from myapp.views.admin.record import * 7 | from myapp.views.admin.overview import * 8 | from myapp.views.admin.loginLog import * 9 | from myapp.views.admin.opLog import * 10 | from myapp.views.admin.errorLog import * 11 | from myapp.views.admin.banner import * 12 | from myapp.views.admin.ad import * 13 | from myapp.views.admin.notice import * 14 | from myapp.views.admin.customer import * 15 | -------------------------------------------------------------------------------- /server/myapp/views/admin/ad.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view, authentication_classes 3 | 4 | from myapp.auth.authentication import AdminTokenAuthtication 5 | from myapp.handler import APIResponse 6 | from myapp.models import Ad 7 | from myapp.permission.permission import isDemoAdminUser 8 | from myapp.serializers import AdSerializer 9 | 10 | 11 | @api_view(['GET']) 12 | def list_api(request): 13 | if request.method == 'GET': 14 | ads = Ad.objects.all().order_by('-create_time') 15 | serializer = AdSerializer(ads, many=True) 16 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 17 | 18 | 19 | @api_view(['POST']) 20 | @authentication_classes([AdminTokenAuthtication]) 21 | def create(request): 22 | if isDemoAdminUser(request): 23 | return APIResponse(code=1, msg='演示帐号无法操作') 24 | 25 | serializer = AdSerializer(data=request.data) 26 | if serializer.is_valid(): 27 | serializer.save() 28 | return APIResponse(code=0, msg='创建成功', data=serializer.data) 29 | 30 | return APIResponse(code=1, msg='创建失败') 31 | 32 | 33 | @api_view(['POST']) 34 | @authentication_classes([AdminTokenAuthtication]) 35 | def update(request): 36 | if isDemoAdminUser(request): 37 | return APIResponse(code=1, msg='演示帐号无法操作') 38 | 39 | try: 40 | pk = request.GET.get('id', -1) 41 | ad = Ad.objects.get(pk=pk) 42 | except Ad.DoesNotExist: 43 | return APIResponse(code=1, msg='对象不存在') 44 | 45 | serializer = AdSerializer(ad, data=request.data) 46 | if serializer.is_valid(): 47 | serializer.save() 48 | return APIResponse(code=0, msg='更新成功', data=serializer.data) 49 | else: 50 | print(serializer.errors) 51 | 52 | return APIResponse(code=1, msg='更新失败') 53 | 54 | 55 | @api_view(['POST']) 56 | @authentication_classes([AdminTokenAuthtication]) 57 | def delete(request): 58 | if isDemoAdminUser(request): 59 | return APIResponse(code=1, msg='演示帐号无法操作') 60 | 61 | try: 62 | ids = request.GET.get('ids') 63 | ids_arr = ids.split(',') 64 | Ad.objects.filter(id__in=ids_arr).delete() 65 | except Ad.DoesNotExist: 66 | return APIResponse(code=1, msg='对象不存在') 67 | 68 | return APIResponse(code=0, msg='删除成功') 69 | -------------------------------------------------------------------------------- /server/myapp/views/admin/banner.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view, authentication_classes 3 | 4 | from myapp.auth.authentication import AdminTokenAuthtication 5 | from myapp.handler import APIResponse 6 | from myapp.models import Banner 7 | from myapp.permission.permission import isDemoAdminUser 8 | from myapp.serializers import BannerSerializer 9 | 10 | 11 | @api_view(['GET']) 12 | def list_api(request): 13 | if request.method == 'GET': 14 | banners = Banner.objects.all().order_by('-create_time') 15 | serializer = BannerSerializer(banners, many=True) 16 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 17 | 18 | 19 | @api_view(['POST']) 20 | @authentication_classes([AdminTokenAuthtication]) 21 | def create(request): 22 | if isDemoAdminUser(request): 23 | return APIResponse(code=1, msg='演示帐号无法操作') 24 | 25 | serializer = BannerSerializer(data=request.data) 26 | if serializer.is_valid(): 27 | serializer.save() 28 | return APIResponse(code=0, msg='创建成功', data=serializer.data) 29 | 30 | return APIResponse(code=1, msg='创建失败') 31 | 32 | 33 | @api_view(['POST']) 34 | @authentication_classes([AdminTokenAuthtication]) 35 | def update(request): 36 | if isDemoAdminUser(request): 37 | return APIResponse(code=1, msg='演示帐号无法操作') 38 | 39 | try: 40 | pk = request.GET.get('id', -1) 41 | banner = Banner.objects.get(pk=pk) 42 | except Banner.DoesNotExist: 43 | return APIResponse(code=1, msg='对象不存在') 44 | 45 | serializer = BannerSerializer(banner, data=request.data) 46 | if serializer.is_valid(): 47 | serializer.save() 48 | return APIResponse(code=0, msg='更新成功', data=serializer.data) 49 | else: 50 | print(serializer.errors) 51 | 52 | return APIResponse(code=1, msg='更新失败') 53 | 54 | 55 | @api_view(['POST']) 56 | @authentication_classes([AdminTokenAuthtication]) 57 | def delete(request): 58 | if isDemoAdminUser(request): 59 | return APIResponse(code=1, msg='演示帐号无法操作') 60 | 61 | try: 62 | ids = request.GET.get('ids') 63 | ids_arr = ids.split(',') 64 | Banner.objects.filter(id__in=ids_arr).delete() 65 | except Banner.DoesNotExist: 66 | return APIResponse(code=1, msg='对象不存在') 67 | 68 | return APIResponse(code=0, msg='删除成功') 69 | -------------------------------------------------------------------------------- /server/myapp/views/admin/classification.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from django.db import connection 3 | from django.db.models import Q 4 | from rest_framework.decorators import api_view, authentication_classes 5 | 6 | from myapp.auth.authentication import AdminTokenAuthtication 7 | from myapp.handler import APIResponse 8 | from myapp.models import Classification 9 | from myapp.permission.permission import isDemoAdminUser 10 | from myapp.serializers import ClassificationSerializer 11 | from myapp.utils import dict_fetchall 12 | 13 | 14 | @api_view(['GET']) 15 | def list_api(request): 16 | if request.method == 'GET': 17 | classifications = Classification.objects.all().order_by('-create_time') 18 | serializer = ClassificationSerializer(classifications, many=True) 19 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 20 | 21 | 22 | @api_view(['POST']) 23 | @authentication_classes([AdminTokenAuthtication]) 24 | def create(request): 25 | if isDemoAdminUser(request): 26 | return APIResponse(code=1, msg='演示帐号无法操作') 27 | 28 | classification = Classification.objects.filter(title=request.data['title']) 29 | if len(classification) > 0: 30 | return APIResponse(code=1, msg='该名称已存在') 31 | 32 | serializer = ClassificationSerializer(data=request.data) 33 | if serializer.is_valid(): 34 | serializer.save() 35 | return APIResponse(code=0, msg='创建成功', data=serializer.data) 36 | 37 | return APIResponse(code=1, msg='创建失败') 38 | 39 | 40 | @api_view(['POST']) 41 | @authentication_classes([AdminTokenAuthtication]) 42 | def update(request): 43 | if isDemoAdminUser(request): 44 | return APIResponse(code=1, msg='演示帐号无法操作') 45 | 46 | try: 47 | pk = request.GET.get('id', -1) 48 | print(pk) 49 | classification = Classification.objects.get(pk=pk) 50 | except Classification.DoesNotExist: 51 | return APIResponse(code=1, msg='对象不存在') 52 | 53 | serializer = ClassificationSerializer(classification, data=request.data) 54 | if serializer.is_valid(): 55 | serializer.save() 56 | return APIResponse(code=0, msg='更新成功', data=serializer.data) 57 | 58 | return APIResponse(code=1, msg='更新失败') 59 | 60 | 61 | @api_view(['POST']) 62 | @authentication_classes([AdminTokenAuthtication]) 63 | def delete(request): 64 | if isDemoAdminUser(request): 65 | return APIResponse(code=1, msg='演示帐号无法操作') 66 | 67 | try: 68 | ids = request.GET.get('ids') 69 | ids_arr = ids.split(',') 70 | # 删除自身和自身的子孩子 71 | Classification.objects.filter(Q(id__in=ids_arr)).delete() 72 | except Classification.DoesNotExist: 73 | return APIResponse(code=1, msg='对象不存在') 74 | return APIResponse(code=0, msg='删除成功') 75 | -------------------------------------------------------------------------------- /server/myapp/views/admin/comment.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view, authentication_classes 3 | 4 | from myapp.auth.authentication import AdminTokenAuthtication 5 | from myapp.handler import APIResponse 6 | from myapp.models import Comment 7 | from myapp.permission.permission import isDemoAdminUser 8 | from myapp.serializers import CommentSerializer 9 | 10 | 11 | @api_view(['GET']) 12 | def list_api(request): 13 | if request.method == 'GET': 14 | comments = Comment.objects.select_related("thing").all().order_by('-comment_time') 15 | # print(comments) 16 | serializer = CommentSerializer(comments, many=True) 17 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 18 | 19 | 20 | @api_view(['POST']) 21 | @authentication_classes([AdminTokenAuthtication]) 22 | def create(request): 23 | if isDemoAdminUser(request): 24 | return APIResponse(code=1, msg='演示帐号无法操作') 25 | 26 | serializer = CommentSerializer(data=request.data) 27 | if serializer.is_valid(): 28 | serializer.save() 29 | return APIResponse(code=0, msg='创建成功', data=serializer.data) 30 | else: 31 | print(serializer.errors) 32 | 33 | return APIResponse(code=1, msg='创建失败') 34 | 35 | 36 | @api_view(['POST']) 37 | @authentication_classes([AdminTokenAuthtication]) 38 | def update(request): 39 | if isDemoAdminUser(request): 40 | return APIResponse(code=1, msg='演示帐号无法操作') 41 | 42 | try: 43 | pk = request.GET.get('id', -1) 44 | comments = Comment.objects.get(pk=pk) 45 | except Comment.DoesNotExist: 46 | return APIResponse(code=1, msg='对象不存在') 47 | 48 | serializer = CommentSerializer(comments, data=request.data) 49 | if serializer.is_valid(): 50 | serializer.save() 51 | return APIResponse(code=0, msg='更新成功', data=serializer.data) 52 | 53 | return APIResponse(code=1, msg='更新失败') 54 | 55 | 56 | @api_view(['POST']) 57 | @authentication_classes([AdminTokenAuthtication]) 58 | def delete(request): 59 | if isDemoAdminUser(request): 60 | return APIResponse(code=1, msg='演示帐号无法操作') 61 | 62 | try: 63 | ids = request.GET.get('ids') 64 | ids_arr = ids.split(',') 65 | Comment.objects.filter(id__in=ids_arr).delete() 66 | except Comment.DoesNotExist: 67 | return APIResponse(code=1, msg='对象不存在') 68 | 69 | return APIResponse(code=0, msg='删除成功') 70 | -------------------------------------------------------------------------------- /server/myapp/views/admin/customer.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view, authentication_classes 3 | 4 | from myapp import utils 5 | from myapp.auth.authentication import AdminTokenAuthtication 6 | from myapp.handler import APIResponse 7 | from myapp.models import Customer 8 | from myapp.permission.permission import isDemoAdminUser 9 | from myapp.serializers import CustomerSerializer 10 | 11 | 12 | @api_view(['GET']) 13 | def list_api(request): 14 | if request.method == 'GET': 15 | tags = Customer.objects.all().order_by('-create_time') 16 | serializer = CustomerSerializer(tags, many=True) 17 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 18 | 19 | 20 | @api_view(['POST']) 21 | @authentication_classes([AdminTokenAuthtication]) 22 | def create(request): 23 | if isDemoAdminUser(request): 24 | return APIResponse(code=1, msg='演示帐号无法操作') 25 | 26 | serializer = CustomerSerializer(data=request.data) 27 | if serializer.is_valid(): 28 | serializer.save() 29 | return APIResponse(code=0, msg='创建成功', data=serializer.data) 30 | else: 31 | utils.log_error(request, '参数错误') 32 | 33 | return APIResponse(code=1, msg='创建失败') 34 | 35 | 36 | @api_view(['POST']) 37 | @authentication_classes([AdminTokenAuthtication]) 38 | def update(request): 39 | if isDemoAdminUser(request): 40 | return APIResponse(code=1, msg='演示帐号无法操作') 41 | 42 | try: 43 | pk = request.GET.get('id', -1) 44 | tags = Customer.objects.get(pk=pk) 45 | except Customer.DoesNotExist: 46 | return APIResponse(code=1, msg='对象不存在') 47 | 48 | serializer = CustomerSerializer(tags, data=request.data) 49 | if serializer.is_valid(): 50 | serializer.save() 51 | return APIResponse(code=0, msg='更新成功', data=serializer.data) 52 | else: 53 | utils.log_error(request, '参数错误') 54 | 55 | return APIResponse(code=1, msg='更新失败') 56 | 57 | 58 | @api_view(['POST']) 59 | @authentication_classes([AdminTokenAuthtication]) 60 | def delete(request): 61 | if isDemoAdminUser(request): 62 | return APIResponse(code=1, msg='演示帐号无法操作') 63 | 64 | try: 65 | ids = request.GET.get('ids') 66 | ids_arr = ids.split(',') 67 | Customer.objects.filter(id__in=ids_arr).delete() 68 | except Customer.DoesNotExist: 69 | return APIResponse(code=1, msg='对象不存在') 70 | 71 | return APIResponse(code=0, msg='删除成功') 72 | -------------------------------------------------------------------------------- /server/myapp/views/admin/errorLog.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view 3 | 4 | from myapp.handler import APIResponse 5 | from myapp.models import ErrorLog 6 | from myapp.serializers import ErrorLogSerializer 7 | 8 | 9 | @api_view(['GET']) 10 | def list_api(request): 11 | if request.method == 'GET': 12 | errorLogs = ErrorLog.objects.all().order_by('-log_time') 13 | serializer = ErrorLogSerializer(errorLogs, many=True) 14 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 15 | -------------------------------------------------------------------------------- /server/myapp/views/admin/loginLog.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view, authentication_classes 3 | 4 | from myapp.auth.authentication import AdminTokenAuthtication 5 | from myapp.handler import APIResponse 6 | from myapp.models import LoginLog 7 | from myapp.permission.permission import isDemoAdminUser 8 | from myapp.serializers import LoginLogSerializer 9 | 10 | 11 | @api_view(['GET']) 12 | def list_api(request): 13 | if request.method == 'GET': 14 | loginLogs = LoginLog.objects.all().order_by('-log_time') 15 | serializer = LoginLogSerializer(loginLogs, many=True) 16 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 17 | 18 | 19 | @api_view(['POST']) 20 | def create(request): 21 | 22 | serializer = LoginLogSerializer(data=request.data) 23 | if serializer.is_valid(): 24 | serializer.save() 25 | return APIResponse(code=0, msg='创建成功', data=serializer.data) 26 | 27 | return APIResponse(code=1, msg='创建失败') 28 | 29 | 30 | @api_view(['POST']) 31 | @authentication_classes([AdminTokenAuthtication]) 32 | def update(request): 33 | try: 34 | pk = request.GET.get('id', -1) 35 | loginLogs = LoginLog.objects.get(pk=pk) 36 | except LoginLog.DoesNotExist: 37 | return APIResponse(code=1, msg='对象不存在') 38 | 39 | serializer = LoginLogSerializer(loginLogs, data=request.data) 40 | if serializer.is_valid(): 41 | serializer.save() 42 | return APIResponse(code=0, msg='更新成功', data=serializer.data) 43 | 44 | return APIResponse(code=1, msg='更新失败') 45 | 46 | 47 | @api_view(['POST']) 48 | @authentication_classes([AdminTokenAuthtication]) 49 | def delete(request): 50 | if isDemoAdminUser(request): 51 | return APIResponse(code=1, msg='演示帐号无法操作') 52 | 53 | try: 54 | ids = request.GET.get('ids') 55 | ids_arr = ids.split(',') 56 | LoginLog.objects.filter(id__in=ids_arr).delete() 57 | except LoginLog.DoesNotExist: 58 | return APIResponse(code=1, msg='对象不存在') 59 | 60 | return APIResponse(code=0, msg='删除成功') 61 | -------------------------------------------------------------------------------- /server/myapp/views/admin/notice.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view, authentication_classes 3 | 4 | from myapp.auth.authentication import AdminTokenAuthtication 5 | from myapp.handler import APIResponse 6 | from myapp.models import Notice 7 | from myapp.permission.permission import isDemoAdminUser 8 | from myapp.serializers import NoticeSerializer 9 | 10 | 11 | @api_view(['GET']) 12 | def list_api(request): 13 | if request.method == 'GET': 14 | notices = Notice.objects.all().order_by('-create_time') 15 | serializer = NoticeSerializer(notices, many=True) 16 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 17 | 18 | 19 | @api_view(['POST']) 20 | @authentication_classes([AdminTokenAuthtication]) 21 | def create(request): 22 | if isDemoAdminUser(request): 23 | return APIResponse(code=1, msg='演示帐号无法操作') 24 | 25 | serializer = NoticeSerializer(data=request.data) 26 | if serializer.is_valid(): 27 | serializer.save() 28 | return APIResponse(code=0, msg='创建成功', data=serializer.data) 29 | 30 | return APIResponse(code=1, msg='创建失败') 31 | 32 | 33 | @api_view(['POST']) 34 | @authentication_classes([AdminTokenAuthtication]) 35 | def update(request): 36 | if isDemoAdminUser(request): 37 | return APIResponse(code=1, msg='演示帐号无法操作') 38 | 39 | try: 40 | pk = request.GET.get('id', -1) 41 | notice = Notice.objects.get(pk=pk) 42 | except Notice.DoesNotExist: 43 | return APIResponse(code=1, msg='对象不存在') 44 | 45 | serializer = NoticeSerializer(notice, data=request.data) 46 | if serializer.is_valid(): 47 | serializer.save() 48 | return APIResponse(code=0, msg='更新成功', data=serializer.data) 49 | else: 50 | print(serializer.errors) 51 | 52 | return APIResponse(code=1, msg='更新失败') 53 | 54 | 55 | @api_view(['POST']) 56 | @authentication_classes([AdminTokenAuthtication]) 57 | def delete(request): 58 | if isDemoAdminUser(request): 59 | return APIResponse(code=1, msg='演示帐号无法操作') 60 | 61 | try: 62 | ids = request.GET.get('ids') 63 | ids_arr = ids.split(',') 64 | Notice.objects.filter(id__in=ids_arr).delete() 65 | except Notice.DoesNotExist: 66 | return APIResponse(code=1, msg='对象不存在') 67 | 68 | return APIResponse(code=0, msg='删除成功') 69 | -------------------------------------------------------------------------------- /server/myapp/views/admin/opLog.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view 3 | 4 | from myapp.handler import APIResponse 5 | from myapp.models import OpLog 6 | from myapp.serializers import OpLogSerializer 7 | 8 | 9 | @api_view(['GET']) 10 | def list_api(request): 11 | if request.method == 'GET': 12 | opLogs = OpLog.objects.all().order_by('-re_time')[:100] 13 | serializer = OpLogSerializer(opLogs, many=True) 14 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 15 | -------------------------------------------------------------------------------- /server/myapp/views/admin/record.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view 3 | 4 | from myapp.handler import APIResponse 5 | from myapp.models import Record 6 | from myapp.serializers import RecordSerializer 7 | 8 | 9 | @api_view(['GET']) 10 | def list_api(request): 11 | if request.method == 'GET': 12 | records = Record.objects.all() 13 | serializer = RecordSerializer(records, many=True) 14 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 15 | 16 | 17 | @api_view(['POST']) 18 | def create(request): 19 | 20 | serializer = RecordSerializer(data=request.data) 21 | if serializer.is_valid(): 22 | serializer.save() 23 | return APIResponse(code=0, msg='创建成功', data=serializer.data) 24 | 25 | return APIResponse(code=1, msg='创建失败') 26 | 27 | 28 | @api_view(['POST']) 29 | def update(request): 30 | try: 31 | pk = request.GET.get('id', -1) 32 | records = Record.objects.get(pk=pk) 33 | except Record.DoesNotExist: 34 | return APIResponse(code=1, msg='对象不存在') 35 | 36 | serializer = RecordSerializer(records, data=request.data) 37 | if serializer.is_valid(): 38 | serializer.save() 39 | return APIResponse(code=0, msg='更新成功', data=serializer.data) 40 | 41 | return APIResponse(code=1, msg='更新失败') 42 | 43 | 44 | @api_view(['POST']) 45 | def delete(request): 46 | try: 47 | ids = request.GET.get('ids') 48 | ids_arr = ids.split(',') 49 | Record.objects.filter(id__in=ids_arr).delete() 50 | except Record.DoesNotExist: 51 | return APIResponse(code=1, msg='对象不存在') 52 | 53 | return APIResponse(code=0, msg='删除成功') 54 | -------------------------------------------------------------------------------- /server/myapp/views/admin/tag.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from rest_framework.decorators import api_view, authentication_classes 3 | 4 | from myapp import utils 5 | from myapp.auth.authentication import AdminTokenAuthtication 6 | from myapp.handler import APIResponse 7 | from myapp.models import Tag 8 | from myapp.permission.permission import isDemoAdminUser 9 | from myapp.serializers import TagSerializer 10 | 11 | 12 | @api_view(['GET']) 13 | def list_api(request): 14 | if request.method == 'GET': 15 | tags = Tag.objects.all().order_by('-create_time') 16 | serializer = TagSerializer(tags, many=True) 17 | return APIResponse(code=0, msg='查询成功', data=serializer.data) 18 | 19 | 20 | @api_view(['POST']) 21 | @authentication_classes([AdminTokenAuthtication]) 22 | def create(request): 23 | if isDemoAdminUser(request): 24 | return APIResponse(code=1, msg='演示帐号无法操作') 25 | 26 | tags = Tag.objects.filter(title=request.data['title']) 27 | if len(tags) > 0: 28 | return APIResponse(code=1, msg='该名称已存在') 29 | 30 | serializer = TagSerializer(data=request.data) 31 | if serializer.is_valid(): 32 | serializer.save() 33 | return APIResponse(code=0, msg='创建成功', data=serializer.data) 34 | else: 35 | utils.log_error(request, '参数错误') 36 | 37 | return APIResponse(code=1, msg='创建失败') 38 | 39 | 40 | @api_view(['POST']) 41 | @authentication_classes([AdminTokenAuthtication]) 42 | def update(request): 43 | if isDemoAdminUser(request): 44 | return APIResponse(code=1, msg='演示帐号无法操作') 45 | 46 | try: 47 | pk = request.GET.get('id', -1) 48 | tags = Tag.objects.get(pk=pk) 49 | except Tag.DoesNotExist: 50 | return APIResponse(code=1, msg='对象不存在') 51 | 52 | serializer = TagSerializer(tags, data=request.data) 53 | if serializer.is_valid(): 54 | serializer.save() 55 | return APIResponse(code=0, msg='更新成功', data=serializer.data) 56 | else: 57 | utils.log_error(request, '参数错误') 58 | 59 | return APIResponse(code=1, msg='更新失败') 60 | 61 | 62 | @api_view(['POST']) 63 | @authentication_classes([AdminTokenAuthtication]) 64 | def delete(request): 65 | if isDemoAdminUser(request): 66 | return APIResponse(code=1, msg='演示帐号无法操作') 67 | 68 | try: 69 | ids = request.GET.get('ids') 70 | ids_arr = ids.split(',') 71 | Tag.objects.filter(id__in=ids_arr).delete() 72 | except Tag.DoesNotExist: 73 | return APIResponse(code=1, msg='对象不存在') 74 | 75 | return APIResponse(code=0, msg='删除成功') 76 | -------------------------------------------------------------------------------- /server/readme.md: -------------------------------------------------------------------------------- 1 | ### 后端部署步骤 2 | 3 | 4 | 5 | 1. 安装mysql数据库,启动服务 6 | 2. 打开cmd命令行,进入mysql,并新建数据库 7 | ``` 8 | mysql -u root -p 9 | CREATE DATABASE IF NOT EXISTS python_yaodian DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 10 | ``` 11 | 3. 恢复sql数据 12 | ``` 13 | use python_yaodian 14 | source python_yaodian.sql 15 | ``` 16 | 4. 修改settings.py中的配置信息 17 | 5. 复制资源,将upload文件夹复制到server目录下 18 | 6. 安装python 3.8 19 | 7. 安装依赖包 20 | ``` 21 | pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple 22 | ``` 23 | 运行项目 24 | ``` 25 | python manage.py runserver 26 | ``` 27 | 7. 后期维护改动 28 | 29 | 将修改的py文件覆盖服务器的py文件即可,重启django 30 | 31 | ### 删除数据库 32 | 33 | drop database if exists xxxx; 34 | 35 | ### 创建数据库 36 | 37 | CREATE DATABASE IF NOT EXISTS xxxx DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 38 | 39 | 40 | ### 迁移数据库表 41 | 42 | ``` 43 | python manage.py makemigrations; 44 | 45 | python manage.py migrate; 46 | 47 | python manage.py makemigrations myapp; 48 | 49 | python manage.py migrate myapp; 50 | ``` 51 | 52 | ### 跨域配置 53 | 54 | django-cors-headers 55 | 56 | ### 多对多技术参考 57 | 58 | https://www.cnblogs.com/SunshineKimi/p/14140900.html 59 | 60 | ### 二级分类设计 61 | https://blog.csdn.net/weixin_47971206/article/details/124199978 62 | 63 | ### 常见问题 64 | 65 | 多对多的查询可通过related_name别名查询 66 | join查询 67 | ForeignKey的时候字段会自动加_id后缀 68 | 学习SerializerMethodField 69 | 跨域配置 django-cors-headers 70 | 数据库备份命令: 71 | mysqldump -u root -p --databases 数据库名称 > xxx.sql 72 | 数据库还原命令: 73 | source D:/xxx/xxx/xxx.sql; 74 | 创建管理员命令: 75 | insert into b_user(username,password,role,status) values('admin111',md5('admin111'),1,'0'); 76 | 77 | 接口请求频次限制 78 | 79 | 80 | ### 登录接口 81 | 82 | 调login -> 生成token 83 | 84 | 85 | ### 注意 86 | 87 | update接口的时候,如果model里面存在多对多字段,则需要设置explode 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /server/requirements.txt: -------------------------------------------------------------------------------- 1 | Django==3.2.11 2 | PyMySQL==1.0.2 3 | djangorestframework==3.13.0 4 | django-cors-headers==3.13.0 5 | Pillow==9.1.1 6 | psutil==5.9.4 -------------------------------------------------------------------------------- /server/server/__init__.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | pymysql.install_as_MySQLdb() 3 | 4 | print("===============install pymysql==============") -------------------------------------------------------------------------------- /server/server/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for server project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /server/server/urls.py: -------------------------------------------------------------------------------- 1 | """server URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/4.1/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.conf.urls.static import static 17 | from django.contrib import admin 18 | from django.urls import path, include 19 | 20 | from server import settings 21 | 22 | urlpatterns = [ 23 | path('admin/', admin.site.urls), 24 | path('myapp/', include('myapp.urls')), 25 | ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 26 | -------------------------------------------------------------------------------- /server/server/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for server project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /server/upload/ad/1674045266113.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/ad/1674045266113.jpeg -------------------------------------------------------------------------------- /server/upload/ad/1674045282581.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/ad/1674045282581.jpeg -------------------------------------------------------------------------------- /server/upload/ad/1674045308177.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/ad/1674045308177.png -------------------------------------------------------------------------------- /server/upload/ad/1674045324510.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/ad/1674045324510.jpeg -------------------------------------------------------------------------------- /server/upload/ad/1684565423182.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/ad/1684565423182.jpeg -------------------------------------------------------------------------------- /server/upload/ad/1684565863904.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/ad/1684565863904.jpeg -------------------------------------------------------------------------------- /server/upload/ad/1684565876995.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/ad/1684565876995.png -------------------------------------------------------------------------------- /server/upload/avatar/1676553050529.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/avatar/1676553050529.png -------------------------------------------------------------------------------- /server/upload/avatar/1676553366217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/avatar/1676553366217.png -------------------------------------------------------------------------------- /server/upload/avatar/1676553498600.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/avatar/1676553498600.jpeg -------------------------------------------------------------------------------- /server/upload/avatar/1676553815688.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/avatar/1676553815688.jpeg -------------------------------------------------------------------------------- /server/upload/avatar/1677240189427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/avatar/1677240189427.png -------------------------------------------------------------------------------- /server/upload/avatar/1677982820781.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/avatar/1677982820781.jpeg -------------------------------------------------------------------------------- /server/upload/avatar/1679146350134.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/avatar/1679146350134.jpeg -------------------------------------------------------------------------------- /server/upload/avatar/1684593239449.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/avatar/1684593239449.png -------------------------------------------------------------------------------- /server/upload/avatar/1684593453676.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/avatar/1684593453676.jpeg -------------------------------------------------------------------------------- /server/upload/banner/1673963977440.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673963977440.jpeg -------------------------------------------------------------------------------- /server/upload/banner/1673964384835.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673964384835.png -------------------------------------------------------------------------------- /server/upload/banner/1673964652167.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673964652167.jpeg -------------------------------------------------------------------------------- /server/upload/banner/1673965110189.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673965110189.jpeg -------------------------------------------------------------------------------- /server/upload/banner/1673965198155.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673965198155.jpeg -------------------------------------------------------------------------------- /server/upload/banner/1673965389141.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673965389141.jpeg -------------------------------------------------------------------------------- /server/upload/banner/1673965574311.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673965574311.png -------------------------------------------------------------------------------- /server/upload/banner/1673965709533.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673965709533.jpeg -------------------------------------------------------------------------------- /server/upload/banner/1673965718720.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673965718720.png -------------------------------------------------------------------------------- /server/upload/banner/1673965728690.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/banner/1673965728690.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1.jpg -------------------------------------------------------------------------------- /server/upload/cover/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/10.jpg -------------------------------------------------------------------------------- /server/upload/cover/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/11.jpg -------------------------------------------------------------------------------- /server/upload/cover/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/12.jpg -------------------------------------------------------------------------------- /server/upload/cover/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/13.jpg -------------------------------------------------------------------------------- /server/upload/cover/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/14.jpg -------------------------------------------------------------------------------- /server/upload/cover/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/15.jpg -------------------------------------------------------------------------------- /server/upload/cover/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/16.jpg -------------------------------------------------------------------------------- /server/upload/cover/1672749055571.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1672749055571.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1674044230851.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1674044230851.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1676186518276.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676186518276.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1676186872895.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676186872895.png -------------------------------------------------------------------------------- /server/upload/cover/1676186935002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676186935002.png -------------------------------------------------------------------------------- /server/upload/cover/1676188277099.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676188277099.png -------------------------------------------------------------------------------- /server/upload/cover/1676188355688.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676188355688.png -------------------------------------------------------------------------------- /server/upload/cover/1676381084256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676381084256.png -------------------------------------------------------------------------------- /server/upload/cover/1676381091144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676381091144.png -------------------------------------------------------------------------------- /server/upload/cover/1676381097051.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676381097051.png -------------------------------------------------------------------------------- /server/upload/cover/1676381103032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676381103032.png -------------------------------------------------------------------------------- /server/upload/cover/1676381110015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1676381110015.png -------------------------------------------------------------------------------- /server/upload/cover/1677500674281.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677500674281.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677501266461.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677501266461.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677501470234.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677501470234.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677501544737.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677501544737.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505180730.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505180730.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505298772.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505298772.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505357042.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505357042.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505364969.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505364969.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505380921.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505380921.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505393025.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505393025.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505410960.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505410960.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505421920.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505421920.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505436478.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505436478.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505452753.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505452753.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505579480.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505579480.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505616285.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505616285.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505626565.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505626565.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505637425.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505637425.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505648826.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505648826.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505659291.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505659291.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505667178.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505667178.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505685641.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505685641.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505695894.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505695894.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505706333.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505706333.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505876732.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505876732.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505884200.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505884200.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505890616.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505890616.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505897079.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505897079.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505910282.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505910282.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505919134.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505919134.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505928898.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505928898.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505937048.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505937048.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505945207.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505945207.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677505953782.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677505953782.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677588447622.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677588447622.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1677677497401.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1677677497401.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1678529114670.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1678529114670.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679056479437.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679056479437.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679056528013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679056528013.png -------------------------------------------------------------------------------- /server/upload/cover/1679056561868.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679056561868.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679056587496.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679056587496.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679058036014.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679058036014.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679058043365.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679058043365.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679229610791.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679229610791.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679229780971.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679229780971.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679229853940.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679229853940.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679229963230.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679229963230.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230045590.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230045590.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230092657.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230092657.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230147996.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230147996.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230364390.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230364390.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230543572.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230543572.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230586243.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230586243.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230641879.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230641879.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230894621.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230894621.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230935716.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230935716.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679230989243.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679230989243.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679231022326.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679231022326.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679231052822.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679231052822.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679231084420.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679231084420.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679231113572.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679231113572.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679231151929.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679231151929.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679231184020.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679231184020.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679231221940.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679231221940.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679231465845.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679231465845.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232418133.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232418133.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232448857.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232448857.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232480948.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232480948.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232514230.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232514230.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232543082.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232543082.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232587234.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232587234.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232615578.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232615578.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232650073.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232650073.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232676818.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232676818.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232717023.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232717023.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679232756075.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679232756075.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315151478.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315151478.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315191893.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315191893.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315240787.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315240787.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315276060.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315276060.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315310720.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315310720.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315343720.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315343720.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315365210.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315365210.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315396953.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315396953.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315437571.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315437571.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315478327.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315478327.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315749022.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315749022.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315761797.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315761797.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315803245.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315803245.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315842977.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315842977.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315883620.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315883620.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315915467.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315915467.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315954931.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315954931.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679315985852.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679315985852.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316037517.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316037517.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316072493.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316072493.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316422812.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316422812.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316453474.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316453474.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316484842.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316484842.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316513693.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316513693.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316533369.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316533369.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316566135.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316566135.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316605104.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316605104.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316637185.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316637185.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316666891.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316666891.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679316698087.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679316698087.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403034316.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403034316.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403102225.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403102225.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403138846.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403138846.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403158073.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403158073.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403193320.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403193320.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403239138.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403239138.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403285129.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403285129.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403331202.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403331202.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403370669.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403370669.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403403756.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403403756.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403503106.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403503106.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403631942.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403631942.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403697740.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403697740.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679403736341.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679403736341.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1679488092121.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1679488092121.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1684567758685.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1684567758685.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1684567804066.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1684567804066.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1684567891591.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1684567891591.png -------------------------------------------------------------------------------- /server/upload/cover/1685170107820.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685170107820.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685170987684.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685170987684.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685171442599.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685171442599.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685193225537.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685193225537.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685240184357.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685240184357.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685240191000.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685240191000.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685263611250.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685263611250.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685263639285.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685263639285.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685263674742.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685263674742.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685263699773.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685263699773.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685263937295.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685263937295.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685263997721.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685263997721.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264026586.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264026586.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264114074.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264114074.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264135851.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264135851.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264163148.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264163148.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264250423.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264250423.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264270509.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264270509.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264295265.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264295265.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264355503.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264355503.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264420316.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264420316.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264443807.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264443807.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264535734.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264535734.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264562903.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264562903.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264586283.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264586283.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264771439.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264771439.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264800237.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264800237.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264830789.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264830789.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685264878356.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685264878356.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1685265162834.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1685265162834.jpeg -------------------------------------------------------------------------------- /server/upload/cover/1691491016343.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/1691491016343.jpeg -------------------------------------------------------------------------------- /server/upload/cover/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/17.jpg -------------------------------------------------------------------------------- /server/upload/cover/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/18.jpg -------------------------------------------------------------------------------- /server/upload/cover/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/19.jpg -------------------------------------------------------------------------------- /server/upload/cover/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/2.jpg -------------------------------------------------------------------------------- /server/upload/cover/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/20.jpg -------------------------------------------------------------------------------- /server/upload/cover/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/21.jpg -------------------------------------------------------------------------------- /server/upload/cover/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/22.jpg -------------------------------------------------------------------------------- /server/upload/cover/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/23.jpg -------------------------------------------------------------------------------- /server/upload/cover/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/24.jpg -------------------------------------------------------------------------------- /server/upload/cover/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/25.jpg -------------------------------------------------------------------------------- /server/upload/cover/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/26.jpg -------------------------------------------------------------------------------- /server/upload/cover/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/27.jpg -------------------------------------------------------------------------------- /server/upload/cover/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/28.jpg -------------------------------------------------------------------------------- /server/upload/cover/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/29.jpg -------------------------------------------------------------------------------- /server/upload/cover/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/3.jpg -------------------------------------------------------------------------------- /server/upload/cover/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/30.jpg -------------------------------------------------------------------------------- /server/upload/cover/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/4.jpg -------------------------------------------------------------------------------- /server/upload/cover/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/5.jpg -------------------------------------------------------------------------------- /server/upload/cover/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/6.jpg -------------------------------------------------------------------------------- /server/upload/cover/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/7.jpg -------------------------------------------------------------------------------- /server/upload/cover/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/8.jpg -------------------------------------------------------------------------------- /server/upload/cover/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/python_yaodian/697c83d6791da509b459c5487fbb59c3bf150876/server/upload/cover/9.jpg -------------------------------------------------------------------------------- /web/.eslintignore: -------------------------------------------------------------------------------- 1 | 2 | *.sh 3 | node_modules 4 | *.md 5 | *.woff 6 | *.ttf 7 | .vscode 8 | .idea 9 | dist 10 | /public 11 | /docs 12 | .husky 13 | .local 14 | /bin 15 | Dockerfile 16 | -------------------------------------------------------------------------------- /web/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | node: true, 6 | es6: true, 7 | }, 8 | parser: 'vue-eslint-parser', 9 | parserOptions: { 10 | parser: '@typescript-eslint/parser', 11 | ecmaVersion: 2020, 12 | sourceType: 'module', 13 | jsxPragma: 'React', 14 | ecmaFeatures: { 15 | jsx: true, 16 | }, 17 | }, 18 | extends: ['plugin:vue/vue3-recommended', 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'], 19 | rules: { 20 | 'vue/script-setup-uses-vars': 'error', 21 | '@typescript-eslint/ban-ts-ignore': 'off', 22 | '@typescript-eslint/explicit-function-return-type': 'off', 23 | '@typescript-eslint/no-explicit-any': 'off', 24 | '@typescript-eslint/no-var-requires': 'off', 25 | '@typescript-eslint/no-empty-function': 'off', 26 | 'vue/custom-event-name-casing': 'off', 27 | 'no-use-before-define': 'off', 28 | '@typescript-eslint/no-use-before-define': 'off', 29 | '@typescript-eslint/ban-ts-comment': 'off', 30 | '@typescript-eslint/ban-types': 'off', 31 | '@typescript-eslint/no-non-null-assertion': 'off', 32 | '@typescript-eslint/explicit-module-boundary-types': 'off', 33 | '@typescript-eslint/no-unused-vars': 'off', 34 | 'no-unused-vars': 'off', 35 | 'space-before-function-paren': 'off', 36 | 37 | 'vue/attributes-order': 'off', 38 | 'vue/one-component-per-file': 'off', 39 | 'vue/html-closing-bracket-newline': 'off', 40 | 'vue/max-attributes-per-line': 'off', 41 | 'vue/multiline-html-element-content-newline': 'off', 42 | 'vue/singleline-html-element-content-newline': 'off', 43 | 'vue/attribute-hyphenation': 'off', 44 | 'vue/require-default-prop': 'off', 45 | 'vue/require-explicit-emits': 'off', 46 | 'vue/html-self-closing': [ 47 | 'error', 48 | { 49 | html: { 50 | void: 'always', 51 | normal: 'never', 52 | component: 'always', 53 | }, 54 | svg: 'always', 55 | math: 'always', 56 | }, 57 | ], 58 | 'vue/multi-word-component-names': 'off', 59 | }, 60 | }; 61 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | .local 6 | .history 7 | # local env files 8 | .env.local 9 | .env.*.local 10 | .eslintcache 11 | .github 12 | .husky 13 | .vscode 14 | 15 | # Log files 16 | npm-debug.log* 17 | yarn-debug.log* 18 | yarn-error.log* 19 | pnpm-debug.log* 20 | pnpm-lock.yaml* 21 | 22 | # Editor directories and files 23 | .idea 24 | # .vscode 25 | *.suo 26 | *.ntvs* 27 | *.njsproj 28 | *.sln 29 | *.sw? 30 | ./packages 31 | ./history 32 | -------------------------------------------------------------------------------- /web/.stylelintignore: -------------------------------------------------------------------------------- 1 | /dist/* 2 | /public/* 3 | public/* 4 | -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | # 学习文档 2 | 3 | #### 部署步骤 4 | 5 | 1. 修改constants.ts中的BASE_URL 6 | 2. vite build 7 | 3. 将dist部署到nginx 8 | 9 | 10 | #### 配置解释 11 | 12 | 1. env.development 开发环境配置 13 | 2. eslintrc.js 代码规范化提示 14 | 3. vite.config.js vite 开发服务器配置 15 | 16 | #### 常见问题 17 | 18 | ##### 变量 19 | https://blog.csdn.net/qq_41636947/article/details/117907448 20 | 21 | ##### antd的css引入方式 22 | 在index.html里面引入的cdn 23 | 24 | ##### cdn 25 | https://cdn.jsdelivr.net/npm/ant-design-vue@3.2.20/dist/ 26 | https://cdn.staticfile.org/ant-design-vue/3.2.20/antd.min.css 27 | 28 | #### public文件夹内容在build后会自动打到dist中 29 | -------------------------------------------------------------------------------- /web/build/constant.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name Config 3 | * @description 项目配置 4 | */ 5 | 6 | 7 | // 本地服务端口 8 | export const VITE_PORT = 3000; 9 | 10 | // 包依赖分析 11 | export const ANALYSIS = true; 12 | 13 | // 代码压缩 14 | export const COMPRESSION = true; 15 | 16 | -------------------------------------------------------------------------------- /web/build/vite/plugins/autoImport.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name AutoImportDeps 3 | * @description 按需加载,自动引入 4 | */ 5 | import AutoImport from 'unplugin-auto-import/vite'; 6 | // import { AntDesignVueResolver} from 'unplugin-vue-components/resolvers'; 7 | 8 | export const AutoImportDeps = () => { 9 | return AutoImport({ 10 | dts: 'types/auto-imports.d.ts', 11 | imports: [ 12 | 'vue', 13 | 'pinia', 14 | 'vue-router', 15 | { 16 | '@vueuse/core': [], 17 | }, 18 | { 19 | 'naive-ui': ['useDialog', 'useMessage', 'useNotification', 'useLoadingBar'], 20 | }, 21 | ], 22 | resolvers: [ 23 | // AntDesignVueResolver(), 24 | ], 25 | }); 26 | }; 27 | -------------------------------------------------------------------------------- /web/build/vite/plugins/component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name AutoRegistryComponents 3 | * @description 按需加载,自动引入组件 4 | */ 5 | import Components from 'unplugin-vue-components/vite'; 6 | import { 7 | ElementPlusResolver, 8 | VueUseComponentsResolver, 9 | AntDesignVueResolver, 10 | TDesignResolver, 11 | NaiveUiResolver, 12 | } from 'unplugin-vue-components/resolvers'; 13 | export const AutoRegistryComponents = () => { 14 | return Components({ 15 | dirs: ['src/components'], 16 | extensions: ['vue'], 17 | deep: true, 18 | dts: 'types/components.d.ts', 19 | directoryAsNamespace: false, 20 | globalNamespaces: [], 21 | directives: true, 22 | importPathTransform: (v) => v, 23 | allowOverrides: false, 24 | include: [/\.vue$/, /\.vue\?vue/], 25 | exclude: [/[\\/]node_modules[\\/]/, /[\\/]\.git[\\/]/, /[\\/]\.nuxt[\\/]/], 26 | resolvers: [ 27 | ElementPlusResolver(), 28 | VueUseComponentsResolver(), 29 | AntDesignVueResolver(), 30 | TDesignResolver({ 31 | library: 'vue-next', 32 | }), 33 | NaiveUiResolver(), 34 | ], 35 | }); 36 | }; 37 | -------------------------------------------------------------------------------- /web/build/vite/plugins/compress.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ConfigCompressPlugin 3 | * @description 开启.gz压缩 4 | */ 5 | import viteCompression from 'vite-plugin-compression'; 6 | import { COMPRESSION } from '../../constant'; 7 | 8 | export const ConfigCompressPlugin = () => { 9 | if (COMPRESSION) { 10 | return viteCompression({ 11 | verbose: true, // 默认即可 12 | disable: false, //开启压缩(不禁用),默认即可 13 | deleteOriginFile: false, //删除源文件 14 | threshold: 10240, //压缩前最小文件大小 15 | algorithm: 'gzip', //压缩算法 16 | ext: '.gz', //文件类型 17 | }); 18 | } 19 | return []; 20 | }; 21 | -------------------------------------------------------------------------------- /web/build/vite/plugins/imagemin.ts: -------------------------------------------------------------------------------- 1 | import viteImagemin from 'vite-plugin-imagemin'; 2 | 3 | export function ConfigImageminPlugin() { 4 | const plugin = viteImagemin({ 5 | gifsicle: { 6 | optimizationLevel: 7, 7 | interlaced: false, 8 | }, 9 | mozjpeg: { 10 | quality: 20, 11 | }, 12 | optipng: { 13 | optimizationLevel: 7, 14 | }, 15 | pngquant: { 16 | quality: [0.8, 0.9], 17 | speed: 4, 18 | }, 19 | svgo: { 20 | plugins: [ 21 | { 22 | name: 'removeViewBox', 23 | }, 24 | { 25 | name: 'removeEmptyAttrs', 26 | active: false, 27 | }, 28 | ], 29 | }, 30 | }); 31 | return plugin; 32 | } 33 | -------------------------------------------------------------------------------- /web/build/vite/plugins/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name createVitePlugins 3 | * @description 封装plugins数组统一调用 4 | */ 5 | import {PluginOption} from 'vite'; 6 | import vue from '@vitejs/plugin-vue'; 7 | import vueJsx from '@vitejs/plugin-vue-jsx'; 8 | import {AutoImportDeps} from './autoImport'; 9 | import {ConfigCompressPlugin} from './compress'; 10 | import {ConfigRestartPlugin} from './restart'; 11 | import {ConfigProgressPlugin} from './progress'; 12 | import {ConfigVisualizerConfig} from "./visualizer"; 13 | 14 | export function createVitePlugins(isBuild: boolean) { 15 | const vitePlugins = [ 16 | // vue支持 17 | vue(), 18 | // JSX支持 19 | vueJsx(), 20 | // setup语法糖组件名支持 21 | // vueSetupExtend(), 22 | // 提供https证书 23 | // VitePluginCertificate({ 24 | // source: 'coding', 25 | // }) as PluginOption, 26 | ]; 27 | 28 | // 自动按需引入组件 29 | // vitePlugins.push(AutoRegistryComponents()); 30 | 31 | // 自动按需引入依赖 32 | vitePlugins.push(AutoImportDeps()); 33 | 34 | // 自动生成路由 35 | // vitePlugins.push(ConfigPagesPlugin()); 36 | 37 | // 开启.gz压缩 rollup-plugin-gzip 38 | vitePlugins.push(ConfigCompressPlugin()); 39 | 40 | // 监听配置文件改动重启 41 | vitePlugins.push(ConfigRestartPlugin()); 42 | 43 | // 构建时显示进度条 44 | vitePlugins.push(ConfigProgressPlugin()); 45 | 46 | // 构建时显示进度条 47 | vitePlugins.push(ConfigVisualizerConfig()); 48 | 49 | 50 | return vitePlugins; 51 | } 52 | -------------------------------------------------------------------------------- /web/build/vite/plugins/progress.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ConfigProgressPlugin 3 | * @description 构建显示进度条 4 | */ 5 | 6 | import progress from 'vite-plugin-progress'; 7 | export const ConfigProgressPlugin = () => { 8 | return progress(); 9 | }; 10 | -------------------------------------------------------------------------------- /web/build/vite/plugins/restart.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ConfigRestartPlugin 3 | * @description 监听配置文件修改自动重启Vite 4 | */ 5 | import ViteRestart from 'vite-plugin-restart'; 6 | export const ConfigRestartPlugin = () => { 7 | return ViteRestart({ 8 | restart: ['*.config.[jt]s', '**/config/*.[jt]s'], 9 | }); 10 | }; 11 | -------------------------------------------------------------------------------- /web/build/vite/plugins/unocss.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ConfigUnocssPlugin 3 | * @description 监听配置文件修改自动重启Vite 4 | */ 5 | 6 | // Unocss 7 | import Unocss from 'unocss/vite'; 8 | 9 | export const ConfigUnocssPlugin = () => { 10 | return Unocss(); 11 | }; 12 | -------------------------------------------------------------------------------- /web/build/vite/plugins/visualizer.ts: -------------------------------------------------------------------------------- 1 | import visualizer from 'rollup-plugin-visualizer'; 2 | import { ANALYSIS } from '../../constant'; 3 | 4 | export function ConfigVisualizerConfig() { 5 | if (ANALYSIS) { 6 | return visualizer({ 7 | filename: 'dist/report.html', 8 | open: true, 9 | gzipSize: true, 10 | emitFile: false 11 | }); 12 | } 13 | return []; 14 | } 15 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 |