2025年做项目需要知道哪些java基础

做项目需要知道哪些java基础电商项目介绍 2 电商行业技术特点 技术新 NoSql 推广首在社区网站和电商项目 发展快 需求推动技术的革新 技术范围广 除了 java 像淘宝前端还使用了 PHP 数据库 MySQL 或者 oracle nosql 服务器端使用 Linux 服务器安全 系统安全 分布式 以前是在一台机器上做运算 现在是分散到很多机器上 最后汇总起来 集中式向分布式进行考虑 由需求来推动 高并发

大家好,我是讯享网,很高兴认识大家。



电商项目介绍

2.电商行业技术特点

技术新:(NoSql推广首在社区网站和电商项目),发展快,需求推动技术的革新。

技术范围广:除了java,像淘宝前端还使用了PHP,数据库MySQL或者oracle,nosql,服务器端使用Linux,服务器安全、系统安全

分布式:以前是在一台机器上做运算,现在是分散到很多机器上,最后汇总起来。(集中式向分布式进行考虑)由需求来推动

高并发、集群、负载均衡、高可用:由并发问题采用集群进行处理,其中,集群会涉及服务器的主从以及分布问题,使用负载均衡。(权重高低)高可用是对用户而言,用户的服务不中断(系统升级,服务不中断,淘宝每周更新2次)。

海量数据:双11,570亿的背后,订单有多少?浏览次数有多少?商品会有多少?活动相关数据?

业务复杂:不要简单的认为是:商品展示出来后,加入购物车后购买就完成了。后台特别复杂,比如优惠(包邮、满减)

系统安全:系统上线必须通过系统安全部门审核通过。前年CSDN数据泄露。快捷酒店数据泄露(通过身份证就可以查看你的开房记录)。近几年,安全意识逐步在提高。

电商行业的一些概念

1、 B2C:商家对客户,京东、当当、发展为B2C平台,天猫(B2C平台 淘宝商城由马云提出,率先发展为平台),1号店也是(在上海)

        2、 B2B:商家对商家,阿里巴巴(不零售,只批发,淘宝很多商家都会去阿里巴巴进货);

        3、 C2C:个人对个人,淘宝市场,淘宝,商城;

系统功能

本商城系统是一个综合性的B2C平台,类似京东商城、天猫商城。

会员可以在商城浏览商品、下订单,以及参加各种活动。

商家可以在入住淘淘商城,在该平台上开店出售自己的商品,并且得到淘淘商城提供的可靠的服务。

管理员、运营可以在平台后台管理系统中管理商品、订单、会员等。

客服可以在后台管理系统中做项目需要知道哪些java基础处理用户的询问以及投诉。

Java电子商务后台管理系统项目开发技术 java电商项目介绍_数据

  首先我们要有商品,管理员可以在系统中管理商品,用户可以查看商品。
  商品多了之后要有类目模块,管理员可以管理类目信息,用户可以根据类目检索商品。
  有了商品之后,要有人(会员)去买东西,普通用户注册为会员,会员可以登录到系统管理自己的信息(密码等)
  买了之后会生成订单,会员可以购买商品并且可以下单,管理员可以管理订单。
  有了订单之后需要支付(在线支付/货到付款)
  ……

这样,我们就可以把整个电商项目的功能记清楚了!

分布式系统架构

左图为分布式系统架构,右图为传统架构!

Java电子商务后台管理系统项目开发技术 java电商项目介绍_分布式系统_02

各个系统说明:

后台管理系统:管理商品、订单、类目、商品规格属性、用户管理以及内容发布等功能。

前台系统:用户可以在前台系统中进行注册、登录、浏览商品、首页、下单等操作。

会员系统:用户可以在该系统中查询已下的订单、收藏的商品、我的优惠券、团购等信息。

订单系统:提供下单、查询订单、修改订单状态、定时处理订单。

搜索系统:提供商品的搜索功能。

单点登录系统:为多个系统之间提供用户登录凭证以及查询登录用户的信息。

谈到分布式架构,我们必须对比传统架构才能彰显其优势。

①最为明显的一点,在传统的架构中,如果某个功能需要进行维护,那么我们必须停掉整个服务,这对于公司的运营会造成损失。分布式系统在核心功能模块使用单独服务器,维护部分模块不影响用户的其他操作。

