django項(xiàng)目--權(quán)限分組管理

權(quán)限分組管理

一专酗、權(quán)限分組列表

1. 接口設(shè)計(jì)

  1. 接口說(shuō)明
類(lèi)目 說(shuō)明
請(qǐng)求方法 GET
url定義 /admin/groups/
參數(shù)格式 無(wú)參數(shù)
  1. 返回結(jié)果

    html

2. 后端代碼

  1. 視圖

    # 在myadmin/views.py中定義如下視圖
    class GroupListView(View):
        """
        分組列表視圖
        url:/admin/groups/
        """
        def get(self, request):
            groups = Group.objects.only('name').all()
    
            return render(request, 'myadmin/group/group_list.html', context={'groups': groups})
    
    
  2. 路由

    # 在myadmin/urls.py中添加如下路由
    path('groups/', views.GroupsView.as_view(), name='group_list')
    

3. 前端代碼

  1. html

    <!-- 新建myadmin/group/group_list.html模板 -->
    {% extends 'admin/content_base.html' %}
    {% load static %}
    {% load news_template_filters %}
    {% block page_header %}
        系統(tǒng)設(shè)置
    {% endblock %}
    {% block page_option %}
        權(quán)限分組
    {% endblock %}
    {% block content %}
        <div class="box">
            <div class="box-header with-border">
                <h3 class="box-title">分組列表</h3>
                <div class="box-tools">
                </div>
            </div>
            <!-- /.box-header -->
    
            <div class="box-body">
                <div style="margin-bottom: 10px">
    
                </div>
    
                <table class="table table-bordered">
                    <tbody>
                    <tr>
                        <th>#</th>
                        <th>組名</th>
                        <th>菜單</th>
                    </tr>
                    {% for group in groups %}
                        <tr>
                            <td style="width: 40px" data-url="{% url 'admin:update_group' group.id %}"><a
                                    href="#">{{ forloop.counter }}</a></td>
                            <td>{{ group.name }}</td>
                            <td>
                                {% for permis in group.permissions.all %}
                                    {{ permis.name }}/
                                {% empty %}
                                    暫未分配權(quán)限
                                {% endfor %}
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    {% endblock %}
    

二择葡、權(quán)限分組詳情頁(yè)

1.接口設(shè)計(jì)

  1. 接口說(shuō)明:
類(lèi)目 說(shuō)明
請(qǐng)求方法 GET
url定義 /admin/group/<int:group_id>/
參數(shù)格式 路徑參數(shù)
  1. 參數(shù)說(shuō)明:
參數(shù)名 類(lèi)型 是否必須 描述
group_id 整數(shù) 分組id
  1. 返回?cái)?shù)據(jù)

    返回html表單

2.后端代碼

  1. 視圖

    # 在myadmin/views.py中添加如下視圖
    class GroupUdateView(View):
        """
        分組更新視圖
        url: /admin/group/<int:group_id>/
        """
        def get(self, request, group_id):
            group = Group.objects.filter(id=group_id).first()
            if group:
                form = GroupModeForm(instance=group)
                permissions = group.permissions.only('id').all()
            else:
                form = GroupModeForm()
                permissions = []
            menus = models.Menu.objects.only('name', 'permission_id').select_related('permission').filter(is_delete=False, parent=None)
            return render(request, 'myadmin/group/group_detail.html', context={
                'form': form,
                'menus': menus,
                'permissions': permissions
            })
    
  2. 路由

    # 在admin/urls.py中添加如下路由
    path('group/<int:group_id>/', views.GroupUdateView.as_view(), name='update_group')
    
  3. 表單

    # 在 admin/forms.py中添加如下表單
    class GroupModeForm(forms.ModelForm):
        permissions = forms.ModelMultipleChoiceField(queryset=None, required=False,  help_text='權(quán)限', label='權(quán)限')
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['permissions'].queryset = Permission.objects.filter(menu__is_delete=False)
    
        class Meta:
            model = Group
            fields = ['name', 'permissions']
    

