一、模块功能介绍

1)视图模块如图:

2)添加部门功能

3)编辑部门功能

4)查询搜索功能

5)删除功能

这里为了更好展示,先把每页调整10条记录

删除前:

删除提示:

删除后:


二、前端设计

1)列表视图层代码,新建 webapp / app / view / department / List.js , 内容如下:

Ext.define('OA.view.department.List', {extend : 'Ext.grid.Panel',alias : 'widget.departmentlist',layout : 'fit',id : 'departmentlist',store : 'Departments',selModel : Ext.create('Ext.selection.CheckboxModel'),//定义顶部按钮tbar : {xtype : 'toolbar',items : [ {text : '添加',iconCls : 'icon-add',action : 'onAddClick'}, '-', {text : '删除',iconCls : 'icon-delete',action : 'onDeleteClick'}]},bbar : [{xtype : 'pagingtoolbar',store : 'Departments',dock : 'bottom',displayMsg : '显示 {0} - {1} 条记录,总共 {2} 条记录',beforePageText : "第",afterPageText : "页,共 {0} 页",displayInfo : true} ],columns : [ {header : 'ID',dataIndex : 'id',}, {header : '部门名称',dataIndex : 'name',flex : 1}, {header : '上级部门名称',dataIndex : 'parent.name',flex : 1}, {header : '职能说明',dataIndex : 'description',flex : 1} ],features: [{ftype: 'searching',minChars: 2,width: 150,mode: 'remote',//远程还是本地storeposition: 'top/bottom',//状态栏还是工具栏iconCls: 'icon-zoom',//图标menuStyle: 'checkbox/radiobox',//单选还是多选showSelectAll: true,   //是否显示全选按钮checkIndexes: [],       //默认是否选择所有的列}],
});

2)新建 / 修改 功能弹出窗口视图代码,新建 webapp / app / view / department / DepartmentManagerWindow.js ,内容如下:

