Jelajahi Sumber

补全权限字符

Huanyi 3 minggu lalu
induk
melakukan
0ca4d048ca

+ 18 - 18
src/layout/components/Navbar.vue

@@ -27,21 +27,21 @@
 <!--            <svg-icon class-name="search-icon" icon-class="search" />-->
 <!--            <svg-icon class-name="search-icon" icon-class="search" />-->
 <!--          </div>-->
 <!--          </div>-->
 <!--        </el-tooltip>-->
 <!--        </el-tooltip>-->
-        <!-- 消息 -->
-        <el-tooltip :content="proxy.$t('navbar.message')" effect="dark" placement="bottom">
-          <div>
-            <el-popover placement="bottom" trigger="click" transition="el-zoom-in-top" :width="300" :persistent="false">
-              <template #reference>
-                <el-badge :value="newNotice > 0 ? newNotice : ''" :max="99">
-                  <div class="right-menu-item hover-effect" style="display: block"><svg-icon icon-class="message" /></div>
-                </el-badge>
-              </template>
-              <template #default>
-                <notice></notice>
-              </template>
-            </el-popover>
-          </div>
-        </el-tooltip>
+<!--        &lt;!&ndash; 消息 &ndash;&gt;-->
+<!--        <el-tooltip :content="proxy.$t('navbar.message')" effect="dark" placement="bottom">-->
+<!--          <div>-->
+<!--            <el-popover placement="bottom" trigger="click" transition="el-zoom-in-top" :width="300" :persistent="false">-->
+<!--              <template #reference>-->
+<!--                <el-badge :value="newNotice > 0 ? newNotice : ''" :max="99">-->
+<!--                  <div class="right-menu-item hover-effect" style="display: block"><svg-icon icon-class="message" /></div>-->
+<!--                </el-badge>-->
+<!--              </template>-->
+<!--              <template #default>-->
+<!--                <notice></notice>-->
+<!--              </template>-->
+<!--            </el-popover>-->
+<!--          </div>-->
+<!--        </el-tooltip>-->
 <!--        <el-tooltip content="Github" effect="dark" placement="bottom">-->
 <!--        <el-tooltip content="Github" effect="dark" placement="bottom">-->
 <!--          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />-->
 <!--          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />-->
 <!--        </el-tooltip>-->
 <!--        </el-tooltip>-->
@@ -70,9 +70,9 @@
           </div>
           </div>
           <template #dropdown>
           <template #dropdown>
             <el-dropdown-menu>
             <el-dropdown-menu>
-              <router-link v-if="!dynamic" to="/user/profile">
-                <el-dropdown-item>{{ proxy.$t('navbar.personalCenter') }}</el-dropdown-item>
-              </router-link>
+<!--              <router-link v-if="!dynamic" to="/user/profile">-->
+<!--                <el-dropdown-item>{{ proxy.$t('navbar.personalCenter') }}</el-dropdown-item>-->
+<!--              </router-link>-->
 <!--              <el-dropdown-item v-if="settingsStore.showSettings" command="setLayout">-->
 <!--              <el-dropdown-item v-if="settingsStore.showSettings" command="setLayout">-->
 <!--                <span>{{ proxy.$t('navbar.layoutSetting') }}</span>-->
 <!--                <span>{{ proxy.$t('navbar.layoutSetting') }}</span>-->
 <!--              </el-dropdown-item>-->
 <!--              </el-dropdown-item>-->

+ 1 - 1
src/views/archieves/customer/index.vue

@@ -85,7 +85,7 @@
               </el-button>
               </el-button>
               <template #dropdown>
               <template #dropdown>
                 <el-dropdown-menu>
                 <el-dropdown-menu>
-                  <el-dropdown-item command="remark" v-hasPermi="['archieves:customer:edit']">添加备注</el-dropdown-item>
+                  <el-dropdown-item command="remark" v-hasPermi="['archieves:customer:remark']">添加备注</el-dropdown-item>
                   <el-dropdown-item command="delete" style="color: #F56C6C" v-hasPermi="['archieves:customer:remove']">删除用户</el-dropdown-item>
                   <el-dropdown-item command="delete" style="color: #F56C6C" v-hasPermi="['archieves:customer:remove']">删除用户</el-dropdown-item>
                 </el-dropdown-menu>
                 </el-dropdown-menu>
               </template>
               </template>

+ 1 - 1
src/views/archieves/pet/index.vue

@@ -56,7 +56,7 @@
           <template #default="scope">
           <template #default="scope">
             <el-button link type="primary" @click="handleDetail(scope.row)" v-hasPermi="['archieves:pet:query']">详情</el-button>
             <el-button link type="primary" @click="handleDetail(scope.row)" v-hasPermi="['archieves:pet:query']">详情</el-button>
             <el-button link type="primary" @click="handleEdit(scope.row)" v-hasPermi="['archieves:pet:edit']">编辑</el-button>
             <el-button link type="primary" @click="handleEdit(scope.row)" v-hasPermi="['archieves:pet:edit']">编辑</el-button>
-            <el-button link type="primary" @click="handleRemark(scope.row)" v-hasPermi="['archieves:pet:edit']">备注</el-button>
+            <el-button link type="primary" @click="handleRemark(scope.row)" v-hasPermi="['archieves:pet:remark']">备注</el-button>
             <el-button link type="danger" @click="handleDelete(scope.row)" v-hasPermi="['archieves:pet:remove']">删除</el-button>
             <el-button link type="danger" @click="handleDelete(scope.row)" v-hasPermi="['archieves:pet:remove']">删除</el-button>
           </template>
           </template>
         </el-table-column>
         </el-table-column>

+ 3 - 3
src/views/login.vue

@@ -72,9 +72,9 @@
       </el-form-item>
       </el-form-item>
     </el-form>
     </el-form>
     <!--  底部  -->
     <!--  底部  -->
-    <div class="el-login-footer">
-      <span>Copyright © 2018-2026 疯狂的狮子Li All Rights Reserved.</span>
-    </div>
+<!--    <div class="el-login-footer">-->
+<!--      <span>Copyright © 2018-2026 疯狂的狮子Li All Rights Reserved.</span>-->
+<!--    </div>-->
   </div>
   </div>
 </template>
 </template>
 
 

+ 1 - 1
src/views/merchant/brand/index.vue

@@ -45,7 +45,7 @@
 <!--        </el-form-item>-->
 <!--        </el-form-item>-->
 
 
         <el-form-item>
         <el-form-item>
-          <el-button type="primary" @click="handleSave">保存修改</el-button>
+          <el-button v-hasPermi="['merchant:brand:save']" type="primary" @click="handleSave">保存修改</el-button>
         </el-form-item>
         </el-form-item>
       </el-form>
       </el-form>
     </el-card>
     </el-card>

+ 331 - 114
src/views/merchant/storeManagement/index.vue

@@ -1,133 +1,151 @@
 <template>
 <template>
-  <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
-                :leave-active-class="proxy?.animate.searchAnimate.leave">
-      <div v-show="showSearch" class="mb-[10px] bg-white p-[20px] rounded-[4px] flex justify-between items-center shadow-sm" style="background-color: #fff; padding: 20px; border-radius: 4px; box-shadow: 0 1px 4px rgba(0,21,41,.08);">
-        <div class="text-[18px] font-bold text-[#303133]" style="font-size: 18px; font-weight: bold; color: #303133;">门店管理</div>
-        <div class="flex items-center gap-[10px]" style="display: flex; gap: 10px; align-items: center;">
-          <el-input v-model="queryParams.storeOrContact" placeholder="搜索门店名称/联系人" prefix-icon="Search"
-                    style="width: 250px" clearable @keyup.enter="handleQuery" @clear="handleQuery" />
-          <el-cascader v-model="searchRegionValue" :options="areaOptions" placeholder="所属城市"
-                       style="width: 150px" clearable @change="handleSearchAreaChange" />
-          <el-select v-model="queryParams.station" placeholder="所属站点" style="width: 150px" clearable @change="handleQuery">
-            <el-option v-for="site in searchSiteOptions" :key="site.value" :label="site.label" :value="site.value" />
-          </el-select>
-          <el-select v-model="queryParams.status" placeholder="状态" style="width: 120px" clearable @change="handleQuery">
-            <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
-          </el-select>
-          <el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['system:store:add']">新增门店</el-button>
-        </div>
+  <div class="page-container">
+    <!-- 顶部搜索区域 -->
+    <div class="search-header-flex mb-4">
+      <div class="page-title">门店管理</div>
+      <div class="search-actions">
+        <el-input v-model="queryParams.storeOrContact" placeholder="搜索门店名称/联系人" prefix-icon="Search"
+                  class="search-input" clearable @keyup.enter="handleQuery" @clear="handleQuery" />
+        <el-cascader v-model="searchRegionValue" :options="areaOptions" placeholder="所属城市"
+                     class="filter-cascader" clearable @change="handleSearchAreaChange" />
+        <el-select v-model="queryParams.station" placeholder="所属站点" class="filter-select" clearable @change="handleQuery">
+          <el-option v-for="site in searchSiteOptions" :key="site.value" :label="site.label" :value="site.value" />
+        </el-select>
+        <el-select v-model="queryParams.status" placeholder="状态" class="filter-select-mini" clearable @change="handleQuery">
+          <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
+        </el-select>
+        <el-button type="primary" class="add-btn" icon="Plus" @click="handleAdd" v-hasPermi="['merchant:storeManagement:add']">新增门店</el-button>
       </div>
       </div>
