• 一个实用的链接导航页的站点设计 支持自定义链接


    前台

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. {%include "public_header.html"%}
    5. <link href="/static/bootstrap/bootstrap.min.css" rel="stylesheet" />
    6. <script src="/static/bootstrap/jquery.min.js" type="text/javascript"></script>
    7. <script src="/static/bootstrap/bootstrap.min.js" type="text/javascript"></script>
    8. <meta charset="UTF-8">
    9. <meta name="viewport"
    10. content="width=device-width,height=device-height,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    11. <meta name="apple-mobile-web-app-capable" content="yes"/>
    12. <title>运维自动化导航页</title>
    13. <style>
    14. body {
    15. background: #f7f7f7;
    16. margin: 10px;
    17. background-image:url('/static/images/bg.png');
    18. background-repeat:no-repeat;
    19. background-size:100% 100%;
    20. -moz-background-size:100% 100%;
    21. }
    22. </style>
    23. </head>
    24. <script>
    25. $(document).ready(function(){
    26. $("li").mouseover(function(){
    27. $(this).css("background-color","#FCF590");
    28. //$(this).animate({top:"-=10px"},"fast");
    29. });
    30. $("li").mouseout(function(){
    31. $(this).css("background-color","#DBEDFC");
    32. //$(this).animate({top:"+=10px"},"fast");
    33. });
    34. });
    35. add_link=function(){
    36. $('#dlg_title').text('添加链接');
    37. $('#dialog').modal('show');
    38. };
    39. do_add_link=function(){
    40. $.post('/url?action=add',{"class":$("#class").val(),"title":$("#title").val(),"url":$("#url").val()},function(d,s){
    41. if(s=="success"){
    42. $('#dialog').modal('hide');
    43. location.reload();
    44. }
    45. });
    46. };
    47. link_del=function(cls,title){
    48. $.post('/url?action=del',{"class":cls,"title":title},function(d,s){
    49. if(s=="success"){
    50. $('#dialog').modal('hide');
    51. location.reload();
    52. }
    53. });
    54. };
    55. </script>
    56. <body>
    57. <div class="modal fade" id="dialog" tabindex="-1" role="dialog" aria-hidden="true">
    58. <div class="modal-dialog" style="width:calc(50vw);">
    59. <div class="modal-content" >
    60. <div class="modal-header">
    61. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
    62. <h4 class="modal-title"><span id="dlg_title"></span></h4>
    63. </div>
    64. <div class="modal-body">
    65. <input type="text" id="class" class="form-control" placeholder="分类名称">
    66. <input type="text" id="title" class="form-control" placeholder="标题">
    67. <input type="text" id="url" class="form-control" placeholder="链接URL">
    68. <button onclick="do_add_link()" class="btn btn-primary">添加</button>
    69. </div>
    70. </div>
    71. </div>
    72. </div>
    73. <h1 class="text-center" style="font-weight:bolder">运维导航页</h1>
    74. <div style="width:1200px;position:relative;left:calc(100vw/2);transform:translateX(-50%);">
    75. <div class="row">
    76. {% for class in nav %}
    77. <div style="background-color:rgba(199,212,247,0.2);padding:8px;margin:10px;box-shadow: 1px 1px 10px #888888;">
    78. <h4 style="margin:2px;font-weight:bolder;" ><span style="color:blue" class="glyphicon glyphicon-link"></span>{{class.class}}</h4>
    79. <ul style="margin:1px;padding:1px;display:flex;flex-wrap:wrap">
    80. {% for item in class.items %}
    81. <li style="border-radius:6px;position:relative;margin:4px;padding:4px;border:1px solid #E5E5E5;list-style:none;background-color:#DBEDFC;display:inline-block;">
    82. <h4 style="margin:0px;padding:2px;">{{item.title}}</h4>
    83. <h4 style="margin:0px;padding:2px;"><a href="{{item.url}}" target="_blank" class="btn btn-default">{{item.url}}</a></h4>
    84. </li>
    85. {% endfor %}
    86. </ul>
    87. </div>
    88. {% endfor %}
    89. {% for class in nav2 %}
    90. <div style="background-color:rgba(199,212,247,0.2);padding:8px;margin:10px;box-shadow: 1px 1px 10px #888888;">
    91. <h4 style="margin:2px;font-weight:bolder;" ><span style="color:blue" class="glyphicon glyphicon-link"></span>{{class.class}}</h4>
    92. <ul style="margin:1px;padding:1px;display:flex;flex-wrap:wrap">
    93. {% for item in class.items %}
    94. <li style="border-radius:6px;position:relative;margin:4px;padding:4px;border:1px solid #E5E5E5;list-style:none;background-color:#DBEDFC;display:inline-block;">
    95. <button type="button" class="close" data-dismiss="li" aria-hidden="true" onclick="link_del('{{class.class}}','{{item.title}}')">&times;</button>
    96. <h4 style="margin:0px;padding:2px;">{{item.title}}</h4>
    97. <h4 style="margin:0px;padding:2px;"><a href="{{item.url}}" target="_blank" class="btn btn-default">{{item.url}}</a></h4>
    98. </li>
    99. {% endfor %}
    100. </ul>
    101. </div>
    102. {% endfor %}
    103. <div style="background-color:rgba(199,212,247,0.2);padding:8px;margin:10px;box-shadow: 1px 1px 10px #888888;">
    104. <input type="button" class="btn btn-md btn-info" value="添加链接" onclick="add_link()">
    105. </div>
    106. </div>
    107. </div>
    108. </body>
    109. </html>

    python-路由器urls.py

    1. #url
    2. from django.contrib import admin
    3. from django.urls import path, re_path
    4. from . import views
    5. from django.contrib.staticfiles.views import serve
    6. urlpatterns = [
    7. path('admin', admin.site.urls),
    8. path("",views.index),
    9. path('index',views.index),
    10. path('url',views.url),
    11. path('favicon.ico', serve, {'path': 'images/favicon.ico'}),
    12. ]

    python-控制器views.py

    1. #views
    2. import datetime
    3. from django.contrib import auth
    4. from django.contrib.auth.decorators import login_required
    5. from django.shortcuts import render,HttpResponse,HttpResponseRedirect,redirect,reverse
    6. from django.http import HttpRequest,JsonResponse,HttpResponseForbidden
    7. from django.views.decorators.csrf import csrf_exempt
    8. import log.log as log
    9. import json
    10. import re
    11. import base.lib as lib
    12. def index(request:HttpRequest):
    13. context = {"nav":[
    14. {"class":"测试1","items":[
    15. {"title":"测试1","url":"http://192.168.1.1/"},
    16. {"title": "测试1", "url": "http://192.168.1.1/"},
    17. {"title": "测试1", "url": "http://192.168.1.1/"}]},
    18. {"class":"测试1","items":[
    19. {"title":"测试1","url":"http://192.168.1.1/"},
    20. {"title": "测试1", "url": "http://192.168.1.1/"},
    21. {"title": "测试1", "url": "http://192.168.1.1/"}]},
    22. {"class":"测试1","items":[
    23. {"title":"测试1","url":"http://192.168.1.1/"},
    24. {"title": "测试1", "url": "http://192.168.1.1/"},
    25. {"title": "测试1", "url": "http://192.168.1.1/"}]},
    26. {"class":"测试1","items":[
    27. {"title":"测试1","url":"http://192.168.1.1/"},
    28. {"title": "测试1", "url": "http://192.168.1.1/"},
    29. {"title": "测试1", "url": "http://192.168.1.1/"}]},
    30. ]}
    31. js=lib.read()
    32. if js:
    33. context["nav2"]=js
    34. response = render(request, "index.html", context)
    35. return response
    36. def url(request:HttpRequest):
    37. if "action" in request.GET.keys() and request.GET["action"]=="add":
    38. cls,title,url=request.POST["class"],request.POST["title"],request.POST["url"]
    39. js=lib.read()
    40. if js and "class" in js[0].keys():
    41. clss=[item["class"] for item in js]
    42. i=clss.index(cls)
    43. if i>=0:
    44. js[i]["items"].append({"title":title,"url":url})
    45. lib.write(js)
    46. return JsonResponse({"code":1})
    47. else:
    48. js=[
    49. {"class":cls,"items":[
    50. {"title":title,"url":url}]
    51. }
    52. ]
    53. lib.write(js)
    54. return JsonResponse({"code": 1})
    55. if "action" in request.GET.keys() and request.GET["action"]=="del":
    56. cls,title=request.POST["class"],request.POST["title"]
    57. js=lib.read()
    58. if js and "class" in js[0].keys():
    59. clss=[item["class"] for item in js]
    60. i=clss.index(cls)
    61. if i>=0:
    62. items=js[i]["items"]
    63. for item in items[:]:
    64. if item["title"]==title:
    65. items.remove(item)
    66. lib.write(js)
    67. return JsonResponse({"code":1})
    68. return JsonResponse({"code": 0})
    69. def forbid(request:HttpRequest):
    70. return HttpResponseForbidden()

    python-数据处理函数库lib.py

    1. #lib
    2. from navigate.settings import BASE_DIR
    3. import os
    4. import pickle
    5. import json
    6. def read():
    7. js=os.path.join(BASE_DIR,'js')
    8. if os.path.exists(js):
    9. with open(js,'r') as f:
    10. return json.loads(f.read())
    11. # return pickle.load(f)
    12. else:
    13. return []
    14. def write(obj):
    15. js = os.path.join(BASE_DIR, 'js')
    16. with open(js,'w') as f:
    17. f.write(json.dumps(obj))
    18. # pickle.dump(obj,f)

  • 相关阅读:
    Debezium同步之Vitess数据到Kafka的同步
    网上期货开户合约签署流程
    vue-rouer 路由
    想让你的工作轻松高效吗?揭秘Java + React导出Excel/PDF的绝妙技巧!
    【爬虫系列】Python 爬虫入门(1)
    docker镜像的导入导出
    浙江大学漏洞报送证书
    Android 系统启动流程解析
    leetcode第80题:删除有序数组中的重复项 II
    jQuery 第三章(语法+选择器+事件)
  • 原文地址:https://blog.csdn.net/chscomfaner/article/details/127879182