精华内容
下载资源
问答
  • java web简单权限管理设计

    万次阅读 多人点赞 2015-03-19 23:23:05
    推荐最新技术springboot版权限管理(java后台通用权限管理系统(springboot)),采用最新技术架构,功能强大! 注:由于该项目比较老,所以没有采用maven管理,建议下载springboot权限管理系统,对学习和使用会更有...

    源码免费下载地址:关注微信公众号“虾米聊吧”,回复关键字“权限

     

    推荐最新技术springboot版权限管理java后台通用权限管理系统(springboot)),采用最新技术架构,功能强大

    注:由于该项目比较老,所以没有采用maven管理,建议下载springboot权限管理系统,对学习和使用会更有帮助。

    springboot权限管理系统介绍地址:https://blog.csdn.net/zwx19921215/article/details/97806078

    springboot权限管理系统初级版下载地址:http://zyshare.cn/resource/detail/3

    springboot权限管理系统高级版下载地址:http://zyshare.cn/resource/detail/7

    springboot个人博客系统:https://blog.csdn.net/zwx19921215/article/details/102665020

    后台管理系统模板html打包下载: http://zyshare.cn/resource/detail/14

     

    最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery easy ui,项目架构为spring mvc + spring jdbc,简单易用好上手!搭建好框架后开始了第一个任务,设计并实现一套简单的权限管理功能。

    一套最基本的权限管理包括用户、角色、资源。

     

    数据库设计

    我的设计如下:

    用户:user

    角色:role

    用户-角色:user_role

    资源:resource(包括上级菜单、子菜单、按钮等资源)

    角色-资源:role_resource

    标准的权限管理系统设计为以上5张表。

     

    注:用户、用户-角色我就不做说明了,这两个是很简单的两块,用户的crud,以及为用户分配角色(多对多的关系)稍微琢磨一下就清楚了,下面都是针对为角色分配权限的实现

    效果图:

    项目结构

     

    后台实现

    展示层采用ztree树

     

    role.jsp

     

    <%@ page contentType="text/html;charset=UTF-8"%>
    <%@ include file="/views/back/include/taglib.jsp"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta name="decorator" content="back" />
    <script type="text/javaScript">
    //打开菜单窗口
    function openMenuDialog(){
    	var selected = $("#list").datagrid('getSelected');
        if (selected != null) {
        	$("#id").val(selected.id);
        	queryMenus(selected.id);
        	$("#menuWindow").window("open");
        } else {
       	 $.messager.alert('提示', "未选择数据!"); 
        }
    }
    //角色-菜单信息入库
    function ajaxSubmit(rid,idstr){
    	$.post("${ctx}/roleMenu/save.jhtml",{"roleId":rid,"ids":idstr},function(obj){
    		$.messager.alert('提示',obj.msg);
    		$("#menuWindow").window('close');
    	},'json');
    }
    </script>
    <!-- ztree -->
    <script type="text/javascript">
    var tree = "";
    var setting = {
    	check : {
    		chkboxType:{"Y":"ps","N":"s"},//勾选checkbox对于父子节点的关联关系,取消勾选时不关联父
    		chkStyle:"checkbox",
    		enable : true	//是否复选框
    	},
    	//数据
    	data : {
    		simpleData : {
    			enable : true
    		}
    	}
    };
    //查询菜单信息
    function queryMenus(roleId){
    	$.post('${ctx}/role/treedata.jhtml', {'roleId':roleId}, function(zNodes) {
    		for (var i = 0; i < zNodes.length; i++) {
    			if (zNodes[i].isParent) {
    
    			} else {
    				//zNodes[i].icon = "${ctxStatic}/images/532.ico";//设置图标
    			}
    		}
    		tree = $.fn.zTree.init($("#tree"), setting, zNodes);
    		tree.expandAll(true);//全部展开
    		//var nodes = treeObj.getNodes();
    	}, 'json');
    }
    
    //获取选中节点
    function onCheck(){
    	 var rid = $("#id").val();
    	 var treeObj=$.fn.zTree.getZTreeObj("tree");
         var nodes=treeObj.getCheckedNodes(true);
         var ids = new Array();
         for(var i=0;i<nodes.length;i++){
        	//获取选中节点的值
        	 ids.push(nodes[i].id);
    	    // v+=nodes[i].id + ",";
    	    //alert(nodes[i].id); 
         }
    	ajaxSubmit(rid,ids);     
    }
    </script>
    </head>
    <body>
    	<!-- 数据表格 -->
    	<table id="list" url='${ctx}/role/list/page.jhtml' method='post'
    		class="easyui-datagrid" style="width:100%;" fitcolumns="true" 
    		toolbar='#tb' pagination='true' rownumbers='true' singleSelect='true'>
    		<thead>
    			<tr>
    				<th field='name' sortable='true' width='100'>角色名称</th>
    				<th field='description' width='200' align='right'>描述</th>
    				<th field='createTimeFormat' width='150' align='center'>创建时间</th>				
    			</tr>
    		</thead>
    	</table>
    	
    	<!-- 编辑栏  -->
    	<div id="tb" style="padding:5px 5px;">
    		<div>
    			<p2p:permission module="role" code="add"><a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增</a></p2p:permission>
    			<p2p:permission module="role" code="edit"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openUpdateDialog();">编辑</a></p2p:permission>
    			<p2p:permission module="role" code="delete"><a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="del();">删除</a></p2p:permission>
    			<p2p:permission module="role" code="authority"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openMenuDialog();">设置权限</a></p2p:permission>
    		</div>
    		<!-- 搜索项 -->
    		<div style="margin-top:5px;padding-left:5px">
    			用户名:   <input id="query_name" class="easyui-textbox" type="text" style="width:110px" />
    			创建日期: <input id="query_startDate" class="easyui-datebox" style="width:110px">
    			至: 	   <input id="query_endDate" class="easyui-datebox" style="width:110px">
    			<a onclick="reload();" href="#" class="easyui-linkbutton" iconCls="icon-search">查询</a>
    		</div>
    	</div>
    	
    	
    	
    	<!-- 权限窗口 -->
    	<div id="menuWindow" class="easyui-window" title="配置权限" data-options="modal:true,iconCls:'icon-save',footer:'#menuWindowfooter'" style="width:350px;height:420px;padding:10px">
    		<div id="tree" class="ztree" style="padding: 10px 20px;"></div>
    	</div>
    	<div id="menuWindowfooter" style="padding:5px;text-align:right;"> 
    		<a href="#" onclick="onCheck();" class="easyui-linkbutton" data-options="iconCls:'icon-save'">提交</a>
    	</div>
    	
    </body>
    </html>
    

     

     

    action层
    RoleAction.java

     

     

     

    @RequestMapping(value = "/treedata.jhtml")
    	@ResponseBody
    	public String treedata(HttpServletRequest request, Model model) {
    		DynamicParams params = new DynamicParams(request);
    		List<Map<String, Object>> mapList = Lists.newArrayList();
    
    		params.put("allMenu", "allMenu");
    		List<Menu> list = authManager.findMenuList(params);
    
    		List<RoleMenu> roleMenus = authManager.findRoleMenuList(params);
    
    		for (int i = 0; i < list.size(); i++) {
    			Menu e = list.get(i);
    			Map<String, Object> map = Maps.newHashMap();
    			map.put("id", e.getId());
    			map.put("pId", e.getParentId() != null ? e.getParentId() : 0);
    			map.put("name", e.getName());
    			for (RoleMenu roleMenu : roleMenus) {
    				if (roleMenu.getMenuId() == e.getId()) {
    					map.put("checked", true);
    				}
    			}
    			mapList.add(map);
    		}
    
    		return toJson(mapList);
    	}

     

     

     

     

     

    service层

    AuthManager.java

     

    // 菜单管理
    
    	public List<Menu> findMenuList(DynamicParams params) {
    		List<Menu> menus = new ArrayList<Menu>();
    
    		if ("allMenu".equals(params.getString("allMenu"))) {
    			menus = menuDao.findList(params);
    		} else {
    			// 通过用户查询角色
    			List<UserRole> userRoles = userRoleDao.findList(params);
    			// 通过角色查询菜单
    			List<RoleMenu> roleMenus = new ArrayList<RoleMenu>();
    			if (userRoles != null && userRoles.size() > 0) {
    				for (UserRole userRole : userRoles) {
    					params = new DynamicParams();
    					if (userRole != null) {
    						if (userRole.getRoleId().equals(params.getString("rid"))) {
    							break;
    						}
    						params.put("roleId", userRole.getRoleId().toString());
    						List<RoleMenu> rms = roleMenuDao.findList(params);
    						for (RoleMenu roleMenu : rms) {
    							roleMenus.add(roleMenu);
    						}
    					}
    				}
    			}
    
    			// 查询菜单信息
    			for (RoleMenu roleMenu : roleMenus) {
    				if (roleMenu != null) {
    					Menu menu = menuDao.find(roleMenu.getMenuId());
    					if (menu != null) {
    						menus.add(menu);
    					}
    				}
    			}
    			menus = removeDuplicate(menus);
    			Collections.sort(menus);
    		}
    		return menus;
    	}
    /**
    	 * 去除菜单中重复项
    	 * 
    	 * @param list
    	 * @return
    	 */
    	private List<Menu> removeDuplicate(List<Menu> list) {
    		List<Menu> result = new ArrayList<Menu>();
    		Set<Long> menuIds = new HashSet<Long>();
    		for (int i = 0; i < list.size(); i++) {
    			Menu m = list.get(i);
    			if (m != null && menuIds.add(m.getId())) {
    				result.add(m);
    			}
    		}
    		return result;
    	}

     

    public List<RoleMenu> findRoleMenuList(DynamicParams params) {
    		List<RoleMenu> roleMenus = roleMenuDao.findList(params);
    		return roleMenus;
    	}

     

     

    Dao层

    menuDao

    @Override
    	protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) {
    		sql.append("select s.* from sys_menu s where 1=1 ");
    
    		String parentId = params.getString("parentId");
    		if (StringUtils.isNotBlank(parentId)) {
    			sql.append(" and parent_id = ? ");
    			args.add(parentId);
    		}
    
    		String sort = params.getString("sort");
    		String order = params.getString("order");
    
    		if (StringUtils.isNotBlank(sort)) {
    			sql.append(" order by ").append(hump2underline(sort));
    			if (StringUtils.isNotBlank(order)) {
    				sql.append(" " + order);
    			} else {
    				sql.append(" desc ");
    			}
    		} else {
    			sql.append("order by sort asc,id desc ");
    		}
    	}


    userRoleDao

     

    @Override
    	protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) {
    		sql.append("select s.* from sys_user_role s where 1=1 ");
    		Long adminId = params.getLong("adminId");
    		if (adminId != null) {
    			sql.append(" and s.user_id = ?");
    			args.add(adminId);
    		}
    	}


    roleMenuDao

     

     

    @Override
    	protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) {
    		sql.append("select s.* from ").append("sys_role_menu").append(" s where 1=1 ");
    		Long adminId = params.getLong("roleId");
    		if (adminId != null) {
    			sql.append(" and s.role_id = ?");
    			args.add(adminId);
    		}
    	}

     

     

     

    在WEB-INF目录下建立文件夹tlds 建立自定义标签文件shiros.tld,我们通过自定义标签实现页面按钮的控制。

     

     

    <span style="color:#333333;"><?xml version="1.0" encoding="UTF-8" ?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    	version="2.0">
    	<description>p2p permission taglib</description>
    	<display-name>permission taglib</display-name>
    	<tlib-version>1.0</tlib-version>
    	<short-name>p2p_back</short-name>
    	<uri>http://vanfon.p2p.cn/</uri>
    
    	<tag>
    		<description>权限校验标签,有权限就显示标签体的内容,否则不显示</description>
    		<name>permission</name>
    		<tag-class>com.vanfon.p2p.back.tag.PermissionTag</tag-class>
    		<body-content>JSP</body-content>
    		<attribute>
    			<description></description>
    			<name>module</name>
    			<required>true</required>
    			<rtexprvalue>false</rtexprvalue>
    		</attribute>
    		<attribute>
    			<description></description>
    			<name>code</name>
    			<required>true</required>
    			<rtexprvalue>false</rtexprvalue>
    		</attribute>
    	</tag>
    </taglib></span>

     

     

    自定义标签类

     

    package com.vanfon.p2p.back.tag;
    
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.TagSupport;
    
    import com.vanfon.p2p.entity.system.Admin;
    import com.vanfon.p2p.entity.system.Menu;
    import com.vanfon.p2p.manager.system.AuthManager;
    import com.vanfon.p2p.utils.DynamicParams;
    import com.vanfon.p2p.utils.SpringContextHolder;
    
    /**
     * 权限控制标签
     * 
     * @author zhangwx
     * @date 2015-2-5
     */
    public class PermissionTag extends TagSupport {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 4592227792811389132L;
    
    	private String module;// 属性名必须与JSP自定义标签的属性名一样
    
    	private String code;
    
    	public String getModule() {
    		return module;
    	}
    
    	public void setModule(String module) {
    		this.module = module;
    	}
    
    	public String getCode() {
    		return code;
    	}
    
    	public void setCode(String code) {
    		this.code = code;
    	}
    
    	@Override
    	public int doStartTag() throws JspException {
    		boolean result = false;
    		HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();// 通过成员变量获取HttpServletRequest对象
    		Admin admin = (Admin) request.getSession().getAttribute("admin");// 获取登录到系统的用户
    		if (admin != null) {
    			if ("1".equals(String.valueOf(admin.getIfsuper()))) {// 超级管理员
    				result = true;
    			} else {
    				DynamicParams params = new DynamicParams();
    				params.put("id", String.valueOf(admin.getId()));
    				params.put("module", this.module);
    				params.put("code", this.code);
    				AuthManager authManager = SpringContextHolder.getBean(AuthManager.class);
    				List<Menu> userRoleAuths = authManager.findUserRoleAuthList(params);
    				if (userRoleAuths != null && userRoleAuths.size() > 0) {
    					result = true;
    				}
    			}
    		}
    		return result ? EVAL_BODY_INCLUDE : SKIP_BODY;
    	}
    }

     

     

     

     

     

     

     

     

    以上就是该权限管理中权限树(为角色分配权限)的大体实现。

    项目源码下载地址:http://www.zyshare.cn/resource/detail/1

    注:由于本项目年代久远,所以技术比较老旧,新人学习建议此项目 java后台通用权限管理系统(springboot)

    推荐项目:java后台通用权限管理系统(springboot)

    博主qq:193459197  , qq群技术交流与支持:557911445

     

    关注微信公众号“虾米聊吧”,回复“权限”获取源码,后续持续放送技术架构和资料干货!!!  

     

    一个热衷于分享技术和生活的程序猿,让我们一起交流吧~      
                        
                      微信扫描二维码,关注我的公众号


     
     

    展开全文
  • 系统简介 本系统提供给暮云办公室的工作人员使用 权限包含:检索信息、更新信息、删除信息 技术路线 1)前端:html+ccs+js 采用框架:jquery+bootstrap 2)后端:node.js+json 采用模板:fs、ejs、express(包含...
    1. 系统简介
      本系统提供给暮云办公室的工作人员使用
      权限包含:检索信息、更新信息、删除信息
    2. 技术路线
      1)前端:html+ccs+js 采用框架:jquery+bootstrap
      2)后端:node.js+json 采用模板:fs、ejs、express(包含session)
      3)浏览器:google
    3. 代码下载地址
      ( https://github.com/fancy55/web-python )
    展开全文
  • 一个简单的入门Java web项目

    万次阅读 多人点赞 2019-07-09 11:21:16
    引言:商城订单管理系统属于小型的Java web系统,由java web+mysql+servlet实现,采用mvc的设计模式,jdbc编程,具备增删改查以及模糊查询,用户登陆注册的功能,版本为eclipse版,如果需要别的版本如idea版,系统...

    引言:商城订单管理系统属于小型的Java web系统,由java web+mysql+servlet实现,采用mvc的设计模式,jdbc编程,具备增删改查以及模糊查询,用户登陆注册的功能,版本为eclipse版,如果需要别的版本如idea版,系统架构采用ssm或者springboot的类似Java 或Java web 小型软件系统,或者定制的,需要本系统源码的,帮忙远程部署安装讲解可以加我qq1728608455。

    关注我的微信公众号,送IT视频资料,并送Java web源码一份,希望能帮到你;


     

    1、数据库表图:


    2、登陆界面


     3、系统主界面


    4、更改界面


    5、系统架构图


     6、重要代码(接口)

    public interface GoodsMapper {
        List<Goods> selectAll();
        int delete(int gId);
        boolean insert(Goods record);
        boolean update(Goods record,int gId);
        List<Goods> findByGno(int gId);
        Goods findByGId(int gId);
    }


    7、实现类

    package com.service;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.List;

    import com.mapper.GoodsMapper;
    import com.model.Goods;
    import com.utils.DBUtils;


    //#f91570
    public class GoodsService implements GoodsMapper {
        Connection con=null;

        @Override
        public List<Goods> selectAll() {
            List<Goods> list=new ArrayList<Goods>();//定义list集合
            try {
                    con=DBUtils.getConnection();//获取连接
                    String sql="select * from Goods";//
                    PreparedStatement pst=con.prepareStatement(sql);//执行sql
                    ResultSet rs=pst.executeQuery();//获取查询结果集
                    while(rs.next()){//ֹ
                        Goods record=new Goods();//实例化对象
                        record.setgId(rs.getInt("gId"));
                        record.setGoodsName(rs.getString("goodsName"));
                        record.setGoodsCount(rs.getInt("goodsCount"));
                        record.setGoodsPrice(rs.getDouble("goodsPrice"));
                        record.setCreateTime(rs.getDate("createTime"));
                        list.add(record);//丢到list集合里
                    }
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                DBUtils.closeConnection(con);//关闭连接
            }
            return list;//返回list集合
            
            
        }

        @Override
        public int delete(int gId) {
             try {
                    con=DBUtils.getConnection();
                    String sql="delete from goods where gId=?";
                    PreparedStatement pst=con.prepareStatement(sql);
                    pst.setInt(1,gId);
                    pst.executeUpdate();
                } catch (Exception e) {
                    e.printStackTrace();
                    return 0;
                } finally{
                    DBUtils.closeConnection(con);
                }  
             return 1;
            
        }

        @Override
        public boolean insert(Goods record) {
              String sql="insert into goods(gId,goodsName,goodsPrice,goodsCount,createTime) values(?,?,?,?,?)";
                try {
                    con=DBUtils.getConnection();
                    PreparedStatement pst=con.prepareStatement(sql);
                    pst=con.prepareStatement(sql);
                    pst.setInt(1, record.getgId());
                    pst.setString(2, record.getGoodsName());
                    pst.setDouble(3, record.getGoodsPrice());
                    pst.setInt(4,record.getGoodsCount());
                    pst.setDate(5, record.getCreateTime());
                    pst.execute();
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                } finally{
                    DBUtils.closeConnection(con);
                }
        }

        @Override
        public boolean update(Goods record, int gId) {
            try{
                   con=DBUtils.getConnection();
                 String sql="update Goods set goodsName=?,goodsPrice=?,goodsCount=?,createTime=? where gId=?";
                PreparedStatement pst=con.prepareStatement(sql);
                pst.setString(1,record.getGoodsName());
                pst.setDouble(2,record.getGoodsPrice());
                pst.setInt(3,record.getGoodsCount());
                pst.setDate(4, record.getCreateTime());
                pst.setInt(5,gId);
                pst.execute();
                return true;
             }catch(Exception e){
                 e.printStackTrace();
                 return false;
             }finally{
                 DBUtils.closeConnection(con);
             }
        }

        @Override
        public List<Goods> findByGno(int gId) {
            Connection con=null; 
            List<Goods> list =new ArrayList<Goods>();
            try{
                con=DBUtils.getConnection();
                String sql="select * from Goods where gId like ?";
                PreparedStatement pst=con.prepareStatement(sql);
                pst.setString(1, "%"+gId+"%");
                ResultSet rs=pst.executeQuery();
                while(rs.next()) {
                    Goods record =new Goods();
                    record.setgId(rs.getInt("gId"));
                    record.setGoodsName(rs.getString("goodsName"));
                    record.setGoodsCount(rs.getInt("goodsCount"));
                    record.setGoodsPrice(rs.getDouble("goodsPrice"));
                    record.setCreateTime(rs.getDate("createTime"));
                    list.add(record);
                }

                return list;
                }catch(Exception e){
                e.printStackTrace();
                    return null;
            }finally{
                DBUtils.closeConnection(con);
            }
        }

        @Override
        public Goods findByGId(int gId) {
             try{
                    con=DBUtils.getConnection();
                       String sql="select * from Goods where gId=?";
                       PreparedStatement pst=con.prepareStatement(sql);
                       pst.setInt(1,gId);
                       ResultSet rs=pst.executeQuery();
                       if(rs.next()){
                           Goods record=new Goods();
                           record.setgId(rs.getInt("gId"));
                           record.setGoodsName(rs.getString("goodsName"));
                        record.setGoodsCount(rs.getInt("goodsCount"));
                        record.setGoodsPrice(rs.getDouble("goodsPrice"));
                        record.setCreateTime(rs.getDate("createTime"));
                            return record;
                       }else{
                           return null;
                       }
                   }catch(Exception e){
                       e.printStackTrace();
                       return null;
                   }finally{
                       DBUtils.closeConnection(con);
                   }        
        }
        public static void main(String[] args) {
            GoodsService s=new GoodsService();
            /*List<Student> list=s.selectAll();
            for(Student st:list) {
                System.out.println(st.getsAddress());
            }*/
            Goods stu=new Goods();
            //stu.setsNo(sNo);
            /*stu.setsName("");
            stu.setsAge(21);
            stu.setsAddress("");
            stu.setSchool("海院");
            boolean b=s.update(stu, 1211);*/
            //System.out.println(b);
            List<Goods> list=s.selectAll();
            for(Goods st:list) {
                System.out.println(st.getGoodsName());
            }
        }

    }
     


    8、总结

    代码比较多,我只选择了重要的代码,希望帮到大家。有问题的可以加我qq1728608455,欢迎咨询。

    展开全文
  • 一个Web系统OA界面设计和开发

    千次阅读 2008-03-11 11:39:00
    早在中国IT业方兴未艾之时,计算机应用...因此,不论是普通最终用户的个人软件,还是企业应用的大型系统,界面设计系统构建中都成为了一个非常重要的方面。 但是,(至少在中国)由于IT业发展滞后、市场还不够成熟

    早在中国IT业方兴未艾之时,计算机应用系统主要以功能实现为主,几乎没有界面设计这个概念。时至今日,随着计算机和网络的不断普及,社会信息化程度日益加深,用户和市场的不断成熟,人们已经不仅仅满足于“够用”,而是更加强调“好用”“易用”;因此,不论是普通最终用户的个人软件,还是企业应用的大型系统,界面设计在系统构建中都成为了一个非常重要的方面。

    但是,(至少在中国)由于IT业发展滞后、市场还不够成熟等原因,在绝大多数企业中,界面设计在软件系统开发中还没有获得与之重要性相匹配的一席之地,并且在企业运作和协调中也没有形成成熟的模式和解决方案,如何做好界面设计和开发,仍然是大家不断研究探讨的一个问题。

    我写这篇文章,主要内容是我参加一个面向质检行业的Web系统界面设计和开发工作的过程,包括其间的一些构思和想法;希望能和大家一起探讨一下这个问题,供大家参考。

    另外,我同时承担了系统开发和界面设计工作,所以,虽然这是一篇讨论界面设计的文章,我会尽量把文章限制在界面设计范围内,但也有可能包含一些开发和系统设计的内容,请大家辨析清楚,欢迎指正。


    1.工作流程

    下图,是整个开发过程中与界面设计相关的主要流程工作。



    从最初需求分析开始,我就加入项目,自始自终参加整个开发过程。
    在需求分析阶段,参与了对客户的访问和调研;
    在概要设计阶段,参与了部分系统设计分析工作;
    在详细设计阶段,完成了整个系统界面设计和Demo制作,并提交用户反馈;
    在代码开发阶段,参与了系统表现层的设计开发。

    2.需求分析

    在需求分析阶段,主要针对界面交互相关问题,对用户进行若干调研。

    主要包括以下内容
    ·受众用户群调查
    ·系统使用环境调查
    ·受众用户使用习惯调查
    ·用户对旧版本软件使用情况调查

    这一阶段,由于成本原因,我并没有直接访问客户进行调查。工作主要是提出某些具体问题,由需求调研人员,以问卷或口头问答方式,对客户进行调研。另外,公司经验丰富的客服人员和市场人员,也是非常重要的需求来源之一。

    本系统的客户群主要为国家省市下属质检单位,最终受众年龄从年轻到较高龄都有。对于普通国家机关人员,一般对计算机系统和网络不够熟悉,计算机环境一般,甚至比较差,少有配置优良的环境。在这种环境下,用户对计算机使用一般没有使用倾向,大多更适应手工操作。对本系统的前代使用,最主要意见是使用困难,不方便。

    还有其他具体调查反馈,如用户基本不使用鼠标右键,年龄较大的用户难以看清密集的较小文字等等。


    3.界面设计原则

    在概要设计阶段,根据需求阶段的调研结果,我整理了系统界面设计的基本原则。因为在代码开发阶段,很多时候界面的具体制作是由开发人员直接写代码,因此必须确定一定的原则和规范,以保证系统界面的统一。


    一般适用原则

    ·简单明了原则:用户的操作要尽可能以最直接最形象最易于理解的方式呈现在用户面前。对操作接口,直接点击高于右键操作,文字表示高于图标示意,尽可能的符合用户对类似系统的识别习惯。

    ·方便使用原则:符合用户习惯为方便使用的第一原则。其它还包括,实现目标功能的最少操作数原则,鼠标最短距离移动原则等。

    ·用户导向原则:为了方便用户尽快熟悉系统,简化操作,应该尽可能的提供向导性质的操作流程。

    ·实时帮助原则:用户需要能随时响应问题的用户帮助。

    ·提供高级自定义功能:为熟悉计算机及软件系统的高级用户设置自定义功能,可以对已经确定的常规操作以及系统的方方面面进行符合自身习惯的自定义设置。包括常规操作、界面排版、界面样式等种种自定义。

    ·界面色彩要求:计算机屏幕的发光成像和普通视觉成像有很大的不同,应该注意这种差别作出恰当的色彩搭配。对于需用户长时间使用的系统,应当使用户在较长时间使用后不至于过于感到视觉疲劳为宜。例如轻松的淡彩为主配色,灰色系为主配色等等。切忌色彩过多,花哨艳丽,严重妨碍用户视觉交互。

    ·界面平面版式要求:系统样式排版整齐划一,尽可能划分不同的功能区域于固定位置,方便用户导航使用;排版不宜过于密集,避免产生疲劳感。

    B/S构架适用原则

    ·页面最小:由于Web的网络特性,尽可能减小单页面加载量,降低图片文件大小和数量,加快加载速度,方便用户体验。

    ·屏幕适应:Web界面需要适应不同用户屏幕大小。

    ·浏览器兼容:需要适应不同浏览器浏览效果,虽然目前可不考虑不同浏览器差别,但仍需考虑IE浏览器版本差异带来的客户端不同效果。

    ·最少垂直滚动:尽可能减少垂直方向滚动,尽可能不超过两屏。

    ·禁止水平滚动:由于将导致非常恶劣的客户体验,尽可能禁止浏览器水平滚动操作。

    ·避免隐藏(右键)操作:浏览器的右键操作不符合用户体验习惯,尽可能避免。


    本系统应用原则

    ·瘦客户端要求:由于客户应用环境配置大多较低,除服务器可单独配置较灵活外,应该保证瘦客户端,使用户容易使用。例如尽量不要使用复杂的JS脚本和HTC组件,不要在客户端使用IE整合XML/XSLT等等。

    ·大数据量表格的水平扩展要求:本系统中存在大数据量的列表,需要较大的交互界面支持,为避免水平滚动,应尽可能获取大的屏幕水平空间。

    ·桌面面板导航简化操作:为了实现方便简捷的用户操作,应该保证用户绝大多数操作可通过首页桌面面板的导航来实现。

    ·用户自适应定义:提供较多的可订制功能,尤其对桌面面板提供强大的定制功能;使用户能够将最常用的功能定义到桌面面板,每次登录即可直接使用,简化用户操作。

    ·用户常用操作记录定义:对某些需定义操作的功能如查询、搜索等,提供系统自动记忆和客户定制功能,系统可自动记忆用户前1~3次操作,或者用户可自定义操作记录,方便以后使用。

    ·大数据量表格的水平扩展要求:本系统中存在大数据量的列表,需要较大的交互界面支持,为避免水平滚动,应尽可能获取大的屏幕水平空间。


    4.系统分析

    在概要设计过程中,界面设计人员需要浏览需求分析报告,了解用户的工作流程,和整个系统功能,再根据这些原始需求功能,归纳整理分析,并针对用户交互设计需要,提出意见,参与系统设计。

    其中包括对原始功能的分类归纳,提出系统交互需要的新功能,对用户功能实现的优先级进行定义等等。

    例如,提出用户自定义快捷面板功能,常用操作自动记录功能等,需要在概要设计时尽早提出,以方便作好系统规划。

    另外,需要对整个系统中的常见功能有比较清晰的了解,归纳整个系统界面交互中常见的交互形式,例如在本系统中就包括列表、查询、搜索、填写表单、项目分解、项目选择、审批、报告等等;只有清晰的了解整个系统需求,才能较好的把握整个界面设计的统一性。当然,这也和界面设计人员的经验有很大关系。

    4.主界面设计

    设计主界面,确定系统基本风格,是概要设计中的工作之一。首页主界面的主要实现功能是导航,它要达到的目的,是尽可能使用户仅通过首页面板就可以完成所有常规任务。



    该主界面包含以下部分

    用户信息区域 显示当前用户信息



    用户导航区域 用户页面导航,收藏功能可以将当前功能页面收藏到快捷功能面板



    用户导航功能树 用户页面导航,收藏功能可以将当前功能页面收藏到快捷功能面板



    功能树隐藏 可水平扩展页面空间



    桌面面板用户帮助导航 用户登录时可根据用户类型,自动加载相关使用帮助或导航。



    主任务通知区域 通知用户系统业务流程中的待办事宜;通知用户办公系统相关信息。



    用户快捷面板 为了能方便快捷的访问系统功能,避免每次访问树形菜单较深级次的繁琐操作,用户可将通过导航栏中的收藏按钮,将当前页面收藏到该面板中;该面板出现在所有业务页面,用户可以随时访问自己定义的功能页面。该导航在首页以面板形式出现,在其他页面以下拉菜单形式出现。



    用户自定义功能区域 用户可将相关查询搜索等功能定义到首页面板,例如:最新完成报告察看、报告搜索、检验流程察看等等



    5.典型界面

    以下是系统中几个比较典型的界面模型。










    在整个系统界面的设计过程中,需要注意整个系统的统一,设计风格要一致,界面中的交互元素,从色彩、样式到排版方式、具体位置都要具备延续性,这样才能使用户尽快习惯整个系统操作。

    6.典型交互模式

    界面交互中,根据功能不同,有不同的交互方式。应该尽量提取抽象,尽可能减少交互模式的种类,或者把交互方式尽可能设计的类似,以方便用户快速熟悉系统。

    下面列举3个系统中比较典型的交互模式,供大家参考。

    单项选择


    多项选择



    项目分解(GIF动画 4桢)




    7.Demo开发

    Demo是详细设计阶段的重要成果之一,在对系统进行详细的分析设计之后,主要作用是提供给合作客户,在基本功能、系统组成和易用性上进行测试。

    本系统的Demo主要包括界面的设计制作,和部分客户端表现层脚本的开发。为了在后面的实际业务开发中尽可能获得重用,Demo的制作在页面规范、CSS样式定义和JS脚本编写方面都严格遵循了系统开发规范,并在以后的代码编写工作中严格执行。

    本系统整个Demo包括大约50个页面,耗时月3周。

    在后续的开发过程中,仍然要严格控制整个开发过程,保证整个系统界面的统一,并随时维护更新系统界面的设计。


    8.结语

    太长了……需要对以前很多东西进行回顾,实在很困难。很多细节,包括很多设计、技术上的东西,都已经记忆不清了,文章也显得有些紊乱。

    因此,如果大家有什么疑问,或有意见、指正,请提出或来信与我交流。

    展开全文
  • 如何设计一个web容器

    万次阅读 多人点赞 2016-02-14 10:20:45
    开发一个web容器涉及很多不同方面不同层面的技术,例如通信层的知识,程序语言层面的知识等等,且一个可用的web容器是一个比较庞大的系统,要说清楚需要很长的篇幅,本文旨在介绍如何设计一个web容器,只探讨实现的...
  • Web网站通知系统设计

    千次阅读 2014-07-25 09:40:45
    写在前面: 通知系统是网站信息传播机制的重要的部分,足够写大章来说明。本文只梳理设计原则,后续相关内容会持续更新。 这里的通知包括但不限于公告、提醒或消息(不同使用场景下的功能定义不同)。 关于各...
  • 一个WEB系统的界面设计和开发 —— 一个经验级人物的文章 早在中国IT业方兴未艾之时,计算机应用系统主要以功能实现为主,几乎没有界面设计这个概念。时至今日,随着计算机
  • 简单的嵌入式web服务器设计

    千次阅读 2019-06-01 17:54:18
    浏览器是显示网页伺服器或档案系统内的HTML文件,并让用户与此些文件互动的种软件。个人电脑上常见的网页浏览器包括Internet Explorer、Firefox、Safari。浏览器是最经常使用到的客户端程序。 WEB服务器 Web...
  • 简单的Java web项目源码(10

    万次阅读 多人点赞 2019-09-04 14:25:19
    引言:Java web项目主要采用mvc的的设计思想,系统主要采用java+jsp+servlet+mysql+eclipse实现,具有登陆、分页、导出excel,增删改查等功能,适合初学者,满足基本的实训需求,以下是推荐的几款,总有你喜欢的一个 ...
  • 简单web服务器的设计与实现

    万次阅读 2017-01-27 19:48:09
    socket web服务器
  • 基于UML的WEB应用系统设计

    千次阅读 2008-06-01 18:35:00
    基于UML的Web应用系统设计 摘要本文主要对UML的WEB应用建模扩展展开一些讨论,并对建模工具Rational Rose做一定介绍。详细描述基于UML的Web应用设计及建模,同时以素颜DIY网上购物系统为例,用UML进行分析和设计。...
  • 毕业设计So Easy:基于Java Web学生选课系统

    万次阅读 多人点赞 2021-06-06 00:02:05
    本文详细地阐述了基于网络环境选课系统的工作原理、运行机制。在详细分析软件的体系结构、动态网页技术、数据库原理的基础上,提出了网络选课系统的模型,结合实际实现了高校网上选课系统
  • 标准Web系统的架构分层

    万次阅读 多人点赞 2015-06-22 10:30:36
    标准Web系统的架构分层 标准Web系统架构适用于传统的基于WEB浏览器/手机端的CRM系统、ERP系统、SaaS系统、O2O系统、商城系统、物流系统。架构的灵活性和业务适应性决定了不同的系统根据业务形态、访问量、安全性所...
  • Java web课程设计-购物系统

    万次阅读 多人点赞 2019-08-21 22:49:26
    Java web课程设计是为了是计算机学院的学子深入学习java web应用开发设置的一门实验性的动手性的实践课程。是计算机科学与技术、 网络工程、信息安全、物联网工程、软件工程等专业集中实践的教学环节,是将关jav...
  • Web开发技术应用系统设计报告

    千次阅读 2018-01-08 20:56:49
    系统设计意义及目的 本系统的设计主要用于为读者推荐各个领域中比较优质书籍,而且读者可在本系统中根据自己所要的书籍的关键字或对应的筛选条件自动搜索出适当的书籍,搜索到的书籍会有对应的介绍,方便读者对...
  • JSP+Servlet+Tomcat实现一个简单Web应用 需要使用到的技术①JSP② Servlet③TomcatWeb开发中的常见概念Demo插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • 对于一家企业来说,其能源消耗是其企业管理中一个重要组成部分,对于企业的正规化管理和健康成长都至关重要。通过对能源计量数据的应用分析,测算、评价可以找出生产与管理中的各类问题,以利采取有效办法,用数据...
  • Java_web期末课程设计学生信息管理系统

    千次阅读 多人点赞 2018-12-31 21:19:17
    Java_web期末课程设计学生信息管理系统 系统开发的意义 随着计算机和网络的普及,学生信息从纸质类变为电子信息类,管理电子类信息变得尤为重要。学生信息管理系统是学校内部重要的工具之,不仅可以提高管理...
  • 网站首页(设计成分帧页面)</title> </head> <!-- 注意:<frameset></frameset>不能放到<body></body>里面 --> <frameset rows="23%,*"> <frame name="head" ...
  • 基于Web在线考试系统设计与实现

    万次阅读 多人点赞 2015-12-16 17:39:29
    这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出 下载地址:链接:https://pan.baidu.com/s/1cOzutS31VrvelaYyq4T6pQ 提取码:erzt 数据库原理课程设计说明书 ...
  • Java Web课程设计

    千次阅读 2019-07-02 20:43:25
    为时两周的Java Web课程设计,使用目前流行的Spring Boot后端框架,Layui前端框架,做了一个业务逻辑较简单,具有前后台的图书借阅管理系统,还有很多很多很多的不足,该项目已放在github上,欢迎交流,批评指正~~~ ...
  • 一个完全不懂编程的人在一个月内开发出一套WEB进销存系统,这听上去感觉有点不可思议,但这的确是事实。当然,如果靠去学会编程语言然后动手开发,这么短时间完成项目是不可能了,所以运用好工具才是关键。 进销存...
  • 基于Web的仓库管理系统设计与实现

    万次阅读 多人点赞 2019-07-02 20:27:48
    摘 要 仓库物品的管理是与我们的日常生活息息相关的一个重大问题。随着我国经济飞速的发展,改革开放的不断深入,企业要想在...在此篇文章中严格按照软件工程思想,设计并实现了一个仓库信息管理系统。介绍了系统从...
  • MVC应用程序总是由这三部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,...
  • web前端】仅使用JS做简单的选择题测评系统

    千次阅读 多人点赞 2017-09-03 15:24:51
    说是测评系统,感觉只能算是一个小小的Demo,很水,,没有数据库库,,仅使用JS做简单的选择题测评系统 一、设计思路表单封装: 【1】由于采用JS封装提交所以,不需要form标签 【2】放置多个input标签,作为...
  • 用Java实现一个简单的考试系统

    千次阅读 多人点赞 2020-04-17 20:58:09
    用Java实现一个简单的考试系统需求分析设计思路编码实现 需求分析 该考试系统可以实现的功能和系统要求应该包括: 学生:登录、考试、考试后查看成绩 老师:出题目(往题库中添加新题目)、批阅卷子(同时打分) ...
  •  尽管如此,由于勤哲excel服务器的ESWEB缺少了通过EXCEL客户端使用时的多样性以及不支持VBA和一些EXCEL公式的限制,使得使用者对ESWEB的个性化设计不如在EXCEL中得心应手,同时也限制了不少在excel客户端可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 502,853
精华内容 201,141
关键字:

一个简单的web系统设计