Boot-crm管理系统开发教程(二)
ps:昨天将管理员登录的功能完成了,并完美的解决跳过登录从而进入管理界面的bug,今天我们将实现"查询用户"功能。
①在po包中创建Customer类,并编写相关变量和添加set/get方法。(相关变量:客户编号,客户名称,负责人id,创建人id,客户信息来源,客户所属行业,客户级别,联系人,固定电话,移动电话,邮政编码,联系地址,创建时间,起始行,所取行数) 然后创建BaseDict类(字典类)
②在dao包中创建CustomerDao接口,接口中包含 通过id查询客户的方法,客户列表方法(List集合)和显示客户数的方法
③在dao包中创建CustomerDao.xml文件,在文件开头我们先编写映射地址,然后编写查询用户的sql语句,其id为
"selectCustomerListWhere"
然后编写查询客户列表的sql语句(查询客户列表的语句要和字典表结合来查)。之后编写查询客户总数的sql语句。
- <mapper namespace="com.yehaijing.core.dao.CustomerDao" >
- <!-- 查询客户 -->
- <sql id="selectCustomerListWhere">
- <where>
- <if test="cust_name != null" >
- cust_name like "%"#{cust_name}"%"
- </if>
- <if test="cust_source != null" >
- and cust_source = #{cust_source}
- </if>
- <if test="cust_industry != null" >
- and cust_industry = #{cust_industry}
- </if>
- <if test="cust_level != null" >
- and cust_level = #{cust_level}
- </if>
- </where>
- </sql>
- <!-- 查询客户列表 -->
- <select id="selectCustomerList" parameterType="customer"
- resultType="customer">
- SELECT
- cust_id,
- cust_name,
- cust_user_id,
- cust_create_id,
- b.dict_item_name cust_source,
- c.dict_item_name cust_industry,
- d.dict_item_name cust_level,
- cust_linkman,
- cust_phone,
- cust_mobile,
- cust_createtime
- FROM
- customer a
- LEFT JOIN (
- SELECT
- dict_id,
- dict_item_name
- FROM
- base_dict
- WHERE
- dict_type_code = '002'
- ) b ON a.cust_source = b.dict_id
- LEFT JOIN (
- SELECT
- dict_id,
- dict_item_name
- FROM
- base_dict
- WHERE
- dict_type_code = '001'
- ) c ON a.cust_industry = c.dict_id
- LEFT JOIN (
- SELECT
- dict_id,
- dict_item_name
- FROM
- base_dict
- WHERE
- dict_type_code = '006'
- @Controller
- public class CustomerController {
- // 依赖注入
- @Autowired
- private CustomerService customerService;
- @Autowired
- private BaseDictService baseDictService;
- // 客户来源
- @Value("${customer.from.type}")
- private String FROM_TYPE;
- // 客户所属行业
- @Value("${customer.industry.type}")
- private String INDUSTRY_TYPE;
- // 客户级别
- @Value("${customer.level.type}")
- private String LEVEL_TYPE;
- /**
- * 客户列表
- */
- @RequestMapping(value = "/customer/list.action")
- public String list(@RequestParam(defaultValue="1")Integer page,
- @RequestParam(defaultValue="10")Integer rows,
- String custName, String custSource, String custIndustry,
- String custLevel, Model model) {
- // 条件查询所有客户
- Page<Customer> customers = customerService
- .findCustomerList(page, rows, custName,
- custSource, custIndustry,custLevel);
- model.addAttribute("page", customers);
- // 客户来源
- List<BaseDict> fromType = baseDictService
- .findBaseDictByTypeCode(FROM_TYPE);
- // 客户所属行业
- List<BaseDict> industryType = baseDictService
- .findBaseDictByTypeCode(INDUSTRY_TYPE);
- // 客户级别
- List<BaseDict> levelType = baseDictService
- .findBaseDictByTypeCode(LEVEL_TYPE);
- // 添加参数
- model.addAttribute("fromType", fromType);
- model.addAttribute("industryType", industryType);
- model.addAttribute("levelType", levelType);
- model.addAttribute("custName", custName);
- model.addAttribute("custSource", custSource);
- model.addAttribute("custIndustry", custIndustry);
- model.addAttribute("custLevel", custLevel);
- return "customer";
- }
- }
) d ON a.cust_level = d.dict_id<include
refid="selectCustomerListWhere"/><!-- 执行分页查询 --><if
test="start !=null and rows != null">limit
#{start},#{rows}</if></select><!-- 查询客户总数
--><select id="selectCustomerListCount" parameterType="customer"
resultType="Integer">select count(*) from customer<include
refid="selectCustomerListWhere"/></select>
④在service包中创建CustomerService.java接口和BaseDictService.java接口,并在CustomerService接口中编写通过id查询客户的方法,传入customer对象和查询客户列表的方法。在BaseDict接口中编写根据类别代码查询数据字典的方法
findBaseDictByTypeCode。
⑤在service.impl包中创建CustomerServiceImpl.java接口实现类和BaseDictServiceImpl.java接口实现类,并在方法名上添加@Service注解和在方法内部添加@Autowired自动注入
⑥在Controller包中创建CustomerController.java类,在方法名上方加上@Controller注解,在方法内@Autowired自动注入CustomerService和BaseDictService。
- @Controller
- public class CustomerController {
- // 依赖注入
- @Autowired
- private CustomerService customerService;
- @Autowired
- private BaseDictService baseDictService;
- // 客户来源
- @Value("${customer.from.type}")
- private String FROM_TYPE;
- // 客户所属行业
- @Value("${customer.industry.type}")
- private String INDUSTRY_TYPE;
- // 客户级别
- @Value("${customer.level.type}")
- private String LEVEL_TYPE;
- /**
- * 客户列表
- */
- @RequestMapping(value = "/customer/list.action")
- public String list(@RequestParam(defaultValue="1")Integer page,
- @RequestParam(defaultValue="10")Integer rows,
- String custName, String custSource, String custIndustry,
- String custLevel, Model model) {
- // 条件查询所有客户
- Page<Customer> customers = customerService
- .findCustomerList(page, rows, custName,
- custSource, custIndustry,custLevel);
- model.addAttribute("page", customers);
- // 客户来源
- List<BaseDict> fromType = baseDictService
- .findBaseDictByTypeCode(FROM_TYPE);
- // 客户所属行业
- List<BaseDict> industryType = baseDictService
- .findBaseDictByTypeCode(INDUSTRY_TYPE);
- // 客户级别
- List<BaseDict> levelType = baseDictService
- .findBaseDictByTypeCode(LEVEL_TYPE);
- // 添加参数
- model.addAttribute("fromType", fromType);
- model.addAttribute("industryType", industryType);
- model.addAttribute("levelType", levelType);
- model.addAttribute("custName", custName);
- model.addAttribute("custSource", custSource);
- model.addAttribute("custIndustry", custIndustry);
- model.addAttribute("custLevel", custLevel);
- return "customer";
- }
- }
总结:
写到这里,我们的查询客户的功能就全部写完了,回顾一下我们做了什么工作:首先,我们先创建了POJO类(用户类和字典表类),然后我们在dao包中创建了用户类和字典表类的对应接口,并且还对应的创建了xml文件。然后是service类,在service中我们仍然还是创建了接口,并且之后创建了该接口的实现类,最后在controller包中创建了控制类(我觉得这个类相当于一个开关 OFF/ON)。那么将这个项目发布到Tomocat服务器上,浏览器的执行顺序是这样子的:我们在网页上点击操作,然后浏览器首先会查看教程(一)中写好的配置文件(applicationContext.xml等~),然后会首先进入到Controller类中,检查RequestMapping的映射路径(看图)
Boot-crm管理系统开发教程(二)的更多相关文章
- Boot-crm管理系统开发教程(总结)
这个Boot-crm管理系统我花了大概两周写完,因为是刚学完SSM框架,所以立马开始了这个项目,项目初期,运行书本上给的前端代码都报了许多错误,导致这个原因是因为书本给的 设计说明文档 没有看清楚.然 ...
- MIP开发教程(二) 使用MIP-CLI工具调试MIP网页
初始化 MIP 配置 新建一个 MIP 网页 编写 MIP 网页代码 校验 MIP 网页 调试 MIP 网页 1. 初始化 MIP 配置 首先在html目录下进行初始化 MIP 配置: $ mip i ...
- 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取
公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...
- XAF应用开发教程(二)业务对象模型之简单类型属性
使用过ORM的朋友对这一部分理解起来会非常快,如果没有请自行补习吧:D. 不说废话,首先,我们来开发一个简单的CRM系统,CRM系统第一个信息当然是客户信息.我们只做个简单 的客户信息来了解一下XAF ...
- Boot-crm管理系统开发教程(三)
(ps:前两章我们已经把管理员登录和查看用户的功能实现了,那么今天我们将要实现:添加用户,删除用户,和修改用户功能) 由于Cusomer的POJO类型已经写好了,所以这次我们之前从CustomerCo ...
- Odoo 二次开发教程(二)-模块的基础构建
注:本篇及后续均以8.0为基础. 一. Odoo模块的构成 __init__.py 文件是python包导入所必须的文件,内容可以为空,通常情况下我们用来导入自己写的py文件. __openerp__ ...
- 【转载】Vue 2.x 实战之后台管理系统开发(二)
2. 常见需求 01. 父子组件通信 a. 父 -> 子(父组件传递数据给子组件) 使用 props,具体查看文档 - 使用 Prop 传递数据(cn.vuejs.org/v2/guide/co ...
- Boot-crm管理系统开发教程(一)
ps:上周就把这个项目写完了,一直忘记记录,现在补上. Boot-crm是书上第十八章的内容,书上提供了前端的代码,所以只需要写后端的代码就可以了,①所以我们先把前端的代码移植到项目中. ②然后在li ...
- Android OpenGL ES 开发教程 从入门到精通
感谢,摘自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ...
随机推荐
- 定义了char**p,为什么能用p[i][j]的形式?p又不是二维数组?
char **p;p[i][j]相当于*(*(p+i)+j) https://www.zhihu.com/question/63717863
- 简述python中的@staticmethod作用及用法
关于@staticmethod,这里抛开修饰器的概念不谈,只简单谈它的作用和用法. staticmethod用于修饰类中的方法,使其可以在不创建类实例的情况下调用方法,这样做的好处是执行效率比较高.当 ...
- gradle添加阿里云maven库
用gradle构建spring项目,才发现gradle要添加阿里云maven库和maven不太一样 链接:https://www.cnblogs.com/SiriYang/p/10638365.htm ...
- OUC_TeamTraining_#1 720
D - The Mirror of Galadriel Time Limit:2000MS Memory Limit:0KB 64bit IO Format:%lld & %l ...
- Nginx之最简单的反向代理机制分析
注:当前分析基于 Nginx之搭建反向代理实现tomcat分布式集群 的配置. 1. 用到的指令 下面介绍在上面的配置中用到的指令. upstream 指令 语法:upstream name { .. ...
- Windows Server 2012R2 部署 Domain Controller
1. Create a machine as Domain Controller; 2. Change DNS server address as 127.0.0.1; 3. Change Compu ...
- CentOS服务器安装部署Java环境(jdk,tomcat)
第一步:卸载openjdk 用命令 java -version,如有下面的信息说明CentOS自带OpenJdk,没安装跳过这一步: 最好还是先卸载掉openjdk,再安装oracle公司的jdk.先 ...
- Web实现前后端分离,前后端解耦
一.前言 ”前后端分离“已经成为互联网项目开发的业界标杆,通过Tomcat+Ngnix(也可以中间有个Node.js),有效地进行解耦.并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构 ...
- Scrapy+redis实现分布式爬虫
概述 什么是分布式爬虫 需要搭建一个由n台电脑组成的机群,然后在每一台电脑中执行同一组程序,让其对同一网络资源进行联合且分布的数据爬取. 原生Scrapy无法实现分布式的原因 原生Scrapy中调度器 ...
- Java泛型(4):泛型与匿名内部类
泛型同样也可以使用在匿名内部类中. 下面的例子是对 Java泛型(3):泛型方法 中例(2)的修改. public interface Generator<T> { T next(); } ...