Commit ec327f7b authored by 李鹏 's avatar 李鹏

authority

parent 9de794c5
......@@ -173,7 +173,7 @@ const headers = reactive([
},
{
label: "手机号",
prop: "contact_phone",
prop: "phone",
minWidth: 150,
},
{
......
......@@ -4,7 +4,7 @@
<div class="page_content apaas_scroll">
<div class="info_row">
<div class="title">
<div><span class="icon_box"></span> 账号信息</div>
<div><span class="icon_box"></span> 基础信息</div>
<div class="dashed_line"></div>
</div>
<div class="info_content">
......@@ -17,20 +17,14 @@
alt="" />
</div>
<div class="info_box">
<bg-info :data="accountInfo"></bg-info>
</div>
</div>
</div>
<div>
<div class="title">
<div><span class="icon_box"></span> 个人信息</div>
<div class="dashed_line"></div>
</div>
<div class="info_content">
<div class="img_box"></div>
<div class="info_box">
<bg-info v-if="accountType === 2" :data="personInfo"></bg-info>
<bg-info v-if="accountType === 3" :data="personInfo2"></bg-info>
<bg-detail-table2 class="detail_info" :list="accountInfo">
<template #state="{ data }">
<p class="detail-module">
<span>{{ data.label }}</span>
<span :class="data.value ? 'active' : 'disabled'">{{ data.value ? "启用" : "禁用" }}</span>
</p>
</template>
</bg-detail-table2>
</div>
</div>
</div>
......@@ -39,7 +33,7 @@
</template>
<script setup>
import { reactive, toRefs, ref, computed, onBeforeMount } from "vue";
import { reactive, ref, onBeforeMount } from "vue";
import { useRoute } from "vue-router";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
......@@ -48,120 +42,64 @@ const route = useRoute();
const accountInfo = reactive([
{
name: "手机号",
value: "",
nameWidth: 130,
},
{
name: "账号",
value: "",
nameWidth: 130,
},
{
name: "角色",
value: "",
nameWidth: 130,
},
{
name: "所属组织",
value: "",
nameWidth: 130,
},
{
name: "创建人",
key: "name",
label: "姓名",
value: "",
nameWidth: 130,
},
{
name: "创建账号",
key: "organization",
label: "所属组织",
value: "",
nameWidth: 130,
},
{
name: "最后编辑时间",
key: "system_account",
label: "账号",
value: "",
nameWidth: 130,
},
{
name: "创建时间",
key: "phone",
label: "手机号",
value: "",
nameWidth: 130,
},
]);
const personInfo = reactive([
{
name: "姓名",
value: "",
nameWidth: 130,
},
{
name: "邮箱",
value: "",
nameWidth: 130,
},
{
name: "证据类型",
value: "",
nameWidth: 130,
},
{
name: "身份证号",
key: "system_role",
label: "角色",
value: "",
idCard: true,
nameWidth: 130,
},
{
name: "备注",
key: "state",
label: "是否启用",
value: "",
full: true,
nameWidth: 130,
},
]);
const personInfo2 = reactive([
{
name: "姓名",
value: "",
nameWidth: 130,
slot: "state",
},
{
name: "邮箱",
key: "created_name",
label: "创建人",
value: "",
nameWidth: 130,
},
{
name: "备注",
key: "created_time",
label: "创建时间",
value: "",
full: true,
nameWidth: 130,
},
]);
const logo = ref("");
const accountType = ref(2); //1.业务系统账号 2.组织管理员账号 3.平台用户账号
const getDetail = () => {
axios.get(`/apaas/system/v5/org/user/${route.query.id}`).then((res) => {
axios.get(`/v1/api/user/${route.query.id}`).then((res) => {
if (res.data.code == 200) {
const detail = res.data.data;
accountInfo[0].value = detail.contact_phone;
accountInfo[1].value = detail.system_account;
accountInfo[2].value = detail.system_role && detail.system_role.length > 0 ? detail.system_role.join("") : "";
accountInfo[3].value = detail.organization;
accountInfo[4].value = detail.created_by;
accountInfo[5].value = detail.created_by_account;
accountInfo[6].value = detail.updated_time;
accountInfo[0].value = detail.name;
accountInfo[1].value = detail.organization;
accountInfo[2].value = detail.system_account;
accountInfo[3].value = detail.phone;
accountInfo[4].value =
detail.system_role_name && detail.system_role_name.length > 0 ? detail.system_role_name.join("") : "";
accountInfo[5].value = detail.state;
accountInfo[6].value = detail.created_name;
accountInfo[7].value = detail.created_time;
personInfo[0].value = detail.contact_name;
personInfo[1].value = detail.contact_email;
personInfo[2].value = detail.document_type === 1 ? "身份证" : "";
personInfo[3].value = detail.document_number;
personInfo[4].value = detail.remark;
personInfo2[0].value = detail.contact_name;
personInfo2[1].value = detail.contact_email;
personInfo2[2].value = detail.remark;
logo.value = detail.logo;
accountType.value = detail.is_admin;
} else {
ElMessage.error(res.data.data);
}
......@@ -175,7 +113,7 @@ onBeforeMount(() => {
});
</script>
<style scoped>
<style scoped lang="scss">
.page_content {
padding: 15px;
overflow: auto;
......@@ -216,4 +154,42 @@ onBeforeMount(() => {
border-radius: 2px;
margin-right: 5px;
}
.detail-module {
height: 100%;
display: flex;
span {
height: 100%;
display: inline-block;
padding-left: 15px;
box-sizing: border-box;
&:nth-of-type(1) {
background-color: #f7f7f9;
min-width: 114px;
border-right: solid 1px #dadee7;
}
&:nth-of-type(2) {
flex-grow: 1;
&::before {
display: inline-block;
content: "";
width: 8px;
height: 8px;
margin-right: 4px;
border-radius: 4px;
}
&.active {
color: #3759be;
&::before {
background-color: #3759be;
}
}
&.disabled {
color: #ff9f51;
&::before {
background-color: #ff9f51;
}
}
}
}
}
</style>
......@@ -26,6 +26,7 @@ import { useRoute, useRouter } from "vue-router";
import systemForm from "./system-form.vue";
import { reactive, ref, onBeforeUnmount, onMounted } from "vue";
import axios from "@/request/http.js";
import CryptoJS from "crypto-js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const route = useRoute();
......@@ -57,42 +58,51 @@ const getSystemFormData = (data) => {
};
//提交表单
const submit = () => {
if (route.query.id) {
let params = {
...formData,
logo: formData.logo && formData.logo.length > 0 ? formData.logo[0].url : "",
};
axios.put(`/v1/api/user/${route.query.id}`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
cancel();
} else {
ElMessage.error(res.data.data);
}
});
} else {
let params = {
...formData,
logo: formData.logo && formData.logo.length > 0 ? formData.logo[0].url : "",
password: CryptoJS.AES.encrypt(formData.password, "swuE9cmCZQwrkYRV").toString(),
};
axios.put(`/v1/api/user/add`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
cancel();
} else {
ElMessage.error(res.data.data);
}
});
}
systemFormRef.value.validateForm().then((res) => {
if (!res) return;
if (route.query.id) {
let params = {
...systemFormRef.value.systemForm,
logo:
systemFormRef.value.systemForm.logo && systemFormRef.value.systemForm.logo.length > 0
? systemFormRef.value.systemForm.logo[0].url
: "",
};
axios.put(`/v1/api/user/${route.query.id}`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
cancel();
} else {
ElMessage.error(res.data.data);
}
});
} else {
let params = {
...systemFormRef.value.systemForm,
logo:
systemFormRef.value.systemForm.logo && systemFormRef.value.systemForm.logo.length > 0
? systemFormRef.value.systemForm.logo[0].url
: "",
password: CryptoJS.AES.encrypt(systemFormRef.value.systemForm.password, "swuE9cmCZQwrkYRV").toString(),
};
delete params.confirm_password;
axios.post(`/v1/api/user/add`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
cancel();
} else {
ElMessage.error(res.data.data);
}
});
}
});
};
//取消
const cancel = () => {
// router.go(-1);
router.push({
path: "/authority/user",
query: {
id: formData.organization_id,
organization_id: systemFormRef.value.systemForm.organization_id,
},
});
};
......@@ -103,18 +113,12 @@ const getDetail = () => {
const form = res.data.data;
systemFormRef.value.setForm({
organization_id: form.organization_id,
system_role_id: form.system_role_id,
select_role: form.system_role,
logo: form.logo ? [{ url: form.logo }] : [],
business_code: form.business_code,
business_name: form.business_name,
business_desc: form.business_desc,
name: form.name,
system_account: form.system_account,
system_phone: form.system_phone,
access_address: form.access_address,
develop_id: form.develop_id,
phone: form.phone,
state: form.state,
appid: form.app_id,
appsecret: form.app_secret,
});
} else {
ElMessage.error(res.data.data);
......
......@@ -15,37 +15,10 @@
:disabled="formType"
style="width: 100%" />
</el-form-item>
<el-form-item label="业务系统编码" prop="business_code" v-if="formType">
<el-input v-model="systemForm.business_code" :disabled="formType" />
<el-form-item label="姓名" prop="name">
<el-input v-model="systemForm.name" />
</el-form-item>
<el-form-item label="业务系统名称" prop="business_name">
<el-input v-model="systemForm.business_name" />
</el-form-item>
<el-form-item label="AppId" prop="appid" v-if="formType">
<el-input v-model="systemForm.appid" :disabled="formType">
<template #suffix>
<bg-icon
icon="#bg-ic-copy"
style="cursor: pointer"
@click="copyText(systemForm.appid)"></bg-icon>
</template>
</el-input>
<!-- <span class="pl-1"><el-button type="primary" @click="copyText(systemForm.appid)">复制</el-button></span> -->
</el-form-item>
<el-form-item label="AppSecret" prop="appsecret" v-if="formType">
<div style="display: flex; width: 100%">
<el-input v-model="systemForm.appsecret" :disabled="formType">
<template #suffix>
<bg-icon
icon="#bg-ic-copy"
style="cursor: pointer"
@click="copyText(systemForm.appsecret)"></bg-icon>
</template>
</el-input>
<span class="pl-1"><el-button type="primary" @click="resetSecret">重置</el-button></span>
</div>
</el-form-item>
<el-form-item label="系统LOGO" prop="logo">
<el-form-item label="头像" prop="logo">
<bg-upload-image
v-model="systemForm.logo"
:showTips="true"
......@@ -56,62 +29,31 @@
:accept="['.jpg', '.jpeg', '.png']"
customTips="请选择图片上传:大小120 * 120像素支持jpg、png等格式,图片需小于500KB"></bg-upload-image>
</el-form-item>
<el-form-item label="业务系统概述" prop="business_desc">
<el-input
type="textarea"
:rows="3"
v-model="systemForm.business_desc"
show-word-limit
maxlength="300" />
</el-form-item>
<el-form-item label="角色" prop="system_role_id" v-if="!formType">
<el-select
v-model="systemForm.system_role_id"
placeholder="请选择角色"
:disabled="true"
style="width: 100%">
<el-option
v-for="item in roleList"
:key="item.role_id"
:label="item.role_name"
:value="item.role_id" />
<el-form-item label="角色" prop="select_role">
<el-select v-model="systemForm.select_role" multiple placeholder="请选择角色" style="width: 100%">
<el-option v-for="item in roleList" :key="item.role_id" :label="item.role_name" :value="item.role_id" />
</el-select>
</el-form-item>
<el-form-item label="账号" prop="system_account">
<el-input v-model="systemForm.system_account" />
</el-form-item>
<el-form-item label="手机号" prop="system_phone">
<el-input v-model="systemForm.system_phone" />
<el-form-item label="手机号" prop="phone">
<el-input v-model="systemForm.phone" />
</el-form-item>
<el-form-item label="密码" prop="password" v-if="!formType">
<el-form-item v-if="!formType" label="密码" prop="password">
<el-input :type="password_eye ? 'text' : 'password'" v-model="systemForm.password">
<template #suffix>
<bg-icon
@click="password_eye = !password_eye"
class="icon_eye"
icon="#bg-ic-eye"></bg-icon>
<bg-icon @click="password_eye = !password_eye" class="icon_eye" icon="#bg-ic-eye"></bg-icon>
</template>
</el-input>
</el-form-item>
<el-form-item label="确认密码" prop="confirm_password" v-if="!formType">
<el-form-item v-if="!formType" label="确认密码" prop="confirm_password">
<el-input :type="confirm_eye ? 'text' : 'password'" v-model="systemForm.confirm_password">
<template #suffix>
<bg-icon @click="confirm_eye = !confirm_eye" class="icon_eye" icon="#bg-ic-eye"></bg-icon>
</template>
</el-input>
</el-form-item>
<el-form-item label="访问地址" prop="access_address">
<el-input v-model="systemForm.access_address" />
</el-form-item>
<el-form-item label="开发厂商名称" prop="develop_id">
<el-select v-model="systemForm.develop_id" placeholder="请选择开发厂商" style="width: 100%">
<el-option
v-for="item in firmList"
:key="item.dict_id"
:label="item.dict_name"
:value="item.dict_id" />
</el-select>
</el-form-item>
<el-form-item label="是否启用" prop="state">
<bg-switch :labels="['否', '是']" :values="[0, 1]" v-model="systemForm.state"></bg-switch>
</el-form-item>
......@@ -119,7 +61,7 @@
</template>
<script setup>
import { reactive, ref, onBeforeMount, onMounted, computed } from "vue";
import { reactive, ref, onBeforeMount, onMounted, watch } from "vue";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import { validatePhone } from "@/services/rules.js";
......@@ -128,27 +70,17 @@ const props = defineProps({
type: Boolean,
default: false, //false 新增 true 编辑
},
id: {
type: String,
default: "",
},
});
const systemForm = reactive({
organization_id: "",
business_code: "",
business_name: "",
business_desc: "",
name: "",
logo: [],
system_role_id: "",
select_role: [],
system_account: "",
system_phone: "",
phone: "",
password: "",
confirm_password: "",
access_address: "",
develop_id: "",
state: 1,
appid: "",
appsecret: "",
});
const password_eye = ref(false);
const confirm_eye = ref(false);
......@@ -160,88 +92,22 @@ const validatePass = (rule, value, callback) => {
callback();
}
};
const validateBusinessName = (rule, value, callback) => {
let reg = /^[a-zA-Z0-9\u4e00-\u9fa5]+$/;
if (!reg.test(value)) {
callback(new Error("只能输入字母、数字和汉字"));
} else {
let params = null;
if (props.id) {
params = {
id: parseInt(props.id),
business_name: value,
organization_id: systemForm.organization_id,
};
} else {
params = { business_name: value, organization_id: systemForm.organization_id };
}
axios.post(`/apaas/system/v5/user/check/business`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
}
};
const validateSystemAccount = (rule, value, callback) => {
let reg = /^[a-zA-Z0-9]+$/;
if (!reg.test(value)) {
callback(new Error("只能输入字母和数字"));
} else {
let params = null;
if (props.id) {
params = { id: parseInt(props.id), system_account: value };
} else {
params = { system_account: value };
}
axios.post(`/apaas/system/v5/user/check/account`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
}
};
const checkPhoneRepet = (rule, value, callback) => {
let params = null;
if (props.id) {
params = { id: parseInt(props.id), contact_phone: value };
} else {
params = { id: 0, contact_phone: value };
}
axios.post(`/apaas/system/v5/org/check`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
};
const formRules = reactive({
organization_id: [{ required: true, message: "请选择组织", trigger: "change" }],
business_name: [
{ required: true, message: "请输入业务系统名称", trigger: "blur" },
{ max: 50, message: "业务系统名称最大长度为50个字符", trigger: "blur" },
{ validator: validateBusinessName, trigger: "blur" },
name: [
{ required: true, message: "请输入姓名", trigger: "blur" },
{ max: 50, message: "姓名最大长度为50个字符", trigger: "blur" },
],
system_role_id: [{ required: true, message: "请选择角色", trigger: "blur" }],
select_role: [{ required: true, type: "array", message: "请选择角色", trigger: "change" }],
system_account: [
{ required: true, message: "请输入账号", trigger: "blur" },
{ min: 4, message: "帐号长度不得低于4个字符", trigger: "blur" },
{ max: 20, message: "帐号最大长度为20个字符", trigger: "blur" },
{ validator: validateSystemAccount, trigger: "blur" },
],
system_phone: [
phone: [
{ required: true, message: "请输入账号", trigger: "blur" },
{ validator: validatePhone, trigger: "blur" },
{ validator: checkPhoneRepet, trigger: "blur" },
],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
......@@ -251,34 +117,21 @@ const formRules = reactive({
{ required: true, message: "请确认密码", trigger: "blur" },
{ validator: validatePass, trigger: "blur" },
],
access_address: [{ max: 500, message: "访问地址最大长度为500个字符", trigger: "blur" }],
develop_id: [{ required: true, message: "请选择开发厂商", trigger: "change" }],
});
const systemRef = ref(null);
const emit = defineEmits(["action"]);
const roleList = ref([]);
const firmList = ref([]);
const submitForm = async () => {
if (!systemRef) return;
await systemRef.value.validate((valid, fields) => {
if (valid) {
emit("action", systemForm);
} else {
emit("action", null);
}
});
};
const clearForm = () => {
if (!systemRef) return;
systemRef.value.resetFields();
systemForm.system_role_id = roleList.value[0].role_id;
};
watch(
() => systemForm.organization_id,
(val) => {
getRoleList(val);
}
);
const setForm = (data) => {
Object.assign(systemForm, data);
console.log("systemForm", systemForm);
};
const orgData = ref([]);
......@@ -288,62 +141,36 @@ const treeProps = {
value: "organization_id",
};
const getOrgTree = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => {
axios.get(`/v1/api/org/tree`).then((res) => {
if (res.data.code == 200) {
const orgDataTemp = res.data.data || [];
orgDataTemp.shift();
orgData.value = orgDataTemp;
} else {
ElMessage.error(res.data.data);
}
});
};
const copyText = (data) => {
navigator.clipboard.writeText(data).then(
function () {
ElMessage.success("复制成功");
},
function () {}
);
};
const resetSecret = () => {
axios.get(`/apaas/system/v5/user/reset/secret/${props.id}`).then((res) => {
if (res.data.code == 200) {
systemForm.appsecret = res.data.data;
ElMessage.success("重置成功!");
} else {
ElMessage.error(res.data.data);
}
});
};
const getRoleList = () => {
axios.get(`/apaas/system/v5/org/select/role?is_admin=1`).then((res) => {
const getRoleList = (oid) => {
axios.get(`/v1/api/user/select/role`, { params: { oid } }).then((res) => {
if (res.data.code == 200) {
roleList.value = res.data.data;
systemForm.system_role_id = roleList.value[0].role_id;
} else {
ElMessage.error(res.data.data);
}
});
};
const getFirmList = () => {
axios.get(`/apaas/system/v5/dictionary/developer/list`).then((res) => {
if (res.data.code == 200) {
firmList.value = res.data.data || [];
} else {
ElMessage.error(res.data.data);
}
const validateForm = () => {
return new Promise((resolve, reject) => {
systemRef.value.validate((res) => resolve(res));
});
};
onBeforeMount(() => {
getOrgTree();
getRoleList();
getFirmList();
});
onMounted(() => {});
defineExpose({ submitForm, clearForm, setForm });
defineExpose({ systemForm, setForm, validateForm });
</script>
......@@ -55,11 +55,6 @@
:stripe="true"
:select="true"
@selectAc="selectRows">
<template v-slot:business_name="{ row }">
<span @click="goDetail(row)" class="can_click_text">
{{ row.business_name }}
</span>
</template>
<template v-slot:state="{ row }">
<bg-switch
@click="stateChange(row)"
......@@ -106,7 +101,7 @@
<bg-icon
style="font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedRow.business_name }}</span
您正在对 <span class="danger_info">{{ selectedRow.system_account }}</span
>做删除操作。
</div>
<template #footer>
......@@ -137,7 +132,7 @@
<bg-icon
style="font-size: 12px; color: #a9b1c7; margin-right: 8px; vertical-align: baseline"
icon="#bg-ic-circle-tips"></bg-icon>
您正在对 <span class="danger_info">{{ selectedRow.business_name }}</span
您正在对 <span class="danger_info">{{ selectedRow.system_account }}</span
>做修改密码操作,修改后旧密码将无法登录。
</div>
<div>
......@@ -192,13 +187,13 @@ import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const dataTable = ref(null);
const headers = ref([
{
label: "业务系统编码",
prop: "business_code",
label: "姓名",
prop: "name",
minWidth: 160,
},
{
label: "业务系统名称",
prop: "business_name",
label: "手机号",
prop: "phone",
minWidth: 160,
},
{
......@@ -207,7 +202,7 @@ const headers = ref([
},
{
label: "所属组织",
prop: "organization_name",
prop: "org_name",
minWidth: 180,
},
{
......@@ -227,7 +222,6 @@ const headers = ref([
},
]);
const tableRows = ref([]);
const search = ref("");
const filter = reactive({
search: "",
page: 1,
......@@ -281,22 +275,22 @@ const getTableRows = () => {
})
.then((res) => {
if (res.data.code == 200) {
tableRows.value = res.data.data || [];
tableTotal.value = res.data.total;
tableRows.value = res.data.data?.org_users?.data || [];
tableTotal.value = res.data.data?.org_users?.total || 0;
} else {
ElMessage.error(res.data.data);
}
});
};
const addAccount = (params) => {
const addAccount = () => {
router.push({
path: "/authority/user/add",
});
};
const handleNodeClick = (data) => {
if (data.data_type == 1) {
if (data.data_type > 0) {
selectNode.value = data.organization_id;
changePage(1);
} else {
......@@ -326,7 +320,6 @@ const getOrgTree = () => {
orgData.value = res.data.data || [];
// orgData.value.shift();
const orgList = searchOrg(orgData.value);
console.log("orgList", orgList);
if (route.query.organization_id) {
searchItem(orgData.value, route.query.organization_id);
} else {
......@@ -386,9 +379,10 @@ const filterNode = (value, data) => {
};
const stateChange = (row) => {
console.log("row", row);
const params = {
id: row.id,
state: row.state == 1 ? 0 : 1,
state: row.state,
};
axios.post(`/v1/api/user/updateState`, params).then((res) => {
if (res.data.code == 200) {
......@@ -544,7 +538,7 @@ const editConfirm = () => {
const selectRows = (data) => {
selected.value = data.selection;
selectedName.value = data.selection.map((item) => item.business_name);
selectedName.value = data.selection.map((item) => item.system_account);
};
const clearSelected = () => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment