系统管理也都将通过计算机进行整体智能化操作,对于流浪动物救助平台所牵扯的管理及数据保存都是非常多的,例如首页、个人中心、会员管理、志愿者管理、流浪动物信息管理、领养信息管理、取消领养信息管理、志愿团队活动管理、志愿者申请表管理、报名活动管理、取消报名活动管理、动物类型管理、系统管理等,这给管理者的工作带来了巨大的挑战,面对大量的信息,传统的管理系统,都是通过笔记的方式进行详细信息的统计,后来出现电脑,通过电脑输入软件将纸质的信息统计到电脑上,这种方式比较传统,而且想要统计数据信息比较麻烦,还受时间和空间的影响,所以为此开发了流浪动物救助平台;为用户提供了方便管理平台,方便管理员查看及维护;对于用户而言,可以随时进行查看流浪动物信息,管理员可以足不出户就可以获取到系统的数据信息等,而且还能节省用户很多时间,所以开发流浪动物救助平台给管理者带来了很大的方便,同时也方便管理员对用户信息进行处理。
本论文流浪动物救助平台主要牵扯到的程序,数据库与计算机技术等。覆盖知识面大,可以大大的提高系统人员工作效率。
Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。
Java主要采用CORBA技术和安全模型,可以在互联网应用的数据保护。它还提供了对EJB(Enterprise JavaBeans)的全面支持,java servlet API,Spring Boot(java server pages),和XML技术。JAVA语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,开发者只需要知道一些概念就能够编写出一些应用程序。Java程序相对较小,其代码能够在小机器上运行。Java是一种计算机编程语言,具有封装、继承和多态性三个主要特性,广泛应用于企业Web应用程序开发和移动应用程序开发。
Java语言和一般编译器以及直译的区别在于,Java首先将源代码转换为字节码,然后将其转换为JVM的可执行文件,JVM可以在各种不同的JVM上运行。因此,实现了它的跨平台特性。虽然这使得Java在早期非常缓慢,但是随着Java的开发,它已经得到了改进。
ECLIPSE 支持广泛、兼容性高并且功能强大,是一个Eclipse 插件集合,普遍适应于JAVA和J2EE的系统开发,支持 JDBC,Hibernate,AJAX,Struts,Java Servlet,Spring,EJB3等市面上存在的几乎所有数据库链接工具和主流Eclipse产品 开发工具。
ECLIPSE 在业内是所熟知的开发工具,该平台在开发的过程中运用的就是该工具。ECLIPSE 又被称之为企业级的工作平台,它是以Eclipse IDE为基础的。ECLIPSE 可以帮助我们进行数据库的研发和J2EE的使用,除此之外,还可以提高系统的运营能力,这突出表现在服务器的整合过程中。ECLIPSE 的功能相当完备,能够为J2EE的集成提供必要的环境支持,从而完成编码、测试、调试及发布等功能。它可以支持JSP,HTML,SQL,Javascript,Struts, CSS等。
Tomcat属于一种轻型的服务器,所以说在中小企业中并不具有普适性。但是当程序员需要开发或调试JSP 程序时,则通常会将该服务器作为首选。对于一个仅具有计算机基础知识的人来说,计算机系统具有一个好的Apache服务器,可以很好的对HTML 页面进行访问。Tomcat 虽然是Apache的扩展,但是它们都是可以独立运行的,二者是不互相干扰的。当配置正确的时候,Apache服务器为HTML 页面的运行提供技术支持,Tomcat 的任务则是运行Servle和JSP 页面。Tomca也具有一定的HTML页面处理功能。
数据库是系统开发过程中不可或缺的一部分。在WEB应用方面,MySQL AB开发了一个具有很大优势的MySQL关系数据库管理系统。 MySQL可以将数据存储在不同的表中,这非常灵活,并且还可以提高系统在实际应用中的速度。数据库访问最常用于标准SQL语言,MySQL用于SQL语言,因此它具有高度兼容性。数据库的操作是必不可少的,包括对数据库表的增加、删除、修改、查询等功能。现如今,数据库可以分为关系型数据库和非关系型数据库,Mysql属于关系性数据库,Mysql数据库是一款小型的关系型数据库,它以其自身特点:体积小、速度快、成本低等,Mysql数据库是目前最受欢迎的开源数据库。
在WEB应用技术中, Mysql数据库支持不同的操作系统平台,虽然在不同平台下的安装和配置都不相同,但是差别也不是很大,Mysql在Windows平台下两种安装方式,二进制版和免安装版。安装完Mysql数据库之后,需要启动服务进程,相应的客户端就可以连接数据库,客户端可通过命令行或者图形界面工具登录数据库。
流浪动物救助平台开发系统的结构图1所示:
图1 系统结构
模块包括首页、个人中心、会员管理、志愿者管理、流浪动物信息管理、领养信息管理、取消领养信息管理、志愿团队活动管理、志愿者申请表管理、报名活动管理、取消报名活动管理、动物类型管理、系统管理等进行相应的操作。
登录系统结构图,如图2所示:
这些功能可以充分满足流浪动物救助平台的需求。此系统功能较为全面如下图系统功能结构如图3所示。
图3系统功能结构图
通过系统页面可以查看首页、流浪动物信息管理、志愿团队活动、流浪动物公告、个人中心、后台管理等信息,如图1所示。通过会员注册页面可以填写用户账号、密码、用户姓名、联系方式、身份证、邮箱等进行注册操作,如图2所示。
流浪动物信息管理:通过流浪动物信息管理页面可以查看动物类型、动物特征、动物详情、救助时间、救助地点、图片、用户账号、用户姓名、联系方式、领养时间等信息,如图3所示。
个人中心:在个人中心页面填写用户账号、密码、用户姓名、性别、联系方式、身份证、邮箱等信息进行更新信息,并可根据需要对我的收藏进行相应操作,如图4所示。
管理员通过用户名和密码,填写完成后选则提交,如图6所示。管理员登录成功后进入到系统操作界面,可以对系统首页、个人中心、会员管理、志愿者管理、流浪动物信息管理、领养信息管理、取消领养信息管理、志愿团队活动管理、志愿者申请表管理、报名活动管理、取消报名活动管理、动物类型管理、系统管理等功能模块进行相对应操作。如图5所示
会员管理:通过列表可以获取索引、用户账号、用户姓名、性别、联系方式、身份证、邮箱、头像等信息,进行修改或删除操作,如图7所示。
志愿者管理:通过列表可以获取索引、志愿者账号、志愿者姓名、性别、志愿者手机、身份证、邮箱、头像等信息,进行修改或删除操作,如图8所示。
流浪动物信息管理:通过列表可以获取索引、动物类型、救助手机、救助地点、图片、是否已经领养等信息,进行详情、查看评论、修改或删除操作,如图9所示。
领养信息管理:通过列表可以获取索引、动物类型、动物特征、动物详情、救助时间、救助地点、图片、用户账号、用户姓名、联系方式、领养时间、审核回复、审核状态、审核等信息,进行详情、修改或删除操作,如图10所示。
会员登录成功后进入到系统操作界面,可以对系统首页、个人中心、流浪动物信息管理、领养信息管理、取消领养信息管理、志愿者申请表管理等功能模块进行相对应操作。如图11所示
取消领养信息管理:通过列表可以获取索引、动物类型、动物特征、动物详情、救助时间、救助地点、图片、用户账号、用户姓名、联系方式、领养时间、取消领养时间、审核回复、审核状态等信息,进行详情操作,如图12所示。
志愿者申请表管理:通过列表可以获取索引、用户账号、用户姓名、性别、联系方式、身份证、邮箱、审核回复、审核状态等信息,进行详情、修改或删除操作,如图14所示。
志愿者录成功后进入到系统操作界面,可以对系统首页、个人中心、流浪动物信息管理、领养信息管理、取消领养信息管理、志愿团队活动管理、报名活动管理、取消报名活动管理等功能模块进行相对应操作。如图14所示
报名活动管理:通过列表可以获取索引、活动报名、活动时间、活动地点、图片、志愿者账号、志愿者姓名、志愿者手机、报名时间、审核回复、审核状态等信息,进行详情、修改或删除操作,并可根据需要取消报名。如图15所示。
取消报名活动管理:通过列表可以获取索引、活动报名、活动时间、活动地点、图片、志愿者账号、志愿者姓名、志愿者手机、报名时间、取消报名时间、审核回复、审核状态等信息,进行详情操作,如图16所示。
/**
* 领养信息
* 后端接口
*/
@RestController
@RequestMapping("/lingyangxinxi")
public class LingyangxinxiController {
@Autowired
private LingyangxinxiService lingyangxinxiService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map params,LingyangxinxiEntity lingyangxinxi,
HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("huiyuan")) {
lingyangxinxi.setYonghuzhanghao((String)request.getSession().getAttribute("username"));
}
EntityWrapper ew = new EntityWrapper();
PageUtils page = lingyangxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, lingyangxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map params,LingyangxinxiEntity lingyangxinxi,
HttpServletRequest request){
EntityWrapper ew = new EntityWrapper();
PageUtils page = lingyangxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, lingyangxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( LingyangxinxiEntity lingyangxinxi){
EntityWrapper ew = new EntityWrapper();
ew.allEq(MPUtil.allEQMapPre( lingyangxinxi, "lingyangxinxi"));
return R.ok().put("data", lingyangxinxiService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(LingyangxinxiEntity lingyangxinxi){
EntityWrapper< LingyangxinxiEntity> ew = new EntityWrapper< LingyangxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( lingyangxinxi, "lingyangxinxi"));
LingyangxinxiView lingyangxinxiView = lingyangxinxiService.selectView(ew);
return R.ok("查询领养信息成功").put("data", lingyangxinxiView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
LingyangxinxiEntity lingyangxinxi = lingyangxinxiService.selectById(id);
return R.ok().put("data", lingyangxinxi);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
LingyangxinxiEntity lingyangxinxi = lingyangxinxiService.selectById(id);
return R.ok().put("data", lingyangxinxi);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody LingyangxinxiEntity lingyangxinxi, HttpServletRequest request){
lingyangxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(lingyangxinxi);
lingyangxinxiService.insert(lingyangxinxi);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody LingyangxinxiEntity lingyangxinxi, HttpServletRequest request){
lingyangxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(lingyangxinxi);
lingyangxinxiService.insert(lingyangxinxi);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody LingyangxinxiEntity lingyangxinxi, HttpServletRequest request){
//ValidatorUtils.validateEntity(lingyangxinxi);
lingyangxinxiService.updateById(lingyangxinxi);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
lingyangxinxiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper wrapper = new EntityWrapper();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("huiyuan")) {
wrapper.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username"));
}
int count = lingyangxinxiService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
/**
* 会员
* 后端接口
*/
@RestController
@RequestMapping("/huiyuan")
public class HuiyuanController {
@Autowired
private HuiyuanService huiyuanService;
@Autowired
private TokenService tokenService;
/**
* 登录
*/
@IgnoreAuth
@RequestMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
HuiyuanEntity user = huiyuanService.selectOne(new EntityWrapper().eq("yonghuzhanghao", username));
if(user==null || !user.getMima().equals(password)) {
return R.error("账号或密码不正确");
}
String token = tokenService.generateToken(user.getId(), username,"huiyuan", "会员" );
return R.ok().put("token", token);
}
/**
* 注册
*/
@IgnoreAuth
@RequestMapping("/register")
public R register(@RequestBody HuiyuanEntity huiyuan){
//ValidatorUtils.validateEntity(huiyuan);
HuiyuanEntity user = huiyuanService.selectOne(new EntityWrapper().eq("yonghuzhanghao", huiyuan.getYonghuzhanghao()));
if(user!=null) {
return R.error("注册用户已存在");
}
Long uId = new Date().getTime();
huiyuan.setId(uId);
huiyuanService.insert(huiyuan);
return R.ok();
}
/**
* 退出
*/
@RequestMapping("/logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request){
Long id = (Long)request.getSession().getAttribute("userId");
HuiyuanEntity user = huiyuanService.selectById(id);
return R.ok().put("data", user);
}
/**
* 密码重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){
HuiyuanEntity user = huiyuanService.selectOne(new EntityWrapper().eq("yonghuzhanghao", username));
if(user==null) {
return R.error("账号不存在");
}
user.setMima("123456");
huiyuanService.updateById(user);
return R.ok("密码已重置为:123456");
}
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map params,HuiyuanEntity huiyuan,
HttpServletRequest request){
EntityWrapper ew = new EntityWrapper();
PageUtils page = huiyuanService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, huiyuan), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map params,HuiyuanEntity huiyuan,
HttpServletRequest request){
EntityWrapper ew = new EntityWrapper();
PageUtils page = huiyuanService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, huiyuan), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( HuiyuanEntity huiyuan){
EntityWrapper ew = new EntityWrapper();
ew.allEq(MPUtil.allEQMapPre( huiyuan, "huiyuan"));
return R.ok().put("data", huiyuanService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(HuiyuanEntity huiyuan){
EntityWrapper< HuiyuanEntity> ew = new EntityWrapper< HuiyuanEntity>();
ew.allEq(MPUtil.allEQMapPre( huiyuan, "huiyuan"));
HuiyuanView huiyuanView = huiyuanService.selectView(ew);
return R.ok("查询会员成功").put("data", huiyuanView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
HuiyuanEntity huiyuan = huiyuanService.selectById(id);
return R.ok().put("data", huiyuan);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
HuiyuanEntity huiyuan = huiyuanService.selectById(id);
return R.ok().put("data", huiyuan);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody HuiyuanEntity huiyuan, HttpServletRequest request){
huiyuan.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(huiyuan);
HuiyuanEntity user = huiyuanService.selectOne(new EntityWrapper().eq("yonghuzhanghao", huiyuan.getYonghuzhanghao()));
if(user!=null) {
return R.error("用户已存在");
}
huiyuan.setId(new Date().getTime());
huiyuanService.insert(huiyuan);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody HuiyuanEntity huiyuan, HttpServletRequest request){
huiyuan.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(huiyuan);
HuiyuanEntity user = huiyuanService.selectOne(new EntityWrapper().eq("yonghuzhanghao", huiyuan.getYonghuzhanghao()));
if(user!=null) {
return R.error("用户已存在");
}
huiyuan.setId(new Date().getTime());
huiyuanService.insert(huiyuan);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody HuiyuanEntity huiyuan, HttpServletRequest request){
//ValidatorUtils.validateEntity(huiyuan);
huiyuanService.updateById(huiyuan);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
huiyuanService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper wrapper = new EntityWrapper();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
int count = huiyuanService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
第一章 绪 论
1.1背景及意义
1.2国内外研究概况
1.3 研究的内容
第二章 关键技术的研究
2.1 Spring Boot框架
2.2 JAVA简介
2.3 ECLIPSE 开发环境
2.4 Tomcat服务器
2.5 MySQL数据库
第三章 系统分析
3.1 系统设计目标
3.2 系统可行性分析
3.3 系统功能分析和描述
3.4系统UML用例分析
3.5系统流程分析
第四章 系统设计
4.1 系统体系结构
4.2 数据库设计原则
4.3 数据表
第五章 系统实现
5.1系统功能模块
5.2管理员功能模块
5.3会员功能模块
5.4志愿者功能模块
第六章 系统测试
6.1测试定义及目的
6.2性能测试
6.3测试模块
6.4测试结果
总 结
致 谢
参考文献
流浪动物救助平台的整体功能模块的实现,主要是对自己在大学这几年时间所学内容的一个测试,对于系统,主要是通过现在智能化的流浪动物救助平台进行开始系统的实现,管理员根据问题信息进行管理,并且可以根据需求进行数据信息的增加修改删除等操作,完美的解决了当下流浪动物救助平台中所遇到的问题。
经过一个学期的毕业设计的实现完成已接近尾声,到目前为止,当我回想起整个学期的系统开发日,收获颇丰。毕业设计的主要任务是建立一个智能化的流浪动物救助平台的信息系统,主要使用eclipse和Mysql数据库的开发工具,对系统的每个功能模块进行相对应的操作,最后,系统调试结果表明系统基本可以满足功能要求。
流浪动物救助平台的开发对我大学学习的改进有很大帮助。它使我能够学习计算机知识的相关技术方面问题及与人交往的沟通交流方面,让我意识到无论我们做什么,我们都需要坚持不懈,努力工作,只有这样尝试了并且坚持去做了,我们才可以成功,才可以获得成功的喜悦,如果没有尝试,知识想,那连成功的机会都没有,实际操作进行做了,才会越来越近的靠近成功,随着道路一路向前,未来的路是美好的。
对于流浪动物救助平台的实现,是自己第一次完成的设计一个管理系统。在项目的设计过程中,我克服了各种困难,并且在面对这些困难,我积极的面对,想办法解决问题,并且更好的掌握了理论知识和动手操作实践能力,从系统的开发到设计完成,我完成了一个更全面、更完善、更安全的平台管理系统,这也让我取得了很大的成就感,也使我对未来的生活更有信心。
喜欢的点赞收藏加关注私信作者沟通交流