Ext.define('OA.view.department.DepartmentManagerWindow', {extend: 'Ext.window.Window',alias: "widget.departmentmanagerwindow",id: 'departmentmanagerwindow',title: '添加部门',layout: 'fit',autoShow: true,width: 300,height: 200,bodyPadding : '10 5',modal : true,initComponent: function(){this.items = [{xtype: 'form',fieldDefaults : {labelAlign : 'left',labelWidth : 90,anchor : '100%'},items: [{xtype: 'textfield',name: 'id',fieldLabel: "ID",readOnly : true}, {
//              xtype:'textfield',
//              name: 'parent.name',
//              fieldLabel: "上级部门名称"xtype: 'comboboxtree',name: 'parent.id',fieldLabel: '上级部门',labelWidth: 90,storeUrl: 'departmentActionGetDeptTree.action',showDetail: true,       //true:显示叶子节点;false:不显示叶子节点/* selectModel配置项说明:all:所有结点都可选中;exceptRoot:除根结点,其它结点都可选(默认);folder:只有目录(非叶子和非根结点)可选;leaf:只有叶子结点可选不设置selectModel或者乱设置:所有节点不带check;只能单选*/selectModel: 'abc',checkModel: 'single',   //single 为单选模式,设置multiple为多选(仅限于带复选框的树)cascade: 'child',       //级联方式:1.child子级联;2.parent,父级联,3,both全部级联rootVisible: true,rootText: '所有部门'}, {xtype:'textfield',name: 'name',fieldLabel: "部门名称"}, {xtype:'textfield',name: 'description',fieldLabel: "职能说明"}]}];this.buttons = ['->',{text:'保存',iconCls : 'icon-save',action: 'save'}, {text:'取消',iconCls : 'icon-cancel',scope: this,handler: this.close},'->'];this.callParent(arguments);}});

3)store 数据存储层, 新建 webapp / app / store / Departments.js , 内容如下:

Ext.define('OA.store.Departments', {extend: 'Ext.data.Store',model: 'OA.model.Department',id : 'departmentStore',pageSize: 15,autoLoad: true,proxy: {type: 'ajax',api: {read: 'departmentActionListByPage.action',           },reader: {type:'json',root: 'departments',totalProperty: 'totalCount'}}});

4)model 模型, 新建 webapp / app / model / Department.js

Ext.define('OA.model.Department', {extend: 'Ext.data.Model',fields: ['id', 'name', 'description','parent.name','parent.id']});

5)controller 控制层, 新建 webapp / app / controller / Departments.js

Ext.define('OA.controller.Departments', {extend: 'Ext.app.Controller',models: ['Department'],stores: ['Departments'          //先向 控制器中注册 store组件, 然后在 view层才可以使用这个 store存储的数据],views: ['department.List','department.DepartmentManagerWindow'],init: function(){this.control({'departmentlist': {itemdblclick: this.editRole},'departmentlist button[action="onAddClick"]':{ //点击 新增按钮click: this.onAddClick},'departmentlist button[action="onDeleteClick"]':{ // 点击 删除按钮click: this.onDeleteClick},'departmentmanagerwindow button[action="save"]' : {click: this.onSave                   //点击保存按钮}})},//点击添加按钮onAddClick: function(btn){var win = Ext.widget('departmentmanagerwindow');var form = win.down('form').getForm();var comboboxtree = Ext.getCmp('comboboxtree');comboboxtree.clearValue();form.findField('id').hide();},//双击 grid数据editRole: function(grid, record){var win = Ext.widget('departmentmanagerwindow');win.setTitle('部门信息修改');win.down('form').loadRecord(record);var comboboxtree = win.down('comboboxtree');var parentId = record.get('parent.id');var parentName = record.get('parent.name');comboboxtree.bindValue(parentName, parentId);},//点击删除按钮onDeleteClick: function(){var departmentlist = Ext.getCmp('departmentlist');var me = this;Ext.Msg.confirm('删除确认', '删除的记录不可恢复,继续吗?', function(btn){if(btn == 'yes'){var s = departmentlist.getSelectionModel().getSelection();var ids = [];var idProperty = 'id';for (var i = 0, r; r = s[i]; i++) {ids.push(r.get(idProperty));}Ext.Ajax.request({url : 'departmentActionDelete.action',params : {ids : ids.join(',')},success : function(response) {if (response.responseText != '') {var res = Ext.JSON.decode(response.responseText);if (res.success) {Ext.Msg.alert('消息提示', '删除成功');// Ext.example.msg('系统信息', '{0}', "操作成功!");departmentlist.getStore().reload();} else {Ext.Msg.alert('消息提示', '删除失败,原因:'+res.msg);;}}}});}});},onSave: function(btn){var departmentlist = Ext.getCmp('departmentlist');var comboboxtree = Ext.getCmp('comboboxtree');//1.数据校验,校验通过后发起Ajax 请求var win = btn.up('window');var form = win.down('form').getForm();var comboboxtree = win.down('comboboxtree');console.info(comboboxtree.getSubmitValue());if(form.isValid()){var vals = form.getValues();console.info(vals);var url;if(vals['id'] == null || vals['id'] == ""){// 没有id值的,认为是新增操作url = "departmentActionAdd.action";} else {url = "departmentActionUpdate.action";}if(vals['parent.id'] == "" || vals['parent.id'] == 'null'){vals['parent.id'] = null;}Ext.Ajax.request({url: url,params: {'department.id':vals['id'],'department.parent.id': vals['parent.id'],'department.name': vals['name'],'department.description' : vals['description']},method: 'POST',success : function(response) {if (response.responseText != '') {var res = Ext.JSON.decode(response.responseText);if (res.success) {Ext.Msg.alert('消息提示', '保存成功');win.close();departmentlist.getStore().reload();} else {Ext.Msg.alert('消息提示', '保存失败,原因:'+res.msg);;}}},failure : function(response) {Ext.Msg.alert('消息提示', '保存失败');;}});}},});

6)app 应用层,编辑 webapp / app2.js 

Ext.Loader.setConfig({enabled: true});
Ext.Loader.setPath('Ext.ux', 'ext-4.0'+'/ux');
Ext.require(['Ext.ux.form.SearchField','Ext.ux.grid.feature.Searching','Ext.ux.ComboboxTree'
]);
Ext.application({name: 'OA',          //定义全局的命名空间, 通常将其定义为项目名appFolder: 'app',   //指定 app文件夹, 通常指定为appcontrollers: ['Main','Roles','Departments'],autoCreateViewport: true
});

三、后端代码

1)struts.xml 代码片段

<!-- 部门管理 -->
<action name="departmentActionList" class="departmentAction" method="list"></action>
action name="departmentActionListByPage" class="departmentAction" method="listByPage"></action>
<action name="departmentActionDelete" class="departmentAction" method="delete"></action>
<action name="departmentActionAdd" class="departmentAction" method="add"></action>
<action name="departmentActionUpdate" class="departmentAction" method="update"></action>
<action name="departmentActionGetDeptTree" class="departmentAction" method="buildDeparmentTree"></action>

2)Action 层

package cn.oa.action;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.ConvertUtils;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;import com.opensymphony.xwork2.ActionSupport;import cn.oa.model.Department;
import cn.oa.service.DepartmentService;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
@Controller
@Scope("prototype")
public class DepartmentAction extends ActionSupport{/*** */private static final long serialVersionUID = 1L;@Resourceprivate DepartmentService departmentService;private Department department;private String ids;private int start;private int limit;private String[] fields; //用于接收多个需要查询的字段名private String query;    //用于接收查询字段值/*** 构建一个树型结构,以JSON 格式输出*/public void buildDeparmentTree() throws Exception{//1. 获取所有一级菜单List<Department> roots = departmentService.getRootNodes();JSONObject jsonObject = new JSONObject();JSONArray array = new JSONArray();for(Department dept : roots){jsonObject = buildChildNodes(dept);array.add(jsonObject);}System.out.println(JSONArray.fromObject(array));writeJSON(JSONArray.fromObject(array));}public JSONObject buildChildNodes(Department dept){if(dept.getChildren() == null || dept.getChildren().size() == 0){JSONObject jsonObject = new JSONObject();jsonObject.element("id", dept.getId());jsonObject.element("text", dept.getName());jsonObject.element("leaf", true);return jsonObject;}else {JSONArray jsonArray = new JSONArray();JSONObject jsonObject = new JSONObject();jsonObject.element("id", dept.getId());jsonObject.element("text", dept.getName());jsonObject.element("leaf", false);Set<Department> children = dept.getChildren();for(Department dp: children){JSONObject obj =  buildChildNodes(dp);jsonArray.add(obj);}jsonObject.element("children", jsonArray);return jsonObject;}}/***  列表*/public void list() throws Exception {//1. 调用service 层查询所有数据List<Department> departments = departmentService.findAll();//2. 将数据以JSON 格式输出//JSONObject obj = new JSONObject();//obj.element("success", true);JSONObject obj = new JSONObject();JsonConfig config = new JsonConfig();
//      config.setExcludes(new String[]{"children","users"}); config.setExcludes(new String[]{"users"}); JSONArray json = JSONArray.fromObject(departments, config);System.out.println(json);obj.element("departments", json);writeJSON(obj);}/***  列表*/public void listByPage() throws Exception {//0.拼接查询字符串String conditions = null;if(query == null || query.trim().equals("")){conditions = "";}else {conditions = " WHERE ";for(int i=0; i< fields.length; i++){if(i == fields.length - 1){conditions = conditions + fields[i] + " like '%"+ query +"%'";break;}conditions = conditions + fields[i] + " like '%"+ query +"%' or ";}}//1. 查询总页数int totalCount = departmentService.getTotalCount(conditions);//1. 调用service 层查询所有数据List<Department> departments = departmentService.findByPage(start, limit, conditions);System.out.println("departments = " + departments);//2. 将数据以JSON 格式输出JSONObject obj = new JSONObject();JsonConfig config = new JsonConfig();config.setExcludes(new String[]{"children","users"}); JSONArray json = JSONArray.fromObject(departments, config);obj.element("totalCount", totalCount);obj.element("departments", json);writeJSON(obj);}/*** 删除岗位* @throws Exception*/public void delete() throws Exception {long[] temp = (long[]) ConvertUtils.convert(ids.split(","),long.class);try{departmentService.delete(temp);writeJSON("{success:true}");} catch (Exception e) {writeJSON("{success:false,msg:"+e.getMessage()+"}");throw e;}}/*** 添加岗位* @throws Exception*/public void add() throws Exception {System.out.println("add()....");System.out.println(department);try{departmentService.save(department);writeJSON("{success:true}");} catch (Exception e) {writeJSON("{success:false,msg:"+e.getMessage()+"}");throw e;}}/*** 更新岗位* @throws Exception*/public void update() throws Exception {System.out.println("update()....");System.out.println(department);try{departmentService.update(department);writeJSON("{success:true}");} catch (Exception e) {writeJSON("{success:false,msg:"+e.getMessage()+"}");throw e;}}private void writeJSON(Object obj) throws IOException{HttpServletResponse response = ServletActionContext.getResponse();response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.print(obj);out.close();}//...............此处省略 get / set 方法.............................}

3)Service 接口

package cn.oa.service;import java.util.List;import cn.oa.model.Department;public interface DepartmentService {List<Department> findAll() throws Exception;int getTotalCount(String conditions) throws Exception;List<Department> findByPage(int start, int limit, String conditions) throws Exception;void delete(long[] ids) throws Exception;void save(Department department) throws Exception;void update(Department department) throws Exception;/*** 获取根节点* @return* @throws Exception*/List<Department> getRootNodes() throws Exception;}

4)Service接口实现类

package cn.oa.service.impl;import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import cn.oa.dao.DepartmentDao;
import cn.oa.model.Department;
import cn.oa.service.DepartmentService;
@Service("departmentService")
@Transactional
public class DepartmentServiceImpl implements DepartmentService {@Resourceprivate DepartmentDao departmentDao;@Overridepublic List<Department> findAll() throws Exception {return departmentDao.findAll();}@Overridepublic int getTotalCount(String conditions) throws Exception {return departmentDao.getTotalCount(conditions);}@Overridepublic List<Department> findByPage(int start, int limit, String conditions) throws Exception {return departmentDao.findByPage(start, limit, conditions);}@Overridepublic void delete(long[] ids) throws Exception {for(int i = 0; i < ids.length; i++){Department department = departmentDao.getById(ids[i]);Department parent = department.getParent();if(parent != null) {parent.getChildren().remove(department);department.setParent(null);}departmentDao.delete(department);}     }@Overridepublic void save(Department department) throws Exception {if(department.getParent() != null) {Department parent = departmentDao.getById(department.getParent().getId());department.setParent(parent);}departmentDao.save(department);      }@Overridepublic void update(Department department) throws Exception {if(department.getParent() != null) {Department parent = departmentDao.getById(department.getParent().getId());department.setParent(parent);}departmentDao.update(department);      }@Overridepublic List<Department> getRootNodes() throws Exception {return departmentDao.getRootNodes();}}

5)Dao 接口

package cn.oa.dao;import java.util.List;import cn.oa.base.BaseDao;
import cn.oa.model.Department;public interface DepartmentDao extends BaseDao<Department>{List<Department> getRootNodes();}

6)Dao 接口实现类

package cn.oa.dao.impl;import java.util.List;import org.hibernate.Session;
import org.springframework.stereotype.Repository;import cn.oa.base.BaseDaoImpl;
import cn.oa.dao.DepartmentDao;
import cn.oa.model.Department;
@Repository
public class DepartmentDaoImpl extends BaseDaoImpl<Department> implements DepartmentDao  {@SuppressWarnings("unchecked")@Overridepublic List<Department> getRootNodes() {Session session = getSession();String sql = "FROM "+ Department.class.getSimpleName() + " WHERE parentId is null";return session.createQuery(sql).list();}}

7)基类Dao接口

