BeX5的组织管理中某些人可能是一人多岗的,功能中可能需要默认就按照指定岗位获取相关的数据
平台默认的是在功能树上打开功能的时候选择岗位,如果想要在登录的时候就直接按照选择的岗位登录,参考如下:
说明

login.w的路径:/UI2/portal/base/login/login.w
login.js的路径:/UI2/portal/base/login/login.js
base.js的路径:/UI2/portal/base/base.js
推荐用扩展空间去修改

1.在login.w中添加data1用来存储岗位信息,data的autoLoad设置为false

    <div component="$UI/system/components/justep/data/data" autoLoad="false"
      xid="data1" idColumn="SID" onCustomRefresh="data1CustomRefresh"> 
      <column name="SID" type="String" xid="xid1"/>  
      <column name="SFID" type="String" xid="xid2"/>  
      <column name="SFNAME" type="String" xid="xid3"/> 
    </div> 

2.在data的onCustomRefresh事件中给data加载岗位数据
获取岗位数据要用到登录输入的用户名去过滤,由于是在登录前获取的,所有不能用bizData或者biz层的action去返回数据,需要自己定义.j获取数据并返回
本例定义的.j是/UI2/portal/base/login/selectPerson.j

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class SelectPerson extends com.justep.ui.impl.JProcessorImpl {
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取传过来的登录的用户
		String code = request.getParameter("code");
		response.setCharacterEncoding("UTF-8");
		response.addHeader("Access-Control-Allow-Origin", "*");
		response.getWriter().write(query(code));
		response.flushBuffer();

	}

	public static String query(String code) {
		Connection conn = null; // 创建用于连接数据库的Connection对象
		DataSource ds = null;
		ResultSet rs = null;
		JSONArray array = new JSONArray();
		try {
			Context initContext = new InitialContext();
			Context envContext = (Context) initContext.lookup("java:/comp/env");
			ds = (DataSource) envContext.lookup("system");

			conn = ds.getConnection();
			Statement stmt = conn.createStatement();
			// 根据登录的用户设置where条件获取相关岗位的信息
			String sql = "SELECT o.SID ,o.SFID , o.SFName FROM SA_OPOrg o" + " WHERE (o.SVALIDSTATE = 1) AND (o.SPERSONID = "
					+ "(select p.sID from SA_OPPerson p left join SA_OPOrg mo on p.SMAINORGID = mo.sID " + "WHERE (UPPER(p.SLOGINNAME) = UPPER('" + code + "') OR UPPER(p.SCODE) = UPPER('" + code
					+ "')) AND (p.SVALIDSTATE = 1)))";
			rs = stmt.executeQuery(sql);
			ResultSetMetaData metaData = rs.getMetaData();
			int columnCount = metaData.getColumnCount();

			// 遍历ResultSet中的每条数据,把数据用json存储
			while (rs.next()) {
				JSONObject jsonObj = new JSONObject();
				for (int i = 1; i <= columnCount; i++) {
					String columnName = metaData.getColumnLabel(i);
					String value = rs.getString(columnName);
					jsonObj.put(columnName, value);
				}
				array.add(jsonObj);
			}
			rs.close();
			stmt.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return array.toString();

	}

}
 

.j的调用如下

	Model.prototype.data1CustomRefresh = function(event) {
		var personData = this.comp("data1");
		//获取输入的用户名
		var name = this.comp('name').val();
		if (name == undefined) {
			alert("请填写用户名");
		} else {
			$.ajax({
				async : false,
				type : 'POST',
				dataType : 'json',
				url : '/x5/UI2/portal/base/login/selectPerson.j',
				data : {
					code : name //把获取的用户名做参数传给.j
				},
				error : function(error, status, text) {
					alert("获取数据失败")
				},
				success : function(result) {
					personData.loadData(result);
				}
			});
		}

	};

3.由于可能用不同的用户切换登录,所以需要在login.w中用户名的input的onChange事件中把data中的数据清了,然后重新加载

	Model.prototype.nameChange = function(event) {
		var data = this.comp("data1")
		data.clear();
		data.refreshData();
	};

4.在login.w中添加选择岗位的下拉,select的bind-options关联上面定义的存储岗位信息的data
psm


            <div class="form-group" xid="formGroup1"> 
              <div class="col" xid="col3">
                <div component="$UI/system/components/justep/labelEdit/labelEdit"
                  class="x-label-edit x-label30" xid="labelEdit1"> 
                  <label class="x-label" xid="label1"><![CDATA[选择岗位]]></label>  
                  <select component="$UI/system/components/justep/select/select"
                    class="form-control x-edit" xid="select1" bind-options="data1"
                    bind-optionsValue="SFID" bind-optionsLabel="SFNAME" onChange="select1Change"/> 
                </div>
              </div> 
            </div> 
 

5.在login.js的model的勾选函数中定义一个实例变量this.person用来记录选择的岗位

	var Model = function() {
		this.callParent();
		this.person = "";
	};

6.在添加的选择岗位的select组件的onChange事件中把选择的值,赋值给this.person

	Model.prototype.select1Change = function(event) {
		this.person = event.value;
	};

7.在login.js的login方法(Model.prototype.login = function() {)的实现把this.person的值拼接到登录相关的参数上

这个设置是功能树加载的只是这个岗位有权限的功能,不加这个设置,功能树中就是所有功能有权限的

		if (client)
			urlParams.client = client;
		if (this.person)
			urlParams.executor = this.person;

8.在login.js的login方法(跟7是同一个方法)中的this.comp(“receiver”).windowEnsure(result.data),在其前面把this.person的值放到result.data

			// 对话框返回数据
			result.data["executor"] = this.person;
			this.comp("receiver").windowEnsure(result.data);

9.在base.js的setPortalContext方法中找到context.data = data;在前面加上executor的设置

        if(data.executor){
            executor = data.executor;
        }
		context.data = data;

其中8和9是设置当前上下文中的执行者信息