10.25B/S结构用户界面设计

【实验编号】
 
10003809548j   Web界面设计
 
【实验学时】
 
8学时
 
【实验环境】
 
所需硬件环境为微机;
所需软件环境为dreamweaver
【实验内容】
 
本次实验要设计一个B/S架构的用户界面,我的选题是《医药信息管理系统》。我为这个系统设计了6个模块,分别是药品销售、药品信息管理、供应商信息管理、入库信息管理、销售账单管理、个人信息管理。
 
【关键步骤】
 
1.先明确系统要实现的功能和每个模块的交互逻辑
 
2.选择合适的技术栈。我选择了SpringBoot+Vue构建B/S架构
 
3.设计数据库的表结构
 
4.构思页面的设计
 
5.使用ps和ai等工具制作一些图片,使系统更美观
 
6.编写代码实现各个模块
 
部分关键代码:
//调用接口,完成登录
 
    let result = await loginService(loginData.value);
 
    ElMessage.success(result.msg ? result.msg : '登录成功')
 
 
 
    const userInfoStore = useUserInfoStore();
 
    //数据存储到pinia中
 
    userInfoStore.setInfo(result.data);
 
 
 
    //跳转到首页 路由完成跳转
 
    await router.push('/main')
 
 
 
}
<!--登录按钮 -->
 
                <el-form-item>
 
                    <el-button class="button" type="primary" auto-insert-space @click="login">登录</el-button>
 
                </el-form-item>
 
            </el-form>
 
        </el-col>
 
    </el-row>
 
</template>
 
 
 
<style lang="scss" scoped>
 
/* 样式 */
 
.login-page {
 
    height: 98vh;
 
    background-color: #fff;
 
 
 
    .bg {
 
        background:
 
            url('@/assets/login_bg.jpg') no-repeat center / cover;
 
        border-radius: 0 20px 20px 0;
 
    }
 
 
 
    .form {
 
        display: flex;
 
        flex-direction: column;
 
        justify-content: center;
 
        user-select: none;
 
 
 
        .title {
 
            margin: 0 auto;
 
        }
 
 
 
        .button {
 
            width: 100%;
 
        }
 
 
 
        .flex {
 
            width: 100%;
 
            display: flex;
 
            justify-content: space-between;
 
        }
 
    }
 
}
 
</style>
 
 
 
Layout.vue
 
<script lang="ts" setup>
 
import {computed, ref, watch} from "vue"
 
import {Management, Promotion, UserFilled, User, Crop, EditPen, SwitchButton, CaretBottom} from '@element-plus/icons-vue'
 
import {ElMessage, ElMessageBox, ElMessageBoxOptions} from 'element-plus'
 
import useUserInfoStore from "@/stores/userInfo.js";
 
import avatar from '@/assets/default.png'
 
import {useRouter} from 'vue-router'
 
import {updateUserService,updatePasswordService} from "@/api/user.js";
const closeInfoDialogVisible = () =>{
 
    infoDialogVisible.value = false
 
    unclickable.value = true
 
    userInfo.value = { ...userInfoStore.info }
 
}
 
const updateUser = async () =>{
 
    await updateUserService(userInfo.value)
 
    userInfoStore.setInfo(userInfo.value)
 
    userInfo.value = { ...userInfoStore.info }
 
    infoDialogVisible.value = false
 
    unclickable.value = true
 
    ElMessage({
 
        type: 'success',
 
        message: '修改成功'
 
    })
 
}
 
 
 
const passwordData = ref({
 
    oldPassword:"",
 
    newPassword:"",
 
    rePassword:""
 
})
 
const clearPasswordData = () =>{
 
    passwordData.value.oldPassword = ""
 
    passwordData.value.newPassword = ""
 
    passwordData.value.rePassword = ""
 
    repwdDialogVisible.value = false
 
}
 
const updatePassword = async () => {
 
    if(passwordData.value.oldPassword===userInfoStore.info.password){
 
        if(passwordData.value.newPassword===passwordData.value.rePassword){
 
            await updatePasswordService(userInfo.value.id,passwordData.value.newPassword)
 
            clearPasswordData()
 
            await router.push('/login')
 
        }else{
 
            ElMessage({
 
                type: 'error',
 
                message: '两次输入的密码不一致'
 
            })
 
        }
 
    }else{
 
        ElMessage({
 
            type: 'error',
 
            message: '原密码输入错误'
 
        })
 
    }
 
}
 
 
 
</script>
autocomplete="off" :disabled="unclickable"/>
 
                        </el-form-item>
 
                        <el-form-item label="年龄" :label-position="'left'">
 
                            <el-input v-model="userInfo.age" autocomplete="off" :disabled="unclickable"/>
 
                        </el-form-item>
 
                        <el-form-item label="电话" :label-position="'left'">
 
                            <el-input v-model="userInfo.phone" autocomplete="off" :disabled="unclickable"/>
 
                        </el-form-item>
 
                    </el-form>
 
                    <template #footer>
 
                        <div class="dialog-footer">
 
                            <el-button @click="closeInfoDialogVisible">关闭</el-button>
 
                            <el-button type="primary" @click="updateUser" :disabled="unclickable">提交</el-button>
 
                        </div>
 
                    </template>
