计算机毕业设计选题推荐-基于协同过滤算法的商品推荐系统-Java项目实战

作者主页:IT毕设梦工厂✨
个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。
☑文末获取源码☑
精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目

一、前言

随着互联网的普及和电子商务的快速发展,消费者每天都会面临大量的商品信息。在这样的信息海洋中,如何找到自己需要的商品,如何提高购物的效率和满意度,成为了消费者面临的重要问题。同时,对于商家来说,如何将自己的商品推荐给合适的消费者,如何提高销售的效率和满意度,也成为了他们面临的重要问题。因此,基于协同过滤算法的商品推荐系统应运而生,旨在解决这些问题。
现有的商品推荐系统主要采用基于内容的推荐和基于协同过滤的推荐。基于内容的推荐主要是根据用户的历史行为和兴趣,推荐类似的内容。这种方法在很大程度上可以满足用户的个性化需求,但往往存在新用户的问题,即对于没有历史行为的用户,无法进行推荐。而基于协同过滤的推荐主要是根据用户和商品之间的相似度进行推荐,可以解决新用户的问题,但往往存在冷启动问题,即对于新加入的商品或者用户,由于没有足够的相似度数据,无法进行推荐。同时,现有的推荐系统往往只考虑了用户和商品之间的相似度,而忽略了其他因素的影响,如用户的社会关系、时间因素等。因此,基于协同过滤算法的商品推荐系统具有重要的研究意义。
本课题旨在研究基于协同过滤算法的商品推荐系统,解决现有推荐系统中存在的问题,提高推荐的准确度和满意度。具体来说,本课题的研究目的包括:
研究基于协同过滤的商品推荐算法,解决新用户和冷启动问题;
考虑用户的社会关系和时间因素对推荐的影响;
实现一个完整的商品推荐系统,包括用户管理、商家管理、商品信息管理、商品订单管理、客服聊天管理、论坛管理、商品资讯管理和基础数据管理等功能;
对系统进行测试和分析,验证其可行性。
本课题的研究意义在于:
提高推荐的准确度和满意度:通过基于协同过滤的推荐算法和考虑用户的社会关系和时间因素,可以提高推荐的准确度和满意度,从而提高用户的购物体验和商家的销售效益;
解决新用户和冷启动问题:通过基于协同过滤的推荐算法,可以解决新用户和冷启动问题,从而使得系统可以更好地服务于新用户和新的商品;
实现完整的商品推荐系统:通过对用户管理、商家管理、商品信息管理、商品订单管理、客服聊天管理、论坛管理、商品资讯管理和基础数据管理等功能的实现,可以提供一个完整的商品推荐系统解决方案;
对电子商务的发展具有重要意义:本课题的研究成果可以应用于实际的电子商务系统中,对于提高电子商务的销售效益和服务质量具有重要意义。

二、开发环境

  • 开发语言:Java
  • 数据库:MySQL
  • 系统架构:B/S
  • 后端:SpringBoot
  • 前端:Vue

三、系统功能模块

  • 角色:用户、商家、管理员
  • 功能:
    用户
    论坛、商品资讯、商家信息、商品信息、购物车、在线客服、收货地址管理、商品订单管理;
    商家
    商品信息管理、商品订单管理、论坛、商品资讯;
    管理员
    用户管理、商家管理、商品信息管理、商品订单管理、客服聊天管理、论坛管理、商品资讯管理、基础数据管理。

四、系统界面展示

  • 基于协同过滤算法商品推荐系统界面展示:
    基于协同过滤算法商品推荐系统-商品详情
    基于协同过滤算法商品推荐系统-购物车
    基于协同过滤算法商品推荐系统-我的商品订单
    基于协同过滤算法商品推荐系统-商品信息管理
    基于协同过滤算法商品推荐系统-商品订单管理
    基于协同过滤算法商品推荐系统-论坛管理

五、部分代码设计

  • Java项目实战-代码参考:
@RestController //定义为控制器 返回JSON类型数据
@RequestMapping(value = "/admin", produces = "application/json; charset=utf-8")// 设置请求路径
@CrossOrigin // 允许跨域访问其资源
public class AdminController { // extends BaseController {
	// TODO Auto-generated method stub

	@Autowired // @Autowired的作用是自动注入依赖的ServiceBean
	private AdminService adminService;