②在海量数据处理方面,传统架构显得比较乏力;分布式系统架构采用服务器集群,使用负载均衡,海量数据处理游刃有余!

③在性能(检索)以及维护方面,分布式系统架构也有较为明显的优势。

6.本系统人员配置情况

l 产品经理:3人,确定需求以及给出产品原型图。

l 项目经理:1人,项目管理。

l 前端团队:3人,根据产品经理给出的原型制作静态页面。

l 后端团队:20人,实现产品功能。

l 测试团队:3人,测试所有的功能。

l 运维团队:2人,项目的发布以及维护。

7.开发流程

Java电子商务后台管理系统项目开发技术 java电商项目介绍_数据_03

此图不做详细解释(就业指导课已进行详细说明,注意整个流程中容易被问到的问题)

8.后台开发环境

Java电子商务后台管理系统项目开发技术 java电商项目介绍_分布式系统_04

Java电子商务后台管理系统项目开发技术 java电商项目介绍_数据_05

  整个开发沿着主线进行,在一个版本定型后,前一个版本出现bug,那么此时会对bug进行修复,投入使用的依旧是之前定型的那个版本,待前一个版本的bug修复好了之后,会定义一个新的版本,主线不会改变,如果改动不大,那么只需修订问题,继续沿用此版本(1.0.x),只有出现较大改动时,才会升级一个新的版本号(1.1.x)。所有动作,交替进行,沿主线向前推进!

9.涉及技术

l Spring、SpringMVC、Mybatis

l JSP、JSTL、jQuery、jQuery plugin、EasyUI、KindEditor(富文本编辑器)、CSS+DIV

l Redis(缓存服务器)

l Lucene、Solr(搜索)

l httpclient(调用系统服务)

l Mysql

l Nginx(web服务器)

l Quartz(定时任务)

l RabbitMQ(消息队列)

技术详解见其它章节,未接触技术点(标背景色技术点)将在本项目后续内容中进行介绍。

10.开发工具和环境

l Eclipse 4.4.1

l Maven 3.2.3

l Tomcat 7.0.47(Maven Tomcat Plugin)

l JDK 1.7

l Mysql 5.6

l Nginx 1.5.1

l Redis 2.8.9

l Win7 操作系统

l SVN(版本管理)

此章节,需要注意所有开发工具的版本号要对应(一致),否则会出现冲突问题,面试大忌!(常识:电商项目火起来的时间不是很久,在开发的时候,很多开发工具和环境不像之前那些传统系统那么老旧,这点一定要引起注意!)

电商项目面试问题

项目介绍

属于B2C平台----商家对客户

系统的用途,主要是提供B2C的平台,其中自营商品也有商家入住,类似天猫。

系统架构,采用分布式的系统架构,其中前台系统和单点登录系统采用了集群的方式部署,在后台管理系统中采用了Maven的多模块化的管理,其中采用了水平切分的方式,将pojo、dao、service、web分层开发,这样做的好处就是可以重用性更高。

系统内部接口调用采用Httpclient,并且使用Httpclient的连接池技术,接口提供端采用RESTful方式的接口定义;

系统之间的通知机制采用MQ的方式,使用RabbitMQ的实现,使用了RabbitMQ的消息订阅模式的消息机制;

系统的接口还对JS的跨域做了支持,采用了jsonp的解决方法,在后台接口中扩展了spirng提供的jackson数据转化器实现;

部署方面,采用了Nginx+tomcat的模式,其中nginx的作用一方面是做反向代理、负载均衡、另一方面是做图片等静态资源的服务器。

项目介绍应该从这个项目的模式、功能、架构、解决了什么问题、部署以及投入使用情况来说。

2.整个项目的架构如何?

一般情况这个问题要从两个方面去回答,从技术架构和功能架构去谈。