</el-dialog>
 
                <el-dialog v-model="repwdDialogVisible" title="修改密码" width="500" draggable center>
 
                    <el-form label-position="left" label-width="auto">
 
                        <el-form-item label="原密码" >
 
                            <el-input v-model="passwordData.oldPassword" show-password />
 
                        </el-form-item>
 
                        <el-form-item label="新密码" >
 
                            <el-input v-model="passwordData.newPassword" show-password />
 
                        </el-form-item>
 
                        <el-form-item label="确认密码" >
 
                            <el-input v-model="passwordData.rePassword" show-password />
 
                        </el-form-item>
 
                    </el-form>
 
                    <template #footer>
 
                        <div class="dialog-footer">
 
                            <el-button @click="clearPasswordData">取消</el-button>
 
                            <el-button type="primary" @click="updatePassword">提交</el-button>
 
                        </div>
 
                    </template>
 
                </el-dialog>
 
            </el-header>
 
 
 
            <!-- 中间区域 -->
 
            <el-main>
 
                <!-- <div style="width: 1290px; height: 570px;border: 1px solid red;">
 
                    内容展示区
 
                </div> -->
 
                <router-view></router-view>
 
            </el-main>
 
 
 
            <!-- 底部区域 -->
 
            <el-footer>医药管理系统 ©2024 Created by Leap</el-footer>
 
        </el-container>
 
    </el-container>
 
</template>
 
 
 
<style lang="scss" scoped>
 
.my-header {
 
    display: flex;
 
    flex-direction: row;
 
    justify-content: space-between;
 
    gap: 16px;
 
}
 
 
 
.layout-container {
 
    height: 98vh;
 
 
 
    .el-aside {
 
        background-color: #232323;
 
 
 
        &__logo {
 
            height: 120px;
 
            background: url('@/assets/logo.png') no-repeat center / 120px auto;
 
        }
 
 
 
        .el-menu {
 
            border-right: none;
 
        }
 
    }
 
 
 
    .el-header {
 
        background-color: #fff;
 
        display: flex;
 
        align-items: center;
 
        justify-content: space-between;
 
        height: 50px;
 
 
 
        .el-dropdown__box {
 
            display: flex;
 
            align-items: center;
 
 
 
            .el-icon {
 
                color: #999;
 
                margin-left: 10px;
 
            }
 
 
 
            &:active,
 
            &:focus {
 
                outline: none;
 
            }
 
        }
 
    }
 
 
 
    .el-footer {
 
        display: flex;
 
        align-items: center;
 
        justify-content: center;
 
        font-size: 14px;
 
        color: #666;
 
    }
 
}
 
</style>
 
 
 
Inbound.vue
 
<script setup>
 
import { ref } from 'vue'
 
import {ElMessage} from "element-plus"
 
import useUserInfoStore from "@/stores/userInfo.js"
 
import {addInboundService, getAllInboundService, updateInboundService} from "@/api/inbound.js";
 
 
 
const inboundData = ref(
 
    {
 
        id:'',
 
        medicineCode: '',
 
        amount:'',
 
        operatorId: '',
 
        createTime: ''
 
    }
 
)
 
const inbound = ref([
 
    {
 
        id:'',
 
        medicineCode: '',
 
        amount:'',
 
        operatorId: '',
 
        createTime: ''
 
    }
 
])
 
inbound.value = []
const pageNum = ref(1)//当前页
 
const total = ref(10)//总条数
 
const getAllInbound = async () => {
 
    let result = await getAllInboundService(pageNum.value)
 
    inbound.value = result.data.items
 
    total.value = result.data.total
 
}
 
getAllInbound()
 
 
 
const addInboundDialogVisible = ref(false)
 
const addInbound = async () => {
 
    const userInfoStore = useUserInfoStore()
 
    inboundData.value.operatorId = userInfoStore.info.id
 
    await addInboundService(inboundData.value)
 
    inboundData.value = {
 
        id:'',
 
        medicineCode: '',
 
        amount:'',
 
        operatorId: '',
 
        createTime: ''
 
    }
 
    addInboundDialogVisible.value=false
 
    ElMessage.success("入库成功")
 
    await getAllInbound()
 
}
 
const onCurrentChange = (num) => {
 
    pageNum.value = num
 
    getAllInbound()
 
}
 
</script>
 
