├── .DS_Store ├── images ├── image1.png ├── image10.png ├── image2.png ├── image4.png ├── image5.png ├── image6.png ├── image7.png ├── image8.png └── image9.png ├── export_import.md ├── action.md ├── jssdk.md ├── setup.md ├── home.md ├── README.md ├── charts.md ├── table.md └── permissions.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/.DS_Store -------------------------------------------------------------------------------- /images/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image1.png -------------------------------------------------------------------------------- /images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image10.png -------------------------------------------------------------------------------- /images/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image2.png -------------------------------------------------------------------------------- /images/image4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image4.png -------------------------------------------------------------------------------- /images/image5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image5.png -------------------------------------------------------------------------------- /images/image6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image6.png -------------------------------------------------------------------------------- /images/image7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image7.png -------------------------------------------------------------------------------- /images/image8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image8.png -------------------------------------------------------------------------------- /images/image9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image9.png -------------------------------------------------------------------------------- /export_import.md: -------------------------------------------------------------------------------- 1 | # simplepro 导入导出 2 | 3 | simplepro导入导出是依赖 `django-import-export`插件,配置请参考该插件的文档。 4 | 5 | 在自定义按钮附近使用导出和右边工具栏使用导入导出: 6 | 7 | 8 | ```python 9 | 10 | from import_export import resources 11 | from import_export.admin import ImportExportModelAdmin, ImportExportActionModelAdmin 12 | 13 | class ProxyResource(resources.ModelResource): 14 | class Meta: 15 | model = Employe 16 | 17 | @admin.register(Employe) 18 | class EmployeAdmin(ImportExportActionModelAdmin): 19 | resource_class = ProxyResource 20 | 21 | ``` 22 | 23 | -------------------------------------------------------------------------------- /action.md: -------------------------------------------------------------------------------- 1 | # simplepro 自定义按钮 2 | 自定义按钮也叫action,是ModelAdmin中的actions一员。 3 | 定义例子: 4 | ```python 5 | 6 | actions=['custom_button'] 7 | def custom_button(self, request, queryset): 8 | pass 9 | 10 | ``` 11 | 12 | 该按钮文档与simpleui完全一致,请查看文档[自定义按钮](https://github.com/newpanjing/simpleui/blob/master/QUICK.md#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%89%E9%92%AE) 13 | 14 | simplepro在自定义actions的基础上进行了扩展,入参和出参与django admin不同。 15 | 16 | + 入参 17 | 18 | 入参是只request.POST中收到的参数 19 | 20 | |字段|类型|说明| 21 | |-----|-----|-----| 22 | |action|string|该值是用于simplepro路由使用,可以不予理会| 23 | |all|string|取值0和1,0未全部选择,1全部选中| 24 | |key|string|自定义按钮的方法名| 25 | |ids|string|逗号分隔的选中的id,如果all=1,该值没有| 26 | 27 | + 出参 28 | 29 | 出参是指自定义按钮方法体返回的数据 30 | 31 | 例子: 32 | ```python 33 | def test(self, request, queryset): 34 | return { 35 | 'state': False, 36 | 'msg': '用户关联的数据还没有删除!' 37 | } 38 | ``` 39 | 40 | + 字段说明: 41 | 42 | |字段|类型|说明| 43 | |-----|-----|-----| 44 | |state|boolean|true成功,false失败| 45 | |msg|string|前台通知框的信息| 46 | -------------------------------------------------------------------------------- /jssdk.md: -------------------------------------------------------------------------------- 1 | # JS-SDK 2 | 3 | 为了提供更好的前端扩展,simplepro提供了jssdk,在不用重新页面的同时,进行页面最高程度的扩展。 4 | 5 | ## 使用例子: 6 | 7 | 8 | 首先通过Admin中的Media引入自定义的js文件 9 | 10 | 例子: 11 | ```python 12 | 13 | @admin.register(Department) 14 | class DepartmentAdmin(admin.ModelAdmin): 15 | 16 | class Media: 17 | js=('aa.js','bb.js') 18 | css=('dd.css','cc.css') 19 | ``` 20 | 21 | 然后aa.js中 注册事件 22 | 23 | ```javascript 24 | 25 | //所有的方法或者属性都是可选 26 | 27 | SIMPLEAPI={ 28 | //在vue完成初始化后调用 29 | init:function(app){ 30 | //通过app对象,可以控制页面上所有的元素显示隐藏 31 | 32 | }, 33 | toolbar:function(type,app){ 34 | //type=按钮类型,添加=add,删除=delete,编辑=edit,其他自定义按钮的type就是自身的方法名 35 | //app=当前vue对象,可以通过console.log(app)查看当前所有的变量 36 | 37 | //this域 38 | //如果是add,edit,delete this域 是空的 39 | //如果是自定义按钮,this域是自定义按钮的配置信息 40 | 41 | //返回true,代表后续步骤还是由simplepro处理 42 | return true 43 | }, 44 | loadData:function(app){ 45 | //加载数据的时候触发 46 | //改变app某些参数的时候 建议在此方法进行,init中改后,重新加载数据将会对某些值进行覆盖 47 | } 48 | 49 | //其他例如formatter这一类,在ModelAdmin中已经提供 50 | } 51 | 52 | ``` -------------------------------------------------------------------------------- /setup.md: -------------------------------------------------------------------------------- 1 | # simplepro 安装指南 2 | 3 | simplepro 依赖 simpleui、django-export-import、以及django 4 | 5 | 6 | 1. 安装simplepro 7 | 8 | ```shell 9 | pip install simplepro 10 | ``` 11 | 12 | 2. INSTALL_APPS中配置 13 | 14 | > 按以下顺序加入到INSTALL_APPS数组的顶部 15 | ```python 16 | INSTALLED_APPS = [ 17 | 'simplepro', 18 | 'simpleui', 19 | 'import_export', 20 | ...... 21 | ] 22 | ``` 23 | 3. 配置中间件 24 | 25 | ```python 26 | MIDDLEWARE = [ 27 | 'django.middleware.security.SecurityMiddleware', 28 | 'django.contrib.sessions.middleware.SessionMiddleware', 29 | 'django.middleware.common.CommonMiddleware', 30 | 'django.middleware.csrf.CsrfViewMiddleware', 31 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 32 | 'django.contrib.messages.middleware.MessageMiddleware', 33 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 34 | # 加入simplepro的中间件 35 | 'simplepro.middlewares.SimpleMiddleware' 36 | ] 37 | ``` 38 | 39 | + 如果在开启DEBUG模式后,启动即可运行。 40 | + 如果关闭后,需要克隆静态文件,步骤与simpleui一致。[文档地址](https://github.com/newpanjing/simpleui/blob/master/QUICK.md#%E5%85%8B%E9%9A%86%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6%E5%88%B0%E6%A0%B9%E7%9B%AE%E5%BD%95) -------------------------------------------------------------------------------- /home.md: -------------------------------------------------------------------------------- 1 | # simplepro定制首页 2 | simplepro首页默认了较多的模块,也许某些你无法用上。所以该文档提供了如何定制。 3 | 4 | simpleui采用框架结构,simplepro也是基于simpleui,simpleui的首页文件home.html 5 | 6 | 只要重新该页面即可。 7 | 8 | 重新有两种方式,第一种全覆盖,第二种block方式 9 | 10 | ## 全覆盖方式 11 | 在你的项目的templates目录中建立以下文件结构 12 | ``` 13 | ├─templates 14 | │ ├─admin 15 | │ │ ├─home.html 16 | ``` 17 | home.html内容: 18 | ```html 19 | {% load i18n static simpletags %} 20 | 21 | 22 |
23 | 24 | {% block quick %} 25 | {% include 'admin/parts/quick.html' %} 26 | {% endblock %} 27 | 28 | {% block chart_cards %} 29 | {% include 'admin/parts/charts_cards.html' %} 30 | {% endblock %} 31 | 32 | {% block line_chart %} 33 | {% include 'admin/parts/line_chart.html' %} 34 | {% endblock %} 35 | 36 | {% block info %} 37 | {% include 'admin/parts/info.html' %} 38 | {% endblock %} 39 | 40 | 41 |
42 |
43 | 44 | ``` 45 | 你可以完全拷贝内容,到新建的home.html中,挑选需要的include部分。 46 | 47 | ## 继承block方式 48 | 也需要在templates->admin->home.html中建立文件 49 | html内容: 50 | 51 | ```html 52 | {% extends 'admin/home.html' %} 53 | {% block quick %} 54 | //...这里重新你的内容 55 | {% endblock%} 56 | 57 | ``` 58 | block方式文档请参考django的文档。 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # simplepro 2 | Simple UI Pro 专业版simple UI 前后端分离,功能更多界面更美观! 3 | 4 | ## 在Demo 5 | [http://175.178.229.216:9001/](http://175.178.229.216:9001/) 6 | 7 | ## 本地 Simple Pro Demo 8 | [https://github.com/newpanjing/simplepro_demo](https://github.com/newpanjing/simplepro_demo) 9 | 10 | ## 官网 11 | [https://www.noondot.com/](https://www.noondot.com/) 12 | 13 | ## QQ群:786576510 14 | > Simple Pro是基于simpleui的升级版,需要依赖simpleui 15 | 16 | 17 | 18 | 19 | Simple Pro是收费项目,如果不想付费请继续使用[Simpleui](https://github.com/newpanjing/simpleui)我们也会将开源免费的项目维护到底。收费的目的是为了让simpleui和simplepro能够更好的维护下去。 20 | 21 | 22 | 23 | ## 预览图 24 | + 可自定义主题 25 | 26 | 27 | + 可以搜索模块 28 | 29 | 30 | + vue+element-ui 前后端分离加载数据 31 | 32 | 33 | + 编辑页面 34 | 35 | 36 | + 导出数据 37 | 38 | 39 | + 导入插件 40 | 41 | 42 | + 导出插件 43 | 44 | 45 | + 自定义权限 46 | 47 | 48 | 49 | ## 付费和激活 50 | 可以先直接安装simplepro,启动项目后打开后台会有相关提示页面,根据提示页面操作即可激活。 51 | 52 | ## 主要功能: 53 | 以下列出的功能,均是在simpleui的基础上进行的 54 | 55 | ### 页面 56 | - 首页改版 57 | - 登录页改版 58 | - 列表页改版 59 | - 权限页改版 60 | - 导入页和导出页改版 61 | - 增加网页全局进度条 62 | - 替换全局部分图标 63 | - Pro版独有标识 64 | - 专业版主题 65 | - 优化最近动作和主题,改为侧栏显示 66 | - 优化返回按钮,改为绝对路径 通过reverse('admin:demo_employe_add') 67 | - 全新默认LOGO 68 | - 首页增加图表 69 | 70 | ### 功能 71 | - 自定义按钮ajax实现 72 | - 筛选、删除、搜索、表格ajax加载数据 73 | - 导入导出优化 74 | - 权限模块重写 75 | - 表格功能增加详见table.md文档 76 | - 自定义主题 77 | 78 | ### 权限 79 | - 可添加自定义权限 80 | - 自定义按钮权限控制 81 | - 自定义菜单权限控制 82 | - 自定义字段权限 83 | 84 | ## 文档 85 | + [安装步骤](/setup.md) 86 | + [主页](/home.md) 87 | + [图表](/charts.md) 88 | + [自定义按钮](/action.md) 89 | + [自定义权限](/permissions.md) 90 | + [导入导出插件](/export_import.md) 91 | + [表格配置](/table.md) 92 | + [JS SDK](/jssdk.md) 93 | 94 | 95 | # 插件兼容 96 | + django_apscheduler 97 | + django-import-export 98 | 99 | 以上两个插件做了特定的兼容,其他插件也可以兼容。 100 | 101 | 102 | # 隐藏 simplepro 版本和授权信息 103 | 104 | 请在settings.py中加入: 105 | ```python 106 | SIMPLEPRO_INFO = False 107 | ``` 108 | -------------------------------------------------------------------------------- /charts.md: -------------------------------------------------------------------------------- 1 | # simplepro 图表说明 2 | 3 | 图表类型与配置完全遵循echarts4.x 具体效果请看echarts的文档,simplepro只是做了个基于dom的封装,原生的写法在vue中无法渲染,会出现页面空白。 4 | 5 | simpleui的图表采用echarts4.x,echarts的具体配置请移步至[https://www.echartsjs.com/zh/index.html](https://www.echartsjs.com/zh/index.html)查看 6 | 7 | ## 如何配置 8 | 由于simpleui和simplepro是基于vue开发,所以echarts在simplepro中进行了封装。直接在home页面引用echarts既可。 9 | ```html 10 | 11 | 12 | 13 | ``` 14 | ### 参数说明: 15 | |参数|说明| 16 | |---|---| 17 | |option|option字段完成与echarts的option一致,封装的过程中没有做任何处理。| 18 | |style|和原生dom的style一致,没有做任何处理,但是必须指定height,否则将不能正常显示图表| 19 | 20 | ### 例子 21 | 22 | ```html 23 | 109 | 110 | 111 | ``` 112 | 113 | 以上方式是静态渲染,需要在页面输出数据。但是这样往往无法满足需求。所以动态渲染也是同样支持的。 114 | 115 | ### 动态渲染 116 | 如果想动态改变数据,可以把option交由最外层的vue实例管理,把本页定义的option1先删除 117 | 118 | 然后定义在app中: 119 | ```js 120 | app.option1={}; 121 | ajax(function(data){ 122 | app.option1=data; 123 | }); 124 | ``` 125 | 126 | ### 注意 127 | 注意,如果在子页面实现,需要自行引入echarts的js文件。然后在引入 128 | 129 | 例如: 130 | ```html 131 | 132 | 133 | 134 | ``` 135 | 以上三个文件缺一不可。 -------------------------------------------------------------------------------- /table.md: -------------------------------------------------------------------------------- 1 | # simplepro 表格 2 | simplepro table基于elementui table,设置主要来自ModelAdmin,写法与原生admin一致,但是在原生的基础上增加了和减少了部分字段。注意目前table仅支持下列这些字段,但是在编辑和添加页还有用到其他字段,请参考原生admin与simpleui,simplepro是完全基于simpleui的。 3 | 4 | # ModelAdmin部分 5 | 6 | ## 自定义按钮 7 | 8 | admin中的自定义actions也是支持的,也就是simpleui说说的自定义按钮。 9 | 10 | 定义方法和使用均与原生admin一致,不过simpleui在这基础上进行了扩展。可以参考[自定义按钮文档](./action.md) 11 | 12 | ## 字段 13 | |字段|类型|说明| 14 | |---|---|---| 15 | |list_display|tuple|table显示的字段| 16 | |search_fields|tuple|搜索框搜索的字段| 17 | |list_per_page|int|每页显示的数量| 18 | |list_filter|array|筛选字段| 19 | |list_display_links|显示连接进入编辑页的字段| 20 | |fields_options|dict|表格的表头字段设置| 21 | |actions_show|boolean|显示隐藏action,默认为True,只有显式指定为False的时候才隐藏| 22 | |actions|array|[自定义按钮](#自定义按钮)| 23 | 24 | # 字段互斥 25 | > list_display_links 字段与formatter方法互斥 26 | 27 | 如果有formatter方法,list_display_links中配置的字段将无任何作用。 28 | 29 | ### fields_options字段 30 | admin 中字段设置,及时list_display 未定义该字段,在这里设置了也不会出错 31 | 表头字段完全遵循elementui的table文档: 32 | 33 | [https://element.eleme.cn/#/zh-CN/component/table](https://element.eleme.cn/#/zh-CN/component/table) 34 | 35 | fields_options支持自定义字段的值,比如model中的自定义方法 就算自定义字段 36 | 37 | ### 目前支持以下属性 38 | 39 | |字段|类型|说明| 40 | |---|---|---| 41 | |fixed|str|固定列,取值 left 和right| 42 | |sortable|boolean|排序字段,默认为'custom'| 43 | |width|str|宽度,取值例如100px| 44 | |min_width|str|最小宽度,取值例如100px| 45 | |resizable|boolean|列是否可以调整宽度| 46 | |class_name|str|列的 className| 47 | |label_class_name|str|当前列标题的自定义类名| 48 | 49 | + sortable字段 50 | 51 | 排序字段,默认为'custom',取值为: true, false, 'custom' 52 | 53 | 其中为custom的时候网络排序 54 | 55 | 取值为true,本地排序 56 | 57 | 自定义字段该值始终为false不排序 58 | 59 | ### fields_options例子 60 | 61 | ```python 62 | fields_options = { 63 | 'id': { 64 | 'fixed': 'left', 65 | 'width': '80px', 66 | 'align': 'center' 67 | }, 68 | 'create_time': { 69 | 'fixed': 'right', 70 | 'width': '200px', 71 | 'align': 'left' 72 | } 73 | } 74 | ``` 75 | 76 | ## 方法 77 | 78 | |字段|类型|说明| 79 | |---|---|---| 80 | |delete_queryset|function|删除时触发该方法| 81 | |formatter|function|数据格式化| 82 | |get_queryset|function|获取自定义的queryset| 83 | |get_list_display|function|获取自定义的list_display| 84 | |get_list_filter|function|获取自定义的list_filter| 85 | |get_actions|function|获取自定义的actions| 86 | 87 | 88 | ### formatter 方法 89 | + 入参 90 | 91 | |字段|类型|说明| 92 | |---|---|---| 93 | |obj|object|当前对象| 94 | |field_name|str|字段名| 95 | |value|object|字段值| 96 | 97 | + 返回 98 | 99 | 返回参数为单元格显示的值,可以是html,可以是文本。 100 | 101 | ### formatter例子 102 | ```python 103 | def formatter(self, obj, field_name, value): 104 | # 这里可以对value的值进行判断,比如日期格式化等 105 | return value 106 | ``` 107 | 108 | ### delete_queryset 说明 109 | 110 | 例子: 111 | 112 | ```python 113 | def delete_queryset(self, request, queryset): 114 | #这里可以做些自定义的处理 115 | pass 116 | ``` 117 | + 返回 118 | 119 | 如果返回的是queryset,那么程序将会调用delete方法执行删除。如果返回的是None,将不会做任何动作 120 | 121 | 122 | 123 | ## get_queryset 说明 124 | 125 | 例子: 126 | 127 | ```python 128 | def get_queryset(self, request): 129 | qs = super().get_queryset(request) 130 | 131 | return qs.filter(id__gte=1) 132 | ``` 133 | 134 | 注意,get_queryset可以返回为None,包括pass也是返回为None。如果为None,的时候 该queryset将会被丢弃,框架将会从model中获取queryset 135 | ```python 136 | qs=model.objects.get_querset() 137 | ``` 138 | 139 | 可以利用这个方法来控制自定义的数据权限,该方法与原生admin一致。 140 | 141 | ## get_list_display 说明 142 | 143 | ```python 144 | def get_list_display(self, request): 145 | # 这里可以进行判断,动态返回某些字段或表头 146 | return self.list_display 147 | ``` 148 | ## get_list_filter 说明 149 | 150 | ```python 151 | def get_list_filter(self, request): 152 | # 这里可以进行判断,动态返回list_filter 153 | return self.list_filter 154 | ``` 155 | ## get_actions 说明 156 | 157 | ```python 158 | def get_actions(self, request): 159 | # 这里可以进行判断,动态返回actions 160 | actions = super(EmployeAdmin, self).get_actions(request) 161 | return actions 162 | ``` 163 | 164 | ## Media 自定义引入js和css 165 | 166 | Media 遵从原生django admin的写法,并且处理也是django实现,simplepro未做任何文件处理,只做引入动作。 167 | 168 | 例子: 169 | 170 | ```python 171 | 172 | @admin.register(Department) 173 | class DepartmentAdmin(admin.ModelAdmin): 174 | 175 | class Media: 176 | js=('aa.js','bb.js') 177 | css=('dd.css','cc.css') 178 | 179 | ``` 180 | 181 | 在页面解析的时候 会调用下列方式进行引入 182 | ```html 183 | 194 | {% endfor %} 195 | {% endif %} 196 | ``` 197 | 198 | 引入css部分: 199 | 200 | ```html 201 | {% if media.css %} 202 | {% for css in media.css %} 203 | 204 | {% endfor %} 205 | {% endif %} 206 | ``` 207 | 208 | 在通过引入自己的js和css之后,可以对页面进行扩展,调用simplepro的js sdk 可以实现意想不到的效果,比如表格format,添加自定义按钮,拦截按钮事件等。具体请看jssdk 209 | -------------------------------------------------------------------------------- /permissions.md: -------------------------------------------------------------------------------- 1 | # simplepro 自定义权限 2 | 3 | + 在simpleui中没有提供自定义权限的支持。 4 | + 在原生django admin中没有提供自定义菜单权限的支持,自定义按钮权限支持。 5 | 6 | # 权限基础知识 7 | 8 | simplepro的权限 也是在django admin的权限中进行扩展的。但是未更改django 权限相关的任何字段。 9 | 10 | ## 表结构 11 | 12 | |表名|名字|作用| 13 | |---|---|---| 14 | |django_content_type|模块类型表|用于记录用户和admin的各个模块| 15 | |auth_permission|权限表|用户记录所有模块的view,add,change,delete权限,与django_content_type关联| 16 | |auth_group|权限组|每个用户都可以指定一个或多个权限组,与auth_group_permissions关联| 17 | 18 | 以上三个表就是权限的基础表结构,通过表格或者`model`的`permission`字段所添加的权限,都会往`auth_permission`表中存入数据。 19 | 20 | 21 | 22 | # 自定义按钮权限 23 | 24 | 自定义权限包括自定义按钮和自定义菜单,django admin中 对自定义的action 也就是自定义按钮提供了权限支持,定义如下: 25 | 26 | 27 | ## 注意:下面这种方式在simplepro中和原生admin中通用,simpleui中不适用。 28 | 29 | ## 1.定义 30 | 31 | ```python 32 | 33 | # admin 34 | @admin.register(Employe) 35 | class EmployeAdmin(admin.ModelAdmin): 36 | #....定义显示字段之类 37 | 38 | actions=[test] 39 | 40 | # 自定义按钮 41 | def test(self, request, queryset): 42 | # 这里可有做一些crud 43 | pass 44 | 45 | test.short_descript='按钮显示的名' 46 | 47 | # model 48 | class Employe(models.Model): 49 | name = models.CharField(max_length=128, verbose_name='名称', help_text='员工的名字', null=False, blank=False, 50 | db_index=True) 51 | 52 | gender_choices = ( 53 | (0, '未知'), 54 | (1, '男'), 55 | (2, '女'), 56 | ) 57 | 58 | gender = models.IntegerField(choices=gender_choices, verbose_name='性别', default=0) 59 | 60 | class Meta: 61 | verbose_name = "员工" 62 | verbose_name_plural = "员工管理" 63 | 64 | # 定义自定义的权限 65 | permissions = ( 66 | ('test', 'test111'), 67 | ('test2', 'test222'), 68 | ('权限显示的名称','权限判断的codename'), 69 | ('测试按钮','test') # 注意 这里的test要与admin中的按钮方法名一致 70 | )` 71 | 72 | ``` 73 | 74 | ## 2.迁移 75 | 76 | + 生成迁移文件 77 | 78 | ```shell 79 | python3 manage.py makemigrations 80 | ``` 81 | + 执行迁移,添加到数据库 82 | 83 | ```shell 84 | python3 manage.py migrate 85 | ``` 86 | 87 | ## 3.勾选权限 88 | 在操作完以上两个步骤后,我们可以进入到`认证和授权->组`或者`认证和授权->权限`中,对用户勾选该项权限。 89 | 90 | ## 4.其他操作 91 | 92 | 在`认证和授权->权限`该项菜单中,可以直接用表格形式添加。可以不用写在model中,但是这种方式容易遗漏,不推荐使用。 93 | 94 | 95 | > 以上的步骤是自定义按钮的权限控制,下面的步骤中定义自定义菜单的权限稍微复杂一些。 96 | 97 | # 自定义菜单权限 98 | 99 | 自定义菜单的权限定义方式有2种 100 | 1. 第一种和自定义按钮一样,定义在model中,但是前提是自定义按钮的`codename`字段要与model的`codename`一致,比较麻烦。 101 | 102 | 2. 第二种,直接在`认证和授权->权限`该项菜单中,用表格的形式直接添加。但是菜单的codename要与`内容类型`的codename一致。 103 | 104 | ## 如何查看app_label? 105 | 可以打开表:`django_content_type`进行查看。 106 | 107 | 自定义菜单权限: 108 | 109 | 例子1,在model中的方式: 110 | 111 | model: 112 | 113 | ```python 114 | 115 | class Employe(models.Model): 116 | name = models.CharField(max_length=128, verbose_name='名称', help_text='员工的名字', null=False, blank=False, 117 | db_index=True) 118 | 119 | gender_choices = ( 120 | (0, '未知'), 121 | (1, '男'), 122 | (2, '女'), 123 | ) 124 | 125 | gender = models.IntegerField(choices=gender_choices, verbose_name='性别', default=0) 126 | 127 | class Meta: 128 | verbose_name = "员工" 129 | verbose_name_plural = "员工管理" 130 | 131 | # 定义自定义的权限 132 | permissions = ( 133 | ('test', 'test111'), 134 | ('test2', 'test222'), 135 | ('权限显示的名称','权限判断的code'), 136 | ('测试按钮','test'), # 注意 这里的test要与admin中的按钮方法名一致 137 | ('Simpleui','view_simpleui') 138 | )` 139 | 140 | ``` 141 | > 添加了之后别忘记执行迁移 142 | 143 | 144 | settings.py中的菜单定义: 145 | ```python 146 | 147 | SIMPLEUI_CONFIG = { 148 | # 在自定义菜单的基础上保留系统模块 149 | 'system_keep': True, 150 | 'menus': [{ 151 | 'name': 'Simpleui', 152 | 'icon': 'fas fa-code', 153 | 'url': 'https://gitee.com/tompeppa/simpleui', 154 | 'codename':'simpleui' 155 | }, { 156 | 'name': '测试', 157 | 'icon': 'fa fa-file', 158 | 'codename': 'test', 159 | 'models': [{ 160 | 'name': 'Baidu', 161 | 'url': 'http://baidu.com', 162 | 'icon': 'far fa-surprise', 163 | 'codename':'baidu' 164 | }, { 165 | 'name': '内网穿透', 166 | 'url': 'https://www.wezoz.com', 167 | 'icon': 'fab fa-github', 168 | 'codename':'nat' 169 | }, { 170 | 'name': '内网穿透', 171 | 'url': 'https://www.wezoz.com', 172 | 'icon': 'fab fa-github' 173 | }, { 174 | 'name': '登录页嵌套测试', 175 | 'url': '/login' 176 | }] 177 | }] 178 | } 179 | 180 | ``` 181 | 182 | 以上定义了两种菜单,一个是只有一级,一个是有2级 183 | 184 | + 一级的 权限key=codename.codename也就是 simpleui.simpleui 185 | + 二级的 权限key=test.baidu test.nat 186 | 187 | 主要保证这些数据在auth_permission中,权限就可以正常进行,否则将不受权限控制. 188 | 189 | 如果父级没有codename 及时子级写了codename 也不权限控制 190 | 191 | 自定义菜单如果是最顶级,需要在`内容类型->内容类型`菜单中添加一条数据。 192 | 193 | ## 不生效排查 194 | 195 | 1. 请保证 `request.user.get_all_permissions()` 该方法中有自定义的权限 196 | 2. 顶级菜单的权限是否存在,例如test.test 如果该项权限没有,子级也不会显示 197 | 198 | 199 | # 导入导出权限 200 | 201 | 导入 key=model.import 202 | 203 | 导出 key=model.export 204 | 205 | 206 | # FAQ常见问题 207 | 208 | + PermissionError: [Errno 13] Permission denied 209 | 210 | 请请检查是否对python lib目录有访问权限,linux和Windows默认用普通用户,对全局python lib包没有写的权限,所有会提示权限问题。建议用虚拟环境运行。 211 | 212 | + 无法获取套餐列表 213 | 214 | 请检查是否能访问simpleui.88cto.com 215 | 216 | ```shell 217 | ping simpleui.88cto.com 218 | ``` 219 | 220 | 如果被防火墙屏蔽,请采用hosts的方式,在hosts文件中加入: 221 | ``` 222 | 103.39.210.34 simpleui.88cto.com 223 | ``` --------------------------------------------------------------------------------