实现目标及功能,增删改,并且实现搜索,分页,日期插件,删除提示,以及批量导入等功能

软件版本:

python3.5

django1.11

一  用pycharm创建一个项目,名字自定义

二 编辑urls.py

  1. from django.conf.urls import url, include
  2. from django.contrib import admin
  3. from hnf import views
  4.  
  5. urlpatterns = [
  6. # 无论访问那个页面都会跳转到登陆页面
  7. url(r'^$', views.login),
  8. # 登陆
  9. url(r'^login', views.login),
  10. # 注销
  11. url(r'^logout', views.logout),
  12. # 搜索
  13. url(r'^search', views.search, name='search'),
  14. # django自带后台
  15. url(r'^admin/', admin.site.urls),
  16. # 展示页面
  17. url(r'^asset/list/$', views.asset_list, name='asset_list'),
  18. url(r'^asset/add/$', views.asset_add),
  19. url(r'^asset/edit/(?P<cid>\d+)/$', views.asset_edit),
  20. url(r'^asset/del/(?P<cid>\d+)/$', views.asset_del),
  21. # 导入
  22. url(r'^asset/import/$', views.asset_import),
  23. # 导入模板
  24. url(r'^asset/tpl/$', views.asset_tpl),

三 创建数据库,我这里默认用的sqlite

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Asset(models.Model):
  6. """
  7. 资产表
  8. """
  9. brand = models.CharField(verbose_name='品牌', max_length=32)
  10. model = models.CharField(verbose_name='型号', max_length=32)
  11. number = models.CharField(verbose_name='编号', max_length=32)
  12. leader_time = models.DateTimeField(verbose_name='领用时间', max_length=32)
  13. leader = models.CharField(verbose_name='领用人', max_length=32)
  14. return_time = models.DateTimeField(verbose_name='归还时间', max_length=32,null=True)
  15. other = models.CharField(verbose_name='备注', max_length=128,null=True)
  16.  
  17. def __str__(self):
  18.  
  19. return self.leader
  20.  
  21. class Meta:
  22. verbose_name="资产表"
  23. verbose_name_plural = verbose_name

然后用下面两条命令去生成数据库

python3 manage.py makemigrations

python3 manage.py migrate

四 更改views.py

  1. import os
  2. import mimetypes
  3. from django.shortcuts import render, redirect
  4. from django.http import FileResponse
  5. from django.conf import settings
  6. import xlrd
  7. from asset import mypage
  8. from hnf.forms.customer import UserinfoForm
  9. from hnf.forms.asset import AssetForm
  10. from hnf import models
  11.  
  12. from django.contrib import auth
  13. from django.contrib.auth.decorators import login_required
  14. from hnf.utils.urls import memory_reverse
  15.  
  16. # Create your views here.
  17. # 登录页面
  18. def login(request):
  19. if request.method == "GET":
  20. return render(request, "login.html")
  21. else:
  22. next_url = request.GET.get("next")
  23.  
  24. username = request.POST.get("username")
  25. pwd = request.POST.get("password")
  26. user_obj = auth.authenticate(request, username=username, password=pwd)
  27. if user_obj:
  28. auth.login(request, user_obj) # # 给该次请求设置了session数据,并在响应中回写cookie
  29. if next_url:
  30. return redirect(next_url)
  31. else:
  32. return redirect("/asset/list/")
  33. else:
  34. return render(request, "login.html", {"error_msg": "用户名或密码错误"})
  35.  
  36. # 注销页面
  37. def logout(request):
  38. auth.logout(request)
  39. return redirect("/login/")
  40.  
  41. def search(request):
  42. q = request.GET.get('q')
  43. error_msg = ''
  44.  
  45. if not q:
  46. error_msg = '请输入关键词'
  47. return render(request, 'result.html', {'error_msg': error_msg})
  48.  
  49. # post_list = models.Asset.objects.filter(leader__icontains=q)
  50. # for i in post_list:
  51. data_list=models.Asset.objects.filter(leader__contains=q)
  52. return render(request, 'result.html', {'error_msg': error_msg, 'post_list': data_list})
  53.  
  54. @login_required()
  55. def asset_list(request):
  56. """
  57. 资产列表
  58. :return:
  59. """
  60. data_list = models.Asset.objects.all()
  61. print(data_list)
  62. total_count = data_list.count()
  63.  
  64. current_page = request.GET.get("page")
  65.  
  66. page_boj = mypage.MyPage(current_page, total_count, url_prefix="asset/list")
  67. data = data_list[page_boj.start:page_boj.end] # 从第几页显示到第几页
  68.  
  69. page_html = page_boj.page_html() # 页面
  70. page_num = page_boj.num() # 序号
  71.  
  72. return render(request, 'asset_list.html', {'data_list': data, 'page_html': page_html, 'num': page_num})
  73.  
  74. def asset_add(request):
  75. """
  76. 添加资产
  77. :param request:
  78. :return:
  79. """
  80. if request.method == 'GET':
  81. form = AssetForm()
  82. return render(request, 'asset_add.html', {'form': form})
  83. form = AssetForm(data=request.POST)
  84. if form.is_valid():
  85. form.save()
  86. return redirect('/asset/list/')
  87. return render(request, 'asset_add.html', {'form': form})
  88.  
  89. def asset_edit(request, cid):
  90. """
  91. 编辑资产
  92. :return:
  93. """
  94. obj = models.Asset.objects.get(id=cid)
  95. if request.method == 'GET':
  96. form = AssetForm(instance=obj)
  97. return render(request, 'asset_edit.html', {'form': form})
  98. form = AssetForm(data=request.POST, instance=obj)
  99. if form.is_valid():
  100. form.save()
  101. return redirect('/asset/list/')
  102. return render(request, 'asset_edit.html', {'form': form})
  103.  
  104. def asset_del(request, cid):
  105. """
  106. 删除资产
  107. :param request:
  108. :param cid:
  109. :return:
  110. """
  111. # models.Asset.objects.filter(id=cid).delete()
  112. #
  113. # return redirect('/asset/list/')
  114.  
  115. origin = memory_reverse(request, 'asset_list')
  116. print(origin)
  117. if request.method == 'GET':
  118. return render(request, 'delete.html', {'cancel': origin})
  119. models.Asset.objects.filter(id=cid).delete()
  120. return redirect(origin)
  121.  
  122. def asset_import(request):
  123. """
  124. 批量导入用户
  125. :param request:
  126. :return:
  127. """
  128.  
  129. if request.method == 'GET':
  130. return render(request, 'asset_import.html')
  131.  
  132. context = {'status': True, 'msg': '导入成功'}
  133. try:
  134. customer_excel = request.FILES.get('customer_excel')
  135. """
  136. 打开上传的Excel文件,并读取内容
  137. 注:打开本地文件时,可以使用:workbook = xlrd.open_workbook(filename='本地文件路径.xlsx')
  138. """
  139. workbook = xlrd.open_workbook(file_contents=customer_excel.file.read())
  140.  
  141. # sheet = workbook.sheet_by_name('工作表1')
  142. sheet = workbook.sheet_by_index(0)
  143. row_map = {
  144. 0: {'text': '品牌', 'name': 'brand'},
  145. 1: {'text': '型号', 'name': 'model'},
  146. 2: {'text': '编号', 'name': 'number'},
  147. 3: {'text': '领用时间', 'name': 'leader_time'},
  148. 4: {'text': '领用人', 'name': 'leader'},
  149. 5: {'text': '归还时间', 'name': 'return_time'},
  150. 6: {'text': '备注', 'name': 'other'},
  151.  
  152. }
  153. object_list = []
  154. for row_num in range(1, sheet.nrows):
  155. row = sheet.row(row_num)
  156. print(row)
  157. row_dict = {}
  158. for col_num, name_text in row_map.items():
  159. row_dict[name_text['name']] = row[col_num].value
  160. object_list.append(models.Asset(**row_dict))
  161.  
  162. models.Asset.objects.bulk_create(object_list, batch_size=20)
  163. except Exception as e:
  164. context['status'] = False
  165. context['msg'] = '导入失败'
  166.  
  167. return render(request, 'asset_import.html', context)
  168.  
  169. def asset_tpl(request):
  170. """
  171. 下载批量导入Excel列表
  172. :param request:
  173. :return:
  174. """
  175. tpl_path = os.path.join(settings.BASE_DIR, 'hnf', 'files', '批量导入资产模板.xlsx')
  176. content_type = mimetypes.guess_type(tpl_path)[0]
  177. print(content_type)
  178. response = FileResponse(open(tpl_path, mode='rb'), content_type=content_type)
  179. response['Content-Disposition'] = "attachment;filename=%s" % 'asset_excel_tpl.xlsx'
  180. return response

五 在templates下面添加html页面,我这里举例是asset_list页面

  1. {% extends 'layout.html' %}
  2.  
  3. {% block content %}
  4.  
  5. <div class="luffy-container">
  6. <div class="btn-group" style="margin: 5px 0">
  7. <a class="btn btn-default" href="/asset/add/">
  8. <i class="fa fa-plus-square" aria-hidden="true"></i> 添加资产
  9. </a>
  10. <a class="btn btn-default" href="/asset/import/">
  11. <i class="fa fa-file-excel-o" aria-hidden="true"></i> 批量导入
  12. </a>
  13. <div class="right" style="margin-left: 911px" >
  14. <form method="get" action="{% url 'search' %}">
  15. {# {% csrf_token %}#}
  16. <input name="q" type="search" placeholder="请输入姓名" required>
  17. <button type="submit">搜索</button>
  18. </form>
  19.  
  20. </div>
  21.  
  22. </div>
  23.  
  24. <table class="table table-bordered table-hover">
  25. <thead>
  26. <tr>
  27. <th>ID</th>
  28. <th>品牌</th>
  29. <th>型号</th>
  30. <th>编号</th>
  31. <th>领用时间</th>
  32. <th>领用人</th>
  33. <th>归还时间</th>
  34. <th>备注</th>
  35. <th>编辑</th>
  36.  
  37. </tr>
  38. </thead>
  39. <tbody>
  40. {% for row in data_list %}
  41. <tr>
  42. <td>{{ row.id }}</td>
  43. <td>{{ row.brand }}</td>
  44. <td>{{ row.model }}</td>
  45. <td>{{ row.number }}</td>
  46. <td>{{ row.leader_time|date:"Y-m-d" }}</td>
  47. <td>{{ row.leader }}</td>
  48. <td>{{ row.return_time|date:"Y-m-d" }}</td>
  49. <td>{{ row.other }}</td>
  50.  
  51. <td>
  52. <a style="color: #333333;" href="/asset/edit/{{ row.id }}/">
  53. <i class="fa fa-edit" aria-hidden="true"></i></a>
  54. |
  55. <a style="color: #d9534f;" href="/asset/del/{{ row.id }}/"><i class="fa fa-trash-o"></i></a>
  56. </td>
  57.  
  58. </tr>
  59. {% endfor %}
  60. </tbody>
  61. </table>
  62. {{ page_html|safe }}
  63. </div>
  64. {% endblock %}

六  最后启动django项目,用浏览器访问即可

七 总结用到的知识点:

1 django自动的auth模块,以及django自带的数据库,自动实现密码加密,用户登录认证等功能,代码如下:

其中 @login_required() 也是auth模块里面的,作用是当访问list页面的时候,必须要先登陆

  1. from django.contrib import auth
  2. def login(request):
  3. if request.method == "GET":
  4. return render(request, "login.html")
  5. else:
  6. next_url = request.GET.get("next")
  7.  
  8. username = request.POST.get("username")
  9. pwd = request.POST.get("password")
  10. user_obj = auth.authenticate(request, username=username, password=pwd)
  11. if user_obj:
  12. auth.login(request, user_obj) # # 给该次请求设置了session数据,并在响应中回写cookie
  13. if next_url:
  14. return redirect(next_url)
  15. else:
  16. return redirect("/asset/list/")
  17. else:
  18. return render(request, "login.html", {"error_msg": "用户名或密码错误"})
  19.  
  20. # 注销页面
  21. def logout(request):
  22. auth.logout(request)
  23. return redirect("/login/")
  24.  
  25. @login_required()
  26. def asset_list(request):
  27. """
  28. 资产列表
  29. :return:
  30. """
  31. data_list = models.Asset.objects.all()
  32. print(data_list)
  33. total_count = data_list.count()
  34.  
  35. current_page = request.GET.get("page")
  36.  
  37. page_boj = mypage.MyPage(current_page, total_count, url_prefix="asset/list")
  38. data = data_list[page_boj.start:page_boj.end] # 从第几页显示到第几页
  39.  
  40. page_html = page_boj.page_html() # 页面
  41. page_num = page_boj.num() # 序号
  42.  
  43. return render(request, 'asset_list.html', {'data_list': data, 'page_html': page_html, 'num': page_num})

2  搜索功能

  1. def search(request):
  2. q = request.GET.get('q')
  3. error_msg = ''
  4.  
  5. if not q:
  6. error_msg = '请输入关键词'
  7. return render(request, 'result.html', {'error_msg': error_msg})
  8.  
  9. data_list=models.Asset.objects.filter(leader__contains=q) # 利用了orm的语法查询关键字
  10. return render(request, 'result.html', {'error_msg': error_msg, 'post_list': data_list})

3 分页功能,需要先自定义一个分页的函数叫MyPage(可自定义),然后导入引用

  1. def asset_list(request):
  2. """
  3. 资产列表
  4. :return:
  5. """
  6. data_list = models.Asset.objects.all()
  7. ###分页开始 total_count = data_list.count()
  8.  
  9. current_page = request.GET.get("page")
  10.  
  11. page_boj = mypage.MyPage(current_page, total_count, url_prefix="asset/list")
  12. data = data_list[page_boj.start:page_boj.end] # 从第几页显示到第几页
  13.  
  14. page_html = page_boj.page_html() # 页面
  15. page_num = page_boj.num() # 序号
    ###分页结束
  16.  
  17. return render(request, 'asset_list.html', {'data_list': data, 'page_html': page_html, 'num': page_num})

4 日期插件功能,效果如图所示,这是导入了第三方的laydate,具体参考 https://www.layui.com/laydate/

实现方法,在html页面里面先导入一个js,#id_return_time'代表的是input框的id值,如何查看这个框的id值,可以f12,选中这个input框去查看

  1. {% block js %}
  2. <script src="/static/laydate/laydate.js"></script>
  3.  
  4. <script>
  5. //执行一个laydate实例
  6. laydate.render({
  7. elem: '#id_leader_time'
  8.  
  9. });
  10. </script>
  11.  
  12. <script>
  13. //执行一个laydate实例
  14. laydate.render({
  15. elem: '#id_return_time'
  16.  
  17. });
  18. </script>
  19. {% endblock %}

5  删除提示实现代码

  1. def asset_del(request, cid):
  2. """
  3. 删除资产
  4. :param request:
  5. :param cid:
  6. :return:
  7. """
  8. # models.Asset.objects.filter(id=cid).delete()
  9. #
  10. # return redirect('/asset/list/')
  11.  
  12. origin = memory_reverse(request, 'asset_list')
  13. print(origin)
  14. if request.method == 'GET':
  15. return render(request, 'delete.html', {'cancel': origin}) # 这里是代表点取消之后返回原来的页面
  16. models.Asset.objects.filter(id=cid).delete()
  17. return redirect(origin)

然后再增加一个delete.html页面,取消里面的这个href这里一定要和views里面的  return render(request, 'delete.html', {'cancel': origin}),一样。

  1. {% extends 'layout.html' %}
  2.  
  3. {% block content %}
  4. <div class="luffy-container">
  5. <div class="alert alert-danger" role="alert">
  6. <form method="post">
  7. {% csrf_token %}
  8. <p style="font-size: 13px;"><i class="fa fa-warning" aria-hidden="true"></i> 删除后将不可恢复,请确定是否删除?</p>
  9. <div style="margin-top: 20px;">
  10. <a href="{{ cancel }}" class="btn btn-default btn-sm">取消</a>
  11. <button type="submit" class="btn btn-danger btn-sm">确 认</button>
  12. </div>
  13. </form>
  14. </div>
  15. </div>
  16.  
  17. {% endblock %}

6 批量导入功能

  1. import xlrd
  2. def asset_import(request):
  3. """
  4. 批量导入
  5. :param request:
  6. :return:
  7. """
  8.  
  9. if request.method == 'GET':
  10. return render(request, 'asset_import.html')
  11.  
  12. context = {'status': True, 'msg': '导入成功'}
  13. try:
  14. customer_excel = request.FILES.get('customer_excel')
  15. """
  16. 打开上传的Excel文件,并读取内容
  17. 注:打开本地文件时,可以使用:workbook = xlrd.open_workbook(filename='本地文件路径.xlsx')
  18. """
  19. workbook = xlrd.open_workbook(file_contents=customer_excel.file.read())
  20.  
  21. # sheet = workbook.sheet_by_name('工作表1')
  22. sheet = workbook.sheet_by_index(0)
  23. row_map = {
  24. 0: {'text': '品牌', 'name': 'brand'},
  25. 1: {'text': '型号', 'name': 'model'},
  26. 2: {'text': '编号', 'name': 'number'},
  27. 3: {'text': '领用时间', 'name': 'leader_time'},
  28. 4: {'text': '领用人', 'name': 'leader'},
  29. 5: {'text': '归还时间', 'name': 'return_time'},
  30. 6: {'text': '备注', 'name': 'other'},
  31.  
  32. }
  33. object_list = []
  34. for row_num in range(1, sheet.nrows):
  35. row = sheet.row(row_num)
  36. print(row)
  37. row_dict = {}
  38. for col_num, name_text in row_map.items():
  39. row_dict[name_text['name']] = row[col_num].value
  40. object_list.append(models.Asset(**row_dict))
  41.  
  42. models.Asset.objects.bulk_create(object_list, batch_size=20)
  43. except Exception as e:
  44. context['status'] = False
  45. context['msg'] = '导入失败'
  46.  
  47. return render(request, 'asset_import.html', context)

7 form组件

  1. from django.forms import ModelForm, Form
  2. from django import forms
  3. from hnf import models
  4.  
  5. class AssetForm(ModelForm):
  6. class Meta:
  7. model = models.Asset
  8. fields = "__all__"
  9.  
  10. def __init__(self, *args, **kwargs):
  11.  
  12. super(AssetForm, self).__init__(*args, **kwargs)
  13.  
  14. for name, field in self.fields.items():
  15. field.widget.attrs['class'] = 'form-control' # 应用样式
  16. # field.widget.attrs['id'] = 'time' # 应用样式
  17. field.widget.attrs['placeholder'] = field.label #默认显示的字段
  18.  
  19. self.fields['other'].required = False # 是否允许字段为空,false是允许为空,true不允许
  20. self.fields['return_time'].required = False

views里面的配置

  1. def asset_add(request):
  2. """
  3. 添加资产
  4. :param request:
  5. :return:
  6. """
  7. if request.method == 'GET':
  8. form = AssetForm()
  9. return render(request, 'asset_add.html', {'form': form})
  10. form = AssetForm(data=request.POST)
  11. if form.is_valid():
  12. form.save()
  13. return redirect('/asset/list/')
  14. return render(request, 'asset_add.html', {'form': form})

html页面配置

  1. {% extends 'layout.html' %}
  2.  
  3. {% block content %}
  4. <div class="luffy-container">
  5. <form class="form-horizontal clearfix" method="post" novalidate>
  6. {% csrf_token %}
  7.  
  8. {% for field in form %}
  9. <div class="form-group col-sm-6 clearfix">
  10. <label class="col-sm-3 control-label">{{ field.label }}</label>
  11. <div class="col-sm-9">
  12. {{ field }} <span style="color:firebrick;">{{ field.errors.0 }}</span>
  13. </div>
  14. </div>
  15. {% endfor %}
  16. <div class="form-group col-sm-12">
  17. <div class="col-sm-6">
  18. <div class="col-sm-offset-3">
  19. <button type="submit" class="btn btn-primary">提 交</button>
  20. </div>
  21. </div>
  22. </div>
  23. </form>
  24. </div>
  25. {% endblock %}
  26.  
  27. {% block js %}
  28. <script src="/static/laydate/laydate.js"></script>
  29.  
  30. <script>
  31. //执行一个laydate实例
  32. laydate.render({
  33. elem: '#id_leader_time'
  34.  
  35. });
  36. </script>
  37.  
  38. <script>
  39. //执行一个laydate实例
  40. laydate.render({
  41. elem: '#id_return_time'
  42.  
  43. });
  44. </script>
  45. {% endblock %}

完整代码见gitlab    https://github.com/huningfei/asset.git

  1. 分支名  asset-laydate

如何用django框架完整的写一个项目的更多相关文章

  1. Django 从0开始创建一个项目

    title: Django 从0开始创建一个项目 tags: Django --- Django 从0开始创建一个项目 创建Django工程及配置 创建工程:django-admin starproj ...

  2. 学习T-io框架,从写一个Redis客户端开始

    前言   了解T-io框架有些日子了,并且还将它应用于实战,例如 tio-websocket-server,tio-http-server等.但是由于上述两个server已经封装好,直接应用就可以.所 ...

  3. python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)

    ''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_ ...

  4. django开发项目实例1--建立一个项目并初步运行

    1:进入目标目录新建一个项目 D:\>django-admin.py startproject qiweijie 新建完成后,进入项目文件夹查看目录 D:\>cd qiweijie D:\ ...

  5. redis数据库如何用Django框架缓存数据

    ---恢复内容开始--- 一.python 使用redis 1.1 安装 pip install redis 测试有一些基本的数据类型 import redis # redis 是一个缓存数据库 # ...

  6. [ionic3.x开发记录]参考ionic的float-label动效,写一个项目内通用的input组件,易扩展

    上图: module: import {NgModule} from "@angular/core"; import {CommonModule} from "@angu ...

  7. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  8. Django框架01 / http协议、web框架本质

    Django框架01 / http协议.web框架本质 目录 Django框架01 / http协议.web框架本质 1.http协议 1.1 http协议简介 1.2 什么是http协议 1.3 H ...

  9. Django - Django框架 简单介绍

    Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...

随机推荐

  1. Stream的去重排序

    1.List<Integer>排序 List<Integer> list = new ArrayList<>();list.add(50);list.add(25) ...

  2. [Array]217.Contains Duplicate

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  3. linux基础指令参数

    eth0,eth1,eth2--代表网卡一,网卡二,网卡三-- lo代表127.0.0.1,即localhost 参考: Linux命令:ifconfig 功能说明:显示或设置网络设备 语 法:ifc ...

  4. Neo4j系列-简介及应用场景

    1.什么是Neo4j? Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储 ...

  5. LINNX查看当前登录的用户

    W w命令主要是查看当前登录的用户,这个命令相对来说比较简单.我们来看一下截图. 在上面这个截图里面呢,第一列user,代表登录的用户,第二列,tty代表用户登录的终端号,因为在linux中并不是只有 ...

  6. 计蒜客 Zoning Houses(线段树区间最大次大)

    Given a registry of all houses in your state or province, you would like to know the minimum size of ...

  7. apache添加虚拟主机(windows下)

    1.打开Apache的目录下的  D:\Web\Apache\conf\httpd.conf 允许虚拟,启动虚拟配置文件 2.配置虚拟主机 打开 D:\Web\Apache\conf\extra\ht ...

  8. 【BZOJ2809】【APIO2012】dispatching

    左偏树. 每个子节点维护大根堆,遍历一个儿子就往自己合并,合并发现钱不够了就删除队顶. //Achen #include<algorithm> #include<iostream&g ...

  9. Thinkphp js、css压缩类minify

    说明:Minify 是用PHP5开发的应用,通过遵循一些Yahoo的优化规则来提高网站的性能.它会合并多个CSS或者JavaScript文件,移除一些不必要的空格和注释,进行gzip压缩,并且会设置浏 ...

  10. c中函数指针和回调函数

    函数指针: 指向函数的指针.(定义的函数会分配一块内存,同变量一样存在首地址)示例如下: int Func(int x); /*声明一个函数*/ int (*p) (int x); /*定义一个函数指 ...