	@PostMapping("editpwd.action") // 定义访问方法路径
	public Map<String, Object> editpwd(@RequestBody String jsonStr) {
		JSONObject obj = JSONObject.parseObject(jsonStr); // 将传递的Json参数 转换成对象类型
		String adminid = obj.getString("adminid"); //主键
		String password = obj.getString("password"); // 原密码
		String repassword = obj.getString("repassword"); // 新密码
		Map<String, Object> map = new HashMap<String, Object>(); // 定义Map 其为返回值
		Admin admin = this.adminService.getAdminById(adminid); //
		if (password.equals(admin.getPassword())) { // 校验原密码是否正确
			admin.setPassword(repassword); // 重置密码
			this.adminService.updateAdmin(admin); // 更新数据
			map.put("success", true);
			map.put("message", "修改成功");
		} else {
			map.put("success", false);
			map.put("message", "旧密码错误");
		}
		return map;
	}


	// 预处理 获取基础参数
	@GetMapping(value = "createAdmin.action")
	public Map<String, Object> createAdmin() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("today", VeDate.getStringDateShort());
		return map;
	}

	// 新增管理员
	@PostMapping(value = "insertAdmin.action")
	public Map<String, Object> insertAdmin(@RequestBody String jsonStr) {
		Map<String, Object> map = new HashMap<String, Object>();
		JSONObject obj = JSONObject.parseObject(jsonStr); // 将JSON字符串转换成object
		Admin admin = new Admin();
		admin.setUsername(obj.getString("username")); //  为用户名赋值
		admin.setPassword(obj.getString("password")); //  为密码赋值
		admin.setRealname(obj.getString("realname")); //  为姓名赋值
		admin.setContact(obj.getString("contact")); //  为联系方式赋值
		admin.setAddtime(VeDate.getStringDateShort()); // 为创建日期赋值 
		int num = this.adminService.insertAdmin(admin);
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "保存成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "保存失败");
		}
		return map;
	}

	// 按主键删除一个管理员
	@GetMapping(value = "deleteAdmin.action")
	public Map<String, Object> deleteAdmin(String id) {
		Map<String, Object> map = new HashMap<String, Object>();
		int num = this.adminService.deleteAdmin(id);
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "删除成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "删除失败");
		}
		return map;
	}

	// 按主键批量删除管理员
	@PostMapping(value = "deleteAdminByIds.action")
	public Map<String, Object> deleteAdminByIds(@RequestBody String[] ids) {
		int num = 0;
		for (String adminid : ids) {
			num += this.adminService.deleteAdmin(adminid);
		}
		Map<String, Object> map = new HashMap<String, Object>();
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "删除成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "删除失败");
		}
		return map;
	}

	// 修改管理员
	@PostMapping(value = "updateAdmin.action")
	public Map<String, Object> updateAdmin(@RequestBody String jsonStr) {
		JSONObject obj = JSONObject.parseObject(jsonStr); // 将JSON字符串转换成object
		Admin admin = this.adminService.getAdminById(obj.getString("adminid")); // 获取object中adminid字段
		admin.setUsername(obj.getString("username")); //  为用户名赋值
		admin.setRealname(obj.getString("realname")); //  为姓名赋值
		admin.setContact(obj.getString("contact")); //  为联系方式赋值

		Map<String, Object> map = new HashMap<String, Object>();
		int num = this.adminService.updateAdmin(admin);
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "修改成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "修改失败");
		}
		return map;
	}

	// 查询全部管理员数据 在下拉菜单中显示
	@GetMapping(value = "getAllAdmin.action")
	public List<Admin> getAllAdmin() {
		return this.adminService.getAllAdmin();
	}

	// 按关键字查询管理员数据 在下拉菜单中显示
	@GetMapping(value = "getAdminMap.action")
	public Map<String, Object> getAdminMap(String keywords) {
		Map<String, Object> map = new HashMap<String, Object>();
		Admin admin = new Admin();
		admin.setUsername(keywords);
		List<Admin> list = this.adminService.getAdminByLike(admin);
		map.put("data", list);
		return map;
	}

	// 通过AJAX在表格中显示管理员数据
	@GetMapping(value = "getAdminByPage.action")
	public Map<String, Object> getAdminByPage(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Admin> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		List<Admin> list = this.adminService.getAllAdmin();
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 通过AJAX在表格中显示管理员数据
	@GetMapping(value = "getAdmin.action")
	public Map<String, Object> getAdmin(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit, String keywords) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Admin> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		Admin admin = new Admin();
		admin.setUsername(keywords);
		List<Admin> list = this.adminService.getAdminByLike(admin);
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 通过AJAX在表格中显示管理员数据
	@GetMapping(value = "getOwnerAdmin.action")
	public Map<String, Object> getOwnerAdmin(@RequestParam(defaultValue = "1") Integer page,
			@RequestParam(defaultValue = "10") Integer limit, String id) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Admin> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		Admin admin = new Admin();
		//admin.setAdminid(id);
		List<Admin> list = this.adminService.getAdminByLike(admin);
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 按主键查询管理员数据
	@GetMapping(value = "getAdminById.action")
	public Admin getAdminById(String id) {
		Admin admin = this.adminService.getAdminById(id);
		return admin;
	}
}
@RestController //定义为控制器 返回JSON类型数据
@RequestMapping(value = "/cart", produces = "application/json; charset=utf-8")// 设置请求路径
@CrossOrigin // 允许跨域访问其资源
public class CartController { // extends BaseController {
	// TODO Auto-generated method stub