技术架构:本项目使用主流框架spring+springmvc+mybatis进行开发,采用分布式的系统架构,前台系统和单点登录系统采用了集群的方式部署,后台管理系统中采用了Maven的多模块化的管理,其中采用了水平切分的方式,将pojo、dao、service、web分层开发,这样做的好处就是可以重用性更高。系统内部接口调用采用Httpclient,并且使用Httpclient的连接池技术,接口提供端采用RESTful方式的接口定义;系统之间的通知机制采用MQ的方式,使用RabbitMQ的实现,使用了RabbitMQ的消息订阅模式的消息机制;系统的接口还对JS的跨域做了支持,采用了jsonp的解决方法,在后台接口中扩展了spirng提供的jackson数据转化器实现;搜索系统使用了solr实现,在保证系统高性能的前提下,尽可能为公司节约成本,我们使用MySQL数据库进行集群(oracle收费)。在部署方面,采用了Nginx+tomcat的模式,其中nginx的作用一方面是做反向代理、负载均衡、另一方面是做图片等静态资源的服务器。

功能架构:分布式系统架构

Java电子商务后台管理系统项目开发技术 java电商项目介绍_数据_06

各个系统说明:

后台管理系统:管理商品、订单、类目、商品规格属性、用户管理以及内容发布等功能。

前台系统:用户可以在前台系统中进行注册、登录、浏览商品、首页、下单等操作。

会员系统:用户可以在该系统中查询已下的订单、收藏的商品、我的优惠券、团购等信息。

订单系统:提供下单、查询订单、修改订单状态、定时处理订单。

搜索系统:提供商品的搜索功能。

单点登录系统:为多个系统之间提供用户登录凭证以及查询登录用户的信息。

谈到分布式架构,我们必须对比传统架构才能彰显其优势。

  ①最为明显的一点,在传统的架构中,如果某个功能需要进行维护,那么我们必须停掉整个服务,这对于公司的运营会造成损失。分布式系统在核心功能模块使用单独服务器,维护部分模块不影响用户的其他操作。

  ②在海量数据处理方面,传统架构显得比较乏力;分布式系统架构采用服务器集群,使用负载均衡,海量数据处理游刃有余!

  ③在性能(检索)以及维护方面,分布式系统架构也有较为明显的优势。

传统架构

Java电子商务后台管理系统项目开发技术 java电商项目介绍_搜索_07

3.这个项目为用户提供了哪些服务?包括哪些功能?

u 商品管理模块:其中包括品牌管理,属性管理商品录入/上下架管理,商品添加审核,静态页面发布
u 订单模块:其中包括使用activiti工作流订单的查询和订单的流转,定时作废
u 商品前台首页:其中主要负责首页商品列表筛选,首页上动态展示筛选条件,点击每一个筛选条件下面的商品列表要做联动
u 单品页面:采用freemarker来实现页面静态化,展示商品详情信息和商品购买,该页面采用静态化以减轻系统压力,使用了cxf框架发布服务
u 提交订单页面:提交用户的订单信息, 处理并发问题。
u 个人中心,包括用户的登录,个人信息的管理,收货地址的管理,用户所下的订单的管理
u 购物车:把购物车的信息存在cookie里面管理

4.你承担这个项目的哪些核心模块?

在项目中主要负责相关系统的开发,主要有:

  1) 后台管理系统,主要实现商品管理、商品规格参数管理、订单管理、会员管理等、CMS(内容管理系统)等,并且提供了跨域支持;

  2) 前台系统,主要是面向用户访问,使用Httpclient和后台系统接口做交互,并且该系统在部署上采用集群的方式;

  3) 单点登录系统,主要是提供集中用户登录凭证的集中解决方案,提供和用户信息相关的接口,比如说用户注册、查询等接口。

  4) 订单系统,主要是提供和订单相关的业务接口,在订单系统了做了严格的数据校验以及高并发写的支持(这里可以说使用队列实现),并且使用了Quartz定时任务实现对订单的定时扫描,比如说关闭超时未付款的订单;

  5) 搜索系统,主要是提供商品的搜索,采用开源企业级系统Solr实现,采用了MQ机制保证了商品数据可以及时同步到solr中;

  6) 会员系统,主要是维护用户的信息,已购买订单、优惠券、系统消息、修改密码、绑定手机等功能;

  7) 缓存,主要是用Redis实现,并且对Redis做了集群来保证Redis服务的高可用。8) 支付系统,主要是负责订单的支付、对账等功能,主要是对接了支付宝的接口;

