Selaa lähdekoodia

Merge branch 'sit' into dev

xiaodai2017 2 vuotta sitten
vanhempi
commit
3bc2f6d243

+ 4 - 2
src/api/routes.ts

@@ -1,7 +1,9 @@
 import { http } from "../utils/http";
 import { loadEnv } from "@build/index";
-const { VITE_PROXY_DOMAIN_REAL } = loadEnv();
+
+const { VITE_PROXY_DOMAIN_REAL, VITE_PROXY_USER_REAL } = loadEnv();
 const userAPi = VITE_PROXY_DOMAIN_REAL;
+const yewuApi = VITE_PROXY_USER_REAL + "/admin/";
 export const getAsyncRoutes = (data: object) => {
-  return http.request("post", `${userAPi}/Admin/menu`, { data });
+  return http.request("post", `${yewuApi}menu`, { data });
 };

+ 30 - 0
src/api/system/updates/index.ts

@@ -0,0 +1,30 @@
+import { http } from "/@/utils/http";
+import { loadEnv } from "@build/index";
+const { VITE_PROXY_DOMAIN_REAL, VITE_PROXY_USER_REAL } = loadEnv();
+const userAPi = VITE_PROXY_DOMAIN_REAL;
+const yewuApi = VITE_PROXY_USER_REAL + "/admin/";
+interface ResponseType extends Promise<any> {
+  data?: object;
+  code?: number;
+  msg?: string;
+}
+// 菜单列表
+export const httpAdd = (data: object): ResponseType => {
+  return http.request("post", `${yewuApi}menuadd`, { data });
+};
+// 菜单列表
+export const httpList = (data: object): ResponseType => {
+  return http.request("post", `${yewuApi}supplierlist`, { data });
+};
+// 菜单更新
+export const httpUpdate = (data: object): ResponseType => {
+  return http.request("post", `${yewuApi}menusave`, { data });
+};
+// 菜单状态
+export const httpStatus = (data: object): ResponseType => {
+  return http.request("post", `${yewuApi}menustatus`, { data });
+};
+// 菜单删除
+export const httpDelete = (data: object): ResponseType => {
+  return http.request("post", `${yewuApi}menudel`, { data });
+};

+ 3 - 2
src/api/user.ts

@@ -1,7 +1,8 @@
 import { http } from "../utils/http";
 import { loadEnv } from "@build/index";
-const { VITE_PROXY_DOMAIN_REAL } = loadEnv();
+const { VITE_PROXY_DOMAIN_REAL, VITE_PROXY_USER_REAL } = loadEnv();
 const userAPi = VITE_PROXY_DOMAIN_REAL;
