Selaa lähdekoodia

标本出入库页面

iker 1 kuukausi sitten
vanhempi
commit
a5f59c9949

+ 344 - 59
src/views/system/Inner/iker.vue

@@ -1,69 +1,354 @@
 <template>
-  <div>
-    <el-input v-model="searchQuery" placeholder="输入申请人、标本名称或编号" style="width: 300px; margin-bottom: 20px" @input="handleSearch" />
-    <el-table :data="filteredData" border>
-      <el-table-column prop="applicant" label="申请人" />
-      <el-table-column prop="requestTime" label="申请时间" />
-      <el-table-column prop="specimenName" label="标本名称" />
-      <el-table-column prop="specimenNumber" label="标本编号" />
-      <el-table-column prop="purpose" label="用途" />
-      <el-table-column prop="status" label="审核状态" />
-      <el-table-column label="操作">
-        <template #default="{ row }">
-          <el-button type="primary" @click="handleReview(row)">审核</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <el-dialog v-model="showDialog" title="审核出库申请">
-      <p>申请人: {{ selectedRecord?.applicant }}</p>
-      <p>标本名称: {{ selectedRecord?.specimenName }}</p>
-      <p>标本编号: {{ selectedRecord?.specimenNumber }}</p>
-      <p>用途: {{ selectedRecord?.purpose }}</p>
-      <el-input v-model="rejectReason" placeholder="驳回原因(可选)" style="margin-top: 20px" />
-      <template #footer>
-        <el-button @click="showDialog = false">取消</el-button>
-        <el-button type="danger" @click="handleReject">驳回</el-button>
-        <el-button type="primary" @click="handleApprove">通过</el-button>
-      </template>
-    </el-dialog>
+  <div class="in-request-page">
+    <h1>标本入库申请</h1>
+
+    <!-- 搜索栏 -->
+    <div class="search-bar">
+      <input v-model="searchForm.name" placeholder="名称" />
+      <input v-model="searchForm.number" placeholder="编号" />
+      <button @click="search">搜索</button>
+      <button @click="resetSearch">重置</button>
+      <button @click="exportData">导出</button>
+    </div>
+
+    <!-- 数据表格 -->
+    <table class="data-table">
+      <thead>
+      <tr>
+        <th>编号</th>
+        <th>名称</th>
+        <th>存放位置</th>
+        <th>图片</th>
+        <th>退还人</th>
+        <th>退还时间</th>
+        <th>点收人</th>
+        <th>回库状态</th>
+        <th>操作</th>
+      </tr>
+      </thead>
+      <tbody>
+      <tr v-for="item in filteredData" :key="item.id">
+        <td>{{ item.number }}</td>
+        <td>{{ item.name }}</td>
+        <td>{{ item.location }}</td>
+        <td>
+          <img :src="item.image" alt="标本图片" class="specimen-image" />
+        </td>
+        <td>{{ item.returner }}</td>
+        <td>{{ item.returnTime }}</td>
+        <td>{{ item.receiver }}</td>
+        <td>
+          <span :class="`status ${item.status}`">{{ item.status }}</span>
+        </td>
+        <td>
+          <button @click="confirmReturn(item.id)">确认回库</button>
+          <button @click="editItem(item)">编辑</button>
+          <button @click="deleteItem(item.id)">删除</button>
+        </td>
+      </tr>
+      </tbody>
+    </table>
+
+    <!-- 入库申请弹窗 -->
+    <div v-if="showModal" class="modal">
+      <div class="modal-content">
+        <h2>入库申请表单</h2>
+        <div>
+          <label>申请人:</label>
+          <input v-model="requestForm.applicant" placeholder="申请人" />
+        </div>
+        <div>
+          <label>申请时间:</label>
+          <input v-model="requestForm.applyTime" type="date" />
+        </div>
+        <div>
+          <label>标本名称:</label>
+          <input v-model="requestForm.specimenName" placeholder="标本名称" />
+        </div>
+        <div>
+          <label>标本编号:</label>
+          <input v-model="requestForm.specimenNumber" placeholder="标本编号" />
+        </div>
+        <div>
+          <label>用途:</label>
+          <input v-model="requestForm.purpose" placeholder="用途" />
+        </div>
+        <div>
+          <label>附件:</label>
+          <input type="file" @change="handleFileUpload" />
+        </div>
+        <div>
+          <button @click="submitRequest">提交</button>
+          <button @click="closeModal">取消</button>
+        </div>
+      </div>
+    </div>
+
+    <!-- 提交申请按钮 -->
+    <button class="submit-button" @click="openRequestModal">提交入库申请</button>
   </div>
 </template>
 