5.这些模块的实现思路说一下?

①商品管理模块

品牌管理:
主要掌握的核心是品牌的添加
l 图片服务器的搭建,
l 上传图片到图片服务器
l 表单的验证,离开焦点的验证,点击完成时的验证,后台服务器的ajax验证,表单规范
l 防止表单的二次提交
l 编辑时不需要修改品牌名,区别readOnly和disabled

图片服务器的搭建

Java电子商务后台管理系统项目开发技术 java电商项目介绍_搜索_08

3. 编写上传到图片服务器的代码

由于应用服务器与图片服务器出于不同的两台机器之中,所以可以提高系统的性能,能起到负载均衡的作用。上传图片时使用Jersey客户端API调用REST风格的Web服务,Jersey1是一个开源的、可以用于生产环境的JAX-RS(RESTful Web Services 的Java API 规范,JSR-311)实现。通Jersey 可以很方便的使用Java来创建一个RESTful Web Services。

byte[] fileByte = commFile.getBytes();

//创建客服端,基于webservice

Client client = Client.create();

//指定资源路径

WebResource webResource = client.resource(Constants.picPath+fileName);

//使用put的请求方式把资源文件放到资源服务器上

webResource.put(String.class, fileByte);

前台使用ajax提交表单,需要使用jquery的jquery.form.js插件

$("#form").ajaxSubmit({

url:url,

type:"post",

dataType:"text",

data:{

...

},

//beforeSubmit:validate,

success:function(responseText){

var obj = $.parseJSON(responseText);

},

error:function(){

}

});

4. 图片服务器中Upload文件夹中随便建立一个文件,防止空文件夹的情况下发布后upload消失

表单验证

1. 提交时做验证


    做好约定,每个文本中设置reg属性和tip自定义的属性,reg存放正则表达式,tip中存放不合法时的提示信息,还有品牌名称重复的验证。


reg2,tip属于自定义的属性,这种定义方式方便使用jquery的属性选择器

<p>

    <label><samp>*</samp>品牌名称:</label>

    <input type="text" id="brandName" name="brandName" class="text state" reg2="^[a-zA-Z0-9一-龥]{1,20}$" tip="必须是中英文或数字字符,长度1-20"/>

    <span></span>

</p>

2. 在表单提交时做验证使用$(“form”).submit(function(){ return false });,必填字段和非必填的字段需要区别对待

$("#form111").submit(function(){

    var isSubmit = true;

    $(this).find("[reg2]").each(function(){

        var regStr = $(this).attr("reg2");

        //剪掉值中的两侧的字符串

        var value = $.trim($(this).val());

        var tip = $(this).attr("tip");

        //创建正则表达式的对象

        var reg = new RegExp(regStr);

        if(!reg.test(value)){

            $(this).next("span").html(tip);

            isSubmit = false;

            //跳出循环,在jquery的each语句之中跳出循环使用return false; 如果在原生js里面可使用break;, return;:代表终止执行程序

            return false;

        }

    });

    $(this).find("[reg1]").each(function(){

        var regStr = $(this).attr("reg1");

        var value = $.trim($(this).val());

        var tip = $(this).attr("tip");

        var reg = new RegExp(regStr);

        if(value != null && value != ""){

            if(!reg.test(value)){

                $(this).next("span").html(tip);

                isSubmit = false;

                return false;

            }

        }

    });

    return isSubmit;

});

3. 使用离焦事件做友好的提示

$("input[reg2]").blur(function(){

    var regStr = $(this).attr("reg2");

    var value = $.trim($(this).val());

    var tip = $(this).attr("tip");

    var reg = new RegExp(regStr);

    if(!reg.test(value)){

        $(this).next("span").html(tip);

    }else{

        $(this).next("span").html("");

    }

});

4. 表单的二次提交处理

l 锁屏


l 锁按钮

②商品的查询

商品查询需要组合条件加分页查询


l 组合条件:品牌,审核状态,商品名称,需要动态sql

