JP4-7-MyLesson后臺前端(四)

Java道經 - 項目 - MyLesson - 后臺前端(四)


傳送門:JP4-7-MyLesson后臺前端(一)
傳送門:JP4-7-MyLesson后臺前端(二)
傳送門:JP4-7-MyLesson后臺前端(三)
傳送門:JP4-7-MyLesson后臺前端(四)
傳送門:JP4-7-MyLesson后臺前端(五)

文章目錄

  • S05. SMS營銷服務
    • E01. 通知管理模塊
      • 1. 查看通知列表
      • 2. 添加通知記錄
      • 3. 修改通知記錄
    • E02. 橫幅管理模塊
      • 1. 查看橫幅列表
      • 2. 添加橫幅記錄
      • 3. 修改橫幅記錄
    • E03. 新聞管理模塊
      • 1. 查看新聞列表
      • 2. 添加新聞記錄
      • 3. 修改新聞記錄
    • E04. 秒殺管理模塊
      • 1. 查看秒殺列表
      • 2. 添加秒殺記錄
      • 3. 修改秒殺記錄
      • 4. 查看秒殺詳情
      • 5. 添加秒殺詳情
      • 6. 修改秒殺詳情
    • E05. 優惠卷管理模塊
      • 1. 查看優惠卷列表
      • 2. 添加優惠卷記錄
      • 3. 修改優惠卷記錄

S05. SMS營銷服務

武技:搭建起始文件環境和對應的路由代碼。

  1. 創建全部相關 Vue 頁面,結構如下:
|__ views|__ sms|__ notice|__ Notice.vue|__ NoticeInsert.vue|__ NoticeUpdate.vue|__ article|__ Article.vue|__ ArticleInsert.vue|__ ArticleUpdate.vue|__ banner|__ Banner.vue|__ BannerInsert.vue|__ BannerUpdate.vue|__ seckill|__ Seckill.vue|__ SeckillInsert.vue|__ SeckillUpdate.vue|__ detail|__ SeckillDetail.vue|__ SeckillDetailInsert.vue|__ SeckillDetailUpdate.vue|__ coupons|__ Coupons.vue|__ CouponsInsert.vue|__ CouponsUpdate.vue
  1. 在 router/index.js 文件中開發全部相關頁面路由配置
import Notice from "../views/sms/notice/Notice.vue";
import NoticeInsert from "../views/sms/notice/NoticeInsert.vue";
import NoticeUpdate from "../views/sms/notice/NoticeUpdate.vue";
import Article from "../views/sms/article/Article.vue";
import ArticleInsert from "../views/sms/article/ArticleInsert.vue";
import ArticleUpdate from "../views/sms/article/ArticleUpdate.vue";
import Banner from "../views/sms/banner/Banner.vue";
import BannerInsert from "../views/sms/banner/BannerInsert.vue";
import BannerUpdate from "../views/sms/banner/BannerUpdate.vue";
import Seckill from "../views/sms/seckill/Seckill.vue";
import SeckillInsert from "../views/sms/seckill/SeckillInsert.vue";
import SeckillUpdate from "../views/sms/seckill/SeckillUpdate.vue";
import SeckillDetail from "../views/sms/seckill/detail/SeckillDetail.vue";
import SeckillDetailInsert from "../views/sms/seckill/detail/SeckillDetailInsert.vue";
import SeckillDetailUpdate from "../views/sms/seckill/detail/SeckillDetailUpdate.vue";
import Coupons from "../views/sms/coupons/Coupons.vue";
import CouponsInsert from "../views/sms/coupons/CouponsInsert.vue";
import CouponsUpdate from "../views/sms/coupons/CouponsUpdate.vue";const router = createRouter({history: createWebHashHistory(),routes: [{path: '/', name: 'Login', component: Login},{path: '/Main', name: 'Main', component: Main,redirect: '/Dashboard',children: [...{path: '/Notice', name: 'Notice', component: Notice},{path: '/NoticeInsert', name: 'NoticeInsert', component: NoticeInsert},{path: '/NoticeUpdate', name: 'NoticeUpdate', component: NoticeUpdate},{path: '/Article', name: 'Article', component: Article},{path: '/ArticleInsert', name: 'ArticleInsert', component: ArticleInsert},{path: '/ArticleUpdate', name: 'ArticleUpdate', component: ArticleUpdate},{path: '/Banner', name: 'Banner', component: Banner},{path: '/BannerInsert', name: 'BannerInsert', component: BannerInsert},{path: '/BannerUpdate', name: 'BannerUpdate', component: BannerUpdate},{path: '/Seckill', name: 'Seckill', component: Seckill},{path: '/SeckillInsert', name: 'SeckillInsert', component: SeckillInsert},{path: '/SeckillUpdate', name: 'SeckillUpdate', component: SeckillUpdate},{path: '/SeckillDetail', name: 'SeckillDetail', component: SeckillDetail},{path: '/SeckillDetailInsert', name: 'SeckillDetailInsert', component: SeckillDetailInsert},{path: '/SeckillDetailUpdate', name: 'SeckillDetailUpdate', component: SeckillDetailUpdate},{path: '/Coupons', name: 'Coupons', component: Coupons},{path: '/CouponsInsert', name: 'CouponsInsert', component: CouponsInsert},{path: '/CouponsUpdate', name: 'CouponsUpdate', component: CouponsUpdate},]}]
});

E01. 通知管理模塊

1. 查看通知列表

心法:查看通知列表頁面

在這里插入圖片描述

武技:開發查看通知列表頁面 views/sms/notice/Notice.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyTable from "../../../components/MyTable.vue";
import {onMounted, reactive, ref} from "vue";
import {deleteApi, deleteBatchApi, pageApi} from "../../../api/index.js";
import {myPage} from "../../../request/index.js";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Opportunity', label: '通知列表'},
];
// 表格列
const columns = [{label: '序號', prop: 'idx', type: 'tag', width: 65},{label: '通知內容', prop: 'content', type: 'card', width: 500, tooltip: false},
];
// 表格數據 + 分頁數據
let records = ref();
let pageInfo = reactive({pageNum: 1, pageSize: 5, callback: page});/*** 分頁查詢** 1. 定義分頁基礎配置,包括 records, pageInfo, api, params 等。* 2. 異步發送分頁查詢請求。** @param pageNum 當前第幾頁,默認 1* @param pageSize 每頁多少條,默認 5*/
async function page(pageNum = pageInfo['pageNum'], pageSize = pageInfo['pageSize']) {let config = {api: pageApi,args: {module: 'notice'},params: {pageNum, pageSize},records, pageInfo,}await myPage(config);
}/* ==================== 加載函數 ==================== */onMounted(() => page());</script><template v-if="records"><my-nav :items="navItems"/><div style="height: 60px"/><my-table module="notice"insert-page="/NoticeInsert"update-page="/NoticeUpdate":delete-api="deleteApi":delete-batch-api="deleteBatchApi":delete-callback="page":records="records":columns="columns":page-info="pageInfo"/>
</template><style scoped lang="scss"></style>

2. 添加通知記錄

心法:添加通知記錄頁面

在這里插入圖片描述

武技:開發添加通知記錄頁面 views/sms/notice/NoticeInsert.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import {reactive, ref} from "vue";
import {insertApi} from "../../../api/index.js";
import {RULE} from "../../../const/index.js";
import {ElMessage} from "element-plus";
import router from "../../../router/index.js";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Opportunity', label: '通知列表', url: '/Notice'},{icon: 'Plus', label: '添加通知'},
];/* ==================== 添加表單 ==================== */// 表單項 + 表單值 + 表單規則
let items = ref([{label: '排序', prop: 'idx', type: 'number', min: 1, required: true, span: 12},{label: '內容', prop: 'content', required: true, type: 'textarea'},
]);
let params = reactive({});
let rules = {content: RULE.CONTENT};/* ==================== 添加成功后 ==================== */function insertSuccess() {ElMessage.success('添加記錄成功!');setTimeout(() => router.push('/Notice'), 1000);
}</script><template><my-nav :items="navItems"/><el-card class="notice-insert-card" header="添加通知"><my-form type="insert":items="items":rules="rules":params="params":api="insertApi":args="{module: 'notice'}":callback="insertSuccess"/></el-card>
</template><style scoped lang="scss">
.notice-insert-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

3. 修改通知記錄

心法:修改通知記錄頁面

在這里插入圖片描述

武技:開發修改通知記錄頁面 views/sms/notice/NoticeUpdate.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import {reactive, ref} from "vue";
import {updateApi} from "../../../api/index.js";
import {RULE} from "../../../const/index.js";
import {ElMessage} from "element-plus";
import router from "../../../router/index.js";// 獲取當前通知記錄
let notice = JSON.parse(sessionStorage.getItem('row'));
// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Opportunity', label: '通知列表', url: '/Notice'},{icon: 'Edit', label: '修改通知'},
];
// 表單項 + 表單值 + 表單規則
let items = ref([{label: '通知排序', prop: 'idx', type: 'number', min: 1, required: true, span: 12},{label: '通知內容', prop: 'content', required: true, type: 'textarea'},
]);
let params = reactive(notice);
let rules = {content: RULE.CONTENT};/* ==================== 修改成功后 ==================== */function updateSuccess() {ElMessage.success('修改記錄成功!');setTimeout(() => router.push('/Notice'), 1000);
}
</script><template><my-nav :items="navItems"/><el-card class="notice-update-card" header="修改通知信息"><my-form type="update":items="items":rules="rules":params="params":api="updateApi":args="{module: 'notice'}":callback="updateSuccess"/></el-card>
</template><style scoped lang="scss">
.notice-update-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

E02. 橫幅管理模塊

1. 查看橫幅列表

心法:查看橫幅列表頁面

在這里插入圖片描述

武技:開發查看橫幅列表頁面 views/sms/banner/Banner.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyTable from "../../../components/MyTable.vue";
import {onMounted, reactive, ref} from "vue";
import {deleteApi, deleteBatchApi, pageApi} from "../../../api/index.js";
import {myPage} from "../../../request/index.js";
import {MINIO_BANNER} from "../../../const/index.js";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Picture', label: '橫幅列表'},
];
// 表格列
const columns = [{label: '序號', prop: 'idx', type: 'tag', width: 70},{label: '橫幅圖片', prop: 'url', type: 'img', width: 100, minio: MINIO_BANNER},{label: '橫幅描述', prop: 'info', type: 'card', width: 800},
];/* ==================== 分頁查詢 ==================== */// 表格數據 + 分頁數據
let records = ref();
let pageInfo = reactive({pageNum: 1, pageSize: 5, callback: page});/*** 分頁查詢** 1. 定義分頁基礎配置,包括 records, pageInfo, api, params 等。* 2. 附加分頁查詢條件,如標題等。* 3. 異步發送分頁查詢請求。** @param pageNum 當前第幾頁,默認 1* @param pageSize 每頁多少條,默認 5*/
async function page(pageNum = pageInfo['pageNum'], pageSize = pageInfo['pageSize']) {let config = {api: pageApi,args: {module: 'banner'},params: {pageNum, pageSize},records, pageInfo,}await myPage(config);
}/* ==================== 加載函數 ==================== */onMounted(() => page());</script><template v-if="records"><my-nav :items="navItems"/><div style="height: 60px"/><my-table module="banner"insert-page="/BannerInsert"update-page="/BannerUpdate":records="records":columns="columns":delete-api="deleteApi":delete-batch-api="deleteBatchApi":delete-callback="page":page-info="pageInfo"/>
</template><style scoped lang="scss"></style>

2. 添加橫幅記錄

心法:添加橫幅記錄頁面

在這里插入圖片描述

武技:開發添加橫幅記錄頁面 views/sms/banner/BannerInsert.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import {reactive, ref} from "vue";
import {insertApi} from "../../../api/index.js";
import {RULE} from "../../../const/index.js";
import router from "../../../router/index.js";
import {ElMessage} from "element-plus";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Picture', label: '橫幅列表', url: '/Banner'},{icon: 'Plus', label: '添加橫幅'},
];
// 表單項 + 表單值 + 表單規則
let items = ref([{label: '橫幅排序', prop: 'idx', type: 'number', min: 1, required: true, span: 12},{label: '橫幅描述', prop: 'info', required: true, type: 'textarea'},
]);
let params = reactive({});
let rules = {info: RULE.INFO};/* ==================== 添加成功后 ==================== */function insertSuccess() {ElMessage.success('添加成功!');setTimeout(() => router.push('/Banner'), 1000);
}
</script><template><my-nav :items="navItems"/><el-card class="banner-insert-card" header="添加橫幅"><my-form type="insert":items="items":params="params":rules="rules":api="insertApi":args="{module: 'banner'}":callback="insertSuccess"/></el-card>
</template><style scoped lang="scss">
.banner-insert-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

3. 修改橫幅記錄

心法:修改橫幅記錄頁面