<template>
 
    <h1>药品入库信息</h1>
 
    <el-button type="primary" @click="addInboundDialogVisible = true">点击入库</el-button>
 
 
 
    <el-table :data="inbound" height="500px" style="width: 100%"
 
              :cell-style="{ textAlign: 'center' }"
 
              :header-cell-style="{ 'text-align': 'center' }"
 
              border>
 
 
 
        <el-table-column prop="id" label="序号" />
 
        <el-table-column prop="medicineCode" label="药品编码" />
 
        <el-table-column prop="amount" label="数量" />
 
        <el-table-column prop="operatorId" label="操作员" />
 
        <el-table-column prop="createTime" label="创建时间" />
 
    </el-table>
 
 
 
    <el-pagination background layout="prev, pager, next" :current-page="pageNum" :total="total"
 
                   @current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" />
 
    <el-dialog v-model="addInboundDialogVisible" title="药品入库" width="500" draggable center>
 
 
 
        <el-form label-position="left" label-width="auto">
 
            <el-form-item label="药品编码">
 
                <el-input v-model="inboundData.medicineCode" placeholder="请输入药品编码" clearable />
 
            </el-form-item>
 
            <el-form-item label="数量">
 
                <el-input v-model="inboundData.amount" placeholder="请输入数量" clearable />
 
            </el-form-item>
 
 
 
        </el-form>
 
 
 
        <template #footer>
 
            <div class="dialog-footer">
 
                <el-button @click="addInboundDialogVisible = false">关闭</el-button>
 
                <el-button type="primary" @click="addInbound" >提交</el-button>
 
            </div>
 
        </template>
 
    </el-dialog>
 
 
 
</template>
 
<style lang="scss" scoped>
 
 
 
</style>
 
 
 
Medicine.vue
 
<script setup>
 
import { ref } from 'vue'
 
import {Search} from "@element-plus/icons-vue";
 
import {ElMessage} from "element-plus";
 
import useUserInfoStore from "@/stores/userInfo.js";
 
import {getAllMedicineService, getMedicineService,deleteMedicineService,updateMedicineService,addMedicineService} from "@/api/medicine.js";
 
 
 
const userInfoStore = useUserInfoStore()
 
const supplierName = ref('')
 
const getMedicineByName = async () => {
 
    let result = await getMedicineService(supplierName.value);
 
    medicine.value = result.data;
 
}
 
 
 
const medicineData = ref(
 
    {
 
        code: '',
 
        name: '',
 
        shortName:'',
 
        description: '',
 
        isPrescription: '',
 
        productTime: '',
 
        expirationDate: '',
 
        price: '',
 
        stock: '',
 
        supplierId: '',
 
        createTime: '',
 
        updateTime: ''
 
    }
 
)
 
const medicine = ref([
 
    {
 
        code: '',
 
        name: '',
 
        shortName:'',
 
        description: '',
 
        isPrescription: '',
 
        productTime: '',
 
        expirationDate: '',
 
        price: '',
 
        stock: '',
 
        supplierId: '',
 
        createTime: '',
 
        updateTime: ''
 
    }
 
])
 
const addMedicineDialogVisible = ref(false)
 
const pageNum = ref(1)//当前页
 
const total = ref(10)//总条数
 
const getAllMedicine = async () => {
 
    let result = await getAllMedicineService(pageNum.value)
 
    medicine.value = result.data.items
 
    total.value = result.data.total
 
}
 
getAllMedicine()
 
const openUpdateMedicineDialog = (row) =>{
 
    medicineData.value = {
 
        code: row.code,
 
        name: row.name,
 
        shortName: row.shortName,
 
        description: row.description,
 
        isPrescription: row.isPrescription,
 
        productTime: row.productTime,
 
        expirationDate: row.expirationDate,
 
        price: row.price,
 
        stock: row.stock,
 
        supplierId: row.supplierId,
 
        createTime: row.createTime,
 
        updateTime: row.updateTime
 
    }
 
    updateMedicineDialogVisible.value = true
 
 
 
}
pageNum.value = num
 
    getAllMedicine()
 
}
 
</script>
 
<template>
 
    <h1>药品详细信息</h1>
 
    <el-form :inline="true" >
 
        <el-form-item>
 
            <el-input placeholder="请输入药品名称" v-model="supplierName" style="width: 240px" :prefix-icon="Search" clearable/>
 
        </el-form-item>
 
        <el-form-item>
 
            <el-button type="primary" @click="getMedicineByName">搜索</el-button>
 
        </el-form-item>
 
        <el-form-item>
 
            <el-button type="primary" @click="addMedicineDialogVisible = true" style="float: right;" v-if="userInfoStore.info.position===1">新增药品</el-button>
 
        </el-form-item>
 
    </el-form>
<el-table :data="medicine" height="500px" style="width: 100%"
 
              :cell-style="{ textAlign: 'center' }"
 
              :header-cell-style="{ 'text-align': 'center' }"
 
              border>
 
 
 
        <el-table-column prop="code" label="编码"/>
 
        <el-table-column prop="name" label="名称"/>
 
        <el-table-column prop="shortName" label="简称"/>
 
        <el-table-column prop="description" label="描述"/>
 
        <el-table-column prop="isPrescription" label="是否是处方药"/>
 
        <el-table-column prop="productTime" label="生产日期"/>
 
        <el-table-column prop="expirationDate" label="有效期(月)"/>
 
        <el-table-column prop="price" label="价格"/>
 
        <el-table-column prop="stock" label="库存"/>
 
        <el-table-column prop="supplierId" label="供应商id"/>
 
        <el-table-column prop="createTime" label="创建时间"/>
 
        <el-table-column prop="updateTime" label="更新时间"/>
 
        <el-table-column v-if="userInfoStore.info.position===1" label="操作" width="180px">
 
            <template #default="{row}">
 
                <el-button type="primary" size="small" @click="openUpdateMedicineDialog(row)">编辑</el-button>
 
                <el-button type="danger" size="small" @click="deleteMedicine(row.code)">删除</el-button>
 
            </template>
 
        </el-table-column>
 
    </el-table>
 
    <el-pagination background layout="prev, pager, next" :current-page="pageNum" :total="total"
 
                   @current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" />
 
 
 
    <el-dialog v-model="addMedicineDialogVisible" title="新增药品" width="500" draggable center>
 
 
 
        <el-form label-position="left" label-width="auto">
 
            <el-form-item label="编码">
 
                <el-input v-model="medicineData.code" placeholder="请输入药品编码" clearable />
 
            </el-form-item>
 
            <el-form-item label="名称" >
 
                <el-input v-model="medicineData.name" placeholder="请输入药品名称" clearable />
 
            </el-form-item>
 
            <el-form-item label="简称">
 
                <el-input v-model="medicineData.shortName" placeholder="请输入药品简称" clearable />
 
            </el-form-item>
 
            <el-form-item label="描述">
 
                <el-input v-model="medicineData.description" placeholder="请输入药品描述" clearable />
 
            </el-form-item>
 
            <el-form-item label="是否是处方药">
 
                <el-input v-model="medicineData.isPrescription" placeholder="请输入是否是处方药" clearable />
 
            </el-form-item>
 
            <el-form-item label="生产日期">
 
                <el-input v-model="medicineData.productTime" placeholder="请输入生产日期" clearable />
 
            </el-form-item>
 
            <el-form-item label="有效期(月)">
 
                <el-input v-model="medicineData.expirationDate" placeholder="请输入有效期" clearable />
 
            </el-form-item>
 
            <el-form-item label="价格">
 
                <el-input v-model="medicineData.price" placeholder="请输入价格" clearable />
 
            </el-form-item>
 
            <el-form-item label="供应商id">
 
                <el-input v-model="medicineData.supplierId" placeholder="请输入供应商id" clearable />
 
            </el-form-item>
 
 
 
        </el-form>
 
 
 
        <template #footer>
 
            <div class="dialog-footer">
 
                <el-button @click="addMedicineDialogVisible = false">关闭</el-button>
 
                <el-button type="primary" @click="addMedicine" >提交</el-button>
 
            </div>
 
        </template>
 
    </el-dialog>
 
    <el-dialog v-model="updateMedicineDialogVisible" title="编辑药品信息" width="500" draggable center>
 
        <el-form label-position="left" label-width="auto">
 
            <el-form-item label="编码">
 
                <el-input v-model="medicineData.code" placeholder="请输入药品编码" disabled />
 
            </el-form-item>
 
            <el-form-item label="简称">
 
                <el-input v-model="medicineData.shortName" placeholder="请输入药品简称" clearable />
 
            </el-form-item>
 
            <el-form-item label="描述">
 
                <el-input v-model="medicineData.description" placeholder="请输入药品描述" clearable />
 
            </el-form-item>
 
            <el-form-item label="是否是处方药">
 
                <el-input v-model="medicineData.isPrescription" placeholder="请输入是否是处方药" clearable />
 
            </el-form-item>
 
            <el-form-item label="有效期(月)">
 
                <el-input v-model="medicineData.expirationDate" placeholder="请输入有效期" clearable />
 
            </el-form-item>
 
            <el-form-item label="价格">
 
                <el-input v-model="medicineData.price" placeholder="请输入价格" clearable />
 
            </el-form-item>
 
            <el-form-item label="供应商id">
 
                <el-input v-model="medicineData.supplierId" placeholder="请输入供应商id" clearable />
 
            </el-form-item>
 
        </el-form>
 
        <template #footer>
 
            <div class="dialog-footer">
 
                <el-button @click="closeUpdateMedicineDialog">关闭</el-button>
 
                <el-buttoconst bill = ref(
 
    {
 
        medicineCode:'',
 
        amount:'',
 
        operatorId:'',
 
    }
 
)
 
bill.value = null
 
const addBill = async () => {
 
    if(shoppingCart.value.length === 0){
 
        ElMessage.error("购物车为空")
 
        return
 
    }
const userInfoStore = useUserInfoStore();
 
    try {
 
        for (const item of shoppingCart.value) {
 
            const bill = {
 
              medicineCode: item.medicineCode,
 
              amount: item.amount,
 
              operatorId: userInfoStore.info.id
 
            };
 
            await addBillService(bill);
 
        }
 
        medicineName.value = ''
 
        ElMessage.success("结算成功");
 
        shoppingCart.value = [];
 
        shoppingCartDialogVisible.value = false;
 
        await getAllMedicine()
 
 
 
    } catch (error) {
 
        ElMessage.error("结算失败: " + error.message);
 
    }
 
}
 
const totalMoney = computed(() => {
 
    return shoppingCart.value.reduce((total, item) => {
 
        return total + (item.price * item.amount)
 
    }, 0).toFixed(2)
 
})
 
</script>
 
<template>
 
    <h1>药品销售</h1>
 
    <el-form :inline="true">
 
        <el-form-item>
 
            <el-input placeholder="请输入药品名称" v-model="medicineName" style="width: 240px" :prefix-icon="Search"/>
 
        </el-form-item>
 
        <el-form-item>
 
            <el-button type="primary" @click="getMedicine">搜索</el-button>
 
        </el-form-item>
 
        <el-form-item style="float: right; margin-left: auto;">
 
            <el-button type="primary" @click="shoppingCartDialogVisible = true" style="float: right;">打开购物车</el-button>
 
        </el-form-item>
 
    </el-form>
 
    <el-table :data="medicine" height="300px" style="width: 100%"
 
              :cell-style="{ textAlign: 'center' }"
 
              :header-cell-style="{ 'text-align': 'center' }"
 
              border>
 
 
 
        <el-table-column prop="name" label="药名" width="120" />
 
        <el-table-column prop="description" label="描述" width="450" />
 
        <el-table-column prop="productTime" label="生产日期" width="180"/>
 
        <el-table-column prop="expirationDate" label="有效期(月)" width="120"/>
 
        <el-table-column prop="price" label="单价" width="90"/>
 
        <el-table-column prop="stock" label="库存" width="90"/>
 
        <el-table-column label="数量" width="120">
 
            <template #default = "{row}">
 
                <div class="combo">
 
                    <input type="button" name="minus" value="-" class="combo-minus" @click="changeAmount('-',row)"/>
 
                    <input type="text" name="count" v-model.number="row.amount" @input="validateInput(row)" class="combo-value"/>
 
                    <input type="button" name="plus" value="+" class="combo-plus" @click="changeAmount('+',row)"/>
 
                </div>
 
            </template>
 
        </el-table-column>
 
        <el-table-column fixed="right" label="操作" min-width="50">
 
            <template #default = "{row}">
 
                <el-button type="primary" @click="addToShoppingCart(row)">添加到购物车</el-button>
 
            </template>
 
        </el-table-column>
 
    </el-table>
 
 
 
 
 
    <el-pagination background layout="prev, pager, next" :current-page="pageNum" :total="total"
 
                   @current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" />
 
 
 
    <el-dialog v-model="shoppingCartDialogVisible" title="结算" width="500" draggable center>
 
        <el-table :data="shoppingCart" style="width: 100%">
 
            <el-table-column prop="name" label="药名" width="120" />
 
            <el-table-column prop="price" label="单价" width="90"/>
 
            <el-table-column prop="amount" label="数量" width="90"/>
 
            <el-table-column label="小计" width="90">
 
                <template #default = "{row}">
 
                    <el-text>{{(row.price * row.amount).toFixed(2)}}</el-text>
 
                </template>
 
            </el-table-column>
 
        </el-table>
 
        <el-text>共计:{{totalMoney}}</el-text>
 
        <template #footer>
 
            <div class="dialog-footer">
 
                <el-button @click="shoppingCartDialogVisible = false">取消</el-button>
 
                <el-button type="primary" @click="addBill">结算</el-button>
 
            </div>
 
        </template>
 
 
 
    </el-dialog>
 
 
 
 
 
</template>
 
<style lang="scss" scoped>
 
.combo .combo-minus,
 
.combo .combo-value,
 
.combo .combo-plus{
 
    background: #FFFFFF;
 
    border: 1px solid #DDDDDD;
 
    color: #333333;
 
    float: left;
 
    font-weight: bold;
 
    margin: 0;
 
    outline: none;
 
    text-align: center;
 
}
 
 
 
.combo .combo-minus,
 
.combo .combo-plus{
 
    font-size: 16px;
 
    height: 26px;
 
    line-height: 26px;
 
    padding: 0;
 
    width: 24px;
 
}
 
 
 
.combo .combo-value{
 
    border-left: none;
 
    border-right: none;
 
    height: 20px;
 
    line-height: 20px;
 
    padding: 2px;
 
    width: 40px;
 
}
 
 
 
</style>
 
 
 
Supplier.vue
 
<script setup>
 
import { ref } from 'vue'
 