-    </transition>
-
-    <el-card shadow="never">
+    </div>
 
 
-      <el-table v-loading="loading" border :data="storeList" @selection-change="handleSelectionChange">
+    <!-- 表格区域 -->
+    <div class="table-card">
+      <el-table v-loading="loading" :data="storeList" @selection-change="handleSelectionChange" class="custom-table" :header-cell-style="{ background: '#f8f9fb', color: '#606266', fontWeight: '600' }">
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="门店信息" align="left" width="300">
+        
+        <!-- 门店信息 -->
+        <el-table-column label="门店信息" align="left" width="280">
           <template #default="scope">
           <template #default="scope">
-            <div class="store-info" style="display: flex; align-items: center; gap: 10px;">
-              <div class="store-logo">
-                <image-preview :src="scope.row.logoUrl" :width="50" :height="50" />
+            <div class="store-info-box">
+              <div class="store-logo-wrap">
+                <el-image :src="scope.row.logoUrl" class="store-logo-img" fit="cover">
+                  <template #error>
+                    <div class="image-slot"><el-icon><Picture /></el-icon></div>
+                  </template>
+                </el-image>
               </div>
               </div>
-              <div class="store-details" style="display: flex; flex-direction: column; gap: 6px;">
-                <div class="store-name" style="font-size: 14px; font-weight: 500; color: #303133;">{{ scope.row.name }}</div>
-                <div class="store-categories" style="display: flex; gap: 6px;">
-                  <el-tag size="small" type="warning" effect="plain" v-if="scope.row.tenantName">{{ scope.row.tenantName }}</el-tag>
-                  <el-tag size="small" type="success" effect="plain" v-if="scope.row.tenantCatergoriesName">{{ scope.row.tenantCatergoriesName }}</el-tag>
+              <div class="store-text-details">
+                <div class="store-name-title">{{ scope.row.name }}</div>
+                <div class="store-tag-row">
+                  <span class="tag-brand" v-if="scope.row.tenantName">{{ scope.row.tenantName }}</span>
+                  <span class="tag-category" v-if="scope.row.tenantCatergoriesName">{{ scope.row.tenantCatergoriesName }}</span>
                 </div>
                 </div>
               </div>
               </div>
             </div>
             </div>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
-        <el-table-column label="资质认证" align="center" width="100">
-          <template #default="scope">
-            <image-preview v-if="scope.row.businessLicenseUrl" :src="scope.row.businessLicenseUrl" :width="40" :height="40" />
-            <span v-else>-</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="服务项目" align="center" width="200">
+
+        <!-- 服务项目 -->
+        <el-table-column label="服务项目" align="left" width="220">
           <template #default="scope">
           <template #default="scope">
-            <div class="services">
-              <el-tag v-for="service in scope.row.services" :key="service" size="small"
-                      style="margin-right: 5px; margin-bottom: 5px">
+            <div class="service-tags-container">
+              <span v-for="service in scope.row.services" :key="service" class="service-item-tag">
                 {{ getServiceName(service) }}
                 {{ getServiceName(service) }}
-              </el-tag>
+              </span>
             </div>
             </div>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
-        <el-table-column label="归属站点" align="center" width="150">
+
+        <!-- 资质认证 -->
+        <el-table-column label="资质认证" align="center" width="100">
           <template #default="scope">
           <template #default="scope">
-            <div>{{ scope.row.siteName }}</div>
+            <div class="auth-img-wrap">
+              <el-image v-if="scope.row.businessLicenseUrl" :src="scope.row.businessLicenseUrl" class="auth-img" :preview-src-list="[scope.row.businessLicenseUrl]" preview-teleported />
+              <span v-else class="text-placeholder">-</span>
+            </div>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
-        <el-table-column label="服务单" align="center" width="150">
+
+        <!-- 归属区域/站点 -->
+        <el-table-column label="归属区域/站点" align="left" width="180">
           <template #default="scope">
           <template #default="scope">