3.前端代碼

  1. html

    <!-- 創(chuàng)建模板myadmin/group/group_detail.html -->
    {% extends 'myadmin/base/content_base.html' %}
    {% load static %}
    {% load admin_customer_tags %}
    {% block page_header %}
        系統(tǒng)設(shè)置
    {% endblock %}
    {% block page_option %}
        權(quán)限分組
    {% endblock %}
    
    {% block content %}
        <div class="box box-primary">
            <div class="box-header with-border">
                <h3 class="box-title">分組詳情</h3>
            </div>
            <!-- /.box-header -->
            <!-- form start -->
            <div class="box-body">
                <div class="row">
                    <div class="col-md-3"></div>
                    <div class="col-md-6">
                        <form class="form-horizontal">
                            {% csrf_token %}
    
                            {% for field in form %}
                                {% if field.name == 'permissions' %}
                                    <div class="form-group {% if field.errors %}has-error{% endif %}">
    
                                        <label for="{{ field.id_for_label }}"
                                               class="col-sm-2 control-label">{{ field.label }}</label>
    
                                        <div class="col-sm-10">
                                            {% for error in field.errors %}
                                                <label class="control-label"
                                                       for="{{ field.id_for_label }}">{{ error }}</label>
                                            {% endfor %}
                                            {% for menu in menus %}
                                                <div class="row" style="margin: 0">
                                                    <div class="checkbox">
                                                        <label for="menu_{{ menu.permission.id }}">
                                                            <input {% if menu.permission in permissions %}checked{% endif %} type="checkbox" name="permissions" id="menu_{{ menu.permission.id }}"
                                                                   value="{{ menu.permission.id }}">{{ menu.name }}
                                                        </label>
                                                    </div>
                                                    {% for child in menu.children.all %}
                                                        <div class="checkbox col-sm-offset-1">
                                                            <label for="menu_{{ child.permission.id }}">
                                                                <input type="checkbox" {% if child.permission in permissions %}checked{% endif %} name="permissions" id="menu_{{ child.permission.id }}"
                                                                       value="{{ child.permission.id }}">{{ child.name }}
                                                            </label>
                                                        </div>
                                                    {% endfor %}
    
                                                </div>
                                            {% endfor %}
    
                                        </div>
                                    </div>
                                {% else %}
                                    <div class="form-group {% if field.errors %}has-error{% endif %}">
    
                                        <label for="{{ field.id_for_label }}"
                                               class="col-sm-2 control-label">{{ field.label }}</label>
    
                                        <div class="col-sm-10">
                                            {% for error in field.errors %}
                                                <label class="control-label"
                                                       for="{{ field.id_for_label }}">{{ error }}</label>
                                            {% endfor %}
                                            {% add_class field 'form-control' %}
                                        </div>
                                    </div>
                                {% endif %}
                            {% endfor %}
    
    
                        </form>
                    </div>
                    <div class="col-md-3"></div>
                </div>
            </div>
            <div class="box-footer">
    
                <button type="button" class="btn btn-default back">返回</button>
                <button type="button" data-url="{% url 'myadmin:group_update' form.instance.id %}"
                        class="btn btn-primary pull-right save">保存
                </button>
    
    
            </div>
        </div>
    {% endblock %}
    
    
    
  2. js

    // 創(chuàng)建 js/myadmin/group/group_list.js
    $(()=>{
            // 分組詳情
        $('tr').each(function () {
            $(this).children('td:first').click(function () {
                $('#content').load(
                    $(this).data('url'),
                    (response, status, xhr) => {
                        if (status !== 'success') {
                            message.showError('服務(wù)器超時(shí)烘跺,請(qǐng)重試铣揉!')
                        }
                    }
                );
            })
        });
    });
    

    記得再group_list.html中引用

三旗闽、權(quán)限分組修改

1.接口設(shè)計(jì)

  1. 接口說(shuō)明:
類(lèi)目 說(shuō)明
請(qǐng)求方法 PUT
url定義 /admin/group/<int:group_id>/
參數(shù)格式 路徑參數(shù)+表單參數(shù)
  1. 參數(shù)說(shuō)明:
參數(shù)名 類(lèi)型 是否必須 描述
group_id 整數(shù) 分組id
name 字符串 分組名稱(chēng)
permissions 整數(shù) 權(quán)限id
  1. 返回?cái)?shù)據(jù)

    # 修改正常返回json數(shù)據(jù)
    {
    "errno": "0",
    "errmsg": "用戶修改成功神汹!"
    }
    

    如果有錯(cuò)誤曹仗,返回html表單