	@Autowired // @Autowired的作用是自动注入依赖的ServiceBean
	private CartService cartService;

	// 预处理 获取基础参数
	@GetMapping(value = "createCart.action")
	public Map<String, Object> createCart() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("today", VeDate.getStringDateShort());
		return map;
	}


	// 按主键删除一个购物车
	@GetMapping(value = "deleteCart.action")
	public Map<String, Object> deleteCart(String id) {
		Map<String, Object> map = new HashMap<String, Object>();
		int num = this.cartService.deleteCart(id);
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "删除成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "删除失败");
		}
		return map;
	}

	// 按主键批量删除购物车
	@PostMapping(value = "deleteCartByIds.action")
	public Map<String, Object> deleteCartByIds(@RequestBody String[] ids) {
		int num = 0;
		for (String cartid : ids) {
			num += this.cartService.deleteCart(cartid);
		}
		Map<String, Object> map = new HashMap<String, Object>();
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "删除成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "删除失败");
		}
		return map;
	}

	// 修改购物车
	@PostMapping(value = "updateCart.action")
	public Map<String, Object> updateCart(@RequestBody String jsonStr) {
		JSONObject obj = JSONObject.parseObject(jsonStr); // 将JSON字符串转换成object
		Cart cart = this.cartService.getCartById(obj.getString("cartid")); // 获取object中cartid字段
		cart.setUsersid(obj.getString("usersid")); //  为用户赋值
		cart.setGoodsid(obj.getString("goodsid")); //  为商品赋值
		cart.setNum(obj.getString("num")); //  为数量赋值
		cart.setPrice(obj.getString("price")); //  为单价赋值

		Map<String, Object> map = new HashMap<String, Object>();
		int num = this.cartService.updateCart(cart);
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "修改成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "修改失败");
		}
		return map;
	}

	// 查询全部购物车数据 在下拉菜单中显示
	@GetMapping(value = "getAllCart.action")
	public List<Cart> getAllCart() {
		return this.cartService.getAllCart();
	}

	// 按关键字查询购物车数据 在下拉菜单中显示
	@GetMapping(value = "getCartMap.action")
	public Map<String, Object> getCartMap(String keywords) {
		Map<String, Object> map = new HashMap<String, Object>();
		Cart cart = new Cart();
		cart.setUsersid(keywords);
		List<Cart> list = this.cartService.getCartByLike(cart);
		map.put("data", list);
		return map;
	}

	// 通过AJAX在表格中显示购物车数据
	@GetMapping(value = "getCartByPage.action")
	public Map<String, Object> getCartByPage(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Cart> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		List<Cart> list = this.cartService.getAllCart();
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 通过AJAX在表格中显示购物车数据
	@GetMapping(value = "getCart.action")
	public Map<String, Object> getCart(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit, String keywords) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Cart> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		Cart cart = new Cart();
		cart.setUsersid(keywords);
		List<Cart> list = this.cartService.getCartByLike(cart);
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 通过AJAX在表格中显示购物车数据
	@GetMapping(value = "getUserCart.action")
	public Map<String, Object> getUserCart(@RequestParam(defaultValue = "1") Integer page,
			@RequestParam(defaultValue = "10") Integer limit, String id) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Cart> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		Cart cart = new Cart();
		cart.setUsersid(id);
		List<Cart> list = this.cartService.getCartByLike(cart);
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 通过AJAX在表格中显示购物车数据
	@GetMapping(value = "getOwnerCart.action")
	public Map<String, Object> getOwnerCart(@RequestParam(defaultValue = "1") Integer page,
			@RequestParam(defaultValue = "10") Integer limit, String id) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Cart> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		Cart cart = new Cart();
		//cart.setAdminid(id);
		List<Cart> list = this.cartService.getCartByLike(cart);
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 按主键查询购物车数据
	@GetMapping(value = "getCartById.action")
	public Cart getCartById(String id) {
		Cart cart = this.cartService.getCartById(id);
		return cart;
	}
}
@RestController //定义为控制器 返回JSON类型数据
@RequestMapping(value = "/cate", produces = "application/json; charset=utf-8")// 设置请求路径
@CrossOrigin // 允许跨域访问其资源
public class CateController { // extends BaseController {
	// TODO Auto-generated method stub

