总结这一周的电商项目开发的心得

本文是作者在一周电商项目开发中的心得分享,主要涉及dubbox、zookeeper、angularJS、maven分布式搭建及spring security。dubbox作为服务调用框架,zookeeper作为注册中心,angularJS的双向绑定特性,以及spring security的安全框架都得到了讨论。作者通过实践初步掌握了这些技术,并对其优点进行了阐述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       作为程序员,大家应该都知道,电商项目对程序员的专业水平要求要求很高,我本人也是刚刚工作没多久的技术小白,因为现在做金融项目这一块,做的项目属于内部系统,总体来说对整体的水平没那么多要求,我也是做这个项目好几个月了,接触的后端代码这一块真的很少,主要是前端js的控制跟数据库的编写,可以说本来属于java的代码都拿到前端跟存储过程中实现了,所以自己也认识到了,如果在这样下去,对java只会越来越远,而我,还是很喜欢java的,它的思想,风格都是看着很舒服的。好了,开头算是一个自我介绍吧,下面总结一下本周的学习心得;

本周主要接触了几个技术:dubbox、zookeeper、angularJS、maven分布式搭建框架(ssm)、select2、spring security(安全框架)。

dubbox:有alibaba的dubbo衍变而来,现有当当网进行维护;主要功能用来实现分布式模块之前的服务调用等,

核心注解:@service 在提供方写上    @Reference 在消费方用来注入

提供方通过注册中心,将服务注册到注册中心,这个时候,提供方会暴露自己的信息,比如Ip,

消费方想要什么服务,直接去注册中心里面获取,不管是谁提供的,有就会拿出来。

调用关系说明:

0. 服务容器负责启动,加载,运行服务提供者。

1. 服务提供者在启动时,向注册中心注册自己提供的服务。

2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

 

 Zookeeper:说白了就是一个注册中心,这个要安装在linux上面,不知道window能不能安装。

注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。部署后,直接在linux系统启动即可。

管理中心:这个可以去网上找一个dubbox的源码,编译后将war包放到linux上部署一下就可以访问了,账号跟密码都是root,里面可以很清楚的知道最近的服务调用情况。

因为是刚开始接触这些分布式的技术,所以还只是停留在会用的层次,里面的还有很多深奥的,只能后面学习后才能发布出来。

 

框架搭建:

使用maven技术来创建各自模块,然后全都包含在一个parent中即可。在学习中maven技术可以说有时候还是挺坑人的。还是那句话,只有被坑过了,才会长记性。

前端框架:AngularJS(最好使用版本1)

这个也是前几年很火热的一个前端框架,现在比较流行VUE,React等。其实他们很多公司还是使用AngularJS,所以我就打算先学这个前端框架然后在学线下比较流行的。下面说一说特点:

四大特征:

1  MVC 模式

Angular遵循MVC模式,并鼓励展现,数据,和逻辑组件之间的松耦合.通过依赖注入,Angular为客户端的Web应用带来了传统服务端的服务,例如独立于视图的控制。 因此,后端减少了许多负担,产生了更轻的Web应用。

2   双向绑定

AngularJS是建立在这样的信念上的:即声明式编程应该用于构建用户界面以及编写软件构建,而指令式编程非常适合来表示业务逻辑。框架采用并扩展了传统HTML,通过双向的数据绑定来适应动态内容,双向的数据绑定允许模型和视图之间的自动同步。因此,AngularJS使得对DOM的操作不再重要并提升了可测试性。

3   依赖注入

依赖注入(Dependency Injection,简称DI)是一种设计模式, 指某个对象依赖的其他对象无需手工创建,只需要“吼一嗓子”,则此对象在创建时,其依赖的对象由框架来自动创建并注入进来,其实就是最少知识法则;模块中所有的service和provider两类对象,都可以根据形参名称实现DI.

4   模块化设计

高内聚低耦合法则

1)官方提供的模块           ng、ngRoute、ngAnimate      一般开发使用主要用ng就可以了

2)用户自定义的模块     angular.module('模块名',[ ])

下面贴上我写的一段代码 

service层

app.service("brandService",function($http){
	this.findAll=function(){
		return $http.get("../brand/findAll.do");
	}
	
	this.findPage=function(pageNum,pageSize,searchEntity){
		return $http.post("../brand/findPage.do?pageNum="+pageNum+"&pageSize="+pageSize,searchEntity);
	}
	
	this.add=function(entity){
		return $http.post("../brand/add.do",entity)
	}
	
	this.update=function(entity){
		return $http.post("../brand/update.do",entity)
	}
	
	this.del=function(ids){
		return $http.get("../brand/delete.do?ids="+ids);
	}
	
	this.findOne=function(id){
		return $http.post("../brand/findOne.do?id="+id);
	}
	//品牌下拉列表
	this.selectOptionList=function(){
		return $http.post('../brand/selectOptionList.do');
	} 
});

controller层