在這里插入圖片描述

武技:開發修改橫幅記錄頁面 views/sms/banner/BannerUpdate.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import MyUpload from "../../../components/MyUpload.vue";
import {MINIO_BANNER, MINIO_COURSE_SUMMARY, RULE} from "../../../const/index.js";
import {reactive, ref} from "vue";
import {updateApi} from "../../../api/index.js";
import {UPLOAD_BANNER_URL} from "../../../api/sms/banner.js";
import {ElMessage} from "element-plus";
import router from "../../../router/index.js";// 獲取當前橫幅記錄
let banner = JSON.parse(sessionStorage.getItem('row'));
let bannerUrl = ref(MINIO_BANNER(banner['url']));
// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Picture', label: '橫幅列表', url: '/Banner'},{icon: 'Edit', label: '修改橫幅信息'},
];
// 表單項 + 表單值 + 表單規則
let updateFormItems = ref([{label: '橫幅排序', prop: 'idx', type: 'number', min: 1, required: true, span: 12},{label: '橫幅描述', prop: 'info', required: true, type: 'textarea', rows: 18},
]);
let updateFormParams = reactive(banner);
let updateFormRules = {info: RULE.INFO,};/* ==================== 修改成功后 ==================== */function updateSuccess() {ElMessage.success('修改記錄成功!');setTimeout(() => router.push('/Banner'), 1000);
}/* ==================== 上傳成功后 ==================== */function uploadSuccess(data) {bannerUrl.value = MINIO_BANNER(data);
}
</script><template><my-nav :items="navItems"/><div class="banner-update-body"><el-row :gutter="20"><el-col :span="8"><el-card class="banner-info-card"><el-image class="banner-image" :src="bannerUrl"/></el-card><el-card class="upload-banner-card" header="上傳輪播圖片"><my-upload name="bannerFile":url="UPLOAD_BANNER_URL + '/' +banner['id']":autoUpload="true":callback="uploadSuccess"/></el-card></el-col><el-col :span="16"><el-card class="update-card" header="修改基本信息"><my-form type="update":items="updateFormItems":rules="updateFormRules":params="updateFormParams":api="updateApi":args="{module: 'banner'}":callback="updateSuccess"/></el-card></el-col></el-row></div>
</template><style scoped lang="scss">
.banner-update-body {width: 90%; // 寬度margin: 65px auto 0; // 外邊距.banner-info-card {text-align: center; // 內容居中.banner-image {height: 170px; // 高度}}.upload-banner-card {margin-top: 18px; // 上外邊距}
}
</style>

E03. 新聞管理模塊

1. 查看新聞列表

心法:查看新聞列表頁面

在這里插入圖片描述

武技:開發查看新聞列表頁面 views/sms/article/Article.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyHead from "../../../components/MyHead.vue";
import MyTable from "../../../components/MyTable.vue";
import {onMounted, reactive, ref} from "vue";
import {deleteApi, deleteBatchApi, pageApi} from "../../../api/index.js";
import {myPage} from "../../../request/index.js";
import {isNotEmpty, isNotNull} from "../../../util/index.js";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'WindPower', label: '新聞列表'},
];
// 數據頭
const headItems = [{type: 'ipt', span: 5, placeholder: '按標題搜索', callback: pageLikeTitle},
];
// 表格列
const columns = [{label: '序號', prop: 'idx', type: 'tag', width: 70},{label: '標題', prop: 'title', width: 300},{label: '內容', prop: 'content', type: 'card', width: 500, tooltip: false},
];/* ==================== 分頁查詢 ==================== */// 表格行 + 分頁 + 新聞標題
let records = ref();
let pageInfo = reactive({pageNum: 1, pageSize: 5, callback: page});
let title = ref();/*** 分頁查詢** 1. 定義分頁基礎配置,包括 records, pageInfo, api, params 等。* 2. 附加分頁查詢條件,如標題等。* 3. 異步發送分頁查詢請求。** @param pageNum 當前第幾頁,默認 1* @param pageSize 每頁多少條,默認 5*/
async function page(pageNum = pageInfo['pageNum'], pageSize = pageInfo['pageSize']) {let config = {api: pageApi,args: {module: 'article'},params: {pageNum, pageSize},records, pageInfo,}if (isNotEmpty(title.value)) config['params']['title'] = title.value;await myPage(config);
}/* ==================== 搜索新聞標題 ==================== *//*** 按新聞標題模糊查詢** 1. 將輸入框中的值賦值給分頁條件字段變量。* 2. 重新發送分頁請求。** @param val 輸入框中的值*/
function pageLikeTitle(val) {if (isNotNull(val) || title.value) {title.value = val;page();}
}/* ==================== 加載函數 ==================== */onMounted(() => page());
</script><template v-if="records"><my-nav :items="navItems"/><my-head :items="headItems"/><my-table module="article"insert-page="/ArticleInsert"update-page="/ArticleUpdate":delete-api="deleteApi":delete-batch-api="deleteBatchApi":delete-callback="page":records="records":columns="columns":page-info="pageInfo"/>
</template><style scoped lang="scss"></style>

2. 添加新聞記錄

心法:添加新聞記錄頁面

在這里插入圖片描述

武技:開發添加新聞記錄頁面 views/sms/article/ArticleInsert.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import {reactive, ref} from "vue";
import {insertApi} from "../../../api/index.js";
import {RULE} from "../../../const/index.js";
import router from "../../../router/index.js";
import {ElMessage} from "element-plus";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'WindPower', label: '新聞列表', url: '/Article'},{icon: 'Plus', label: '添加新聞'},
];
// 表單項 + 表單值 + 表單規則
let items = ref([{label: '排序', prop: 'idx', type: 'number', min: 1, required: true, span: 12},{hidden: true, span: 12},{label: '標題', prop: 'title', required: true, type: 'textarea', rows: 3},{label: '內容', prop: 'content', required: true, type: 'textarea'},
]);
let params = reactive({});
let rules = {content: RULE.CONTENT};/* ==================== 添加成功后 ==================== */function insertSuccess() {ElMessage.success('添加成功!');setTimeout(() => router.push('/Article'), 1000);
}</script><template><my-nav :items="navItems"/><el-card class="article-insert-card" header="添加新聞"><my-form type="insert":items="items":rules="rules":params="params":api="insertApi":args="{module: 'article'}":callback="insertSuccess"/></el-card>
</template><style scoped lang="scss">
.article-insert-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

3. 修改新聞記錄

心法:修改新聞記錄頁面

在這里插入圖片描述