<select id="queryItemByCondtion" resultMap="BaseResultMap" parameterType="map">

    select *

    from (select a.*, rownum rm

        from (

            select *

                from eb_item ei

<where>

<if test="brandId != null">

       ei.brand_id = #{brandId}  

</if>

<if test="auditStatus != null">

       and ei.audit_status = #{auditStatus}  

</if>

<if test="showStatus != null">

        and ei.show_status = #{showStatus}  

</if>

<if test="itemName != null">

        and ei.item_name like '%${itemName}%'

</if>

</where>

                order by ei.item_id desc) a

<![CDATA[

where rownum < #{endNum}) b

        where b.rm > #{startNum}

]]>

</select>

-- 查询大于当前页首行号,主要解决 oracle rownum 不支持大于号的问题

select *

from (

    --查询小于当前最大行号的数据

    select rownum rm,a.*

    from (

--第一个select查询所有的业务数据

       select * from eb_item

) a

where rownum < 21) b

where b.rm > 10

l 分页查询


1. 查询结果集的sql,传入开始行数和结束的行数

select *

from (select a.*, rownum rm

     from (

...

        内部sql

         ...

      ) a where rownum < #{endNum}) b

where b.rm > #{startNum}

2. 使用内部sql查询结果集的总条数

3. 使用分页工具类,创建page对象更换每次的数据总条数和当前页数和每页的条数,查询出结果集后把结果集注入到page对象之中

public class Page {

    int totalCount = 0;

    int pageSize = 10;

    int currentPageNo = 1;

    int startNum = 0;

    int endNum = 11;

    public Page(int totalCount, int pageSize, int currentPageNo) {

        super();

        this.totalCount = totalCount;

        this.pageSize = pageSize;

        this.currentPageNo = currentPageNo;

    }

    public int getStartNum(){

        return (currentPageNo - 1) * pageSize;

    }

    public int getEndNum(){

        return currentPageNo * pageSize + 1;

    }

    public int getTotalPage(){

        int totalPage = totalCount/pageSize;

        if(totalPage == 0 || totalCount%pageSize != 0){

            totalPage ++;

        }

        return totalPage;

    }

    public int getNextPage(){

        if(currentPageNo >= getTotalPage()){

            return currentPageNo;

        }else{

            return currentPageNo + 1;

        }

    }

    public int getPrePage(){

        if(currentPageNo <= 1){

            return currentPageNo;

        }else{

            return currentPageNo - 1;

        }

    }

    List<?> list;

    public List<?> getList() {

        return list;

    }

    public void setList(List<?> list) {

        this.list = list;

    }

    public int getTotalCount() {

        return totalCount;

    }

    public void setTotalCount(int totalCount) {

        this.totalCount = totalCount;

    }

    public int getPageSize() {

        return pageSize;

    }

    public void setPageSize(int pageSize) {

        this.pageSize = pageSize;

    }

    public int getCurrentPageNo() {

        return currentPageNo;

    }

    public void setCurrentPageNo(int currentPageNo) {

        this.currentPageNo = currentPageNo;

    }

    public void setStartNum(int startNum) {

        this.startNum = startNum;

    }

    public void setEndNum(int endNum) {

        this.endNum = endNum;

    }

}

4. 制作前端样式

var currentPageNo = parseInt($("#currentPageNo").val());

var totalCount = parseInt($("#totalCount").val());

var totalPage = parseInt($("#totalPage").val());

$("#pagePiece").html(totalCount);

$("#pageTotal").html(currentPageNo+"/"+totalPage);

if(currentPageNo <= 1){

    $("#previous").hide();

}else{

    $("#previous").show();

}

if(currentPageNo >= totalPage){

    $("#next").hide();

}else{

    $("#next").show();

}

$("#next").click(function(){

    $("#pageNo").val(parseInt(currentPageNo)+1);

    $("#form1").submit();

});

$("#previous").click(function(){

    $("#pageNo").val(parseInt(currentPageNo)-1);

    $("#form1").submit();

});

Oracle  分页sql的描述:


  1.最内层的写查询当前表的全量即可


  2.对于oracle数据库分页需要依赖于rownum,但是rownum不支持大于号,但是支持小于号,可以rownum小于结束行号查询出来一个结果集(在全量的外层套一个select,它的结果集需要把rownum作为结果返回)


  3.在第二步的结果集基础上再做一次查询,查询条件以第二步查询出来的rownum的值作为条件大于开始行号即可

③商品发布

Console和portal是分开部署在两台服务器上,发布需要在console端去控制,但是生成的静态化的文件要发布到portal的工程之中,所以发布的服务要在portal上,但是要在console中来调用,异构之间的调用要使用webservice。


1. 采用cxf的webservice框架来整合spring


2. 在web.xml中来配置cxf的核心servlet

<servlet>

    <servlet-name>cxfServlet</servlet-name>

    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>cxfServlet</servlet-name>

<url-pattern>/services/*</url-pattern>

</servlet-mapping>

3. 创建服务的接口和接口的实现类,注意接口上加上@WebService注解

4. 创建cxf的核心配置文件cxf-servlet.xml,配置带有接口的webservice服务使用<jaxws:server>标签

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"

xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"

xsi:schemaLocation="http://www.springframework.org/schema/beans

          http://www.springframework.org/schema/beans/spring-beans.xsd

            http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd

            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd

            http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">

    <!-- 引入CXF Bean定义如下,早期的版本中使用 -->

    <import resource="classpath:META-INF/cxf/cxf.xml" />

    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <jaxws:server id="publish" address="/publish" serviceClass="cn.itcast.ecps.ws.service.EbItemWSService">

        <jaxws:serviceBean>

            <bean class="cn.itcast.ecps.ws.service.impl.EbItemWSServiceImpl"></bean>

        </jaxws:serviceBean>

    <!-- 输入输出的拦截器 -->

        <jaxws:inInterceptors>

            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>

        </jaxws:inInterceptors>

        <jaxws:outInterceptors>

            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>

        </jaxws:outInterceptors>

    </jaxws:server>

</beans>

5. 修改cxf-servlet.xml的位置,在spring的listener中加载

<listener>

    <listener-class>

        org.springframework.web.context.ContextLoaderListener

    </listener-class>

</listener>

<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

        classpath*:beans.xml,classpath*:cxf-servlet.xml

    </param-value>

</context-param>

6. 启动服务器发布webservice的服务,使用wsdl2java生成客户端的代码

Wsdl2java –d . –p cn.itcast.ecps.ws.stub

http://.........wsdl

?


7. 在客户端调用。

④订单管理模块

1) 流程设计

2) 订单整合activiti工作流

1.activiti流程和spring整合


创建activiti-context.xml文件

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    

    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">

<!-- 数据源 -->

        <property name="dataSource" ref="dataSource" />

        <!-- 配置事务管理器,统一事务 -->

        <property name="transactionManager" ref="txManager" />

        <!-- 设置建表策略 -->

        <property name="databaseSchemaUpdate" value="true" />

    </bean>

    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">

        <property name="processEngineConfiguration" ref="processEngineConfiguration" />

    </bean>

    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />

    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />

    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />

    <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />

</beans>

1. 画流程图


2. 创建流程服务类

package cn.itcast.service.impl;

import java.io.File;

import org.activiti.engine.RepositoryService;

import org.activiti.engine.repository.DeploymentBuilder;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import cn.itcast.service.IWorkFlowService;

//@Service

public class WorkflowServiceImpl implements IWorkFlowService {

    @Autowired

    RepositoryService repositoryService;

    /*public RepositoryService getRepositoryService() {

        return repositoryService;

    }

    public void setRepositoryService(RepositoryService repositoryService) {

        this.repositoryService = repositoryService;

    }*/

    public void deployFlow() {

        //创建发布流程配置对象

        DeploymentBuilder builder = repositoryService.createDeployment();

        //指定流程资源路径

        builder.addClasspathResource("activit-orderflow.bpmn").addClasspathResource("activit-orderflow.png");

        builder.deploy();

    }

}

1. 部署流程

2. 查询业务任务


3. 办理任务

6.项目中哪些功能模块涉及了大数据量访问?你是如何解决的?

系统前台是互联网上的用户访问的,会有大量用户来访问。


假定有 1w 个人打开你的网站来订商品,问你如何解决并发问题 ( 可扩展到任何高并发网站要考虑的并发读写问题 )

问题,1w个人来访问,商品没出去前要保证大家都能看到有商品,不可能一个人在看到商品的时候别人就不能看了。到底谁能抢到,那得看这个人的“运气”(网络快慢等)


其次考虑的问题,并发,1w个人同时点击购买,到底谁能成交?总共只有一张商品。

Update eb_sku t sett.stock = t.stock – 1 where t.sku_id = #{skuId} and t.stock > 0

Update eb_sku t set t.sale = t.sale +1 where t.sku_id = #{skuId}

首先我们容易想到和并发相关的几个方案 : 锁同步

  同步更多指的是应用程序的层面,多个线程进来,只能一个一个的访问,java中指的是syncrinized关键字。锁也有2个层面,一个是java中谈到的对象锁,用于线程同步;另外一个层面是数据库的锁;如果是分布式的系统,显然只能利用数据库端的锁来实现。

Java电子商务后台管理系统项目开发技术 java电商项目介绍_搜索_09

  假定我们采用了同步机制或者数据库物理锁机制,如何保证1w个人还能同时看到有商品,显然会牺牲性能,在高并发网站中是不可取的。使用hibernate后我们提出了另外一个概念:

乐观锁(一定要用)

悲观锁

(即传统的物理锁);采用乐观锁即可解决此问题。乐观锁意思是不锁定表的情况下,利用业务的控制来解决并发问题,这样即保证数据的并发可读性又保证保存数据的排他性,保证性能的同时解决了并发带来的脏数据问题。


hibernate中如何实现乐观锁:

前提:在现有表当中增加一个冗余字段,version版本号, long类型

原理:

1)只有当前版本号》=数据库表版本号,才能提交