package cn.oa.base;import java.util.List;import cn.oa.model.Role;public interface BaseDao<T> {void save(T t) throws Exception;void delete(Long id) throws Exception;void update(T t) throws Exception;T getById(Long id) throws Exception;List<T> getByIds(Long[] ids) throws Exception;List<T> findAll() throws Exception;/*** 查询总页数* @param conditions 查询条件* @return* @throws Exception*/int getTotalCount(String conditions) throws Exception;/*** 分页查询* @param start 从第几条开始* @param limit 取多少条记录* @param conditions 查询条件* @return* @throws Exception*/List<T> findByPage(int start, int limit, String conditions) throws Exception;void delete(T t) throws Exception;
}

8)基类 Dao 接口实现类

package cn.oa.base;import java.lang.reflect.ParameterizedType;
import java.util.Collections;
import java.util.List;import javax.annotation.Resource;import org.hibernate.Session;
import org.hibernate.SessionFactory;@SuppressWarnings("unchecked")
public class BaseDaoImpl<T> implements BaseDao<T> {@Resourceprivate SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}protected Class<T> clazz;public BaseDaoImpl() {// 通过反射得到T的真实类型ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();this.clazz = (Class) pt.getActualTypeArguments()[0];System.out.println("clazz = " + clazz.getName());}protected Session getSession() {return sessionFactory.getCurrentSession();}@Overridepublic void save(T t) throws Exception {getSession().save(t);}@Overridepublic void delete(Long id) throws Exception {Object obj = getSession().get(clazz, id);getSession().delete(obj);}@Overridepublic void delete(T t) throws Exception {getSession().delete(t);}@Overridepublic void update(T t) throws Exception {getSession().merge(t);}@Overridepublic T getById(Long id) throws Exception {return (T) getSession().get(clazz, id);}public List<T> getByIds(Long[] ids) throws Exception {if (ids == null || ids.length == 0) {return Collections.EMPTY_LIST;}return getSession().createQuery(//"FROM " + clazz.getSimpleName() + " WHERE id IN(:ids)")//.setParameterList("ids", ids)//.list();}public List<T> findAll() throws Exception {return getSession().createQuery(//"FROM " + clazz.getSimpleName())//.list();}@Overridepublic int getTotalCount(String conditions) throws Exception {String sql = "SELECT COUNT(*) FROM " + clazz.getSimpleName();if(conditions != null && !conditions.equals("")){sql += conditions;}Long res = (Long) getSession().createQuery(sql).uniqueResult();return res.intValue();}@Overridepublic List<T> findByPage(int start, int limit, String conditions) throws Exception {String sql = "FROM "+ clazz.getSimpleName();if(conditions != null && !conditions.equals("")){sql += conditions;}return getSession().createQuery(sql).setFirstResult(start).setMaxResults(limit).list();}}

9)Model 实体类