-            <div>{{ scope.row.serviceOrder }}</div>
+            <div class="location-info">
+              <div class="area-name">{{ scope.row.regionName || '未知区域' }}</div>
+              <div class="station-name">
+                <el-icon class="loc-icon"><Location /></el-icon>
+                <span>{{ scope.row.siteName }}</span>
+              </div>
+            </div>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
-        <el-table-column label="营业时间" align="center" width="150">
+
+        <!-- 服务单 -->
+        <el-table-column label="服务单" align="center" width="100">
           <template #default="scope">
           <template #default="scope">
-            <div>{{ formatTime(scope.row.startBusinessTime) }}-{{ formatTime(scope.row.endBusinessTime) }}</div>
+            <span class="order-count">{{ scope.row.serviceOrder || 0 }}</span>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
-        <el-table-column label="门店地址" align="center" width="300">
+
+        <!-- 营业时间 -->
+        <el-table-column label="营业时间" align="center" width="160">
           <template #default="scope">
           <template #default="scope">
-            <div>{{ scope.row.detailAddress }}</div>
+            <div class="business-time-text">
+              {{ formatTime(scope.row.startBusinessTime) }},{{ formatTime(scope.row.endBusinessTime) }}
+            </div>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
-        <el-table-column label="联系方式" align="left" width="180">
+
+        <!-- 联系方式 -->
+        <el-table-column label="联系方式" align="left" width="200">
           <template #default="scope">
           <template #default="scope">
-            <div style="display: flex; flex-direction: column; gap: 6px;">
-              <div style="display: flex; align-items: center; gap: 6px; color: #606266; font-size: 14px;">
-                <el-icon size="16"><User /></el-icon>
+            <div class="contact-card">
+              <div class="contact-person">
+                <el-icon><User /></el-icon>
                 <span>{{ scope.row.contact }}</span>
                 <span>{{ scope.row.contact }}</span>
               </div>
               </div>
-              <div style="display: flex; align-items: center; gap: 6px; color: #409eff; font-size: 14px;">
-                <el-icon size="16"><Phone /></el-icon>
-                <span>{{ scope.row.contactNumber }}</span>
+              <div class="contact-phone">
+                <el-icon><Phone /></el-icon>
+                <span class="phone-link">{{ scope.row.contactNumber }}</span>
               </div>
               </div>
             </div>
             </div>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
-        <el-table-column label="有效期至" align="center" width="120">
-          <template #default="scope">
-            <div>{{ parseTime(scope.row.validity, '{y}-{m}-{d}') }}</div>
-          </template>
-        </el-table-column>
-        <el-table-column label="状态" align="center" width="100">
+
+        <!-- 门店地址 -->
+        <el-table-column label="门店地址" align="left" min-width="250">
           <template #default="scope">
           <template #default="scope">
-            <template v-for="item in statusList" :key="item.value">
-              <el-tag v-if="scope.row.status === item.value" :type="item.style">{{ item.label }}</el-tag>
-            </template>
+            <div class="address-text" :title="scope.row.detailAddress">{{ scope.row.detailAddress }}</div>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
-        <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
+
+        <!-- 操作 -->
+        <el-table-column label="操作" align="center" width="180" fixed="right">
           <template #default="scope">
           <template #default="scope">
-            <el-tooltip content="详情" placement="top">
-              <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
-                         v-hasPermi="['system:store:edit']"></el-button>
-            </el-tooltip>
-            <el-dropdown trigger="click" @command="(cmd: string) => handleCommand(cmd, scope.row)">
-              <el-button link type="primary" icon="More" style="margin-left: 10px"></el-button>
-              <template #dropdown>
-                <el-dropdown-menu>
-                  <el-dropdown-item command="renew" icon="Clock">续期</el-dropdown-item>
-                  <el-dropdown-item v-if="scope.row.status === 1" command="ban" icon="CircleClose">禁用</el-dropdown-item>
-                  <el-dropdown-item v-if="scope.row.status === 3" command="enable" icon="CircleCheck">启用</el-dropdown-item>
-                </el-dropdown-menu>
-              </template>
-            </el-dropdown>
+            <div class="operation-links">
+              <el-button v-hasPermi="['merchant:storeManagement:query']" link type="primary" @click="handleDetail(scope.row)">详情</el-button>
+              <el-button v-hasPermi="['merchant:storeManagement:edit']" link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
+              <el-dropdown trigger="hover" @command="(cmd: string) => handleCommand(cmd, scope.row)">
+                <span class="more-link">
+                  更多 <el-icon><ArrowDown /></el-icon>
+                </span>
+                <template #dropdown>
+                  <el-dropdown-menu>
+                    <el-dropdown-item v-hasPermi="['merchant:storeManagement:renew']" command="renew">续期</el-dropdown-item>
+                    <el-dropdown-item v-if="scope.row.status === 1" v-hasPermi="['merchant:storeManagement:disable']" command="ban">禁用</el-dropdown-item>
+                    <el-dropdown-item v-if="scope.row.status === 3" v-hasPermi="['merchant:storeManagement:enable']" command="enable">启用</el-dropdown-item>
+                  </el-dropdown-menu>
+                </template>
+              </el-dropdown>
+            </div>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
       </el-table>
       </el-table>
 
 
