二十三、商城 - 商品录入-新增商品(11)

article/2025/9/18 10:21:57

目录 🌻🌻

  • 一、商品录入【选择商品分类】
    • 1.1 需求分析
    • 1.2 准备工作
    • 1.3 代码实现
      • 1.3.1 一级分类下拉选择框
      • 1.3.2 二级分类下拉选择框
      • 1.3.3 三级分类下拉选择框
      • 1.3.4 读取模板ID
  • 二、商品录入【品牌选择】
    • 2.1 需求分析
    • 2.2 代码实现
  • 三、商品录入【扩展属性】
    • 3.1 需求分析
    • 3.2 代码实现
  • 四、商品录入【规格选择】
    • 4.1 需求分析
    • 4.2 代码实现
      • 4.2.1 显示规格选项列表
      • 4.2.2 保存选中规格选项
  • 五、商品录入【SKU商品信息】
    • 5.1 需求分析
    • 5.2 前端代码
      • 5.2.1 生成SKU列表(深克隆)
      • 5.2.2 显示SKU列表
    • 5.3 【保存】后端代码
  • 六、商品录入【是否启用规格】
    • 6.1 需求分析
    • 6.2 前端代码
    • 6.3 后端代码
    • 6.4 解决重复录入选择图片失败问题

一、商品录入【选择商品分类】

1.1 需求分析

在商品录入界面实现商品分类的选择(三级分类)效果如下:

在这里插入图片描述

当用户选择一级分类后,二级分类列表要相应更新,当用户选择二级分类后,三级列表要相应更新。

1.2 准备工作

  1. copy 生成得 youlexuan_manager_web下的 ItemCatController到 youlexuan_shop_web工程中
  2. 再 copy itemCatService.js 到 youlexuan_shop_web

在这里插入图片描述

  1. 在 goodsController.js 中引入 itemCatService

在这里插入图片描述

  1. 在 goods_edit.html 中引入下面js
<script type="text/javascript"  src="../js/service/itemCatService.js"></script>

在这里插入图片描述

1.3 代码实现

1.3.1 一级分类下拉选择框

在goodsController增加代码

//查询一级分类$scope.selectItemCat1List = function () {itemCatService.findByParentId(0).success(function (response) {$scope.itemCat1List = response;})}

页面加载调用该方法 selectItemCat1List

在这里插入图片描述

修改goods_edit.html一级分类下拉选择框

在这里插入图片描述

<select class="form-control"ng-model="entity.goods.category1Id" ng-options="item.id as item.name for item in itemCat1List"><option></option>
</select>

ng-options属性可以在表达式中使用数组或对象来自动生成一个select中的option列表。ng-options与ng-repeat很相似,很多时候可以用ng-repeat来代替ng-options。但是ng-options提供了一些好处,例如减少内存提高速度,以及提供选择框的选项来让用户选择。

运行效果如下 :

在这里插入图片描述

1.3.2 二级分类下拉选择框

在goodsController增加代码:

