专业技术开发,收藏关注不迷路
一、项目介绍
基于c++的流浪宠物网站使用c++进行开发,实现了宠物在线领养的基本业务。本文首先对用户的需求进行分析,并设计了基于c++的流浪宠物网站的功能业务,随后进行功能实现。作为典型的管理系统,基于c++的流浪宠物网站保证了数据完整性和安全性,同时界面简单,方便用户使用。
关键词:流浪宠物,c++,宠物救助站,在线领养
二、开发环境
开发软件:VS 2017 (版本2017以上即可,不能低于2017)
数据库:SqlServer2008r2(数据库版本无限制,都可以导入)
开发模式:mvc
浏览器:谷歌浏览器
三、功能介绍
基于c++的流浪宠物网站主要为双方提供宠物在线领养的平台,从用户角度划分,包括管理员和会员。
从会员角度来看,需要浏览基于c++的流浪宠物网站的所有宠物信息,包括宠物分类、宠物介绍、宠物领养等等信息,在浏览宠物信息时,可以查看其他用户的评价,对感兴趣的宠物进行领养申请,等待管理员的审核。
管理员用户主要是经营者,目的是发布宠物信息,上传宠物的图片,及时更新系统的促销资讯等各类文章。管理员还可以对宠物领养进行管理,及时审核。管理员管理系统信息,包括新闻资讯信息、论坛信息、领养管理、活动管理、系统管理等。
通过对基于c++的流浪宠物网站的分析,系统包括前后台两种用户,不同的用户功能不同,其中系统UML用例图如图3.1系统UML用例图所示。
图3.1 系统UML用例图
使用基于c++的流浪宠物网站前,需要进行登录,登录用户包括前台会员和后台管理员,其中登录流程一样。
其中在宠物管理中,先通过宠物的界面收集用户的录入的信息,然后保存信息到宠物表,在宠物列表中查询所有的记录,通过修改和删除操作来更新记录。宠物管理的异常操作将反馈到管理页面,对异常错误进行提示。其中在资讯管理中,先通过资讯的界面收集用户的录入的信息,然后保存信息到资讯表,在资讯列表中查询所有的记录,通过修改和删除操作来更新记录。资讯管理的异常操作将反馈到管理页面,对异常错误进行提示。
本基于c++的流浪宠物网站主要包括前台购买和后台管理,系统结构图如图4.2系统结构图所示。
图4.2系统结构图
4.2.1系统后台设计
根据基本功要求和功能,总体框架分为后台管理和前台宠物领养。
后台管理系统功能:
1、宠物管理功能:对宠物进行管理,包含名称、图片、价格等。
2、宠物分类管理:包括增删改查。
3、领养申请管理:后台可以对领养申请管理,并且用户可以查看了解领养申请是否同意等状态。
4、资讯管理:后台发布资讯信息,删除或者查询资讯。
5、会员管理:包括前台会员信息的基本审核,删除或者查看。
6、宠物百科知识管理:管理宠物百科知识信息,更新宠物百科知识记录。
7、交流论坛管理:管理会员发布的交流信息。
8、系统客服:回复会员发布的问题。
4.2.2系统前台设计
前台系统功能模块:
1、首页:包含宠物搜索、领养入口、宠物推荐浏览
2、在线领养:查看领养宠物信息,在线申请领养。
3、我的:个人账号管理、我的收藏信息。
4、注册登录:游客不能领养,登录的会员才能领养宠物。
5、查看宠物百科知识信息。
6、宠物活动信息,查看宠物活动,申请加入活动。
7、在线交流,发布豢养宠物的经验和问题。
四、核心代码
部分代码:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles;
using Newtonsoft.Json;
using Xiezn.Core.Business.Services;
using Xiezn.Core.Common.Helpers;
using Xiezn.Core.Models.ViewModel;
namespace Xiezn.Core.Controllers
{
/// <summary>
/// 公共接口
/// </summary>
[Route("[action]")]
public class CommonController : Controller
{
private readonly IHostingEnvironment _hostingEnvironment;
private readonly string _savePath;
private readonly CommonService _bll;
private readonly ConfigService _configBLL;
/// <summary>
/// 构造函数
/// </summary>
public CommonController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
_savePath = _hostingEnvironment.WebRootPath + Path.DirectorySeparatorChar + ConfigHelper.GetConfig("SchemaName") + Path.DirectorySeparatorChar + "upload" + Path.DirectorySeparatorChar;
_bll = new CommonService();
_configBLL = new ConfigService();
}
/// <summary>
/// 获取某表的某个字段列表接口
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="columnName">列名</param>
/// <returns></returns>
[HttpGet("{tableName}/{columnName}")]
public JsonResult Option(string tableName, string columnName)
{
try
{
int level = Convert.ToInt32(HttpContext.Request.Query["level"]);
string parent = HttpContext.Request.Query["parent"];
string conditionColumn = HttpContext.Request.Query["conditionColumn"];
string conditionValue = HttpContext.Request.Query["conditionValue"];
if (!string.IsNullOrEmpty(conditionColumn) && !string.IsNullOrEmpty(conditionValue))
{
return Json(new { Code = 0, Data = _bll.Common(tableName, columnName, "", 0, "option", 0, 0, " AND " + conditionColumn + " = '" + conditionValue + "' ") });
}
if (level == 0)
{
return Json(new { Code = 0, Data = _bll.Common(tableName, columnName, parent, level) });
}
else
{
return Json(new { Code = 0, Data = _bll.Common(tableName, columnName) });
}
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
/// <summary>
/// 根据option字段值获取某表的单行记录接口
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="columnName">列名</param>
/// <param name="columnValue">列值</param>
/// <returns></returns>
[HttpGet("{tableName}/{columnName}")]
public JsonResult Follow(string tableName, string columnName, string columnValue)
{
try
{
return Json(new { Code = 0, Data = _bll.Common(tableName, columnName, columnValue, 0, "follow") });
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
/// <summary>
/// 根据主键id修改table表的sfsh状态接口
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="id">主键id</param>
/// <param name="sfsh">当前审核状态(是/否)</param>
/// <returns></returns>
[HttpPost("{tableName}")]
[Authorize(Roles = "Admin,Client")]
public JsonResult Sh(string tableName, int id, string sfsh)
{
try
{
if (_bll.Common(tableName, id.ToString(), sfsh, 0, "sh") > 0)
{
return Json(new { Code = 0, Msg = "更新成功!" });
}
return Json(new { Code = -1, Msg = "更新失败!" });
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
/// <summary>
/// 获取需要提醒的记录数接口
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="columnName">列名</param>
/// <param name="type">类型(1表示数字比较提醒,2表示日期比较提醒)</param>
/// <param name="remindStart">remindStart小于等于columnName满足条件提醒,当比较日期时,该值表示天数</param>
/// <param name="remindEnd">columnName小于等于remindEnd 满足条件提醒,当比较日期时,该值表示天数</param>
/// <returns></returns>
[HttpGet("{tableName}/{columnName}/{type}")]
public JsonResult Remind(string tableName, string columnName, int type, int remindStart, int remindEnd)
{
try
{
return Json(new { Code = 0, Count = _bll.Common(tableName, columnName, "", type, "remind", remindStart, remindEnd) });
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
/// <summary>
/// 计算规则接口
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="columnName">列名</param>
/// <returns></returns>
[HttpGet("{tableName}/{columnName}")]
public JsonResult Cal(string tableName, string columnName)
{
try
{
return Json(new { Code = 0, Data = _bll.Common(tableName, columnName, "", 0, "cal") });
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
/// <summary>
/// 人脸比较
/// </summary>
/// <param name="face1">图片1名称</param>
/// <param name="face2">图片2名称</param>
/// <returns></returns>
[HttpGet]
public JsonResult MatchFace(string face1, string face2)
{
try
{
BaiduAiHelper.clientId = _configBLL.GetValueByName("APIKey");
BaiduAiHelper.clientSecret = _configBLL.GetValueByName("SecretKey");
BaiduAiHelper.GetAccessToken();
List<FaceMatchViewModel> matchInfo = new List<FaceMatchViewModel>
{
new FaceMatchViewModel { image = FuncHelper.ImageToBase64(_savePath + face1) },
new FaceMatchViewModel { image = FuncHelper.ImageToBase64(_savePath + face2) }
};
string result = BaiduAiHelper.FaceMatch(JsonConvert.SerializeObject(matchInfo));
dynamic resObj = JsonConvert.DeserializeObject(result);
if (resObj.error_code == 0)
{
return Json(new { Code = 0, Score = resObj.result.score, Msg = "匹配成功!" });
}
else
{
return Json(new { Code = -1, Score = 0, Msg = "匹配失败!" });
}
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
/// <summary>
/// 定位接口(根据经纬度坐标获取到省市县(区)信息)
/// </summary>
/// <param name="lat">经度</param>
/// <param name="lng">纬度</param>
/// <returns></returns>
[HttpGet]
public JsonResult Location(double lat, double lng)
{
try
{
AddressViewModel addressViewModel = BaiduAiHelper.GetAddress(_configBLL.GetValueByName("baidu_ditu_ak"), lng, lat);
if (addressViewModel == null)
{
return Json(new { Code = -1, Msg = "位置信息获取失败!" });
}
else
{
return Json(new { Code = 0, Data = addressViewModel });
}
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
/// <summary>
/// 类别统计接口
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="columnName">列名</param>
/// <returns></returns>
[HttpGet("{tableName}/{columnName}")]
public JsonResult Group(string tableName, string columnName)
{
try
{
return Json(new { Code = 0, Data = _bll.Common(tableName, columnName, "", 0, "group") });
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
/// <summary>
/// 按值统计接口
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="xColumnName">列名</param>
/// <param name="yColumnName">列名</param>
/// <returns></returns>
[HttpGet("{tableName}/{xColumnName}/{yColumnName}")]
public JsonResult Value(string tableName, string xColumnName, string yColumnName)
{
try
{
return Json(new { Code = 0, Data = _bll.Common(tableName, xColumnName, yColumnName, 0, "value") });
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
/// <summary>
/// 按时间统计类型接口
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="xColumnName">列名</param>
/// <param name="yColumnName">列名</param>
/// <param name="timeStatType">类型</param>
/// <returns></returns>
[HttpGet("{tableName}/{xColumnName}/{yColumnName}/{timeStatType}")]
public JsonResult Value(string tableName, string xColumnName, string yColumnName, string timeStatType)
{
try
{
return Json(new { Code = 0, Data = _bll.StatDate(tableName, xColumnName, yColumnName, timeStatType) });
}
catch (Exception ex)
{
return Json(new { Code = 500, Msg = ex.Message });
}
}
}
}
五、效果图
六、文章目录
目 录
摘 要 1
Abstract 2
第一章 绪 论 5
1.1研究背景 5
1.2国内外研究现状 5
1.3课题意义 6
第二章 相关技术简介 7
2.1 Visual Studio2012平台 7
2.2 c++技术 7
2.3 SQL Server 2012数据库 7
2.4 B/S结构 8
第三章 系统分析 9
3.1可行性分析 9
3.1.1 经济可行性 9
3.1.2 技术可行性 9
3.1.3 法律可行性 9
3.1.4 社会可行性 9
3.2系统需求分析 9
3.2.1性能需求 9
3.2.2功能需求 10
3.3系统UML用例分析 10
第四章 系统设计 12
4.1系统架构设计 12
4.2系统功能设计 12
4.2.1系统后台设计 13
4.2.2系统前台设计 13
4.3数据库设计 14
4.3.1 数据库E-R图 14
4.3.2 数据库表设计 15
第五章 系统的实现 20
5.1前台功能模块的实现 20
5.1.1 用户注册界面 20
5.1.2 用户登录界面 21
5.1.3 个人资料界面 21
5.1.4 宠物详情界面 21
5.1.5 宠物领养实现 22
5.1.6 活动报名的实现 23
5.2后台功能模块的实现 23
5.2.1 管理员登录界面 23
5.2.2 宠物百科知识管理界面 24
5.2.3 宠物分类管理界面 24
5.2.4 宠物管理界面 25
5.2.5 志愿活动管理界面 26
5.2.5 领养审核管理界面 26
5.2.6会员管理界面 27
第六章 系统测试 28
6.1测试目的 28
6.2测试用例 28
6.3测试分析 30
第七章 总 结 31
参考文献 32
致 谢 33