欢迎来到银龙的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

ABP模拟登录ImpersonatorUserId

展示前端

header.cshtml

@{
    Layout = null;
    long? moni = ViewBag.moni;
}
@model HF.Template.UserManagerment.Users.Dtos.UserEditDto

@*<link rel="stylesheet" href="/PortalSite/Content/portalsite/css/head.css">*@
@*<link rel="stylesheet" href="/PortalSite/Content/portalsite/css/head-footer.css">*@
<link href="https://tvupt.oss-cn-beijing.aliyuncs.com//PortalSite/Content/portalsite/newcss/css/header_footer.css" rel="stylesheet" />
<style>
   .phone {
        background: url(/PortalSite/Content/portalsite/newcss/img/phone.png) no-repeat;
        background-position: left center;
        font-size: 16px;
        color: #646368;
        padding-left: 14px;
        color: #1a6bc9 !important;
    }
    .phs{position:relative}
    .imt{
        position:absolute;
        top:20px;
        left:-45px
    }
    .phs .imt {
        display: none
    }

    .imt {
        background: url(/PortalSite/Content/portalsite/img/dt.png) no-repeat;
        background-size: 100% 100%;
        width: 170px;
        height: 200px;
        text-align: center;
        z-index: 100;
    }

        .imt > img {
            width: 100px;
            height: 100px;
            margin-top: 26px;
        }

    .phs:hover .imt {
        display: block;
    }

    
</style>
<div class="header">
    @if (Model == null)
    {

        <div class="midHearder clearfix">
            <span class="leftHeader">
               @(DateTime.Now.ToString("yyyy年MM月dd日"))
                <span class="midList">您是第<span class="redList">@ViewBag.re</span>位访客!
                </span>@*在线用户<span class="redList">@ViewBag.li</span>人*@
            </span>
            <div class="rightHeader">
                <ul>
                    <li><a onclick="parent.location.href='/Account/SignIn'" href="javascript:;">登录</a></li>
                    <li>
                        <a onclick="parent.location.href='/Account/RegisterUser'" href="javascript:;">学员注册</a>&nbsp;|
                        <a onclick="parent.location.href='/Account/RegisterUser?type=2'" href="javascript:;">集体注册</a>
                    </li>
                    <li> <a onclick="parent.location.href='/Account/PassWordBack'" href="javascript:;">找回密码</a></li>
                    <li class="phs">
                        <a class="phone"  href="javascript:;">手机版</a>
                        <div class="imt">

                            <img src="~/PortalSite/Content/portalsite/img/mobilecode.png" />
                            <div style="margin:0px; padding:0px;line-height:20px">扫一扫</div>
                            <span style="margin:0px; padding:0px;line-height:20px">登录手机版</span>
                        </div>
                    </li>
                    @*<li><a href="loginRegister/signin.html">[退出]</a></li>*@
                </ul>
            </div>
        </div>
    }
    else if (Model.UserType == 1)
    {

        <div class="midHearder clearfix">
            <span class="leftHeader">
                @(DateTime.Now.ToString("yyyy年MM月dd日"))
                <span class="midList">
                    您是第<span class="redList">@ViewBag.re</span>位访客!
                </span> @*在线用户<span class="redList">@ViewBag.li</span>人*@
            </span>
            <div class="rightHeader">
                <ul>
                    <li>@ViewBag.person.Surname</li>
                    <li>
                        <a onclick="parent.location.href='/Train/Training'" href="javascript:;">我要报名</a>
                    </li>
                    <li><a onclick="parent.location.href='/PersonCenter/MyPersonalCenter'" href="javascript:;">进入学习中心</a></li>
                    @if (moni.HasValue && moni.Value > 0)
                    {
                        <li><a onclick="parent.location.href='/Account/SkipImpersonatorUser'" href="javascript:;">返回后台</a></li>
                    }
                    <li><a onclick="parent.location.href='/Account/Logout'" href="javascript:;">【退出】</a></li>
                    <li class="phs">
                        <a class="phone" href="javascript:;">手机版</a>
                        <div class="imt">

                            <img src="~/PortalSite/Content/portalsite/img/mobilecode.png" />
                            <div style="margin:0px; padding:0px;line-height:20px">扫一扫</div>
                            <span style="margin:0px; padding:0px;line-height:20px">登录手机版</span>
                        </div>
                    </li>
                </ul>
            </div>
        </div>

    }
    else if (Model.UserType == 2)
    {

        <div class="midHearder clearfix">
            <span class="leftHeader">
                @(DateTime.Now.ToString("yyyy年MM月dd日"))
                <span class="midList">
                    您是第<span class="redList">@ViewBag.re</span>位访客!
                </span>@*在线用户<span class="redList">@ViewBag.li</span>人*@
            </span>
            <div class="rightHeader">
                <ul>
                    <li>@ViewBag.company.CompanyName</li>
                    <li>
                        <a onclick="parent.location.href='/CompanyCenter/Apply'" href="javascript:;">我要报名</a>
                    </li>
                    <li><a onclick="parent.location.href='/CompanyCenter/TeamObligation'" href="javascript:;">进入管理中心</a></li>
                    @if (moni.HasValue && moni.Value > 0)
                    {
                        <li><a onclick="parent.location.href='/Account/SkipImpersonatorUser'" href="javascript:;">返回后台</a></li>
                    }
                    <li><a onclick="parent.location.href='/Account/Logout'" href="javascript:;">【退出】</a></li>
                    <li class="phs">
                        <a class="phone" href="javascript:;">手机版</a>
                        <div class="imt">

                            <img src="~/PortalSite/Content/portalsite/img/mobilecode.png" />
                            <div style="margin:0px; padding:0px;line-height:20px">扫一扫</div>
                            <span style="margin:0px; padding:0px;line-height:20px">登录手机版</span>
                        </div>
                    </li>
                </ul>
            </div>
        </div>
    }
    else 
    {

        <div class="midHearder clearfix">
            <span class="leftHeader">
                @(DateTime.Now.ToString("yyyy年MM月dd日"))
                <span class="midList">
                    您是第<span class="redList">@ViewBag.re</span>位访客!
                </span>@*在线用户<span class="redList">@ViewBag.li</span>人*@
            </span>
            <div class="rightHeader">
                <ul>
                    <li><a onclick="parent.location.href='/Account/SignIn'" href="javascript:;">登录</a></li>
                    <li>
                        <a onclick="parent.location.href='/Account/RegisterUser'" href="javascript:;">学员注册</a>&nbsp;|
                        <a onclick="parent.location.href='/Account/RegisterUser?type=2'" href="javascript:;">集体注册</a>
                    </li>
                    <li> <a onclick="parent.location.href='/Account/PassWordBack'" href="javascript:;">找回密码</a></li>
                    <li><a onclick="parent.location.href='/Account/SkipImpersonatorUser'" href="javascript:;">返回后台</a></li>
                    <li class="phs">
                        <a class="phone" href="javascript:;">手机版</a>
                        <div class="imt">

                            <img src="~/PortalSite/Content/portalsite/img/mobilecode.png" />
                            <div style="margin:0px; padding:0px;line-height:20px">扫一扫</div>
                            <span style="margin:0px; padding:0px;line-height:20px">登录手机版</span>
                        </div>
                    </li>
                </ul>
            </div>
        </div>
    }