import {getAllSupplierService, addSupplierService, getSupplierByNameService, updateSupplierService, deleteSupplierService} from "@/api/supplier.js"
 
import {Search} from "@element-plus/icons-vue";
 
import {ElMessage} from "element-plus";
 
import useUserInfoStore from "@/stores/userInfo.js";
 
 
 
const userInfoStore = useU
const userInfoStore = useUserInfoStore()
 
const supplierName = ref('')
 
const supplierData = ref({
 
        id:'',
 
        name:'',
 
        description:'',
 
        phone:'',
 
        createTime:'',
 
        updateTime:''
 
})
 
const supplier = ref([
 
    {
 
        id:'',
 
        name:'',
 
        description:'',
 
        phone:'',
 
        createTime:'',
 
        updateTime:''
 
    }
 
])
 
 
 
const pageNum = ref(1)//当前页
 
const total = ref(10)//总条数
 
const getAllSupplier = async () => {
 
    let result = await getAllSupplierService(pageNum.value)
 
    supplier.value = result.data.items
 
    total.value = result.data.total
 
 
 
}
 
getAllSupplier()
 
const getSupplierByName = async () => {
 
    let result = await getSupplierByNameService(supplierName.value);
 
    supplier.value = result.data;
 
}
 
const addSupplierDialogVisible = ref(false)
 
const addSupplier = async () => {
 
    await addSupplierService(supplierData.value)
 
    /*supplier.value = []*/
 
    supplierData.value = {
 
        id:'',
 
        name:'',
 
        description:'',
 
        phone:'',
 
        createTime:'',
 
        updateTime:''
 
    }
 
    addSupplierDialogVisible.value = false
 
    ElMessage.success("新增供应商成功")
 
    await getAllSupplier()
 
}
 
 
 
const deleteSupplier = async (id) => {
 
    await deleteSupplierService(id)
 
    await getAllSupplier()
 
}
 
 
 
const updateSupplierDialogVisible = ref(false)
 
const openUpdateSupplierDialog = (row) => {
 
    supplierData.value = {
 
        id:row.id,
 
        name:row.name,
 
        description:row.description,
 
        phone:row.phone,
 
        createTime:row.createTime,
 
        updateTime:row.updateTime
 
    }
 
    updateSupplierDialogVisible.value = true
 
}
 
const closeUpdateSupplierDialog = () => {
 
    supplierData.value = {
 
        id:'',
 
        name:'',
 
        description:'',
 
        phone:'',
 
        createTime:'',
 
        updateTime:''
 
    }
 
    updateSupplierDialogVisible.value = false
 
}
 
const updateSupplier = async () => {
 
    await updateSupplierService(supplierData.value)
 
    await getAllSupplier()
 
    closeUpdateSupplierDialog()
 
}
 
 
 
 
 
 
 
 
 
 
 
//当前页码发生变化,调用此函数
 
const onCurrentChange = (num) => {
 
    pageNum.value = num
 
    getAllSupplier()
 
}
 
</script>
 
<template>
 
    <h1>供应商信息</h1>
 
    <el-form :inline="true">
 
        <el-form-item>
 
            <el-input placeholder="请输入供应商名称" v-model="supplierName" style="width: 240px" :prefix-icon="Search" clearable/>
 
        </el-form-item>
 
        <el-form-item>
 
            <el-button type="primary" @click="getSupplierByName">搜索</el-button>
 
        </el-form-item>
 
        <el-form-item v-if="userInfoStore.info.position===1">
 
            <el-button type="primary" @click="addSupplierDialogVisible = true" style="float: right;">新增供应商</el-button>
 
        </el-form-item>
 
 
 
    </el-form>
 
    <el-table :data="supplier" height="500px" style="width: 100%"
 
              :cell-style="{ textAlign: 'center' }"
 
              :header-cell-style="{ 'text-align': 'center' }"
 
              border>
 
 
 
        <el-table-column prop="id" label="编号" width="150px"/>
 
        <el-table-column prop="name" label="名称"/>
 
        <el-table-column prop="description" label="描述"/>
 
        <el-table-column prop="phone" label="电话"/>
 
        <el-table-column prop="createTime" label="创建时间"/>
 
        <el-table-column prop="updateTime" label="更新时间"/>
 
        <el-table-column label="操作" v-if="userInfoStore.info.position===1">
 
            <template #default="{row}">
 
                <el-button type="primary" size="small" @click="openUpdateSupplierDialog(row)">编辑</el-button>
 
                <el-button type="danger" size="small" @click="deleteSupplier(row.id)">删除</el-button>
 
            </template>
 
        </el-table-column>
 
    </el-table>
 
 
 
 
 
    <el-pagination background layout="prev, pager, next" :current-page="pageNum" :total="total"
 
                   @current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" />
 
 
 
    <el-dialog v-model="addSupplierDialogVisible" title="新增供应商" width="500" draggable center>
 
 
 
        <el-form label-position="left" label-width="auto">
 
            <el-form-item label="名称" >
 
                <el-input v-model="supplierData.name" placeholder="请输入供应商名称" clearable />
 
            </el-form-item>
 
            <el-form-item label="描述">
 
                <el-input v-model="supplierData.description" placeholder="请输入供应商描述" clearable />
 
            </el-form-item>
 
            <el-form-item label="电话">
 
                <el-input v-model="supplierData.phone" placeholder="请输入供应商电话" clearable />
 
            </el-form-item>
 
        </el-form>
 
 
 
        <template #footer>
 
            <div class="dialog-footer">
 
                <el-button @click="addSupplierDialogVisible = false">关闭</el-button>
 
                <el-button type="primary" @click="addSupplier" >提交</el-button>
 
            </div>
 
        </template>
 
    </el-dialog>
 
    <el-dialog v-model="updateSuppliconst userInfoStore = useUserInfoStore()
 
const supplierName = ref('')
 
const supplierData = ref({
 
        id:'',
 
        name:'',
 
        description:'',
 
        phone:'',
 
        createTime:'',
 
        updateTime:''
 
})
 
const supplier = ref([
 
    {
 
        id:'',
 
        name:'',
 
        description:'',
 
        phone:'',
 
        createTime:'',
 
        updateTime:''
 
    }
 
])
 
 
 
const pageNum = ref(1)//当前页
 
const total = ref(10)//总条数
 
const getAllSupplier = async () => {
 
    let result = await getAllSupplierService(pageNum.value)
 
    supplier.value = result.data.items
 
    total.value = result.data.total
 
 
 
}
 
getAllSupplier()
 
const getSupplierByName = async () => {
 
    let result = await getSupplierByNameService(supplierName.value);
 
    supplier.value = result.data;
 
}
 
const addSupplierDialogVisible = ref(false)
 
const addSupplier = async () => {
 
    await addSupplierService(supplierData.value)
 
    /*supplier.value = []*/
 
    supplierData.value = {
 
        id:'',
 
        name:'',
 
        description:'',
 
        phone:'',
 
        createTime:'',
 
        updateTime:''
 
    }
 
    addSupplierDialogVisible.value = false
 
    ElMessage.success("新增供应商成功")
 
    await getAllSupplier()
 
}
 
 
 
const deleteSupplier = async (id) => {
 
    await deleteSupplierService(id)
 
    await getAllSupplier()
 
}
 
 
 
const updateSupplierDialogVisible = ref(false)
 
const openUpdateSupplierDialog = (row) => {
 
    supplierData.value = {
 
        id:row.id,
 
        name:row.name,
 
        description:row.description,
 
        phone:row.phone,
 
        createTime:row.createTime,
 
        updateTime:row.updateTime
 
    }
 
    updateSupplierDialogVisible.value = true
 
}
 
const closeUpdateSupplierDialog = () => {
 
    supplierData.value = {
 
        id:'',
 
        name:'',
 
        description:'',
 
        phone:'',
 
        createTime:'',
 
        updateTime:''
 
    }
 
    updateSupplierDialogVisible.value = false
 
}
 
const updateSupplier = async () => {
 
    await updateSupplierService(supplierData.value)
 
    await getAllSupplier()
 
    closeUpdateSupplierDialog()
 
}
 
 
 
 
 
 
 
 
 
 
 
//当前页码发生变化,调用此函数
 
const onCurrentChange = (num) => {
 
    pageNum.value = num
 
    getAllSupplier()
 
}
 
</script>
 
<template>
 
    <h1>供应商信息</h1>
 
    <el-form :inline="true">
 
        <el-form-item>
 
            <el-input placeholder="请输入供应商名称" v-model="supplierName" style="width: 240px" :prefix-icon="Search" clearable/>
 
        </el-form-item>
 
        <el-form-item>
 
            <el-button type="primary" @click="getSupplierByName">搜索</el-button>
 
        </el-form-item>
 
        <el-form-item v-if="userInfoStore.info.position===1">
 
            <el-button type="primary" @click="addSupplierDialogVisible = true" style="float: right;">新增供应商</el-button>
 
        </el-form-item>
 
 
 
    </el-form>
 
    <el-table :data="supplier" height="500px" style="width: 100%"
 
              :cell-style="{ textAlign: 'center' }"
 
              :header-cell-style="{ 'text-align': 'center' }"
 
              border>
 
 
 
        <el-table-column prop="id" label="编号" width="150px"/>
 
        <el-table-column prop="name" label="名称"/>
 
        <el-table-column prop="description" label="描述"/>
 
        <el-table-column prop="phone" label="电话"/>
 
        <el-table-column prop="createTime" label="创建时间"/>
 
        <el-table-column prop="updateTime" label="更新时间"/>
 
        <el-table-column label="操作" v-if="userInfoStore.info.position===1">
 
            <template #default="{row}">
 
                <el-button type="primary" size="small" @click="openUpdateSupplierDialog(row)">编辑</el-button>
 
                <el-button type="danger" size="small" @click="deleteSupplier(row.id)">删除</el-button>
 
            </template>
 
        </el-table-column>
 
    </el-table>
 
 
 
 
 
    <el-pagination background layout="prev, pager, next" :current-page="pageNum" :total="total"
 
                   @current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" />
 
 
 
    <el-dialog v-model="addSupplierDialogVisible" title="新增供应商" width="500" draggable center>
 
 
 
        <el-form label-position="left" label-width="auto">
 
            <el-form-item label="名称" >
 
                <el-input v-model="supplierData.name" placeholder="请输入供应商名称" clearable />
 
            </el-form-item>
 
            <el-form-item label="描述">
 
                <el-input v-model="supplierData.description" placeholder="请输入供应商描述" clearable />
 
            </el-form-item>
 
            <el-form-item label="电话">
 
                <el-input v-model="supplierData.phone" placeholder="请输入供应商电话" clearable />
 
            </el-form-item>
 
        </el-form>
 
 
 
        <template #footer>
 
            <div class="dialog-footer">
 
                <el-button @click="addSupplierDialogVisible = false">关闭</el-button>
 
                <el-button type="primary" @click="addSupplier" >提交</el-button>
 
            </div>
 
        </template>
 
    </el-dialog>
 
    <el-dialog v-model="updateSuppli
