You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS 1.6应用全局头部登录功能实现及代码复用咨询

解决方案:迁移全局登录表单并复用AngularJS 1.6登录逻辑

Great question! Let's break this down step by step—you can absolutely reuse your existing login code while moving the form to a global header, and I'll walk you through how to do it without breaking anything, plus cover core AngularJS login best practices with your CodeIgniter backend.


第一步:重构登录逻辑到全局服务(Service)

AngularJS Services是单例对象,全局可用,正好适合封装可复用的登录逻辑。把你原来homeCtrl.js里的登录API调用、用户状态管理全部迁移到这里:

angular.module('yourApp').service('AuthService', ['$http', '$window', function($http, $window) {
  // 持久化存储用户状态(页面刷新也不会丢失)
  let currentUser = JSON.parse($window.localStorage.getItem('appCurrentUser')) || null;

  // 复用原登录逻辑:对接CodeIgniter后端API
  this.login = function(credentials) {
    return $http.post('/api/login', credentials)
      .then(response => {
        // 登录成功后存储用户信息到localStorage
        currentUser = response.data;
        $window.localStorage.setItem('appCurrentUser', JSON.stringify(currentUser));
        return currentUser;
      })
      .catch(error => {
        // 统一处理登录错误
        throw error.data?.message || '登录失败,请检查账号密码';
      });
  };

  // 获取当前登录用户
  this.getCurrentUser = function() {
    return currentUser;
  };

  // 登出方法(按需添加)
  this.logout = function() {
    currentUser = null;
    $window.localStorage.removeItem('appCurrentUser');
  };
}]);

第二步:创建全局头部组件(Component)

因为头部要在所有页面显示,用AngularJS Component封装最适合,它自带模板和控制器,方便复用:

1. 头部组件控制器

angular.module('yourApp').component('appGlobalHeader', {
  templateUrl: 'templates/global-header.html',
  controller: ['AuthService', '$scope', function(AuthService, $scope) {
    const vm = this;
    vm.credentials = { username: '', password: '' };
    vm.loginError = '';
    vm.currentUser = AuthService.getCurrentUser();

    // 调用AuthService的登录方法
    vm.handleLogin = function() {
      AuthService.login(vm.credentials)
        .then(user => {
          vm.loginError = '';
          vm.credentials = { username: '', password: '' };
          // 发送全局事件,通知其他页面用户已登录
          $scope.$emit('userLoggedIn', user);
        })
        .catch(error => {
          vm.loginError = error;
        });
    };

    // 登出操作
    vm.handleLogout = function() {
      AuthService.logout();
      vm.currentUser = null;
      $scope.$emit('userLoggedOut');
    };

    // 监听全局登录/登出事件,更新头部状态
    $scope.$on('userLoggedIn', (_, user) => {
      vm.currentUser = user;
    });

    $scope.$on('userLoggedOut', () => {
      vm.currentUser = null;
    });
  }]
});

2. 头部模板(templates/global-header.html)

<header class="app-header">
  <div class="header-brand">你的应用名称</div>
  
  <!-- 未登录状态:显示登录表单 -->
  <div ng-if="!$ctrl.currentUser" class="login-form">
    <form ng-submit="$ctrl.handleLogin()">
      <input type="text" ng-model="$ctrl.credentials.username" placeholder="用户名" required>
      <input type="password" ng-model="$ctrl.credentials.password" placeholder="密码" required>
      <button type="submit">登录</button>
      <div ng-if="$ctrl.loginError" class="error-text">{{ $ctrl.loginError }}</div>
    </form>
  </div>

  <!-- 已登录状态:显示用户信息和登出按钮 -->
  <div ng-if="$ctrl.currentUser" class="user-info">
    <span>欢迎,{{ $ctrl.currentUser.username }}</span>
    <button ng-click="$ctrl.handleLogout()">登出</button>
  </div>
</header>

第三步:复用原首页登录功能(保留原有逻辑)

修改homeCtrl.js,让它依赖AuthService,复用同一套登录逻辑,这样原首页的登录表单依然可以正常工作:

angular.module('yourApp').controller('HomeCtrl', ['AuthService', '$scope', function(AuthService, $scope) {
  const vm = this;
  vm.credentials = { username: '', password: '' };
  vm.loginError = '';
  vm.currentUser = AuthService.getCurrentUser();

  vm.login = function() {
    AuthService.login(vm.credentials)
      .then(user => {
        vm.loginError = '';
        $scope.$emit('userLoggedIn', user);
        // 首页登录成功后的额外操作(比如跳转到仪表盘)
      })
      .catch(error => {
        vm.loginError = error;
      });
  };

  // 同步用户状态变化
  $scope.$on('userLoggedIn', (_, user) => {
    vm.currentUser = user;
  });
}]);

第四步:CodeIgniter后端对接要点

确保你的CodeIgniter登录API返回标准化的JSON响应,示例代码如下:

class Api extends CI_Controller {
  public function login() {
    $this->load->library('form_validation');
    $this->form_validation->set_rules('username', '用户名', 'required');
    $this->form_validation->set_rules('password', '密码', 'required');

    if ($this->form_validation->run() === FALSE) {
      $this->output->set_status_header(400);
      echo json_encode(['message' => validation_errors()]);
      return;
    }

    $username = $this->input->post('username');
    $password = $this->input->post('password');

    // 查询数据库验证用户
    $this->load->model('User_model');
    $user = $this->User_model->get_user_by_username($username);

    if (!$user || !password_verify($password, $user['password'])) {
      $this->output->set_status_header(401);
      echo json_encode(['message' => '用户名或密码错误']);
      return;
    }

    // 移除敏感字段,返回安全的用户信息
    unset($user['password']);
    echo json_encode($user);
  }
}

额外优化:路由守卫(保护私有页面)

如果需要限制未登录用户访问某些页面,可以用AngularJS路由的resolve属性实现:

angular.module('yourApp').config(['$routeProvider', function($routeProvider) {
  $routeProvider
    .when('/', {
      templateUrl: 'templates/home.html',
      controller: 'HomeCtrl'
    })
    .when('/dashboard', {
      templateUrl: 'templates/dashboard.html',
      controller: 'DashboardCtrl',
      resolve: {
        authCheck: ['AuthService', '$window', function(AuthService, $window) {
          if (!AuthService.getCurrentUser()) {
            // 未登录则跳转到首页
            $window.location.href = '/';
          }
        }]
      }
    });
}]);

内容的提问来源于stack exchange,提问作者Aditya Varma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:12:19