</div>
<div class="logoLine">
    <div class="midHearder clearfix">
        <a href="#" class="leftLogo">
            <img src="https://tvupt.oss-cn-beijing.aliyuncs.com//PortalSite/Content/portalsite/newcss/img/logo.jpg" alt="">
        </a>
        <div class="rightTel">
            <p class="logo">咨询电话 <span class="listLogo">0315-2020187或2059305</span></p>
            <p class="tel">3047785784@qq.com</p>
        </div>
    </div>
</div>

展示后台

        /// <summary>
        /// 布局头部
        /// </summary>
        /// <returns></returns>      
        public ActionResult header()
        {
            var c = _userAppService.GetHomeCount();

            ViewBag.re = c.Item1;

            ViewBag.li = c.Item2;
            PersonEditDto personEditDto = null;
            CompanyEditDto companyEditDto = null;
            var UserId = AbpSession.UserId;
            ViewBag.moni = AbpSession.ImpersonatorUserId;
            UserEditDto usero = null;
            if (UserId.HasValue && UserId > 0)
            {
                 usero = _userAppService.GetUserById(AbpSession.UserId.Value);


                if (usero.UserType == 1)
                {
                    var user = _userAppService.GetOrdinaryUserInfo((int)AbpSession.UserId.Value);
                    personEditDto = user;
                }
                else if (usero.UserType == 2)
                {
                    var company = _userAppService.GetCompanyUserInfo((int)AbpSession.UserId.Value);
                    companyEditDto = company;
                }
            }
            ViewBag.person = personEditDto;
            ViewBag.company = companyEditDto;
            return View(usero);
        }

登录前端

ordinaryUserList.cshtml

@using HF.Template.Localization
<link href="~/libs/bootstrap/css/multiple-select.css" rel="stylesheet" />
<script src="~/libs/bootstrap/js/multiple-select.js"></script>
<style>
    :before {
        margin-right: 5px;
    }

    body input[type="checkbox"] {
        margin: 0;
    }
