feat: CRM客户管理-设置微客宝登录密码

This commit is contained in:
li
2026-03-14 19:55:09 +08:00
parent c3011d0636
commit 6bf79d6e65
4 changed files with 63 additions and 2 deletions
@@ -83,4 +83,16 @@ class CustomerController extends Controller
$customer->delete();
return $this->success(null);
}
/**
* 设置/重置客户端登录密码
*/
public function setPassword(Request $request, Customer $customer): JsonResponse
{
$request->validate([
'password' => 'required|string|min:6',
]);
$customer->update(['password' => $request->password]);
return $this->success(null, '密码设置成功');
}
}
+1
View File
@@ -145,6 +145,7 @@ Route::middleware(['auth:sanctum', 'store', 'oplog'])->group(function () {
// 客户管理
Route::apiResource('customers', CustomerController::class);
Route::post('customers/{customer}/set-password', [CustomerController::class, 'setPassword']);
// 合同管理
Route::apiResource('contracts', ContractController::class);
+2 -1
View File
@@ -26,7 +26,8 @@ export const customerApi = {
getDetail: (id) => request.get(`/crm/customers/${id}`),
create: (data) => request.post('/crm/customers', data),
update: (id, data) => request.put(`/crm/customers/${id}`, data),
delete: (id) => request.delete(`/crm/customers/${id}`)
delete: (id) => request.delete(`/crm/customers/${id}`),
setPassword: (id, data) => request.post(`/crm/customers/${id}/set-password`, data),
}
// ─── Contracts ────────────────────────────────────────────────────────────────
+48 -1
View File
@@ -12,6 +12,12 @@ const submitLoading = ref(false)
const detailVisible = ref(false)
const detailData = ref(null)
// 设置密码
const pwdVisible = ref(false)
const pwdForm = reactive({ password: '', confirm: '' })
const pwdTarget = ref(null)
const pwdLoading = ref(false)
const searchForm = reactive({ name: '', phone: '', status: '' })
const pagination = reactive({ page: 1, per_page: 20 })
@@ -84,6 +90,27 @@ async function handleDetail(row) {
function addFamily() { form.families.push({ name: '', phone: '', relation: '', is_emergency: false }) }
function removeFamily(idx) { form.families.splice(idx, 1) }
function openSetPassword(row) {
pwdTarget.value = row
Object.assign(pwdForm, { password: '', confirm: '' })
pwdVisible.value = true
}
async function submitSetPassword() {
if (!pwdForm.password || pwdForm.password.length < 6) {
ElMessage.warning('密码不少于 6 位'); return
}
if (pwdForm.password !== pwdForm.confirm) {
ElMessage.warning('两次密码不一致'); return
}
pwdLoading.value = true
try {
await customerApi.setPassword(pwdTarget.value.id, { password: pwdForm.password })
ElMessage.success('微客宝登录密码已设置')
pwdVisible.value = false
} finally { pwdLoading.value = false }
}
function handlePageChange(val) { pagination.page = val; fetchList() }
function handleSizeChange(val) { pagination.per_page = val; pagination.page = 1; fetchList() }
@@ -124,10 +151,11 @@ onMounted(() => fetchList())
<template #default="{ row }">{{ row.owner?.name || '-' }}</template>
</el-table-column>
<el-table-column prop="created_at" label="创建时间" min-width="160" />
<el-table-column label="操作" width="220" fixed="right" align="center">
<el-table-column label="操作" width="260" fixed="right" align="center">
<template #default="{ row }">
<el-button size="small" type="primary" text @click="handleDetail(row)">详情</el-button>
<el-button size="small" type="primary" text @click="handleEdit(row)">编辑</el-button>
<el-button size="small" type="warning" text @click="openSetPassword(row)">设置密码</el-button>
<el-button size="small" type="danger" text @click="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
@@ -195,5 +223,24 @@ onMounted(() => fetchList())
</el-table>
</template>
</el-drawer>
<!-- 设置微客宝登录密码 -->
<el-dialog v-model="pwdVisible" title="设置微客宝登录密码" width="400px" destroy-on-close>
<div style="margin-bottom:12px; color:#606266; font-size:13px;">
为客户 <strong>{{ pwdTarget?.name }}</strong>{{ pwdTarget?.phone }}设置手机号登录密码
</div>
<el-form label-width="90px">
<el-form-item label="新密码">
<el-input v-model="pwdForm.password" type="password" show-password placeholder="不少于 6 位" />
</el-form-item>
<el-form-item label="确认密码">
<el-input v-model="pwdForm.confirm" type="password" show-password placeholder="再次输入密码" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="pwdVisible = false">取消</el-button>
<el-button type="primary" :loading="pwdLoading" @click="submitSetPassword">确认设置</el-button>
</template>
</el-dialog>
</div>
</template>