diff --git "a/\351\231\210\344\275\263\344\270\275/20240408-09.\344\270\215\345\260\201\350\243\205\344\273\243\347\240\201\345\256\214\345\226\204.md" "b/\351\231\210\344\275\263\344\270\275/20240408-09.\344\270\215\345\260\201\350\243\205\344\273\243\347\240\201\345\256\214\345\226\204.md" new file mode 100644 index 0000000000000000000000000000000000000000..76a86ecfaaff34b45e0cb06bccd67af080fa8a89 --- /dev/null +++ "b/\351\231\210\344\275\263\344\270\275/20240408-09.\344\270\215\345\260\201\350\243\205\344\273\243\347\240\201\345\256\214\345\226\204.md" @@ -0,0 +1,417 @@ +## 后端代码 +1. app.js +```javascript +import Koa from "koa"; +import Router from "koa-router"; +import bodyParser from "koa-bodyparser"; +import cors from "koa2-cors"; +import { Op,DataTypes, Sequelize } from "sequelize"; + +const app = new Koa(); +const router = new Router(); + +let sequelize = new Sequelize('myData','sa','123456',{ + host:'localhost', + dialect:'mssql' +}) +//这句代码定义了一个名为 Films 的模型,包含了四个字段:filmName(字符串类型)、actor(字符串类型)、score(整数类型)和 flag(字符串类型)。这个模型将在数据库中创建一个名为 Films 的表。 +const Films = sequelize.define('Films',{ + filmName:{type:DataTypes.STRING}, + actor:{type:DataTypes.STRING}, + score:{type:DataTypes.DOUBLE}, + flag:{type:DataTypes.STRING} +}) + +await Films.sync(); + +const filmsData = [ + { + filmName:"霸道总裁爱上我", + actor:"杨可盈", + score:"9.8", + flag:"都市 爱情" + }, + { + filmName:"杨可盈三打白骨精", + actor:"杨可盈", + score:"9.3", + flag:"魔幻" + },{ + filmName:"杨少:莫欺少年穷", + actor:"杨x盈", + score:"9.3", + flag:"励志" + },{ + filmName:"杨少:莫欺中年穷", + actor:"杨可x", + score:"8.3", + flag:"励志" + },{ + filmName:"杨少:莫欺老年穷", + actor:"x可盈", + score:"8.0", + flag:"励志" + },{ + filmName:"鲁可盈漂流记", + actor:"杨可盈", + score:"7.8", + flag:"探险" + } +]; +//插入 +Films.bulkCreate(filmsData).then(()=>{ + console.log('数据插入成功'); +}) +router.get('/films/:id?',async (ctx)=>{ + let id = ctx.params.id || 0; + //ctx 是 Koa 框架中的上下文对象,ctx.request 表示当前请求对象,ctx.request.query 表示获取请求的查询参数。而 keyword 是一个变量,用来存储从查询参数中名为 keyword 的值。 +//所以,let keyword = ctx.request.query.keyword; 的意思是将 HTTP 请求中查询参数中名为 keyword 的值赋给变量 keyword,以便后续在代码中使用这个值进行相关操作,比如根据关键字进行搜索或过滤数据。 + let keyword = ctx.request.query.keyword + console.log(keyword) + // console.log(id) + let data; + if(id>0){ + + data = await Films.findByPk(id); + console.log(data); + ctx.body = { + code:1000, + msg:"查找指定数据成功", + data:data + + } + }else{ + //在查询中,where 对象指定了查询条件,这里使用了 Sequelize 提供的 [Op.substring] 操作符,表示模糊查询,查找包含指定关键字 keyword 的 shopName 字段值。${keyword} 是 ES6 模板字符串的语法,用来动态插入变量 keyword 的值。 + if(keyword){ + let arr = await Films.findAll({ + where:{ + [Op.or]:[ + {filmName:{[Op.like]:`%${keyword}%`}}, + {actor:{[Op.like]:`%${keyword}%`}}, + {score:{[Op.like]:`%${keyword}%`}}, + {flag:{[Op.like]:`%${keyword}%`}} + ] + } + + }); + ctx.body = { + code:1000, + msg:"查找指定数据成功", + data:arr + + } + }else{ + data = await Films.findAll(); + ctx.body = { + code:1000, + msg:"查找全部数据成功", + data:data + + } + } + + } +}) + +router.post('/films',async (ctx)=>{ + let obj = ctx.request.body; + console.log(obj) + let row = await Films.create(obj) + ctx.body={ + code:1000, + msg:"创建成功", + data:row + } +}) + +router.put('/films/:id',async (ctx)=>{ + let id = ctx.params.id||0; + // console.log(id); + let obj = ctx.request.body; + console.log(obj); + let item = await Films.findByPk(id); + console.log(item); + if(item){ + let date = await Films.update(obj,{ + where:{ + id:id + } + }); + console.log(date) + ctx.body={ + code:1000, + data:obj, + msg:"修改成功" + } + }else{ + ctx.body={ + code:4000, + data:null, + msg:"找不到id" + } + } +}) + +router.delete('/films/:id',async (ctx)=>{ +let id = ctx.params.id || 0; +let row = await Films.findByPk(id); +if(row){ + Films.destroy({ + where:{ + id:id + } + }) + + ctx.body = { + code:1000, + data:null, + msg:"删除成功" + } +}else{ + ctx.body ={ + code:4000, + data:null, + msg:"找不到" + } +} +}) + +app.use(cors()) +app.use(bodyParser()); +app.use(router.routes()); + +let port = 3000; +app.listen(port); +console.log(`http://localhost:${port}`) + +``` + +## 前端代码 +1. index.html +```html + + + + + + Document + + + +
+ + + +
+
+ + + + + + + + + + +
序号电影名主演评分标签操作
+
+ + + + + + +``` + +2. edit.html +```html + + + + + + Document + + +
+ + + + + + + + + + + + + + + + + + + + + +
电影名称:
演员:
评分:
标签:
+ + + +
+
+ + + + + +``` +2. base.css +```css +.tb,tr,th{ + border: 1px solid pink; + border-collapse: collapse; +} +``` + +3. index.js +```javascript +$(function (){ + axios.get('http://localhost:3000/films').then(res=>{ + // console.log(res) + let data = res.data.data; + data.forEach(item => { + let tb = $('.tb'); + let html = ` + + ${item.id} + ${item.filmName} + ${item.actor} + ${item.score} + ${item.flag} + + + + + + + ` + tb.append(html) + }); + }) +}) + +function btnQuery(){ + console.log("查找"); + let keyword = $('[name="find"]').val(); + console.log(keyword) + axios.get(`http://localhost:3000/films?keyword=${keyword}`).then(res=>{ + console.log(res.data); + if(res.data.code===1000){ + let tr = $('[class^=tr]'); + tr.remove(); + res.data.data.forEach(item=>{ + let tb = $('.tb'); + let html = ` + + ${item.id} + ${item.filmName} + ${item.actor} + ${item.score} + ${item.flag} + + + + + + + ` + tb.append(html) + }) + } + }) +} +function btnAdd(){ + location.href="./edit.html" +} +function btnDel(id){ + console.log("删除"); + if(confirm(`是否要删除id为${id}的电影`)){ + axios.delete(`http://localhost:3000/films/${id}`).then(res=>{ + console.log(res) + if(res.data.code===1000){ + let tr = $('.tr'+id) + + tr.remove() + }else if(res.data.code === 4000){ + alert(data.msg) + } + } + ) + } +} +function btnEdit(id){ + location.href='./edit.html?id='+id + + +} + +``` +4. edit.js +```javascript +$(() => { + let ID = urlStr(); + if (ID > 0) { + axios.get(`http://localhost:3000/films/${ID}`).then(res => { + let data = res.data.data + console.log(data) + $('[name="filmName"]').val(data.filmName); + $('[name="actor"]').val(data.actor); + $('[name="score"]').val(data.score); + $('[name="flag"]').val(data.flag); + // let arr=[data] + // arr.forEach(item => { + // $('[name="filmName"]').val(item.filmName); + // $('[name="actor"]').val(item.actor); + // $('[name="score"]').val(item.score); + // $('[name="flag"]').val(item.flag); + // } + // ); + } + ) + } +}) +function btnSave() { + let filmName = $('[name="filmName"]').val(); + let actor = $('[name="actor"]').val(); + let score = $('[name="score"]').val(); + let flag = $('[name="flag"]').val() + let obj = { + filmName,actor,score,flag + } + console.log(obj) + let ID = urlStr(); + if(ID>0){ + + axios.put(`http://localhost:3000/films/${ID}`,obj).then(res=>{ + location.href = "./index.html" + }) + }else{ + axios.post(`http://localhost:3000/films`,obj).then(res=>{ + location.href = "./index.html" + }) + } + // location.href = "./index.html" +} +function btnCancel() { + location.href = "./index.html" +} +function urlStr() { + let url = location.href.split('='); + // console.log(url) + return url[1] +} + +``` \ No newline at end of file