2)提交成功后,版本号version ++

实现很简单:在ormapping增加一属性

-lock="version"即可,以下是样例片段 optimistic

<hibernate-mapping>

<class name="com.insigma.stock.ABC" optimistic-lock="version" table="T_Stock" schema="STOCK">

</hibernate-mapping>

更新的时候给版本号字段加上 1 ,然后 UPDATE 会返回一个更新结果的行数,通过这个行数去判断。

Sku_id

sale

Version(乐观锁的标志字段)

1

100

1

7.在做这个项目的时候你碰到了哪些问题?你是怎么解决的?

8.你做完这个项目后有什么收获?

9.你这个项目中使用什么构建的?多模块开发是如何划分的呢?为什么要这么做?

10.你觉得在文件上传功能上面需要注意什么?

11.在你这个项目中,是如何设计商品规格的?

img src='https://s2.51cto.com/images/blog//_64e4259c9e81d86912.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Java电子商务后台管理系统项目开发技术 java电商项目介绍_分布式系统_10' style="width: 694px; visibility: visible;">

12.在这个项目中你是如何实现跨系统调用的?

br> 1、 Ajax,走前台js,通过jsonp来跨域,关于jsonp请参考:

br> jsonp,部署子域名的情况

br> 需要在SpringMVC中扩展MappingJackson2HttpMessageConverter,支持jsonp。跨域问题,因为我们是子域名访问子系统接口的,采用jsonp解决;

