著者のホームページ:プログラミング折り鶴
著者について: Java、フロントエンド、Python は長年にわたって開発されており、エンジニア、プロジェクト マネージャー、アーキテクトとして働いてきました。
主な内容:Javaプロジェクト開発、Pythonプロジェクト開発、大学データ・AIプロジェクト開発、マイコンプロジェクト設計、インタビュー技術編纂、最新技術共有
集めて、いいねして、迷わないように、作者をフォローすると良いです。
記事の最後にあるソースコードを入手してください
プロジェクト番号: BS-PT-097
1. 環境の紹介
ロケール: Java: jdk1.8
データベース: MySQL: mysql5.7
アプリケーションサーバー: Tomcat: tomcat8.5.31
開発ツール: IDEA または eclipse
開発技術:Springboot+Vue
2. プロジェクトの紹介
生活物質の水準の向上により、新しい時代の人々はより多くのエンターテイメントを消費できるようになりましたが、映画は依然としてアマチュアの娯楽や趣味の主要な場所です。流行から3年が経ち、多くの映画館が休業や営業停止を余儀なくされ、2023年には消費は一定の回復を見せるものの、依然として困難は多い。新しいテクノロジー、新しいメディア、その他の方法が映画館に新しい活力を注入し、より多くのトラフィックをもたらし、より多くの顧客を引き付けるために使用される場合、これがこのトピックの主な焦点です。このトピックは主に WEB 開発技術に基づいており、Springboot+Vue を使用して WEB フォームに基づいたオンライン映画チケット購入プラットフォーム システムを完成させます。インターネット技術の応用を通じて、映画館がより多くのプロモーションを行い、克服するのに役立つことが期待されます。困難。このトピックは主に、学んだバックエンド開発技術とフロントエンド開発技術に基づいており、フィールド調査と分析に基づいて、映画チケット販売プラットフォームの関連機能を設計します。バックエンド開発では、Springboot フレームワークを使用して統合します。 MybatisPlus とフロントエンド開発では Vue+ElementUI コンポーネントを使用してデータ ストレージの開発と実装を行い、ストレージの実装には MYSQL を使用し、オンライン チケット購入、フォーラム通信、ニュース表示などの対応するビジネス モジュールを完了します。
システムのユーザーは 2 つのカテゴリに分類され、1 つはフロントエンド メンバー ユーザー、もう 1 つはバックエンド管理者ユーザーです。以下では、ユース ケース図を使用して、2 種類のユーザーの機能的なユース ケースを示します。
1. フロントエンド会員ユーザー:登録・ログイン後、主にニュース視聴、映画レコメンド(ユーザーの操作行動に基づいて該当映画をユーザーに推奨する)、映画情報視聴、オンラインチケットなどの関連データ操作をオンラインで行うことができます。同時に、映画の収集と評価を行うために、映画愛好家はシステムのフロントエンドに提供されるコミュニケーションフォーラムでオンラインでコミュニケーションすることもでき、パーソナルセンターモジュールは自分の注文データ、収集データ、評価を管理できますデータなど
図 3-1 メンバーの使用例
2. バックエンドメンバーユーザー: ログイン後、管理者は関連するデータ管理操作をバックグラウンドで実行できます。これには、主にニュース管理、映画管理、映画タイプ管理、注文管理、評価管理、ユーザー管理、ニュースなどのモジュールが含まれます。管理、フォーラム管理など。具体的な表示を以下の図 3-2 に示します。
図 3-2 管理者の従業員の使用例
3. システム表示
このパートでは主に、フロントエンドの需要分析と関連設計に基づいたコーディングの最終的な効果を示し、完成した使いやすいオンラインチケット購入サイトのシステムを表示する必要があります。システムの実装は、システムのフロントエンド機能の実装とバックエンド管理機能の実装に分けられます。システムのフロントエンド機能実装インターフェースとバックエンド機能実装インターフェースをそれぞれ以下に示します。
5.1 バックグラウンドユーザー機能の実装
5.1.1ユーザー情報の管理
図 5.1 はユーザー情報管理ページを示しており、このページが管理者に提供する機能には、ユーザー情報のクエリ管理、ユーザー情報の削除、ユーザー情報の変更、ユーザー情報の追加、ユーザー名のあいまいクエリなどが含まれます。条件付きクエリ操作。
図5.1 ユーザー情報管理画面
5.1.2動画情報の管理
図5.2に動画情報管理ページを示します。このページでは管理者が公開されている動画情報データの閲覧、動画情報の変更、動画情報の無効化、削除、動画情報名のぼかしなどの機能を提供しています。映画情報、情報種類クエリ、その他の条件。
図5.2 動画情報管理ページ
5.1.3映画評価管理
図 5.3 は映画評価管理ページを示しており、このページで管理者に提供される機能には、映画評価に基づく条件付きクエリ、映画評価の追加、変更、クエリなどの機能が含まれます。
図5.3 映画評価管理ページ
5.1.4ニュース情報の管理
図5.4はニュース情報管理ページであり、このページでは管理者がニュース情報に基づいて追加、変更、操作の問い合わせ等を行うことができます。
図5.4 ニュース情報管理ページ
5.2 フロントエンドユーザー機能の実装
5.2.1ユーザー登録とログイン
フロントエンド ユーザーが登録およびログインすると、オンライン チケット予約、オンライン インタラクションなどの操作を行うことができます。これらの操作にはメンバーシップ ステータスが必要です。以下に、システムのフロントエンド ユーザーの登録およびログイン インターフェイスを示します。
図5.5 ユーザー登録ページ
5.2.2動画閲覧
映画予約システムのフロントエンド ページでは、ユーザーはカテゴリごとに映画情報を参照したり、映画名に基づいてファジー クエリを実行したりできます。映画情報はページングで表示されます。フロントエンドの映画リスト インターフェイスは次のとおりです。
図5.7 フロントエンドムービーリストページ
5.2.3映画の座席選択とチケットの予約
ユーザーは、映画チケット予約システムのフロントエンド ページで映画の詳細を表示し、このインターフェイスで日付と時間を選択し、対応する座席を選択して、オンラインでチケットを購入できます。
図5.8 フロントエンドムービーリストページ
他の機能はいちいち表示されません
4.コアコード表示
package com.controller;
import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;
/**
* 电影收藏
* 后端接口
* @author
* @email
*/
@RestController
@Controller
@RequestMapping("/dianyingCollection")
public class DianyingCollectionController {
private static final Logger logger = LoggerFactory.getLogger(DianyingCollectionController.class);
@Autowired
private DianyingCollectionService dianyingCollectionService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private DianyingService dianyingService;
@Autowired
private YonghuService yonghuService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("用户".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = dianyingCollectionService.queryPage(params);
//字典表数据转换
List<DianyingCollectionView> list =(List<DianyingCollectionView>)page.getList();
for(DianyingCollectionView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
DianyingCollectionEntity dianyingCollection = dianyingCollectionService.selectById(id);
if(dianyingCollection !=null){
//entity转view
DianyingCollectionView view = new DianyingCollectionView();
BeanUtils.copyProperties( dianyingCollection , view );//把实体数据重构到view中
//级联表
DianyingEntity dianying = dianyingService.selectById(dianyingCollection.getDianyingId());
if(dianying != null){
BeanUtils.copyProperties( dianying , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setDianyingId(dianying.getId());
}
//级联表
YonghuEntity yonghu = yonghuService.selectById(dianyingCollection.getYonghuId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody DianyingCollectionEntity dianyingCollection, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,dianyingCollection:{}",this.getClass().getName(),dianyingCollection.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
else if("用户".equals(role))
dianyingCollection.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
Wrapper<DianyingCollectionEntity> queryWrapper = new EntityWrapper<DianyingCollectionEntity>()
.eq("dianying_id", dianyingCollection.getDianyingId())
.eq("yonghu_id", dianyingCollection.getYonghuId())
.eq("dianying_collection_types", dianyingCollection.getDianyingCollectionTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
DianyingCollectionEntity dianyingCollectionEntity = dianyingCollectionService.selectOne(queryWrapper);
if(dianyingCollectionEntity==null){
dianyingCollection.setInsertTime(new Date());
dianyingCollection.setCreateTime(new Date());
dianyingCollectionService.insert(dianyingCollection);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody DianyingCollectionEntity dianyingCollection, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,dianyingCollection:{}",this.getClass().getName(),dianyingCollection.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("用户".equals(role))
// dianyingCollection.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
//根据字段查询是否有相同数据
Wrapper<DianyingCollectionEntity> queryWrapper = new EntityWrapper<DianyingCollectionEntity>()
.notIn("id",dianyingCollection.getId())
.andNew()
.eq("dianying_id", dianyingCollection.getDianyingId())
.eq("yonghu_id", dianyingCollection.getYonghuId())
.eq("dianying_collection_types", dianyingCollection.getDianyingCollectionTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
DianyingCollectionEntity dianyingCollectionEntity = dianyingCollectionService.selectOne(queryWrapper);
if(dianyingCollectionEntity==null){
dianyingCollectionService.updateById(dianyingCollection);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
dianyingCollectionService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
try {
List<DianyingCollectionEntity> dianyingCollectionList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
DianyingCollectionEntity dianyingCollectionEntity = new DianyingCollectionEntity();
// dianyingCollectionEntity.setDianyingId(Integer.valueOf(data.get(0))); //电影 要改的
// dianyingCollectionEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的
// dianyingCollectionEntity.setDianyingCollectionTypes(Integer.valueOf(data.get(0))); //类型 要改的
// dianyingCollectionEntity.setInsertTime(date);//时间
// dianyingCollectionEntity.setCreateTime(date);//时间
dianyingCollectionList.add(dianyingCollectionEntity);
//把要查询是否重复的字段放入map中
}
//查询是否重复
dianyingCollectionService.insertBatch(dianyingCollectionList);
return R.ok();
}
}
}
}catch (Exception e){
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
// 没有指定排序字段就默认id倒序
if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
params.put("orderBy","id");
}
PageUtils page = dianyingCollectionService.queryPage(params);
//字典表数据转换
List<DianyingCollectionView> list =(List<DianyingCollectionView>)page.getList();
for(DianyingCollectionView c:list)
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
return R.ok().put("data", page);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
DianyingCollectionEntity dianyingCollection = dianyingCollectionService.selectById(id);
if(dianyingCollection !=null){
//entity转view
DianyingCollectionView view = new DianyingCollectionView();
BeanUtils.copyProperties( dianyingCollection , view );//把实体数据重构到view中
//级联表
DianyingEntity dianying = dianyingService.selectById(dianyingCollection.getDianyingId());
if(dianying != null){
BeanUtils.copyProperties( dianying , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setDianyingId(dianying.getId());
}
//级联表
YonghuEntity yonghu = yonghuService.selectById(dianyingCollection.getYonghuId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody DianyingCollectionEntity dianyingCollection, HttpServletRequest request){
logger.debug("add方法:,,Controller:{},,dianyingCollection:{}",this.getClass().getName(),dianyingCollection.toString());
Wrapper<DianyingCollectionEntity> queryWrapper = new EntityWrapper<DianyingCollectionEntity>()
.eq("dianying_id", dianyingCollection.getDianyingId())
.eq("yonghu_id", dianyingCollection.getYonghuId())
.eq("dianying_collection_types", dianyingCollection.getDianyingCollectionTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
DianyingCollectionEntity dianyingCollectionEntity = dianyingCollectionService.selectOne(queryWrapper);
if(dianyingCollectionEntity==null){
dianyingCollection.setInsertTime(new Date());
dianyingCollection.setCreateTime(new Date());
dianyingCollectionService.insert(dianyingCollection);
return R.ok();
}else {
return R.error(511,"您已经收藏过了");
}
}
}
5. 関連作品の展示
Java開発、Python開発、PHP開発、C#開発、その他関連言語をベースにした実践的なプロジェクト
Nodejs、Vue等のフロントエンド技術をベースに開発されたフロントエンド実践プロジェクト
WeChatアプレットおよびAndroid APPアプリケーション開発に基づく関連作品
51 個のマイクロコントローラーおよびその他の組み込みデバイスに基づく組み込み型モノのインターネットの開発と応用
さまざまなアルゴリズムに基づく AI インテリジェント アプリケーション
ビッグデータを活用した各種データ管理・レコメンドシステム