-<script setup>
+<script>
 import { ref, computed } from 'vue';
 
-const data = ref([
-  { id: 1, applicant: '用户A', requestTime: '2023-10-01', specimenName: '标本1', specimenNumber: '001', purpose: '实验', status: '待审核' },
-  { id: 2, applicant: '用户B', requestTime: '2023-10-02', specimenName: '标本2', specimenNumber: '002', purpose: '研究', status: '待审核' },
-]);
-
-const searchQuery = ref('');
-const showDialog = ref(false);
-const selectedRecord = ref(null);
-const rejectReason = ref('');
-
-const filteredData = computed(() => {
-  return data.value.filter(item =>
-    item.applicant.includes(searchQuery.value) ||
-    item.specimenName.includes(searchQuery.value) ||
-    item.specimenNumber.includes(searchQuery.value)
-  );
-});
-
-const handleReview = (row) => {
-  selectedRecord.value = row;
-  showDialog.value = true;
-};
+export default {
+  name: 'InRequest',
+  setup() {
+    // 搜索表单
+    const searchForm = ref({
+      name: '',
+      number: '',
+    });
 
-const handleApprove = () => {
-  selectedRecord.value.status = '已通过';
-  showDialog.value = false;
-};
+    // 入库申请表单
+    const showModal = ref(false);
+    const requestForm = ref({
+      applicant: '',
+      applyTime: '',
+      specimenName: '',
+      specimenNumber: '',
+      purpose: '',
+      attachment: null,
+    });
+
+    // 数据列表
+    const data = ref([
+      {
+        id: 1,
+        number: 'RT-001 系列',
+        name: '矿石标本',
+        location: 'B区-3柜',
+        image: 'https://via.placeholder.com/50', // 替换为实际图片链接
+        returner: '张三',
+        returnTime: '2024-03-01 14:30:00',
+        receiver: '李四',
+        status: '已入库',
+      },
+      {
+        id: 2,
+        number: 'RT-002 系列',
+        name: '矿石标本',
+        location: 'B区-4柜',
+        image: 'https://via.placeholder.com/50', // 替换为实际图片链接
+        returner: '王五',
+        returnTime: '2024-03-02 15:45:00',
+        receiver: '赵六',
+        status: '待审核',
+      },
+    ]);
+
+    // 过滤数据
+    const filteredData = computed(() => {
+      return data.value.filter((item) =>
+        `${item.name}${item.number}`.includes(`${searchForm.value.name}${searchForm.value.number}`)
+      );
+    });
+
+    // 搜索
+    const search = () => {
+      console.log('搜索中...');
+    };
+
+    // 重置搜索
+    const resetSearch = () => {
+      searchForm.value = { name: '', number: '' };
+    };
+
+    // 导出数据
+    const exportData = () => {
+      console.log('导出数据...');
+    };
+
+    // 打开入库申请弹窗
+    const openRequestModal = () => {
+      showModal.value = true;
+    };
+
+    // 关闭弹窗
+    const closeModal = () => {
+      showModal.value = false;
+      requestForm.value = {
+        applicant: '',
+        applyTime: '',
+        specimenName: '',
+        specimenNumber: '',
+        purpose: '',
+        attachment: null,
+      };
+    };
+
+    // 提交入库申请
+    const submitRequest = () => {
+      const newRequest = {
+        id: data.value.length + 1,
+        ...requestForm.value,
+        status: '待审核',
+      };
+      data.value.push(newRequest);
+      closeModal();
+    };
+
+    // 确认回库
+    const confirmReturn = (id) => {
+      const index = data.value.findIndex((item) => item.id === id);
+      if (index !== -1) {
+        data.value[index].status = '已入库';
+      }
+    };
+
+    // 编辑数据
+    const editItem = (item) => {
+      console.log('编辑', item);
+    };
+
+    // 删除数据
+    const deleteItem = (id) => {
+      data.value = data.value.filter((item) => item.id !== id);
+    };
+
+    // 文件上传
+    const handleFileUpload = (event) => {
+      const file = event.target.files[0];
+      if (file) {
+        requestForm.value.attachment = URL.createObjectURL(file);
+      }
+    };
 
-const handleReject = () => {
-  selectedRecord.value.status = '已驳回';
-  console.log('驳回原因:', rejectReason.value);
-  showDialog.value = false;
+    return {
+      searchForm,
+      showModal,
+      requestForm,
+      data,
+      filteredData,
+      search,
+      resetSearch,
+      exportData,
+      openRequestModal,
+      closeModal,
+      submitRequest,
+      confirmReturn,
+      editItem,
+      deleteItem,
+      handleFileUpload,
+    };
+  },
 };
 </script>
+
+<style scoped>
+.in-request-page {
+  padding: 20px;
+  background-color: #f9f9f9;
+  border-radius: 8px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.search-bar {
+  margin-bottom: 20px;
+  display: flex;
+  gap: 10px;
+}
+
+.search-bar input {
+  padding: 8px;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  flex: 1;
+}
+
+.search-bar button {
+  padding: 8px 16px;
+  background-color: #007bff;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+}
+
+.data-table {
+  width: 100%;
+  border-collapse: collapse;
+  margin-bottom: 20px;
+}
+
+.data-table th,
+.data-table td {
+  border: 1px solid #ddd;
+  padding: 12px;
+  text-align: left;
+}
+
+.data-table th {
+  background-color: #f2f2f2;
+}
+
+.status {
+  padding: 4px 8px;
+  border-radius: 4px;
+  font-size: 12px;
+  color: white;
+}
+
+.status.已入库 {
+  background-color: #4caf50;
+}
+
+.status.待审核 {
+  background-color: #ff9800;
+}
+
+.specimen-image {
+  width: 50px;
+  height: 50px;
+  object-fit: cover;
+}
+
+.modal {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.5);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.modal-content {
+  background: white;
+  padding: 20px;
+  border-radius: 8px;
+  width: 400px;
+}
+
+.modal-content div {
+  margin-bottom: 10px;
+}
+
+.modal-content label {
+  display: block;
+  margin-bottom: 5px;
+}
+
+.modal-content input {
+  width: 100%;
+  padding: 8px;
+  box-sizing: border-box;
+}
+
+.modal-content button {
+  margin-right: 10px;
+}
+
+.submit-button {
+  padding: 10px 20px;
+  background-color: #007bff;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+  margin-top: 20px;
+}
+</style>

+ 107 - 33
src/views/system/Inner/index.vue

@@ -1,48 +1,122 @@
 <template>
-  <div>
-    <el-input v-model="searchQuery" placeholder="输入名称、编号或存放位置" style="width: 300px; margin-bottom: 20px" @input="handleSearch" />
-    <el-table :data="filteredData" border>
-      <el-table-column prop="name" label="名称" />
-      <el-table-column prop="number" label="编号" />
+  <div class="app-container">
+    <!-- 搜索栏 -->
+    <el-form :model="queryParams" inline>
+      <el-form-item label="名称">
+        <el-input v-model="queryParams.name" placeholder="标本名称" clearable />
+      </el-form-item>
+      <el-form-item label="编号">
+        <el-input v-model="queryParams.number" placeholder="标本编号" clearable />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="handleSearch">搜索</el-button>
+        <el-button @click="resetQuery">重置</el-button>
+        <el-button type="primary" @click="handleExport">导出</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 数据表格 -->
+    <el-table :data="tableData" border>
+      <el-table-column prop="number" label="编号" width="120" />
+      <el-table-column prop="name" label="名称" width="150" />
       <el-table-column prop="location" label="存放位置" />
-      <el-table-column label="图片">
+      <el-table-column label="图片" width="100">
         <template #default="{ row }">
           <el-image :src="row.image" style="width: 50px; height: 50px" />
         </template>
       </el-table-column>
-      <el-table-column prop="returnBy" label="退还人" />
-      <el-table-column prop="returnTime" label="退还时间" />
-      <el-table-column prop="receiver" label="点收人" />
-      <el-table-column prop="note" label="备注" />
-      <el-table-column prop="status" label="标本情况" />
-      <el-table-column label="操作">
+      <el-table-column prop="returnBy" label="退还人" width="120" />
+      <el-table-column prop="returnTime" label="退还时间" width="180" />
+      <el-table-column prop="receiver" label="点收人" width="120" />
+      <el-table-column prop="status" label="回库状态" width="100">
         <template #default="{ row }">
-          <el-button type="primary" @click="handleReturn(row)">入库</el-button>
+          <el-tag :type="row.status === '已回库' ? 'success' : 'warning'">
+            {{ row.status }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="220" fixed="right">
+        <template #default="{ row }">
+          <el-button type="primary" link @click="handleConfirm(row)">确认回库</el-button>
+          <el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
+          <el-button type="danger" link @click="handleDelete(row)">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
+
+    <!-- 分页 -->
+    <el-pagination
+      v-model:current-page="queryParams.pageNum"
+      v-model:page-size="queryParams.pageSize"
+      :total="total"
+      layout="total, sizes, prev, pager, next, jumper"
+      @size-change="getList"
+      @current-change="getList"
+    />
+
+    <!-- 编辑弹窗 -->
+    <el-dialog v-model="dialogVisible" title="入库记录编辑">
+      <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="退还人" prop="returnBy">
+          <el-input v-model="form.returnBy" placeholder="请输入退还人姓名" />
+        </el-form-item>
+        <el-form-item label="点收人" prop="receiver">
+          <el-input v-model="form.receiver" placeholder="请输入点收人姓名" />
+        </el-form-item>
+        <el-form-item label="退还时间" prop="returnTime">
+          <el-date-picker
+            v-model="form.returnTime"
+            type="datetime"
+            placeholder="选择日期时间"
+          />
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input v-model="form.note" type="textarea" :rows="3" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="submitForm">保存</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref, computed } from 'vue';
-
-const data = ref([
-  { id: 1, name: '标本1', number: '001', location: 'A1', image: 'https://tse4-mm.cn.bing.net/th/id/OIP-C.r6v8jNnunKolS8G2Yt1PGAHaE7?rs=1&pid=ImgDetMain', returnBy: '用户A', returnTime: '2023-10-01', receiver: '管理员', note: '完好', status: '正常' },
-  { id: 2, name: '标本2', number: '002', location: 'B2', image: 'https://img.redocn.com/sheying/20180223/sanyechonghuashibiaoben_9213393.jpg', returnBy: '用户B', returnTime: '2023-10-02', receiver: '管理员', note: '轻微损坏', status: '需修复' },
-]);
-
-const searchQuery = ref('');
-
-const filteredData = computed(() => {
-  return data.value.filter(item =>
-    item.name.includes(searchQuery.value) ||
-    item.number.includes(searchQuery.value) ||
-    item.location.includes(searchQuery.value)
-  );
-});
-
-const handleReturn = (row) => {
-  console.log('入库标本:', row);
-};
+import { ref, reactive } from 'vue'
+
+const tableData = ref([
+  {
+    id: 1,
+    number: 'RT-001',
+    name: '矿石标本',
+    location: 'B区-3柜',
+    image: 'https://via.placeholder.com/50',
+    returnBy: '张三',
+    returnTime: '2024-03-01 14:30:00',
+    receiver: '李四',
+    status: '已入库',
+    note: '包装完好'
+  }
+])
+
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  name: '',
+  number: ''
+})
+
+const form = reactive({
+  id: null,
+  returnBy: '',
+  receiver: '',
+  returnTime: '',
+  note: ''
+})
+
+const rules = {
+  returnBy: [{ required: true, message: '退还人不能为空', trigger: 'blur' }],
+  receiver: [{ required: true, message: '点收人不能为空', trigger: 'blur' }]
+}
 </script>

+ 112 - 98
src/views/system/Out/iker.vue

@@ -1,120 +1,134 @@
 <template>
-  <div>
-    <!-- 搜索栏 -->
-    <el-input
-      v-model="searchQuery"
-      placeholder="输入申请人、标本名称或编号"
-      style="width: 300px; margin-bottom: 20px"
-      @input="handleSearch"
-    />
+  <div class="role-management">
+    <!-- 搜索区域 -->
+    <el-card class="search-area">
+      <el-form :inline="true">
+        <el-form-item label="角色名称">
+          <el-input v-model="searchForm.name" placeholder="请输入角色名称" />
+        </el-form-item>
+        <el-form-item label="角色标识">
+          <el-input v-model="searchForm.identifier" placeholder="请输入角色标识" />
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-select v-model="searchForm.status" placeholder="请选择状态">
+            <el-option label="全部" value="" />
+            <el-option label="开启" value="1" />
+            <el-option label="关闭" value="0" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleSearch">搜索</el-button>
+          <el-button type="success" @click="handleAdd">新增</el-button>
+          <el-button @click="handleExport">导出</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
 
-    <!-- 出库申请列表 -->
-    <el-table :data="filteredData" border>
-      <el-table-column prop="applicant" label="申请人" />
-      <el-table-column prop="requestTime" label="申请时间" />
-      <el-table-column prop="specimenName" label="标本名称" />
-      <el-table-column prop="specimenNumber" label="标本编号" />
-      <el-table-column prop="purpose" label="用途" />
-      <el-table-column prop="status" label="审核状态" />
-      <el-table-column label="操作">
+    <!-- 数据表格 -->
+    <el-table :data="filteredRoles" border style="width: 100%">
+      <el-table-column prop="id" label="角色编号" width="100" />
+      <el-table-column prop="name" label="角色名称" width="150" />
+      <el-table-column prop="type" label="角色类型" width="120" />
+      <el-table-column prop="identifier" label="角色标识" width="180" />
+      <el-table-column prop="order" label="显示顺序" width="100" />
+      <el-table-column prop="remark" label="备注" />
+      <el-table-column prop="status" label="状态" width="100">
         <template #default="{ row }">
-          <el-button type="primary" @click="handleReview(row)">审核</el-button>
+          <el-tag :type="row.status ? 'success' : 'danger'">
+            {{ row.status ? '开启' : '关闭' }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="createTime" label="创建时间" width="180" />
+      <el-table-column label="操作" width="220">
+        <template #default="{ row }">
+          <el-button link type="primary" @click="handleEdit(row)">编辑</el-button>
+          <el-button link type="primary" @click="handleMenuAuth(row)">菜单权限</el-button>
+          <el-button link type="primary" @click="handleDataAuth(row)">数据权限</el-button>
+          <el-button link type="danger" @click="handleDelete(row)">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-
-    <!-- 审核弹窗 -->
-    <el-dialog v-model="showDialog" title="审核出库申请">
-      <p>申请人: {{ selectedRecord?.applicant }}</p>
-      <p>标本名称: {{ selectedRecord?.specimenName }}</p>
-      <p>标本编号: {{ selectedRecord?.specimenNumber }}</p>
-      <p>用途: {{ selectedRecord?.purpose }}</p>
-      <el-input
-        v-if="isRejecting"
-        v-model="rejectReason"
-        placeholder="请输入驳回原因"
-        style="margin-top: 20px"
-      />
-      <template #footer>
-        <el-button @click="showDialog = false">取消</el-button>
-        <el-button type="danger" @click="handleReject">驳回</el-button>
-        <el-button type="primary" @click="handleApprove">通过</el-button>
-      </template>
-    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref, computed } from 'vue';
+import { ref, computed } from 'vue'
 
 // 模拟数据
-const data = ref([
-  {
-    id: 1,
-    applicant: '用户A',
-    requestTime: '2025-01-01',
-    specimenName: '标本1',
-    specimenNumber: '001',
-    purpose: '实验',
-    status: '待审核',
-  },
+const roles = ref([
   {
-    id: 2,
-    applicant: '用户B',
-    requestTime: '2025-01-01',
-    specimenName: '标本2',
-    specimenNumber: '002',
-    purpose: '研究',
-    status: '待审核',
+    id: 101,
+    name: '测试账号',
+    type: '自定义',
+    identifier: '测试',
+    order: 0,
+    remark: '',
+    status: 1,
+    createTime: '2021-01-06 13:49:35'
   },
-]);
+  // 其他数据...
+])
 
-// 搜索关键字
-const searchQuery = ref('');
+// 搜索表单
+const searchForm = ref({
+  name: '',
+  identifier: '',
+  status: ''
+})
 
 // 过滤后的数据
-const filteredData = computed(() => {
-  return data.value.filter(
-    (item) =>
-      item.applicant.includes(searchQuery.value) ||
-      item.specimenName.includes(searchQuery.value) ||
-      item.specimenNumber.includes(searchQuery.value)
-  );
-});
+const filteredRoles = computed(() => {
+  return roles.value.filter(role => {
+    return (
+      role.name.includes(searchForm.value.name) &&
+      role.identifier.includes(searchForm.value.identifier) &&
+      (searchForm.value.status === '' ||
+        role.status.toString() === searchForm.value.status)
+    )
+  })
+})
 
-// 审核弹窗相关状态
-const showDialog = ref(false);
-const selectedRecord = ref(null);
-const rejectReason = ref('');
-const isRejecting = ref(false);
+// 操作方法
+const handleSearch = () => {
+  // 搜索逻辑
+}
 
-// 打开审核弹窗
-const handleReview = (row) => {
-  selectedRecord.value = row;
-  showDialog.value = true;
-  isRejecting.value = false; // 重置驳回状态
-  rejectReason.value = ''; // 清空驳回原因
-};
+const handleAdd = () => {
+  // 新增逻辑
+}
 
-// 通过审核
-const handleApprove = () => {
-  selectedRecord.value.status = '已通过';
-  showDialog.value = false;
-  console.log('通过申请:', selectedRecord.value);
-};
+const handleExport = () => {
+  // 导出逻辑
+}
 
-// 驳回审核
-const handleReject = () => {
-  if (!isRejecting.value) {
-    isRejecting.value = true; // 显示驳回原因输入框
-    return;
-  }
-  if (!rejectReason.value) {
-    alert('请输入驳回原因');
-    return;
-  }
-  selectedRecord.value.status = '已驳回';
-  console.log('驳回原因:', rejectReason.value);
-  showDialog.value = false;
-};
+const handleEdit = (row) => {
+  // 编辑逻辑
+}
+
+const handleMenuAuth = (row) => {
+  // 菜单权限设置
+}
+
+const handleDataAuth = (row) => {
+  // 数据权限设置
+}
+
+const handleDelete = (row) => {
+  // 删除逻辑
+}
 </script>
+
+<style scoped>
+.search-area {
+  margin-bottom: 20px;
+}
+
+.el-form-item {
+  margin-bottom: 0;
+}
+
+.el-table {
+  margin-top: 20px;
+}
+</style>

+ 198 - 28
src/views/system/Out/index.vue

@@ -1,43 +1,213 @@
 <template>
-  <div>
-    <el-input v-model="searchQuery" placeholder="输入名称、编号或存放位置" style="width: 300px; margin-bottom: 20px" @input="handleSearch" />
-    <el-table :data="filteredData" border>
-      <el-table-column prop="name" label="名称" />
-      <el-table-column prop="number" label="编号" />
+  <div class="app-container">
+    <!-- 搜索栏 -->
+    <el-form :model="queryParams" inline>
+      <el-form-item label="名称">
+        <el-input v-model="queryParams.name" placeholder="请输入标本名称" clearable />
+      </el-form-item>
+      <el-form-item label="编号">
+        <el-input v-model="queryParams.number" placeholder="请输入标本编号" clearable />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="handleSearch">搜索</el-button>
+        <el-button @click="resetQuery">重置</el-button>
+        <el-button type="primary" @click="handleAdd">新增</el-button>
+        <el-button type="warning" @click="handleExport">导出</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 数据表格 -->
+    <el-table :data="tableData" border>
+      <el-table-column prop="number" label="编号" width="120" />
+      <el-table-column prop="name" label="名称" width="150" />
       <el-table-column prop="location" label="存放位置" />
-      <el-table-column label="图片">
+      <el-table-column label="图片" width="100">
         <template #default="{ row }">
           <el-image :src="row.image" style="width: 50px; height: 50px" />
         </template>
       </el-table-column>
-      <el-table-column label="操作">
+      <el-table-column prop="status" label="状态" width="100">
+        <template #default="{ row }">
+          <el-switch
+            v-model="row.status"
+            :active-value="1"
+            :inactive-value="0"
+            active-text="启用"
+            inactive-text="停用"
+            @change="handleStatusChange(row)"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column prop="createTime" label="创建时间" width="180" />
+      <el-table-column label="操作" width="220" fixed="right">
         <template #default="{ row }">
-          <el-button type="primary" @click="handleOutbound(row)">出库</el-button>
+          <el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
+          <el-button type="primary" link @click="handlePermission(row)">权限</el-button>
+          <el-button type="danger" link @click="handleDelete(row)">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
+
+    <!-- 分页 -->
+    <el-pagination
+      v-model:current-page="queryParams.pageNum"
+      v-model:page-size="queryParams.pageSize"
+      :total="total"
+      layout="total, sizes, prev, pager, next, jumper"
+      @size-change="getList"
+      @current-change="getList"
+    />
+
+    <!-- 新增/编辑弹窗 -->
+    <el-dialog v-model="dialogVisible" :title="dialogTitle">
+      <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="标本名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入标本名称" />
+        </el-form-item>
+        <el-form-item label="标本编号" prop="number">
+          <el-input v-model="form.number" placeholder="请输入标本编号" />
+        </el-form-item>
+        <el-form-item label="存放位置" prop="location">
+          <el-input v-model="form.location" placeholder="请输入存放位置" />
+        </el-form-item>
+        <el-form-item label="图片">
+          <el-upload
+            action="https://jsonplaceholder.typicode.com/posts/"
+            :show-file-list="false"
+            :on-success="handleUploadSuccess"
+          >
+            <el-button type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref, computed } from 'vue';
-
-const data = ref([
-  { id: 1, name: '动物标本-001', number: '001', location: ' A1-0001', image: 'https://tse4-mm.cn.bing.net/th/id/OIP-C.r6v8jNnunKolS8G2Yt1PGAHaE7?rs=1&pid=ImgDetMain' },
-  { id: 2, name: '化石标本-001', number: '001', location: ' B2-0001', image: 'https://img.redocn.com/sheying/20180223/sanyechonghuashibiaoben_9213393.jpg' },
-]);
-
-const searchQuery = ref('');
-
-const filteredData = computed(() => {
-  return data.value.filter(item =>
-    item.name.includes(searchQuery.value) ||
-    item.number.includes(searchQuery.value) ||
-    item.location.includes(searchQuery.value)
-  );
-});
-
-const handleOutbound = (row) => {
-  console.log('出库标本:', row);
-};
+import { ref, reactive } from 'vue'
+
+// 表格数据
+const tableData = ref([
+  {
+    id: 1,
+    number: 'SP-001',
+    name: '植物标本',
+    location: 'A区-1柜',
+    image: 'https://via.placeholder.com/50',
+    status: 1,
+    createTime: '2024-03-01 10:00:00'
+  }
+])
+
+// 查询参数
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  name: '',
+  number: ''
+})
+
+// 表单数据
+const form = reactive({
+  id: null,
+  name: '',
+  number: '',
+  location: '',
+  image: ''
+})
+
+// 表单验证规则
+const rules = {
+  name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
+  number: [{ required: true, message: '编号不能为空', trigger: 'blur' }]
+}
+
+// 弹窗控制
+const dialogVisible = ref(false)
+const dialogTitle = ref('')
+const formRef = ref()
+
+// 获取数据列表
+const getList = async () => {
+  // 这里调用API接口
+  console.log('获取列表数据', queryParams)
+}
+
+// 搜索
+const handleSearch = () => {
+  queryParams.pageNum = 1
+  getList()
+}
+
+// 重置查询
+const resetQuery = () => {
+  Object.assign(queryParams, {
+    pageNum: 1,
+    name: '',
+    number: ''
+  })
+  getList()
+}
+
+// 新增
+const handleAdd = () => {
+  dialogTitle.value = '新增标本'
+  Object.keys(form).forEach(key => (form[key] = ''))
+  dialogVisible.value = true
+}
+
+// 编辑
+const handleEdit = (row) => {
+  dialogTitle.value = '编辑标本'
+  Object.assign(form, row)
+  dialogVisible.value = true
+}
+
+// 删除
+const handleDelete = (row) => {
+  ElMessageBox.confirm('确认删除该记录吗?', '警告', {
+    type: 'warning'
+  }).then(() => {
+    // 调用删除API
+    console.log('删除成功')
+    getList()
+  })
+}
+
+// 状态修改
+const handleStatusChange = (row) => {
+  ElMessage.success('状态修改成功')
+  // 调用状态修改API
+}
+
+// 提交表单
+const submitForm = () => {
+  formRef.value.validate(valid => {
+    if (valid) {
+      // 调用新增/修改API
+      dialogVisible.value = false
+      ElMessage.success('操作成功')
+      getList()
+    }
+  })
+}
+
+// 文件上传
+const handleUploadSuccess = (response) => {
+  form.image = response.url // 根据实际接口调整
+}
+
+// 初始化获取数据
+getList()
 </script>
+
+<style scoped>
+.app-container {
+  padding: 20px;
+}
+</style>