2.后端代碼

  1. 視圖

    # 在myadmin/views.py的GroupUpdateView視圖中添加put方法
    class GroupUpdateView(View):
        """
        分組更新視圖
        url:/admin/group/<int:group_id>/
        """
        def get(self, request, group_id):
            # 1. 拿到要修改的分組
            group = Group.objects.filter(id=group_id).first()
            # 1.1 判斷是否存不存在
            if not group:
                return json_response(errno=Code.NODATA, errmsg='沒(méi)有此分組被冒!')
            # 2.創(chuàng)建表單
            form = GroupModeForm(instance=group)
            # 3.拿到所有的可用一集菜單
            menus = Menu.objects.only('name', 'permission_id').select_related('permission').filter(is_delete=False,parent=None)
            # 4.拿到當(dāng)前組的可用權(quán)限
            permissions = group.permissions.only('id').all()
            # 3.返回渲染html
            return render(request, 'myadmin/group/group_detail.html', context={
                'form': form,
                'menus': menus,
                'permissions': permissions
            })
    
        def put(self, request, group_id):
                # 1. 拿到要修改的分組
                group = Group.objects.filter(id=group_id).first()
                # 1.1 判斷是否存不存在
                # 1.1 判斷是否存不存在
                if not group:
                    return json_response(errno=Code.NODATA, errmsg='沒(méi)有此分組军掂!')
                # 2. 拿到前端傳遞的參數(shù)
                put_data = QueryDict(request.body)
                # 3. 校驗(yàn)參數(shù)
                # 3.1 創(chuàng)建表單對(duì)象
                form = GroupModeForm(put_data, instance=group)
                if form.is_valid():
                    # 4. 如果成功,保存數(shù)據(jù)
                    form.save()
                    return json_response(errmsg='修改分組成功昨悼!')
                else:
                    # 5. 如果失敗
                    menus = Menu.objects.only('name', 'permission_id').select_related('permission').filter(is_delete=False,
                                                                                                           parent=None)
                    # 4.拿到當(dāng)前組的可用權(quán)限
                    permissions = group.permissions.only('id').all()
                    return render(request, 'myadmin/group/group_detail.html', context={
                        'form': form,
                        'menus': menus,
                        'permissions': permissions
                    })
    

3.前端代碼

  1. js

    # 創(chuàng)建 js/admin/group/group_detail.js
    $(() => {
        // 返回按鈕
        $('.box-footer button.back').click(() => {
            $('#content').load(
                $('.sidebar-menu li.active a').data('url'),
                (response, status, xhr) => {
                    if (status !== 'success') {
                        message.showError('服務(wù)器超時(shí)蝗锥,請(qǐng)重試!')
                    }
                }
            );
        });
        // 保存按鈕
        $('.box-footer button.save').click(function () {
            // 將表單中的數(shù)據(jù)進(jìn)行格式化
            $
                .ajax({
                    url: $(this).data('url'),
                    data: $('form').serialize(),
                    type: 'PUT'
                })
                .done((res) => {
                    if (res.errno === '0') {
                        message.showSuccess('修改分組成功率触!');
                        $('#content').load(
                            $('.sidebar-menu li.active a').data('url'),
                            (response, status, xhr) => {
                                if (status !== 'success') {
                                    message.showError('服務(wù)器超時(shí)终议,請(qǐng)重試!')
                                }
                            }
                        );
                    } else {
                        $('#content').html(res)
                    }
                })
                .fail((res) => {
                    message.showError('服務(wù)器超時(shí)穴张,請(qǐng)重試!')
                })
        });
    
        // 復(fù)選框邏輯
        // 點(diǎn)擊一級(jí)菜單,二級(jí)菜單聯(lián)動(dòng)
        // 注意要在一級(jí)菜單中class屬性中加上one渐夸,二級(jí)菜單中加上two
        $('div.checkbox.one').each(function () {
            let $this = $(this);
            $this.find(':checkbox').click(function () {
    
                if($(this).is(':checked')){
                    $this.siblings('div.checkbox.two').find(':checkbox').prop('checked', true)
                }else{
                    $this.siblings('div.checkbox.two').find(':checkbox').prop('checked', false)
    
                }
            })
        });
    
        // 點(diǎn)擊二級(jí)菜單,一級(jí)菜單聯(lián)動(dòng)
        $('div.checkbox.two').each(function () {
            let $this = $(this);
            $this.find(':checkbox').click(function () {
                if($(this).is(':checked')){
                    $this.siblings('div.checkbox.one').find(':checkbox').prop('checked', true)
                }else {
                    if(!$this.siblings('div.checkbox.two').find(':checkbox').is(':checked')){
                        $this.siblings('div.checkbox.one').find(':checkbox').prop('checked', false)
                    }
                }
            })
        });
    });
    

四桃纯、添加分組頁(yè)面

1.接口設(shè)計(jì)

1.1接口說(shuō)明:

類(lèi)目 說(shuō)明
請(qǐng)求方法 GET
url定義 /admin/group/
參數(shù)格式 無(wú)參數(shù)

1.2返回?cái)?shù)據(jù)

返回html表單