package cn.oa.model;import java.util.HashSet;
import java.util.Set;public class Department {private Long id;private Set<User> users = new HashSet<User>();private Department parent;private Set<Department> children = new HashSet<Department>();private String name;private String description;//.................此处省略 get / set 方法@Overridepublic String toString() {if(parent == null){return "Department [id=" + id + ", users=" + users + ", name=" + name + ", description="+ description + "]";}return "Department [id=" + id + ", users=" + users + ", parent=" + parent + ", name=" + name + ", description="+ description + "]";}}

10)映射描述文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.oa.model"><class name="Department" table="t_department"><id name="id"><generator class="native"/></id><property name="name"></property><property name="description"></property><!-- users属性, 本类与 User 的一对多--><set name="users" lazy="false"><key column="departmentId"></key><one-to-many class="User"/></set><!-- parent属性, 本类与 Department 的多对一--><many-to-one name="parent" class="Department" column="parentId" lazy="false" cascade="save-update,persist"></many-to-one><!-- children属性, 本类与 Department 的一对多--><set name="children" lazy="false" cascade="all"><key column="parentId"></key><one-to-many class="Department"/></set></class></hibernate-mapping>

11)Hibernate 主配置文件

<mapping resource="cn/oa/model/Department.hbm.xml" />

OA项目(部门管理模块)上相关推荐

  1. OA的部门管理和员工管理模块的实现总结

    1.部门管理.   结构上不同.这里使用的是树形结构.一个部门下面有多个部门.部门的下面还有部门.所以,这里用树形结构是最合适的了.能很好的解决这个问题.来实现功 能. 刚一进入页面的时候,默认显示最 ...

  2. 面试展示:CRM项目客户管理模块展示

    一.模块简绍 包括四个小的模块 ​ 客户信息:对客户信息的管理,经理可以看见所有客户,员工能够管理自身负责的客户,员工和经理可以向其他人共享客户信息,但是员工共享客户要经过经理的审批 ​ 联系人信息: ...

  3. 客户关系管理项目——客户管理模块设计

    一 模块需求细化 1 实现客户信息录入 "添加"只有具有添加客户权限的用户才可以填写,只有具备3号角色的用户才能负责客户的添加,即超链接上会出现"添加客户"超链 ...

  4. 企业WEB项目商品管理图片上传

    文章目录 一.商品基本信息录入 1.电商概念SPU与SKU 2.商品分类 2.1需求分析 2.2前端 3.商品介绍 3.1富文本编辑器介绍 3.2使用kindeditor 4.选择商品分类 4.1一级 ...

  5. OA系统----第一模块----部门管理

    学习主题:OA系统部门管理 学习目标: 1 掌握web开发项目实战,熟练使用web开发基础技术 1.项目入门-了解项目功能 (1)什么是OA系统? 即"办公自动化",是使用网络和软 ...

  6. vhr部门管理数据库设计与编程

    vhr部门管理模块更新啦!为了让小伙伴们快速理解部门管理模块实现思路,我想通过3篇短文来给大家介绍下大致的实现思路和核心代码.本文是[SpringBoot+Vue前后端分离,使用SpringSecur ...

  7. 项目范围和项目范围管理

    项目的范围包括项目的最终产品或服务以及实现该产品或服务所需要开始的各项具体工作. 1.项目产品范围. 项目所要生产的产品或服务的特征和功能. 2.项目工作范围. 项目范围管理是指为了成功完成项目,对项 ...

  8. 【信息系统项目管理师】第五章 项目范围管理(考点汇总篇)

    [信息系统项目管理师]第五章 项目范围管理(考点汇总篇) ■考点分析与预测 项目范围管理一般上午考察3分,需求是龙头,是做项目管理的基础.没有需求就不能确定项目的范围,没有范围,项目就无从谈起,此部分 ...

  9. OA项目10:部门管理的三个细节问题的解决及处理懒加载问题

    首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 部门管理遗留三个细节问题,及其处理方法: 1.当选择了 ...

最新文章

  1. 从SeekFree的Gitee开源库建立通用MM32开发模板
  2. OpenCL与Cuda
  3. MySql入门使用:登录及简单创建查询表
  4. cnetos7系统命令补全操作
  5. 利用SoapUI 测试web service的方法介绍
  6. Python 3.6出现报错解决方案:No Python 3.6 installation was detected,无法卸载Python
  7. C语言编程快速入门黎明,何用C语言模拟键盘输入?
  8. android textview表情,Android开发(16)-TextView显示表情图像和文字
  9. jar包和war包差别
  10. 酒泉-嘉峪关-敦煌-西宁青海湖-兰州六日游之一
  11. 惨遭数百万开发者厌弃的五大编程语言!
  12. phpexcel 数字格式_将文本转换为phpexcel中的数字格式
  13. 用户信息填写web代码_zabbix监控系列之监控项(8、web监控)
  14. Baidu 人脸识别FireFly 与PC连接调试
  15. PCL使用类成员函数作为pclvisualizer的回调函数
  16. 软件产品管理系统有哪些?12个最佳产品管理工具盘点
  17. x264码率控制(二)lookahead
  18. 托管服务器ip绑定域名_如何在一台服务器上托管多个域名和项目
  19. html2:什么是超文本?
  20. 爬虫技术(05)神箭手爬虫回调函数

热门文章

  1. 【Android】Broadcast
  2. 继承(下)----虚继承
  3. 软考-高级项目管理(二十)
  4. php中Mysql常用操作类收集
  5. 什么是适合中小企业的ERP
  6. 第十届中国云计算大会成功举办,至顶网总编主持高峰对话
  7. 大数据揭秘《都挺好》:比起樊胜美 女性更想当苏明玉
  8. Linux——详解共享内存shared memory
  9. Android-谷歌语音识别之离线识别(二)
  10. 如何在latex中使用python及pythontex功能简介