武技:開發修改新聞記錄頁面 views/sms/article/ArticleUpdate.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import {reactive, ref} from "vue";
import {updateApi} from "../../../api/index.js";
import {RULE} from "../../../const/index.js";
import {ElMessage} from "element-plus";
import router from "../../../router/index.js";// 獲取當前新聞記錄
let article = JSON.parse(sessionStorage.getItem('row'));
// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'WindPower', label: '新聞列表', url: '/Article'},{icon: 'Edit', label: '修改新聞'},
];
// 表單項 + 表單值 + 表單規則
let items = ref([{label: '排序', prop: 'idx', type: 'number', min: 1, required: true, span: 12},{hidden: true, span: 12},{label: '標題', prop: 'title', required: true, type: 'textarea', rows: 3},{label: '內容', prop: 'content', required: true, type: 'textarea'},
]);
let params = reactive(article);
let rules = {content: RULE.INFO};/* ==================== 修改成功后 ==================== */function updateSuccess() {ElMessage.success('修改記錄成功!');setTimeout(() => router.push('/Article'), 1000);
}
</script><template><my-nav :items="navItems"/><el-card class="article-update-card" header="修改新聞信息"><my-form type="update":items="items":params="params":rules="rules":api="updateApi":args="{module: 'article'}":callback="updateSuccess"/></el-card>
</template><style scoped lang="scss">
.article-update-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

E04. 秒殺管理模塊

1. 查看秒殺列表

心法:查看秒殺列表頁面

武技:開發查看秒殺列表頁面 views/sms/seckill/Seckill.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyHead from "../../../components/MyHead.vue";
import MyTable from "../../../components/MyTable.vue";
import {onMounted, reactive, ref} from "vue";
import {deleteApi, deleteBatchApi, pageApi} from "../../../api/index.js";
import {myPage} from "../../../request/index.js";
import {dateFormat, isNotEmpty, isNotNull, seckillStatusFormat} from "../../../util/index.js";
import router from "../../../router/index.js";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Stopwatch', label: '秒殺列表'},
];
// 數據頭
const headItems = [{type: 'ipt', span: 5, placeholder: '按標題搜索', callback: pageLikeTitle},
];
// 表格列
const columns = [{label: '活動標題', prop: 'title', width: 120},{label: '開始時間', prop: 'startTime', format: dateFormat},{label: '結束時間', prop: 'endTime', format: dateFormat},{label: '活動狀態', prop: 'status', type: 'tag', format: seckillStatusFormat},{label: '活動描述', prop: 'info', type: 'card', tooltip: false},
];
// 按鈕列
const buttons = [{label: '秒殺詳情', type: 'success', callback: seckillDetail},
];
// 表格數據 + 分頁數據 + 秒殺活動標題
let records = ref();
let pageInfo = reactive({pageNum: 1, pageSize: 5, callback: page});
let title = ref();/*** 分頁查詢** 1. 定義分頁基礎配置,包括 records, pageInfo, api, params 等。* 2. 附加分頁查詢條件,如標題等。* 3. 異步發送分頁查詢請求。** @param pageNum 當前第幾頁,默認 1* @param pageSize 每頁多少條,默認 5*/
async function page(pageNum = pageInfo['pageNum'], pageSize = pageInfo['pageSize']) {let config = {api: pageApi,args: {module: 'seckill'},params: {pageNum, pageSize},records, pageInfo,}if (isNotEmpty(title.value)) config['params']['title'] = title.value;await myPage(config);
}/* ==================== 搜索秒殺標題 ==================== *//*** 按秒殺標題模糊查詢** 1. 將輸入框中的值賦值給分頁條件字段變量。* 2. 重新發送分頁請求。** @param val 輸入框中的值*/
function pageLikeTitle(val) {if (isNotNull(val) || title.value) {title.value = val;page();}
}/* ==================== 秒殺詳情 ==================== */function seckillDetail(row) {sessionStorage.setItem('seckillId', row['id']);sessionStorage.setItem('seckillTitle', row['title'].toString());router.push('/SeckillDetail');
}/* ==================== 加載函數 ==================== */onMounted(() => page());</script><template v-if="records"><my-nav :items="navItems"/><my-head :items="headItems"/><my-table module="seckill"insert-page="/SeckillInsert"update-page="/SeckillUpdate":records="records":columns="columns":buttons="buttons":delete-api="deleteApi":delete-batch-api="deleteBatchApi":delete-callback="page":page-info="pageInfo"/>
</template><style scoped lang="scss"></style>

2. 添加秒殺記錄

心法:添加秒殺記錄頁面

在這里插入圖片描述

武技:開發添加秒殺記錄頁面 views/sms/seckill/SeckillInsert.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import {reactive, ref} from "vue";
import {insertApi} from "../../../api/index.js";
import {RULE, SECKILL_STATUS_OPTIONS} from "../../../const/index.js";
import router from "../../../router/index.js";
import {ElMessage} from "element-plus";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Stopwatch', label: '秒殺列表', url: '/Seckill'},{icon: 'Plus', label: '添加秒殺'},
];
// 表單項 + 表單值 + 表單規則
let items = ref([{label: '活動標題', prop: 'title', required: true, span: 12},{label: '活動狀態', prop: 'status', span: 12, type: 'select', required: true, options: SECKILL_STATUS_OPTIONS, placeholder: '請選擇活動狀態'},{label: '開始時間', prop: 'startTime', type: 'datetime', required: true, span: 12},{label: '結束時間', prop: 'endTime', type: 'datetime', required: true, span: 12},{label: '活動描述', prop: 'info', required: true, type: 'textarea'},
]);
let params = reactive({});
let rules = {info: RULE.INFO};/* ==================== 添加成功后 ==================== */function insertSuccess() {ElMessage.success('添加成功!');setTimeout(() => router.push('/Seckill'), 1000);
}
</script><template><my-nav :items="navItems"/><el-card class="seckill-insert-card" header="添加秒殺活動"><my-form type="insert":items="items":rules="rules":params="params":api="insertApi":args="{module: 'seckill'}":callback="insertSuccess"/></el-card>
</template><style scoped lang="scss">
.seckill-insert-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

3. 修改秒殺記錄

心法:修改秒殺記錄頁面

在這里插入圖片描述