2.后端代碼

2.1 視圖

# 在admin/views.py中添加如下視圖
class GroupAddView(View):
    """
    添加分組視圖
    """

    def get(self, request):
        form = GroupModeForm()
        menus = models.Menu.objects.only('name', 'permission_id').select_related('permission').filter(is_delete=False,
                                                                                                      parent=None)
        return render(request, 'admin/group/group_detail.html', context={'form': form, 'menus': menus})

2.2路由

# 在admin/urls.py中添加如下路由
path('group/', views.GroupAddView.as_view(), name='add_group'),

3.前端代碼

3.1html

<!-- 在admin/group/group_list.html 中添加 添加group的按鈕-->
            <div class="box-tools">
                <button type="button" class="btn btn-primary btn-sm"
                        data-url="{% url 'admin:add_group' %}">添加分組
                </button>
            </div>

3.2js

<!-- 在admin/group/group.js 中添加 添加group的按鈕的js代碼如下 -->
    // 添加分組
    $('.box-tools button').click(function () {
        $('#content').load(
                $(this).data('url'),
                (response, status, xhr) => {
                    if (status !== 'success') {
                        message.showError('服務(wù)器超時(shí)酷誓,請(qǐng)重試!')
                    }
                }
            );

    });

五态坦、添加分組

1.接口設(shè)計(jì)

1.1接口說(shuō)明:

類(lèi)目 說(shuō)明
請(qǐng)求方法 POST
url定義 /admin/group/
參數(shù)格式 表單參數(shù)

1.2參數(shù)說(shuō)明:

參數(shù)名 類(lèi)型 是否必須 描述
name 字符串 分組名稱(chēng)
permissions 整數(shù) 權(quán)限id

1.3返回?cái)?shù)據(jù)

# 修改正常返回json數(shù)據(jù)
{
"errno": "0",
"errmsg": "添加分組成功!"
}

如果有錯(cuò)誤伞梯,返回html表單

2.后端代碼

2.1 視圖

# 在admin/views.py中的GroupAddView視圖中添加post方法如下
class GroupAddView(View):
    """
    添加分組視圖
    """

    def get(self, request):
        form = GroupModeForm()
        menus = models.Menu.objects.only('name', 'permission_id').select_related('permission').filter(is_delete=False,
                                                                                                      parent=None)
        return render(request, 'admin/group/group_detail.html', context={'form': form, 'menus': menus})

    def post(self, request):
        form = GroupModeForm(request.POST)
        if form.is_valid():
            form.save()
            return json_response(errmsg='添加分組成功!')
        else:
            menus = models.Menu.objects.only('name', 'permission_id').select_related('permission').filter(
                is_delete=False,
                parent=None)
            return render(request, 'admin/group/group_detail.html', context={'form': form, 'menus': menus})

3.前端代碼

3.1 html

<!-- 修改group_detail.html中的保存按鈕代碼 -->
                        <button type="button" {% if form.instance.id %}
                    data-url="{% url 'admin:update_group' form.instance.id %}"
                    data-type="PUT"
            {% else %}
                    data-url="{% url 'admin:add_group' %}"
                    data-type="POST"
            {% endif %}
                    class="btn btn-primary pull-right save">保存
            </button>

3.2 js

// 修改 group_detail.js中保存按鈕的js代碼如下
// 保存按鈕
    $('.box-footer button.save').click(function () {
        // 將表單中的數(shù)據(jù)進(jìn)行格式化
        $
            .ajax({
                url: $(this).data('url'),
                data: $('form').serialize(),
                type: $(this).data('type')
            })
            .done((res) => {
                if (res.errno === '0') {
                    message.showSuccess('修改分組成功!');
                    $('#content').load(
                        $('.sidebar-menu li.active a').data('url'),
                        (response, status, xhr) => {
                            if (status !== 'success') {
                                message.showError('服務(wù)器超時(shí),請(qǐng)重試涮拗!')
                            }
                        }
                    );
                } else {
                    $('#content').html(res)
                }
            })
            .fail((res) => {
                message.showError('服務(wù)器超時(shí)惯退,請(qǐng)重試!')
            })
    });

六、權(quán)限認(rèn)證整合

1.業(yè)務(wù)需求

根據(jù)django內(nèi)置的權(quán)限模塊功能妒貌,可以很好的進(jìn)行權(quán)限認(rèn)證通危。但是本項(xiàng)目大量使用ajax,在進(jìn)行權(quán)限認(rèn)證時(shí)會(huì)遇到麻煩灌曙。且本項(xiàng)目的url設(shè)計(jì)符合RESTFUL api,所以在使用內(nèi)置權(quán)限認(rèn)證時(shí)也會(huì)出現(xiàn)問(wèn)題。因此本項(xiàng)目對(duì)權(quán)限認(rèn)證做了二次開(kāi)發(fā)颖杏。

