Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 14 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,26 @@
# Mooder团队贡献系统
# Mooder_next团队贡献系统

Mooder是一款开源、安全、简洁、强大的(安全)团队贡献平台,基于Django、全封闭保证私密性、支持Markdown、支持Postgres/Mysql/Sqlite等多种数据库、支持Docker-compose一键化安装与更新,易于二次开发
Mooder_next是从Mooder二次开发而来的产物

开发缓慢,文档下线,只建议对Django有开发经验的同学使用。
关于Mooder的介绍移步(https://github.com/phith0n/mooder)

## 为什么会有Mooder
## 为什么会有Mooder_next

做Mooder的初衷是为了团队内部的交流。由于众所周知的原因,国内大量社区关闭,安全技术知识的学习变得愈加困难,更多的团队将交流方式变为QQ群、微信群。
而QQ、微信等及时通信工具并不是一个交流技术的好地方,团队仍然需要一个内部社区。于是,Mooder应运而生。
由于原作者未响应合并请求(大概已经放弃了这个历史项目),现开启新分支进行后续开发,新分支更名为:Mooder_next。

Mooder从设计之初想法就是“封闭”,也就是说该社区严格控制内部隐私,仅拥有邀请码的用户可以登录社区,管理员在后台也能够踢出、删除一个用户,保证了社区的私密性。
## 站在巨人的肩膀上

另外,Mooder的核心理念的“贡献”。团队成员可以将自己挖掘的通用漏洞、编写的EXP、提交到其他SRC的漏洞详情、众测中挖到的漏洞等等作为一个“贡献”提交到Mooder中,然后由管理员进行审核并给予rank与积分。通过该“积分”,团队成员也可以购买其他成员提交的贡献,或者去礼品中心换取礼品等
感谢原作者开发、开源这么优秀的项目,Mooder_next会添加更多功能,使得更加便于使用

通过这样的“知识交换”,让团队能够更快地成长。

## Change Log

- 2021.08.08
- 升级Django版本到3.x,修复了一堆Bug
- 2016.11.01
- 由于Mailgun十分不稳定,将默认邮件发送方式替换为SMTP,配置方法见文档,升级不影响已经配置好Mailgun的站点运行
- 2016.11.02
- 修复后台部分用户有权限却无法访问某些资源的BUG
- 修复https下访问不到部分js的BUG
- 隐藏附件真实文件名,改为使用数据库中储存的文件名
- 2024-05-21
- 补充依赖版本号(根据本地开发环境补全)
- 2024-04-17
- 添加后台评论管理功能
- 2022-07-01
- 修复礼物页面报错

## 开源协议

使用Mooder请遵守LGPL协议
使用Mooder、Mooder_next请遵守LGPL协议
4 changes: 2 additions & 2 deletions archives/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,12 +202,12 @@ class OrderCreateView(LoginRequiredMixin, CreateView):
]

def get_context_data(self, **kwargs):
kwargs['gift'] = get_object_or_404(models.Gift, show=True, pk=self.kwargs['gift_id'])
kwargs['gift'] = get_object_or_404(models.Gift, show=True, pk=self.kwargs['pk'])
return super(OrderCreateView, self).get_context_data(**kwargs)

@transaction.atomic
def form_valid(self, form):
gift = get_object_or_404(models.Gift, show=True, pk=self.kwargs['gift_id'])
gift = get_object_or_404(models.Gift, show=True, pk=self.kwargs['pk'])
return_url = reverse('archive:gift', kwargs=dict(pk=gift.id))

if gift.amount <= 0:
Expand Down
1 change: 1 addition & 0 deletions managements/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,5 @@
path('link/add/', views.LinkAddView.as_view(), name='management-link-add'),

path('comment/delete/<int:pk>/', views.DeleteCommentView.as_view(), name='management-comment-delete'),
path('comment/list/', views.ListCommentView.as_view(), name='management-comment-list'),
]
11 changes: 10 additions & 1 deletion managements/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -452,4 +452,13 @@ class DeleteCommentView(AdminPermissionMixin, DeleteView):
get = DeleteView.http_method_not_allowed