-      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+      <div class="pagination-footer">
+        <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
                   v-model:limit="queryParams.pageSize" @pagination="getList" />
                   v-model:limit="queryParams.pageSize" @pagination="getList" />
-    </el-card>
+      </div>
+    </div>
     <!-- 添加或修改门店管理对话框 -->
     <!-- 添加或修改门店管理对话框 -->
     <el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body>
     <el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body>
       <el-form ref="storeFormRef" :model="form" :rules="rules" label-width="120px">
       <el-form ref="storeFormRef" :model="form" :rules="rules" label-width="120px">
@@ -960,58 +978,257 @@ onMounted(() => {
 </script>
 </script>
 
 
 <style scoped>
 <style scoped>
-.brand-pagination {
-  margin-top: 10px;
-  padding-top: 10px;
-  border-top: 1px solid #ebeef5;
-  text-align: center;
+.page-container {
+  padding: 20px;
+  background-color: #f5f7fa;
+  min-height: calc(100vh - 84px);
 }
 }
 
 
-.custom-pagination {
+/* 顶部搜索栏 */
+.search-header-flex {
   display: flex;
   display: flex;
+  justify-content: space-between;
   align-items: center;
   align-items: center;
-  justify-content: center;
-  gap: 10px;
+  background-color: #fff;
+  padding: 16px 24px;
+  border-radius: 8px;
+  box-shadow: 0 1px 4px rgba(0,21,41,.04);
+}
+
+.page-title {
+  font-size: 18px;
+  font-weight: 600;
+  color: #303133;
+}
+
+.search-actions {
+  display: flex;
+  gap: 12px;
+  align-items: center;
+}
+
+.search-input {
+  width: 240px;
+}
+
+.filter-cascader, .filter-select {
+  width: 150px;
+}
+
+.filter-select-mini {
+  width: 100px;
+}
+
+.add-btn {
+  background-color: #409eff;
+  border-color: #409eff;
+  padding: 8px 20px;
+  font-weight: 500;
+  border-radius: 6px;
+}
+
+/* 表格卡片 */
+.table-card {
+  background-color: #fff;
+  border-radius: 8px;
+  padding: 10px;
+  box-shadow: 0 1px 4px rgba(0,21,41,.04);
+}
+
+.custom-table {
+  width: 100%;
+}
+
+/* 门店信息列 */
+.store-info-box {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+}
+
+.store-logo-wrap {
+  width: 48px;
+  height: 48px;
+  border-radius: 6px;
+  overflow: hidden;
+  border: 1px solid #f0f0f0;
+  flex-shrink: 0;
+}
+
+.store-logo-img {
+  width: 100%;
+  height: 100%;
+}
+
+.store-text-details {
+  display: flex;
+  flex-direction: column;
+  gap: 4px;
+}
+
+.store-name-title {
   font-size: 14px;
   font-size: 14px;
+  font-weight: 600;
+  color: #303133;
 }
 }
 
 
-.page-arrow {
-  cursor: pointer;
-  color: #606266;
-  user-select: none;
-  padding: 2px 8px;
-  transition: color 0.3s;
+.store-tag-row {
+  display: flex;
+  gap: 6px;
+}
+
+.tag-brand {
+  font-size: 11px;
+  color: #e6a23c;
+  background-color: #fdf6ec;
+  padding: 1px 6px;
+  border-radius: 4px;
+}
+
+.tag-category {
+  font-size: 11px;
+  color: #67c23a;
+  background-color: #f0f9eb;
+  padding: 1px 6px;
+  border-radius: 4px;
+}
+
+/* 服务项目列 */
+.service-tags-container {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 6px;
 }
 }
 
 
-.page-arrow:hover:not(.disabled) {
+.service-item-tag {
+  font-size: 12px;
   color: #409eff;
   color: #409eff;
+  background-color: #ecf5ff;
+  padding: 2px 8px;
+  border-radius: 4px;
 }
 }
 
 
-.page-arrow.disabled {
-  color: #c0c4cc;
-  cursor: not-allowed;
+/* 资质列 */
+.auth-img-wrap {
+  display: flex;
+  justify-content: center;
+  align-items: center;
 }
 }
 
 
-.page-number {
+.auth-img {
+  width: 40px;
+  height: 40px;
+  border-radius: 4px;
+  border: 1px solid #f0f0f0;
   cursor: pointer;
   cursor: pointer;
+}
+
+.text-placeholder {
+  color: #c0c4cc;
+}
+
+/* 区域/站点列 */
+.location-info {
+  display: flex;
+  flex-direction: column;
+  gap: 4px;
+}
+
+.area-name {
+  font-size: 13px;
+  color: #303133;
+}
+
+.station-name {
+  display: flex;
+  align-items: center;
+  gap: 4px;
+  font-size: 12px;
+  color: #909399;
+}
+
+.loc-icon {
+  font-size: 14px;
+}
+
+/* 服务单列 */
+.order-count {
+  font-size: 14px;
+  color: #606266;
+  font-weight: 500;
+}
+
+/* 营业时间列 */
+.business-time-text {
+  font-size: 13px;
+  color: #606266;
+}
+
+/* 联系方式列 */
+.contact-card {
+  display: flex;
+  flex-direction: column;
+  gap: 6px;
+}
+
+.contact-person, .contact-phone {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  font-size: 13px;
   color: #606266;
   color: #606266;
-  padding: 2px 8px;
-  transition: all 0.3s;
 }
 }
 
 
-.page-number:hover {
+.phone-link {
   color: #409eff;
   color: #409eff;
+  font-weight: 500;
+}
+
+/* 门店地址列 */
+.address-text {
+  font-size: 13px;
+  color: #606266;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+/* 操作列 */
+.operation-links {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  gap: 12px;
 }
 }
 
 
-.page-number.active {
+.more-link {
   color: #409eff;
   color: #409eff;
-  font-weight: bold;
+  cursor: pointer;
+  font-size: 14px;
+  display: flex;
+  align-items: center;
+  gap: 4px;
 }
 }
 
 
-.total-text {
-  margin-left: 15px;
-  font-size: 12px;
-  color: #909399;
+.more-link:hover {
+  text-decoration: underline;
+}
+
+/* 分页 */
+.pagination-footer {
+  margin-top: 20px;
+  display: flex;
+  justify-content: flex-end;
+}
+
+.image-slot {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  background: #f5f7fa;
+  color: #a8abb2;
 }
 }
 </style>
 </style>
 
 

+ 4 - 4
src/views/order/management/components/OrderDetailDrawer.vue

@@ -22,7 +22,7 @@
 <!--                        </template>-->
 <!--                        </template>-->
 
 
                         <template v-if="order.status === 0">
                         <template v-if="order.status === 0">
-                            <el-button type="danger" plain icon="CircleClose"
+                            <el-button v-hasPermi="['order:management:cancel']" type="danger" plain icon="CircleClose"
                                 @click="emit('cancel', order)">取消订单</el-button>
                                 @click="emit('cancel', order)">取消订单</el-button>
                         </template>
                         </template>
 
 
@@ -32,7 +32,7 @@
                         </template>
                         </template>
 
 
                         <template v-if="[3, 4].includes(order.status)">
                         <template v-if="[3, 4].includes(order.status)">
-                            <el-button icon="Notebook" @click="emit('care-summary', order)">护理小结</el-button>
+                            <el-button v-hasPermi="['order:management:nursingSummary']" icon="Notebook" @click="emit('care-summary', order)">护理小结</el-button>
                         </template>
                         </template>
 
 
                         <el-dropdown trigger="click" @command="(cmd) => emit('command', cmd, order)"
                         <el-dropdown trigger="click" @command="(cmd) => emit('command', cmd, order)"
@@ -40,8 +40,8 @@
                             <el-button icon="More">更多操作</el-button>
                             <el-button icon="More">更多操作</el-button>
                             <template #dropdown>
                             <template #dropdown>
                                 <el-dropdown-menu>
                                 <el-dropdown-menu>
-                                    <el-dropdown-item command="reward" icon="Trophy">奖惩操作</el-dropdown-item>
-                                    <el-dropdown-item command="remark" icon="EditPen">订单备注</el-dropdown-item>
+                                    <el-dropdown-item v-hasPermi="['order:management:reward']" command="reward" icon="Trophy">奖惩操作</el-dropdown-item>
+                                    <el-dropdown-item v-hasPermi="['order:management:remark']" command="remark" icon="EditPen">订单备注</el-dropdown-item>
                                     <el-dropdown-item command="delete" v-if="[5, 4].includes(order.status)" divided
                                     <el-dropdown-item command="delete" v-if="[5, 4].includes(order.status)" divided
                                         icon="Delete" style="color: #f56c6c;">删除订单</el-dropdown-item>
                                         icon="Delete" style="color: #f56c6c;">删除订单</el-dropdown-item>
                                 </el-dropdown-menu>
                                 </el-dropdown-menu>

+ 4 - 4
src/views/order/management/index.vue

@@ -131,10 +131,10 @@
                 </span>
                 </span>
                 <template #dropdown>
                 <template #dropdown>
                   <el-dropdown-menu>
                   <el-dropdown-menu>
-                    <el-dropdown-item v-if="row.status === 3" command="complete">确认完成</el-dropdown-item>
-                    <el-dropdown-item v-if="row.status === 4 && getServiceMode(row.service) == 0" command="care_summary">护理小结</el-dropdown-item>
-                    <el-dropdown-item command="reward">奖惩</el-dropdown-item>
-                    <el-dropdown-item command="remark">备注</el-dropdown-item>
+<!--                    <el-dropdown-item v-if="row.status === 3" command="complete">确认完成</el-dropdown-item>-->
+                    <el-dropdown-item v-if="row.status === 4 && getServiceMode(row.service) == 0" command="care_summary" v-hasPermi="['order:management:nursingSummary']">护理小结</el-dropdown-item>
+                    <el-dropdown-item command="reward" v-hasPermi="['order:management:reward']">奖惩</el-dropdown-item>
+                    <el-dropdown-item command="remark" v-hasPermi="['order:management:remark']">备注</el-dropdown-item>
                   </el-dropdown-menu>
                   </el-dropdown-menu>
                 </template>
                 </template>
               </el-dropdown>
               </el-dropdown>

+ 3 - 3
src/views/order/purchase/index.vue

@@ -36,7 +36,7 @@
                     <template #label>
                     <template #label>
                       <div style="display: flex; justify-content: space-between; align-items: center; width: 100%; height: 24px">
                       <div style="display: flex; justify-content: space-between; align-items: center; width: 100%; height: 24px">
                         <span>宠主用户</span>
                         <span>宠主用户</span>
-                        <el-button type="primary" plain size="small" @click="openAddUser" icon="Plus" style="margin-left: 15px">添加用户</el-button>
+                        <el-button v-hasPermi="['order:purchase:addCustomer']" type="primary" plain size="small" @click="openAddUser" icon="Plus" style="margin-left: 15px">添加用户</el-button>
                       </div>
                       </div>
                     </template>
                     </template>
                     <PageSelect
                     <PageSelect
@@ -71,7 +71,7 @@
                   </div>
                   </div>
 
 
                   <!-- Add Button Card (Last Item in Grid) -->
                   <!-- Add Button Card (Last Item in Grid) -->
-                  <div class="pet-card add-card" @click="openAddPet">
+                  <div v-hasPermi="['order:purchase:addPet']" class="pet-card add-card" @click="openAddPet">
                     <el-icon :size="24">
                     <el-icon :size="24">
                       <Plus />
                       <Plus />
                     </el-icon>
                     </el-icon>
@@ -190,7 +190,7 @@
           </div>
           </div>
 
 
           <div class="summary-footer">
           <div class="summary-footer">
-            <el-button type="primary" size="large" class="submit-btn" :disabled="!canSubmit" @click="handleSubmit"> 立即下单 </el-button>
+            <el-button v-hasPermi="['order:purchase:create']" type="primary" size="large" class="submit-btn" :disabled="!canSubmit" @click="handleSubmit"> 立即下单 </el-button>
           </div>
           </div>
         </div>
         </div>
       </div>
       </div>

+ 3 - 3
src/views/register.vue

@@ -66,9 +66,9 @@
       </el-form-item>
       </el-form-item>
     </el-form>
     </el-form>
     <!--  底部  -->
     <!--  底部  -->
-    <div class="el-register-footer">
-      <span>Copyright © 2018-2026 疯狂的狮子Li All Rights Reserved.</span>
-    </div>
+<!--    <div class="el-register-footer">-->
+<!--      <span>Copyright © 2018-2026 疯狂的狮子Li All Rights Reserved.</span>-->
+<!--    </div>-->
   </div>
   </div>
 </template>
 </template>
 
 

+ 2 - 2
src/views/system/role/index.vue

@@ -40,14 +40,14 @@
         </el-table-column>
         </el-table-column>
         <el-table-column label="状态" align="center" width="100">
         <el-table-column label="状态" align="center" width="100">
           <template #default="scope">
           <template #default="scope">
-            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)" style="--el-switch-on-color: #f3d19e; --el-switch-off-color: #dcdfe6"></el-switch>
+            <el-switch :disabled="!proxy?.$auth.hasPermi('system:role:changeStatus')" v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)" style="--el-switch-on-color: #f3d19e; --el-switch-off-color: #dcdfe6"></el-switch>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
         <el-table-column label="操作" width="250" align="left">
         <el-table-column label="操作" width="250" align="left">
           <template #default="scope">
           <template #default="scope">
             <div style="display: flex; gap: 15px;" v-if="scope.row.roleId !== 1">
             <div style="display: flex; gap: 15px;" v-if="scope.row.roleId !== 1">
               <el-button link style="color: #e6a23c; padding: 0;" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']">编辑</el-button>
               <el-button link style="color: #e6a23c; padding: 0;" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']">编辑</el-button>
-              <el-button link style="color: #67c23a; padding: 0;" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']">分配权限</el-button>
+              <el-button link style="color: #67c23a; padding: 0;" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:auth']">分配权限</el-button>
               <el-button link style="color: #f56c6c; padding: 0;" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']">删除</el-button>
               <el-button link style="color: #f56c6c; padding: 0;" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']">删除</el-button>
             </div>
             </div>
             <div v-else>
             <div v-else>

+ 7 - 7
src/views/system/user/index.vue

@@ -63,15 +63,15 @@
           <template #header>
           <template #header>
             <el-row :gutter="10">
             <el-row :gutter="10">
               <el-col :span="1.5">
               <el-col :span="1.5">
-                <el-button v-has-permi="['system:user:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
+                <el-button v-has-permi="['system:account:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
               </el-col>
               </el-col>
               <el-col :span="1.5">
               <el-col :span="1.5">
-                <el-button v-has-permi="['system:user:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">
+                <el-button v-has-permi="['system:account:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">
                   修改
                   修改
                 </el-button>
                 </el-button>
               </el-col>
               </el-col>
               <el-col :span="1.5">
               <el-col :span="1.5">
-                <el-button v-has-permi="['system:user:remove']" type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()">
+                <el-button v-has-permi="['system:account:remove']" type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()">
                   删除
                   删除
                 </el-button>
                 </el-button>
               </el-col>
               </el-col>
@@ -117,18 +117,18 @@
             <el-table-column label="操作" fixed="right" width="180" class-name="small-padding fixed-width">
             <el-table-column label="操作" fixed="right" width="180" class-name="small-padding fixed-width">
               <template #default="scope">
               <template #default="scope">
                 <el-tooltip v-if="scope.row.userId !== 1" content="修改" placement="top">
                 <el-tooltip v-if="scope.row.userId !== 1" content="修改" placement="top">
-                  <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
+                  <el-button v-hasPermi="['system:account:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
                 </el-tooltip>
                 </el-tooltip>
                 <el-tooltip v-if="scope.row.userId !== 1" content="删除" placement="top">
                 <el-tooltip v-if="scope.row.userId !== 1" content="删除" placement="top">
-                  <el-button v-hasPermi="['system:user:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
+                  <el-button v-hasPermi="['system:account:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
                 </el-tooltip>
                 </el-tooltip>
 
 
                 <el-tooltip v-if="scope.row.userId !== 1" content="重置密码" placement="top">
                 <el-tooltip v-if="scope.row.userId !== 1" content="重置密码" placement="top">
-                  <el-button v-hasPermi="['system:user:resetPwd']" link type="primary" icon="Key" @click="handleResetPwd(scope.row)"></el-button>
+                  <el-button v-hasPermi="['system:account:resetPassword']" link type="primary" icon="Key" @click="handleResetPwd(scope.row)"></el-button>
                 </el-tooltip>
                 </el-tooltip>
 
 
                 <el-tooltip v-if="scope.row.userId !== 1" content="分配角色" placement="top">
                 <el-tooltip v-if="scope.row.userId !== 1" content="分配角色" placement="top">
-                  <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"></el-button>
+                  <el-button v-hasPermi="['system:account:edit']" link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"></el-button>
                 </el-tooltip>
                 </el-tooltip>
               </template>
               </template>
             </el-table-column>
             </el-table-column>