2.權(quán)限認(rèn)證Mixin

  1. Mixin類(lèi)
class MyPermissionRequiredMinxin(PermissionRequiredMixin):

    def has_permission(self):
        """
        覆蓋父類(lèi)方法留储,解決不同請(qǐng)求翼抠,權(quán)限不同的問(wèn)題欲鹏。
        """
        perms = self.get_permission_required()
        if isinstance(perms, dict):
            if self.request.method.lower() in perms:
                return self.request.user.has_perms(perms[self.request.method.lower()])
        else:
            return self.request.user.has_perms(perms)

    def handle_no_permission(self):
        """
        覆蓋父類(lèi)方法膘盖,解決ajax返回json數(shù)據(jù)的問(wèn)題
        :return: 
        """
        if self.request.is_ajax():
            if self.request.user.is_authenticated:
                return json_response(errno=Code.ROLEERR, errmsg='您沒(méi)有權(quán)限侠畔!' )
            else:
                return json_response(errno=Code.SESSIONERR, errmsg=
                                     '您未登錄,請(qǐng)登錄损晤!', data={'url': reverse(self.get_login_url())})

        else:
            return super().handle_no_permission()

3.視圖權(quán)限認(rèn)證

使用方法和django提供的權(quán)限認(rèn)證方法一致软棺,新增同一個(gè)視圖通過(guò)請(qǐng)求方式進(jìn)行權(quán)限驗(yàn)證的功能。

# 
class MenuUpdateView(MyPermissionRequiredMinxin, View):
    """
    菜單管理視圖
    url:/admin/menu/<int:menu_id>/
    """
    # 不同請(qǐng)求尤勋,對(duì)應(yīng)不同的權(quán)限
    permission_required = {
        'get': ('admin.menu_update',),
        'put': ('admin.menu_update',),
        'delete': ('admin.menu_delete',),
    }
...

4.ajax接收處理

    // 編輯菜單
    $editBtns.click(function () {
        let $this = $(this);
        $currentMenu = $this.parent().parent();
        menuId = $this.parent().data('id');
        $
            .ajax({
                url: '/admin/menu/' + menuId + '/',
                type: 'get'
            })
            .done((res) => {
                if (res.errno === '4101') {
                    message.showError(res.errmsg);
                    setTimeout(() => {
                        window.location.href = res.data.url
                    }, 1500)
                } else if (res.errno === '4105') {
                    message.showError(res.errmsg)
                } else {
                    $('#modal-update .modal-content').html(res);
                    $('#modal-update').modal('show')
                }

            })
            .fail(() => {

                message.showError('服務(wù)器超時(shí)喘落,請(qǐng)重試!')

            })
    });
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末最冰,一起剝皮案震驚了整個(gè)濱河市瘦棋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暖哨,老刑警劉巖赌朋,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沛慢,警方通過(guò)查閱死者的電腦和手機(jī)赡若,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)团甲,“玉大人逾冬,你說(shuō)我怎么就攤上這事》ネィ” “怎么了粉渠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)圾另。 經(jīng)常有香客問(wèn)我霸株,道長(zhǎng),這世上最難降的妖魔是什么集乔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任去件,我火速辦了婚禮,結(jié)果婚禮上扰路,老公的妹妹穿的比我還像新娘尤溜。我一直安慰自己,他們只是感情好汗唱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布宫莱。 她就那樣靜靜地躺著,像睡著了一般哩罪。 火紅的嫁衣襯著肌膚如雪授霸。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天际插,我揣著相機(jī)與錄音碘耳,去河邊找鬼。 笑死框弛,一個(gè)胖子當(dāng)著我的面吹牛辛辨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瑟枫,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼斗搞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了慷妙?” 一聲冷哼從身側(cè)響起榜旦,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎景殷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猿挚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年咐旧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绩蜻。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铣墨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出办绝,到底是詐尸還是另有隱情伊约,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布孕蝉,位于F島的核電站屡律,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏降淮。R本人自食惡果不足惜超埋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佳鳖。 院中可真熱鬧霍殴,春花似錦、人聲如沸系吩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)穿挨。三九已至月弛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間絮蒿,已是汗流浹背尊搬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留土涝,地道東北人佛寿。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像但壮,于是被迫代替她去往敵國(guó)和親冀泻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容