武技:開發修改秒殺記錄頁面 views/sms/seckill/SeckillUpdate.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import {reactive, ref} from "vue";
import {updateApi} from "../../../api/index.js";
import {RULE, SECKILL_STATUS_OPTIONS} from "../../../const/index.js";
import router from "../../../router/index.js";
import {ElMessage} from "element-plus";// 獲取當前秒殺記錄
let seckill = JSON.parse(sessionStorage.getItem('row'));
// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Stopwatch', label: '秒殺列表', url: '/Seckill'},{icon: 'Edit', label: '修改秒殺'},
];
// 表單項 + 表單值 + 表單規則
let items = ref([{label: '活動標題', prop: 'title', required: true, span: 12},{label: '活動狀態', prop: 'status', span: 12, type: 'select', required: true, options: SECKILL_STATUS_OPTIONS, placeholder: '請選擇活動狀態'},{label: '開始時間', prop: 'startTime', type: 'datetime', required: true, span: 12},{label: '結束時間', prop: 'endTime', type: 'datetime', required: true, span: 12},{label: '活動描述', prop: 'info', required: true, type: 'textarea'},
]);
let params = reactive(seckill);
let rules = {info: RULE.INFO};/* ==================== 修改成功后 ==================== */function updateSuccess() {ElMessage.success('修改記錄成功!');setTimeout(() => router.push('/Seckill'), 1000);
}
</script><template><my-nav :items="navItems"/><el-card class="seckill-update-card" header="修改秒殺活動信息"><my-form type="update":items="items":rules="rules":params="params":api="updateApi":args="{module: 'seckill'}":callback="updateSuccess"/></el-card>
</template><style scoped lang="scss">
.seckill-update-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

4. 查看秒殺詳情

心法:查看秒殺詳情頁面

在這里插入圖片描述

武技:開發查看秒殺詳情頁面 views/sms/seckill/detail/SeckillDetail.vue

<script setup>
import MyNav from "../../../../components/MyNav.vue";
import MyHead from "../../../../components/MyHead.vue";
import MyTable from "../../../../components/MyTable.vue";
import {onMounted, reactive, ref} from "vue";
import {deleteApi, deleteBatchApi, pageApi} from "../../../../api/index.js";
import {isNotEmpty, isNotNull} from "../../../../util/index.js";
import {myPage} from "../../../../request/index.js";
import {MINIO_COURSE_COVER} from "../../../../const/index.js";// 所屬秒殺活動ID和秒殺活動標題
let seckillId = sessionStorage.getItem('seckillId');
let seckillTitle = sessionStorage.getItem('seckillTitle');
// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Stopwatch', label: '秒殺列表', url: '/Seckill'},{icon: 'Stopwatch', label: `${seckillTitle}》活動詳情`},
];
// 數據頭
const headItems = [{type: 'ipt', span: 5, placeholder: '按標題搜索', callback: pageLikeCourseTitle},
];
// 表格列
const columns = [{label: '課程標題', prop: 'courseTitle'},{label: '課程封面', prop: 'courseCover', type: 'img', minio: MINIO_COURSE_COVER},{label: '課程原價', prop: 'coursePrice', suffix: '.00元'},{label: '課程秒殺價', prop: 'skPrice', suffix: '.00元'},{label: '課程秒殺數量', prop: 'skCount'},{label: '秒殺描述', prop: 'info', type: 'card', tooltip: false},
];
// 表格數據 + 分頁數據 + 課程標題
let records = ref();
let pageInfo = reactive({pageNum: 1, pageSize: 5, callback: page});
let courseTitle = ref();/* ==================== 分頁查詢 ==================== *//*** 分頁查詢記錄** 1. 定義分頁基礎配置,包括 records, pageInfo, api, params 等。* 2. 附加分頁查詢條件,如標題等。* 3. 異步發送分頁查詢請求。* 4. 將 seckillTitle 融入表格數據的每一項,方便進行展示。** @param pageNum 當前第幾頁,默認 1* @param pageSize 每頁多少條,默認 5*/
async function page(pageNum = pageInfo['pageNum'], pageSize = pageInfo['pageSize']) {let config = {api: pageApi,args: {module: 'seckillDetail'},params: {pageNum, pageSize, seckillId},records, pageInfo,}if (isNotEmpty(courseTitle.value)) config['params']['courseTitle'] = courseTitle.value;await myPage(config);if(isNotNull(records.value)){Object.values(records.value).forEach(seckill => seckill['seckillTitle'] = `${seckillTitle}`);}
}/* ==================== 搜索課程標題 ==================== *//*** 按秒殺詳情標題模糊查詢** 1. 將輸入框中的值賦值給分頁條件字段變量。* 2. 重新發送分頁請求。** @param val 輸入框中的值*/
function pageLikeCourseTitle(val) {if (isNotNull(val) || courseTitle.value) {courseTitle.value = val;page();}
}/* ==================== 加載函數 ==================== */onMounted(() => page());</script><template v-if="records"><my-nav :items="navItems"/><my-head :items="headItems"/><my-table module="seckillDetail"insert-page="/SeckillDetailInsert"update-page="/SeckillDetailUpdate":records="records":columns="columns":delete-api="deleteApi":delete-batch-api="deleteBatchApi":delete-callback="page":page-info="pageInfo"/>
</template><style scoped lang="scss"></style>

5. 添加秒殺詳情

心法:添加秒殺詳情頁面

在這里插入圖片描述

武技:開發添加秒殺詳情頁面 views/sms/seckill/detail/SeckillDetailInsert.vue

<script setup>
import MyNav from "../../../../components/MyNav.vue";
import MyForm from "../../../../components/MyForm.vue";
import {onMounted, reactive, ref} from "vue";
import {insertApi, simpleListApi} from "../../../../api/index.js";
import {getResponseData} from "../../../../request/index.js";
import {RULE} from "../../../../const/index.js";
import {ElMessage} from "element-plus";
import router from "../../../../router/index.js";// 所屬秒殺活動ID和秒殺活動標題
let seckillId = sessionStorage.getItem('seckillId');
let seckillTitle = sessionStorage.getItem('seckillTitle');
// 全部課程下拉菜單選項
let courseOptions = ref([]);
// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Stopwatch', label: '秒殺列表', url: '/Seckill'},{icon: 'Stopwatch', label: `${seckillTitle}》活動詳情`, url: '/SeckillDetail'},{icon: 'Plus', label: '添加活動課程'},
];/* ==================== 添加表單 ==================== */// 表單項 + 表單值 + 表單規則
let items = ref([{label: '所屬活動', prop: 'seckillTitle', disabled: true, span: 12},{label: '活動課程', prop: 'fkCourseId', required: true, span: 12, type: 'select', options: courseOptions, placeholder: '請選擇課程'},{label: '秒殺價格', prop: 'skPrice', type: 'number', min: 1, required: true, span: 12},{label: '秒殺數量', prop: 'skCount', type: 'number', min: 1, required: true, span: 12},{label: '秒殺描述', prop: 'info', required: true, type: 'textarea'},
]);
let params = reactive({seckillTitle, 'fkSeckillId': seckillId});
let rules = {info: RULE.INFO};/* ==================== 添加成功后 ==================== */function insertSuccess() {ElMessage.success('添加成功!');setTimeout(() => router.push('/SeckillDetail'), 1000);
}/* ==================== 加載函數 ==================== */onMounted(async () => {// 查詢全部課程并添加到下拉菜單選項中Object.values(getResponseData(await simpleListApi(null, {module: 'course'}))).forEach(course => {courseOptions.value.push({label: course['title'] + '(¥' + course['price'] + ')', value: course['id']});});
});
</script><template><my-nav :items="navItems"/><el-card v-if="courseOptions.length > 0" class="seckill-detail-insert-card" header="添加活動課程"><my-form type="insert":items="items":rules="rules":params="params":api="insertApi":args="{module: 'seckillDetail'}":callback="insertSuccess"/></el-card>
</template><style scoped lang="scss">
.seckill-detail-insert-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