+const yewuApi = VITE_PROXY_USER_REAL + "/admin/";
 interface userType extends Promise<any> {
   svg?: string;
   code?: number;
@@ -19,7 +20,7 @@ export const getLogin = (data: object) => {
 };
 // 获取当前账号菜单数据
 export const getMenuList = (data: object) => {
-  return http.request("post", `${userAPi}/Admin/menu`, { data });
+  return http.request("post", `${yewuApi}/Admin/menu`, { data });
 };
 
 // 刷新token

+ 0 - 2
src/views/interest/role/index.vue

@@ -37,8 +37,6 @@ const pagination = reactive<PaginationProps>({
   currentPage: 1,
   background: true
 });
-//重置密码
-
 //修改状态
 const handleStatus = async row => {
   const { id, status } = row;

+ 26 - 82
src/views/system/updates/columns.tsx

@@ -1,11 +1,7 @@
 import { ref } from "vue";
 import dayjs from "dayjs";
-import { ElMessageBox } from "element-plus";
-import { Switch, message } from "@pureadmin/components";
-
+import { statusList, levelList } from "/@/utils/status";
 export function useColumns() {
-  const switchLoadMap = ref({});
-
   const columns = ref([
     {
       type: "selection",
@@ -18,60 +14,48 @@ export function useColumns() {
       width: 70,
       hide: ({ checkList }) => !checkList.includes("序号列")
     },
+
     {
-      label: "用户编号",
-      prop: "id"
-    },
-    {
-      label: "用户名称",
-      prop: "username"
-    },
-    {
-      label: "用户昵称",
-      prop: "nickname"
+      label: "角色名称",
+      prop: "role_name"
     },
     {
-      label: "性别",
-      prop: "sex",
+      label: "等级",
+      prop: "level",
       cellRenderer: ({ row, props }) => (
         <el-tag
           size={props.size}
-          type={row.sex === 1 ? "danger" : ""}
+          type={
+            (levelList.find(item => item.value == row.level + "") || {}).type ||
+            "info"
+          }
           effect="plain"
         >
-          {row.sex === 1 ? "女" : "男"}
+          {(levelList.find(item => item.value == row.level + "") || {}).label ||
+            "--"}
         </el-tag>
       )
     },
-    {
-      label: "部门",
-      prop: "dept",
-      formatter: ({ dept }) => dept.name
-    },
-    {
-      label: "手机号码",
-      prop: "mobile"
-    },
     {
       label: "状态",
       prop: "status",
-      width: 130,
-      cellRenderer: scope => (
-        <Switch
-          size={scope.props.size === "small" ? "small" : "default"}
-          loading={switchLoadMap.value[scope.index]?.loading}
-          v-model:checked={scope.row.status}
-          checkedValue={1}
-          unCheckedValue={0}
-          checked-children="已开启"
-          un-checked-children="已关闭"
-          onChange={() => onChange(scope)}
-        />
+      cellRenderer: ({ row, props }) => (
+        <el-tag
+          size={props.size}
+          type={
+            (statusList.find(item => item.value == row.status + "") || {})
+              .type || "info"
+          }
+          effect="plain"
+        >
+          {(statusList.find(item => item.value == row.status + "") || {})
+            .label || "--"}
+        </el-tag>
       )
     },
+
     {
       label: "创建时间",
-      width: 180,
       prop: "createTime",
       formatter: ({ createTime }) =>
         dayjs(createTime).format("YYYY-MM-DD HH:mm:ss")
@@ -79,51 +63,11 @@ export function useColumns() {
     {
       label: "操作",
       fixed: "right",
-      width: 180,
+      width: 145,
       slot: "operation"
     }
   ]);
 
-  function onChange({ row, index }) {
-    ElMessageBox.confirm(
-      `确认要<strong>${
-        row.status === 0 ? "停用" : "启用"
-      }</strong><strong style='color:var(--el-color-primary)'>${
-        row.username
-      }</strong>用户吗?`,
-      "系统提示",
-      {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-        dangerouslyUseHTMLString: true,
-        draggable: true
-      }
-    )
-      .then(() => {
-        switchLoadMap.value[index] = Object.assign(
-          {},
-          switchLoadMap.value[index],
-          {
-            loading: true
-          }
-        );
-        setTimeout(() => {
-          switchLoadMap.value[index] = Object.assign(
-            {},
-            switchLoadMap.value[index],
-            {
-              loading: false
-            }
-          );
-          message.success("已成功修改用户状态");
-        }, 300);
-      })
-      .catch(() => {
-        row.status === 0 ? (row.status = 1) : (row.status = 0);
-      });
-  }
-
   return {
     columns
   };

+ 168 - 162
src/views/system/updates/index.vue

@@ -1,49 +1,65 @@
 <script setup lang="ts">
-import tree from "./tree.vue";
 import { useColumns } from "./columns";
-import { getUserList } from "/@/api/system";
+import { httpList, httpStatus } from "/@/api/system/updates";
 import { reactive, ref, onMounted } from "vue";
 import { type FormInstance } from "element-plus";
+import { ElMessage } from "element-plus";
 import { TableProBar } from "/@/components/ReTable";
 import { type PaginationProps } from "@pureadmin/table";
 import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
-
+import { useNav } from "/@/layout/hooks/nav";
+import { statusList } from "/@/utils/status";
+const { logout } = useNav();
 defineOptions({
-  name: "User"
+  name: "role"
 });
 
 const form = reactive({
-  username: "",
-  mobile: "",
-  status: ""
+  name: "",
+  page: 1,
+  size: 15
 });
-let dataList = ref([]);
-let loading = ref(true);
-const { columns } = useColumns();
 
+const dataList = ref([]);
+const loading = ref(true);
+const { columns } = useColumns();
+const showModel = ref(false);
+const itemId = ref("");
+const isDetails = ref("add");
 const formRef = ref<FormInstance>();
 
 const pagination = reactive<PaginationProps>({
   total: 0,
-  pageSize: 10,
+  pageSize: 15,
   currentPage: 1,
   background: true
 });
 
-function handleUpdate(row) {
-  console.log(row);
-}
-
-function handleDelete(row) {
-  console.log(row);
-}
+//修改状态
+const handleStatus = async row => {
+  const { id, status } = row;
+  const { code, message } = await httpStatus({
+    id,
+    status: status + "" === "1" ? "0" : "1"
+  });
+  if (code === 0) {
+    onSearch();
+  } else if (code > 100 && code < 140) {
+    logout();
+  } else {
+    ElMessage.error(message);
+  }
+};
 
-function handleCurrentChange(val: number) {
-  console.log(`current page: ${val}`);
+async function handleCurrentChange(val: number) {
+  form.page = val;
+  await onSearch();
 }
 
-function handleSizeChange(val: number) {
-  console.log(`${val} items per page`);
+async function handleSizeChange(val: number) {
+  form.size = val;
+  form.page = 1;
+  await onSearch();
 }
 
 function handleSelectionChange(val) {
@@ -52,17 +68,35 @@ function handleSelectionChange(val) {
 
 async function onSearch() {
   loading.value = true;
-  let { data } = await getUserList();
-  dataList.value = data.list;
-  pagination.total = data.total;
-  setTimeout(() => {
-    loading.value = false;
-  }, 500);
+  const { code, data, message } = await httpList(form);
+  if (code === 0) {
+    const { list, count } = data;
+    dataList.value = list ?? [];
+    pagination.total = count ?? 0;
+    pagination.pageSize = form.size;
+    pagination.currentPage = form.page;
+  } else if (code > 100 && code < 140) {
+    logout();
+  } else {
+    ElMessage.error(message);
+  }
+  loading.value = false;
+}
+async function resetSearch() {
+  form.page = 1;
+  await onSearch();
+}
+//新建/编辑/详情弹窗
+function editItem(id, type) {
+  itemId.value = id;
+  isDetails.value = type;
+  showModel.value = true;
 }
 
 const resetForm = (formEl: FormInstance | undefined) => {
   if (!formEl) return;
   formEl.resetFields();
+  form.page = 1;
   onSearch();
 };
 
@@ -72,146 +106,118 @@ onMounted(() => {
 </script>
 
 <template>
-  <div class="main flex">
-    <tree />
-    <div class="flex-1 ml-4">
-      <el-form
-        ref="formRef"
-        :inline="true"
-        :model="form"
-        class="bg-white w-99/100 pl-8 pt-4"
-      >
-        <el-form-item label="用户名称:" prop="username">
-          <el-input
-            v-model="form.username"
-            placeholder="请输入用户名称"
-            clearable
-          />
-        </el-form-item>
-        <el-form-item label="手机号码:" prop="mobile">
-          <el-input
-            v-model="form.mobile"
-            placeholder="请输入手机号码"
-            clearable
+  <div class="main role">
+    <el-form
+      ref="formRef"
+      :inline="true"
+      :model="form"
+      :label-width="0"
+      class="bg-white w-99/100 pl-8 pt-4"
+    >
+      <el-form-item prop="status">
+        <el-select
+          v-model="form.status"
+          style="width: 100%"
+          placeholder="角色状态"
+          clearable
+        >
+          <el-option
+            v-for="(si, sii) in statusList"
+            :key="'status' + si.value + sii"
+            :label="si.label"
+            :value="si.value"
           />
-        </el-form-item>
-        <el-form-item label="状态:" prop="status">
-          <el-select v-model="form.status" placeholder="请选择" clearable>
-            <el-option label="已开启" value="1" />
-            <el-option label="已关闭" value="0" />
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button
-            type="primary"
-            :icon="useRenderIcon('search')"
-            :loading="loading"
-            @click="onSearch"
-          >
-            搜索
-          </el-button>
-          <el-button
-            :icon="useRenderIcon('refresh')"
-            @click="resetForm(formRef)"
-          >
-            重置
-          </el-button>
-        </el-form-item>
-      </el-form>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="role_name">
+        <el-input v-model="form.role_name" placeholder="角色名称" clearable />
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          :icon="useRenderIcon('search')"
+          :loading="loading"
+          @click="resetSearch"
+        >
+          搜索
+        </el-button>
+        <el-button :icon="useRenderIcon('refresh')" @click="resetForm(formRef)">
+          重置
+        </el-button>
+      </el-form-item>
+    </el-form>
 
-      <TableProBar
-        title="用户管理"
-        :loading="loading"
-        :dataList="dataList"
-        @refresh="onSearch"
-      >
-        <template #buttons>
-          <el-button type="primary" :icon="useRenderIcon('add')">
-            新增用户
-          </el-button>
-        </template>
-        <template v-slot="{ size, checkList }">
-          <PureTable
-            border
-            align="center"
-            table-layout="auto"
-            :size="size"
-            :data="dataList"
-            :columns="columns"
-            :checkList="checkList"
-            :pagination="pagination"
-            :paginationSmall="size === 'small' ? true : false"
-            :header-cell-style="{ background: '#fafafa', color: '#606266' }"
-            @selection-change="handleSelectionChange"
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-          >
-            <template #operation="{ row }">
-              <el-button
-                class="reset-margin"
-                link
-                type="primary"
-                :size="size"
-                @click="handleUpdate(row)"
-                :icon="useRenderIcon('edits')"
-              >
-                修改
-              </el-button>
-              <el-popconfirm title="是否确认删除?">
-                <template #reference>
-                  <el-button
-                    class="reset-margin"
-                    link
-                    type="primary"
-                    :size="size"
-                    :icon="useRenderIcon('delete')"
-                    @click="handleDelete(row)"
-                  >
-                    删除
-                  </el-button>
-                </template>
-              </el-popconfirm>
-              <el-dropdown>
+    <TableProBar
+      title="角色管理"
+      :loading="loading"
+      :dataList="dataList"
+      @refresh="onSearch"
+    >
+      <template #buttons>
+        <el-button
+          type="primary"
+          :icon="useRenderIcon('add')"
+          @click="editItem('', 'add')"
+        >
+          新增角色
+        </el-button>
+      </template>
+      <template v-slot="{ size, checkList }">
+        <PureTable
+          border
+          align="left"
+          showOverflowTooltip
+          table-layout="auto"
+          :size="size"
+          :data="dataList"
+          :columns="columns"
+          :checkList="checkList"
+          :pagination="pagination"
+          :paginationSmall="size === 'small' ? true : false"
+          :header-cell-style="{ background: '#fafafa', color: '#606266' }"
+          @selection-change="handleSelectionChange"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+        >
+          <template #operation="{ row }">
+            <el-button
+              class="reset-margin"
+              link
+              type="primary"
+              :size="size"
+              @click="editItem(row.id, 'view')"
+              :icon="useRenderIcon('eye-view')"
+            />
+            <el-button
+              class="reset-margin"
+              link
+              type="primary"
+              :size="size"
+              @click="editItem(row.id, 'edit')"
+              :icon="useRenderIcon('edits')"
+            />
+            <el-popconfirm
+              :title="row.status === '1' ? '改为禁用?' : '改为启用?'"
+              @confirm="handleStatus(row)"
+            >
+              <template #reference>
                 <el-button
-                  class="ml-3"
+                  class="reset-margin"
                   link
                   type="primary"
                   :size="size"
-                  @click="handleUpdate(row)"
-                  :icon="useRenderIcon('more')"
-                />
-                <template #dropdown>
-                  <el-dropdown-menu>
-                    <el-dropdown-item>
-                      <el-button
-                        class="reset-margin !h-20px !text-gray-500"
-                        link
-                        type="primary"
-                        :size="size"
-                        :icon="useRenderIcon('password')"
-                      >
-                        重置密码
-                      </el-button>
-                    </el-dropdown-item>
-                    <el-dropdown-item>
-                      <el-button
-                        class="reset-margin !h-20px !text-gray-500"
-                        link
-                        type="primary"
-                        :size="size"
-                        :icon="useRenderIcon('role')"
-                      >
-                        分配角色
-                      </el-button>
-                    </el-dropdown-item>
-                  </el-dropdown-menu>
-                </template>
-              </el-dropdown>
-            </template>
-          </PureTable>
-        </template>
-      </TableProBar>
-    </div>
+                  :icon="
+                    useRenderIcon(
+                      row.status === '1'
+                        ? 'close-circle-line'
+                        : 'checkbox-circle-line'
+                    )
+                  " /></template
+            ></el-popconfirm>
+          </template>
+        </PureTable>
+      </template>
+    </TableProBar>
   </div>
 </template>
 

+ 0 - 190
src/views/system/updates/tree.vue

@@ -1,190 +0,0 @@
-<script lang="ts" setup>
-import type { ElTree } from "element-plus";
-import { getDeptList } from "/@/api/system";
-import { handleTree } from "@pureadmin/utils";
-import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
-import { ref, watch, onMounted, getCurrentInstance } from "vue";
-
-interface Tree {
-  id: number;
-  name: string;
-  highlight?: boolean;
-  children?: Tree[];
-}
-const defaultProps = {
-  children: "children",
-  label: "name"
-};
-
-const treeData = ref([]);
-const searchValue = ref("");
-const { proxy } = getCurrentInstance();
-const treeRef = ref<InstanceType<typeof ElTree>>();
-
-let highlightMap = ref({});
-
-const filterNode = (value: string, data: Tree) => {
-  if (!value) return true;
-  return data.name.includes(value);
-};
-
-function nodeClick(value) {
-  const nodeId = value.$treeNodeId;
-  highlightMap.value[nodeId] = highlightMap.value[nodeId]?.highlight
-    ? Object.assign({ id: nodeId }, highlightMap.value[nodeId], {
-        highlight: false
-      })
-    : Object.assign({ id: nodeId }, highlightMap.value[nodeId], {
-        highlight: true
-      });
-  Object.values(highlightMap.value).forEach((v: Tree) => {
-    if (v.id !== nodeId) {
-      v.highlight = false;
-    }
-  });
-}
-
-function toggleRowExpansionAll(status) {
-  // @ts-expect-error
-  let nodes = proxy.$refs["treeRef"].store._getAllNodes();
-  for (var i = 0; i < nodes.length; i++) {
-    nodes[i].expanded = status;
-  }
-}
-
-// 重置状态(选中状态、搜索框值、树初始化)
-function onReset() {
-  highlightMap.value = {};
-  searchValue.value = "";
-  toggleRowExpansionAll(true);
-}
-
-watch(searchValue, val => {
-  treeRef.value!.filter(val);
-});
-
-onMounted(async () => {
-  let { data } = await getDeptList();
-  treeData.value = handleTree(data);
-});
-</script>
-
-<template>
-  <div class="max-w-260px h-full min-h-780px bg-white">
-    <div class="flex items-center h-34px">
-      <p class="flex-1 ml-2 font-bold text-base truncate" title="部门列表">
-        部门列表
-      </p>
-      <el-input
-        style="flex: 2"
-        size="small"
-        v-model="searchValue"
-        placeholder="请输入部门名称"
-        clearable
-      >
-        <template #suffix>
-          <el-icon class="el-input__icon">
-            <IconifyIconOffline
-              v-show="searchValue.length === 0"
-              icon="search"
-            />
-          </el-icon>
-        </template>
-      </el-input>
-      <el-dropdown>
-        <IconifyIconOffline
-          class="w-28px cursor-pointer"
-          width="18px"
-          icon="more-vertical"
-        />
-        <template #dropdown>
-          <el-dropdown-menu>
-            <el-dropdown-item>
-              <el-button
-                class="reset-margin !h-20px !text-gray-500"
-                link
-                type="primary"
-                :icon="useRenderIcon('expand')"
-                @click="toggleRowExpansionAll(true)"
-              >
-                展开全部
-              </el-button>
-            </el-dropdown-item>
-            <el-dropdown-item>
-              <el-button
-                class="reset-margin !h-20px !text-gray-500"
-                link
-                type="primary"
-                :icon="useRenderIcon('unExpand')"
-                @click="toggleRowExpansionAll(false)"
-              >
-                折叠全部
-              </el-button>
-            </el-dropdown-item>
-            <el-dropdown-item>
-              <el-button
-                class="reset-margin !h-20px !text-gray-500"
-                link
-                type="primary"
-                :icon="useRenderIcon('reset')"
-                @click="onReset"
-              >
-                重置状态
-              </el-button>
-            </el-dropdown-item>
-          </el-dropdown-menu>
-        </template>
-      </el-dropdown>
-    </div>
-    <el-divider />
-    <el-tree
-      ref="treeRef"
-      :data="treeData"
-      node-key="id"
-      size="small"
-      :props="defaultProps"
-      default-expand-all
-      :expand-on-click-node="false"
-      :filter-node-method="filterNode"
-      @node-click="nodeClick"
-    >
-      <template #default="{ node, data }">
-        <span
-          :class="[
-            'pl-1',
-            'pr-1',
-            'rounded',
-            'flex',
-            'items-center',
-            'select-none',
-            searchValue.trim().length > 0 &&
-              node.label.includes(searchValue) &&
-              'text-red-500'
-          ]"
-          :style="{
-            background: highlightMap[node.id]?.highlight
-              ? 'var(--el-color-primary-light-7)'
-              : 'transparent'
-          }"
-        >
-          <IconifyIconOffline
-            :icon="
-              data.type === 1
-                ? 'office-building'
-                : data.type === 2
-                ? 'location-company'
-                : 'dept'
-            "
-          />
-          {{ node.label }}
-        </span>
-      </template>
-    </el-tree>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-:deep(.el-divider) {
-  margin: 0;
-}
-</style>