diff --git a/Laravel/app/Http/Controllers/API/Admin/QuestionItemController.php b/Laravel/app/Http/Controllers/API/Admin/QuestionItemController.php index 122a3a2..779f14a 100644 --- a/Laravel/app/Http/Controllers/API/Admin/QuestionItemController.php +++ b/Laravel/app/Http/Controllers/API/Admin/QuestionItemController.php @@ -10,10 +10,8 @@ class QuestionItemController extends Controller { public function item(Request $request) { - $hospital_id = $request->post('hospital_id'); $items = DB::table('items') ->select(['item_id', 'name', 'pinyin', 'sex']) - ->where(['hospital_id' => $hospital_id]) ->get(); return \Yz::Return(true, '操作完成', [ 'list' => $items @@ -90,7 +88,15 @@ class QuestionItemController extends Controller if (!!$search) { $db->where('name', $search); } - $list = $db->paginate(20); + $list = $db->orderBy('id', 'desc')->paginate(20); + return \Yz::Return(true, '操作完成', [ + 'list' => $list + ]); + } + + public function select(Request $request) + { + $list = DB::table('question_items')->select(['id', 'name'])->get(); return \Yz::Return(true, '操作完成', [ 'list' => $list ]); diff --git a/Laravel/app/Http/Controllers/API/Admin/QuestionQuestionController.php b/Laravel/app/Http/Controllers/API/Admin/QuestionQuestionController.php index ead8514..c53b753 100644 --- a/Laravel/app/Http/Controllers/API/Admin/QuestionQuestionController.php +++ b/Laravel/app/Http/Controllers/API/Admin/QuestionQuestionController.php @@ -72,7 +72,15 @@ class QuestionQuestionController extends Controller if (!!$search) { $db->where('question', 'like', "%$search%"); } - $list = $db->paginate(20); + $list = $db->orderBy('id', 'desc')->paginate(20); + return \Yz::Return(true, '操作完成', [ + 'list' => $list + ]); + } + + public function select(Request $request) + { + $list = DB::table('question_questions')->select(['id', 'question'])->get(); return \Yz::Return(true, '操作完成', [ 'list' => $list ]); diff --git a/Laravel/app/Http/Controllers/API/Admin/QuestionnaireController.php b/Laravel/app/Http/Controllers/API/Admin/QuestionnaireController.php index 373725e..385f0ef 100644 --- a/Laravel/app/Http/Controllers/API/Admin/QuestionnaireController.php +++ b/Laravel/app/Http/Controllers/API/Admin/QuestionnaireController.php @@ -80,7 +80,7 @@ class QuestionnaireController extends Controller if (!!$type) { $db->where('type', $type); } - $list = $db->paginate(20); + $list = $db->orderBy('id', 'desc')->paginate(20); return \Yz::Return(true, '操作完成', [ 'list' => $list ]); diff --git a/Laravel/routes/api.php b/Laravel/routes/api.php index 77147f5..a60e93d 100644 --- a/Laravel/routes/api.php +++ b/Laravel/routes/api.php @@ -29,11 +29,13 @@ Route::group(['middleware' => ['checktoken', 'log'], 'prefix' => 'v1'], function Route::post('admin/question/delete', 'App\Http\Controllers\API\Admin\QuestionnaireController@delete'); Route::post('admin/question/list', 'App\Http\Controllers\API\Admin\QuestionnaireController@list'); + Route::post('admin/questionQuestion/select', 'App\Http\Controllers\API\Admin\QuestionQuestionController@select'); Route::post('admin/questionQuestion/create', 'App\Http\Controllers\API\Admin\QuestionQuestionController@create'); Route::post('admin/questionQuestion/update', 'App\Http\Controllers\API\Admin\QuestionQuestionController@update'); Route::post('admin/questionQuestion/delete', 'App\Http\Controllers\API\Admin\QuestionQuestionController@delete'); Route::post('admin/questionQuestion/list', 'App\Http\Controllers\API\Admin\QuestionQuestionController@list'); + Route::post('admin/questionItem/select', 'App\Http\Controllers\API\Admin\QuestionItemController@select'); Route::post('admin/questionItem/item', 'App\Http\Controllers\API\Admin\QuestionItemController@item'); Route::post('admin/questionItem/create', 'App\Http\Controllers\API\Admin\QuestionItemController@create'); Route::post('admin/questionItem/update', 'App\Http\Controllers\API\Admin\QuestionItemController@update'); diff --git a/admin/src/api/api.js b/admin/src/api/api.js index 27428d3..72715f8 100644 --- a/admin/src/api/api.js +++ b/admin/src/api/api.js @@ -248,4 +248,55 @@ export const ArticleGetDetail = (data={}) => { //删除文章 export const ArticleGetDel = (data={}) => { return axios({url:import.meta.env.VITE_APP_API+'v1/admin/ArticleGetDel',data:data}) +} +// 问卷调查 +export const QuestionCreateAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/question/create', data: data}) +} +export const QuestionUpdateAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/question/update', data: data}) +} +export const QuestionDeleteAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/question/delete', data: data}) +} +export const QuestionListAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + `v1/admin/question/list?page=${data.page}`, data: data}) +} + +export const QuestionQuestionCreateAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionQuestion/create', data: data}) +} +export const QuestionQuestionUpdateAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionQuestion/update', data: data}) +} +export const QuestionQuestionDeleteAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionQuestion/delete', data: data}) +} +export const QuestionQuestionListAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionQuestion/list?page=${data.page}`, data: data}) +} +// 题目列表[全部] +export const QuestionQuestionSelectAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionQuestion/select`, data: data}) +} + +export const QuestionItemCreateAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionItem/create', data: data}) +} +export const QuestionItemUpdateAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionItem/update', data: data}) +} +export const QuestionItemDeleteAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionItem/delete', data: data}) +} +export const QuestionItemListAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/list?page=${data.page}`, data: data}) +} +// 问卷调查 获取 检测项目列表 +export const QuestionItemItemAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/item`, data: data}) +} +// 项目列表[全部] +export const QuestionItemSelectAction = (data = {}) => { + return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/select`, data: data}) } \ No newline at end of file diff --git a/admin/src/views/Question/Question.vue b/admin/src/views/Question/Question.vue index 59c8579..e1190ba 100644 --- a/admin/src/views/Question/Question.vue +++ b/admin/src/views/Question/Question.vue @@ -4,12 +4,336 @@ * user:sa0ChunLuyu * date:2024年10月12日 16:29:26 */ +import {ref, onMounted, computed} from 'vue'; +import $router from '@/router' +import {onBeforeRouteUpdate} from "vue-router"; +import {ElMessage, ElMessageBox} from 'element-plus' +import { + QuestionCreateAction, + QuestionUpdateAction, + QuestionDeleteAction, + QuestionListAction, + QuestionItemItemAction, + QuestionQuestionSelectAction +} from '@/api/api.js' + +const default_page_options = { + search: '', + type: '', + page: 1, +} +const page_options = ref(JSON.parse(JSON.stringify(default_page_options))) +onBeforeRouteUpdate((to) => { + routerChange(to.query) +}) +const item_list = ref([]) +const QuestionItemItem = async () => { + const response = await QuestionItemItemAction({}) + if (response.status) { + item_list.value = response.data.list.map((item) => { + return { + ...item, + name: item.sex !== 0 ? `${item.name}(${item.sex === 1 ? '男' : '女'})` : item.name + } + }) + } else { + ElMessage.error(response.msg) + } +} +const question_list = ref([]) +const QuestionQuestionSelect = async () => { + const response = await QuestionQuestionSelectAction({}) + if (response.status) { + question_list.value = response.data.list + } else { + ElMessage.error(response.msg) + } +} +const table_list = ref([]) +const last_page = ref(0) +const QuestionList = async () => { + const response = await QuestionListAction(page_options.value) + if (response.status) { + table_list.value = response.data.list.data.map((item) => { + return { + ...item, + items: JSON.parse(item.items), + questions: JSON.parse(item.questions) + } + }) + last_page.value = response.data.list.last_page + } else { + ElMessage.error(response.msg) + } +} + +const routerChange = (query) => { + page_options.value = { + search: query.search || default_page_options.search, + type: query.type || default_page_options.type, + page: Number(query.page) || default_page_options.page, + } + QuestionList() +} + +const searchClick = (page = 1) => { + page_options.value.page = page + $router.push({ + query: JSON.parse(JSON.stringify(page_options.value)) + }) +} + +const itemNameShow = (items) => { + let names = [] + for (let i in item_list.value) { + if (items.includes(String(item_list.value[i].item_id))) { + names.push(item_list.value[i].name) + } + } + return names.join('、') +} +const edit_data_default = { + id: 0, + type: '问卷调查', + name: '', + items: [], + questions: [] +} +const edit_data = ref(JSON.parse(JSON.stringify(edit_data_default))) +const edit_show = ref(false) +const createClick = () => { + updateClick(edit_data_default) +} +const updateClick = (row) => { + edit_data.value = JSON.parse(JSON.stringify(row)) + edit_show.value = true +} +const editDoneClick = async () => { + const $func = edit_data.value.id !== 0 ? QuestionUpdateAction : QuestionCreateAction + const response = await $func({ + ...edit_data.value, + items: JSON.stringify(edit_data.value.items), + questions: JSON.stringify(edit_data.value.questions), + }) + if (response.status) { + edit_show.value = false + await QuestionList() + } else { + ElMessage.error(response.msg) + } +} + +const QuestionDelete = async (id) => { + const response = await QuestionDeleteAction({id}) + if (response.status) { + await QuestionList() + } else { + ElMessage.error(response.msg) + } +} + +const deleteClick = (id) => { + ElMessageBox.confirm( + '是否确认删除该问卷?', + '提示', + { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning', + } + ).then(() => { + QuestionDelete(id) + }).catch(() => { + }) +} +const edit_item_data = ref([]) +const edit_item_show = ref(false) +const editItemClick = () => { + edit_item_data.value = JSON.parse(JSON.stringify(edit_data.value.items)) + edit_item_show.value = true +} +const editItemDoneClick = () => { + edit_data.value.items = JSON.parse(JSON.stringify(edit_item_data.value)) + edit_item_show.value = false +} +const filterMethod = (query, item) => { + return item.name.toLowerCase().includes(query.toLowerCase()) || item.pinyin.toLowerCase().includes(query.toLowerCase()) +} +const moveQuestionClick = (index, type) => { + if (edit_data.value.questions.length - 1 >= index + type) { + const question = edit_data.value.questions[index] + edit_data.value.questions[index] = JSON.parse(JSON.stringify(edit_data.value.questions[index + type])) + edit_data.value.questions[index + type] = JSON.parse(JSON.stringify(question)) + } +} +const delQuestionClick = (index) => { + edit_data.value.questions.splice(index, 1) +} + +const question_edit_list = computed(() => { + return edit_data.value.questions.map((item) => { + return { + id: item, + question: question_list.value.find((i) => i.id === Number(item)).question + } + }) +}) +const edit_question_active = ref(null) +const addQuestionClick = () => { + if (edit_question_active.value) { + edit_data.value.questions.push(String(edit_question_active.value)) + } +} + +onMounted(() => { + routerChange($router.currentRoute.value.query) + QuestionItemItem() + QuestionQuestionSelect() +}) + diff --git a/admin/src/views/Question/QuestionItem.vue b/admin/src/views/Question/QuestionItem.vue index 59c8579..a58b25c 100644 --- a/admin/src/views/Question/QuestionItem.vue +++ b/admin/src/views/Question/QuestionItem.vue @@ -4,12 +4,273 @@ * user:sa0ChunLuyu * date:2024年10月12日 16:29:26 */ +import {ref, onMounted} from 'vue'; +import $router from '@/router' +import {onBeforeRouteUpdate} from "vue-router"; +import {ElMessage, ElMessageBox} from 'element-plus' +import { + QuestionItemCreateAction, + QuestionItemUpdateAction, + QuestionItemDeleteAction, + QuestionItemListAction, + QuestionItemItemAction +} from '@/api/api.js' + +const default_page_options = { + search: '', + page: 1, +} +const page_options = ref(JSON.parse(JSON.stringify(default_page_options))) +onBeforeRouteUpdate((to) => { + routerChange(to.query) +}) +const item_list = ref([]) +const QuestionItemItem = async () => { + const response = await QuestionItemItemAction({}) + if (response.status) { + item_list.value = response.data.list.map((item) => { + return { + ...item, + name: item.sex !== 0 ? `${item.name}(${item.sex === 1 ? '男' : '女'})` : item.name + } + }) + } else { + ElMessage.error(response.msg) + } +} +const table_list = ref([]) +const last_page = ref(0) +const QuestionItemList = async () => { + const response = await QuestionItemListAction(page_options.value) + if (response.status) { + table_list.value = response.data.list.data.map((item) => { + return { + ...item, + jichu: JSON.parse(item.jichu), + tuijian: JSON.parse(item.tuijian), + gaoduan: JSON.parse(item.gaoduan), + } + }) + last_page.value = response.data.list.last_page + } else { + ElMessage.error(response.msg) + } +} + +const routerChange = (query) => { + page_options.value = { + search: query.search || default_page_options.search, + page: Number(query.page) || default_page_options.page, + } + QuestionItemList() +} + +const searchClick = (page = 1) => { + page_options.value.page = page + $router.push({ + query: JSON.parse(JSON.stringify(page_options.value)) + }) +} + +const itemNameShow = (items) => { + let names = [] + for (let i in item_list.value) { + if (items.includes(String(item_list.value[i].item_id))) { + names.push(item_list.value[i].name) + } + } + return names.join('、') +} +const edit_data_default = { + id: 0, + name: '', + desc: '', + jichu: [], + tuijian: [], + gaoduan: [], +} +const edit_data = ref(JSON.parse(JSON.stringify(edit_data_default))) +const edit_show = ref(false) +const createClick = () => { + updateClick(edit_data_default) +} +const updateClick = (row) => { + edit_data.value = JSON.parse(JSON.stringify(row)) + edit_show.value = true +} +const editDoneClick = async () => { + const $func = edit_data.value.id !== 0 ? QuestionItemUpdateAction : QuestionItemCreateAction + const response = await $func({ + ...edit_data.value, + jichu: JSON.stringify(edit_data.value.jichu), + tuijian: JSON.stringify(edit_data.value.tuijian), + gaoduan: JSON.stringify(edit_data.value.gaoduan), + }) + if (response.status) { + edit_show.value = false + await QuestionItemList() + } else { + ElMessage.error(response.msg) + } +} + +const QuestionItemDelete = async (id) => { + const response = await QuestionItemDeleteAction({id}) + if (response.status) { + await QuestionItemList() + } else { + ElMessage.error(response.msg) + } +} + +const deleteClick = (id) => { + ElMessageBox.confirm( + '是否确认删除该项目?', + '提示', + { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning', + } + ).then(() => { + QuestionItemDelete(id) + }).catch(() => { + }) +} +const edit_item_data = ref({ + active: 'jichu', + items: [] +}) +const edit_item_show = ref(false) +const editItemClick = (type) => { + edit_item_data.value = { + active: type, + items: JSON.parse(JSON.stringify(edit_data.value[type])) + } + edit_item_show.value = true +} +const editItemDoneClick = () => { + edit_data.value[edit_item_data.value.active] = JSON.parse(JSON.stringify(edit_item_data.value.items)) + edit_item_show.value = false +} +const filterMethod = (query, item) => { + return item.name.toLowerCase().includes(query.toLowerCase()) || item.pinyin.toLowerCase().includes(query.toLowerCase()) +} +onMounted(() => { + routerChange($router.currentRoute.value.query) + QuestionItemItem() +}) + diff --git a/admin/src/views/Question/QuestionQuestion.vue b/admin/src/views/Question/QuestionQuestion.vue index 59c8579..a976e99 100644 --- a/admin/src/views/Question/QuestionQuestion.vue +++ b/admin/src/views/Question/QuestionQuestion.vue @@ -4,12 +4,373 @@ * user:sa0ChunLuyu * date:2024年10月12日 16:29:26 */ +import {ref, onMounted, nextTick} from 'vue'; +import $router from '@/router' +import {onBeforeRouteUpdate} from "vue-router"; +import {ElMessage, ElMessageBox} from 'element-plus' +import { + QuestionQuestionSelectAction, + QuestionItemSelectAction, + QuestionQuestionCreateAction, + QuestionQuestionUpdateAction, + QuestionQuestionDeleteAction, + QuestionQuestionListAction +} from '@/api/api.js' + +const default_page_options = { + search: '', + page: 1, +} +const page_options = ref(JSON.parse(JSON.stringify(default_page_options))) +onBeforeRouteUpdate((to) => { + routerChange(to.query) +}) +const table_list = ref([]) +const last_page = ref(0) +const QuestionQuestionList = async () => { + const response = await QuestionQuestionListAction(page_options.value) + if (response.status) { + table_list.value = response.data.list.data.map((item) => { + return { + ...item, + option: JSON.parse(item.option) + } + }) + last_page.value = response.data.list.last_page + } else { + ElMessage.error(response.msg) + } +} + +const routerChange = (query) => { + page_options.value = { + search: query.search || default_page_options.search, + page: Number(query.page) || default_page_options.page, + } + QuestionQuestionList() +} + +const searchClick = (page = 1) => { + page_options.value.page = page + $router.push({ + query: JSON.parse(JSON.stringify(page_options.value)) + }) +} +const select_option = { + value: [ + {content: 'A. ', type: 'items', items: [], questions: []}, + {content: 'B. ', type: 'items', items: [], questions: []}, + {content: 'C. ', type: 'items', items: [], questions: []}, + ] +} +const input_option = { + value: '', + placeholder: '请输入选项内容' +} +const edit_data_default = { + id: 0, + question: '', + type: 'input', + option: { + input: JSON.parse(JSON.stringify(input_option)), + select: JSON.parse(JSON.stringify(select_option)), + }, +} +const edit_data = ref(JSON.parse(JSON.stringify(edit_data_default))) +const edit_show = ref(false) +const createClick = () => { + updateClick(edit_data_default) +} +const updateClick = (row) => { + edit_data.value = JSON.parse(JSON.stringify(row)) + edit_show.value = true +} +const editDoneClick = async () => { + const $func = edit_data.value.id !== 0 ? QuestionQuestionUpdateAction : QuestionQuestionCreateAction + const response = await $func({ + ...edit_data.value, + option: JSON.stringify(edit_data.value.option), + }) + if (response.status) { + edit_show.value = false + await QuestionQuestionList() + } else { + ElMessage.error(response.msg) + } +} + +const QuestionQuestionDelete = async (id) => { + const response = await QuestionQuestionDeleteAction({id}) + if (response.status) { + await QuestionQuestionList() + } else { + ElMessage.error(response.msg) + } +} + +const deleteClick = (id) => { + ElMessageBox.confirm( + '是否确认删除该题目?', + '提示', + { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning', + } + ).then(() => { + QuestionQuestionDelete(id) + }).catch(() => { + }) +} +const edit_item_data = ref({ + active: 0, + items: [] +}) +const edit_item_show = ref(false) +const question_list = ref([]) +const QuestionQuestionSelect = async () => { + const response = await QuestionQuestionSelectAction() + if (response.status) { + question_list.value = response.data.list + } else { + ElMessage.error(response.msg) + } +} +const editItemClick = async (index) => { + const type = edit_data.value.option.select.value[index].type + if (type === 'questions') { + await QuestionQuestionSelect() + } + await nextTick(() => { + edit_item_data.value = { + active: index, + items: JSON.parse(JSON.stringify(edit_data.value.option.select.value[index][type])) + } + edit_item_show.value = true + }) +} +const editItemDoneClick = () => { + const type = edit_data.value.option.select.value[edit_item_data.value.active].type + edit_data.value.option.select.value[edit_item_data.value.active][type] = JSON.parse(JSON.stringify(edit_item_data.value.items)) + edit_item_show.value = false +} +const filterMethod = (query, item) => { + const type = edit_data.value.option.select.value[edit_item_data.value.active].type + if (type === 'items') { + return item.name.toLowerCase().includes(query.toLowerCase()) + } else { + return item.question.toLowerCase().includes(query.toLowerCase()) + } +} +const item_list = ref([]) +const QuestionItemSelect = async () => { + const response = await QuestionItemSelectAction() + if (response.status) { + item_list.value = response.data.list + } else { + ElMessage.error(response.msg) + } +} +const moveQuestionClick = (index, type) => { + if (edit_data.value.option.select.value.length - 1 >= index + type) { + const question = edit_data.value.option.select.value[index] + edit_data.value.option.select.value[index] = JSON.parse(JSON.stringify(edit_data.value.option.select.value[index + type])) + edit_data.value.option.select.value[index + type] = JSON.parse(JSON.stringify(question)) + } +} +const delQuestionClick = (index) => { + edit_data.value.option.select.value.splice(index, 1) +} +const addQuestionClick = () => { + edit_data.value.option.select.value.push({content: '', type: 'items', items: [], questions: []}) +} +const question_type_map = { + select: '选择题', + input: '输入框' +} +onMounted(() => { + routerChange($router.currentRoute.value.query) + QuestionItemSelect() +}) +