br> 掌握spring和Httpclient的集成

13.你这个项目中CMS系统是如何设计的,简单的说一下其设计思想?

14.在这个项目中,你们主要使用什么样的数据格式来进行数据的传输的?你对JSON了解么?能说说JSON对象如何转换成Java对象的?

15.单点系统的设计思想你了解吗?他在系统架构中的作用是什么?位置如何?

img src='https://s2.51cto.com/images/blog//_64e4259cba6e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Java电子商务后台管理系统项目开发技术 java电商项目介绍_搜索_11' style="width: 640px; visibility: visible;">

img src='https://s2.51cto.com/images/blog//_64e4259cd60d075403.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Java电子商务后台管理系统项目开发技术 java电商项目介绍_数据_12' style="width: 604px; visibility: visible;">

16.你们这个项目中订单ID是怎么生成的?我们公司最近打算做一个电商项目,如果让你设计这块,你会考虑哪些问题?

17.各个服务器的时间不统一怎么办?

18.在问题17的基础上,可能存在毫秒级的偏差情况,怎么办?

br>   用户ID+当前系统的时间戳+随机数(3~4位) 问题:太长? 把时间戳中的2014中的20拿掉;

19.你们线上部署时什么样的,能画一下吗?

img src='https://s2.51cto.com/images/blog//_64e4259cf0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Java电子商务后台管理系统项目开发技术 java电商项目介绍_分布式系统_13' style="width: 755px; visibility: visible;">