6. 修改秒殺詳情

心法:修改秒殺詳情頁面

在這里插入圖片描述

武技:開發修改秒殺詳情頁面 views/sms/seckill/detail/SeckillDetailUpdate.vue

<script setup>
import MyNav from "../../../../components/MyNav.vue";
import MyForm from "../../../../components/MyForm.vue";
import {onMounted, reactive, ref} from "vue";
import {simpleListApi, updateApi} from "../../../../api/index.js";
import {getResponseData} from "../../../../request/index.js";
import {RULE} from "../../../../const/index.js";
import {ElMessage} from "element-plus";
import router from "../../../../router/index.js";// 獲取當前秒殺詳情記錄
let seckillDetail = JSON.parse(sessionStorage.getItem('row'));
// 所屬秒殺活動ID和秒殺活動標題
let seckillId = sessionStorage.getItem('seckillId');
let seckillTitle = sessionStorage.getItem('seckillTitle');
// 全部課程下拉菜單選項
let courseOptions = ref([]);
// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Stopwatch', label: '秒殺列表', url: '/Seckill'},{icon: 'Stopwatch', label: `${seckillTitle}》活動詳情`, url: '/SeckillDetail'},{icon: 'Edit', label: '修改秒殺詳情'},
];/* ==================== 修改表單 ==================== */// 表單項 + 表單值 + 表單規則
let items = ref([{label: '所屬活動', prop: 'seckillTitle', disabled: true, span: 12},{label: '活動課程', prop: 'fkCourseId', required: true, span: 12, type: 'select', options: courseOptions, placeholder: '請選擇課程'},{label: '秒殺價格', prop: 'skPrice', type: 'number', min: 1, required: true, span: 12},{label: '秒殺數量', prop: 'skCount', type: 'number', min: 1, required: true, span: 12},{label: '秒殺描述', prop: 'info', type: 'textarea'},
]);
let params = reactive(seckillDetail);
let rules = {info: RULE.INFO};/* ==================== 修改成功后 ==================== */function updateSuccess() {ElMessage.success('添加成功!');setTimeout(() => router.push('/SeckillDetail'), 1000);
}/* ==================== 加載函數 ==================== */onMounted(async () => {// 查詢全部課程并添加到下拉菜單選項中Object.values(getResponseData(await simpleListApi(null, {module: 'course'}))).forEach(course => {courseOptions.value.push({label: course['title'] + '(¥' + course['price'] + ')', value: course['id']});});
});
</script><template><my-nav :items="navItems"/><el-card v-if="courseOptions.length > 0" class="sub-seckill-detail-update-card" header="修改秒殺詳情信息"><my-form type="update":items="items":rules="rules":params="params":api="updateApi":args="{module: 'seckillDetail'}":callback="updateSuccess"/></el-card>
</template><style scoped lang="scss">
.sub-seckill-detail-update-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

E05. 優惠卷管理模塊

1. 查看優惠卷列表

心法:查看優惠卷列表頁面

在這里插入圖片描述

武技:開發查看優惠卷列表頁面 views/sms/coupons/Coupons.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyTable from "../../../components/MyTable.vue";
import MyHead from "../../../components/MyHead.vue";
import {onMounted, reactive, ref} from "vue";
import {deleteApi, deleteBatchApi, pageApi} from "../../../api/index.js";
import {myPage} from "../../../request/index.js";
import {dateFormat, isNotEmpty, isNotNull} from "../../../util/index.js";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Opportunity', label: '優惠卷列表'},
];
// 數據頭
const headItems = [{type: 'ipt', span: 5, placeholder: '按標題搜索', callback: pageLikeTitle},{type: 'ipt', span: 5, placeholder: '按口令搜索', callback: pageLikeCode},
];
// 表格列
const columns = [{label: '兌換碼', prop: 'code', type: 'tag', sortable: false},{label: '標題', prop: 'title'},{label: '優惠價格', prop: 'cpPrice', suffix: '.00 元', width: 130},{label: '生效時間', prop: 'startTime', format: dateFormat, width: 150},{label: '失效時間', prop: 'endTime', format: dateFormat, width: 150},{label: '優惠卷描述', prop: 'info', type: 'card', tooltip: false},
];/* ==================== 分頁查詢 ==================== */// 表格數據 + 分頁數據 + 優惠卷標題 + 優惠卷口令
let records = ref();
let pageInfo = reactive({pageNum: 1, pageSize: 5, callback: page});
let title = ref();
let code = ref();/*** 分頁查詢** 1. 定義分頁基礎配置,包括 records, pageInfo, api, params 等。* 2. 附加分頁查詢條件,如標題,口令等。* 3. 異步發送分頁查詢請求。** @param pageNum 當前第幾頁,默認 1* @param pageSize 每頁多少條,默認 5*/
async function page(pageNum = pageInfo['pageNum'], pageSize = pageInfo['pageSize']) {let config = {api: pageApi,args: {module: 'coupons'},params: {pageNum, pageSize, pid: 0},records, pageInfo,}if (isNotEmpty(title.value)) config['params']['title'] = title.value;if (isNotEmpty(code.value)) config['params']['code'] = code.value;await myPage(config);
}/* ==================== 搜索優惠卷標題 ==================== *//*** 按優惠卷標題模糊查詢** 1. 將輸入框中的值賦值給分頁條件字段變量。* 2. 重新發送分頁請求。** @param val 輸入框中的值*/
function pageLikeTitle(val) {if (isNotNull(val) || title.value) {title.value = val;page();}
}/* ==================== 搜索優惠卷口令 ==================== *//*** 按優惠卷口令模糊查詢** 1. 將輸入框中的值賦值給分頁條件字段變量。* 2. 重新發送分頁請求。** @param val 輸入框中的值*/
function pageLikeCode(val) {if (isNotNull(val) || code.value) {code.value = val;page();}
}/* ==================== 加載函數 ==================== */onMounted(() => page());</script><template v-if="records"><my-nav :items="navItems"/><my-head :items="headItems"/><my-table module="coupons"insert-page="/CouponsInsert"update-page="/CouponsUpdate":records="records":columns="columns":delete-api="deleteApi":delete-batch-api="deleteBatchApi":delete-callback="page":page-info="pageInfo"/>
</template><style scoped lang="scss"></style>