//在当前一级分类中查询二级分类
$scope.$watch('entity.goods.category1Id',function (newValue,oldValue) {//判断一级分类有选择具体分类值,在去获取二级分类if(newValue){//根据选择的值,查询二级分类itemCatService.findByParentId(newValue).success(function (response) {$scope.itemCat2List = response;$scope.itemCat3List = {};//第二次选一级则二三置空,选二,三置空})}});

$watch方法用于监控某个变量的值,当被监控的值发生变化,就自动执行相应的函数。
修改goods_edit.html中二级分类下拉框

<td><select class="form-control select-sm" ng-model="entity.goods.category2Id" ng-options="item.id as item.name for item in itemCat2List"></select>
</td>

1.3.3 三级分类下拉选择框

//在当前二级分类中查询三级分类
$scope.$watch('entity.goods.category2Id',function (newValue,oldValue) {//判断二级分类有选择具体分类值,在去获取三级分类if(newValue){//根据选择的值,查询二级分类itemCatService.findByParentId(newValue).success(function (response) {$scope.itemCat3List = response;})}})

修改goods_edit.html中三级分类下拉框

<td><select class="form-control select-sm" ng-model="entity.goods.category3Id" ng-options="item.id as item.name for item in itemCat3List"></select>
</td>

最终效果:
在这里插入图片描述

1.3.4 读取模板ID

在goodsController增加代码:

//查询三级分类时同步显现模板ID
$scope.$watch('entity.goods.category3Id',function (newValue,oldValue) {if(newValue){itemCatService.findOne(newValue).success(function (response) {$scope.entity.goods.typeTemplateId = response.typeId;})}})

在 goods_edit.html显示模板ID

<td>模板ID:{{entity.goods.typeTemplateId}}
</td>

在这里插入图片描述

二、商品录入【品牌选择】

2.1 需求分析

在用户选择商品分类后,品牌列表要根据用户所选择的分类进行更新。具体的逻辑是根据用户选择的三级分类找到对应的商品类型模板,商品类型模板中存储了品牌的列表json数据。

2.2 代码实现

  1. 在 youlexuan_shop_web 工程创建 TypeTemplateController (可从运营商后台拷贝)
  2. 在youlexuan_shop_web工程创建 typeTemplateService.js (可从运营商后台拷贝)

在这里插入图片描述

  1. 在goodsController引入 typeTemplateService 并新增代码

在这里插入图片描述

//显示品牌
//模板ID选择后  更新品牌列表
$scope.$watch('entity.goods.typeTemplateId',function (newValue,oldValue) {if(newValue){typeTemplateService.findOne(newValue).success(function (response) {$scope.typeTemplate = response;//获取类型模板$scope.typeTemplate.brandIds = JSON.parse($scope.typeTemplate.brandIds);//品牌列表});}
})

在页面goods_edit.html 引入js

<script type="text/javascript" src="../js/service/typeTemplateService.js"></script>

在这里插入图片描述
添加品牌选择框

<div class="col-md-10 data"><select class="form-control" ng-model="entity.goods.brandId" ng-options="item.id as item.text for item in typeTemplate.brandIds"></select>
</div>

在这里插入图片描述

最终测试:

在这里插入图片描述

三、商品录入【扩展属性】

3.1 需求分析

在商品录入实现扩展属性的录入。

在这里插入图片描述

3.2 代码实现

修改goodsController.js ,在用户更新模板ID时,读取模板中的扩展属性赋给商品的扩展属性。

//扩展属性
$scope.entity.goodsDesc.customAttributeItems = JSON.parse($scope.typeTemplate.customAttributeItems)

在这里插入图片描述
修改goods_edit.html

<!--扩展属性-->
<div class="tab-pane" id="customAttribute">
{{entity.goodsDesc.customAttributeItems}} <!--测试前台显示-->
<div class="row data-type"><div ng-repeat="pojo in entity.goodsDesc.customAttributeItems"><div class="col-md-2 title">{{pojo.text}}</div><div class="col-md-10 data"><input class="form-control"  ng-model="pojo.value"  placeholder="{{pojo.text}}"></div></div>
</div>
</div>

在这里插入图片描述

最终效果显示(注:当输入值才会显示value):

在这里插入图片描述

四、商品录入【规格选择】

在这里插入图片描述

4.1 需求分析

显示规格及选项列表(复选框)如下图,并保存用户选择的结果

在这里插入图片描述

4.2 代码实现

4.2.1 显示规格选项列表

由于模板中只记录了规格名称,而我们除了显示规格名称还是显示规格下的规格选项,所以我们需要在后端扩充方法。

(1)在youlexuan_sellergoods_interface 的 TypeTemplateService.java 新增方法定义

/** * 返回指定模板 id 的规格列表 * @return */public List<Map> findSpecList(Long id);

(2)在 youlexuan_sellergoods_service 的 TypeTemplateServiceImpl.java 实现新增的方法

@Autowired
private TbSpecificationOptionMapper tbSpecificationOptionMapper;/*** 返回指定模板 id 的规格列表 * @return*/
@Override
public List<Map> findSpecList(Long id) {//根据模板 id 获取对应模板对象TbTypeTemplate tbTypeTemplate = typeTemplateMapper.selectByPrimaryKey(id);//从模板对象获取规格属性String specIds = tbTypeTemplate.getSpecIds();//[{"id":27,"text":"网络"},{"id":32,"text":"机身内存"}]转成json对象形式List<Map> mapList = JSON.parseArray(specIds, Map.class);//遍历规格集合for (Map map : mapList) {//[{"id":27,"text":"网络"},{"id":32,"text":"机身内存"}]根据转的key获得mapLong specId = new Long((Integer) map.get("id"));//根据规格 id 获取规格选项TbSpecificationOptionExample tbSpecificationOptionExample = new TbSpecificationOptionExample();TbSpecificationOptionExample.Criteria criteria = tbSpecificationOptionExample.createCriteria();criteria.andSpecIdEqualTo(specId);List<TbSpecificationOption> tbSpecificationOptions = tbSpecificationOptionMapper.selectByExample(tbSpecificationOptionExample);map.put("options",tbSpecificationOptions);}return mapList;
}

(3)在 youlexuan_shop_web 的 TypeTemplateController.java 新增方法

@RequestMapping("/findSpecList")
public List<Map> findSpecList(Long id){return typeTemplateService.findSpecList(id);
}

后台测试:http://localhost:9102/typeTemplate/findSpecList.do?id=51

在这里插入图片描述
注:测试的时候要测表 tb_type_template 中id 存在的,不然回报 500

在这里插入图片描述

(4)前端代码:修改 youlexuan_shop_web 的 typeTemplateService.js

//获取规格和规格选项
this.findSpecList = function (id) {return $http.get('../typeTemplate/findSpecList.do?id='+id);}

(5)修改 youlexuan_shop_web 的 goodsController.js

//规格和规格选项
typeTemplateService.findSpecList(newValue).success(function (response) {$scope.specList = response;
});

在这里插入图片描述
(6)修改 goods_edit.html 页面

<div class="row data-type"><div ng-repeat="pojo in specList"><div class="col-md-2 title">{{pojo.text}}</div><div class="col-md-10 data"><span ng-repeat="option in pojo.options"><input type="checkbox">{{option.optionName}}</span></div></div>
</div>

在这里插入图片描述

前台测试 :http://localhost:9102/shoplogin.html

在这里插入图片描述

4.2.2 保存选中规格选项

注:此标题 js 理解就行,因为有点复杂,想要实现,直接 copy 我的 code 就行

我们需要将用户选中的选项保存在 tb_goods_desc 表的 specification_items 字段中,定义 json 格式如下:

[{“attributeName”:”规格名称”,”attributeValue”:[“规格选项 1”,“规格选项 2”.... ] } , .... ]

(1)在 baseController.js 增加代码

//从集合中按照key查询对象
$scope.searchObjectByKey=function(list,key,keyValue){for(var i=0;i<list.length;i++){if(list[i][key]==keyValue){return list[i];}}return null;
}

(2)在 goodsController.js 增加代码

$scope.entity = {goods:{},goodsDesc:{itemImages:[],specificationItems:[]},itemList:[]};
$scope.updateSpecAttribute=function($event,name,value){//搜索规格选项,看指定规格是否存在  event 事件 name规格名称 value 规格选项var object= $scope.searchObjectByKey($scope.entity.goodsDesc.specificationItems ,'attributeName', name);//如果规格存在if(object!=null){//判断复选框选中状态if($event.target.checked ){//复选框选中,把对应的规格选项值插入当前规格对应的规格选项数组object.attributeValue.push(value);}else{//复选框取消勾选object.attributeValue.splice( object.attributeValue.indexOf(value) ,1);//移除选项//如果选项都取消了,将此条记录移除if(object.attributeValue.length==0){$scope.entity.goodsDesc.specificationItems.splice($scope.entity.goodsDesc.specificationItems.indexOf(object),1);}}}else{
//首次选中某个规格,添加规格及对应选中的规格值
$scope.entity.goodsDesc.specificationItems.push({"attributeName":name,"attributeValue":[value]});}
}

在这里插入图片描述

在这里插入图片描述

(3)在goods_edit.html调用方法

<span ng-repeat="option in pojo.options"><input type="checkbox" ng-click="updateSpecAttribute($event,pojo.text,option.optionName)">{{option.optionName}}
</span>

在这里插入图片描述

测试 http://localhost:9102/admin/index.html

在这里插入图片描述

五、商品录入【SKU商品信息】

5.1 需求分析

基于上一步已经完成了规格选择,根据选择的规格录入商品的SKU信息,当用户选择相应的规格,下面的SKU列表就会自动生成,如下图:

在这里插入图片描述
实现思路:实现思路:

  1. 我们先定义一个初始的不带规格名称的集合,只有一条记录。
  2. 循环用户选择的规格,根据规格名称和已选择的规格选项对原集合进行扩充,添加规格名称和值,新增的记录数与选择的规格选项个数相同

生成的顺序如下图:

在这里插入图片描述

5.2 前端代码

5.2.1 生成SKU列表(深克隆)

注:此标题 js 理解就行,因为有点复杂,想要实现,直接 copy 我的 code 就行

(1)在goodsController.js实现创建sku列表的方法

//创建SKU列表
$scope.createItemList=function(){//spec 存储sku对应的规格$scope.entity.itemList=[{spec:{},price:0,num:99999,status:'0',isDefault:'0' } ];//初始//定义变量 items指向 用户选中规格集合//[{"attributeName":"网络制式","attributeValue":["移动3G","移动4G"]},{"attributeName":"屏幕尺寸","attributeValue":["6寸","5寸"]}]var items=  $scope.entity.goodsDesc.specificationItems;//遍历用户选中规格集合for(var i=0;i< items.length;i++){//编写增加sku规格方法addColumn 参数1:sku规格列表  参数2:规格名称  参数3:规格选项$scope.entity.itemList = addColumn( $scope.entity.itemList,items[i].attributeName,items[i].attributeValue );}
};//添加列值addColumn=function(list,columnName,conlumnValues){var newList=[];//新的集合//遍历sku规格列表for(var i=0;i<list.length;i++){//读取每行sku数据,赋值给遍历oldRowvar oldRow= list[i];//遍历规格选项for(var j=0;j<conlumnValues.length;j++){//深克隆当前行sku数据为 newRowvar newRow= JSON.parse( JSON.stringify( oldRow )  );//深克隆//在新行扩展列(列名是规格名称),给列赋值(规格选项值)newRow.spec[columnName]=conlumnValues[j];//保存新sku行到sku新集合newList.push(newRow);}}return newList;
}

部分截图:

在这里插入图片描述

(2)在更新规格属性后调用生成SKU列表的方法

在这里插入图片描述
显示效果如下:

在这里插入图片描述

5.2.2 显示SKU列表

goods_edit.html页面上绑定SKU列表

<table class="table table-bordered table-striped table-hover dataTable"><thead><tr><th class="sorting" ng-repeat="item in entity.goodsDesc.specificationItems">{{item.attributeName}}</th><th class="sorting">价格</th><th class="sorting">库存</th><th class="sorting">是否启用</th><th class="sorting">是否默认</th></tr></thead><tbody><tr ng-repeat="pojo in entity.itemList"><td ng-repeat="item in entity.goodsDesc.specificationItems">{{pojo.spec[item.attributeName]}}</td><td><input class="form-control" ng-model="pojo.price"  placeholder="价格"></td><td><input class="form-control" ng-model="pojo.num" placeholder="库存数量"></td><td><input type="checkbox" ng-model="pojo.status" ng-true-value="1" ng-false-value="0" ></td><td><input type="checkbox" ng-model="pojo.isDefault" ng-true-value="1" ng-false-value="0"></td></tr></tbody>
</table>

在这里插入图片描述

没有选规格选项时显示 👇🏾👇🏾

在这里插入图片描述

选规格选项时显示 👇🏾👇🏾

在这里插入图片描述

5.3 【保存】后端代码

(1)在GoodsServiceImpl 添加属性

	//商品录入保存@Autowiredprivate TbItemMapper itemMapper;@Autowiredprivate TbBrandMapper brandMapper;@Autowiredprivate TbItemCatMapper itemCatMapper;@Autowiredprivate TbSellerMapper sellerMapper;
//SKU商品信息的保存
for(TbItem item :goods.getItemList()){//标题String title= goods.getGoods().getGoodsName();Map<String,Object> specMap = JSON.parseObject(item.getSpec());for(String key:specMap.keySet()){title+=" "+ specMap.get(key);}item.setTitle(title);item.setGoodsId(goods.getGoods().getId());//商品SPU编号item.setSellerId(goods.getGoods().getSellerId());//商家编号item.setCategoryid(goods.getGoods().getCategory3Id());//商品分类编号(3级)item.setCreateTime(new Date());//创建日期item.setUpdateTime(new Date());//修改日期//品牌名称TbBrand brand = brandMapper.selectByPrimaryKey(goods.getGoods().getBrandId());item.setBrand(brand.getName());//分类名称TbItemCat itemCat = itemCatMapper.selectByPrimaryKey(goods.getGoods().getCategory3Id());item.setCategory(itemCat.getName());//商家名称TbSeller seller = sellerMapper.selectByPrimaryKey(goods.getGoods().getSellerId());item.setSeller(seller.getNickName());//图片地址(取spu的第一个图片)List<Map> imageList = JSON.parseArray(goods.getGoodsDesc().getItemImages(), Map.class) ;if(imageList.size()>0){item.setImage ( (String)imageList.get(0).get("url"));}itemMapper.insert(item);
}

在这里插入图片描述

六、商品录入【是否启用规格】

6.1 需求分析

在规格面板添加是否启用规格,当用户没有选择该项,将原来的规格面板和SKU列表隐藏,用户保存商品后只生成一个SKU.

在这里插入图片描述

6.2 前端代码

goods_edit.html是否启用规格复选框处理,用if指令控制规格面板与SKU列表的显示与隐藏

在这里插入图片描述

<!--规格-->
<div class="tab-pane" id="spec"><div class="row data-type"><div class="col-md-2 title">是否启用规格</div><div class="col-md-10 data"><input type="checkbox"  ng-model="entity.goods.isEnableSpec" ng-true-value="1" ng-false-value="0" ></div></div><p><div ng-if="entity.goods.isEnableSpec==1"> <!--控制规格面板与SKU列表的显示与隐藏-->

6.3 后端代码

修改GoodsServiceImpl的add方法

/*** 增加*/
@Override
public void add(Goods goods) {goods.getGoods().setAuditStatus("0");		goodsMapper.insert(goods.getGoods());	//插入商品表goods.getGoodsDesc().setGoodsId(goods.getGoods().getId());goodsDescMapper.insert(goods.getGoodsDesc());//插入商品扩展数据if("1".equals(goods.getGoods().getIsEnableSpec())){for(TbItem item :goods.getItemList()){//标题String title= goods.getGoods().getGoodsName();Map<String,Object> specMap = JSON.parseObject(item.getSpec());for(String key:specMap.keySet()){title+=" "+ specMap.get(key);}item.setTitle(title);setItemValus(goods,item);itemMapper.insert(item);}		}else{					TbItem item=new TbItem();item.setTitle(goods.getGoods().getGoodsName());//商品SPU+规格描述串作为SKU名称item.setPrice( goods.getGoods().getPrice() );//价格			item.setStatus("1");//状态item.setIsDefault("1");//是否默认			item.setNum(99999);//库存数量item.setSpec("{}");			setItemValus(goods,item);					itemMapper.insert(item);}	
}private void setItemValus(Goods goods,TbItem item) {item.setGoodsId(goods.getGoods().getId());//商品SPU编号item.setSellerId(goods.getGoods().getSellerId());//商家编号item.setCategoryid(goods.getGoods().getCategory3Id());//商品分类编号(3级)item.setCreateTime(new Date());//创建日期item.setUpdateTime(new Date());//修改日期 //品牌名称TbBrand brand = brandMapper.selectByPrimaryKey(goods.getGoods().getBrandId());item.setBrand(brand.getName());//分类名称TbItemCat itemCat = itemCatMapper.selectByPrimaryKey(goods.getGoods().getCategory3Id());item.setCategory(itemCat.getName());//商家名称TbSeller seller = sellerMapper.selectByPrimaryKey(goods.getGoods().getSellerId());item.setSeller(seller.getNickName());//图片地址(取spu的第一个图片)List<Map> imageList = JSON.parseArray(goods.getGoodsDesc().getItemImages(), Map.class) ;if(imageList.size()>0){item.setImage ( (String)imageList.get(0).get("url"));}		
}

在这里插入图片描述
在这里插入图片描述

前台录入测试:👇🏾👇🏾

启动 ① 👇🏾👇🏾
在这里插入图片描述
安装youlexuan_parent 并且 启动 ② 👇🏾👇🏾

在这里插入图片描述

浏览器输入:http://127.0.0.1:9102/shoplogin.html

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看数据库是否有数据:👇🏾👇🏾

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
……

6.4 解决重复录入选择图片失败问题

修改goodsController的保存方法,保存成功后,清空实体对象,保留基本结构

 $scope.entity={ goodsDesc:{itemImages:[],specificationItems:[]}  };

在这里插入图片描述

当前 youlexuan 所有完整代码


http://chatgpt.dhexx.cn/article/x4XHr9LH.shtml

相关文章

java添加功能_商品添加功能的实现

返回的结果&#xff1a; package com.taotao.common.utils; import java.util.List; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; /** * 淘淘商城自定义响应结构 */ public class TaotaoResult { // 定义jackson对象…

把商品添加到购物车的方法

因为抢华为荣耀的缘故&#xff0c;研究了下京东添加商品到购物车的方法&#xff0c;具体步骤如下 一&#xff1a;打开商品页面&#xff0c;找到商品的id 例如这个商品的id就是1056970 二&#xff1a;把链接里面的http://gate.jd.com/InitCart.aspx?pid###&pcount1&pt…

php 商品模块添加商品属性,添加新商品

进入添加商品页后&#xff0c;如图1&#xff0c;2 添加新商品 图1 图2 促销价格前台表现 图3 图4 图5 附加价格前台表现 图6 添加新商品 图7 配件和关联商品前台表现形式 图8 图9 通用信息商品分类&#xff1a;商品分类是必填项&#xff0c;用于帮助客户找到需要的商品。如果您…

添加商品

添加商品 步骤分析: 1.在index.jsp添加一个超链接 跳转到add.jsp 2.add.jsp放入一个表单 3.表单提交到 AddProductServlet 封装数据 调用service完成保存操作 跳转到FindAllServlet (请求转发和重定向) 有表单使用的时候若使用请求转发会出现重复提交 方案1:重定向 …

十七、商品添加

&#xff08;1&#xff09;通过编程式导航跳转到商品添加页面 1. 在List.vue页面。点击添加商品&#xff0c;实现页面跳转 2. 创建商品添加组件Add.vue 3. 为Add组件添加路由 &#xff08;2&#xff09; 渲染添加页面的基本UI结构 使用到Alter警告和Steps 步骤条组件 1. 引入…

(三十)商品管理-添加商品(上传图片)

&#xff08;三十&#xff09;商品管理-添加商品(上传图片) 添加商品(上传图片)1.修改页面上添加连接/store/adminProduct?methodaddUI2.在addUI请求转发到 添加页面3.在表单页面上修改action : /store/addProductServlet提交方式: method"post"添加enctype属性: e…

【VUE项目实战】56、商品添加功能(六)-提交添加的商品

接上篇《55、商品添加功能&#xff08;五&#xff09;-商品内容模块》 上一篇我们完成了商品内容编辑模块的开发&#xff0c;也即是完成了商品所有的信息编辑&#xff0c;本篇我们就来开发提交商品所有信息到后台的功能。 一、要实现的效果 我们要实现点击“添加商品”的按钮…

淘淘商城第30讲——实现商品添加功能

经过上文的学习&#xff0c;我相信大家都应该知道了富文本编辑器的使用方法&#xff0c;我们能走到这步&#xff0c;实属不易&#xff0c;本文终于可以来实现商品添加这个功能了。 在item-add.jsp页面当中&#xff0c;当点击提交按钮后&#xff0c;会触发submitForm方法&#…

密码登录

利用idea实现密码的输入 首先我们要先新建一个页面用于输入账号密码 req.setCharacterEncoding("UTF-8");String LoginNamereq.getParameter("LoginName");String LoginPwdreq.getParameter("LoginPwd");String msg"请输入密码";priva…

SQL Server安全:登录和用户

SQL Server安全&#xff1a;登录和用户 前言 建议配合sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系一起看。 授予 Principal &#xff08;安全主体&#xff09;操作 Securable&#xff08;安全对象&#xff09; 的 Permission&#xff08;权限&…

springboot-security安全登录

一个简单的security安全登录示例 配置环境 添加pom依赖坐标 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version></parent><depe…

如何设计一个安全的登录接口?

Java技术栈 www.javastack.cn 关注阅读更多优质文章 作者&#xff1a;哒哒哒哒打代码链接&#xff1a;juejin.im/post/6859214952704999438 前言 大家学写程序时&#xff0c;第一行代码都是hello world。 但是当你开始学习WEB后台技术时&#xff0c;很多人的第一个功能就是写的…

[OS-Linux] CentOS 7.x 安全登录策略设置

简介 之前用用户名和密码登陆服务器 这样不安全 &#xff0c;用SSH公钥(public key)验证 这个办法能很好的解决 登陆服务器 和安全登陆服务器的特点&#xff1a; 方法 / 步骤 &#x1f510; 一: 证书生成 命令行页面生成 (推荐) 查看执行结果&#xff0c;这时候连续回车即可…

开启QQ登录保护仍被盗号——QQ安全机制全面分析

1、前言 周围总是有些同学QQ被盗号&#xff0c;攻击者盗取账号后会继续去欺骗列表里的好友&#xff0c;形成链式反应。危害比较大。 腾讯QQ安全中心提供了登录保护机制&#xff0c;如图&#xff1a; 这是腾讯为QQ添加第二层保护&#xff0c;在开启登录保护后&#xff0c;盗号者…

使用 PHP 和 MySQL 的安全登录系统

Secure Login System with PHP and MySQL 在本教程中&#xff0c;我将教您如何创建自己的安全 PHP 登录系统。登录表单是您网站的访问者可以用来登录您的网站以访问受限内容&#xff08;例如个人资料页面&#xff09;的表单。我们将利用 MySQL 从数据库中检索帐户数据。 高级…

使用腾讯企业邮箱为什么强烈建议启用安全登录?怎么启用?

腾讯企业邮箱开启安全登录&#xff0c;简单来说就是把企业邮箱账号和微信绑定。启用安全登录和关闭安全登录&#xff0c;主要是登录方式发生了变化。 登录方式&#xff1a; 登录启用前启用后网页端邮箱帐号密码登录/微信扫码登录仅支持微信扫码登录客户端邮箱帐号密码登录仅…

登录安全----双重MD5加密实现安全登录

个人简介&#xff1a; &#x1f4e6;个人主页&#xff1a;肇事司机赵四 &#x1f3c6;学习方向&#xff1a;JAVA后端开发 &#x1f4e3;种一棵树最好的时间是十年前&#xff0c;其次是现在&#xff01; &#x1f9e1;喜欢的话麻烦点点关注喔&#xff0c;你们的支持是我的最大动…

http登录模块加密登录安全登录方法

http请求很容易被截获&#xff0c;在写登录模块时&#xff0c;直接使用明文密码请求&#xff0c;很容易明文密码泄露&#xff1b;若在js页面对密码进行一次加密后在传输&#xff0c;虽不是明文密码&#xff0c;但也完全可以截获加密后的暗文&#xff0c;伪造http请求进行登录。…

安全登录认证

用户登录是任何一个应用系统的基本功能&#xff0c;特别是对于网上银行系统来说&#xff0c;用户登录的安全性尤为重要。如何设计一个网站的安全登录认证程序&#xff0c;是本文主要讨论的问题。 静态密码存在着比较多的安全隐患&#xff0c;攻击者有很多手段获得静态密码&…

Web登录如何确保安全

1、一个普通简单的HTML例子&#xff0c;用户登录信息是不安全的 <form action "http://localhost:8080/Application/login" method "POST"> 用户名&#xff1a;<input id"username" name"username" type"te…