</style>
<div ng-controller="app.views.users.ordinaryuserlist as s">
    <div class="panel">
        <div class="content panel-body">
            <div class="row ">
                <div class="col-xs-12 col-md-6">
                    <div class="form-group">
                        <label class="control-label">姓名</label>
                        <input type="text" class="form-control" ng-model="s.requestParams.surname" />

                    </div>

                </div>
                <div class=" col-xs-12 col-md-6">
                    <div class="form-group">
                        <label class="control-label">手机号</label>
                        <input type="text" class="form-control" onkeyup="value=value.replace(/[^0-9]/g,'')" ng-model="s.requestParams.phoneNo" />
                    </div>
                </div>

            </div>
            <div class="row " @*ng-if="s.advancedFiltersAreShown"*@>
                <div class="col-xs-12 col-md-6">
                    <div class="form-group">
                        <label class="control-label">身份证</label>
                        <input type="text" class="form-control" ng-model="s.requestParams.identityCard" />

                    </div>
                </div>

                <div class="col-xs-12 col-md-6" ng-if="s.currentTanentId==null">
                    <div class="form-group">
                        <label class="control-label">租户</label>
                        <select multiple="multiple" ng-model="s.requestParams.tenantIds" select-mutiple="{value:'id',text:'name',list:  s.tenants,selectedValue:[s.currentTanentId]}"></select>

                    </div>
                </div>
            </div>
            <div class="row " @*ng-if="s.advancedFiltersAreShown"*@>
                <div class="col-xs-12 col-md-6">
                    <div class="form-group">
                        <label class="control-label">单位</label>
                        <input type="text" class="form-control" ng-model="s.requestParams.company" />

                    </div>
                </div>

                <div class="col-xs-12 col-md-6">
                    <div class="form-group">
                        <button class="btn blue" type="button" ng-click="s.getUsers()" style="margin-top:21px"><i class="fa fa-refresh"></i>搜索</button>
                    </div>
                </div>
            </div>
            @*<div class="row" enter-key="s.getUsers()">
                    <div class="col-lg-12 col-md-12">
                        <div class="input-group input-group-sm">
                            <input ng-model="s.filterText" auto-focus class="form-control" placeholder="@L("SearchWithThreeDot")" type="text">
                            <span class="input-group-btn">
                                <button class="btn btn-default" ng-click="s.getUsers()"><i class="fa fa-refresh"></i> @L("Refresh")</button>
                            </span>
                        </div>
                    </div>
                </div>*@

            @*<div class="row" ng-if="s.advancedFiltersAreShown">
                    <div class="col-lg-6 col-md-12">
                        <div class="input-group">
                            <label class="input-group-addon">占位</label>
                            <input type="text" class="form-control">
                        </div>
                    </div>
                    <div class="col-lg-6 col-md-12">
                        <div class="input-group">
                            <label class="input-group-addon">占位</label>
                            <input type="text" class="form-control">
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-6">
                        <span class="clickable-item text-muted" ng-if="!s.advancedFiltersAreShown" ng-click="s.advancedFiltersAreShown=!s.advancedFiltersAreShown"><i class="fa fa-angle-down"></i> @L("ShowAdvancedFilters")</span>
                        <span class="clickable-item text-muted" ng-if="s.advancedFiltersAreShown" ng-click="s.advancedFiltersAreShown=!s.advancedFiltersAreShown"><i class="fa fa-angle-up"></i> @L("HideAdvancedFilters")</span>
                     </div>
                    <div class="col-sm-6">
                    </div>
                </div>*@

            <div class="row">
                <div class="col-sm-6 btn-group btn-group-sm col-xs-12 col-md-6">
                    <button class="btn btn-default" ng-if="s.permissions.create" ng-click="s.createUser()"><i class="fa fa-plus"></i> @L("CreateNewUser")</button>
                    <button style="margin-left:5px;margin-bottom: 5px;" class="btn btn-default" ng-if="s.permissions.edit" ng-click="s.batchActive()"><i class="fa fa-ravelry"></i>批量审核用户</button>
                    <button style="margin-left:5px;margin-bottom: 5px;" class="btn btn-default" ng-if="s.permissions.delete" ng-click="s.deleteAll()"><span class="fa fa-trash-o">@L("BatchDelete")</span></button>
                    <button style="margin-left:5px; margin-bottom: 5px;" class="btn btn-default" ng-click="s.downloadTemp()"><i class="fa fa-file-excel-o"></i>@L("DownLoadDataTemp")</button>
                    <button style="margin-left:5px; margin-bottom: 5px;" class="btn btn-default btn-sm" ng-click="s.exportToExcel()"><span class="glyphicon glyphicon-export">导出表格</span></button>
                </div>
                <div class="col-sm-6 text-right col-xs-12 col-md-6">
                    <input id="excelFile" name="excelFile" class="file-loading  " type="file" accept=".xls,.xlsx">
                </div>
            </div>
            <div busy-if="s.loading">
                <div ui-grid="s.userGridOptions" ui-grid-selection ui-grid-pagination ui-grid-resize-columns dir=@(CultureHelper.IsRtl ? "rtl" : "")></div>
            </div>
        </div>
    </div>