2. 添加優惠卷記錄

心法:添加優惠卷記錄頁面

在這里插入圖片描述

武技:開發添加優惠卷記錄頁面 views/sms/coupons/CouponsInsert.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import {reactive, ref} from "vue";
import {insertApi} from "../../../api/index.js";
import {RULE} from "../../../const/index.js";
import {ElMessage} from "element-plus";
import router from "../../../router/index.js";// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Opportunity', label: '優惠卷列表', url: '/Coupons'},{icon: 'Plus', label: '添加優惠卷'},
];
// 表單項 + 表單值 + 表單規則
let items = ref([{label: '兌換口令', prop: 'code', required: true},{label: '標題', prop: 'title', required: true, span: 12},{label: '優惠價格', prop: 'cpPrice', type: 'number', min: 1, required: true, span: 12},{label: '生效時間', prop: 'startTime', type: 'datetime', required: true, span: 12},{label: '失效時間', prop: 'endTime', type: 'datetime', required: true, span: 12},{label: '描述', prop: 'info', required: true, type: 'textarea'},
]);
let params = reactive({});
let rules = {code: RULE.CODE, title: RULE.TITLE, content: RULE.INFO,};/* ==================== 添加成功后 ==================== */function insertSuccess() {ElMessage.success('添加成功!');setTimeout(() => router.push('/Coupons'), 1000);
}
</script><template><my-nav :items="navItems"/><el-card class="coupons-insert-card" header="添加優惠卷"><my-form type="insert":items="items":rules="rules":params="params":api="insertApi":args="{module: 'coupons'}":callback="insertSuccess"/></el-card>
</template><style scoped lang="scss">
.coupons-insert-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

3. 修改優惠卷記錄

心法:修改優惠卷記錄頁面

在這里插入圖片描述

武技:開發修改優惠卷記錄頁面 views/sms/coupons/CouponsUpdate.vue

<script setup>
import MyNav from "../../../components/MyNav.vue";
import MyForm from "../../../components/MyForm.vue";
import {reactive, ref} from "vue";
import {updateApi} from "../../../api/index.js";
import {RULE} from "../../../const/index.js";
import {ElMessage} from "element-plus";
import router from "../../../router/index.js";// 獲取當前優惠卷記錄
let coupons = JSON.parse(sessionStorage.getItem('row'));
// 路徑導航
const navItems = [{icon: 'Goods', label: '營銷管理'},{icon: 'Opportunity', label: '優惠卷列表', url: '/Coupons'},{icon: 'Edit', label: '修改優惠卷'},
];
// 表單項 + 表單值 + 表單規則
let items = ref([{label: '兌換口令', prop: 'code', required: true},{label: '標題', prop: 'title', required: true, span: 12},{label: '優惠價格', prop: 'cpPrice', type: 'number', min: 1, required: true, span: 12},{label: '生效時間', prop: 'startTime', type: 'datetime', required: true, span: 12},{label: '失效時間', prop: 'endTime', type: 'datetime', required: true, span: 12},{label: '描述', prop: 'info', required: true, type: 'textarea'},
]);
let params = reactive(coupons);
let rules = {code: RULE.CODE, title: RULE.TITLE, content: RULE.INFO};/* ==================== 修改成功后 ==================== */function updateSuccess() {ElMessage.success('修改記錄成功!');setTimeout(() => router.push('/Coupons'), 1000);
}
</script><template><my-nav :items="navItems"/><el-card class="coupons-update-card" header="修改優惠卷信息"><my-form type="update":items="items":rules="rules":params="params":api="updateApi":args="{module: 'coupons'}":callback="updateSuccess"/></el-card>
</template><style scoped lang="scss">
.coupons-update-card {width: 60%; // 寬度margin: 65px auto 0; // 外邊距
}
</style>

Java道經 - 項目 - MyLesson - 后臺前端(四)


傳送門:JP4-7-MyLesson后臺前端(一)
傳送門:JP4-7-MyLesson后臺前端(二)
傳送門:JP4-7-MyLesson后臺前端(三)
傳送門:JP4-7-MyLesson后臺前端(四)
傳送門:JP4-7-MyLesson后臺前端(五)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921730.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921730.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux control group筆記

Linux CGroup&#xff08;Control Groups&#xff09;是一個強大的內核功能&#xff0c;用于限制、記錄和隔離進程組&#xff08;process groups&#xff09;使用的系統資源&#xff08;如 CPU、內存、磁盤 I/O、網絡等&#xff09;。它通過將進程分組并對這些組進行資源分配和…

小迪Web自用筆記30

Node.js原生態的js運行在前端。Node.js&#xff1a;他與原生態JS最大的不同&#xff0c;就是前端只能看到輸出的代碼&#xff0c;而看不到jS文件req接收&#xff0c;res回顯dirname獲取絕對路徑提交表單 &#xff1a;“Post路由” 到底是什么。這是一個非常核心的Web開發概念。…

并發編程的守護者:信號量與日志策略模式解析

一、信號量 關于信號量的介紹在深入Linux內核&#xff1a;IPC資源管理揭秘 這篇文章當中已經做了初步的介紹了&#xff0c;相信大家對于信號量已經有了初步的認知了。 今天&#xff0c;我們就來探討如何實現信號量。 1. 信號量的接口 //初始化信號量 //成功了&#xff0c;返…

conda 創建環境嵌套報錯

使用conda create --prefix /path可以成功創建&#xff0c;有可能時默認路徑沖突導致的 conda config --show 發現&#xff1a; envs_dirs: /root/autodl-tmp/miniconda3/envs/envs_test/path/root/autodl-tmp/miniconda3/envs/root/.conda/envs 未顯式指定環境路徑&#xf…