<el-pagination background layout="prev, pager, next" :current-page="pageNum" :total="total"
 
                   @current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" />
 
 
 
    <el-dialog v-model="addSupplierDialogVisible" title="新增供应商" width="500" draggable center>
 
 
 
        <el-form label-position="left" label-width="auto">
 
            <el-form-item label="名称" >
 
                <el-input v-model="supplierData.name" placeholder="请输入供应商名称" clearable />
 
            </el-form-item>
 
            <el-form-item label="描述">
 
                <el-input v-model="supplierData.description" placeholder="请输入供应商描述" clearable />
 
            </el-form-item>
 
            <el-form-item label="电话">
 
                <el-input v-model="supplierData.phone" placeholder="请输入供应商电话" clearable />
 
            </el-form-item>
 
        </el-form>
 
 
 
        <template #footer>
 
            <div class="dialog-footer">
 
                <el-button @click="addSupplierDialogVisible = false">关闭</el-button>
 
                <el-button type="primary" @click="addSupplier" >提交</el-button>
 
            </div>
 
        </template>
 
    </el-dialog>
 
    <el-dialog v-model="updateSupplierDialogVisible" title="编辑供应商信息" width="500" draggable center>
 
        <el-form label-position="left" label-width="auto">
 
            <el-form-item label="名称" >
 
                <el-input v-model="supplierData.name" placeholder="请输入供应商名称" clearable />
 
            </el-form-item>
 
            <el-form-item label="描述">
 
                <el-input v-model="supplierData.description" placeholder="请输入供应商描述" clearable />
 
            </el-form-item>
 
            <el-form-item label="电话">
 
                <el-input v-model="supplierData.phone" placeholder="请输入供应商电话" clearable />
 
            </el-form-item>
 
        </el-form>
 
        <template #footer>
 
            <div class="dialog-footer">
 
                <el-button @click="closeUpdateSupplierDialog">关闭</el-button>
 
                <el-button type="primary" @click="updateSupplier">提交</el-button>
 
            </div>
 
        </template>
 
    </el-dialog>
 
</template>
 
<style lang="scss" scoped>
 
 
 
</style>
 
 
 
【程序运行截图】
 
登录页面:
 
药品销售页面
 
购物车页面
 
药品详细信息页面
 
 
 
新增药品页面
 
 
 
药品信息编辑页面
 
供应商信息页面
 
新增供应商页面
 
编辑供应商信息页面
 
药品入库信息页面
 
药品入库页面
 
 
 
销售账单记录页面
 
个人信息管理模块
 
个人资料页面
 
 
 
修改密码页面
 
【实验体会】
 
通过开发《医药信息管理系统》,我深入体验了 Spring Boot 和 Vue的开发过程。后端使用 Spring Boot,简化了服务端开发和接口设计,让我更加熟悉了 RESTful API 的规范,同时也学到了如何组织业务逻辑和处理请求。在前端部分,Vue.js 的组件化和数据绑定功能使得页面开发更加灵活和高效,前后端分离的架构让我对现代 Web 开发有了更清晰的认识。虽然系统功能较为简单,主要以增删改查为主,但这次项目让我更加熟悉了基本的全栈开发流程,包括前后端联调和数据库设计等。这次实践提升了我对技术栈的掌握,也加深了我对开发流程和项目管理的理解,为我今后的项目积累了宝贵经验。同时也暴露了我在审美方面的欠缺,以后要多看看优秀网站的设计,提高自己的审美。
posted @ 2025-01-07 23:23  kxzzow  阅读(23)  评论(0)    收藏  举报