Compare commits

...

10 Commits

Author SHA1 Message Date
dcbe1b6728 update 2025-07-04 17:07:09 +08:00
b4416260fd update 2025-07-04 09:50:30 +08:00
bb9639ce0c update 2025-07-03 17:15:06 +08:00
28336adc87 update 2025-07-03 17:12:58 +08:00
7e7424fc85 update 2025-07-03 17:09:49 +08:00
21de56d967 update 2025-07-02 16:54:12 +08:00
176e6afae7 update 2025-07-02 16:49:41 +08:00
a432723770 update 2025-07-02 16:48:04 +08:00
2664c7741d update 2025-07-02 16:46:21 +08:00
716e20675e update 2025-07-02 16:44:04 +08:00
10 changed files with 213 additions and 38 deletions

View File

@ -10,6 +10,6 @@ class Config extends AbstractConstants
{ {
public static function getDomain() public static function getDomain()
{ {
return env('APP_DOMAIN', ''); return env('APP_DOMAIN', 'http://127.0.0.1');
} }
} }

View File

@ -69,10 +69,10 @@ class UploadController extends AbstractController
} }
// 校验类型 // 校验类型
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; // $allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
if (!in_array($file->getClientMediaType(), $allowedTypes)) { // if (!in_array($file->getClientMediaType(), $allowedTypes)) {
return $this->response->json(['code' => 415, 'msg' => '不支持的图片格式']); // return $this->response->json(['code' => 415, 'msg' => '不支持的图片格式']);
} // }
// 限制大小 (例如 5MB) // 限制大小 (例如 5MB)
$maxSize = 5 * 1024 * 1024; $maxSize = 5 * 1024 * 1024;
@ -98,7 +98,7 @@ class UploadController extends AbstractController
return $this->response->json([ return $this->response->json([
'errno' => 0, 'errno' => 0,
'msg' => '上传成功!!', 'msg' => '上传成功!!~',
'data' => [ 'data' => [
'url' => Config::getDomain() . $url, 'url' => Config::getDomain() . $url,
] ]

View File

@ -37,6 +37,12 @@ class WebsiteController extends AbstractController
$model->app_description = $this->request->post('app_description'); $model->app_description = $this->request->post('app_description');
$model->app_name = $this->request->post('app_name'); $model->app_name = $this->request->post('app_name');
$model->app_domain = $this->request->post('app_domain'); $model->app_domain = $this->request->post('app_domain');
$model->app_filing = $this->request->post('app_filing');
$model->app_filing_url = $this->request->post('app_filing_url');
$model->app_logo = $this->request->post('app_logo');
$model->app_extra = $this->request->post('app_extra');
$model->app_template = $this->request->post('template');
$model->app_extra_tag = $this->request->post('app_extra_tag');
$model->save(); $model->save();
return $this->response->json([]); return $this->response->json([]);
@ -77,7 +83,7 @@ class WebsiteController extends AbstractController
if (!$query) { if (!$query) {
return $this->response->json(['code' => 400, 'msg' => 'id 有误']); return $this->response->json(['code' => 400, 'msg' => 'id 有误']);
} }
$query['template'] = $query['app_template'];
return $this->response->json(['code' => 0, 'msg' => 'ok', 'data' => $query]); return $this->response->json(['code' => 0, 'msg' => 'ok', 'data' => $query]);
} }
@ -100,6 +106,12 @@ class WebsiteController extends AbstractController
$query->app_name = $this->request->post('app_name'); $query->app_name = $this->request->post('app_name');
$query->app_domain = $this->request->post('app_domain'); $query->app_domain = $this->request->post('app_domain');
$query->app_keywords = $this->request->post('app_keywords'); $query->app_keywords = $this->request->post('app_keywords');
$query->app_filing = $this->request->post('app_filing');
$query->app_filing_url = $this->request->post('app_filing_url');
$query->app_logo = $this->request->post('app_logo');
$query->app_extra = $this->request->post('app_extra');
$query->app_template = $this->request->post('template');
$query->app_extra_tag = $this->request->post('app_extra_tag');
$query->save(); $query->save();

View File

@ -38,6 +38,7 @@ class NewsFormModel
$model->description = $this->attributes['description']; $model->description = $this->attributes['description'];
$model->cover = $this->attributes['cover']; $model->cover = $this->attributes['cover'];
$model->content = $this->attributes['content']; $model->content = $this->attributes['content'];
$model->platform = $this->attributes['platform'];
$model->save(); $model->save();
} }
} }