def get_success_url(self):
return self.request.META.get('HTTP_REFERER')
return self.request.META.get('HTTP_REFERER')

class ListCommentView(AdminPermissionMixin, PaginationMixin, ListView):
model = Comment
# 时间倒序返回
queryset = Comment.objects.all().order_by("-created_time")
template_name = 'management/comment_list.html'
paginate_by = 10

permission_required = 'accounts.change_comment'
26 changes: 13 additions & 13 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
-i https://pypi.tuna.tsinghua.edu.cn/simple
django
markdown
django-markup
django-pure-pagination
django-simple-captcha
django-bootstrap3
django-registration-redux
django-anymail[mailgun]
pytz
psycopg2-binary
python-dotenv
gunicorn
gevent
Django==3.2.13
Markdown==3.3.7
django-markup==1.5
django-pure-pagination==0.3.0
django-simple-captcha==0.5.17
django-bootstrap3==21.2
django-registration-redux==2.11
django-anymail[mailgun]==8.6
pytz==2022.1
psycopg2-binary==2.9.3
python-dotenv==0.20.0
gunicorn==20.1.0
gevent==21.12.0
4 changes: 2 additions & 2 deletions templates/archive/gift_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ <h2>礼品 {{ object.name }}</h2>
<hr>

<a href="javascript:history.back(-1)" class="am-btn am-btn-secondary">返回</a>
<a href="{% url 'archive:order-create' gift_id=object.id %}" class="am-btn am-btn-primary">购买</a>
<a href="{% url 'archive:order-create' pk=object.id %}" class="am-btn am-btn-primary">购买</a>


</div>
</div>
</div>
{% endblock %}
{% endblock %}
3 changes: 3 additions & 0 deletions templates/management/_menu.html
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@
<li>
<a href="{% url 'management-user-list' %}"><i class="fa fa-user fa-fw"></i> 用户</a>
</li>
<li>
<a href="{% url 'management-comment-list' %}"><i class="fa fa-comment fa-fw"></i> 评论</a>
</li>
<li>
<a href="{% url 'management-invitecode' %}"><i class="fa fa-envelope fa-fw"></i> 邀请码</a>
</li>
Expand Down
55 changes: 55 additions & 0 deletions templates/management/comment_list.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{% extends 'management/base.html' %}
{% load admin_helper %}

{% block subject %}评论列表{% endblock %}

{% block body %}
<table class="table table-hover">
<thead>
<tr>
<th>评论时间</th>
<th>评论者</th>
<th>昵称</th>
<th>文章ID</th>
<th>正文</th>
<th>动作</th>
</tr>
</thead>
<tbody>
{% for comment in object_list %}
<tr>
<td>{{ comment.created_time | date:"Y-m-d H:i:s" }}</td>
<td>{{ comment.author }}</td>
<td>{{ comment.author.nickname }}</td>
<td><a href="/post/{{ comment.post.id }}" target="_blank" >{{ comment.post.title }}</a></td>
<td>{{ comment.content }}</td>
<td>
<a href="javascript:submit('{% url 'management-comment-delete' pk=comment.id %}');" class="btn btn-danger btn-xs confirm-alert" role="button">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<script>
function submit(action_url) {
let f = $('<form method="post"></form>');
const xsrf = $(`{% csrf_token %}`);
f.append(xsrf);
f.prop('action', action_url);
f.appendTo('body').submit();
}
window.onload = function () {
$(".confirm-alert").on('click', function (e) {
if(!confirm('确认要执行这个操作?')) {
return e.preventDefault();
}
});
$("form.form-confirm").on("submit", function (e) {
if(!confirm('确认要执行这个操作?')) {
return e.preventDefault();
}
});
};
</script>
{% include 'management/_pagination.html' %}
{% endblock %}