	@Autowired // @Autowired的作用是自动注入依赖的ServiceBean
	private CateService cateService;

	// 预处理 获取基础参数
	@GetMapping(value = "createCate.action")
	public Map<String, Object> createCate() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("today", VeDate.getStringDateShort());
		return map;
	}

	// 按主键删除一个商品类型
	@GetMapping(value = "deleteCate.action")
	public Map<String, Object> deleteCate(String id) {
		Map<String, Object> map = new HashMap<String, Object>();
		int num = this.cateService.deleteCate(id);
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "删除成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "删除失败");
		}
		return map;
	}

	// 按主键批量删除商品类型
	@PostMapping(value = "deleteCateByIds.action")
	public Map<String, Object> deleteCateByIds(@RequestBody String[] ids) {
		int num = 0;
		for (String cateid : ids) {
			num += this.cateService.deleteCate(cateid);
		}
		Map<String, Object> map = new HashMap<String, Object>();
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "删除成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "删除失败");
		}
		return map;
	}

	// 修改商品类型
	@PostMapping(value = "updateCate.action")
	public Map<String, Object> updateCate(@RequestBody String jsonStr) {
		JSONObject obj = JSONObject.parseObject(jsonStr); // 将JSON字符串转换成object
		Cate cate = this.cateService.getCateById(obj.getString("cateid")); // 获取object中cateid字段
		cate.setCatename(obj.getString("catename")); //  为类型名称赋值
		cate.setMemo(obj.getString("memo")); //  为备注赋值

		Map<String, Object> map = new HashMap<String, Object>();
		int num = this.cateService.updateCate(cate);
		if (num > 0) {
			map.put("success", true);
			map.put("code", num);
			map.put("message", "修改成功");
		} else {
			map.put("success", false);
			map.put("code", num);
			map.put("message", "修改失败");
		}
		return map;
	}

	// 查询全部商品类型数据 在下拉菜单中显示
	@GetMapping(value = "getAllCate.action")
	public List<Cate> getAllCate() {
		return this.cateService.getAllCate();
	}

	// 按关键字查询商品类型数据 在下拉菜单中显示
	@GetMapping(value = "getCateMap.action")
	public Map<String, Object> getCateMap(String keywords) {
		Map<String, Object> map = new HashMap<String, Object>();
		Cate cate = new Cate();
		cate.setCatename(keywords);
		List<Cate> list = this.cateService.getCateByLike(cate);
		map.put("data", list);
		return map;
	}

	// 通过AJAX在表格中显示商品类型数据
	@GetMapping(value = "getCateByPage.action")
	public Map<String, Object> getCateByPage(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Cate> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		List<Cate> list = this.cateService.getAllCate();
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 通过AJAX在表格中显示商品类型数据
	@GetMapping(value = "getCate.action")
	public Map<String, Object> getCate(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit, String keywords) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Cate> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		Cate cate = new Cate();
		cate.setCatename(keywords);
		List<Cate> list = this.cateService.getCateByLike(cate);
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 通过AJAX在表格中显示商品类型数据
	@GetMapping(value = "getOwnerCate.action")
	public Map<String, Object> getOwnerCate(@RequestParam(defaultValue = "1") Integer page,
			@RequestParam(defaultValue = "10") Integer limit, String id) {
		// 定义一个Map对象 用来返回数据
		Map<String, Object> map = new HashMap<String, Object>();
		Page<Cate> pager = com.github.pagehelper.PageHelper.startPage(page, limit);// 定义当前页和分页条数
		Cate cate = new Cate();
		//cate.setAdminid(id);
		List<Cate> list = this.cateService.getCateByLike(cate);
		// 返回的map中定义数据格式
		map.put("count", pager.getTotal());
		map.put("total", list.size());
		map.put("data", list);
		map.put("code", 0);
		map.put("msg", "");
		map.put("page", page);
		map.put("limit", limit);
		return map;
	}

	// 按主键查询商品类型数据
	@GetMapping(value = "getCateById.action")
	public Cate getCateById(String id) {
		Cate cate = this.cateService.getCateById(id);
		return cate;
	}
}

六、论文参考

  • 计算机毕业设计选题推荐_基于协同过滤算法商品推荐系统-论文参考:
    计算机毕业设计选题推荐_基于协同过滤算法商品推荐系统-论文参考

七、系统视频

基于协同过滤算法商品推荐系统-项目视频:

计算机选题推荐-基于协同过滤算法商品推荐-Java项目实战

结语

计算机毕业设计选题推荐-基于协同过滤算法商品推荐系统-Java项目实战
大家可以帮忙点赞、收藏、关注、评论啦~
源码获取:私信我

精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值