Ver código fonte

用户页面编辑

zhangwy 2 anos atrás
pai
commit
e46d94a22b

+ 4 - 2
src/components/select/DySelectTree.vue

@@ -125,10 +125,12 @@ function init() {
 }
 
 function onSelect(data: any) {
-  emits("deselect", data)
+  emits("select", data)
+  //emits("deselect", data)
 }
 function onDeselect(data: any) {
-  emits("select", data)
+  //emits("select", data)
+  emits("deselect", data)
 }
 watch(() => props.id, init)
 onMounted(() => {

+ 4 - 4
src/router/menuMap/_system.ts

@@ -41,9 +41,9 @@ export const menus: Array<MenuRouteMap> = [
     path: "/server/AnalysisUsers",
     component: () => import("@/views/server/AnalysisUsers.vue"),
   },
-  {
-    path: "/server/govPage",
-    component: () => import("@/views/server/govPage.vue"),
-  },
+  // {
+  //   path: "/server/govPage",
+  //   component: () => import("@/views/server/govPage.vue"),
+  // },
 ]
 export default menus

+ 9 - 1
src/stores/_menu.ts

@@ -45,7 +45,12 @@ export const useMenuStore = defineStore("meun", () => {
     })
   }
   const formatterMenuItem = (fun: FunctionMenu) => {
+    if (fun.url == "/server/users") {
+      //兼容旧页面,临时增加判断
+      fun.name = "账户管理"
+    }
     menus.value.push(fun)
+
     const menu: MenuRouteMap | undefined = MenuRouteMaps.find(
       (v) => v.path.toLocaleLowerCase() == fun.url.trimEnd().toLocaleLowerCase()
     )
@@ -63,7 +68,10 @@ export const useMenuStore = defineStore("meun", () => {
       item.sectionTitle = fun.name
       item.sub = []
       fun.children.forEach((v) => {
-        item.sub?.push(formatterMenuItem(v))
+        if (v.name != "政府账户管理") {
+          //兼容旧页面,临时增加判断
+          item.sub?.push(formatterMenuItem(v))
+        }
       })
     } else {
       item.heading = fun.name

+ 120 - 0
src/views/server/AnalysisUsers.vue

@@ -0,0 +1,120 @@
+<script setup lang="ts">
+import { ref, computed } from "vue"
+import type { Header } from "@/components/Table/table-partials/models"
+import moment from "moment"
+const orgId = ref<string | null>(null)
+const datarange = ref<[Date, Date]>([
+  new Date(moment().subtract(7, "days").format("YYYY-MM-DD")),
+  new Date(moment().format("YYYY-MM-DD")),
+])
+const defaultTime = ref<[Date, Date]>([
+  new Date(moment().subtract(7, "days").format("YYYY-MM-DD")),
+  new Date(moment().format("YYYY-MM-DD")),
+])
+const startDate = computed(() => {
+  const d1 = datarange.value[0]
+  return moment(d1).format("YYYYMMDD")
+})
+const endDate = computed(() => {
+  const d2 = datarange.value[1]
+  return moment(d2).format("YYYYMMDD")
+})
+const size = ref<any>("default")
+const table = ref()
+const query = () => {
+  console.log(orgId.value)
+  const params = {
+    id: orgId.value,
+    start_time: startDate.value,
+    end_time: endDate.value,
+  }
+  const keys = Object.keys(params)
+  keys.forEach((key) => {
+    if (params[key] === "" || params[key] === null) {
+      delete params[key]
+    }
+  })
+  queryParams.value = Object.assign({}, params)
+}
+const cols = ref<Array<Header>>([
+  {
+    name: "区域/商户名称",
+    field: "org_company_name",
+    width: 400,
+  },
+  {
+    name: "账号",
+    field: "login_name",
+  },
+  {
+    name: "登录次数",
+    field: "login_num",
+  },
+])
+const queryParams = ref<any>({
+  id: orgId.value,
+  start_time: startDate.value,
+  end_time: endDate.value,
+})
+const reset = () => {
+  orgId.value = "0"
+  datarange.value = defaultTime.value
+  queryParams.value = {
+    start_time: startDate.value,
+    end_time: endDate.value,
+    id: "",
+  }
+}
+const onselect = (v: any) => {
+  orgId.value = v.id
+}
+</script>
+<template>
+  <VbDataTable
+    ref="table"
+    :header="cols"
+    url="sys/userLoginLogs/getUserlogs"
+    method="post"
+    :query-params="queryParams"
+    :has-checkbox="false"
+  >
+    <template v-slot:table-tool>
+      <el-form class="align-items-center" :inline="true" :label-width="80">
+        <!-- <el-form-item class="mb-0 me-6 align-items-center form-width" label="区域">
+          <DySelectTree
+            v-model:value="orgId"
+            :static-options="[{ id: '0', label: '根节点' }]"
+            :url="'sys/dict/getOrgList?type=1'"
+            :defaultExpandLevel="1"
+            :option-map="{ id: 'value', label: 'label', children: 'children' }"
+            placeholder="请选择区域..."
+            @select="onselect"
+          />
+        </el-form-item> -->
+        <el-form-item class="mb-0 me-6 align-items-center form-width" label="时间">
+          <el-date-picker
+            v-model="datarange"
+            type="daterange"
+            range-separator="~"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            :size="size"
+            :default-value="defaultTime"
+          />
+        </el-form-item>
+        <el-form-item class="mb-0 me-0 align-items-center form-width">
+          <el-button class="ms-3 mt-0 btn btn-sm btn-primary" @click="query">查询</el-button>
+          <el-button class="ms-3 mt-0 btn btn-sm btn-default" @click="reset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </template>
+  </VbDataTable>
+</template>
+<style scoped lang="scss">
+// ::v-deep .el-form-item__label {
+//   width: 80px !important;
+// }
+.form-width {
+  width: 500px;
+}
+</style>

+ 0 - 0
src/views/server/govPage.vue


+ 6 - 0
src/views/server/sysDic.vue

@@ -0,0 +1,6 @@
+<script setup lang="ts">
+import { ref } from "vue"
+</script>
+<template>
+  <div></div>
+</template>

+ 9 - 8
src/views/server/sysRole.vue

@@ -54,7 +54,7 @@ const items: Array<VbFormItem> = [
   {
     field: "menuIds",
     label: "权限:",
-    required: true,
+    required: false,
     component: DySelectTree,
     span: 24,
     props: {
@@ -63,7 +63,7 @@ const items: Array<VbFormItem> = [
       defaultExpandLevel: 1,
       optionMap: { id: "id", label: "name", children: "children" },
       method: "post",
-      configs: { data: { pageIndex: 1, pageSize: 10, params: { isMenu: true, isPage: false } } },
+      configs: { data: { pageIndex: 1, pageSize: 10, params: { enabled: 1, isPage: false } } },
       showCheckbox: true,
       multiple: true,
     },
@@ -94,7 +94,6 @@ function combineIds(nodes?: any): Array<any> {
 }
 function edit(row: any) {
   opreationType.value = "U"
-
   Rs.post("auth/menus/findMenuByRoleID", { data: row.id + "", successAlert: false }).then((res: any) => {
     if (res) {
       const mIds = combineIds(res.data)
@@ -108,15 +107,17 @@ function edit(row: any) {
 function onSave() {
   const reqUrl = opreationType.value == "A" ? "/auth/roles/register" : "/auth/roles/update"
   Rs.post(reqUrl, { data: formData.value }).then(() => {
-    table.value.search()
+    loadData()
   })
 }
 function del(row: any) {
   //删除角色
-  dialog.confirm("确认删除角色?", "提交确认", () => {
-    Rs.post("/auth/roles/delete", { data: [row.id] }).then(() => {
-      table.value.search()
-    })
+  dialog.confirm("确认删除角色?", "提交确认", (isConfirmed: any) => {
+    if (isConfirmed.isConfirmed) {
+      Rs.post("/auth/roles/delete", { data: [row.id] }).then(() => {
+        loadData()
+      })
+    }
   })
 }
 const currentPage = ref(1)

+ 375 - 0
src/views/server/users.vue

@@ -0,0 +1,375 @@
+<script setup lang="ts">
+import { ref, onMounted, computed, reactive } from "vue"
+import type { Header } from "@/components/Table/table-partials/models"
+import Rs from "@/core/services/RequestService"
+import type { VbFormItem } from "@/components/Forms/models"
+import { ElInput, ElRadio, ElSwitch } from "element-plus"
+import { dialog } from "@/core/utils/message"
+import "element-plus/es/components/input/style/css"
+import DySelectTree from "@/components/select/DySelectTree.vue"
+import DySelect from "@/components/select/DySelect.vue"
+import type { SelectOptionProp } from "@/components/select/DySelect.vue"
+
+const size = ref<any>("default")
+const modal = ref()
+const enabledStatusOption = reactive([
+  {
+    label: "启用",
+    value: 1,
+    key: 1,
+  },
+  {
+    label: "禁用",
+    value: 0,
+    key: 0,
+  },
+])
+const userTypeOption = reactive([
+  {
+    label: "政府账户",
+    value: 1,
+  },
+  {
+    label: "企业账号",
+    value: 2,
+  },
+])
+const cols = ref([
+  {
+    name: "账号名",
+    field: "username",
+  },
+  {
+    name: "昵称",
+    field: "name",
+  },
+  {
+    name: "手机号码",
+    field: "phone",
+  },
+  {
+    name: "所属企业",
+    field: "companyName",
+  },
+  {
+    name: "用户角色",
+    field: "roles",
+  },
+  {
+    name: "用户状态",
+    field: "enabled",
+  },
+  {
+    name: "操作",
+    field: "action",
+    minWidth: 300,
+  },
+])
+const currentPage = ref(1)
+const pageSize = ref(10)
+const total = ref(0)
+const result = ref<Array<any>>([])
+//const name = ref("")
+const user_type = ref(2)
+const username = ref("")
+const company_name = ref("")
+const loadData = () => {
+  result.value = []
+  Rs.post("/auth/users/getAll", {
+    data: {
+      currentPage: currentPage.value,
+      address: "",
+      city: "",
+      user_type: user_type.value,
+      enabled: "",
+      name: "",
+      username: username.value,
+      company_name: company_name.value,
+      pageSize: pageSize.value,
+    },
+  }).then((res: any) => {
+    result.value = res.data
+    total.value = res.total
+  })
+}
+const pageChange = (v: number) => {
+  currentPage.value = v
+  loadData()
+}
+const perPageChange = (v: number) => {
+  pageSize.value = v
+  currentPage.value = 1
+  loadData()
+}
+//const selectRolesOption = ref([])
+onMounted(() => {
+  loadData()
+})
+
+const contant = computed(() => {
+  return (
+    user_type.value == 1
+      ? [
+          {
+            field: "enterprise_id",
+            label: "所属机构",
+            required: false,
+            component: DySelectTree,
+            span: 24,
+            class: "w-100",
+            props: {
+              url: "sys/dict/getOrgList?type=1",
+              defaultExpandLevel: 1,
+              optionMap: { id: "value", label: "label", children: "children" },
+              method: "get",
+            },
+          },
+        ]
+      : [
+          {
+            field: "enterprise_id",
+            label: "所属企业",
+            required: true,
+            component: DySelect,
+            span: 24,
+            class: "w-100",
+            props: {
+              url: "sys/dict/getCompanyList?type=0",
+              method: "get",
+            },
+          },
+        ]
+  ) as Array<VbFormItem>
+})
+const items = computed(() => {
+  const arr = [
+    {
+      field: "name",
+      label: "昵称",
+      required: true,
+      component: ElInput,
+      span: 24,
+    },
+    {
+      field: "phone",
+      label: "手机号",
+      required: true,
+      component: ElInput,
+      span: 24,
+    },
+    {
+      field: "username",
+      label: "账号名",
+      required: true,
+      component: ElInput,
+      span: 24,
+    },
+    ...contant.value,
+    {
+      field: "roleIds",
+      label: "账户角色",
+      required: true,
+      component: DySelect,
+      span: 24,
+      class: "w-100",
+      props: {
+        //staticOptions: selectRolesOption.value,
+        url: "auth/roles/getAll",
+        method: "post",
+        configs: { data: { desc: "", isPage: false, name: "", currentPage: 0, pageSize: 0 } },
+        multiple: true,
+        formatFunction: (v: any) => {
+          console.log("vvv", v)
+          const item = {} as SelectOptionProp
+          item.label = v.name
+          item.key = v.id
+          item.value = v.id
+          return item
+        },
+      },
+    },
+    {
+      field: "enabled",
+      label: "是否启用",
+      required: true,
+      component: DySelect,
+      span: 24,
+      class: "w-100",
+      props: {
+        staticOptions: enabledStatusOption,
+      },
+    },
+    {
+      field: "user_type",
+      label: "用户类型",
+      required: true,
+      component: DySelect,
+      span: 24,
+      class: "w-100",
+      props: {
+        disabled: true,
+        staticOptions: userTypeOption,
+      },
+    },
+  ] as Array<VbFormItem>
+
+  if (opreationType.value == "U") {
+    arr.push({
+      field: "changPs",
+      label: "是否重置密码",
+      required: false,
+      span: 24,
+      component: ElSwitch,
+    })
+  } else {
+    arr.splice(3, 0, {
+      field: "password",
+      label: "密码",
+      required: true,
+      component: ElInput,
+      span: 24,
+      props: {
+        placeholder: "请输入密码",
+        showPassword: true,
+      },
+    })
+  }
+  return arr
+})
+const formData = ref<any>({
+  name: "",
+  username: "",
+  phone: "",
+  companyName: "",
+  roleIds: [],
+  enabled: 1,
+  user_type: 2,
+  sex: "1",
+  changPs: false,
+})
+//定义需要操作的类型
+const opreationType = ref<"A" | "U" | "D" | "BU">("A")
+const modalTitlePrefix = computed(() => {
+  return opreationType.value == "A" ? "新增" : opreationType.value == "U" || opreationType.value == "BU" ? "编辑" : ""
+})
+const add = () => {
+  opreationType.value = "A"
+  formData.value = Object.assign(
+    {},
+    {
+      name: "",
+      username: "",
+      phone: "",
+      companyName: "",
+      roleIds: [],
+      enabled: 1,
+      user_type: user_type.value,
+      sex: "1",
+      changPs: false,
+    }
+  )
+  modal.value.show()
+}
+const edit = (row: any) => {
+  opreationType.value = "U"
+
+  const enabled = row.enabled ? 1 : 0
+  const rids = row.roles.map((v: any) => {
+    return v.id
+  })
+  formData.value = Object.assign({}, { ...row }, { enabled: enabled, roleIds: rids, changPs: false })
+  modal.value.show()
+}
+
+const del = (row: any) => {
+  //删除用户
+  dialog.confirm("确认删除账户?", "提交确认", (isConfirmed: any) => {
+    if (isConfirmed.isConfirmed) {
+      Rs.post("/auth/users/del", { data: [row.id] }).then(() => {
+        loadData()
+      })
+    }
+  })
+}
+const onSave = () => {
+  const reqUrl = opreationType.value == "A" ? "/auth/users/register" : "/auth/users/update"
+  Rs.post(reqUrl, { data: formData.value }).then(() => {
+    loadData()
+  })
+}
+</script>
+<template>
+  <VbDataTable
+    ref="table"
+    :header="cols"
+    :data="result"
+    :total="total"
+    :currentPage="currentPage"
+    :has-checkbox="false"
+    @page-change="pageChange"
+    @on-items-per-page-change="perPageChange"
+    method="post"
+  >
+    <template v-slot:table-tool>
+      <el-form class="align-items-center" :inline="true">
+        <el-form-item class="mb-0 me-5 align-items-center" label="账号名称:">
+          <el-input class="" style="width: 180px" v-model="username" placeholder="请输入账号名称" :size="size" />
+        </el-form-item>
+        <el-form-item class="mb-0 me-5 align-items-center" label="企业名称:">
+          <el-input class="" style="width: 180px" v-model="company_name" placeholder="请输入企业名称" :size="size" />
+        </el-form-item>
+        <el-form-item class="mb-0 me-5 align-items-center" label="昵称:">
+          <el-input
+            class=""
+            style="width: 180px"
+            v-model="company_name"
+            placeholder="请输入企业/机构名称"
+            :size="size"
+          />
+        </el-form-item>
+        <el-form-item class="mb-0 me-5 align-items-center" label="用户类型:">
+          <el-radio-group v-model="user_type" @change="loadData">
+            <el-radio :label="2" :size="size">企业用户</el-radio>
+            <el-radio :label="1" :size="size">政府用户</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item class="mb-0 me-0 align-items-center">
+          <el-button class="ms-3 mt-0 btn btn-sm btn-primary" @click="loadData">查询</el-button>
+        </el-form-item>
+        <el-form-item class="mb-0 me-0 align-items-center">
+          <el-button class="ms-3 mt-0 btn btn-sm btn-info" @click="add">新增</el-button>
+        </el-form-item>
+      </el-form>
+    </template>
+    <template #action="{ row }">
+      <div class="text-danger text-center">
+        <span class="table-action" @click="edit(row)">编辑</span>
+        <!-- <span class="table-action" @click="assignPermission(row)">权限分配</span> -->
+        <span class="table-action" @click="del(row)">删除</span>
+      </div>
+    </template>
+    <template #companyName_header>
+      {{ user_type == 1 ? "所属机构" : "所属企业" }}
+    </template>
+    <template #roles="{ row }">
+      <template v-for="(item, index) in row.roles" :key="index">
+        {{ item.name }}{{ index == row.roles.length - 1 ? "" : "," }}
+      </template>
+    </template>
+    <template #enabled="{ row }">
+      {{ row.enabled ? "启用" : "停用" }}
+    </template>
+  </VbDataTable>
+  <VbModal
+    v-model:modal="modal"
+    :form-data="formData"
+    :form-items="items"
+    backdrop="static"
+    :keyboard="false"
+    :title-prefix="modalTitlePrefix"
+    title="系统用户"
+    form-label-width="90"
+    modal-body-class="px-10"
+    @confirm="onSave"
+  ></VbModal>
+</template>

+ 2 - 2
vite.config.ts

@@ -68,8 +68,8 @@ export default defineConfig({
     proxy: {
       // 接口地址代理
       "/api": {
-        target: "http://shvber.com:8290", // 接口的域名
-        //target: "http://192.168.0.81:7001", // 接口的域名
+        //target: "http://shvber.com:8290", // 接口的域名
+        target: "http://192.168.0.81:7001", // 接口的域名
         secure: false, // 如果是https接口,需要配置这个参数
         changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
         rewrite: (path) => path.replace(/^\/api/, "/api"),