View File

@ -18,6 +18,14 @@ namespace App\Model;
* @property string $app_domain * @property string $app_domain
* @property int $is_delete * @property int $is_delete
* @property string $app_keywords * @property string $app_keywords
* @property string $app_filing
* @property string $app_filing_url
* @property string $app_extra
* @property string $app_logo
* @property int $app_template
* @property string $app_telephone
* @property string $app_download_url
* @property string $app_extra_tag
*/ */
class AppWebsiteConfig extends Model class AppWebsiteConfig extends Model
{ {
@ -34,5 +42,5 @@ class AppWebsiteConfig extends Model
/** /**
* The attributes that should be cast to native types. * The attributes that should be cast to native types.
*/ */
protected array $casts = ['id' => 'integer', 'created_at' => 'datetime', 'created_by' => 'integer', 'updated_at' => 'datetime', 'updated_by' => 'integer', 'is_delete' => 'integer']; protected array $casts = ['id' => 'integer', 'created_at' => 'datetime', 'created_by' => 'integer', 'updated_at' => 'datetime', 'updated_by' => 'integer', 'is_delete' => 'integer', 'app_template' => 'integer'];
} }

View File

@ -46,10 +46,11 @@ class NewsService extends BaseService
* @param int $page * @param int $page
* @return array * @return array
*/ */
public function index(int $limit = 30, int $page = 1): array public function index(int $id, int $limit = 30, int $page = 1): array
{ {
$query = AppNews::formatQuery(['created_at']) $query = AppNews::formatQuery(['created_at'])
->where('is_delete', 0) ->where('is_delete', 0)
->where('platform', $id)
->select(['id']) ->select(['id'])
->orderBy('id', 'desc');; ->orderBy('id', 'desc');;
$pagination = $query->paginate($limit, page: $page); $pagination = $query->paginate($limit, page: $page);

View File

@ -1,8 +1,7 @@
<?php <?php
$articleLocation = array_map(fn($case) => [ $platforms = call_user_func(function () {
'label' => ucfirst($case->toString()), return \App\Model\AppWebsiteConfig::query()->where('is_delete', 0)->get()->toArray();
'value' => $case->value, });
], \App\Enums\LocationEnum::cases());
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh-cn"> <html lang="zh-cn">
@ -21,6 +20,17 @@ $articleLocation = array_map(fn($case) => [
<form class="layui-form" action=""> <form class="layui-form" action="">
<div class="mainBox"> <div class="mainBox">
<div class="main-container mr-5"> <div class="main-container mr-5">
<div class="layui-form-item">
<label class="layui-form-label required">发布平台</label>
<div class="layui-input-block">
<select name="platform" lay-search="">
<option value="">请选择</option>
<?php foreach ($platforms ?: [] as $platform): ?>
<option value="<?= $platform['id'] ?>"><?= $platform['app_name'] ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label required">文章标题</label> <label class="layui-form-label required">文章标题</label>
<div class="layui-input-block"> <div class="layui-input-block">

View File

@ -1,3 +1,8 @@
<?php
$platforms = call_user_func(function () {
return \App\Model\AppWebsiteConfig::query()->where('is_delete', 0)->get()->toArray();
});
?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh-cn"> <html lang="zh-cn">
<head> <head>
@ -16,6 +21,17 @@
<input type="hidden" name="id" value="" autocomplete="off"> <input type="hidden" name="id" value="" autocomplete="off">
<div class="mainBox"> <div class="mainBox">
<div class="main-container mr-5"> <div class="main-container mr-5">
<div class="layui-form-item">
<label class="layui-form-label required">发布平台</label>
<div class="layui-input-block">
<select name="platform" lay-search="">
<option value="">请选择</option>
<?php foreach ($platforms ?: [] as $platform): ?>
<option value="<?= $platform['id'] ?>"><?= $platform['app_name'] ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label required">文章标题</label> <label class="layui-form-label required">文章标题</label>
<div class="layui-input-block"> <div class="layui-input-block">
@ -194,6 +210,9 @@
document.querySelector('[id="cover"]').src = res.data.cover document.querySelector('[id="cover"]').src = res.data.cover
$("[name=cover]").val(res.data.cover); $("[name=cover]").val(res.data.cover);
$("select[name=platform]").val(res.data.platform);
layui.form.render("select");
editor.setHtml(res.data.content) editor.setHtml(res.data.content)
// ajax产生错误 // ajax产生错误

View File

@ -19,25 +19,61 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">网站名称</label> <label class="layui-form-label">网站名称</label>
<div class="layui-input-inline layui-input-wrap"> <div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_name" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input"> <input type="text" name="app_name" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站logo</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="logo_upload_btn">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<img style="max-height: 50px;" src="" id="app_logo">
<input type="hidden" name="app_logo" value="" class="layui-input" autocomplete="off">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">网站描述</label> <label class="layui-form-label">网站描述</label>
<div class="layui-input-inline layui-input-wrap"> <div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_description" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input"> <input type="text" name="app_description" autocomplete="off" lay-affix="clear" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">关键词</label> <label class="layui-form-label">关键词</label>
<div class="layui-input-inline layui-input-wrap"> <div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_keywords" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input"> <input type="text" name="app_keywords" autocomplete="off" lay-affix="clear" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">公司名称</label> <label class="layui-form-label">公司名称</label>
<div class="layui-input-inline layui-input-wrap"> <div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_company" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input"> <input type="text" name="app_company" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备案号</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_filing" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备案号链接地址</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_filing_url" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">模板</label>
<div class="layui-input-inline layui-input-wrap">
<input type="radio" name="template" value="2" title="模板2">
{{-- <input type="radio" name="sex" value="2" title="">--}}
{{-- <input type="radio" name="sex" value="nv" title="" checked>--}}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">extra_tag</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_extra_tag" autocomplete="off" lay-affix="clear" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -54,9 +90,37 @@
<script> <script>
// api // api
const INSERT_API = "/admin/api/website/config/insert"; const INSERT_API = "/admin/api/website/config/insert";
const UPLOAD_API = '/upload/image' // 上传图片
layui.use(['upload', 'jquery', 'popup'], function(){ layui.use(['upload', 'jquery', 'popup'], function(){
const $ = layui.jquery; const $ = layui.jquery;
const upload = layui.upload;
// 上传logo
upload.render({
elem: '#logo_upload_btn' //绑定元素
,url: UPLOAD_API // 上传接口,实际使用时改成您自己的上传接口即可。
,accept: 'images' // 限制为图片类型
,exts: 'jpg|jpeg|png|gif|ico' // 允许上传的文件格式,加入 ico 格式
,before: function(obj){ //obj参数包含的信息跟 choose回调完全一致可参见上文。
console.log(obj)
}
,done: function(res){
//上传完毕回调
console.log(res)
// 若上传失败
if(res.code > 0){
return layer.msg('上传失败');
}
// 上传成功的一些操作
// …
document.querySelector('[id="app_logo"]').src = res.data.url
$("input[name=app_logo]").val(res.data.url);
}
,error: function(e){
console.log(e)
//请求异常回调
}
});
layui.form.on("submit(insert)", function (data) { layui.form.on("submit(insert)", function (data) {
console.log(data) console.log(data)

View File

@ -20,25 +20,61 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">网站名称</label> <label class="layui-form-label">网站名称</label>
<div class="layui-input-inline layui-input-wrap"> <div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_name" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input"> <input type="text" name="app_name" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站logo</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="logo_upload_btn">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<img style="max-height: 50px;" src="" id="app_logo">
<input type="hidden" name="app_logo" value="" class="layui-input" autocomplete="off">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">网站描述</label> <label class="layui-form-label">网站描述</label>
<div class="layui-input-inline layui-input-wrap"> <div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_description" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input"> <input type="text" name="app_description" autocomplete="off" lay-affix="clear" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">关键词</label> <label class="layui-form-label">关键词</label>
<div class="layui-input-inline layui-input-wrap"> <div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_keywords" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input"> <input type="text" name="app_keywords" autocomplete="off" lay-affix="clear" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">公司名称</label> <label class="layui-form-label">公司名称</label>
<div class="layui-input-inline layui-input-wrap"> <div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_company" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input"> <input type="text" name="app_company" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备案号</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_filing" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备案号链接地址</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_filing_url" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">模板</label>
<div class="layui-input-inline layui-input-wrap">
<input type="radio" name="template" value="2" title="模板2">
{{-- <input type="radio" name="sex" value="2" title="">--}}
{{-- <input type="radio" name="sex" value="nv" title="" checked>--}}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">extra_tag</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_extra_tag" autocomplete="off" lay-affix="clear" class="layui-input">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -57,10 +93,11 @@
// API // API
const VIEW_API = "/admin/api/website/config/view"; // 获取关键词数据 const VIEW_API = "/admin/api/website/config/view"; // 获取关键词数据
const SAVE_API = "/admin/api/website/config/save"; // 重新保存数据 const SAVE_API = "/admin/api/website/config/save"; // 重新保存数据
const UPLOAD_API = '/upload/image' // 上传图片
layui.use(['upload', 'jquery', 'popup', 'form'], function(){ layui.use(['upload', 'jquery', 'popup', 'form'], function(){
const $ = layui.jquery; const $ = layui.jquery;
const upload = layui.upload;
initViewData() initViewData()
layui.form.on("submit(save)", function (data) { layui.form.on("submit(save)", function (data) {
layui.$.ajax({ layui.$.ajax({
@ -81,7 +118,32 @@
}); });
return false; return false;
}); });
// 上传logo
upload.render({
elem: '#logo_upload_btn' //绑定元素
,url: UPLOAD_API // 上传接口,实际使用时改成您自己的上传接口即可。
,accept: 'images' // 限制为图片类型
,exts: 'jpg|jpeg|png|gif|ico' // 允许上传的文件格式,加入 ico 格式
,before: function(obj){ //obj参数包含的信息跟 choose回调完全一致可参见上文。
console.log(obj)
}
,done: function(res){
//上传完毕回调
console.log(res)
// 若上传失败
if(res.code > 0){
return layer.msg('上传失败');
}
// 上传成功的一些操作
// …
document.querySelector('[id="app_logo"]').src = res.data.url
$("input[name=app_logo]").val(res.data.url);
}
,error: function(e){
console.log(e)
//请求异常回调
}
});
function initViewData() { function initViewData() {
let viewId = layui.url().search['id'] let viewId = layui.url().search['id']
$.ajax({ $.ajax({
@ -92,6 +154,10 @@
method: 'get', method: 'get',
dataType: "json", dataType: "json",
success: function (res) { success: function (res) {
// ajax产生错误
if (res.code) {
layui.popup.failure(res.msg);
}
// 赋值表单 // 赋值表单
layui.each(res.data, function (key, value) { layui.each(res.data, function (key, value) {
@ -109,23 +175,17 @@
}); });
const form = layui.form; const form = layui.form;
const app_template = res.data.app_template
const selectedPlatforms = res.data.platform; // 后端数据 console.log(document.querySelectorAll('input[name="template"]'))
document.querySelectorAll('input[name="template"]').forEach(el => {
selectedPlatforms?.forEach(val => { if (el.value == app_template) {
// 设置 value 对应的 checkbox 为选中
document.querySelectorAll('input[name="platform[]"]').forEach(el => {
if (el.value == val) {
el.checked = true; el.checked = true;
} }
}); // console.log(el)
}); });
form.render('checkbox'); // 重新渲染 document.querySelector('[id="app_logo"]').src = res.data.app_logo
// ajax产生错误 form.render('radio'); // 重新渲染
if (res.code) {
layui.popup.failure(res.msg);
}
} }
}); });