20.多台tomcat之间的session是怎么同步的?

21.如何解决并发问题的?

22.你们生产环境的服务器有多少台?

23.数据备份是怎么做的?有没有做读写分离?

24.你们服务器不止一台吧,那么你们的session是怎么同步的?

25.你们使用什么做支付的?如果使用易宝做支付,请求超时了怎么处理?

br> ②给订单标识付款异常状态,并且发出警告(邮件、短信)给相关人员。

26.

你刚才不是说付款成功后易宝会有数据返回吗?如果付款后易宝没有返回,或者返回超时了,但是钱又已经扣了,你怎么办?

br> ②使用定时任务处理;

27.

你们怎么做退款功能的,要多长时间才能把钱退回给用户?

28.你前台

portal

采用

4

台服务器集群部署 那你数据库有几台服务器?如果前台高并发访问性能提上去了,那数据库会不会造成一个瓶颈,这一块你是怎么处理的?

29.你购物车存cookie

里边可以实现不登录就可以使用购物车,那么我现在没有登录把商品存购物车了,然后登录了, 然后我换台电脑并且登录了还能不能看见我购物车的信息?如果看不到怎么做到

cookie

同步,就是在另外一台电脑上可以看到购物车信息

img src='https://s2.51cto.com/images/blog//_64e4259d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Java电子商务后台管理系统项目开发技术 java电商项目介绍_搜索_14' style="width: 798px; visibility: visible;">

30.点一个链接访问到一个页面,这个页面上既有静态数据,又有动态数据(需要查数据库的),打开这个页面的时候就是很慢但是也能打开。怎么解决这个问题,怎么优化?

img src='https://s2.51cto.com/images/blog//_64e4259d37c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Java电子商务后台管理系统项目开发技术 java电商项目介绍_数据_15' style="width: 684px; visibility: visible;">

31.如果用户一直向购物车添加商品怎么办?并且他添加一次你查询一次数据库?互联网上用户那么多,这样会对数据库造成很大压力你怎么办?

img src='https://s2.51cto.com/images/blog//_64e4259d59f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Java电子商务后台管理系统项目开发技术 java电商项目介绍_数据_16' style="width: 530px; visibility: visible;">

img src='https://s2.51cto.com/images/blog//_64e4259d8799b53528.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Java电子商务后台管理系统项目开发技术 java电商项目介绍_搜索_17' style="width: 683px; visibility: visible;">

32.做促销时,商品详情页面的静态页面如何处理价格问题。

img src='https://s2.51cto.com/images/blog//_64e4259da4b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='Java电子商务后台管理系统项目开发技术 java电商项目介绍_搜索_18' style="width: 773px; visibility: visible;">

33.商品搜索框的搜索联想如何实现?比如输入“羽绒” ,然后输入框下会列出很多关于羽绒服的搜索条件 “羽绒服男正品折扣 ”等等。

34.一个电商项目,在tomcat里面部署要打几个war包?

35.你说你用了

redis

缓存,你

redis

存的是什么格式的数据,是怎么存的?

36.购物车知识补充(在设计购物车时需要注意哪些细节)

①购物车是消费的最后一环

②购物车隐含的对比收藏功能

③购物车的重交易属性

①登录环节不要放在加入购物车前

②自动勾选用户本次挑选的商品

③陈列展示,注意沉底商品

④归类展示,可能增加购买

⑤价格和优惠的提醒

①还差一点就可以有优惠啦!

②提醒用户有些商品你真的可以买了

有关调查显示,加入购物车而没有购买的,在4小时以内提醒用户,会有27%的唤醒率哦!

所以需要提醒的几个点有:

生成订单但是还没支付的

商品有优惠信息

商品库存不足的

小讯
上一篇 2025-01-02 07:35
下一篇 2025-01-02 13:10

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/2410.html