</div>

 

ordinaryUserList.js

(function () {
    'use strict';
    yoyocmsModule.controller('app.views.users.ordinaryuserlist', [
        '$scope', '$state', '$http', 'FileSaver', 'Blob', '$uibModal', '$stateParams', 'uiGridConstants', 'abp.services.app.user',  'abp.services.app.canton',
        function ($scope, $state, $http, FileSaver, Blob, $uibModal, $stateParams, uiGridConstants, userService, cantonService) {
            var s = this;
            $state.current.title = $state.current.displayName;//页面标签
            s.loading = false;
            //s.advancedFiltersAreShown = false;//是否显示高级过滤
            //s.filterText = $stateParams.filterText || '';//过滤文本
            //s.currentUserId = abp.session.userId;//当前用户
            s.currentTanentId = abp.session.tenantId;
            //权限定义
            s.permissions = {
                detail: abp.auth.hasPermission('Pages.Users.Ordinary.Detail'),//详情
                create: abp.auth.hasPermission('Pages.Users.Ordinary.Create'),//添加
                edit: abp.auth.hasPermission('Pages.Users.Ordinary.Edit'),//编辑
                delete: abp.auth.hasPermission('Pages.Users.Ordinary.Delete'),//删除
                import: abp.auth.hasPermission('Pages.Users.Ordinary.Import'),//导入
                impersonation: abp.auth.hasPermission('Pages.Users.Ordinary.Impersonation')//模拟
            };

            //请求参数
            s.requestParams = {
                userName:"",
                tenantIds: [s.currentTanentId],
                phoneNo: "",
                surName: "",
                identityCard: "",
                filterText: "",
                company:"",
                isActive: null,             
                skipCount: 0,
                maxResultCount: app.consts.grid.defaultPageSize,
                sorting: null
            };

            //普通用户列表
            s.userGridOptions = {
                enableHorizontalScrollbar: uiGridConstants.scrollbars.WHEN_NEEDED,
                enableVerticalScrollbar: uiGridConstants.scrollbars.WHEN_NEEDED,
                paginationPageSizes: app.consts.grid.defaultPageSizes,
                paginationPageSize: app.consts.grid.defaultPageSize,
                useExternalPagination: true,
                useExternalSorting: true,
                enableHiding: false,
                enableSorting: true,
                enableFullRowSelection: false,
                enableRowHeaderSelection: true,
                selectionRowHeaderWidth: 35,
                enableSelectAll: true,
                appScopeProvider: s,
                rowTemplate: '<div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ \'ui-grid-row-header-cell\': col.isRowHeader, \'text-muted\': !row.entity.isActive }"  ui-grid-cell></div>',
                columnDefs: [
                    {
                        name: app.localize('UserName'),
                        field: 'userName',
                        sorting: 'UserName',
                        cellTemplate:
                            '<div class=\"ui-grid-cell-contents\">' +
                            '  <img ng-if="row.entity.profilePictureId" ng-src="' + abp.appPath + 'Profile/GetProfilePictureById?id={{row.entity.profilePictureId}}" width="22" height="22" class="img-rounded img-profile-picture-in-grid" />' +
                            '  <img ng-if="!row.entity.profilePictureId" src="' + abp.appPath + 'Common/Images/default-profile-picture.png" width="22" height="22" class="img-rounded" />' +
                            '  {{COL_FIELD CUSTOM_FILTERS}} &nbsp;' +
                            '</div>',
                        enableHiding: false,
                        enableSorting: true,
                        minWidth: 140
                    },
                    {
                        name: "姓名",
                        field: 'surname',
                        sorting: 'Surname',
                        enableHiding: false,
                        enableSorting: true,
                        minWidth: 160
                    },
                    {
                        name: "身份证号",
                        field: 'identityCard',
                        sorting: 'IdentityCard',
                        enableHiding: false,
                        enableSorting: true,
                        minWidth: 160
                    },

                    {
                        name: "所在区",
                        field: 'area',
                        sorting: 'Area',
                        enableHiding: false,
                        enableSorting: true,
                        minWidth: 160
                    },
                    {
                        name: "注册时间",
                        field: 'creationTime',
                        sorting: 'CreationTime',
                        cellFilter: 'momentFormat: \'YYYY-MM-DD HH:mm:ss\'',
                        enableHiding: false,
                        enableSorting: true,
                        minWidth: 160
                    },
                    {
                        name: '审核状态',
                        field: 'isActive',
                        sorting: 'IsActive',
                        enableHiding: false,
                        enableSorting: true,
                        minWidth: 100,
                        cellFilter: 'stringformat'
                    },
                    {
                        name: app.localize('Actions'),
                        enableHiding: false,
                        enableSorting: false,
                        enableColumnMenu: false,// 是否显示列头部菜单按钮
                        width: 120,
                        cellTemplate:
                            '<div class=\"ui-grid-cell-contents\">' +
                            '  <div class="btn-group dropdown" uib-dropdown="" dropdown-append-to-body>' +
                            '    <button class="btn btn-xs btn-primary blue" uib-dropdown-toggle="" aria-haspopup="true" aria-expanded="false"><i class="fa fa-cog"></i> ' + app.localize('Actions') + ' <span class="caret"></span></button>' +
                            '    <ul uib-dropdown-menu>' +
                            '      <li><a ng-if="grid.appScope.permissions.impersonation && row.entity.id != grid.appScope.currentUserId" ng-click="grid.appScope.impersonate(row.entity)">' + app.localize('LoginAsThisUser') + '</a></li>' +
                            '      <li><a ng-if="grid.appScope.permissions.detail" ng-click="grid.appScope.userDetail(row.entity)">' + app.localize('Detail') + '</a></li>' +//TODO:详情点击事件未添加
                            '      <li><a ng-if="grid.appScope.permissions.delete" ng-click="grid.appScope.deleteUser(row.entity)">' + app.localize('Delete') + '</a></li>' +//TODO:详情点击事件未添加
                            '      <li><a ng-if="grid.appScope.permissions.edit" ng-click="grid.appScope.editUser(row.entity)">' + app.localize('Edit') + '</a></li>' +
                            '      <li><a ng-if="grid.appScope.permissions.edit" ng-click="grid.appScope.changePassword(row.entity)">' + app.localize('PasswordReset') + '</a></li>' +
                            '    </ul>' +
                            '  </div>' +
                            '</div>'
                    },
                ],
                onRegisterApi: function (gridApi) {
                    $scope.gridApi = gridApi;
                    $scope.gridApi.core.on.sortChanged($scope, function (grid, sortColumns) {
                        if (!sortColumns.length || !sortColumns[0].field) {
                            s.requestParams.sorting = null;
                        } else {
                            s.requestParams.sorting = sortColumns[0].colDef.sorting + ' ' + sortColumns[0].sort.direction;
                        }

                        s.getUsers();
                    });
                    gridApi.pagination.on.paginationChanged($scope, function (pageNumber, pageSize) {
                        s.requestParams.skipCount = (pageNumber - 1) * pageSize;
                        s.requestParams.maxResultCount = pageSize;

                        s.getUsers();
                    });
                    gridApi.selection.on.rowSelectionChanged($scope, function (row, event) {


                        var selectrows = gridApi.selection.getSelectedGridRows()
                        //行选中事件
                    });
                },
                data: []
            };

            //获取普通用户列表
            s.getUsers = function () {
                s.loading = true;             
                if (s.requestParams.tenantIds.indexOf("null") > -1) {
                    s.requestParams.tenantIds.splice(s.requestParams.tenantIds.indexOf("null"), 1, null)                  
                }
                if (s.requestParams.tenantIds.length == 0)
                    s.requestParams.tenantIds.push(null)
                userService.getPagedOrdinaryUsersAsync($.extend({ filterText: s.filterText}, s.requestParams))
                    .then(function (result) {
                        s.userGridOptions.totalItems = result.data.totalCount;
                        s.userGridOptions.data = result.data.items;
                    }).finally(function () {
                        s.loading = false;
                    });
            };

            //编辑用户
            s.editUser = function (user) {
                openCreateOrEditUserModal(user.id);
            };

            //添加用户
            s.createUser = function () {
                openCreateOrEditUserModal(null);
            };

            //TODO:注释 暂时不实现 编辑权限
            //s.editPermissions = function (user) {
            //    $uibModal.open({
            //        templateUrl: '~/App/common/views/users/permissionsModal.cshtml',
            //        controller: 'common.views.users.permissionsModal as s',
            //        backdrop: 'static',
            //        resolve: {
            //            user: function () {
            //                return user;
            //            }
            //        }
            //    });
            //};

            //模拟登陆
            s.impersonate = function (user) {
                abp.ajax({
                    url: abp.appPath + 'Account/OrdinaryImpersonate',
                    data: JSON.stringify({
                        tenantId: abp.session.tenantId,
                        userId: user.id
                    })
                });
            };

            //TODO:暂未显示 删除单个普通用户
            s.deleteUser = function (user) {
                if (user.userName == app.consts.userManagement.defaultAdminUserName) {
                    abp.message.warn(app.localize("UserCannotBeDeleted", app.consts.userManagement.defaultAdminUserName));
                    return;
                }

                abp.message.confirm(
                    app.localize('UserDeleteWarningMessage', user.userName),
                    function (isConfirmed) {
                        if (isConfirmed) {
                            userService.deleteOrdinaryUserAsync({
                                id: user.id
                            }).then(function () {
                                s.getUsers();
                                abp.notify.success(app.localize('SuccessfullyDeleted'));
                            });
                        }
                    }
                );
            };

            //获取所有租户
            s.getAlltenants = function () {
                cantonService.getTenantsAsync().then(function (result) {
                    s.tenants = result.data;
                })
            }
            s.te = [null];
            s.exportToExcel = function () {
                if (s.requestParams.tenantIds[0] == "null") {
                    s.requestParams.tenantIds = s.te;
                }
                return $http.post('/api/user/ExportClassUserAsync', s.requestParams, { responseType: "arraybuffer" }).then(function (response) {
                    if (response.status == "200") {
                        var data = new Blob([response.data], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
                        var filename = "userList.xlsx";
                        FileSaver.saveAs(data, filename);
                    } else {
                        abp.message.info(response.statusText);
                    }
                });
              

            }
            //批量删除普通用户
            s.deleteAll = function () {
                s.select = [];
                var currentSelection = $scope.gridApi.selection.getSelectedRows();
                if (currentSelection.length == 0) {
                    abp.message.warn('请选择要删除的用户!', '提示');
                }
                else {
                    for (var i = 0; i < currentSelection.length; i++) {
                        s.select.push(currentSelection[i].id);
                    }
                    abp.message.confirm(
                        app.localize('UserDeleteWarningMessage', currentSelection[0].surname + " 等"),
                        function (isConfirmed) {
                            if (isConfirmed) {
                                userService.batchDeleteOrdinaryUserAsync({
                                    userIds: s.select
                                }).then(function () {
                                    s.getUsers();
                                    abp.notify.success(app.localize('SuccessfullyDeleted'));
                                });
                            }
                        }
                    );
                }
            }
      //用户详情
            s.userDetail = function (user) {        
               
                var modalInstance = $uibModal.open({
                    templateUrl: '~/App/Admin/views/users/ordinaryUserDetail.cshtml',
                    controller: 'app.views.users.ordinaryUserDetail as vm',
                    backdrop: 'static',
                    size:'lg',
                    resolve: {
                        userId: function () {
                            return user.id;
                        }
                    }
                });

                modalInstance.result.then(function (result) {
                    s.getUsers();
                });
            }
            s.batchActive = function () {
               s.select = [];
                var currentSelection = $scope.gridApi.selection.getSelectedRows();
                if (currentSelection.length == 0) {
                    abp.message.warn('请选择要审核的用户!', '提示');
                }
                else {
                    for (var i = 0; i < currentSelection.length; i++) {

                        s.select.push(currentSelection[i].id);
                    }
                    abp.message.confirm(
                        "确定要通过审核吗",
                        function (isConfirmed) {
                            if (isConfirmed) {
                                userService.batchActive({
                                    userIds: s.select
                                }).then(function () {
                                    s.getUsers();
                                    abp.notify.success("审核成功");
                                });
                            }
                        }
                    );
                }

            }
            //TODO:注释 暂时不实现 解锁用户
            //s.unlockUser = function (user) {
            //    userService.unlockUser({
            //        id: user.id
            //    })
            //        .then(function () {
            //            abp.notify.success(app.localize('UnlockedTheUser', user.userName));
            //        });
            //};
            //TODO:注释 暂时不实现 导出excel
            //s.exportToExcel = function () {
            //    userService.getUsersToExcel({})
            //        .then(function (result) {
            //            app.downloadTempFile(result.data);
            //        });
            //};

            //打开创建或者编辑用户窗体
            function openCreateOrEditUserModal(userId) {
                var modalInstance = $uibModal.open({
                    templateUrl: '~/App/Admin/views/users/createOrEditOrdinaryModal.cshtml',
                    controller: 'app.views.users.createOrEditOrdinaryModal as vm',
                    backdrop: 'static',
                    //size:'lg',
                    resolve: {
                        userId: function () {
                            return userId;
                        }
                    }
                });

                modalInstance.result.then(function (result) {
                    s.getUsers();
                });
            }

            //重置密码
            s.changePassword = function (user) {
                abp.message.confirm(
                    app.localize('PasswordResetWarningMessage', user.userName),
                    function (isConfirmed) {
                        if (isConfirmed) {
                            userService.resetPassword({
                                id: user.id
                            }).then(function (result) {
                                abp.message.success("密码已经被重置为" + result.data);
                            });
                        }
                    }
                );
            };

            //下载模板
            s.downloadTemp = function () {
                return $http.post('/api/files/downloadSingle', { filePath: "~/App_Data/temp/UserList.xlsx" }, { responseType: "arraybuffer" }).then(function (response) {
                    if (response.status == "200") {
                        var data = new Blob([response.data], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
                        var filename = "UserList.xlsx";
                        FileSaver.saveAs(data, filename);
                    } else {
                        abp.message.info(response.statusText);
                    }
                });
            };
            s.getAlltenants();
            s.getUsers();


            if (s.permissions.import) {//判断权限

                //初始化上传控件的样式
                $("#excelFile").fileinput({
                    language: 'zh', //设置语言
                    uploadUrl: '/api/services/app/user/UploadOrdinaryUserToExcel', //上传的地址
                    //uploadUrl: '/api/services/app/question/UploadQuestionToExcel', //上传的地址

                    uploadAsync: true, //默认异步上传
                    showUpload: true, //是否显示上传按钮
                    showCaption: true,//是否显示标题
                    allowedFileExtensions: ["xls", "xlsx"],//接收的文件后缀
                    mainClass:"input-group-sm",//控件组样式
                    browseClass: "btn btn-primary", //按钮样式  
                    //dropZoneEnabled: false,//是否显示拖拽区域
                    //minImageWidth: 50, //图片的最小宽度
                    //minImageHeight: 50,//图片的最小高度
                    //maxImageWidth: 1000,//图片的最大宽度
                    //maxImageHeight: 1000,//图片的最大高度
                    //maxFileSize: 0,//单位为kb,如果为0表示不限制文件大小
                    //minFileCount: 0,
                    //msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
                    enctype: 'multipart/form-data',
                    validateInitialCount: true,
                    maxFileCount: 1,//最大上传文件数限制
                    showPreview: false, //是否显示预览
                    previewFileIcon: '<i class="glyphicon glyphicon-file"></i>',
                    previewFileIconSettings: {
                        'docx': '<i ass="fa fa-file-word-o text-primary"></i>',
                        'xlsx': '<i class="fa fa-file-excel-o text-success"></i>',
                        'xls': '<i class="fa fa-file-excel-o text-success"></i>',
                        'pptx': '<i class="fa fa-file-powerpoint-o text-danger"></i>',
                        'jpg': '<i class="fa fa-file-photo-o text-warning"></i>',
                        'pdf': '<i class="fa fa-file-archive-o text-muted"></i>',
                        'zip': '<i class="fa fa-file-archive-o text-muted"></i>',
                    },
                    uploadExtraData: function (previewId, index) {           //传参  
                        //此处自定义传参  
                        var data = {
                            //"courseId": 1,  
                            //"categoryId": 1
                        };
                        return data;
                    }
                });

                //导入文件上传完成之后的事件  异步上传成功结果处理
                $("#excelFile").on("fileuploaded", function (event, data, previewId, index) {
                    s.getUsers();
                });
                //同步上传成功结果处理
                $("#excelFile").on("filebatchuploadsuccess", function (event, data, previewId, index) {
                    s.getUsers();
                });

            } else { $("#excelFile").hide(); }

        }]);
})();

 

登录后端

        #region Impersonation

        [AbpMvcAuthorize(PermissionNames.Pages_Users_Company_Impersonation)]
        public Task<JsonResult> CompanyImpersonate(ImpersonateModel model) { return Impersonate(model); }

        [AbpMvcAuthorize(PermissionNames.Pages_Users_Ordinary_Impersonation)]
        public Task<JsonResult> OrdinaryImpersonate(ImpersonateModel model) { return Impersonate(model); }

        public virtual async Task<JsonResult> Impersonate(ImpersonateModel model)
        {
            CheckModelState();

            if (AbpSession.ImpersonatorUserId.HasValue)
            {
                throw new CustomeFriendlyException(L("CascadeImpersonationErrorMessage"));
            }

            if (AbpSession.TenantId.HasValue)
            {
                if (!model.TenantId.HasValue)
                {
                    throw new CustomeFriendlyException(L("FromTenantToHostImpersonationErrorMessage"));
                }

                if (model.TenantId.Value != AbpSession.TenantId.Value)
                {
                    throw new CustomeFriendlyException(L("DifferentTenantImpersonationErrorMessage"));
                }
            }

            var result = await SaveImpersonationTokenAndGetTargetUrl(model.TenantId, model.UserId, false);
          //  AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
            return result;
        }

        [UnitOfWork]
        public virtual async Task<ActionResult> ImpersonateSignIn(string tokenId)
        {
            var cacheItem = await _cacheManager.GetImpersonationCache().GetOrDefaultAsync(tokenId);
            if (cacheItem == null)
            {
                throw new CustomeFriendlyException(L("ImpersonationTokenErrorMessage"));
            }

            //Switch to requested tenant   去掉过滤 宿主需要模拟登陆其他租户的用户
            // using (_unitOfWorkManager.Current.SetFilterParameter(AbpDataFilters.MayHaveTenant, AbpDataFilters.Parameters.TenantId, cacheItem.TargetTenantId))
            using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
            {
                //Get the user from tenant
                var user = await _userManager.FindByIdAsync(cacheItem.TargetUserId);

                //Create identity
                //var identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

                // var identity = await _userManager.CreateIdentityAsync(user,"Bearer");


                var identity = await _userManager.CreateIdentityAsync(user, "Bearer");

                if (!cacheItem.IsBackToImpersonator)
                {
                    //Add claims for audit logging
                    if (cacheItem.ImpersonatorTenantId.HasValue)
                    {
                        identity.AddClaim(new Claim(AbpClaimTypes.ImpersonatorTenantId, cacheItem.ImpersonatorTenantId.Value.ToString(CultureInfo.InvariantCulture)));
                    }

                    identity.AddClaim(new Claim(AbpClaimTypes.ImpersonatorUserId, cacheItem.ImpersonatorUserId.ToString(CultureInfo.InvariantCulture)));
                }
                await SignInAsync(user, identity);
               
                
                //Sign in with the target user
                user.Online = 1;
                //AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
                //AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = false }, identity);


                //var accessToken = CreateAccessToken(await CreateJwtClaims(identity, user));

              //  System.Web.HttpContext.Current.Response.Cookies.Add(new System.Web.HttpCookie("webToken") { Path = "/", Name = "webToken", Value = accessToken });



                //Remove the cache item to prevent re-use
                await _cacheManager.GetImpersonationCache().RemoveAsync(tokenId);
                if (user.UserType == 0)
                {
                    return Redirect("/Admin");// 跳转后台
                }
                else
                {
                    if (System.Configuration.ConfigurationManager.AppSettings["debug"] == "0")
                    {
                        var tenantId = user.TenantId;
                        var caton = _cantonAppService.GetBindCantonByTenantId(tenantId);
                        return Redirect("http://" + caton.SubURL + "." + System.Configuration.ConfigurationManager.AppSettings["ym"]);//修改 李飞行 跳转首页
                    }else
                    {
                        return Redirect("/");// 跳转首页
                    }
                }
                //return RedirectToAction();
            }
        }

        //public virtual JsonResult IsImpersonatedLogin()
        //{
        //    return Json(new AjaxResponse { Result = AbpSession.ImpersonatorUserId.HasValue });
        //}

        //public virtual async Task<JsonResult> BackToImpersonator()
        //{
        //    if (!AbpSession.ImpersonatorUserId.HasValue)
        //    {
        //        throw new CustomeFriendlyException(L("NotImpersonatedLoginErrorMessage"));
        //    }

        //    var result = await SaveImpersonationTokenAndGetTargetUrl(AbpSession.ImpersonatorTenantId, AbpSession.ImpersonatorUserId.Value, true);
        //    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        //    return result;
        //}

        private async Task<JsonResult> SaveImpersonationTokenAndGetTargetUrl(int? tenantId, long userId, bool isBackToImpersonator)
        {
            //Create a cache item
            var cacheItem = new ImpersonationCacheItem(
                tenantId,
                userId,
                isBackToImpersonator
                );

            if (!isBackToImpersonator)
            {
                cacheItem.ImpersonatorTenantId = AbpSession.TenantId;
                cacheItem.ImpersonatorUserId = AbpSession.GetUserId();
            }

            //Create a random token and save to the cache
            var tokenId = Guid.NewGuid().ToString();
            await _cacheManager
                .GetImpersonationCache()
                .SetAsync(tokenId, cacheItem, TimeSpan.FromMinutes(1));

            //Find tenancy name
            string tenancyName = null;
            if (tenantId.HasValue)
            {
                tenancyName = (await _tenantManager.GetByIdAsync(tenantId.Value)).TenancyName;
            }

            //Create target URL
            var targetUrl = _webUrlService.GetSiteRootAddress(tenancyName) + "Account/ImpersonateSignIn?tokenId=" + tokenId;
            return Json(new AjaxResponse { TargetUrl = targetUrl });
        }

        #endregion

 public async Task<ActionResult> SkipImpersonatorUser() {
            using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
            {
                if (AbpSession.ImpersonatorUserId.HasValue && AbpSession.ImpersonatorUserId.Value > 0)
                {
                    var user = await _userManager.FindByIdAsync(AbpSession.ImpersonatorUserId.Value);

                    await SignInAsync(user);

                    //Create identity
                    // var identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
                    // AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
                    user.Online = 1;
                    //AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = false }, identity);
                }

                return Redirect("/Admin");
            }
        }

 

posted on 2020-11-10 15:30  银龙科技  阅读(587)  评论(0编辑  收藏  举报

导航