app.controller("baseController",function($scope){
	
	//分页控件配置 
	$scope.paginationConf = {
			currentPage: 1, //当前页码
			totalItems: 10, //总条数,初始化
			itemsPerPage: 10, //每一页记录数
			 perPageOptions: [10, 20, 30, 40, 50],  //分页每页的选项数
			 onChange: function(){//当前页面修改页码触发的事件所处理的方法
				 $scope.reloadList();//重新加载
			 }
	}; 
	
	$scope.reloadList=function(){
		$scope.findPage($scope.paginationConf.currentPage,$scope.paginationConf.itemsPerPage)
	}
	
	$scope.ids = [];
	
	$scope.addIds=function($event,id){
		if($event.target.checked){
			$scope.ids.push(id);
		}else{
			var index = $scope.ids.indexOf(id);
			$scope.ids.splice(index,1);
		}
	}
	
	//全选加反选
	$scope.selectAll=function(){
		var arr = $(".checkBoxs");
		for(var i = 0;i<arr.length;i++){
			var target = arr[i];
			if(target.checked){
				target.checked = false;
			}else{
				target.checked = true;
			}
		}
	}
	
	$scope.jsonToString=function(jsonString,key){
		var value = "";
		var arr = JSON.parse(jsonString);
		for(var i=0;i<arr.length;i++){
			if(i==0){
				value = arr[i][key];
			}else{
				value += ","+arr[i][key];
			}
		}
		return value;
	}
});

以及页面展示表格代码:

<tbody>
	<tr ng-repeat="brand in list">		                              
		<td>{{brand.id}}</td>
		<td>{{brand.name}}</td>									     
		<td>{{brand.firstChar}}</td>		                                 
		<td class="text-center">                                           
	</tr>
</tbody>

总体来说,我觉得借鉴于后端的MVC模式开发,我还是很喜欢的,还有就是双向绑定的技术,也很喜欢,只要通过ng-model=" ”来绑定一个变量名,比如输入框绑定了一个变量X,当你在输入框输入了“你好”,这个时候X=“你好”,就不需要像jquery那样进行赋值,很方便。

 

select2插件

在项目开发中一般很容易遇见有下拉框的时候,这个时候就是到了你该用select2的时候了,并且angularJS跟select2有集成------》

angular-select2.js,select2有四种风格,因为我做的时候根据业务,选择了一种可以多选的下拉框格式。

<input select2 select2-model="entity.brandIds" config="brandList" multiple placeholder="选择品牌(可多选)" class="form-control" type="text"/>

config属性代表你的data,这里是获取brandList这个对象中的数据。数据来源是要有规定的格式:如下

$scope.brandList = {
        data: [{id:1,text:'bug'},{id:2,text:'duplicate'},{id:3,text:'invalid'},{id:4,text:'wontfix'}]
    };

必须是一个对象,里面是data:[]格式,数组内单元必须是id跟text作为Key.当然这个只是四个模式中的多选模式;其他不一样。

 

Spring Security 安全框架

Spring Security作为spring全家桶的一员就代表了有与生俱来的优势,可以跟spring完美配合。

它是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

直接看demo吧,注解我都写了

<?xml version="1.0" encoding="UTF-8"?>
<bean:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:bean="http://www.springframework.org/schema/beans" 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/security http://www.springframework.org/schema/security/spring-security.xsd">
	
<!-- 下面是开放的资源入口 -->
	<http pattern="/*.html" security="none"></http>
	<http pattern="/css/**" security="none"></http>
	<http pattern="/img/**" security="none"></http>
	<http pattern="/js/**" security="none"></http>
	<http pattern="/plugins/**" security="none"></http>
	
	
	<!-- http主要配置拦截规则  use-expressions="false"代表不启动SPEL表达式  如果启用SPEL表达式,则角色必须要hasRole('角色名')-->
	<http use-expressions="false">
		<!--pattern /*只包括根目录的下的入口     /**才能包括子目录的入口   -->
		<!--access 就是代表角色,角色名必须用ROLE_开头    -->
		<intercept-url pattern="/**"  access="ROLE_ADMIN"/>
		<!-- 开启表单登录功能 --> 
		<!-- login-page指定登录页面,斜杠开头   default-target-url指定登录成功后跳转页面    authentication-failure-url登录失败跳转的页面  -->
		<form-login login-page="/login.html" default-target-url="/admin/index.html" authentication-failure-url="/login.html" always-use-default-target="true"/>
		<csrf disabled="true"/>
		<headers>
			<frame-options policy="SAMEORIGIN"/><!-- 允许使用框架页面iframe -->
		</headers>
		<logout /><!-- 一键退出系统功能  -->
	</http>
	
	
	<!-- 认证管理器 -->
	<authentication-manager>
		<authentication-provider user-service-ref="userDetailService">	
			<password-encoder ref="bcryptEncoder"></password-encoder>
		</authentication-provider>	
	</authentication-manager>
		
	<!-- 认证类 -->
	<beans:bean id="userDetailService" class="com.xiayu.service.UserDetailsServiceImpl">
		<beans:property name="sellerService" ref="sellerService"></beans:property>
	</beans:bean>
	
	
	<!-- CSRF-TOKEN  防止恶意攻击  只能jsp页面才会产生或者系统生成的login页面,所以我们要关闭该功能 -->
	
</bean:beans>

今天学习了这个框架,还是觉得很有魅力的,值!

最重要的是,这个框架提供了一种加密算法,比MD5好很多。

BCrypt加密算法:为什么说这么好呢?因为同一个密码,每次注册到数据加密成了不同的字符,所以相当于更加了一层干扰,更加安全,而你验证密码登录时,只要在配置里面说明你是要这个加密算法进行验证的即可,大大方便工作效率,也提升了安全性,赞一个。好了,差不多了,这一周也算学习了挺多的,下周再来分享给大家!

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值