低代碼核心原理總結

Web 低代碼平臺核心原理深度解析 1. 架構總覽 Web低代碼平臺的核心架構包含四個關鍵層次&#xff1a; class LowCodePlatform {constructor() {this.visualEditor new VisualEditor(); // 可視化編輯器this.metaDataEngine new MetaDataEngine(); // 元數據引擎this.code…

操作系統研發工作心得體會 - 于復雜性中構建秩序

在操作系統&#xff08;OS&#xff09;研發這片要求極致嚴謹與創新的工程深海中航行數載&#xff0c;我的角色從一個純粹的技術專家&#xff0c;逐漸演變為一個需要兼顧技術深度、系統廣度與團隊效能的復合型角色。這段旅程&#xff0c;讓我深刻體會到&#xff0c;構建一個成功…

Excel 表格 - Excel 減少干擾、專注于內容的查看方式

Excel 減少干擾、專注于內容的查看方式 1、隱藏元素 點擊 【視圖】 -> 取消勾選 【網格線】 -> 取消勾選 【編輯欄】 -> 取消勾選 【標題】2、全屏顯示 點擊 【功能區顯示選項】&#xff08;工具欄右下角小箭頭&#xff09; -> 點擊 【全屏模式】

C# Web API 前端傳入參數時間為Utc

Web API 前端傳入參數時間為Utc&#xff08;時間相差8個小時&#xff09;1.在Program.csbuilder.Services.AddControllers().AddJsonOptions(options > {// 序列化時將時間轉換為本地時間&#xff08;北京時間&#xff09;options.JsonSerializerOptions.Converters.Add(new…

AI Agent開發入門:Semantic Kernel構建智能郵件助手

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;AI Agent——下一代人機交互范式 在人工智能技術…

WebAssembly:開啟高性能 Web 應用的新篇章

在互聯網技術飛速發展的浪潮中&#xff0c;Web應用的性能一直是一個重要的優化目標。傳統的JavaScript雖然靈活便捷&#xff0c;但在處理CPU密集型任務時&#xff0c;其性能瓶頸日益凸顯&#xff0c;限制了Web應用在游戲、音視頻編輯、科學計算、圖像處理等高性能領域的深入發展…

001-003 產品經理-ML應用構建-ML應用范圍

001-003 產品經理-ML應用構建-ML應用范圍 時間&#xff1a;2025年09月08日14:48:01 備注&#xff1a;筆記回顧和復習&#xff0c;僅用于分享而非商用&#xff0c;引用內容若侵權請聯系并刪除。 文章目錄001-003 產品經理-ML應用構建-ML應用范圍導引 學習法則1 內容索引 產品經…

軟件測試錯題筆記

1.capitalize()表示將字符串第一個字符轉換為大寫 2.pop()方法&#xff1a;指定一個鍵&#xff08;key&#xff09;作為參數來刪除并返回對應的值&#xff0c;不傳入任何參數報錯。 3.測試方法&#xff1a;黑盒測試&#xff08;等價類劃分法、邊界值分析、因果圖分析&#xf…

【一文分享】安全數據交換系統是什么?哪款產品性價比高?

隨著數據價值的提升&#xff0c;其流動過程中的安全風險也與日俱增。內部核心數據泄露、外部攻擊、不合規傳輸導致的合規風險……這些問題如同懸在企業頭上的“達摩克利斯之劍”。正是在這樣的背景下&#xff0c;安全數據交換系統 應運而生&#xff0c;成為了保障數據安全流動的…

postgresql9.2.4 離線安裝

1、創建用戶[rootvkeep ~]# groupadd postgres [rootvkeep ~]# useradd -g postgres postgres -m -s /bin/bash [rootvkeep ~]# echo "Database123" | passwd --stdin postgres2、安裝依賴包[rootvkeep ~]# yum install gcc gcc-c zlib-devel readline readline-deve…

【C++設計模式】第三篇:觀察者模式(別名:發布-訂閱模式、模型-視圖模式、源-監聽器模式)

C設計模式系列文章目錄 【C設計模式】第一篇 C單例模式–懶漢與餓漢以及線程安全 【C設計模式】第二篇&#xff1a;策略模式&#xff08;Strategy&#xff09;–從基本介紹&#xff0c;內部原理、應用場景、使用方法&#xff0c;常見問題和解決方案進行深度解析 【C設計模式】…

運作管理學習筆記5-生產和服務設施的選址

運作管理-北京交通大學5.1.設施選址概述 設施選址是一個戰略性的決策&#xff0c;做這個決策的時候會投入比較多的資源&#xff0c;而且未來去改變選址的成本和代價也比較大。 5.1.1.設施選址的重要性 設施選址影響企業經營情況 設施選址對設施布局以及投產后的生產經營費用、產…

JUnit 詳解

一、JUnit 簡介&#xff1a;什么是 JUnit&#xff1f;為什么要用它&#xff1f;1.1 核心定義JUnit 是一個開源的、基于 Java 語言的單元測試框架&#xff0c;最初由 Erich Gamma (GoF 設計模式作者之一) 和 Kent Beck (極限編程創始人) 在 1997 年共同開發。作為 xUnit 測試框架…

數據結構造神計劃第三天---數據類型

&#x1f525;個人主頁&#xff1a;尋星探路 &#x1f3ac;作者簡介&#xff1a;Java研發方向學習者 &#x1f4d6;個人專欄&#xff1a;《從青銅到王者&#xff0c;就差這講數據結構&#xff01;&#xff01;&#xff01;》、 《JAVA&#xff08;SE&#xff09;----如此簡單&a…

AI API Tester體驗:API測試工具如何高效生成接口測試用例、覆蓋異常場景?

前陣子幫后端測試支付接口時&#xff0c;我算是徹底明白 “API 測試能磨掉半條命”—— 明明接口文檔里寫了十幾種參數組合&#xff0c;手動寫測試用例時要么漏了 “簽名過期” 的場景&#xff0c;要么忘了校驗 “金額超過限額” 的返回值&#xff0c;測到半夜還被開發吐槽 “你…

音頻驅動數字人人臉模型

1.LatentSync: Taming Audio-Conditioned Latent Diffusion Models for Lip Sync with SyncNet Supervision 字節 2024 文章地址&#xff1a;https://arxiv.org/pdf/2412.09262 代碼地址&#xff1a;https://github.com/bytedance/LatentSync 訓練推理都有 2.wan2.2-s2v …