├── Java GUI 图书管理系统设计与开发.md ├── JavaWeb 图书管理系统设计与开发.md ├── JavaWeb宿舍管理系统(附 演示、源码下载地址).md ├── README.md ├── 仓库ERP管理系统(springboot)设计与实现.md ├── 图书管理系统设计与实现—看这篇就够了.md ├── 基于SSH框架的人力资源管理系统设计与实现.md ├── 基于SSM框架的JavaWeb通用权限管理系统.md ├── 基于java的企业进销存管理系统设计与实现.md ├── 基于ssm的客户管理系统.md ├── 基于web的图书管理系统设计与实现.md ├── 基于web的机票管理系统设计与实现(一).md ├── 基于web的机票管理系统设计与实现(二).md └── 支付宝支付--沙箱支付教程+案例 PC端网站支付(超级详细版本).md /Java GUI 图书管理系统设计与开发.md: -------------------------------------------------------------------------------- 1 | @[toc] 2 | 3 | **源码下载:关注微信公众号【C you again】,回复“Java GUI图书管理系统”免费领取。** 4 | 5 | ## 01 概述 6 | 7 | 一款功能强大的图书馆管理系统,功能齐全,小白/大学生项目实训,学习的不二之选。 8 | 9 | ## 02 技术 10 | 11 | **此系统使用 java awt 实现**。java.awt是一个软件包,包含用于创建用户界面和绘制图形图像的所有分类。在AWT术语中,诸如按钮或滚动条之类的用户界面对象称为组件。Component类是所有 AWT 组件的根。 12 | 13 | ## 03 功能详解 14 | 15 | #### 基础维护 16 | 17 | ##### 图书维护 18 | 19 | - 添加:输入图书编号、图书名称、图书页数、图书作者、出版社、库存数量、所属类型等图书信息,点击Save按钮添加新图书。 20 | - 修改:首先根据图书编号查询到所要修改的图书,然后对图书的名称、图书页数、作者、出版时间、定价、库存等信息进行修改。 21 | - 删除:首先根据图书编号查询到所要删除的图书,然后进行删除操作。 22 | 23 | ##### 读者维护 24 | 25 | - 添加:输入读者编号、读者姓名、读者类别、读者性别、可借天数等信息,然后点击“Add”按钮添加新读者。 26 | - 修改:首先根据读者编号查询到要修改的读者信息,再对读者编号、读者姓名、读者类别、读者性别、可借天数等信息进行修改,修改完成点击“保存”按钮完成修改。 27 | - 删除:首先根据读者编号查询到要删除的读者信息,然后进行删除操作。 28 | 29 | #### 借阅管理 30 | 31 | - 借书管理:首先根据图书编号和读者编号查询到图书和读者信息,在点击“借出”按钮完成借书。 32 | - 还书管理:首先根据图书编号和读者编号查询到图书和读者信息,在点击“还书”按钮完成还书。 33 | 34 | #### 查询管理 35 | 36 | 37 | - 图书查询:输入图书名称、作者、出版时间中的任意一项,点击“查询”按钮查询图书。 38 | - 读者查询:输入读者姓名、读者类型中的任意一项,点击“查询”按钮查询读者。 39 | 40 | #### 系统管理 41 | 42 | - 修改密码:首先输入旧密码等待校验,旧密码输入正确后即可设定新的密码。 43 | - 退出系统:退出图书管理系统程序。 44 | 45 | ## 04 运行截图 46 | 47 | #### 添加图书 48 | 49 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824205253483.png) 50 | 51 | #### 添加读者 52 | 53 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824205410691.png) 54 | 55 | #### 借书管理 56 | 57 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824205603727.png) 58 | 59 | #### 图书查询 60 | 61 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824205755671.png) 62 | 63 | #### 修改密码 64 | 65 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824205839333.png) 66 | 67 | ## 05 主要代码 68 | 69 | #### 添加图书 70 | 71 | ```java 72 | package com.jason.frame;//com.jason.frame.BookAdd.java 73 | import java.awt.*; 74 | import java.awt.event.*; 75 | import java.sql.ResultSet; 76 | import java.sql.SQLException; 77 | import java.text.ParseException; 78 | import java.text.SimpleDateFormat; 79 | import javax.swing.JOptionPane; 80 | public class BookAdd extends Frame implements ActionListener{ 81 | Toolkit tool= getToolkit(); 82 | String url="src/bookbk.png"; 83 | Image img=tool.getImage(url); 84 | public void paint(Graphics g){ 85 | g.drawImage(img,0,0,this); 86 | } 87 | 88 | public void clearAndSetBookId(){ 89 | for(int j=0;j240){ 126 | lx=50; 127 | ly=ly+30; 128 | } 129 | booklb[i]=new Label(lbname[i]); 130 | booklb[i].setBounds(lx,ly,50,20); 131 | booktxt[i]=new TextField(); 132 | booktxt[i].setBounds(lx+60,ly,100,20); 133 | lx=lx+190; 134 | add(booklb[i]);add(booktxt[i]); 135 | } 136 | booktxt[0].setEditable(false); 137 | booktxt[0].setText(str); 138 | 139 | booktxt[9].setVisible(false); 140 | booktype.setBounds(300,170,100,20); 141 | add(booktype); 142 | savebtn.setBounds(150,210,80,25); 143 | closebtn.setBounds(280,210,80,25); 144 | add(savebtn);add(closebtn); 145 | addWindowListener(new WindowAdapter(){ 146 | public void windowClosing(WindowEvent e){ 147 | DbOp.close(); 148 | dispose(); 149 | } 150 | }); 151 | savebtn.addActionListener(this); 152 | closebtn.addActionListener(this); 153 | setLocationRelativeTo(null); 154 | setVisible(true); 155 | } 156 | public static String getInsertOrderedList(){ 157 | String returnstring=""; 158 | String sql="select * from book"; 159 | 160 | try{ 161 | int count=0; 162 | ResultSet rs=DbOp.executeQuery(sql); 163 | while(rs.next()){ 164 | 165 | count++; 166 | } 167 | String[] allid=new String[count]; 168 | int[] intofid=new int[count]; 169 | 170 | int i=0; 171 | ResultSet rs1=DbOp.executeQuery(sql); 172 | while(rs1.next()){ 173 | allid[i]=rs1.getString("id"); 174 | String mystr=allid[i].substring(1); 175 | intofid[i]=Integer.parseInt(mystr); 176 | i++; 177 | } 178 | int temp=-1; 179 | for(int j=0;jtemp){ 181 | temp=intofid[j]; 182 | } 183 | } 184 | returnstring=String.valueOf(temp+1); 185 | int len=returnstring.length(); 186 | for(int f=0;f<5-len;f++){ 187 | returnstring="0"+returnstring; 188 | 189 | } 190 | returnstring="A"+returnstring; 191 | DbOp.close(); 192 | }catch(SQLException ee){ 193 | 194 | } 195 | 196 | 197 | return returnstring; 198 | } 199 | 200 | public void actionPerformed(ActionEvent e){ 201 | Object ob=e.getSource(); 202 | if(ob==savebtn){ 203 | savebtnActionPerformed(); 204 | clearAndSetBookId(); 205 | } 206 | if(ob==closebtn){ 207 | DbOp.close(); 208 | dispose(); 209 | 210 | } 211 | } 212 | public void savebtnActionPerformed(){ 213 | String id=booktxt[0].getText(); 214 | String typestr=booktype.getSelectedItem().toString(); 215 | String[] inputstring=new String[9]; 216 | boolean emptyequals=false; 217 | for(int i=0;i240){ 318 | ly=ly+30; 319 | lx=50; 320 | } 321 | readerlb[i]=new Label(labelsign[i]); 322 | readertxt[i]=new TextField(); 323 | readerlb[i].setBounds(lx,ly,50,20); 324 | readertxt[i].setBounds(lx+60,ly,100,20); 325 | lx=lx+190; 326 | add(readerlb[i]); 327 | add(readertxt[i]); 328 | } 329 | readertxt[0].setEditable(false); 330 | readertxt[0].setText(str); 331 | readertype=new Choice(); 332 | readertype.add("教师"); 333 | readertype.add("学生"); 334 | readertype.add("作家"); 335 | readertype.add("职工"); 336 | readertype.add("其他"); 337 | readersex=new Choice(); 338 | readersex.add("男"); 339 | readersex.add("女"); 340 | readertxt[2].setVisible(false); 341 | readertxt[3].setVisible(false); 342 | readertype.setBounds(110,80,100,20); 343 | readersex.setBounds(300,80,100,20); 344 | add(readertype);add(readersex); 345 | querybtn=new Button("Add"); 346 | closebtn=new Button("Close"); 347 | querybtn.setBounds(130,140,50,20); 348 | closebtn.setBounds(310,140,50,20); 349 | add(querybtn);add(closebtn); 350 | querybtn.addActionListener(new ActionListener(){ 351 | public void actionPerformed(ActionEvent e){ 352 | updateActionPerformed(e); 353 | clearAndSetReaderId(); 354 | } 355 | }); 356 | closebtn.addActionListener(new ActionListener(){ 357 | public void actionPerformed(ActionEvent e){ 358 | DbOp.close(); 359 | dispose(); 360 | //System.exit(0); 361 | } 362 | }); 363 | addWindowListener(new WindowAdapter(){ 364 | public void windowClosing(WindowEvent e){ 365 | DbOp.close(); 366 | dispose(); 367 | //System.exit(0); 368 | } 369 | }); 370 | setLocationRelativeTo(null); 371 | setVisible(true); 372 | } 373 | public static String getInsertOrderedList(){ 374 | String returnstring=""; 375 | String sql="select * from reader"; 376 | 377 | try{ 378 | int count=0; 379 | ResultSet rs=DbOp.executeQuery(sql); 380 | while(rs.next()){ 381 | 382 | count++; 383 | } 384 | String[] allid=new String[count]; 385 | int[] intofid=new int[count]; 386 | 387 | int i=0; 388 | ResultSet rs1=DbOp.executeQuery(sql); 389 | while(rs1.next()){ 390 | allid[i]=rs1.getString("id"); 391 | intofid[i]=Integer.parseInt(allid[i]); 392 | i++; 393 | } 394 | int temp=-1; 395 | for(int j=0;jtemp){ 397 | temp=intofid[j]; 398 | } 399 | } 400 | returnstring=String.valueOf(temp+1); 401 | int len=returnstring.length(); 402 | for(int f=0;f<5-len;f++){ 403 | returnstring="0"+returnstring; 404 | 405 | } 406 | DbOp.close(); 407 | }catch(SQLException ee){ 408 | 409 | } 410 | 411 | 412 | return returnstring; 413 | } 414 | public static void updateActionPerformed(ActionEvent e){ 415 | String[] readerstr=new String[6]; 416 | readerstr[2]=readertype.getSelectedItem().toString(); 417 | readerstr[3]=readersex.getSelectedItem().toString(); 418 | for(int i=0;i springboot + jpa + mybatis + springsecurity +javaex 16 | 17 | #### 后端: 18 | 19 | - 基础框架: SpringBoot 20 | - 简单数据操作: Spring Data Jpa 21 | - 复杂数据操作: Mybatis 22 | - 安全框架:SpringSecurity 23 | - 模板引擎: Thymeleaf 24 | 25 | #### 前端: 26 | 27 | - javaEx, 其实就是对html,css,js的封装。比较接近原生 修改起来比较方便 28 | - jQuery , 讲真的jQuery用着还是很舒服, 突破各种前端框架的限制 29 | 30 | ## 04 运行环境 31 | 32 | > jdk1.8 + maven3 + mysql5.7 33 | 34 | ## 05 功能介绍 35 | 36 | #### 图书管理 37 | 38 | ##### 图书列表:显示已经上架的图书信息,可对上架图书进行搜索、修改、删除操作。 39 | ##### 图书上架:录入图书信息,输入图书名称、作者、图书分类,页数,定价等数据进行图书录入。 40 | 41 | #### 借阅管理 42 | 43 | ##### 搜索图书:根据图书名称、作者名称,图书分类等搜索图书。 44 | ##### 借阅图书:录入图书信息,输入图书名称、作者、图书分类,页数,定价等数据进行图书借阅。 45 | ##### 归还图书:对已经借阅的图书进行归还操作。 46 | 47 | #### 读者管理 48 | 49 | ##### 读者列表:显示已经注册的读者用户。 50 | ##### 读者添加:录入用户的昵称、用户名、密码、生日、电话、邮箱等信息添加新用户。 51 | 52 | #### 用户中心 53 | 54 | ##### 个人信息:查看、修改个人信息。 55 | ##### 用户管理:对已经添加的用户进行搜索、删除、使用权限信息进行设置。 56 | ##### 添加管理员:录入管理员的昵称、用户名、密码、生日、电话、邮箱等信息添加新管理员。 57 | 58 | ## 06 运行截图 59 | 60 | #### 登录界面 61 | 62 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824155218898.png) 63 | 64 | #### 首页 65 | 66 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824161417528.png) 67 | 68 | #### 图书列表界面 69 | 70 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824161454178.png) 71 | 72 | #### 添加图书界面 73 | 74 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824161540493.png) 75 | 76 | #### 图书归还界面 77 | 78 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824161628239.png) 79 | 80 | #### 读者列表界面 81 | 82 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824161701562.png) 83 | 84 | #### 个人信息界面 85 | 86 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824161733917.png) 87 | 88 | #### 用户管理界面 89 | 90 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200824161922752.png) 91 | 92 | ## 07 主要代码 93 | 94 | #### 图书管理 95 | 96 | ```java 97 | package com.book.manager.controller; 98 | 99 | import com.book.manager.entity.Book; 100 | import com.book.manager.service.BookService; 101 | import com.book.manager.util.R; 102 | import com.book.manager.util.http.CodeEnum; 103 | import com.book.manager.util.ro.PageIn; 104 | import io.swagger.annotations.Api; 105 | import io.swagger.annotations.ApiOperation; 106 | import org.springframework.beans.factory.annotation.Autowired; 107 | import org.springframework.stereotype.Controller; 108 | import org.springframework.web.bind.annotation.*; 109 | 110 | /** 111 | * @Description 用户管理 112 | */ 113 | @Api(tags = "图书管理") 114 | @RestController 115 | @RequestMapping("/book") 116 | public class BookController { 117 | 118 | @Autowired 119 | private BookService bookService; 120 | 121 | @ApiOperation("图书搜索列表") 122 | @PostMapping("/list") 123 | public R getBookList(@RequestBody PageIn pageIn) { 124 | if (pageIn == null) { 125 | return R.fail(CodeEnum.PARAM_ERROR); 126 | } 127 | 128 | return R.success(CodeEnum.SUCCESS,bookService.getBookList(pageIn)); 129 | } 130 | 131 | @ApiOperation("添加图书") 132 | @PostMapping("/add") 133 | public R addBook(@RequestBody Book book) { 134 | return R.success(CodeEnum.SUCCESS,bookService.addBook(book)); 135 | } 136 | 137 | @ApiOperation("编辑图书") 138 | @PostMapping("/update") 139 | public R modifyBook(@RequestBody Book book) { 140 | return R.success(CodeEnum.SUCCESS,bookService.updateBook(book)); 141 | } 142 | 143 | 144 | @ApiOperation("图书详情") 145 | @GetMapping("/detail") 146 | public R bookDetail(Integer id) { 147 | return R.success(CodeEnum.SUCCESS,bookService.findBookById(id)); 148 | } 149 | 150 | @ApiOperation("图书详情 根据ISBN获取") 151 | @GetMapping("/detailByIsbn") 152 | public R bookDetailByIsbn(String isbn) { 153 | return R.success(CodeEnum.SUCCESS,bookService.findBookByIsbn(isbn)); 154 | } 155 | 156 | @ApiOperation("删除图书") 157 | @GetMapping("/delete") 158 | public R delBook(Integer id) { 159 | bookService.deleteBook(id); 160 | return R.success(CodeEnum.SUCCESS); 161 | } 162 | 163 | } 164 | 165 | ``` 166 | 167 | #### 借阅管理 168 | 169 | ```java 170 | package com.book.manager.controller; 171 | 172 | import cn.hutool.core.date.DateUtil; 173 | import com.book.manager.entity.Borrow; 174 | import com.book.manager.service.BookService; 175 | import com.book.manager.service.BorrowService; 176 | import com.book.manager.util.R; 177 | import com.book.manager.util.consts.Constants; 178 | import com.book.manager.util.http.CodeEnum; 179 | import com.book.manager.util.ro.RetBookIn; 180 | import com.book.manager.util.vo.BackOut; 181 | import com.book.manager.util.vo.BookOut; 182 | import io.swagger.annotations.Api; 183 | import io.swagger.annotations.ApiOperation; 184 | import org.springframework.beans.BeanUtils; 185 | import org.springframework.beans.factory.annotation.Autowired; 186 | import org.springframework.stereotype.Controller; 187 | import org.springframework.web.bind.annotation.*; 188 | 189 | import java.util.ArrayList; 190 | import java.util.Date; 191 | import java.util.List; 192 | 193 | /** 194 | * @Description 用户管理 195 | */ 196 | @Api(tags = "借阅管理") 197 | @RestController 198 | @RequestMapping("/borrow") 199 | public class BorrowController { 200 | 201 | @Autowired 202 | private BorrowService borrowService; 203 | 204 | @Autowired 205 | private BookService bookService; 206 | 207 | @ApiOperation("借阅列表") 208 | @GetMapping("/list") 209 | public R getBorrowList(Integer userId) { 210 | return R.success(CodeEnum.SUCCESS,borrowService.findAllBorrowByUserId(userId)); 211 | } 212 | 213 | @ApiOperation("借阅图书") 214 | @PostMapping("/add") 215 | public R addBorrow(@RequestBody Borrow borrow) { 216 | Integer result = borrowService.addBorrow(borrow); 217 | if (result == Constants.BOOK_BORROWED) { 218 | return R.success(CodeEnum.BOOK_BORROWED); 219 | }else if (result == Constants.USER_SIZE_NOT_ENOUGH) { 220 | return R.success(CodeEnum.USER_NOT_ENOUGH); 221 | }else if (result == Constants.BOOK_SIZE_NOT_ENOUGH) { 222 | return R.success(CodeEnum.BOOK_NOT_ENOUGH); 223 | } 224 | return R.success(CodeEnum.SUCCESS,Constants.OK); 225 | } 226 | 227 | @ApiOperation("编辑借阅") 228 | @PostMapping("/update") 229 | public R modifyBorrow(@RequestBody Borrow borrow) { 230 | return R.success(CodeEnum.SUCCESS,borrowService.updateBorrow(borrow)); 231 | } 232 | 233 | 234 | @ApiOperation("借阅详情") 235 | @GetMapping("/detail") 236 | public R borrowDetail(Integer id) { 237 | return R.success(CodeEnum.SUCCESS,borrowService.findById(id)); 238 | } 239 | 240 | @ApiOperation("删除归还记录") 241 | @GetMapping("/delete") 242 | public R delBorrow(Integer id) { 243 | borrowService.deleteBorrow(id); 244 | return R.success(CodeEnum.SUCCESS); 245 | } 246 | 247 | 248 | @ApiOperation("已借阅列表") 249 | @GetMapping("/borrowed") 250 | public R borrowedList(Integer userId) { 251 | List outs = new ArrayList<>(); 252 | if (userId!=null&&userId>0) { 253 | // 获取所有 已借阅 未归还书籍 254 | List borrows = borrowService.findBorrowsByUserIdAndRet(userId, Constants.NO); 255 | for (Borrow borrow : borrows) { 256 | BackOut backOut = new BackOut(); 257 | BookOut out = bookService.findBookById(borrow.getBookId()); 258 | BeanUtils.copyProperties(out,backOut); 259 | 260 | backOut.setBorrowTime(DateUtil.format(borrow.getCreateTime(),Constants.DATE_FORMAT)); 261 | 262 | String endTimeStr = DateUtil.format(borrow.getEndTime(), Constants.DATE_FORMAT); 263 | backOut.setEndTime(endTimeStr); 264 | // 判断是否逾期 265 | String toDay = DateUtil.format(new Date(), Constants.DATE_FORMAT); 266 | int i = toDay.compareTo(endTimeStr); 267 | if (i>0) { 268 | backOut.setLate(Constants.YES_STR); 269 | }else { 270 | backOut.setLate(Constants.NO_STR); 271 | } 272 | 273 | outs.add(backOut); 274 | } 275 | } 276 | 277 | return R.success(CodeEnum.SUCCESS,outs); 278 | } 279 | 280 | @ApiOperation("归还书籍") 281 | @PostMapping("/ret") 282 | public R retBook(Integer userId, Integer bookId) { 283 | // 归还图书 284 | borrowService.retBook(userId,bookId); 285 | return R.success(CodeEnum.SUCCESS); 286 | } 287 | 288 | } 289 | 290 | ``` 291 | 292 | 用户管理 293 | 294 | ```java 295 | package com.book.manager.controller; 296 | 297 | import cn.hutool.core.bean.BeanUtil; 298 | import cn.hutool.core.date.DateUtil; 299 | import cn.hutool.core.util.StrUtil; 300 | import com.book.manager.entity.Users; 301 | import com.book.manager.service.UserService; 302 | import com.book.manager.util.R; 303 | import com.book.manager.util.consts.Constants; 304 | import com.book.manager.util.consts.ConvertUtil; 305 | import com.book.manager.util.http.CodeEnum; 306 | import com.book.manager.util.vo.PageOut; 307 | import com.book.manager.util.ro.PageIn; 308 | import com.book.manager.util.vo.UserOut; 309 | import com.github.pagehelper.PageInfo; 310 | import io.swagger.annotations.Api; 311 | import io.swagger.annotations.ApiOperation; 312 | import org.springframework.beans.BeanUtils; 313 | import org.springframework.beans.factory.annotation.Autowired; 314 | import org.springframework.security.core.context.SecurityContextHolder; 315 | import org.springframework.web.bind.annotation.*; 316 | 317 | import java.util.ArrayList; 318 | import java.util.List; 319 | import java.util.Map; 320 | 321 | /** 322 | * @Description 用户管理 323 | */ 324 | @Api(tags = "用户管理") 325 | @RestController 326 | @RequestMapping("/user") 327 | public class UsersController { 328 | 329 | @Autowired 330 | private UserService userService; 331 | 332 | @ApiOperation("用户列表") 333 | @PostMapping("/list") 334 | public R getUsers(@RequestBody PageIn pageIn) { 335 | if (pageIn == null) { 336 | return R.fail(CodeEnum.PARAM_ERROR); 337 | } 338 | // 封装分页出参对象 339 | PageInfo userList = userService.getUserList(pageIn); 340 | PageOut pageOut = new PageOut(); 341 | pageOut.setCurrPage(userList.getPageNum()); 342 | pageOut.setPageSize(userList.getPageSize()); 343 | pageOut.setTotal((int) userList.getTotal()); 344 | List outs = new ArrayList<>(); 345 | for (Users users : userList.getList()) { 346 | UserOut out = new UserOut(); 347 | BeanUtils.copyProperties(users,out); 348 | out.setIdent(ConvertUtil.identStr(users.getIdentity())); 349 | out.setBirth(DateUtil.format(users.getBirthday(),Constants.DATE_FORMAT)); 350 | outs.add(out); 351 | } 352 | 353 | pageOut.setList(outs); 354 | 355 | return R.success(CodeEnum.SUCCESS,pageOut); 356 | } 357 | 358 | // @ApiOperation("添加用户") 359 | // @PostMapping("/add") 360 | // public R addUsers(@RequestBody Users users) { 361 | // return R.success(CodeEnum.SUCCESS,userService.addUser(users)); 362 | // } 363 | 364 | @ApiOperation("添加读者") 365 | @PostMapping("/addReader") 366 | public R addReader(@RequestBody Users users) { 367 | if (users == null) { 368 | return R.fail(CodeEnum.PARAM_ERROR); 369 | } 370 | // 读者默认是普通用户 371 | users.setIsAdmin(1); 372 | return R.success(CodeEnum.SUCCESS,userService.addUser(users)); 373 | } 374 | 375 | @ApiOperation("添加管理员") 376 | @PostMapping("/addAdmin") 377 | public R addAdmin(@RequestBody Users users) { 378 | if (users == null) { 379 | return R.fail(CodeEnum.PARAM_ERROR); 380 | } 381 | // 设置管理员权限 382 | users.setIsAdmin(0); 383 | return R.success(CodeEnum.SUCCESS,userService.addUser(users)); 384 | } 385 | 386 | 387 | @ApiOperation("编辑用户") 388 | @PostMapping("/update") 389 | public R modifyUsers(@RequestBody Users users) { 390 | return R.success(CodeEnum.SUCCESS,userService.updateUser(users)); 391 | } 392 | 393 | 394 | @ApiOperation("用户详情") 395 | @GetMapping("/detail") 396 | public R userDetail(Integer id) { 397 | Users user = userService.findUserById(id); 398 | if (user!=null) { 399 | UserOut out = new UserOut(); 400 | BeanUtils.copyProperties(user,out); 401 | out.setBirth(DateUtil.format(user.getBirthday(),Constants.DATE_FORMAT)); 402 | out.setIdent(ConvertUtil.identStr(user.getIdentity())); 403 | return R.success(CodeEnum.SUCCESS,out); 404 | } 405 | 406 | return R.fail(CodeEnum.NOT_FOUND); 407 | } 408 | 409 | @ApiOperation("删除用户") 410 | @GetMapping("/delete") 411 | public R delUsers(Integer id) { 412 | userService.deleteUser(id); 413 | return R.success(CodeEnum.SUCCESS); 414 | } 415 | 416 | @ApiOperation("获取当前用户登陆信息") 417 | @GetMapping("/currUser") 418 | public R getCurrUser() { 419 | Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 420 | if (principal!=null) { 421 | Map map = BeanUtil.beanToMap(principal); 422 | String username = (String) map.get("username"); 423 | if (StrUtil.isNotBlank(username)) { 424 | Users users = userService.findByUsername(username); 425 | UserOut out = new UserOut(); 426 | BeanUtils.copyProperties(users,out); 427 | out.setBirth(DateUtil.format(users.getBirthday(),Constants.DATE_FORMAT)); 428 | Integer identity = users.getIdentity(); 429 | String ident = ""; 430 | if (identity == Constants.STUDENT) { 431 | ident = Constants.STU_STR; 432 | }else if (identity == Constants.TEACHER) { 433 | ident = Constants.TEA_STR; 434 | }else if (identity == Constants.OTHER) { 435 | ident = Constants.OTHER_STR; 436 | }else if (identity == Constants.ADMIN) { 437 | ident = Constants.ADMIN_STR; 438 | } 439 | out.setIdent(ident); 440 | return R.success(CodeEnum.SUCCESS,out); 441 | } 442 | } 443 | return R.fail(CodeEnum.USER_NOT_FOUND); 444 | } 445 | } 446 | 447 | ``` 448 | 449 | ## 08 使用说明 450 | 451 | 1. 本地搭建好java8环境,数据库MySQL5.5+; 452 | 2. 导入sql文件至数据库中,修改数据连接(你自己库名,用户名,密码等); 453 | 3. 导入项目,配置maven, 等待依赖下载完成; 454 | 4. 安装IDE,打开项目; 455 | 5. 启动访问http://localhost:8080 即可; 456 | 6. 账号:【学生: stu/123】【教师: tea/123】【其他:other/123】【管理员:admin/123】 457 | 458 | ## 09 如何导入? 459 | 460 | - idea:直接open打开源码文件夹,记住是pom文件所在的目录 461 | - eclipse: 直接导入- 选择已存在导入maven项目 462 | - 检查maven是否配置好 463 | 464 | ## 10 源码下载 465 | 466 | 关注公众号【C you again】,回复“JavaWeb 图书管理系统”免费领取。 467 | 468 | 亦可直接扫描主页二维码关注,回复“JavaWeb 图书管理系统”免费领取,[点此打开个人主页](https://gzh.cyouagain.cn/) 469 | 470 | **说明:此源码来源于网络,若有侵权,请联系删除!!** -------------------------------------------------------------------------------- /JavaWeb宿舍管理系统(附 演示、源码下载地址).md: -------------------------------------------------------------------------------- 1 | 2 | > 宿舍管理是高校管理的重要组成部分,一套优秀的管理系统不仅可以降低宿舍管理的难度,也能在一定程度上减少学校管理费用的支出,能是建设现代化高校管理体系的重要标志。 3 | 4 | 本篇文章将带你从运行环境搭建、系统设计、系统编码到整个系统的实现,对整个过程进行详细描述,特别适合作为程序员的进阶项目案列,同样也是高校学生毕业设计系统实现的不二之选! 5 | 6 | **演示地址:[宿舍管理系统演示地址,点我查看](http://dorm.cyouagain.cn/)** 7 | 8 | **源码下载:若需获取本系统源码请在公众号【C you again】回复“宿舍管理系统”** 9 | 10 | ## 1、系统架构模式 11 | **本宿舍管理系统采用B/S架构模式。** 12 | 13 | 14 | B/S架构的全称为Browser/Server,即浏览器/服务器结构。Browser指的是Web浏览器,与C/S架构相比,B/S模式极少数事务逻辑在前端实现,它的主要事务逻辑在服务器端实现。B/S架构的系统无须特别安装,只有Web浏览器即可。 15 | 16 | **B/S架构的分层:** 17 | 18 | 与C/S架构只有两层不同的是,B/S架构有三层,分别为: 19 | 20 | - 第一层表现层:主要完成用户和后台的交互及最终查询结果的输出功能。 21 | - 第二层逻辑层:主要是利用服务器完成客户端的应用逻辑功能。 22 | - 第三层数据层:主要是进行数据持久化存储。 23 | 24 | ## 2、技术选型 25 | 26 | 选择合适的技术,整个项目就已经成功了一半,经过对系统需求和系统自身特点的分析,加上现代B/S模式主流架构解决方案,对本系统技术选型如下: 27 | 28 | **数据表现层:** Html+JavaScript+CSS+VUE 29 | 30 | **业务逻辑层** Java+Spring+SpringMVC 31 | 32 | **数据持久层:** MySql+MyBatis 33 | 34 | **开发工具:** Eclipse 35 | 36 | ## 3、用户分析 37 | 38 | 本系统主要应用于高校宿舍管理,使用人群如下: 39 | 40 | - 系统管理员:管理整个系统的安全运行,各个功能使用。 41 | - 宿舍管理员:管理自己负责的宿管和学生 42 | - 学生:查看浏览信息,提交任务 43 | 44 | ## 4、功能分析 45 | 46 | **系统管理员:** 47 | 48 | 1. 添加、修改、删除公告信息 49 | 2. 添加、修改、删除宿舍管理员信息 50 | 3. 添加、修改、删除学生信息 51 | 4. 宿舍楼管理及其宿舍管理员分配 52 | 5. 学生寝室管理 53 | 6. 发布考勤、打卡任务 54 | 7. 查看、修改个人信息 55 | 56 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926123800845.png) 57 | 58 | **宿舍管理员:** 59 | 60 | 1. 查看公告 61 | 2. 查看、删除自己管理的学生 62 | 3. 添加、修改、删除考勤记录 63 | 4. 查看学生打卡记录 64 | 5. 查看、修改个人信息 65 | 66 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926124203648.png) 67 | 68 | **学生:** 69 | 70 | 1. 查看公告 71 | 2. 查看考勤记录 72 | 3. 完成打卡任务,查看打卡记录 73 | 4. 查看、修改个人信息 74 | 75 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926124529377.png) 76 | 77 | ## 5、数据库设计 78 | 79 | 分析系统需求,数据库应有以下几张表: 80 | 81 | **t_admin:** 主要用于存储系统管理员数据 82 | 83 | |字段名称|类型 | 是否主键|说明 | 84 | |--|--|--|--| 85 | |adminId | int |是| 管理员Id,唯一| 86 | |userName| varchar|否|用户名| 87 | |password| varchar | 否 | 密码 | 88 | |name| varchar | 否 | 真实名称| 89 | |sex| varchar | 否 | 性别 | 90 | |sex| varchar | 否 | 电话 | 91 | 92 | **t_dormbuild:** 存储宿舍楼信息 93 | 94 | |字段名称|类型 | 是否主键|说明 | 95 | |--|--|--|--| 96 | |dormBuildId| int| 是 | 宿舍楼Id,唯一 | 97 | |dormBuildName| varchar | 否 | 宿舍楼名称 | 98 | |dormBuildDetail| varchar | 否 | 描述 | 99 | 100 | **t_dormmanager:** 主要存储宿舍管理员信息 101 | 102 | |字段名称|类型 | 是否主键|说明 | 103 | |--|--|--|--| 104 | |dormManId| varchar | 是 | 宿舍管理员Id,唯一 | 105 | |userName| varchar | 否 | 用户名,用于登录系统 | 106 | |password| varchar | 否 | 密码 | 107 | |dormBuildId| int| 否 | 宿舍楼Id | 108 | |dormBuildDetail| varchar | 否 | 描述 | 109 | |name| varchar | 否 | 真实姓名 | 110 | |sex| varchar | 否 | 性别 | 111 | |tel| varchar | 否 | 电话 | 112 | 113 | **t_notice:** 用于存储公告信息 114 | 115 | |字段名称|类型 | 是否主键|说明 | 116 | |--|--|--|--| 117 | |noticeId| int| 是 | 公告Id,唯一 | 118 | |noticePerson| varchar | 否 | 公告发布人 | 119 | |date| date| 否 | 公告发布日期 | 120 | |content| varchar | 否 | 发布内容 | 121 | 122 | **t_punchclock:** 用于存储打卡发布记录 123 | 124 | |字段名称|类型 | 是否主键|说明 | 125 | |--|--|--|--| 126 | |id| int| 是 | Id,唯一 | 127 | |theme| varchar | 否 | 打卡主题 | 128 | |detail| varchar | 否 | 打卡说明 | 129 | |date| varchar | 否 | 发布日期 | 130 | |person| varchar | 否 | 发布人 | 131 | 132 | **t_punchclockrecord:** 用于存储打卡信息 133 | 134 | |字段名称|类型 | 是否主键|说明| 135 | |--|--|--|--| 136 | |id | int| 是 | 记录Id,唯一 | 137 | |punchClock_id| varchar | 否 | 打卡Id | 138 | |punchClock_date | date| 否 | 发布日期 | 139 | |punchClock_theme | varchar | 否 | 打卡主题 | 140 | |punchClock_detail | varchar | 否 | 打卡说明 | 141 | |punchClock_person | varchar | 否 | 发布人 | 142 | |name | varchar | 否 | 学生姓名 | 143 | |dormName | varchar | 否 | 寝室号 | 144 | |tel | varchar | 否 | 学生电话 | 145 | |stuNum | varchar | 否 | 学生学号 | 146 | |dormBuildId | int| 否 | 宿舍楼 | 147 | |isRecord | tinyint | 否 | 是否已经打卡 | 148 | 149 | **t_record:** 用于存储考勤记录 150 | 151 | |字段名称|类型 | 是否主键|说明| 152 | |--|--|--|--| 153 | |recordId | int| 是 | 考勤Id,唯一 | 154 | |studentNumber| varchar | 否 | 学生学号 | 155 | |dormBuildId | int| 否 | 宿舍楼 | 156 | |dormName | varchar | 否 | 寝室号 | 157 | |date | varchar | 否 | 考勤日期 | 158 | |detail | varchar | 否 | 详细说明 | 159 | 160 | **t_student:** 学生表,用于存放学生信息 161 | 162 | |字段名称|类型 | 是否主键|说明| 163 | |--|--|--|--| 164 | |studentId | int| 是 | 学生Id,唯一 | 165 | |stuNum | varchar | 否 | 学号 | 166 | |password | varchar | 否 | 密码 | 167 | |name | varchar | 否 | 姓名 | 168 | |dormBuildId | int| 否 | 宿舍楼 | 169 | |dormName | varchar | 否 | 寝室号 | 170 | |sex | varchar | 否 | 性别 | 171 | |tel | varchar | 否 | 电话 | 172 | 173 | 174 | ## 6、运行环境搭建 175 | 176 | 前面已经提到,本系统使用SSM框架,搭建过程较为繁琐,因此将此部分独立出来,作为一个专题,具体搭建过程请参考[《手把手教你搭建SSM框架(Eclipse版)》](https://blog.csdn.net/qq_40625778/article/details/108738764) 这篇文章。搭建过程若出现其他问题,可以在[公众号【C you again】](https://gzh.cyouagain.cn) 后台私信。 177 | 178 | ## 7、项目工程结构 179 | 180 | 根据第六步搭建完系统运行环境后,工程结构目录如下图所示 181 | 182 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926161618970.png) 183 | 184 | **对工程结构各个目录的解释:** 185 | 186 | ```java 187 | com.cya.controller 188 | ``` 189 | controller包用于存放接收请求的类,充当前后端数据交互的“桥梁” 190 | 191 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020092616250568.png) 192 | 193 | ```java 194 | com.cya.service 195 | ``` 196 | service包是所有业务逻辑的接口 197 | 198 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926162803593.png) 199 | 200 | ```java 201 | com.cya.service.impl 202 | ``` 203 | service.impl包用于存放service接口的所有实现类 204 | 205 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926162956990.png) 206 | 207 | ```java 208 | com.cya.mapper 209 | ``` 210 | mapper包用于存放对数据库操纵的接口和对应的xml实现 211 | 212 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926163235344.png) 213 | 214 | ```java 215 | com.cya.entity 216 | ``` 217 | entity包用于存放项目中用到的所有实体类,它与数据库中的表相对应 218 | 219 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926163450155.png) 220 | 221 | resources文件下存放SSM框架整合的必要配置文件,详情请看[《手把手教你搭建SSM框架(Eclipse版)》](https://blog.csdn.net/qq_40625778/article/details/108738764) 222 | 223 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020092616374144.png) 224 | 225 | dorm是存放所有model层文件的父级文件夹,其中admin,dormManager、student三个子文件夹存放系统管理员、宿舍管理员、学生三个角色对应的HTML文件。 226 | 227 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020092616420276.png) 228 | 229 | ## 8、功能实现及展示 230 | 231 | 由于系统包含功能众多,在此无法一一列举,所以挑选几个代表做展示,如需获取完整源码请在公众号【C you again】回复“宿舍管理系统”。 232 | 233 | #### 8.1 登录功能实现 234 | 235 | 项目启动成功后,在浏览器地址栏输入:http://localhost:8080/dormManage/ 进入用户登录界面如下图所示: 236 | 237 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926165247339.png) 238 | 239 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926165939202.png) 240 | 241 | 242 | 243 | 在此界面用户可以选择不同的角色登录,输入每个角色对应的登录信息后,首先会判断输入信息的有效性,做出相应的响应或提示。登录功能具体的实现代码如下,此处仅展示controller层代码,如下: 244 | 245 | ```java 246 | package com.cya.controller; 247 | 248 | import java.util.ArrayList; 249 | import java.util.List; 250 | import java.util.Map; 251 | 252 | import javax.management.relation.Role; 253 | import javax.servlet.http.HttpServletRequest; 254 | import javax.servlet.http.HttpSession; 255 | 256 | import org.apache.tomcat.util.digester.ArrayStack; 257 | import org.springframework.beans.factory.annotation.Autowired; 258 | import org.springframework.stereotype.Controller; 259 | import org.springframework.web.bind.annotation.RequestBody; 260 | import org.springframework.web.bind.annotation.RequestMapping; 261 | import org.springframework.web.bind.annotation.ResponseBody; 262 | 263 | import com.cya.entity.Login; 264 | import com.cya.entity.Result; 265 | import com.cya.service.ILoginService; 266 | import com.cya.service.impl.LoginServiceImpl; 267 | 268 | @Controller 269 | @ResponseBody 270 | public class LoginController { 271 | 272 | @Autowired 273 | private ILoginService loginServiceImpl; 274 | 275 | @RequestMapping("login") 276 | public List login(HttpServletRequest request, @RequestBody Login login) { 277 | List list=loginServiceImpl.login(login); 278 | if(list.size()==1) { 279 | HttpSession session=request.getSession(); 280 | session.setAttribute(login.getRole(), list); 281 | System.out.println("session="+session.getAttribute(login.getRole())); 282 | } 283 | return list; 284 | } 285 | 286 | @RequestMapping("getSession") 287 | public List getSession(HttpServletRequest request,@RequestBody Login login){ 288 | System.out.println(login); 289 | System.out.println(request.getSession().getAttribute(login.getRole())); 290 | List list=new ArrayList<>(); 291 | list.add(request.getSession().getAttribute(login.getRole())); 292 | return list; 293 | } 294 | 295 | @RequestMapping("exitSys") 296 | public Result exitSys(HttpServletRequest request) { 297 | String exit=""; 298 | try { 299 | if(request.getParameter("exit")!=null) { 300 | exit=request.getParameter("exit"); 301 | } 302 | request.getSession().removeAttribute(exit); 303 | return new Result(true, "注销成功"); 304 | } catch (Exception e) { 305 | // TODO: handle exception 306 | e.printStackTrace(); 307 | return new Result(false, "注销失败"); 308 | } 309 | } 310 | } 311 | 312 | ``` 313 | #### 8.2 发布公告功能实现 314 | 315 | 在系统管理员端,有发布公告的权限,系统管理员点击添加公告按钮,输入相关信息后进行有效性校验,校验成功及代表公告发布成功。 316 | 317 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926170458326.png) 318 | 319 | 成功发布公告后,会出现在宿舍管理员端和学生端界面,效果图如下: 320 | 321 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020092617100845.png) 322 | 323 | 公告模块主要代码以mapper层实现为例: 324 | 325 | ```xml 326 | 327 | 328 | 336 | 337 | 338 | insert into t_notice(noticePerson,date,content) values(#{noticePerson},current_date,#{content}) 339 | 340 | 341 | 344 | 345 | 346 | update t_notice set noticePerson=#{noticePerson},content=#{content} where noticeId=#{noticeId} 347 | 348 | 349 | 350 | 351 | delete from t_notice where noticeId=#{noticeId} 352 | 353 | 354 | 355 | ``` 356 | #### 8.3 考勤记录功能实现 357 | 358 | 宿舍管理员根据自己所管理楼,对住在管理范围内的学生进行考勤,并添加考勤记录,学生端也会显示考勤信息。 359 | 360 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200926171810741.png) 361 | 362 | 主要实现代码如下: 363 | 364 | ```java 365 | @RequestMapping("/getRecordMsg") 366 | public PageResult getRecordMsg(HttpServletRequest request){ 367 | Integer pageNum=1; 368 | Integer pageSize=20; 369 | Integer dormBuildId=0; 370 | String filter=request.getParameter("filter"); 371 | String key=request.getParameter("key"); 372 | if(request.getParameter("pageNum")!=null && request.getParameter("pageNum")!="") { 373 | pageNum=Integer.parseInt(request.getParameter("pageNum")); 374 | } 375 | if(request.getParameter("pageSize")!=null && request.getParameter("pageSize")!="") { 376 | pageSize=Integer.parseInt(request.getParameter("pageSize")); 377 | } 378 | if(request.getParameter("dormBuildId")!=null && request.getParameter("dormBuildId")!="") { 379 | dormBuildId=Integer.parseInt(request.getParameter("dormBuildId")); 380 | } 381 | System.out.println("pageNum="+pageNum); 382 | System.out.println("pageSize="+pageSize); 383 | return dormManageServiceImpl.getRecordMsg(pageNum, pageSize, filter, key, dormBuildId); 384 | } 385 | 386 | @RequestMapping("getRecordById") 387 | public Record getRecordById(Integer recordId) { 388 | return dormManageServiceImpl.getRecordById(recordId); 389 | } 390 | 391 | 392 | @RequestMapping("updataRecordMsg") 393 | public Result updataRecordMsg(@RequestBody Record record) { 394 | try { 395 | dormManageServiceImpl.updataRecordMsg(record); 396 | return new Result(true, "更新成功"); 397 | } catch (Exception e) { 398 | // TODO: handle exception 399 | e.printStackTrace(); 400 | return new Result(false, "更新失败"); 401 | } 402 | } 403 | 404 | @RequestMapping("addRecordMsg") 405 | public Result addRecordMsg(@RequestBody Record record) { 406 | try { 407 | System.out.println(record); 408 | dormManageServiceImpl.addRecordMsg(record); 409 | return new Result(true, "添加成功"); 410 | } catch (Exception e) { 411 | // TODO: handle exception 412 | e.printStackTrace(); 413 | return new Result(false, "添加失败"); 414 | } 415 | } 416 | 417 | @RequestMapping("recordManagerDeleteById1") 418 | public Result recordManagerDeleteById(HttpServletRequest request) { 419 | Integer recordId=0; 420 | if(request.getParameter("recordId")!=null && request.getParameter("recordId")!="") { 421 | recordId=Integer.parseInt(request.getParameter("recordId")); 422 | } 423 | try { 424 | dormManageServiceImpl.recordManagerDeleteById1(recordId); 425 | return new Result(true, "删除成功"); 426 | } catch (Exception e) { 427 | // TODO: handle exception 428 | e.printStackTrace(); 429 | return new Result(false, "删除失败"); 430 | } 431 | } 432 | ``` 433 | 434 | ## 9、源码下载 435 | 436 | 若需获取本系统源码请在公众号【C you again】回复“宿舍管理系统” 437 | 438 | 你也可以点击此链接[快速回复](https://gzh.cyouagain.cn/) 439 | 440 | ## 10、相关说明 441 | 442 | 1. 制作不易,记得点赞+收藏+转发 443 | 3. 本人技术有限,若有错误欢迎指正 444 | 4. 本系统和文章均属于【C you again】原创,欢迎个人博客、各大网站转载,请注明转载地址 445 | 446 | #### 演示地址:[宿舍管理系统演示](http://dorm.cyouagain.cn/) 447 | 448 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 目录一览表: 4 | 5 | #### [1、JavaWeb宿舍管理系统(附 演示、源码下载地址)](https://gitee.com/cyouagain/graduation/blob/master/JavaWeb%E5%AE%BF%E8%88%8D%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%EF%BC%88%E9%99%84%20%E6%BC%94%E7%A4%BA%E3%80%81%E6%BA%90%E7%A0%81%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%EF%BC%89.md) 6 | 7 | 8 | 宿舍管理是高校管理的重要组成部分,一套优秀的管理系统不仅可以降低宿舍管理的难度,也能在一定程度上减少学校管理费用的支出,能是建设现代化高校管理体系的重要标志。本篇文章将带你从运行环境搭建、系统设计、系统编码到整个系统的实现,对整个过程进行详细描述,特别适合作为程序员的进阶项目案列,同样也是高校学生毕业设计系统实现的不二之选! 9 | 10 | 11 | **技术选型** 12 | 13 | 选择合适的技术,整个项目就已经成功了一半,经过对系统需求和系统自身特点的分析,加上现代B/S模式主流架构解决方案,对本系统技术选型如下: 14 | 15 | - 数据表现层: Html+JavaScript+CSS+VUE 16 | - 业务逻辑层 Java+Spring+SpringMVC 17 | - 数据持久层: MySql+MyBatis 18 | - 开发工具: Eclipse 19 | 20 | **用户分析** 21 | 22 | 本系统主要应用于高校宿舍管理,使用人群如下: 23 | 24 | - 系统管理员:管理整个系统的安全运行,各个功能使用。 25 | - 宿舍管理员:管理自己负责的宿管和学生 26 | - 学生:查看浏览信息,提交任务 27 | 28 | 29 | 30 | #### [2、基于SSH框架的人力资源管理系统设计与实现](https://gitee.com/cyouagain/graduation/blob/master/%E5%9F%BA%E4%BA%8ESSH%E6%A1%86%E6%9E%B6%E7%9A%84%E4%BA%BA%E5%8A%9B%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.md) 31 | 32 | 人力资源是企业的第一资源,如何有效地管理、利用和开发这一资源 ,是摆在每一位管理者面前必须重视的大事。人力资源管理工作可分为建立规章制度的基础性工作、基于标准操作流程的例行性工作、人力资源规划等战略性工作以及企业文化建设、职工职业生涯设计等开拓性工作。其中,大量的例行性工作往往占据了人力资源管理工作人员的大部分时间。如果能建立起人力资源管理信息系统,把这部分工作分离出来,用计算机来进行管理,必将能大大提高人力资源管理人员的工作效率。同时,利用人力资源管理信息系统中存储的大量历史信息,建立起企业人力资源决策支持系统,可为领导决策提供有用的参考信息。 33 | 34 | **技术选型** 35 | 36 | Spring+SpringMVC+ Hibernate+ MySql 37 | 38 | **运行环境** 39 | 40 | Java1.8 + MySql + Eclipse 41 | 42 | **功能概述** 43 | 44 | - 本系统主要有部门管理、员工管理、招聘管理、培训管理、奖罚管理、薪资管理、个人信息管理七大模块。 45 | - 部门管理:此模块可以查看所有部门的详细信息,如:部门名称,部门创建时间,部门人数。也可以对某个部门进行修改删除操作,除此以外,还可以添加部门。 46 | - 员工管理:员工管理模块有查看、修改、添加、删除员工信息的功能。 47 | - 招聘管理:本模块可以查看求职人员的具体信息,包括姓名、性别、应聘职位、工作经验等等,也可以对应聘人员进行删除、录用。 48 | - 培训管理:此模块用来发布企业的培训信息,如培训时间,培训地址,培训课程和培训人员等等。 49 | - 奖罚管理:记录企业员工的奖罚情况。 50 | - 薪资管理:管理企业员工薪资,有调整薪资,添加员工及薪资,删除员工及薪资等功能。 51 | - 个人信息管理:查看修改个人信息。 52 | 53 | #### [3、基于java的企业进销存管理系统设计与实现](https://gitee.com/cyouagain/graduation/blob/master/%E5%9F%BA%E4%BA%8Ejava%E7%9A%84%E4%BC%81%E4%B8%9A%E8%BF%9B%E9%94%80%E5%AD%98%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.md) 54 | 55 | 销存管理系统是一个基于本地与网络的应用系统,它是一个面对当前的进销存管理工作基本还处于手工和半信息自动化处理状态而应运而生的一个基于本地与网络的一个完全信息自动化的系统,整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发,完成进货、销售、库存管理的全过程。本文所设计的企业进销存管理系统可以满足企业进货、销售和库存管理方面的需要。 56 | 57 | **运行环境** 58 | 59 | - 操作系统:Windows 10 60 | - JDK环境:jdk1.8 61 | - 开发工具:Eclipse8.0 62 | - 数据库管理软件:My SQL 5.7 63 | 64 | **功能概述** 65 | 66 | - 基础资料:基础资料是每个系统都必须具备的功能,该模块用于管理企业进销存管理系统中的客户、商品和供应商信息,其功能主要是对这些基础信息进行添加、修改和删除 67 | - 进货管理:进货管理功能模块用于管理企业的进货采购业务,是进销存管理系统中不可缺少的重要组成部分,它主要负责为系统记录进货单及其退货信息,相应的进货商品会添加到库存管理中 68 | - 销售管理:销售管理功能模块用于管理企业的销售业务,商品销售是进销存管理中的重要环节之一,进货商品在入库之后就可以开始销售了 69 | - 库存管理:库存管理模块是企业进销存管理系统中的库存管理模块包括库存盘点和价格调整两个功能 70 | - 查询统计:查询统计模块是进销存管理系统中不可缺少的重要组成部分,它主要包括销售查询和商品查询 71 | - 系统管理:系统管理模块主要有更改密码、退出系统两个模块 72 | 73 | 74 | #### [4、基于SSM框架的JavaWeb通用权限管理系统](https://gitee.com/cyouagain/graduation/blob/master/%E5%9F%BA%E4%BA%8ESSM%E6%A1%86%E6%9E%B6%E7%9A%84JavaWeb%E9%80%9A%E7%94%A8%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F.md) 75 | 76 | 这是一个通用权限管理系统项目,基于SSM(Spring + Spring-MVC +Mybatis)框架开发,其SQL语句持久在Hibernate 中,对原生SQL的支持较好。制作该系统的初衷是用来帮助JavaWeb开发者或初学者学习、借鉴的需要。读者可以在这个 系统基础上引入其它技术或完全依赖本系统技术进行功能拓展,来开发实际应用需求的项目,免去了应用系统中对于“ 权限设计”这一部分的麻烦。 77 | 78 | **技术选型** 79 | 80 | > Jsp 、SSM(Spring + Spring-MVC + Mybatis)、Shiro 、Mvc、Jdbc、MySQL、DWZ富客户端框架 + Jquery + Ajax 81 | 82 | **环境开发** 83 | 84 | > JDK:JDK1.6+ 、WEB:Tomcat6.0+ 、DB:MySQL5+ 、IDE: MyEclipse8.5+/Eclipse4.4+ 85 | 86 | 87 | #### [5、基于ssm的客户管理系统](https://gitee.com/cyouagain/graduation/blob/master/%E5%9F%BA%E4%BA%8Essm%E7%9A%84%E5%AE%A2%E6%88%B7%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F.md) 88 | 89 | **技术选型** 90 | 91 | > ssm + jdk1.8 + mysql5.4 92 | 93 | **运行环境** 94 | 95 | > ecplice + jdk1.8 + tomcat 96 | 97 | **主要功能** 98 | 99 | 1- 字典管理 100 | 101 | 2- 用户管理 102 | 103 | 3- 角色管理 104 | 105 | 4- 权限管理 106 | 107 | 5- 部门管理 108 | 109 | 6-客户信息管理 110 | 111 | 7-数据添加-编辑-删除 112 | 113 | 8-客户信息的跟进 114 | 115 | 9-客户信息状态 116 | 117 | #### [6、仓库ERP管理系统(springboot)设计与实现](https://gitee.com/cyouagain/graduation/blob/master/%E4%BB%93%E5%BA%93ERP%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%EF%BC%88springboot%EF%BC%89%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.md) 118 | 119 | **技术选型** 120 | 121 | > springboot + mybatis + easyui 122 | 123 | **运行环境** 124 | 125 | - 开发工具:idea/eclipse,推荐使用idea 126 | - maven3+,并且在开发工具中配置好 127 | - jdk1.8+,推荐1.8 128 | - MySQL5.5+, 推荐5.7,5.6 129 | 130 | **技术架构** 131 | 132 | - 核心框架:SpringBoot 2.0.0 133 | - 持久层框架:Mybatis 1.3.2 134 | - 日志管理:Log4j 2.10.0 135 | - JS框架:Jquery 1.8.0 136 | - UI框架: EasyUI 1.9.4 137 | - 模板框架: AdminLTE 2.4.0 138 | - 项目管理框架:Maven 3.2.3 139 | 140 | **功能模块** 141 | 142 | 1. 零售管理 143 | 2. 采购管理 144 | 3. 销售管理 145 | 4. 仓库管理 146 | 5. 财务管理 147 | 6. 报表查询 148 | 7. 商品管理 149 | 8. 基本信息 150 | 9. 系统管理 151 | 152 | 153 | #### [7、Java GUI 图书管理系统设计与开发](https://gitee.com/cyouagain/graduation/blob/master/Java%20GUI%20%E5%9B%BE%E4%B9%A6%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%BC%80%E5%8F%91.md) 154 | 155 | 一款功能强大的图书馆管理系统,功能齐全,小白/大学生项目实训,学习的不二之选。 156 | 157 | **技术** 158 | 159 | 此系统使用 java awt 实现。java.awt是一个软件包,包含用于创建用户界面和绘制图形图像的所有分类。在AWT术语中,诸如按钮或滚动条之类的用户界面对象称为组件。Component类是所有 AWT 组件的根。 160 | 161 | **功能概述** 162 | 163 | 图书维护: 164 | 165 | - 添加:输入图书编号、图书名称、图书页数、图书作者、出版社、库存数量、所属类型等图书信息,点击Save按钮添加新图书。 166 | - 修改:首先根据图书编号查询到所要修改的图书,然后对图书的名称、图书页数、作者、出版时间、定价、库存等信息进行修改。 167 | - 删除:首先根据图书编号查询到所要删除的图书,然后进行删除操作。 168 | 169 | 读者维护: 170 | 171 | - 添加:输入读者编号、读者姓名、读者类别、读者性别、可借天数等信息,然后点击“Add”按钮添加新读者。 172 | - 修改:首先根据读者编号查询到要修改的读者信息,再对读者编号、读者姓名、读者类别、读者性别、可借天数等信息进行修改,修改完成点击“保存”按钮完成修改。 173 | - 删除:首先根据读者编号查询到要删除的读者信息,然后进行删除操作。 174 | 175 | 借阅管理: 176 | 177 | - 借书管理:首先根据图书编号和读者编号查询到图书和读者信息,在点击“借出”按钮完成借书。 178 | - 还书管理:首先根据图书编号和读者编号查询到图书和读者信息,在点击“还书”按钮完成还书。 179 | 180 | 查询管理: 181 | 182 | - 图书查询:输入图书名称、作者、出版时间中的任意一项,点击“查询”按钮查询图书。 183 | - 读者查询:输入读者姓名、读者类型中的任意一项,点击“查询”按钮查询读者。 184 | 185 | 系统管理: 186 | 187 | - 修改密码:首先输入旧密码等待校验,旧密码输入正确后即可设定新的密码。 188 | - 退出系统:退出图书管理系统程序。 189 | 190 | 191 | #### [8、JavaWeb 图书管理系统设计与开发](https://gitee.com/cyouagain/graduation/blob/master/JavaWeb%20%E5%9B%BE%E4%B9%A6%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%BC%80%E5%8F%91.md) 192 | 193 | 图书管理系统就是利用计算机,结合互联网对图书进行结构化、自动化管理的一种软件,来提高对图书的管理效率。 194 | 195 | **技术** 196 | 197 | > springboot + jpa + mybatis + springsecurity +javaex 198 | 199 | 200 | **运行环境** 201 | 202 | > jdk1.8 + maven3 + mysql5.7 203 | 204 | 205 | **功能介绍** 206 | 207 | 图书管理: 208 | 209 | - 图书列表:显示已经上架的图书信息,可对上架图书进行搜索、修改、删除操作。 210 | - 图书上架:录入图书信息,输入图书名称、作者、图书分类,页数,定价等数据进行图书录入。 211 | 212 | 借阅管理: 213 | 214 | - 搜索图书:根据图书名称、作者名称,图书分类等搜索图书。 215 | - 借阅图书:录入图书信息,输入图书名称、作者、图书分类,页数,定价等数据进行图书借阅。 216 | - 归还图书:对已经借阅的图书进行归还操作。 217 | 218 | 读者管理: 219 | 220 | - 读者列表:显示已经注册的读者用户。 221 | - 读者添加:录入用户的昵称、用户名、密码、生日、电话、邮箱等信息添加新用户。 222 | 223 | 用户中心: 224 | 225 | - 个人信息:查看、修改个人信息。 226 | - 用户管理:对已经添加的用户进行搜索、删除、使用权限信息进行设置。 227 | - 添加管理员:录入管理员的昵称、用户名、密码、生日、电话、邮箱等信息添加新管理员。 228 | 229 | 230 | #### [9、基于web的图书管理系统设计与实现(附演示地址)](https://gitee.com/cyouagain/graduation/blob/master/%E5%9F%BA%E4%BA%8Eweb%E7%9A%84%E5%9B%BE%E4%B9%A6%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0%EF%BC%88%E9%99%84%E6%BC%94%E7%A4%BA%E5%9C%B0%E5%9D%80%EF%BC%89.md) 231 | 232 | 图书管理系统就是利用计算机,结合互联网对图书进行结构化、自动化管理的一种软件,来提高对图书的管理效率。本系统采用Java+Servlet+Jsp 的方式实现基于web的图书管理系统。 233 | 234 | **开发工具及相关技术** 235 | 236 | - Java技术 237 | - HTML、css、javascript技术 238 | - Servlet技术 239 | - Eclipse开发工具 240 | - MySql数据库 241 | 242 | **功能概述** 243 | 244 | 用户端: 245 | 246 | - 图书查询:根据图书编号、图书名称查询图书信息,可查询图书的编号、名称、分类、作者、价格、在馆数量等。 247 | - 借阅信息:可查询图书的基本信息、借阅日期、截止还书日期、超期天数等。 248 | - 借阅历史:查询自己以往的借阅历史,包括哪些图书等具体信息。 249 | - 我的:查看个人资料,修改账户密码,退出系统。 250 | 251 | 管理员端: 252 | 253 | - 图书管理:根据图书编号、图书名称查询图书基本信息,添加、修改、删除图书。 254 | - 图书分类管理:根据分类名称查询图书分类信息,添加、修改、删除图书分类。 255 | - 图书借阅:展示所有正在借阅图书的信息。 256 | - 图书归还:展示所有已归还图书的信息。 257 | - 公告管理:向用户发布公告。 258 | - 读者管理:根据账号、姓名查询读者基本信息,添加、修改、删除读者信息。 259 | - 我的:查看个人资料,修改账户密码,退出系统。 260 | 261 | 262 | #### [10、基于web的机票管理系统设计与实现(一)](https://gitee.com/cyouagain/graduation/blob/master/%E5%9F%BA%E4%BA%8Eweb%E7%9A%84%E6%9C%BA%E7%A5%A8%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0%EF%BC%88%E4%B8%80%EF%BC%89.md) 263 | 264 | 本系统使用Eclipse开发工具,使用Redis、MySQL数据库,采用MVC三层架构的方式,结合当前最流行的SSM框架以及支付宝沙箱支付环境来实现各个功能。系统分为用户端和管理员端。用户端实现了用户注册与登录、用户评论、机票查询,机票预订,订单查询、广告展示等功能。管理员端包括航班信息管理模块、订单信息管理模块、用户信息管理模块、留言评论管理模块、广告信息管理模块、个人信息管理模块等六大模块,具有开放体系结构的、易扩充的、易维护的、具有良好人机界面的优点。 265 | 266 | 经过充分的测试,测试数据均正确无误,各个模块运行良好。机票预订系统的推出,为乘客出行提供方便,便于机场工作人员对机票信息进行管理,提高了机场工作人员对机票管理的工作效率。 267 | 268 | **开发工具及技术** 269 | 270 | - Java web 271 | - SSM(Spring + SpringMVC + MyBatis) 272 | - AngularJS 273 | - MySQL 274 | - Redis 275 | - Eclipse 276 | 277 | **系统功能分析** 278 | 279 | - 后台航班信息管理:主要是指添加航班信息,删除航班信息,查询航班信息和航班信息详细情况查看等。 280 | 281 | - 后台订单信息管理:后台订单信息管理主要包括订单列表,查询订单信息,订单信息的删除等。 282 | 283 | - 后台用户信息管理:主要指注册用户的展示与按条件查询注册用户。 284 | 285 | - 后台留言评论管理:主要指展示用户的留言信息和按留言日期、留言用户查找留言信息等。 286 | 287 | - 后台广告信息管理:主要指添加广告信息,删除广告信息,设置广告的有效性等。 288 | 289 | - 后台个人信息管理:主要指查看个人信息,修改个人信息。 290 | 291 | - 前台登录与注册管理:包括前台系统用户的注册于登录。 292 | 293 | - 前台首页信息展示:主要是指航班信息展示、航班信息查询、航班信息详情、登录用户信息展示、留言板和个人信息详情与修改等。 294 | 295 | - 前台订单页面:主要是订单内容的填写和订单详情。 前台订单支付:是指使用支付宝沙箱环境支付订单。 296 | 297 | 298 | #### [11、基于web的机票管理系统设计与实现(二)](https://gitee.com/cyouagain/graduation/blob/master/%E5%9F%BA%E4%BA%8Eweb%E7%9A%84%E6%9C%BA%E7%A5%A8%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0%EF%BC%88%E4%BA%8C%EF%BC%89.md) 299 | 300 | 301 | #### [12、图书管理系统设计与实现—看这篇就够了](https://gitee.com/cyouagain/graduation/blob/master/%E5%9B%BE%E4%B9%A6%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0%E2%80%94%E7%9C%8B%E8%BF%99%E7%AF%87%E5%B0%B1%E5%A4%9F%E4%BA%86.md) 302 | 303 | 图书馆人员结构复杂,人员数量有限,涉及方面很广,如果还使用手工操作处理图书借阅问题,工作将非常繁琐,需要大量的人力、物理、财力,极大的浪费了资源,对于图书管理人员来说,图书馆管理包括图书信息管理、图书类别管理、借阅信息管理、管理员信息管理等等。而这些项目在过去靠手工操作,需要手工记录这些事情,不但麻烦,还经常出错,给广大用户带来很多不便,因此,开发这样一套图书馆管理系统软件。让管理员方便的管理图书及用户信息,方便用户查找图书。 304 | 305 | **实现平台及技术** 306 | 307 | - JAVA语言 308 | - MYSQL数据库 309 | - WINDOWS 10操作系统 310 | - JAVAEE 技术 311 | - Servlet技术 312 | - Eclipse工具 313 | - Html、css、JavaScript 314 | 315 | **功能概述** 316 | 317 | - 用户登录。管理员或会员根据用户名和密码进行身份验证登录系统。 318 | - 图书管理。根据图书编号、图书名称查询图书基本信息添加、修改、删除图书。 319 | - 读者管理。根据账号、姓名查询读者基本信息。添加、修改、删除读者信息。 320 | - 图书分类管理。根据分类名称查询图书分类信息。添加、修改、删除图书分类。 321 | - 图书借阅。展示所有正在借阅图书的信息。 322 | - 图书归还。展示所有已归还图书的信息。 323 | - 修改和查询个人信息。 324 | 325 | 计算机类毕业设计源码大全,查看更多文章请关注公众号【C you again】 326 | 327 | ![微信扫码关注这个有温度的程序猿](https://img-blog.csdnimg.cn/20210121202545964.png) 328 | -------------------------------------------------------------------------------- /仓库ERP管理系统(springboot)设计与实现.md: -------------------------------------------------------------------------------- 1 | @[toc] 2 | 3 | **源码下载:关注公众号【C you again】,回复“springboot 仓库ERP管理系统”免费下载。** 4 | 5 | ## 01 系统概述 6 | 7 | 基于SpringBoot框架和SaaS模式,非常好用的ERP软件,目前专注进销存+财务功能。主要模块有零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询、系统管理等。支持预付款、收入支出、仓库调拨、组装拆卸、订单等特色功能。拥有库存状况、出入库统计等报表。权限控制更加精确 8 | 9 | ## 02 技术 10 | 11 | > springboot + mybatis + easyui 12 | 13 | ## 03 运行环境 14 | 15 | - 开发工具:idea/eclipse,推荐使用idea 16 | - maven3+,并且在开发工具中配置好 17 | - jdk1.8+,推荐1.8 18 | - MySQL5.5+, 推荐5.7,5.6 19 | 20 | ## 04 技术架构 21 | 22 | - 核心框架:SpringBoot 2.0.0 23 | - 持久层框架:Mybatis 1.3.2 24 | - 日志管理:Log4j 2.10.0 25 | - JS框架:Jquery 1.8.0 26 | - UI框架: EasyUI 1.9.4 27 | - 模板框架: AdminLTE 2.4.0 28 | - 项目管理框架:Maven 3.2.3 29 | 30 | ## 05 功能模块 31 | 32 | - 零售管理 33 | - 采购管理 34 | - 销售管理 35 | - 仓库管理 36 | - 财务管理 37 | - 报表查询 38 | - 商品管理 39 | - 基本信息 40 | - 系统管理 41 | 42 | ## 06 项目结构 43 | 44 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825101150375.png) 45 | 46 | ## 07 运行截图 47 | 48 | 49 | #### 零售关系-》零售出库 50 | 51 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825101504560.png) 52 | 53 | 54 | #### 采购管理-》采购入库 55 | 56 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825101600963.png) 57 | 58 | #### 财务管理-》收入单 59 | 60 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825101834804.png) 61 | 62 | #### 商品管理-》商品信息 63 | 64 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825102020880.png) 65 | 66 | ## 08 主要代码 67 | 68 | #### 用户管理 69 | 70 | ```java 71 | package com.jsh.erp.controller; 72 | 73 | import com.alibaba.fastjson.JSON; 74 | import com.alibaba.fastjson.JSONArray; 75 | import com.alibaba.fastjson.JSONObject; 76 | import com.github.pagehelper.PageHelper; 77 | import com.github.pagehelper.PageInfo; 78 | import com.jsh.erp.constants.BusinessConstants; 79 | import com.jsh.erp.constants.ExceptionConstants; 80 | import com.jsh.erp.datasource.entities.Tenant; 81 | import com.jsh.erp.datasource.entities.User; 82 | import com.jsh.erp.datasource.entities.UserEx; 83 | import com.jsh.erp.datasource.vo.TreeNodeEx; 84 | import com.jsh.erp.exception.BusinessParamCheckingException; 85 | import com.jsh.erp.service.log.LogService; 86 | import com.jsh.erp.service.tenant.TenantService; 87 | import com.jsh.erp.service.user.UserService; 88 | import com.jsh.erp.utils.*; 89 | import org.slf4j.Logger; 90 | import org.slf4j.LoggerFactory; 91 | import org.springframework.beans.factory.annotation.Value; 92 | import org.springframework.web.bind.annotation.*; 93 | import org.springframework.web.context.request.RequestContextHolder; 94 | import org.springframework.web.context.request.ServletRequestAttributes; 95 | 96 | import javax.annotation.Resource; 97 | import javax.servlet.http.HttpServletRequest; 98 | import javax.servlet.http.HttpServletResponse; 99 | import java.net.URLEncoder; 100 | import java.security.NoSuchAlgorithmException; 101 | import java.util.*; 102 | import java.util.concurrent.ExecutorService; 103 | import java.util.concurrent.Executors; 104 | 105 | import static com.jsh.erp.utils.ResponseJsonUtil.returnJson; 106 | 107 | /** 108 | * @author 109 | */ 110 | @RestController 111 | @RequestMapping(value = "/user") 112 | public class UserController { 113 | private Logger logger = LoggerFactory.getLogger(UserController.class); 114 | 115 | @Value("${manage.roleId}") 116 | private Integer manageRoleId; 117 | 118 | @Resource 119 | private UserService userService; 120 | 121 | @Resource 122 | private TenantService tenantService; 123 | 124 | @Resource 125 | private LogService logService; 126 | 127 | private static String message = "成功"; 128 | private static final String HTTP = "http://"; 129 | private static final String CODE_OK = "200"; 130 | 131 | @PostMapping(value = "/login") 132 | public BaseResponseInfo login(@RequestParam(value = "loginName", required = false) String loginName, 133 | @RequestParam(value = "password", required = false) String password, 134 | HttpServletRequest request)throws Exception { 135 | logger.info("============用户登录 login 方法调用开始=============="); 136 | String msgTip = ""; 137 | User user=null; 138 | BaseResponseInfo res = new BaseResponseInfo(); 139 | try { 140 | String username = loginName.trim(); 141 | password = password.trim(); 142 | //判断用户是否已经登录过,登录过不再处理 143 | Object userInfo = request.getSession().getAttribute("user"); 144 | User sessionUser = new User(); 145 | if (userInfo != null) { 146 | sessionUser = (User) userInfo; 147 | } 148 | if (sessionUser != null && username.equalsIgnoreCase(sessionUser.getLoginame())) { 149 | logger.info("====用户 " + username + "已经登录过, login 方法调用结束===="); 150 | msgTip = "user already login"; 151 | } 152 | //获取用户状态 153 | int userStatus = -1; 154 | try { 155 | request.getSession().removeAttribute("tenantId"); 156 | userStatus = userService.validateUser(username, password); 157 | } catch (Exception e) { 158 | e.printStackTrace(); 159 | logger.error(">>>>>>>>>>>>>用户 " + username + " 登录 login 方法 访问服务层异常====", e); 160 | msgTip = "access service exception"; 161 | } 162 | switch (userStatus) { 163 | case ExceptionCodeConstants.UserExceptionCode.USER_NOT_EXIST: 164 | msgTip = "user is not exist"; 165 | break; 166 | case ExceptionCodeConstants.UserExceptionCode.USER_PASSWORD_ERROR: 167 | msgTip = "user password error"; 168 | break; 169 | case ExceptionCodeConstants.UserExceptionCode.BLACK_USER: 170 | msgTip = "user is black"; 171 | break; 172 | case ExceptionCodeConstants.UserExceptionCode.USER_ACCESS_EXCEPTION: 173 | msgTip = "access service error"; 174 | break; 175 | default: 176 | try { 177 | msgTip = "user can login"; 178 | //验证通过 ,可以登录,放入session,记录登录日志 179 | user = userService.getUserByUserName(username); 180 | request.getSession().setAttribute("user",user); 181 | if(user.getTenantId()!=null) { 182 | Tenant tenant = tenantService.getTenantByTenantId(user.getTenantId()); 183 | if(tenant!=null) { 184 | Long tenantId = tenant.getTenantId(); 185 | Integer userNumLimit = tenant.getUserNumLimit(); 186 | Integer billsNumLimit = tenant.getBillsNumLimit(); 187 | if(tenantId!=null) { 188 | request.getSession().setAttribute("tenantId",tenantId); //租户tenantId 189 | request.getSession().setAttribute("userNumLimit",userNumLimit); //用户限制数 190 | request.getSession().setAttribute("billsNumLimit",billsNumLimit); //单据限制数 191 | } 192 | } 193 | } 194 | logService.insertLog("用户", 195 | new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_LOGIN).append(user.getId()).toString(), 196 | ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); 197 | } catch (Exception e) { 198 | e.printStackTrace(); 199 | logger.error(">>>>>>>>>>>>>>>查询用户名为:" + username + " ,用户信息异常", e); 200 | } 201 | break; 202 | } 203 | Map data = new HashMap(); 204 | data.put("msgTip", msgTip); 205 | /** 206 | * 在IE模式下,无法获取到user数据, 207 | * 在此处明确添加上user信息 208 | * */ 209 | if(user!=null){ 210 | data.put("user",user); 211 | } 212 | res.code = 200; 213 | res.data = data; 214 | logger.info("===============用户登录 login 方法调用结束==============="); 215 | } catch(Exception e){ 216 | e.printStackTrace(); 217 | logger.error(e.getMessage()); 218 | res.code = 500; 219 | res.data = "用户登录失败"; 220 | } 221 | return res; 222 | } 223 | 224 | @GetMapping(value = "/getUserSession") 225 | public BaseResponseInfo getSessionUser(HttpServletRequest request)throws Exception { 226 | BaseResponseInfo res = new BaseResponseInfo(); 227 | try { 228 | Map data = new HashMap(); 229 | Object userInfo = request.getSession().getAttribute("user"); 230 | if(userInfo!=null) { 231 | User user = (User) userInfo; 232 | user.setPassword(null); 233 | data.put("user", user); 234 | } 235 | res.code = 200; 236 | res.data = data; 237 | } catch(Exception e){ 238 | e.printStackTrace(); 239 | res.code = 500; 240 | res.data = "获取session失败"; 241 | } 242 | return res; 243 | } 244 | 245 | @GetMapping(value = "/logout") 246 | public BaseResponseInfo logout(HttpServletRequest request, HttpServletResponse response)throws Exception { 247 | BaseResponseInfo res = new BaseResponseInfo(); 248 | try { 249 | request.getSession().removeAttribute("user"); 250 | request.getSession().removeAttribute("tenantId"); 251 | request.getSession().removeAttribute("userNumLimit"); 252 | request.getSession().removeAttribute("billsNumLimit"); 253 | response.sendRedirect("/login.html"); 254 | } catch(Exception e){ 255 | e.printStackTrace(); 256 | res.code = 500; 257 | res.data = "退出失败"; 258 | } 259 | return res; 260 | } 261 | 262 | @PostMapping(value = "/resetPwd") 263 | public String resetPwd(@RequestParam("id") Long id, 264 | HttpServletRequest request) throws Exception { 265 | Map objectMap = new HashMap(); 266 | String password = "123456"; 267 | String md5Pwd = Tools.md5Encryp(password); 268 | int update = userService.resetPwd(md5Pwd, id); 269 | if(update > 0) { 270 | return returnJson(objectMap, message, ErpInfo.OK.code); 271 | } else { 272 | return returnJson(objectMap, message, ErpInfo.ERROR.code); 273 | } 274 | } 275 | 276 | @PostMapping(value = "/updatePwd") 277 | public String updatePwd(@RequestParam("userId") Long userId, @RequestParam("password") String password, 278 | @RequestParam("oldpwd") String oldpwd, HttpServletRequest request)throws Exception { 279 | Integer flag = 0; 280 | Map objectMap = new HashMap(); 281 | try { 282 | User user = userService.getUser(userId); 283 | String oldPassword = Tools.md5Encryp(oldpwd); 284 | String md5Pwd = Tools.md5Encryp(password); 285 | //必须和原始密码一致才可以更新密码 286 | if(user.getLoginame().equals("jsh")){ 287 | flag = 3; //管理员jsh不能修改密码 288 | } else if (oldPassword.equalsIgnoreCase(user.getPassword())) { 289 | user.setPassword(md5Pwd); 290 | flag = userService.updateUserByObj(user); //1-成功 291 | } else { 292 | flag = 2; //原始密码输入错误 293 | } 294 | objectMap.put("status", flag); 295 | if(flag > 0) { 296 | return returnJson(objectMap, message, ErpInfo.OK.code); 297 | } else { 298 | return returnJson(objectMap, message, ErpInfo.ERROR.code); 299 | } 300 | } catch (Exception e) { 301 | logger.error(">>>>>>>>>>>>>修改用户ID为 : " + userId + "密码信息失败", e); 302 | flag = 3; 303 | objectMap.put("status", flag); 304 | return returnJson(objectMap, message, ErpInfo.ERROR.code); 305 | } 306 | } 307 | 308 | /** 309 | * 获取全部用户数据列表 310 | * @param request 311 | * @return 312 | */ 313 | @GetMapping(value = "/getAllList") 314 | public BaseResponseInfo getAllList(HttpServletRequest request)throws Exception { 315 | BaseResponseInfo res = new BaseResponseInfo(); 316 | try { 317 | Map data = new HashMap(); 318 | List dataList = userService.getUser(); 319 | if(dataList!=null) { 320 | data.put("userList", dataList); 321 | } 322 | res.code = 200; 323 | res.data = data; 324 | } catch(Exception e){ 325 | e.printStackTrace(); 326 | res.code = 500; 327 | res.data = "获取失败"; 328 | } 329 | return res; 330 | } 331 | /** 332 | * create by: cjl 333 | * description: 334 | * 查询分页用户列表 335 | * create time: 2019/3/8 15:08 336 | * @Param: pageSize 337 |  * @Param: currentPage 338 |  * @Param: search 339 | * @return java.lang.String 340 | */ 341 | @GetMapping(value = "/getUserList") 342 | public String getUserList(@RequestParam(value = Constants.PAGE_SIZE, required = false) Integer pageSize, 343 | @RequestParam(value = Constants.CURRENT_PAGE, required = false) Integer currentPage, 344 | @RequestParam(value = Constants.SEARCH, required = false) String search)throws Exception { 345 | 346 | Map parameterMap = new HashMap(); 347 | //查询参数 348 | JSONObject obj= JSON.parseObject(search); 349 | Set key= obj.keySet(); 350 | for(String keyEach: key){ 351 | parameterMap.put(keyEach,obj.getString(keyEach)); 352 | } 353 | PageQueryInfo queryInfo = new PageQueryInfo(); 354 | Map objectMap = new HashMap(); 355 | if (pageSize == null || pageSize <= 0) { 356 | pageSize = BusinessConstants.DEFAULT_PAGINATION_PAGE_SIZE; 357 | } 358 | if (currentPage == null || currentPage <= 0) { 359 | currentPage = BusinessConstants.DEFAULT_PAGINATION_PAGE_NUMBER; 360 | } 361 | PageHelper.startPage(currentPage,pageSize,true); 362 | List list = userService.getUserList(parameterMap); 363 | //获取分页查询后的数据 364 | PageInfo pageInfo = new PageInfo<>(list); 365 | objectMap.put("page", queryInfo); 366 | if (list == null) { 367 | queryInfo.setRows(new ArrayList()); 368 | queryInfo.setTotal(BusinessConstants.DEFAULT_LIST_NULL_NUMBER); 369 | return returnJson(objectMap, "查找不到数据", ErpInfo.OK.code); 370 | } 371 | queryInfo.setRows(list); 372 | queryInfo.setTotal(pageInfo.getTotal()); 373 | return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code); 374 | } 375 | 376 | /** 377 | * create by: cjl 378 | * description: 379 | * 新增用户及机构和用户关系 380 | * create time: 2019/3/8 16:06 381 | * @Param: beanJson 382 | * @return java.lang.Object 383 | */ 384 | @PostMapping("/addUser") 385 | @ResponseBody 386 | public Object addUser(@RequestParam("info") String beanJson, HttpServletRequest request)throws Exception{ 387 | JSONObject result = ExceptionConstants.standardSuccess(); 388 | Long userNumLimit = Long.parseLong(request.getSession().getAttribute("userNumLimit").toString()); 389 | Long count = userService.countUser(null,null); 390 | if(count>= userNumLimit) { 391 | throw new BusinessParamCheckingException(ExceptionConstants.USER_OVER_LIMIT_FAILED_CODE, 392 | ExceptionConstants.USER_OVER_LIMIT_FAILED_MSG); 393 | } else { 394 | UserEx ue= JSON.parseObject(beanJson, UserEx.class); 395 | userService.addUserAndOrgUserRel(ue); 396 | } 397 | return result; 398 | } 399 | 400 | 401 | /** 402 | * 注册用户 403 | * @param loginame 404 | * @param password 405 | * @return 406 | * @throws Exception 407 | */ 408 | @PostMapping(value = "/registerUser") 409 | public Object registerUser(@RequestParam(value = "loginame", required = false) String loginame, 410 | @RequestParam(value = "password", required = false) String password, 411 | HttpServletRequest request)throws Exception{ 412 | JSONObject result = ExceptionConstants.standardSuccess(); 413 | UserEx ue= new UserEx(); 414 | ue.setUsername(loginame); 415 | ue.setLoginame(loginame); 416 | ue.setPassword(password); 417 | userService.checkUserNameAndLoginName(ue); //检查用户名和登录名 418 | ue = userService.registerUser(ue,manageRoleId,request); 419 | return result; 420 | } 421 | /** 422 | * create by: cjl 423 | * description: 424 | * 修改用户及机构和用户关系 425 | * create time: 2019/3/8 16:06 426 | * @Param: beanJson 427 | * @return java.lang.Object 428 | */ 429 | @PostMapping("/updateUser") 430 | @ResponseBody 431 | public Object updateUser(@RequestParam("info") String beanJson,@RequestParam("id") Long id)throws Exception{ 432 | JSONObject result = ExceptionConstants.standardSuccess(); 433 | UserEx ue= JSON.parseObject(beanJson, UserEx.class); 434 | ue.setId(id); 435 | userService.updateUserAndOrgUserRel(ue); 436 | return result; 437 | } 438 | @PostMapping("/deleteUser") 439 | @ResponseBody 440 | public Object deleteUser(@RequestParam("ids") String ids)throws Exception{ 441 | JSONObject result = ExceptionConstants.standardSuccess(); 442 | userService.batDeleteUser(ids); 443 | return result; 444 | } 445 | @PostMapping("/batchDeleteUser") 446 | @ResponseBody 447 | public Object batchDeleteUser(@RequestParam("ids") String ids)throws Exception{ 448 | JSONObject result = ExceptionConstants.standardSuccess(); 449 | userService.batDeleteUser(ids); 450 | return result; 451 | } 452 | @RequestMapping("/getOrganizationUserTree") 453 | public JSONArray getOrganizationUserTree()throws Exception{ 454 | JSONArray arr=new JSONArray(); 455 | List organizationUserTree= userService.getOrganizationUserTree(); 456 | if(organizationUserTree!=null&&organizationUserTree.size()>0){ 457 | for(TreeNodeEx node:organizationUserTree){ 458 | String str=JSON.toJSONString(node); 459 | JSONObject obj=JSON.parseObject(str); 460 | arr.add(obj) ; 461 | } 462 | } 463 | return arr; 464 | } 465 | } 466 | 467 | ``` 468 | #### 账户管理 469 | 470 | ```java 471 | package com.jsh.erp.controller; 472 | 473 | import com.alibaba.fastjson.JSONArray; 474 | import com.alibaba.fastjson.JSONObject; 475 | import com.jsh.erp.constants.BusinessConstants; 476 | import com.jsh.erp.constants.ExceptionConstants; 477 | import com.jsh.erp.datasource.entities.Account; 478 | import com.jsh.erp.datasource.vo.AccountVo4InOutList; 479 | import com.jsh.erp.exception.BusinessRunTimeException; 480 | import com.jsh.erp.service.account.AccountService; 481 | import com.jsh.erp.utils.BaseResponseInfo; 482 | import com.jsh.erp.utils.ErpInfo; 483 | import org.slf4j.Logger; 484 | import org.slf4j.LoggerFactory; 485 | import org.springframework.web.bind.annotation.*; 486 | 487 | import javax.annotation.Resource; 488 | import javax.servlet.http.HttpServletRequest; 489 | import java.math.BigDecimal; 490 | import java.util.HashMap; 491 | import java.util.List; 492 | import java.util.Map; 493 | 494 | import static com.jsh.erp.utils.ResponseJsonUtil.returnJson; 495 | 496 | /** 497 | * @author jishenghua 75271*8920 498 | */ 499 | @RestController 500 | @RequestMapping(value = "/account") 501 | public class AccountController { 502 | private Logger logger = LoggerFactory.getLogger(AccountController.class); 503 | 504 | @Resource 505 | private AccountService accountService; 506 | 507 | /** 508 | * 查找结算账户信息-下拉框 509 | * @param request 510 | * @return 511 | */ 512 | @GetMapping(value = "/findBySelect") 513 | public String findBySelect(HttpServletRequest request) throws Exception { 514 | String res = null; 515 | try { 516 | List dataList = accountService.findBySelect(); 517 | //存放数据json数组 518 | JSONArray dataArray = new JSONArray(); 519 | if (null != dataList) { 520 | for (Account account : dataList) { 521 | JSONObject item = new JSONObject(); 522 | item.put("Id", account.getId()); 523 | //结算账户名称 524 | item.put("AccountName", account.getName()); 525 | dataArray.add(item); 526 | } 527 | } 528 | res = dataArray.toJSONString(); 529 | } catch(Exception e){ 530 | e.printStackTrace(); 531 | res = "获取数据失败"; 532 | } 533 | return res; 534 | } 535 | 536 | /** 537 | * 获取所有结算账户 538 | * @param request 539 | * @return 540 | */ 541 | @GetMapping(value = "/getAccount") 542 | public BaseResponseInfo getAccount(HttpServletRequest request) throws Exception { 543 | BaseResponseInfo res = new BaseResponseInfo(); 544 | Map map = new HashMap(); 545 | try { 546 | List accountList = accountService.getAccount(); 547 | map.put("accountList", accountList); 548 | res.code = 200; 549 | res.data = map; 550 | } catch(Exception e){ 551 | e.printStackTrace(); 552 | res.code = 500; 553 | res.data = "获取数据失败"; 554 | } 555 | return res; 556 | } 557 | 558 | /** 559 | * 账户流水信息 560 | * @param currentPage 561 | * @param pageSize 562 | * @param accountId 563 | * @param initialAmount 564 | * @param request 565 | * @return 566 | */ 567 | @GetMapping(value = "/findAccountInOutList") 568 | public BaseResponseInfo findAccountInOutList(@RequestParam("currentPage") Integer currentPage, 569 | @RequestParam("pageSize") Integer pageSize, 570 | @RequestParam("accountId") Long accountId, 571 | @RequestParam("initialAmount") BigDecimal initialAmount, 572 | HttpServletRequest request) throws Exception{ 573 | BaseResponseInfo res = new BaseResponseInfo(); 574 | Map map = new HashMap(); 575 | try { 576 | List dataList = accountService.findAccountInOutList(accountId, (currentPage-1)*pageSize, pageSize); 577 | int total = accountService.findAccountInOutListCount(accountId); 578 | map.put("total", total); 579 | //存放数据json数组 580 | JSONArray dataArray = new JSONArray(); 581 | if (null != dataList) { 582 | for (AccountVo4InOutList aEx : dataList) { 583 | String timeStr = aEx.getOperTime().toString(); 584 | BigDecimal balance = accountService.getAccountSum(accountId, timeStr, "date").add(accountService.getAccountSumByHead(accountId, timeStr, "date")) 585 | .add(accountService.getAccountSumByDetail(accountId, timeStr, "date")).add(accountService.getManyAccountSum(accountId, timeStr, "date")).add(initialAmount); 586 | aEx.setBalance(balance); 587 | dataArray.add(aEx); 588 | } 589 | } 590 | map.put("rows", dataArray); 591 | res.code = 200; 592 | res.data = map; 593 | } catch(Exception e){ 594 | e.printStackTrace(); 595 | res.code = 500; 596 | res.data = "获取数据失败"; 597 | } 598 | return res; 599 | } 600 | 601 | 602 | @PostMapping(value = "/updateAmountIsDefault") 603 | public String updateAmountIsDefault(@RequestParam("isDefault") Boolean isDefault, 604 | @RequestParam("accountId") Long accountId, 605 | HttpServletRequest request) throws Exception{ 606 | Map objectMap = new HashMap(); 607 | int res = accountService.updateAmountIsDefault(isDefault, accountId); 608 | if(res > 0) { 609 | return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code); 610 | } else { 611 | return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code); 612 | } 613 | } 614 | /** 615 | * create by: qiankunpingtai 616 | * website:https://qiankunpingtai.cn 617 | * description: 618 | * 批量删除账户信息 619 | * create time: 2019/3/29 10:49 620 | * @Param: ids 621 | * @return java.lang.Object 622 | */ 623 | @RequestMapping(value = "/batchDeleteAccountByIds") 624 | public Object batchDeleteAccountByIds(@RequestParam("ids") String ids,@RequestParam(value="deleteType", 625 | required =false,defaultValue=BusinessConstants.DELETE_TYPE_NORMAL)String deleteType) throws Exception { 626 | 627 | JSONObject result = ExceptionConstants.standardSuccess(); 628 | /** 629 | * create by: qiankunpingtai 630 | * create time: 2019/4/10 10:19 631 | * website:https://qiankunpingtai.cn 632 | * description: 633 | * 出于兼容性考虑,没有传递删除类型时,默认为正常删除 634 | */ 635 | int i=0; 636 | if(BusinessConstants.DELETE_TYPE_NORMAL.equals(deleteType)){ 637 | i= accountService.batchDeleteAccountByIdsNormal(ids); 638 | }else if(BusinessConstants.DELETE_TYPE_FORCE.equals(deleteType)){ 639 | i= accountService.batchDeleteAccountByIds(ids); 640 | }else{ 641 | logger.error("异常码[{}],异常提示[{}],参数,ids[{}],deleteType[{}]", 642 | ExceptionConstants.DELETE_REFUSED_CODE,ExceptionConstants.DELETE_REFUSED_MSG,ids,deleteType); 643 | throw new BusinessRunTimeException(ExceptionConstants.DELETE_REFUSED_CODE, 644 | ExceptionConstants.DELETE_REFUSED_MSG); 645 | } 646 | if(i<1){ 647 | logger.error("异常码[{}],异常提示[{}],参数,ids[{}]", 648 | ExceptionConstants.ACCOUNT_DELETE_FAILED_CODE,ExceptionConstants.ACCOUNT_DELETE_FAILED_MSG,ids); 649 | throw new BusinessRunTimeException(ExceptionConstants.ACCOUNT_DELETE_FAILED_CODE, 650 | ExceptionConstants.ACCOUNT_DELETE_FAILED_MSG); 651 | } 652 | return result; 653 | } 654 | 655 | } 656 | 657 | ``` 658 | 659 | ## 09 源码下载 660 | 661 | 关注公众号【C you again】,回复“springboot 仓库ERP管理系统”免费领取。 662 | 663 | 亦可直接扫描主页二维码关注,回复“springboot 仓库ERP管理系统”免费领取,[点此打开个人主页](https://gzh.cyouagain.cn/) 664 | 665 | 666 | 667 | 668 | ## 10 如何使用 669 | 670 | 1. 下载代码后解压缩 671 | 2. 导入 672 | - 将项目导入到开发工具当中 673 | - 配置maven(因为我是直接从我工程中打包的,里面含有我本地的maven配置,所以需要重新配置一下) 674 | - 导入sql到MySQL当中,修改application.properties中的数据源信息,和你自己的对应上就可以了 675 | - 启动之后会有网址访问提示,直接访问就ok。默认用户名密码:admin/123456 676 | 677 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825103158555.png) 678 | 679 | **说明:此源码来源于网络,若有侵权,请联系删除!!** 680 | 681 | -------------------------------------------------------------------------------- /图书管理系统设计与实现—看这篇就够了.md: -------------------------------------------------------------------------------- 1 | 2 | @[toc] 3 | 4 | > 图书馆人员结构复杂,人员数量有限,涉及方面很广,如果还使用手工操作处理图书借阅问题,工作将非常繁琐,需要大量的人力、物理、财力,极大的浪费了资源,对于图书管理人员来说,图书馆管理包括图书信息管理、图书类别管理、借阅信息管理、管理员信息管理等等。而这些项目在过去靠手工操作,需要手工记录这些事情,不但麻烦,还经常出错,给广大用户带来很多不便,因此,开发这样一套图书馆管理系统软件。让管理员方便的管理图书及用户信息,方便用户查找图书。 5 | 6 | **关注公众号:C you again,回复:“图书管理系统” 下载本系统完整源码** 7 | 8 | #### 1、本课程设计的目的 9 | 10 | (1)掌握企业级应用系统的基本开发流程; 11 | 12 | (2)培养开发者掌握应用系统设计的基本思路和方法; 13 | 14 | (3)培养开发者分析、解决问题的能力; 15 | 16 | 17 | #### 2、系统要实现的功能概述 18 | 19 | (1)用户登录。管理员或会员根据用户名和密码进行身份验证登录系统。 20 | 21 | (2)图书管理。根据图书编号、图书名称查询图书基本信息添加、修改、删除图书。 22 | 23 | (3)读者管理。根据账号、姓名查询读者基本信息。添加、修改、删除读者信息。 24 | 25 | (4)图书分类管理。根据分类名称查询图书分类信息。添加、修改、删除图书分类。 26 | 27 | (5)图书借阅。展示所有正在借阅图书的信息。 28 | 29 | (6)图书归还。展示所有已归还图书的信息。 30 | 31 | (7)修改和查询个人信息。 32 | 33 | #### 3、实现平台及技术 34 | 35 | (1)JAVA语言 36 | 37 | (2)MYSQL数据库 38 | 39 | (3)WINDOWS 10操作系统 40 | 41 | (4)JAVAEE 技术 42 | 43 | (5)Servlet技术 44 | 45 | (6)Eclipse工具 46 | 47 | (7)Html、css、JavaScript 48 | 49 | #### 4、需求分析 50 | 51 |     系统的主要目的是实现一个图书管理系统。系统有2类用户分别为管理员、 读者会员。管理员经口令认证进人系统后,管理员可完成维护系统的功能,包括管理图书和管理会员。读者会员则完成查询图书、修改个人资料、查询个人借阅信息、归还借阅图书的功能,工作完成后可以退出系统。 52 | 53 | #### 5、系统功能模块划分 54 | 55 | ##### 5.1 系统总体功能模块划分 56 | 57 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615124404743.png) 58 | 59 | ##### 5.2 用户登录模块 60 | 61 |     当用普通用户输入用户名和密码后,进行验证,如果用户名和密码其中有一个不正确,则不能登录,并有相应的提示,如果用户没有账号,可以在登录页面进行注册,普通用户可以进行个人资料的查询、修改和修改密码,普通用户可以查询图书信息并借阅和退还,在首页面会展示图书借阅信息和借阅历史信息。 62 | 63 |     当用管理员输入用户名和密码后,进行验证,如果用户名和密码其中有一个不正确,则不能登录,并有相应的提示,管理员可以进行个人资料的查询、修改和修改密码,管理员可以对图书信息,读者信息,借阅信息进行查看和管理,对图书进行分类 64 | 65 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615124626380.png) 66 | 67 | ##### 5.3 图书信息管理模块 68 | 69 |     管理员对图书的数量,图书号,图书类型,图书名称等进行修改、删除管理,如果普通用户在线借书,图书总数会相应减少。 70 | 71 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615124906408.png) 72 | 73 | ##### 5.4 读者管理模块 74 | 75 |      管理员对读者信息可以进行进行修改、删除,并且可以主动添加新用户,该模块显示用户借阅天数,天数会自动变化,管理员可以在线监控读者借阅天数,如果到期未还者,账号则不能登录。 76 | 77 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615125026939.png) 78 | 79 | ##### 5.5 图书分类管理模块 80 | 81 |      管理员在线对图书进行管理,对图书分类进行增加,修改,删除操作。 82 | 83 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615125228640.png) 84 | 85 | ##### 5.6 图书借阅信息模块 86 | 87 |      管理员可以在线管理借阅信息,可以主动帮读者还书。 88 | 89 | ##### 5.7 图书归还信息管理模块 90 | 91 |      显示归还图书的详细信息。 92 | 93 | ##### 5.8 图书查询模块 94 | 95 |      用户访问图书查询模块时显示当前可以借阅图书,有按图书名称查询图书信息的功能,可以进行借书操作。 96 | 97 | ##### 5.9 图书借阅信息模块 98 | 99 |      显示当前登录用户借阅的所有图书,以及各个图书的编号,图书名称,借阅日期,还书日期,读者账号,读者名称信息。登录用户可以进行还书操作,还书是否成功有相应的提示。 100 | 101 | ##### 5.10 借阅历史模块 102 | 103 |      显示当前登录用户的图书借阅记录。 104 | 105 | #### 6、数据库设计 106 | 107 | ##### 6.1 数据库的 E-R 图 108 | 109 | **Admin(用户)表 E-R 图** 110 | 111 | ![](https://img-blog.csdnimg.cn/20200615130101674.png) 112 | 113 | **Book(图书)表 E-R 图** 114 | 115 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615130325652.png) 116 | 117 | **BookType(图书类型)表 E-R 图** 118 | 119 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615130337372.png) 120 | 121 | **History(历史)表 E-R 图** 122 | 123 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615130350933.png) 124 | 125 | ##### 6.2 数据库数据结构设计 126 | 127 |     数据库采用的是的mysql数据库,系统主要需要维护4张数据表: 128 | 129 | **用户表信息(admin):** 130 | 131 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061513054384.png) 132 | 133 | **图书表信息(book):** 134 | 135 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615130706685.png) 136 | 137 | **图书类型表信息(bookType):** 138 | 139 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061513074918.png) 140 | 141 | **图书历史表信息(history):** 142 | 143 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615130820658.png) 144 | 145 | #### 7、系统详细设计和实现 146 | 147 | ##### 7.1 用户登录 148 | 149 |     用户登录主要是在登陆窗体中实现身份验证。用户通过输入用户名和密码,进入图 5-1,判别用户名是否存在和密码是否正确。通过系统验证证后才能进入主界面;验证失败,则跳转登陆界面返回错误信息,如登陆账号为空、登陆密码为空、用户名和密码不匹配等并请重新输入。此登陆页面图书管理员和普通用户进入时一样的,通过查询数据库status状态来判断用户属于哪一种,从而进行不同的跳转。 150 | 151 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615131319259.png) 152 | 153 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615131505376.png) 154 | 155 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615131614109.png) 156 | 157 | 主要代码: 158 | 159 | ```java 160 | package com.rain.servlet; 161 | import java.io.IOException; 162 | import java.io.PrintWriter; 163 | import javax.servlet.RequestDispatcher; 164 | import javax.servlet.ServletException; 165 | import javax.servlet.annotation.WebServlet; 166 | import javax.servlet.http.HttpServlet; 167 | import javax.servlet.http.HttpServletRequest; 168 | import javax.servlet.http.HttpServletResponse; 169 | import javax.servlet.http.HttpSession; 170 | import javax.websocket.Session; 171 | import com.rain.bean.AdminBean; 172 | import com.rain.dao.AdminDao; 173 | @WebServlet("/LoginServlet") 174 | public class LoginServlet extends HttpServlet { 175 | private static final long serialVersionUID = 1L; 176 | public LoginServlet() { 177 | super(); 178 | } 179 | Protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 180 | } 181 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 182 | //登录的判断 183 | PrintWriter out = response.getWriter(); 184 | request.setCharacterEncoding("UTF-8"); 185 | response.setContentType("text/html;charset=UTF-8"); 186 | //获取账号和密码 187 | String username = request.getParameter("username"); 188 | String password = request.getParameter("password"); 189 | AdminDao userdao = new AdminDao(); 190 | //对账号和密码进行判断 191 | boolean result = userdao.Login_verify(username, password); 192 | HttpSession session = request.getSession(); 193 | //判断输入正确 194 | if (result) { 195 | AdminBean adminbean = new AdminBean(); 196 | AdminDao admindao = new AdminDao(); 197 | //更加账号和密码查找出读者的信息 198 | adminbean = admindao.getAdminInfo(username, password); 199 | //将aid存入session中 200 | session.setAttribute("aid", "" + adminbean.getAid()); 201 | //设置session的失效时间 202 | session.setMaxInactiveInterval(6000); 203 | //根据status的值来判断是管理员,还是读者,status=1为读者 204 | if (adminbean.getStatus() == 1) { 205 | response.sendRedirect("/books/index2.jsp"); 206 | } else { 207 | response.sendRedirect("/books/admin.jsp"); 208 | } 209 | } else { 210 | //没有找到对应的账号和密码,返回重新登录 211 | session.setAttribute("state", "密码错误"); 212 | response.sendRedirect("/books/login.jsp"); 213 | } 214 | } 215 | } 216 | 217 | ``` 218 | 219 | ##### 7.2 图书查询 220 | 221 |     管理员可以通过根据图书号 、图书名称,作者名称,出版社等查询图书信息。 222 | 223 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615131740881.png) 224 | 225 | 主要代码: 226 | 227 | ```java 228 | package com.rain.servlet; 229 | import java.io.IOException; 230 | import java.util.ArrayList; 231 | import javax.servlet.ServletException; 232 | import javax.servlet.annotation.WebServlet; 233 | import javax.servlet.http.HttpServlet; 234 | import javax.servlet.http.HttpServletRequest; 235 | import javax.servlet.http.HttpServletResponse; 236 | import com.rain.bean.BookBean; 237 | import com.rain.dao.BookDao; 238 | @WebServlet("/selectServlet") 239 | public class selectServlet extends HttpServlet { 240 | private static final long serialVersionUID = 1L; 241 | public selectServlet() { 242 | super(); 243 | // TODO Auto-generated constructor stub 244 | } 245 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 246 | 247 | } 248 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 249 | request.setCharacterEncoding("UTF-8"); 250 | response.setContentType("text/html;charset=UTF-8"); 251 | //因为在管理员界面和读者界面都有查找功能,为了将查找的结果返回正确的页面,设置了tip,tip=1表示管理员界面 252 | int tip = Integer.parseInt(request.getParameter("tip")); 253 | String name = request.getParameter("name"); 254 | BookDao bookdao = new BookDao(); 255 | ArrayList data = bookdao.getLikeList(name); 256 | //将获取的结果存入请求中 257 | request.setAttribute("data", data); 258 | String url = ""; 259 | //转发不同的界面 260 | if (tip == 1) { 261 | url = response.encodeURL("admin_book.jsp"); 262 | } else { 263 | url = response.encodeURL("select.jsp"); 264 | } 265 | //将请求转发 266 | request.getRequestDispatcher(url).forward(request, response); 267 | } 268 | } 269 | 270 | ``` 271 | ##### 7.3 添加图书 272 | 273 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615131924697.png) 274 | 275 | 主要代码: 276 | 277 | ```java 278 | package com.rain.servlet; 279 | import java.io.IOException; 280 | import javax.servlet.ServletException; 281 | import javax.servlet.annotation.WebServlet; 282 | import javax.servlet.http.HttpServlet; 283 | import javax.servlet.http.HttpServletRequest; 284 | import javax.servlet.http.HttpServletResponse; 285 | import com.rain.dao.BookDao; 286 | @WebServlet("/AddBookServlet") 287 | public class AddBookServlet extends HttpServlet { 288 | private static final long serialVersionUID = 1L; 289 | public AddBookServlet() { 290 | super(); 291 | // TODO Auto-generated constructor stub 292 | } 293 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 294 | } 295 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 296 | //设置编码类型 297 | request.setCharacterEncoding("UTF-8"); 298 | response.setContentType("text/html;charset=UTF-8"); 299 | //获取要添加图书的信息 300 | String card = request.getParameter("card"); 301 | String name = request.getParameter("name"); 302 | String type = request.getParameter("type"); 303 | String autho = request.getParameter("autho"); 304 | String press = request.getParameter("press"); 305 | int num = Integer.parseInt(request.getParameter("num")); 306 | BookDao bookdao = new BookDao(); 307 | //调用函数,存入图书 308 | bookdao.addBook(card, name, type, autho, press, num); 309 | response.sendRedirect("/books/admin_book.jsp"); 310 | } 311 | } 312 | 313 | ``` 314 | ##### 7.4 图书信息修改 315 | 316 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615132054133.png) 317 | 318 | 主要代码: 319 | 320 | ```java 321 | package com.rain.servlet; 322 | import java.io.IOException; 323 | import java.io.PrintWriter; 324 | import javax.servlet.ServletException; 325 | import javax.servlet.annotation.WebServlet; 326 | import javax.servlet.http.HttpServlet; 327 | import javax.servlet.http.HttpServletRequest; 328 | import javax.servlet.http.HttpServletResponse; 329 | import com.rain.dao.BookDao; 330 | @WebServlet("/updateBookServlet") 331 | public class updateBookServlet extends HttpServlet { 332 | private static final long serialVersionUID = 1L; 333 | public updateBookServlet() { 334 | super(); 335 | // TODO Auto-generated constructor stub 336 | } 337 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 338 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 339 | //修改图书信息 340 | request.setCharacterEncoding("UTF-8"); 341 | response.setContentType("text/html;charset=UTF-8"); 342 | String card = request.getParameter("card"); 343 | String name = request.getParameter("name"); 344 | String type = request.getParameter("type"); 345 | String autho = request.getParameter("autho"); 346 | String press = request.getParameter("press"); 347 | int num = Integer.parseInt(request.getParameter("num")); 348 | Int bid = Integer.parseInt(request.getParameter("updatebid")); 349 | BookDao bookdao = new BookDao(); 350 | bookdao.updateBook(bid, card, name, type, autho, press, num); 351 | response.sendRedirect("/books/admin_book.jsp"); 352 | } 353 | } 354 | 355 | ``` 356 | 357 | ##### 7.5 图书删除 358 | 359 | 主要代码: 360 | 361 | ```java 362 | package com.rain.servlet; 363 | import java.io.IOException; 364 | import java.io.PrintWriter; 365 | import javax.servlet.ServletException; 366 | import javax.servlet.annotation.WebServlet; 367 | import javax.servlet.http.HttpServlet; 368 | import javax.servlet.http.HttpServletRequest; 369 | import javax.servlet.http.HttpServletResponse; 370 | import com.rain.dao.BookDao; 371 | @WebServlet("/deleteServlet") 372 | public class deleteServlet extends HttpServlet { 373 | private static final long serialVersionUID = 1L; 374 | public deleteServlet() { 375 | super(); 376 | // TODO Auto-generated constructor stub 377 | } 378 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 379 | //删除图书信息 380 | request.setCharacterEncoding("UTF-8"); 381 | response.setContentType("text/html;charset=UTF-8"); 382 | int bid = Integer.parseInt(request.getParameter("bid")); 383 | BookDao bookdao = new BookDao(); 384 | bookdao.deleteBook(bid); 385 | response.sendRedirect("/books/admin_book.jsp"); 386 | } 387 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 388 | // TODO Auto-generated method stub 389 | doGet(request, response); 390 | } 391 | } 392 | 393 | ``` 394 | 395 | #### 8、源码下载 396 | 397 | **其它模块设计与实现请查看 公众号:C you again** 398 | 399 | **完整文档和系统源码下载:** 400 | 401 | 关注公众号:C you again,回复:“图书管理系统” 下载本系统完整源码, 402 | 更多干货等你来拿 403 | 404 | 405 | 好用记得点赞分享哦!!!! 406 | 注:此系统不是本人原创,在原系统基础上进行修改,加以创新。 407 | 侵权请联系删除 -------------------------------------------------------------------------------- /基于SSH框架的人力资源管理系统设计与实现.md: -------------------------------------------------------------------------------- 1 | 2 | > 大家好,应各位粉丝的要求的,今天给大家分享下人力资源管理系统,需要源码的同志在公众号【C you again】后台回复“基于SSH框架的人力资源管理系统”获取。提前声明:此系统来源于网络,本人只做了收集整理,如果侵权,请联系删除。 3 | 4 | **关注公众号【C you again】,回复“基于SSH框架的人力资源管理”免费下载。** 5 | 6 | ## 01 概述 7 | 8 | 人力资源管理系统(Human Resource Management system ,以下简称HRMS)是将以计算机为基础的管理信息系统应用于人力资源管理而形成的一种现代化的人力资源管理方法和手段,是对信息技术与人力资源管理技术结合的最佳定义。 9 | 10 |   人力资源是企业的第一资源,如何有效地管理、利用和开发这一资源 ,是摆在每一位管理者面前必须重视的大事。人力资源管理工作可分为建立规章制度的基础性工作、基于标准操作流程的例行性工作、人力资源规划等战略性工作以及企业文化建设、职工职业生涯设计等开拓性工作。其中,大量的例行性工作往往占据了人力资源管理工作人员的大部分时间。如果能建立起人力资源管理信息系统,把这部分工作分离出来,用计算机来进行管理,必将能大大提高人力资源管理人员的工作效率。同时,利用人力资源管理信息系统中存储的大量历史信息,建立起企业人力资源决策支持系统,可为领导决策提供有用的参考信息。 11 | 12 | ## 02 技术 13 | 14 | > Spring+SpringMVC+ Hibernate+ MySql 15 | 16 | ## 03 运行环境 17 | 18 | > Java1.8 + MySql + Eclipse 19 | 20 | ## 04 功能概述 21 | 22 | 本系统主要有部门管理、员工管理、招聘管理、培训管理、奖罚管理、薪资管理、个人信息管理七大模块。 23 | 24 | 部门管理:此模块可以查看所有部门的详细信息,如:部门名称,部门创建时间,部门人数。也可以对某个部门进行修改删除操作,除此以外,还可以添加部门。 25 | 26 | 员工管理:员工管理模块有查看、修改、添加、删除员工信息的功能。 27 | 28 | 招聘管理:本模块可以查看求职人员的具体信息,包括姓名、性别、应聘职位、工作经验等等,也可以对应聘人员进行删除、录用。 29 | 30 | 培训管理:此模块用来发布企业的培训信息,如培训时间,培训地址,培训课程和培训人员等等。 31 | 32 | 奖罚管理:记录企业员工的奖罚情况。 33 | 34 | 薪资管理:管理企业员工薪资,有调整薪资,添加员工及薪资,删除员工及薪资等功能。 35 | 36 | 个人信息管理:查看修改个人信息。 37 | 38 | ## 05 运行截图 39 | 40 | #### 部门管理 41 | 42 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827190417116.png) 43 | 44 | #### 员工管理 45 | 46 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082719045618.png) 47 | 48 | #### 招聘管理 49 | 50 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082719052441.png) 51 | 52 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827190538527.png) 53 | 54 | #### 奖罚管理 55 | 56 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827190607911.png) 57 | 58 | #### 薪资管理 59 | 60 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827190630366.png) 61 | 62 | #### 个人信息管理 63 | 64 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827190710265.png) 65 | 66 | ## 06 主要代码 67 | 68 | #### 部门管理 69 | 70 | ```java 71 | package com.wy.action; 72 | 73 | import java.util.List; 74 | 75 | import javax.servlet.http.HttpServletRequest; 76 | import javax.servlet.http.HttpServletResponse; 77 | import javax.servlet.http.HttpSession; 78 | import org.apache.struts.action.ActionForm; 79 | import org.apache.struts.action.ActionForward; 80 | import org.apache.struts.action.ActionMapping; 81 | import org.apache.struts.actions.DispatchAction; 82 | 83 | import com.wy.dao.ObjectDao; 84 | import com.wy.form.DepartmentForm; 85 | import com.wy.form.ManagerForm; 86 | 87 | public class DepartmentAction extends DispatchAction { 88 | private ObjectDao objectDao; 89 | 90 | public ObjectDao getObjectDao() { 91 | return objectDao; 92 | } 93 | 94 | public void setObjectDao(ObjectDao objectDao) { 95 | this.objectDao = objectDao; 96 | } 97 | 98 | // 部门察看操作 99 | public ActionForward queryDepartment(ActionMapping mapping, 100 | ActionForm form, HttpServletRequest request, 101 | HttpServletResponse response) { 102 | List list = objectDao.getObjectList("from DepartmentForm order by id desc"); 103 | request.setAttribute("list", list); 104 | request.setAttribute("employeeList", objectDao.getObjectList("from EmployeeForm")); 105 | return mapping.findForward("queryDepartment"); 106 | } 107 | 108 | // 部门信息保存 109 | public ActionForward insertDepartment(ActionMapping mapping, 110 | ActionForm form, HttpServletRequest request, 111 | HttpServletResponse response) { 112 | DepartmentForm departmentForm = (DepartmentForm) form; 113 | DepartmentForm departmentform = (DepartmentForm)objectDao 114 | .getObjectForm("from DepartmentForm where dt_name='" 115 | + departmentForm.getDt_name() + "'"); 116 | if (departmentform== null) { 117 | objectDao.insertObjectForm(departmentForm); 118 | return queryDepartment(mapping, form, request, response); 119 | } else { 120 | request.setAttribute("result", "不能够重复提交!!!"); 121 | return mapping.findForward("operationDepartment"); 122 | } 123 | } 124 | //部门信息删除 125 | public ActionForward deleteDepartment(ActionMapping mapping, 126 | ActionForm form, HttpServletRequest request, 127 | HttpServletResponse response) { 128 | DepartmentForm departmentform = (DepartmentForm)objectDao 129 | .getObjectForm("from DepartmentForm where id='" 130 | + request.getParameter("id") + "'"); 131 | if(objectDao.deleteObjectForm(departmentform)){ 132 | }else{ 133 | request.setAttribute("result", "删除部门信息失败!!!"); 134 | 135 | } 136 | return mapping.findForward("operationDepartment"); 137 | 138 | } 139 | 140 | 141 | 142 | } 143 | 144 | ``` 145 | 146 | #### 培训管理 147 | 148 | ```java 149 | package com.wy.action; 150 | 151 | import java.util.List; 152 | 153 | import javax.servlet.http.HttpServletRequest; 154 | import javax.servlet.http.HttpServletResponse; 155 | 156 | import org.apache.struts.action.ActionForm; 157 | import org.apache.struts.action.ActionForward; 158 | import org.apache.struts.action.ActionMapping; 159 | import org.apache.struts.actions.DispatchAction; 160 | 161 | import com.wy.dao.ObjectDao; 162 | import com.wy.form.TrainForm; 163 | 164 | public class TrainAction extends DispatchAction { 165 | private ObjectDao objectDao; 166 | 167 | public ObjectDao getObjectDao() { 168 | return objectDao; 169 | } 170 | 171 | public void setObjectDao(ObjectDao objectDao) { 172 | this.objectDao = objectDao; 173 | } 174 | 175 | // 培训察看操作 176 | public ActionForward queryTrain(ActionMapping mapping, 177 | ActionForm form, HttpServletRequest request, 178 | HttpServletResponse response) { 179 | List list = objectDao.getObjectList("from TrainForm order by id desc"); 180 | request.setAttribute("list", list); 181 | return mapping.findForward("queryTrain"); 182 | } 183 | 184 | 185 | // 添加培训操作 186 | public ActionForward deleteTrain(ActionMapping mapping, 187 | ActionForm form, HttpServletRequest request, 188 | HttpServletResponse response) { 189 | String id=request.getParameter("id"); 190 | TrainForm trainForm=(TrainForm)objectDao.getObjectForm("from TrainForm where id='"+id+"'"); 191 | this.objectDao.deleteObjectForm(trainForm); 192 | return this.queryTrain(mapping, form, request, response); 193 | } 194 | 195 | //添加培训操作 196 | public ActionForward saveTrain(ActionMapping mapping, 197 | ActionForm form, HttpServletRequest request, 198 | HttpServletResponse response) { 199 | TrainForm trainForm=(TrainForm)form; 200 | this.objectDao.insertObjectForm(trainForm); 201 | return mapping.findForward("operationTrain"); 202 | } 203 | 204 | //培训详细查询 205 | public ActionForward queryOneTrain(ActionMapping mapping, 206 | ActionForm form, HttpServletRequest request, 207 | HttpServletResponse response) { 208 | String id=request.getParameter("id"); 209 | TrainForm trainForm=(TrainForm)objectDao.getObjectForm("from TrainForm where id='"+id+"'"); 210 | request.setAttribute("trainForm", trainForm); 211 | return mapping.findForward("queryOneTrain"); 212 | } 213 | 214 | } 215 | 216 | ``` 217 | 218 | #### 薪资管理 219 | 220 | ```java 221 | package com.wy.action; 222 | 223 | import java.util.List; 224 | 225 | import javax.servlet.http.HttpServletRequest; 226 | import javax.servlet.http.HttpServletResponse; 227 | import javax.servlet.http.HttpSession; 228 | import org.apache.struts.action.ActionForm; 229 | import org.apache.struts.action.ActionForward; 230 | import org.apache.struts.action.ActionMapping; 231 | import org.apache.struts.actions.DispatchAction; 232 | 233 | import com.wy.dao.ObjectDao; 234 | import com.wy.form.DepartmentForm; 235 | import com.wy.form.EmployeeForm; 236 | import com.wy.form.ManagerForm; 237 | import com.wy.form.PayForm; 238 | import com.wy.tool.GetAutoNumber; 239 | 240 | public class PayAction extends DispatchAction { 241 | private ObjectDao objectDao; 242 | 243 | public ObjectDao getObjectDao() { 244 | return objectDao; 245 | } 246 | 247 | public void setObjectDao(ObjectDao objectDao) { 248 | this.objectDao = objectDao; 249 | } 250 | //薪资删除 251 | public ActionForward deletePay(ActionMapping mapping, 252 | ActionForm form, HttpServletRequest request, 253 | HttpServletResponse response) { 254 | String condition = "from PayForm where id='"+request.getParameter("id")+"'"; 255 | PayForm payForm=(PayForm)objectDao.getObjectForm(condition); 256 | if(payForm!=null) 257 | objectDao.deleteObjectForm(payForm); 258 | return queryPay(mapping,form,request,response); 259 | } 260 | 261 | 262 | 263 | // 薪资查看 264 | public ActionForward queryPay(ActionMapping mapping, 265 | ActionForm form, HttpServletRequest request, 266 | HttpServletResponse response) { 267 | List list = objectDao.getObjectList("from PayForm"); 268 | if(request.getParameter("emNumber")!=null){ 269 | String emNumber= request.getParameter("emNumber"); 270 | list = objectDao.getObjectList("from PayForm where pay_emNumber='"+emNumber+"'"); 271 | request.setAttribute("result1",emNumber); 272 | } 273 | if(request.getParameter("pay_month")!=null){ 274 | String pay_month= request.getParameter("pay_month"); 275 | list = objectDao.getObjectList("from PayForm where pay_month='"+pay_month+"'"); 276 | request.setAttribute("result2",pay_month); 277 | } 278 | 279 | 280 | request.setAttribute("list", list); 281 | String condition = "from EmployeeForm order by id desc"; 282 | request.setAttribute("employeeList",objectDao.getObjectList(condition)); 283 | return mapping.findForward("queryPay"); 284 | } 285 | 286 | // 转向添加新姿的页面 287 | public ActionForward forwardInsertPay(ActionMapping mapping, 288 | ActionForm form, HttpServletRequest request, 289 | HttpServletResponse response) { 290 | this.saveToken(request); 291 | String condition = "from EmployeeForm order by id desc"; 292 | List list = objectDao.getObjectList(condition); 293 | request.setAttribute("employeeList",list); 294 | return mapping.findForward("forwardInsertPay"); 295 | } 296 | // 添加薪资 297 | public ActionForward savePay(ActionMapping mapping, ActionForm form, 298 | HttpServletRequest request, HttpServletResponse response) { 299 | PayForm payForm = (PayForm) form; 300 | String payCondition= "from PayForm where pay_month='"+payForm.getPay_month()+"' and pay_emNumber='"+payForm.getPay_emNumber()+"'"; 301 | if(objectDao.getObjectForm(payCondition)!=null){ 302 | request.setAttribute("result", "该员工已经工资已经发送完毕"); 303 | return mapping.findForward("operationPay"); 304 | } 305 | String emCondition = "from EmployeeForm where em_serialNumber='"+payForm.getPay_emNumber()+"'"; 306 | EmployeeForm employeeForm= (EmployeeForm)objectDao.getObjectForm(emCondition); 307 | payForm.setPay_emName(employeeForm.getEm_name()); 308 | if (this.isTokenValid(request)) { 309 | this.resetToken(request); 310 | objectDao.insertObjectForm(payForm); 311 | } else { 312 | this.saveToken(request); 313 | } 314 | return queryPay(mapping, form, request, response); 315 | } 316 | } 317 | 318 | ``` 319 | 320 | ## 07 使用说明 321 | 322 | - mysql导入sql文件,修改(WebContent\WEB-INF\applicationContext.xml)applicationContext.xml文件修改数据库配置信息。 323 | - eclipse导入项目并部署,tomcat部署后,访问http://localhost:8080/PersonManager/,用户名:adain,密码:123 324 | 325 | ## 08 源码下载 326 | 327 | 关注公众号【C you again】,回复“基于SSH框架的人力资源管理”免费领取。 328 | 329 | 亦可直接扫描主页二维码关注,回复“基于SSH框架的人力资源管理”免费领取,[点此打开个人主页](https://gzh.cyouagain.cn/) 330 | 331 | **说明:此源码来源于网络,若有侵权,请联系删除!!** 332 | -------------------------------------------------------------------------------- /基于SSM框架的JavaWeb通用权限管理系统.md: -------------------------------------------------------------------------------- 1 | @[toc] 2 | 3 | **关注公众号【C you again】,回复“基于SSM框架的JavaWeb通用权限管理系统”免费下载。** 4 | 5 | ## 01 概述 6 | 7 | 这是一个通用权限管理系统项目,基于SSM(Spring + Spring-MVC +Mybatis)框架开发,其SQL语句持久在Hibernate 中,对原生SQL的支持较好。制作该系统的初衷是用来帮助JavaWeb开发者或初学者学习、借鉴的需要。读者可以在这个 系统基础上引入其它技术或完全依赖本系统技术进行功能拓展,来开发实际应用需求的项目,免去了应用系统中对于“ 权限设计”这一部分的麻烦。 8 | 9 | ## 02 技术 10 | 11 | > Jsp 、SSM(Spring + Spring-MVC + Mybatis)、Shiro 、Mvc、Jdbc、MySQL、DWZ富客户端框架 + Jquery + Ajax 12 | 13 | ## 03 环境 14 | 15 | > JDK:JDK1.6+ 、WEB:Tomcat6.0+ 、DB:MySQL5+ 、IDE: MyEclipse8.5+/Eclipse4.4+ 16 | 17 | ## 04 工程结构 18 | 19 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825222028100.png) 20 | 21 | ## 05 运行截图 22 | 23 | #### 登录界面 24 | 25 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825222431271.png) 26 | 27 | #### 员工管理界面 28 | 29 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082522252173.png) 30 | 31 | #### 部门管理界面 32 | 33 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825222550263.png) 34 | 35 | #### 角色管理界面 36 | 37 | 38 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825222633694.png) 39 | 40 | ## 06 主要代码 41 | 42 | #### 员工部门管理 43 | 44 | ```java 45 | package com.kzfire.portal.action.user; 46 | 47 | import java.util.List; 48 | 49 | import javax.servlet.http.HttpServletRequest; 50 | import javax.servlet.http.HttpServletResponse; 51 | 52 | import org.springframework.beans.factory.annotation.Autowired; 53 | import org.springframework.stereotype.Controller; 54 | import org.springframework.ui.Model; 55 | import org.springframework.web.bind.annotation.RequestMapping; 56 | import org.springframework.web.servlet.ModelAndView; 57 | 58 | import com.kzfire.portal.base.BaseAction; 59 | import com.kzfire.portal.entiy.SysDept; 60 | import com.kzfire.portal.service.DeptService; 61 | import com.kzfire.portal.service.UserService; 62 | import com.kzfire.portal.utils.JSONUtils; 63 | import com.kzfire.portal.utils.VoFactory; 64 | import com.kzfire.portal.vo.ConditionVo; 65 | 66 | @RequestMapping("/user/dept") 67 | @Controller 68 | public class DeptAction extends BaseAction{ 69 | @Autowired 70 | DeptService deptService; 71 | @Autowired 72 | UserService userService; 73 | 74 | /** 75 | * 设置员工部门 76 | * @param model 77 | * @param request 78 | * @param response 79 | * @return 80 | */ 81 | @RequestMapping("/setUserDept") 82 | public String setUserDept(Model model,HttpServletRequest request,HttpServletResponse response) { 83 | 84 | String userId=request.getParameter("userId"); 85 | model.addAttribute("userId", userId); 86 | //设置部门树 87 | List list=deptService.getAllDept(); 88 | model.addAttribute("data", JSONUtils.parseList(list)); 89 | return VIEW+"user/dept/setUserDept"; 90 | } 91 | 92 | @RequestMapping("/saveUserdept") 93 | public ModelAndView saveUserdept(Model model, HttpServletRequest request, 94 | HttpServletResponse response) { 95 | try { 96 | Integer userId=Integer.parseInt(request.getParameter("userId")); 97 | Integer deptId=Integer.parseInt(request.getParameter("deptId")); 98 | deptService.saveUserdept(userId,deptId); 99 | } catch (Exception e) { 100 | e.printStackTrace(); 101 | return ajaxDoneError("操作失败:"+e.getMessage()); 102 | } 103 | return ajaxDoneSuccess("操作成功"); 104 | } 105 | 106 | @RequestMapping("/main") 107 | public String list(Model model,HttpServletRequest request,HttpServletResponse response) { 108 | //设置部门树 109 | List list=deptService.getAllDept(); 110 | System.out.println("json格式----->" + JSONUtils.parseList(list).toString() ); 111 | model.addAttribute("data", JSONUtils.parseList(list)); 112 | return VIEW+"user/dept/dept"; 113 | } 114 | 115 | @RequestMapping("/userList") 116 | public String userList(Model model,HttpServletRequest request,HttpServletResponse response) { 117 | ConditionVo cvo=VoFactory.getConditionVo(request); 118 | String deptId=request.getParameter("deptId"); 119 | if("1".equals(deptId)) 120 | { 121 | cvo.setText4("1"); 122 | }else 123 | { 124 | cvo.setText3(request.getParameter("deptId")); 125 | } 126 | request.setAttribute("deptId", deptId); 127 | cvo.setTotalCount(userService.getUserCount(cvo)); 128 | model.addAttribute("vo", cvo); 129 | model.addAttribute("list", userService.getList(cvo)); 130 | return VIEW+"user/dept/userList"; 131 | } 132 | 133 | @RequestMapping("/add") 134 | public String add(Model model,HttpServletRequest request,HttpServletResponse response) { 135 | SysDept dept=new SysDept(); 136 | dept.setPid(Integer.parseInt(request.getParameter("selDept"))); 137 | model.addAttribute("dept", dept); 138 | return VIEW+"user/dept/deptEdit"; 139 | } 140 | @RequestMapping("/edit") 141 | public String edit(Model model,HttpServletRequest request,HttpServletResponse response) { 142 | SysDept dept=deptService.getDeptById(Integer.parseInt(request.getParameter("selDept"))); 143 | model.addAttribute("dept", dept); 144 | return VIEW+"user/dept/deptEdit"; 145 | } 146 | 147 | @RequestMapping("/del") 148 | public ModelAndView del(Model model, HttpServletRequest request) 149 | { 150 | try { 151 | String deptId=request.getParameter("selDept"); 152 | deptService.delDeptById(Integer.parseInt(deptId)); 153 | } catch (Exception e) { 154 | e.printStackTrace(); 155 | return ajaxDoneError("操作失败:"+e.getMessage()); 156 | } 157 | return ajaxDoneSuccess("操作成功"); 158 | } 159 | 160 | @RequestMapping("/save") 161 | public ModelAndView save(SysDept dept,Model model, HttpServletRequest request, 162 | HttpServletResponse response) { 163 | try { 164 | if(dept!=null) 165 | { 166 | deptService.saveDept(dept); 167 | } 168 | } catch (Exception e) { 169 | e.printStackTrace(); 170 | return ajaxDoneError("操作失败:"+e.getMessage()); 171 | } 172 | return ajaxDoneSuccess("操作成功"); 173 | } 174 | } 175 | 176 | ``` 177 | 178 | #### 角色管理 179 | 180 | ```java 181 | package com.kzfire.portal.action.user; 182 | 183 | import java.util.List; 184 | 185 | import javax.servlet.http.HttpServletRequest; 186 | import javax.servlet.http.HttpServletResponse; 187 | 188 | import org.springframework.beans.factory.annotation.Autowired; 189 | import org.springframework.stereotype.Controller; 190 | import org.springframework.ui.Model; 191 | import org.springframework.web.bind.annotation.RequestMapping; 192 | import org.springframework.web.servlet.ModelAndView; 193 | 194 | import com.kzfire.portal.base.BaseAction; 195 | import com.kzfire.portal.entiy.SysRole; 196 | import com.kzfire.portal.service.RoleService; 197 | import com.kzfire.portal.utils.VoFactory; 198 | import com.kzfire.portal.vo.ConditionVo; 199 | import com.kzfire.portal.vo.PerGroupVo; 200 | 201 | @RequestMapping("/user/role") 202 | @Controller 203 | public class RoleAction extends BaseAction{ 204 | @Autowired 205 | RoleService roleService; 206 | 207 | @RequestMapping("/list") 208 | public String list(Model model,HttpServletRequest request,HttpServletResponse response) { 209 | ConditionVo cvo=VoFactory.getConditionVo(request); 210 | cvo.setTotalCount(roleService.getTableCount("sys_role")); 211 | model.addAttribute("vo", cvo); 212 | model.addAttribute("list", roleService.getList(cvo)); 213 | return VIEW+"permission/role/list"; 214 | } 215 | 216 | /** 217 | * 权限编辑页面 218 | * @param model 219 | * @param request 220 | * @return 221 | */ 222 | @RequestMapping("/editPermission") 223 | public String editPermission(Model model, HttpServletRequest request) 224 | { 225 | String roleId=request.getParameter("roleId"); 226 | //获取角色权限 227 | List group=roleService.getPerGroupVoByUserId(Integer.parseInt(roleId)); 228 | model.addAttribute("group", group); 229 | model.addAttribute("roleId", roleId); 230 | return VIEW+"permission/role/editPermission"; 231 | } 232 | 233 | @RequestMapping("/savePer") 234 | public ModelAndView savePer(Model model, HttpServletRequest request, 235 | HttpServletResponse response) { 236 | try { 237 | String[] perIds=request.getParameterValues("perId"); 238 | roleService.savePermission(perIds,Integer.parseInt(request.getParameter("roleId"))); 239 | } catch (Exception e) { 240 | e.printStackTrace(); 241 | return ajaxDoneError("操作失败"); 242 | } 243 | 244 | return ajaxDoneSuccess("操作成功"); 245 | } 246 | 247 | @RequestMapping("/add") 248 | public String add(Model model, HttpServletRequest request) 249 | { 250 | model.addAttribute("role", new SysRole()); 251 | return VIEW+"permission/role/roleEdit"; 252 | } 253 | 254 | 255 | 256 | @RequestMapping("/edit") 257 | public String edit(Model model, HttpServletRequest request) 258 | { 259 | String roleId=request.getParameter("roleId"); 260 | SysRole role=roleService.getRoleById(Integer.parseInt(roleId)); 261 | model.addAttribute("role", role); 262 | return VIEW+"permission/role/roleEdit"; 263 | } 264 | 265 | 266 | 267 | @RequestMapping("/del") 268 | public ModelAndView del(Model model, HttpServletRequest request) 269 | { 270 | try { 271 | String roleId=request.getParameter("roleId"); 272 | roleService.delRoleById(Integer.parseInt(roleId)); 273 | } catch (Exception e) { 274 | e.printStackTrace(); 275 | return ajaxDoneError("操作失败"); 276 | } 277 | return ajaxDoneSuccess("操作成功"); 278 | } 279 | 280 | @RequestMapping("/save") 281 | public ModelAndView save(SysRole role,Model model, HttpServletRequest request, 282 | HttpServletResponse response) { 283 | if(role!=null) 284 | { 285 | roleService.saveShop(role); 286 | } 287 | return ajaxDoneSuccess("操作成功"); 288 | } 289 | 290 | 291 | } 292 | 293 | ``` 294 | 295 | ## 07 其它 296 | 297 | 1、MySQL数据库账户 298 | 299 | MySQL数据库默认端口:“3306”、数据库名:“kzfire”、账户名:“root”、密码:空。 300 | 301 | 2、SQL文件 302 | 303 | SQL文件放在“MySQL数据库SQL文件” 目录,需通过“Navicat for MySQL”工具执行此SQL文件。 304 | 305 | 3、系统启动文件 306 | 307 | 系统启动文件是“webroot”目录下的“login.jsp” 308 | 309 | 4、系统登录用户名及密码 310 | 311 | “login.jsp”启动(运行)后,正常情况下进入登录界面,用户名输入“admin”,密码输入“123456”。如果登录不进去,很有可能是数据库参数配置问题导致,请检查数据库参数配置文件,数据库参数配置文件放 312 | 313 | ## 08 源码下载 314 | 315 | 关注公众号【C you again】,回复“基于SSM框架的JavaWeb通用权限管理系统”免费领取。 316 | 317 | 亦可直接扫描主页二维码关注,回复“基于SSM框架的JavaWeb通用权限管理系统”免费领取,[点此打开个人主页](https://gzh.cyouagain.cn/) 318 | 319 | 320 | **说明:此源码来源于网络,若有侵权,请联系删除!!** 321 | 322 | -------------------------------------------------------------------------------- /基于java的企业进销存管理系统设计与实现.md: -------------------------------------------------------------------------------- 1 | 2 | @[toc] 3 | 4 | **关注公众号【C you again】,回复“基于java的企业进销存管理系统”免费下载。** 5 | 6 | ## 01 概述 7 | 8 | 销存管理系统是一个基于本地与网络的应用系统,它是一个面对当前的进销存管理工作基本还处于手工和半信息自动化处理状态而应运而生的一个基于本地与网络的一个完全信息自动化的系统,整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发,完成进货、销售、库存管理的全过程。本文所设计的企业进销存管理系统可以满足企业进货、销售和库存管理方面的需要。 9 | 10 | ## 02 系统结构及说明 11 | 12 | 本系统包括基础资料、进货管理、销售管理、库存管理、信息查询、系统维护等 6 大部分。系统结构如图所示: 13 | 14 | 15 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826130307761.png) 16 | 17 | #### 进货管理 18 | 19 | “进货管理”功能模块用于管理企业的进货采购业务,是进销存管理系统中不可缺少的重要组成部分,它主要负责为系统记录进货单及其退货信息,相应的进货商品会添加到库存管理中。所包含的子功能模块如图所示。 20 | 21 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082613050279.png) 22 | 23 | #### 基础资料 24 | 25 | “基础资料”是每个系统都必须具备的功能,该模块用于管理企业进销存管理系统中的客户、商品和供应商信息,其功能主要是对这些基础信息进行添加、修改和删除。包括的子功能模块如图所示。 26 | 27 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826130547698.png) 28 | 29 | #### 销售管理 30 | 31 | “销售管理”功能模块用于管理企业的销售业务,商品销售是进销存管理中的重要环节之一,进货商品在入库之后就可以开始销售了。所包含的子功能模块如图所示。 32 | 33 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826130637370.png) 34 | 35 | #### 库存管理 36 | 37 | “库存管理”模块是企业进销存管理系统中的库存管理模块包括库存盘点和价格调整两个功能,所包含的子功能模块如图所示。 38 | 39 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826130711195.png) 40 | 41 | #### 查询统计 42 | 43 | “查询统计”模块是进销存管理系统中不可缺少的重要组成部分,它主要包括销售查询和商品查询,所包含的子功能模块如图所示。 44 | 45 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826130746430.png) 46 | 47 | #### 系统管理 48 | 49 | “系统管理”模块主要有更改密码、退出系统两个模块,所包含的子功能模块如图所示。 50 | 51 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826130816962.png) 52 | 53 | ## 03 工程结构 54 | 55 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826131720288.png) 56 | 57 | ## 04 详细设计 58 | 59 | #### 系统运行环境 60 | 61 | - 操作系统:Windows 10; 62 | - JDK环境:jdk1.8; 63 | - 开发工具:Eclipse8.0; 64 | - 数据库管理软件:My SQL 5.7 65 | 66 | #### 系统开发技术 67 | 68 | - Java 69 | - My SQL 数据库 70 | 71 | #### 公共类设计 72 | 73 | 公共类是代码重用的一种形式,他将各个功能模块经常调用的方法提取到共用的Java类中,例如访问数据库的Dao类容纳了所有访问数据库的方法,并同时管理者数据库的连接和关闭。这样不但实现了项目代码的重用,还提高了程序的性能和代码可读性。 74 | 75 | 数据库DB链接(dao/Dao.java): 76 | 77 | ```java 78 | protected static String dbClassName = "com.mysql.jdbc.Driver";// MySQL数据库驱动类的名称 79 | protected static String dbUrl = "jdbc:mysql://127.0.0.1:3306/db_database28";// 访问MySQL数据库的路径 80 | protected static String dbUser = "root";// 访问MySQL数据库的用户名(根据自己数据库而定) 81 | protected static String dbPwd = "";// 访问MySQL数据库的密码(根据自己数据库而定) 82 | protected static String dbName = "db_database28";// 访问MySQL数据库中的实例(db_database28) 83 | protected static String second = null;// 84 | public static Connection conn = null;// MySQL数据库的连接对象 85 | ``` 86 | #### 主窗体设计 87 | 88 | 主窗体界面是该系统的欢迎界面。应用程序的主窗体必须设计层次清晰的系统菜单和工具栏,其中系统菜单包含系统中所有功能的菜单项,而工具栏主要提供常用功能的快捷访问按钮。企业进销存管理系统采用导航面板综合了系统菜单和工具栏的优点,而且导航面板的界面更加美观,操作更快捷。 89 | 90 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826131253196.png) 91 | 92 | #### 销售管理设计 93 | 94 | 商品销售时进销存管理中的重要环节之一,进货商在入库之后就可以开始销售。销售单模块主要负责根据经手人的销售单据,操作进销存管理系统的库存商品和记录销售信息,方便以后查询和统计。 95 | 96 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082613132687.png) 97 | 98 | #### 信息查询设计 99 | 100 | “信息查询”模块是进销存管理系统中不可缺少的重要组成部分,它主要包括销售查询、商品查询功能。 101 | 102 | 销售查询: 103 | 104 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826131434891.png) 105 | 106 | 该功能主要用于查询系统中的销售信息,其查询方式可以按照客户全称、销售票号进行匹配查询和模糊查询。另外,还可以指定销售日期查询。 107 | 108 | 其关键代码如下: 109 | 110 | ```java 111 | // 条件查询 112 | private final class QueryAction implements ActionListener { 113 | public void actionPerformed(final ActionEvent e) { 114 | boolean selDate = selectDate.isSelected(); 115 | if(content.getText().equals("")) { 116 | JOptionPane.showMessageDialog(getContentPane(), "请输入查询内容!"); 117 | return; 118 | } 119 | if(selDate) { 120 | if(startDate.getText()==null||startDate.getText().equals("")) { 121 | JOptionPane.showMessageDialog(getContentPane(), "请输入查询的开始日期!"); 122 | return; 123 | } 124 | if(endDate.getText()==null||endDate.getText().equals("")) { 125 | JOptionPane.showMessageDialog(getContentPane(), "请输入查询的结束日期!"); 126 | return; 127 | } 128 | } 129 | List list=null;// 结果集 130 | String con = condition.getSelectedIndex() == 0 ? "khname " : "sellId "; 131 | int oper = operation.getSelectedIndex(); 132 | String opstr = oper == 0 ? "= " : "like "; 133 | String cont = content.getText(); 134 | list = Dao.findForList("select * from v_sellView where " 135 | + con + opstr 136 | + (oper == 0 ? "'"+cont+"'" : "'%" + cont + "%'") 137 | + (selDate ? " and xsdate>'" + startDate.getText() 138 | + "' and xsdate<='" + endDate.getText()+" 23:59:59'" : "")); 139 | // 执行拼接的SQL语句后获得的结果集 140 | Iterator iterator = list.iterator();// 与结果集list相应的迭代器 141 | updateTable(iterator); 142 | } 143 | } 144 | } 145 | ``` 146 | 147 | 商品查询: 148 | 149 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826131535864.png) 150 | 151 | 该功能主要用于查询系统中的商品信息,其查询方式可以按照商品的名称、供应商全称、产地、规格等信息进行查询。 152 | 153 | 其关键代码如下: 154 | 155 | ```java 156 | // 点击“显示全部数据”按钮后,更新表格内容 157 | private void updateTable(List list, final DefaultTableModel dftm) { 158 | int num = dftm.getRowCount(); 159 | for (int i = 0; i < num; i++) 160 | dftm.removeRow(0); 161 | Iterator iterator = list.iterator(); 162 | TbSpinfo spInfo;// 商品信息 163 | while (iterator.hasNext()) { 164 | List info = (List) iterator.next(); 165 | Item item = new Item(); 166 | item.setId((String) info.get(0)); 167 | item.setName((String) info.get(1)); 168 | spInfo = Dao.getSpInfo(item); 169 | Vector rowData = new Vector(); 170 | rowData.add(spInfo.getId().trim());// 商品编号 171 | rowData.add(spInfo.getSpname().trim());// 商品名称 172 | rowData.add(spInfo.getJc());// 商品简称 173 | rowData.add(spInfo.getCd());// 产地 174 | rowData.add(spInfo.getDw());// 商品计量单位 175 | rowData.add(spInfo.getGg());// 商品规格 176 | rowData.add(spInfo.getBz());// 包装 177 | rowData.add(spInfo.getPh());// 批号 178 | rowData.add(spInfo.getPzwh());// 批准文号 179 | rowData.add(spInfo.getGysname());// 供应商名称 180 | rowData.add(spInfo.getMemo());// 备注 181 | dftm.addRow(rowData);// 向表格对象添加行数据(商品信息) 182 | } 183 | } 184 | ``` 185 | ## 05 使用说明 186 | 187 | 详细使用说明见工程中“readme.txt”文件。 188 | 189 | ## 06 源码下载 190 | 191 | 关注公众号【C you again】,回复“基于java的企业进销存管理系统”免费领取。 192 | 亦可直接扫描主页二维码关注,回复“基于java的企业进销存管理系统”免费领取,[点此打开个人主页](https://gzh.cyouagain.cn/) 193 | 194 | 195 | 原文链接:http://www.demodashi.com/demo/15938.html 196 | 197 | **说明:此源码来源于网络,若有侵权,请联系删除!!** 198 | -------------------------------------------------------------------------------- /基于ssm的客户管理系统.md: -------------------------------------------------------------------------------- 1 | @[toc] 2 | 3 | **关注公众号【C you again】,回复“基于ssm的客户管理系统”免费下载。** 4 | 5 | ## 01 概述 6 | 7 | 一个简单的客户关系管理系统,管理用户的基本数据、客户的分配、客户的流失以及客户的状态。 8 | 9 | ## 02 技术 10 | 11 | > ssm + jdk1.8 + mysql5.4 12 | 13 | ## 03 运行环境 14 | 15 | > ecplice + jdk1.8 + tomcat 16 | 17 | ## 04 功能 18 | 19 | 1- 字典管理 20 | 21 | 2- 用户管理 22 | 23 | 3- 角色管理 24 | 25 | 4- 权限管理 26 | 27 | 5- 部门管理 28 | 29 | 6-客户信息管理 30 | 31 | 7-数据添加-编辑-删除 32 | 33 | 8-客户信息的跟进 34 | 35 | 9-客户信息状态 36 | 37 | ## 05 运行截图 38 | 39 | #### 客户信息 40 | 41 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082515561175.png) 42 | 43 | #### 跟进信息 44 | 45 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825155633457.png) 46 | 47 | #### 登录信息 48 | 49 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825155707568.png) 50 | 51 | #### 权限管理 52 | 53 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825155741853.png) 54 | 55 | ## 06 主要代码 56 | 57 | #### 客户信息 58 | 59 | ```java 60 | package com.controller; 61 | 62 | import java.text.SimpleDateFormat; 63 | import java.util.Date; 64 | import java.util.HashMap; 65 | import java.util.List; 66 | import java.util.Map; 67 | 68 | import javax.annotation.Resource; 69 | import javax.servlet.http.HttpServletRequest; 70 | 71 | import org.springframework.stereotype.Controller; 72 | import org.springframework.ui.ModelMap; 73 | import org.springframework.web.bind.annotation.PathVariable; 74 | import org.springframework.web.bind.annotation.RequestMapping; 75 | 76 | import com.dao.KhClientinfoMapper; 77 | import com.dao.KhHuiMapper; 78 | import com.dao.LogsMapper; 79 | import com.entity.KhClientinfo; 80 | import com.entity.KhHui; 81 | import com.entity.Logs; 82 | import com.util.Pagination; 83 | 84 | @Controller 85 | @RequestMapping("/khclient") 86 | public class KhClientinfoController extends BaseController{ 87 | @Resource//客户表 88 | KhClientinfoMapper khclientDao; 89 | @Resource//客户跟进表 90 | KhHuiMapper khhuiDao; 91 | @Resource 92 | LogsMapper logsDao; 93 | //客户表显示 94 | @RequestMapping("/show") 95 | public String show(Integer index,HttpServletRequest request) { 96 | int pageNO = 1; 97 | if(index!=null){ 98 | pageNO = index; 99 | } 100 | String names = (String) request.getSession().getAttribute("name"); 101 | String relo = (String) request.getSession().getAttribute("relo"); 102 | Pagination pager = new Pagination(); 103 | Map params = new HashMap(); 104 | params.put("start", (pageNO-1)*40); 105 | params.put("pagesize", 40); 106 | if("客服".equals(relo)) { 107 | params.put("kefuname", names); 108 | } 109 | List all = khclientDao.show(params); 110 | pager.setData(all); 111 | pager.setIndex(pageNO); 112 | request.getSession().setAttribute("pageNO", pager.getIndex()); 113 | pager.setPageSize(40); 114 | pager.setTotal(khclientDao.getTotal()); 115 | pager.setPath("show.do?"); 116 | request.setAttribute("pager", pager); 117 | return "client/cl-show"; 118 | } 119 | //客户表新建 120 | @RequestMapping(value = "/add") 121 | public String add(KhClientinfo data,HttpServletRequest request) { 122 | Date now = new Date(); 123 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//设置时间显示格式 124 | String str = sdf.format(now); 125 | String names = (String) request.getSession().getAttribute("name"); 126 | data.setKehuday(str); 127 | data.setKefuname(names); 128 | data.setKhstate("未到访"); 129 | Date time = null; 130 | if ("A:已交房客户".equals(data.getKehulei())) { 131 | time= new Date(now.getTime() + (long)3 * 24 * 60 * 60 * 1000);//加3天 132 | } 133 | if ("B:3个月内交房客户".equals(data.getKehulei())) { 134 | time= new Date(now.getTime() + (long)7 * 24 * 60 * 60 * 1000);//加7天 135 | } 136 | if ("C:3-6交房客户".equals(data.getKehulei())) { 137 | time= new Date(now.getTime() + (long)15 * 24 * 60 * 60 * 1000);//加15天 138 | } 139 | if ("D:6个月以上交房客户".equals(data.getKehulei())) { 140 | time= new Date(now.getTime() + (long)30 * 24 * 60 * 60 * 1000);//加30天 141 | } 142 | String stc = sdf.format(time); 143 | if (data.getKehutel().length()>1) { 144 | KhClientinfo khClient=khclientDao.tel(data.getKehutel()); 145 | if (khClient!=null) { 146 | request.setAttribute("all", khClient.getKefuname()); 147 | return "client/chongfu"; 148 | } 149 | } 150 | khclientDao.insertSelective(data); 151 | KhClientinfo khClientinfo=khclientDao.isdn(); 152 | KhHui khHui=new KhHui(); 153 | khHui.setYuday(stc); 154 | khHui.setWenti("客户第一次跟进"); 155 | khHui.setInid(khClientinfo.getId()); 156 | khHui.setScday(str); 157 | khhuiDao.insertSelective(khHui); 158 | Integer pagerNO=(Integer)request.getSession().getAttribute("pageNO"); 159 | return "redirect:/khclient/show?index="+pagerNO; 160 | } 161 | 162 | //客户表删除 163 | @RequestMapping("/{id}/del") 164 | public String del(@PathVariable("id") int id,HttpServletRequest request) { 165 | SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 时间字符串产生方式 166 | String uid = format.format(new Date()); 167 | String names = (String) request.getSession().getAttribute("name"); 168 | KhClientinfo khClientinfo=khclientDao.selectByPrimaryKey(id); 169 | Logs logs =new Logs(); 170 | logs.setDay(uid); 171 | logs.setLoname(names); 172 | logs.setLei("删除"); 173 | logs.setBiaoid(khClientinfo.getKuhuname()+"+"+khClientinfo.getKehutel()); 174 | logs.setBiao("客户表及跟进详情"); 175 | logsDao.insertSelective(logs); 176 | 177 | khclientDao.deleteByPrimaryKey(id); 178 | Integer pagerNO=(Integer)request.getSession().getAttribute("pageNO"); 179 | String like=request.getParameter("like"); 180 | if (like!=null&&like.length()>0) { 181 | return "redirect:/khclient/like?index="+pagerNO; 182 | }else { 183 | return "redirect:/khclient/show?index="+pagerNO; 184 | } 185 | } 186 | //客户表编辑前取数据 187 | @RequestMapping("/{id}/load") 188 | public String load(@PathVariable("id") int id,HttpServletRequest request, ModelMap model) { 189 | KhClientinfo record = (KhClientinfo) khclientDao.selectByPrimaryKey(id); 190 | model.addAttribute("record", record); 191 | String like=request.getParameter("like"); 192 | if (like!=null) { 193 | request.setAttribute("like", like); 194 | } 195 | return "client/cl-modify"; 196 | } 197 | //客户表编辑 198 | @RequestMapping(value = "/update") 199 | public String update(KhClientinfo data,HttpServletRequest request) { 200 | khclientDao.updateByPrimaryKeySelective(data); 201 | Integer pagerNO=(Integer)request.getSession().getAttribute("pageNO"); 202 | String like=request.getParameter("like"); 203 | if (like!=null&&like.length()>0) { 204 | return "redirect:/khclient/like?index="+pagerNO; 205 | }else { 206 | return "redirect:/khclient/show?index="+pagerNO; 207 | } 208 | } 209 | //客户表模糊查找 210 | @RequestMapping("/like") 211 | public String like(Integer index, KhClientinfo data,HttpServletRequest request) { 212 | int pageNO = 1; 213 | if(index!=null){ 214 | pageNO = index; 215 | } 216 | Pagination pager = new Pagination(); 217 | Map params = new HashMap(); 218 | String lk=request.getParameter("lk"); 219 | String names = (String) request.getSession().getAttribute("name"); 220 | String relo = (String) request.getSession().getAttribute("relo"); 221 | if (lk!=null&&lk.length()>0) { 222 | request.getSession().setAttribute("kuhuname",data.getKuhuname()); 223 | request.getSession().setAttribute("kehuaddres",data.getKehuaddres()); 224 | request.getSession().setAttribute("kehutel",data.getKehutel()); 225 | request.getSession().setAttribute("kehulei",data.getKehulei()); 226 | request.getSession().setAttribute("kehugenre",data.getKehugenre()); 227 | 228 | request.getSession().setAttribute("kaiday",data.getKaiday()); 229 | request.getSession().setAttribute("weixin",data.getWeixin()); 230 | request.getSession().setAttribute("channel",data.getChannel()); 231 | request.getSession().setAttribute("khstate",data.getKhstate()); 232 | request.getSession().setAttribute("kefuname",data.getKefuname()); 233 | request.getSession().setAttribute("kehuday",data.getKehuday()); 234 | request.getSession().setAttribute("qu",data.getQu()); 235 | request.getSession().setAttribute("an",data.getAn()); 236 | request.getSession().setAttribute("jiename",data.getJiename()); 237 | 238 | } 239 | String qu= (String) request.getSession().getAttribute("qu"); 240 | if(qu!=null&&qu.length()>0) { 241 | params.put("qu", qu); 242 | } 243 | String an= (String) request.getSession().getAttribute("an"); 244 | if(an!=null&&an.length()>0) { 245 | params.put("an", an); 246 | } 247 | String jiename= (String) request.getSession().getAttribute("jiename"); 248 | if(jiename!=null&&jiename.length()>0) { 249 | params.put("jiename", jiename); 250 | } 251 | 252 | String kaiday= (String) request.getSession().getAttribute("kaiday"); 253 | if(kaiday!=null&&kaiday.length()>0) { 254 | params.put("kaiday", kaiday); 255 | } 256 | String weixin= (String) request.getSession().getAttribute("weixin"); 257 | if(weixin!=null&&weixin.length()>0) { 258 | params.put("weixin", weixin); 259 | } 260 | String channel= (String) request.getSession().getAttribute("channel"); 261 | if(channel!=null&&channel.length()>0) { 262 | params.put("channel", channel); 263 | } 264 | String khstate= (String) request.getSession().getAttribute("khstate"); 265 | if(khstate!=null&&khstate.length()>0) { 266 | params.put("khstate", khstate); 267 | } 268 | String kehuday= (String) request.getSession().getAttribute("kehuday"); 269 | if(kehuday!=null&&kehuday.length()>0) { 270 | params.put("kehuday", kehuday); 271 | } 272 | 273 | String kuhuname= (String) request.getSession().getAttribute("kuhuname"); 274 | if(kuhuname!=null&&kuhuname.length()>0) { 275 | params.put("kuhuname", kuhuname); 276 | } 277 | String kehuaddres= (String) request.getSession().getAttribute("kehuaddres"); 278 | if(kehuaddres!=null&&kehuaddres.length()>0) { 279 | params.put("kehuaddres", kehuaddres); 280 | } 281 | String kehugenre= (String) request.getSession().getAttribute("kehugenre"); 282 | if(kehugenre!=null&&kehugenre.length()>0) { 283 | params.put("kehugenre", kehugenre); 284 | } 285 | String kehulei= (String) request.getSession().getAttribute("kehulei"); 286 | if(kehulei!=null&&kehulei.length()>0) { 287 | params.put("kehulei", kehulei); 288 | } 289 | String kehutel= (String) request.getSession().getAttribute("kehutel"); 290 | if(kehutel!=null&&kehutel.length()>0) { 291 | params.put("kehutel", kehutel); 292 | } 293 | String kefuname= (String) request.getSession().getAttribute("kefuname"); 294 | if("客服".equals(relo)) { 295 | params.put("kefuname", names); 296 | }else { 297 | if(kefuname!=null&&kefuname.length()>0) { 298 | params.put("kefuname", kefuname); 299 | } 300 | } 301 | params.put("start", (pageNO-1)*40); 302 | params.put("pagesize",40); 303 | List all = khclientDao.like(params); 304 | pager.setData(all); 305 | pager.setIndex(pageNO); 306 | request.getSession().setAttribute("pageNO",pager.getIndex()); 307 | pager.setPageSize(40); 308 | pager.setTotal(khclientDao.getlikeTotal(params)); 309 | pager.setPath("like?"); 310 | request.setAttribute("pager", pager); 311 | return "client/cl-showlike"; 312 | } 313 | } 314 | 315 | ``` 316 | 317 | ## 用户登录 318 | 319 | ```java 320 | package com.controller; 321 | 322 | import java.util.*; 323 | import javax.annotation.Resource; 324 | import javax.servlet.http.HttpServletRequest; 325 | import org.springframework.stereotype.Controller; 326 | import org.springframework.ui.ModelMap; 327 | import org.springframework.web.bind.annotation.RequestMapping; 328 | import com.dao.LogMapper; 329 | import com.dao.LogsMapper; 330 | import com.entity.Log; 331 | import com.util.Pagination; 332 | 333 | @Controller 334 | @RequestMapping("/log") 335 | public class LogController extends BaseController{ 336 | @Resource 337 | LogMapper logDao; 338 | @Resource 339 | LogsMapper logsDao; 340 | 341 | //登录信息显示 342 | @RequestMapping("/show") 343 | public String show(Integer index,HttpServletRequest request,ModelMap model) { 344 | int pageNO = 1; 345 | if(index!=null){ 346 | pageNO = index; 347 | } 348 | Pagination pager = new Pagination(); 349 | Map params = new HashMap(); 350 | params.put("start", (pageNO-1)*40); 351 | params.put("pagesize", 40); 352 | List all = logDao.show(params); 353 | pager.setData(all); 354 | pager.setIndex(pageNO); 355 | request.getSession().setAttribute("pageNO", pager.getIndex()); 356 | pager.setPageSize(40); 357 | pager.setTotal(logDao.getTotal()); 358 | pager.setPath("show.do?"); 359 | request.setAttribute("pager", pager); 360 | return "dept/denlu/show"; 361 | } 362 | //登录信息模糊查找 363 | @RequestMapping("/like") 364 | public String like(Integer index, Log data,HttpServletRequest request) { 365 | int pageNO = 1; 366 | if(index!=null){ 367 | pageNO = index; 368 | } 369 | Pagination pager = new Pagination(); 370 | Map params = new HashMap(); 371 | String lk=request.getParameter("lk"); 372 | String account=""; 373 | String onlineTime=""; 374 | String exitTime=""; 375 | if (lk!=null&&lk.length()>0) { 376 | request.getSession().setAttribute("account",data.getAccount()); 377 | request.getSession().setAttribute("onlineTime",data.getOnlineTime()); 378 | request.getSession().setAttribute("exitTime",data.getExitTime()); 379 | } 380 | account=(String) request.getSession().getAttribute("account"); 381 | onlineTime=(String) request.getSession().getAttribute("onlineTime"); 382 | exitTime=(String) request.getSession().getAttribute("exitTime"); 383 | if(account!=null&&account.length()>0) { 384 | params.put("account",account); 385 | } 386 | if(onlineTime!=null&&onlineTime.length()>0) { 387 | params.put("onlineTime",onlineTime); 388 | } 389 | if(exitTime!=null&&exitTime.length()>0) { 390 | params.put("exitTime",exitTime); 391 | } 392 | params.put("start", (pageNO-1)*40); 393 | params.put("pagesize", 40); 394 | List all = logDao.like(params); 395 | pager.setData(all); 396 | pager.setIndex(pageNO); 397 | request.getSession().setAttribute("pageNO", pager.getIndex()); 398 | pager.setPageSize(40); 399 | pager.setTotal(logDao.getlikeTotal(params)); 400 | pager.setPath("like.do?"); 401 | request.setAttribute("pager", pager); 402 | return "dept/denlu/show"; 403 | } 404 | //个人操作记录显示 405 | @RequestMapping("/shows") 406 | public String shows(Integer index,HttpServletRequest request,ModelMap model) { 407 | int pageNO = 1; 408 | if(index!=null){ 409 | pageNO = index; 410 | } 411 | Pagination pager = new Pagination(); 412 | Map params = new HashMap(); 413 | params.put("start", (pageNO-1)*40); 414 | params.put("pagesize", 40); 415 | List all = logsDao.show(params); 416 | pager.setData(all); 417 | pager.setIndex(pageNO); 418 | request.getSession().setAttribute("pageNO", pager.getIndex()); 419 | pager.setPageSize(40); 420 | pager.setTotal(logsDao.getTotal()); 421 | pager.setPath("shows.do?"); 422 | request.setAttribute("pager", pager); 423 | return "dept/caozuo/show"; 424 | } 425 | } 426 | ``` 427 | 428 | ## 07 源码下载 429 | 430 | 关注公众号【C you again】,回复“基于ssm的客户管理系统”免费领取。 431 | 432 | 亦可直接扫描主页二维码关注,回复“基于ssm的客户管理系统”免费领取,[点此打开个人主页](https://gzh.cyouagain.cn/) 433 | 434 | 435 | 436 | ## 运行 437 | 438 | - 找到文件夹sql中的sql文件,导入到mysql中 439 | - 将工程导入到eclipse中,修改数据库连接信息 440 | - 启动项目,浏览器地址栏输入:http://localhost:8080/ssmClient 441 | 442 | 443 | **说明:此源码来源于网络,若有侵权,请联系删除!!** 444 | -------------------------------------------------------------------------------- /基于web的图书管理系统设计与实现.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | > **作者:** C you again,从事软件开发 努力在IT搬砖路上的技术小白 4 | > 5 | > **公众号:** 【**[C you again](https://cyouagain.cn/)**】,分享计算机类毕业设计源码、IT技术文章、游戏源码、网页模板、程序人生等等。公众号回复 【**粉丝**】进博主技术群,与大佬交流,**领取干货学习资料** 6 | > 7 | > **关于转载**:欢迎转载博主文章,转载时表明出处 8 | > 9 | > **求赞环节**:创作不易,记得 点赞+评论+转发 谢谢你一路支持 10 | > 11 | # 系统演示链接:[点击这里查看演示](http://books.cyouagain.cn) 12 | 13 | **源码下载:微信公众号【C you again】,回复“基于web的图书管理系统”** 14 | 15 | ## 01 系统简述 16 | 图书管理系统就是利用计算机,结合互联网对图书进行结构化、自动化管理的一种软件,来提高对图书的管理效率。本系统采用Java+Servlet+Jsp 的方式实现基于web的图书管理系统。 17 | 18 | ## 02 开发工具及相关技术 19 | #### 2.1 Java技术 20 | Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台。有许多应用程序和 Web 站点只有在安装 Java 后才能正常工作,而且这样的应用程序和 Web 站点日益增多。Java 快速、安全、可靠。从笔记本电脑到数据中心,从游戏控制台到科学超级计算机,从手机到互联网,Java 无处不在。 21 | 22 | #### 2.2 HTML、css、javascript技术 23 | HTML的英文全称是 Hypertext Marked Language,即超文本标记语言。HTML是由Web的发明者 Tim Berners-Lee和同事 Daniel W. Connolly于1990年创立的一种标记语言,它是标准通用化标记语言SGML的应用。用HTML编写的超文本文档称为HTML文档,它能独立于各种操作系统平台(如UNIX, Windows等)。使用HTML语言,将所需要表达的信息按某种规则写成HTML文件,通过专用的浏览器来识别,并将这些HTML文件“翻译”成可以识别的信息,即现在所见到的网页。 24 | 25 | 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。 26 | 27 | JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。JavaScript在1995年由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。JavaScript的标准是ECMAScript 。截至 2012 年,所有浏览器都完整的支持ECMAScript 5.1,旧版本的浏览器至少支持ECMAScript 3 标准。2015年6月17日,ECMA国际组织发布了ECMAScript 的第六版,该版本正式名称为 ECMAScript 2015,但通常被称为ECMAScript 6 或者ES6。 28 | 29 | #### 2.3 Servlet技术 30 | Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。 31 | 32 | 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。 33 | #### 2.4 Eclipse开发工具 34 | Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。 35 | 36 | #### 2.5 MySql数据库 37 | MySql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。MySql数据库有以下特点: 38 | 39 | 1. Mysql是开源的,所以你不需要支付额外的费用。 40 | 3. Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。 41 | 4. MySQL使用标准的SQL数据语言形式。 42 | 5. Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。 43 | 6. Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。 44 | 7. MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。 45 | 8. Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。 46 | 47 | ## 03 系统功能描述 48 | 系统的用户主要有两大类:一是图书管理系统的管理员,二是普通用户。根据用户类型的不同,将系统划分为普通用户端和管理员端,它们具有的主要功能如下: 49 | 50 | **用户端** 51 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711142212377.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 52 | 53 | 图书查询:根据图书编号、图书名称查询图书信息,可查询图书的编号、名称、分类、作者、价格、在馆数量等。 54 | 55 | 借阅信息:可查询图书的基本信息、借阅日期、截止还书日期、超期天数等。 56 | 57 | 借阅历史:查询自己以往的借阅历史,包括哪些图书等具体信息。 58 | 59 | 我的:查看个人资料,修改账户密码,退出系统。 60 | 61 | **管理员端** 62 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711142331762.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 63 | 图书管理:根据图书编号、图书名称查询图书基本信息,添加、修改、删除图书。 64 | 65 | 图书分类管理:根据分类名称查询图书分类信息,添加、修改、删除图书分类。 66 | 67 | 图书借阅:展示所有正在借阅图书的信息。 68 | 69 | 图书归还:展示所有已归还图书的信息。 70 | 71 | 公告管理:向用户发布公告。 72 | 73 | 读者管理:根据账号、姓名查询读者基本信息,添加、修改、删除读者信息。 74 | 75 | 我的:查看个人资料,修改账户密码,退出系统。 76 | 77 | ## 04 工程结构及其说明 78 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711142439453.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 79 | 项目名称:manage_books 80 | Package包说明: 81 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711142614767.png) 82 | 83 | ## 05 主要功能详细设计与实现 84 | #### 5.1 用户端--图书查询模块 85 | 用户访问图书查询模块时显示当前可以借阅图书,有按图书名称查询图书信息的功能,可以进行借书操作。 86 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711142820895.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 87 | 其中查询功能的Servlet代码如下: 88 | 89 | ```java 90 | package com.cya.controller; 91 | import java.io.IOException; 92 | import java.util.ArrayList; 93 | import javax.servlet.ServletException; 94 | import javax.servlet.annotation.WebServlet; 95 | import javax.servlet.http.HttpServlet; 96 | import javax.servlet.http.HttpServletRequest; 97 | import javax.servlet.http.HttpServletResponse; 98 | import com.cya.dao.BookDao; 99 | import com.cya.pojo.Book; 100 | /** 101 | * Servlet implementation class selectServlet 102 | */ 103 | @WebServlet("/selectServlet") 104 | public class selectServlet extends HttpServlet { 105 | private static final long serialVersionUID = 1L; 106 | 107 | /** 108 | * @see HttpServlet#HttpServlet() 109 | */ 110 | public selectServlet() { 111 | super(); 112 | // TODO Auto-generated constructor stub 113 | } 114 | 115 | /** 116 | * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 117 | */ 118 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 119 | // TODO Auto-generated method stub 120 | //response.getWriter().append("Served at: ").append(request.getContextPath()); 121 | 122 | } 123 | 124 | /** 125 | * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 126 | */ 127 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 128 | // TODO Auto-generated method stub 129 | //doGet(request, response); 130 | request.setCharacterEncoding("UTF-8"); 131 | response.setContentType("text/html;charset=UTF-8"); 132 | //因为在管理员界面和读者界面都有查找功能,为了将查找的结果返回正确的页面,设置了tip,tip=1表示管理员界面 133 | int tip = Integer.parseInt(request.getParameter("tip")); 134 | String name = request.getParameter("name"); 135 | BookDao bookdao = new BookDao(); 136 | ArrayList data = bookdao.getLikeList(name); 137 | //将获取的结果存入请求中 138 | request.setAttribute("data", data); 139 | String url = ""; 140 | //转发不同的界面 141 | if (tip == 1) { 142 | url = response.encodeURL("/books/admin/admin_books.jsp"); 143 | } else { 144 | url = response.encodeURL("/books/user/select.jsp"); 145 | } 146 | //将请求转发 147 | request.getRequestDispatcher(url).forward(request, response); 148 | } 149 | 150 | } 151 | ``` 152 | 153 | #### 5.2 用户端--借阅信息模块 154 | 当普通用户借阅完图书,会在该模块自动生成借阅信息,如借阅日期,归还日期,也可在该模块进行还书,如下图所示。 155 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711143029669.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 156 | 其中,还书功能的Servlet代码如下: 157 | 158 | ```java 159 | package com.cya.controller; 160 | import java.io.IOException; 161 | import java.io.PrintWriter; 162 | import javax.servlet.ServletException; 163 | import javax.servlet.annotation.WebServlet; 164 | import javax.servlet.http.HttpServlet; 165 | import javax.servlet.http.HttpServletRequest; 166 | import javax.servlet.http.HttpServletResponse; 167 | import javax.servlet.http.HttpSession; 168 | import com.cya.pojo.Admin; 169 | import com.cya.dao.AdminDao; 170 | import com.cya.dao.BookDao; 171 | /** 172 | * Servlet implementation class borrowServlet 173 | */ 174 | @WebServlet("/borrowServlet") 175 | public class borrowServlet extends HttpServlet { 176 | private static final long serialVersionUID = 1L; 177 | 178 | /** 179 | * @see HttpServlet#HttpServlet() 180 | */ 181 | public borrowServlet() { 182 | super(); 183 | // TODO Auto-generated constructor stub 184 | } 185 | 186 | /** 187 | * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 188 | */ 189 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 190 | // TODO Auto-generated method stub 191 | //response.getWriter().append("Served at: ").append(request.getContextPath()); 192 | //设置编码类型 193 | request.setCharacterEncoding("UTF-8"); 194 | response.setContentType("text/html;charset=UTF-8"); 195 | BookDao bookdao = new BookDao(); 196 | //为了区分借书和还书的功能,设置tip,tip为1,表示借书 197 | int tip = Integer.parseInt(request.getParameter("tip")); 198 | if (tip == 1) { 199 | //获取图书id 200 | int bid = Integer.parseInt(request.getParameter("bid")); 201 | HttpSession session = request.getSession(); 202 | Admin admin = new Admin(); 203 | String status=request.getParameter("status"); 204 | String id=""; 205 | if(status.equals("user")) { 206 | //获取到存入session的读者id 207 | id = (String) session.getAttribute("uid"); 208 | } 209 | else { 210 | //获取到存入session的aid读者id 211 | id = (String) session.getAttribute("aid"); 212 | } 213 | 214 | AdminDao admindao = new AdminDao(); 215 | //通过aid获取到读者的信息 216 | admin = admindao.get_AidInfo2(id); 217 | //将借阅记录存入数据表 218 | bookdao.borrowBook(bid, admin); 219 | response.sendRedirect("/manage_books/books/user/select.jsp"); 220 | } else { 221 | //还书功能,获取借阅记录的hid 222 | int hid = Integer.parseInt(request.getParameter("hid")); 223 | /** 224 | * 还书在管理员和读者界面都有,为了区分,设置了show字段,show为1表示读者界面 225 | */ 226 | int show = Integer.parseInt(request.getParameter("show")); 227 | //调用还书函数,改变status字段 228 | bookdao.borrowBook2(hid); 229 | if (show == 1) { 230 | response.sendRedirect("/manage_books/books/user/borrow.jsp"); 231 | } else { 232 | response.sendRedirect("/manage_books/books/admin/admin_borrows.jsp"); 233 | } 234 | 235 | } 236 | 237 | } 238 | 239 | /** 240 | * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 241 | */ 242 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 243 | // TODO Auto-generated method stub 244 | doGet(request, response); 245 | } 246 | 247 | } 248 | ``` 249 | #### 5.3 管理员端--图书管理模块 250 | 管理员可以通过根据图书号 、图书名称,作者名称,出版社等查询图书信息。 251 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711143221127.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 252 | 253 | 管理员登录系统以后,可以进行图书添加操作,这是管理员主要的输入信息部分,填写好各项信息后,单击保存按钮,系统将对这些信息进行处理。界面见下图所示: 254 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711143310535.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 255 | 256 | 除此以外,管理员对已经添加好的图书信息有修改权限。 257 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711143409474.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 258 | 其中,添加图书功能的代码如下: 259 | 260 | ```java 261 | package com.cya.controller; 262 | import java.io.IOException; 263 | import javax.servlet.ServletException; 264 | import javax.servlet.annotation.WebServlet; 265 | import javax.servlet.http.HttpServlet; 266 | import javax.servlet.http.HttpServletRequest; 267 | import javax.servlet.http.HttpServletResponse; 268 | import com.cya.dao.BookDao; 269 | /** 270 | * Servlet implementation class AddBookServlet 271 | */ 272 | @WebServlet("/AddBookServlet") 273 | public class AddBookServlet extends HttpServlet { 274 | private static final long serialVersionUID = 1L; 275 | 276 | /** 277 | * @see HttpServlet#HttpServlet() 278 | */ 279 | public AddBookServlet() { 280 | super(); 281 | // TODO Auto-generated constructor stub 282 | } 283 | 284 | /** 285 | * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 286 | */ 287 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 288 | // TODO Auto-generated method stub 289 | // response.getWriter().append("Served at: ").append(request.getContextPath()); 290 | } 291 | 292 | /** 293 | * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 294 | */ 295 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 296 | // TODO Auto-generated method stub 297 | // doGet(request, response); 298 | //设置编码类型 299 | request.setCharacterEncoding("UTF-8"); 300 | response.setContentType("text/html;charset=UTF-8"); 301 | //获取要添加图书的信息 302 | String card = request.getParameter("card"); 303 | String name = request.getParameter("name"); 304 | String type = request.getParameter("type"); 305 | String autho = request.getParameter("autho"); 306 | String press = request.getParameter("press"); 307 | int num = Integer.parseInt(request.getParameter("num")); 308 | BookDao bookdao = new BookDao(); 309 | //调用函数,存入图书 310 | bookdao.addBook(card, name, type, autho, press, num); 311 | response.sendRedirect("/manage_books/books/admin/admin_books.jsp"); 312 | } 313 | 314 | } 315 | ``` 316 | 317 | #### 5.4 管理员端--图书分类模块 318 | 管理员在该界面可以增加、删除、修改图书分类信息,操作效果如图。 319 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711143555646.png) 320 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711143617913.png) 321 | 修改图书分类功能的代码如下: 322 | 323 | ```java 324 | package com.cya.controller; 325 | import java.io.IOException; 326 | import javax.servlet.ServletException; 327 | import javax.servlet.annotation.WebServlet; 328 | import javax.servlet.http.HttpServlet; 329 | import javax.servlet.http.HttpServletRequest; 330 | import javax.servlet.http.HttpServletResponse; 331 | import com.cya.dao.BookDao; 332 | import com.cya.dao.TypeDao; 333 | /** 334 | * Servlet implementation class updateBookTypeServlet 335 | */ 336 | @WebServlet("/updateBookTypeServlet") 337 | public class updateBookTypeServlet extends HttpServlet { 338 | private static final long serialVersionUID = 1L; 339 | 340 | /** 341 | * @see HttpServlet#HttpServlet() 342 | */ 343 | public updateBookTypeServlet() { 344 | super(); 345 | // TODO Auto-generated constructor stub 346 | } 347 | 348 | /** 349 | * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 350 | */ 351 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 352 | // TODO Auto-generated method stub 353 | // response.getWriter().append("Served at: ").append(request.getContextPath()); 354 | } 355 | 356 | /** 357 | * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 358 | */ 359 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 360 | // TODO Auto-generated method stub 361 | // doGet(request, response); 362 | //修改图书类型信息 363 | request.setCharacterEncoding("UTF-8"); 364 | response.setContentType("text/html;charset=UTF-8"); 365 | String name = request.getParameter("name"); 366 | int tid = Integer.parseInt(request.getParameter("tid")); 367 | TypeDao typedao = new TypeDao(); 368 | typedao.updateTypeBook(tid, name); 369 | response.sendRedirect("/manage_books/books/admin/admin_booksType.jsp"); 370 | } 371 | 372 | } 373 | ``` 374 | 375 | 最后,关注公众号【C you again】获取更多计算类毕业设计源码!! 376 | -------------------------------------------------------------------------------- /基于web的机票管理系统设计与实现(一).md: -------------------------------------------------------------------------------- 1 | 2 | 3 | @[toc] 4 | 5 | **获取源码请关注公众号:C you again,回复“基于web的机票管理系统”或者“机票管理系统”** 6 | 7 | ## 1 摘 要 8 | 9 | 近年来,我国发展迅速,对交通工具的需求量大幅度增加。飞机作为出行工具之一,花费时间短、用户体验度好,价格实惠、安全性高等优点自然成为人们的首选,这也导致等待时间长、购票效率低等一系列问题的出现,给用户和航空公司造成严重困扰。面对这些问题,在线机票预订系统显得格外重要。 10 | 11 | 本系统使用Eclipse开发工具,使用Redis、MySQL数据库,采用MVC三层架构的方式,结合当前最流行的SSM框架以及支付宝沙箱支付环境来实现各个功能。系统分为用户端和管理员端。用户端实现了用户注册与登录、用户评论、机票查询,机票预订,订单查询、广告展示等功能。管理员端包括航班信息管理模块、订单信息管理模块、用户信息管理模块、留言评论管理模块、广告信息管理模块、个人信息管理模块等六大模块,具有开放体系结构的、易扩充的、易维护的、具有良好人机界面的优点。 12 | 13 | 经过充分的测试,测试数据均正确无误,各个模块运行良好。机票预订系统的推出,为乘客出行提供方便,便于机场工作人员对机票信息进行管理,提高了机场工作人员对机票管理的工作效率。 14 | 15 | **关键词:机票预订系统; 数据库; MVC; SSM; 面向对象** 16 | 17 | ## 2 系统相关技术概述 18 | 19 | #### 2.1 Java web 20 | 21 | Java Web,是用Java技术来解决相关web互联网领域的技术总和。随着Web互联网技术的出现和推广,基于Java技术的Java Web技术应运而生,并为解决互联网相关问题提出解决方案。我们知道,Web是由服务器和客户端两方面组成。基于Java语言的Web框架有很多种,用以适用不同的技术需求,但是都遵循最基本的原则和技术路线,即采用了MVC的架构设计思想,并通过Servlet或者Filter进行请求拦截,同时使用约定,XML或Annotation来实现必备的相关配置,充分利用其面向对象的特质,实现前台用户请求和后台程序响应的工作流程。 22 | 23 | #### 2.2 三大框架SSM 24 | 25 | SSM框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。 26 | Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 27 | Spring MVC属于Spring Framework的后续产品,已经融合在Spring Web Flow里面,它原生支持的Spring特性,让开发变得非常简单规范。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。 28 | 29 | MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 30 | 31 | #### 2.3 前端框架AngularJS 32 | 33 | AngularJS是一个开发动态Web应用的框架。它让你可以使用HTML作为模板语言并且可以通过扩展的HTML语法来使应用组件更加清晰和简洁。它的创新之处在于,通过数据绑定和依赖注入减少了大量代码,而这些都在浏览器端通过JavaScript实现。 34 | 35 | #### 2.4 数据库MySQL 36 | 37 | MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。 38 | 39 | #### 2.5 数据库Redis 40 | 41 | Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 42 | 43 | #### 2.6 开发工具Eclipse 44 | 45 | Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。 46 | 47 | ## 3 需求分析 48 | 49 | #### 3.1 系统实现目标 50 | 51 | 如今,互联网遍布于生活的每个角落,不断改变着人们的生产生活,基于Web的机票预订系统就是借助互联网发展的热潮,方便大众,服务大众。具体实现以下两个目标: 52 | 53 | (1) 方便用户购票 54 | 55 | 用户可以访问前台系统浏览、查询航班信息,足不出户,预订机票,免去了以往寻找购票网点,排队购票的麻烦。 56 | 57 | (2) 航空公司实现办公自动化 58 | 59 | 后台系统能使航空公司办事效率大幅度提高,它将所有的工作流程按照一系列流程进行规范化,从而减少工作时间,提高了人员的办事效率。 60 | 61 | #### 3.2 系统功能分析 62 | 63 | - 后台航班信息管理:主要是指添加航班信息,删除航班信息,查询航班信息和航班信息详细情况查看等。 64 | - 65 | 后台订单信息管理:后台订单信息管理主要包括订单列表,查询订单信息,订单信息的删除等。 66 | 67 | - 后台用户信息管理:主要指注册用户的展示与按条件查询注册用户。 68 | 69 | - 后台留言评论管理:主要指展示用户的留言信息和按留言日期、留言用户查找留言信息等。 70 | 71 | - 后台广告信息管理:主要指添加广告信息,删除广告信息,设置广告的有效性等。 72 | 73 | - 后台个人信息管理:主要指查看个人信息,修改个人信息。 74 | 75 | - 前台登录与注册管理:包括前台系统用户的注册于登录。 76 | 77 | - 前台首页信息展示:主要是指航班信息展示、航班信息查询、航班信息详情、登录用户信息展示、留言板和个人信息详情与修改等。 78 | 79 | - 前台订单页面:主要是订单内容的填写和订单详情。 前台订单支付:是指使用支付宝沙箱环境支付订单。 80 | 81 | #### 3.3 系统用列图 82 | 83 | **系统前台功能用列图** 84 | 85 | ![](https://img-blog.csdnimg.cn/2020062913054442.png) 86 | 87 | **系统后台功能用列图** 88 | 89 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629130651305.png) 90 | 91 | ## 4 系统总体设计 92 | 93 | #### 4.1 软件架构设计 94 | 95 | 此项目使用经典的三层架构模式[8],分别是表现层,业务逻辑层和数据持久层。如下图所示。 96 | 97 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629161925742.png) 98 | 99 | 表现层:表现层也称为表示层,位于最外层(最上层),离用户最近。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。 100 | 101 | 业务逻辑层:业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,也将业务逻辑层称为领域层。 102 | 103 | 数据持久层:数据持久层也称为是数据访问层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。简单的说法就是实现对数据表的select、insert、update以及delete的操作。 104 | 105 | #### 4.2 总体功能模块设计 106 | 107 | 本系统主要分为前台子系统和后台子系统,两个子系统包含的具体功能如下: 108 | 109 | 1. 前台功能包括: 110 | 111 | A. 用户登录 112 | B. 用户注册 113 | C. 航班查询 114 | D. 机票详情 115 | E. 机票预订 116 | F. 订单支付 117 | G. 订单查看 118 | H. 用户留言 119 | I. 个人信息查看与修改 120 | 121 | 2. 后台功能包括: 122 | 123 | A. 航班信息管理 124 | B. 订单信息管理 125 | C. 用户信息管理 126 | D. 留言评论管理 127 | E. 广告管理 128 | F. 个人信息管理 129 | 130 | 前台子系统和后台子系统详细功能如下图所示。 131 | 132 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162123983.png) 133 | 134 | (1) 前台系统功能设计 135 | 136 | A. 用户登录功能,详细功能说明如表4.1所示 137 | 138 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162203700.png) 139 | 140 | B. 用户注册功能,详细功能说明如表4.2所示 141 | 142 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162233245.png) 143 | 144 | C. 航班查询功能,详细功能说明如表4.3所示 145 | 146 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020062916225818.png) 147 | 148 | D. 机票详情功能,详细功能说明如表4.4所示 149 | 150 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162329946.png) 151 | 152 | E. 机票预订功能,详细功能说明如表4.5所示 153 | 154 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162359190.png) 155 | 156 | F. 订单支付功能,详细功能说明如表4.6所示 157 | 158 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162434840.png) 159 | 160 | G. 订单查看功能,详细功能说明如表4.7所示 161 | 162 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162503226.png) 163 | 164 | H. 用户留言功能,详细功能说明如表4.8所示 165 | 166 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162541553.png) 167 | 168 | I. 个人信息查看与修改功能,详细功能说明如表4.9所示 169 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162642681.png) 170 | 171 | (2) 后台系统功能设计 172 | 173 | A. 航班信息管理模块功能,详细功能说明如表4.10所示 174 | 175 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162734948.png) 176 | 177 | B. 订单信息管理模块功能,详细功能说明如表4.11所示 178 | 179 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162803297.png) 180 | 181 | C. 用户信息管理模块功能,详细功能说明如表4.12所示 182 | 183 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162830600.png) 184 | 185 | D. 留言评论管理模块功能,详细功能说明如表4.13所示 186 | 187 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162857199.png) 188 | 189 | 190 | E. 广告管理模块功能,详细功能说明如表4.14所示 191 | 192 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629162923133.png) 193 | 194 | F. 个人信息管理模块功能,详细功能说明如表4.15所示 195 | 196 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629163025889.png) 197 | 198 | #### 4.3 数据库设计 199 | 200 | ##### 4.3.1 数据库结构设计 201 | 202 | 通过建立该系统各个模块的E-R图[9],是整个模块之间的功能变得更加清晰,模块间所具有的耦合性边的越低。管理员实体(Admin),留言评论实体(Discuss),航班实体(Flight),订单(Order)实体,普通用户实体(User)和广告信息实体(content)E-R图分别如下图所示。 203 | 204 | **管理员实体(Admin)E-R图** 205 | 206 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629163219407.png) 207 | 208 | **留言评论实体(Discuss)E-R图** 209 | 210 | ![](https://img-blog.csdnimg.cn/20200629163243659.png) 211 | 212 | **航班实体(Flight)E-R图** 213 | 214 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629163314340.png) 215 | 216 | **订单实体(Order)E-R图** 217 | 218 | ![](https://img-blog.csdnimg.cn/20200629163338765.png) 219 | 220 | **普通用户实体(User)E-R图** 221 | 222 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629163406306.png) 223 | 224 | **广告信息实体(Content)E-R图** 225 | 226 | ![](https://img-blog.csdnimg.cn/20200629163437515.png) 227 | 228 | ##### 4.3.2 数据库表设计 229 | 230 | 为实现数据库的设计,对数据进行分表处理,每一个表格代表不同的信息和功能,分别如下图所示。 231 | 232 | 1. 管理员信息表(admin),用于存放管理员信息,表结构如表4.16所示 233 | 234 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629163612350.png) 235 | 236 | 2. 留言评论信息表(discuss),用于存放留言评论信息,表结构如表4.17所示 237 | 238 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629163642277.png) 239 | 240 | 3. 航班信息表(flight),用于存放航班信息,表结构如表4.18所示 241 | 242 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629163711492.png) 243 | 244 | 4. 订单信息表(order),用于存放订单信息,表结构如表4.19所示 245 | 246 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629163742666.png) 247 | 248 | 5. 普通用户信息表(user),用于存放用户信息,表结构如表4.20所示 249 | 250 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/202006291638194.png) 251 | 252 | ## 源码下载 253 | 254 | **下期继续分享[《基于web的机票管理系统设计与实现(二)》](https://blog.csdn.net/qq_40625778/article/details/107039441) 255 | 256 | 获取源码请关注公众号:C you again,回复“基于web的机票管理系统”或者“机票管理系统”** 257 | 258 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629140932725.jpg) 259 | -------------------------------------------------------------------------------- /基于web的机票管理系统设计与实现(二).md: -------------------------------------------------------------------------------- 1 | @[toc] 2 | 3 | **获取源码请关注公众号:C you again,回复“基于web的机票管理系统”或者“机票管理系统”** 4 | 5 | **如果你还没有阅读[《基于web的机票管理系统设计与实现(一)》](https://blog.csdn.net/qq_40625778/article/details/107022670),请点击查看,获取详细资料请关注公众号:C you again** 6 | 7 | ## 5 系统详细设计及实现 8 | 9 | #### 5.1 添加航班信息 10 | 11 | 系统管理员登录后台系统后,点击侧边栏的航班信息管理按钮会出现下拉列表菜单,继续点击添加航班信息按钮可以进行添加航班信息操作。添加航班时输入航班号、起点、终点、始发机场、到达机场等信息,如下图所示。 12 | 13 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630115259887.png) 14 | 15 | 添加航班信息的过程如下:后台系统管理员进入添加航班信息页面后,填写航班号、起点、终点、始发机场、到达机场等相关信息后点击保存按钮,这是会随机生成flightId并与数据库中已经存在的flightId进行比较,保证航班Id唯一,之后继续判断输入的机票价格,航班座位数等数据是否有效,核对信息的有效性和完整性,最后存入数据库。具体流程如下图所示。 16 | 17 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630115402765.png) 18 | 19 | **主要代码:** 20 | 21 | ```java 22 | @RequestMapping("addFlight") 23 | public Result addFlight(@RequestBody Flight flight ) { 24 | //设置日期格式 25 | SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 26 | // new Date()为获取当前系统时间 27 | flight.setFlightId("F"+df.format(new Date())); 28 | try { 29 | flightManageService.addFlight(flight); 30 | return new Result(true,"添加成功"); 31 | } catch (Exception e) { 32 | e.printStackTrace(); 33 | return new Result(false,"添加失败"); 34 | } 35 | } 36 | 37 | ``` 38 | 39 | #### 5.2 航班信息列表 40 | 41 | 系统管理员登录系统后有查看航班列表的权限,航班列表界面有添加航班,删除航班,搜索航班信息,航班信息详情,航班信息修改等功能,具体见下图,各个功能详细说明如表5.1所示。 42 | 43 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630115701888.png) 44 | 45 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630115716774.png) 46 | 47 | **主要代码这里以航班查询功能service层代码为例:** 48 | 49 | ```java 50 | public PageResult search(int pageNum, int pageSize, String searchEntity) { 51 | PageHelper.startPage(pageNum,pageSize); 52 | List flightsList=flightManageMapper.select(searchEntity); 53 | Page page=(Page) flightsList; 54 | return new PageResult(page.getTotal(), page.getResult()); 55 | } 56 | 57 | ``` 58 | 59 | #### 5.3 订单信息列表 60 | 61 | 订单信息列表是订单信息管理模块的一个子功能,展示的是前台所有用户的机票订单信息,如下图所示。系统管理员可以对订单进行查询,删除操作,各个功能详细说明如表5.2所示。 62 | 63 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630115908692.png) 64 | 65 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630115924485.png) 66 | 67 | **主要代码这里以订单删除功能dao层的mapper代码为例:** 68 | 69 | ```java 70 | 71 | 72 | 73 | 74 | delete from `order` where order_id in 75 | 76 | #{ids} 77 | 78 | 79 | 80 | 81 | ``` 82 | #### 5.4 用户信息列表 83 | 84 | 用户信息列表是用户信息管理模块的子功能,它是指把前台系统所有注册用户信息以列表的形式展示给后台系统管理员,方便系统管理员精确定位到每一个机票预订系统的使用者,对其进行管理,用户信息列表的界面如下图所示。系统管理员有查找系统使用用户和删除违反平台规定用户的权利,各个功能详细说明如表5.3所示。 85 | 86 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630120106975.png) 87 | 88 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630120121891.png) 89 | 90 | **主要代码以用户搜索功能dao层的mapper代码为例:** 91 | 92 | ```java 93 | 94 | 95 | 96 | 100 | 101 | 102 | ``` 103 | 104 | #### 5.5 留言评论列表 105 | 106 | 留言评论是前台系统使用者完成注册后具有的功能,用户可以通过留言评论功能对所购班次机票进行全方位的评价,也可以对其在使用过程中遇到的问题进行反馈,等待工作员处理。后台系统管理员对用户留言具有管理的权限,见下图。各功能详情见表5.4。 107 | 108 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630120330548.png) 109 | 110 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630120346388.png) 111 | 112 | **主要代码以后台系统留言评论模块controller层DiscussManageController.java类例:** 113 | 114 | ```java 115 | package com.cafuc.controller; 116 | import javax.annotation.Resource; 117 | import org.springframework.web.bind.annotation.RequestMapping; 118 | import org.springframework.web.bind.annotation.RestController; 119 | import com.cafuc.pojo.PageResult; 120 | import com.cafuc.pojo.Result; 121 | import com.cafuc.service.IDiscussManageService; 122 | import com.cafuc.service.IOrderManageService; 123 | 124 | @RestController 125 | @RequestMapping("discussManage") 126 | public class DiscussManageController { 127 | @Resource 128 | private IDiscussManageService discussManageService; 129 | @RequestMapping("search") 130 | public PageResult search(int pageNum ,int pageSize,String searchEntity){ 131 | System.out.println(pageNum+" "+pageSize+" "+searchEntity); 132 | PageResult pageResult=discussManageService.search(pageNum, pageSize, searchEntity); 133 | return pageResult; 134 | } 135 | @RequestMapping("deleteBySelectIds") 136 | public Result deleteBySelectIds(String []selectIds) { 137 | try { 138 | discussManageService.deleteBySelectIds(selectIds); 139 | return new Result(true,"删除成功"); 140 | } catch (Exception e) { 141 | // TODO: handle exception 142 | e.printStackTrace(); 143 | return new Result(false,"删除失败"); 144 | } 145 | } 146 | } 147 | 148 | ``` 149 | #### 5.6 添加广告信息 150 | 151 | 广告作为网站的必要元素,在机票系统的前台页面也有广告展示的功能,后台增加了相应的管理模块,界面如下图所示。 152 | 153 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630120539668.png) 154 | 155 | 后台系统添加广告的步骤:管理员登录后台系统后点击广告管理按钮,在出现的下拉列表选项中选择添加广告信息并点击进入广告添加页面,在页面输入广告图片、广告链接,广告说明等信息,点击保存按钮,进行数据校验,检查数据的有效性和完整性,保证数据无误之后将数据信息持久化到mysql数据库。流程图如下图所示。 156 | 157 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630120617957.png) 158 | 159 | **主要代码以后台系统controller层ContentManageController.java类例:** 160 | 161 | ```java 162 | @RequestMapping("addContent") 163 | public void addContent(@RequestParam("file") MultipartFile file,HttpServletRequest request,HttpServletResponse response) 164 | throws IOException { 165 | String describe=""; 166 | String url=""; 167 | String picture=""; 168 | if(request.getParameter("describe")!=null) { 169 | describe=request.getParameter("describe"); 170 | } 171 | if(request.getParameter("url")!=null) { 172 | url=request.getParameter("url"); 173 | } 174 | // 判断文件是否为空,空则返回失败页面 175 | if (!file.isEmpty()) { 176 | try { 177 | // 获取文件存储路径(绝对路径) 178 | String path = request.getServletContext().getRealPath("/WEB-INF/file"); 179 | // 获取原文件名 180 | String fileName = file.getOriginalFilename(); 181 | // 创建文件实例 182 | File filePath = new File(path, fileName); 183 | // 如果文件目录不存在,创建目录 184 | if (!filePath.getParentFile().exists()) { 185 | filePath.getParentFile().mkdirs(); 186 | System.out.println("创建目录" + filePath); 187 | } 188 | picture=filePath+""; 189 | // 写入文件 190 | file.transferTo(filePath); 191 | Content content=new Content(); 192 | //设置日期格式 193 | SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 194 | // new Date()为获取当前系统时间 195 | content.setContentId("C"+df.format(new Date())); 196 | content.setDescribe(describe); 197 | content.setPicture(picture); 198 | content.setUrl(url); 199 | contentManageServiceImpl.addContent(content); 200 | response.sendRedirect(request.getContextPath()+"/admin/list_content.html"); 201 | } catch (Exception e) { 202 | e.printStackTrace(); 203 | response.sendRedirect(request.getContextPath()+"/admin/add_content.html"); 204 | } 205 | } 206 | else { 207 | response.sendRedirect(request.getContextPath()+"/admin/add_content.html"); 208 | } 209 | 210 | } 211 | 212 | ``` 213 | 214 | #### 5.7 广告信息列表 215 | 216 | 后台系统管理员完成添加广告以后跳转到广告信息列表页面,本页面展示的是添加到数据库的所有广告信息,如下图所示,系统管理员可以通过查询,删除等操作来管理广告信息,详情见表5.5。 217 | 218 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630120807856.png) 219 | 220 | ![](https://img-blog.csdnimg.cn/20200630120829741.png) 221 | 222 | #### 5.8 查看个人信息 223 | 224 | 后台系统管理员可以查看个人的用户名,密码,邮箱,手机号等信息,由于时间有限,这里以只实现了查看用户名,密码的功能,见下图所示,其他功能后期添加。 225 | 226 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630121049702.png) 227 | 228 | 由于系统管理员在登陆系统后把个人信息存到redis数据库中,在页面初始化时从redis数据库中查找处个人信息从到cookie中,查看个人信息就是从cookie中提取数据并设置到页面中,具体代码如下: 229 | 230 | ```java 231 | //初始化 232 | $scope.adminEntity={}; 233 | $scope.init=function () { 234 | console.log($.cookie('key')); 235 | adminManageService.init($.cookie('key')).success(function (res) { 236 | console.log(res) 237 | $scope.adminEntity=res; 238 | }); 239 | } 240 | 241 | ``` 242 | 243 | #### 5.9 修改个人信息 244 | 245 | 后台系统管理员也对用户名,密码,邮箱,手机号等信息进行修改,点击个人信息修改按钮进入页面修改个人信息,修改后点击保存等检查填写的信息无误后提示完成修改,为了确保用户名字段的唯一性,用户名一项无法修改。主要代码以controller层为例: 246 | 247 | ```java 248 | @RequestMapping("editAdmin") 249 | public Result editAdmin(@RequestBody AdminUser adminUser){ 250 | 251 | try { 252 | adminManageServiceImpl.editAdmin(adminUser); 253 | redisTemplate.boundValueOps(adminUser.getUser()).set(adminUser); 254 | return new Result(true, "修改成功"); 255 | } catch (Exception e) { 256 | // TODO: handle exception 257 | e.printStackTrace(); 258 | return new Result(false, "修改失败"); 259 | } 260 | } 261 | 262 | ``` 263 | #### 5.10 用户登录 264 | 265 | 用户在进行机票预定,留言评论等功能时需要登录前台系统后才能进行,在浏览器地址栏输入http://localhost:8081/flyTicket-portal-web/default/login.html回车进入如下图所示界面。 266 | 267 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630121327613.png) 268 | 269 | 用户进行到登录界面,输入正确的用户名和密码就可以登录到前台系统,登录顺序图如下图所示。 270 | 271 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630121401198.png) 272 | 273 | **主要代码以controller层代码为例:** 274 | 275 | ```java 276 | app.controller('portalLoginManageController',function($scope,$controller,portalLoginManageService){ 277 | $controller('baseController',{$scope:$scope}); 278 | //初始化 279 | $scope.userEntity={userName:null,userPwd:null}; 280 | $scope.login=function(){ 281 | if($scope.userEntity.userName==null || $scope.userEntity.userName.trim()==""){ 282 | alert("用户名为空"); 283 | } 284 | else{ 285 | if($scope.userEntity.userPwd==null || $scope.userEntity.userPwd.trim()==""){ 286 | alert("密码为空"); 287 | } 288 | else{ portalLoginManageService.login($scope.userEntity).success(function(res){ 289 | if(res.result==false){ 290 | alert(res.message) 291 | } 292 | else{ 293 | window.location.href="index.html#?key="+$scope.userEntity.userName; 294 | } 295 | }); 296 | } 297 | }; 298 | } 299 | }); 300 | 301 | ``` 302 | #### 5.11 航班信息展示 303 | 304 | 在浏览器地址栏输入http://localhost:8081/flyTicket-portal-web/default/index.html出现如下图所示界面,首页面展示所有航班信息。每一条信息包含出发城市、到达城市、出发机场、到达机场,出发时间、到达时间、机票价格等信息。 305 | 306 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630121525490.png) 307 | 308 | #### 5.12 航班信息查询 309 | 310 | 用户可以通过航班查询功能精确查找到所需信息,节省时间简化操作。通过输入航班类型、出发时间、出发城市、到达城市等搜索条件实现航班查询。比图以成都为到达城市为例,搜索结果如下图所示。 311 | 312 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630121619347.png) 313 | 314 | **代码以dao层PortalManageMapper.xml类例:** 315 | 316 | ```java 317 | 318 | 319 | 320 | 334 | 335 | 336 | ``` 337 | #### 5.13 航班信息详情 338 | 339 | 航班信息详情是对某一航班信息的详细情况进行展示,如下图所示。用户点击选定航班,航班详细信息以下拉列表的形式展现给用户。 340 | 341 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630121759179.png) 342 | 343 | **主要代码如下:** 344 | 345 | ```java 346 | //保留n位小数 347 | $scope.weishu=function(price,n){ 348 | return new Number(price).toFixed(n); 349 | } 350 | //下拉详情 351 | $scope.lists=function(flightNumber){ 352 | //收缩状态 353 | if($("#F_"+flightNumber).is(":visible")){ 354 | $scope.reloadList(); 355 | } 356 | $("#F_"+flightNumber).animate({ 357 | height:'toggle' 358 | }); 359 | } 360 | //判断最低价 361 | $scope.minPrice=function(flightHighPrice,flightMiddlePrice,flightBasePrice){ 362 | return (flightHighPrice<=flightMiddlePrice?flightHighPrice:flightMiddlePrice)<=flightBasePrice?(flightHighPrice<=flightMiddlePrice?flightHighPrice:flightMiddlePrice):flightBasePrice 363 | } 364 | //判断是否有票 365 | $scope.isKickets=function(kicketsNumber,flightNumber,temp){ 366 | /*console.log(flightNumber)*/ 367 | if(kicketsNumber>0){ 368 | $("#"+temp+"_"+flightNumber).css({ 369 | color:"green" 370 | }); 371 | return "有票"; 372 | } 373 | else{ 374 | $("#"+temp+"_"+flightNumber).css({ 375 | color:"red" 376 | }); 377 | return "无票"; 378 | } 379 | } 380 | 381 | ``` 382 | #### 5.14 登录用户信息展示 383 | 384 | 游客访问前台系统时,在页面头部显示“请登录”字样,如下图所示信息,而网站用户登录后则显示“您好,XXX”字样,如下图所示。 385 | 386 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630121938901.png) 387 | 388 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630121950414.png) 389 | 390 | #### 5.15 留言板 391 | 392 | 点击前台系统右上角“留言板”按钮进入都留言页面如下图所示。留言评论是前台系统使用者完成注册后具有的功能,用户可以通过留言评论功能对所购班次机票进行全方位的评价,也可以对其在使用过程中遇到的问题进行反馈。 393 | 394 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630122050950.png) 395 | 396 | **主要代码以前台系统controller层DiscussManageController.java类例:** 397 | 398 | ```java 399 | package com.cafuc.controller; 400 | import java.text.ParseException; 401 | import java.text.SimpleDateFormat; 402 | import java.util.List; 403 | import javax.annotation.Resource; 404 | import org.apache.commons.collections.FastArrayList; 405 | import org.springframework.beans.factory.annotation.Autowired; 406 | import org.springframework.data.redis.core.RedisTemplate; 407 | import org.springframework.web.bind.annotation.RequestBody; 408 | import org.springframework.web.bind.annotation.RequestMapping; 409 | import org.springframework.web.bind.annotation.RestController; 410 | import com.cafuc.pojo.Discuss; 411 | import com.cafuc.pojo.Flight; 412 | import com.cafuc.pojo.PageResult; 413 | import com.cafuc.pojo.Result; 414 | import com.cafuc.service.IDiscussManageService; 415 | import com.cafuc.service.IPortalManageService; 416 | @RestController 417 | @RequestMapping("discussManage") 418 | public class DiscussManageController { 419 | @Resource 420 | private IDiscussManageService discussManageService; 421 | @RequestMapping("addDiscuss") 422 | public Result addDiscuss(@RequestBody Discuss discuss){ 423 | try { 424 | System.out.println(discuss); 425 | discussManageService.addDiscuss(discuss); 426 | return new Result(true, "评论成功"); 427 | } catch (Exception e) { 428 | // TODO: handle exception 429 | e.printStackTrace(); 430 | return new Result(false, "评论失败"); 431 | } 432 | } 433 | @RequestMapping("init") 434 | public List init(){ 435 | return discussManageService.init(); 436 | } 437 | } 438 | 439 | ``` 440 | #### 5.16 订单填写 441 | 442 | 订单填写是机票预定中不可缺少的步骤之一,用户找到自己所需班次后点击订票按钮进入订单信息填写页面,用户所填写的信息包括乘机人信息和联系人信息量大模块,如下图所示。填写完信息后点击提交订单按钮,等待验证数据的有效性,确定填写无误后完成提交,填写订单的前提是用户已经登录系统。 443 | 444 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630122238229.png) 445 | 446 | #### 5.17 订单详情 447 | 448 | 填写订单信息完成订单提交后弹出订单详情页面提示用户检查航班信息和填写的用户信息,如下图所示。确保信息无误后点击确认付款按钮跳转到订单支付页面。 449 | 450 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630122336837.png) 451 | 452 | **订单确认功能主要代码如下:** 453 | 454 | ```java 455 | @RequestMapping("/ack") 456 | public void ack(Order order,HttpServletRequest request,HttpServletResponse response) throws IOException { 457 | try { 458 | if(order.getOrderDate() ==null) { 459 | order.setOrderDate(new Date()); 460 | } 461 | HttpSession httpSession=request.getSession(); 462 | httpSession.setAttribute("order", order); 463 | System.out.println(request.getSession().getAttribute("order")); 464 | response.sendRedirect(request.getContextPath()+"/pay/index.jsp"); 465 | } catch (Exception e) { 466 | // TODO: handle exception 467 | e.printStackTrace(); 468 | } 469 | } 470 | 471 | ``` 472 | 473 | #### 5.18 订单支付 474 | 475 | 机票预订系统的订单支付功能使用的是支付宝沙箱环境支付,蚂蚁沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境。登录支付宝沙箱平台依次完成生成买家和卖家账号信息、生成RSA秘钥、设置公钥信息、设置应用网关等应用环境配置。完成配置后下载官方测试代码,本系统选择的是电脑应用java版本,然后将下载的项目导入到eclipse工作空间。最后设置核心配置文件信息,打开flyTicket-portal-web项目下com.alipay.config包中的AlipayConfig.java文件配置如下信息: 476 | 477 | //沙箱APPID 478 | public static final String app_id = "**这里需要自己申请**"; 479 | //沙箱私钥 480 | public static final String merchant_private_key = "**这里需要自己申请**"; 481 | //支付宝公钥 482 | public static final String alipay_public_key = "**这里需要自己申请**"; 483 | //沙箱网关地址 484 | public static final String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; 485 | 486 | //服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 487 | public static String notify_url = "http://localhost:8081/flyTicket-portal-web/pay/notify_url.jsp"; 488 | 489 | //页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 490 | public static String return_url = "http://localhost:8081/flyTicket-portal-web/orderManage/complete"; 491 | 492 | 完成以上配置后就可以实现订单支付功能了。点击确认付款后跳转到如下图所示界面。 493 | 494 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630122830766.png) 495 | 496 | 点击付款按钮后如下图所示,可以登录账户付款,也可以使用手机端沙箱支付宝完成付款。 497 | 498 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630122908819.png) 499 | 500 |     完成付款后如下图所示 501 | 502 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200630122941862.png) 503 | 504 | **主要代码如下:** 505 | 506 | ```java 507 | //支付完成后 508 | @RequestMapping("complete") 509 | public void complete(HttpServletRequest request,HttpServletResponse response) throws IOException { 510 | System.out.println(request.getSession().getAttribute("order")); 511 | Order order=(Order)request.getSession().getAttribute("order"); 512 | try { 513 | //将数据插入到订单表中 514 | orderManageService.insertOrder(order); 515 | //更改库存 516 | Flight flight=orderManageService.findOneByFlightNumber(order.getFlightNumber()); 517 | if(order.getGrade().equals("f")) { 518 | flight.setFlightHighNumber(flight.getFlightHighNumber()-1); 519 | } 520 | else if(order.getGrade().equals("b")) { 521 | flight.setFlightMiddleNumber(flight.getFlightMiddleNumber()-1); 522 | } 523 | else { 524 | flight.setFlightBaseNumber(flight.getFlightBaseNumber()-1); 525 | } 526 | orderManageService.updatesNum(flight); 527 | } catch (Exception e) { 528 | e.printStackTrace(); 529 | } 530 | response.sendRedirect(request.getContextPath()+"/default/index.html"); 531 | } 532 | 533 | ``` 534 | 535 | ## 源码下载 536 | 537 | **获取源码请关注公众号:C you again,回复“基于web的机票管理系统”或者“机票管理系统”** 538 | 539 | 540 | 541 | 542 | > **作者:** C you again,从事软件开发 努力在IT搬砖路上的技术小白 543 | > 544 | > **公众号:** 【**[C you again](https://cyouagain.cn/)**】,分享计算机类毕业设计源码、IT技术文章、游戏源码、网页模板、程序人生等等。公众号回复 【**粉丝**】进博主技术群,与大佬交流,**领取干货学习资料** 545 | > 546 | > **关于转载**:欢迎转载博主文章,转载时表明出处 547 | > 548 | > **求赞环节**:创作不易,记得 点赞+评论+转发 谢谢你一路支持 549 | -------------------------------------------------------------------------------- /支付宝支付--沙箱支付教程+案例 PC端网站支付(超级详细版本).md: -------------------------------------------------------------------------------- 1 | 2 | @[TOC] 3 | 4 | 5 | ## 一、什么是沙箱环境 6 | 7 | 蚂蚁沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境。 8 | 9 | 沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑。在开发者应用上线审核前,开发者可以根据自身需求,先在沙箱环境中了解、组合和调试各种开放接口,进行开发调试工作,从而帮助开发者在应用上线审核完成后,能更快速、更顺利的完成线上调试和验收。 10 | 11 | **注意:** 12 | 13 | - 由于沙箱为模拟环境,在沙箱完成接口开发及主要功能调试后,请务必在蚂蚁正式环境进行完整的功能验收测试。所有返回码及业务逻辑以正式环境为准。 14 | - 为保证沙箱稳定,沙箱环境测试数据会进行定期数据清理。Beta 测试阶段每周日中午 12 点至每周一中午 12点为维护时间,在此时间内沙箱环境部分功能可能不可用,敬请谅解。 15 | - 请勿在沙箱进行压力测试,以免触发相应的限流措施,导致无法正常使用沙箱环境。 16 | - 沙箱支持的各个开放产品,沙箱使用的特别说明请参见各产品的快速接入文档章节。 17 | 18 | **以上内容来自沙箱支付官网介绍** 19 | 20 | 21 | ## 二、如何快速使用沙箱环境 22 | 23 | #### 1、百度搜索支付宝沙箱环境 24 | 25 | ![](https://img-blog.csdnimg.cn/20210126134056706.png) 26 | 27 | 你也可以直接点击此链接:[沙箱环境地址](https://opendocs.alipay.com/open/200/105311) 28 | 29 | #### 2、点击沙箱环境 30 | 31 | ![](https://img-blog.csdnimg.cn/20210126135759980.png) 32 | 33 | 如果你未登录的话首先会跳转到登录界面,使用**支付宝**扫码完成登录即可。**未进行认证的账号还需要完成身份认证**。 34 | 35 | 完成以上步骤后进入下图所示的页面,选择服务对象。如果是个人的话选择**自研开发服务**即可。 36 | 37 | ![](https://img-blog.csdnimg.cn/2021012614174052.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 38 | 39 | 最后,检查沙箱账号中卖家和买家账号是否已经生成。 40 | 41 | ![](https://img-blog.csdnimg.cn/20210126142655105.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 42 | ![](https://img-blog.csdnimg.cn/20210126142755671.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 43 | 44 | #### 3、生成RSA秘钥 45 | 点击沙箱应用 - 》信息配置 - 》必看部分 - 》设置 46 | 47 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126143537293.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 48 | 这里选择**公钥**,生成方式使用**支付宝秘钥生成器**,工具下载和具体操作请看:[https://opendocs.alipay.com/open/291/106097/](https://opendocs.alipay.com/open/291/106097/) 49 | 50 | ![](https://img-blog.csdnimg.cn/20210126151157256.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 51 | 使用**支付宝秘钥生成器**生成公钥时注意以下几点: 52 | 53 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126151855247.png) 54 | #### 4、设置应用网关、生成AES密钥 55 | 56 | 开发环境:https://openapi.alipay.com/gateway.do 57 | 58 | 沙箱环境:https://openapi.alipaydev.com/gateway.do (现在用的) 59 | 60 | 61 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126152712179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 62 | 63 | #### 5、下载手机网站支付 DEMO 64 | 手机网站支付 DEMO下载地址:[https://opendocs.alipay.com/open/54/106682](https://opendocs.alipay.com/open/54/106682),这里选择JAVA版。 65 | 66 | #### 6、创建Web项目,集成支付 67 | 本次demo使用SSM框架,具体搭建步骤请看博主另一篇文章:[《手把手教你搭建SSM框架(Eclipse版)》](https://mp.weixin.qq.com/s/iH7I91fWtm8kMKuejiddyA),公众号【C you again】回复“SSM”下载框架源码。 68 | 69 | 完成项目基本框架搭建以后,就可以集成支付模块了,具体操作如下: 70 | 71 | 1. 在src目录下新建 **com.alipay.config** 包并把步骤5中下载项目src.com.alipay.config包中的 **AlipayConfig.java** 复制到此包路径下。 72 | 2. 在src目录下新建 **com.alipay.util** 包并把步骤5中下载项目的 src.com.alipay.util 包中的**logFile.java** 复制到此包路径下。 73 | 3. 将步骤5下载的项目中WebContent\WEB-INF\lib文件夹下的所有jar包放到此项目的WebContent\WEB-INF\lib下。 74 | 4. 将下图中选中的文件复制到 **WebContent** 目录下。 75 | 76 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130111613549.png) 77 | 78 | 完成以上四步后就可以启动项目进行测试了,访问地址:http://localhost:8080//ssmDemo/index.html,如果发现访问jsp页面正常,而html页面出现404时,在web.xml中添加以下代码即可: 79 | 80 | ```xml 81 | 82 | default 83 | *.html 84 | *.css 85 | *.js 86 | 87 | ``` 88 | 看到此图就说明集成成功了哦! 89 | 90 | ![](https://img-blog.csdnimg.cn/20210130114219170.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 91 | #### 7、修改配置文件,编写测试案例(重要) 92 | 93 | 接下来是实现支付的重要步骤,修改com.alipay.config下的 **AlipayConfig.java** 94 | 95 | 商户ID在步骤3中可以看到,需要填写自己的 96 | ```java 97 | // 商户appid 98 | public static String APPID = "此处填写商户ID"; 99 | ``` 100 | 101 | 此处的值在完成步骤3时已经获得,点击 **打开秘钥文件路径** 可看到 102 | 103 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130120506249.png) 104 | 105 | ```java 106 | // 私钥 pkcs8格式的 107 | public static String RSA_PRIVATE_KEY = "此处填写应用秘钥"; 108 | ``` 109 | 110 | 服务器异步通知页面配成我们自己的项目路径即可 111 | ```java 112 | // 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 113 | public static String notify_url = "http://localhost:8080/ssmDemo/notify_url.jsp"; 114 | ``` 115 | 116 | 页面跳转同步通知页面路径也配成我们自己的项目路径即可,表示支付完成之后要做的事(例如:将订单信息写入数据库) 117 | ```java 118 | // 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址 119 | public static String return_url = "http://localhost:8080/ssmDemo/complete"; 120 | ``` 121 | 122 | 请求网关地址修改为沙箱环境网关 123 | ```java 124 | // 请求网关地址 125 | public static String URL = "https://openapi.alipaydev.com/gateway.do"; 126 | ``` 127 | 128 | 支付宝公钥在完成步骤3时已经获得,**注意不是应用公钥** 129 | 130 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130124035422.png) 131 | 如上图,点击查看即可获得支付宝公钥: 132 | 133 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130124141229.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 134 | 135 | 136 | 137 | 138 | ```java 139 | // 支付宝公钥 140 | public static String ALIPAY_PUBLIC_KEY = "需要换成自己的支付宝公钥"; 141 | ``` 142 | 143 | 到这里配置就完成了,接下来开始编写测试案例。 144 | 145 | 在WebContent下新建 **payDemo.html** 146 | 147 | ```html 148 | 149 | 150 | 151 | 152 | 支付宝支付案例 153 | 154 | 155 | 207 | 222 | 223 |
224 |
支付宝 网站支付案例,公众号【C you again】作品
225 |
226 |
227 | 228 | 229 |
230 |
231 | 232 | 233 |
234 |
235 | 236 | 237 |
238 |
239 | 240 | 241 |
242 |
243 | 244 | 245 |
246 | 247 |
248 | 249 |
250 | 251 | 252 | 253 | ``` 254 | 255 | 在 com.cya.entity 包下新建 Order.java 类 256 | 257 | ```java 258 | package com.cya.entity; 259 | 260 | public class Order { 261 | 262 | private String orderId; //订单Id 263 | private String shopName; //商品名称 264 | private Double shopPrice; //商品价格 265 | private String orderTime; //下单时间 266 | private String orderDesc; //商品描述 267 | public String getOrderId() { 268 | return orderId; 269 | } 270 | public void setOrderId(String orderId) { 271 | this.orderId = orderId; 272 | } 273 | public String getShopName() { 274 | return shopName; 275 | } 276 | public void setShopName(String shopName) { 277 | this.shopName = shopName; 278 | } 279 | public Double getShopPrice() { 280 | return shopPrice; 281 | } 282 | public void setShopPrice(Double shopPrice) { 283 | this.shopPrice = shopPrice; 284 | } 285 | public String getOrderTime() { 286 | return orderTime; 287 | } 288 | public void setOrderTime(String orderTime) { 289 | this.orderTime = orderTime; 290 | } 291 | public String getOrderDesc() { 292 | return orderDesc; 293 | } 294 | public void setOrderDesc(String orderDesc) { 295 | this.orderDesc = orderDesc; 296 | } 297 | @Override 298 | public String toString() { 299 | return "Order [orderId=" + orderId + ", shopName=" + shopName + ", shopPrice=" + shopPrice + ", orderTime=" 300 | + orderTime + ", orderDesc=" + orderDesc + "]"; 301 | } 302 | 303 | } 304 | 305 | ``` 306 | 307 | 在test数据库中新建order表 308 | 309 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130145641770.png) 310 | 311 | 312 | 在 com.cya.mapper包下新建 IPayMapper.java 接口 313 | 314 | ```java 315 | package com.cya.mapper; 316 | 317 | import java.util.List; 318 | 319 | import com.cya.entity.Order; 320 | import com.cya.entity.Person; 321 | 322 | public interface IPayMapper { 323 | 324 | public void insertOrder(Order order); 325 | 326 | public List getOrder(); 327 | } 328 | ``` 329 | 330 | 在 com.cya.mapper包下新建 IPayMapper.xml文件 331 | 332 | ```xml 333 | 334 | 335 | 336 | 337 | o.order_id AS "orderId", 338 | o.shop_name AS "shopName", 339 | o.shop_price AS "shopPrice", 340 | o.order_time AS "orderTime", 341 | o.order_desc AS "orderDesc" 342 | 343 | 347 | 348 | 349 | 350 | insert into `order`(order_id,shop_name,shop_price,order_time,order_desc) 351 | values(#{orderId},#{shopName},#{shopPrice},#{orderTime},#{orderDesc}) 352 | 353 | 354 | ``` 355 | 356 | 在 com.cya.service包下新建 IPayService.java接口 357 | 358 | ```java 359 | package com.cya.service; 360 | 361 | import java.util.List; 362 | 363 | import com.cya.entity.Order; 364 | import com.cya.entity.Person; 365 | 366 | public interface IPayService { 367 | 368 | public void insertOrder(Order order); 369 | 370 | public List getOrder(); 371 | } 372 | ``` 373 | 374 | 在 com.cya.service.impl包下新建 IPayService.java接口的实现类 PayServiceImpl.java 375 | 376 | ```java 377 | package com.cya.service.impl; 378 | 379 | import java.util.List; 380 | 381 | import org.springframework.beans.factory.annotation.Autowired; 382 | import org.springframework.stereotype.Service; 383 | 384 | import com.cya.entity.Order; 385 | import com.cya.entity.Person; 386 | import com.cya.mapper.IPayMapper; 387 | import com.cya.mapper.IPersonMapper; 388 | import com.cya.service.IPayService; 389 | import com.cya.service.IPersonService; 390 | 391 | @Service() 392 | public class PayServiceImpl implements IPayService{ 393 | 394 | @Autowired 395 | private IPayMapper payMapper; 396 | 397 | @Override 398 | public void insertOrder(Order order) { 399 | // TODO Auto-generated method stub 400 | System.out.println(order); 401 | payMapper.insertOrder(order); 402 | } 403 | 404 | @Override 405 | public List getOrder() { 406 | // TODO Auto-generated method stub 407 | return payMapper.getOrder(); 408 | } 409 | 410 | } 411 | ``` 412 | 413 | 在 com.cya.controller 包下新建 PayController.java 类 414 | 415 | ```java 416 | package com.cya.controller; 417 | 418 | import java.io.IOException; 419 | import java.text.SimpleDateFormat; 420 | import java.util.Date; 421 | import java.util.List; 422 | 423 | import javax.annotation.Resource; 424 | import javax.servlet.http.HttpServlet; 425 | import javax.servlet.http.HttpServletRequest; 426 | import javax.servlet.http.HttpServletResponse; 427 | import javax.servlet.http.HttpSession; 428 | 429 | import org.springframework.http.HttpRequest; 430 | import org.springframework.stereotype.Controller; 431 | import org.springframework.web.bind.annotation.RequestMapping; 432 | import org.springframework.web.bind.annotation.ResponseBody; 433 | 434 | import com.cya.entity.Order; 435 | import com.cya.entity.Person; 436 | import com.cya.service.IPayService; 437 | import com.sun.org.apache.bcel.internal.generic.NEW; 438 | 439 | @Controller 440 | @ResponseBody 441 | public class PayController { 442 | 443 | @Resource 444 | private IPayService payService; 445 | 446 | @RequestMapping("pay") 447 | public void pay( HttpServletRequest request, HttpServletResponse response) { 448 | String orderId=""; //订单ID 449 | String shopName="无名商品"; //商品名称 450 | Double shopPrice=0.0; //商品价格 451 | String orderDesc="暂无描述"; //商品描述 452 | 453 | if(request.getParameter("orderId") != null && !request.getParameter("orderId").equals("")) { 454 | orderId=request.getParameter("orderId"); 455 | } 456 | if(request.getParameter("shopName") != null && !request.getParameter("shopName").equals("")) { 457 | shopName=request.getParameter("shopName"); 458 | } 459 | if(request.getParameter("shopPrice") != null && !request.getParameter("shopPrice").equals("")) { 460 | shopPrice=Double.valueOf(request.getParameter("shopPrice")); 461 | } 462 | if(request.getParameter("orderDesc") != null && !request.getParameter("orderDesc").equals("")) { 463 | orderDesc=request.getParameter("orderDesc"); 464 | } 465 | 466 | //创建订单对象,设置相关数据 467 | Order order=new Order(); 468 | order.setOrderId(orderId); 469 | order.setShopName(shopName); 470 | order.setShopPrice(shopPrice); 471 | order.setOrderTime(getNowTime()); 472 | order.setOrderDesc(orderDesc); 473 | 474 | //把订单信息保存到httpSession中 475 | HttpSession httpSession=request.getSession(); 476 | httpSession.setAttribute("order", order); 477 | //跳转到支付页面 478 | try { 479 | System.out.println("re:"+request.getSession().getAttribute("order")); 480 | response.sendRedirect(request.getContextPath()+"/wappay/pay.jsp"); 481 | } catch (IOException e) { 482 | // TODO Auto-generated catch block 483 | e.printStackTrace(); 484 | } 485 | } 486 | 487 | 488 | //完成支付,写入数据库 489 | @RequestMapping("complete") 490 | public void complete(HttpServletRequest request, HttpServletResponse response) { 491 | 492 | //从session中获取定点信息 493 | Order order=(Order)request.getSession().getAttribute("order"); 494 | try { 495 | //将数据插入到订单表中 496 | payService.insertOrder(order); 497 | response.sendRedirect(request.getContextPath()+"/payDemo.html"); 498 | } catch (Exception e) { 499 | // TODO: handle exception 500 | e.printStackTrace(); 501 | } 502 | 503 | } 504 | 505 | //获取所有订单 506 | @RequestMapping("getOrders") 507 | public List getOrders(){ 508 | Listorders=payService.getOrder(); 509 | System.out.println("orders"+orders); 510 | return orders; 511 | } 512 | 513 | public String getNowTime() { 514 | //格式化日期 pattern 515 | SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//HH24小时制、hh12小时制 516 | String eventDate; 517 | eventDate = formatter.format(new Date()); 518 | return eventDate; 519 | } 520 | 521 | } 522 | 523 | ``` 524 | 修改WebContent/wappay/pay.jsp页面 525 | 526 | ```html 527 | <%@ page language="java" contentType="text/html; charset=UTF-8" 528 | pageEncoding="UTF-8"%> 529 | <%@page import="com.alipay.config.AlipayConfig" %> 530 | <%@page import="com.alipay.api.AlipayClient"%> 531 | <%@page import="com.alipay.api.DefaultAlipayClient"%> 532 | <%@page import="com.alipay.api.AlipayApiException"%> 533 | <%@page import="com.alipay.api.response.AlipayTradeWapPayResponse"%> 534 | <%@page import="com.alipay.api.request.AlipayTradeWapPayRequest"%> 535 | <%@page import="com.alipay.api.domain.AlipayTradeWapPayModel" %> 536 | <%@page import="com.alipay.api.domain.AlipayTradeCreateModel"%> 537 | 538 | <% 539 | /* 540 | 新增以下代码 541 | */ 542 | %> 543 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 544 | <%@page import="com.cya.entity.Order"%> 545 | 546 | <% 547 | /* * 548 | * 功能:支付宝手机网站支付接口(alipay.trade.wap.pay)接口调试入口页面 549 | * 版本:2.0 550 | * 修改日期:2016-11-01 551 | * 说明: 552 | * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 553 | 请确保项目文件有可写权限,不然打印不了日志。 554 | */ 555 | %> 556 | <% 557 | if(request.getParameter("WIDout_trade_no")!=null){ 558 | // 商户订单号,商户网站订单系统中唯一订单号,必填 559 | String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8"); 560 | // 订单名称,必填 561 | String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8"); 562 | System.out.println(subject); 563 | // 付款金额,必填 564 | String total_amount=new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8"); 565 | // 商品描述,可空 566 | String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8"); 567 | // 超时时间 可空 568 | String timeout_express="2m"; 569 | // 销售产品码 必填 570 | String product_code="QUICK_WAP_WAY"; 571 | /**********************/ 572 | // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签 573 | //调用RSA签名方式 574 | AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE); 575 | AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest(); 576 | 577 | // 封装请求支付信息 578 | AlipayTradeWapPayModel model=new AlipayTradeWapPayModel(); 579 | model.setOutTradeNo(out_trade_no); 580 | model.setSubject(subject); 581 | model.setTotalAmount(total_amount); 582 | model.setBody(body); 583 | model.setTimeoutExpress(timeout_express); 584 | model.setProductCode(product_code); 585 | alipay_request.setBizModel(model); 586 | // 设置异步通知地址 587 | alipay_request.setNotifyUrl(AlipayConfig.notify_url); 588 | // 设置同步地址 589 | alipay_request.setReturnUrl(AlipayConfig.return_url); 590 | 591 | // form表单生产 592 | String form = ""; 593 | try { 594 | // 调用SDK生成表单 595 | form = client.pageExecute(alipay_request).getBody(); 596 | response.setContentType("text/html;charset=" + AlipayConfig.CHARSET); 597 | response.getWriter().write(form);//直接将完整的表单html输出到页面 598 | response.getWriter().flush(); 599 | response.getWriter().close(); 600 | } catch (AlipayApiException e) { 601 | // TODO Auto-generated catch block 602 | e.printStackTrace(); 603 | } 604 | } 605 | %> 606 | 607 | 608 | 609 | 支付宝手机网站支付接口 610 | 611 | 744 | 745 | 746 |
747 |

支付宝手机网站支付接口快速通道(接口名:alipay.trade.wap.pay)

748 |
749 |
750 |
751 |
752 |
753 |
商户订单号:
754 |
755 | 756 |
757 |
758 |
订单名称:
759 |
760 | 761 |
762 |
763 |
付款金额:
764 |
765 | 766 |
767 |
768 |
商品描述:
769 |
770 | 771 |
772 |
773 |
774 |
775 | 778 | 如果您点击“确认”按钮,即表示您同意该次的执行操作。 779 |
780 |
781 |
782 |
783 | 790 |
791 | 792 | 810 | 811 | ``` 812 | 813 | 配置修改和测试案例完成后,就来看看最终效果吧! 814 | 815 | #### 8、查看效果 816 | 启动项目,浏览器地址栏访问:**http://localhost:8080/ssmDemo/payDemo.html**,如果以上步骤无误,会显示如下界面: 817 | 818 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021013016532572.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 819 | 输入: 820 | 821 | > 商品名称:vivo x9 822 | > 商品价格:2599.0 823 | > 商品描述:新品上市,测试用例 824 | 825 | 点击**去购买**效果图如下: 826 | 827 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130165811472.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 828 | 829 | 830 | 继续点击**确定**,跳转到如下页面: 831 | 832 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130165953900.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 833 | 834 | 选择支付方式,这里以**浏览器支付为例**,输入账号和登录密码(查看步骤2),跳转到订单详情页面: 835 | 836 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130170506662.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 837 | 838 | 继续点击**确认付款**,输入支付密码等待支付完成 839 | 840 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130170718663.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70) 841 | 842 | 出现上图界面,说明支付成功,等待几秒后跳转到首页面,点击**查看所有订单信息**可以查询到所有订单。这里只做简单展示。 843 | 844 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210130171002305.png) 845 | 846 | 847 | ## 三、 结束语 848 | 以上就是支付宝PC端完成支付功能的所有教程了,如果你有疑问请在后台私信,下载本教程源码请在公众号【**C you again**】回复“**Alipay**”。另外,因博主技术有限,文章中可能有不妥之处,欢迎交流。欢迎各位大佬转载本文章,转载时注明出处!制作不易,如果文章对你有帮助,记得一键三连! 849 | 850 | --------------------------------------------------------------------------------